OSDN Git Service

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