OSDN Git Service

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