OSDN Git Service

[Refactor] #37353 CFM_* 定義を新規ファイル floor.h へ移動。 / Move CFM_* definition to floor.h.
[hengband/hengband.git] / src / bldg.c
1 /*!
2     @file bldg.c
3     @brief 町の施設処理 / Building commands
4     @date 2013/12/23
5     @author
6     Created by Ken Wigle for Kangband - a variant of Angband 2.8.3\n
7     -KMW-\n
8     \n
9     Rewritten for Kangband 2.8.3i using Kamband's version of\n
10     bldg.c as written by Ivan Tkatchev\n
11     \n
12     Changed for ZAngband by Robert Ruehlmann\n
13 */
14
15 #include "angband.h"
16 #include "floor.h"
17 #include "object-hook.h"
18 #include "monsterrace-hook.h"
19 #include "melee.h"
20 #include "world.h"
21 #include "sort.h"
22
23 /*!
24  * ループ中で / hack as in leave_store in store.c
25  */
26 static bool leave_bldg = FALSE;
27
28 /*!
29  * @brief 施設毎に設定された種族、職業、魔法領域フラグがプレイヤーと一致するかを判定する。
30  * @details 各種ギルドや寺院など、特定の職業ならば優遇措置を得られる施設、
31  * あるいは食堂など特定の種族では利用できない施設の判定処理を行う。
32  * @param bldg 施設構造体の参照ポインタ
33  * @return 種族、職業、魔法領域のいずれかが一致しているかの是非。
34  */
35 static bool is_owner(building_type *bldg)
36 {
37         if (bldg->member_class[p_ptr->pclass] == BUILDING_OWNER)
38         {
39                 return (TRUE);
40         }
41
42         if (bldg->member_race[p_ptr->prace] == BUILDING_OWNER)
43         {
44                 return (TRUE);
45         }
46
47         if ((is_magic(p_ptr->realm1) && (bldg->member_realm[p_ptr->realm1] == BUILDING_OWNER)) ||
48                 (is_magic(p_ptr->realm2) && (bldg->member_realm[p_ptr->realm2] == BUILDING_OWNER)))
49         {
50                 return (TRUE);
51         }
52
53         return (FALSE);
54 }
55
56 /*!
57  * @brief 施設毎に設定された種族、職業、魔法領域フラグがプレイヤーと一致するかを判定する。
58  (スペルマスターの特別判定つき)
59  * @details 各種ギルドや寺院など、特定の職業ならば優遇措置を得られる施設、
60  * あるいは食堂など特定の種族では利用できない施設の判定処理を行う。
61  * @param bldg 施設構造体の参照ポインタ
62  * @return 種族、職業、魔法領域のいずれかが一致しているかの是非。
63  * @todo is_owner()との実質的な多重実装なので、リファクタリングを行うべきである。
64  */
65 static bool is_member(building_type *bldg)
66 {
67         if (bldg->member_class[p_ptr->pclass])
68         {
69                 return (TRUE);
70         }
71
72         if (bldg->member_race[p_ptr->prace])
73         {
74                 return (TRUE);
75         }
76
77         if ((is_magic(p_ptr->realm1) && bldg->member_realm[p_ptr->realm1]) ||
78             (is_magic(p_ptr->realm2) && bldg->member_realm[p_ptr->realm2]))
79         {
80                 return (TRUE);
81         }
82
83
84         if (p_ptr->pclass == CLASS_SORCERER)
85         {
86                 int i;
87                 bool OK = FALSE;
88                 for (i = 0; i < MAX_MAGIC; i++)
89                 {
90                         if (bldg->member_realm[i+1]) OK = TRUE;
91                 }
92                 return OK;
93         }
94         return (FALSE);
95 }
96
97 /*!
98  * @brief コンソールに表示された施設に関する情報を消去する / Clear the building information
99  * @details 消去は行毎にヌル文字列で行われる。
100  * @param min_row 開始行番号
101  * @param max_row 末尾行番号
102  * @return なし
103  */
104 static void clear_bldg(int min_row, int max_row)
105 {
106         int   i;
107
108         for (i = min_row; i <= max_row; i++)
109                 prt("", i, 0);
110 }
111
112 /*!
113  * @brief 所持金を表示する。
114  * @return なし
115  */
116 static void building_prt_gold(void)
117 {
118         char tmp_str[80];
119         prt(_("手持ちのお金: ", "Gold Remaining: "), 23,53);
120         sprintf(tmp_str, "%9ld", (long)p_ptr->au);
121         prt(tmp_str, 23, 68);
122 }
123
124 /*!
125  * @brief 施設のサービス一覧を表示する / Display a building.
126  * @param bldg 施設構造体の参照ポインタ
127  * @return なし
128  */
129 static void show_building(building_type* bldg)
130 {
131         char buff[20];
132         int i;
133         byte action_color;
134         char tmp_str[80];
135
136         Term_clear();
137         sprintf(tmp_str, "%s (%s) %35s", bldg->owner_name, bldg->owner_race, bldg->name);
138         prt(tmp_str, 2, 1);
139
140
141         for (i = 0; i < 8; i++)
142         {
143                 if (bldg->letters[i])
144                 {
145                         if (bldg->action_restr[i] == 0)
146                         {
147                                 if ((is_owner(bldg) && (bldg->member_costs[i] == 0)) ||
148                                         (!is_owner(bldg) && (bldg->other_costs[i] == 0)))
149                                 {
150                                         action_color = TERM_WHITE;
151                                         buff[0] = '\0';
152                                 }
153                                 else if (is_owner(bldg))
154                                 {
155                                         action_color = TERM_YELLOW;
156                                         sprintf(buff, _("($%ld)", "(%ldgp)"), (long int)bldg->member_costs[i]);
157                                 }
158                                 else
159                                 {
160                                         action_color = TERM_YELLOW;
161                                         sprintf(buff, _("($%ld)", "(%ldgp)"), (long int)bldg->other_costs[i]);                          }
162                         }
163                         else if (bldg->action_restr[i] == 1)
164                         {
165                                 if (!is_member(bldg))
166                                 {
167                                         action_color = TERM_L_DARK;
168                                         strcpy(buff, _("(閉店)", "(closed)"));
169                                 }
170                                 else if ((is_owner(bldg) && (bldg->member_costs[i] == 0)) ||
171                                         (is_member(bldg) && (bldg->other_costs[i] == 0)))
172                                 {
173                                         action_color = TERM_WHITE;
174                                         buff[0] = '\0';
175                                 }
176                                 else if (is_owner(bldg))
177                                 {
178                                         action_color = TERM_YELLOW;
179                                         sprintf(buff, _("($%ld)", "(%ldgp)"), (long int)bldg->member_costs[i]);
180                                 }
181                                 else
182                                 {
183                                         action_color = TERM_YELLOW;
184                                         sprintf(buff, _("($%ld)", "(%ldgp)"), (long int)bldg->other_costs[i]);
185                                 }
186                         }
187                         else
188                         {
189                                 if (!is_owner(bldg))
190                                 {
191                                         action_color = TERM_L_DARK;
192                                         strcpy(buff, _("(閉店)", "(closed)"));
193                                 }
194                                 else if (bldg->member_costs[i] != 0)
195                                 {
196                                         action_color = TERM_YELLOW;
197                                         sprintf(buff, _("($%ld)", "(%ldgp)"), (long int)bldg->member_costs[i]);
198                                 }
199                                 else
200                                 {
201                                         action_color = TERM_WHITE;
202                                         buff[0] = '\0';
203                                 }
204                         }
205
206                         sprintf(tmp_str," %c) %s %s", bldg->letters[i], bldg->act_names[i], buff);
207                         c_put_str(action_color, tmp_str, 19+(i/2), 35*(i%2));
208                 }
209         }
210         prt(_(" ESC) 建物を出る", " ESC) Exit building"), 23, 0);
211 }
212
213 /*!
214  * @brief 闘技場に入るコマンドの処理 / arena commands
215  * @param cmd 闘技場処理のID
216  * @return なし
217  */
218 static void arena_comm(int cmd)
219 {
220         monster_race    *r_ptr;
221         concptr            name;
222
223
224         switch (cmd)
225         {
226                 case BACT_ARENA:
227                         if (p_ptr->arena_number == MAX_ARENA_MONS)
228                         {
229                                 clear_bldg(5, 19);
230                                 prt(_("アリーナの優勝者!", "               Arena Victor!"), 5, 0);
231                                 prt(_("おめでとう!あなたは全ての敵を倒しました。", "Congratulations!  You have defeated all before you."), 7, 0);
232                                 prt(_("賞金として $1,000,000 が与えられます。", "For that, receive the prize: 1,000,000 gold pieces"), 8, 0);
233
234                                 prt("", 10, 0);
235                                 prt("", 11, 0);
236                                 p_ptr->au += 1000000L;
237                                 msg_print(_("スペースキーで続行", "Press the space bar to continue"));
238                                 msg_print(NULL);
239                                 p_ptr->arena_number++;
240                         }
241                         else if (p_ptr->arena_number > MAX_ARENA_MONS)
242                         {
243                                 if (p_ptr->arena_number < MAX_ARENA_MONS+2)
244                                 {
245                                         msg_print(_("君のために最強の挑戦者を用意しておいた。", "The strongest challenger is waiting for you."));
246                                         msg_print(NULL);
247                                         if (get_check(_("挑戦するかね?", "Do you fight? ")))
248                                         {       
249                                                 msg_print(_("死ぬがよい。", "Die, maggots."));
250                                                 msg_print(NULL);
251                                         
252                                                 p_ptr->exit_bldg = FALSE;
253                                                 reset_tim_flags();
254
255                                                 /* Save the surface floor as saved floor */
256                                                 prepare_change_floor_mode(CFM_SAVE_FLOORS);
257
258                                                 p_ptr->inside_arena = TRUE;
259                                                 p_ptr->leaving = TRUE;
260                                                 leave_bldg = TRUE;
261                                         }
262                                         else
263                                         {
264                                                 msg_print(_("残念だ。", "We are disappointed."));
265                                         }
266                                 }
267                                 else
268                                 {
269                                         msg_print(_("あなたはアリーナに入り、しばらくの間栄光にひたった。",
270                                                                 "You enter the arena briefly and bask in your glory."));
271                                         msg_print(NULL);
272                                 }
273                         }
274                         else if (p_ptr->riding && (p_ptr->pclass != CLASS_BEASTMASTER) && (p_ptr->pclass != CLASS_CAVALRY))
275                         {
276                                 msg_print(_("ペットに乗ったままではアリーナへ入れさせてもらえなかった。",
277                                                         "You don't have permission to enter with pet."));
278                                 msg_print(NULL);
279                         }
280                         else
281                         {
282                                 p_ptr->exit_bldg = FALSE;
283                                 reset_tim_flags();
284
285                                 /* Save the surface floor as saved floor */
286                                 prepare_change_floor_mode(CFM_SAVE_FLOORS);
287
288                                 p_ptr->inside_arena = TRUE;
289                                 p_ptr->leaving = TRUE;
290                                 leave_bldg = TRUE;
291                         }
292                         break;
293                 case BACT_POSTER:
294                         if (p_ptr->arena_number == MAX_ARENA_MONS)
295                                 msg_print(_("あなたは勝利者だ。 アリーナでのセレモニーに参加しなさい。",
296                                                         "You are victorious. Enter the arena for the ceremony."));
297
298                         else if (p_ptr->arena_number > MAX_ARENA_MONS)
299                         {
300                                 msg_print(_("あなたはすべての敵に勝利した。", "You have won against all foes."));
301                         }
302                         else
303                         {
304                                 r_ptr = &r_info[arena_info[p_ptr->arena_number].r_idx];
305                                 name = (r_name + r_ptr->name);
306                                 msg_format(_("%s に挑戦するものはいないか?", "Do I hear any challenges against: %s"), name);
307
308                                 p_ptr->monster_race_idx = arena_info[p_ptr->arena_number].r_idx;
309                                 p_ptr->window |= (PW_MONSTER);
310                                 handle_stuff();
311
312                         }
313                         break;
314                 case BACT_ARENA_RULES:
315                         screen_save();
316
317                         /* Peruse the arena help file */
318                         (void)show_file(TRUE, _("arena_j.txt", "arena.txt"), NULL, 0, 0);
319                         screen_load();
320
321                         break;
322         }
323 }
324
325 /*!
326  * @brief カジノのスロットシンボルを表示する / display fruit for dice slots
327  * @param row シンボルを表示する行の上端
328  * @param col シンボルを表示する行の左端
329  * @param fruit 表示するシンボルID
330  * @return なし
331  */
332 static void display_fruit(int row, int col, int fruit)
333 {
334         switch (fruit)
335         {
336                 case 0: /* lemon */
337                         c_put_str(TERM_YELLOW, "   ####.", row, col);
338                         c_put_str(TERM_YELLOW, "  #    #", row + 1, col);
339                         c_put_str(TERM_YELLOW, " #     #", row + 2, col);
340                         c_put_str(TERM_YELLOW, "#      #", row + 3, col);
341                         c_put_str(TERM_YELLOW, "#      #", row + 4, col);
342                         c_put_str(TERM_YELLOW, "#     # ", row + 5, col);
343                         c_put_str(TERM_YELLOW, "#    #  ", row + 6, col);
344                         c_put_str(TERM_YELLOW, ".####   ", row + 7, col);
345                         prt(                 _(" レモン ",
346                                                            " Lemon  "), row + 8, col);
347                         break;
348                 case 1: /* orange */
349                         c_put_str(TERM_ORANGE, "   ##   ", row, col);
350                         c_put_str(TERM_ORANGE, "  #..#  ", row + 1, col);
351                         c_put_str(TERM_ORANGE, " #....# ", row + 2, col);
352                         c_put_str(TERM_ORANGE, "#......#", row + 3, col);
353                         c_put_str(TERM_ORANGE, "#......#", row + 4, col);
354                         c_put_str(TERM_ORANGE, " #....# ", row + 5, col);
355                         c_put_str(TERM_ORANGE, "  #..#  ", row + 6, col);
356                         c_put_str(TERM_ORANGE, "   ##   ", row + 7, col);
357                         prt(                 _("オレンジ",
358                                                                    " Orange "), row + 8, col);
359                         break;
360                 case 2: /* sword */
361                         c_put_str(TERM_SLATE, _("   Λ   ",  "   /\\   ") , row, col);
362                         c_put_str(TERM_SLATE, _("   ||   ", "   ##   ") , row + 1, col);
363                         c_put_str(TERM_SLATE, _("   ||   ", "   ##   ") , row + 2, col);
364                         c_put_str(TERM_SLATE, _("   ||   ", "   ##   ") , row + 3, col);
365                         c_put_str(TERM_SLATE, _("   ||   ", "   ##   ") , row + 4, col);
366                         c_put_str(TERM_SLATE, _("   ||   ", "   ##   ") , row + 5, col);
367                         c_put_str(TERM_UMBER, _(" |=亜=| ", " ###### ") , row + 6, col);
368                         c_put_str(TERM_UMBER, _("   目   ", "   ##   ") , row + 7, col);
369                         prt(                  _("   剣   ", " Sword  ") , row + 8, col);
370                         break;
371                 case 3: /* shield */
372                         c_put_str(TERM_SLATE, " ###### ", row, col);
373                         c_put_str(TERM_SLATE, "#      #", row + 1, col);
374                         c_put_str(TERM_SLATE, "# ++++ #", row + 2, col);
375                         c_put_str(TERM_SLATE, "# +==+ #", row + 3, col);
376                         c_put_str(TERM_SLATE, "#  ++  #", row + 4, col);
377                         c_put_str(TERM_SLATE, " #    # ", row + 5, col);
378                         c_put_str(TERM_SLATE, "  #  #  ", row + 6, col);
379                         c_put_str(TERM_SLATE, "   ##   ", row + 7, col);
380                         prt(                _("   盾   ",
381                                                                   " Shield "), row + 8, col);
382                         break;
383                 case 4: /* plum */
384                         c_put_str(TERM_VIOLET, "   ##   ", row, col);
385                         c_put_str(TERM_VIOLET, " ###### ", row + 1, col);
386                         c_put_str(TERM_VIOLET, "########", row + 2, col);
387                         c_put_str(TERM_VIOLET, "########", row + 3, col);
388                         c_put_str(TERM_VIOLET, "########", row + 4, col);
389                         c_put_str(TERM_VIOLET, " ###### ", row + 5, col);
390                         c_put_str(TERM_VIOLET, "  ####  ", row + 6, col);
391                         c_put_str(TERM_VIOLET, "   ##   ", row + 7, col);
392                         prt(                 _(" プラム ",
393                                                                    "  Plum  "), row + 8, col);
394                         break;
395                 case 5: /* cherry */
396                         c_put_str(TERM_RED, "      ##", row, col);
397                         c_put_str(TERM_RED, "   ###  ", row + 1, col);
398                         c_put_str(TERM_RED, "  #..#  ", row + 2, col);
399                         c_put_str(TERM_RED, "  #..#  ", row + 3, col);
400                         c_put_str(TERM_RED, " ###### ", row + 4, col);
401                         c_put_str(TERM_RED, "#..##..#", row + 5, col);
402                         c_put_str(TERM_RED, "#..##..#", row + 6, col);
403                         c_put_str(TERM_RED, " ##  ## ", row + 7, col);
404                         prt(              _("チェリー",
405                                                                 " Cherry "), row + 8, col);
406                         break;
407         }
408 }
409
410 /*! @note
411  * kpoker no (tyuto-hannpa na)pakuri desu...
412  * joker ha shineru node haitte masen.
413  *
414  * TODO: donataka! tsukutte!
415  *  - agatta yaku no kiroku (like DQ).
416  *  - kakkoii card no e.
417  *  - sousa-sei no koujyo.
418  *  - code wo wakariyasuku.
419  *  - double up.
420  *  - Joker... -- done.
421  *
422  * 9/13/2000 --Koka
423  * 9/15/2000 joker wo jissou. soreto, code wo sukosi kakikae. --Habu
424  */
425
426 #define SUIT_OF(card)  ((card) / 13) /*!< トランプカードのスートを返す */
427 #define NUM_OF(card)   ((card) % 13) /*!< トランプカードの番号を返す */
428 #define IS_JOKER(card) ((card) == 52) /*!< トランプカードがジョーカーかどうかを返す */
429
430 static int cards[5]; /*!< ポーカーの現在の手札ID */
431
432 /*!
433  * @brief ポーカーの山札を切る。
434  * @param deck デッキの配列
435  * @return なし
436  */
437 static void reset_deck(int deck[])
438 {
439         int i;
440         for (i = 0; i < 53; i++) deck[i] = i;
441
442         /* shuffle cards */
443         for (i = 0; i < 53; i++){
444                 int tmp1 = randint0(53 - i) + i;
445                 int tmp2 = deck[i];
446                 deck[i] = deck[tmp1];
447                 deck[tmp1] = tmp2;
448         }
449 }
450
451 /*!
452  * @brief ポーカープレイ中にジョーカーを持っているかの判定を返す。
453  * @return ジョーカーを持っているか。
454  */
455 static bool have_joker(void)
456 {
457         int i;
458
459         for (i = 0; i < 5; i++){
460           if(IS_JOKER(cards[i])) return TRUE;
461         }
462         return FALSE;
463 }
464
465 /*!
466  * @brief ポーカーの手札に該当の番号の札があるかを返す。
467  * @param num 探したいカードの番号。
468  * @return 該当の番号が手札にあるか。
469  */
470 static bool find_card_num(int num)
471 {
472         int i;
473         for (i = 0; i < 5; i++)
474                 if (NUM_OF(cards[i]) == num && !IS_JOKER(cards[i])) return TRUE;
475         return FALSE;
476 }
477
478 /*!
479  * @brief ポーカーの手札がフラッシュ役を得ているかを帰す。
480  * @return 役の判定結果
481  */
482 static bool yaku_check_flush(void)
483 {
484         int i, suit;
485         bool joker_is_used = FALSE;
486
487         suit = IS_JOKER(cards[0]) ? SUIT_OF(cards[1]) : SUIT_OF(cards[0]);
488         for (i = 0; i < 5; i++){
489                 if (SUIT_OF(cards[i]) != suit){
490                   if(have_joker() && !joker_is_used)
491                     joker_is_used = TRUE;
492                   else
493                     return FALSE;
494                 }
495         }
496
497         return TRUE;
498 }
499
500 /*!
501  * @brief ポーカーの手札がストレートを含んだ高位の役を得ているかを帰す。
502  * @return 役の判定結果 0…ストレート、フラッシュいずれもなし/1…ストレートのみ/2…ストレートフラッシュ/3…ロイヤルストレートフラッシュ
503  */
504 static int yaku_check_straight(void)
505 {
506         int i, lowest = 99;
507         bool joker_is_used = FALSE;
508         bool straight = FALSE;
509
510         /* get lowest */
511         for (i = 0; i < 5; i++)
512         {
513                 if (NUM_OF(cards[i]) < lowest && !IS_JOKER(cards[i]))
514                         lowest = NUM_OF(cards[i]);
515         }
516         
517         /* Check Royal Straight Flush */
518         if (yaku_check_flush())
519         {
520           if( lowest == 0 ){
521                 for (i = 0; i < 4; i++)
522                 {
523                         if (!find_card_num(9 + i)){
524                                 if( have_joker() && !joker_is_used )
525                                   joker_is_used = TRUE;
526                                 else
527                                   break;
528                         }
529                 }
530                 if (i == 4) return 3; /* Wow! Royal Straight Flush!!! */
531           }
532           if(lowest == 9){
533                 for (i = 0; i < 3; i++)
534                 {
535                         if (!find_card_num(10 + i))
536                                 break;
537                 }
538                 if (i == 3 && have_joker()) return 3; /* Wow! Royal Straight Flush!!! */
539           }
540         }
541
542         joker_is_used = FALSE;
543
544         /* Straight Only Check */
545
546         if (lowest == 0) { /* (10 - J - Q - K)[JOKER] - A */
547                 for (i = 0; i < 4; i++)
548                 {
549                         if (!find_card_num(9 + i)) {
550                                 if (have_joker() && !joker_is_used)
551                                         joker_is_used = TRUE;
552                                 else
553                                         break; /* None */
554                         }
555                 }
556                 if(i == 4) straight = TRUE;
557         }
558
559         joker_is_used = FALSE;
560
561         for (i = 0; i < 5; i++)
562         {
563                 if(!find_card_num(lowest + i)){
564                         if( have_joker() && !joker_is_used )
565                                 joker_is_used = TRUE;
566                         else
567                                 break; /* None */
568                 }
569         }
570         if(i == 5) straight = TRUE;
571         
572         if (straight && yaku_check_flush()) return 2; /* Straight Flush */
573         else if(straight) return 1; /* Only Straight */
574         else return 0;
575 }
576
577 /*!
578  * @brief ポーカーのペア役の状態を返す。
579  * @return 0:nopair 1:1 pair 2:2 pair 3:3 cards 4:full house 6:4cards
580  */
581 static int yaku_check_pair(void)
582 {
583         int i, i2, matching = 0;
584
585         for (i = 0; i < 5; i++)
586         {
587                 for (i2 = i+1; i2 < 5; i2++)
588                 {
589                         if (IS_JOKER(cards[i]) || IS_JOKER(cards[i2])) continue;
590                         if (NUM_OF(cards[i]) == NUM_OF(cards[i2]))
591                                 matching++;
592                 }
593         }
594
595         if(have_joker()){
596           switch(matching){
597           case 0:
598             matching = 1;
599             break;
600           case 1:
601             matching = 3;
602             break;
603           case 2:
604             matching = 4;
605             break;
606           case 3:
607             matching = 6;
608             break;
609           case 6:
610             matching = 7;
611             break;
612           default:
613             /* don't reach */
614             break;
615           }
616         }
617
618         return matching;
619 }
620
621 #define ODDS_5A 3000 /*!< ファイブエースの役倍率 */
622 #define ODDS_5C 400 /*!< ファイブカードの役倍率 */
623 #define ODDS_RF 200 /*!< ロイヤルストレートフラッシュの役倍率 */
624 #define ODDS_SF 80 /*!< ストレートフラッシュの役倍率 */
625 #define ODDS_4C 16 /*!< フォアカードの役倍率 */
626 #define ODDS_FH 12 /*!< フルハウスの役倍率 */
627 #define ODDS_FL 8 /*!< フラッシュの役倍率 */
628 #define ODDS_ST 4 /*!< ストレートの役倍率 */
629 #define ODDS_3C 1 /*!< スリーカードの役倍率 */
630 #define ODDS_2P 1 /*!< ツーペアの役倍率 */
631
632 /*!
633  * @brief ポーカーの役をチェックし、その結果を画面に表示しつつ結果を返す。
634  * @return 役のID
635  */
636 static int yaku_check(void)
637 {
638         prt("                            ", 4, 3);
639
640         switch(yaku_check_straight()){
641         case 3: /* RF! */
642                 c_put_str(TERM_YELLOW, _("ロイヤルストレートフラッシュ", "Royal Flush"),  4,  3);
643                 return ODDS_RF;
644         case 2: /* SF! */
645                 c_put_str(TERM_YELLOW, _("ストレートフラッシュ", "Straight Flush"),  4,  3);
646                 return ODDS_SF;
647         case 1:
648                 c_put_str(TERM_YELLOW, _("ストレート", "Straight"),  4,  3);
649                 return ODDS_ST;
650         default:
651                 /* Not straight -- fall through */
652                 break;
653         }
654
655         if (yaku_check_flush())
656         {
657                 c_put_str(TERM_YELLOW, _("フラッシュ", "Flush"),  4,  3);
658                 return ODDS_FL;
659         }
660
661         switch (yaku_check_pair())
662         {
663         case 1:
664                 c_put_str(TERM_YELLOW, _("ワンペア", "One pair"),  4,  3);
665                 return 0;
666         case 2:
667                 c_put_str(TERM_YELLOW, _("ツーペア", "Two pair"),  4,  3);
668                 return ODDS_2P;
669         case 3:
670                 c_put_str(TERM_YELLOW, _("スリーカード", "Three of a kind"),  4,  3);
671                 return ODDS_3C;
672         case 4:
673                 c_put_str(TERM_YELLOW, _("フルハウス", "Full house"),  4,  3);
674                 return ODDS_FH;
675         case 6:
676                 c_put_str(TERM_YELLOW, _("フォーカード", "Four of a kind"),  4,  3);
677                 return ODDS_4C;
678         case 7:
679                 if (!NUM_OF(cards[0]) && !NUM_OF(cards[1]))
680                 {
681                         c_put_str(TERM_YELLOW, _("ファイブエース", "Five ace"),  4,  3);
682                         return ODDS_5A;
683                 }
684                 else
685                 {
686                         c_put_str(TERM_YELLOW, _("ファイブカード", "Five of a kind"),  4,  3);
687                         return ODDS_5C;
688                 }
689         default:
690                 break;
691         }
692         return 0;
693 }
694
695 /*!
696  * @brief ポーカーの捨てる/残すインターフェイスの表示を更新する。
697  * @param hoge カーソルの現在位置
698  * @param kaeruka カードの捨てる/残すフラグ配列
699  * @return なし
700  */
701 static void display_kaeruka(int hoge, int kaeruka[])
702 {
703         int i;
704         char col = TERM_WHITE;
705         for (i = 0; i < 5; i++)
706         {
707                 if (i == hoge) col = TERM_YELLOW;
708                 else if(kaeruka[i]) col = TERM_WHITE;
709                 else col = TERM_L_BLUE;
710                 
711                 if(kaeruka[i])
712                         c_put_str(col, _("かえる", "Change"), 14,  5+i*16);
713                 else
714                         c_put_str(col, _("のこす", " Stay "), 14,  5+i*16);
715         }
716         if (hoge > 4) col = TERM_YELLOW;
717         else col = TERM_WHITE;
718         c_put_str(col, _("決定", "Sure"), 16,  38);
719
720         /* Hilite current option */
721         if (hoge < 5) move_cursor(14, 5+hoge*16);
722         else move_cursor(16, 38);
723 }
724
725 /*!
726  * @brief ポーカーの手札を表示する。
727  * @return なし
728  */
729 static void display_cards(void)
730 {
731         int i, j;
732         char suitcolor[4] = {TERM_YELLOW, TERM_L_RED, TERM_L_BLUE, TERM_L_GREEN};
733 #ifdef JP
734         concptr suit[4] = {"★", "●", "¶", "†"};
735         concptr card_grph[13][7] = {{"A   %s     ",
736                                   "     変     ",
737                                   "     愚     ",
738                                   "     蛮     ",
739                                   "     怒     ",
740                                   "     %s     ",
741                                   "          A"},
742                                  {"2          ",
743                                   "     %s     ",
744                                   "            ",
745                                   "            ",
746                                   "            ",
747                                   "     %s     ",
748                                   "          2"},
749                                  {"3          ",
750                                   "     %s     ",
751                                   "            ",
752                                   "     %s     ",
753                                   "            ",
754                                   "     %s     ",
755                                   "          3"},
756                                  {"4          ",
757                                   "   %s  %s   ",
758                                   "            ",
759                                   "            ",
760                                   "            ",
761                                   "   %s  %s   ",
762                                   "          4"},
763                                  {"5          ",
764                                   "   %s  %s   ",
765                                   "            ",
766                                   "     %s     ",
767                                   "            ",
768                                   "   %s  %s   ",
769                                   "          5"},
770                                  {"6          ",
771                                   "   %s  %s   ",
772                                   "            ",
773                                   "   %s  %s   ",
774                                   "            ",
775                                   "   %s  %s   ",
776                                   "          6"},
777                                  {"7          ",
778                                   "   %s  %s   ",
779                                   "     %s     ",
780                                   "   %s  %s   ",
781                                   "            ",
782                                   "   %s  %s   ",
783                                   "          7"},
784                                  {"8          ",
785                                   "   %s  %s   ",
786                                   "     %s     ",
787                                   "   %s  %s   ",
788                                   "     %s     ",
789                                   "   %s  %s   ",
790                                   "          8"},
791                                  {"9 %s  %s   ",
792                                   "            ",
793                                   "   %s  %s   ",
794                                   "     %s     ",
795                                   "   %s  %s   ",
796                                   "            ",
797                                   "   %s  %s 9"},
798                                  {"10 %s  %s   ",
799                                   "     %s     ",
800                                   "   %s  %s   ",
801                                   "            ",
802                                   "   %s  %s   ",
803                                   "     %s     ",
804                                   "   %s  %s 10"},
805                                  {"J   Λ     ",
806                                   "%s   ||     ",
807                                   "     ||     ",
808                                   "     ||     ",
809                                   "     ||     ",
810                                   "   |=亜=| %s",
811                                   "     目   J"},
812                                  {"Q ######   ",
813                                   "%s#      #  ",
814                                   "  # ++++ #  ",
815                                   "  # +==+ #  ",
816                                   "   # ++ #   ",
817                                   "    #  #  %s",
818                                   "     ##   Q"},
819                                  {"K          ",
820                                   "%s `⌒´   ",
821                                   "  γγγλ  ",
822                                   "  ο ο ι  ",
823                                   "   υ    ∂ ",
824                                   "    σ ノ %s",
825                                   "          K"}};
826         concptr joker_grph[7] = {    "            ",
827                                   "     J     ",
828                                   "     O     ",
829                                   "     K     ",
830                                   "     E     ",
831                                   "     R     ",
832                                   "            "};
833
834 #else
835
836         concptr suit[4] = {"[]", "qp", "<>", "db"};
837         concptr card_grph[13][7] = {{"A    %s     ",
838                                   "     He     ",
839                                   "     ng     ",
840                                   "     ba     ",
841                                   "     nd     ",
842                                   "     %s     ",
843                                   "           A"},
844                                  {"2           ",
845                                   "     %s     ",
846                                   "            ",
847                                   "            ",
848                                   "            ",
849                                   "     %s     ",
850                                   "           2"},
851                                  {"3           ",
852                                   "     %s     ",
853                                   "            ",
854                                   "     %s     ",
855                                   "            ",
856                                   "     %s     ",
857                                   "           3"},
858                                  {"4           ",
859                                   "   %s  %s   ",
860                                   "            ",
861                                   "            ",
862                                   "            ",
863                                   "   %s  %s   ",
864                                   "           4"},
865                                  {"5           ",
866                                   "   %s  %s   ",
867                                   "            ",
868                                   "     %s     ",
869                                   "            ",
870                                   "   %s  %s   ",
871                                   "           5"},
872                                  {"6           ",
873                                   "   %s  %s   ",
874                                   "            ",
875                                   "   %s  %s   ",
876                                   "            ",
877                                   "   %s  %s   ",
878                                   "           6"},
879                                  {"7           ",
880                                   "   %s  %s   ",
881                                   "     %s     ",
882                                   "   %s  %s   ",
883                                   "            ",
884                                   "   %s  %s   ",
885                                   "           7"},
886                                  {"8           ",
887                                   "   %s  %s   ",
888                                   "     %s     ",
889                                   "   %s  %s   ",
890                                   "     %s     ",
891                                   "   %s  %s   ",
892                                   "           8"},
893                                  {"9  %s  %s   ",
894                                   "            ",
895                                   "   %s  %s   ",
896                                   "     %s     ",
897                                   "   %s  %s   ",
898                                   "            ",
899                                   "   %s  %s  9"},
900                                  {"10 %s  %s   ",
901                                   "     %s     ",
902                                   "   %s  %s   ",
903                                   "            ",
904                                   "   %s  %s   ",
905                                   "     %s     ",
906                                   "   %s  %s 10"},
907                                  {"J    /\\     ",
908                                   "%s   ||     ",
909                                   "     ||     ",
910                                   "     ||     ",
911                                   "     ||     ",
912                                   "   |=HH=| %s",
913                                   "     ][    J"},
914                                  {"Q  ######   ",
915                                   "%s#      #  ",
916                                   "  # ++++ #  ",
917                                   "  # +==+ #  ",
918                                   "   # ++ #   ",
919                                   "    #  #  %s",
920                                   "     ##    Q"},
921                                  {"K           ",
922                                   "%s _'~~`_   ",
923                                   "   jjjjj$&  ",
924                                   "   q q uu   ",
925                                   "   c    &   ",
926                                   "    v__/  %s",
927                                   "           K"}};
928         concptr joker_grph[7] = {    "            ",
929                                   "     J      ",
930                                   "     O      ",
931                                   "     K      ",
932                                   "     E      ",
933                                   "     R      ",
934                                   "            "};
935 #endif
936
937         for (i = 0; i < 5; i++)
938         {
939                 prt(_("┏━━━━━━┓", " +------------+ "),  5,  i*16);
940         }
941
942         for (i = 0; i < 5; i++)
943         {
944                 for (j = 0; j < 7; j++)
945                 {
946                         prt(_("┃", " |"),  j+6,  i*16);
947                         if(IS_JOKER(cards[i]))
948                                 c_put_str(TERM_VIOLET, joker_grph[j],  j+6,  2+i*16);
949                         else
950                                 c_put_str(suitcolor[SUIT_OF(cards[i])], format(card_grph[NUM_OF(cards[i])][j], suit[SUIT_OF(cards[i])], suit[SUIT_OF(cards[i])]),  j+6,  2+i*16);
951                         prt(_("┃", "| "),  j+6,  i*16+14);
952                 }
953         }
954         for (i = 0; i < 5; i++)
955         {
956                 prt(_("┗━━━━━━┛", " +------------+ "), 13,  i*16);
957         }
958 }
959
960 /*!
961  * @brief ポーカーの1プレイルーチン。
962  * @return 1プレイの役の結果
963  */
964 static int do_poker(void)
965 {
966         int i, k = 2;
967         char cmd;
968         int deck[53]; /* yamafuda : 0...52 */
969         int deck_ptr = 0;
970         int kaeruka[5]; /* 0:kaenai 1:kaeru */
971
972         bool done = FALSE;
973         bool kettei = TRUE;
974         bool kakikae = TRUE;
975
976         reset_deck(deck);
977
978         for (i = 0; i < 5; i++)
979         {
980                 cards[i] = deck[deck_ptr++];
981                 kaeruka[i] = 0; /* default:nokosu */
982         }
983
984         /* suteruno wo kimeru */
985         prt(_("残すカードを決めて下さい(方向で移動, スペースで選択)。", "Stay witch? "), 0, 0);
986
987         display_cards();
988         yaku_check();
989
990         while (!done)
991         {
992                 if (kakikae) display_kaeruka(k+kettei*5, kaeruka);
993                 kakikae = FALSE;
994                 cmd = inkey();
995                 switch (cmd)
996                 {
997                 case '6': case 'l': case 'L': case KTRL('F'):
998                         if (!kettei) k = (k+1)%5;
999                         else {k = 0;kettei = FALSE;}
1000                         kakikae = TRUE;
1001                         break;
1002                 case '4': case 'h': case 'H': case KTRL('B'):
1003                         if (!kettei) k = (k+4)%5;
1004                         else {k = 4;kettei = FALSE;}
1005                         kakikae = TRUE;
1006                         break;
1007                 case '2': case 'j': case 'J': case KTRL('N'):
1008                         if (!kettei) {kettei = TRUE;kakikae = TRUE;}
1009                         break;
1010                 case '8': case 'k': case 'K': case KTRL('P'):
1011                         if (kettei) {kettei = FALSE;kakikae = TRUE;}
1012                         break;
1013                 case ' ': case '\r':
1014                         if (kettei) done = TRUE;
1015                         else {kaeruka[k] = !kaeruka[k];kakikae = TRUE;}
1016                         break;
1017                 default:
1018                         break;
1019                 }
1020         }
1021         
1022         prt("",0,0);
1023
1024         for (i = 0; i < 5; i++)
1025                 if (kaeruka[i] == 1) cards[i] = deck[deck_ptr++]; /* soshite toru */
1026
1027         display_cards();
1028         
1029         return yaku_check();
1030 }
1031 #undef SUIT_OF
1032 #undef NUM_OF
1033 #undef IS_JOKER
1034 /* end of poker codes --Koka */
1035
1036 /*!
1037  * @brief カジノ1プレイごとのメインルーチン / gamble_comm
1038  * @param cmd プレイするゲームID
1039  * @return なし
1040  */
1041 static bool gamble_comm(int cmd)
1042 {
1043         int i;
1044         int roll1, roll2, roll3, choice, odds, win;
1045         s32b wager;
1046         s32b maxbet;
1047         s32b oldgold;
1048
1049         char out_val[160], tmp_str[80], again;
1050         concptr p;
1051
1052         screen_save();
1053
1054         if (cmd == BACT_GAMBLE_RULES)
1055         {
1056                 /* Peruse the gambling help file */
1057                 (void)show_file(TRUE, _("jgambling.txt", "gambling.txt"), NULL, 0, 0);
1058         }
1059         else
1060         {
1061                 /* No money */
1062                 if (p_ptr->au < 1)
1063                 {
1064                         msg_print(_("おい!おまえ一文なしじゃないか!こっから出ていけ!", 
1065                                                 "Hey! You don't have gold - get out of here!"));
1066                         msg_print(NULL);
1067                         screen_load();
1068                         return FALSE;
1069                 }
1070
1071                 clear_bldg(5, 23);
1072
1073                 maxbet = p_ptr->lev * 200;
1074
1075                 /* We can't bet more than we have */
1076                 maxbet = MIN(maxbet, p_ptr->au);
1077
1078                 /* Get the wager */
1079                 strcpy(out_val, "");
1080                 sprintf(tmp_str,_("賭け金 (1-%ld)?", "Your wager (1-%ld) ? "), (long int)maxbet);
1081
1082
1083                 /*
1084                  * Use get_string() because we may need more than
1085                  * the s16b value returned by get_quantity().
1086                  */
1087                 if (get_string(tmp_str, out_val, 32))
1088                 {
1089                         /* Strip spaces */
1090                         for (p = out_val; *p == ' '; p++);
1091
1092                         /* Get the wager */
1093                         wager = atol(p);
1094
1095                         if (wager > p_ptr->au)
1096                         {
1097                                 msg_print(_("おい!金が足りないじゃないか!出ていけ!", "Hey! You don't have the gold - get out of here!"));
1098                                 msg_print(NULL);
1099                                 screen_load();
1100                                 return (FALSE);
1101                         }
1102                         else if (wager > maxbet)
1103                         {
1104                                 msg_format(_("%ldゴールドだけ受けよう。残りは取っときな。",
1105                                                          "I'll take %ld gold of that. Keep the rest."), (long int)maxbet);
1106                                 wager = maxbet;
1107                         }
1108                         else if (wager < 1)
1109                         {
1110                                 msg_print(_("OK、1ゴールドからはじめよう。", "Ok, we'll start with 1 gold."));
1111                                 wager = 1;
1112                         }
1113                         msg_print(NULL);
1114                         win = FALSE;
1115                         odds = 0;
1116                         oldgold = p_ptr->au;
1117
1118                         sprintf(tmp_str, _("ゲーム前の所持金: %9ld", "Gold before game: %9ld"), (long int)oldgold);
1119                         prt(tmp_str, 20, 2);
1120                         sprintf(tmp_str, _("現在の掛け金:     %9ld", "Current Wager:    %9ld"), (long int)wager);
1121                         prt(tmp_str, 21, 2);
1122
1123                         do
1124                         {
1125                                 p_ptr->au -= wager;
1126                                 switch (cmd)
1127                                 {
1128                                  case BACT_IN_BETWEEN: /* Game of In-Between */
1129                                         c_put_str(TERM_GREEN, _("イン・ビトイーン", "In Between"),5,2);
1130
1131                                         odds = 4;
1132                                         win = FALSE;
1133                                         roll1 = randint1(10);
1134                                         roll2 = randint1(10);
1135                                         choice = randint1(10);
1136                                         sprintf(tmp_str, _("黒ダイス: %d        黒ダイス: %d", "Black die: %d       Black Die: %d"), roll1, roll2);
1137
1138                                         prt(tmp_str, 8, 3);
1139                                         sprintf(tmp_str, _("赤ダイス: %d", "Red die: %d"), choice);
1140
1141                                         prt(tmp_str, 11, 14);
1142                                         if (((choice > roll1) && (choice < roll2)) ||
1143                                                 ((choice < roll1) && (choice > roll2)))
1144                                                 win = TRUE;
1145                                         break;
1146                                 case BACT_CRAPS:  /* Game of Craps */
1147                                         c_put_str(TERM_GREEN, _("クラップス", "Craps"), 5, 2);
1148
1149                                         win = 3;
1150                                         odds = 2;
1151                                         roll1 = randint1(6);
1152                                         roll2 = randint1(6);
1153                                         roll3 = roll1 +  roll2;
1154                                         choice = roll3;
1155                                         sprintf(tmp_str, _("1振りめ: %d %d      Total: %d", 
1156                                                                            "First roll: %d %d    Total: %d"), roll1, roll2, roll3);
1157                                         prt(tmp_str, 7, 5);
1158                                         if ((roll3 == 7) || (roll3 == 11))
1159                                                 win = TRUE;
1160                                         else if ((roll3 == 2) || (roll3 == 3) || (roll3 == 12))
1161                                                 win = FALSE;
1162                                         else
1163                                                 do
1164                                                 {
1165                                                         msg_print(_("なにかキーを押すともう一回振ります。", "Hit any key to roll again"));
1166
1167                                                         msg_print(NULL);
1168                                                         roll1 = randint1(6);
1169                                                         roll2 = randint1(6);
1170                                                         roll3 = roll1 +  roll2;
1171                                                         sprintf(tmp_str, _("出目: %d %d          合計:      %d", 
1172                                                                                    "Roll result: %d %d   Total:     %d"), roll1, roll2, roll3);
1173                                                         prt(tmp_str, 8, 5);
1174                                                         if (roll3 == choice)
1175                                                                 win = TRUE;
1176                                                         else if (roll3 == 7)
1177                                                                 win = FALSE;
1178                                                 } while ((win != TRUE) && (win != FALSE));
1179                                         break;
1180
1181                                 case BACT_SPIN_WHEEL:  /* Spin the Wheel Game */
1182                                         win = FALSE;
1183                                         odds = 9;
1184                                         c_put_str(TERM_GREEN, _("ルーレット", "Wheel"), 5, 2);
1185
1186                                         prt("0  1  2  3  4  5  6  7  8  9", 7, 5);
1187                                         prt("--------------------------------", 8, 3);
1188                                         strcpy(out_val, "");
1189                                         get_string(_("何番? (0-9): ", "Pick a number (0-9): "), out_val, 32);
1190
1191                                         for (p = out_val; iswspace(*p); p++);
1192                                         choice = atol(p);
1193                                         if (choice < 0)
1194                                         {
1195                                                 msg_print(_("0番にしとくぜ。", "I'll put you down for 0."));
1196                                                 choice = 0;
1197                                         }
1198                                         else if (choice > 9)
1199                                         {
1200                                                 msg_print(_("OK、9番にしとくぜ。", "Ok, I'll put you down for 9."));
1201                                                 choice = 9;
1202                                         }
1203                                         msg_print(NULL);
1204                                         roll1 = randint0(10);
1205                                         sprintf(tmp_str, _("ルーレットは回り、止まった。勝者は %d番だ。", 
1206                                                                            "The wheel spins to a stop and the winner is %d"), roll1);
1207                                         prt(tmp_str, 13, 3);
1208                                         prt("", 9, 0);
1209                                         prt("*", 9, (3 * roll1 + 5));
1210                                         if (roll1 == choice)
1211                                                 win = TRUE;
1212                                         break;
1213
1214                                 case BACT_DICE_SLOTS: /* The Dice Slots */
1215                                         c_put_str(TERM_GREEN,  _("ダイス・スロット", "Dice Slots"), 5, 2);
1216                                         c_put_str(TERM_YELLOW, _("レモン   レモン            2", ""), 6, 37);
1217                                         c_put_str(TERM_YELLOW, _("レモン   レモン   レモン   5", ""), 7, 37);
1218                                         c_put_str(TERM_ORANGE, _("オレンジ オレンジ オレンジ 10", ""), 8, 37);
1219                                         c_put_str(TERM_UMBER, _("剣       剣       剣       20", ""), 9, 37);
1220                                         c_put_str(TERM_SLATE, _("盾       盾       盾       50", ""), 10, 37);
1221                                         c_put_str(TERM_VIOLET, _("プラム   プラム   プラム   200", ""), 11, 37);
1222                                         c_put_str(TERM_RED, _("チェリー チェリー チェリー 1000", ""), 12, 37);
1223                                         
1224                                         win = FALSE;
1225                                         roll1 = randint1(21);
1226                                         for (i=6;i>0;i--)
1227                                         {
1228                                                 if ((roll1-i) < 1)
1229                                                 {
1230                                                         roll1 = 7-i;
1231                                                         break;
1232                                                 }
1233                                                 roll1 -= i;
1234                                         }
1235                                         roll2 = randint1(21);
1236                                         for (i=6;i>0;i--)
1237                                         {
1238                                                 if ((roll2-i) < 1)
1239                                                 {
1240                                                         roll2 = 7-i;
1241                                                         break;
1242                                                 }
1243                                                 roll2 -= i;
1244                                         }
1245                                         choice = randint1(21);
1246                                         for (i=6;i>0;i--)
1247                                         {
1248                                                 if ((choice-i) < 1)
1249                                                 {
1250                                                         choice = 7-i;
1251                                                         break;
1252                                                 }
1253                                                 choice -= i;
1254                                         }
1255                                         put_str("/--------------------------\\", 7, 2);
1256                                         prt("\\--------------------------/", 17, 2);
1257                                         display_fruit(8,  3, roll1 - 1);
1258                                         display_fruit(8, 12, roll2 - 1);
1259                                         display_fruit(8, 21, choice - 1);
1260                                         if ((roll1 == roll2) && (roll2 == choice))
1261                                         {
1262                                                 win = TRUE;
1263                                                 switch(roll1)
1264                                                 {
1265                                                 case 1:
1266                                                         odds = 5;break;
1267                                                 case 2:
1268                                                         odds = 10;break;
1269                                                 case 3:
1270                                                         odds = 20;break;
1271                                                 case 4:
1272                                                         odds = 50;break;
1273                                                 case 5:
1274                                                         odds = 200;break;
1275                                                 case 6:
1276                                                         odds = 1000;break;
1277                                                 }
1278                                         }
1279                                         else if ((roll1 == 1) && (roll2 == 1))
1280                                         {
1281                                                 win = TRUE;
1282                                                 odds = 2;
1283                                         }
1284                                         break;
1285                                 case BACT_POKER:
1286                                         win = FALSE;
1287                                         odds = do_poker();
1288                                         if (odds) win = TRUE;
1289                                         break;
1290                                 }
1291
1292                                 if (win)
1293                                 {
1294                                         prt(_("あなたの勝ち", "YOU WON"), 16, 37);
1295
1296                                         p_ptr->au += odds * wager;
1297                                         sprintf(tmp_str, _("倍率: %d", "Payoff: %d"), odds);
1298
1299                                         prt(tmp_str, 17, 37);
1300                                 }
1301                                 else
1302                                 {
1303                                         prt(_("あなたの負け", "You Lost"), 16, 37);
1304                                         prt("", 17, 37);
1305                                 }
1306                                 sprintf(tmp_str, _("現在の所持金:     %9ld", "Current Gold:     %9ld"), (long int)p_ptr->au);
1307
1308                                 prt(tmp_str, 22, 2);
1309                                 prt(_("もう一度(Y/N)?", "Again(Y/N)?"), 18, 37);
1310
1311                                 move_cursor(18, 52);
1312                                 again = inkey();
1313                                 prt("", 16, 37);
1314                                 prt("", 17, 37);
1315                                 prt("", 18, 37);
1316                                 if (wager > p_ptr->au)
1317                                 {
1318                                         msg_print(_("おい!金が足りないじゃないか!ここから出て行け!", 
1319                                                                 "Hey! You don't have the gold - get out of here!"));
1320                                         msg_print(NULL);
1321
1322                                         /* Get out here */
1323                                         break;
1324                                 }
1325                         } while ((again == 'y') || (again == 'Y'));
1326
1327                         prt("", 18, 37);
1328                         if (p_ptr->au >= oldgold)
1329                         {
1330                                 msg_print(_("「今回は儲けたな!でも次はこっちが勝ってやるからな、絶対に!」",
1331                                                         "You came out a winner! We'll win next time, I'm sure."));
1332                                 chg_virtue(V_CHANCE, 3);
1333                         }
1334                         else
1335                         {
1336                                 msg_print(_("「金をスッてしまったな、わはは!うちに帰った方がいいぜ。」", "You lost gold! Haha, better head home."));
1337                                 chg_virtue(V_CHANCE, -3);
1338                         }
1339                 }
1340                 msg_print(NULL);
1341         }
1342         screen_load();
1343         return (TRUE);
1344 }
1345
1346 /*!
1347  * @brief モンスター闘技場に参加するモンスターをリセットする。
1348  * @return なし
1349  */
1350 void battle_monsters(void)
1351 {
1352         int total, i;
1353         int max_dl = 0;
1354         int mon_level;
1355         int power[4];
1356         bool tekitou;
1357         bool old_inside_battle = p_ptr->inside_battle;
1358
1359         for (i = 0; i < max_d_idx; i++)
1360                 if (max_dl < max_dlv[i]) max_dl = max_dlv[i];
1361
1362         mon_level = randint1(MIN(max_dl, 122))+5;
1363         if (randint0(100) < 60)
1364         {
1365                 i = randint1(MIN(max_dl, 122))+5;
1366                 mon_level = MAX(i, mon_level);
1367         }
1368         if (randint0(100) < 30)
1369         {
1370                 i = randint1(MIN(max_dl, 122))+5;
1371                 mon_level = MAX(i, mon_level);
1372         }
1373
1374         while (1)
1375         {
1376                 total = 0;
1377                 tekitou = FALSE;
1378                 for(i = 0; i < 4; i++)
1379                 {
1380                         MONRACE_IDX r_idx;
1381                         int j;
1382                         while (1)
1383                         {
1384                                 get_mon_num_prep(monster_can_entry_arena, NULL);
1385                                 p_ptr->inside_battle = TRUE;
1386                                 r_idx = get_mon_num(mon_level);
1387                                 p_ptr->inside_battle = old_inside_battle;
1388                                 if (!r_idx) continue;
1389
1390                                 if ((r_info[r_idx].flags1 & RF1_UNIQUE) || (r_info[r_idx].flags7 & RF7_UNIQUE2))
1391                                 {
1392                                         if ((r_info[r_idx].level + 10) > mon_level) continue;
1393                                 }
1394
1395                                 for (j = 0; j < i; j++)
1396                                         if(r_idx == battle_mon[j]) break;
1397                                 if (j<i) continue;
1398
1399                                 break;
1400                         }
1401                         battle_mon[i] = r_idx;
1402                         if (r_info[r_idx].level < 45) tekitou = TRUE;
1403                 }
1404
1405                 for (i=0;i<4;i++)
1406                 {
1407                         monster_race *r_ptr = &r_info[battle_mon[i]];
1408                         int num_taisei = count_bits(r_ptr->flagsr & (RFR_IM_ACID | RFR_IM_ELEC | RFR_IM_FIRE | RFR_IM_COLD | RFR_IM_POIS));
1409
1410                         if (r_ptr->flags1 & RF1_FORCE_MAXHP)
1411                                 power[i] = r_ptr->hdice * r_ptr->hside * 2;
1412                         else
1413                                 power[i] = r_ptr->hdice * (r_ptr->hside + 1);
1414                         power[i] = power[i] * (100 + r_ptr->level) / 100;
1415                         if (r_ptr->speed > 110)
1416                                 power[i] = power[i] * (r_ptr->speed * 2 - 110) / 100;
1417                         if (r_ptr->speed < 110)
1418                                 power[i] = power[i] * (r_ptr->speed - 20) / 100;
1419                         if (num_taisei > 2)
1420                                 power[i] = power[i] * (num_taisei*2+5) / 10;
1421                         else if (r_ptr->a_ability_flags2 & RF6_INVULNER)
1422                                 power[i] = power[i] * 4 / 3;
1423                         else if (r_ptr->a_ability_flags2 & RF6_HEAL)
1424                                 power[i] = power[i] * 4 / 3;
1425                         else if (r_ptr->a_ability_flags1 & RF5_DRAIN_MANA)
1426                                 power[i] = power[i] * 11 / 10;
1427                         if (r_ptr->flags1 & RF1_RAND_25)
1428                                 power[i] = power[i] * 9 / 10;
1429                         if (r_ptr->flags1 & RF1_RAND_50)
1430                                 power[i] = power[i] * 9 / 10;
1431                         if (r_ptr->flagsr & RFR_RES_ALL) power[i] *= 100000;
1432                         if (r_ptr->arena_ratio) power[i] = power[i] * r_ptr->arena_ratio / 100;
1433
1434
1435                         total += power[i];
1436                 }
1437                 for (i=0;i<4;i++)
1438                 {
1439                         power[i] = total*60/power[i];
1440                         if (tekitou && ((power[i] < 160) || power[i] > 1500)) break;
1441                         if ((power[i] < 160) && randint0(20)) break;
1442                         if (power[i] < 101) power[i] = 100 + randint1(5);
1443                         mon_odds[i] = power[i];
1444                 }
1445                 if (i == 4) break;
1446         }
1447 }
1448
1449 /*!
1450  * @brief モンスター闘技場のメインルーチン
1451  * @return 賭けを開始したか否か
1452  */
1453 static bool kakutoujou(void)
1454 {
1455         s32b maxbet;
1456         s32b wager;
1457         char out_val[160], tmp_str[80];
1458         concptr p;
1459
1460         if ((turn - old_battle) > TURNS_PER_TICK*250)
1461         {
1462                 battle_monsters();
1463                 old_battle = turn;
1464         }
1465
1466         screen_save();
1467
1468         /* No money */
1469         if (p_ptr->au < 1)
1470         {
1471                 msg_print(_("おい!おまえ一文なしじゃないか!こっから出ていけ!", "Hey! You don't have gold - get out of here!"));
1472                 msg_print(NULL);
1473                 screen_load();
1474                 return FALSE;
1475         }
1476         else
1477         {
1478                 int i;
1479
1480                 clear_bldg(4, 10);
1481
1482                 prt(_("モンスター                                                     倍率",
1483                           "Monsters                                                       Odds"), 4, 4);
1484                 for (i=0;i<4;i++)
1485                 {
1486                         char buf[80];
1487                         monster_race *r_ptr = &r_info[battle_mon[i]];
1488
1489                         sprintf(buf, _("%d) %-58s  %4ld.%02ld倍", "%d) %-58s  %4ld.%02ld"), i+1, 
1490                                                  _(format("%s%s",r_name + r_ptr->name, (r_ptr->flags1 & RF1_UNIQUE) ? "もどき" : "      "),
1491                                                    format("%s%s", (r_ptr->flags1 & RF1_UNIQUE) ? "Fake " : "", r_name + r_ptr->name)),
1492                                                 (long int)mon_odds[i]/100, (long int)mon_odds[i]%100);
1493                         prt(buf, 5+i, 1);
1494                 }
1495                 prt(_("どれに賭けますか:", "Which monster: "), 0, 0);
1496                 while(1)
1497                 {
1498                         i = inkey();
1499
1500                         if (i == ESCAPE)
1501                         {
1502                                 screen_load();
1503                                 return FALSE;
1504                         }
1505                         if (i >= '1' && i <= '4')
1506                         {
1507                                 sel_monster = i-'1';
1508                                 battle_odds = mon_odds[sel_monster];
1509                                 break;
1510                         }
1511                         else bell();
1512                 }
1513
1514                 clear_bldg(4,4);
1515                 for (i=0;i<4;i++)
1516                         if (i !=sel_monster) clear_bldg(i+5,i+5);
1517
1518                 maxbet = p_ptr->lev * 200;
1519
1520                 /* We can't bet more than we have */
1521                 maxbet = MIN(maxbet, p_ptr->au);
1522
1523                 /* Get the wager */
1524                 strcpy(out_val, "");
1525                 sprintf(tmp_str,_("賭け金 (1-%ld)?", "Your wager (1-%ld) ? "), (long int)maxbet);
1526                 /*
1527                  * Use get_string() because we may need more than
1528                  * the s16b value returned by get_quantity().
1529                  */
1530                 if (get_string(tmp_str, out_val, 32))
1531                 {
1532                         /* Strip spaces */
1533                         for (p = out_val; *p == ' '; p++);
1534
1535                         /* Get the wager */
1536                         wager = atol(p);
1537
1538                         if (wager > p_ptr->au)
1539                         {
1540                                 msg_print(_("おい!金が足りないじゃないか!出ていけ!", "Hey! You don't have the gold - get out of here!"));
1541
1542                                 msg_print(NULL);
1543                                 screen_load();
1544                                 return (FALSE);
1545                         }
1546                         else if (wager > maxbet)
1547                         {
1548                                 msg_format(_("%ldゴールドだけ受けよう。残りは取っときな。", "I'll take %ld gold of that. Keep the rest."), (long int)maxbet);
1549
1550                                 wager = maxbet;
1551                         }
1552                         else if (wager < 1)
1553                         {
1554                                 msg_print(_("OK、1ゴールドでいこう。", "Ok, we'll start with 1 gold."));
1555                                 wager = 1;
1556                         }
1557                         msg_print(NULL);
1558                         battle_odds = MAX(wager+1, wager * battle_odds / 100);
1559                         kakekin = wager;
1560                         p_ptr->au -= wager;
1561                         reset_tim_flags();
1562
1563                         /* Save the surface floor as saved floor */
1564                         prepare_change_floor_mode(CFM_SAVE_FLOORS);
1565
1566                         p_ptr->inside_battle = TRUE;
1567                         p_ptr->leaving = TRUE;
1568
1569                         leave_bldg = TRUE;
1570                         screen_load();
1571
1572                         return (TRUE);
1573                 }
1574         }
1575         screen_load();
1576
1577         return (FALSE);
1578 }
1579
1580 /*!
1581  * @brief 本日の賞金首情報を表示する。
1582  * @return なし
1583  */
1584 static void today_target(void)
1585 {
1586         char buf[160];
1587         monster_race *r_ptr = &r_info[today_mon];
1588
1589         clear_bldg(4,18);
1590         c_put_str(TERM_YELLOW, _("本日の賞金首", "Wanted monster that changes from day to day"), 5, 10);
1591         sprintf(buf,_("ターゲット: %s", "target: %s"),r_name + r_ptr->name);
1592         c_put_str(TERM_YELLOW, buf, 6, 10);
1593         sprintf(buf,_("死体 ---- $%d", "corpse   ---- $%d"), (int)r_ptr->level * 50 + 100);
1594         prt(buf, 8, 10);
1595         sprintf(buf,_("骨   ---- $%d", "skeleton ---- $%d"), (int)r_ptr->level * 30 + 60);
1596         prt(buf, 9, 10);
1597         p_ptr->today_mon = today_mon;
1598 }
1599
1600 /*!
1601  * @brief ツチノコの賞金首情報を表示する。
1602  * @return なし
1603  */
1604 static void tsuchinoko(void)
1605 {
1606         clear_bldg(4,18);
1607         c_put_str(TERM_YELLOW, _("一獲千金の大チャンス!!!", "Big chance to quick money!!!"), 5, 10);
1608         c_put_str(TERM_YELLOW, _("ターゲット:幻の珍獣「ツチノコ」", "target: the rarest animal 'Tsuchinoko'"), 6, 10);
1609         c_put_str(TERM_WHITE, _("生け捕り ---- $1,000,000", "catch alive ---- $1,000,000"), 8, 10);
1610         c_put_str(TERM_WHITE, _("死体     ----   $200,000", "corpse      ----   $200,000"), 9, 10);
1611         c_put_str(TERM_WHITE, _("骨       ----   $100,000", "bones       ----   $100,000"), 10, 10);
1612 }
1613
1614 /*!
1615  * @brief 通常の賞金首情報を表示する。
1616  * @return なし
1617  */
1618 static void shoukinkubi(void)
1619 {
1620         int i;
1621         TERM_LEN y = 0;
1622
1623         clear_bldg(4,18);
1624         prt(_("死体を持ち帰れば報酬を差し上げます。", "Offer a prize when you bring a wanted monster's corpse"),4 ,10);
1625         c_put_str(TERM_YELLOW, _("現在の賞金首", "Wanted monsters"), 6, 10);
1626
1627         for (i = 0; i < MAX_KUBI; i++)
1628         {
1629                 byte color;
1630                 concptr done_mark;
1631                 monster_race *r_ptr = &r_info[(kubi_r_idx[i] > 10000 ? kubi_r_idx[i] - 10000 : kubi_r_idx[i])];
1632
1633                 if (kubi_r_idx[i] > 10000)
1634                 {
1635                         color = TERM_RED;
1636                         done_mark = _("(済)", "(done)");
1637                 }
1638                 else
1639                 {
1640                         color = TERM_WHITE;
1641                         done_mark = "";
1642                 }
1643
1644                 c_prt(color, format("%s %s", r_name + r_ptr->name, done_mark), y+7, 10);
1645
1646                 y = (y+1) % 10;
1647                 if (!y && (i < MAX_KUBI -1))
1648                 {
1649                         prt(_("何かキーを押してください", "Hit any key."), 0, 0);
1650                         (void)inkey();
1651                         prt("", 0, 0);
1652                         clear_bldg(7,18);
1653                 }
1654         }
1655 }
1656
1657
1658
1659 /*!
1660  * 賞金首の報酬テーブル / List of prize object
1661  */
1662 static struct {
1663         OBJECT_TYPE_VALUE tval; /*!< ベースアイテムのメイン種別ID */
1664         OBJECT_SUBTYPE_VALUE sval; /*!< ベースアイテムのサブ種別ID */
1665 } prize_list[MAX_KUBI] = 
1666 {
1667         {TV_POTION, SV_POTION_CURING},
1668         {TV_POTION, SV_POTION_SPEED},
1669         {TV_POTION, SV_POTION_SPEED},
1670         {TV_POTION, SV_POTION_RESISTANCE},
1671         {TV_POTION, SV_POTION_ENLIGHTENMENT},
1672
1673         {TV_POTION, SV_POTION_HEALING},
1674         {TV_POTION, SV_POTION_RESTORE_MANA},
1675         {TV_SCROLL, SV_SCROLL_STAR_DESTRUCTION},
1676         {TV_POTION, SV_POTION_STAR_ENLIGHTENMENT},
1677         {TV_SCROLL, SV_SCROLL_SUMMON_PET},
1678
1679         {TV_SCROLL, SV_SCROLL_GENOCIDE},
1680         {TV_POTION, SV_POTION_STAR_HEALING},
1681         {TV_POTION, SV_POTION_STAR_HEALING},
1682         {TV_POTION, SV_POTION_NEW_LIFE},
1683         {TV_SCROLL, SV_SCROLL_MASS_GENOCIDE},
1684
1685         {TV_POTION, SV_POTION_LIFE},
1686         {TV_POTION, SV_POTION_LIFE},
1687         {TV_POTION, SV_POTION_AUGMENTATION},
1688         {TV_POTION, SV_POTION_INVULNERABILITY},
1689         {TV_SCROLL, SV_SCROLL_ARTIFACT},
1690 };
1691
1692 /*!
1693  * @brief 賞金首の引き換え処理 / Get prize
1694  * @return 各種賞金首のいずれかでも換金が行われたか否か。
1695  */
1696 static bool kankin(void)
1697 {
1698         INVENTORY_IDX i;
1699         int j;
1700         bool change = FALSE;
1701         GAME_TEXT o_name[MAX_NLEN];
1702         object_type *o_ptr;
1703
1704         /* Loop for inventory and right/left arm */
1705         for (i = 0; i <= INVEN_LARM; i++)
1706         {
1707                 o_ptr = &inventory[i];
1708
1709                 /* Living Tsuchinoko worthes $1000000 */
1710                 if ((o_ptr->tval == TV_CAPTURE) && (o_ptr->pval == MON_TSUCHINOKO))
1711                 {
1712                         char buf[MAX_NLEN+20];
1713                         object_desc(o_name, o_ptr, 0);
1714                         sprintf(buf, _("%s を換金しますか?", "Convert %s into money? "),o_name);
1715                         if (get_check(buf))
1716                         {
1717                                 msg_format(_("賞金 %ld$を手に入れた。", "You get %ldgp."), (long int)(1000000L * o_ptr->number));
1718                                 p_ptr->au += 1000000L * o_ptr->number;
1719                                 p_ptr->redraw |= (PR_GOLD);
1720                                 inven_item_increase(i, -o_ptr->number);
1721                                 inven_item_describe(i);
1722                                 inven_item_optimize(i);
1723                         }
1724                         change = TRUE;
1725                 }
1726         }
1727
1728         for (i = 0; i < INVEN_PACK; i++)
1729         {
1730                 o_ptr = &inventory[i];
1731
1732                 /* Corpse of Tsuchinoko worthes $200000 */
1733                 if ((o_ptr->tval == TV_CORPSE) && (o_ptr->sval == SV_CORPSE) && (o_ptr->pval == MON_TSUCHINOKO))
1734                 {
1735                         char buf[MAX_NLEN+20];
1736                         object_desc(o_name, o_ptr, 0);
1737                         sprintf(buf, _("%s を換金しますか?", "Convert %s into money? "),o_name);
1738                         if (get_check(buf))
1739                         {
1740                                 msg_format(_("賞金 %ld$を手に入れた。", "You get %ldgp."), (long int)(200000L * o_ptr->number));
1741                                 p_ptr->au += 200000L * o_ptr->number;
1742                                 p_ptr->redraw |= (PR_GOLD);
1743                                 inven_item_increase(i, -o_ptr->number);
1744                                 inven_item_describe(i);
1745                                 inven_item_optimize(i);
1746                         }
1747                         change = TRUE;
1748                 }
1749         }
1750
1751         for (i = 0; i < INVEN_PACK; i++)
1752         {
1753                 o_ptr = &inventory[i];
1754
1755                 /* Bones of Tsuchinoko worthes $100000 */
1756                 if ((o_ptr->tval == TV_CORPSE) && (o_ptr->sval == SV_SKELETON) && (o_ptr->pval == MON_TSUCHINOKO))
1757                 {
1758                         char buf[MAX_NLEN+20];
1759                         object_desc(o_name, o_ptr, 0);
1760                         sprintf(buf, _("%s を換金しますか?", "Convert %s into money? "),o_name);
1761                         if (get_check(buf))
1762                         {
1763                                 msg_format(_("賞金 %ld$を手に入れた。", "You get %ldgp."), (long int)(100000L * o_ptr->number));
1764                                 p_ptr->au += 100000L * o_ptr->number;
1765                                 p_ptr->redraw |= (PR_GOLD);
1766                                 inven_item_increase(i, -o_ptr->number);
1767                                 inven_item_describe(i);
1768                                 inven_item_optimize(i);
1769                         }
1770                         change = TRUE;
1771                 }
1772         }
1773
1774         for (i = 0; i < INVEN_PACK; i++)
1775         {
1776                 o_ptr = &inventory[i];
1777                 if ((o_ptr->tval == TV_CORPSE) && (o_ptr->sval == SV_CORPSE) && (streq(r_name + r_info[o_ptr->pval].name, r_name + r_info[today_mon].name)))
1778                 {
1779                         char buf[MAX_NLEN+20];
1780                         object_desc(o_name, o_ptr, 0);
1781                         sprintf(buf, _("%s を換金しますか?", "Convert %s into money? "),o_name);
1782                         if (get_check(buf))
1783                         {
1784                                 msg_format(_("賞金 %ld$を手に入れた。", "You get %ldgp."), (long int)((r_info[today_mon].level * 50 + 100) * o_ptr->number));
1785                                 p_ptr->au += (r_info[today_mon].level * 50 + 100) * o_ptr->number;
1786                                 p_ptr->redraw |= (PR_GOLD);
1787                                 inven_item_increase(i, -o_ptr->number);
1788                                 inven_item_describe(i);
1789                                 inven_item_optimize(i);
1790                         }
1791                         change = TRUE;
1792                 }
1793         }
1794
1795         for (i = 0; i < INVEN_PACK; i++)
1796         {
1797                 o_ptr = &inventory[i];
1798
1799                 if ((o_ptr->tval == TV_CORPSE) && (o_ptr->sval == SV_SKELETON) && (streq(r_name + r_info[o_ptr->pval].name, r_name + r_info[today_mon].name)))
1800                 {
1801                         char buf[MAX_NLEN+20];
1802                         object_desc(o_name, o_ptr, 0);
1803                         sprintf(buf, _("%s を換金しますか?", "Convert %s into money? "),o_name);
1804                         if (get_check(buf))
1805                         {
1806                                 msg_format(_("賞金 %ld$を手に入れた。", "You get %ldgp."), (long int)((r_info[today_mon].level * 30 + 60) * o_ptr->number));
1807                                 p_ptr->au += (r_info[today_mon].level * 30 + 60) * o_ptr->number;
1808                                 p_ptr->redraw |= (PR_GOLD);
1809                                 inven_item_increase(i, -o_ptr->number);
1810                                 inven_item_describe(i);
1811                                 inven_item_optimize(i);
1812                         }
1813                         change = TRUE;
1814                 }
1815         }
1816
1817         for (j = 0; j < MAX_KUBI; j++)
1818         {
1819                 /* Need reverse order --- Positions will be changed in the loop */
1820                 for (i = INVEN_PACK-1; i >= 0; i--)
1821                 {
1822                         o_ptr = &inventory[i];
1823                         if ((o_ptr->tval == TV_CORPSE) && (o_ptr->pval == kubi_r_idx[j]))
1824                         {
1825                                 char buf[MAX_NLEN+20];
1826                                 int num, k;
1827                                 INVENTORY_IDX item_new;
1828                                 object_type forge;
1829
1830                                 object_desc(o_name, o_ptr, 0);
1831                                 sprintf(buf, _("%sを渡しますか?", "Hand %s over? "),o_name);
1832                                 if (!get_check(buf)) continue;
1833
1834 #if 0 /* Obsoleted */
1835                                 msg_format(_("賞金 %ld$を手に入れた。", "You get %ldgp."), (r_info[kubi_r_idx[j]].level + 1) * 300 * o_ptr->number);
1836                                 p_ptr->au += (r_info[kubi_r_idx[j]].level+1) * 300 * o_ptr->number;
1837                                 p_ptr->redraw |= (PR_GOLD);
1838                                 inven_item_increase(i, -o_ptr->number);
1839                                 inven_item_describe(i);
1840                                 inven_item_optimize(i);
1841                                 chg_virtue(V_JUSTICE, 5);
1842                                 kubi_r_idx[j] += 10000;
1843
1844                                 change = TRUE;
1845 #endif /* Obsoleted */
1846
1847                                 /* Hand it first */
1848                                 inven_item_increase(i, -o_ptr->number);
1849                                 inven_item_describe(i);
1850                                 inven_item_optimize(i);
1851
1852                                 chg_virtue(V_JUSTICE, 5);
1853                                 kubi_r_idx[j] += 10000;
1854
1855                                 /* Count number of unique corpses already handed */
1856                                 for (num = 0, k = 0; k < MAX_KUBI; k++)
1857                                 {
1858                                         if (kubi_r_idx[k] >= 10000) num++;
1859                                 }
1860                                 msg_format(_("これで合計 %d ポイント獲得しました。" ,"You earned %d point%s total."), num, (num > 1 ? "s" : ""));
1861
1862                                 /* Prepare to make a prize */
1863                                 object_prep(&forge, lookup_kind(prize_list[num-1].tval, prize_list[num-1].sval));
1864                                 apply_magic(&forge, object_level, AM_NO_FIXED_ART);
1865
1866                                 /* Identify it fully */
1867                                 object_aware(&forge);
1868                                 object_known(&forge);
1869
1870                                 /*
1871                                  * Hand it --- Assume there is an empty slot.
1872                                  * Since a corpse is handed at first,
1873                                  * there is at least one empty slot.
1874                                  */
1875                                 item_new = inven_carry(&forge);
1876
1877                                 object_desc(o_name, &forge, 0);
1878                                 msg_format(_("%s(%c)を貰った。", "You get %s (%c). "), o_name, index_to_label(item_new));
1879
1880                                 /* Auto-inscription */
1881                                 autopick_alter_item(item_new, FALSE);
1882                                 handle_stuff();
1883
1884                                 change = TRUE;
1885                         }
1886                 }
1887         }
1888
1889         if (!change)
1890         {
1891                 msg_print(_("賞金を得られそうなものは持っていなかった。", "You have nothing."));
1892                 msg_print(NULL);
1893                 return FALSE;
1894         }
1895         return TRUE;
1896 }
1897
1898 /*!
1899  * @brief 宿屋の利用サブルーチン
1900  * @details inn commands\n
1901  * Note that resting for the night was a perfect way to avoid player\n
1902  * ghosts in the town *if* you could only make it to the inn in time (-:\n
1903  * Now that the ghosts are temporarily disabled in 2.8.X, this function\n
1904  * will not be that useful.  I will keep it in the hopes the player\n
1905  * ghost code does become a reality again. Does help to avoid filthy urchins.\n
1906  * Resting at night is also a quick way to restock stores -KMW-\n
1907  * @param cmd 宿屋の利用施設ID
1908  * @return 施設の利用が実際に行われたか否か。
1909  */
1910 static bool inn_comm(int cmd)
1911 {
1912         switch (cmd)
1913         {
1914                 case BACT_FOOD: /* Buy food & drink */
1915                         if (p_ptr->food >= PY_FOOD_FULL)
1916                         {
1917                                 msg_print(_("今は満腹だ。", "You are full now."));
1918                                 return FALSE;
1919                         }
1920                         msg_print(_("バーテンはいくらかの食べ物とビールをくれた。", "The barkeep gives you some gruel and a beer."));
1921                         (void)set_food(PY_FOOD_MAX - 1);
1922                         break;
1923
1924                 case BACT_REST: /* Rest for the night */
1925                         if ((p_ptr->poisoned) || (p_ptr->cut))
1926                         {
1927                                 msg_print(_("あなたに必要なのは部屋ではなく、治療者です。", "You need a healer, not a room."));
1928                                 msg_print(NULL);
1929                                 msg_print(_("すみません、でもうちで誰かに死なれちゃ困りますんで。", "Sorry, but don't want anyone dying in here."));
1930                         }
1931                         else
1932                         {
1933                                 s32b oldturn = turn;
1934                                 int prev_day, prev_hour, prev_min;
1935
1936                                 extract_day_hour_min(&prev_day, &prev_hour, &prev_min);
1937                                 if ((prev_hour >= 6) && (prev_hour <= 17)) 
1938                                         do_cmd_write_nikki(NIKKI_BUNSHOU, 0, _("宿屋に泊まった。", "stay over daytime at the inn."));
1939                                 else
1940                                         do_cmd_write_nikki(NIKKI_BUNSHOU, 0, _("宿屋に泊まった。", "stay over night at the inn."));
1941                                 
1942                                 turn = (turn / (TURNS_PER_TICK * TOWN_DAWN / 2) + 1) * (TURNS_PER_TICK * TOWN_DAWN / 2);
1943                                 if (dungeon_turn < dungeon_turn_limit)
1944                                 {
1945                                         dungeon_turn += MIN((turn - oldturn), TURNS_PER_TICK * 250) * INN_DUNGEON_TURN_ADJ;
1946                                         if (dungeon_turn > dungeon_turn_limit) dungeon_turn = dungeon_turn_limit;
1947                                 }
1948
1949                                 prevent_turn_overflow();
1950
1951                                 if ((prev_hour >= 18) && (prev_hour <= 23)) do_cmd_write_nikki(NIKKI_HIGAWARI, 0, NULL);
1952                                 p_ptr->chp = p_ptr->mhp;
1953
1954                                 if (ironman_nightmare)
1955                                 {
1956                                         msg_print(_("眠りに就くと恐ろしい光景が心をよぎった。", "Horrible visions flit through your mind as you sleep."));
1957
1958                                         /* Have some nightmares */
1959                                         while(1)
1960                                         {
1961                                                 sanity_blast(NULL, FALSE);
1962                                                 if (!one_in_(3)) break;
1963                                         }
1964
1965                                         msg_print(_("あなたは絶叫して目を覚ました。", "You awake screaming."));
1966                                         do_cmd_write_nikki(NIKKI_BUNSHOU, 0, _("悪夢にうなされてよく眠れなかった。", "be troubled by a nightmare."));
1967                                 }
1968                                 else
1969                                 {
1970                                         set_blind(0);
1971                                         set_confused(0);
1972                                         p_ptr->stun = 0;
1973                                         p_ptr->chp = p_ptr->mhp;
1974                                         p_ptr->csp = p_ptr->msp;
1975                                         if (p_ptr->pclass == CLASS_MAGIC_EATER)
1976                                         {
1977                                                 int i;
1978                                                 for (i = 0; i < 72; i++)
1979                                                 {
1980                                                         p_ptr->magic_num1[i] = p_ptr->magic_num2[i] * EATER_CHARGE;
1981                                                 }
1982                                                 for (; i < 108; i++)
1983                                                 {
1984                                                         p_ptr->magic_num1[i] = 0;
1985                                                 }
1986                                         }
1987
1988                                         if ((prev_hour >= 6) && (prev_hour <= 17))
1989                                         {
1990                                                 msg_print(_("あなたはリフレッシュして目覚め、夕方を迎えた。", "You awake refreshed for the evening."));
1991                                                 do_cmd_write_nikki(NIKKI_BUNSHOU, 0, _("夕方を迎えた。", "awake refreshed."));
1992                                         }
1993                                         else
1994                                         {
1995                                                 msg_print(_("あなたはリフレッシュして目覚め、新たな日を迎えた。", "You awake refreshed for the new day."));
1996                                                 do_cmd_write_nikki(NIKKI_BUNSHOU, 0, _("すがすがしい朝を迎えた。", "awake refreshed."));
1997                                         }
1998                                 }
1999                         }
2000                         break;
2001
2002                 case BACT_RUMORS: /* Listen for rumors */
2003                         {
2004                                 display_rumor(TRUE);
2005                                 break;
2006                         }
2007         }
2008
2009         return (TRUE);
2010 }
2011
2012
2013 /*!
2014  * @brief クエスト情報を表示しつつ処理する。/ Display quest information
2015  * @param questnum クエストのID
2016  * @param do_init クエストの開始処理(TRUE)、結果処理か(FALSE)
2017  * @return なし
2018  */
2019 static void get_questinfo(IDX questnum, bool do_init)
2020 {
2021         int i;
2022         IDX old_quest;
2023         GAME_TEXT tmp_str[80];
2024
2025         /* Clear the text */
2026         for (i = 0; i < 10; i++)
2027         {
2028                 quest_text[i][0] = '\0';
2029         }
2030
2031         quest_text_line = 0;
2032
2033         /* Set the quest number temporary */
2034         old_quest = p_ptr->inside_quest;
2035         p_ptr->inside_quest = questnum;
2036
2037         /* Get the quest text */
2038         init_flags = INIT_SHOW_TEXT;
2039         if (do_init) init_flags |= INIT_ASSIGN;
2040
2041         process_dungeon_file("q_info.txt", 0, 0, 0, 0);
2042
2043         /* Reset the old quest number */
2044         p_ptr->inside_quest = old_quest;
2045
2046         /* Print the quest info */
2047         sprintf(tmp_str, _("クエスト情報 (危険度: %d 階相当)", "Quest Information (Danger level: %d)"), (int)quest[questnum].level);
2048
2049         prt(tmp_str, 5, 0);
2050
2051         prt(quest[questnum].name, 7, 0);
2052
2053         for (i = 0; i < 10; i++)
2054         {
2055                 c_put_str(TERM_YELLOW, quest_text[i], i + 8, 0);
2056         }
2057 }
2058
2059 /*!
2060  * @brief クエスト処理のメインルーチン / Request a quest from the Lord.
2061  * @return なし
2062  */
2063 static void castle_quest(void)
2064 {
2065         IDX q_index = 0;
2066         monster_race    *r_ptr;
2067         quest_type      *q_ptr;
2068         concptr            name;
2069
2070
2071         clear_bldg(4, 18);
2072
2073         /* Current quest of the building */
2074         q_index = cave[p_ptr->y][p_ptr->x].special;
2075
2076         /* Is there a quest available at the building? */
2077         if (!q_index)
2078         {
2079                 put_str(_("今のところクエストはありません。", "I don't have a quest for you at the moment."), 8, 0);
2080                 return;
2081         }
2082
2083         q_ptr = &quest[q_index];
2084
2085         /* Quest is completed */
2086         if (q_ptr->status == QUEST_STATUS_COMPLETED)
2087         {
2088                 /* Rewarded quest */
2089                 q_ptr->status = QUEST_STATUS_REWARDED;
2090
2091                 get_questinfo(q_index, FALSE);
2092
2093                 reinit_wilderness = TRUE;
2094         }
2095         /* Failed quest */
2096         else if (q_ptr->status == QUEST_STATUS_FAILED)
2097         {
2098                 get_questinfo(q_index, FALSE);
2099
2100                 /* Mark quest as done (but failed) */
2101                 q_ptr->status = QUEST_STATUS_FAILED_DONE;
2102
2103                 reinit_wilderness = TRUE;
2104         }
2105         /* Quest is still unfinished */
2106         else if (q_ptr->status == QUEST_STATUS_TAKEN)
2107         {
2108                 put_str(_("あなたは現在のクエストを終了させていません!", "You have not completed your current quest yet!"), 8, 0);
2109                 put_str(_("CTRL-Qを使えばクエストの状態がチェックできます。", "Use CTRL-Q to check the status of your quest."), 9, 0);
2110                 put_str(_("クエストを終わらせたら戻って来て下さい。", "Return when you have completed your quest."), 12, 0);
2111         }
2112         /* No quest yet */
2113         else if (q_ptr->status == QUEST_STATUS_UNTAKEN)
2114         {
2115                 q_ptr->status = QUEST_STATUS_TAKEN;
2116
2117                 reinit_wilderness = TRUE;
2118
2119                 /* Assign a new quest */
2120                 if (q_ptr->type == QUEST_TYPE_KILL_ANY_LEVEL)
2121                 {
2122                         if (q_ptr->r_idx == 0)
2123                         {
2124                                 /* Random monster at least 5 - 10 levels out of deep */
2125                                 q_ptr->r_idx = get_mon_num(q_ptr->level + 4 + randint1(6));
2126                         }
2127
2128                         r_ptr = &r_info[q_ptr->r_idx];
2129
2130                         while ((r_ptr->flags1 & RF1_UNIQUE) || (r_ptr->rarity != 1))
2131                         {
2132                                 q_ptr->r_idx = get_mon_num(q_ptr->level) + 4 + randint1(6);
2133                                 r_ptr = &r_info[q_ptr->r_idx];
2134                         }
2135
2136                         if (q_ptr->max_num == 0)
2137                         {
2138                                 /* Random monster number */
2139                                 if (randint1(10) > 7)
2140                                         q_ptr->max_num = 1;
2141                                 else
2142                                         q_ptr->max_num = randint1(3) + 1;
2143                         }
2144
2145                         q_ptr->cur_num = 0;
2146                         name = (r_name + r_ptr->name);
2147                         msg_format(_("クエスト: %sを %d体倒す", "Your quest: kill %d %s"), name,q_ptr->max_num);
2148                 }
2149                 else
2150                 {
2151                         get_questinfo(q_index, TRUE);
2152                 }
2153         }
2154 }
2155
2156
2157 /*!
2158  * @brief 町に関するヘルプを表示する / Display town history
2159  * @return なし
2160  */
2161 static void town_history(void)
2162 {
2163         screen_save();
2164
2165         /* Peruse the building help file */
2166         (void)show_file(TRUE, _("jbldg.txt", "bldg.txt"), NULL, 0, 0);
2167         screen_load();
2168 }
2169
2170 /*!
2171  * @brief 射撃時クリティカルによるダメージ期待値修正計算(スナイパーの集中処理と武器経験値) / critical happens at i / 10000
2172  * @param plus_ammo 矢弾のダメージ修正
2173  * @param plus_bow 弓のダメージ修正
2174  * @return ダメージ期待値
2175  * @note 基本ダメージ量と重量はこの部位では計算に加わらない。
2176  */
2177 HIT_POINT calc_crit_ratio_shot(HIT_POINT plus_ammo, HIT_POINT plus_bow)
2178 {
2179         HIT_POINT i;
2180         object_type *j_ptr =  &inventory[INVEN_BOW];
2181         
2182         /* Extract "shot" power */
2183         i = p_ptr->to_h_b + plus_ammo;
2184         
2185         if (p_ptr->tval_ammo == TV_BOLT)
2186                 i = (p_ptr->skill_thb + (p_ptr->weapon_exp[0][j_ptr->sval] / 400 + i) * BTH_PLUS_ADJ);
2187         else
2188                 i = (p_ptr->skill_thb + ((p_ptr->weapon_exp[0][j_ptr->sval] - (WEAPON_EXP_MASTER / 2)) / 200 + i) * BTH_PLUS_ADJ);
2189
2190         /* Snipers can shot more critically with crossbows */
2191         if (p_ptr->concent) i += ((i * p_ptr->concent) / 5);
2192         if ((p_ptr->pclass == CLASS_SNIPER) && (p_ptr->tval_ammo == TV_BOLT)) i *= 2;
2193         
2194         /* Good bow makes more critical */
2195         i += plus_bow * 8 * (p_ptr->concent ? p_ptr->concent + 5 : 5);
2196         
2197         if (i < 0) i = 0;
2198         
2199         return i;
2200 }
2201
2202 /*!
2203  * @brief 射撃時クリティカルによるダメージ期待値修正計算(重量依存部分) / critical happens at i / 10000
2204  * @param weight 武器の重量
2205  * @param plus_ammo 矢弾のダメージ修正
2206  * @param plus_bow 弓のダメージ修正
2207  * @param dam 基本ダメージ量
2208  * @return ダメージ期待値
2209  */
2210 HIT_POINT calc_expect_crit_shot(WEIGHT weight, int plus_ammo, int plus_bow,  HIT_POINT dam)
2211 {
2212         u32b num;
2213         int i, k, crit;
2214         i = calc_crit_ratio_shot(plus_ammo, plus_bow);
2215         
2216         k = 0;
2217         num = 0;
2218         
2219         crit = MIN(500, 900/weight);
2220         num += dam * 3 /2 * crit;
2221         k = crit;
2222         
2223         crit = MIN(500, 1350/weight);
2224         crit -= k;
2225         num += dam * 2 * crit;
2226         k += crit;
2227         
2228         if(k < 500)
2229         {
2230                 crit = 500 - k;
2231                 num += dam * 3 * crit;
2232         }
2233         
2234         num /= 500;
2235         
2236         num *= i;
2237         num += (10000 - i) * dam;
2238         num /= 10000;
2239         
2240         return num;
2241 }
2242
2243 /*!
2244  * @brief 攻撃時クリティカルによるダメージ期待値修正計算(重量と毒針処理) / critical happens at i / 10000
2245  * @param weight 武器の重量
2246  * @param plus 武器のダメージ修正
2247  * @param dam 基本ダメージ
2248  * @param meichuu 命中値
2249  * @param dokubari 毒針処理か否か
2250  * @return ダメージ期待値
2251  */
2252 HIT_POINT calc_expect_crit(WEIGHT weight, int plus, HIT_POINT dam, s16b meichuu, bool dokubari)
2253 {
2254         u32b k, num;
2255         int i;
2256         
2257         if(dokubari) return dam;
2258         
2259         i = (weight + (meichuu * 3 + plus * 5) + p_ptr->skill_thn);
2260         if (i < 0) i = 0;
2261         
2262         k = weight;
2263         num = 0;
2264         
2265         if (k < 400)                                            num += (2 * dam + 5) * (400 - k);
2266         if (k < 700)                                            num += (2 * dam + 10) * (MIN(700, k + 650) - MAX(400, k));
2267         if (k > (700 - 650) && k < 900)         num += (3 * dam + 15) * (MIN(900, k + 650) - MAX(700, k));
2268         if (k > (900 - 650) && k < 1300)                num += (3 * dam + 20) * (MIN(1300, k + 650) - MAX(900, k));
2269         if (k > (1300 - 650))                                   num += (7 * dam / 2 + 25) * MIN(650, k - (1300 - 650));
2270         
2271         num /= 650;
2272         if(p_ptr->pclass == CLASS_NINJA)
2273         {
2274                 num *= i;
2275                 num += (4444 - i) * dam;
2276                 num /= 4444;
2277         }
2278         else
2279         {
2280                 num *= i;
2281                 num += (5000 - i) * dam;
2282                 num /= 5000;
2283         }
2284         
2285         return num;
2286 }
2287
2288 /*!
2289  * @brief 攻撃時スレイによるダメージ期待値修正計算 / critical happens at i / 10000
2290  * @param dam 基本ダメージ
2291  * @param mult スレイ倍率(掛け算部分)
2292  * @param div スレイ倍率(割り算部分)
2293  * @param force 理力特別計算フラグ
2294  * @return ダメージ期待値
2295  */
2296 static HIT_POINT calc_slaydam(HIT_POINT dam, int mult, int div, bool force)
2297 {
2298         int tmp;
2299         if(force)
2300         {
2301                 tmp = dam * 60;
2302                 tmp *= mult * 3;
2303                 tmp /= div * 2;
2304                 tmp += dam * 60 * 2;
2305                 tmp /= 60;
2306         }
2307         else
2308         {
2309                 tmp = dam * 60;
2310                 tmp *= mult; 
2311                 tmp /= div;
2312                 tmp /= 60;
2313         }
2314         return tmp;
2315 }
2316
2317 /*!
2318  * @brief 攻撃時の期待値計算(スレイ→重量クリティカル→切れ味効果)
2319  * @param dam 基本ダメージ
2320  * @param mult スレイ倍率(掛け算部分)
2321  * @param div スレイ倍率(割り算部分)
2322  * @param force 理力特別計算フラグ
2323  * @param weight 重量
2324  * @param plus 武器ダメージ修正
2325  * @param meichuu 命中値
2326  * @param dokubari 毒針処理か否か
2327  * @param vorpal_mult 切れ味倍率(掛け算部分)
2328  * @param vorpal_div 切れ味倍率(割り算部分)
2329  * @return ダメージ期待値
2330  */
2331 static u32b calc_expect_dice(u32b dam, int mult, int div, bool force, WEIGHT weight, int plus, s16b meichuu, bool dokubari, int vorpal_mult, int vorpal_div)
2332 {
2333         dam = calc_slaydam(dam, mult, div, force);
2334         dam = calc_expect_crit(weight, plus, dam, meichuu, dokubari);
2335         dam = calc_slaydam(dam, vorpal_mult, vorpal_div, FALSE);
2336         return dam;
2337 }
2338
2339
2340 /*!
2341  * @brief 武器の各条件毎のダメージ期待値を表示する。
2342  * @param r 表示行
2343  * @param c 表示列
2344  * @param mindice ダイス部分最小値
2345  * @param maxdice ダイス部分最大値
2346  * @param blows 攻撃回数
2347  * @param dam_bonus ダメージ修正値
2348  * @param attr 条件内容
2349  * @param color 条件内容の表示色
2350  * @details
2351  * Display the damage figure of an object\n
2352  * (used by compare_weapon_aux)\n
2353  * \n
2354  * Only accurate for the current weapon, because it includes\n
2355  * the current +dam of the player.\n
2356  * @return なし
2357  */
2358 static void show_weapon_dmg(int r, int c, int mindice, int maxdice, int blows, int dam_bonus, concptr attr, byte color)
2359 {
2360         GAME_TEXT tmp_str[80];
2361         int mindam, maxdam;
2362         
2363         mindam = blows * (mindice + dam_bonus);
2364         maxdam = blows * (maxdice + dam_bonus);
2365
2366         /* Print the intro text */
2367         c_put_str(color, attr, r, c);
2368
2369         /* Calculate the min and max damage figures */
2370         sprintf(tmp_str, _("1ターン: %d-%d ダメージ", "Attack: %d-%d damage"), mindam, maxdam);
2371         
2372         /* Print the damage */
2373         put_str(tmp_str, r, c + 8);
2374 }
2375
2376
2377 /*!
2378  * @brief 武器一つ毎のダメージ情報を表示する。
2379  * @param o_ptr オブジェクトの構造体の参照ポインタ。
2380  * @param col 表示する行の上端
2381  * @param r 表示する列の左端
2382  * @details
2383  * Show the damage figures for the various monster types\n
2384  * \n
2385  * Only accurate for the current weapon, because it includes\n
2386  * the current number of blows for the player.\n
2387  * @return なし
2388  */
2389 static void compare_weapon_aux(object_type *o_ptr, int col, int r)
2390 {
2391         BIT_FLAGS flgs[TR_FLAG_SIZE];
2392         int blow = p_ptr->num_blow[0];
2393         bool force = FALSE;
2394         bool dokubari = FALSE;
2395         
2396         /* Effective dices */
2397         int eff_dd = o_ptr->dd + p_ptr->to_dd[0];
2398         int eff_ds = o_ptr->ds + p_ptr->to_ds[0];
2399         
2400         int mindice = eff_dd;
2401         int maxdice = eff_ds * eff_dd;
2402         int mindam = 0;
2403         int maxdam = 0;
2404         int vorpal_mult = 1;
2405         int vorpal_div = 1;
2406         int dmg_bonus = o_ptr->to_d + p_ptr->to_d[0];
2407         
2408
2409         /* Get the flags of the weapon */
2410         object_flags(o_ptr, flgs);
2411         
2412         if((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_DOKUBARI)) dokubari = TRUE;
2413         
2414         
2415         /* Show Critical Damage*/
2416         mindam = calc_expect_crit(o_ptr->weight, o_ptr->to_h, mindice, p_ptr->to_h[0], dokubari);
2417         maxdam = calc_expect_crit(o_ptr->weight, o_ptr->to_h, maxdice, p_ptr->to_h[0], dokubari);
2418         
2419         show_weapon_dmg(r++, col, mindam, maxdam, blow, dmg_bonus, _("会心:", "Critical:"), TERM_L_RED);
2420
2421         
2422         /* Vorpal Hit*/
2423         if ((have_flag(flgs, TR_VORPAL) || hex_spelling(HEX_RUNESWORD)))
2424         {
2425                 if((o_ptr->name1 == ART_VORPAL_BLADE) || (o_ptr->name1 == ART_CHAINSWORD))
2426                 {
2427                         vorpal_mult = 5;
2428                         vorpal_div = 3;
2429                 }
2430                 else
2431                 {
2432                         vorpal_mult = 11;
2433                         vorpal_div = 9;
2434                 }
2435                 
2436                 mindam = calc_expect_dice(mindice, 1, 1, FALSE, o_ptr->weight, o_ptr->to_h, p_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
2437                 maxdam = calc_expect_dice(maxdice, 1, 1, FALSE, o_ptr->weight, o_ptr->to_h, p_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);         
2438                 show_weapon_dmg(r++, col, mindam, maxdam, blow, dmg_bonus, _("切れ味:", "Vorpal:") , TERM_L_RED);
2439         }       
2440         
2441         if ((p_ptr->pclass != CLASS_SAMURAI) && have_flag(flgs, TR_FORCE_WEAPON) && (p_ptr->csp > (o_ptr->dd * o_ptr->ds / 5)))
2442         {
2443                 force = TRUE;
2444                 
2445                 mindam = calc_expect_dice(mindice, 1, 1, force, o_ptr->weight, o_ptr->to_h, p_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
2446                 maxdam = calc_expect_dice(maxdice, 1, 1, force, o_ptr->weight, o_ptr->to_h, p_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
2447                 show_weapon_dmg(r++, col, mindam, maxdam, blow, dmg_bonus, _("理力:", "Force  :"), TERM_L_BLUE);
2448         }
2449                 
2450         /* Print the relevant lines */
2451         if (have_flag(flgs, TR_KILL_ANIMAL))
2452         {
2453                 mindam = calc_expect_dice(mindice, 4, 1, force, o_ptr->weight, o_ptr->to_h, p_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
2454                 maxdam = calc_expect_dice(maxdice, 4, 1, force, o_ptr->weight, o_ptr->to_h, p_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);         
2455                 show_weapon_dmg(r++, col, mindam, maxdam, blow, dmg_bonus,  _("動物:", "Animals:"), TERM_YELLOW);
2456         }
2457         else if (have_flag(flgs, TR_SLAY_ANIMAL)) 
2458         {
2459                 mindam = calc_expect_dice(mindice, 5, 2, force, o_ptr->weight, o_ptr->to_h, p_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
2460                 maxdam = calc_expect_dice(maxdice, 5, 2, force, o_ptr->weight, o_ptr->to_h, p_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
2461                 show_weapon_dmg(r++, col, mindam, maxdam, blow, dmg_bonus,  _("動物:", "Animals:"), TERM_YELLOW);
2462         }
2463         if (have_flag(flgs, TR_KILL_EVIL))
2464         {       
2465                 mindam = calc_expect_dice(mindice, 7, 2, force, o_ptr->weight, o_ptr->to_h, p_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
2466                 maxdam = calc_expect_dice(maxdice, 7, 2, force, o_ptr->weight, o_ptr->to_h, p_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
2467                 show_weapon_dmg(r++, col, mindam, maxdam, blow, dmg_bonus,  _("邪悪:", "Evil:"), TERM_YELLOW);
2468         }
2469         else if (have_flag(flgs, TR_SLAY_EVIL))
2470         {       
2471                 mindam = calc_expect_dice(mindice, 2, 1, force, o_ptr->weight, o_ptr->to_h, p_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
2472                 maxdam = calc_expect_dice(maxdice, 2, 1, force, o_ptr->weight, o_ptr->to_h, p_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);         
2473                 show_weapon_dmg(r++, col, mindam, maxdam, blow, dmg_bonus,  _("邪悪:", "Evil:"), TERM_YELLOW);
2474         }
2475         if (have_flag(flgs, TR_KILL_HUMAN))
2476         {       
2477                 mindam = calc_expect_dice(mindice, 4, 1, force, o_ptr->weight, o_ptr->to_h, p_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
2478                 maxdam = calc_expect_dice(maxdice, 4, 1, force, o_ptr->weight, o_ptr->to_h, p_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
2479                 show_weapon_dmg(r++, col, mindam, maxdam, blow, dmg_bonus,  _("人間:", "Human:"), TERM_YELLOW);
2480         }
2481         else if (have_flag(flgs, TR_SLAY_HUMAN))
2482         {       
2483                 mindam = calc_expect_dice(mindice, 5, 2, force, o_ptr->weight, o_ptr->to_h, p_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
2484                 maxdam = calc_expect_dice(maxdice, 5, 2, force, o_ptr->weight, o_ptr->to_h, p_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
2485                 show_weapon_dmg(r++, col, mindam, maxdam, blow, dmg_bonus,  _("人間:", "Human:"), TERM_YELLOW);
2486         }
2487         if (have_flag(flgs, TR_KILL_UNDEAD))
2488         {
2489                 mindam = calc_expect_dice(mindice, 5, 1, force, o_ptr->weight, o_ptr->to_h, p_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
2490                 maxdam = calc_expect_dice(maxdice, 5, 1, force, o_ptr->weight, o_ptr->to_h, p_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
2491                 show_weapon_dmg(r++, col, mindam, maxdam, blow, dmg_bonus,  _("不死:", "Undead:"), TERM_YELLOW);
2492         }
2493         else if (have_flag(flgs, TR_SLAY_UNDEAD)) 
2494         {
2495                 mindam = calc_expect_dice(mindice, 3, 1, force, o_ptr->weight, o_ptr->to_h, p_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
2496                 maxdam = calc_expect_dice(maxdice, 3, 1, force, o_ptr->weight, o_ptr->to_h, p_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
2497                 show_weapon_dmg(r++, col, mindam, maxdam, blow, dmg_bonus,  _("不死:", "Undead:"), TERM_YELLOW);
2498         }
2499         if (have_flag(flgs, TR_KILL_DEMON))
2500         {       
2501                 mindam = calc_expect_dice(mindice, 5, 1, force, o_ptr->weight, o_ptr->to_h, p_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
2502                 maxdam = calc_expect_dice(maxdice, 5, 1, force, o_ptr->weight, o_ptr->to_h, p_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
2503                 show_weapon_dmg(r++, col, mindam, maxdam, blow, dmg_bonus,  _("悪魔:", "Demons:") , TERM_YELLOW);
2504         }
2505         else if (have_flag(flgs, TR_SLAY_DEMON))
2506         {       
2507                 mindam = calc_expect_dice(mindice, 3, 1, force, o_ptr->weight, o_ptr->to_h, p_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
2508                 maxdam = calc_expect_dice(maxdice, 3, 1, force, o_ptr->weight, o_ptr->to_h, p_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
2509                 show_weapon_dmg(r++, col, mindam, maxdam, blow, dmg_bonus, _("悪魔:", "Demons:") , TERM_YELLOW);
2510         }
2511         if (have_flag(flgs, TR_KILL_ORC))
2512         {
2513                 mindam = calc_expect_dice(mindice, 5, 1, force, o_ptr->weight, o_ptr->to_h, p_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
2514                 maxdam = calc_expect_dice(maxdice, 5, 1, force, o_ptr->weight, o_ptr->to_h, p_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
2515                 show_weapon_dmg(r++, col, mindam, maxdam, blow, dmg_bonus,  _("オーク:", "Orcs:"), TERM_YELLOW);
2516         }
2517         else if (have_flag(flgs, TR_SLAY_ORC))
2518         {
2519                 mindam = calc_expect_dice(mindice, 3, 1, force, o_ptr->weight, o_ptr->to_h, p_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
2520                 maxdam = calc_expect_dice(maxdice, 3, 1, force, o_ptr->weight, o_ptr->to_h, p_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
2521                 show_weapon_dmg(r++, col, mindam, maxdam, blow, dmg_bonus,  _("オーク:", "Orcs:"), TERM_YELLOW);
2522         }
2523         if (have_flag(flgs, TR_KILL_TROLL))
2524         {
2525                 mindam = calc_expect_dice(mindice, 5, 1, force, o_ptr->weight, o_ptr->to_h, p_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
2526                 maxdam = calc_expect_dice(maxdice, 5, 1, force, o_ptr->weight, o_ptr->to_h, p_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
2527                 show_weapon_dmg(r++, col, mindam, maxdam, blow, dmg_bonus,  _("トロル:", "Trolls:") , TERM_YELLOW);
2528         }
2529         else if (have_flag(flgs, TR_SLAY_TROLL))
2530         {
2531                 mindam = calc_expect_dice(mindice, 3, 1, force, o_ptr->weight, o_ptr->to_h, p_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
2532                 maxdam = calc_expect_dice(maxdice, 3, 1, force, o_ptr->weight, o_ptr->to_h, p_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
2533                 show_weapon_dmg(r++, col, mindam, maxdam, blow, dmg_bonus,   _("トロル:", "Trolls:") , TERM_YELLOW);
2534         }
2535         if (have_flag(flgs, TR_KILL_GIANT))
2536         {
2537                 mindam = calc_expect_dice(mindice, 5, 1, force, o_ptr->weight, o_ptr->to_h, p_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
2538                 maxdam = calc_expect_dice(maxdice, 5, 1, force, o_ptr->weight, o_ptr->to_h, p_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
2539                 show_weapon_dmg(r++, col, mindam, maxdam, blow, dmg_bonus,  _("巨人:", "Giants:"), TERM_YELLOW);
2540         }
2541         else if (have_flag(flgs, TR_SLAY_GIANT))
2542         {
2543                 mindam = calc_expect_dice(mindice, 3, 1, force, o_ptr->weight, o_ptr->to_h, p_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
2544                 maxdam = calc_expect_dice(maxdice, 3, 1, force, o_ptr->weight, o_ptr->to_h, p_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
2545                 show_weapon_dmg(r++, col, mindam, maxdam, blow, dmg_bonus,  _("巨人:", "Giants:"), TERM_YELLOW);
2546         }
2547         if (have_flag(flgs, TR_KILL_DRAGON))
2548         {
2549                 mindam = calc_expect_dice(mindice, 5, 1, force, o_ptr->weight, o_ptr->to_h, p_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
2550                 maxdam = calc_expect_dice(maxdice, 5, 1, force, o_ptr->weight, o_ptr->to_h, p_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
2551                 show_weapon_dmg(r++, col, mindam, maxdam, blow, dmg_bonus,  _("竜:", "Dragons:"), TERM_YELLOW);
2552         }
2553         else if (have_flag(flgs, TR_SLAY_DRAGON))
2554         {               
2555                 mindam = calc_expect_dice(mindice, 3, 1, force, o_ptr->weight, o_ptr->to_h, p_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
2556                 maxdam = calc_expect_dice(maxdice, 3, 1, force, o_ptr->weight, o_ptr->to_h, p_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
2557                 show_weapon_dmg(r++, col, mindam, maxdam, blow, dmg_bonus,   _("竜:", "Dragons:"), TERM_YELLOW);
2558         }
2559         if (have_flag(flgs, TR_BRAND_ACID))
2560         {
2561                 mindam = calc_expect_dice(mindice, 5, 2, force, o_ptr->weight, o_ptr->to_h, p_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
2562                 maxdam = calc_expect_dice(maxdice, 5, 2, force, o_ptr->weight, o_ptr->to_h, p_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
2563                 show_weapon_dmg(r++, col, mindam, maxdam, blow, dmg_bonus,  _("酸属性:", "Acid:"), TERM_RED);
2564         }
2565         if (have_flag(flgs, TR_BRAND_ELEC))
2566         {
2567                 mindam = calc_expect_dice(mindice, 5, 2, force, o_ptr->weight, o_ptr->to_h, p_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
2568                 maxdam = calc_expect_dice(maxdice, 5, 2, force, o_ptr->weight, o_ptr->to_h, p_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
2569                 show_weapon_dmg(r++, col, mindam, maxdam, blow, dmg_bonus,  _("電属性:", "Elec:"), TERM_RED);
2570         }
2571         if (have_flag(flgs, TR_BRAND_FIRE))
2572         {
2573                 mindam = calc_expect_dice(mindice, 5, 2, force, o_ptr->weight, o_ptr->to_h, p_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
2574                 maxdam = calc_expect_dice(maxdice, 5, 2, force, o_ptr->weight, o_ptr->to_h, p_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
2575                 show_weapon_dmg(r++, col, mindam, maxdam, blow, dmg_bonus,  _("炎属性:", "Fire:"), TERM_RED);
2576         }
2577         if (have_flag(flgs, TR_BRAND_COLD))
2578         {
2579                 mindam = calc_expect_dice(mindice, 5, 2, force, o_ptr->weight, o_ptr->to_h, p_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
2580                 maxdam = calc_expect_dice(maxdice, 5, 2, force, o_ptr->weight, o_ptr->to_h, p_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
2581                 show_weapon_dmg(r++, col, mindam, maxdam, blow, dmg_bonus,  _("冷属性:", "Cold:"), TERM_RED);
2582         }
2583         if (have_flag(flgs, TR_BRAND_POIS))
2584         {
2585                 mindam = calc_expect_dice(mindice, 5, 2, force, o_ptr->weight, o_ptr->to_h, p_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
2586                 maxdam = calc_expect_dice(maxdice, 5, 2, force, o_ptr->weight, o_ptr->to_h, p_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
2587                 show_weapon_dmg(r++, col, mindam, maxdam, blow, dmg_bonus, _("毒属性:", "Poison:"), TERM_RED);
2588         }
2589 }
2590
2591 /*!
2592  * @brief 武器匠における武器一つ毎の完全情報を表示する。
2593  * @param o_ptr オブジェクトの構造体の参照ポインタ。
2594  * @param row 表示する列の左端
2595  * @param col 表示する行の上端
2596  * @details
2597  * Displays all info about a weapon
2598  *
2599  * Only accurate for the current weapon, because it includes
2600  * various info about the player's +to_dam and number of blows.
2601  * @return なし
2602  */
2603 static void list_weapon(object_type *o_ptr, TERM_LEN row, TERM_LEN col)
2604 {
2605         GAME_TEXT o_name[MAX_NLEN];
2606         GAME_TEXT tmp_str[80];
2607
2608         DICE_NUMBER eff_dd = o_ptr->dd + p_ptr->to_dd[0];
2609         DICE_SID eff_ds = o_ptr->ds + p_ptr->to_ds[0];
2610         HIT_RELIABILITY reli = p_ptr->skill_thn + (p_ptr->to_h[0] + o_ptr->to_h) * BTH_PLUS_ADJ;
2611
2612         /* Print the weapon name */
2613         object_desc(o_name, o_ptr, OD_NAME_ONLY);
2614         c_put_str(TERM_YELLOW, o_name, row, col);
2615
2616         /* Print the player's number of blows */
2617         sprintf(tmp_str, _("攻撃回数: %d", "Number of Blows: %d"), p_ptr->num_blow[0]);
2618         put_str(tmp_str, row+1, col);
2619
2620         /* Print to_hit and to_dam of the weapon */
2621         sprintf(tmp_str, _("命中率:  0  50 100 150 200 (敵のAC)", "To Hit:  0  50 100 150 200 (AC)"));
2622         put_str(tmp_str, row+2, col);
2623
2624         /* Print the weapons base damage dice */
2625         sprintf(tmp_str, "        %2d  %2d  %2d  %2d  %2d (%%)",
2626                 (int)hit_chance(reli, 0),
2627                 (int)hit_chance(reli, 50),
2628                 (int)hit_chance(reli, 100),
2629                 (int)hit_chance(reli, 150),
2630                 (int)hit_chance(reli, 200));
2631         put_str(tmp_str, row+3, col);
2632         c_put_str(TERM_YELLOW, _("可能なダメージ:", "Possible Damage:"), row+5, col);
2633
2634         /* Damage for one blow (if it hits) */
2635         sprintf(tmp_str, _("攻撃一回につき %d-%d", "One Strike: %d-%d damage"),
2636             (int)(eff_dd + o_ptr->to_d + p_ptr->to_d[0]),
2637                 (int)(eff_ds * eff_dd + o_ptr->to_d + p_ptr->to_d[0]));
2638         put_str(tmp_str, row+6, col+1);
2639
2640         /* Damage for the complete attack (if all blows hit) */
2641         sprintf(tmp_str, _("1ターンにつき %d-%d", "One Attack: %d-%d damage"),
2642                 (int)(p_ptr->num_blow[0] * (eff_dd + o_ptr->to_d + p_ptr->to_d[0])),
2643                         (int)(p_ptr->num_blow[0] * (eff_ds * eff_dd + o_ptr->to_d + p_ptr->to_d[0])));
2644         put_str(tmp_str, row+7, col+1);
2645 }
2646
2647 /*!
2648  * @brief 武器匠鑑定1回分(オブジェクト2種)の処理。/ Compare weapons
2649  * @details 
2650  * Copies the weapons to compare into the weapon-slot and\n
2651  * compares the values for both weapons.\n
2652  * 武器1つだけで比較をしないなら費用は半額になる。
2653  * @param bcost 基本鑑定費用
2654  * @return 最終的にかかった費用
2655  */
2656 static PRICE compare_weapons(PRICE bcost)
2657 {
2658         int i, n;
2659         OBJECT_IDX item, item2;
2660         object_type *o_ptr[2];
2661         object_type orig_weapon;
2662         object_type *i_ptr;
2663         concptr q, s;
2664         TERM_LEN row = 2;
2665         TERM_LEN wid = 38, mgn = 2;
2666         bool old_character_xtra = character_xtra;
2667         char ch;
2668         PRICE total = 0;
2669         PRICE cost = 0; /* First time no price */
2670
2671         screen_save();
2672         clear_bldg(0, 22);
2673
2674         /* Store copy of original wielded weapon */
2675         i_ptr = &inventory[INVEN_RARM];
2676         object_copy(&orig_weapon, i_ptr);
2677
2678         item_tester_hook = item_tester_hook_orthodox_melee_weapons;
2679
2680         /* Get the first weapon */
2681         q = _("第一の武器は?", "What is your first weapon? ");
2682         s = _("比べるものがありません。", "You have nothing to compare.");
2683
2684         o_ptr[0] = choose_object(&item, q, s, (USE_EQUIP | USE_INVEN | IGNORE_BOTHHAND_SLOT));
2685         if (!o_ptr[0])
2686         {
2687                 screen_load();
2688                 return (0);
2689         }
2690
2691         n = 1;
2692         total = bcost;
2693
2694         while (TRUE)
2695         {
2696                 clear_bldg(0, 22);
2697
2698                 /* Only compare melee weapons */
2699                 item_tester_hook = item_tester_hook_orthodox_melee_weapons;
2700
2701                 /* Hack -- prevent "icky" message */
2702                 character_xtra = TRUE;
2703
2704                 /* Diaplay selected weapon's infomation */
2705                 for (i = 0; i < n; i++)
2706                 {
2707                         int col = (wid * i + mgn);
2708
2709                         /* Copy i-th weapon into the weapon slot (if it's not already there) */
2710                         if (o_ptr[i] != i_ptr) object_copy(i_ptr, o_ptr[i]);
2711
2712                         p_ptr->update |= PU_BONUS;
2713                         handle_stuff();
2714
2715                         /* List the new values */
2716                         list_weapon(o_ptr[i], row, col);
2717                         compare_weapon_aux(o_ptr[i], col, row + 8);
2718
2719                         /* Copy back the original weapon into the weapon slot */
2720                         object_copy(i_ptr, &orig_weapon);
2721                 }
2722
2723                 /* Reset the values for the old weapon */
2724                 p_ptr->update |= PU_BONUS;
2725                 handle_stuff();
2726
2727                 character_xtra = old_character_xtra;
2728
2729 #ifdef JP
2730                 put_str(format("[ 比較対象: 's'で変更 ($%d) ]", cost), 1, (wid + mgn));
2731                 put_str("(一番高いダメージが適用されます。複数の倍打効果は足し算されません。)", row + 4, 0);
2732                 prt("現在の技量から判断すると、あなたの武器は以下のような威力を発揮します:", 0, 0);
2733 #else
2734                 put_str(format("[ 's' Select secondary weapon($%d) ]", cost), row + 1, (wid * i + mgn));
2735                 put_str("(Only highest damage applies per monster. Special damage not cumulative.)", row + 4, 0);
2736                 prt("Based on your current abilities, here is what your weapons will do", 0, 0);
2737 #endif
2738
2739                 flush();
2740                 ch = inkey();
2741
2742                 if (ch == 's')
2743                 {
2744                         if (total + cost > p_ptr->au)
2745                         {
2746                                 msg_print(_("お金が足りません!", "You don't have enough money!"));
2747                                 msg_print(NULL);
2748                                 continue;
2749                         }
2750
2751                         q = _("第二の武器は?", "What is your second weapon? ");
2752                         s = _("比べるものがありません。", "You have nothing to compare.");
2753
2754                         /* Get the second weapon */
2755                         o_ptr[1] = choose_object(&item2, q, s, (USE_EQUIP | USE_INVEN | IGNORE_BOTHHAND_SLOT));
2756                         if (!o_ptr[1]) continue;
2757
2758                         total += cost;
2759                         cost = bcost / 2;
2760                         n = 2;
2761                 }
2762                 else
2763                 {
2764                         break;
2765                 }
2766         }
2767         screen_load();
2768
2769         return (total);
2770 }
2771
2772
2773 /*!
2774  * @brief ACから回避率、ダメージ減少率を計算し表示する。 / Evaluate AC
2775  * @details 
2776  * Calculate and display the dodge-rate and the protection-rate
2777  * based on AC
2778  * @param iAC プレイヤーのAC。
2779  * @return 常にTRUEを返す。
2780  */
2781 static bool eval_ac(ARMOUR_CLASS iAC)
2782 {
2783 #ifdef JP
2784         const char memo[] =
2785                 "ダメージ軽減率とは、敵の攻撃が当たった時そのダメージを\n"
2786                 "何パーセント軽減するかを示します。\n"
2787                 "ダメージ軽減は通常の直接攻撃(種類が「攻撃する」と「粉砕する」の物)\n"
2788                 "に対してのみ効果があります。\n \n"
2789                 "敵のレベルとは、その敵が通常何階に現れるかを示します。\n \n"
2790                 "回避率は敵の直接攻撃を何パーセントの確率で避けるかを示し、\n"
2791                 "敵のレベルとあなたのACによって決定されます。\n \n"
2792                 "ダメージ期待値とは、敵の100ポイントの通常攻撃に対し、\n"
2793                 "回避率とダメージ軽減率を考慮したダメージの期待値を示します。\n";
2794 #else
2795         const char memo[] =
2796                 "'Protection Rate' means how much damage is reduced by your armor.\n"
2797                 "Note that the Protection rate is effective only against normal "
2798                 "'attack' and 'shatter' type melee attacks, "
2799                 "and has no effect against any other types such as 'poison'.\n \n"
2800                 "'Dodge Rate' indicates the success rate on dodging the "
2801                 "monster's melee attacks.  "
2802                 "It is depend on the level of the monster and your AC.\n \n"
2803                 "'Average Damage' indicates the expected amount of damage "
2804                 "when you are attacked by normal melee attacks with power=100.";
2805 #endif
2806
2807         int protection;
2808         TERM_LEN col, row = 2;
2809         DEPTH lvl;
2810         char buf[80*20], *t;
2811
2812         /* AC lower than zero has no effect */
2813         if (iAC < 0) iAC = 0;
2814
2815         /* ダメージ軽減率を計算 */
2816         protection = 100 * MIN(iAC, 150) / 250;
2817
2818         screen_save();
2819         clear_bldg(0, 22);
2820
2821 #ifdef JP
2822         put_str(format("あなたの現在のAC: %3d", iAC), row++, 0);
2823         put_str(format("ダメージ軽減率  : %3d%%", protection), row++, 0);
2824         row++;
2825
2826         put_str("敵のレベル      :", row + 0, 0);
2827         put_str("回避率          :", row + 1, 0);
2828         put_str("ダメージ期待値  :", row + 2, 0);
2829 #else
2830         put_str(format("Your current AC : %3d", iAC), row++, 0);
2831         put_str(format("Protection rate : %3d%%", protection), row++, 0);
2832         row++;
2833
2834         put_str("Level of Monster:", row + 0, 0);
2835         put_str("Dodge Rate      :", row + 1, 0);
2836         put_str("Average Damage  :", row + 2, 0);
2837 #endif
2838     
2839         for (col = 17 + 1, lvl = 0; lvl <= 100; lvl += 10, col += 5)
2840         {
2841                 int quality = 60 + lvl * 3; /* attack quality with power 60 */
2842                 int dodge;   /* 回避率(%) */
2843                 int average; /* ダメージ期待値 */
2844
2845                 put_str(format("%3d", lvl), row + 0, col);
2846
2847                 /* 回避率を計算 */
2848                 dodge = 5 + (MIN(100, 100 * (iAC * 3 / 4) / quality) * 9 + 5) / 10;
2849                 put_str(format("%3d%%", dodge), row + 1, col);
2850
2851                 /* 100点の攻撃に対してのダメージ期待値を計算 */
2852                 average = (100 - dodge) * (100 - protection) / 100;
2853                 put_str(format("%3d", average), row + 2, col);
2854         }
2855
2856         /* Display note */
2857         roff_to_buf(memo, 70, buf, sizeof(buf));
2858         for (t = buf; t[0]; t += strlen(t) + 1)
2859                 put_str(t, (row++) + 4, 4);
2860
2861         prt(_("現在のあなたの装備からすると、あなたの防御力はこれくらいです:", "Defense abilities from your current Armor Class are evaluated below."), 0, 0);
2862   
2863         flush();
2864         (void)inkey();
2865         screen_load();
2866
2867         return (TRUE);
2868 }
2869
2870
2871
2872 /*!
2873  * @brief 修復材料のオブジェクトから修復対象に特性を移植する。
2874  * @param to_ptr 修復対象オブジェクトの構造体の参照ポインタ。
2875  * @param from_ptr 修復材料オブジェクトの構造体の参照ポインタ。
2876  * @return 修復対象になるならTRUEを返す。
2877  */
2878 static void give_one_ability_of_object(object_type *to_ptr, object_type *from_ptr)
2879 {
2880         int i, n = 0;
2881         int cand[TR_FLAG_MAX];
2882         BIT_FLAGS to_flgs[TR_FLAG_SIZE];
2883         BIT_FLAGS from_flgs[TR_FLAG_SIZE];
2884
2885         object_flags(to_ptr, to_flgs);
2886         object_flags(from_ptr, from_flgs);
2887
2888         for (i = 0; i < TR_FLAG_MAX; i++)
2889         {
2890                 switch (i)
2891                 {
2892                 case TR_IGNORE_ACID:
2893                 case TR_IGNORE_ELEC:
2894                 case TR_IGNORE_FIRE:
2895                 case TR_IGNORE_COLD:
2896                 case TR_ACTIVATE:
2897                 case TR_RIDING:
2898                 case TR_THROW:
2899                 case TR_SHOW_MODS:
2900                 case TR_HIDE_TYPE:
2901                 case TR_ES_ATTACK:
2902                 case TR_ES_AC:
2903                 case TR_FULL_NAME:
2904                 case TR_FIXED_FLAVOR:
2905                         break;
2906                 default:
2907                         if (have_flag(from_flgs, i) && !have_flag(to_flgs, i))
2908                         {
2909                                 if (!(is_pval_flag(i) && (from_ptr->pval < 1))) cand[n++] = i;
2910                         }
2911                 }
2912         }
2913
2914         if (n > 0)
2915         {
2916                 int bmax;
2917                 int tr_idx = cand[randint0(n)];
2918                 add_flag(to_ptr->art_flags, tr_idx);
2919                 if (is_pval_flag(tr_idx)) to_ptr->pval = MAX(to_ptr->pval, 1);
2920                 bmax = MIN(3, MAX(1, 40 / (to_ptr->dd * to_ptr->ds)));
2921                 if (tr_idx == TR_BLOWS) to_ptr->pval = MIN(to_ptr->pval, bmax);
2922                 if (tr_idx == TR_SPEED) to_ptr->pval = MIN(to_ptr->pval, 4);
2923         }
2924
2925         return;
2926 }
2927
2928 /*!
2929  * @brief アイテム修復処理のメインルーチン / Repair broken weapon
2930  * @param bcost 基本修復費用
2931  * @return 実際にかかった費用
2932  */
2933 static PRICE repair_broken_weapon_aux(PRICE bcost)
2934 {
2935         PRICE cost;
2936         OBJECT_IDX item, mater;
2937         object_type *o_ptr, *mo_ptr; /* broken weapon and material weapon */
2938         object_kind *k_ptr;
2939         int i, dd_bonus, ds_bonus;
2940         KIND_OBJECT_IDX k_idx;
2941         char basenm[MAX_NLEN];
2942         concptr q, s;
2943         int row = 7;
2944         clear_bldg(0, 22);
2945
2946         prt(_("修復には材料となるもう1つの武器が必要です。", "Hand one material weapon to repair a broken weapon."), row, 2);
2947         prt(_("材料に使用した武器はなくなります!", "The material weapon will disappear after repairing!!"), row+1, 2);
2948
2949         q = _("どの折れた武器を修復しますか?", "Repair which broken weapon? ");
2950         s = _("修復できる折れた武器がありません。", "You have no broken weapon to repair.");
2951
2952         /* Only forge broken weapons */
2953         item_tester_hook = item_tester_hook_broken_weapon;
2954
2955         o_ptr = choose_object(&item, q, s, (USE_INVEN | USE_EQUIP));
2956         if (!o_ptr) return (0);
2957
2958         /* It is worthless */
2959         if (!object_is_ego(o_ptr) && !object_is_artifact(o_ptr))
2960         {
2961                 msg_format(_("それは直してもしょうがないぜ。", "It is worthless to repair."));
2962                 return (0);
2963         }
2964
2965         /* They are too many */
2966         if (o_ptr->number > 1)
2967         {
2968                 msg_format(_("一度に複数を修復することはできません!", "They are too many to repair at once!"));
2969                 return (0);
2970         }
2971
2972         /* Display item name */
2973         object_desc(basenm, o_ptr, OD_NAME_ONLY);
2974         prt(format(_("修復する武器 : %s", "Repairing: %s"), basenm), row+3, 2);
2975
2976         q = _("材料となる武器は?", "Which weapon for material? ");
2977         s = _("材料となる武器がありません。", "You have no material to repair.");
2978
2979         /* Only forge broken weapons */
2980         item_tester_hook = item_tester_hook_orthodox_melee_weapons;
2981
2982         mo_ptr = choose_object(&mater, q, s, (USE_INVEN | USE_EQUIP));
2983         if (!mo_ptr) return (0);
2984         if (mater == item)
2985         {
2986                 msg_print(_("クラインの壷じゃない!", "This is not a klein bottle!"));
2987                 return (0);
2988         }
2989
2990         /* Display item name */
2991         object_desc(basenm, mo_ptr, OD_NAME_ONLY);
2992         prt(format(_("材料とする武器: %s", "Material : %s"), basenm), row+4, 2);
2993
2994         /* Get the value of one of the items (except curses) */
2995         cost = bcost + object_value_real(o_ptr) * 2;
2996
2997         if (!get_check(format(_("$%dかかりますがよろしいですか? ", "Costs %d gold, okay? "), cost))) return (0);
2998
2999         /* Check if the player has enough money */
3000         if (p_ptr->au < cost)
3001         {
3002                 object_desc(basenm, o_ptr, OD_NAME_ONLY);
3003                 msg_format(_("%sを修復するだけのゴールドがありません!", "You do not have the gold to repair %s!"), basenm);
3004                 msg_print(NULL);
3005                 return (0);
3006         }
3007
3008         p_ptr->total_weight -= o_ptr->weight;
3009
3010         if (o_ptr->sval == SV_BROKEN_DAGGER)
3011         {
3012                 KIND_OBJECT_IDX j;
3013                 int n = 1;
3014
3015                 /* Suppress compiler warning */
3016                 k_idx = 0;
3017
3018                 for (j = 1; j < max_k_idx; j++)
3019                 {
3020                         object_kind *k_aux_ptr = &k_info[j];
3021
3022                         if (k_aux_ptr->tval != TV_SWORD) continue;
3023                         if ((k_aux_ptr->sval == SV_BROKEN_DAGGER) ||
3024                                 (k_aux_ptr->sval == SV_BROKEN_SWORD) ||
3025                                 (k_aux_ptr->sval == SV_DOKUBARI)) continue;
3026                         if (k_aux_ptr->weight > 99) continue;
3027
3028                         if (one_in_(n)) 
3029                         {
3030                                 k_idx = j;
3031                                 n++;
3032                         }
3033                 }
3034         }
3035         else /* TV_BROKEN_SWORD */
3036         {
3037                 /* Repair to a sword or sometimes material's type weapon */
3038                 OBJECT_TYPE_VALUE tval = (one_in_(5) ? mo_ptr->tval : TV_SWORD);
3039
3040                 while(1)
3041                 {
3042                         object_kind *ck_ptr;
3043
3044                         k_idx = lookup_kind(tval, SV_ANY);
3045                         ck_ptr = &k_info[k_idx];
3046
3047                         if (tval == TV_SWORD)
3048                         {
3049                                 if ((ck_ptr->sval == SV_BROKEN_DAGGER) ||
3050                                         (ck_ptr->sval == SV_BROKEN_SWORD) ||
3051                                         (ck_ptr->sval == SV_DIAMOND_EDGE) ||
3052                                         (ck_ptr->sval == SV_DOKUBARI)) continue;
3053                         }
3054                         if (tval == TV_POLEARM)
3055                         {
3056                                 if ((ck_ptr->sval == SV_DEATH_SCYTHE) ||
3057                                         (ck_ptr->sval == SV_TSURIZAO)) continue;
3058                         }
3059                         if (tval == TV_HAFTED)
3060                         {
3061                                 if ((ck_ptr->sval == SV_GROND) ||
3062                                         (ck_ptr->sval == SV_WIZSTAFF) ||
3063                                         (ck_ptr->sval == SV_NAMAKE_HAMMER)) continue;
3064                         }
3065
3066                         break;
3067                 }
3068         }
3069
3070         /* Calculate dice bonuses */
3071         dd_bonus = o_ptr->dd - k_info[o_ptr->k_idx].dd;
3072         ds_bonus = o_ptr->ds - k_info[o_ptr->k_idx].ds;
3073         dd_bonus += mo_ptr->dd - k_info[mo_ptr->k_idx].dd;
3074         ds_bonus += mo_ptr->ds - k_info[mo_ptr->k_idx].ds;
3075
3076         /* Change base object */
3077         k_ptr = &k_info[k_idx];
3078         o_ptr->k_idx = k_idx;
3079         o_ptr->weight = k_ptr->weight;
3080         o_ptr->tval = k_ptr->tval;
3081         o_ptr->sval = k_ptr->sval;
3082         o_ptr->dd = k_ptr->dd;
3083         o_ptr->ds = k_ptr->ds;
3084
3085         /* Copy base object's ability */
3086         for (i = 0; i < TR_FLAG_SIZE; i++) o_ptr->art_flags[i] |= k_ptr->flags[i];
3087         if (k_ptr->pval) o_ptr->pval = MAX(o_ptr->pval, randint1(k_ptr->pval));
3088         if (have_flag(k_ptr->flags, TR_ACTIVATE)) o_ptr->xtra2 = (byte_hack)k_ptr->act_idx;
3089
3090         /* Dice up */
3091         if (dd_bonus > 0)
3092         {
3093                 o_ptr->dd++;
3094                 for (i = 1; i < dd_bonus; i++)
3095                 {
3096                         if (one_in_(o_ptr->dd + i)) o_ptr->dd++;
3097                 }
3098         }
3099         if (ds_bonus > 0)
3100         {
3101                 o_ptr->ds++;
3102                 for (i = 1; i < ds_bonus; i++)
3103                 {
3104                         if (one_in_(o_ptr->ds + i)) o_ptr->ds++;
3105                 }
3106         }
3107
3108         if (have_flag(k_ptr->flags, TR_BLOWS))
3109         {
3110                 int bmax = MIN(3, MAX(1, 40 / (o_ptr->dd * o_ptr->ds)));
3111                 o_ptr->pval = MIN(o_ptr->pval, bmax);
3112         }
3113
3114         /* Add one random ability from material weapon */
3115         give_one_ability_of_object(o_ptr, mo_ptr);
3116
3117         /* Add to-dam, to-hit and to-ac from material weapon */
3118         o_ptr->to_d += MAX(0, (mo_ptr->to_d / 3));
3119         o_ptr->to_h += MAX(0, (mo_ptr->to_h / 3));
3120         o_ptr->to_a += MAX(0, (mo_ptr->to_a));
3121
3122         if ((o_ptr->name1 == ART_NARSIL) ||
3123                 (object_is_random_artifact(o_ptr) && one_in_(1)) ||
3124                 (object_is_ego(o_ptr) && one_in_(7)))
3125         {
3126                 /* Forge it */
3127                 if (object_is_ego(o_ptr))
3128                 {
3129                         add_flag(o_ptr->art_flags, TR_IGNORE_FIRE);
3130                         add_flag(o_ptr->art_flags, TR_IGNORE_ACID);
3131                 }
3132
3133                 /* Add one random ability from material weapon */
3134                 give_one_ability_of_object(o_ptr, mo_ptr);
3135
3136                 /* Add one random activation */
3137                 if (!activation_index(o_ptr)) one_activation(o_ptr);
3138
3139                 /* Narsil */
3140                 if (o_ptr->name1 == ART_NARSIL)
3141                 {
3142                         one_high_resistance(o_ptr);
3143                         one_ability(o_ptr);
3144                 }
3145
3146                 msg_print(_("これはかなりの業物だったようだ。", "This blade seems to be exceptionally."));
3147         }
3148
3149         object_desc(basenm, o_ptr, OD_NAME_ONLY);
3150 #ifdef JP
3151         msg_format("$%dで%sに修復しました。", cost, basenm);
3152 #else
3153         msg_format("Repaired into %s for %d gold.", basenm, cost);
3154 #endif
3155         msg_print(NULL);
3156
3157         /* Remove BROKEN flag */
3158         o_ptr->ident &= ~(IDENT_BROKEN);
3159
3160         /* Add repaired flag */
3161         o_ptr->discount = 99;
3162
3163         p_ptr->total_weight += o_ptr->weight;
3164         calc_android_exp();
3165
3166         /* Decrease material object */
3167         inven_item_increase(mater, -1);
3168         inven_item_optimize(mater);
3169
3170         /* Copyback */
3171         p_ptr->update |= PU_BONUS;
3172         handle_stuff();
3173
3174         /* Something happened */
3175         return (cost);
3176 }
3177
3178 /*!
3179  * @brief アイテム修復処理の過渡ルーチン / Repair broken weapon
3180  * @param bcost 基本鑑定費用
3181  * @return 実際にかかった費用
3182  */
3183 static int repair_broken_weapon(PRICE bcost)
3184 {
3185         PRICE cost;
3186         screen_save();
3187         cost = repair_broken_weapon_aux(bcost);
3188         screen_load();
3189         return cost;
3190 }
3191
3192
3193 /*!
3194  * @brief アイテムの強化を行う。 / Enchant item
3195  * @param cost 1回毎の費用
3196  * @param to_hit 命中をアップさせる量
3197  * @param to_dam ダメージをアップさせる量
3198  * @param to_ac ACをアップさせる量
3199  * @return 実際に行ったらTRUE
3200  */
3201 static bool enchant_item(PRICE cost, HIT_PROB to_hit, HIT_POINT to_dam, ARMOUR_CLASS to_ac)
3202 {
3203         int i;
3204         OBJECT_IDX item;
3205         bool okay = FALSE;
3206         object_type *o_ptr;
3207         concptr q, s;
3208         int maxenchant = (p_ptr->lev / 5);
3209         char tmp_str[MAX_NLEN];
3210
3211         clear_bldg(4, 18);
3212         prt(format(_("現在のあなたの技量だと、+%d まで改良できます。", "  Based on your skill, we can improve up to +%d."), maxenchant), 5, 0);
3213         prt(format(_(" 改良の料金は一個につき$%d です。", "  The price for the service is %d gold per item."), cost), 7, 0);
3214
3215         q = _("どのアイテムを改良しますか?", "Improve which item? ");
3216         s = _("改良できるものがありません。", "You have nothing to improve.");
3217
3218         o_ptr = choose_object(&item, q, s, (USE_INVEN | USE_EQUIP | IGNORE_BOTHHAND_SLOT));
3219         if (!o_ptr) return (FALSE);
3220
3221         /* Check if the player has enough money */
3222         if (p_ptr->au < (cost * o_ptr->number))
3223         {
3224                 object_desc(tmp_str, o_ptr, OD_NAME_ONLY);
3225                 msg_format(_("%sを改良するだけのゴールドがありません!", "You do not have the gold to improve %s!"), tmp_str);
3226                 return (FALSE);
3227         }
3228
3229         /* Enchant to hit */
3230         for (i = 0; i < to_hit; i++)
3231         {
3232                 if (o_ptr->to_h < maxenchant)
3233                 {
3234                         if (enchant(o_ptr, 1, (ENCH_TOHIT | ENCH_FORCE)))
3235                         {
3236                                 okay = TRUE;
3237                                 break;
3238                         }
3239                 }
3240         }
3241
3242         /* Enchant to damage */
3243         for (i = 0; i < to_dam; i++)
3244         {
3245                 if (o_ptr->to_d < maxenchant)
3246                 {
3247                         if (enchant(o_ptr, 1, (ENCH_TODAM | ENCH_FORCE)))
3248                         {
3249                                 okay = TRUE;
3250                                 break;
3251                         }
3252                 }
3253         }
3254
3255         /* Enchant to AC */
3256         for (i = 0; i < to_ac; i++)
3257         {
3258                 if (o_ptr->to_a < maxenchant)
3259                 {
3260                         if (enchant(o_ptr, 1, (ENCH_TOAC | ENCH_FORCE)))
3261                         {
3262                                 okay = TRUE;
3263                                 break;
3264                         }
3265                 }
3266         }
3267
3268         /* Failure */
3269         if (!okay)
3270         {
3271                 if (flush_failure) flush();
3272                 msg_print(_("改良に失敗した。", "The improvement failed."));
3273                 return (FALSE);
3274         }
3275         else
3276         {
3277                 object_desc(tmp_str, o_ptr, OD_NAME_AND_ENCHANT);
3278 #ifdef JP
3279                 msg_format("$%dで%sに改良しました。", cost * o_ptr->number, tmp_str);
3280 #else
3281                 msg_format("Improved into %s for %d gold.", tmp_str, cost * o_ptr->number);
3282 #endif
3283
3284                 /* Charge the money */
3285                 p_ptr->au -= (cost * o_ptr->number);
3286
3287                 if (item >= INVEN_RARM) calc_android_exp();
3288
3289                 /* Something happened */
3290                 return (TRUE);
3291         }
3292 }
3293
3294
3295 /*!
3296  * @brief 魔道具の使用回数を回復させる施設のメインルーチン / Recharge rods, wands and staves
3297  * @details
3298  * The player can select the number of charges to add\n
3299  * (up to a limit), and the recharge never fails.\n
3300  *\n
3301  * The cost for rods depends on the level of the rod. The prices\n
3302  * for recharging wands and staves are dependent on the cost of\n
3303  * the base-item.\n
3304  * @return なし
3305  */
3306 static void building_recharge(void)
3307 {
3308         OBJECT_IDX  item;
3309         DEPTH       lev;
3310         object_type *o_ptr;
3311         object_kind *k_ptr;
3312         concptr        q, s;
3313         PRICE       price;
3314         PARAMETER_VALUE charges;
3315         int         max_charges;
3316         char        tmp_str[MAX_NLEN];
3317
3318         msg_flag = FALSE;
3319
3320         /* Display some info */
3321         clear_bldg(4, 18);
3322         prt(_("  再充填の費用はアイテムの種類によります。", "  The prices of recharge depend on the type."), 6, 0);
3323
3324
3325         /* Only accept legal items */
3326         item_tester_hook = item_tester_hook_recharge;
3327
3328         q = _("どのアイテムに魔力を充填しますか? ", "Recharge which item? ");
3329         s = _("魔力を充填すべきアイテムがない。", "You have nothing to recharge.");
3330
3331         o_ptr = choose_object(&item, q, s, (USE_INVEN | USE_FLOOR));
3332         if (!o_ptr) return;
3333
3334         k_ptr = &k_info[o_ptr->k_idx];
3335
3336         /*
3337          * We don't want to give the player free info about
3338          * the level of the item or the number of charges.
3339          */
3340         /* The item must be "known" */
3341         if (!object_is_known(o_ptr))
3342         {
3343                 msg_format(_("充填する前に鑑定されている必要があります!", "The item must be identified first!"));
3344                 msg_print(NULL);
3345
3346                 if ((p_ptr->au >= 50) &&
3347                         get_check(_("$50で鑑定しますか? ", "Identify for 50 gold? ")))
3348
3349                 {
3350                         p_ptr->au -= 50;
3351                         identify_item(o_ptr);
3352                         object_desc(tmp_str, o_ptr, 0);
3353                         msg_format(_("%s です。", "You have: %s."), tmp_str);
3354
3355                         /* Auto-inscription */
3356                         autopick_alter_item(item, FALSE);
3357
3358                         /* Update the gold display */
3359                         building_prt_gold();
3360                 }
3361                 else
3362                 {
3363                         return;
3364                 }
3365         }
3366
3367         /* Extract the object "level" */
3368         lev = k_info[o_ptr->k_idx].level;
3369
3370         /* Price for a rod */
3371         if (o_ptr->tval == TV_ROD)
3372         {
3373                 if (o_ptr->timeout > 0)
3374                 {
3375                         /* Fully recharge */
3376                         price = (lev * 50 * o_ptr->timeout) / k_ptr->pval;
3377                 }
3378                 else
3379                 {
3380                         /* No recharge necessary */
3381                         price = 0;
3382                         msg_format(_("それは再充填する必要はありません。", "That doesn't need to be recharged."));
3383                         return;
3384                 }
3385         }
3386         else if (o_ptr->tval == TV_STAFF)
3387         {
3388                 /* Price per charge ( = double the price paid by shopkeepers for the charge) */
3389                 price = (k_info[o_ptr->k_idx].cost / 10) * o_ptr->number;
3390
3391                 /* Pay at least 10 gold per charge */
3392                 price = MAX(10, price);
3393         }
3394         else
3395         {
3396                 /* Price per charge ( = double the price paid by shopkeepers for the charge) */
3397                 price = (k_info[o_ptr->k_idx].cost / 10);
3398
3399                 /* Pay at least 10 gold per charge */
3400                 price = MAX(10, price);
3401         }
3402
3403         /* Limit the number of charges for wands and staffs */
3404         if (o_ptr->tval == TV_WAND
3405                 && (o_ptr->pval / o_ptr->number >= k_ptr->pval))
3406         {
3407                 if (o_ptr->number > 1)
3408                 {
3409                         msg_print(_("この魔法棒はもう充分に充填されています。", "These wands are already fully charged."));
3410                 }
3411                 else
3412                 {
3413                         msg_print(_("この魔法棒はもう充分に充填されています。", "This wand is already fully charged."));
3414                 }
3415                 return;
3416         }
3417         else if (o_ptr->tval == TV_STAFF && o_ptr->pval >= k_ptr->pval)
3418         {
3419                 if (o_ptr->number > 1)
3420                 {
3421                         msg_print(_("この杖はもう充分に充填されています。", "These staffs are already fully charged."));
3422                 }
3423                 else
3424                 {
3425                         msg_print(_("この杖はもう充分に充填されています。", "This staff is already fully charged."));
3426                 }
3427                 return;
3428         }
3429
3430         /* Check if the player has enough money */
3431         if (p_ptr->au < price)
3432         {
3433                 object_desc(tmp_str, o_ptr, OD_NAME_ONLY);
3434 #ifdef JP
3435                 msg_format("%sを再充填するには$%d 必要です!", tmp_str,price );
3436 #else
3437                 msg_format("You need %d gold to recharge %s!", price, tmp_str);
3438 #endif
3439
3440                 return;
3441         }
3442
3443         if (o_ptr->tval == TV_ROD)
3444         {
3445 #ifdef JP
3446                 if (get_check(format("そのロッドを$%d で再充填しますか?", price)))
3447 #else
3448                 if (get_check(format("Recharge the %s for %d gold? ",
3449                         ((o_ptr->number > 1) ? "rods" : "rod"), price)))
3450 #endif
3451
3452                 {
3453                         /* Recharge fully */
3454                         o_ptr->timeout = 0;
3455                 }
3456                 else
3457                 {
3458                         return;
3459                 }
3460         }
3461         else
3462         {
3463                 if (o_ptr->tval == TV_STAFF)
3464                         max_charges = k_ptr->pval - o_ptr->pval;
3465                 else
3466                         max_charges = o_ptr->number * k_ptr->pval - o_ptr->pval;
3467
3468                 /* Get the quantity for staves and wands */
3469                 charges = (PARAMETER_VALUE)get_quantity(format(_("一回分$%d で何回分充填しますか?", "Add how many charges for %d gold? "), price), 
3470                                         MIN(p_ptr->au / price, max_charges));
3471
3472                 /* Do nothing */
3473                 if (charges < 1) return;
3474
3475                 /* Get the new price */
3476                 price *= charges;
3477
3478                 /* Recharge */
3479                 o_ptr->pval += charges;
3480
3481                 /* We no longer think the item is empty */
3482                 o_ptr->ident &= ~(IDENT_EMPTY);
3483         }
3484
3485         /* Give feedback */
3486         object_desc(tmp_str, o_ptr, 0);
3487 #ifdef JP
3488         msg_format("%sを$%d で再充填しました。", tmp_str, price);
3489 #else
3490         msg_format("%^s %s recharged for %d gold.", tmp_str, ((o_ptr->number > 1) ? "were" : "was"), price);
3491 #endif
3492
3493         /* Combine / Reorder the pack (later) */
3494         p_ptr->update |= (PU_COMBINE | PU_REORDER);
3495
3496         p_ptr->window |= (PW_INVEN);
3497
3498         /* Pay the price */
3499         p_ptr->au -= price;
3500
3501         /* Finished */
3502         return;
3503 }
3504
3505
3506 /*!
3507  * @brief 魔道具の使用回数を回復させる施設の一括処理向けサブルーチン / Recharge rods, wands and staves
3508  * @details
3509  * The player can select the number of charges to add\n
3510  * (up to a limit), and the recharge never fails.\n
3511  *\n
3512  * The cost for rods depends on the level of the rod. The prices\n
3513  * for recharging wands and staves are dependent on the cost of\n
3514  * the base-item.\n
3515  * @return なし
3516  */
3517 static void building_recharge_all(void)
3518 {
3519         INVENTORY_IDX i;
3520         DEPTH lev;
3521         object_type *o_ptr;
3522         object_kind *k_ptr;
3523         PRICE price = 0;
3524         PRICE total_cost = 0;
3525
3526
3527         /* Display some info */
3528         msg_flag = FALSE;
3529         clear_bldg(4, 18);
3530         prt(_("  再充填の費用はアイテムの種類によります。", "  The prices of recharge depend on the type."), 6, 0);
3531
3532         /* Calculate cost */
3533         for ( i = 0; i < INVEN_PACK; i++)
3534         {
3535                 o_ptr = &inventory[i];
3536                                 
3537                 /* skip non magic device */
3538                 if (o_ptr->tval < TV_STAFF || o_ptr->tval > TV_ROD) continue;
3539
3540                 /* need identified */
3541                 if (!object_is_known(o_ptr)) total_cost += 50;
3542
3543                 /* Extract the object "level" */
3544                 lev = k_info[o_ptr->k_idx].level;
3545
3546                 k_ptr = &k_info[o_ptr->k_idx];
3547
3548                 switch (o_ptr->tval)
3549                 {
3550                 case TV_ROD:
3551                         price = (lev * 50 * o_ptr->timeout) / k_ptr->pval;
3552                         break;
3553
3554                 case TV_STAFF:
3555                         /* Price per charge ( = double the price paid by shopkeepers for the charge) */
3556                         price = (k_info[o_ptr->k_idx].cost / 10) * o_ptr->number;
3557
3558                         /* Pay at least 10 gold per charge */
3559                         price = MAX(10, price);
3560
3561                         /* Fully charge */
3562                         price = (k_ptr->pval - o_ptr->pval) * price;
3563                         break;
3564
3565                 case TV_WAND:
3566                         /* Price per charge ( = double the price paid by shopkeepers for the charge) */
3567                         price = (k_info[o_ptr->k_idx].cost / 10);
3568
3569                         /* Pay at least 10 gold per charge */
3570                         price = MAX(10, price);
3571
3572                         /* Fully charge */
3573                         price = (o_ptr->number * k_ptr->pval - o_ptr->pval) * price;
3574                         break;
3575                 }
3576
3577                 /* if price <= 0 then item have enough charge */
3578                 if (price > 0) total_cost += price;
3579         }
3580
3581         if (!total_cost)
3582         {
3583                 msg_print(_("充填する必要はありません。", "No need to recharge."));
3584                 msg_print(NULL);
3585                 return;
3586         }
3587
3588         /* Check if the player has enough money */
3589         if (p_ptr->au < total_cost)
3590         {
3591                 msg_format(_("すべてのアイテムを再充填するには$%d 必要です!", "You need %d gold to recharge all items!"), total_cost );
3592                 msg_print(NULL);
3593                 return;
3594         }
3595         if (!get_check(format(_("すべてのアイテムを $%d で再充填しますか?", "Recharge all items for %d gold? "),  total_cost))) return;
3596         
3597         for (i = 0; i < INVEN_PACK; i++)
3598         {
3599                 o_ptr = &inventory[i];
3600                 k_ptr = &k_info[o_ptr->k_idx];
3601
3602                 /* skip non magic device */
3603                 if (o_ptr->tval < TV_STAFF || o_ptr->tval > TV_ROD) continue;
3604
3605                 if (!object_is_known(o_ptr))
3606                 {
3607                         identify_item(o_ptr);
3608
3609                         /* Auto-inscription */
3610                         autopick_alter_item(i, FALSE);
3611                 }
3612
3613                 /* Recharge */
3614                 switch (o_ptr->tval)
3615                 {
3616                 case TV_ROD:
3617                         o_ptr->timeout = 0;
3618                         break;
3619                 case TV_STAFF:
3620                         if (o_ptr->pval < k_ptr->pval) o_ptr->pval = k_ptr->pval;
3621                         /* We no longer think the item is empty */
3622                         o_ptr->ident &= ~(IDENT_EMPTY);
3623                         break;
3624                 case TV_WAND:
3625                         if (o_ptr->pval < o_ptr->number * k_ptr->pval)
3626                                 o_ptr->pval = o_ptr->number * k_ptr->pval;
3627                         /* We no longer think the item is empty */
3628                         o_ptr->ident &= ~(IDENT_EMPTY);
3629                         break;
3630                 }
3631         }
3632
3633         /* Give feedback */
3634         msg_format(_("$%d で再充填しました。", "You pay %d gold."), total_cost);
3635         msg_print(NULL);
3636
3637         /* Combine / Reorder the pack (later) */
3638         p_ptr->update |= (PU_COMBINE | PU_REORDER);
3639
3640         p_ptr->window |= (PW_INVEN);
3641
3642         /* Pay the price */
3643         p_ptr->au -= total_cost;
3644
3645         /* Finished */
3646         return;
3647 }
3648
3649 /*!
3650  * @brief 町間のテレポートを行うメインルーチン。
3651  * @return テレポート処理を決定したか否か
3652  */
3653 bool tele_town(void)
3654 {
3655         int i;
3656         POSITION x, y;
3657         int num = 0;
3658
3659         if (dun_level)
3660         {
3661                 msg_print(_("この魔法は地上でしか使えない!", "This spell can only be used on the surface!"));
3662                 return FALSE;
3663         }
3664
3665         if (p_ptr->inside_arena || p_ptr->inside_battle)
3666         {
3667                 msg_print(_("この魔法は外でしか使えない!", "This spell can only be used outside!"));
3668                 return FALSE;
3669         }
3670
3671         screen_save();
3672         clear_bldg(4, 10);
3673
3674         for (i = 1; i < max_towns; i++)
3675         {
3676                 char buf[80];
3677
3678                 if ((i == NO_TOWN) || (i == SECRET_TOWN) || (i == p_ptr->town_num) || !(p_ptr->visit & (1L << (i - 1)))) continue;
3679
3680                 sprintf(buf, "%c) %-20s", I2A(i - 1), town[i].name);
3681                 prt(buf, 5 + i, 5);
3682                 num++;
3683         }
3684
3685         if (!num)
3686         {
3687                 msg_print(_("まだ行けるところがない。", "You have not yet visited any town."));
3688                 msg_print(NULL);
3689                 screen_load();
3690                 return FALSE;
3691         }
3692
3693         prt(_("どこに行きますか:", "Which town you go: "), 0, 0);
3694         while(1)
3695         {
3696                 i = inkey();
3697
3698                 if (i == ESCAPE)
3699                 {
3700                         screen_load();
3701                         return FALSE;
3702                 }
3703                 else if ((i < 'a') || (i > ('a'+max_towns-2))) continue;
3704                 else if (((i-'a'+1) == p_ptr->town_num) || ((i-'a'+1) == NO_TOWN) || ((i-'a'+1) == SECRET_TOWN) || !(p_ptr->visit & (1L << (i-'a')))) continue;
3705                 break;
3706         }
3707
3708         for (y = 0; y < max_wild_y; y++)
3709         {
3710                 for (x = 0; x < max_wild_x; x++)
3711                 {
3712                         if(wilderness[y][x].town == (i-'a'+1))
3713                         {
3714                                 p_ptr->wilderness_y = y;
3715                                 p_ptr->wilderness_x = x;
3716                         }
3717                 }
3718         }
3719
3720         p_ptr->leaving = TRUE;
3721         leave_bldg = TRUE;
3722         p_ptr->teleport_town = TRUE;
3723         screen_load();
3724         return TRUE;
3725 }
3726
3727 /*!
3728  * @brief 施設でモンスターの情報を知るメインルーチン / research_mon -KMW-
3729  * @return 常にTRUEを返す。
3730  * @todo 返り値が意味不明なので直した方が良いかもしれない。
3731  */
3732 static bool research_mon(void)
3733 {
3734         IDX i;
3735         int n;
3736         MONRACE_IDX r_idx;
3737         char sym, query;
3738         char buf[128];
3739         bool notpicked;
3740         bool recall = FALSE;
3741         u16b why = 0;
3742         MONSTER_IDX *who;
3743
3744         /* XTRA HACK WHATSEARCH */
3745         bool    all = FALSE;
3746         bool    uniq = FALSE;
3747         bool    norm = FALSE;
3748         char temp[80] = "";
3749
3750         /* XTRA HACK REMEMBER_IDX */
3751         static int old_sym = '\0';
3752         static IDX old_i = 0;
3753
3754         screen_save();
3755
3756         /* Get a character, or abort */
3757         if (!get_com(_("モンスターの文字を入力して下さい(記号 or ^A全,^Uユ,^N非ユ,^M名前):",
3758                                    "Enter character to be identified(^A:All,^U:Uniqs,^N:Non uniqs,^M:Name): "), &sym, FALSE)) 
3759
3760         {
3761                 /* Restore */
3762                 screen_load();
3763
3764                 return (FALSE);
3765         }
3766
3767         /* Find that character info, and describe it */
3768         for (i = 0; ident_info[i]; ++i)
3769         {
3770                 if (sym == ident_info[i][0]) break;
3771         }
3772
3773                 /* XTRA HACK WHATSEARCH */
3774         if (sym == KTRL('A'))
3775         {
3776                 all = TRUE;
3777                 strcpy(buf, _("全モンスターのリスト", "Full monster list."));
3778         }
3779         else if (sym == KTRL('U'))
3780         {
3781                 all = uniq = TRUE;
3782                 strcpy(buf, _("ユニーク・モンスターのリスト", "Unique monster list."));
3783         }
3784         else if (sym == KTRL('N'))
3785         {
3786                 all = norm = TRUE;
3787                 strcpy(buf, _("ユニーク外モンスターのリスト", "Non-unique monster list."));
3788         }
3789         else if (sym == KTRL('M'))
3790         {
3791                 all = TRUE;
3792                 if (!get_string(_("名前(英語の場合小文字で可)", "Enter name:"),temp, 70))
3793                 {
3794                         temp[0]=0;
3795
3796                         /* Restore */
3797                         screen_load();
3798
3799                         return FALSE;
3800                 }
3801                 sprintf(buf, _("名前:%sにマッチ", "Monsters with a name \"%s\""),temp);
3802         }
3803         else if (ident_info[i])
3804         {
3805                 sprintf(buf, "%c - %s.", sym, ident_info[i] + 2);
3806         }
3807         else
3808         {
3809                 sprintf(buf, "%c - %s", sym, _("無効な文字", "Unknown Symbol"));
3810         }
3811
3812         /* Display the result */
3813         prt(buf, 16, 10);
3814
3815
3816         /* Allocate the "who" array */
3817         C_MAKE(who, max_r_idx, MONRACE_IDX);
3818
3819         /* Collect matching monsters */
3820         for (n = 0, i = 1; i < max_r_idx; i++)
3821         {
3822                 monster_race *r_ptr = &r_info[i];
3823
3824                 /* Empty monster */
3825                 if (!r_ptr->name) continue;
3826
3827                 /* XTRA HACK WHATSEARCH */
3828                 /* Require non-unique monsters if needed */
3829                 if (norm && (r_ptr->flags1 & (RF1_UNIQUE))) continue;
3830
3831                 /* Require unique monsters if needed */
3832                 if (uniq && !(r_ptr->flags1 & (RF1_UNIQUE))) continue;
3833
3834                 /* 名前検索 */
3835                 if (temp[0])
3836                 {
3837                         int xx;
3838                         char temp2[80];
3839
3840                         for (xx = 0; temp[xx] && xx < 80; xx++)
3841                         {
3842 #ifdef JP
3843                                 if (iskanji(temp[xx]))
3844                                 {
3845                                         xx++;
3846                                         continue;
3847                                 }
3848 #endif
3849                                 if (isupper(temp[xx])) temp[xx] = (char)tolower(temp[xx]);
3850                         }
3851   
3852 #ifdef JP
3853                         strcpy(temp2, r_name + r_ptr->E_name);
3854 #else
3855                         strcpy(temp2, r_name + r_ptr->name);
3856 #endif
3857                         for (xx = 0; temp2[xx] && xx < 80; xx++)
3858                                 if (isupper(temp2[xx])) temp2[xx] = (char)tolower(temp2[xx]);
3859
3860 #ifdef JP
3861                         if (my_strstr(temp2, temp) || my_strstr(r_name + r_ptr->name, temp))
3862 #else
3863                         if (my_strstr(temp2, temp))
3864 #endif
3865                                 who[n++] = i;
3866                 }
3867                 else if (all || (r_ptr->d_char == sym)) who[n++] = i;
3868         }
3869
3870         /* Nothing to recall */
3871         if (!n)
3872         {
3873                 /* Free the "who" array */
3874                 C_KILL(who, max_r_idx, MONRACE_IDX);
3875
3876                 /* Restore */
3877                 screen_load();
3878
3879                 return (FALSE);
3880         }
3881
3882         /* Sort by level */
3883         why = 2;
3884         query = 'y';
3885
3886         /* Sort if needed */
3887         if (why)
3888         {
3889                 /* Select the sort method */
3890                 ang_sort_comp = ang_sort_comp_hook;
3891                 ang_sort_swap = ang_sort_swap_hook;
3892
3893                 /* Sort the array */
3894                 ang_sort(who, &why, n);
3895         }
3896
3897
3898         /* Start at the end */
3899         /* XTRA HACK REMEMBER_IDX */
3900         if (old_sym == sym && old_i < n) i = old_i;
3901         else i = n - 1;
3902
3903         notpicked = TRUE;
3904
3905         /* Scan the monster memory */
3906         while (notpicked)
3907         {
3908                 /* Extract a race */
3909                 r_idx = who[i];
3910
3911                 /* Hack -- Begin the prompt */
3912                 roff_top(r_idx);
3913
3914                 /* Hack -- Complete the prompt */
3915                 Term_addstr(-1, TERM_WHITE, _(" ['r'思い出, ' 'で続行, ESC]", " [(r)ecall, ESC, space to continue]"));
3916
3917                 /* Interact */
3918                 while (1)
3919                 {
3920                         /* Recall */
3921                         if (recall)
3922                         {
3923                                 /*** Recall on screen ***/
3924
3925                                 /* Get maximal info about this monster */
3926                                 lore_do_probe(r_idx);
3927
3928                                 /* Save this monster ID */
3929                                 monster_race_track(r_idx);
3930                                 handle_stuff();
3931
3932                                 /* know every thing mode */
3933                                 screen_roff(r_idx, 0x01);
3934                                 notpicked = FALSE;
3935
3936                                 /* XTRA HACK REMEMBER_IDX */
3937                                 old_sym = sym;
3938                                 old_i = i;
3939                         }
3940
3941                         /* Command */
3942                         query = inkey();
3943
3944                         /* Normal commands */
3945                         if (query != 'r') break;
3946
3947                         /* Toggle recall */
3948                         recall = !recall;
3949                 }
3950
3951                 /* Stop scanning */
3952                 if (query == ESCAPE) break;
3953
3954                 /* Move to "prev" monster */
3955                 if (query == '-')
3956                 {
3957                         if (++i == n)
3958                         {
3959                                 i = 0;
3960                                 if (!expand_list) break;
3961                         }
3962                 }
3963
3964                 /* Move to "next" monster */
3965                 else
3966                 {
3967                         if (i-- == 0)
3968                         {
3969                                 i = n - 1;
3970                                 if (!expand_list) break;
3971                         }
3972                 }
3973         }
3974
3975
3976         /* Re-display the identity */
3977         /* prt(buf, 5, 5);*/
3978
3979         /* Free the "who" array */
3980         C_KILL(who, max_r_idx, MONRACE_IDX);
3981
3982         /* Restore */
3983         screen_load();
3984
3985         return (!notpicked);
3986 }
3987
3988
3989 /*!
3990  * @brief 施設の処理実行メインルーチン / Execute a building command
3991  * @param bldg 施設構造体の参照ポインタ
3992  * @param i 実行したい施設のサービステーブルの添字
3993  * @return なし
3994  */
3995 static void bldg_process_command(building_type *bldg, int i)
3996 {
3997         BACT_IDX bact = bldg->actions[i];
3998         PRICE bcost;
3999         bool paid = FALSE;
4000
4001         msg_flag = FALSE;
4002         msg_erase();
4003
4004         if (is_owner(bldg))
4005                 bcost = bldg->member_costs[i];
4006         else
4007                 bcost = bldg->other_costs[i];
4008
4009         /* action restrictions */
4010         if (((bldg->action_restr[i] == 1) && !is_member(bldg)) ||
4011             ((bldg->action_restr[i] == 2) && !is_owner(bldg)))
4012         {
4013                 msg_print(_("それを選択する権利はありません!", "You have no right to choose that!"));
4014                 return;
4015         }
4016
4017         /* check gold (HACK - Recharge uses variable costs) */
4018         if ((bact != BACT_RECHARGE) &&
4019             (((bldg->member_costs[i] > p_ptr->au) && is_owner(bldg)) ||
4020              ((bldg->other_costs[i] > p_ptr->au) && !is_owner(bldg))))
4021         {
4022                 msg_print(_("お金が足りません!", "You do not have the gold!"));
4023                 return;
4024         }
4025
4026         switch (bact)
4027         {
4028         case BACT_NOTHING:
4029                 /* Do nothing */
4030                 break;
4031         case BACT_RESEARCH_ITEM:
4032                 paid = identify_fully(FALSE);
4033                 break;
4034         case BACT_TOWN_HISTORY:
4035                 town_history();
4036                 break;
4037         case BACT_RACE_LEGENDS:
4038                 race_legends();
4039                 break;
4040         case BACT_QUEST:
4041                 castle_quest();
4042                 break;
4043         case BACT_KING_LEGENDS:
4044         case BACT_ARENA_LEGENDS:
4045         case BACT_LEGENDS:
4046                 show_highclass();
4047                 break;
4048         case BACT_POSTER:
4049         case BACT_ARENA_RULES:
4050         case BACT_ARENA:
4051                 arena_comm(bact);
4052                 break;
4053         case BACT_IN_BETWEEN:
4054         case BACT_CRAPS:
4055         case BACT_SPIN_WHEEL:
4056         case BACT_DICE_SLOTS:
4057         case BACT_GAMBLE_RULES:
4058         case BACT_POKER:
4059                 gamble_comm(bact);
4060                 break;
4061         case BACT_REST:
4062         case BACT_RUMORS:
4063         case BACT_FOOD:
4064                 paid = inn_comm(bact);
4065                 break;
4066         case BACT_RESEARCH_MONSTER:
4067                 paid = research_mon();
4068                 break;
4069         case BACT_COMPARE_WEAPONS:
4070                 paid = TRUE;
4071                 bcost = compare_weapons(bcost);
4072                 break;
4073         case BACT_ENCHANT_WEAPON:
4074                 item_tester_hook = object_allow_enchant_melee_weapon;
4075                 enchant_item(bcost, 1, 1, 0);
4076                 break;
4077         case BACT_ENCHANT_ARMOR:
4078                 item_tester_hook = object_is_armour;
4079                 enchant_item(bcost, 0, 0, 1);
4080                 break;
4081         case BACT_RECHARGE:
4082                 building_recharge();
4083                 break;
4084         case BACT_RECHARGE_ALL:
4085                 building_recharge_all();
4086                 break;
4087         case BACT_IDENTS: /* needs work */
4088                 if (!get_check(_("持ち物を全て鑑定してよろしいですか?", "Do you pay for identify all your possession? "))) break;
4089                 identify_pack();
4090                 msg_print(_(" 持ち物全てが鑑定されました。", "Your possessions have been identified."));
4091                 paid = TRUE;
4092                 break;
4093         case BACT_IDENT_ONE: /* needs work */
4094                 paid = ident_spell(FALSE);
4095                 break;
4096         case BACT_LEARN:
4097                 do_cmd_study();
4098                 break;
4099         case BACT_HEALING: /* needs work */
4100                 paid = cure_critical_wounds(200);
4101                 break;
4102         case BACT_RESTORE: /* needs work */
4103                 paid = restore_all_status();
4104                 break;
4105         case BACT_ENCHANT_ARROWS:
4106                 item_tester_hook = item_tester_hook_ammo;
4107                 enchant_item(bcost, 1, 1, 0);
4108                 break;
4109         case BACT_ENCHANT_BOW:
4110                 item_tester_tval = TV_BOW;
4111                 enchant_item(bcost, 1, 1, 0);
4112                 break;
4113
4114         case BACT_RECALL:
4115                 if (recall_player(p_ptr, 1)) paid = TRUE;
4116                 break;
4117
4118         case BACT_TELEPORT_LEVEL:
4119                 clear_bldg(4, 20);
4120                 paid = free_level_recall(p_ptr);
4121                 break;
4122
4123         case BACT_LOSE_MUTATION:
4124                 if (p_ptr->muta1 || p_ptr->muta2 || (p_ptr->muta3 & ~MUT3_GOOD_LUCK) ||
4125                         (p_ptr->pseikaku != SEIKAKU_LUCKY && (p_ptr->muta3 & MUT3_GOOD_LUCK)))
4126                 {
4127                         while(!lose_mutation(0));
4128                         paid = TRUE;
4129                 }
4130                 else
4131                 {
4132                         msg_print(_("治すべき突然変異が無い。", "You have no mutations."));
4133                         msg_print(NULL);
4134                 }
4135                 break;
4136
4137         case BACT_BATTLE:
4138                 kakutoujou();
4139                 break;
4140
4141         case BACT_TSUCHINOKO:
4142                 tsuchinoko();
4143                 break;
4144
4145         case BACT_KUBI:
4146                 shoukinkubi();
4147                 break;
4148
4149         case BACT_TARGET:
4150                 today_target();
4151                 break;
4152
4153         case BACT_KANKIN:
4154                 kankin();
4155                 break;
4156
4157         case BACT_HEIKOUKA:
4158                 msg_print(_("平衡化の儀式を行なった。", "You received an equalization ritual."));
4159                 set_virtue(V_COMPASSION, 0);
4160                 set_virtue(V_HONOUR, 0);
4161                 set_virtue(V_JUSTICE, 0);
4162                 set_virtue(V_SACRIFICE, 0);
4163                 set_virtue(V_KNOWLEDGE, 0);
4164                 set_virtue(V_FAITH, 0);
4165                 set_virtue(V_ENLIGHTEN, 0);
4166                 set_virtue(V_ENCHANT, 0);
4167                 set_virtue(V_CHANCE, 0);
4168                 set_virtue(V_NATURE, 0);
4169                 set_virtue(V_HARMONY, 0);
4170                 set_virtue(V_VITALITY, 0);
4171                 set_virtue(V_UNLIFE, 0);
4172                 set_virtue(V_PATIENCE, 0);
4173                 set_virtue(V_TEMPERANCE, 0);
4174                 set_virtue(V_DILIGENCE, 0);
4175                 set_virtue(V_VALOUR, 0);
4176                 set_virtue(V_INDIVIDUALISM, 0);
4177                 get_virtues();
4178                 paid = TRUE;
4179                 break;
4180
4181         case BACT_TELE_TOWN:
4182                 paid = tele_town();
4183                 break;
4184
4185         case BACT_EVAL_AC:
4186                 paid = eval_ac(p_ptr->dis_ac + p_ptr->dis_to_a);
4187                 break;
4188
4189         case BACT_BROKEN_WEAPON:
4190                 paid = TRUE;
4191                 bcost = repair_broken_weapon(bcost);
4192                 break;
4193         }
4194
4195         if (paid)
4196         {
4197                 p_ptr->au -= bcost;
4198         }
4199 }
4200
4201 /*!
4202  * @brief クエスト入り口にプレイヤーが乗った際の処理 / Do building commands
4203  * @return なし
4204  */
4205 void do_cmd_quest(void)
4206 {
4207         if(p_ptr->wild_mode) return;
4208
4209         p_ptr->energy_use = 100;
4210
4211         if (!cave_have_flag_bold(p_ptr->y, p_ptr->x, FF_QUEST_ENTER))
4212         {
4213                 msg_print(_("ここにはクエストの入口はない。", "You see no quest level here."));
4214                 return;
4215         }
4216         else
4217         {
4218                 msg_print(_("ここにはクエストへの入口があります。", "There is an entry of a quest."));
4219                 if (!get_check(_("クエストに入りますか?", "Do you enter? "))) return;
4220                 if ((p_ptr->pseikaku == SEIKAKU_COMBAT) || (inventory[INVEN_BOW].name1 == ART_CRIMSON))
4221                         msg_print(_("『とにかく入ってみようぜぇ。』", ""));
4222                 else if(p_ptr->pseikaku == SEIKAKU_CHARGEMAN) msg_print("『全滅してやるぞ!』");
4223
4224                 /* Player enters a new quest */
4225                 p_ptr->oldpy = 0;
4226                 p_ptr->oldpx = 0;
4227
4228                 leave_quest_check();
4229
4230                 if (quest[p_ptr->inside_quest].type != QUEST_TYPE_RANDOM) dun_level = 1;
4231                 p_ptr->inside_quest = cave[p_ptr->y][p_ptr->x].special;
4232
4233                 p_ptr->leaving = TRUE;
4234         }
4235 }
4236
4237
4238 /*!
4239  * @brief 施設入り口にプレイヤーが乗った際の処理 / Do building commands
4240  * @return なし
4241  */
4242 void do_cmd_bldg(void)
4243 {
4244         int             i, which;
4245         char            command;
4246         bool            validcmd;
4247         building_type   *bldg;
4248
4249         if(p_ptr->wild_mode) return;
4250
4251         p_ptr->energy_use = 100;
4252
4253         if (!cave_have_flag_bold(p_ptr->y, p_ptr->x, FF_BLDG))
4254         {
4255                 msg_print(_("ここには建物はない。", "You see no building here."));
4256                 return;
4257         }
4258
4259         which = f_info[cave[p_ptr->y][p_ptr->x].feat].subtype;
4260
4261         bldg = &building[which];
4262
4263         /* Don't re-init the wilderness */
4264         reinit_wilderness = FALSE;
4265
4266         if ((which == 2) && (p_ptr->arena_number < 0))
4267         {
4268                 msg_print(_("「敗者に用はない。」", "'There's no place here for a LOSER like you!'"));
4269                 return;
4270         }
4271         else if ((which == 2) && p_ptr->inside_arena)
4272         {
4273                 if (!p_ptr->exit_bldg && m_cnt > 0)
4274                 {
4275                         prt(_("ゲートは閉まっている。モンスターがあなたを待っている!", "The gates are closed.  The monster awaits!"), 0, 0);
4276                 }
4277                 else
4278                 {
4279                         /* Don't save the arena as saved floor */
4280                         prepare_change_floor_mode(CFM_SAVE_FLOORS | CFM_NO_RETURN);
4281
4282                         p_ptr->inside_arena = FALSE;
4283                         p_ptr->leaving = TRUE;
4284
4285                         /* Re-enter the arena */
4286                         command_new = SPECIAL_KEY_BUILDING;
4287
4288                         /* No energy needed to re-enter the arena */
4289                         p_ptr->energy_use = 0;
4290                 }
4291
4292                 return;
4293         }
4294         else if (p_ptr->inside_battle)
4295         {
4296                 /* Don't save the arena as saved floor */
4297                 prepare_change_floor_mode(CFM_SAVE_FLOORS | CFM_NO_RETURN);
4298
4299                 p_ptr->leaving = TRUE;
4300                 p_ptr->inside_battle = FALSE;
4301
4302                 /* Re-enter the monster arena */
4303                 command_new = SPECIAL_KEY_BUILDING;
4304
4305                 /* No energy needed to re-enter the arena */
4306                 p_ptr->energy_use = 0;
4307
4308                 return;
4309         }
4310         else
4311         {
4312                 p_ptr->oldpy = p_ptr->y;
4313                 p_ptr->oldpx = p_ptr->x;
4314         }
4315
4316         forget_lite();
4317         forget_view();
4318
4319         /* Hack -- Increase "icky" depth */
4320         character_icky++;
4321
4322         command_arg = 0;
4323         command_rep = 0;
4324         command_new = 0;
4325
4326         show_building(bldg);
4327         leave_bldg = FALSE;
4328
4329         play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_BUILD);
4330
4331         while (!leave_bldg)
4332         {
4333                 validcmd = FALSE;
4334                 prt("", 1, 0);
4335
4336                 building_prt_gold();
4337
4338                 command = inkey();
4339
4340                 if (command == ESCAPE)
4341                 {
4342                         leave_bldg = TRUE;
4343                         p_ptr->inside_arena = FALSE;
4344                         p_ptr->inside_battle = FALSE;
4345                         break;
4346                 }
4347
4348                 for (i = 0; i < 8; i++)
4349                 {
4350                         if (bldg->letters[i])
4351                         {
4352                                 if (bldg->letters[i] == command)
4353                                 {
4354                                         validcmd = TRUE;
4355                                         break;
4356                                 }
4357                         }
4358                 }
4359
4360                 if(validcmd) bldg_process_command(bldg, i);
4361
4362                 handle_stuff();
4363         }
4364
4365         select_floor_music();
4366
4367         msg_flag = FALSE;
4368         msg_erase();
4369
4370         /* Reinit wilderness to activate quests ... */
4371         if (reinit_wilderness)
4372         {
4373                 p_ptr->leaving = TRUE;
4374         }
4375
4376         /* Hack -- Decrease "icky" depth */
4377         character_icky--;
4378
4379         Term_clear();
4380
4381         p_ptr->update |= (PU_VIEW | PU_MONSTERS | PU_BONUS | PU_LITE | PU_MON_LITE);
4382         p_ptr->redraw |= (PR_BASIC | PR_EXTRA | PR_EQUIPPY | PR_MAP);
4383         p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
4384 }
4385
4386
4387 /*!
4388  * @brief クエスト突入時のメッセージテーブル / Array of places to find an inscription
4389  */
4390 static concptr find_quest[] =
4391 {
4392         _("床にメッセージが刻まれている:", "You find the following inscription in the floor"),
4393         _("壁にメッセージが刻まれている:", "You see a message inscribed in the wall"),
4394         _("メッセージを見つけた:", "There is a sign saying"),
4395         _("何かが階段の上に書いてある:", "Something is written on the staircase"),
4396         _("巻物を見つけた。メッセージが書いてある:", "You find a scroll with the following message"),
4397 };
4398
4399
4400 /*!
4401  * @brief クエストの導入メッセージを表示する / Discover quest
4402  * @param q_idx 開始されたクエストのID
4403  */
4404 void quest_discovery(QUEST_IDX q_idx)
4405 {
4406         quest_type *q_ptr = &quest[q_idx];
4407         monster_race *r_ptr = &r_info[q_ptr->r_idx];
4408         MONSTER_NUMBER q_num = q_ptr->max_num;
4409         GAME_TEXT name[MAX_NLEN];
4410
4411         /* No quest index */
4412         if (!q_idx) return;
4413
4414         strcpy(name, (r_name + r_ptr->name));
4415
4416         msg_print(find_quest[rand_range(0, 4)]);
4417         msg_print(NULL);
4418
4419         if (q_num == 1)
4420         {
4421                 /* Unique */
4422
4423                 /* Hack -- "unique" monsters must be "unique" */
4424                 if ((r_ptr->flags1 & RF1_UNIQUE) && (0 == r_ptr->max_num))
4425                 {
4426                         msg_print(_("この階は以前は誰かによって守られていたようだ…。", "It seems that this level was protected by someone before..."));
4427                         /* The unique is already dead */
4428                         quest[q_idx].status = QUEST_STATUS_FINISHED;
4429                         q_ptr->complev = 0;
4430                         update_playtime();
4431                         q_ptr->comptime = playtime;
4432                 }
4433                 else
4434                 {
4435                         msg_format(_("注意せよ!この階は%sによって守られている!", "Beware, this level is protected by %s!"), name);
4436                 }
4437         }
4438         else
4439         {
4440                 /* Normal monsters */
4441 #ifndef JP
4442                 plural_aux(name);
4443 #endif
4444                 msg_format(_("注意しろ!この階は%d体の%sによって守られている!", "Be warned, this level is guarded by %d %s!"), q_num, name);
4445
4446         }
4447 }
4448
4449
4450 /*!
4451  * @brief 新しく入ったダンジョンの階層に固定されている一般のクエストを探し出しIDを返す。
4452  * / Hack -- Check if a level is a "quest" level
4453  * @param level 検索対象になる階
4454  * @return クエストIDを返す。該当がない場合0を返す。
4455  */
4456 QUEST_IDX quest_number(DEPTH level)
4457 {
4458         QUEST_IDX i;
4459
4460         /* Check quests */
4461         if (p_ptr->inside_quest)
4462                 return (p_ptr->inside_quest);
4463
4464         for (i = 0; i < max_q_idx; i++)
4465         {
4466                 if (quest[i].status != QUEST_STATUS_TAKEN) continue;
4467
4468                 if ((quest[i].type == QUEST_TYPE_KILL_LEVEL) &&
4469                         !(quest[i].flags & QUEST_FLAG_PRESET) &&
4470                     (quest[i].level == level) &&
4471                     (quest[i].dungeon == dungeon_type))
4472                         return (i);
4473         }
4474
4475         /* Check for random quest */
4476         return (random_quest_number(level));
4477 }
4478
4479 /*!
4480  * @brief 新しく入ったダンジョンの階層に固定されているランダムクエストを探し出しIDを返す。
4481  * @param level 検索対象になる階
4482  * @return クエストIDを返す。該当がない場合0を返す。
4483  */
4484 QUEST_IDX random_quest_number(DEPTH level)
4485 {
4486         QUEST_IDX i;
4487
4488         if (dungeon_type != DUNGEON_ANGBAND) return 0;
4489
4490         for (i = MIN_RANDOM_QUEST; i < MAX_RANDOM_QUEST + 1; i++)
4491         {
4492                 if ((quest[i].type == QUEST_TYPE_RANDOM) &&
4493                         (quest[i].status == QUEST_STATUS_TAKEN) &&
4494                         (quest[i].level == level) &&
4495                         (quest[i].dungeon == DUNGEON_ANGBAND))
4496                 {
4497                         return i;
4498                 }
4499         }
4500
4501         return 0;
4502 }