OSDN Git Service

[Refactor] #37353 コメント整理 / Refactor comments.
[hengband/hengband.git] / src / store.c
1 /*!
2  * @file store.c
3  * @brief 店の処理 / Store commands
4  * @date 2014/02/02
5  * @author
6  * Copyright (c) 1989 James E. Wilson, Robert A. Koeneke\n
7  * This software may be copied and distributed for educational, research, and\n
8  * not for profit purposes provided that this copyright and statement are\n
9  * included in all such copies.\n
10  * 2014 Deskull rearranged comment for Doxygen.
11  */
12
13 #include "angband.h"
14 #include "cmd-item.h"
15 #include "cmd-zapwand.h"
16 #include "cmd-magiceat.h"
17
18 #define MIN_STOCK 12
19
20 static int cur_store_num = 0;
21 static int store_top = 0;
22 static int store_bottom = 0;
23 static int xtra_stock = 0;
24 static store_type *st_ptr = NULL;
25 static const owner_type *ot_ptr = NULL;
26 static s16b old_town_num = 0;
27 static s16b inner_town_num = 0;
28 #define RUMOR_CHANCE 8
29
30 #define MAX_COMMENT_1   6
31
32 static cptr comment_1[MAX_COMMENT_1] =
33 {
34 #ifdef JP
35         "オーケーだ。",
36         "結構だ。",
37         "そうしよう!",
38         "賛成だ!",
39         "よし!",
40         "わかった!"
41 #else
42         "Okay.",
43         "Fine.",
44         "Accepted!",
45         "Agreed!",
46         "Done!",
47         "Taken!"
48 #endif
49
50 };
51
52 #ifdef JP
53 /*! ブラックマーケット追加メッセージ(承諾) */
54 static cptr comment_1_B[MAX_COMMENT_1] = {
55         "まあ、それでいいや。",
56         "今日はそれで勘弁してやる。",
57         "分かったよ。",
58         "しょうがない。",
59         "それで我慢するよ。",
60         "こんなもんだろう。"
61 };
62 #endif
63 #define MAX_COMMENT_2A  2
64
65 static cptr comment_2a[MAX_COMMENT_2A] =
66 {
67 #ifdef JP
68         "私の忍耐力を試しているのかい? $%s が最後だ。",
69         "我慢にも限度があるぞ。 $%s が最後だ。"
70 #else
71         "You try my patience.  %s is final.",
72         "My patience grows thin.  %s is final."
73 #endif
74
75 };
76
77 #define MAX_COMMENT_2B  12
78
79 static cptr comment_2b[MAX_COMMENT_2B] =
80 {
81 #ifdef JP
82         " $%s ぐらいは出さなきゃダメだよ。",
83         " $%s なら受け取ってもいいが。",
84         "ハ! $%s 以下はないね。",
85         "何て奴だ! $%s 以下はあり得ないぞ。",
86         "それじゃ少なすぎる! $%s は欲しいところだ。",
87         "バカにしている! $%s はもらわないと。",
88         "嘘だろう! $%s でどうだい?",
89         "おいおい! $%s を考えてくれないか?",
90         "1000匹のオークのノミに苦しめられるがいい! $%s だ。",
91         "お前の大切なものに災いあれ! $%s でどうだ。",
92         "モルゴスに賞味されるがいい!本当は $%s なんだろう?",
93         "お前の母親はオーガか! $%s は出すつもりなんだろ?"
94 #else
95         "I can take no less than %s gold pieces.",
96         "I will accept no less than %s gold pieces.",
97         "Ha!  No less than %s gold pieces.",
98         "You knave!  No less than %s gold pieces.",
99         "That's a pittance!  I want %s gold pieces.",
100         "That's an insult!  I want %s gold pieces.",
101         "As if!  How about %s gold pieces?",
102         "My arse!  How about %s gold pieces?",
103         "May the fleas of 1000 orcs molest you!  Try %s gold pieces.",
104         "May your most favourite parts go moldy!  Try %s gold pieces.",
105         "May Morgoth find you tasty!  Perhaps %s gold pieces?",
106         "Your mother was an Ogre!  Perhaps %s gold pieces?"
107 #endif
108
109 };
110
111 #ifdef JP
112 /*! ブラックマーケット用追加メッセージ(売るとき) */
113 static cptr comment_2b_B[MAX_COMMENT_2B] = {
114         "いくら俺様がお人好しとはいえ $%s が限界だね。嫌なら帰りな。",
115         "金がないのかい、あんた?まずは家に帰って $%s 揃えてきな。",
116         "物の価値が分からん奴だな。これは $%s が普通なんだよ。",
117         "俺の付けた値段に文句があるのか? $%s が限界だ。",
118         "ひょっとして新手の冗談かい? $%s 持ってないなら帰りな。",
119         "うちは他の店とは違うんだよ。$%s ぐらいは出しな。",
120         "買う気がないなら帰りな。 $%s だと言っているんだ。",
121         "話にならないね。 $%s くらい持っているんだろ?",
122         "は?なんだそりゃ? $%s の間違いか、ひょっとして?",
123         "出口はあっちだよ。それとも $%s 出せるのかい、あんたに。",
124         "命知らずな奴だな。 $%s 出せば今日の所は勘弁してやるよ。",
125         "うちの店は貧乏人お断りだ。 $%s ぐらい出せないのかい?"
126 };
127 #endif
128 #define MAX_COMMENT_3A  2
129
130 static cptr comment_3a[MAX_COMMENT_3A] =
131 {
132 #ifdef JP
133         "私の忍耐力を試しているのかい? $%s が最後だ。",
134         "我慢にも限度があるぞ。 $%s が最後だ。"
135 #else
136         "You try my patience.  %s is final.",
137         "My patience grows thin.  %s is final."
138 #endif
139
140 };
141
142
143 #define MAX_COMMENT_3B  12
144
145 static cptr comment_3b[MAX_COMMENT_3B] =
146 {
147 #ifdef JP
148         "本音を言うと $%s でいいんだろ?",
149         " $%s でどうだい?",
150         " $%s ぐらいなら出してもいいが。",
151         " $%s 以上払うなんて考えられないね。",
152         "まあ落ちついて。 $%s でどうだい?",
153         "そのガラクタなら $%s で引き取るよ。",
154         "それじゃ高すぎる! $%s がいいとこだろ。",
155         "どうせいらないんだろ! $%s でいいだろ?",
156         "だめだめ! $%s がずっとお似合いだよ。",
157         "バカにしている! $%s がせいぜいだ。",
158         " $%s なら嬉しいところだがなあ。",
159         " $%s 、それ以上はビタ一文出さないよ!"
160 #else
161         "Perhaps %s gold pieces?",
162         "How about %s gold pieces?",
163         "I will pay no more than %s gold pieces.",
164         "I can afford no more than %s gold pieces.",
165         "Be reasonable.  How about %s gold pieces?",
166         "I'll buy it as scrap for %s gold pieces.",
167         "That is too much!  How about %s gold pieces?",
168         "That looks war surplus!  Say %s gold pieces?",
169         "Never!  %s is more like it.",
170         "That's an insult!  %s is more like it.",
171         "%s gold pieces and be thankful for it!",
172         "%s gold pieces and not a copper more!"
173 #endif
174
175 };
176
177 #ifdef JP
178 /*! ブラックマーケット用追加メッセージ(買い取り) */
179 static cptr comment_3b_B[MAX_COMMENT_3B] = {
180         " $%s ってところだね。そのどうしようもないガラクタは。",
181         "この俺が $%s って言っているんだから、その通りにした方が身のためだぞ。",
182         "俺の優しさに甘えるのもいい加減にしておけ。 $%s だ。",
183         "その品なら $%s で売ってくれているがね、常識ある紳士はみんな。",
184         "こりゃまた、がめつい奴だな。いくら俺が温厚とはいえ $%s が限界だ。",
185         " $%s だ。別に俺はそんなガラクタ欲しくはないんだから。",
186         "俺の鑑定額が気に入らないのか? $%s 、嫌なら帰りな。",
187         " $%s で引き取ってやるよ。喜んで受け取りな、貧乏人。",
188         "物の価値が分からん奴は始末におえんな。それは $%s なんだよ。",
189         "そんなに金が欲しいのか、あんた? $%s で満足できんのか?",
190         "入る店間違えてんじゃないのか? $%s で嫌なら他をあたってくれ。",
191         "俺の言い値にケチをつける奴がいるとは! その度胸に免じて $%s だ。"
192 };
193 #endif
194 #define MAX_COMMENT_4A  4
195
196 static cptr comment_4a[MAX_COMMENT_4A] =
197 {
198 #ifdef JP
199         "もうたくさんだ!何度も私をわずらわせないでくれ!",
200         "うがー!一日の我慢の限度を超えている!",
201         "もういい!時間の無駄以外のなにものでもない!",
202         "もうやってられないよ!顔も見たくない!"
203 #else
204         "Enough!  You have abused me once too often!",
205         "Arghhh!  I have had enough abuse for one day!",
206         "That does it!  You shall waste my time no more!",
207         "This is getting nowhere!  I'm going to Londis!"
208 #endif
209
210 };
211
212 #ifdef JP
213 /*! ブラックマーケット用追加メッセージ(怒りの頂点) */
214 static cptr comment_4a_B[MAX_COMMENT_4A] = {
215         "なめやがって!温厚な俺様でも限界があるってことを知れ!",
216         "俺をここまで怒らせて...命があるだけでもありがたいと思え!",
217         "ふざけてるのか!冷やかしなら相手を見てからにしろ!",
218         "いいかげんにしろ!今度こんなまねしたらただじゃおかねえぞ!"
219 };
220 #endif
221 #define MAX_COMMENT_4B  4
222
223 static cptr comment_4b[MAX_COMMENT_4B] =
224 {
225 #ifdef JP
226         "店から出て行け!",
227         "俺の前から消え失せろ!",
228         "どっかに行っちまえ!",
229         "出ろ、出ろ、出て行け!"
230 #else
231         "Leave my store!",
232         "Get out of my sight!",
233         "Begone, you scoundrel!",
234         "Out, out, out!"
235 #endif
236
237 };
238
239 #ifdef JP
240 /*! ブラックマーケット用追加メッセージ(追い出し) */
241 static cptr comment_4b_B[MAX_COMMENT_4B] = {
242         "二度とうちに来るんじゃねえ!!",
243         "とっとと、どっかへ失せろ!!",
244         "今すぐ消え失せろ!!",
245         "出ていけ!出ていけ!!"
246 };
247 #endif
248 #define MAX_COMMENT_5   8
249
250 static cptr comment_5[MAX_COMMENT_5] =
251 {
252 #ifdef JP
253         "考え直してくれ。",
254         "そりゃおかしい!",
255         "もっと真面目に言ってくれ!",
256         "交渉する気があるのかい?",
257         "冷やかしに来たのか!",
258         "悪い冗談だ!",
259         "我慢くらべかい。",
260         "ふーむ、良い天気だ。"
261 #else
262         "Try again.",
263         "Ridiculous!",
264         "You will have to do better than that!",
265         "Do you wish to do business or not?",
266         "You've got to be kidding!",
267         "You'd better be kidding!",
268         "You try my patience.",
269         "Hmmm, nice weather we're having."
270 #endif
271
272 };
273
274 #ifdef JP
275 /*! ブラックマーケット用追加メッセージ(怒り) */
276 static cptr comment_5_B[MAX_COMMENT_5] = {
277         "時間の無駄だな、これは。",
278         "厄介なお客様だな!",
279         "話して分かる相手じゃなさそうだ。",
280         "痛い目にあいたいらしいな!",
281         "なんて強欲な奴だ!",
282         "話にならん輩だ!",
283         "どうしようもない貧乏人だ!",
284         "喧嘩を売っているのか?"
285 };
286 #endif
287 #define MAX_COMMENT_6   4
288
289 static cptr comment_6[MAX_COMMENT_6] =
290 {
291 #ifdef JP
292         "どうやら聞き間違えたらしい。",
293         "失礼、よく聞こえなかったよ。",
294         "すまない、何だって?",
295         "悪い、もう一度言ってくれる?"
296 #else
297         "I must have heard you wrong.",
298         "I'm sorry, I missed that.",
299         "I'm sorry, what was that?",
300         "Sorry, what was that again?"
301 #endif
302
303 };
304
305
306
307 /*!
308  * @brief 取引成功時の店主のメッセージ処理 /
309  * Successful haggle.
310  * @return なし
311  */
312 static void say_comment_1(void)
313 {
314 #ifdef JP
315         /* ブラックマーケットのときは別のメッセージを出す */
316         if ( cur_store_num == STORE_BLACK ) {
317                 msg_print(comment_1_B[randint0(MAX_COMMENT_1)]);
318         }
319         else{
320                 msg_print(comment_1[randint0(MAX_COMMENT_1)]);
321         }
322 #else
323         msg_print(comment_1[randint0(MAX_COMMENT_1)]);
324 #endif
325
326
327         if (one_in_(RUMOR_CHANCE))
328         {
329 #ifdef JP
330                 msg_print("店主は耳うちした:");
331 #else
332                 msg_print("The shopkeeper whispers something into your ear:");
333 #endif
334                 display_rumor(TRUE);
335         }
336 }
337
338
339 /*!
340  * @brief プレイヤーがアイテムを買う時の価格代案メッセージ処理 /
341  * Continue haggling (player is buying)
342  * @param value 店主の提示価格
343  * @param annoyed 店主のいらつき度
344  * @return なし
345  */
346 static void say_comment_2(PRICE value, int annoyed)
347 {
348         char    tmp_val[80];
349
350         /* Prepare a string to insert */
351         sprintf(tmp_val, "%ld", (long)value);
352
353         /* Final offer */
354         if (annoyed > 0)
355         {
356                 /* Formatted message */
357                 msg_format(comment_2a[randint0(MAX_COMMENT_2A)], tmp_val);
358         }
359
360         /* Normal offer */
361         else
362         {
363                 /* Formatted message */
364 #ifdef JP
365                 /* ブラックマーケットの時は別のメッセージを出す */
366                 if ( cur_store_num == STORE_BLACK ){
367                         msg_format(comment_2b_B[randint0(MAX_COMMENT_2B)], tmp_val);
368                 }
369                 else{
370                 msg_format(comment_2b[randint0(MAX_COMMENT_2B)], tmp_val);
371         }
372 #else
373                 msg_format(comment_2b[randint0(MAX_COMMENT_2B)], tmp_val);
374 #endif
375
376         }
377 }
378
379
380 /*!
381  * @brief プレイヤーがアイテムを売る時の価格代案メッセージ処理 /
382  * Continue haggling (player is selling)
383  * @param value 店主の提示価格
384  * @param annoyed 店主のいらつき度
385  * @return なし
386  */
387 static void say_comment_3(PRICE value, int annoyed)
388 {
389         char    tmp_val[80];
390
391         /* Prepare a string to insert */
392         sprintf(tmp_val, "%ld", (long)value);
393
394         /* Final offer */
395         if (annoyed > 0)
396         {
397                 /* Formatted message */
398                 msg_format(comment_3a[randint0(MAX_COMMENT_3A)], tmp_val);
399         }
400
401         /* Normal offer */
402         else
403         {
404                 /* Formatted message */
405 #ifdef JP
406                 /* ブラックマーケットの時は別のメッセージを出す */
407                 if ( cur_store_num == STORE_BLACK ){
408                         msg_format(comment_3b_B[randint0(MAX_COMMENT_3B)], tmp_val);
409                 }
410                 else{
411                 msg_format(comment_3b[randint0(MAX_COMMENT_3B)], tmp_val);
412         }
413 #else
414                 msg_format(comment_3b[randint0(MAX_COMMENT_3B)], tmp_val);
415 #endif
416
417         }
418 }
419
420
421 /*!
422  * @brief 店主がプレイヤーを追い出す時のメッセージ処理 /
423  * Kick 'da bum out.                                    -RAK-
424  * @return なし
425  */
426 static void say_comment_4(void)
427 {
428 #ifdef JP
429         /* ブラックマーケットの時は別のメッセージを出す */
430         if ( cur_store_num == STORE_BLACK ){
431                 msg_print(comment_4a_B[randint0(MAX_COMMENT_4A)]);
432                 msg_print(comment_4b_B[randint0(MAX_COMMENT_4B)]);
433         }
434         else{
435                 msg_print(comment_4a[randint0(MAX_COMMENT_4A)]);
436                 msg_print(comment_4b[randint0(MAX_COMMENT_4B)]);
437         }
438 #else
439         msg_print(comment_4a[randint0(MAX_COMMENT_4A)]);
440         msg_print(comment_4b[randint0(MAX_COMMENT_4B)]);
441 #endif
442
443 }
444
445
446 /*!
447  * @brief 店主がプレイヤーに取り合わない時のメッセージ処理 /
448  * You are insulting me
449  * @return なし
450  */
451 static void say_comment_5(void)
452 {
453 #ifdef JP
454         /* ブラックマーケットの時は別のメッセージを出す */
455         if ( cur_store_num == STORE_BLACK ){
456                 msg_print(comment_5_B[randint0(MAX_COMMENT_5)]);
457         }
458         else{
459                 msg_print(comment_5[randint0(MAX_COMMENT_5)]);
460         }
461 #else
462         msg_print(comment_5[randint0(MAX_COMMENT_5)]);
463 #endif
464
465 }
466
467
468 /*!
469  * @brief 店主がプレイヤーの提示を理解できなかった時のメッセージ処理 /
470  * That makes no sense.
471  * @return なし
472  */
473 static void say_comment_6(void)
474 {
475         msg_print(comment_6[randint0(MAX_COMMENT_6)]);
476 }
477
478
479 #define MAX_COMMENT_7A  4
480
481 static cptr comment_7a[MAX_COMMENT_7A] =
482 {
483 #ifdef JP
484         "うわああぁぁ!",
485         "なんてこった!",
486         "誰かがむせび泣く声が聞こえる...。",
487         "店主が悔しげにわめいている!"
488 #else
489         "Arrgghh!",
490         "You bastard!",
491         "You hear someone sobbing...",
492         "The shopkeeper howls in agony!"
493 #endif
494
495 };
496
497 #define MAX_COMMENT_7B  4
498
499 static cptr comment_7b[MAX_COMMENT_7B] =
500 {
501 #ifdef JP
502         "くそう!",
503         "この悪魔め!",
504         "店主が恨めしそうに見ている。",
505         "店主が睨んでいる。"
506 #else
507         "Damn!",
508         "You fiend!",
509         "The shopkeeper curses at you.",
510         "The shopkeeper glares at you."
511 #endif
512
513 };
514
515 #define MAX_COMMENT_7C  4
516
517 static cptr comment_7c[MAX_COMMENT_7C] =
518 {
519 #ifdef JP
520         "すばらしい!",
521         "君が天使に見えるよ!",
522         "店主がクスクス笑っている。",
523         "店主が大声で笑っている。"
524 #else
525         "Cool!",
526         "You've made my day!",
527         "The shopkeeper giggles.",
528         "The shopkeeper laughs loudly."
529 #endif
530
531 };
532
533 #define MAX_COMMENT_7D  4
534
535 static cptr comment_7d[MAX_COMMENT_7D] =
536 {
537 #ifdef JP
538         "やっほぅ!",
539         "こんなおいしい思いをしたら、真面目に働けなくなるなぁ。",
540         "店主は嬉しくて跳ね回っている。",
541         "店主は満面に笑みをたたえている。"
542 #else
543         "Yipee!",
544         "I think I'll retire!",
545         "The shopkeeper jumps for joy.",
546         "The shopkeeper smiles gleefully."
547 #endif
548
549 };
550
551
552 /*!
553  * @brief 店主が交渉を終えた際の反応を返す処理 /
554  * Let a shop-keeper React to a purchase
555  * @param price アイテムの取引額
556  * @param value アイテムの実際価値
557  * @param guess 店主が当初予想していた価値
558  * @return なし
559  * @details 
560  * We paid "price", it was worth "value", and we thought it was worth "guess"
561  */
562 static void purchase_analyze(PRICE price, PRICE value, PRICE guess)
563 {
564         /* Item was worthless, but we bought it */
565         if ((value <= 0) && (price > value))
566         {
567                 msg_print(comment_7a[randint0(MAX_COMMENT_7A)]);
568                 chg_virtue(V_HONOUR, -1);
569                 chg_virtue(V_JUSTICE, -1);
570                 sound(SOUND_STORE1);
571         }
572
573         /* Item was cheaper than we thought, and we paid more than necessary */
574         else if ((value < guess) && (price > value))
575         {
576                 msg_print(comment_7b[randint0(MAX_COMMENT_7B)]);
577                 chg_virtue(V_JUSTICE, -1);
578                 if (one_in_(4)) chg_virtue(V_HONOUR, -1);
579                 sound(SOUND_STORE2);
580         }
581
582         /* Item was a good bargain, and we got away with it */
583         else if ((value > guess) && (value < (4 * guess)) && (price < value))
584         {
585                 msg_print(comment_7c[randint0(MAX_COMMENT_7C)]);
586                 if (one_in_(4)) chg_virtue(V_HONOUR, -1);
587                 else if (one_in_(4)) chg_virtue(V_HONOUR, 1);
588                 sound(SOUND_STORE3);
589         }
590
591         /* Item was a great bargain, and we got away with it */
592         else if ((value > guess) && (price < value))
593         {
594                 msg_print(comment_7d[randint0(MAX_COMMENT_7D)]);
595                 if (one_in_(2)) chg_virtue(V_HONOUR, -1);
596                 if (one_in_(4)) chg_virtue(V_HONOUR, 1);
597                 if (10 * price < value) chg_virtue(V_SACRIFICE, 1);
598                 sound(SOUND_STORE4);
599         }
600 }
601
602
603
604 /*
605  * We store the current "store feat" here so everyone can access it
606  */
607 static int cur_store_feat;
608
609
610 /*
611  * Buying and selling adjustments for race combinations.
612  * Entry[owner][player] gives the basic "cost inflation".
613  */
614 static byte rgold_adj[MAX_RACES][MAX_RACES] =
615 {
616         /*Hum, HfE, Elf,  Hal, Gno, Dwa, HfO, HfT, Dun, HiE, Barbarian,
617          HfOg, HGn, HTn, Cyc, Yek, Klc, Kbd, Nbl, DkE, Drc, Mind Flayer,
618          Imp,  Glm, Skl, Zombie, Vampire, Spectre, Fairy, Beastman, Ent,
619          Angel, Demon, Kutar */
620
621         /* Human */
622         { 100, 105, 105, 110, 113, 115, 120, 125, 100, 105, 100,
623           124, 120, 110, 125, 115, 120, 120, 120, 120, 115, 120,
624           115, 105, 125, 125, 125, 125, 105, 120, 105,  95, 140,
625           100, 120, 110, 105 },
626
627         /* Half-Elf */
628         { 110, 100, 100, 105, 110, 120, 125, 130, 110, 100, 110,
629           120, 115, 108, 115, 110, 110, 120, 120, 115, 115, 110,
630           120, 110, 110, 110, 120, 110, 100, 125, 100,  95, 140,
631           110, 115, 110, 110 },
632
633         /* Elf */
634         { 110, 105, 100, 105, 110, 120, 125, 130, 110, 100, 110,
635           120, 120, 105, 120, 110, 105, 125, 125, 110, 115, 108,
636           120, 115, 110, 110, 120, 110, 100, 125, 100,  95, 140,
637           110, 110, 105, 110 },
638
639         /* Halfling */
640         { 115, 110, 105,  95, 105, 110, 115, 130, 115, 105, 115,
641           125, 120, 120, 125, 115, 110, 120, 120, 120, 115, 115,
642           120, 110, 120, 120, 130, 110, 110, 130, 110,  95, 140,
643           115, 120, 105, 115 },
644
645         /* Gnome */
646         { 115, 115, 110, 105,  95, 110, 115, 130, 115, 110, 115,
647           120, 125, 110, 120, 110, 105, 120, 110, 110, 105, 110,
648           120, 101, 110, 110, 120, 120, 115, 130, 115,  95, 140,
649           115, 110, 110, 115 },
650
651         /* Dwarf */
652         { 115, 120, 120, 110, 110,  95, 125, 135, 115, 120, 115,
653           125, 140, 130, 130, 120, 115, 115, 115, 135, 125, 120,
654           120, 105, 115, 115, 115, 115, 120, 130, 120,  95, 140,
655           115, 110, 115, 115 },
656
657         /* Half-Orc */
658         { 115, 120, 125, 115, 115, 130, 110, 115, 115, 125, 115,
659           110, 110, 120, 110, 120, 125, 115, 115, 110, 120, 110,
660           115, 125, 120, 120, 115, 120, 125, 115, 125,  95, 140,
661           115, 110, 115, 115 },
662
663         /* Half-Troll */
664         { 110, 115, 115, 110, 110, 130, 110, 110, 110, 115, 110,
665           110, 115, 120, 110, 120, 120, 110, 110, 110, 115, 110,
666           110, 115, 112, 112, 115, 112, 120, 110, 120,  95, 140,
667           110, 110, 115, 110 },
668
669         /* Amberite */
670         { 100, 105, 105, 110, 113, 115, 120, 125, 100, 105, 100,
671           120, 120, 105, 120, 115, 105, 115, 120, 110, 105, 105,
672           120, 105, 120, 120, 125, 120, 105, 135, 105,  95, 140,
673           100, 110, 110, 100 },
674
675         /* High_Elf */
676         { 110, 105, 100, 105, 110, 120, 125, 130, 110, 100, 110,
677           125, 125, 101, 120, 115, 110, 115, 125, 110, 110, 110,
678           125, 115, 120, 120, 125, 120, 100, 125, 100,  95, 140,
679           110, 110, 105, 110 },
680
681         /* Human / Barbarian (copied from human) */
682         { 100, 105, 105, 110, 113, 115, 120, 125, 100, 105, 100,
683           124, 120, 110, 125, 115, 120, 120, 120, 120, 115, 120,
684           115, 105, 125, 125, 130, 125, 115, 120, 115,  95, 140,
685           100, 120, 110, 100 },
686
687         /* Half-Ogre: theoretical, copied from half-troll */
688         { 110, 115, 115, 110, 110, 130, 110, 110, 110, 115, 110,
689           110, 115, 120, 110, 120, 120, 110, 110, 110, 115, 110,
690           110, 115, 112, 112, 115, 112, 120, 110, 120,  95, 140,
691           110, 110, 115, 110 },
692
693         /* Half-Giant: theoretical, copied from half-troll */
694         { 110, 115, 115, 110, 110, 130, 110, 110, 110, 115, 110,
695           110, 115, 120, 110, 120, 120, 110, 110, 110, 115, 110,
696           110, 115, 112, 112, 115, 112, 130, 120, 130,  95, 140,
697           110, 110, 115, 110 },
698
699         /* Half-Titan: theoretical, copied from High_Elf */
700         { 110, 105, 100, 105, 110, 120, 125, 130, 110, 100, 110,
701           125, 125, 101, 120, 115, 110, 115, 125, 110, 110, 110,
702           125, 115, 120, 120, 120, 120, 130, 130, 130,  95, 140,
703           110, 110, 115, 110 },
704
705         /* Cyclops: theoretical, copied from half-troll */
706         { 110, 115, 115, 110, 110, 130, 110, 110, 110, 115, 110,
707           110, 115, 120, 110, 120, 120, 110, 110, 110, 115, 110,
708           110, 115, 112, 112, 115, 112, 130, 130, 130,  95, 140,
709           110, 110, 115, 110 },
710
711         /* Yeek: theoretical, copied from Half-Orc */
712         { 115, 120, 125, 115, 115, 130, 110, 115, 115, 125, 115,
713           110, 110, 120, 110, 120, 125, 115, 115, 110, 120, 110,
714           115, 125, 120, 120, 120, 120, 130, 130, 130,  95, 140,
715           115, 110, 115, 115 },
716
717         /* Klackon: theoretical, copied from Gnome */
718         { 115, 115, 110, 105,  95, 110, 115, 130, 115, 110, 115,
719           120, 125, 110, 120, 110, 105, 120, 110, 110, 105, 110,
720           120, 101, 110, 110, 120, 120, 130, 130, 130,  95, 140,
721           115, 110, 115, 115 },
722
723         /* Kobold: theoretical, copied from Half-Orc */
724         { 115, 120, 125, 115, 115, 130, 110, 115, 115, 125, 115,
725           110, 110, 120, 110, 120, 125, 115, 115, 110, 120, 110,
726           115, 125, 120, 120, 120, 120, 130, 130, 130,  95, 140,
727           115, 110, 115, 115 },
728
729         /* Nibelung: theoretical, copied from Dwarf */
730         { 115, 120, 120, 110, 110,  95, 125, 135, 115, 120, 115,
731           125, 140, 130, 130, 120, 115, 115, 115, 135, 125, 120,
732           120, 105, 115, 115, 120, 120, 130, 130, 130,  95, 140,
733           115, 135, 115, 115 },
734
735         /* Dark Elf */
736         { 110, 110, 110, 115, 120, 130, 115, 115, 120, 110, 115,
737           115, 115, 116, 115, 120, 120, 115, 115, 101, 110, 110,
738           110, 110, 112, 122, 110, 110, 110, 115, 110, 120, 120,
739           110, 101, 115, 110 },
740
741         /* Draconian: theoretical, copied from High_Elf */
742         { 110, 105, 100, 105, 110, 120, 125, 130, 110, 100, 110,
743           125, 125, 101, 120, 115, 110, 115, 125, 110, 110, 110,
744           125, 115, 120, 120, 120, 120, 130, 130, 130,  95, 140,
745           110, 110, 115, 110 },
746
747         /* Mind Flayer: theoretical, copied from High_Elf */
748         { 110, 105, 100, 105, 110, 120, 125, 130, 110, 100, 110,
749           125, 125, 101, 120, 115, 110, 115, 125, 110, 110, 110,
750           125, 115, 120, 120, 120, 120, 130, 130, 130,  95, 140,
751           110, 110, 115, 110 },
752
753         /* Imp: theoretical, copied from High_Elf */
754         { 110, 105, 100, 105, 110, 120, 125, 130, 110, 100, 110,
755           125, 125, 101, 120, 115, 110, 115, 125, 110, 110, 110,
756           125, 115, 120, 120, 120, 120, 130, 130, 130, 120, 120,
757           110, 110, 115, 110 },
758
759         /* Golem: theoretical, copied from High_Elf */
760         { 110, 105, 100, 105, 110, 120, 125, 130, 110, 100, 110,
761           125, 125, 101, 120, 115, 110, 115, 125, 110, 110, 110,
762           125, 115, 120, 120, 120, 120, 130, 130, 130,  95, 140,
763           110, 110, 115, 110 },
764
765         /* Skeleton: theoretical, copied from half-orc */
766         { 115, 120, 125, 115, 115, 130, 110, 115, 115, 125, 115,
767           110, 110, 120, 110, 120, 125, 115, 115, 110, 120, 110,
768           115, 125, 120, 120, 120, 120, 130, 130, 130, 120, 120,
769           115, 110, 125, 115 },
770
771         /* Zombie: Theoretical, copied from half-orc */
772         { 115, 120, 125, 115, 115, 130, 110, 115, 115, 125, 115,
773           110, 110, 120, 110, 120, 125, 115, 115, 110, 120, 110,
774           115, 125, 120, 120, 120, 120, 130, 130, 130, 120, 120,
775           115, 110, 125, 115 },
776
777         /* Vampire: Theoretical, copied from half-orc */
778         { 115, 120, 125, 115, 115, 130, 110, 115, 115, 125, 115,
779           110, 110, 120, 110, 120, 125, 115, 115, 110, 120, 110,
780           115, 125, 120, 120, 120, 120, 130, 130, 130, 120, 120,
781           115, 110, 125, 115 },
782
783         /* Spectre: Theoretical, copied from half-orc */
784         { 115, 120, 125, 115, 115, 130, 110, 115, 115, 125, 115,
785           110, 110, 120, 110, 120, 125, 115, 115, 110, 120, 110,
786           115, 125, 120, 120, 120, 120, 130, 130, 130, 120, 120,
787           115, 110, 125, 115 },
788
789         /* Sprite: Theoretical, copied from half-orc */
790         { 115, 120, 125, 115, 115, 130, 110, 115, 115, 125, 115,
791           110, 110, 120, 110, 120, 125, 115, 115, 110, 120, 110,
792           115, 125, 120, 120, 120, 120, 130, 130, 130,  95, 140,
793           115, 110, 105, 115 },
794
795         /* Beastman: Theoretical, copied from half-orc */
796         { 115, 120, 125, 115, 115, 130, 110, 115, 115, 125, 115,
797           110, 110, 120, 110, 120, 125, 115, 115, 110, 120, 110,
798           115, 125, 120, 120, 120, 120, 130, 130, 130,  95, 140,
799           115, 110, 115, 115 },
800
801         /* Ent */
802         { 110, 105, 100, 105, 110, 120, 125, 130, 110, 100, 110,
803           120, 120, 105, 120, 110, 105, 125, 125, 110, 115, 108,
804           120, 115, 110, 110, 120, 110, 100, 125, 100,  95, 140,
805           110, 110, 105, 110 },
806
807         /* Angel */
808         {  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,
809            95,  95,  95,  95,  95,  95,  95,  95,  95,  95,  95,
810            95,  95,  95,  95,  95,  95,  95,  95,  95,  95, 160,
811            95,  95,  95,  95 },
812
813         /* Demon */
814         { 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
815           140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
816           140, 140, 140, 140, 140, 140, 140, 140, 140, 160, 120,
817           140, 140, 140, 140 },
818
819         /* Dunadan */
820         { 100, 105, 105, 110, 113, 115, 120, 125, 100, 105, 100,
821           124, 120, 110, 125, 115, 120, 120, 120, 120, 115, 120,
822           115, 105, 125, 125, 125, 125, 105, 120, 105,  95, 140,
823           100, 120, 110, 100 },
824
825         /* Shadow Fairy */
826         { 110, 110, 110, 115, 120, 130, 115, 115, 120, 110, 115,
827           115, 115, 116, 115, 120, 120, 115, 115, 101, 110, 110,
828           110, 110, 112, 122, 110, 110, 110, 115, 110, 120, 120,
829           110, 101, 115, 110 },
830
831         /* Kutar */
832         { 110, 110, 105, 105, 110, 115, 115, 115, 110, 105, 110,
833           115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
834           115, 115, 125, 125, 125, 125, 105, 115, 105,  95, 140,
835           110, 115, 100, 110 },
836
837         /* Android */
838         { 105, 105, 105, 110, 113, 115, 120, 125, 100, 105, 100,
839           124, 120, 110, 125, 115, 120, 120, 120, 120, 115, 120,
840           115, 105, 125, 125, 125, 125, 105, 120, 105,  95, 140,
841           100, 120, 110, 100 },
842 };
843
844
845
846 /*!
847  * @brief 店舗価格を決定する /
848  * Determine the price of an item (qty one) in a store.
849  * @param o_ptr 店舗に並べるオブジェクト構造体の参照ポインタ
850  * @param greed 店主の強欲度
851  * @param flip TRUEならば店主にとっての買取価格、FALSEなら売出価格を計算
852  * @return なし
853  * @details 
854  * <pre>
855  * This function takes into account the player's charisma, and the
856  * shop-keepers friendliness, and the shop-keeper's base greed, but
857  * never lets a shop-keeper lose money in a transaction.
858  * The "greed" value should exceed 100 when the player is "buying" the
859  * item, and should be less than 100 when the player is "selling" it.
860  * Hack -- the black market always charges twice as much as it should.
861  * Charisma adjustment runs from 80 to 130
862  * Racial adjustment runs from 95 to 130
863  * Since greed/charisma/racial adjustments are centered at 100, we need
864  * to adjust (by 200) to extract a usable multiplier.  Note that the
865  * "greed" value is always something (?).
866  * </pre>
867  */
868 static s32b price_item(object_type *o_ptr, int greed, bool flip)
869 {
870         int     factor;
871         int     adjust;
872         s32b    price;
873
874
875         /* Get the value of one of the items */
876         price = object_value(o_ptr);
877
878         /* Worthless items */
879         if (price <= 0) return (0L);
880
881
882         /* Compute the racial factor */
883         factor = rgold_adj[ot_ptr->owner_race][p_ptr->prace];
884
885         /* Add in the charisma factor */
886         factor += adj_chr_gold[p_ptr->stat_ind[A_CHR]];
887
888
889         /* Shop is buying */
890         if (flip)
891         {
892                 /* Adjust for greed */
893                 adjust = 100 + (300 - (greed + factor));
894
895                 /* Never get "silly" */
896                 if (adjust > 100) adjust = 100;
897
898                 /* Mega-Hack -- Black market sucks */
899                 if (cur_store_num == STORE_BLACK)
900                         price = price / 2;
901
902                 /* Compute the final price (with rounding) */
903                 /* Hack -- prevent underflow */
904                 price = (price * adjust + 50L) / 100L;
905         }
906
907         /* Shop is selling */
908         else
909         {
910                 /* Adjust for greed */
911                 adjust = 100 + ((greed + factor) - 300);
912
913                 /* Never get "silly" */
914                 if (adjust < 100) adjust = 100;
915
916                 /* Mega-Hack -- Black market sucks */
917                 if (cur_store_num == STORE_BLACK)
918                         price = price * 2;
919
920                 /* Compute the final price (with rounding) */
921                 /* Hack -- prevent overflow */
922                 price = (s32b)(((u32b)price * (u32b)adjust + 50UL) / 100UL);
923         }
924
925         /* Note -- Never become "free" */
926         if (price <= 0L) return (1L);
927
928         /* Return the price */
929         return (price);
930 }
931
932
933 /*!
934  * @brief 安価な消耗品の販売数を増やし、低確率で割引にする /
935  * Certain "cheap" objects should be created in "piles"
936  * @param o_ptr 店舗に並べるオブジェクト構造体の参照ポインタ
937  * @return なし
938  * @details 
939  * <pre>
940  * Some objects can be sold at a "discount" (in small piles)
941  * </pre>
942  */
943 static void mass_produce(object_type *o_ptr)
944 {
945         int size = 1;
946         DISCOUNT_RATE discount = 0;
947
948         s32b cost = object_value(o_ptr);
949
950
951         /* Analyze the type */
952         switch (o_ptr->tval)
953         {
954                 /* Food, Flasks, and Lites */
955                 case TV_FOOD:
956                 case TV_FLASK:
957                 case TV_LITE:
958                 {
959                         if (cost <= 5L) size += damroll(3, 5);
960                         if (cost <= 20L) size += damroll(3, 5);
961                         if (cost <= 50L) size += damroll(2, 2);
962                         break;
963                 }
964
965                 case TV_POTION:
966                 case TV_SCROLL:
967                 {
968                         if (cost <= 60L) size += damroll(3, 5);
969                         if (cost <= 240L) size += damroll(1, 5);
970                         if (o_ptr->sval == SV_SCROLL_STAR_IDENTIFY) size += damroll(3, 5);
971                         if (o_ptr->sval == SV_SCROLL_STAR_REMOVE_CURSE) size += damroll(1, 4);
972                         break;
973                 }
974
975                 case TV_LIFE_BOOK:
976                 case TV_SORCERY_BOOK:
977                 case TV_NATURE_BOOK:
978                 case TV_CHAOS_BOOK:
979                 case TV_DEATH_BOOK:
980                 case TV_TRUMP_BOOK:
981                 case TV_ARCANE_BOOK:
982                 case TV_CRAFT_BOOK:
983                 case TV_DAEMON_BOOK:
984                 case TV_CRUSADE_BOOK:
985                 case TV_MUSIC_BOOK:
986                 case TV_HISSATSU_BOOK:
987                 case TV_HEX_BOOK:
988                 {
989                         if (cost <= 50L) size += damroll(2, 3);
990                         if (cost <= 500L) size += damroll(1, 3);
991                         break;
992                 }
993
994                 case TV_SOFT_ARMOR:
995                 case TV_HARD_ARMOR:
996                 case TV_SHIELD:
997                 case TV_GLOVES:
998                 case TV_BOOTS:
999                 case TV_CLOAK:
1000                 case TV_HELM:
1001                 case TV_CROWN:
1002                 case TV_SWORD:
1003                 case TV_POLEARM:
1004                 case TV_HAFTED:
1005                 case TV_DIGGING:
1006                 case TV_BOW:
1007                 {
1008                         if (object_is_artifact(o_ptr)) break;
1009                         if (object_is_ego(o_ptr)) break;
1010                         if (cost <= 10L) size += damroll(3, 5);
1011                         if (cost <= 100L) size += damroll(3, 5);
1012                         break;
1013                 }
1014
1015                 case TV_SPIKE:
1016                 case TV_SHOT:
1017                 case TV_ARROW:
1018                 case TV_BOLT:
1019                 {
1020                         if (cost <= 5L) size += damroll(5, 5);
1021                         if (cost <= 50L) size += damroll(5, 5);
1022                         if (cost <= 500L) size += damroll(5, 5);
1023                         break;
1024                 }
1025
1026                 case TV_FIGURINE:
1027                 {
1028                         if (cost <= 100L) size += damroll(2, 2);
1029                         if (cost <= 1000L) size += damroll(2, 2);
1030                         break;
1031                 }
1032
1033                 case TV_CAPTURE:
1034                 case TV_STATUE:
1035                 case TV_CARD:
1036                 {
1037                         size = 1;
1038                         break;
1039                 }
1040
1041                 /*
1042                  * Because many rods (and a few wands and staffs) are useful mainly
1043                  * in quantity, the Black Market will occasionally have a bunch of
1044                  * one kind. -LM-
1045                  */
1046                 case TV_ROD:
1047                 case TV_WAND:
1048                 case TV_STAFF:
1049                 {
1050                         if ((cur_store_num == STORE_BLACK) && one_in_(3))
1051                         {
1052                                 if (cost < 1601L) size += damroll(1, 5);
1053                                 else if (cost < 3201L) size += damroll(1, 3);
1054                         }
1055                         break;
1056                 }
1057         }
1058
1059
1060         /* Pick a discount */
1061         if (cost < 5)
1062         {
1063                 discount = 0;
1064         }
1065         else if (one_in_(25))
1066         {
1067                 discount = 25;
1068         }
1069         else if (one_in_(150))
1070         {
1071                 discount = 50;
1072         }
1073         else if (one_in_(300))
1074         {
1075                 discount = 75;
1076         }
1077         else if (one_in_(500))
1078         {
1079                 discount = 90;
1080         }
1081
1082         if (o_ptr->art_name)
1083         {
1084                 discount = 0;
1085         }
1086
1087         /* Save the discount */
1088         o_ptr->discount = discount;
1089
1090         /* Save the total pile size */
1091         o_ptr->number = size - (size * discount / 100);
1092
1093         /* Ensure that mass-produced rods and wands get the correct pvals. */
1094         if ((o_ptr->tval == TV_ROD) || (o_ptr->tval == TV_WAND))
1095         {
1096                 o_ptr->pval *= (PARAMETER_VALUE)o_ptr->number;
1097         }
1098 }
1099
1100
1101
1102 /*!
1103  * @brief 店舗に並べた品を同一品であるかどうか判定する /
1104  * Determine if a store item can "absorb" another item
1105  * @param o_ptr 判定するオブジェクト構造体の参照ポインタ1
1106  * @param j_ptr 判定するオブジェクト構造体の参照ポインタ2
1107  * @return 同一扱いできるならTRUEを返す
1108  * @details 
1109  * <pre>
1110  * See "object_similar()" for the same function for the "player"
1111  * </pre>
1112  */
1113 static bool store_object_similar(object_type *o_ptr, object_type *j_ptr)
1114 {
1115         int i;
1116
1117         /* Hack -- Identical items cannot be stacked */
1118         if (o_ptr == j_ptr) return (0);
1119
1120         /* Different objects cannot be stacked */
1121         if (o_ptr->k_idx != j_ptr->k_idx) return (0);
1122
1123         /* Different charges (etc) cannot be stacked, unless wands or rods. */
1124         if ((o_ptr->pval != j_ptr->pval) && (o_ptr->tval != TV_WAND) && (o_ptr->tval != TV_ROD)) return (0);
1125
1126         /* Require many identical values */
1127         if (o_ptr->to_h != j_ptr->to_h) return (0);
1128         if (o_ptr->to_d != j_ptr->to_d) return (0);
1129         if (o_ptr->to_a != j_ptr->to_a) return (0);
1130
1131         /* Require identical "ego-item" names */
1132         if (o_ptr->name2 != j_ptr->name2) return (0);
1133
1134         /* Artifacts don't stack! */
1135         if (object_is_artifact(o_ptr) || object_is_artifact(j_ptr)) return (0);
1136
1137         /* Hack -- Identical art_flags! */
1138         for (i = 0; i < TR_FLAG_SIZE; i++)
1139                 if (o_ptr->art_flags[i] != j_ptr->art_flags[i]) return (0);
1140
1141         /* Hack -- Never stack "powerful" items */
1142         if (o_ptr->xtra1 || j_ptr->xtra1) return (0);
1143
1144         /* Hack -- Never stack recharging items */
1145         if (o_ptr->timeout || j_ptr->timeout) return (0);
1146
1147         /* Require many identical values */
1148         if (o_ptr->ac != j_ptr->ac)   return (0);
1149         if (o_ptr->dd != j_ptr->dd)   return (0);
1150         if (o_ptr->ds != j_ptr->ds)   return (0);
1151
1152         /* Hack -- Never stack chests */
1153         if (o_ptr->tval == TV_CHEST) return (0);
1154         if (o_ptr->tval == TV_STATUE) return (0);
1155         if (o_ptr->tval == TV_CAPTURE) return (0);
1156
1157         /* Require matching discounts */
1158         if (o_ptr->discount != j_ptr->discount) return (0);
1159
1160         /* They match, so they must be similar */
1161         return (TRUE);
1162 }
1163
1164
1165 /*!
1166  * @brief 店舗に並べた品を重ね合わせできるかどうか判定する /
1167  * Allow a store item to absorb another item
1168  * @param o_ptr 判定するオブジェクト構造体の参照ポインタ1
1169  * @param j_ptr 判定するオブジェクト構造体の参照ポインタ2
1170  * @return 重ね合わせできるならTRUEを返す
1171  * @details 
1172  * <pre>
1173  * See "object_similar()" for the same function for the "player"
1174  * </pre>
1175  */
1176 static void store_object_absorb(object_type *o_ptr, object_type *j_ptr)
1177 {
1178         int max_num = (o_ptr->tval == TV_ROD) ?
1179                 MIN(99, MAX_SHORT / k_info[o_ptr->k_idx].pval) : 99;
1180         int total = o_ptr->number + j_ptr->number;
1181         int diff = (total > max_num) ? total - max_num : 0;
1182
1183         /* Combine quantity, lose excess items */
1184         o_ptr->number = (total > max_num) ? max_num : total;
1185
1186         /* Hack -- if rods are stacking, add the pvals (maximum timeouts) together. -LM- */
1187         if (o_ptr->tval == TV_ROD)
1188         {
1189                 o_ptr->pval += j_ptr->pval * (j_ptr->number - diff) / j_ptr->number;
1190         }
1191
1192         /* Hack -- if wands are stacking, combine the charges. -LM- */
1193         if (o_ptr->tval == TV_WAND)
1194         {
1195                 o_ptr->pval += j_ptr->pval * (j_ptr->number - diff) / j_ptr->number;
1196         }
1197 }
1198
1199
1200 /*!
1201  * @brief 店舗に品を置くスペースがあるかどうかの判定を返す /
1202  * Check to see if the shop will be carrying too many objects   -RAK-
1203  * @param o_ptr 店舗に置きたいオブジェクト構造体の参照ポインタ
1204  * @return 置き場がないなら0、重ね合わせできるアイテムがあるなら-1、スペースがあるなら1を返す。
1205  * @details 
1206  * <pre>
1207  * Note that the shop, just like a player, will not accept things
1208  * it cannot hold.      Before, one could "nuke" potions this way.
1209  * Return value is now int:
1210  *  0 : No space
1211  * -1 : Can be combined to existing slot.
1212  *  1 : Cannot be combined but there are empty spaces.
1213  * </pre>
1214  */
1215 static int store_check_num(object_type *o_ptr)
1216 {
1217         int        i;
1218         object_type *j_ptr;
1219
1220         /* The "home" acts like the player */
1221         if ((cur_store_num == STORE_HOME) || (cur_store_num == STORE_MUSEUM))
1222         {
1223                 bool old_stack_force_notes = stack_force_notes;
1224                 bool old_stack_force_costs = stack_force_costs;
1225
1226                 if (cur_store_num != STORE_HOME)
1227                 {
1228                         stack_force_notes = FALSE;
1229                         stack_force_costs = FALSE;
1230                 }
1231
1232                 /* Check all the items */
1233                 for (i = 0; i < st_ptr->stock_num; i++)
1234                 {
1235                         /* Get the existing item */
1236                         j_ptr = &st_ptr->stock[i];
1237
1238                         /* Can the new object be combined with the old one? */
1239                         if (object_similar(j_ptr, o_ptr))
1240                         {
1241                                 if (cur_store_num != STORE_HOME)
1242                                 {
1243                                         stack_force_notes = old_stack_force_notes;
1244                                         stack_force_costs = old_stack_force_costs;
1245                                 }
1246
1247                                 return -1;
1248                         }
1249                 }
1250
1251                 if (cur_store_num != STORE_HOME)
1252                 {
1253                         stack_force_notes = old_stack_force_notes;
1254                         stack_force_costs = old_stack_force_costs;
1255                 }
1256         }
1257
1258         /* Normal stores do special stuff */
1259         else
1260         {
1261                 /* Check all the items */
1262                 for (i = 0; i < st_ptr->stock_num; i++)
1263                 {
1264                         /* Get the existing item */
1265                         j_ptr = &st_ptr->stock[i];
1266
1267                         /* Can the new object be combined with the old one? */
1268                         if (store_object_similar(j_ptr, o_ptr)) return -1;
1269                 }
1270         }
1271
1272         /* Free space is always usable */
1273         /*
1274          * オプション powerup_home が設定されていると
1275          * 我が家が 20 ページまで使える
1276          */
1277         if ((cur_store_num == STORE_HOME) && ( powerup_home == FALSE )) {
1278                 if (st_ptr->stock_num < ((st_ptr->stock_size) / 10)) {
1279                         return 1;
1280                 }
1281         }
1282         else{
1283                 if (st_ptr->stock_num < st_ptr->stock_size) {
1284                         return 1;
1285                 }
1286         }
1287
1288         /* But there was no room at the inn... */
1289         return 0;
1290 }
1291
1292 /*!
1293  * @brief オブジェクトが祝福されているかの判定を返す /
1294  * @param o_ptr 判定したいオブジェクト構造体の参照ポインタ
1295  * @return アイテムが祝福されたアイテムならばTRUEを返す
1296  */
1297 static bool is_blessed(object_type *o_ptr)
1298 {
1299         BIT_FLAGS flgs[TR_FLAG_SIZE];
1300         object_flags(o_ptr, flgs);
1301         if (have_flag(flgs, TR_BLESSED)) return (TRUE);
1302         else return (FALSE);
1303 }
1304
1305
1306
1307 /*!
1308  * @brief オブジェクトが所定の店舗で引き取れるかどうかを返す /
1309  * Determine if the current store will purchase the given item
1310  * @param o_ptr 判定したいオブジェクト構造体の参照ポインタ
1311  * @return アイテムが買い取れるならばTRUEを返す
1312  * @note
1313  * Note that a shop-keeper must refuse to buy "worthless" items
1314  */
1315 static bool store_will_buy(object_type *o_ptr)
1316 {
1317         /* Hack -- The Home is simple */
1318         if ((cur_store_num == STORE_HOME) || (cur_store_num == STORE_MUSEUM)) return (TRUE);
1319
1320         /* Switch on the store */
1321         switch (cur_store_num)
1322         {
1323                 /* General Store */
1324                 case STORE_GENERAL:
1325                 {
1326                         /* Analyze the type */
1327                         switch (o_ptr->tval)
1328                         {
1329                                 case TV_POTION:
1330                                         if (o_ptr->sval != SV_POTION_WATER) return FALSE;
1331
1332                                 case TV_WHISTLE:
1333                                 case TV_FOOD:
1334                                 case TV_LITE:
1335                                 case TV_FLASK:
1336                                 case TV_SPIKE:
1337                                 case TV_SHOT:
1338                                 case TV_ARROW:
1339                                 case TV_BOLT:
1340                                 case TV_DIGGING:
1341                                 case TV_CLOAK:
1342                                 case TV_BOTTLE: /* 'Green', recycling Angband */
1343                                 case TV_FIGURINE:
1344                                 case TV_STATUE:
1345                                 case TV_CAPTURE:
1346                                 case TV_CARD:
1347                                 break;
1348                                 default:
1349                                 return (FALSE);
1350                         }
1351                         break;
1352                 }
1353
1354                 /* Armoury */
1355                 case STORE_ARMOURY:
1356                 {
1357                         /* Analyze the type */
1358                         switch (o_ptr->tval)
1359                         {
1360                                 case TV_BOOTS:
1361                                 case TV_GLOVES:
1362                                 case TV_CROWN:
1363                                 case TV_HELM:
1364                                 case TV_SHIELD:
1365                                 case TV_CLOAK:
1366                                 case TV_SOFT_ARMOR:
1367                                 case TV_HARD_ARMOR:
1368                                 case TV_DRAG_ARMOR:
1369                                 break;
1370                                 default:
1371                                 return (FALSE);
1372                         }
1373                         break;
1374                 }
1375
1376                 /* Weapon Shop */
1377                 case STORE_WEAPON:
1378                 {
1379                         /* Analyze the type */
1380                         switch (o_ptr->tval)
1381                         {
1382                                 case TV_SHOT:
1383                                 case TV_BOLT:
1384                                 case TV_ARROW:
1385                                 case TV_BOW:
1386                                 case TV_DIGGING:
1387                                 case TV_POLEARM:
1388                                 case TV_SWORD:
1389                                 case TV_HISSATSU_BOOK:
1390                                 break;
1391                                 case TV_HAFTED:
1392                                 {
1393                                         if(o_ptr->sval == SV_WIZSTAFF) return (FALSE);
1394                                 }
1395                                 break;
1396                                 default:
1397                                 return (FALSE);
1398                         }
1399                         break;
1400                 }
1401
1402                 /* Temple */
1403                 case STORE_TEMPLE:
1404                 {
1405                         /* Analyze the type */
1406                         switch (o_ptr->tval)
1407                         {
1408                                 case TV_LIFE_BOOK:
1409                                 case TV_CRUSADE_BOOK:
1410                                 case TV_SCROLL:
1411                                 case TV_POTION:
1412                                 case TV_HAFTED:
1413                                 {
1414                                         break;
1415                                 }
1416                                 case TV_FIGURINE:
1417                                 case TV_STATUE:
1418                                 {
1419                                         monster_race *r_ptr = &r_info[o_ptr->pval];
1420
1421                                         /* Decline evil */
1422                                         if (!(r_ptr->flags3 & RF3_EVIL))
1423                                         {
1424                                                 /* Accept good */
1425                                                 if (r_ptr->flags3 & RF3_GOOD) break;
1426
1427                                                 /* Accept animals */
1428                                                 if (r_ptr->flags3 & RF3_ANIMAL) break;
1429
1430                                                 /* Accept mimics */
1431                                                 if (my_strchr("?!", r_ptr->d_char)) break;
1432                                         }
1433                                 }
1434                                 case TV_POLEARM:
1435                                 case TV_SWORD:
1436                                 {
1437                                         if (is_blessed(o_ptr)) break;
1438                                 }
1439                                 default:
1440                                 return (FALSE);
1441                         }
1442                         break;
1443                 }
1444
1445                 /* Alchemist */
1446                 case STORE_ALCHEMIST:
1447                 {
1448                         /* Analyze the type */
1449                         switch (o_ptr->tval)
1450                         {
1451                                 case TV_SCROLL:
1452                                 case TV_POTION:
1453                                 break;
1454                                 default:
1455                                 return (FALSE);
1456                         }
1457                         break;
1458                 }
1459
1460                 /* Magic Shop */
1461                 case STORE_MAGIC:
1462                 {
1463                         /* Analyze the type */
1464                         switch (o_ptr->tval)
1465                         {
1466                                 case TV_SORCERY_BOOK:
1467                                 case TV_NATURE_BOOK:
1468                                 case TV_CHAOS_BOOK:
1469                                 case TV_DEATH_BOOK:
1470                                 case TV_TRUMP_BOOK:
1471                                 case TV_ARCANE_BOOK:
1472                                 case TV_CRAFT_BOOK:
1473                                 case TV_DAEMON_BOOK:
1474                                 case TV_MUSIC_BOOK:
1475                                 case TV_HEX_BOOK:
1476                                 case TV_AMULET:
1477                                 case TV_RING:
1478                                 case TV_STAFF:
1479                                 case TV_WAND:
1480                                 case TV_ROD:
1481                                 case TV_SCROLL:
1482                                 case TV_POTION:
1483                                 case TV_FIGURINE:
1484                                 break;
1485                                 case TV_HAFTED:
1486                                 {
1487                                         if(o_ptr->sval == SV_WIZSTAFF) break;
1488                                         else return (FALSE);
1489                                 }
1490                                 default:
1491                                 return (FALSE);
1492                         }
1493                         break;
1494                 }
1495                 /* Bookstore Shop */
1496                 case STORE_BOOK:
1497                 {
1498                         /* Analyze the type */
1499                         switch (o_ptr->tval)
1500                         {
1501                                 case TV_SORCERY_BOOK:
1502                                 case TV_NATURE_BOOK:
1503                                 case TV_CHAOS_BOOK:
1504                                 case TV_DEATH_BOOK:
1505                                 case TV_LIFE_BOOK:
1506                                 case TV_TRUMP_BOOK:
1507                                 case TV_ARCANE_BOOK:
1508                                 case TV_CRAFT_BOOK:
1509                                 case TV_DAEMON_BOOK:
1510                                 case TV_CRUSADE_BOOK:
1511                                 case TV_MUSIC_BOOK:
1512                                 case TV_HEX_BOOK:
1513                                         break;
1514                                 default:
1515                                         return (FALSE);
1516                         }
1517                         break;
1518                 }
1519         }
1520
1521         /* Ignore "worthless" items */
1522         if (object_value(o_ptr) <= 0) return (FALSE);
1523
1524         /* Assume okay */
1525         return (TRUE);
1526 }
1527
1528
1529 /*!
1530  * @brief 現在の町の指定された店舗のアイテムを整理する /
1531  * Combine and reorder items in store.
1532  * @param store_num 店舗ID
1533  * @return 実際に整理が行われたならばTRUEを返す。
1534  */
1535 bool combine_and_reorder_home(int store_num)
1536 {
1537         int         i, j, k;
1538         s32b        o_value;
1539         object_type forge, *o_ptr, *j_ptr;
1540         bool        flag = FALSE, combined;
1541         store_type  *old_st_ptr = st_ptr;
1542         bool        old_stack_force_notes = stack_force_notes;
1543         bool        old_stack_force_costs = stack_force_costs;
1544
1545         st_ptr = &town[1].store[store_num];
1546         if (store_num != STORE_HOME)
1547         {
1548                 stack_force_notes = FALSE;
1549                 stack_force_costs = FALSE;
1550         }
1551
1552         do
1553         {
1554                 combined = FALSE;
1555
1556                 /* Combine the items in the home (backwards) */
1557                 for (i = st_ptr->stock_num - 1; i > 0; i--)
1558                 {
1559                         o_ptr = &st_ptr->stock[i];
1560
1561                         /* Skip empty items */
1562                         if (!o_ptr->k_idx) continue;
1563
1564                         /* Scan the items above that item */
1565                         for (j = 0; j < i; j++)
1566                         {
1567                                 int max_num;
1568
1569                                 j_ptr = &st_ptr->stock[j];
1570
1571                                 /* Skip empty items */
1572                                 if (!j_ptr->k_idx) continue;
1573
1574                                 /*
1575                                  * Get maximum number of the stack if these
1576                                  * are similar, get zero otherwise.
1577                                  */
1578                                 max_num = object_similar_part(j_ptr, o_ptr);
1579
1580                                 /* Can we (partialy) drop "o_ptr" onto "j_ptr"? */
1581                                 if (max_num && j_ptr->number < max_num)
1582                                 {
1583                                         if (o_ptr->number + j_ptr->number <= max_num)
1584                                         {
1585                                                 /* Add together the item counts */
1586                                                 object_absorb(j_ptr, o_ptr);
1587
1588                                                 /* One object is gone */
1589                                                 st_ptr->stock_num--;
1590
1591                                                 /* Slide everything down */
1592                                                 for (k = i; k < st_ptr->stock_num; k++)
1593                                                 {
1594                                                         /* Structure copy */
1595                                                         st_ptr->stock[k] = st_ptr->stock[k + 1];
1596                                                 }
1597
1598                                                 /* Erase the "final" slot */
1599                                                 object_wipe(&st_ptr->stock[k]);
1600                                         }
1601                                         else
1602                                         {
1603                                                 ITEM_NUMBER old_num = o_ptr->number;
1604                                                 ITEM_NUMBER remain = j_ptr->number + o_ptr->number - max_num;
1605
1606                                                 /* Add together the item counts */
1607                                                 object_absorb(j_ptr, o_ptr);
1608
1609                                                 o_ptr->number = remain;
1610
1611                                                 /* Hack -- if rods are stacking, add the pvals (maximum timeouts) and current timeouts together. -LM- */
1612                                                 if (o_ptr->tval == TV_ROD)
1613                                                 {
1614                                                         o_ptr->pval =  o_ptr->pval * remain / old_num;
1615                                                         o_ptr->timeout = o_ptr->timeout * remain / old_num;
1616                                                 }
1617
1618                                                 /* Hack -- if wands are stacking, combine the charges. -LM- */
1619                                                 else if (o_ptr->tval == TV_WAND)
1620                                                 {
1621                                                         o_ptr->pval = o_ptr->pval * remain / old_num;
1622                                                 }
1623                                         }
1624
1625                                         /* Take note */
1626                                         combined = TRUE;
1627
1628                                         break;
1629                                 }
1630                         }
1631                 }
1632
1633                 flag |= combined;
1634         }
1635         while (combined);
1636
1637         /* Re-order the items in the home (forwards) */
1638         for (i = 0; i < st_ptr->stock_num; i++)
1639         {
1640                 o_ptr = &st_ptr->stock[i];
1641
1642                 /* Skip empty slots */
1643                 if (!o_ptr->k_idx) continue;
1644
1645                 /* Get the "value" of the item */
1646                 o_value = object_value(o_ptr);
1647
1648                 /* Scan every occupied slot */
1649                 for (j = 0; j < st_ptr->stock_num; j++)
1650                 {
1651                         if (object_sort_comp(o_ptr, o_value, &st_ptr->stock[j])) break;
1652                 }
1653
1654                 /* Never move down */
1655                 if (j >= i) continue;
1656
1657                 /* Take note */
1658                 flag = TRUE;
1659                 j_ptr = &forge;
1660
1661                 /* Save a copy of the moving item */
1662                 object_copy(j_ptr, &st_ptr->stock[i]);
1663
1664                 /* Slide the objects */
1665                 for (k = i; k > j; k--)
1666                 {
1667                         /* Slide the item */
1668                         object_copy(&st_ptr->stock[k], &st_ptr->stock[k - 1]);
1669                 }
1670
1671                 /* Insert the moving item */
1672                 object_copy(&st_ptr->stock[j], j_ptr);
1673         }
1674
1675         st_ptr = old_st_ptr;
1676         if (store_num != STORE_HOME)
1677         {
1678                 stack_force_notes = old_stack_force_notes;
1679                 stack_force_costs = old_stack_force_costs;
1680         }
1681
1682         return flag;
1683 }
1684
1685
1686 /*!
1687  * @brief 我が家にオブジェクトを加える /
1688  * Add the item "o_ptr" to the inventory of the "Home"
1689  * @param o_ptr 加えたいオブジェクトの構造体参照ポインタ
1690  * @return 収めた先のID
1691  * @details
1692  * <pre>
1693  * In all cases, return the slot (or -1) where the object was placed
1694  * Note that this is a hacked up version of "inven_carry()".
1695  * Also note that it may not correctly "adapt" to "knowledge" bacoming
1696  * known, the player may have to pick stuff up and drop it again.
1697  * </pre>
1698  */
1699 static int home_carry(object_type *o_ptr)
1700 {
1701         int                             slot;
1702         s32b                       value;
1703         int     i;
1704         object_type *j_ptr;
1705         bool old_stack_force_notes = stack_force_notes;
1706         bool old_stack_force_costs = stack_force_costs;
1707
1708         if (cur_store_num != STORE_HOME)
1709         {
1710                 stack_force_notes = FALSE;
1711                 stack_force_costs = FALSE;
1712         }
1713
1714         /* Check each existing item (try to combine) */
1715         for (slot = 0; slot < st_ptr->stock_num; slot++)
1716         {
1717                 /* Get the existing item */
1718                 j_ptr = &st_ptr->stock[slot];
1719
1720                 /* The home acts just like the player */
1721                 if (object_similar(j_ptr, o_ptr))
1722                 {
1723                         /* Save the new number of items */
1724                         object_absorb(j_ptr, o_ptr);
1725
1726                         if (cur_store_num != STORE_HOME)
1727                         {
1728                                 stack_force_notes = old_stack_force_notes;
1729                                 stack_force_costs = old_stack_force_costs;
1730                         }
1731
1732                         /* All done */
1733                         return (slot);
1734                 }
1735         }
1736
1737         if (cur_store_num != STORE_HOME)
1738         {
1739                 stack_force_notes = old_stack_force_notes;
1740                 stack_force_costs = old_stack_force_costs;
1741         }
1742
1743         /* No space? */
1744         /*
1745          * 隠し機能: オプション powerup_home が設定されていると
1746          *           我が家が 20 ページまで使える
1747          */
1748         /* No space? */
1749         if ((cur_store_num != STORE_HOME) || (powerup_home == TRUE)) {
1750                 if (st_ptr->stock_num >= st_ptr->stock_size) {
1751                         return (-1);
1752                 }
1753         }
1754         else{
1755                 if (st_ptr->stock_num >= ((st_ptr->stock_size) / 10)) {
1756                         return (-1);
1757                 }
1758         }
1759
1760
1761         /* Determine the "value" of the item */
1762         value = object_value(o_ptr);
1763
1764         /* Check existing slots to see if we must "slide" */
1765         for (slot = 0; slot < st_ptr->stock_num; slot++)
1766         {
1767                 if (object_sort_comp(o_ptr, value, &st_ptr->stock[slot])) break;
1768         }
1769
1770         /* Slide the others up */
1771         for (i = st_ptr->stock_num; i > slot; i--)
1772         {
1773                 st_ptr->stock[i] = st_ptr->stock[i-1];
1774         }
1775
1776         /* More stuff now */
1777         st_ptr->stock_num++;
1778
1779         /* Insert the new item */
1780         st_ptr->stock[slot] = *o_ptr;
1781
1782         chg_virtue(V_SACRIFICE, -1);
1783
1784         (void)combine_and_reorder_home(cur_store_num);
1785
1786         /* Return the location */
1787         return (slot);
1788 }
1789
1790
1791 /*!
1792  * @brief 店舗にオブジェクトを加える /
1793  * Add the item "o_ptr" to a real stores inventory.
1794  * @param o_ptr 加えたいオブジェクトの構造体参照ポインタ
1795  * @return 収めた先のID
1796  * @details
1797  * <pre>
1798  * In all cases, return the slot (or -1) where the object was placed
1799  * Note that this is a hacked up version of "inven_carry()".
1800  * Also note that it may not correctly "adapt" to "knowledge" bacoming
1801  * known, the player may have to pick stuff up and drop it again.
1802  * </pre>
1803  */
1804 static int store_carry(object_type *o_ptr)
1805 {
1806         int     i, slot;
1807         s32b    value, j_value;
1808         object_type *j_ptr;
1809
1810
1811         /* Evaluate the object */
1812         value = object_value(o_ptr);
1813
1814         /* Cursed/Worthless items "disappear" when sold */
1815         if (value <= 0) return (-1);
1816
1817         /* All store items are fully *identified* */
1818         o_ptr->ident |= IDENT_MENTAL;
1819
1820         /* Erase the inscription */
1821         o_ptr->inscription = 0;
1822
1823         /* Erase the "feeling" */
1824         o_ptr->feeling = FEEL_NONE;
1825
1826         /* Check each existing item (try to combine) */
1827         for (slot = 0; slot < st_ptr->stock_num; slot++)
1828         {
1829                 /* Get the existing item */
1830                 j_ptr = &st_ptr->stock[slot];
1831
1832                 /* Can the existing items be incremented? */
1833                 if (store_object_similar(j_ptr, o_ptr))
1834                 {
1835                         /* Hack -- extra items disappear */
1836                         store_object_absorb(j_ptr, o_ptr);
1837
1838                         /* All done */
1839                         return (slot);
1840                 }
1841         }
1842
1843         /* No space? */
1844         if (st_ptr->stock_num >= st_ptr->stock_size) return (-1);
1845
1846
1847         /* Check existing slots to see if we must "slide" */
1848         for (slot = 0; slot < st_ptr->stock_num; slot++)
1849         {
1850                 /* Get that item */
1851                 j_ptr = &st_ptr->stock[slot];
1852
1853                 /* Objects sort by decreasing type */
1854                 if (o_ptr->tval > j_ptr->tval) break;
1855                 if (o_ptr->tval < j_ptr->tval) continue;
1856
1857                 /* Objects sort by increasing sval */
1858                 if (o_ptr->sval < j_ptr->sval) break;
1859                 if (o_ptr->sval > j_ptr->sval) continue;
1860
1861                 /*
1862                  * Hack:  otherwise identical rods sort by
1863                  * increasing recharge time --dsb
1864                  */
1865                 if (o_ptr->tval == TV_ROD)
1866                 {
1867                         if (o_ptr->pval < j_ptr->pval) break;
1868                         if (o_ptr->pval > j_ptr->pval) continue;
1869                 }
1870
1871                 /* Evaluate that slot */
1872                 j_value = object_value(j_ptr);
1873
1874                 /* Objects sort by decreasing value */
1875                 if (value > j_value) break;
1876                 if (value < j_value) continue;
1877         }
1878
1879         /* Slide the others up */
1880         for (i = st_ptr->stock_num; i > slot; i--)
1881         {
1882                 st_ptr->stock[i] = st_ptr->stock[i-1];
1883         }
1884
1885         /* More stuff now */
1886         st_ptr->stock_num++;
1887
1888         /* Insert the new item */
1889         st_ptr->stock[slot] = *o_ptr;
1890
1891         /* Return the location */
1892         return (slot);
1893 }
1894
1895
1896 /*!
1897  * @brief 店舗のオブジェクト数を増やす /
1898  * Add the item "o_ptr" to a real stores inventory.
1899  * @param item 増やしたいアイテムのID
1900  * @param num 増やしたい数
1901  * @return なし
1902  * @details
1903  * <pre>
1904  * Increase, by a given amount, the number of a certain item
1905  * in a certain store.  This can result in zero items.
1906  * </pre>
1907  * @todo numは本来ITEM_NUMBER型にしたい。
1908  */
1909 static void store_item_increase(INVENTORY_IDX item, int num)
1910 {
1911         int             cnt;
1912         object_type *o_ptr;
1913
1914         o_ptr = &st_ptr->stock[item];
1915
1916         /* Verify the number */
1917         cnt = o_ptr->number + num;
1918         if (cnt > 255) cnt = 255;
1919         else if (cnt < 0) cnt = 0;
1920         num = cnt - o_ptr->number;
1921
1922         /* Save the new number */
1923         o_ptr->number += (ITEM_NUMBER)num;
1924 }
1925
1926
1927 /*!
1928  * @brief 店舗のオブジェクト数を削除する /
1929  * Remove a slot if it is empty
1930  * @param item 削除したいアイテムのID
1931  * @return なし
1932  */
1933 static void store_item_optimize(INVENTORY_IDX item)
1934 {
1935         int             j;
1936         object_type *o_ptr;
1937
1938         o_ptr = &st_ptr->stock[item];
1939
1940         /* Must exist */
1941         if (!o_ptr->k_idx) return;
1942
1943         /* Must have no items */
1944         if (o_ptr->number) return;
1945
1946         /* One less item */
1947         st_ptr->stock_num--;
1948
1949         /* Slide everyone */
1950         for (j = item; j < st_ptr->stock_num; j++)
1951         {
1952                 st_ptr->stock[j] = st_ptr->stock[j + 1];
1953         }
1954
1955         /* Nuke the final slot */
1956         object_wipe(&st_ptr->stock[j]);
1957 }
1958
1959 /*!
1960  * @brief ブラックマーケット用の無価値品の排除判定 /
1961  * This function will keep 'crap' out of the black market.
1962  * @param o_ptr 判定したいオブジェクトの構造体参照ポインタ
1963  * @return ブラックマーケットにとって無価値な品ならばTRUEを返す
1964  * @details
1965  * <pre>
1966  * Crap is defined as any item that is "available" elsewhere
1967  * Based on a suggestion by "Lee Vogt" <lvogt@cig.mcel.mot.com>
1968  * </pre>
1969  */
1970 static bool black_market_crap(object_type *o_ptr)
1971 {
1972         int     i, j;
1973
1974         /* Ego items are never crap */
1975         if (object_is_ego(o_ptr)) return (FALSE);
1976
1977         /* Good items are never crap */
1978         if (o_ptr->to_a > 0) return (FALSE);
1979         if (o_ptr->to_h > 0) return (FALSE);
1980         if (o_ptr->to_d > 0) return (FALSE);
1981
1982         /* Check all stores */
1983         for (i = 0; i < MAX_STORES; i++)
1984         {
1985                 if (i == STORE_HOME) continue;
1986                 if (i == STORE_MUSEUM) continue;
1987
1988                 /* Check every item in the store */
1989                 for (j = 0; j < town[p_ptr->town_num].store[i].stock_num; j++)
1990                 {
1991                         object_type *j_ptr = &town[p_ptr->town_num].store[i].stock[j];
1992
1993                         /* Duplicate item "type", assume crappy */
1994                         if (o_ptr->k_idx == j_ptr->k_idx) return (TRUE);
1995                 }
1996         }
1997
1998         /* Assume okay */
1999         return (FALSE);
2000 }
2001
2002
2003 /*!
2004  * @brief 店舗の品揃え変化のためにアイテムを削除する /
2005  * Attempt to delete (some of) a random item from the store
2006  * @return なし
2007  * @details
2008  * <pre>
2009  * Hack -- we attempt to "maintain" piles of items when possible.
2010  * </pre>
2011  */
2012 static void store_delete(void)
2013 {
2014         INVENTORY_IDX what;
2015         int num;
2016
2017         /* Pick a random slot */
2018         what = (INVENTORY_IDX)randint0(st_ptr->stock_num);
2019
2020         /* Determine how many items are here */
2021         num = st_ptr->stock[what].number;
2022
2023         /* Hack -- sometimes, only destroy half the items */
2024         if (randint0(100) < 50) num = (num + 1) / 2;
2025
2026         /* Hack -- sometimes, only destroy a single item */
2027         if (randint0(100) < 50) num = 1;
2028
2029         /* Hack -- decrement the maximum timeouts and total charges of rods and wands. -LM- */
2030         if ((st_ptr->stock[what].tval == TV_ROD) || (st_ptr->stock[what].tval == TV_WAND))
2031         {
2032                 st_ptr->stock[what].pval -= num * st_ptr->stock[what].pval / st_ptr->stock[what].number;
2033         }
2034
2035         /* Actually destroy (part of) the item */
2036         store_item_increase(what, -num);
2037         store_item_optimize(what);
2038 }
2039
2040
2041 /*!
2042  * @brief 店舗の品揃え変化のためにアイテムを追加する /
2043  * Creates a random item and gives it to a store
2044  * @return なし
2045  * @details
2046  * <pre>
2047  * This algorithm needs to be rethought.  A lot.
2048  * Currently, "normal" stores use a pre-built array.
2049  * Note -- the "level" given to "obj_get_num()" is a "favored"
2050  * level, that is, there is a much higher chance of getting
2051  * items with a level approaching that of the given level...
2052  * Should we check for "permission" to have the given item?
2053  * </pre>
2054  */
2055 static void store_create(void)
2056 {
2057         OBJECT_IDX i;
2058         int tries;
2059         DEPTH level;
2060
2061         object_type forge;
2062         object_type *q_ptr;
2063
2064
2065         /* Paranoia -- no room left */
2066         if (st_ptr->stock_num >= st_ptr->stock_size) return;
2067
2068
2069         /* Hack -- consider up to four items */
2070         for (tries = 0; tries < 4; tries++)
2071         {
2072                 /* Black Market */
2073                 if (cur_store_num == STORE_BLACK)
2074                 {
2075                         /* Pick a level for object/magic */
2076                         level = 25 + randint0(25);
2077
2078                         /* Random item (usually of given level) */
2079                         i = get_obj_num(level);
2080
2081                         /* Handle failure */
2082                         if (!i) continue;
2083                 }
2084
2085                 /* Normal Store */
2086                 else
2087                 {
2088                         /* Hack -- Pick an item to sell */
2089                         i = st_ptr->table[randint0(st_ptr->table_num)];
2090
2091                         /* Hack -- fake level for apply_magic() */
2092                         level = rand_range(1, STORE_OBJ_LEVEL);
2093                 }
2094
2095                 q_ptr = &forge;
2096
2097                 /* Create a new object of the chosen kind */
2098                 object_prep(q_ptr, i);
2099
2100                 /* Apply some "low-level" magic (no artifacts) */
2101                 apply_magic(q_ptr, level, AM_NO_FIXED_ART);
2102
2103                 /* Require valid object */
2104                 if (!store_will_buy(q_ptr)) continue;
2105
2106                 /* Hack -- Charge lite's */
2107                 if (q_ptr->tval == TV_LITE)
2108                 {
2109                         if (q_ptr->sval == SV_LITE_TORCH) q_ptr->xtra4 = FUEL_TORCH / 2;
2110                         if (q_ptr->sval == SV_LITE_LANTERN) q_ptr->xtra4 = FUEL_LAMP / 2;
2111                 }
2112
2113
2114                 /* The item is "known" */
2115                 object_known(q_ptr);
2116
2117                 /* Mark it storebought */
2118                 q_ptr->ident |= IDENT_STORE;
2119
2120                 /* Mega-Hack -- no chests in stores */
2121                 if (q_ptr->tval == TV_CHEST) continue;
2122
2123                 /* Prune the black market */
2124                 if (cur_store_num == STORE_BLACK)
2125                 {
2126                         /* Hack -- No "crappy" items */
2127                         if (black_market_crap(q_ptr)) continue;
2128
2129                         /* Hack -- No "cheap" items */
2130                         if (object_value(q_ptr) < 10) continue;
2131
2132                         /* No "worthless" items */
2133                         /* if (object_value(q_ptr) <= 0) continue; */
2134                 }
2135
2136                 /* Prune normal stores */
2137                 else
2138                 {
2139                         /* No "worthless" items */
2140                         if (object_value(q_ptr) <= 0) continue;
2141                 }
2142
2143
2144                 /* Mass produce and/or Apply discount */
2145                 mass_produce(q_ptr);
2146
2147                 /* Attempt to carry the (known) item */
2148                 (void)store_carry(q_ptr);
2149
2150                 /* Definitely done */
2151                 break;
2152         }
2153 }
2154
2155
2156 /*!
2157  * @brief 店舗の割引対象外にするかどうかを判定 /
2158  * Eliminate need to bargain if player has haggled well in the past
2159  * @param minprice アイテムの最低販売価格
2160  * @return 割引を禁止するならTRUEを返す。
2161  */
2162 static bool noneedtobargain(PRICE minprice)
2163 {
2164         s32b good = st_ptr->good_buy;
2165         s32b bad = st_ptr->bad_buy;
2166
2167         /* Cheap items are "boring" */
2168         if (minprice < 10L) return (TRUE);
2169
2170         /* Perfect haggling */
2171         if (good == MAX_SHORT) return (TRUE);
2172
2173         /* Reward good haggles, punish bad haggles, notice price */
2174         if (good > ((3 * bad) + (5 + (minprice/50)))) return (TRUE);
2175
2176         /* Return the flag */
2177         return (FALSE);
2178 }
2179
2180
2181 /*!
2182  * @brief 店主の持つプレイヤーに対する売買の良し悪し経験を記憶する /
2183  * Update the bargain info
2184  * @param price 実際の取引価格
2185  * @param minprice 店主の提示した価格
2186  * @param num 売買数 
2187  * @return なし
2188  */
2189 static void updatebargain(PRICE price, PRICE minprice, int num)
2190 {
2191         /* Hack -- auto-haggle */
2192         if (!manual_haggle) return;
2193
2194         /* Cheap items are "boring" */
2195         if ((minprice/num) < 10L) return;
2196
2197         /* Count the successful haggles */
2198         if (price == minprice)
2199         {
2200                 /* Just count the good haggles */
2201                 if (st_ptr->good_buy < MAX_SHORT)
2202                 {
2203                         st_ptr->good_buy++;
2204                 }
2205         }
2206
2207         /* Count the failed haggles */
2208         else
2209         {
2210                 /* Just count the bad haggles */
2211                 if (st_ptr->bad_buy < MAX_SHORT)
2212                 {
2213                         st_ptr->bad_buy++;
2214                 }
2215         }
2216 }
2217
2218
2219 /*!
2220  * @brief 店の商品リストを再表示する /
2221  * Re-displays a single store entry
2222  * @param pos 表示行
2223  * @return なし
2224  */
2225 static void display_entry(int pos)
2226 {
2227         int             i, cur_col;
2228         object_type     *o_ptr;
2229         s32b            x;
2230
2231         char            o_name[MAX_NLEN];
2232         char            out_val[160];
2233
2234         int maxwid = 75;
2235
2236         o_ptr = &st_ptr->stock[pos];
2237
2238         /* Get the "offset" */
2239         i = (pos % store_bottom);
2240
2241         /* Label it, clear the line --(-- */
2242         (void)sprintf(out_val, "%c) ", ((i > 25) ? toupper(I2A(i - 26)) : I2A(i)));
2243         prt(out_val, i+6, 0);
2244
2245         cur_col = 3;
2246         if (show_item_graph)
2247         {
2248                 byte a = object_attr(o_ptr);
2249                 char c = object_char(o_ptr);
2250
2251                 Term_queue_bigchar(cur_col, i + 6, a, c, 0, 0);
2252                 if (use_bigtile) cur_col++;
2253
2254                 cur_col += 2;
2255         }
2256
2257         /* Describe an item in the home */
2258         if ((cur_store_num == STORE_HOME) || (cur_store_num == STORE_MUSEUM))
2259         {
2260                 maxwid = 75;
2261
2262                 /* Leave room for weights, if necessary -DRS- */
2263                 if (show_weights) maxwid -= 10;
2264
2265                 object_desc(o_name, o_ptr, 0);
2266                 o_name[maxwid] = '\0';
2267                 c_put_str(tval_to_attr[o_ptr->tval], o_name, i+6, cur_col);
2268
2269                 /* Show weights */
2270                 if(show_weights)
2271                 {
2272                         /* Only show the weight of an individual item */
2273                         int wgt = o_ptr->weight;
2274 #ifdef JP
2275                         sprintf(out_val, "%3d.%1d kg", lbtokg1(wgt) , lbtokg2(wgt));
2276                         put_str(out_val, i+6, 67);
2277 #else
2278                         (void)sprintf(out_val, "%3d.%d lb", wgt / 10, wgt % 10);
2279                         put_str(out_val, i+6, 68);
2280 #endif
2281
2282                 }
2283         }
2284
2285         /* Describe an item (fully) in a store */
2286         else
2287         {
2288                 /* Must leave room for the "price" */
2289                 maxwid = 65;
2290
2291                 /* Leave room for weights, if necessary -DRS- */
2292                 if (show_weights) maxwid -= 7;
2293
2294                 /* Describe the object (fully) */
2295                 object_desc(o_name, o_ptr, 0);
2296                 o_name[maxwid] = '\0';
2297                 c_put_str(tval_to_attr[o_ptr->tval], o_name, i+6, cur_col);
2298
2299                 /* Show weights */
2300                 if (show_weights)
2301                 {
2302                         /* Only show the weight of an individual item */
2303                         int wgt = o_ptr->weight;
2304 #ifdef JP
2305                         sprintf(out_val, "%3d.%1d", lbtokg1(wgt) , lbtokg2(wgt) );
2306                         put_str(out_val, i+6, 60);
2307 #else
2308                         (void)sprintf(out_val, "%3d.%d", wgt / 10, wgt % 10);
2309                         put_str(out_val, i+6, 61);
2310 #endif
2311
2312                 }
2313
2314                 /* Display a "fixed" cost */
2315                 if (o_ptr->ident & (IDENT_FIXED))
2316                 {
2317                         /* Extract the "minimum" price */
2318                         x = price_item(o_ptr, ot_ptr->min_inflate, FALSE);
2319
2320                         /* Actually draw the price (not fixed) */
2321 #ifdef JP
2322 (void)sprintf(out_val, "%9ld固", (long)x);
2323 #else
2324                         (void)sprintf(out_val, "%9ld F", (long)x);
2325 #endif
2326
2327                         put_str(out_val, i+6, 68);
2328                 }
2329
2330                 /* Display a "taxed" cost */
2331                 else if (!manual_haggle)
2332                 {
2333                         /* Extract the "minimum" price */
2334                         x = price_item(o_ptr, ot_ptr->min_inflate, FALSE);
2335
2336                         /* Hack -- Apply Sales Tax if needed */
2337                         if (!noneedtobargain(x)) x += x / 10;
2338
2339                         /* Actually draw the price (with tax) */
2340                         (void)sprintf(out_val, "%9ld  ", (long)x);
2341                         put_str(out_val, i+6, 68);
2342                 }
2343
2344                 /* Display a "haggle" cost */
2345                 else
2346                 {
2347                         /* Extrect the "maximum" price */
2348                         x = price_item(o_ptr, ot_ptr->max_inflate, FALSE);
2349
2350                         /* Actually draw the price (not fixed) */
2351                         (void)sprintf(out_val, "%9ld  ", (long)x);
2352                         put_str(out_val, i+6, 68);
2353                 }
2354         }
2355 }
2356
2357
2358 /*!
2359  * @brief 店の商品リストを表示する /
2360  * Displays a store's inventory                 -RAK-
2361  * @return なし
2362  * @details
2363  * All prices are listed as "per individual object".  -BEN-
2364  */
2365 static void display_inventory(void)
2366 {
2367         int i, k;
2368
2369         /* Display the next 12 items */
2370         for (k = 0; k < store_bottom; k++)
2371         {
2372                 /* Do not display "dead" items */
2373                 if (store_top + k >= st_ptr->stock_num) break;
2374
2375                 /* Display that line */
2376                 display_entry(store_top + k);
2377         }
2378
2379         /* Erase the extra lines and the "more" prompt */
2380         for (i = k; i < store_bottom + 1; i++) prt("", i + 6, 0);
2381
2382         /* Assume "no current page" */
2383 #ifdef JP
2384         put_str("          ", 5, 20);
2385 #else
2386         put_str("        ", 5, 20);
2387 #endif
2388
2389
2390         /* Visual reminder of "more items" */
2391         if (st_ptr->stock_num > store_bottom)
2392         {
2393                 /* Show "more" reminder (after the last item) */
2394 #ifdef JP
2395                 prt("-続く-", k + 6, 3);
2396 #else
2397                 prt("-more-", k + 6, 3);
2398 #endif
2399
2400
2401                 /* Indicate the "current page" */
2402                 /* Trailing spaces are to display (Page xx) and (Page x) */
2403 #ifdef JP
2404                 put_str(format("(%dページ)  ", store_top/store_bottom + 1), 5, 20);
2405 #else
2406                 put_str(format("(Page %d)  ", store_top/store_bottom + 1), 5, 20);
2407 #endif
2408
2409         }
2410
2411         if (cur_store_num == STORE_HOME || cur_store_num == STORE_MUSEUM)
2412         {
2413                 k = st_ptr->stock_size;
2414
2415                 if (cur_store_num == STORE_HOME && !powerup_home) k /= 10;
2416 #ifdef JP
2417                 put_str(format("アイテム数:  %4d/%4d", st_ptr->stock_num, k), 19 + xtra_stock, 27);
2418 #else
2419                 put_str(format("Objects:  %4d/%4d", st_ptr->stock_num, k), 19 + xtra_stock, 30);
2420 #endif
2421         }
2422 }
2423
2424
2425 /*!
2426  * @brief プレイヤーの所持金を表示する /
2427  * Displays players gold                                        -RAK-
2428  * @return なし
2429  * @details
2430  */
2431 static void store_prt_gold(void)
2432 {
2433         char out_val[64];
2434
2435 #ifdef JP
2436         prt("手持ちのお金: ", 19 + xtra_stock, 53);
2437 #else
2438         prt("Gold Remaining: ", 19 + xtra_stock, 53);
2439 #endif
2440
2441
2442         sprintf(out_val, "%9ld", (long)p_ptr->au);
2443         prt(out_val, 19 + xtra_stock, 68);
2444 }
2445
2446 /*!
2447  * @brief 店舗情報全体を表示するメインルーチン /
2448  * Displays store (after clearing screen)               -RAK-
2449  * @return なし
2450  * @details
2451  */
2452 static void display_store(void)
2453 {
2454         char buf[80];
2455
2456
2457         /* Clear screen */
2458         Term_clear();
2459
2460         /* The "Home" is special */
2461         if (cur_store_num == STORE_HOME)
2462         {
2463                 /* Put the owner name */
2464 #ifdef JP
2465                 put_str("我が家", 3, 31);
2466 #else
2467                 put_str("Your Home", 3, 30);
2468 #endif
2469
2470
2471                 /* Label the item descriptions */
2472 #ifdef JP
2473                 put_str("アイテムの一覧", 5, 4);
2474 #else
2475                 put_str("Item Description", 5, 3);
2476 #endif
2477
2478
2479                 /* If showing weights, show label */
2480                 if (show_weights)
2481                 {
2482 #ifdef JP
2483                         put_str("重さ", 5, 72);
2484 #else
2485                         put_str("Weight", 5, 70);
2486 #endif
2487
2488                 }
2489         }
2490
2491         /* The "Home" is special */
2492         else if (cur_store_num == STORE_MUSEUM)
2493         {
2494                 /* Put the owner name */
2495 #ifdef JP
2496                 put_str("博物館", 3, 31);
2497 #else
2498                 put_str("Museum", 3, 30);
2499 #endif
2500
2501
2502                 /* Label the item descriptions */
2503 #ifdef JP
2504                 put_str("アイテムの一覧", 5, 4);
2505 #else
2506                 put_str("Item Description", 5, 3);
2507 #endif
2508
2509
2510                 /* If showing weights, show label */
2511                 if (show_weights)
2512                 {
2513 #ifdef JP
2514                         put_str("重さ", 5, 72);
2515 #else
2516                         put_str("Weight", 5, 70);
2517 #endif
2518
2519                 }
2520         }
2521
2522         /* Normal stores */
2523         else
2524         {
2525                 cptr store_name = (f_name + f_info[cur_store_feat].name);
2526                 cptr owner_name = (ot_ptr->owner_name);
2527                 cptr race_name = race_info[ot_ptr->owner_race].title;
2528
2529                 /* Put the owner name and race */
2530                 sprintf(buf, "%s (%s)", owner_name, race_name);
2531                 put_str(buf, 3, 10);
2532
2533                 /* Show the max price in the store (above prices) */
2534                 sprintf(buf, "%s (%ld)", store_name, (long)(ot_ptr->max_cost));
2535                 prt(buf, 3, 50);
2536
2537                 /* Label the item descriptions */
2538 #ifdef JP
2539                 put_str("商品の一覧", 5, 7);
2540 #else
2541                 put_str("Item Description", 5, 3);
2542 #endif
2543
2544
2545                 /* If showing weights, show label */
2546                 if (show_weights)
2547                 {
2548 #ifdef JP
2549                         put_str("重さ", 5, 62);
2550 #else
2551                         put_str("Weight", 5, 60);
2552 #endif
2553
2554                 }
2555
2556                 /* Label the asking price (in stores) */
2557 #ifdef JP
2558                 put_str("価格", 5, 73);
2559 #else
2560                 put_str("Price", 5, 72);
2561 #endif
2562
2563         }
2564
2565         /* Display the current gold */
2566         store_prt_gold();
2567
2568         /* Draw in the inventory */
2569         display_inventory();
2570 }
2571
2572
2573
2574 /*!
2575  * @brief 店舗からアイテムを選択する /
2576  * Get the ID of a store item and return its value      -RAK-
2577  * @param com_val 選択IDを返す参照ポインタ
2578  * @param pmt メッセージキャプション
2579  * @param i 選択範囲の最小値
2580  * @param j 選択範囲の最大値
2581  * @return 実際に選択したらTRUE、キャンセルしたらFALSE
2582  */
2583 static int get_stock(COMMAND_CODE *com_val, cptr pmt, int i, int j)
2584 {
2585         char    command;
2586         char    out_val[160];
2587         char    lo, hi;
2588
2589         /* Get the item index */
2590         if (repeat_pull(com_val))
2591         {
2592                 /* Verify the item */
2593                 if ((*com_val >= i) && (*com_val <= j))
2594                 {
2595                         /* Success */
2596                         return (TRUE);
2597                 }
2598         }
2599
2600         /* Paranoia */
2601         msg_print(NULL);
2602
2603
2604         /* Assume failure */
2605         *com_val = (-1);
2606
2607         /* Build the prompt */
2608         lo = I2A(i);
2609         hi = (j > 25) ? toupper(I2A(j - 26)) : I2A(j);
2610 #ifdef JP
2611         (void)sprintf(out_val, "(%s:%c-%c, ESCで中断) %s",
2612                 (((cur_store_num == STORE_HOME) || (cur_store_num == STORE_MUSEUM)) ? "アイテム" : "商品"), 
2613                                   lo, hi, pmt);
2614 #else
2615         (void)sprintf(out_val, "(Items %c-%c, ESC to exit) %s",
2616                                   lo, hi, pmt);
2617 #endif
2618
2619
2620         /* Ask until done */
2621         while (TRUE)
2622         {
2623                 COMMAND_CODE k;
2624
2625                 /* Escape */
2626                 if (!get_com(out_val, &command, FALSE)) break;
2627
2628                 /* Convert */
2629                 if (islower(command))
2630                         k = A2I(command);
2631                 else if (isupper(command))
2632                         k = A2I(tolower(command)) + 26;
2633                 else
2634                         k = -1;
2635
2636                 /* Legal responses */
2637                 if ((k >= i) && (k <= j))
2638                 {
2639                         *com_val = k;
2640                         break;
2641                 }
2642
2643                 bell();
2644         }
2645
2646         /* Clear the prompt */
2647         prt("", 0, 0);
2648
2649         /* Cancel */
2650         if (command == ESCAPE) return (FALSE);
2651
2652         repeat_push(*com_val);
2653
2654         /* Success */
2655         return (TRUE);
2656 }
2657
2658
2659 /*!
2660  * @brief 店主の不満度を増やし、プレイヤーを締め出す判定と処理を行う /
2661  * Increase the insult counter and get angry if too many -RAK-
2662  * @return プレイヤーを締め出す場合TRUEを返す
2663  */
2664 static int increase_insults(void)
2665 {
2666         /* Increase insults */
2667         st_ptr->insult_cur++;
2668
2669         /* Become insulted */
2670         if (st_ptr->insult_cur > ot_ptr->insult_max)
2671         {
2672                 /* Complain */
2673                 say_comment_4();
2674
2675                 /* Reset insults */
2676                 st_ptr->insult_cur = 0;
2677                 st_ptr->good_buy = 0;
2678                 st_ptr->bad_buy = 0;
2679
2680                 /* Open tomorrow */
2681                 st_ptr->store_open = turn + TURNS_PER_TICK*TOWN_DAWN/8 + randint1(TURNS_PER_TICK*TOWN_DAWN/8);
2682
2683                 /* Closed */
2684                 return (TRUE);
2685         }
2686
2687         /* Not closed */
2688         return (FALSE);
2689 }
2690
2691
2692 /*!
2693  * @brief 店主の不満度を減らす /
2694  * Decrease insults                             -RAK-
2695  * @return プレイヤーを締め出す場合TRUEを返す
2696  */
2697 static void decrease_insults(void)
2698 {
2699         /* Decrease insults */
2700         if (st_ptr->insult_cur) st_ptr->insult_cur--;
2701 }
2702
2703
2704 /*!
2705  * @brief 店主の不満度が増えた場合のみのメッセージを表示する /
2706  * Have insulted while haggling                         -RAK-
2707  * @return プレイヤーを締め出す場合TRUEを返す
2708  */
2709 static int haggle_insults(void)
2710 {
2711         /* Increase insults */
2712         if (increase_insults()) return (TRUE);
2713
2714         /* Display and flush insult */
2715         say_comment_5();
2716
2717         /* Still okay */
2718         return (FALSE);
2719 }
2720
2721
2722 /*
2723  * Mega-Hack -- Enable "increments"
2724  */
2725 static bool allow_inc = FALSE;
2726
2727 /*
2728  * Mega-Hack -- Last "increment" during haggling
2729  */
2730 static s32b last_inc = 0L;
2731
2732
2733 /*!
2734  * @brief 交渉価格を確認と認証の是非を行う /
2735  * Get a haggle
2736  * @param pmt メッセージ
2737  * @param poffer 別途価格提示をした場合の値を返す参照ポインタ
2738  * @param price 現在の交渉価格
2739  * @param final 最終確定価格ならばTRUE
2740  * @return プレイヤーを締め出す場合TRUEを返す
2741  */
2742 static int get_haggle(cptr pmt, s32b *poffer, PRICE price, int final)
2743 {
2744         s32b            i;
2745
2746         cptr            p;
2747
2748         char                            buf[128];
2749         char            out_val[160];
2750
2751
2752         /* Clear old increment if necessary */
2753         if (!allow_inc) last_inc = 0L;
2754
2755
2756         /* Final offer */
2757         if (final)
2758         {
2759 #ifdef JP
2760                 sprintf(buf, "%s [承諾] ", pmt);
2761 #else
2762                 sprintf(buf, "%s [accept] ", pmt);
2763 #endif
2764
2765         }
2766
2767         /* Old (negative) increment, and not final */
2768         else if (last_inc < 0)
2769         {
2770 #ifdef JP
2771                 sprintf(buf, "%s [-$%ld] ", pmt, (long)(ABS(last_inc)));
2772 #else
2773                 sprintf(buf, "%s [-%ld] ", pmt, (long)(ABS(last_inc)));
2774 #endif
2775
2776         }
2777
2778         /* Old (positive) increment, and not final */
2779         else if (last_inc > 0)
2780         {
2781 #ifdef JP
2782                 sprintf(buf, "%s [+$%ld] ", pmt, (long)(ABS(last_inc)));
2783 #else
2784                 sprintf(buf, "%s [+%ld] ", pmt, (long)(ABS(last_inc)));
2785 #endif
2786
2787         }
2788
2789         /* Normal haggle */
2790         else
2791         {
2792                 sprintf(buf, "%s ", pmt);
2793         }
2794
2795
2796         /* Paranoia */
2797         msg_print(NULL);
2798
2799
2800         /* Ask until done */
2801         while (TRUE)
2802         {
2803                 bool res;
2804
2805                 /* Display prompt */
2806                 prt(buf, 0, 0);
2807
2808                 /* Default */
2809                 strcpy(out_val, "");
2810
2811                 /*
2812                  * Ask the user for a response.
2813                  * Don't allow to use numpad as cursor key.
2814                  */
2815                 res = askfor_aux(out_val, 32, FALSE);
2816
2817                 /* Clear prompt */
2818                 prt("", 0, 0);
2819
2820                 /* Cancelled */
2821                 if (!res) return FALSE;
2822
2823                 /* Skip leading spaces */
2824                 for (p = out_val; *p == ' '; p++) /* loop */;
2825
2826                 /* Empty response */
2827                 if (*p == '\0')
2828                 {
2829                         /* Accept current price */
2830                         if (final)
2831                         {
2832                                 *poffer = price;
2833                                 last_inc = 0L;
2834                                 break;
2835                         }
2836
2837                         /* Use previous increment */
2838                         if (allow_inc && last_inc)
2839                         {
2840                                 *poffer += last_inc;
2841                                 break;
2842                         }
2843                 }
2844
2845                 /* Normal response */
2846                 else
2847                 {
2848                         /* Extract a number */
2849                         i = atol(p);
2850
2851                         /* Handle "incremental" number */
2852                         if ((*p == '+' || *p == '-'))
2853                         {
2854                                 /* Allow increments */
2855                                 if (allow_inc)
2856                                 {
2857                                         /* Use the given "increment" */
2858                                         *poffer += i;
2859                                         last_inc = i;
2860                                         break;
2861                                 }
2862                         }
2863
2864                         /* Handle normal number */
2865                         else
2866                         {
2867                                 /* Use the given "number" */
2868                                 *poffer = i;
2869                                 last_inc = 0L;
2870                                 break;
2871                         }
2872                 }
2873
2874                 /* Warning */
2875 #ifdef JP
2876                 msg_print("値がおかしいです。");
2877 #else
2878                 msg_print("Invalid response.");
2879 #endif
2880
2881                 msg_print(NULL);
2882         }
2883
2884         /* Success */
2885         return (TRUE);
2886 }
2887
2888
2889 /*!
2890  * @brief 店主がプレイヤーからの交渉価格を判断する /
2891  * Receive an offer (from the player)
2892  * @param pmt メッセージ
2893  * @param poffer 店主からの交渉価格を返す参照ポインタ
2894  * @param last_offer 現在の交渉価格
2895  * @param factor 店主の価格基準倍率
2896  * @param price アイテムの実価値
2897  * @param final 最終価格確定ならばTRUE
2898  * @return プレイヤーの価格に対して不服ならばTRUEを返す /
2899  * Return TRUE if offer is NOT okay
2900  */
2901 static bool receive_offer(cptr pmt, s32b *poffer,
2902                           s32b last_offer, int factor,
2903                           PRICE price, int final)
2904 {
2905         /* Haggle till done */
2906         while (TRUE)
2907         {
2908                 /* Get a haggle (or cancel) */
2909                 if (!get_haggle(pmt, poffer, price, final)) return (TRUE);
2910
2911                 /* Acceptable offer */
2912                 if (((*poffer) * factor) >= (last_offer * factor)) break;
2913
2914                 /* Insult, and check for kicked out */
2915                 if (haggle_insults()) return (TRUE);
2916
2917                 /* Reject offer (correctly) */
2918                 (*poffer) = last_offer;
2919         }
2920
2921         /* Success */
2922         return (FALSE);
2923 }
2924
2925
2926 /*!
2927  * @brief プレイヤーが購入する時の値切り処理メインルーチン /
2928  * Haggling routine                             -RAK-
2929  * @param o_ptr オブジェクトの構造体参照ポインタ
2930  * @param price 最終価格を返す参照ポインタ
2931  * @return プレイヤーの価格に対して店主が不服ならばTRUEを返す /
2932  * Return TRUE if purchase is NOT successful
2933  */
2934 static bool purchase_haggle(object_type *o_ptr, s32b *price)
2935 {
2936         s32b                       cur_ask, final_ask;
2937         s32b                       last_offer, offer;
2938         s32b                       x1, x2, x3;
2939         s32b                       min_per, max_per;
2940         int                        flag, loop_flag, noneed;
2941         int                        annoyed = 0, final = FALSE;
2942
2943         bool            cancel = FALSE;
2944
2945 #ifdef JP
2946         cptr pmt = "提示価格";
2947 #else
2948         cptr            pmt = "Asking";
2949 #endif
2950
2951
2952         char            out_val[160];
2953
2954
2955         *price = 0;
2956
2957
2958         /* Extract the starting offer and the final offer */
2959         cur_ask = price_item(o_ptr, ot_ptr->max_inflate, FALSE);
2960         final_ask = price_item(o_ptr, ot_ptr->min_inflate, FALSE);
2961
2962         /* Determine if haggling is necessary */
2963         noneed = noneedtobargain(final_ask);
2964
2965         /* No need to haggle */
2966         if (noneed || !manual_haggle)
2967         {
2968                 /* No need to haggle */
2969                 if (noneed)
2970                 {
2971                         /* Message summary */
2972 #ifdef JP
2973                         msg_print("結局この金額にまとまった。");
2974 #else
2975                         msg_print("You eventually agree upon the price.");
2976 #endif
2977
2978                         msg_print(NULL);
2979                 }
2980
2981                 /* No haggle option */
2982                 else
2983                 {
2984                         /* Message summary */
2985 #ifdef JP
2986                         msg_print("すんなりとこの金額にまとまった。");
2987 #else
2988                         msg_print("You quickly agree upon the price.");
2989 #endif
2990
2991                         msg_print(NULL);
2992
2993                         /* Apply Sales Tax */
2994                         final_ask += final_ask / 10;
2995                 }
2996
2997                 /* Final price */
2998                 cur_ask = final_ask;
2999
3000                 /* Go to final offer */
3001 #ifdef JP
3002                 pmt = "最終提示価格";
3003 #else
3004                 pmt = "Final Offer";
3005 #endif
3006
3007                 final = TRUE;
3008         }
3009
3010
3011         /* Haggle for the whole pile */
3012         cur_ask *= o_ptr->number;
3013         final_ask *= o_ptr->number;
3014
3015
3016         /* Haggle parameters */
3017         min_per = ot_ptr->haggle_per;
3018         max_per = min_per * 3;
3019
3020         /* Mega-Hack -- artificial "last offer" value */
3021         last_offer = object_value(o_ptr) * o_ptr->number;
3022         last_offer = last_offer * (200 - (int)(ot_ptr->max_inflate)) / 100L;
3023         if (last_offer <= 0) last_offer = 1;
3024
3025         /* No offer yet */
3026         offer = 0;
3027
3028         /* No incremental haggling yet */
3029         allow_inc = FALSE;
3030
3031         /* Haggle until done */
3032         for (flag = FALSE; !flag; )
3033         {
3034                 loop_flag = TRUE;
3035
3036                 while (!flag && loop_flag)
3037                 {
3038                         (void)sprintf(out_val, "%s :  %ld", pmt, (long)cur_ask);
3039                         put_str(out_val, 1, 0);
3040 #ifdef JP
3041                         cancel = receive_offer("提示する金額? ",
3042 #else
3043                         cancel = receive_offer("What do you offer? ",
3044 #endif
3045
3046                                                &offer, last_offer, 1, cur_ask, final);
3047
3048                         if (cancel)
3049                         {
3050                                 flag = TRUE;
3051                         }
3052                         else if (offer > cur_ask)
3053                         {
3054                                 say_comment_6();
3055                                 offer = last_offer;
3056                         }
3057                         else if (offer == cur_ask)
3058                         {
3059                                 flag = TRUE;
3060                                 *price = offer;
3061                         }
3062                         else
3063                         {
3064                                 loop_flag = FALSE;
3065                         }
3066                 }
3067
3068                 if (!flag)
3069                 {
3070                         x1 = 100 * (offer - last_offer) / (cur_ask - last_offer);
3071                         if (x1 < min_per)
3072                         {
3073                                 if (haggle_insults())
3074                                 {
3075                                         flag = TRUE;
3076                                         cancel = TRUE;
3077                                 }
3078                         }
3079                         else if (x1 > max_per)
3080                         {
3081                                 x1 = x1 * 3 / 4;
3082                                 if (x1 < max_per) x1 = max_per;
3083                         }
3084                         x2 = rand_range(x1-2, x1+2);
3085                         x3 = ((cur_ask - offer) * x2 / 100L) + 1;
3086                         /* don't let the price go up */
3087                         if (x3 < 0) x3 = 0;
3088                         cur_ask -= x3;
3089
3090                         /* Too little */
3091                         if (cur_ask < final_ask)
3092                         {
3093                                 final = TRUE;
3094                                 cur_ask = final_ask;
3095 #ifdef JP
3096                                 pmt = "最終提示価格";
3097 #else
3098                                 pmt = "Final Offer";
3099 #endif
3100
3101                                 annoyed++;
3102                                 if (annoyed > 3)
3103                                 {
3104                                         (void)(increase_insults());
3105                                         cancel = TRUE;
3106                                         flag = TRUE;
3107                                 }
3108                         }
3109                         else if (offer >= cur_ask)
3110                         {
3111                                 flag = TRUE;
3112                                 *price = offer;
3113                         }
3114
3115                         if (!flag)
3116                         {
3117                                 last_offer = offer;
3118                                 allow_inc = TRUE;
3119                                 prt("", 1, 0);
3120 #ifdef JP
3121 (void)sprintf(out_val, "前回の提示金額: $%ld",
3122 #else
3123                                 (void)sprintf(out_val, "Your last offer: %ld",
3124 #endif
3125
3126                                                           (long)last_offer);
3127                                 put_str(out_val, 1, 39);
3128                                 say_comment_2(cur_ask, annoyed);
3129                         }
3130                 }
3131         }
3132
3133         /* Cancel */
3134         if (cancel) return (TRUE);
3135
3136         /* Update bargaining info */
3137         updatebargain(*price, final_ask, o_ptr->number);
3138
3139         /* Do not cancel */
3140         return (FALSE);
3141 }
3142
3143
3144 /*!
3145  * @brief プレイヤーが売却する時の値切り処理メインルーチン /
3146  * Haggling routine                             -RAK-
3147  * @param o_ptr オブジェクトの構造体参照ポインタ
3148  * @param price 最終価格を返す参照ポインタ
3149  * @return プレイヤーの価格に対して店主が不服ならばTRUEを返す /
3150  * Return TRUE if purchase is NOT successful
3151  */
3152 static bool sell_haggle(object_type *o_ptr, s32b *price)
3153 {
3154         s32b    purse, cur_ask, final_ask;
3155         s32b    last_offer = 0, offer = 0;
3156         s32b    x1, x2, x3;
3157         s32b    min_per, max_per;
3158         int     flag, loop_flag, noneed;
3159         int     annoyed = 0, final = FALSE;
3160         bool    cancel = FALSE;
3161 #ifdef JP
3162         cptr pmt = "提示金額";
3163 #else
3164         cptr    pmt = "Offer";
3165 #endif
3166
3167         char    out_val[160];
3168
3169
3170         *price = 0;
3171
3172
3173         /* Obtain the starting offer and the final offer */
3174         cur_ask = price_item(o_ptr, ot_ptr->max_inflate, TRUE);
3175         final_ask = price_item(o_ptr, ot_ptr->min_inflate, TRUE);
3176
3177         /* Determine if haggling is necessary */
3178         noneed = noneedtobargain(final_ask);
3179
3180         /* Get the owner's payout limit */
3181         purse = (s32b)(ot_ptr->max_cost);
3182
3183         /* No need to haggle */
3184         if (noneed || !manual_haggle || (final_ask >= purse))
3185         {
3186                 /* Apply Sales Tax (if needed) */
3187                 if (!manual_haggle && !noneed)
3188                 {
3189                         final_ask -= final_ask / 10;
3190                 }
3191
3192                 /* No reason to haggle */
3193                 if (final_ask >= purse)
3194                 {
3195 #ifdef JP
3196                         msg_print("即座にこの金額にまとまった。");
3197 #else
3198                         msg_print("You instantly agree upon the price.");
3199 #endif
3200
3201                         msg_print(NULL);
3202
3203                         /* Offer full purse */
3204                         final_ask = purse;
3205                 }
3206
3207                 /* No need to haggle */
3208                 else if (noneed)
3209                 {
3210 #ifdef JP
3211                         msg_print("結局この金額にまとまった。");
3212 #else
3213                         msg_print("You eventually agree upon the price.");
3214 #endif
3215
3216                         msg_print(NULL);
3217                 }
3218
3219                 /* No haggle option */
3220                 else
3221                 {
3222                         /* Message summary */
3223 #ifdef JP
3224                         msg_print("すんなりとこの金額にまとまった。");
3225 #else
3226                         msg_print("You quickly agree upon the price.");
3227 #endif
3228
3229                         msg_print(NULL);
3230                 }
3231
3232                 /* Final price */
3233                 cur_ask = final_ask;
3234
3235                 /* Final offer */
3236                 final = TRUE;
3237 #ifdef JP
3238                 pmt = "最終提示金額";
3239 #else
3240                 pmt = "Final Offer";
3241 #endif
3242
3243         }
3244
3245         /* Haggle for the whole pile */
3246         cur_ask *= o_ptr->number;
3247         final_ask *= o_ptr->number;
3248
3249
3250         /* Display commands */
3251
3252         /* Haggling parameters */
3253         min_per = ot_ptr->haggle_per;
3254         max_per = min_per * 3;
3255
3256         /* Mega-Hack -- artificial "last offer" value */
3257         last_offer = object_value(o_ptr) * o_ptr->number;
3258         last_offer = last_offer * ot_ptr->max_inflate / 100L;
3259
3260         /* No offer yet */
3261         offer = 0;
3262
3263         /* No incremental haggling yet */
3264         allow_inc = FALSE;
3265
3266         /* Haggle */
3267         for (flag = FALSE; !flag; )
3268         {
3269                 while (1)
3270                 {
3271                         loop_flag = TRUE;
3272
3273                         (void)sprintf(out_val, "%s :  %ld", pmt, (long)cur_ask);
3274                         put_str(out_val, 1, 0);
3275 #ifdef JP
3276                         cancel = receive_offer("提示する価格? ",
3277 #else
3278                         cancel = receive_offer("What price do you ask? ",
3279 #endif
3280
3281                                                                    &offer, last_offer, -1, cur_ask, final);
3282
3283                         if (cancel)
3284                         {
3285                                 flag = TRUE;
3286                         }
3287                         else if (offer < cur_ask)
3288                         {
3289                                 say_comment_6();
3290                                 /* rejected, reset offer for incremental haggling */
3291                                 offer = last_offer;
3292                         }
3293                         else if (offer == cur_ask)
3294                         {
3295                                 flag = TRUE;
3296                                 *price = offer;
3297                         }
3298                         else
3299                         {
3300                                 loop_flag = FALSE;
3301                         }
3302
3303                         /* Stop */
3304                         if (flag || !loop_flag) break;
3305                 }
3306
3307                 if (!flag)
3308                 {
3309                         x1 = 100 * (last_offer - offer) / (last_offer - cur_ask);
3310                         if (x1 < min_per)
3311                         {
3312                                 if (haggle_insults())
3313                                 {
3314                                         flag = TRUE;
3315                                         cancel = TRUE;
3316                                 }
3317                         }
3318                         else if (x1 > max_per)
3319                         {
3320                                 x1 = x1 * 3 / 4;
3321                                 if (x1 < max_per) x1 = max_per;
3322                         }
3323                         x2 = rand_range(x1-2, x1+2);
3324                         x3 = ((offer - cur_ask) * x2 / 100L) + 1;
3325                         /* don't let the price go down */
3326                         if (x3 < 0) x3 = 0;
3327                         cur_ask += x3;
3328
3329                         if (cur_ask > final_ask)
3330                         {
3331                                 cur_ask = final_ask;
3332                                 final = TRUE;
3333 #ifdef JP
3334                                 pmt = "最終提示金額";
3335 #else
3336                                 pmt = "Final Offer";
3337 #endif
3338
3339                                 annoyed++;
3340                                 if (annoyed > 3)
3341                                 {
3342                                         flag = TRUE;
3343 #ifdef JP
3344                                 /* 追加 $0 で買い取られてしまうのを防止 By FIRST*/
3345                                         cancel = TRUE;
3346 #endif
3347                                         (void)(increase_insults());
3348                                 }
3349                         }
3350                         else if (offer <= cur_ask)
3351                         {
3352                                 flag = TRUE;
3353                                 *price = offer;
3354                         }
3355
3356                         if (!flag)
3357                         {
3358                                 last_offer = offer;
3359                                 allow_inc = TRUE;
3360                                 prt("", 1, 0);
3361                                 (void)sprintf(out_val,
3362 #ifdef JP
3363                                               "前回の提示価格 $%ld", (long)last_offer);
3364 #else
3365                                                           "Your last bid %ld", (long)last_offer);
3366 #endif
3367
3368                                 put_str(out_val, 1, 39);
3369                                 say_comment_3(cur_ask, annoyed);
3370                         }
3371                 }
3372         }
3373
3374         /* Cancel */
3375         if (cancel) return (TRUE);
3376
3377         /* Update bargaining info */
3378         updatebargain(*price, final_ask, o_ptr->number);
3379
3380         /* Do not cancel */
3381         return (FALSE);
3382 }
3383
3384
3385 /*!
3386  * @brief 店からの購入処理のメインルーチン /
3387  * Buy an item from a store                     -RAK-
3388  * @return なし
3389  */
3390 static void store_purchase(void)
3391 {
3392         int i, choice;
3393         COMMAND_CODE item, item_new;
3394
3395         ITEM_NUMBER amt;
3396
3397         PRICE price, best;
3398
3399         object_type forge;
3400         object_type *j_ptr;
3401
3402         object_type *o_ptr;
3403
3404         char o_name[MAX_NLEN];
3405
3406         char out_val[160];
3407
3408         if (cur_store_num == STORE_MUSEUM)
3409         {
3410 #ifdef JP
3411                 msg_print("博物館から取り出すことはできません。");
3412 #else
3413                 msg_print("Museum.");
3414 #endif
3415                 return;
3416         }
3417
3418         /* Empty? */
3419         if (st_ptr->stock_num <= 0)
3420         {
3421                 if (cur_store_num == STORE_HOME)
3422 #ifdef JP
3423                         msg_print("我が家には何も置いてありません。");
3424 #else
3425                         msg_print("Your home is empty.");
3426 #endif
3427
3428                 else
3429 #ifdef JP
3430                         msg_print("現在商品の在庫を切らしています。");
3431 #else
3432                         msg_print("I am currently out of stock.");
3433 #endif
3434
3435                 return;
3436         }
3437
3438
3439         /* Find the number of objects on this and following pages */
3440         i = (st_ptr->stock_num - store_top);
3441
3442         /* And then restrict it to the current page */
3443         if (i > store_bottom) i = store_bottom;
3444
3445         /* Prompt */
3446 #ifdef JP
3447         /* ブラックマーケットの時は別のメッセージ */
3448         switch( cur_store_num ) {
3449                 case 7:
3450                         sprintf(out_val, "どのアイテムを取りますか? ");
3451                         break;
3452                 case 6:
3453                         sprintf(out_val, "どれ? ");
3454                         break;
3455                 default:
3456                         sprintf(out_val, "どの品物が欲しいんだい? ");
3457                         break;
3458         }
3459 #else
3460         if (cur_store_num == STORE_HOME)
3461         {
3462                 sprintf(out_val, "Which item do you want to take? ");
3463         }
3464         else
3465         {
3466                 sprintf(out_val, "Which item are you interested in? ");
3467         }
3468 #endif
3469
3470
3471         /* Get the item number to be bought */
3472         if (!get_stock(&item, out_val, 0, i - 1)) return;
3473
3474         /* Get the actual index */
3475         item = item + store_top;
3476
3477         /* Get the actual item */
3478         o_ptr = &st_ptr->stock[item];
3479
3480         /* Assume the player wants just one of them */
3481         amt = 1;
3482         j_ptr = &forge;
3483
3484         /* Get a copy of the object */
3485         object_copy(j_ptr, o_ptr);
3486
3487         /*
3488          * If a rod or wand, allocate total maximum timeouts or charges
3489          * between those purchased and left on the shelf.
3490          */
3491         reduce_charges(j_ptr, o_ptr->number - amt);
3492
3493         /* Modify quantity */
3494         j_ptr->number = amt;
3495
3496         /* Hack -- require room in pack */
3497         if (!inven_carry_okay(j_ptr))
3498         {
3499 #ifdef JP
3500 msg_print("そんなにアイテムを持てない。");
3501 #else
3502                 msg_print("You cannot carry that many different items.");
3503 #endif
3504
3505                 return;
3506         }
3507
3508         /* Determine the "best" price (per item) */
3509         best = price_item(j_ptr, ot_ptr->min_inflate, FALSE);
3510
3511         /* Find out how many the player wants */
3512         if (o_ptr->number > 1)
3513         {
3514                 /* Hack -- note cost of "fixed" items */
3515                 if ((cur_store_num != STORE_HOME) &&
3516                     (o_ptr->ident & IDENT_FIXED))
3517                 {
3518 #ifdef JP
3519 msg_format("一つにつき $%ldです。", (long)(best));
3520 #else
3521                         msg_format("That costs %ld gold per item.", (long)(best));
3522 #endif
3523
3524                 }
3525
3526                 /* Get a quantity */
3527                 amt = get_quantity(NULL, o_ptr->number);
3528
3529                 /* Allow user abort */
3530                 if (amt <= 0) return;
3531         }
3532         j_ptr = &forge;
3533
3534         /* Get desired object */
3535         object_copy(j_ptr, o_ptr);
3536
3537         /*
3538          * If a rod or wand, allocate total maximum timeouts or charges
3539          * between those purchased and left on the shelf.
3540          */
3541         reduce_charges(j_ptr, o_ptr->number - amt);
3542
3543         /* Modify quantity */
3544         j_ptr->number = amt;
3545
3546         /* Hack -- require room in pack */
3547         if (!inven_carry_okay(j_ptr))
3548         {
3549 #ifdef JP
3550                 msg_print("ザックにそのアイテムを入れる隙間がない。");
3551 #else
3552                 msg_print("You cannot carry that many items.");
3553 #endif
3554
3555                 return;
3556         }
3557
3558         /* Attempt to buy it */
3559         if (cur_store_num != STORE_HOME)
3560         {
3561                 /* Fixed price, quick buy */
3562                 if (o_ptr->ident & (IDENT_FIXED))
3563                 {
3564                         /* Assume accept */
3565                         choice = 0;
3566
3567                         /* Go directly to the "best" deal */
3568                         price = (best * j_ptr->number);
3569                 }
3570
3571                 /* Haggle for it */
3572                 else
3573                 {
3574                         /* Describe the object (fully) */
3575                         object_desc(o_name, j_ptr, 0);
3576
3577 #ifdef JP
3578                         msg_format("%s(%c)を購入する。", o_name, I2A(item));
3579 #else
3580                         msg_format("Buying %s (%c).", o_name, I2A(item));
3581 #endif
3582
3583                         msg_print(NULL);
3584
3585                         /* Haggle for a final price */
3586                         choice = purchase_haggle(j_ptr, &price);
3587
3588                         /* Hack -- Got kicked out */
3589                         if (st_ptr->store_open >= turn) return;
3590                 }
3591
3592                 /* Player wants it */
3593                 if (choice == 0)
3594                 {
3595                         /* Fix the item price (if "correctly" haggled) */
3596                         if (price == (best * j_ptr->number)) o_ptr->ident |= (IDENT_FIXED);
3597
3598                         /* Player can afford it */
3599                         if (p_ptr->au >= price)
3600                         {
3601                                 /* Say "okay" */
3602                                 say_comment_1();
3603
3604                                 if (cur_store_num == STORE_BLACK) /* The black market is illegal! */
3605                                         chg_virtue(V_JUSTICE, -1);
3606                                 if((o_ptr->tval == TV_BOTTLE) && (cur_store_num != STORE_HOME))
3607                                         chg_virtue(V_NATURE, -1);
3608
3609                                 /* Make a sound */
3610                                 sound(SOUND_BUY);
3611
3612                                 /* Be happy */
3613                                 decrease_insults();
3614
3615                                 /* Spend the money */
3616                                 p_ptr->au -= price;
3617
3618                                 /* Update the display */
3619                                 store_prt_gold();
3620
3621                                 /* Hack -- buying an item makes you aware of it */
3622                                 object_aware(j_ptr);
3623
3624                                 /* Hack -- clear the "fixed" flag from the item */
3625                                 j_ptr->ident &= ~(IDENT_FIXED);
3626
3627                                 /* Describe the transaction */
3628                                 object_desc(o_name, j_ptr, 0);
3629
3630 #ifdef JP
3631 msg_format("%sを $%ldで購入しました。", o_name, (long)price);
3632 #else
3633                                 msg_format("You bought %s for %ld gold.", o_name, (long)price);
3634 #endif
3635
3636                                 strcpy(record_o_name, o_name);
3637                                 record_turn = turn;
3638
3639                                 if (record_buy) do_cmd_write_nikki(NIKKI_BUY, 0, o_name);
3640                                 object_desc(o_name, o_ptr, OD_NAME_ONLY);
3641                                 if(record_rand_art && o_ptr->art_name)
3642                                         do_cmd_write_nikki(NIKKI_ART, 0, o_name);
3643
3644                                 /* Erase the inscription */
3645                                 j_ptr->inscription = 0;
3646
3647                                 /* Erase the "feeling" */
3648                                 j_ptr->feeling = FEEL_NONE;
3649                                 j_ptr->ident &= ~(IDENT_STORE);
3650                                 /* Give it to the player */
3651                                 item_new = inven_carry(j_ptr);
3652
3653                                 /* Describe the final result */
3654                                 object_desc(o_name, &inventory[item_new], 0);
3655
3656 #ifdef JP
3657                                 msg_format("%s(%c)を手に入れた。", o_name, index_to_label(item_new));
3658 #else
3659                                 msg_format("You have %s (%c).",
3660                                                    o_name, index_to_label(item_new));
3661 #endif
3662
3663                                 /* Auto-inscription */
3664                                 autopick_alter_item(item_new, FALSE);
3665
3666                                 /* Now, reduce the original stack's pval. */
3667                                 if ((o_ptr->tval == TV_ROD) || (o_ptr->tval == TV_WAND))
3668                                 {
3669                                         o_ptr->pval -= j_ptr->pval;
3670                                 }
3671                                 handle_stuff();
3672
3673                                 /* Note how many slots the store used to have */
3674                                 i = st_ptr->stock_num;
3675
3676                                 /* Remove the bought items from the store */
3677                                 store_item_increase(item, -amt);
3678                                 store_item_optimize(item);
3679
3680                                 /* Store is empty */
3681                                 if (st_ptr->stock_num == 0)
3682                                 {
3683                                         /* Shuffle */
3684                                         if (one_in_(STORE_SHUFFLE))
3685                                         {
3686                                                 char buf[80];
3687 #ifdef JP
3688                                                 msg_print("店主は引退した。");
3689 #else
3690                                                 msg_print("The shopkeeper retires.");
3691 #endif
3692
3693
3694                                                 /* Shuffle the store */
3695                                                 store_shuffle(cur_store_num);
3696
3697                                                 prt("",3,0);
3698                                                 sprintf(buf, "%s (%s)",
3699                                                         ot_ptr->owner_name, race_info[ot_ptr->owner_race].title);
3700                                                 put_str(buf, 3, 10);
3701                                                 sprintf(buf, "%s (%ld)",
3702                                                         (f_name + f_info[cur_store_feat].name), (long)(ot_ptr->max_cost));
3703                                                 prt(buf, 3, 50);
3704                                         }
3705
3706                                         /* Maintain */
3707                                         else
3708                                         {
3709 #ifdef JP
3710                                                 msg_print("店主は新たな在庫を取り出した。");
3711 #else
3712                                                 msg_print("The shopkeeper brings out some new stock.");
3713 #endif
3714
3715                                         }
3716
3717                                         /* New inventory */
3718                                         for (i = 0; i < 10; i++)
3719                                         {
3720                                                 /* Maintain the store */
3721                                                 store_maint(p_ptr->town_num, cur_store_num);
3722                                         }
3723
3724                                         /* Start over */
3725                                         store_top = 0;
3726
3727                                         /* Redraw everything */
3728                                         display_inventory();
3729                                 }
3730
3731                                 /* The item is gone */
3732                                 else if (st_ptr->stock_num != i)
3733                                 {
3734                                         /* Pick the correct screen */
3735                                         if (store_top >= st_ptr->stock_num) store_top -= store_bottom;
3736
3737                                         /* Redraw everything */
3738                                         display_inventory();
3739                                 }
3740
3741                                 /* Item is still here */
3742                                 else
3743                                 {
3744                                         /* Redraw the item */
3745                                         display_entry(item);
3746                                 }
3747                         }
3748
3749                         /* Player cannot afford it */
3750                         else
3751                         {
3752                                 /* Simple message (no insult) */
3753 #ifdef JP
3754                                 msg_print("お金が足りません。");
3755 #else
3756                                 msg_print("You do not have enough gold.");
3757 #endif
3758
3759                         }
3760                 }
3761         }
3762
3763         /* Home is much easier */
3764         else
3765         {
3766                 bool combined_or_reordered;
3767
3768                 /* Distribute charges of wands/rods */
3769                 distribute_charges(o_ptr, j_ptr, amt);
3770
3771                 /* Give it to the player */
3772                 item_new = inven_carry(j_ptr);
3773
3774                 /* Describe just the result */
3775                 object_desc(o_name, &inventory[item_new], 0);
3776
3777 #ifdef JP
3778                 msg_format("%s(%c)を取った。",
3779 #else
3780                 msg_format("You have %s (%c).",
3781 #endif
3782  o_name, index_to_label(item_new));
3783                 handle_stuff();
3784
3785                 /* Take note if we take the last one */
3786                 i = st_ptr->stock_num;
3787
3788                 /* Remove the items from the home */
3789                 store_item_increase(item, -amt);
3790                 store_item_optimize(item);
3791
3792                 combined_or_reordered = combine_and_reorder_home(STORE_HOME);
3793
3794                 /* Hack -- Item is still here */
3795                 if (i == st_ptr->stock_num)
3796                 {
3797                         /* Redraw everything */
3798                         if (combined_or_reordered) display_inventory();
3799
3800                         /* Redraw the item */
3801                         else display_entry(item);
3802                 }
3803
3804                 /* The item is gone */
3805                 else
3806                 {
3807                         /* Nothing left */
3808                         if (st_ptr->stock_num == 0) store_top = 0;
3809
3810                         /* Nothing left on that screen */
3811                         else if (store_top >= st_ptr->stock_num) store_top -= store_bottom;
3812
3813                         /* Redraw everything */
3814                         display_inventory();
3815
3816                         chg_virtue(V_SACRIFICE, 1);
3817                 }
3818         }
3819
3820         /* Not kicked out */
3821         return;
3822 }
3823
3824
3825 /*!
3826  * @brief 店からの売却処理のメインルーチン /
3827  * Sell an item to the store (or home)
3828  * @return なし
3829  */
3830 static void store_sell(void)
3831 {
3832         int choice;
3833         OBJECT_IDX item;
3834         int item_pos;
3835         int amt;
3836
3837         PRICE price, value, dummy;
3838
3839         object_type forge;
3840         object_type *q_ptr;
3841
3842         object_type *o_ptr;
3843
3844         cptr q, s;
3845
3846         char o_name[MAX_NLEN];
3847
3848
3849         /* Prepare a prompt */
3850         if (cur_store_num == STORE_HOME)
3851 #ifdef JP
3852         q = "どのアイテムを置きますか? ";
3853 #else
3854                 q = "Drop which item? ";
3855 #endif
3856
3857         else if (cur_store_num == STORE_MUSEUM)
3858 #ifdef JP
3859         q = "どのアイテムを寄贈しますか? ";
3860 #else
3861                 q = "Give which item? ";
3862 #endif
3863
3864         else
3865 #ifdef JP
3866                 q = "どのアイテムを売りますか? ";
3867 #else
3868                 q = "Sell which item? ";
3869 #endif
3870
3871
3872         item_tester_no_ryoute = TRUE;
3873         /* Only allow items the store will buy */
3874         item_tester_hook = store_will_buy;
3875
3876         /* 我が家でおかしなメッセージが出るオリジナルのバグを修正 */
3877         if (cur_store_num == STORE_HOME)
3878         {
3879 #ifdef JP
3880                 s = "置けるアイテムを持っていません。";
3881 #else
3882                 s = "You don't have any item to drop.";
3883 #endif
3884         }
3885         else if (cur_store_num == STORE_MUSEUM)
3886         {
3887 #ifdef JP
3888                 s = "寄贈できるアイテムを持っていません。";
3889 #else
3890                 s = "You don't have any item to give.";
3891 #endif
3892         }
3893         else
3894         {
3895 #ifdef JP
3896                 s = "欲しい物がないですねえ。";
3897 #else
3898                 s = "You have nothing that I want.";
3899 #endif
3900         }
3901
3902         if (!get_item(&item, q, s, (USE_EQUIP | USE_INVEN | USE_FLOOR))) return;
3903
3904         /* Get the item (in the pack) */
3905         if (item >= 0)
3906         {
3907                 o_ptr = &inventory[item];
3908         }
3909
3910         /* Get the item (on the floor) */
3911         else
3912         {
3913                 o_ptr = &o_list[0 - item];
3914         }
3915
3916
3917         /* Hack -- Cannot remove cursed items */
3918         if ((item >= INVEN_RARM) && object_is_cursed(o_ptr))
3919         {
3920 #ifdef JP
3921                 msg_print("ふーむ、どうやらそれは呪われているようだね。");
3922 #else
3923                 msg_print("Hmmm, it seems to be cursed.");
3924 #endif
3925
3926
3927                 return;
3928         }
3929
3930
3931         /* Assume one item */
3932         amt = 1;
3933
3934         /* Find out how many the player wants (letter means "all") */
3935         if (o_ptr->number > 1)
3936         {
3937                 /* Get a quantity */
3938                 amt = get_quantity(NULL, o_ptr->number);
3939
3940                 /* Allow user abort */
3941                 if (amt <= 0) return;
3942         }
3943         q_ptr = &forge;
3944
3945         /* Get a copy of the object */
3946         object_copy(q_ptr, o_ptr);
3947
3948         /* Modify quantity */
3949         q_ptr->number = amt;
3950
3951         /*
3952          * Hack -- If a rod or wand, allocate total maximum
3953          * timeouts or charges to those being sold. -LM-
3954          */
3955         if ((o_ptr->tval == TV_ROD) || (o_ptr->tval == TV_WAND))
3956         {
3957                 q_ptr->pval = o_ptr->pval * amt / o_ptr->number;
3958         }
3959
3960         /* Get a full description */
3961         object_desc(o_name, q_ptr, 0);
3962
3963         /* Remove any inscription, feeling for stores */
3964         if ((cur_store_num != STORE_HOME) && (cur_store_num != STORE_MUSEUM))
3965         {
3966                 q_ptr->inscription = 0;
3967                 q_ptr->feeling = FEEL_NONE;
3968         }
3969
3970         /* Is there room in the store (or the home?) */
3971         if (!store_check_num(q_ptr))
3972         {
3973                 if (cur_store_num == STORE_HOME)
3974 #ifdef JP
3975                         msg_print("我が家にはもう置く場所がない。");
3976 #else
3977                         msg_print("Your home is full.");
3978 #endif
3979
3980                 else if (cur_store_num == STORE_MUSEUM)
3981 #ifdef JP
3982                         msg_print("博物館はもう満杯だ。");
3983 #else
3984                         msg_print("Museum is full.");
3985 #endif
3986
3987                 else
3988 #ifdef JP
3989                         msg_print("すいませんが、店にはもう置く場所がありません。");
3990 #else
3991                         msg_print("I have not the room in my store to keep it.");
3992 #endif
3993
3994                 return;
3995         }
3996
3997
3998         /* Real store */
3999         if ((cur_store_num != STORE_HOME) && (cur_store_num != STORE_MUSEUM))
4000         {
4001                 /* Describe the transaction */
4002 #ifdef JP
4003                 msg_format("%s(%c)を売却する。", o_name, index_to_label(item));
4004 #else
4005                 msg_format("Selling %s (%c).", o_name, index_to_label(item));
4006 #endif
4007
4008                 msg_print(NULL);
4009
4010                 /* Haggle for it */
4011                 choice = sell_haggle(q_ptr, &price);
4012
4013                 /* Kicked out */
4014                 if (st_ptr->store_open >= turn) return;
4015
4016                 /* Sold... */
4017                 if (choice == 0)
4018                 {
4019                         /* Say "okay" */
4020                         say_comment_1();
4021
4022                         /* Make a sound */
4023                         sound(SOUND_SELL);
4024
4025                         /* Be happy */
4026                         if (cur_store_num == STORE_BLACK) /* The black market is illegal! */
4027                                 chg_virtue(V_JUSTICE, -1);
4028
4029                         if((o_ptr->tval == TV_BOTTLE) && (cur_store_num != STORE_HOME))
4030                                 chg_virtue(V_NATURE, 1);
4031                         decrease_insults();
4032
4033                         /* Get some money */
4034                         p_ptr->au += price;
4035
4036                         /* Update the display */
4037                         store_prt_gold();
4038
4039                         /* Get the "apparent" value */
4040                         dummy = object_value(q_ptr) * q_ptr->number;
4041
4042                         /* Identify it */
4043                         identify_item(o_ptr);
4044                         q_ptr = &forge;
4045
4046                         /* Get a copy of the object */
4047                         object_copy(q_ptr, o_ptr);
4048
4049                         /* Modify quantity */
4050                         q_ptr->number = amt;
4051
4052                         /* Make it look like to be known */
4053                         q_ptr->ident |= IDENT_STORE;
4054
4055                         /*
4056                          * Hack -- If a rod or wand, let the shopkeeper know just
4057                          * how many charges he really paid for. -LM-
4058                          */
4059                         if ((o_ptr->tval == TV_ROD) || (o_ptr->tval == TV_WAND))
4060                         {
4061                                 q_ptr->pval = o_ptr->pval * amt / o_ptr->number;
4062                         }
4063
4064                         /* Get the "actual" value */
4065                         value = object_value(q_ptr) * q_ptr->number;
4066
4067                         /* Get the description all over again */
4068                         object_desc(o_name, q_ptr, 0);
4069
4070                         /* Describe the result (in message buffer) */
4071 #ifdef JP
4072 msg_format("%sを $%ldで売却しました。", o_name, (long)price);
4073 #else
4074                         msg_format("You sold %s for %ld gold.", o_name, (long)price);
4075 #endif
4076
4077                         if (record_sell) do_cmd_write_nikki(NIKKI_SELL, 0, o_name);
4078
4079                         if (!((o_ptr->tval == TV_FIGURINE) && (value > 0)))
4080                         {
4081                          /* Analyze the prices (and comment verbally) unless a figurine*/
4082                         purchase_analyze(price, value, dummy);
4083                         }
4084
4085                         /*
4086                          * Hack -- Allocate charges between those wands or rods sold
4087                          * and retained, unless all are being sold. -LM-
4088                          */
4089                         distribute_charges(o_ptr, q_ptr, amt);
4090
4091                         /* Reset timeouts of the sold items */
4092                         q_ptr->timeout = 0;
4093
4094                         /* Take the item from the player, describe the result */
4095                         inven_item_increase(item, -amt);
4096                         inven_item_describe(item);
4097
4098                         /* If items remain, auto-inscribe before optimizing */
4099                         if (o_ptr->number > 0)
4100                                 autopick_alter_item(item, FALSE);
4101
4102                         inven_item_optimize(item);
4103                         handle_stuff();
4104
4105                         /* The store gets that (known) item */
4106                         item_pos = store_carry(q_ptr);
4107
4108                         /* Re-display if item is now in store */
4109                         if (item_pos >= 0)
4110                         {
4111                                 store_top = (item_pos / store_bottom) * store_bottom;
4112                                 display_inventory();
4113                         }
4114                 }
4115         }
4116
4117         /* Player is at museum */
4118         else if (cur_store_num == STORE_MUSEUM)
4119         {
4120                 char o2_name[MAX_NLEN];
4121                 object_desc(o2_name, q_ptr, OD_NAME_ONLY);
4122
4123                 if (-1 == store_check_num(q_ptr))
4124                 {
4125 #ifdef JP
4126                         msg_print("それと同じ品物は既に博物館にあるようです。");
4127 #else
4128                         msg_print("The same object as it is already in the Museum.");
4129 #endif
4130                 }
4131                 else
4132                 {
4133 #ifdef JP
4134                         msg_print("博物館に寄贈したものは取り出すことができません!!");
4135 #else
4136                         msg_print("You cannot take items which is given to the Museum back!!");
4137 #endif
4138                 }
4139 #ifdef JP
4140                 if (!get_check(format("本当に%sを寄贈しますか?", o2_name))) return;
4141 #else
4142                 if (!get_check(format("Really give %s to the Museum? ", o2_name))) return;
4143 #endif
4144
4145                 /* Identify it */
4146                 identify_item(q_ptr);
4147                 q_ptr->ident |= IDENT_MENTAL;
4148
4149                 /* Distribute charges of wands/rods */
4150                 distribute_charges(o_ptr, q_ptr, amt);
4151 #ifdef JP
4152                 msg_format("%sを置いた。(%c)", o_name, index_to_label(item));
4153 #else
4154                 msg_format("You drop %s (%c).", o_name, index_to_label(item));
4155 #endif
4156
4157                 choice = 0;
4158
4159                 /* Take it from the players inventory */
4160                 inven_item_increase(item, -amt);
4161                 inven_item_describe(item);
4162                 inven_item_optimize(item);
4163                 handle_stuff();
4164
4165                 /* Let the home carry it */
4166                 item_pos = home_carry(q_ptr);
4167
4168                 /* Update store display */
4169                 if (item_pos >= 0)
4170                 {
4171                         store_top = (item_pos / store_bottom) * store_bottom;
4172                         display_inventory();
4173                 }
4174         }
4175         /* Player is at home */
4176         else
4177         {
4178                 /* Distribute charges of wands/rods */
4179                 distribute_charges(o_ptr, q_ptr, amt);
4180 #ifdef JP
4181                 msg_format("%sを置いた。(%c)", o_name, index_to_label(item));
4182 #else
4183                 msg_format("You drop %s (%c).", o_name, index_to_label(item));
4184 #endif
4185
4186                 choice = 0;
4187
4188                 /* Take it from the players inventory */
4189                 inven_item_increase(item, -amt);
4190                 inven_item_describe(item);
4191                 inven_item_optimize(item);
4192                 handle_stuff();
4193
4194                 /* Let the home carry it */
4195                 item_pos = home_carry(q_ptr);
4196
4197                 /* Update store display */
4198                 if (item_pos >= 0)
4199                 {
4200                         store_top = (item_pos / store_bottom) * store_bottom;
4201                         display_inventory();
4202                 }
4203         }
4204
4205         if ((choice == 0) && (item >= INVEN_RARM))
4206         {
4207                 calc_android_exp();
4208                 kamaenaoshi(item);
4209         }
4210 }
4211
4212
4213 /*!
4214  * @brief 店のアイテムを調べるコマンドのメインルーチン /
4215  * Examine an item in a store                      -JDL-
4216  * @return なし
4217  */
4218 static void store_examine(void)
4219 {
4220         int         i;
4221         COMMAND_CODE item;
4222         object_type *o_ptr;
4223         char        o_name[MAX_NLEN];
4224         char        out_val[160];
4225
4226         /* Empty? */
4227         if (st_ptr->stock_num <= 0)
4228         {
4229                 if (cur_store_num == STORE_HOME)
4230                         msg_print(_("我が家には何も置いてありません。", "Your home is empty."));
4231                 else if (cur_store_num == STORE_MUSEUM)
4232                         msg_print(_("博物館には何も置いてありません。", "Museum is empty."));
4233                 else
4234                         msg_print(_("現在商品の在庫を切らしています。", "I am currently out of stock."));
4235                 return;
4236         }
4237
4238         /* Find the number of objects on this and following pages */
4239         i = (st_ptr->stock_num - store_top);
4240
4241         /* And then restrict it to the current page */
4242         if (i > store_bottom) i = store_bottom;
4243
4244         /* Prompt */
4245         sprintf(out_val, _("どれを調べますか?", "Which item do you want to examine? "));
4246
4247         /* Get the item number to be examined */
4248         if (!get_stock(&item, out_val, 0, i - 1)) return;
4249
4250         /* Get the actual index */
4251         item = item + store_top;
4252
4253         /* Get the actual item */
4254         o_ptr = &st_ptr->stock[item];
4255
4256         /* Require full knowledge */
4257         if (!(o_ptr->ident & IDENT_MENTAL))
4258         {
4259                 /* This can only happen in the home */
4260                 msg_print(_("このアイテムについて特に知っていることはない。", "You have no special knowledge about that item."));
4261                 return;
4262         }
4263
4264         object_desc(o_name, o_ptr, 0);
4265         msg_format(_("%sを調べている...", "Examining %s..."), o_name);
4266
4267         if (!screen_object(o_ptr, SCROBJ_FORCE_DETAIL))
4268                 msg_print(_("特に変わったところはないようだ。", "You see nothing special."));
4269
4270         return;
4271 }
4272
4273
4274 /*!
4275  * @brief 博物館のアイテムを除去するコマンドのメインルーチン /
4276  * Remove an item from museum (Originally from TOband)
4277  * @return なし
4278  */
4279 static void museum_remove_object(void)
4280 {
4281         int i;
4282         COMMAND_CODE item;
4283         object_type *o_ptr;
4284         char o_name[MAX_NLEN];
4285         char out_val[160];
4286
4287         /* Empty? */
4288         if (st_ptr->stock_num <= 0)
4289         {
4290                 msg_print(_("博物館には何も置いてありません。", "Museum is empty."));
4291                 return;
4292         }
4293
4294         /* Find the number of objects on this and following pages */
4295         i = st_ptr->stock_num - store_top;
4296
4297         /* And then restrict it to the current page */
4298         if (i > store_bottom) i = store_bottom;
4299
4300         /* Prompt */
4301         sprintf(out_val, _("どのアイテムの展示をやめさせますか?", "Which item do you want to order to remove? "));
4302
4303         /* Get the item number to be removed */
4304         if (!get_stock(&item, out_val, 0, i - 1)) return;
4305
4306         /* Get the actual index */
4307         item = item + store_top;
4308
4309         /* Get the actual item */
4310         o_ptr = &st_ptr->stock[item];
4311
4312         object_desc(o_name, o_ptr, 0);
4313
4314         msg_print(_("展示をやめさせたアイテムは二度と見ることはできません!", "You cannot see items which is removed from the Museum!"));
4315         if (!get_check(format(_("本当に%sの展示をやめさせますか?", "Really order to remove %s from the Museum? "), o_name))) return;
4316
4317         msg_format(_("%sの展示をやめさせた。", "You ordered to remove %s."), o_name);
4318
4319         /* Remove the items from the home */
4320         store_item_increase(item, -o_ptr->number);
4321         store_item_optimize(item);
4322
4323         (void)combine_and_reorder_home(STORE_MUSEUM);
4324
4325         /* The item is gone */
4326
4327         /* Nothing left */
4328         if (st_ptr->stock_num == 0) store_top = 0;
4329
4330         /* Nothing left on that screen */
4331         else if (store_top >= st_ptr->stock_num) store_top -= store_bottom;
4332
4333         /* Redraw everything */
4334         display_inventory();
4335
4336         return;
4337 }
4338
4339
4340 /*
4341  * Hack -- set this to leave the store
4342  */
4343 static bool leave_store = FALSE;
4344
4345
4346 /*!
4347  * @brief 店舗処理コマンド選択のメインルーチン /
4348  * Process a command in a store
4349  * @return なし
4350  * @note
4351  * <pre>
4352  * Note that we must allow the use of a few "special" commands
4353  * in the stores which are not allowed in the dungeon, and we
4354  * must disable some commands which are allowed in the dungeon
4355  * but not in the stores, to prevent chaos.
4356  * </pre>
4357  */
4358 static void store_process_command(void)
4359 {
4360         /* Handle repeating the last command */
4361         repeat_check();
4362
4363         if (rogue_like_commands && command_cmd == 'l')
4364         {
4365                 command_cmd = 'x';      /* hack! */
4366         }
4367
4368         /* Parse the command */
4369         switch (command_cmd)
4370         {
4371                 /* Leave */
4372                 case ESCAPE:
4373                 {
4374                         leave_store = TRUE;
4375                         break;
4376                 }
4377
4378                 /* 日本語版追加 */
4379                 /* 1 ページ戻るコマンド: 我が家のページ数が多いので重宝するはず By BUG */
4380                 case '-':
4381                 {
4382                         if (st_ptr->stock_num <= store_bottom) {
4383                                 msg_print(_("これで全部です。", "Entire inventory is shown."));
4384                         }
4385                         else{
4386                                 store_top -= store_bottom;
4387                                 if ( store_top < 0 )
4388                                         store_top = ((st_ptr->stock_num - 1 )/store_bottom) * store_bottom;
4389                                 if ( (cur_store_num == STORE_HOME) && (powerup_home == FALSE) )
4390                                         if ( store_top >= store_bottom ) store_top = store_bottom;
4391                                 display_inventory();
4392                         }
4393                         break;
4394                 }
4395
4396                 /* Browse */
4397                 case ' ':
4398                 {
4399                         if (st_ptr->stock_num <= store_bottom)
4400                         {
4401                                 msg_print(_("これで全部です。", "Entire inventory is shown."));
4402                         }
4403                         else
4404                         {
4405                                 store_top += store_bottom;
4406                                 /*
4407                                  * 隠しオプション(powerup_home)がセットされていないときは
4408                                  * 我が家では 2 ページまでしか表示しない
4409                                  */
4410                                 if ((cur_store_num == STORE_HOME) && 
4411                                     (powerup_home == FALSE) && 
4412                                         (st_ptr->stock_num >= STORE_INVEN_MAX))
4413                                 {
4414                                         if (store_top >= (STORE_INVEN_MAX - 1))
4415                                         {
4416                                                 store_top = 0;
4417                                         }
4418                                 }
4419                                 else
4420                                 {
4421                                         if (store_top >= st_ptr->stock_num) store_top = 0;
4422                                 }
4423
4424                                 display_inventory();
4425                         }
4426                         break;
4427                 }
4428
4429                 case KTRL('R'):
4430                 {
4431                         do_cmd_redraw();
4432                         display_store();
4433                         break;
4434                 }
4435
4436                 /* Get (purchase) */
4437                 case 'g':
4438                 {
4439                         store_purchase();
4440                         break;
4441                 }
4442
4443                 /* Drop (Sell) */
4444                 case 'd':
4445                 {
4446                         store_sell();
4447                         break;
4448                 }
4449
4450                 /* Examine */
4451                 case 'x':
4452                 {
4453                         store_examine();
4454                         break;
4455                 }
4456
4457                 /* Ignore return */
4458                 case '\r':
4459                 {
4460                         break;
4461                 }
4462
4463                 /*** Inventory Commands ***/
4464
4465                 /* Wear/wield equipment */
4466                 case 'w':
4467                 {
4468                         do_cmd_wield();
4469                         break;
4470                 }
4471
4472                 /* Take off equipment */
4473                 case 't':
4474                 {
4475                         do_cmd_takeoff();
4476                         break;
4477                 }
4478
4479                 /* Destroy an item */
4480                 case 'k':
4481                 {
4482                         do_cmd_destroy();
4483                         break;
4484                 }
4485
4486                 /* Equipment list */
4487                 case 'e':
4488                 {
4489                         do_cmd_equip();
4490                         break;
4491                 }
4492
4493                 /* Inventory list */
4494                 case 'i':
4495                 {
4496                         do_cmd_inven();
4497                         break;
4498                 }
4499
4500
4501                 /*** Various commands ***/
4502
4503                 /* Identify an object */
4504                 case 'I':
4505                 {
4506                         do_cmd_observe();
4507                         break;
4508                 }
4509
4510                 /* Hack -- toggle windows */
4511                 case KTRL('I'):
4512                 {
4513                         toggle_inven_equip();
4514                         break;
4515                 }
4516
4517                 /*** Use various objects ***/
4518
4519                 /* Browse a book */
4520                 case 'b':
4521                 {
4522                         if ( (p_ptr->pclass == CLASS_MINDCRAFTER) ||
4523                              (p_ptr->pclass == CLASS_BERSERKER) ||
4524                              (p_ptr->pclass == CLASS_NINJA) ||
4525                              (p_ptr->pclass == CLASS_MIRROR_MASTER) 
4526                              ) do_cmd_mind_browse();
4527                         else if (p_ptr->pclass == CLASS_SMITH)
4528                                 do_cmd_kaji(TRUE);
4529                         else if (p_ptr->pclass == CLASS_MAGIC_EATER)
4530                                 do_cmd_magic_eater(TRUE, FALSE);
4531                         else if (p_ptr->pclass == CLASS_SNIPER)
4532                                 do_cmd_snipe_browse();
4533                         else do_cmd_browse();
4534                         break;
4535                 }
4536
4537                 /* Inscribe an object */
4538                 case '{':
4539                 {
4540                         do_cmd_inscribe();
4541                         break;
4542                 }
4543
4544                 /* Uninscribe an object */
4545                 case '}':
4546                 {
4547                         do_cmd_uninscribe();
4548                         break;
4549                 }
4550
4551
4552
4553                 /*** Help and Such ***/
4554
4555                 /* Help */
4556                 case '?':
4557                 {
4558                         do_cmd_help();
4559                         break;
4560                 }
4561
4562                 /* Identify symbol */
4563                 case '/':
4564                 {
4565                         do_cmd_query_symbol();
4566                         break;
4567                 }
4568
4569                 /* Character description */
4570                 case 'C':
4571                 {
4572                         p_ptr->town_num = old_town_num;
4573                         do_cmd_change_name();
4574                         p_ptr->town_num = inner_town_num;
4575                         display_store();
4576                         break;
4577                 }
4578
4579
4580                 /*** System Commands ***/
4581
4582                 /* Hack -- User interface */
4583                 case '!':
4584                 {
4585                         (void)Term_user(0);
4586                         break;
4587                 }
4588
4589                 /* Single line from a pref file */
4590                 case '"':
4591                 {
4592                         p_ptr->town_num = old_town_num;
4593                         do_cmd_pref();
4594                         p_ptr->town_num = inner_town_num;
4595                         break;
4596                 }
4597
4598                 /* Interact with macros */
4599                 case '@':
4600                 {
4601                         p_ptr->town_num = old_town_num;
4602                         do_cmd_macros();
4603                         p_ptr->town_num = inner_town_num;
4604                         break;
4605                 }
4606
4607                 /* Interact with visuals */
4608                 case '%':
4609                 {
4610                         p_ptr->town_num = old_town_num;
4611                         do_cmd_visuals();
4612                         p_ptr->town_num = inner_town_num;
4613                         break;
4614                 }
4615
4616                 /* Interact with colors */
4617                 case '&':
4618                 {
4619                         p_ptr->town_num = old_town_num;
4620                         do_cmd_colors();
4621                         p_ptr->town_num = inner_town_num;
4622                         break;
4623                 }
4624
4625                 /* Interact with options */
4626                 case '=':
4627                 {
4628                         do_cmd_options();
4629                         (void)combine_and_reorder_home(STORE_HOME);
4630                         do_cmd_redraw();
4631                         display_store();
4632                         break;
4633                 }
4634
4635                 /*** Misc Commands ***/
4636
4637                 /* Take notes */
4638                 case ':':
4639                 {
4640                         do_cmd_note();
4641                         break;
4642                 }
4643
4644                 /* Version info */
4645                 case 'V':
4646                 {
4647                         do_cmd_version();
4648                         break;
4649                 }
4650
4651                 /* Repeat level feeling */
4652                 case KTRL('F'):
4653                 {
4654                         do_cmd_feeling();
4655                         break;
4656                 }
4657
4658                 /* Show previous message */
4659                 case KTRL('O'):
4660                 {
4661                         do_cmd_message_one();
4662                         break;
4663                 }
4664
4665                 /* Show previous messages */
4666                 case KTRL('P'):
4667                 {
4668                         do_cmd_messages(0);
4669                         break;
4670                 }
4671
4672                 case '|':
4673                 {
4674                         do_cmd_nikki();
4675                         break;
4676                 }
4677
4678                 /* Check artifacts, uniques etc. */
4679                 case '~':
4680                 {
4681                         do_cmd_knowledge();
4682                         break;
4683                 }
4684
4685                 /* Load "screen dump" */
4686                 case '(':
4687                 {
4688                         do_cmd_load_screen();
4689                         break;
4690                 }
4691
4692                 /* Save "screen dump" */
4693                 case ')':
4694                 {
4695                         do_cmd_save_screen();
4696                         break;
4697                 }
4698
4699                 /* Hack -- Unknown command */
4700                 default:
4701                 {
4702                         if ((cur_store_num == STORE_MUSEUM) && (command_cmd == 'r'))
4703                         {
4704                                 museum_remove_object();
4705                         }
4706                         else
4707                         {
4708                                 msg_print(_("そのコマンドは店の中では使えません。", "That command does not work in stores."));
4709                         }
4710                         break;
4711                 }
4712         }
4713 }
4714
4715
4716 /*!
4717  * @brief 店舗処理全体のメインルーチン /
4718  * Enter a store, and interact with it. *
4719  * @return なし
4720  * @note
4721  * <pre>
4722  * Note that we use the standard "request_command()" function
4723  * to get a command, allowing us to use "command_arg" and all
4724  * command macros and other nifty stuff, but we use the special
4725  * "shopping" argument, to force certain commands to be converted
4726  * into other commands, normally, we convert "p" (pray) and "m"
4727  * (cast magic) into "g" (get), and "s" (search) into "d" (drop).
4728  * </pre>
4729  */
4730 void do_cmd_store(void)
4731 {
4732         int         which;
4733         int         maintain_num;
4734         int         i;
4735         cave_type   *c_ptr;
4736         bool        need_redraw_store_inv; /* To redraw missiles damage and prices in store */
4737         int w, h;
4738
4739         /* Get term size */
4740         Term_get_size(&w, &h);
4741
4742         /* Calculate stocks per 1 page */
4743         xtra_stock = MIN(14+26, ((h > 24) ? (h - 24) : 0));
4744         store_bottom = MIN_STOCK + xtra_stock;
4745
4746         /* Access the player grid */
4747         c_ptr = &cave[p_ptr->y][p_ptr->x];
4748
4749         /* Verify a store */
4750         if (!cave_have_flag_grid(c_ptr, FF_STORE))
4751         {
4752                 msg_print(_("ここには店がありません。", "You see no store here."));
4753                 return;
4754         }
4755
4756         /* Extract the store code */
4757         which = f_info[c_ptr->feat].subtype;
4758
4759         old_town_num = p_ptr->town_num;
4760         if ((which == STORE_HOME) || (which == STORE_MUSEUM)) p_ptr->town_num = 1;
4761         if (dun_level) p_ptr->town_num = NO_TOWN;
4762         inner_town_num = p_ptr->town_num;
4763
4764         /* Hack -- Check the "locked doors" */
4765         if ((town[p_ptr->town_num].store[which].store_open >= turn) ||
4766             (ironman_shops))
4767         {
4768                 msg_print(_("ドアに鍵がかかっている。", "The doors are locked."));
4769                 p_ptr->town_num = old_town_num;
4770                 return;
4771         }
4772
4773         /* Calculate the number of store maintainances since the last visit */
4774         maintain_num = (turn - town[p_ptr->town_num].store[which].last_visit) / (TURNS_PER_TICK * STORE_TICKS);
4775
4776         /* Maintain the store max. 10 times */
4777         if (maintain_num > 10) maintain_num = 10;
4778
4779         if (maintain_num)
4780         {
4781                 /* Maintain the store */
4782                 for (i = 0; i < maintain_num; i++)
4783                         store_maint(p_ptr->town_num, which);
4784
4785                 /* Save the visit */
4786                 town[p_ptr->town_num].store[which].last_visit = turn;
4787         }
4788
4789         /* Forget the lite */
4790         forget_lite();
4791
4792         /* Forget the view */
4793         forget_view();
4794
4795
4796         /* Hack -- Character is in "icky" mode */
4797         character_icky = TRUE;
4798
4799
4800         /* No command argument */
4801         command_arg = 0;
4802
4803         /* No repeated command */
4804         command_rep = 0;
4805
4806         /* No automatic command */
4807         command_new = 0;
4808
4809         /* Do not expand macros */
4810         get_com_no_macros = TRUE;
4811
4812         /* Save the store number */
4813         cur_store_num = which;
4814
4815         /* Hack -- save the store feature */
4816         cur_store_feat = c_ptr->feat;
4817
4818         /* Save the store and owner pointers */
4819         st_ptr = &town[p_ptr->town_num].store[cur_store_num];
4820         ot_ptr = &owners[cur_store_num][st_ptr->owner];
4821
4822
4823         /* Start at the beginning */
4824         store_top = 0;
4825
4826         play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_BUILD);
4827
4828         /* Display the store */
4829         display_store();
4830
4831         /* Do not leave */
4832         leave_store = FALSE;
4833
4834         /* Interact with player */
4835         while (!leave_store)
4836         {
4837                 /* Hack -- Clear line 1 */
4838                 prt("", 1, 0);
4839
4840                 /* Clear */
4841                 clear_from(20 + xtra_stock);
4842
4843
4844                 /* Basic commands */
4845 #ifdef JP
4846                 prt(" ESC) 建物から出る", 21 + xtra_stock, 0);
4847 #else
4848                 prt(" ESC) Exit from Building.", 21 + xtra_stock, 0);
4849 #endif
4850
4851
4852                 /* Browse if necessary */
4853                 if (st_ptr->stock_num > store_bottom)
4854                 {
4855 #ifdef JP
4856                         prt(" -)前ページ", 22 + xtra_stock, 0);
4857                         prt(" スペース) 次ページ", 23 + xtra_stock, 0);
4858 #else
4859                         prt(" -) Previous page", 22 + xtra_stock, 0);
4860                         prt(" SPACE) Next page", 23 + xtra_stock, 0);
4861 #endif
4862
4863                 }
4864
4865                 /* Home commands */
4866                 if (cur_store_num == STORE_HOME)
4867                 {
4868 #ifdef JP
4869                         prt("g) アイテムを取る", 21 + xtra_stock, 27);
4870                         prt("d) アイテムを置く", 22 + xtra_stock, 27);
4871                         prt("x) 家のアイテムを調べる", 23 + xtra_stock, 27);
4872 #else
4873                         prt("g) Get an item.", 21 + xtra_stock, 27);
4874                         prt("d) Drop an item.", 22 + xtra_stock, 27);
4875                         prt("x) eXamine an item in the home.", 23 + xtra_stock, 27);
4876 #endif
4877                 }
4878
4879                 /* Museum commands */
4880                 else if (cur_store_num == STORE_MUSEUM)
4881                 {
4882 #ifdef JP
4883                         prt("d) アイテムを置く", 21 + xtra_stock, 27);
4884                         prt("r) アイテムの展示をやめる", 22 + xtra_stock, 27);
4885                         prt("x) 博物館のアイテムを調べる", 23 + xtra_stock, 27);
4886 #else
4887                         prt("d) Drop an item.", 21 + xtra_stock, 27);
4888                         prt("r) order to Remove an item.", 22 + xtra_stock, 27);
4889                         prt("x) eXamine an item in the museum.", 23 + xtra_stock, 27);
4890 #endif
4891                 }
4892
4893                 /* Shop commands */
4894                 else
4895                 {
4896 #ifdef JP
4897                         prt("p) 商品を買う", 21 + xtra_stock, 30);
4898                         prt("s) アイテムを売る", 22 + xtra_stock, 30);
4899                         prt("x) 商品を調べる", 23 + xtra_stock,30);
4900 #else
4901                         prt("p) Purchase an item.", 21 + xtra_stock, 30);
4902                         prt("s) Sell an item.", 22 + xtra_stock, 30);
4903                         prt("x) eXamine an item in the shop", 23 + xtra_stock,30);
4904 #endif
4905                 }
4906
4907 #ifdef JP
4908                 /* 基本的なコマンドの追加表示 */
4909
4910                 prt("i/e) 持ち物/装備の一覧", 21 + xtra_stock, 56);
4911
4912                 if (rogue_like_commands)
4913                 {
4914                         prt("w/T) 装備する/はずす", 22 + xtra_stock, 56);
4915                 }
4916                 else
4917                 {
4918                         prt("w/t) 装備する/はずす", 22 + xtra_stock, 56);
4919                 }
4920 #else
4921                 prt("i/e) Inventry/Equipment list", 21 + xtra_stock, 56);
4922
4923                 if (rogue_like_commands)
4924                 {
4925                         prt("w/T) Wear/Take off equipment", 22 + xtra_stock, 56);
4926                 }
4927                 else
4928                 {
4929                         prt("w/t) Wear/Take off equipment", 22 + xtra_stock, 56);
4930                 }
4931 #endif
4932                 /* Prompt */
4933                 prt(_("コマンド:", "You may: "), 20 + xtra_stock, 0);
4934
4935                 /* Get a command */
4936                 request_command(TRUE);
4937
4938                 /* Process the command */
4939                 store_process_command();
4940
4941                 /*
4942                  * Hack -- To redraw missiles damage and prices in store
4943                  * If player's charisma changes, or if player changes a bow, PU_BONUS is set
4944                  */
4945                 need_redraw_store_inv = (p_ptr->update & PU_BONUS) ? TRUE : FALSE;
4946
4947                 /* Hack -- Character is still in "icky" mode */
4948                 character_icky = TRUE;
4949
4950                 /* Notice stuff */
4951                 notice_stuff();
4952                 handle_stuff();
4953
4954                 /* Pack Overflow */
4955                 if (inventory[INVEN_PACK].k_idx)
4956                 {
4957                         INVENTORY_IDX item = INVEN_PACK;
4958
4959                         object_type *o_ptr = &inventory[item];
4960
4961                         /* Hack -- Flee from the store */
4962                         if (cur_store_num != STORE_HOME)
4963                         {
4964 #ifdef JP
4965                                 if (cur_store_num == STORE_MUSEUM)
4966                                         msg_print("ザックからアイテムがあふれそうなので、あわてて博物館から出た...");
4967                                 else
4968                                         msg_print("ザックからアイテムがあふれそうなので、あわてて店から出た...");
4969 #else
4970                                 if (cur_store_num == STORE_MUSEUM)
4971                                         msg_print("Your pack is so full that you flee the Museum...");
4972                                 else
4973                                         msg_print("Your pack is so full that you flee the store...");
4974 #endif
4975
4976
4977                                 /* Leave */
4978                                 leave_store = TRUE;
4979                         }
4980
4981                         /* Hack -- Flee from the home */
4982                         else if (!store_check_num(o_ptr))
4983                         {
4984 #ifdef JP
4985                                 msg_print("ザックからアイテムがあふれそうなので、あわてて家から出た...");
4986 #else
4987                                 msg_print("Your pack is so full that you flee your home...");
4988 #endif
4989
4990
4991                                 /* Leave */
4992                                 leave_store = TRUE;
4993                         }
4994
4995                         /* Hack -- Drop items into the home */
4996                         else
4997                         {
4998                                 int item_pos;
4999
5000                                 object_type forge;
5001                                 object_type *q_ptr;
5002
5003                                 char o_name[MAX_NLEN];
5004
5005
5006                                 /* Give a message */
5007 #ifdef JP
5008                                 msg_print("ザックからアイテムがあふれてしまった!");
5009 #else
5010                                 msg_print("Your pack overflows!");
5011 #endif
5012
5013                                 q_ptr = &forge;
5014
5015                                 /* Grab a copy of the item */
5016                                 object_copy(q_ptr, o_ptr);
5017
5018                                 /* Describe it */
5019                                 object_desc(o_name, q_ptr, 0);
5020
5021 #ifdef JP
5022                                 msg_format("%sが落ちた。(%c)", o_name, index_to_label(item));
5023 #else
5024                                 msg_format("You drop %s (%c).", o_name, index_to_label(item));
5025 #endif
5026
5027
5028                                 /* Remove it from the players inventory */
5029                                 inven_item_increase(item, -255);
5030                                 inven_item_describe(item);
5031                                 inven_item_optimize(item);
5032                                 handle_stuff();
5033
5034                                 /* Let the home carry it */
5035                                 item_pos = home_carry(q_ptr);
5036
5037                                 /* Redraw the home */
5038                                 if (item_pos >= 0)
5039                                 {
5040                                         store_top = (item_pos / store_bottom) * store_bottom;
5041                                         display_inventory();
5042                                 }
5043                         }
5044                 }
5045
5046                 /* Hack -- Redisplay store prices if charisma changes */
5047                 /* Hack -- Redraw missiles damage if player changes bow */
5048                 if (need_redraw_store_inv) display_inventory();
5049
5050                 /* Hack -- get kicked out of the store */
5051                 if (st_ptr->store_open >= turn) leave_store = TRUE;
5052         }
5053
5054         select_floor_music();
5055
5056         p_ptr->town_num = old_town_num;
5057
5058         /* Free turn */
5059         p_ptr->energy_use = 100;
5060
5061
5062         /* Hack -- Character is no longer in "icky" mode */
5063         character_icky = FALSE;
5064
5065
5066         /* Hack -- Cancel automatic command */
5067         command_new = 0;
5068
5069         /* Hack -- Cancel "see" mode */
5070         command_see = FALSE;
5071
5072         /* Allow expanding macros */
5073         get_com_no_macros = FALSE;
5074
5075         /* Flush messages */
5076         msg_print(NULL);
5077
5078
5079         /* Clear the screen */
5080         Term_clear();
5081
5082
5083         /* Update everything */
5084         p_ptr->update |= (PU_VIEW | PU_LITE | PU_MON_LITE);
5085         p_ptr->update |= (PU_MONSTERS);
5086
5087         /* Redraw entire screen */
5088         p_ptr->redraw |= (PR_BASIC | PR_EXTRA | PR_EQUIPPY);
5089
5090         p_ptr->redraw |= (PR_MAP);
5091
5092         p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
5093 }
5094
5095
5096
5097 /*!
5098  * @brief 現在の町の店主を交代させる /
5099  * Shuffle one of the stores.
5100  * @param which 店舗種類のID
5101  * @return なし
5102  */
5103 void store_shuffle(int which)
5104 {
5105         int i, j;
5106
5107
5108         /* Ignore home */
5109         if (which == STORE_HOME) return;
5110         if (which == STORE_MUSEUM) return;
5111
5112
5113         /* Save the store index */
5114         cur_store_num = which;
5115
5116         /* Activate that store */
5117         st_ptr = &town[p_ptr->town_num].store[cur_store_num];
5118
5119         j = st_ptr->owner;
5120         /* Pick a new owner */
5121         while(1)
5122         {
5123                 st_ptr->owner = (byte)randint0(MAX_OWNERS);
5124                 if (j == st_ptr->owner) continue;
5125                 for (i = 1;i < max_towns; i++)
5126                 {
5127                         if (i == p_ptr->town_num) continue;
5128                         if (st_ptr->owner == town[i].store[cur_store_num].owner) break;
5129                 }
5130                 if (i == max_towns) break;
5131         }
5132
5133         /* Activate the new owner */
5134         ot_ptr = &owners[cur_store_num][st_ptr->owner];
5135
5136
5137         /* Reset the owner data */
5138         st_ptr->insult_cur = 0;
5139         st_ptr->store_open = 0;
5140         st_ptr->good_buy = 0;
5141         st_ptr->bad_buy = 0;
5142
5143
5144         /* Hack -- discount all the items */
5145         for (i = 0; i < st_ptr->stock_num; i++)
5146         {
5147                 object_type *o_ptr;
5148
5149                 o_ptr = &st_ptr->stock[i];
5150
5151                 if (!object_is_artifact(o_ptr))
5152                 {
5153                         /* Hack -- Sell all non-artifact old items for "half price" */
5154                         o_ptr->discount = 50;
5155
5156                         /* Hack -- Items are no longer "fixed price" */
5157                         o_ptr->ident &= ~(IDENT_FIXED);
5158
5159                         /* Mega-Hack -- Note that the item is "on sale" */
5160                         o_ptr->inscription = quark_add(_("売出中", "on sale"));
5161                 }
5162         }
5163 }
5164
5165
5166 /*!
5167  * @brief 店の品揃えを変化させる /
5168  * Maintain the inventory at the stores.
5169  * @param town_num 町のID
5170  * @param store_num 店舗種類のID
5171  * @return なし
5172  */
5173 void store_maint(int town_num, int store_num)
5174 {
5175         INVENTORY_IDX j;
5176
5177         cur_store_num = store_num;
5178
5179         /* Ignore home */
5180         if (store_num == STORE_HOME) return;
5181         if (store_num == STORE_MUSEUM) return;
5182
5183         /* Activate that store */
5184         st_ptr = &town[town_num].store[store_num];
5185
5186         /* Activate the owner */
5187         ot_ptr = &owners[store_num][st_ptr->owner];
5188
5189         /* Store keeper forgives the player */
5190         st_ptr->insult_cur = 0;
5191
5192         /* Mega-Hack -- prune the black market */
5193         if (store_num == STORE_BLACK)
5194         {
5195                 /* Destroy crappy black market items */
5196                 for (j = st_ptr->stock_num - 1; j >= 0; j--)
5197                 {
5198                         object_type *o_ptr = &st_ptr->stock[j];
5199
5200                         /* Destroy crappy items */
5201                         if (black_market_crap(o_ptr))
5202                         {
5203                                 /* Destroy the item */
5204                                 store_item_increase(j, 0 - o_ptr->number);
5205                                 store_item_optimize(j);
5206                         }
5207                 }
5208         }
5209
5210
5211         /* Choose the number of slots to keep */
5212         j = st_ptr->stock_num;
5213
5214         /* Sell a few items */
5215         j = j - randint1(STORE_TURNOVER);
5216
5217         /* Never keep more than "STORE_MAX_KEEP" slots */
5218         if (j > STORE_MAX_KEEP) j = STORE_MAX_KEEP;
5219
5220         /* Always "keep" at least "STORE_MIN_KEEP" items */
5221         if (j < STORE_MIN_KEEP) j = STORE_MIN_KEEP;
5222
5223         /* Hack -- prevent "underflow" */
5224         if (j < 0) j = 0;
5225
5226         /* Destroy objects until only "j" slots are left */
5227         while (st_ptr->stock_num > j) store_delete();
5228
5229
5230         /* Choose the number of slots to fill */
5231         j = st_ptr->stock_num;
5232
5233         /* Buy some more items */
5234         j = j + randint1(STORE_TURNOVER);
5235
5236         /* Never keep more than "STORE_MAX_KEEP" slots */
5237         if (j > STORE_MAX_KEEP) j = STORE_MAX_KEEP;
5238
5239         /* Always "keep" at least "STORE_MIN_KEEP" items */
5240         if (j < STORE_MIN_KEEP) j = STORE_MIN_KEEP;
5241
5242         /* Hack -- prevent "overflow" */
5243         if (j >= st_ptr->stock_size) j = st_ptr->stock_size - 1;
5244
5245         /* Acquire some new items */
5246         while (st_ptr->stock_num < j) store_create();
5247 }
5248
5249
5250 /*!
5251  * @brief 店舗情報を初期化する /
5252  * Initialize the stores
5253  * @param town_num 町のID
5254  * @param store_num 店舗種類のID
5255  * @return なし
5256  */
5257 void store_init(int town_num, int store_num)
5258 {
5259         int             k;
5260
5261         cur_store_num = store_num;
5262
5263         /* Activate that store */
5264         st_ptr = &town[town_num].store[store_num];
5265
5266
5267         /* Pick an owner */
5268         while(1)
5269         {
5270                 int i;
5271
5272                 st_ptr->owner = (byte)randint0(MAX_OWNERS);
5273                 for (i = 1;i < max_towns; i++)
5274                 {
5275                         if (i == town_num) continue;
5276                         if (st_ptr->owner == town[i].store[store_num].owner) break;
5277                 }
5278                 if (i == max_towns) break;
5279         }
5280
5281         /* Activate the new owner */
5282         ot_ptr = &owners[store_num][st_ptr->owner];
5283
5284
5285         /* Initialize the store */
5286         st_ptr->store_open = 0;
5287         st_ptr->insult_cur = 0;
5288         st_ptr->good_buy = 0;
5289         st_ptr->bad_buy = 0;
5290
5291         /* Nothing in stock */
5292         st_ptr->stock_num = 0;
5293
5294         /*
5295          * MEGA-HACK - Last visit to store is
5296          * BEFORE player birth to enable store restocking
5297          */
5298         st_ptr->last_visit = -10L * TURNS_PER_TICK * STORE_TICKS;
5299
5300         /* Clear any old items */
5301         for (k = 0; k < st_ptr->stock_size; k++)
5302         {
5303                 object_wipe(&st_ptr->stock[k]);
5304         }
5305 }
5306
5307
5308 /*!
5309  * @brief アイテムを町のブラックマーケットに移動させる /
5310  * @param o_ptr 移動させたいオブジェクトの構造体参照ポインタ
5311  * @return なし
5312  */
5313 void move_to_black_market(object_type *o_ptr)
5314 {
5315         /* Not in town */
5316         if (!p_ptr->town_num) return;
5317
5318         st_ptr = &town[p_ptr->town_num].store[STORE_BLACK];
5319
5320         o_ptr->ident |= IDENT_STORE;
5321
5322         (void)store_carry(o_ptr);
5323
5324         object_wipe(o_ptr); /* Don't leave a bogus object behind... */
5325 }
5326