OSDN Git Service

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