OSDN Git Service

4db960173a8d438d506c36cf600aa7ef6e28d262
[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         /* 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                         o_ptr = &st_ptr->stock[i];
1579
1580                         /* Skip empty items */
1581                         if (!o_ptr->k_idx) continue;
1582
1583                         /* Scan the items above that item */
1584                         for (j = 0; j < i; j++)
1585                         {
1586                                 int max_num;
1587
1588                                 j_ptr = &st_ptr->stock[j];
1589
1590                                 /* Skip empty items */
1591                                 if (!j_ptr->k_idx) continue;
1592
1593                                 /*
1594                                  * Get maximum number of the stack if these
1595                                  * are similar, get zero otherwise.
1596                                  */
1597                                 max_num = object_similar_part(j_ptr, o_ptr);
1598
1599                                 /* Can we (partialy) drop "o_ptr" onto "j_ptr"? */
1600                                 if (max_num && j_ptr->number < max_num)
1601                                 {
1602                                         if (o_ptr->number + j_ptr->number <= max_num)
1603                                         {
1604                                                 /* Add together the item counts */
1605                                                 object_absorb(j_ptr, o_ptr);
1606
1607                                                 /* One object is gone */
1608                                                 st_ptr->stock_num--;
1609
1610                                                 /* Slide everything down */
1611                                                 for (k = i; k < st_ptr->stock_num; k++)
1612                                                 {
1613                                                         /* Structure copy */
1614                                                         st_ptr->stock[k] = st_ptr->stock[k + 1];
1615                                                 }
1616
1617                                                 /* Erase the "final" slot */
1618                                                 object_wipe(&st_ptr->stock[k]);
1619                                         }
1620                                         else
1621                                         {
1622                                                 ITEM_NUMBER old_num = o_ptr->number;
1623                                                 ITEM_NUMBER remain = j_ptr->number + o_ptr->number - max_num;
1624
1625                                                 /* Add together the item counts */
1626                                                 object_absorb(j_ptr, o_ptr);
1627
1628                                                 o_ptr->number = remain;
1629
1630                                                 /* Hack -- if rods are stacking, add the pvals (maximum timeouts) and current timeouts together. -LM- */
1631                                                 if (o_ptr->tval == TV_ROD)
1632                                                 {
1633                                                         o_ptr->pval =  o_ptr->pval * remain / old_num;
1634                                                         o_ptr->timeout = o_ptr->timeout * remain / old_num;
1635                                                 }
1636
1637                                                 /* Hack -- if wands are stacking, combine the charges. -LM- */
1638                                                 else if (o_ptr->tval == TV_WAND)
1639                                                 {
1640                                                         o_ptr->pval = o_ptr->pval * remain / old_num;
1641                                                 }
1642                                         }
1643
1644                                         /* Take note */
1645                                         combined = TRUE;
1646
1647                                         break;
1648                                 }
1649                         }
1650                 }
1651
1652                 flag |= combined;
1653         }
1654         while (combined);
1655
1656         /* Re-order the items in the home (forwards) */
1657         for (i = 0; i < st_ptr->stock_num; i++)
1658         {
1659                 o_ptr = &st_ptr->stock[i];
1660
1661                 /* Skip empty slots */
1662                 if (!o_ptr->k_idx) continue;
1663
1664                 /* Get the "value" of the item */
1665                 o_value = object_value(o_ptr);
1666
1667                 /* Scan every occupied slot */
1668                 for (j = 0; j < st_ptr->stock_num; j++)
1669                 {
1670                         if (object_sort_comp(o_ptr, o_value, &st_ptr->stock[j])) break;
1671                 }
1672
1673                 /* Never move down */
1674                 if (j >= i) continue;
1675
1676                 /* Take note */
1677                 flag = TRUE;
1678
1679                 /* Get local object */
1680                 j_ptr = &forge;
1681
1682                 /* Save a copy of the moving item */
1683                 object_copy(j_ptr, &st_ptr->stock[i]);
1684
1685                 /* Slide the objects */
1686                 for (k = i; k > j; k--)
1687                 {
1688                         /* Slide the item */
1689                         object_copy(&st_ptr->stock[k], &st_ptr->stock[k - 1]);
1690                 }
1691
1692                 /* Insert the moving item */
1693                 object_copy(&st_ptr->stock[j], j_ptr);
1694         }
1695
1696         st_ptr = old_st_ptr;
1697         if (store_num != STORE_HOME)
1698         {
1699                 stack_force_notes = old_stack_force_notes;
1700                 stack_force_costs = old_stack_force_costs;
1701         }
1702
1703         return flag;
1704 }
1705
1706
1707 /*!
1708  * @brief 我が家にオブジェクトを加える /
1709  * Add the item "o_ptr" to the inventory of the "Home"
1710  * @param o_ptr 加えたいオブジェクトの構造体参照ポインタ
1711  * @return 収めた先のID
1712  * @details
1713  * <pre>
1714  * In all cases, return the slot (or -1) where the object was placed
1715  * Note that this is a hacked up version of "inven_carry()".
1716  * Also note that it may not correctly "adapt" to "knowledge" bacoming
1717  * known, the player may have to pick stuff up and drop it again.
1718  * </pre>
1719  */
1720 static int home_carry(object_type *o_ptr)
1721 {
1722         int                             slot;
1723         s32b                       value;
1724         int     i;
1725         object_type *j_ptr;
1726         bool old_stack_force_notes = stack_force_notes;
1727         bool old_stack_force_costs = stack_force_costs;
1728
1729         if (cur_store_num != STORE_HOME)
1730         {
1731                 stack_force_notes = FALSE;
1732                 stack_force_costs = FALSE;
1733         }
1734
1735         /* Check each existing item (try to combine) */
1736         for (slot = 0; slot < st_ptr->stock_num; slot++)
1737         {
1738                 /* Get the existing item */
1739                 j_ptr = &st_ptr->stock[slot];
1740
1741                 /* The home acts just like the player */
1742                 if (object_similar(j_ptr, o_ptr))
1743                 {
1744                         /* Save the new number of items */
1745                         object_absorb(j_ptr, o_ptr);
1746
1747                         if (cur_store_num != STORE_HOME)
1748                         {
1749                                 stack_force_notes = old_stack_force_notes;
1750                                 stack_force_costs = old_stack_force_costs;
1751                         }
1752
1753                         /* All done */
1754                         return (slot);
1755                 }
1756         }
1757
1758         if (cur_store_num != STORE_HOME)
1759         {
1760                 stack_force_notes = old_stack_force_notes;
1761                 stack_force_costs = old_stack_force_costs;
1762         }
1763
1764         /* No space? */
1765         /*
1766          * 隠し機能: オプション powerup_home が設定されていると
1767          *           我が家が 20 ページまで使える
1768          */
1769         /* No space? */
1770         if ((cur_store_num != STORE_HOME) || (powerup_home == TRUE)) {
1771                 if (st_ptr->stock_num >= st_ptr->stock_size) {
1772                         return (-1);
1773                 }
1774         }
1775         else{
1776                 if (st_ptr->stock_num >= ((st_ptr->stock_size) / 10)) {
1777                         return (-1);
1778                 }
1779         }
1780
1781
1782         /* Determine the "value" of the item */
1783         value = object_value(o_ptr);
1784
1785         /* Check existing slots to see if we must "slide" */
1786         for (slot = 0; slot < st_ptr->stock_num; slot++)
1787         {
1788                 if (object_sort_comp(o_ptr, value, &st_ptr->stock[slot])) break;
1789         }
1790
1791         /* Slide the others up */
1792         for (i = st_ptr->stock_num; i > slot; i--)
1793         {
1794                 st_ptr->stock[i] = st_ptr->stock[i-1];
1795         }
1796
1797         /* More stuff now */
1798         st_ptr->stock_num++;
1799
1800         /* Insert the new item */
1801         st_ptr->stock[slot] = *o_ptr;
1802
1803         chg_virtue(V_SACRIFICE, -1);
1804
1805         (void)combine_and_reorder_home(cur_store_num);
1806
1807         /* Return the location */
1808         return (slot);
1809 }
1810
1811
1812 /*!
1813  * @brief 店舗にオブジェクトを加える /
1814  * Add the item "o_ptr" to a real stores inventory.
1815  * @param o_ptr 加えたいオブジェクトの構造体参照ポインタ
1816  * @return 収めた先のID
1817  * @details
1818  * <pre>
1819  * In all cases, return the slot (or -1) where the object was placed
1820  * Note that this is a hacked up version of "inven_carry()".
1821  * Also note that it may not correctly "adapt" to "knowledge" bacoming
1822  * known, the player may have to pick stuff up and drop it again.
1823  * </pre>
1824  */
1825 static int store_carry(object_type *o_ptr)
1826 {
1827         int     i, slot;
1828         s32b    value, j_value;
1829         object_type *j_ptr;
1830
1831
1832         /* Evaluate the object */
1833         value = object_value(o_ptr);
1834
1835         /* Cursed/Worthless items "disappear" when sold */
1836         if (value <= 0) return (-1);
1837
1838         /* All store items are fully *identified* */
1839         o_ptr->ident |= IDENT_MENTAL;
1840
1841         /* Erase the inscription */
1842         o_ptr->inscription = 0;
1843
1844         /* Erase the "feeling" */
1845         o_ptr->feeling = FEEL_NONE;
1846
1847         /* Check each existing item (try to combine) */
1848         for (slot = 0; slot < st_ptr->stock_num; slot++)
1849         {
1850                 /* Get the existing item */
1851                 j_ptr = &st_ptr->stock[slot];
1852
1853                 /* Can the existing items be incremented? */
1854                 if (store_object_similar(j_ptr, o_ptr))
1855                 {
1856                         /* Hack -- extra items disappear */
1857                         store_object_absorb(j_ptr, o_ptr);
1858
1859                         /* All done */
1860                         return (slot);
1861                 }
1862         }
1863
1864         /* No space? */
1865         if (st_ptr->stock_num >= st_ptr->stock_size) return (-1);
1866
1867
1868         /* Check existing slots to see if we must "slide" */
1869         for (slot = 0; slot < st_ptr->stock_num; slot++)
1870         {
1871                 /* Get that item */
1872                 j_ptr = &st_ptr->stock[slot];
1873
1874                 /* Objects sort by decreasing type */
1875                 if (o_ptr->tval > j_ptr->tval) break;
1876                 if (o_ptr->tval < j_ptr->tval) continue;
1877
1878                 /* Objects sort by increasing sval */
1879                 if (o_ptr->sval < j_ptr->sval) break;
1880                 if (o_ptr->sval > j_ptr->sval) continue;
1881
1882                 /*
1883                  * Hack:  otherwise identical rods sort by
1884                  * increasing recharge time --dsb
1885                  */
1886                 if (o_ptr->tval == TV_ROD)
1887                 {
1888                         if (o_ptr->pval < j_ptr->pval) break;
1889                         if (o_ptr->pval > j_ptr->pval) continue;
1890                 }
1891
1892                 /* Evaluate that slot */
1893                 j_value = object_value(j_ptr);
1894
1895                 /* Objects sort by decreasing value */
1896                 if (value > j_value) break;
1897                 if (value < j_value) continue;
1898         }
1899
1900         /* Slide the others up */
1901         for (i = st_ptr->stock_num; i > slot; i--)
1902         {
1903                 st_ptr->stock[i] = st_ptr->stock[i-1];
1904         }
1905
1906         /* More stuff now */
1907         st_ptr->stock_num++;
1908
1909         /* Insert the new item */
1910         st_ptr->stock[slot] = *o_ptr;
1911
1912         /* Return the location */
1913         return (slot);
1914 }
1915
1916
1917 /*!
1918  * @brief 店舗のオブジェクト数を増やす /
1919  * Add the item "o_ptr" to a real stores inventory.
1920  * @param item 増やしたいアイテムのID
1921  * @param num 増やしたい数
1922  * @return なし
1923  * @details
1924  * <pre>
1925  * Increase, by a given amount, the number of a certain item
1926  * in a certain store.  This can result in zero items.
1927  * </pre>
1928  * @todo numは本来ITEM_NUMBER型にしたい。
1929  */
1930 static void store_item_increase(INVENTORY_IDX item, int num)
1931 {
1932         int             cnt;
1933         object_type *o_ptr;
1934
1935         o_ptr = &st_ptr->stock[item];
1936
1937         /* Verify the number */
1938         cnt = o_ptr->number + num;
1939         if (cnt > 255) cnt = 255;
1940         else if (cnt < 0) cnt = 0;
1941         num = cnt - o_ptr->number;
1942
1943         /* Save the new number */
1944         o_ptr->number += (ITEM_NUMBER)num;
1945 }
1946
1947
1948 /*!
1949  * @brief 店舗のオブジェクト数を削除する /
1950  * Remove a slot if it is empty
1951  * @param item 削除したいアイテムのID
1952  * @return なし
1953  */
1954 static void store_item_optimize(INVENTORY_IDX item)
1955 {
1956         int             j;
1957         object_type *o_ptr;
1958
1959         o_ptr = &st_ptr->stock[item];
1960
1961         /* Must exist */
1962         if (!o_ptr->k_idx) return;
1963
1964         /* Must have no items */
1965         if (o_ptr->number) return;
1966
1967         /* One less item */
1968         st_ptr->stock_num--;
1969
1970         /* Slide everyone */
1971         for (j = item; j < st_ptr->stock_num; j++)
1972         {
1973                 st_ptr->stock[j] = st_ptr->stock[j + 1];
1974         }
1975
1976         /* Nuke the final slot */
1977         object_wipe(&st_ptr->stock[j]);
1978 }
1979
1980 /*!
1981  * @brief ブラックマーケット用の無価値品の排除判定 /
1982  * This function will keep 'crap' out of the black market.
1983  * @param o_ptr 判定したいオブジェクトの構造体参照ポインタ
1984  * @return ブラックマーケットにとって無価値な品ならばTRUEを返す
1985  * @details
1986  * <pre>
1987  * Crap is defined as any item that is "available" elsewhere
1988  * Based on a suggestion by "Lee Vogt" <lvogt@cig.mcel.mot.com>
1989  * </pre>
1990  */
1991 static bool black_market_crap(object_type *o_ptr)
1992 {
1993         int     i, j;
1994
1995         /* Ego items are never crap */
1996         if (object_is_ego(o_ptr)) return (FALSE);
1997
1998         /* Good items are never crap */
1999         if (o_ptr->to_a > 0) return (FALSE);
2000         if (o_ptr->to_h > 0) return (FALSE);
2001         if (o_ptr->to_d > 0) return (FALSE);
2002
2003         /* Check all stores */
2004         for (i = 0; i < MAX_STORES; i++)
2005         {
2006                 if (i == STORE_HOME) continue;
2007                 if (i == STORE_MUSEUM) continue;
2008
2009                 /* Check every item in the store */
2010                 for (j = 0; j < town[p_ptr->town_num].store[i].stock_num; j++)
2011                 {
2012                         object_type *j_ptr = &town[p_ptr->town_num].store[i].stock[j];
2013
2014                         /* Duplicate item "type", assume crappy */
2015                         if (o_ptr->k_idx == j_ptr->k_idx) return (TRUE);
2016                 }
2017         }
2018
2019         /* Assume okay */
2020         return (FALSE);
2021 }
2022
2023
2024 /*!
2025  * @brief 店舗の品揃え変化のためにアイテムを削除する /
2026  * Attempt to delete (some of) a random item from the store
2027  * @return なし
2028  * @details
2029  * <pre>
2030  * Hack -- we attempt to "maintain" piles of items when possible.
2031  * </pre>
2032  */
2033 static void store_delete(void)
2034 {
2035         INVENTORY_IDX what;
2036         int num;
2037
2038         /* Pick a random slot */
2039         what = (INVENTORY_IDX)randint0(st_ptr->stock_num);
2040
2041         /* Determine how many items are here */
2042         num = st_ptr->stock[what].number;
2043
2044         /* Hack -- sometimes, only destroy half the items */
2045         if (randint0(100) < 50) num = (num + 1) / 2;
2046
2047         /* Hack -- sometimes, only destroy a single item */
2048         if (randint0(100) < 50) num = 1;
2049
2050         /* Hack -- decrement the maximum timeouts and total charges of rods and wands. -LM- */
2051         if ((st_ptr->stock[what].tval == TV_ROD) || (st_ptr->stock[what].tval == TV_WAND))
2052         {
2053                 st_ptr->stock[what].pval -= num * st_ptr->stock[what].pval / st_ptr->stock[what].number;
2054         }
2055
2056         /* Actually destroy (part of) the item */
2057         store_item_increase(what, -num);
2058         store_item_optimize(what);
2059 }
2060
2061
2062 /*!
2063  * @brief 店舗の品揃え変化のためにアイテムを追加する /
2064  * Creates a random item and gives it to a store
2065  * @return なし
2066  * @details
2067  * <pre>
2068  * This algorithm needs to be rethought.  A lot.
2069  * Currently, "normal" stores use a pre-built array.
2070  * Note -- the "level" given to "obj_get_num()" is a "favored"
2071  * level, that is, there is a much higher chance of getting
2072  * items with a level approaching that of the given level...
2073  * Should we check for "permission" to have the given item?
2074  * </pre>
2075  */
2076 static void store_create(void)
2077 {
2078         OBJECT_IDX i;
2079         int tries;
2080         DEPTH level;
2081
2082         object_type forge;
2083         object_type *q_ptr;
2084
2085
2086         /* Paranoia -- no room left */
2087         if (st_ptr->stock_num >= st_ptr->stock_size) return;
2088
2089
2090         /* Hack -- consider up to four items */
2091         for (tries = 0; tries < 4; tries++)
2092         {
2093                 /* Black Market */
2094                 if (cur_store_num == STORE_BLACK)
2095                 {
2096                         /* Pick a level for object/magic */
2097                         level = 25 + randint0(25);
2098
2099                         /* Random item (usually of given level) */
2100                         i = get_obj_num(level);
2101
2102                         /* Handle failure */
2103                         if (!i) continue;
2104                 }
2105
2106                 /* Normal Store */
2107                 else
2108                 {
2109                         /* Hack -- Pick an item to sell */
2110                         i = st_ptr->table[randint0(st_ptr->table_num)];
2111
2112                         /* Hack -- fake level for apply_magic() */
2113                         level = rand_range(1, STORE_OBJ_LEVEL);
2114                 }
2115
2116
2117                 /* Get local object */
2118                 q_ptr = &forge;
2119
2120                 /* Create a new object of the chosen kind */
2121                 object_prep(q_ptr, i);
2122
2123                 /* Apply some "low-level" magic (no artifacts) */
2124                 apply_magic(q_ptr, level, AM_NO_FIXED_ART);
2125
2126                 /* Require valid object */
2127                 if (!store_will_buy(q_ptr)) continue;
2128
2129                 /* Hack -- Charge lite's */
2130                 if (q_ptr->tval == TV_LITE)
2131                 {
2132                         if (q_ptr->sval == SV_LITE_TORCH) q_ptr->xtra4 = FUEL_TORCH / 2;
2133                         if (q_ptr->sval == SV_LITE_LANTERN) q_ptr->xtra4 = FUEL_LAMP / 2;
2134                 }
2135
2136
2137                 /* The item is "known" */
2138                 object_known(q_ptr);
2139
2140                 /* Mark it storebought */
2141                 q_ptr->ident |= IDENT_STORE;
2142
2143                 /* Mega-Hack -- no chests in stores */
2144                 if (q_ptr->tval == TV_CHEST) continue;
2145
2146                 /* Prune the black market */
2147                 if (cur_store_num == STORE_BLACK)
2148                 {
2149                         /* Hack -- No "crappy" items */
2150                         if (black_market_crap(q_ptr)) continue;
2151
2152                         /* Hack -- No "cheap" items */
2153                         if (object_value(q_ptr) < 10) continue;
2154
2155                         /* No "worthless" items */
2156                         /* if (object_value(q_ptr) <= 0) continue; */
2157                 }
2158
2159                 /* Prune normal stores */
2160                 else
2161                 {
2162                         /* No "worthless" items */
2163                         if (object_value(q_ptr) <= 0) continue;
2164                 }
2165
2166
2167                 /* Mass produce and/or Apply discount */
2168                 mass_produce(q_ptr);
2169
2170                 /* Attempt to carry the (known) item */
2171                 (void)store_carry(q_ptr);
2172
2173                 /* Definitely done */
2174                 break;
2175         }
2176 }
2177
2178
2179 /*!
2180  * @brief 店舗の割引対象外にするかどうかを判定 /
2181  * Eliminate need to bargain if player has haggled well in the past
2182  * @param minprice アイテムの最低販売価格
2183  * @return 割引を禁止するならTRUEを返す。
2184  */
2185 static bool noneedtobargain(PRICE minprice)
2186 {
2187         s32b good = st_ptr->good_buy;
2188         s32b bad = st_ptr->bad_buy;
2189
2190         /* Cheap items are "boring" */
2191         if (minprice < 10L) return (TRUE);
2192
2193         /* Perfect haggling */
2194         if (good == MAX_SHORT) return (TRUE);
2195
2196         /* Reward good haggles, punish bad haggles, notice price */
2197         if (good > ((3 * bad) + (5 + (minprice/50)))) return (TRUE);
2198
2199         /* Return the flag */
2200         return (FALSE);
2201 }
2202
2203
2204 /*!
2205  * @brief 店主の持つプレイヤーに対する売買の良し悪し経験を記憶する /
2206  * Update the bargain info
2207  * @param price 実際の取引価格
2208  * @param minprice 店主の提示した価格
2209  * @param num 売買数 
2210  * @return なし
2211  */
2212 static void updatebargain(PRICE price, PRICE minprice, int num)
2213 {
2214         /* Hack -- auto-haggle */
2215         if (!manual_haggle) return;
2216
2217         /* Cheap items are "boring" */
2218         if ((minprice/num) < 10L) return;
2219
2220         /* Count the successful haggles */
2221         if (price == minprice)
2222         {
2223                 /* Just count the good haggles */
2224                 if (st_ptr->good_buy < MAX_SHORT)
2225                 {
2226                         st_ptr->good_buy++;
2227                 }
2228         }
2229
2230         /* Count the failed haggles */
2231         else
2232         {
2233                 /* Just count the bad haggles */
2234                 if (st_ptr->bad_buy < MAX_SHORT)
2235                 {
2236                         st_ptr->bad_buy++;
2237                 }
2238         }
2239 }
2240
2241
2242 /*!
2243  * @brief 店の商品リストを再表示する /
2244  * Re-displays a single store entry
2245  * @param pos 表示行
2246  * @return なし
2247  */
2248 static void display_entry(int pos)
2249 {
2250         int             i, cur_col;
2251         object_type     *o_ptr;
2252         s32b            x;
2253
2254         char            o_name[MAX_NLEN];
2255         char            out_val[160];
2256
2257         int maxwid = 75;
2258
2259         o_ptr = &st_ptr->stock[pos];
2260
2261         /* Get the "offset" */
2262         i = (pos % store_bottom);
2263
2264         /* Label it, clear the line --(-- */
2265         (void)sprintf(out_val, "%c) ", ((i > 25) ? toupper(I2A(i - 26)) : I2A(i)));
2266         prt(out_val, i+6, 0);
2267
2268         cur_col = 3;
2269         if (show_item_graph)
2270         {
2271                 byte a = object_attr(o_ptr);
2272                 char c = object_char(o_ptr);
2273
2274                 Term_queue_bigchar(cur_col, i + 6, a, c, 0, 0);
2275                 if (use_bigtile) cur_col++;
2276
2277                 cur_col += 2;
2278         }
2279
2280         /* Describe an item in the home */
2281         if ((cur_store_num == STORE_HOME) || (cur_store_num == STORE_MUSEUM))
2282         {
2283                 maxwid = 75;
2284
2285                 /* Leave room for weights, if necessary -DRS- */
2286                 if (show_weights) maxwid -= 10;
2287
2288                 object_desc(o_name, o_ptr, 0);
2289                 o_name[maxwid] = '\0';
2290                 c_put_str(tval_to_attr[o_ptr->tval], o_name, i+6, cur_col);
2291
2292                 /* Show weights */
2293                 if(show_weights)
2294                 {
2295                         /* Only show the weight of an individual item */
2296                         int wgt = o_ptr->weight;
2297 #ifdef JP
2298                         sprintf(out_val, "%3d.%1d kg", lbtokg1(wgt) , lbtokg2(wgt));
2299                         put_str(out_val, i+6, 67);
2300 #else
2301                         (void)sprintf(out_val, "%3d.%d lb", wgt / 10, wgt % 10);
2302                         put_str(out_val, i+6, 68);
2303 #endif
2304
2305                 }
2306         }
2307
2308         /* Describe an item (fully) in a store */
2309         else
2310         {
2311                 /* Must leave room for the "price" */
2312                 maxwid = 65;
2313
2314                 /* Leave room for weights, if necessary -DRS- */
2315                 if (show_weights) maxwid -= 7;
2316
2317                 /* Describe the object (fully) */
2318                 object_desc(o_name, o_ptr, 0);
2319                 o_name[maxwid] = '\0';
2320                 c_put_str(tval_to_attr[o_ptr->tval], o_name, i+6, cur_col);
2321
2322                 /* Show weights */
2323                 if (show_weights)
2324                 {
2325                         /* Only show the weight of an individual item */
2326                         int wgt = o_ptr->weight;
2327 #ifdef JP
2328                         sprintf(out_val, "%3d.%1d", lbtokg1(wgt) , lbtokg2(wgt) );
2329                         put_str(out_val, i+6, 60);
2330 #else
2331                         (void)sprintf(out_val, "%3d.%d", wgt / 10, wgt % 10);
2332                         put_str(out_val, i+6, 61);
2333 #endif
2334
2335                 }
2336
2337                 /* Display a "fixed" cost */
2338                 if (o_ptr->ident & (IDENT_FIXED))
2339                 {
2340                         /* Extract the "minimum" price */
2341                         x = price_item(o_ptr, ot_ptr->min_inflate, FALSE);
2342
2343                         /* Actually draw the price (not fixed) */
2344 #ifdef JP
2345 (void)sprintf(out_val, "%9ld固", (long)x);
2346 #else
2347                         (void)sprintf(out_val, "%9ld F", (long)x);
2348 #endif
2349
2350                         put_str(out_val, i+6, 68);
2351                 }
2352
2353                 /* Display a "taxed" cost */
2354                 else if (!manual_haggle)
2355                 {
2356                         /* Extract the "minimum" price */
2357                         x = price_item(o_ptr, ot_ptr->min_inflate, FALSE);
2358
2359                         /* Hack -- Apply Sales Tax if needed */
2360                         if (!noneedtobargain(x)) x += x / 10;
2361
2362                         /* Actually draw the price (with tax) */
2363                         (void)sprintf(out_val, "%9ld  ", (long)x);
2364                         put_str(out_val, i+6, 68);
2365                 }
2366
2367                 /* Display a "haggle" cost */
2368                 else
2369                 {
2370                         /* Extrect the "maximum" price */
2371                         x = price_item(o_ptr, ot_ptr->max_inflate, FALSE);
2372
2373                         /* Actually draw the price (not fixed) */
2374                         (void)sprintf(out_val, "%9ld  ", (long)x);
2375                         put_str(out_val, i+6, 68);
2376                 }
2377         }
2378 }
2379
2380
2381 /*!
2382  * @brief 店の商品リストを表示する /
2383  * Displays a store's inventory                 -RAK-
2384  * @return なし
2385  * @details
2386  * All prices are listed as "per individual object".  -BEN-
2387  */
2388 static void display_inventory(void)
2389 {
2390         int i, k;
2391
2392         /* Display the next 12 items */
2393         for (k = 0; k < store_bottom; k++)
2394         {
2395                 /* Do not display "dead" items */
2396                 if (store_top + k >= st_ptr->stock_num) break;
2397
2398                 /* Display that line */
2399                 display_entry(store_top + k);
2400         }
2401
2402         /* Erase the extra lines and the "more" prompt */
2403         for (i = k; i < store_bottom + 1; i++) prt("", i + 6, 0);
2404
2405         /* Assume "no current page" */
2406 #ifdef JP
2407         put_str("          ", 5, 20);
2408 #else
2409         put_str("        ", 5, 20);
2410 #endif
2411
2412
2413         /* Visual reminder of "more items" */
2414         if (st_ptr->stock_num > store_bottom)
2415         {
2416                 /* Show "more" reminder (after the last item) */
2417 #ifdef JP
2418                 prt("-続く-", k + 6, 3);
2419 #else
2420                 prt("-more-", k + 6, 3);
2421 #endif
2422
2423
2424                 /* Indicate the "current page" */
2425                 /* Trailing spaces are to display (Page xx) and (Page x) */
2426 #ifdef JP
2427                 put_str(format("(%dページ)  ", store_top/store_bottom + 1), 5, 20);
2428 #else
2429                 put_str(format("(Page %d)  ", store_top/store_bottom + 1), 5, 20);
2430 #endif
2431
2432         }
2433
2434         if (cur_store_num == STORE_HOME || cur_store_num == STORE_MUSEUM)
2435         {
2436                 k = st_ptr->stock_size;
2437
2438                 if (cur_store_num == STORE_HOME && !powerup_home) k /= 10;
2439 #ifdef JP
2440                 put_str(format("アイテム数:  %4d/%4d", st_ptr->stock_num, k), 19 + xtra_stock, 27);
2441 #else
2442                 put_str(format("Objects:  %4d/%4d", st_ptr->stock_num, k), 19 + xtra_stock, 30);
2443 #endif
2444         }
2445 }
2446
2447
2448 /*!
2449  * @brief プレイヤーの所持金を表示する /
2450  * Displays players gold                                        -RAK-
2451  * @return なし
2452  * @details
2453  */
2454 static void store_prt_gold(void)
2455 {
2456         char out_val[64];
2457
2458 #ifdef JP
2459         prt("手持ちのお金: ", 19 + xtra_stock, 53);
2460 #else
2461         prt("Gold Remaining: ", 19 + xtra_stock, 53);
2462 #endif
2463
2464
2465         sprintf(out_val, "%9ld", (long)p_ptr->au);
2466         prt(out_val, 19 + xtra_stock, 68);
2467 }
2468
2469 /*!
2470  * @brief 店舗情報全体を表示するメインルーチン /
2471  * Displays store (after clearing screen)               -RAK-
2472  * @return なし
2473  * @details
2474  */
2475 static void display_store(void)
2476 {
2477         char buf[80];
2478
2479
2480         /* Clear screen */
2481         Term_clear();
2482
2483         /* The "Home" is special */
2484         if (cur_store_num == STORE_HOME)
2485         {
2486                 /* Put the owner name */
2487 #ifdef JP
2488                 put_str("我が家", 3, 31);
2489 #else
2490                 put_str("Your Home", 3, 30);
2491 #endif
2492
2493
2494                 /* Label the item descriptions */
2495 #ifdef JP
2496                 put_str("アイテムの一覧", 5, 4);
2497 #else
2498                 put_str("Item Description", 5, 3);
2499 #endif
2500
2501
2502                 /* If showing weights, show label */
2503                 if (show_weights)
2504                 {
2505 #ifdef JP
2506                         put_str("重さ", 5, 72);
2507 #else
2508                         put_str("Weight", 5, 70);
2509 #endif
2510
2511                 }
2512         }
2513
2514         /* The "Home" is special */
2515         else if (cur_store_num == STORE_MUSEUM)
2516         {
2517                 /* Put the owner name */
2518 #ifdef JP
2519                 put_str("博物館", 3, 31);
2520 #else
2521                 put_str("Museum", 3, 30);
2522 #endif
2523
2524
2525                 /* Label the item descriptions */
2526 #ifdef JP
2527                 put_str("アイテムの一覧", 5, 4);
2528 #else
2529                 put_str("Item Description", 5, 3);
2530 #endif
2531
2532
2533                 /* If showing weights, show label */
2534                 if (show_weights)
2535                 {
2536 #ifdef JP
2537                         put_str("重さ", 5, 72);
2538 #else
2539                         put_str("Weight", 5, 70);
2540 #endif
2541
2542                 }
2543         }
2544
2545         /* Normal stores */
2546         else
2547         {
2548                 cptr store_name = (f_name + f_info[cur_store_feat].name);
2549                 cptr owner_name = (ot_ptr->owner_name);
2550                 cptr race_name = race_info[ot_ptr->owner_race].title;
2551
2552                 /* Put the owner name and race */
2553                 sprintf(buf, "%s (%s)", owner_name, race_name);
2554                 put_str(buf, 3, 10);
2555
2556                 /* Show the max price in the store (above prices) */
2557                 sprintf(buf, "%s (%ld)", store_name, (long)(ot_ptr->max_cost));
2558                 prt(buf, 3, 50);
2559
2560                 /* Label the item descriptions */
2561 #ifdef JP
2562                 put_str("商品の一覧", 5, 7);
2563 #else
2564                 put_str("Item Description", 5, 3);
2565 #endif
2566
2567
2568                 /* If showing weights, show label */
2569                 if (show_weights)
2570                 {
2571 #ifdef JP
2572                         put_str("重さ", 5, 62);
2573 #else
2574                         put_str("Weight", 5, 60);
2575 #endif
2576
2577                 }
2578
2579                 /* Label the asking price (in stores) */
2580 #ifdef JP
2581                 put_str("価格", 5, 73);
2582 #else
2583                 put_str("Price", 5, 72);
2584 #endif
2585
2586         }
2587
2588         /* Display the current gold */
2589         store_prt_gold();
2590
2591         /* Draw in the inventory */
2592         display_inventory();
2593 }
2594
2595
2596
2597 /*!
2598  * @brief 店舗からアイテムを選択する /
2599  * Get the ID of a store item and return its value      -RAK-
2600  * @param com_val 選択IDを返す参照ポインタ
2601  * @param pmt メッセージキャプション
2602  * @param i 選択範囲の最小値
2603  * @param j 選択範囲の最大値
2604  * @return 実際に選択したらTRUE、キャンセルしたらFALSE
2605  */
2606 static int get_stock(COMMAND_CODE *com_val, cptr pmt, int i, int j)
2607 {
2608         char    command;
2609         char    out_val[160];
2610         char    lo, hi;
2611
2612         /* Get the item index */
2613         if (repeat_pull(com_val))
2614         {
2615                 /* Verify the item */
2616                 if ((*com_val >= i) && (*com_val <= j))
2617                 {
2618                         /* Success */
2619                         return (TRUE);
2620                 }
2621         }
2622
2623         /* Paranoia */
2624         msg_print(NULL);
2625
2626
2627         /* Assume failure */
2628         *com_val = (-1);
2629
2630         /* Build the prompt */
2631         lo = I2A(i);
2632         hi = (j > 25) ? toupper(I2A(j - 26)) : I2A(j);
2633 #ifdef JP
2634         (void)sprintf(out_val, "(%s:%c-%c, ESCで中断) %s",
2635                 (((cur_store_num == STORE_HOME) || (cur_store_num == STORE_MUSEUM)) ? "アイテム" : "商品"), 
2636                                   lo, hi, pmt);
2637 #else
2638         (void)sprintf(out_val, "(Items %c-%c, ESC to exit) %s",
2639                                   lo, hi, pmt);
2640 #endif
2641
2642
2643         /* Ask until done */
2644         while (TRUE)
2645         {
2646                 COMMAND_CODE k;
2647
2648                 /* Escape */
2649                 if (!get_com(out_val, &command, FALSE)) break;
2650
2651                 /* Convert */
2652                 if (islower(command))
2653                         k = A2I(command);
2654                 else if (isupper(command))
2655                         k = A2I(tolower(command)) + 26;
2656                 else
2657                         k = -1;
2658
2659                 /* Legal responses */
2660                 if ((k >= i) && (k <= j))
2661                 {
2662                         *com_val = k;
2663                         break;
2664                 }
2665
2666                 bell();
2667         }
2668
2669         /* Clear the prompt */
2670         prt("", 0, 0);
2671
2672         /* Cancel */
2673         if (command == ESCAPE) return (FALSE);
2674
2675         repeat_push(*com_val);
2676
2677         /* Success */
2678         return (TRUE);
2679 }
2680
2681
2682 /*!
2683  * @brief 店主の不満度を増やし、プレイヤーを締め出す判定と処理を行う /
2684  * Increase the insult counter and get angry if too many -RAK-
2685  * @return プレイヤーを締め出す場合TRUEを返す
2686  */
2687 static int increase_insults(void)
2688 {
2689         /* Increase insults */
2690         st_ptr->insult_cur++;
2691
2692         /* Become insulted */
2693         if (st_ptr->insult_cur > ot_ptr->insult_max)
2694         {
2695                 /* Complain */
2696                 say_comment_4();
2697
2698                 /* Reset insults */
2699                 st_ptr->insult_cur = 0;
2700                 st_ptr->good_buy = 0;
2701                 st_ptr->bad_buy = 0;
2702
2703                 /* Open tomorrow */
2704                 st_ptr->store_open = turn + TURNS_PER_TICK*TOWN_DAWN/8 + randint1(TURNS_PER_TICK*TOWN_DAWN/8);
2705
2706                 /* Closed */
2707                 return (TRUE);
2708         }
2709
2710         /* Not closed */
2711         return (FALSE);
2712 }
2713
2714
2715 /*!
2716  * @brief 店主の不満度を減らす /
2717  * Decrease insults                             -RAK-
2718  * @return プレイヤーを締め出す場合TRUEを返す
2719  */
2720 static void decrease_insults(void)
2721 {
2722         /* Decrease insults */
2723         if (st_ptr->insult_cur) st_ptr->insult_cur--;
2724 }
2725
2726
2727 /*!
2728  * @brief 店主の不満度が増えた場合のみのメッセージを表示する /
2729  * Have insulted while haggling                         -RAK-
2730  * @return プレイヤーを締め出す場合TRUEを返す
2731  */
2732 static int haggle_insults(void)
2733 {
2734         /* Increase insults */
2735         if (increase_insults()) return (TRUE);
2736
2737         /* Display and flush insult */
2738         say_comment_5();
2739
2740         /* Still okay */
2741         return (FALSE);
2742 }
2743
2744
2745 /*
2746  * Mega-Hack -- Enable "increments"
2747  */
2748 static bool allow_inc = FALSE;
2749
2750 /*
2751  * Mega-Hack -- Last "increment" during haggling
2752  */
2753 static s32b last_inc = 0L;
2754
2755
2756 /*!
2757  * @brief 交渉価格を確認と認証の是非を行う /
2758  * Get a haggle
2759  * @param pmt メッセージ
2760  * @param poffer 別途価格提示をした場合の値を返す参照ポインタ
2761  * @param price 現在の交渉価格
2762  * @param final 最終確定価格ならばTRUE
2763  * @return プレイヤーを締め出す場合TRUEを返す
2764  */
2765 static int get_haggle(cptr pmt, s32b *poffer, PRICE price, int final)
2766 {
2767         s32b            i;
2768
2769         cptr            p;
2770
2771         char                            buf[128];
2772         char            out_val[160];
2773
2774
2775         /* Clear old increment if necessary */
2776         if (!allow_inc) last_inc = 0L;
2777
2778
2779         /* Final offer */
2780         if (final)
2781         {
2782 #ifdef JP
2783                 sprintf(buf, "%s [承諾] ", pmt);
2784 #else
2785                 sprintf(buf, "%s [accept] ", pmt);
2786 #endif
2787
2788         }
2789
2790         /* Old (negative) increment, and not final */
2791         else if (last_inc < 0)
2792         {
2793 #ifdef JP
2794                 sprintf(buf, "%s [-$%ld] ", pmt, (long)(ABS(last_inc)));
2795 #else
2796                 sprintf(buf, "%s [-%ld] ", pmt, (long)(ABS(last_inc)));
2797 #endif
2798
2799         }
2800
2801         /* Old (positive) increment, and not final */
2802         else if (last_inc > 0)
2803         {
2804 #ifdef JP
2805                 sprintf(buf, "%s [+$%ld] ", pmt, (long)(ABS(last_inc)));
2806 #else
2807                 sprintf(buf, "%s [+%ld] ", pmt, (long)(ABS(last_inc)));
2808 #endif
2809
2810         }
2811
2812         /* Normal haggle */
2813         else
2814         {
2815                 sprintf(buf, "%s ", pmt);
2816         }
2817
2818
2819         /* Paranoia */
2820         msg_print(NULL);
2821
2822
2823         /* Ask until done */
2824         while (TRUE)
2825         {
2826                 bool res;
2827
2828                 /* Display prompt */
2829                 prt(buf, 0, 0);
2830
2831                 /* Default */
2832                 strcpy(out_val, "");
2833
2834                 /*
2835                  * Ask the user for a response.
2836                  * Don't allow to use numpad as cursor key.
2837                  */
2838                 res = askfor_aux(out_val, 32, FALSE);
2839
2840                 /* Clear prompt */
2841                 prt("", 0, 0);
2842
2843                 /* Cancelled */
2844                 if (!res) return FALSE;
2845
2846                 /* Skip leading spaces */
2847                 for (p = out_val; *p == ' '; p++) /* loop */;
2848
2849                 /* Empty response */
2850                 if (*p == '\0')
2851                 {
2852                         /* Accept current price */
2853                         if (final)
2854                         {
2855                                 *poffer = price;
2856                                 last_inc = 0L;
2857                                 break;
2858                         }
2859
2860                         /* Use previous increment */
2861                         if (allow_inc && last_inc)
2862                         {
2863                                 *poffer += last_inc;
2864                                 break;
2865                         }
2866                 }
2867
2868                 /* Normal response */
2869                 else
2870                 {
2871                         /* Extract a number */
2872                         i = atol(p);
2873
2874                         /* Handle "incremental" number */
2875                         if ((*p == '+' || *p == '-'))
2876                         {
2877                                 /* Allow increments */
2878                                 if (allow_inc)
2879                                 {
2880                                         /* Use the given "increment" */
2881                                         *poffer += i;
2882                                         last_inc = i;
2883                                         break;
2884                                 }
2885                         }
2886
2887                         /* Handle normal number */
2888                         else
2889                         {
2890                                 /* Use the given "number" */
2891                                 *poffer = i;
2892                                 last_inc = 0L;
2893                                 break;
2894                         }
2895                 }
2896
2897                 /* Warning */
2898 #ifdef JP
2899                 msg_print("値がおかしいです。");
2900 #else
2901                 msg_print("Invalid response.");
2902 #endif
2903
2904                 msg_print(NULL);
2905         }
2906
2907         /* Success */
2908         return (TRUE);
2909 }
2910
2911
2912 /*!
2913  * @brief 店主がプレイヤーからの交渉価格を判断する /
2914  * Receive an offer (from the player)
2915  * @param pmt メッセージ
2916  * @param poffer 店主からの交渉価格を返す参照ポインタ
2917  * @param last_offer 現在の交渉価格
2918  * @param factor 店主の価格基準倍率
2919  * @param price アイテムの実価値
2920  * @param final 最終価格確定ならばTRUE
2921  * @return プレイヤーの価格に対して不服ならばTRUEを返す /
2922  * Return TRUE if offer is NOT okay
2923  */
2924 static bool receive_offer(cptr pmt, s32b *poffer,
2925                           s32b last_offer, int factor,
2926                           PRICE price, int final)
2927 {
2928         /* Haggle till done */
2929         while (TRUE)
2930         {
2931                 /* Get a haggle (or cancel) */
2932                 if (!get_haggle(pmt, poffer, price, final)) return (TRUE);
2933
2934                 /* Acceptable offer */
2935                 if (((*poffer) * factor) >= (last_offer * factor)) break;
2936
2937                 /* Insult, and check for kicked out */
2938                 if (haggle_insults()) return (TRUE);
2939
2940                 /* Reject offer (correctly) */
2941                 (*poffer) = last_offer;
2942         }
2943
2944         /* Success */
2945         return (FALSE);
2946 }
2947
2948
2949 /*!
2950  * @brief プレイヤーが購入する時の値切り処理メインルーチン /
2951  * Haggling routine                             -RAK-
2952  * @param o_ptr オブジェクトの構造体参照ポインタ
2953  * @param price 最終価格を返す参照ポインタ
2954  * @return プレイヤーの価格に対して店主が不服ならばTRUEを返す /
2955  * Return TRUE if purchase is NOT successful
2956  */
2957 static bool purchase_haggle(object_type *o_ptr, s32b *price)
2958 {
2959         s32b                       cur_ask, final_ask;
2960         s32b                       last_offer, offer;
2961         s32b                       x1, x2, x3;
2962         s32b                       min_per, max_per;
2963         int                        flag, loop_flag, noneed;
2964         int                        annoyed = 0, final = FALSE;
2965
2966         bool            cancel = FALSE;
2967
2968 #ifdef JP
2969         cptr pmt = "提示価格";
2970 #else
2971         cptr            pmt = "Asking";
2972 #endif
2973
2974
2975         char            out_val[160];
2976
2977
2978         *price = 0;
2979
2980
2981         /* Extract the starting offer and the final offer */
2982         cur_ask = price_item(o_ptr, ot_ptr->max_inflate, FALSE);
2983         final_ask = price_item(o_ptr, ot_ptr->min_inflate, FALSE);
2984
2985         /* Determine if haggling is necessary */
2986         noneed = noneedtobargain(final_ask);
2987
2988         /* No need to haggle */
2989         if (noneed || !manual_haggle)
2990         {
2991                 /* No need to haggle */
2992                 if (noneed)
2993                 {
2994                         /* Message summary */
2995 #ifdef JP
2996                         msg_print("結局この金額にまとまった。");
2997 #else
2998                         msg_print("You eventually agree upon the price.");
2999 #endif
3000
3001                         msg_print(NULL);
3002                 }
3003
3004                 /* No haggle option */
3005                 else
3006                 {
3007                         /* Message summary */
3008 #ifdef JP
3009                         msg_print("すんなりとこの金額にまとまった。");
3010 #else
3011                         msg_print("You quickly agree upon the price.");
3012 #endif
3013
3014                         msg_print(NULL);
3015
3016                         /* Apply Sales Tax */
3017                         final_ask += final_ask / 10;
3018                 }
3019
3020                 /* Final price */
3021                 cur_ask = final_ask;
3022
3023                 /* Go to final offer */
3024 #ifdef JP
3025                 pmt = "最終提示価格";
3026 #else
3027                 pmt = "Final Offer";
3028 #endif
3029
3030                 final = TRUE;
3031         }
3032
3033
3034         /* Haggle for the whole pile */
3035         cur_ask *= o_ptr->number;
3036         final_ask *= o_ptr->number;
3037
3038
3039         /* Haggle parameters */
3040         min_per = ot_ptr->haggle_per;
3041         max_per = min_per * 3;
3042
3043         /* Mega-Hack -- artificial "last offer" value */
3044         last_offer = object_value(o_ptr) * o_ptr->number;
3045         last_offer = last_offer * (200 - (int)(ot_ptr->max_inflate)) / 100L;
3046         if (last_offer <= 0) last_offer = 1;
3047
3048         /* No offer yet */
3049         offer = 0;
3050
3051         /* No incremental haggling yet */
3052         allow_inc = FALSE;
3053
3054         /* Haggle until done */
3055         for (flag = FALSE; !flag; )
3056         {
3057                 loop_flag = TRUE;
3058
3059                 while (!flag && loop_flag)
3060                 {
3061                         (void)sprintf(out_val, "%s :  %ld", pmt, (long)cur_ask);
3062                         put_str(out_val, 1, 0);
3063 #ifdef JP
3064                         cancel = receive_offer("提示する金額? ",
3065 #else
3066                         cancel = receive_offer("What do you offer? ",
3067 #endif
3068
3069                                                &offer, last_offer, 1, cur_ask, final);
3070
3071                         if (cancel)
3072                         {
3073                                 flag = TRUE;
3074                         }
3075                         else if (offer > cur_ask)
3076                         {
3077                                 say_comment_6();
3078                                 offer = last_offer;
3079                         }
3080                         else if (offer == cur_ask)
3081                         {
3082                                 flag = TRUE;
3083                                 *price = offer;
3084                         }
3085                         else
3086                         {
3087                                 loop_flag = FALSE;
3088                         }
3089                 }
3090
3091                 if (!flag)
3092                 {
3093                         x1 = 100 * (offer - last_offer) / (cur_ask - last_offer);
3094                         if (x1 < min_per)
3095                         {
3096                                 if (haggle_insults())
3097                                 {
3098                                         flag = TRUE;
3099                                         cancel = TRUE;
3100                                 }
3101                         }
3102                         else if (x1 > max_per)
3103                         {
3104                                 x1 = x1 * 3 / 4;
3105                                 if (x1 < max_per) x1 = max_per;
3106                         }
3107                         x2 = rand_range(x1-2, x1+2);
3108                         x3 = ((cur_ask - offer) * x2 / 100L) + 1;
3109                         /* don't let the price go up */
3110                         if (x3 < 0) x3 = 0;
3111                         cur_ask -= x3;
3112
3113                         /* Too little */
3114                         if (cur_ask < final_ask)
3115                         {
3116                                 final = TRUE;
3117                                 cur_ask = final_ask;
3118 #ifdef JP
3119                                 pmt = "最終提示価格";
3120 #else
3121                                 pmt = "Final Offer";
3122 #endif
3123
3124                                 annoyed++;
3125                                 if (annoyed > 3)
3126                                 {
3127                                         (void)(increase_insults());
3128                                         cancel = TRUE;
3129                                         flag = TRUE;
3130                                 }
3131                         }
3132                         else if (offer >= cur_ask)
3133                         {
3134                                 flag = TRUE;
3135                                 *price = offer;
3136                         }
3137
3138                         if (!flag)
3139                         {
3140                                 last_offer = offer;
3141                                 allow_inc = TRUE;
3142                                 prt("", 1, 0);
3143 #ifdef JP
3144 (void)sprintf(out_val, "前回の提示金額: $%ld",
3145 #else
3146                                 (void)sprintf(out_val, "Your last offer: %ld",
3147 #endif
3148
3149                                                           (long)last_offer);
3150                                 put_str(out_val, 1, 39);
3151                                 say_comment_2(cur_ask, annoyed);
3152                         }
3153                 }
3154         }
3155
3156         /* Cancel */
3157         if (cancel) return (TRUE);
3158
3159         /* Update bargaining info */
3160         updatebargain(*price, final_ask, o_ptr->number);
3161
3162         /* Do not cancel */
3163         return (FALSE);
3164 }
3165
3166
3167 /*!
3168  * @brief プレイヤーが売却する時の値切り処理メインルーチン /
3169  * Haggling routine                             -RAK-
3170  * @param o_ptr オブジェクトの構造体参照ポインタ
3171  * @param price 最終価格を返す参照ポインタ
3172  * @return プレイヤーの価格に対して店主が不服ならばTRUEを返す /
3173  * Return TRUE if purchase is NOT successful
3174  */
3175 static bool sell_haggle(object_type *o_ptr, s32b *price)
3176 {
3177         s32b    purse, cur_ask, final_ask;
3178         s32b    last_offer = 0, offer = 0;
3179         s32b    x1, x2, x3;
3180         s32b    min_per, max_per;
3181         int     flag, loop_flag, noneed;
3182         int     annoyed = 0, final = FALSE;
3183         bool    cancel = FALSE;
3184 #ifdef JP
3185         cptr pmt = "提示金額";
3186 #else
3187         cptr    pmt = "Offer";
3188 #endif
3189
3190         char    out_val[160];
3191
3192
3193         *price = 0;
3194
3195
3196         /* Obtain the starting offer and the final offer */
3197         cur_ask = price_item(o_ptr, ot_ptr->max_inflate, TRUE);
3198         final_ask = price_item(o_ptr, ot_ptr->min_inflate, TRUE);
3199
3200         /* Determine if haggling is necessary */
3201         noneed = noneedtobargain(final_ask);
3202
3203         /* Get the owner's payout limit */
3204         purse = (s32b)(ot_ptr->max_cost);
3205
3206         /* No need to haggle */
3207         if (noneed || !manual_haggle || (final_ask >= purse))
3208         {
3209                 /* Apply Sales Tax (if needed) */
3210                 if (!manual_haggle && !noneed)
3211                 {
3212                         final_ask -= final_ask / 10;
3213                 }
3214
3215                 /* No reason to haggle */
3216                 if (final_ask >= purse)
3217                 {
3218 #ifdef JP
3219                         msg_print("即座にこの金額にまとまった。");
3220 #else
3221                         msg_print("You instantly agree upon the price.");
3222 #endif
3223
3224                         msg_print(NULL);
3225
3226                         /* Offer full purse */
3227                         final_ask = purse;
3228                 }
3229
3230                 /* No need to haggle */
3231                 else if (noneed)
3232                 {
3233 #ifdef JP
3234                         msg_print("結局この金額にまとまった。");
3235 #else
3236                         msg_print("You eventually agree upon the price.");
3237 #endif
3238
3239                         msg_print(NULL);
3240                 }
3241
3242                 /* No haggle option */
3243                 else
3244                 {
3245                         /* Message summary */
3246 #ifdef JP
3247                         msg_print("すんなりとこの金額にまとまった。");
3248 #else
3249                         msg_print("You quickly agree upon the price.");
3250 #endif
3251
3252                         msg_print(NULL);
3253                 }
3254
3255                 /* Final price */
3256                 cur_ask = final_ask;
3257
3258                 /* Final offer */
3259                 final = TRUE;
3260 #ifdef JP
3261                 pmt = "最終提示金額";
3262 #else
3263                 pmt = "Final Offer";
3264 #endif
3265
3266         }
3267
3268         /* Haggle for the whole pile */
3269         cur_ask *= o_ptr->number;
3270         final_ask *= o_ptr->number;
3271
3272
3273         /* Display commands */
3274
3275         /* Haggling parameters */
3276         min_per = ot_ptr->haggle_per;
3277         max_per = min_per * 3;
3278
3279         /* Mega-Hack -- artificial "last offer" value */
3280         last_offer = object_value(o_ptr) * o_ptr->number;
3281         last_offer = last_offer * ot_ptr->max_inflate / 100L;
3282
3283         /* No offer yet */
3284         offer = 0;
3285
3286         /* No incremental haggling yet */
3287         allow_inc = FALSE;
3288
3289         /* Haggle */
3290         for (flag = FALSE; !flag; )
3291         {
3292                 while (1)
3293                 {
3294                         loop_flag = TRUE;
3295
3296                         (void)sprintf(out_val, "%s :  %ld", pmt, (long)cur_ask);
3297                         put_str(out_val, 1, 0);
3298 #ifdef JP
3299                         cancel = receive_offer("提示する価格? ",
3300 #else
3301                         cancel = receive_offer("What price do you ask? ",
3302 #endif
3303
3304                                                                    &offer, last_offer, -1, cur_ask, final);
3305
3306                         if (cancel)
3307                         {
3308                                 flag = TRUE;
3309                         }
3310                         else if (offer < cur_ask)
3311                         {
3312                                 say_comment_6();
3313                                 /* rejected, reset offer for incremental haggling */
3314                                 offer = last_offer;
3315                         }
3316                         else if (offer == cur_ask)
3317                         {
3318                                 flag = TRUE;
3319                                 *price = offer;
3320                         }
3321                         else
3322                         {
3323                                 loop_flag = FALSE;
3324                         }
3325
3326                         /* Stop */
3327                         if (flag || !loop_flag) break;
3328                 }
3329
3330                 if (!flag)
3331                 {
3332                         x1 = 100 * (last_offer - offer) / (last_offer - cur_ask);
3333                         if (x1 < min_per)
3334                         {
3335                                 if (haggle_insults())
3336                                 {
3337                                         flag = TRUE;
3338                                         cancel = TRUE;
3339                                 }
3340                         }
3341                         else if (x1 > max_per)
3342                         {
3343                                 x1 = x1 * 3 / 4;
3344                                 if (x1 < max_per) x1 = max_per;
3345                         }
3346                         x2 = rand_range(x1-2, x1+2);
3347                         x3 = ((offer - cur_ask) * x2 / 100L) + 1;
3348                         /* don't let the price go down */
3349                         if (x3 < 0) x3 = 0;
3350                         cur_ask += x3;
3351
3352                         if (cur_ask > final_ask)
3353                         {
3354                                 cur_ask = final_ask;
3355                                 final = TRUE;
3356 #ifdef JP
3357                                 pmt = "最終提示金額";
3358 #else
3359                                 pmt = "Final Offer";
3360 #endif
3361
3362                                 annoyed++;
3363                                 if (annoyed > 3)
3364                                 {
3365                                         flag = TRUE;
3366 #ifdef JP
3367                                 /* 追加 $0 で買い取られてしまうのを防止 By FIRST*/
3368                                         cancel = TRUE;
3369 #endif
3370                                         (void)(increase_insults());
3371                                 }
3372                         }
3373                         else if (offer <= cur_ask)
3374                         {
3375                                 flag = TRUE;
3376                                 *price = offer;
3377                         }
3378
3379                         if (!flag)
3380                         {
3381                                 last_offer = offer;
3382                                 allow_inc = TRUE;
3383                                 prt("", 1, 0);
3384                                 (void)sprintf(out_val,
3385 #ifdef JP
3386                                               "前回の提示価格 $%ld", (long)last_offer);
3387 #else
3388                                                           "Your last bid %ld", (long)last_offer);
3389 #endif
3390
3391                                 put_str(out_val, 1, 39);
3392                                 say_comment_3(cur_ask, annoyed);
3393                         }
3394                 }
3395         }
3396
3397         /* Cancel */
3398         if (cancel) return (TRUE);
3399
3400         /* Update bargaining info */
3401         updatebargain(*price, final_ask, o_ptr->number);
3402
3403         /* Do not cancel */
3404         return (FALSE);
3405 }
3406
3407
3408 /*!
3409  * @brief 店からの購入処理のメインルーチン /
3410  * Buy an item from a store                     -RAK-
3411  * @return なし
3412  */
3413 static void store_purchase(void)
3414 {
3415         int i, choice;
3416         COMMAND_CODE item, item_new;
3417
3418         ITEM_NUMBER amt;
3419
3420         PRICE price, best;
3421
3422         object_type forge;
3423         object_type *j_ptr;
3424
3425         object_type *o_ptr;
3426
3427         char o_name[MAX_NLEN];
3428
3429         char out_val[160];
3430
3431         if (cur_store_num == STORE_MUSEUM)
3432         {
3433 #ifdef JP
3434                 msg_print("博物館から取り出すことはできません。");
3435 #else
3436                 msg_print("Museum.");
3437 #endif
3438                 return;
3439         }
3440
3441         /* Empty? */
3442         if (st_ptr->stock_num <= 0)
3443         {
3444                 if (cur_store_num == STORE_HOME)
3445 #ifdef JP
3446                         msg_print("我が家には何も置いてありません。");
3447 #else
3448                         msg_print("Your home is empty.");
3449 #endif
3450
3451                 else
3452 #ifdef JP
3453                         msg_print("現在商品の在庫を切らしています。");
3454 #else
3455                         msg_print("I am currently out of stock.");
3456 #endif
3457
3458                 return;
3459         }
3460
3461
3462         /* Find the number of objects on this and following pages */
3463         i = (st_ptr->stock_num - store_top);
3464
3465         /* And then restrict it to the current page */
3466         if (i > store_bottom) i = store_bottom;
3467
3468         /* Prompt */
3469 #ifdef JP
3470         /* ブラックマーケットの時は別のメッセージ */
3471         switch( cur_store_num ) {
3472                 case 7:
3473                         sprintf(out_val, "どのアイテムを取りますか? ");
3474                         break;
3475                 case 6:
3476                         sprintf(out_val, "どれ? ");
3477                         break;
3478                 default:
3479                         sprintf(out_val, "どの品物が欲しいんだい? ");
3480                         break;
3481         }
3482 #else
3483         if (cur_store_num == STORE_HOME)
3484         {
3485                 sprintf(out_val, "Which item do you want to take? ");
3486         }
3487         else
3488         {
3489                 sprintf(out_val, "Which item are you interested in? ");
3490         }
3491 #endif
3492
3493
3494         /* Get the item number to be bought */
3495         if (!get_stock(&item, out_val, 0, i - 1)) return;
3496
3497         /* Get the actual index */
3498         item = item + store_top;
3499
3500         /* Get the actual item */
3501         o_ptr = &st_ptr->stock[item];
3502
3503         /* Assume the player wants just one of them */
3504         amt = 1;
3505
3506         /* Get local object */
3507         j_ptr = &forge;
3508
3509         /* Get a copy of the object */
3510         object_copy(j_ptr, o_ptr);
3511
3512         /*
3513          * If a rod or wand, allocate total maximum timeouts or charges
3514          * between those purchased and left on the shelf.
3515          */
3516         reduce_charges(j_ptr, o_ptr->number - amt);
3517
3518         /* Modify quantity */
3519         j_ptr->number = amt;
3520
3521         /* Hack -- require room in pack */
3522         if (!inven_carry_okay(j_ptr))
3523         {
3524 #ifdef JP
3525 msg_print("そんなにアイテムを持てない。");
3526 #else
3527                 msg_print("You cannot carry that many different items.");
3528 #endif
3529
3530                 return;
3531         }
3532
3533         /* Determine the "best" price (per item) */
3534         best = price_item(j_ptr, ot_ptr->min_inflate, FALSE);
3535
3536         /* Find out how many the player wants */
3537         if (o_ptr->number > 1)
3538         {
3539                 /* Hack -- note cost of "fixed" items */
3540                 if ((cur_store_num != STORE_HOME) &&
3541                     (o_ptr->ident & IDENT_FIXED))
3542                 {
3543 #ifdef JP
3544 msg_format("一つにつき $%ldです。", (long)(best));
3545 #else
3546                         msg_format("That costs %ld gold per item.", (long)(best));
3547 #endif
3548
3549                 }
3550
3551                 /* Get a quantity */
3552                 amt = get_quantity(NULL, o_ptr->number);
3553
3554                 /* Allow user abort */
3555                 if (amt <= 0) return;
3556         }
3557
3558         /* Get local object */
3559         j_ptr = &forge;
3560
3561         /* Get desired object */
3562         object_copy(j_ptr, o_ptr);
3563
3564         /*
3565          * If a rod or wand, allocate total maximum timeouts or charges
3566          * between those purchased and left on the shelf.
3567          */
3568         reduce_charges(j_ptr, o_ptr->number - amt);
3569
3570         /* Modify quantity */
3571         j_ptr->number = amt;
3572
3573         /* Hack -- require room in pack */
3574         if (!inven_carry_okay(j_ptr))
3575         {
3576 #ifdef JP
3577                 msg_print("ザックにそのアイテムを入れる隙間がない。");
3578 #else
3579                 msg_print("You cannot carry that many items.");
3580 #endif
3581
3582                 return;
3583         }
3584
3585         /* Attempt to buy it */
3586         if (cur_store_num != STORE_HOME)
3587         {
3588                 /* Fixed price, quick buy */
3589                 if (o_ptr->ident & (IDENT_FIXED))
3590                 {
3591                         /* Assume accept */
3592                         choice = 0;
3593
3594                         /* Go directly to the "best" deal */
3595                         price = (best * j_ptr->number);
3596                 }
3597
3598                 /* Haggle for it */
3599                 else
3600                 {
3601                         /* Describe the object (fully) */
3602                         object_desc(o_name, j_ptr, 0);
3603
3604 #ifdef JP
3605                         msg_format("%s(%c)を購入する。", o_name, I2A(item));
3606 #else
3607                         msg_format("Buying %s (%c).", o_name, I2A(item));
3608 #endif
3609
3610                         msg_print(NULL);
3611
3612                         /* Haggle for a final price */
3613                         choice = purchase_haggle(j_ptr, &price);
3614
3615                         /* Hack -- Got kicked out */
3616                         if (st_ptr->store_open >= turn) return;
3617                 }
3618
3619                 /* Player wants it */
3620                 if (choice == 0)
3621                 {
3622                         /* Fix the item price (if "correctly" haggled) */
3623                         if (price == (best * j_ptr->number)) o_ptr->ident |= (IDENT_FIXED);
3624
3625                         /* Player can afford it */
3626                         if (p_ptr->au >= price)
3627                         {
3628                                 /* Say "okay" */
3629                                 say_comment_1();
3630
3631                                 if (cur_store_num == STORE_BLACK) /* The black market is illegal! */
3632                                         chg_virtue(V_JUSTICE, -1);
3633                                 if((o_ptr->tval == TV_BOTTLE) && (cur_store_num != STORE_HOME))
3634                                         chg_virtue(V_NATURE, -1);
3635
3636                                 /* Make a sound */
3637                                 sound(SOUND_BUY);
3638
3639                                 /* Be happy */
3640                                 decrease_insults();
3641
3642                                 /* Spend the money */
3643                                 p_ptr->au -= price;
3644
3645                                 /* Update the display */
3646                                 store_prt_gold();
3647
3648                                 /* Hack -- buying an item makes you aware of it */
3649                                 object_aware(j_ptr);
3650
3651                                 /* Hack -- clear the "fixed" flag from the item */
3652                                 j_ptr->ident &= ~(IDENT_FIXED);
3653
3654                                 /* Describe the transaction */
3655                                 object_desc(o_name, j_ptr, 0);
3656
3657 #ifdef JP
3658 msg_format("%sを $%ldで購入しました。", o_name, (long)price);
3659 #else
3660                                 msg_format("You bought %s for %ld gold.", o_name, (long)price);
3661 #endif
3662
3663                                 strcpy(record_o_name, o_name);
3664                                 record_turn = turn;
3665
3666                                 if (record_buy) do_cmd_write_nikki(NIKKI_BUY, 0, o_name);
3667                                 object_desc(o_name, o_ptr, OD_NAME_ONLY);
3668                                 if(record_rand_art && o_ptr->art_name)
3669                                         do_cmd_write_nikki(NIKKI_ART, 0, o_name);
3670
3671                                 /* Erase the inscription */
3672                                 j_ptr->inscription = 0;
3673
3674                                 /* Erase the "feeling" */
3675                                 j_ptr->feeling = FEEL_NONE;
3676                                 j_ptr->ident &= ~(IDENT_STORE);
3677                                 /* Give it to the player */
3678                                 item_new = inven_carry(j_ptr);
3679
3680                                 /* Describe the final result */
3681                                 object_desc(o_name, &inventory[item_new], 0);
3682
3683 #ifdef JP
3684                                 msg_format("%s(%c)を手に入れた。", o_name, index_to_label(item_new));
3685 #else
3686                                 msg_format("You have %s (%c).",
3687                                                    o_name, index_to_label(item_new));
3688 #endif
3689
3690                                 /* Auto-inscription */
3691                                 autopick_alter_item(item_new, FALSE);
3692
3693                                 /* Now, reduce the original stack's pval. */
3694                                 if ((o_ptr->tval == TV_ROD) || (o_ptr->tval == TV_WAND))
3695                                 {
3696                                         o_ptr->pval -= j_ptr->pval;
3697                                 }
3698
3699                                 /* Handle stuff */
3700                                 handle_stuff();
3701
3702                                 /* Note how many slots the store used to have */
3703                                 i = st_ptr->stock_num;
3704
3705                                 /* Remove the bought items from the store */
3706                                 store_item_increase(item, -amt);
3707                                 store_item_optimize(item);
3708
3709                                 /* Store is empty */
3710                                 if (st_ptr->stock_num == 0)
3711                                 {
3712                                         /* Shuffle */
3713                                         if (one_in_(STORE_SHUFFLE))
3714                                         {
3715                                                 char buf[80];
3716 #ifdef JP
3717                                                 msg_print("店主は引退した。");
3718 #else
3719                                                 msg_print("The shopkeeper retires.");
3720 #endif
3721
3722
3723                                                 /* Shuffle the store */
3724                                                 store_shuffle(cur_store_num);
3725
3726                                                 prt("",3,0);
3727                                                 sprintf(buf, "%s (%s)",
3728                                                         ot_ptr->owner_name, race_info[ot_ptr->owner_race].title);
3729                                                 put_str(buf, 3, 10);
3730                                                 sprintf(buf, "%s (%ld)",
3731                                                         (f_name + f_info[cur_store_feat].name), (long)(ot_ptr->max_cost));
3732                                                 prt(buf, 3, 50);
3733                                         }
3734
3735                                         /* Maintain */
3736                                         else
3737                                         {
3738 #ifdef JP
3739                                                 msg_print("店主は新たな在庫を取り出した。");
3740 #else
3741                                                 msg_print("The shopkeeper brings out some new stock.");
3742 #endif
3743
3744                                         }
3745
3746                                         /* New inventory */
3747                                         for (i = 0; i < 10; i++)
3748                                         {
3749                                                 /* Maintain the store */
3750                                                 store_maint(p_ptr->town_num, cur_store_num);
3751                                         }
3752
3753                                         /* Start over */
3754                                         store_top = 0;
3755
3756                                         /* Redraw everything */
3757                                         display_inventory();
3758                                 }
3759
3760                                 /* The item is gone */
3761                                 else if (st_ptr->stock_num != i)
3762                                 {
3763                                         /* Pick the correct screen */
3764                                         if (store_top >= st_ptr->stock_num) store_top -= store_bottom;
3765
3766                                         /* Redraw everything */
3767                                         display_inventory();
3768                                 }
3769
3770                                 /* Item is still here */
3771                                 else
3772                                 {
3773                                         /* Redraw the item */
3774                                         display_entry(item);
3775                                 }
3776                         }
3777
3778                         /* Player cannot afford it */
3779                         else
3780                         {
3781                                 /* Simple message (no insult) */
3782 #ifdef JP
3783                                 msg_print("お金が足りません。");
3784 #else
3785                                 msg_print("You do not have enough gold.");
3786 #endif
3787
3788                         }
3789                 }
3790         }
3791
3792         /* Home is much easier */
3793         else
3794         {
3795                 bool combined_or_reordered;
3796
3797                 /* Distribute charges of wands/rods */
3798                 distribute_charges(o_ptr, j_ptr, amt);
3799
3800                 /* Give it to the player */
3801                 item_new = inven_carry(j_ptr);
3802
3803                 /* Describe just the result */
3804                 object_desc(o_name, &inventory[item_new], 0);
3805
3806 #ifdef JP
3807                 msg_format("%s(%c)を取った。",
3808 #else
3809                 msg_format("You have %s (%c).",
3810 #endif
3811  o_name, index_to_label(item_new));
3812
3813                 /* Handle stuff */
3814                 handle_stuff();
3815
3816                 /* Take note if we take the last one */
3817                 i = st_ptr->stock_num;
3818
3819                 /* Remove the items from the home */
3820                 store_item_increase(item, -amt);
3821                 store_item_optimize(item);
3822
3823                 combined_or_reordered = combine_and_reorder_home(STORE_HOME);
3824
3825                 /* Hack -- Item is still here */
3826                 if (i == st_ptr->stock_num)
3827                 {
3828                         /* Redraw everything */
3829                         if (combined_or_reordered) display_inventory();
3830
3831                         /* Redraw the item */
3832                         else display_entry(item);
3833                 }
3834
3835                 /* The item is gone */
3836                 else
3837                 {
3838                         /* Nothing left */
3839                         if (st_ptr->stock_num == 0) store_top = 0;
3840
3841                         /* Nothing left on that screen */
3842                         else if (store_top >= st_ptr->stock_num) store_top -= store_bottom;
3843
3844                         /* Redraw everything */
3845                         display_inventory();
3846
3847                         chg_virtue(V_SACRIFICE, 1);
3848                 }
3849         }
3850
3851         /* Not kicked out */
3852         return;
3853 }
3854
3855
3856 /*!
3857  * @brief 店からの売却処理のメインルーチン /
3858  * Sell an item to the store (or home)
3859  * @return なし
3860  */
3861 static void store_sell(void)
3862 {
3863         int choice;
3864         OBJECT_IDX item;
3865         int item_pos;
3866         int amt;
3867
3868         PRICE price, value, dummy;
3869
3870         object_type forge;
3871         object_type *q_ptr;
3872
3873         object_type *o_ptr;
3874
3875         cptr q, s;
3876
3877         char o_name[MAX_NLEN];
3878
3879
3880         /* Prepare a prompt */
3881         if (cur_store_num == STORE_HOME)
3882 #ifdef JP
3883         q = "どのアイテムを置きますか? ";
3884 #else
3885                 q = "Drop which item? ";
3886 #endif
3887
3888         else if (cur_store_num == STORE_MUSEUM)
3889 #ifdef JP
3890         q = "どのアイテムを寄贈しますか? ";
3891 #else
3892                 q = "Give which item? ";
3893 #endif
3894
3895         else
3896 #ifdef JP
3897                 q = "どのアイテムを売りますか? ";
3898 #else
3899                 q = "Sell which item? ";
3900 #endif
3901
3902
3903         item_tester_no_ryoute = TRUE;
3904         /* Only allow items the store will buy */
3905         item_tester_hook = store_will_buy;
3906
3907         /* 我が家でおかしなメッセージが出るオリジナルのバグを修正 */
3908         if (cur_store_num == STORE_HOME)
3909         {
3910 #ifdef JP
3911                 s = "置けるアイテムを持っていません。";
3912 #else
3913                 s = "You don't have any item to drop.";
3914 #endif
3915         }
3916         else if (cur_store_num == STORE_MUSEUM)
3917         {
3918 #ifdef JP
3919                 s = "寄贈できるアイテムを持っていません。";
3920 #else
3921                 s = "You don't have any item to give.";
3922 #endif
3923         }
3924         else
3925         {
3926 #ifdef JP
3927                 s = "欲しい物がないですねえ。";
3928 #else
3929                 s = "You have nothing that I want.";
3930 #endif
3931         }
3932
3933         if (!get_item(&item, q, s, (USE_EQUIP | USE_INVEN | USE_FLOOR))) return;
3934
3935         /* Get the item (in the pack) */
3936         if (item >= 0)
3937         {
3938                 o_ptr = &inventory[item];
3939         }
3940
3941         /* Get the item (on the floor) */
3942         else
3943         {
3944                 o_ptr = &o_list[0 - item];
3945         }
3946
3947
3948         /* Hack -- Cannot remove cursed items */
3949         if ((item >= INVEN_RARM) && object_is_cursed(o_ptr))
3950         {
3951 #ifdef JP
3952                 msg_print("ふーむ、どうやらそれは呪われているようだね。");
3953 #else
3954                 msg_print("Hmmm, it seems to be cursed.");
3955 #endif
3956
3957
3958                 return;
3959         }
3960
3961
3962         /* Assume one item */
3963         amt = 1;
3964
3965         /* Find out how many the player wants (letter means "all") */
3966         if (o_ptr->number > 1)
3967         {
3968                 /* Get a quantity */
3969                 amt = get_quantity(NULL, o_ptr->number);
3970
3971                 /* Allow user abort */
3972                 if (amt <= 0) return;
3973         }
3974
3975         /* Get local object */
3976         q_ptr = &forge;
3977
3978         /* Get a copy of the object */
3979         object_copy(q_ptr, o_ptr);
3980
3981         /* Modify quantity */
3982         q_ptr->number = amt;
3983
3984         /*
3985          * Hack -- If a rod or wand, allocate total maximum
3986          * timeouts or charges to those being sold. -LM-
3987          */
3988         if ((o_ptr->tval == TV_ROD) || (o_ptr->tval == TV_WAND))
3989         {
3990                 q_ptr->pval = o_ptr->pval * amt / o_ptr->number;
3991         }
3992
3993         /* Get a full description */
3994         object_desc(o_name, q_ptr, 0);
3995
3996         /* Remove any inscription, feeling for stores */
3997         if ((cur_store_num != STORE_HOME) && (cur_store_num != STORE_MUSEUM))
3998         {
3999                 q_ptr->inscription = 0;
4000                 q_ptr->feeling = FEEL_NONE;
4001         }
4002
4003         /* Is there room in the store (or the home?) */
4004         if (!store_check_num(q_ptr))
4005         {
4006                 if (cur_store_num == STORE_HOME)
4007 #ifdef JP
4008                         msg_print("我が家にはもう置く場所がない。");
4009 #else
4010                         msg_print("Your home is full.");
4011 #endif
4012
4013                 else if (cur_store_num == STORE_MUSEUM)
4014 #ifdef JP
4015                         msg_print("博物館はもう満杯だ。");
4016 #else
4017                         msg_print("Museum is full.");
4018 #endif
4019
4020                 else
4021 #ifdef JP
4022                         msg_print("すいませんが、店にはもう置く場所がありません。");
4023 #else
4024                         msg_print("I have not the room in my store to keep it.");
4025 #endif
4026
4027                 return;
4028         }
4029
4030
4031         /* Real store */
4032         if ((cur_store_num != STORE_HOME) && (cur_store_num != STORE_MUSEUM))
4033         {
4034                 /* Describe the transaction */
4035 #ifdef JP
4036                 msg_format("%s(%c)を売却する。", o_name, index_to_label(item));
4037 #else
4038                 msg_format("Selling %s (%c).", o_name, index_to_label(item));
4039 #endif
4040
4041                 msg_print(NULL);
4042
4043                 /* Haggle for it */
4044                 choice = sell_haggle(q_ptr, &price);
4045
4046                 /* Kicked out */
4047                 if (st_ptr->store_open >= turn) return;
4048
4049                 /* Sold... */
4050                 if (choice == 0)
4051                 {
4052                         /* Say "okay" */
4053                         say_comment_1();
4054
4055                         /* Make a sound */
4056                         sound(SOUND_SELL);
4057
4058                         /* Be happy */
4059                         if (cur_store_num == STORE_BLACK) /* The black market is illegal! */
4060                                 chg_virtue(V_JUSTICE, -1);
4061
4062                         if((o_ptr->tval == TV_BOTTLE) && (cur_store_num != STORE_HOME))
4063                                 chg_virtue(V_NATURE, 1);
4064                         decrease_insults();
4065
4066                         /* Get some money */
4067                         p_ptr->au += price;
4068
4069                         /* Update the display */
4070                         store_prt_gold();
4071
4072                         /* Get the "apparent" value */
4073                         dummy = object_value(q_ptr) * q_ptr->number;
4074
4075                         /* Identify it */
4076                         identify_item(o_ptr);
4077
4078                         /* Get local object */
4079                         q_ptr = &forge;
4080
4081                         /* Get a copy of the object */
4082                         object_copy(q_ptr, o_ptr);
4083
4084                         /* Modify quantity */
4085                         q_ptr->number = amt;
4086
4087                         /* Make it look like to be known */
4088                         q_ptr->ident |= IDENT_STORE;
4089
4090                         /*
4091                          * Hack -- If a rod or wand, let the shopkeeper know just
4092                          * how many charges he really paid for. -LM-
4093                          */
4094                         if ((o_ptr->tval == TV_ROD) || (o_ptr->tval == TV_WAND))
4095                         {
4096                                 q_ptr->pval = o_ptr->pval * amt / o_ptr->number;
4097                         }
4098
4099                         /* Get the "actual" value */
4100                         value = object_value(q_ptr) * q_ptr->number;
4101
4102                         /* Get the description all over again */
4103                         object_desc(o_name, q_ptr, 0);
4104
4105                         /* Describe the result (in message buffer) */
4106 #ifdef JP
4107 msg_format("%sを $%ldで売却しました。", o_name, (long)price);
4108 #else
4109                         msg_format("You sold %s for %ld gold.", o_name, (long)price);
4110 #endif
4111
4112                         if (record_sell) do_cmd_write_nikki(NIKKI_SELL, 0, o_name);
4113
4114                         if (!((o_ptr->tval == TV_FIGURINE) && (value > 0)))
4115                         {
4116                          /* Analyze the prices (and comment verbally) unless a figurine*/
4117                         purchase_analyze(price, value, dummy);
4118                         }
4119
4120                         /*
4121                          * Hack -- Allocate charges between those wands or rods sold
4122                          * and retained, unless all are being sold. -LM-
4123                          */
4124                         distribute_charges(o_ptr, q_ptr, amt);
4125
4126                         /* Reset timeouts of the sold items */
4127                         q_ptr->timeout = 0;
4128
4129                         /* Take the item from the player, describe the result */
4130                         inven_item_increase(item, -amt);
4131                         inven_item_describe(item);
4132
4133                         /* If items remain, auto-inscribe before optimizing */
4134                         if (o_ptr->number > 0)
4135                                 autopick_alter_item(item, FALSE);
4136
4137                         inven_item_optimize(item);
4138
4139                         /* Handle stuff */
4140                         handle_stuff();
4141
4142                         /* The store gets that (known) item */
4143                         item_pos = store_carry(q_ptr);
4144
4145                         /* Re-display if item is now in store */
4146                         if (item_pos >= 0)
4147                         {
4148                                 store_top = (item_pos / store_bottom) * store_bottom;
4149                                 display_inventory();
4150                         }
4151                 }
4152         }
4153
4154         /* Player is at museum */
4155         else if (cur_store_num == STORE_MUSEUM)
4156         {
4157                 char o2_name[MAX_NLEN];
4158                 object_desc(o2_name, q_ptr, OD_NAME_ONLY);
4159
4160                 if (-1 == store_check_num(q_ptr))
4161                 {
4162 #ifdef JP
4163                         msg_print("それと同じ品物は既に博物館にあるようです。");
4164 #else
4165                         msg_print("The same object as it is already in the Museum.");
4166 #endif
4167                 }
4168                 else
4169                 {
4170 #ifdef JP
4171                         msg_print("博物館に寄贈したものは取り出すことができません!!");
4172 #else
4173                         msg_print("You cannot take items which is given to the Museum back!!");
4174 #endif
4175                 }
4176 #ifdef JP
4177                 if (!get_check(format("本当に%sを寄贈しますか?", o2_name))) return;
4178 #else
4179                 if (!get_check(format("Really give %s to the Museum? ", o2_name))) return;
4180 #endif
4181
4182                 /* Identify it */
4183                 identify_item(q_ptr);
4184                 q_ptr->ident |= IDENT_MENTAL;
4185
4186                 /* Distribute charges of wands/rods */
4187                 distribute_charges(o_ptr, q_ptr, amt);
4188
4189                 /* Describe */
4190 #ifdef JP
4191                 msg_format("%sを置いた。(%c)", o_name, index_to_label(item));
4192 #else
4193                 msg_format("You drop %s (%c).", o_name, index_to_label(item));
4194 #endif
4195
4196                 choice = 0;
4197
4198                 /* Take it from the players inventory */
4199                 inven_item_increase(item, -amt);
4200                 inven_item_describe(item);
4201                 inven_item_optimize(item);
4202
4203                 /* Handle stuff */
4204                 handle_stuff();
4205
4206                 /* Let the home carry it */
4207                 item_pos = home_carry(q_ptr);
4208
4209                 /* Update store display */
4210                 if (item_pos >= 0)
4211                 {
4212                         store_top = (item_pos / store_bottom) * store_bottom;
4213                         display_inventory();
4214                 }
4215         }
4216         /* Player is at home */
4217         else
4218         {
4219                 /* Distribute charges of wands/rods */
4220                 distribute_charges(o_ptr, q_ptr, amt);
4221
4222                 /* Describe */
4223 #ifdef JP
4224                 msg_format("%sを置いた。(%c)", o_name, index_to_label(item));
4225 #else
4226                 msg_format("You drop %s (%c).", o_name, index_to_label(item));
4227 #endif
4228
4229                 choice = 0;
4230
4231                 /* Take it from the players inventory */
4232                 inven_item_increase(item, -amt);
4233                 inven_item_describe(item);
4234                 inven_item_optimize(item);
4235
4236                 /* Handle stuff */
4237                 handle_stuff();
4238
4239                 /* Let the home carry it */
4240                 item_pos = home_carry(q_ptr);
4241
4242                 /* Update store display */
4243                 if (item_pos >= 0)
4244                 {
4245                         store_top = (item_pos / store_bottom) * store_bottom;
4246                         display_inventory();
4247                 }
4248         }
4249
4250         if ((choice == 0) && (item >= INVEN_RARM))
4251         {
4252                 calc_android_exp();
4253                 kamaenaoshi(item);
4254         }
4255 }
4256
4257
4258 /*!
4259  * @brief 店のアイテムを調べるコマンドのメインルーチン /
4260  * Examine an item in a store                      -JDL-
4261  * @return なし
4262  */
4263 static void store_examine(void)
4264 {
4265         int         i;
4266         COMMAND_CODE item;
4267         object_type *o_ptr;
4268         char        o_name[MAX_NLEN];
4269         char        out_val[160];
4270
4271
4272         /* Empty? */
4273         if (st_ptr->stock_num <= 0)
4274         {
4275                 if (cur_store_num == STORE_HOME)
4276 #ifdef JP
4277                         msg_print("我が家には何も置いてありません。");
4278 #else
4279                         msg_print("Your home is empty.");
4280 #endif
4281
4282                 else if (cur_store_num == STORE_MUSEUM)
4283 #ifdef JP
4284                         msg_print("博物館には何も置いてありません。");
4285 #else
4286                         msg_print("Museum is empty.");
4287 #endif
4288
4289                 else
4290 #ifdef JP
4291                         msg_print("現在商品の在庫を切らしています。");
4292 #else
4293                         msg_print("I am currently out of stock.");
4294 #endif
4295
4296                 return;
4297         }
4298
4299
4300         /* Find the number of objects on this and following pages */
4301         i = (st_ptr->stock_num - store_top);
4302
4303         /* And then restrict it to the current page */
4304         if (i > store_bottom) i = store_bottom;
4305
4306         /* Prompt */
4307 #ifdef JP
4308 sprintf(out_val, "どれを調べますか?");
4309 #else
4310         sprintf(out_val, "Which item do you want to examine? ");
4311 #endif
4312
4313
4314         /* Get the item number to be examined */
4315         if (!get_stock(&item, out_val, 0, i - 1)) return;
4316
4317         /* Get the actual index */
4318         item = item + store_top;
4319
4320         /* Get the actual item */
4321         o_ptr = &st_ptr->stock[item];
4322
4323         /* Require full knowledge */
4324         if (!(o_ptr->ident & IDENT_MENTAL))
4325         {
4326                 /* This can only happen in the home */
4327 #ifdef JP
4328 msg_print("このアイテムについて特に知っていることはない。");
4329 #else
4330                 msg_print("You have no special knowledge about that item.");
4331 #endif
4332
4333                 return;
4334         }
4335
4336         /* Description */
4337         object_desc(o_name, o_ptr, 0);
4338
4339         /* Describe */
4340 #ifdef JP
4341 msg_format("%sを調べている...", o_name);
4342 #else
4343         msg_format("Examining %s...", o_name);
4344 #endif
4345
4346
4347         /* Describe it fully */
4348         if (!screen_object(o_ptr, SCROBJ_FORCE_DETAIL))
4349 #ifdef JP
4350 msg_print("特に変わったところはないようだ。");
4351 #else
4352                 msg_print("You see nothing special.");
4353 #endif
4354
4355
4356         return;
4357 }
4358
4359
4360 /*!
4361  * @brief 博物館のアイテムを除去するコマンドのメインルーチン /
4362  * Remove an item from museum (Originally from TOband)
4363  * @return なし
4364  */
4365 static void museum_remove_object(void)
4366 {
4367         int         i;
4368         COMMAND_CODE item;
4369         object_type *o_ptr;
4370         char        o_name[MAX_NLEN];
4371         char        out_val[160];
4372
4373         /* Empty? */
4374         if (st_ptr->stock_num <= 0)
4375         {
4376 #ifdef JP
4377                 msg_print("博物館には何も置いてありません。");
4378 #else
4379                 msg_print("Museum is empty.");
4380 #endif
4381
4382                 return;
4383         }
4384
4385         /* Find the number of objects on this and following pages */
4386         i = st_ptr->stock_num - store_top;
4387
4388         /* And then restrict it to the current page */
4389         if (i > store_bottom) i = store_bottom;
4390
4391         /* Prompt */
4392 #ifdef JP
4393         sprintf(out_val, "どのアイテムの展示をやめさせますか?");
4394 #else
4395         sprintf(out_val, "Which item do you want to order to remove? ");
4396 #endif
4397
4398         /* Get the item number to be removed */
4399         if (!get_stock(&item, out_val, 0, i - 1)) return;
4400
4401         /* Get the actual index */
4402         item = item + store_top;
4403
4404         /* Get the actual item */
4405         o_ptr = &st_ptr->stock[item];
4406
4407         /* Description */
4408         object_desc(o_name, o_ptr, 0);
4409
4410 #ifdef JP
4411         msg_print("展示をやめさせたアイテムは二度と見ることはできません!");
4412         if (!get_check(format("本当に%sの展示をやめさせますか?", o_name))) return;
4413 #else
4414         msg_print("You cannot see items which is removed from the Museum!");
4415         if (!get_check(format("Really order to remove %s from the Museum? ", o_name))) return;
4416 #endif
4417
4418 #ifdef JP
4419         msg_format("%sの展示をやめさせた。", o_name);
4420 #else
4421         msg_format("You ordered to remove %s.", o_name);
4422 #endif
4423
4424         /* Remove the items from the home */
4425         store_item_increase(item, -o_ptr->number);
4426         store_item_optimize(item);
4427
4428         (void)combine_and_reorder_home(STORE_MUSEUM);
4429
4430         /* The item is gone */
4431
4432         /* Nothing left */
4433         if (st_ptr->stock_num == 0) store_top = 0;
4434
4435         /* Nothing left on that screen */
4436         else if (store_top >= st_ptr->stock_num) store_top -= store_bottom;
4437
4438         /* Redraw everything */
4439         display_inventory();
4440
4441         return;
4442 }
4443
4444
4445 /*
4446  * Hack -- set this to leave the store
4447  */
4448 static bool leave_store = FALSE;
4449
4450
4451 /*!
4452  * @brief 店舗処理コマンド選択のメインルーチン /
4453  * Process a command in a store
4454  * @return なし
4455  * @note
4456  * <pre>
4457  * Note that we must allow the use of a few "special" commands
4458  * in the stores which are not allowed in the dungeon, and we
4459  * must disable some commands which are allowed in the dungeon
4460  * but not in the stores, to prevent chaos.
4461  * </pre>
4462  */
4463 static void store_process_command(void)
4464 {
4465         /* Handle repeating the last command */
4466         repeat_check();
4467
4468         if (rogue_like_commands && command_cmd == 'l')
4469         {
4470                 command_cmd = 'x';      /* hack! */
4471         }
4472
4473         /* Parse the command */
4474         switch (command_cmd)
4475         {
4476                 /* Leave */
4477                 case ESCAPE:
4478                 {
4479                         leave_store = TRUE;
4480                         break;
4481                 }
4482
4483                 /* 日本語版追加 */
4484                 /* 1 ページ戻るコマンド: 我が家のページ数が多いので重宝するはず By BUG */
4485                 case '-':
4486                 {
4487                         if (st_ptr->stock_num <= store_bottom) {
4488 #ifdef JP
4489                                 msg_print("これで全部です。");
4490 #else
4491                                 msg_print("Entire inventory is shown.");
4492 #endif
4493                         }
4494                         else{
4495                                 store_top -= store_bottom;
4496                                 if ( store_top < 0 )
4497                                         store_top = ((st_ptr->stock_num - 1 )/store_bottom) * store_bottom;
4498                                 if ( (cur_store_num == STORE_HOME) && (powerup_home == FALSE) )
4499                                         if ( store_top >= store_bottom ) store_top = store_bottom;
4500                                 display_inventory();
4501                         }
4502                         break;
4503                 }
4504
4505                 /* Browse */
4506                 case ' ':
4507                 {
4508                         if (st_ptr->stock_num <= store_bottom)
4509                         {
4510 #ifdef JP
4511                                 msg_print("これで全部です。");
4512 #else
4513                                 msg_print("Entire inventory is shown.");
4514 #endif
4515
4516                         }
4517                         else
4518                         {
4519                                 store_top += store_bottom;
4520                                 /*
4521                                  * 隠しオプション(powerup_home)がセットされていないときは
4522                                  * 我が家では 2 ページまでしか表示しない
4523                                  */
4524                                 if ((cur_store_num == STORE_HOME) && 
4525                                     (powerup_home == FALSE) && 
4526                                         (st_ptr->stock_num >= STORE_INVEN_MAX))
4527                                 {
4528                                         if (store_top >= (STORE_INVEN_MAX - 1))
4529                                         {
4530                                                 store_top = 0;
4531                                         }
4532                                 }
4533                                 else
4534                                 {
4535                                         if (store_top >= st_ptr->stock_num) store_top = 0;
4536                                 }
4537
4538                                 display_inventory();
4539                         }
4540                         break;
4541                 }
4542
4543                 /* Redraw */
4544                 case KTRL('R'):
4545                 {
4546                         do_cmd_redraw();
4547                         display_store();
4548                         break;
4549                 }
4550
4551                 /* Get (purchase) */
4552                 case 'g':
4553                 {
4554                         store_purchase();
4555                         break;
4556                 }
4557
4558                 /* Drop (Sell) */
4559                 case 'd':
4560                 {
4561                         store_sell();
4562                         break;
4563                 }
4564
4565                 /* Examine */
4566                 case 'x':
4567                 {
4568                         store_examine();
4569                         break;
4570                 }
4571
4572                 /* Ignore return */
4573                 case '\r':
4574                 {
4575                         break;
4576                 }
4577
4578                 /*** Inventory Commands ***/
4579
4580                 /* Wear/wield equipment */
4581                 case 'w':
4582                 {
4583                         do_cmd_wield();
4584                         break;
4585                 }
4586
4587                 /* Take off equipment */
4588                 case 't':
4589                 {
4590                         do_cmd_takeoff();
4591                         break;
4592                 }
4593
4594                 /* Destroy an item */
4595                 case 'k':
4596                 {
4597                         do_cmd_destroy();
4598                         break;
4599                 }
4600
4601                 /* Equipment list */
4602                 case 'e':
4603                 {
4604                         do_cmd_equip();
4605                         break;
4606                 }
4607
4608                 /* Inventory list */
4609                 case 'i':
4610                 {
4611                         do_cmd_inven();
4612                         break;
4613                 }
4614
4615
4616                 /*** Various commands ***/
4617
4618                 /* Identify an object */
4619                 case 'I':
4620                 {
4621                         do_cmd_observe();
4622                         break;
4623                 }
4624
4625                 /* Hack -- toggle windows */
4626                 case KTRL('I'):
4627                 {
4628                         toggle_inven_equip();
4629                         break;
4630                 }
4631
4632
4633
4634                 /*** Use various objects ***/
4635
4636                 /* Browse a book */
4637                 case 'b':
4638                 {
4639                         if ( (p_ptr->pclass == CLASS_MINDCRAFTER) ||
4640                              (p_ptr->pclass == CLASS_BERSERKER) ||
4641                              (p_ptr->pclass == CLASS_NINJA) ||
4642                              (p_ptr->pclass == CLASS_MIRROR_MASTER) 
4643                              ) do_cmd_mind_browse();
4644                         else if (p_ptr->pclass == CLASS_SMITH)
4645                                 do_cmd_kaji(TRUE);
4646                         else if (p_ptr->pclass == CLASS_MAGIC_EATER)
4647                                 do_cmd_magic_eater(TRUE, FALSE);
4648                         else if (p_ptr->pclass == CLASS_SNIPER)
4649                                 do_cmd_snipe_browse();
4650                         else do_cmd_browse();
4651                         break;
4652                 }
4653
4654                 /* Inscribe an object */
4655                 case '{':
4656                 {
4657                         do_cmd_inscribe();
4658                         break;
4659                 }
4660
4661                 /* Uninscribe an object */
4662                 case '}':
4663                 {
4664                         do_cmd_uninscribe();
4665                         break;
4666                 }
4667
4668
4669
4670                 /*** Help and Such ***/
4671
4672                 /* Help */
4673                 case '?':
4674                 {
4675                         do_cmd_help();
4676                         break;
4677                 }
4678
4679                 /* Identify symbol */
4680                 case '/':
4681                 {
4682                         do_cmd_query_symbol();
4683                         break;
4684                 }
4685
4686                 /* Character description */
4687                 case 'C':
4688                 {
4689                         p_ptr->town_num = old_town_num;
4690                         do_cmd_change_name();
4691                         p_ptr->town_num = inner_town_num;
4692                         display_store();
4693                         break;
4694                 }
4695
4696
4697                 /*** System Commands ***/
4698
4699                 /* Hack -- User interface */
4700                 case '!':
4701                 {
4702                         (void)Term_user(0);
4703                         break;
4704                 }
4705
4706                 /* Single line from a pref file */
4707                 case '"':
4708                 {
4709                         p_ptr->town_num = old_town_num;
4710                         do_cmd_pref();
4711                         p_ptr->town_num = inner_town_num;
4712                         break;
4713                 }
4714
4715                 /* Interact with macros */
4716                 case '@':
4717                 {
4718                         p_ptr->town_num = old_town_num;
4719                         do_cmd_macros();
4720                         p_ptr->town_num = inner_town_num;
4721                         break;
4722                 }
4723
4724                 /* Interact with visuals */
4725                 case '%':
4726                 {
4727                         p_ptr->town_num = old_town_num;
4728                         do_cmd_visuals();
4729                         p_ptr->town_num = inner_town_num;
4730                         break;
4731                 }
4732
4733                 /* Interact with colors */
4734                 case '&':
4735                 {
4736                         p_ptr->town_num = old_town_num;
4737                         do_cmd_colors();
4738                         p_ptr->town_num = inner_town_num;
4739                         break;
4740                 }
4741
4742                 /* Interact with options */
4743                 case '=':
4744                 {
4745                         do_cmd_options();
4746                         (void)combine_and_reorder_home(STORE_HOME);
4747                         do_cmd_redraw();
4748                         display_store();
4749                         break;
4750                 }
4751
4752                 /*** Misc Commands ***/
4753
4754                 /* Take notes */
4755                 case ':':
4756                 {
4757                         do_cmd_note();
4758                         break;
4759                 }
4760
4761                 /* Version info */
4762                 case 'V':
4763                 {
4764                         do_cmd_version();
4765                         break;
4766                 }
4767
4768                 /* Repeat level feeling */
4769                 case KTRL('F'):
4770                 {
4771                         do_cmd_feeling();
4772                         break;
4773                 }
4774
4775                 /* Show previous message */
4776                 case KTRL('O'):
4777                 {
4778                         do_cmd_message_one();
4779                         break;
4780                 }
4781
4782                 /* Show previous messages */
4783                 case KTRL('P'):
4784                 {
4785                         do_cmd_messages(0);
4786                         break;
4787                 }
4788
4789                 case '|':
4790                 {
4791                         do_cmd_nikki();
4792                         break;
4793                 }
4794
4795                 /* Check artifacts, uniques etc. */
4796                 case '~':
4797                 {
4798                         do_cmd_knowledge();
4799                         break;
4800                 }
4801
4802                 /* Load "screen dump" */
4803                 case '(':
4804                 {
4805                         do_cmd_load_screen();
4806                         break;
4807                 }
4808
4809                 /* Save "screen dump" */
4810                 case ')':
4811                 {
4812                         do_cmd_save_screen();
4813                         break;
4814                 }
4815
4816                 /* Hack -- Unknown command */
4817                 default:
4818                 {
4819                         if ((cur_store_num == STORE_MUSEUM) && (command_cmd == 'r'))
4820                         {
4821                                 museum_remove_object();
4822                         }
4823                         else
4824                         {
4825 #ifdef JP
4826                                 msg_print("そのコマンドは店の中では使えません。");
4827 #else
4828                                 msg_print("That command does not work in stores.");
4829 #endif
4830                         }
4831
4832                         break;
4833                 }
4834         }
4835 }
4836
4837
4838 /*!
4839  * @brief 店舗処理全体のメインルーチン /
4840  * Enter a store, and interact with it. *
4841  * @return なし
4842  * @note
4843  * <pre>
4844  * Note that we use the standard "request_command()" function
4845  * to get a command, allowing us to use "command_arg" and all
4846  * command macros and other nifty stuff, but we use the special
4847  * "shopping" argument, to force certain commands to be converted
4848  * into other commands, normally, we convert "p" (pray) and "m"
4849  * (cast magic) into "g" (get), and "s" (search) into "d" (drop).
4850  * </pre>
4851  */
4852 void do_cmd_store(void)
4853 {
4854         int         which;
4855         int         maintain_num;
4856         int         i;
4857         cave_type   *c_ptr;
4858         bool        need_redraw_store_inv; /* To redraw missiles damage and prices in store */
4859         int w, h;
4860
4861         /* Get term size */
4862         Term_get_size(&w, &h);
4863
4864         /* Calculate stocks per 1 page */
4865         xtra_stock = MIN(14+26, ((h > 24) ? (h - 24) : 0));
4866         store_bottom = MIN_STOCK + xtra_stock;
4867
4868         /* Access the player grid */
4869         c_ptr = &cave[p_ptr->y][p_ptr->x];
4870
4871         /* Verify a store */
4872         if (!cave_have_flag_grid(c_ptr, FF_STORE))
4873         {
4874 #ifdef JP
4875                 msg_print("ここには店がありません。");
4876 #else
4877                 msg_print("You see no store here.");
4878 #endif
4879
4880                 return;
4881         }
4882
4883         /* Extract the store code */
4884         which = f_info[c_ptr->feat].subtype;
4885
4886         old_town_num = p_ptr->town_num;
4887         if ((which == STORE_HOME) || (which == STORE_MUSEUM)) p_ptr->town_num = 1;
4888         if (dun_level) p_ptr->town_num = NO_TOWN;
4889         inner_town_num = p_ptr->town_num;
4890
4891         /* Hack -- Check the "locked doors" */
4892         if ((town[p_ptr->town_num].store[which].store_open >= turn) ||
4893             (ironman_shops))
4894         {
4895 #ifdef JP
4896                 msg_print("ドアに鍵がかかっている。");
4897 #else
4898                 msg_print("The doors are locked.");
4899 #endif
4900
4901                 p_ptr->town_num = old_town_num;
4902                 return;
4903         }
4904
4905         /* Calculate the number of store maintainances since the last visit */
4906         maintain_num = (turn - town[p_ptr->town_num].store[which].last_visit) / (TURNS_PER_TICK * STORE_TICKS);
4907
4908         /* Maintain the store max. 10 times */
4909         if (maintain_num > 10) maintain_num = 10;
4910
4911         if (maintain_num)
4912         {
4913                 /* Maintain the store */
4914                 for (i = 0; i < maintain_num; i++)
4915                         store_maint(p_ptr->town_num, which);
4916
4917                 /* Save the visit */
4918                 town[p_ptr->town_num].store[which].last_visit = turn;
4919         }
4920
4921         /* Forget the lite */
4922         forget_lite();
4923
4924         /* Forget the view */
4925         forget_view();
4926
4927
4928         /* Hack -- Character is in "icky" mode */
4929         character_icky = TRUE;
4930
4931
4932         /* No command argument */
4933         command_arg = 0;
4934
4935         /* No repeated command */
4936         command_rep = 0;
4937
4938         /* No automatic command */
4939         command_new = 0;
4940
4941         /* Do not expand macros */
4942         get_com_no_macros = TRUE;
4943
4944         /* Save the store number */
4945         cur_store_num = which;
4946
4947         /* Hack -- save the store feature */
4948         cur_store_feat = c_ptr->feat;
4949
4950         /* Save the store and owner pointers */
4951         st_ptr = &town[p_ptr->town_num].store[cur_store_num];
4952         ot_ptr = &owners[cur_store_num][st_ptr->owner];
4953
4954
4955         /* Start at the beginning */
4956         store_top = 0;
4957
4958         play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_BUILD);
4959
4960         /* Display the store */
4961         display_store();
4962
4963         /* Do not leave */
4964         leave_store = FALSE;
4965
4966         /* Interact with player */
4967         while (!leave_store)
4968         {
4969                 /* Hack -- Clear line 1 */
4970                 prt("", 1, 0);
4971
4972                 /* Clear */
4973                 clear_from(20 + xtra_stock);
4974
4975
4976                 /* Basic commands */
4977 #ifdef JP
4978                 prt(" ESC) 建物から出る", 21 + xtra_stock, 0);
4979 #else
4980                 prt(" ESC) Exit from Building.", 21 + xtra_stock, 0);
4981 #endif
4982
4983
4984                 /* Browse if necessary */
4985                 if (st_ptr->stock_num > store_bottom)
4986                 {
4987 #ifdef JP
4988                         prt(" -)前ページ", 22 + xtra_stock, 0);
4989                         prt(" スペース) 次ページ", 23 + xtra_stock, 0);
4990 #else
4991                         prt(" -) Previous page", 22 + xtra_stock, 0);
4992                         prt(" SPACE) Next page", 23 + xtra_stock, 0);
4993 #endif
4994
4995                 }
4996
4997                 /* Home commands */
4998                 if (cur_store_num == STORE_HOME)
4999                 {
5000 #ifdef JP
5001                         prt("g) アイテムを取る", 21 + xtra_stock, 27);
5002                         prt("d) アイテムを置く", 22 + xtra_stock, 27);
5003                         prt("x) 家のアイテムを調べる", 23 + xtra_stock, 27);
5004 #else
5005                         prt("g) Get an item.", 21 + xtra_stock, 27);
5006                         prt("d) Drop an item.", 22 + xtra_stock, 27);
5007                         prt("x) eXamine an item in the home.", 23 + xtra_stock, 27);
5008 #endif
5009                 }
5010
5011                 /* Museum commands */
5012                 else if (cur_store_num == STORE_MUSEUM)
5013                 {
5014 #ifdef JP
5015                         prt("d) アイテムを置く", 21 + xtra_stock, 27);
5016                         prt("r) アイテムの展示をやめる", 22 + xtra_stock, 27);
5017                         prt("x) 博物館のアイテムを調べる", 23 + xtra_stock, 27);
5018 #else
5019                         prt("d) Drop an item.", 21 + xtra_stock, 27);
5020                         prt("r) order to Remove an item.", 22 + xtra_stock, 27);
5021                         prt("x) eXamine an item in the museum.", 23 + xtra_stock, 27);
5022 #endif
5023                 }
5024
5025                 /* Shop commands */
5026                 else
5027                 {
5028 #ifdef JP
5029                         prt("p) 商品を買う", 21 + xtra_stock, 30);
5030                         prt("s) アイテムを売る", 22 + xtra_stock, 30);
5031                         prt("x) 商品を調べる", 23 + xtra_stock,30);
5032 #else
5033                         prt("p) Purchase an item.", 21 + xtra_stock, 30);
5034                         prt("s) Sell an item.", 22 + xtra_stock, 30);
5035                         prt("x) eXamine an item in the shop", 23 + xtra_stock,30);
5036 #endif
5037                 }
5038
5039 #ifdef JP
5040                 /* 基本的なコマンドの追加表示 */
5041
5042                 prt("i/e) 持ち物/装備の一覧", 21 + xtra_stock, 56);
5043
5044                 if (rogue_like_commands)
5045                 {
5046                         prt("w/T) 装備する/はずす", 22 + xtra_stock, 56);
5047                 }
5048                 else
5049                 {
5050                         prt("w/t) 装備する/はずす", 22 + xtra_stock, 56);
5051                 }
5052 #else
5053                 prt("i/e) Inventry/Equipment list", 21 + xtra_stock, 56);
5054
5055                 if (rogue_like_commands)
5056                 {
5057                         prt("w/T) Wear/Take off equipment", 22 + xtra_stock, 56);
5058                 }
5059                 else
5060                 {
5061                         prt("w/t) Wear/Take off equipment", 22 + xtra_stock, 56);
5062                 }
5063 #endif
5064                 /* Prompt */
5065 #ifdef JP
5066                 prt("コマンド:", 20 + xtra_stock, 0);
5067 #else
5068                 prt("You may: ", 20 + xtra_stock, 0);
5069 #endif
5070
5071
5072                 /* Get a command */
5073                 request_command(TRUE);
5074
5075                 /* Process the command */
5076                 store_process_command();
5077
5078                 /*
5079                  * Hack -- To redraw missiles damage and prices in store
5080                  * If player's charisma changes, or if player changes a bow, PU_BONUS is set
5081                  */
5082                 need_redraw_store_inv = (p_ptr->update & PU_BONUS) ? TRUE : FALSE;
5083
5084                 /* Hack -- Character is still in "icky" mode */
5085                 character_icky = TRUE;
5086
5087                 /* Notice stuff */
5088                 notice_stuff();
5089
5090                 /* Handle stuff */
5091                 handle_stuff();
5092
5093                 /* Pack Overflow */
5094                 if (inventory[INVEN_PACK].k_idx)
5095                 {
5096                         INVENTORY_IDX item = INVEN_PACK;
5097
5098                         object_type *o_ptr = &inventory[item];
5099
5100                         /* Hack -- Flee from the store */
5101                         if (cur_store_num != STORE_HOME)
5102                         {
5103 #ifdef JP
5104                                 if (cur_store_num == STORE_MUSEUM)
5105                                         msg_print("ザックからアイテムがあふれそうなので、あわてて博物館から出た...");
5106                                 else
5107                                         msg_print("ザックからアイテムがあふれそうなので、あわてて店から出た...");
5108 #else
5109                                 if (cur_store_num == STORE_MUSEUM)
5110                                         msg_print("Your pack is so full that you flee the Museum...");
5111                                 else
5112                                         msg_print("Your pack is so full that you flee the store...");
5113 #endif
5114
5115
5116                                 /* Leave */
5117                                 leave_store = TRUE;
5118                         }
5119
5120                         /* Hack -- Flee from the home */
5121                         else if (!store_check_num(o_ptr))
5122                         {
5123 #ifdef JP
5124                                 msg_print("ザックからアイテムがあふれそうなので、あわてて家から出た...");
5125 #else
5126                                 msg_print("Your pack is so full that you flee your home...");
5127 #endif
5128
5129
5130                                 /* Leave */
5131                                 leave_store = TRUE;
5132                         }
5133
5134                         /* Hack -- Drop items into the home */
5135                         else
5136                         {
5137                                 int item_pos;
5138
5139                                 object_type forge;
5140                                 object_type *q_ptr;
5141
5142                                 char o_name[MAX_NLEN];
5143
5144
5145                                 /* Give a message */
5146 #ifdef JP
5147                                 msg_print("ザックからアイテムがあふれてしまった!");
5148 #else
5149                                 msg_print("Your pack overflows!");
5150 #endif
5151
5152
5153                                 /* Get local object */
5154                                 q_ptr = &forge;
5155
5156                                 /* Grab a copy of the item */
5157                                 object_copy(q_ptr, o_ptr);
5158
5159                                 /* Describe it */
5160                                 object_desc(o_name, q_ptr, 0);
5161
5162 #ifdef JP
5163                                 msg_format("%sが落ちた。(%c)", o_name, index_to_label(item));
5164 #else
5165                                 msg_format("You drop %s (%c).", o_name, index_to_label(item));
5166 #endif
5167
5168
5169                                 /* Remove it from the players inventory */
5170                                 inven_item_increase(item, -255);
5171                                 inven_item_describe(item);
5172                                 inven_item_optimize(item);
5173
5174                                 /* Handle stuff */
5175                                 handle_stuff();
5176
5177                                 /* Let the home carry it */
5178                                 item_pos = home_carry(q_ptr);
5179
5180                                 /* Redraw the home */
5181                                 if (item_pos >= 0)
5182                                 {
5183                                         store_top = (item_pos / store_bottom) * store_bottom;
5184                                         display_inventory();
5185                                 }
5186                         }
5187                 }
5188
5189                 /* Hack -- Redisplay store prices if charisma changes */
5190                 /* Hack -- Redraw missiles damage if player changes bow */
5191                 if (need_redraw_store_inv) display_inventory();
5192
5193                 /* Hack -- get kicked out of the store */
5194                 if (st_ptr->store_open >= turn) leave_store = TRUE;
5195         }
5196
5197         select_floor_music();
5198
5199         p_ptr->town_num = old_town_num;
5200
5201         /* Free turn */
5202         p_ptr->energy_use = 100;
5203
5204
5205         /* Hack -- Character is no longer in "icky" mode */
5206         character_icky = FALSE;
5207
5208
5209         /* Hack -- Cancel automatic command */
5210         command_new = 0;
5211
5212         /* Hack -- Cancel "see" mode */
5213         command_see = FALSE;
5214
5215         /* Allow expanding macros */
5216         get_com_no_macros = FALSE;
5217
5218         /* Flush messages */
5219         msg_print(NULL);
5220
5221
5222         /* Clear the screen */
5223         Term_clear();
5224
5225
5226         /* Update everything */
5227         p_ptr->update |= (PU_VIEW | PU_LITE | PU_MON_LITE);
5228         p_ptr->update |= (PU_MONSTERS);
5229
5230         /* Redraw entire screen */
5231         p_ptr->redraw |= (PR_BASIC | PR_EXTRA | PR_EQUIPPY);
5232
5233         /* Redraw map */
5234         p_ptr->redraw |= (PR_MAP);
5235
5236         p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
5237 }
5238
5239
5240
5241 /*!
5242  * @brief 現在の町の店主を交代させる /
5243  * Shuffle one of the stores.
5244  * @param which 店舗種類のID
5245  * @return なし
5246  */
5247 void store_shuffle(int which)
5248 {
5249         int i, j;
5250
5251
5252         /* Ignore home */
5253         if (which == STORE_HOME) return;
5254         if (which == STORE_MUSEUM) return;
5255
5256
5257         /* Save the store index */
5258         cur_store_num = which;
5259
5260         /* Activate that store */
5261         st_ptr = &town[p_ptr->town_num].store[cur_store_num];
5262
5263         j = st_ptr->owner;
5264         /* Pick a new owner */
5265         while(1)
5266         {
5267                 st_ptr->owner = (byte)randint0(MAX_OWNERS);
5268                 if (j == st_ptr->owner) continue;
5269                 for (i = 1;i < max_towns; i++)
5270                 {
5271                         if (i == p_ptr->town_num) continue;
5272                         if (st_ptr->owner == town[i].store[cur_store_num].owner) break;
5273                 }
5274                 if (i == max_towns) break;
5275         }
5276
5277         /* Activate the new owner */
5278         ot_ptr = &owners[cur_store_num][st_ptr->owner];
5279
5280
5281         /* Reset the owner data */
5282         st_ptr->insult_cur = 0;
5283         st_ptr->store_open = 0;
5284         st_ptr->good_buy = 0;
5285         st_ptr->bad_buy = 0;
5286
5287
5288         /* Hack -- discount all the items */
5289         for (i = 0; i < st_ptr->stock_num; i++)
5290         {
5291                 object_type *o_ptr;
5292
5293                 o_ptr = &st_ptr->stock[i];
5294
5295                 if (!object_is_artifact(o_ptr))
5296                 {
5297                         /* Hack -- Sell all non-artifact old items for "half price" */
5298                         o_ptr->discount = 50;
5299
5300                         /* Hack -- Items are no longer "fixed price" */
5301                         o_ptr->ident &= ~(IDENT_FIXED);
5302
5303                         /* Mega-Hack -- Note that the item is "on sale" */
5304                         o_ptr->inscription = quark_add(_("売出中", "on sale"));
5305                 }
5306         }
5307 }
5308
5309
5310 /*!
5311  * @brief 店の品揃えを変化させる /
5312  * Maintain the inventory at the stores.
5313  * @param town_num 町のID
5314  * @param store_num 店舗種類のID
5315  * @return なし
5316  */
5317 void store_maint(int town_num, int store_num)
5318 {
5319         INVENTORY_IDX j;
5320
5321         cur_store_num = store_num;
5322
5323         /* Ignore home */
5324         if (store_num == STORE_HOME) return;
5325         if (store_num == STORE_MUSEUM) return;
5326
5327         /* Activate that store */
5328         st_ptr = &town[town_num].store[store_num];
5329
5330         /* Activate the owner */
5331         ot_ptr = &owners[store_num][st_ptr->owner];
5332
5333         /* Store keeper forgives the player */
5334         st_ptr->insult_cur = 0;
5335
5336         /* Mega-Hack -- prune the black market */
5337         if (store_num == STORE_BLACK)
5338         {
5339                 /* Destroy crappy black market items */
5340                 for (j = st_ptr->stock_num - 1; j >= 0; j--)
5341                 {
5342                         object_type *o_ptr = &st_ptr->stock[j];
5343
5344                         /* Destroy crappy items */
5345                         if (black_market_crap(o_ptr))
5346                         {
5347                                 /* Destroy the item */
5348                                 store_item_increase(j, 0 - o_ptr->number);
5349                                 store_item_optimize(j);
5350                         }
5351                 }
5352         }
5353
5354
5355         /* Choose the number of slots to keep */
5356         j = st_ptr->stock_num;
5357
5358         /* Sell a few items */
5359         j = j - randint1(STORE_TURNOVER);
5360
5361         /* Never keep more than "STORE_MAX_KEEP" slots */
5362         if (j > STORE_MAX_KEEP) j = STORE_MAX_KEEP;
5363
5364         /* Always "keep" at least "STORE_MIN_KEEP" items */
5365         if (j < STORE_MIN_KEEP) j = STORE_MIN_KEEP;
5366
5367         /* Hack -- prevent "underflow" */
5368         if (j < 0) j = 0;
5369
5370         /* Destroy objects until only "j" slots are left */
5371         while (st_ptr->stock_num > j) store_delete();
5372
5373
5374         /* Choose the number of slots to fill */
5375         j = st_ptr->stock_num;
5376
5377         /* Buy some more items */
5378         j = j + randint1(STORE_TURNOVER);
5379
5380         /* Never keep more than "STORE_MAX_KEEP" slots */
5381         if (j > STORE_MAX_KEEP) j = STORE_MAX_KEEP;
5382
5383         /* Always "keep" at least "STORE_MIN_KEEP" items */
5384         if (j < STORE_MIN_KEEP) j = STORE_MIN_KEEP;
5385
5386         /* Hack -- prevent "overflow" */
5387         if (j >= st_ptr->stock_size) j = st_ptr->stock_size - 1;
5388
5389         /* Acquire some new items */
5390         while (st_ptr->stock_num < j) store_create();
5391 }
5392
5393
5394 /*!
5395  * @brief 店舗情報を初期化する /
5396  * Initialize the stores
5397  * @param town_num 町のID
5398  * @param store_num 店舗種類のID
5399  * @return なし
5400  */
5401 void store_init(int town_num, int store_num)
5402 {
5403         int             k;
5404
5405         cur_store_num = store_num;
5406
5407         /* Activate that store */
5408         st_ptr = &town[town_num].store[store_num];
5409
5410
5411         /* Pick an owner */
5412         while(1)
5413         {
5414                 int i;
5415
5416                 st_ptr->owner = (byte)randint0(MAX_OWNERS);
5417                 for (i = 1;i < max_towns; i++)
5418                 {
5419                         if (i == town_num) continue;
5420                         if (st_ptr->owner == town[i].store[store_num].owner) break;
5421                 }
5422                 if (i == max_towns) break;
5423         }
5424
5425         /* Activate the new owner */
5426         ot_ptr = &owners[store_num][st_ptr->owner];
5427
5428
5429         /* Initialize the store */
5430         st_ptr->store_open = 0;
5431         st_ptr->insult_cur = 0;
5432         st_ptr->good_buy = 0;
5433         st_ptr->bad_buy = 0;
5434
5435         /* Nothing in stock */
5436         st_ptr->stock_num = 0;
5437
5438         /*
5439          * MEGA-HACK - Last visit to store is
5440          * BEFORE player birth to enable store restocking
5441          */
5442         st_ptr->last_visit = -10L * TURNS_PER_TICK * STORE_TICKS;
5443
5444         /* Clear any old items */
5445         for (k = 0; k < st_ptr->stock_size; k++)
5446         {
5447                 object_wipe(&st_ptr->stock[k]);
5448         }
5449 }
5450
5451
5452 /*!
5453  * @brief アイテムを町のブラックマーケットに移動させる /
5454  * @param o_ptr 移動させたいオブジェクトの構造体参照ポインタ
5455  * @return なし
5456  */
5457 void move_to_black_market(object_type *o_ptr)
5458 {
5459         /* Not in town */
5460         if (!p_ptr->town_num) return;
5461
5462         st_ptr = &town[p_ptr->town_num].store[STORE_BLACK];
5463
5464         o_ptr->ident |= IDENT_STORE;
5465
5466         (void)store_carry(o_ptr);
5467
5468         object_wipe(o_ptr); /* Don't leave a bogus object behind... */
5469 }
5470