OSDN Git Service

ワーニングの除去。
[hengband/hengband.git] / src / bldg.c
1 /* File: bldg.c */
2
3 /*
4  * Purpose: Building commands
5  * Created by Ken Wigle for Kangband - a variant of Angband 2.8.3
6  * -KMW-
7  *
8  * Rewritten for Kangband 2.8.3i using Kamband's version of
9  * bldg.c as written by Ivan Tkatchev
10  *
11  * Changed for ZAngband by Robert Ruehlmann
12  */
13
14 #include "angband.h"
15
16 /* hack as in leave_store in store.c */
17 static bool leave_bldg = FALSE;
18
19 /* remember building location */
20 static int building_loc = 0;
21
22 static bool reinit_wilderness = FALSE;
23
24 static bool is_owner(building_type *bldg)
25 {
26         if (bldg->member_class[p_ptr->pclass] == BUILDING_OWNER)
27         {
28                 return (TRUE);
29         }
30
31         if (bldg->member_race[p_ptr->prace] == BUILDING_OWNER)
32         {
33                 return (TRUE);
34         }
35
36         if ((is_magic(p_ptr->realm1) && (bldg->member_realm[p_ptr->realm1] == BUILDING_OWNER)) ||
37                 (is_magic(p_ptr->realm2) && (bldg->member_realm[p_ptr->realm2] == BUILDING_OWNER)))
38         {
39                 return (TRUE);
40         }
41
42         return (FALSE);
43 }
44
45
46 static bool is_member(building_type *bldg)
47 {
48         if (bldg->member_class[p_ptr->pclass])
49         {
50                 return (TRUE);
51         }
52
53         if (bldg->member_race[p_ptr->prace])
54         {
55                 return (TRUE);
56         }
57
58         if ((is_magic(p_ptr->realm1) && bldg->member_realm[p_ptr->realm1]) ||
59             (is_magic(p_ptr->realm2) && bldg->member_realm[p_ptr->realm2]))
60         {
61                 return (TRUE);
62         }
63
64
65         if (p_ptr->pclass == CLASS_SORCERER)
66         {
67                 int i;
68                 bool OK = FALSE;
69                 for (i = 0; i < MAX_MAGIC; i++)
70                 {
71                         if (bldg->member_realm[i+1]) OK = TRUE;
72                 }
73                 return OK;
74         }
75         return (FALSE);
76 }
77
78
79 /*
80  * Clear the building information
81  */
82 static void clear_bldg(int min_row, int max_row)
83 {
84         int   i;
85
86         for (i = min_row; i <= max_row; i++)
87                 prt("", i, 0);
88 }
89
90 static void building_prt_gold(void)
91 {
92         char tmp_str[80];
93
94 #ifdef JP
95 prt("¼ê»ý¤Á¤Î¤ª¶â: ", 23,53);
96 #else
97         prt("Gold Remaining: ", 23, 53);
98 #endif
99
100
101         sprintf(tmp_str, "%9ld", (long)p_ptr->au);
102         prt(tmp_str, 23, 68);
103 }
104
105
106 /*
107  * Display a building.
108  */
109 static void show_building(building_type* bldg)
110 {
111         char buff[20];
112         int i;
113         byte action_color;
114         char tmp_str[80];
115
116         Term_clear();
117         sprintf(tmp_str, "%s (%s) %35s", bldg->owner_name, bldg->owner_race, bldg->name);
118         prt(tmp_str, 2, 1);
119
120
121         for (i = 0; i < 8; i++)
122         {
123                 if (bldg->letters[i])
124                 {
125                         if (bldg->action_restr[i] == 0)
126                         {
127                                 if ((is_owner(bldg) && (bldg->member_costs[i] == 0)) ||
128                                         (!is_owner(bldg) && (bldg->other_costs[i] == 0)))
129                                 {
130                                         action_color = TERM_WHITE;
131                                         buff[0] = '\0';
132                                 }
133                                 else if (is_owner(bldg))
134                                 {
135                                         action_color = TERM_YELLOW;
136 #ifdef JP
137 sprintf(buff, "($%ld)", bldg->member_costs[i]);
138 #else
139                                         sprintf(buff, "(%ldgp)", bldg->member_costs[i]);
140 #endif
141
142                                 }
143                                 else
144                                 {
145                                         action_color = TERM_YELLOW;
146 #ifdef JP
147 sprintf(buff, "($%ld)", bldg->other_costs[i]);
148 #else
149                                         sprintf(buff, "(%ldgp)", bldg->other_costs[i]);
150 #endif
151
152                                 }
153                         }
154                         else if (bldg->action_restr[i] == 1)
155                         {
156                                 if (!is_member(bldg))
157                                 {
158                                         action_color = TERM_L_DARK;
159 #ifdef JP
160 strcpy(buff, "(ÊÄŹ)");
161 #else
162                                         strcpy(buff, "(closed)");
163 #endif
164
165                                 }
166                                 else if ((is_owner(bldg) && (bldg->member_costs[i] == 0)) ||
167                                         (is_member(bldg) && (bldg->other_costs[i] == 0)))
168                                 {
169                                         action_color = TERM_WHITE;
170                                         buff[0] = '\0';
171                                 }
172                                 else if (is_owner(bldg))
173                                 {
174                                         action_color = TERM_YELLOW;
175 #ifdef JP
176 sprintf(buff, "($%ld)", bldg->member_costs[i]);
177 #else
178                                         sprintf(buff, "(%ldgp)", bldg->member_costs[i]);
179 #endif
180
181                                 }
182                                 else
183                                 {
184                                         action_color = TERM_YELLOW;
185 #ifdef JP
186 sprintf(buff, "($%ld)", bldg->other_costs[i]);
187 #else
188                                         sprintf(buff, "(%ldgp)", bldg->other_costs[i]);
189 #endif
190
191                                 }
192                         }
193                         else
194                         {
195                                 if (!is_owner(bldg))
196                                 {
197                                         action_color = TERM_L_DARK;
198 #ifdef JP
199 strcpy(buff, "(ÊÄŹ)");
200 #else
201                                         strcpy(buff, "(closed)");
202 #endif
203
204                                 }
205                                 else if (bldg->member_costs[i] != 0)
206                                 {
207                                         action_color = TERM_YELLOW;
208 #ifdef JP
209 sprintf(buff, "($%ld)", bldg->member_costs[i]);
210 #else
211                                         sprintf(buff, "(%ldgp)", bldg->member_costs[i]);
212 #endif
213
214                                 }
215                                 else
216                                 {
217                                         action_color = TERM_WHITE;
218                                         buff[0] = '\0';
219                                 }
220                         }
221
222                         sprintf(tmp_str," %c) %s %s", bldg->letters[i], bldg->act_names[i], buff);
223                         c_put_str(action_color, tmp_str, 19+(i/2), 35*(i%2));
224                 }
225         }
226
227 #ifdef JP
228 prt(" ESC) ·úʪ¤ò½Ð¤ë", 23, 0);
229 #else
230         prt(" ESC) Exit building", 23, 0);
231 #endif
232
233 }
234
235
236 /*
237  * arena commands
238  */
239 static void arena_comm(int cmd)
240 {
241         monster_race    *r_ptr;
242         cptr            name;
243
244
245         switch (cmd)
246         {
247                 case BACT_ARENA:
248                         if (p_ptr->arena_number == MAX_ARENA_MONS)
249                         {
250                                 clear_bldg(5, 19);
251 #ifdef JP
252 prt("¥¢¥ê¡¼¥Ê¤ÎÍ¥¾¡¼Ô¡ª", 5, 0);
253 prt("¤ª¤á¤Ç¤È¤¦¡ª¤¢¤Ê¤¿¤ÏÁ´¤Æ¤ÎŨ¤òÅݤ·¤Þ¤·¤¿¡£", 7, 0); 
254 prt("¾Þ¶â¤È¤·¤Æ $1,000,000 ¤¬Í¿¤¨¤é¤ì¤Þ¤¹¡£", 8, 0);
255 #else
256                                 prt("               Arena Victor!", 5, 0);
257                                 prt("Congratulations!  You have defeated all before you.", 7, 0);
258                                 prt("For that, receive the prize: 1,000,000 gold pieces", 8, 0);
259 #endif
260
261                                 prt("", 10, 0);
262                                 prt("", 11, 0);
263                                 p_ptr->au += 1000000L;
264 #ifdef JP
265 msg_print("¥¹¥Ú¡¼¥¹¥­¡¼¤Ç³¹Ô");
266 #else
267                                 msg_print("Press the space bar to continue");
268 #endif
269
270                                 msg_print(NULL);
271                                 p_ptr->arena_number++;
272                         }
273                         else if (p_ptr->arena_number > MAX_ARENA_MONS)
274                         {
275                                 if (p_ptr->arena_number < MAX_ARENA_MONS+2)
276                                 {
277 #ifdef JP
278 msg_print("·¯¤Î¤¿¤á¤ËºÇ¶¯¤ÎÄ©Àï¼Ô¤òÍÑ°Õ¤·¤Æ¤ª¤¤¤¿¡£");
279 #else
280                                         msg_print("The strongest challenger is waiting for you.");
281 #endif
282
283                                         msg_print(NULL);
284 #ifdef JP
285                                         if (get_check("Ä©À魯¤ë¤«¤Í¡©"))
286 #else
287                                         if (get_check("Do you fight? "))
288 #endif
289                                         {
290                                                 p_ptr->leftbldg = TRUE;
291                                                 p_ptr->inside_arena = TRUE;
292                                                 p_ptr->exit_bldg = FALSE;
293                                                 reset_tim_flags();
294                                                 p_ptr->leaving = TRUE;
295                                                 leave_bldg = TRUE;
296                                         }
297                                         else
298                                         {
299 #ifdef JP
300 msg_print("»ÄÇ°¤À¡£");
301 #else
302                                                 msg_print("We are disappointed.");
303 #endif
304                                         }
305                                 }
306                                 else
307                                 {
308 #ifdef JP
309 msg_print("¤¢¤Ê¤¿¤Ï¥¢¥ê¡¼¥Ê¤ËÆþ¤ê¡¢¤·¤Ð¤é¤¯¤Î´Ö±É¸÷¤Ë¤Ò¤¿¤Ã¤¿¡£");
310 #else
311                                         msg_print("You enter the arena briefly and bask in your glory.");
312 #endif
313
314                                         msg_print(NULL);
315                                 }
316                         }
317                         else if (p_ptr->riding && (p_ptr->pclass != CLASS_BEASTMASTER) && (p_ptr->pclass != CLASS_CAVALRY))
318                         {
319 #ifdef JP
320 msg_print("¥Ú¥Ã¥È¤Ë¾è¤Ã¤¿¤Þ¤Þ¤Ç¤Ï¥¢¥ê¡¼¥Ê¤ØÆþ¤ì¤µ¤»¤Æ¤â¤é¤¨¤Ê¤«¤Ã¤¿¡£");
321 #else
322                                 msg_print("You don't have permission to enter with pet.");
323 #endif
324
325                                 msg_print(NULL);
326                         }
327                         else
328                         {
329                                 p_ptr->leftbldg = TRUE;
330                                 p_ptr->inside_arena = TRUE;
331                                 p_ptr->exit_bldg = FALSE;
332                                 reset_tim_flags();
333                                 p_ptr->leaving = TRUE;
334                                 leave_bldg = TRUE;
335                         }
336                         break;
337                 case BACT_POSTER:
338                         if (p_ptr->arena_number == MAX_ARENA_MONS)
339 #ifdef JP
340 msg_print("¤¢¤Ê¤¿¤Ï¾¡Íø¼Ô¤À¡£ ¥¢¥ê¡¼¥Ê¤Ç¤Î¥»¥ì¥â¥Ë¡¼¤Ë»²²Ã¤·¤Ê¤µ¤¤¡£");
341 #else
342                                 msg_print("You are victorious. Enter the arena for the ceremony.");
343 #endif
344
345                         else if (p_ptr->arena_number > MAX_ARENA_MONS)
346                         {
347 #ifdef JP
348 msg_print("¤¢¤Ê¤¿¤Ï¤¹¤Ù¤Æ¤ÎŨ¤Ë¾¡Íø¤·¤¿¡£");
349 #else
350                                 msg_print("You have won against all foes.");
351 #endif
352                         }
353                         else
354                         {
355                                 r_ptr = &r_info[arena_monsters[p_ptr->arena_number]];
356                                 name = (r_name + r_ptr->name);
357 #ifdef JP
358 msg_format("%s ¤ËÄ©À魯¤ë¤â¤Î¤Ï¤¤¤Ê¤¤¤«¡©", name);
359 #else
360                                 msg_format("Do I hear any challenges against: %s", name);
361 #endif
362                         }
363                         break;
364                 case BACT_ARENA_RULES:
365
366                         /* Save screen */
367                         screen_save();
368
369                         /* Peruse the arena help file */
370 #ifdef JP
371 (void)show_file(TRUE, "arena_j.txt", NULL, 0, 0);
372 #else
373                         (void)show_file(TRUE, "arena.txt", NULL, 0, 0);
374 #endif
375
376
377                         /* Load screen */
378                         screen_load();
379
380                         break;
381         }
382 }
383
384
385 /*
386  * display fruit for dice slots
387  */
388 static void display_fruit(int row, int col, int fruit)
389 {
390         switch (fruit)
391         {
392                 case 0: /* lemon */
393 #ifdef JP
394                         c_put_str(TERM_YELLOW, "   ####.", row, col);
395                         c_put_str(TERM_YELLOW, "  #    #", row + 1, col);
396                         c_put_str(TERM_YELLOW, " #     #", row + 2, col);
397                         c_put_str(TERM_YELLOW, "#      #", row + 3, col);
398                         c_put_str(TERM_YELLOW, "#      #", row + 4, col);
399                         c_put_str(TERM_YELLOW, "#     # ", row + 5, col);
400                         c_put_str(TERM_YELLOW, "#    #  ", row + 6, col);
401                         c_put_str(TERM_YELLOW, ".####   ", row + 7, col);
402                         prt(                   " ¥ì¥â¥ó ", row + 8, col);
403 #else
404                         c_put_str(TERM_YELLOW, "   ####.", row, col);
405                         c_put_str(TERM_YELLOW, "  #    #", row + 1, col);
406                         c_put_str(TERM_YELLOW, " #     #", row + 2, col);
407                         c_put_str(TERM_YELLOW, "#      #", row + 3, col);
408                         c_put_str(TERM_YELLOW, "#      #", row + 4, col);
409                         c_put_str(TERM_YELLOW, "#     # ", row + 5, col);
410                         c_put_str(TERM_YELLOW, "#    #  ", row + 6, col);
411                         c_put_str(TERM_YELLOW, ".####   ", row + 7, col);
412                         prt(                   " Lemon  ", row + 8, col);
413 #endif
414
415                         break;
416                 case 1: /* orange */
417 #ifdef JP
418                         c_put_str(TERM_ORANGE, "   ##   ", row, col);
419                         c_put_str(TERM_ORANGE, "  #..#  ", row + 1, col);
420                         c_put_str(TERM_ORANGE, " #....# ", row + 2, col);
421                         c_put_str(TERM_ORANGE, "#......#", row + 3, col);
422                         c_put_str(TERM_ORANGE, "#......#", row + 4, col);
423                         c_put_str(TERM_ORANGE, " #....# ", row + 5, col);
424                         c_put_str(TERM_ORANGE, "  #..#  ", row + 6, col);
425                         c_put_str(TERM_ORANGE, "   ##   ", row + 7, col);
426                         prt(                   "¥ª¥ì¥ó¥¸", row + 8, col);
427 #else
428                         c_put_str(TERM_ORANGE, "   ##   ", row, col);
429                         c_put_str(TERM_ORANGE, "  #..#  ", row + 1, col);
430                         c_put_str(TERM_ORANGE, " #....# ", row + 2, col);
431                         c_put_str(TERM_ORANGE, "#......#", row + 3, col);
432                         c_put_str(TERM_ORANGE, "#......#", row + 4, col);
433                         c_put_str(TERM_ORANGE, " #....# ", row + 5, col);
434                         c_put_str(TERM_ORANGE, "  #..#  ", row + 6, col);
435                         c_put_str(TERM_ORANGE, "   ##   ", row + 7, col);
436                         prt(                   " Orange ", row + 8, col);
437 #endif
438
439                         break;
440                 case 2: /* sword */
441 #ifdef JP
442                         c_put_str(TERM_SLATE, "   ¦«   " , row, col);
443                         c_put_str(TERM_SLATE, "   ||   " , row + 1, col);
444                         c_put_str(TERM_SLATE, "   ||   " , row + 2, col);
445                         c_put_str(TERM_SLATE, "   ||   " , row + 3, col);
446                         c_put_str(TERM_SLATE, "   ||   " , row + 4, col);
447                         c_put_str(TERM_SLATE, "   ||   " , row + 5, col);
448                         c_put_str(TERM_UMBER, " |=°¡=| " , row + 6, col);
449                         c_put_str(TERM_UMBER, "   ÌÜ   " , row + 7, col);
450                         prt(                  "   ·õ   " , row + 8, col);
451 #else
452                         c_put_str(TERM_SLATE, "   /\\   " , row, col);
453                         c_put_str(TERM_SLATE, "   ##   " , row + 1, col);
454                         c_put_str(TERM_SLATE, "   ##   " , row + 2, col);
455                         c_put_str(TERM_SLATE, "   ##   " , row + 3, col);
456                         c_put_str(TERM_SLATE, "   ##   " , row + 4, col);
457                         c_put_str(TERM_SLATE, "   ##   " , row + 5, col);
458                         c_put_str(TERM_UMBER, " ###### " , row + 6, col);
459                         c_put_str(TERM_UMBER, "   ##   " , row + 7, col);
460                         prt(                  " Sword  " , row + 8, col);
461 #endif
462
463                         break;
464                 case 3: /* shield */
465 #ifdef JP
466                         c_put_str(TERM_SLATE, " ###### ", row, col);
467                         c_put_str(TERM_SLATE, "#      #", row + 1, col);
468                         c_put_str(TERM_SLATE, "# ++++ #", row + 2, col);
469                         c_put_str(TERM_SLATE, "# +==+ #", row + 3, col);
470                         c_put_str(TERM_SLATE, "#  ++  #", row + 4, col);
471                         c_put_str(TERM_SLATE, " #    # ", row + 5, col);
472                         c_put_str(TERM_SLATE, "  #  #  ", row + 6, col);
473                         c_put_str(TERM_SLATE, "   ##   ", row + 7, col);
474                         prt(                  "   ½â   ", row + 8, col);
475 #else
476                         c_put_str(TERM_SLATE, " ###### ", row, col);
477                         c_put_str(TERM_SLATE, "#      #", row + 1, col);
478                         c_put_str(TERM_SLATE, "# ++++ #", row + 2, col);
479                         c_put_str(TERM_SLATE, "# +==+ #", row + 3, col);
480                         c_put_str(TERM_SLATE, "#  ++  #", row + 4, col);
481                         c_put_str(TERM_SLATE, " #    # ", row + 5, col);
482                         c_put_str(TERM_SLATE, "  #  #  ", row + 6, col);
483                         c_put_str(TERM_SLATE, "   ##   ", row + 7, col);
484                         prt(                  " Shield ", row + 8, col);
485 #endif
486
487                         break;
488                 case 4: /* plum */
489 #ifdef JP
490                         c_put_str(TERM_VIOLET, "   ##   ", row, col);
491                         c_put_str(TERM_VIOLET, " ###### ", row + 1, col);
492                         c_put_str(TERM_VIOLET, "########", row + 2, col);
493                         c_put_str(TERM_VIOLET, "########", row + 3, col);
494                         c_put_str(TERM_VIOLET, "########", row + 4, col);
495                         c_put_str(TERM_VIOLET, " ###### ", row + 5, col);
496                         c_put_str(TERM_VIOLET, "  ####  ", row + 6, col);
497                         c_put_str(TERM_VIOLET, "   ##   ", row + 7, col);
498                         prt(                   " ¥×¥é¥à ", row + 8, col);
499 #else
500                         c_put_str(TERM_VIOLET, "   ##   ", row, col);
501                         c_put_str(TERM_VIOLET, " ###### ", row + 1, col);
502                         c_put_str(TERM_VIOLET, "########", row + 2, col);
503                         c_put_str(TERM_VIOLET, "########", row + 3, col);
504                         c_put_str(TERM_VIOLET, "########", row + 4, col);
505                         c_put_str(TERM_VIOLET, " ###### ", row + 5, col);
506                         c_put_str(TERM_VIOLET, "  ####  ", row + 6, col);
507                         c_put_str(TERM_VIOLET, "   ##   ", row + 7, col);
508                         prt(                   "  Plum  ", row + 8, col);
509 #endif
510
511                         break;
512                 case 5: /* cherry */
513 #ifdef JP
514                         c_put_str(TERM_RED, "      ##", row, col);
515                         c_put_str(TERM_RED, "   ###  ", row + 1, col);
516                         c_put_str(TERM_RED, "  #..#  ", row + 2, col);
517                         c_put_str(TERM_RED, "  #..#  ", row + 3, col);
518                         c_put_str(TERM_RED, " ###### ", row + 4, col);
519                         c_put_str(TERM_RED, "#..##..#", row + 5, col);
520                         c_put_str(TERM_RED, "#..##..#", row + 6, col);
521                         c_put_str(TERM_RED, " ##  ## ", row + 7, col);
522                         prt(                "¥Á¥§¥ê¡¼", row + 8, col);
523 #else
524                         c_put_str(TERM_RED, "      ##", row, col);
525                         c_put_str(TERM_RED, "   ###  ", row + 1, col);
526                         c_put_str(TERM_RED, "  #..#  ", row + 2, col);
527                         c_put_str(TERM_RED, "  #..#  ", row + 3, col);
528                         c_put_str(TERM_RED, " ###### ", row + 4, col);
529                         c_put_str(TERM_RED, "#..##..#", row + 5, col);
530                         c_put_str(TERM_RED, "#..##..#", row + 6, col);
531                         c_put_str(TERM_RED, " ##  ## ", row + 7, col);
532                         prt(                " Cherry ", row + 8, col);
533 #endif
534
535                         break;
536         }
537 }
538
539 /*
540  * kpoker no (tyuto-hannpa na)pakuri desu...
541  * joker ha shineru node haitte masen.
542  *
543  * TODO: donataka! tsukutte!
544  *  - agatta yaku no kiroku (like DQ).
545  *  - kakkoii card no e.
546  *  - sousa-sei no koujyo.
547  *  - code wo wakariyasuku.
548  *  - double up.
549  *  - Joker... -- done.
550  *
551  * 9/13/2000 --Koka
552  * 9/15/2000 joker wo jissou. soreto, code wo sukosi kakikae. --Habu
553  */
554 #define SUIT_OF(card)  ((card) / 13)
555 #define NUM_OF(card)   ((card) % 13)
556 #define IS_JOKER(card) ((card) == 52)
557
558 static int cards[5]; /* tefuda no card */
559
560 static void reset_deck(int deck[])
561 {
562         int i;
563         for (i = 0; i < 53; i++) deck[i] = i;
564
565         /* shuffle cards */
566         for (i = 0; i < 53; i++){
567                 int tmp1 = randint0(53 - i) + i;
568                 int tmp2 = deck[i];
569                 deck[i] = deck[tmp1];
570                 deck[tmp1] = tmp2;
571         }
572 }
573
574 static bool have_joker(void)
575 {
576         int i;
577
578         for (i = 0; i < 5; i++){
579           if(IS_JOKER(cards[i])) return TRUE;
580         }
581         return FALSE;
582 }
583
584 static bool find_card_num(int num)
585 {
586         int i;
587         for (i = 0; i < 5; i++)
588                 if (NUM_OF(cards[i]) == num && !IS_JOKER(cards[i])) return TRUE;
589         return FALSE;
590 }
591
592 static bool yaku_check_flush(void)
593 {
594         int i, suit;
595         bool joker_is_used = FALSE;
596
597         suit = IS_JOKER(cards[0]) ? SUIT_OF(cards[1]) : SUIT_OF(cards[0]);
598         for (i = 0; i < 5; i++){
599                 if (SUIT_OF(cards[i]) != suit){
600                   if(have_joker() && !joker_is_used)
601                     joker_is_used = TRUE;
602                   else
603                     return FALSE;
604                 }
605         }
606
607         return TRUE;
608 }
609
610 static int yaku_check_straight(void)
611 {
612         int i, lowest = 99;
613         bool joker_is_used = FALSE;
614
615         /* get lowest */
616         for (i = 0; i < 5; i++)
617         {
618                 if (NUM_OF(cards[i]) < lowest && !IS_JOKER(cards[i]))
619                         lowest = NUM_OF(cards[i]);
620         }
621         
622         if (yaku_check_flush())
623         {
624           if( lowest == 0 ){
625                 for (i = 0; i < 4; i++)
626                 {
627                         if (!find_card_num(9 + i)){
628                                 if( have_joker() && !joker_is_used )
629                                   joker_is_used = TRUE;
630                                 else
631                                   break;
632                         }
633                 }
634                 if (i == 4) return 3; /* Wow! Royal Flush!!! */
635           }
636           if( lowest == 9 ){
637                 for (i = 0; i < 3; i++)
638                 {
639                         if (!find_card_num(10 + i))
640                                 break;
641                 }
642                 if (i == 3 && have_joker()) return 3; /* Wow! Royal Flush!!! */
643           }
644         }
645
646         joker_is_used = FALSE;
647         for (i = 0; i < 5; i++)
648         {
649                 if (!find_card_num(lowest + i)){
650                   if( have_joker() && !joker_is_used )
651                     joker_is_used = TRUE;
652                   else
653                     return 0;
654                 }
655         }
656         
657         if (yaku_check_flush())
658                 return 2; /* Straight Flush */
659
660         return 1;
661 }
662
663 /*
664  * 0:nopair 1:1 pair 2:2 pair 3:3 cards 4:full house 6:4cards
665  */
666 static int yaku_check_pair(void)
667 {
668         int i, i2, matching = 0;
669
670         for (i = 0; i < 5; i++)
671         {
672                 for (i2 = i+1; i2 < 5; i2++)
673                 {
674                         if (IS_JOKER(cards[i]) || IS_JOKER(cards[i2])) continue;
675                         if (NUM_OF(cards[i]) == NUM_OF(cards[i2]))
676                                 matching++;
677                 }
678         }
679
680         if(have_joker()){
681           switch(matching){
682           case 0:
683             matching = 1;
684             break;
685           case 1:
686             matching = 3;
687             break;
688           case 2:
689             matching = 4;
690             break;
691           case 3:
692             matching = 6;
693             break;
694           case 6:
695             matching = 7;
696             break;
697           default:
698             /* don't reach */
699             break;
700           }
701         }
702
703         return matching;
704 }
705
706 #define ODDS_5A 3000
707 #define ODDS_5C 400
708 #define ODDS_RF 200
709 #define ODDS_SF 80
710 #define ODDS_4C 16
711 #define ODDS_FH 12
712 #define ODDS_FL 8
713 #define ODDS_ST 4
714 #define ODDS_3C 1
715 #define ODDS_2P 1
716
717 static int yaku_check(void)
718 {
719         prt("                            ", 4, 3);
720
721         switch(yaku_check_straight()){
722         case 3: /* RF! */
723 #ifdef JP
724                 c_put_str(TERM_YELLOW, "¥í¥¤¥ä¥ë¥¹¥È¥ì¡¼¥È¥Õ¥é¥Ã¥·¥å",  4,  3);
725 #else
726                 c_put_str(TERM_YELLOW, "Royal Flush",  4,  3);
727 #endif
728                 return ODDS_RF;
729         case 2: /* SF! */
730 #ifdef JP
731                 c_put_str(TERM_YELLOW, "¥¹¥È¥ì¡¼¥È¥Õ¥é¥Ã¥·¥å",  4,  3);
732 #else
733                 c_put_str(TERM_YELLOW, "Straight Flush",  4,  3);
734 #endif
735                 return ODDS_SF;
736         case 1:
737 #ifdef JP
738                 c_put_str(TERM_YELLOW, "¥¹¥È¥ì¡¼¥È",  4,  3);
739 #else
740                 c_put_str(TERM_YELLOW, "Straight",  4,  3);
741 #endif
742                 return ODDS_ST;
743         default:
744                 /* Not straight -- fall through */
745                 break;
746         }
747
748         if (yaku_check_flush())
749         {
750
751 #ifdef JP
752         c_put_str(TERM_YELLOW, "¥Õ¥é¥Ã¥·¥å",  4,  3);
753 #else
754         c_put_str(TERM_YELLOW, "Flush",  4,  3);
755 #endif
756                 return ODDS_FL;
757         }
758
759         switch (yaku_check_pair())
760         {
761         case 1:
762 #ifdef JP
763                 c_put_str(TERM_YELLOW, "¥ï¥ó¥Ú¥¢",  4,  3);
764 #else
765                 c_put_str(TERM_YELLOW, "One pair",  4,  3);
766 #endif
767                 return 0;
768         case 2:
769 #ifdef JP
770                 c_put_str(TERM_YELLOW, "¥Ä¡¼¥Ú¥¢",  4,  3);
771 #else
772                 c_put_str(TERM_YELLOW, "Two pair",  4,  3);
773 #endif
774                 return ODDS_2P;
775         case 3:
776 #ifdef JP
777                 c_put_str(TERM_YELLOW, "¥¹¥ê¡¼¥«¡¼¥É",  4,  3);
778 #else
779                 c_put_str(TERM_YELLOW, "Three of a kind",  4,  3);
780 #endif
781                 return ODDS_3C;
782         case 4:
783 #ifdef JP
784                 c_put_str(TERM_YELLOW, "¥Õ¥ë¥Ï¥¦¥¹",  4,  3);
785 #else
786                 c_put_str(TERM_YELLOW, "Full house",  4,  3);
787 #endif
788                 return ODDS_FH;
789         case 6:
790 #ifdef JP
791                 c_put_str(TERM_YELLOW, "¥Õ¥©¡¼¥«¡¼¥É",  4,  3);
792 #else
793                 c_put_str(TERM_YELLOW, "Four of a kind",  4,  3);
794 #endif
795                 return ODDS_4C;
796         case 7:
797                 if (!NUM_OF(cards[0]) || !NUM_OF(cards[1]))
798                 {
799 #ifdef JP
800                         c_put_str(TERM_YELLOW, "¥Õ¥¡¥¤¥Ö¥¨¡¼¥¹",  4,  3);
801 #else
802                         c_put_str(TERM_YELLOW, "Five ace",  4,  3);
803 #endif
804                         return ODDS_5A;
805                 }
806                 else
807                 {
808 #ifdef JP
809                         c_put_str(TERM_YELLOW, "¥Õ¥¡¥¤¥Ö¥«¡¼¥É",  4,  3);
810 #else
811                         c_put_str(TERM_YELLOW, "Five of a kind",  4,  3);
812 #endif
813                         return ODDS_5C;
814                 }
815         default:
816                 break;
817         }
818         return 0;
819 }
820
821 static void display_kaeruka(int hoge, int kaeruka[])
822 {
823         int i;
824         char col = TERM_WHITE;
825         for (i = 0; i < 5; i++)
826         {
827                 if (i == hoge) col = TERM_YELLOW;
828                 else if(kaeruka[i]) col = TERM_WHITE;
829                 else col = TERM_L_BLUE;
830 #ifdef JP
831                 if(kaeruka[i])
832                         c_put_str(col, "¤«¤¨¤ë", 14,  5+i*16);
833                 else
834                         c_put_str(col, "¤Î¤³¤¹", 14,  5+i*16);
835 #else
836                 if(kaeruka[i])
837                         c_put_str(col, "Change", 14,  5+i*16);
838                 else
839                         c_put_str(col, " Stay ", 14,  5+i*16);
840 #endif
841         }
842         if (hoge > 4) col = TERM_YELLOW;
843         else col = TERM_WHITE;
844 #ifdef JP
845         c_put_str(col, "·èÄê", 16,  38);
846 #else
847         c_put_str(col, "Sure", 16,  38);
848 #endif
849
850         /* Hilite current option */
851         if (hoge < 5) move_cursor(14, 5+hoge*16);
852         else move_cursor(16, 38);
853 }
854
855
856 static void display_cards(void)
857 {
858         int i, j;
859         char suitcolor[4] = {TERM_YELLOW, TERM_L_RED, TERM_L_BLUE, TERM_L_GREEN};
860 #ifdef JP
861         cptr suit[4] = {"¡ú", "¡ü", "¢ù", "¢÷"};
862         cptr card_grph[13][7] = {{"£Á   %s     ",
863                                   "     ÊÑ     ",
864                                   "     ¶ò     ",
865                                   "     ÈÚ     ",
866                                   "     ÅÜ     ",
867                                   "     %s     ",
868                                   "          £Á"},
869                                  {"£²          ",
870                                   "     %s     ",
871                                   "            ",
872                                   "            ",
873                                   "            ",
874                                   "     %s     ",
875                                   "          £²"},
876                                  {"£³          ",
877                                   "     %s     ",
878                                   "            ",
879                                   "     %s     ",
880                                   "            ",
881                                   "     %s     ",
882                                   "          £³"},
883                                  {"£´          ",
884                                   "   %s  %s   ",
885                                   "            ",
886                                   "            ",
887                                   "            ",
888                                   "   %s  %s   ",
889                                   "          £´"},
890                                  {"£µ          ",
891                                   "   %s  %s   ",
892                                   "            ",
893                                   "     %s     ",
894                                   "            ",
895                                   "   %s  %s   ",
896                                   "          £µ"},
897                                  {"£¶          ",
898                                   "   %s  %s   ",
899                                   "            ",
900                                   "   %s  %s   ",
901                                   "            ",
902                                   "   %s  %s   ",
903                                   "          £¶"},
904                                  {"£·          ",
905                                   "   %s  %s   ",
906                                   "     %s     ",
907                                   "   %s  %s   ",
908                                   "            ",
909                                   "   %s  %s   ",
910                                   "          £·"},
911                                  {"£¸          ",
912                                   "   %s  %s   ",
913                                   "     %s     ",
914                                   "   %s  %s   ",
915                                   "     %s     ",
916                                   "   %s  %s   ",
917                                   "          £¸"},
918                                  {"£¹ %s  %s   ",
919                                   "            ",
920                                   "   %s  %s   ",
921                                   "     %s     ",
922                                   "   %s  %s   ",
923                                   "            ",
924                                   "   %s  %s £¹"},
925                                  {"10 %s  %s   ",
926                                   "     %s     ",
927                                   "   %s  %s   ",
928                                   "            ",
929                                   "   %s  %s   ",
930                                   "     %s     ",
931                                   "   %s  %s 10"},
932                                  {"£Ê   ¦«     ",
933                                   "%s   ||     ",
934                                   "     ||     ",
935                                   "     ||     ",
936                                   "     ||     ",
937                                   "   |=°¡=| %s",
938                                   "     ÌÜ   £Ê"},
939                                  {"£Ñ ######   ",
940                                   "%s#      #  ",
941                                   "  # ++++ #  ",
942                                   "  # +==+ #  ",
943                                   "   # ++ #   ",
944                                   "    #  #  %s",
945                                   "     ##   £Ñ"},
946                                  {"£Ë          ",
947                                   "%s ¡®¢Þ¡­   ",
948                                   "  ¦Ã¦Ã¦Ã¦Ë  ",
949                                   "  ¦Ï ¦Ï ¦É  ",
950                                   "   ¦Ô    ¢ß ",
951                                   "    ¦Ò ¥Î %s",
952                                   "          £Ë"}};
953         cptr joker_grph[7] = {    "            ",
954                                   "     £Ê     ",
955                                   "     £Ï     ",
956                                   "     £Ë     ",
957                                   "     £Å     ",
958                                   "     £Ò     ",
959                                   "            "};
960
961 #else
962
963         cptr suit[4] = {"[]", "qp", "<>", "db"};
964         cptr card_grph[13][7] = {{"A    %s     ",
965                                   "     He     ",
966                                   "     ng     ",
967                                   "     ba     ",
968                                   "     nd     ",
969                                   "     %s     ",
970                                   "           A"},
971                                  {"2           ",
972                                   "     %s     ",
973                                   "            ",
974                                   "            ",
975                                   "            ",
976                                   "     %s     ",
977                                   "           2"},
978                                  {"3           ",
979                                   "     %s     ",
980                                   "            ",
981                                   "     %s     ",
982                                   "            ",
983                                   "     %s     ",
984                                   "           3"},
985                                  {"4           ",
986                                   "   %s  %s   ",
987                                   "            ",
988                                   "            ",
989                                   "            ",
990                                   "   %s  %s   ",
991                                   "           4"},
992                                  {"5           ",
993                                   "   %s  %s   ",
994                                   "            ",
995                                   "     %s     ",
996                                   "            ",
997                                   "   %s  %s   ",
998                                   "           5"},
999                                  {"6           ",
1000                                   "   %s  %s   ",
1001                                   "            ",
1002                                   "   %s  %s   ",
1003                                   "            ",
1004                                   "   %s  %s   ",
1005                                   "           6"},
1006                                  {"7           ",
1007                                   "   %s  %s   ",
1008                                   "     %s     ",
1009                                   "   %s  %s   ",
1010                                   "            ",
1011                                   "   %s  %s   ",
1012                                   "           7"},
1013                                  {"8           ",
1014                                   "   %s  %s   ",
1015                                   "     %s     ",
1016                                   "   %s  %s   ",
1017                                   "     %s     ",
1018                                   "   %s  %s   ",
1019                                   "           8"},
1020                                  {"9  %s  %s   ",
1021                                   "            ",
1022                                   "   %s  %s   ",
1023                                   "     %s     ",
1024                                   "   %s  %s   ",
1025                                   "            ",
1026                                   "   %s  %s  9"},
1027                                  {"10 %s  %s   ",
1028                                   "     %s     ",
1029                                   "   %s  %s   ",
1030                                   "            ",
1031                                   "   %s  %s   ",
1032                                   "     %s     ",
1033                                   "   %s  %s 10"},
1034                                  {"J    /\\     ",
1035                                   "%s   ||     ",
1036                                   "     ||     ",
1037                                   "     ||     ",
1038                                   "     ||     ",
1039                                   "   |=HH=| %s",
1040                                   "     ][    J"},
1041                                  {"Q  ######   ",
1042                                   "%s#      #  ",
1043                                   "  # ++++ #  ",
1044                                   "  # +==+ #  ",
1045                                   "   # ++ #   ",
1046                                   "    #  #  %s",
1047                                   "     ##    Q"},
1048                                  {"K           ",
1049                                   "%s _'~~`_   ",
1050                                   "   jjjjj$&  ",
1051                                   "   q q uu   ",
1052                                   "   c    &   ",
1053                                   "    v__/  %s",
1054                                   "           K"}};
1055         cptr joker_grph[7] = {    "            ",
1056                                   "     J      ",
1057                                   "     O      ",
1058                                   "     K      ",
1059                                   "     E      ",
1060                                   "     R      ",
1061                                   "            "};
1062 #endif
1063
1064         for (i = 0; i < 5; i++)
1065         {
1066 #ifdef JP
1067                 prt("¨®¨¬¨¬¨¬¨¬¨¬¨¬¨¯",  5,  i*16);
1068 #else
1069                 prt(" +------------+ ",  5,  i*16);
1070 #endif
1071         }
1072
1073         for (i = 0; i < 5; i++)
1074         {
1075                 for (j = 0; j < 7; j++)
1076                 {
1077 #ifdef JP
1078                         prt("¨­",  j+6,  i*16);
1079 #else
1080                         prt(" |",  j+6,  i*16);
1081 #endif
1082                         if(IS_JOKER(cards[i]))
1083                                 c_put_str(TERM_VIOLET, joker_grph[j],  j+6,  2+i*16);
1084                         else
1085                                 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);
1086 #ifdef JP
1087                         prt("¨­",  j+6,  i*16+14);
1088 #else
1089                         prt("| ",  j+6,  i*16+14);
1090 #endif
1091                 }
1092         }
1093         for (i = 0; i < 5; i++)
1094         {
1095 #ifdef JP
1096                 prt("¨±¨¬¨¬¨¬¨¬¨¬¨¬¨°", 13,  i*16);
1097 #else
1098                 prt(" +------------+ ", 13,  i*16);
1099 #endif
1100         }
1101 }
1102
1103 static int do_poker(void)
1104 {
1105         int i, k = 2;
1106         char cmd;
1107         int deck[53]; /* yamafuda : 0...52 */
1108         int deck_ptr = 0;
1109         int kaeruka[5]; /* 0:kaenai 1:kaeru */
1110
1111         bool done = FALSE;
1112         bool kettei = TRUE;
1113         bool kakikae = TRUE;
1114
1115         reset_deck(deck);
1116
1117         for (i = 0; i < 5; i++)
1118         {
1119                 cards[i] = deck[deck_ptr++];
1120                 kaeruka[i] = 0; /* default:nokosu */
1121         }
1122         
1123 #if 0
1124         /* debug:RF */
1125         cards[0] = 12;
1126         cards[1] = 0;
1127         cards[2] = 9;
1128         cards[3] = 11;
1129         cards[4] = 10;
1130 #endif
1131 #if 0
1132         /* debug:SF */
1133         cards[0] = 3;
1134         cards[1] = 2;
1135         cards[2] = 4;
1136         cards[3] = 6;
1137         cards[4] = 5;
1138 #endif
1139 #if 0
1140         /* debug:Four Cards */
1141         cards[0] = 0;
1142         cards[1] = 0 + 13 * 1;
1143         cards[2] = 0 + 13 * 2;
1144         cards[3] = 0 + 13 * 3;
1145         cards[4] = 51;
1146 #endif
1147 #if 0
1148         /* debug:Straight */
1149         cards[0] = 1;
1150         cards[1] = 0 + 13;
1151         cards[2] = 3;
1152         cards[3] = 2 + 26;
1153         cards[4] = 4;
1154 #endif
1155 #if 0
1156         /* debug */
1157         cards[0] = 52;
1158         cards[1] = 0;
1159         cards[2] = 1;
1160         cards[3] = 2;
1161         cards[4] = 3;
1162 #endif
1163
1164         /* suteruno wo kimeru */
1165 #ifdef JP
1166         prt("»Ä¤¹¥«¡¼¥É¤ò·è¤á¤Æ²¼¤µ¤¤(Êý¸þ¤Ç°ÜÆ°, ¥¹¥Ú¡¼¥¹¤ÇÁªÂò)¡£", 0, 0);
1167 #else
1168         prt("Stay witch? ", 0, 0);
1169 #endif
1170
1171         display_cards();
1172         yaku_check();
1173
1174         while (!done)
1175         {
1176                 if (kakikae) display_kaeruka(k+kettei*5, kaeruka);
1177                 kakikae = FALSE;
1178                 cmd = inkey();
1179                 switch (cmd)
1180                 {
1181                 case '6': case 'l': case 'L': case KTRL('F'):
1182                         if (!kettei) k = (k+1)%5;
1183                         else {k = 0;kettei = FALSE;}
1184                         kakikae = TRUE;
1185                         break;
1186                 case '4': case 'h': case 'H': case KTRL('B'):
1187                         if (!kettei) k = (k+4)%5;
1188                         else {k = 4;kettei = FALSE;}
1189                         kakikae = TRUE;
1190                         break;
1191                 case '2': case 'j': case 'J': case KTRL('N'):
1192                         if (!kettei) {kettei = TRUE;kakikae = TRUE;}
1193                         break;
1194                 case '8': case 'k': case 'K': case KTRL('P'):
1195                         if (kettei) {kettei = FALSE;kakikae = TRUE;}
1196                         break;
1197                 case ' ': case '\r':
1198                         if (kettei) done = TRUE;
1199                         else {kaeruka[k] = !kaeruka[k];kakikae = TRUE;}
1200                         break;
1201                 default:
1202                         break;
1203                 }
1204         }
1205         
1206         prt("",0,0);
1207
1208         for (i = 0; i < 5; i++)
1209                 if (kaeruka[i] == 1) cards[i] = deck[deck_ptr++]; /* soshite toru */
1210
1211         display_cards();
1212         
1213         return yaku_check();
1214 }
1215 #undef SUIT_OF
1216 #undef NUM_OF
1217 #undef IS_JOKER
1218 /* end of poker codes --Koka */
1219
1220 /*
1221  * gamble_comm
1222  */
1223 static bool gamble_comm(int cmd)
1224 {
1225         int i;
1226         int roll1, roll2, roll3, choice, odds, win;
1227         s32b wager;
1228         s32b maxbet;
1229         s32b oldgold;
1230
1231         char out_val[160], tmp_str[80], again;
1232         cptr p;
1233
1234         screen_save();
1235
1236         if (cmd == BACT_GAMBLE_RULES)
1237         {
1238                 /* Peruse the gambling help file */
1239 #ifdef JP
1240 (void)show_file(TRUE, "jgambling.txt", NULL, 0, 0);
1241 #else
1242                 (void)show_file(TRUE, "gambling.txt", NULL, 0, 0);
1243 #endif
1244
1245         }
1246         else
1247         {
1248                 /* No money */
1249                 if (p_ptr->au < 1)
1250                 {
1251 #ifdef JP
1252                         msg_print("¤ª¤¤¡ª¤ª¤Þ¤¨°ìʸ¤Ê¤·¤¸¤ã¤Ê¤¤¤«¡ª¤³¤Ã¤«¤é½Ð¤Æ¤¤¤±¡ª");
1253 #else
1254                         msg_print("Hey! You don't have gold - get out of here!");
1255 #endif
1256
1257                         msg_print(NULL);
1258                         screen_load();
1259                         return FALSE;
1260                 }
1261
1262                 clear_bldg(5, 23);
1263
1264                 maxbet = p_ptr->lev * 200;
1265
1266                 /* We can't bet more than we have */
1267                 maxbet = MIN(maxbet, p_ptr->au);
1268
1269                 /* Get the wager */
1270                 strcpy(out_val, "");
1271 #ifdef JP
1272 sprintf(tmp_str,"ÅÒ¤±¶â (1-%ld)¡©", maxbet);
1273 #else
1274                 sprintf(tmp_str,"Your wager (1-%ld) ? ", maxbet);
1275 #endif
1276
1277
1278                 /*
1279                  * Use get_string() because we may need more than
1280                  * the s16b value returned by get_quantity().
1281                  */
1282                 if (get_string(tmp_str, out_val, 32))
1283                 {
1284                         /* Strip spaces */
1285                         for (p = out_val; *p == ' '; p++);
1286
1287                         /* Get the wager */
1288                         wager = atol(p);
1289
1290                         if (wager > p_ptr->au)
1291                         {
1292 #ifdef JP
1293 msg_print("¤ª¤¤¡ª¶â¤¬Â­¤ê¤Ê¤¤¤¸¤ã¤Ê¤¤¤«¡ª½Ð¤Æ¤¤¤±¡ª");
1294 #else
1295                                 msg_print("Hey! You don't have the gold - get out of here!");
1296 #endif
1297
1298                                 msg_print(NULL);
1299                                 screen_load();
1300                                 return (FALSE);
1301                         }
1302                         else if (wager > maxbet)
1303                         {
1304 #ifdef JP
1305 msg_format("%ld¥´¡¼¥ë¥É¤À¤±¼õ¤±¤è¤¦¡£»Ä¤ê¤Ï¼è¤Ã¤È¤­¤Ê¡£", maxbet);
1306 #else
1307                                 msg_format("I'll take %ld gold of that. Keep the rest.", maxbet);
1308 #endif
1309
1310                                 wager = maxbet;
1311                         }
1312                         else if (wager < 1)
1313                         {
1314 #ifdef JP
1315 msg_print("£Ï£Ë¡¢£±¥´¡¼¥ë¥É¤«¤é¤Ï¤¸¤á¤è¤¦¡£");
1316 #else
1317                                 msg_print("Ok, we'll start with 1 gold.");
1318 #endif
1319
1320
1321                                 wager = 1;
1322                         }
1323                         msg_print(NULL);
1324                         win = FALSE;
1325                         odds = 0;
1326                         oldgold = p_ptr->au;
1327
1328 #ifdef JP
1329 sprintf(tmp_str, "¥²¡¼¥àÁ°¤Î½ê»ý¶â: %9ld", oldgold);
1330 #else
1331                         sprintf(tmp_str, "Gold before game: %9ld", oldgold);
1332 #endif
1333
1334                         prt(tmp_str, 20, 2);
1335
1336 #ifdef JP
1337 sprintf(tmp_str, "¸½ºß¤Î³Ý¤±¶â:     %9ld", wager);
1338 #else
1339                         sprintf(tmp_str, "Current Wager:    %9ld", wager);
1340 #endif
1341
1342                         prt(tmp_str, 21, 2);
1343
1344                         /* Prevent savefile-scumming of the casino */
1345 /*                      Rand_quick = TRUE; */
1346                         Rand_value = time(NULL);
1347
1348                         do
1349                         {
1350 #ifdef JP /* Prevent random seed cracking of the casino */
1351                                 clock_t clk;
1352                                 clk = clock();
1353                                 Rand_value *= clk;
1354 #endif
1355                                 p_ptr->au -= wager;
1356                                 switch (cmd)
1357                                 {
1358                                  case BACT_IN_BETWEEN: /* Game of In-Between */
1359 #ifdef JP
1360 c_put_str(TERM_GREEN, "¥¤¥ó¡¦¥Ó¥È¥¤¡¼¥ó",5,2);
1361 #else
1362                                         c_put_str(TERM_GREEN, "In Between", 5, 2);
1363 #endif
1364
1365                                         odds = 4;
1366                                         win = FALSE;
1367                                         roll1 = randint1(10);
1368                                         roll2 = randint1(10);
1369                                         choice = randint1(10);
1370 #ifdef JP
1371 sprintf(tmp_str, "¹õ¥À¥¤¥¹: %d        ¹õ¥À¥¤¥¹: %d", roll1, roll2);
1372 #else
1373                                         sprintf(tmp_str, "Black die: %d       Black Die: %d", roll1, roll2);
1374 #endif
1375
1376                                         prt(tmp_str, 8, 3);
1377 #ifdef JP
1378 sprintf(tmp_str, "ÀÖ¥À¥¤¥¹: %d", choice);
1379 #else
1380                                         sprintf(tmp_str, "Red die: %d", choice);
1381 #endif
1382
1383                                         prt(tmp_str, 11, 14);
1384                                         if (((choice > roll1) && (choice < roll2)) ||
1385                                                 ((choice < roll1) && (choice > roll2)))
1386                                                 win = TRUE;
1387                                         break;
1388                                 case BACT_CRAPS:  /* Game of Craps */
1389 #ifdef JP
1390 c_put_str(TERM_GREEN, "¥¯¥é¥Ã¥×¥¹", 5, 2);
1391 #else
1392                                         c_put_str(TERM_GREEN, "Craps", 5, 2);
1393 #endif
1394
1395                                         win = 3;
1396                                         odds = 2;
1397                                         roll1 = randint1(6);
1398                                         roll2 = randint1(6);
1399                                         roll3 = roll1 +  roll2;
1400                                         choice = roll3;
1401 #ifdef JP
1402 sprintf(tmp_str, "£±¿¶¤ê¤á: %d %d      Total: %d", roll1, 
1403 #else
1404                                         sprintf(tmp_str, "First roll: %d %d    Total: %d", roll1,
1405 #endif
1406
1407                                                  roll2, roll3);
1408                                         prt(tmp_str, 7, 5);
1409                                         if ((roll3 == 7) || (roll3 == 11))
1410                                                 win = TRUE;
1411                                         else if ((roll3 == 2) || (roll3 == 3) || (roll3 == 12))
1412                                                 win = FALSE;
1413                                         else
1414                                                 do
1415                                                 {
1416 #ifdef JP
1417 msg_print("¤Ê¤Ë¤«¥­¡¼¤ò²¡¤¹¤È¤â¤¦°ì²ó¿¶¤ê¤Þ¤¹¡£");
1418 #else
1419                                                         msg_print("Hit any key to roll again");
1420 #endif
1421
1422                                                         msg_print(NULL);
1423                                                         roll1 = randint1(6);
1424                                                         roll2 = randint1(6);
1425                                                         roll3 = roll1 +  roll2;
1426
1427 #ifdef JP
1428 sprintf(tmp_str, "½ÐÌÜ: %d %d          ¹ç·×:      %d",
1429 #else
1430                                                         sprintf(tmp_str, "Roll result: %d %d   Total:     %d",
1431 #endif
1432
1433                                                                  roll1, roll2, roll3);
1434                                                         prt(tmp_str, 8, 5);
1435                                                         if (roll3 == choice)
1436                                                                 win = TRUE;
1437                                                         else if (roll3 == 7)
1438                                                                 win = FALSE;
1439                                                 } while ((win != TRUE) && (win != FALSE));
1440                                         break;
1441
1442                                 case BACT_SPIN_WHEEL:  /* Spin the Wheel Game */
1443                                         win = FALSE;
1444                                         odds = 9;
1445 #ifdef JP
1446 c_put_str(TERM_GREEN, "¥ë¡¼¥ì¥Ã¥È", 5, 2);
1447 #else
1448                                         c_put_str(TERM_GREEN, "Wheel", 5, 2);
1449 #endif
1450
1451                                         prt("0  1  2  3  4  5  6  7  8  9", 7, 5);
1452                                         prt("--------------------------------", 8, 3);
1453                                         strcpy(out_val, "");
1454 #ifdef JP
1455 get_string("²¿ÈÖ¡© (0-9): ", out_val, 32);
1456 #else
1457                                         get_string("Pick a number (0-9): ", out_val, 32);
1458 #endif
1459
1460                                         for (p = out_val; isspace(*p); p++);
1461                                         choice = atol(p);
1462                                         if (choice < 0)
1463                                         {
1464 #ifdef JP
1465 msg_print("0È֤ˤ·¤È¤¯¤¼¡£");
1466 #else
1467                                                 msg_print("I'll put you down for 0.");
1468 #endif
1469
1470                                                 choice = 0;
1471                                         }
1472                                         else if (choice > 9)
1473                                         {
1474 #ifdef JP
1475 msg_print("£Ï£Ë¡¢9È֤ˤ·¤È¤¯¤¼¡£");
1476 #else
1477                                                 msg_print("Ok, I'll put you down for 9.");
1478 #endif
1479
1480                                                 choice = 9;
1481                                         }
1482                                         msg_print(NULL);
1483                                         roll1 = randint0(10);
1484 #ifdef JP
1485 sprintf(tmp_str, "¥ë¡¼¥ì¥Ã¥È¤Ï²ó¤ê¡¢»ß¤Þ¤Ã¤¿¡£¾¡¼Ô¤Ï %dÈÖ¤À¡£",
1486 #else
1487                                         sprintf(tmp_str, "The wheel spins to a stop and the winner is %d",
1488 #endif
1489
1490                                                 roll1);
1491                                         prt(tmp_str, 13, 3);
1492                                         prt("", 9, 0);
1493                                         prt("*", 9, (3 * roll1 + 5));
1494                                         if (roll1 == choice)
1495                                                 win = TRUE;
1496                                         break;
1497
1498                                 case BACT_DICE_SLOTS: /* The Dice Slots */
1499 #ifdef JP
1500 c_put_str(TERM_GREEN, "¥À¥¤¥¹¡¦¥¹¥í¥Ã¥È", 5, 2);
1501                                         c_put_str(TERM_YELLOW, "¥ì¥â¥ó   ¥ì¥â¥ó            2", 6, 37);
1502                                         c_put_str(TERM_YELLOW, "¥ì¥â¥ó   ¥ì¥â¥ó   ¥ì¥â¥ó   5", 7, 37);
1503                                         c_put_str(TERM_ORANGE, "¥ª¥ì¥ó¥¸ ¥ª¥ì¥ó¥¸ ¥ª¥ì¥ó¥¸ 10", 8, 37);
1504                                         c_put_str(TERM_UMBER, "·õ       ·õ       ·õ       20", 9, 37);
1505                                         c_put_str(TERM_SLATE, "½â       ½â       ½â       50", 10, 37);
1506                                         c_put_str(TERM_VIOLET, "¥×¥é¥à   ¥×¥é¥à   ¥×¥é¥à   200", 11, 37);
1507                                         c_put_str(TERM_RED, "¥Á¥§¥ê¡¼ ¥Á¥§¥ê¡¼ ¥Á¥§¥ê¡¼ 1000", 12, 37);
1508 #else
1509                                         c_put_str(TERM_GREEN, "Dice Slots", 5, 2);
1510 #endif
1511
1512                                         win = FALSE;
1513                                         roll1 = randint1(21);
1514                                         for (i=6;i>0;i--)
1515                                         {
1516                                                 if ((roll1-i) < 1)
1517                                                 {
1518                                                         roll1 = 7-i;
1519                                                         break;
1520                                                 }
1521                                                 roll1 -= i;
1522                                         }
1523                                         roll2 = randint1(21);
1524                                         for (i=6;i>0;i--)
1525                                         {
1526                                                 if ((roll2-i) < 1)
1527                                                 {
1528                                                         roll2 = 7-i;
1529                                                         break;
1530                                                 }
1531                                                 roll2 -= i;
1532                                         }
1533                                         choice = randint1(21);
1534                                         for (i=6;i>0;i--)
1535                                         {
1536                                                 if ((choice-i) < 1)
1537                                                 {
1538                                                         choice = 7-i;
1539                                                         break;
1540                                                 }
1541                                                 choice -= i;
1542                                         }
1543                                         put_str("/--------------------------\\", 7, 2);
1544                                         prt("\\--------------------------/", 17, 2);
1545                                         display_fruit(8,  3, roll1 - 1);
1546                                         display_fruit(8, 12, roll2 - 1);
1547                                         display_fruit(8, 21, choice - 1);
1548                                         if ((roll1 == roll2) && (roll2 == choice))
1549                                         {
1550                                                 win = TRUE;
1551                                                 switch(roll1)
1552                                                 {
1553                                                 case 1:
1554                                                         odds = 5;break;
1555                                                 case 2:
1556                                                         odds = 10;break;
1557                                                 case 3:
1558                                                         odds = 20;break;
1559                                                 case 4:
1560                                                         odds = 50;break;
1561                                                 case 5:
1562                                                         odds = 200;break;
1563                                                 case 6:
1564                                                         odds = 1000;break;
1565                                                 }
1566                                         }
1567                                         else if ((roll1 == 1) && (roll2 == 1))
1568                                         {
1569                                                 win = TRUE;
1570                                                 odds = 2;
1571                                         }
1572                                         break;
1573                                 case BACT_POKER:
1574                                         win = FALSE;
1575                                         odds = do_poker();
1576                                         if (odds) win = TRUE;
1577                                         break;
1578                                 }
1579
1580                                 if (win)
1581                                 {
1582 #ifdef JP
1583 prt("¤¢¤Ê¤¿¤Î¾¡¤Á", 16, 37);
1584 #else
1585                                         prt("YOU WON", 16, 37);
1586 #endif
1587
1588                                         p_ptr->au += odds * wager;
1589 #ifdef JP
1590 sprintf(tmp_str, "ÇÜΨ: %d", odds);
1591 #else
1592                                         sprintf(tmp_str, "Payoff: %d", odds);
1593 #endif
1594
1595                                         prt(tmp_str, 17, 37);
1596                                 }
1597                                 else
1598                                 {
1599 #ifdef JP
1600 prt("¤¢¤Ê¤¿¤ÎÉ餱", 16, 37);
1601 #else
1602                                         prt("You Lost", 16, 37);
1603 #endif
1604
1605                                         prt("", 17, 37);
1606                                 }
1607 #ifdef JP
1608 sprintf(tmp_str, "¸½ºß¤Î½ê»ý¶â:     %9ld", p_ptr->au);
1609 #else
1610                                 sprintf(tmp_str, "Current Gold:     %9ld", p_ptr->au);
1611 #endif
1612
1613                                 prt(tmp_str, 22, 2);
1614 #ifdef JP
1615 prt("¤â¤¦°ìÅÙ(Y/N)¡©", 18, 37);
1616 #else
1617                                 prt("Again(Y/N)?", 18, 37);
1618 #endif
1619
1620                                 move_cursor(18, 52);
1621                                 again = inkey();
1622                                 prt("", 16, 37);
1623                                 prt("", 17, 37);
1624                                 prt("", 18, 37);
1625                                 if (wager > p_ptr->au)
1626                                 {
1627 #ifdef JP
1628 msg_print("¤ª¤¤¡ª¶â¤¬Â­¤ê¤Ê¤¤¤¸¤ã¤Ê¤¤¤«¡ª¤³¤³¤«¤é½Ð¤Æ¹Ô¤±¡ª");
1629 #else
1630                                         msg_print("Hey! You don't have the gold - get out of here!");
1631 #endif
1632
1633                                         msg_print(NULL);
1634
1635                                         /* Get out here */
1636                                         break;
1637                                 }
1638                         } while ((again == 'y') || (again == 'Y'));
1639
1640                         /* Switch back to complex RNG */
1641                         Rand_quick = FALSE;
1642
1643                         prt("", 18, 37);
1644                         if (p_ptr->au >= oldgold)
1645                         {
1646 #ifdef JP
1647 msg_print("¡Öº£²ó¤ÏÌÙ¤±¤¿¤Ê¡ª¤Ç¤â¼¡¤Ï¤³¤Ã¤Á¤¬¾¡¤Ã¤Æ¤ä¤ë¤«¤é¤Ê¡¢ÀäÂФˡª¡×");
1648 #else
1649                                 msg_print("You came out a winner! We'll win next time, I'm sure.");
1650 #endif
1651                                 chg_virtue(V_CHANCE, 3);
1652                         }
1653                         else
1654                         {
1655 #ifdef JP
1656 msg_print("¡Ö¶â¤ò¥¹¥Ã¤Æ¤·¤Þ¤Ã¤¿¤Ê¡¢¤ï¤Ï¤Ï¡ª¤¦¤Á¤Ëµ¢¤Ã¤¿Êý¤¬¤¤¤¤¤¼¡£¡×");
1657 #else
1658                                 msg_print("You lost gold! Haha, better head home.");
1659 #endif
1660                                 chg_virtue(V_CHANCE, -3);
1661                         }
1662                 }
1663                 msg_print(NULL);
1664         }
1665         screen_load();
1666         return (TRUE);
1667 }
1668
1669 static bool vault_aux_battle(int r_idx)
1670 {
1671         int i;
1672         int dam = 0;
1673
1674         monster_race *r_ptr = &r_info[r_idx];
1675
1676         /* Decline town monsters */
1677 /*      if (!monster_dungeon(r_idx)) return FALSE; */
1678
1679         /* Decline unique monsters */
1680 /*      if (r_ptr->flags1 & (RF1_UNIQUE)) return (FALSE); */
1681 /*      if (r_ptr->flags7 & (RF7_UNIQUE_7)) return (FALSE); */
1682
1683         if (r_ptr->flags1 & (RF1_NEVER_MOVE)) return (FALSE);
1684         if (r_ptr->flags2 & (RF2_MULTIPLY)) return (FALSE);
1685         if (r_ptr->flags2 & (RF2_QUANTUM)) return (FALSE);
1686         if (r_ptr->flags7 & (RF7_AQUATIC)) return (FALSE);
1687         if (r_ptr->flags7 & (RF7_CHAMELEON)) return (FALSE);
1688
1689         for (i = 0; i < 4; i++)
1690         {
1691                 if (r_ptr->blow[i].method == RBM_EXPLODE) return (FALSE);
1692                 if (r_ptr->blow[i].effect != RBE_DR_MANA) dam += r_ptr->blow[i].d_dice;
1693         }
1694         if (!dam && !(r_ptr->flags4 & (RF4_BOLT_MASK | RF4_BEAM_MASK | RF4_BALL_MASK | RF4_BREATH_MASK)) && !(r_ptr->flags5 & (RF5_BOLT_MASK | RF5_BEAM_MASK | RF5_BALL_MASK | RF5_BREATH_MASK)) && !(r_ptr->flags6 & (RF6_BOLT_MASK | RF6_BEAM_MASK | RF6_BALL_MASK | RF6_BREATH_MASK))) return (FALSE);
1695
1696         /* Okay */
1697         return (TRUE);
1698 }
1699
1700 void battle_monsters(void)
1701 {
1702         int total, i;
1703         int max_dl = 0;
1704         int mon_level;
1705         int power[4];
1706         bool tekitou;
1707         bool old_inside_battle = p_ptr->inside_battle;
1708
1709         for (i = 0; i < max_d_idx; i++)
1710                 if (max_dl < max_dlv[i]) max_dl = max_dlv[i];
1711
1712         mon_level = randint1(MIN(max_dl, 122))+5;
1713         if (randint0(100) < 60)
1714         {
1715                 i = randint1(MIN(max_dl, 122))+5;
1716                 mon_level = MAX(i, mon_level);
1717         }
1718         if (randint0(100) < 30)
1719         {
1720                 i = randint1(MIN(max_dl, 122))+5;
1721                 mon_level = MAX(i, mon_level);
1722         }
1723
1724         while (1)
1725         {
1726                 total = 0;
1727                 tekitou = FALSE;
1728                 for(i=0;i<4;i++)
1729                 {
1730                         int r_idx, j;
1731                         while (1)
1732                         {
1733                                 get_mon_num_prep(vault_aux_battle, NULL);
1734                                 p_ptr->inside_battle = TRUE;
1735                                 r_idx = get_mon_num(mon_level);
1736                                 p_ptr->inside_battle = old_inside_battle;
1737                                 if (!r_idx) continue;
1738
1739                                 if ((r_info[r_idx].flags1 & RF1_UNIQUE) || (r_info[r_idx].flags7 & RF7_UNIQUE2))
1740                                 {
1741                                         if ((r_info[r_idx].level + 10) > mon_level) continue;
1742                                 }
1743
1744                                 for (j = 0; j < i; j++)
1745                                         if(r_idx == battle_mon[j]) break;
1746                                 if (j<i) continue;
1747
1748                                 break;
1749                         }
1750                         battle_mon[i] = r_idx;
1751                         if (r_info[r_idx].level < 45) tekitou = TRUE;
1752                 }
1753
1754                 for (i=0;i<4;i++)
1755                 {
1756                         monster_race *r_ptr = &r_info[battle_mon[i]];
1757                         int num_taisei = count_bits(r_ptr->flags3 & (RF3_IM_ACID | RF3_IM_ELEC | RF3_IM_FIRE | RF3_IM_COLD | RF3_IM_POIS));
1758
1759                         if (r_ptr->flags1 & RF1_FORCE_MAXHP)
1760                                 power[i] = r_ptr->hdice * r_ptr->hside * 2;
1761                         else
1762                                 power[i] = r_ptr->hdice * (r_ptr->hside + 1);
1763                         power[i] = power[i] * (100 + r_ptr->level) / 100;
1764                         if (r_ptr->speed > 110)
1765                                 power[i] = power[i] * (r_ptr->speed * 2 - 110) / 100;
1766                         if (r_ptr->speed < 110)
1767                                 power[i] = power[i] * (r_ptr->speed - 20) / 100;
1768                         if (num_taisei > 2)
1769                                 power[i] = power[i] * (num_taisei*2+5) / 10;
1770                         else if (r_ptr->flags6 & RF6_INVULNER)
1771                                 power[i] = power[i] * 4 / 3;
1772                         else if (r_ptr->flags6 & RF6_HEAL)
1773                                 power[i] = power[i] * 4 / 3;
1774                         else if (r_ptr->flags5 & RF5_DRAIN_MANA)
1775                                 power[i] = power[i] * 11 / 10;
1776                         if (r_ptr->flags1 & RF1_RAND_25)
1777                                 power[i] = power[i] * 9 / 10;
1778                         if (r_ptr->flags1 & RF1_RAND_50)
1779                                 power[i] = power[i] * 9 / 10;
1780
1781                         switch (battle_mon[i])
1782                         {
1783                                 case MON_GREEN_G:
1784                                 case MON_THAT_BAT:
1785                                 case MON_GHOST_Q:
1786                                         power[i] /= 4;
1787                                         break;
1788                                 case MON_LOST_SOUL:
1789                                 case MON_GHOST:
1790                                         power[i] /= 2;
1791                                         break;
1792                                 case MON_UND_BEHOLDER:
1793                                 case MON_SANTACLAUS:
1794                                 case MON_ULT_BEHOLDER:
1795                                 case MON_UNGOLIANT:
1796                                 case MON_ATLACH_NACHA:
1797                                 case MON_Y_GOLONAC:
1798                                         power[i] = power[i] * 3 / 5;
1799                                         break;
1800                                 case MON_ROBIN_HOOD:
1801                                 case MON_RICH:
1802                                 case MON_LICH:
1803                                 case MON_COLOSSUS:
1804                                 case MON_CRYPT_THING:
1805                                 case MON_MASTER_LICH:
1806                                 case MON_DREADMASTER:
1807                                 case MON_DEMILICH:
1808                                 case MON_SHADOWLORD:
1809                                 case MON_ARCHLICH:
1810                                 case MON_BLEYS:
1811                                 case MON_CAIN:
1812                                 case MON_JULIAN:
1813                                 case MON_VENOM_WYRM:
1814                                 case MON_MASTER_MYS:
1815                                 case MON_G_MASTER_MYS:
1816                                         power[i] = power[i] * 3 / 4;
1817                                         break;
1818                                 case MON_VORPAL_BUNNY:
1819                                 case MON_SHAGRAT:
1820                                 case MON_GORBAG:
1821                                 case MON_LOG_MASTER:
1822                                 case MON_JURT:
1823                                 case MON_GRAV_HOUND:
1824                                 case MON_SHIM_VOR:
1825                                 case MON_JUBJUB:
1826                                 case MON_CLUB_DEMON:
1827                                 case MON_LLOIGOR:
1828                                 case MON_NIGHTCRAWLER:
1829                                 case MON_NIGHTWALKER:
1830                                 case MON_RAPHAEL:
1831                                 case MON_SHAMBLER:
1832                                 case MON_SKY_DRAKE:
1833                                 case MON_GERARD:
1834                                 case MON_G_CTHULHU:
1835                                 case MON_SPECT_WYRM:
1836                                 case MON_BAZOOKER:
1837                                 case MON_GCWADL:
1838                                 case MON_KIRIN:
1839                                 case MON_HOUOU:
1840                                         power[i] = power[i] * 4 / 3;
1841                                         break;
1842                                 case MON_UMBER_HULK:
1843                                 case MON_FIRE_VOR:
1844                                 case MON_WATER_VOR:
1845                                 case MON_COLD_VOR:
1846                                 case MON_ENERGY_VOR:
1847                                 case MON_BARNEY:
1848                                 case MON_REVENANT:
1849                                 case MON_NEXUS_VOR:
1850                                 case MON_PLASMA_VOR:
1851                                 case MON_TIME_VOR:
1852                                 case MON_MANDOR:
1853                                 case MON_KAVLAX:
1854                                 case MON_RINALDO:
1855                                 case MON_STORMBRINGER:
1856                                 case MON_TIME_HOUND:
1857                                 case MON_PLASMA_HOUND:
1858                                 case MON_TINDALOS:
1859                                 case MON_CHAOS_VOR:
1860                                 case MON_AETHER_VOR:
1861                                 case MON_AETHER_HOUND:
1862                                 case MON_CANTORAS:
1863                                 case MON_GODZILLA:
1864                                 case MON_TARRASQUE:
1865                                 case MON_DESTROYER:
1866                                 case MON_MORGOTH:
1867                                 case MON_SERPENT:
1868                                 case MON_OROCHI:
1869                                 case MON_D_ELF_SHADE:
1870                                 case MON_MANA_HOUND:
1871                                 case MON_SHARD_VOR:
1872                                 case MON_BANORLUPART:
1873                                 case MON_BOTEI:
1874                                 case MON_JAIAN:
1875                                 case MON_BAHAMUT:
1876                                 case MON_WAHHA:
1877                                         power[i] = power[i] * 3 / 2;
1878                                         break;
1879                                 case MON_ROLENTO:
1880                                 case MON_CYBER:
1881                                 case MON_CYBER_KING:
1882                                 case MON_UNICORN_ORD:
1883                                         power[i] = power[i] * 5 / 3;
1884                                         break;
1885                                 case MON_ARCH_VILE:
1886                                 case MON_PHANTOM_B:
1887                                 case MON_WYRM_POWER:
1888                                         power[i] *= 2;
1889                                         break;
1890                                 case MON_NODENS:
1891                                 case MON_CULVERIN:
1892                                         power[i] *= 3;
1893                                         break;
1894                                 case MON_ECHIZEN:
1895                                         power[i] *= 9;
1896                                         break;
1897                                 case MON_HAGURE:
1898                                         power[i] *= 100000;
1899                                         break;
1900                                 default:
1901                                         break;
1902                         }
1903                         total += power[i];
1904                 }
1905                 for (i=0;i<4;i++)
1906                 {
1907                         power[i] = total*60/power[i];
1908                         if (tekitou && ((power[i] < 160) || power[i] > 1500)) break;
1909                         if ((power[i] < 160) && randint0(20)) break;
1910                         if (power[i] < 101) power[i] = 100 + randint1(5);
1911                         mon_odds[i] = power[i];
1912                 }
1913                 if (i == 4) break;
1914         }
1915 }
1916
1917 static bool kakutoujou(void)
1918 {
1919         s32b maxbet;
1920         s32b wager;
1921         char out_val[160], tmp_str[80];
1922         cptr p;
1923
1924         if ((turn - old_battle) > TURNS_PER_TICK*250)
1925         {
1926                 battle_monsters();
1927                 old_battle = turn;
1928         }
1929
1930         screen_save();
1931
1932         /* No money */
1933         if (p_ptr->au < 1)
1934         {
1935 #ifdef JP
1936                 msg_print("¤ª¤¤¡ª¤ª¤Þ¤¨°ìʸ¤Ê¤·¤¸¤ã¤Ê¤¤¤«¡ª¤³¤Ã¤«¤é½Ð¤Æ¤¤¤±¡ª");
1937 #else
1938                 msg_print("Hey! You don't have gold - get out of here!");
1939 #endif
1940
1941                 msg_print(NULL);
1942                 screen_load();
1943                 return FALSE;
1944         }
1945         else
1946         {
1947                 int i;
1948
1949                 clear_bldg(4, 10);
1950
1951 #ifdef JP
1952                 prt("¥â¥ó¥¹¥¿¡¼                                                     ÇÜΨ", 4, 4);
1953 #else
1954                 prt("Monsters                                                       Odds", 4, 4);
1955 #endif
1956                 for (i=0;i<4;i++)
1957                 {
1958                         char buf[80];
1959                         monster_race *r_ptr = &r_info[battle_mon[i]];
1960
1961 #ifdef JP
1962                         sprintf(buf,"%d) %-58s  %4ld.%02ldÇÜ", i+1, format("%s%s",r_name + r_ptr->name, (r_ptr->flags1 & RF1_UNIQUE) ? "¤â¤É¤­" : "      "), mon_odds[i]/100, mon_odds[i]%100);
1963 #else
1964                         sprintf(buf,"%d) %-58s  %4ld.%02ld", i+1, format("%s%s", (r_ptr->flags1 & RF1_UNIQUE) ? "Fake " : "", r_name + r_ptr->name), mon_odds[i]/100, mon_odds[i]%100);
1965 #endif
1966                         prt(buf, 5+i, 1);
1967                 }
1968
1969 #ifdef JP
1970                 prt("¤É¤ì¤ËÅÒ¤±¤Þ¤¹¤«:", 0, 0);
1971 #else
1972                 prt("Which monster: ", 0, 0);
1973 #endif
1974                 while(1)
1975                 {
1976                         i = inkey();
1977
1978                         if (i == ESCAPE)
1979                         {
1980                                 screen_load();
1981                                 return FALSE;
1982                         }
1983                         if (i >= '1' && i <= '4')
1984                         {
1985                                 sel_monster = i-'1';
1986                                 battle_odds = mon_odds[sel_monster];
1987                                 break;
1988                         }
1989                         else bell();
1990                 }
1991
1992                 clear_bldg(4,4);
1993                 for (i=0;i<4;i++)
1994                         if (i !=sel_monster) clear_bldg(i+5,i+5);
1995
1996                 maxbet = p_ptr->lev * 200;
1997
1998                 /* We can't bet more than we have */
1999                 maxbet = MIN(maxbet, p_ptr->au);
2000
2001                 /* Get the wager */
2002                 strcpy(out_val, "");
2003 #ifdef JP
2004 sprintf(tmp_str,"ÅÒ¤±¶â (1-%ld)¡©", maxbet);
2005 #else
2006                 sprintf(tmp_str,"Your wager (1-%ld) ? ", maxbet);
2007 #endif
2008
2009
2010                 /*
2011                  * Use get_string() because we may need more than
2012                  * the s16b value returned by get_quantity().
2013                  */
2014                 if (get_string(tmp_str, out_val, 32))
2015                 {
2016                         /* Strip spaces */
2017                         for (p = out_val; *p == ' '; p++);
2018
2019                         /* Get the wager */
2020                         wager = atol(p);
2021
2022                         if (wager > p_ptr->au)
2023                         {
2024 #ifdef JP
2025 msg_print("¤ª¤¤¡ª¶â¤¬Â­¤ê¤Ê¤¤¤¸¤ã¤Ê¤¤¤«¡ª½Ð¤Æ¤¤¤±¡ª");
2026 #else
2027                                 msg_print("Hey! You don't have the gold - get out of here!");
2028 #endif
2029
2030                                 msg_print(NULL);
2031                                 screen_load();
2032                                 return (FALSE);
2033                         }
2034                         else if (wager > maxbet)
2035                         {
2036 #ifdef JP
2037 msg_format("%ld¥´¡¼¥ë¥É¤À¤±¼õ¤±¤è¤¦¡£»Ä¤ê¤Ï¼è¤Ã¤È¤­¤Ê¡£", maxbet);
2038 #else
2039                                 msg_format("I'll take %ld gold of that. Keep the rest.", maxbet);
2040 #endif
2041
2042                                 wager = maxbet;
2043                         }
2044                         else if (wager < 1)
2045                         {
2046 #ifdef JP
2047 msg_print("£Ï£Ë¡¢£±¥´¡¼¥ë¥É¤Ç¤¤¤³¤¦¡£");
2048 #else
2049                                 msg_print("Ok, we'll start with 1 gold.");
2050 #endif
2051
2052
2053                                 wager = 1;
2054                         }
2055                         msg_print(NULL);
2056                         battle_odds = MAX(wager+1, wager * battle_odds / 100);
2057                         kakekin = wager;
2058                         p_ptr->au -= wager;
2059                         p_ptr->leftbldg = TRUE;
2060                         p_ptr->inside_battle = TRUE;
2061                         reset_tim_flags();
2062                         p_ptr->leaving = TRUE;
2063                         leave_bldg = TRUE;
2064                         screen_load();
2065
2066                         return (TRUE);
2067                 }
2068         }
2069         screen_load();
2070
2071         return (FALSE);
2072 }
2073
2074 static void today_target(void)
2075 {
2076         char buf[160];
2077         monster_race *r_ptr = &r_info[today_mon];
2078
2079         clear_bldg(4,18);
2080 #ifdef JP
2081 c_put_str(TERM_YELLOW, "ËÜÆü¤Î¾Þ¶â¼ó", 5, 10);
2082 #else
2083         prt("Wanted monster that changes from day to day", 5, 10);
2084 #endif
2085 #ifdef JP
2086         sprintf(buf,"¥¿¡¼¥²¥Ã¥È¡§ %s",r_name + r_ptr->name);
2087 #else
2088         sprintf(buf,"target: %s",r_name + r_ptr->name);
2089 #endif
2090         c_put_str(TERM_YELLOW, buf, 6, 10);
2091 #ifdef JP
2092         sprintf(buf,"»àÂΠ---- $%d",r_ptr->level * 50 + 100);
2093 #else
2094         sprintf(buf,"corpse   ---- $%d",r_ptr->level * 50 + 100);
2095 #endif
2096         prt(buf, 8, 10);
2097 #ifdef JP
2098         sprintf(buf,"¹ü   ---- $%d",r_ptr->level * 30 + 60);
2099 #else
2100         sprintf(buf,"skeleton ---- $%d",r_ptr->level * 30 + 60);
2101 #endif
2102         prt(buf, 9, 10);
2103         p_ptr->today_mon = today_mon;
2104 }
2105
2106 static void tsuchinoko(void)
2107 {
2108         clear_bldg(4,18);
2109 #ifdef JP
2110 c_put_str(TERM_YELLOW, "°ì³ÍÀé¶â¤ÎÂç¥Á¥ã¥ó¥¹¡ª¡ª¡ª", 5, 10);
2111 c_put_str(TERM_YELLOW, "¥¿¡¼¥²¥Ã¥È¡§¸¸¤ÎÄÁ½Ã¡Ö¥Ä¥Á¥Î¥³¡×", 6, 10);
2112 c_put_str(TERM_WHITE, "À¸¤±Êá¤ê ---- $1,000,000", 8, 10);
2113 c_put_str(TERM_WHITE, "»àÂΠ    ----   $200,000", 9, 10);
2114 c_put_str(TERM_WHITE, "¹ü       ----   $100,000", 10, 10);
2115 #else
2116 c_put_str(TERM_YELLOW, "Big chance to quick money!!!", 5, 10);
2117 c_put_str(TERM_YELLOW, "target: the rarest animal 'Tsuchinoko'", 6, 10);
2118 c_put_str(TERM_WHITE, "catch alive ---- $1,000,000", 8, 10);
2119 c_put_str(TERM_WHITE, "corpse      ----   $200,000", 9, 10);
2120 c_put_str(TERM_WHITE, "bones       ----   $100,000", 10, 10);
2121 #endif
2122 }
2123
2124 static void shoukinkubi(void)
2125 {
2126         int i;
2127         int y = 0;
2128
2129         clear_bldg(4,18);
2130
2131 #ifdef JP
2132         prt("»àÂΤò»ý¤Áµ¢¤ë¤È¾Þ¶â¤òº¹¤·¾å¤²¤Þ¤¹¡£",4 ,10);
2133 c_put_str(TERM_YELLOW, "¸½ºß¤Î¾Þ¶â¼ó", 6, 10);
2134 #else
2135         prt("Offer a prize when you bring a wanted monster's corpse",4 ,10);
2136 c_put_str(TERM_YELLOW, "Wanted monsters", 6, 10);
2137 #endif
2138
2139         for (i = 0; i < MAX_KUBI; i++)
2140         {
2141                 char buf[160];
2142                 monster_race *r_ptr = &r_info[(kubi_r_idx[i] > 10000 ? kubi_r_idx[i] - 10000 : kubi_r_idx[i])];
2143
2144                 sprintf(buf,"%-40s ---- ",r_name + r_ptr->name);
2145                 prt(buf, y+7, 10);
2146                 if (kubi_r_idx[i] > 10000)
2147 #ifdef JP
2148                         c_put_str(TERM_RED,"ºÑ", y+7, 56);
2149 #else
2150                         c_put_str(TERM_RED,"done", y+7, 56);
2151 #endif
2152                 else
2153                 {
2154                         sprintf(buf,"$%d", 300 * (r_ptr->level + 1));
2155                         prt(buf, y+7, 56);
2156                 }
2157                 y = (y+1) % 10;
2158                 if (!y && (i < MAX_KUBI -1))
2159                 {
2160 #ifdef JP
2161                         prt("²¿¤«¥­¡¼¤ò²¡¤·¤Æ¤¯¤À¤µ¤¤", 0, 0);
2162 #else
2163                         prt("Hit any key.", 0, 0);
2164 #endif
2165                         (void)inkey();
2166                         prt("", 0, 0);
2167                         clear_bldg(7,18);
2168                 }
2169         }
2170 }
2171
2172 static bool kankin(void)
2173 {
2174         int i, j;
2175         bool change = FALSE;
2176         char o_name[MAX_NLEN];
2177         object_type *o_ptr;
2178
2179         for (i = 0;i <= INVEN_LARM; i++)
2180         {
2181                 o_ptr = &inventory[i];
2182                 if ((o_ptr->tval == TV_CAPTURE) && (o_ptr->pval == MON_TSUCHINOKO))
2183                 {
2184                         char buf[MAX_NLEN+20];
2185                         object_desc(o_name, o_ptr, TRUE, 3);
2186 #ifdef JP
2187                         sprintf(buf, "%s ¤ò´¹¶â¤·¤Þ¤¹¤«¡©",o_name);
2188 #else
2189                         sprintf(buf, "Convert %s into money? ",o_name);
2190 #endif
2191                         if (get_check(buf))
2192                         {
2193 #ifdef JP
2194                                 msg_format("¾Þ¶â %ld¡ð¤ò¼ê¤ËÆþ¤ì¤¿¡£", 1000000L * o_ptr->number);
2195 #else
2196                                 msg_format("You get %ldgp.", 1000000L * o_ptr->number);
2197 #endif
2198                                 p_ptr->au += 1000000L * o_ptr->number;
2199                                 p_ptr->redraw |= (PR_GOLD);
2200                                 inven_item_increase(i, -o_ptr->number);
2201                                 inven_item_describe(i);
2202                                 inven_item_optimize(i);
2203                         }
2204                         change = TRUE;
2205                 }
2206         }
2207         for (i = 0;i <= INVEN_LARM; i++)
2208         {
2209                 o_ptr = &inventory[i];
2210                 if ((o_ptr->tval == TV_CORPSE) && (o_ptr->sval == SV_CORPSE) && (o_ptr->pval == MON_TSUCHINOKO))
2211                 {
2212                         char buf[MAX_NLEN+20];
2213                         object_desc(o_name, o_ptr, TRUE, 3);
2214 #ifdef JP
2215                         sprintf(buf, "%s ¤ò´¹¶â¤·¤Þ¤¹¤«¡©",o_name);
2216 #else
2217                         sprintf(buf, "Convert %s into money? ",o_name);
2218 #endif
2219                         if (get_check(buf))
2220                         {
2221 #ifdef JP
2222                                 msg_format("¾Þ¶â %ld¡ð¤ò¼ê¤ËÆþ¤ì¤¿¡£", 200000L * o_ptr->number);
2223 #else
2224                                 msg_format("You get %ldgp.", 200000L * o_ptr->number);
2225 #endif
2226                                 p_ptr->au += 200000L * o_ptr->number;
2227                                 p_ptr->redraw |= (PR_GOLD);
2228                                 inven_item_increase(i, -o_ptr->number);
2229                                 inven_item_describe(i);
2230                                 inven_item_optimize(i);
2231                         }
2232                         change = TRUE;
2233                 }
2234         }
2235         for (i = 0;i <= INVEN_LARM; i++)
2236         {
2237                 o_ptr = &inventory[i];
2238                 if ((o_ptr->tval == TV_CORPSE) && (o_ptr->sval == SV_SKELETON) && (o_ptr->pval == MON_TSUCHINOKO))
2239                 {
2240                         char buf[MAX_NLEN+20];
2241                         object_desc(o_name, o_ptr, TRUE, 3);
2242 #ifdef JP
2243                         sprintf(buf, "%s ¤ò´¹¶â¤·¤Þ¤¹¤«¡©",o_name);
2244 #else
2245                         sprintf(buf, "Convert %s into money? ",o_name);
2246 #endif
2247                         if (get_check(buf))
2248                         {
2249 #ifdef JP
2250                                 msg_format("¾Þ¶â %ld¡ð¤ò¼ê¤ËÆþ¤ì¤¿¡£", 100000L * o_ptr->number);
2251 #else
2252                                 msg_format("You get %ldgp.", 100000L * o_ptr->number);
2253 #endif
2254                                 p_ptr->au += 100000L * o_ptr->number;
2255                                 p_ptr->redraw |= (PR_GOLD);
2256                                 inven_item_increase(i, -o_ptr->number);
2257                                 inven_item_describe(i);
2258                                 inven_item_optimize(i);
2259                         }
2260                         change = TRUE;
2261                 }
2262         }
2263
2264         for (i = 0;i <= INVEN_LARM; i++)
2265         {
2266                 o_ptr = &inventory[i];
2267                 if ((o_ptr->tval == TV_CORPSE) && (o_ptr->sval == SV_CORPSE) && (o_ptr->pval == today_mon))
2268                 {
2269                         char buf[MAX_NLEN+20];
2270                         object_desc(o_name, o_ptr, TRUE, 3);
2271 #ifdef JP
2272                         sprintf(buf, "%s ¤ò´¹¶â¤·¤Þ¤¹¤«¡©",o_name);
2273 #else
2274                         sprintf(buf, "Convert %s into money? ",o_name);
2275 #endif
2276                         if (get_check(buf))
2277                         {
2278 #ifdef JP
2279                                 msg_format("¾Þ¶â %ld¡ð¤ò¼ê¤ËÆþ¤ì¤¿¡£", (r_info[today_mon].level * 50 + 100) * o_ptr->number);
2280 #else
2281                                 msg_format("You get %ldgp.", (r_info[today_mon].level * 50 + 100) * o_ptr->number);
2282 #endif
2283                                 p_ptr->au += (r_info[today_mon].level * 50 + 100) * o_ptr->number;
2284                                 p_ptr->redraw |= (PR_GOLD);
2285                                 inven_item_increase(i, -o_ptr->number);
2286                                 inven_item_describe(i);
2287                                 inven_item_optimize(i);
2288                         }
2289                         change = TRUE;
2290                 }
2291         }
2292         for (i = 0;i <= INVEN_LARM; i++)
2293         {
2294                 o_ptr = &inventory[i];
2295                 if ((o_ptr->tval == TV_CORPSE) && (o_ptr->sval == SV_SKELETON) && (o_ptr->pval == today_mon))
2296                 {
2297                         char buf[MAX_NLEN+20];
2298                         object_desc(o_name, o_ptr, TRUE, 3);
2299 #ifdef JP
2300                         sprintf(buf, "%s ¤ò´¹¶â¤·¤Þ¤¹¤«¡©",o_name);
2301 #else
2302                         sprintf(buf, "Convert %s into money? ",o_name);
2303 #endif
2304                         if (get_check(buf))
2305                         {
2306 #ifdef JP
2307                                 msg_format("¾Þ¶â %ld¡ð¤ò¼ê¤ËÆþ¤ì¤¿¡£", (r_info[today_mon].level * 30 + 60) * o_ptr->number);
2308 #else
2309                                 msg_format("You get %ldgp.", (r_info[today_mon].level * 30 + 60) * o_ptr->number);
2310 #endif
2311                                 p_ptr->au += (r_info[today_mon].level * 30 + 60) * o_ptr->number;
2312                                 p_ptr->redraw |= (PR_GOLD);
2313                                 inven_item_increase(i, -o_ptr->number);
2314                                 inven_item_describe(i);
2315                                 inven_item_optimize(i);
2316                         }
2317                         change = TRUE;
2318                 }
2319         }
2320
2321         for (j = 0; j < MAX_KUBI; j++)
2322         {
2323                 for (i = 0;i <= INVEN_LARM; i++)
2324                 {
2325                         o_ptr = &inventory[i];
2326                         if ((o_ptr->tval == TV_CORPSE) && (o_ptr->sval == SV_CORPSE) && (o_ptr->pval == kubi_r_idx[j]))
2327                         {
2328                                 char buf[MAX_NLEN+20];
2329                                 object_desc(o_name, o_ptr, TRUE, 3);
2330 #ifdef JP
2331                                 sprintf(buf, "%s ¤ò´¹¶â¤·¤Þ¤¹¤«¡©",o_name);
2332 #else
2333                                 sprintf(buf, "Convert %s into money? ",o_name);
2334 #endif
2335                                 if (get_check(buf))
2336                                 {
2337 #ifdef JP
2338                                         msg_format("¾Þ¶â %ld¡ð¤ò¼ê¤ËÆþ¤ì¤¿¡£", (r_info[kubi_r_idx[j]].level + 1) * 300 * o_ptr->number);
2339 #else
2340                                         msg_format("You get %ldgp.", (r_info[kubi_r_idx[j]].level + 1) * 300 * o_ptr->number);
2341 #endif
2342                                         p_ptr->au += (r_info[kubi_r_idx[j]].level+1) * 300 * o_ptr->number;
2343                                         p_ptr->redraw |= (PR_GOLD);
2344                                         inven_item_increase(i, -o_ptr->number);
2345                                         inven_item_describe(i);
2346                                         inven_item_optimize(i);
2347                                         chg_virtue(V_JUSTICE, 5);
2348                                         kubi_r_idx[j] += 10000;
2349                                 }
2350                                 change = TRUE;
2351                         }
2352                 }
2353         }
2354
2355         if (!change)
2356         {
2357 #ifdef JP
2358                 msg_print("¾Þ¶â¤òÆÀ¤é¤ì¤½¤¦¤Ê¤â¤Î¤Ï»ý¤Ã¤Æ¤¤¤Ê¤«¤Ã¤¿¡£");
2359 #else
2360                 msg_print("You have nothing.");
2361 #endif
2362                 msg_print(NULL);
2363                 return FALSE;
2364         }
2365         return TRUE;
2366 }
2367
2368 bool get_nightmare(int r_idx)
2369 {
2370         monster_race *r_ptr = &r_info[r_idx];
2371
2372         /* Require eldritch horrors */
2373         if (!(r_ptr->flags2 & (RF2_ELDRITCH_HORROR))) return (FALSE);
2374
2375         /* Require high level */
2376         if (r_ptr->level <= p_ptr->lev) return (FALSE);
2377
2378         /* Accept this monster */
2379         return (TRUE);
2380 }
2381
2382
2383 void have_nightmare(int r_idx)
2384 {
2385         bool happened = FALSE;
2386
2387         int power = 100;
2388
2389         monster_race *r_ptr = &r_info[r_idx];
2390
2391         char m_name[80];
2392         cptr desc = r_name + r_ptr->name;
2393
2394
2395         power = r_ptr->level + 10;
2396
2397 #ifdef JP
2398         if (0)
2399 #else
2400         if (!(r_ptr->flags1 & RF1_UNIQUE))
2401 #endif
2402
2403         {
2404                 /* Describe it */
2405                 sprintf(m_name, "%s %s", (is_a_vowel(desc[0]) ? "an" : "a"), desc);
2406
2407                 if (r_ptr->flags1 & RF1_FRIENDS)
2408                 {
2409                         power /= 2;
2410                 }
2411         }
2412         else
2413         {
2414                 /* Describe it */
2415                 sprintf(m_name, "%s", desc);
2416
2417                 power *= 2;
2418         }
2419
2420         if (saving_throw(p_ptr->skill_sav * 100 / power))
2421         {
2422 #ifdef JP
2423         msg_format("Ì´¤ÎÃæ¤Ç%s¤ËÄɤ¤¤«¤±¤é¤ì¤¿¡£", m_name);
2424 #else
2425         msg_format("%^s chases you through your dreams.", m_name);
2426 #endif
2427
2428
2429                 /* Safe */
2430                 return;
2431         }
2432
2433         if (p_ptr->image)
2434         {
2435                 /* Something silly happens... */
2436 #ifdef JP
2437 msg_format("%s%s¤Î´é¤ò¸«¤Æ¤·¤Þ¤Ã¤¿¡ª",
2438 #else
2439                 msg_format("You behold the %s visage of %s!",
2440 #endif
2441
2442                                           funny_desc[randint0(MAX_SAN_FUNNY)], m_name);
2443
2444                 if (one_in_(3))
2445                 {
2446                         msg_print(funny_comments[randint0(MAX_SAN_COMMENT)]);
2447                         p_ptr->image = p_ptr->image + randint1(r_ptr->level);
2448                 }
2449
2450                 /* Never mind; we can't see it clearly enough */
2451                 return;
2452         }
2453
2454         /* Something frightening happens... */
2455 #ifdef JP
2456 msg_format("%s%s¤Î´é¤ò¸«¤Æ¤·¤Þ¤Ã¤¿¡ª",
2457 #else
2458         msg_format("You behold the %s visage of %s!",
2459 #endif
2460
2461                                   horror_desc[randint0(MAX_SAN_HORROR)], desc);
2462
2463         r_ptr->r_flags2 |= RF2_ELDRITCH_HORROR;
2464
2465         switch(p_ptr->prace)
2466         {
2467                 /* Imps may make a saving throw */
2468                 case RACE_IMP:
2469                 case RACE_DEMON:
2470                 {
2471                         if (saving_throw(20 + p_ptr->lev)) return;
2472                 }
2473                 /* Undead may make a saving throw */
2474                 case RACE_SKELETON:
2475                 case RACE_ZOMBIE:
2476                 case RACE_SPECTRE:
2477                 case RACE_VAMPIRE:
2478                 {
2479                         if (saving_throw(10 + p_ptr->lev)) return;
2480                 }
2481         }
2482
2483         /* Mind blast */
2484         if (!saving_throw(p_ptr->skill_sav * 100 / power))
2485         {
2486                 if (!p_ptr->resist_conf)
2487                 {
2488                         (void)set_confused(p_ptr->confused + randint0(4) + 4);
2489                 }
2490                 if (!p_ptr->resist_chaos && one_in_(3))
2491                 {
2492                         (void)set_image(p_ptr->image + randint0(250) + 150);
2493                 }
2494                 return;
2495         }
2496
2497         /* Lose int & wis */
2498         if (!saving_throw(p_ptr->skill_sav * 100 / power))
2499         {
2500                 do_dec_stat(A_INT);
2501                 do_dec_stat(A_WIS);
2502                 return;
2503         }
2504
2505         /* Brain smash */
2506         if (!saving_throw(p_ptr->skill_sav * 100 / power))
2507         {
2508                 if (!p_ptr->resist_conf)
2509                 {
2510                         (void)set_confused(p_ptr->confused + randint0(4) + 4);
2511                 }
2512                 if (!p_ptr->free_act)
2513                 {
2514                         (void)set_paralyzed(p_ptr->paralyzed + randint0(4) + 4);
2515                 }
2516                 while (!saving_throw(p_ptr->skill_sav))
2517                 {
2518                         (void)do_dec_stat(A_INT);
2519                 }
2520                 while (!saving_throw(p_ptr->skill_sav))
2521                 {
2522                         (void)do_dec_stat(A_WIS);
2523                 }
2524                 if (!p_ptr->resist_chaos)
2525                 {
2526                         (void)set_image(p_ptr->image + randint0(250) + 150);
2527                 }
2528                 return;
2529         }
2530
2531
2532         /* Amnesia */
2533         if (!saving_throw(p_ptr->skill_sav * 100 / power))
2534         {
2535                 if (lose_all_info())
2536                 {
2537 #ifdef JP
2538 msg_print("¤¢¤Þ¤ê¤Î¶²ÉݤËÁ´¤Æ¤Î¤³¤È¤ò˺¤ì¤Æ¤·¤Þ¤Ã¤¿¡ª");
2539 #else
2540                         msg_print("You forget everything in your utmost terror!");
2541 #endif
2542
2543                 }
2544                 return;
2545         }
2546
2547         /* Else gain permanent insanity */
2548         if ((p_ptr->muta3 & MUT3_MORONIC) && (p_ptr->muta2 & MUT2_BERS_RAGE) &&
2549                 ((p_ptr->muta2 & MUT2_COWARDICE) || (p_ptr->resist_fear)) &&
2550                 ((p_ptr->muta2 & MUT2_HALLU) || (p_ptr->resist_chaos)))
2551         {
2552                 /* The poor bastard already has all possible insanities! */
2553                 return;
2554         }
2555
2556         while (!happened)
2557         {
2558                 switch (randint1(4))
2559                 {
2560                         case 1:
2561                         {
2562                                 if (!(p_ptr->muta3 & MUT3_MORONIC))
2563                                 {
2564                                         if ((p_ptr->stat_use[A_INT] < 4) && (p_ptr->stat_use[A_WIS] < 4))
2565                                         {
2566 #ifdef JP
2567 msg_print("¤¢¤Ê¤¿¤Ï´°àú¤ÊÇϼ¯¤Ë¤Ê¤Ã¤¿¤è¤¦¤Êµ¤¤¬¤·¤¿¡£¤·¤«¤·¤½¤ì¤Ï¸µ¡¹¤À¤Ã¤¿¡£");
2568 #else
2569                                                 msg_print("You turn into an utter moron!");
2570 #endif
2571                                         }
2572                                         else
2573                                         {
2574 #ifdef JP
2575 msg_print("¤¢¤Ê¤¿¤Ï´°àú¤ÊÇϼ¯¤Ë¤Ê¤Ã¤¿¡ª");
2576 #else
2577                                                 msg_print("You turn into an utter moron!");
2578 #endif
2579                                         }
2580
2581                                         if (p_ptr->muta3 & MUT3_HYPER_INT)
2582                                         {
2583 #ifdef JP
2584 msg_print("¤¢¤Ê¤¿¤ÎǾ¤ÏÀ¸ÂÎ¥³¥ó¥Ô¥å¡¼¥¿¤Ç¤Ï¤Ê¤¯¤Ê¤Ã¤¿¡£");
2585 #else
2586                                                 msg_print("Your brain is no longer a living computer.");
2587 #endif
2588
2589                                                 p_ptr->muta3 &= ~(MUT3_HYPER_INT);
2590                                         }
2591                                         p_ptr->muta3 |= MUT3_MORONIC;
2592                                         happened = TRUE;
2593                                 }
2594                                 break;
2595                         }
2596                         case 2:
2597                         {
2598                                 if (!(p_ptr->muta2 & MUT2_COWARDICE) && !p_ptr->resist_fear)
2599                                 {
2600 #ifdef JP
2601 msg_print("¤¢¤Ê¤¿¤Ï¥Ñ¥é¥Î¥¤¥¢¤Ë¤Ê¤Ã¤¿¡ª");
2602 #else
2603                                         msg_print("You become paranoid!");
2604 #endif
2605
2606
2607                                         /* Duh, the following should never happen, but anyway... */
2608                                         if (p_ptr->muta3 & MUT3_FEARLESS)
2609                                         {
2610 #ifdef JP
2611 msg_print("¤¢¤Ê¤¿¤Ï¤â¤¦¶²¤ìÃΤ餺¤Ç¤Ï¤Ê¤¯¤Ê¤Ã¤¿¡£");
2612 #else
2613                                                 msg_print("You are no longer fearless.");
2614 #endif
2615
2616                                                 p_ptr->muta3 &= ~(MUT3_FEARLESS);
2617                                         }
2618
2619                                         p_ptr->muta2 |= MUT2_COWARDICE;
2620                                         happened = TRUE;
2621                                 }
2622                                 break;
2623                         }
2624                         case 3:
2625                         {
2626                                 if (!(p_ptr->muta2 & MUT2_HALLU) && !p_ptr->resist_chaos)
2627                                 {
2628 #ifdef JP
2629 msg_print("¸¸³Ð¤ò¤Ò¤­µ¯¤³¤¹Àº¿ÀºøÍð¤Ë´Ù¤Ã¤¿¡ª");
2630 #else
2631                                         msg_print("You are afflicted by a hallucinatory insanity!");
2632 #endif
2633
2634                                         p_ptr->muta2 |= MUT2_HALLU;
2635                                         happened = TRUE;
2636                                 }
2637                                 break;
2638                         }
2639                         default:
2640                         {
2641                                 if (!(p_ptr->muta2 & MUT2_BERS_RAGE))
2642                                 {
2643 #ifdef JP
2644 msg_print("·ãÎõ¤Ê´¶¾ð¤Îȯºî¤Ë¤ª¤½¤ï¤ì¤ë¤è¤¦¤Ë¤Ê¤Ã¤¿¡ª");
2645 #else
2646                                         msg_print("You become subject to fits of berserk rage!");
2647 #endif
2648
2649                                         p_ptr->muta2 |= MUT2_BERS_RAGE;
2650                                         happened = TRUE;
2651                                 }
2652                                 break;
2653                         }
2654                 }
2655         }
2656
2657         p_ptr->update |= PU_BONUS;
2658         handle_stuff();
2659 }
2660
2661
2662 /*
2663  * inn commands
2664  * Note that resting for the night was a perfect way to avoid player
2665  * ghosts in the town *if* you could only make it to the inn in time (-:
2666  * Now that the ghosts are temporarily disabled in 2.8.X, this function
2667  * will not be that useful.  I will keep it in the hopes the player
2668  * ghost code does become a reality again. Does help to avoid filthy urchins.
2669  * Resting at night is also a quick way to restock stores -KMW-
2670  */
2671 static bool inn_comm(int cmd)
2672 {
2673         int dawnval;
2674
2675         switch (cmd)
2676         {
2677                 case BACT_FOOD: /* Buy food & drink */
2678 #ifdef JP
2679 msg_print("¥Ð¡¼¥Æ¥ó¤Ï¤¤¤¯¤é¤«¤Î¿©¤Ùʪ¤È¥Ó¡¼¥ë¤ò¤¯¤ì¤¿¡£");
2680 #else
2681                         msg_print("The barkeep gives you some gruel and a beer.");
2682 #endif
2683
2684                         (void)set_food(PY_FOOD_MAX - 1);
2685                         break;
2686
2687                 case BACT_REST: /* Rest for the night */
2688                         dawnval = ((turn % (TURNS_PER_TICK * TOWN_DAWN)));
2689                         if (dawnval > (TURNS_PER_TICK * TOWN_DAWN)/4)
2690                         {  /* nighttime */
2691                                 if ((p_ptr->poisoned) || (p_ptr->cut))
2692                                 {
2693 #ifdef JP
2694 msg_print("¤¢¤Ê¤¿¤ËɬÍפʤΤÏÉô²°¤Ç¤Ï¤Ê¤¯¡¢¼£ÎżԤǤ¹¡£");
2695 #else
2696                                         msg_print("You need a healer, not a room.");
2697 #endif
2698
2699                                         msg_print(NULL);
2700 #ifdef JP
2701 msg_print("¤¹¤ß¤Þ¤»¤ó¡¢¤Ç¤â¤¦¤Á¤Ç狼¤Ë»à¤Ê¤ì¤Á¤ãº¤¤ê¤Þ¤¹¤ó¤Ç¡£");
2702 #else
2703                                         msg_print("Sorry, but don't want anyone dying in here.");
2704 #endif
2705
2706                                 }
2707                                 else
2708                                 {
2709                                         int oldturn = turn;
2710 #ifdef JP
2711                                         do_cmd_write_nikki(NIKKI_BUNSHOU, 0, "½É²°¤ËÇñ¤Þ¤Ã¤¿¡£");
2712 #else
2713                                         do_cmd_write_nikki(NIKKI_BUNSHOU, 0, "stay over night at the inn");
2714 #endif
2715                                         turn = (turn / (TURNS_PER_TICK*TOWN_DAWN/2) + 1) * (TURNS_PER_TICK*TOWN_DAWN/2);
2716                                         if (((oldturn + TURNS_PER_TICK * TOWN_DAWN / 4) % (TURNS_PER_TICK * TOWN_DAWN)) > TURNS_PER_TICK * TOWN_DAWN/4) do_cmd_write_nikki(NIKKI_HIGAWARI, 0, NULL);
2717                                         p_ptr->chp = p_ptr->mhp;
2718
2719                                         dungeon_turn += MIN(turn - oldturn, TURNS_PER_TICK*250);
2720
2721                                         if (ironman_nightmare)
2722                                         {
2723 #ifdef JP
2724 msg_print("̲¤ê¤Ë½¢¤¯¤È¶²¤í¤·¤¤¸÷·Ê¤¬¿´¤ò¤è¤®¤Ã¤¿¡£");
2725 #else
2726                                                 msg_print("Horrible visions flit through your mind as you sleep.");
2727 #endif
2728
2729
2730                                                 /* Pick a nightmare */
2731                                                 get_mon_num_prep(get_nightmare, NULL);
2732
2733                                                 /* Have some nightmares */
2734                                                 while(1)
2735                                                 {
2736                                                         have_nightmare(get_mon_num(MAX_DEPTH));
2737
2738                                                         if (!one_in_(3)) break;
2739                                                 }
2740
2741                                                 /* Remove the monster restriction */
2742                                                 get_mon_num_prep(NULL, NULL);
2743
2744 #ifdef JP
2745 msg_print("¤¢¤Ê¤¿¤ÏÀ䶫¤·¤ÆÌܤò³Ð¤Þ¤·¤¿¡£");
2746 #else
2747                                                 msg_print("You awake screaming.");
2748 #endif
2749
2750 #ifdef JP
2751                                                 do_cmd_write_nikki(NIKKI_BUNSHOU, 0, "°­Ì´¤Ë¤¦¤Ê¤µ¤ì¤Æ¤è¤¯Ì²¤ì¤Ê¤«¤Ã¤¿¡£");
2752 #else
2753                                                 do_cmd_write_nikki(NIKKI_BUNSHOU, 0, "be troubled by a nightmare.");
2754 #endif
2755                                         }
2756                                         else
2757                                         {
2758                                                 set_blind(0);
2759                                                 set_confused(0);
2760                                                 p_ptr->stun = 0;
2761                                                 p_ptr->chp = p_ptr->mhp;
2762                                                 p_ptr->csp = p_ptr->msp;
2763                                                 if (p_ptr->pclass == CLASS_MAGIC_EATER)
2764                                                 {
2765                                                         int i;
2766                                                         for (i = 0; i < 72; i++)
2767                                                         {
2768                                                                 p_ptr->magic_num1[i] = p_ptr->magic_num2[i]*EATER_CHARGE;
2769                                                         }
2770                                                         for (; i < 108; i++)
2771                                                         {
2772                                                                 p_ptr->magic_num1[i] = 0;
2773                                                         }
2774                                                 }
2775
2776 #ifdef JP
2777 msg_print("¤¢¤Ê¤¿¤Ï¥ê¥Õ¥ì¥Ã¥·¥å¤·¤ÆÌܳФᡢ¿·¤¿¤ÊÆü¤ò·Þ¤¨¤¿¡£");
2778 #else
2779                                                 msg_print("You awake refreshed for the new day.");
2780 #endif
2781
2782 #ifdef JP
2783                                                 do_cmd_write_nikki(NIKKI_BUNSHOU, 0, "¤¹¤¬¤¹¤¬¤·¤¤Ä«¤ò¤à¤«¤¨¤¿¡£");
2784 #else
2785                                                 do_cmd_write_nikki(NIKKI_BUNSHOU, 0, "awake refreshed.");
2786 #endif
2787                                         }
2788
2789                                         p_ptr->leftbldg = TRUE;
2790                                 }
2791                         }
2792                         else
2793                         {
2794 #ifdef JP
2795 msg_print("Éô²°¤ÏÌë¤À¤±»ÈÍѲÄǽ¤Ç¤¹¡£");
2796 #else
2797                                 msg_print("The rooms are available only at night.");
2798 #endif
2799
2800                                 return (FALSE);
2801                         }
2802                         break;
2803                 case BACT_RUMORS: /* Listen for rumors */
2804                         {
2805                                 char Rumor[1024];
2806
2807 #ifdef JP
2808                                 if (!get_rnd_line_jonly("rumors_j.txt", 0, Rumor, 10))
2809 #else
2810                                 if (!get_rnd_line("rumors.txt", 0, Rumor))
2811 #endif
2812
2813                                         msg_format("%s", Rumor);
2814                                 break;
2815                         }
2816         }
2817
2818         return (TRUE);
2819 }
2820
2821
2822 /*
2823  * Share gold for thieves
2824  */
2825 static void share_gold(void)
2826 {
2827         int i = (p_ptr->lev * 2) * 10;
2828 #ifdef JP
2829 msg_format("¡ð%d ¤ò¼ê¤ËÆþ¤ì¤¿¡£", i);
2830 #else
2831         msg_format("You collect %d gold pieces", i);
2832 #endif
2833
2834         p_ptr->au += i;
2835 }
2836
2837
2838 /*
2839  * Display quest information
2840  */
2841 static void get_questinfo(int questnum)
2842 {
2843         int     i;
2844         int     old_quest;
2845         char    tmp_str[80];
2846
2847
2848         /* Clear the text */
2849         for (i = 0; i < 10; i++)
2850         {
2851                 quest_text[i][0] = '\0';
2852         }
2853
2854         quest_text_line = 0;
2855
2856         /* Set the quest number temporary */
2857         old_quest = p_ptr->inside_quest;
2858         p_ptr->inside_quest = questnum;
2859
2860         /* Get the quest text */
2861         init_flags = INIT_SHOW_TEXT | INIT_ASSIGN;
2862
2863 process_dungeon_file("q_info_j.txt", 0, 0, 0, 0);
2864
2865         /* Reset the old quest number */
2866         p_ptr->inside_quest = old_quest;
2867
2868         /* Print the quest info */
2869 #ifdef JP
2870 sprintf(tmp_str, "¥¯¥¨¥¹¥È¾ðÊó (´í¸±ÅÙ: %d ³¬ÁêÅö)", quest[questnum].level);
2871 #else
2872         sprintf(tmp_str, "Quest Information (Danger level: %d)", quest[questnum].level);
2873 #endif
2874
2875         prt(tmp_str, 5, 0);
2876
2877         prt(quest[questnum].name, 7, 0);
2878
2879         for (i = 0; i < 10; i++)
2880         {
2881                 c_put_str(TERM_YELLOW, quest_text[i], i + 8, 0);
2882         }
2883 }
2884
2885
2886 /*
2887  * Request a quest from the Lord.
2888  */
2889 static void castle_quest(void)
2890 {
2891         int             q_index = 0;
2892         monster_race    *r_ptr;
2893         quest_type      *q_ptr;
2894         cptr            name;
2895
2896
2897         clear_bldg(4, 18);
2898
2899         /* Current quest of the building */
2900         q_index = cave[py][px].special;
2901
2902         /* Is there a quest available at the building? */
2903         if (!q_index)
2904         {
2905 #ifdef JP
2906 put_str("º£¤Î¤È¤³¤í¥¯¥¨¥¹¥È¤Ï¤¢¤ê¤Þ¤»¤ó¡£", 8, 0);
2907 #else
2908                 put_str("I don't have a quest for you at the moment.", 8, 0);
2909 #endif
2910
2911                 return;
2912         }
2913
2914         q_ptr = &quest[q_index];
2915
2916         /* Quest is completed */
2917         if (q_ptr->status == QUEST_STATUS_COMPLETED)
2918         {
2919                 /* Rewarded quest */
2920                 q_ptr->status = QUEST_STATUS_REWARDED;
2921
2922                 get_questinfo(q_index);
2923
2924                 reinit_wilderness = TRUE;
2925         }
2926         /* Failed quest */
2927         else if (q_ptr->status == QUEST_STATUS_FAILED)
2928         {
2929                 get_questinfo(q_index);
2930
2931                 /* Mark quest as done (but failed) */
2932                 q_ptr->status = QUEST_STATUS_FAILED_DONE;
2933
2934                 reinit_wilderness = TRUE;
2935         }
2936         /* Quest is still unfinished */
2937         else if (q_ptr->status == QUEST_STATUS_TAKEN)
2938         {
2939 #ifdef JP
2940 put_str("¤¢¤Ê¤¿¤Ï¸½ºß¤Î¥¯¥¨¥¹¥È¤ò½ªÎ»¤µ¤»¤Æ¤¤¤Þ¤»¤ó¡ª", 8, 0);
2941 #else
2942                 put_str("You have not completed your current quest yet!", 8, 0);
2943 #endif
2944
2945 #ifdef JP
2946 put_str("CTRL-Q¤ò»È¤¨¤Ð¥¯¥¨¥¹¥È¤Î¾õÂÖ¤¬¥Á¥§¥Ã¥¯¤Ç¤­¤Þ¤¹¡£", 9, 0);
2947 #else
2948                 put_str("Use CTRL-Q to check the status of your quest.", 9, 0);
2949 #endif
2950
2951 #ifdef JP
2952 put_str("¥¯¥¨¥¹¥È¤ò½ª¤ï¤é¤»¤¿¤éÌá¤Ã¤ÆÍè¤Æ²¼¤µ¤¤¡£", 12, 0);
2953 #else
2954                 put_str("Return when you have completed your quest.", 12, 0);
2955 #endif
2956
2957         }
2958         /* No quest yet */
2959         else if (q_ptr->status == QUEST_STATUS_UNTAKEN)
2960         {
2961                 q_ptr->status = QUEST_STATUS_TAKEN;
2962
2963                 reinit_wilderness = TRUE;
2964
2965                 /* Assign a new quest */
2966                 if (q_ptr->type == QUEST_TYPE_KILL_ANY_LEVEL)
2967                 {
2968                         if (q_ptr->r_idx == 0)
2969                         {
2970                                 /* Random monster at least 5 - 10 levels out of deep */
2971                                 q_ptr->r_idx = get_mon_num(q_ptr->level + 4 + randint1(6));
2972                         }
2973
2974                         r_ptr = &r_info[q_ptr->r_idx];
2975
2976                         while ((r_ptr->flags1 & RF1_UNIQUE) || (r_ptr->rarity != 1))
2977                         {
2978                                 q_ptr->r_idx = get_mon_num(q_ptr->level) + 4 + randint1(6);
2979                                 r_ptr = &r_info[q_ptr->r_idx];
2980                         }
2981
2982                         if (q_ptr->max_num == 0)
2983                         {
2984                                 /* Random monster number */
2985                                 if (randint1(10) > 7)
2986                                         q_ptr->max_num = 1;
2987                                 else
2988                                         q_ptr->max_num = randint1(3) + 1;
2989                         }
2990
2991                         q_ptr->cur_num = 0;
2992                         name = (r_name + r_ptr->name);
2993 #ifdef JP
2994 msg_format("¥¯¥¨¥¹¥È: %s¤ò %dÂÎÅݤ¹", name,q_ptr->max_num);
2995 #else
2996                         msg_format("Your quest: kill %d %s", q_ptr->max_num, name);
2997 #endif
2998
2999                 }
3000                 else
3001                 {
3002                         get_questinfo(q_index);
3003                 }
3004         }
3005 }
3006
3007
3008 /*
3009  * Display town history
3010  */
3011 static void town_history(void)
3012 {
3013         /* Save screen */
3014         screen_save();
3015
3016         /* Peruse the building help file */
3017 #ifdef JP
3018 (void)show_file(TRUE, "jbldg.txt", NULL, 0, 0);
3019 #else
3020         (void)show_file(TRUE, "bldg.txt", NULL, 0, 0);
3021 #endif
3022
3023
3024         /* Load screen */
3025         screen_load();
3026 }
3027
3028
3029 /*
3030  * Display the damage figure of an object
3031  * (used by compare_weapon_aux1)
3032  *
3033  * Only accurate for the current weapon, because it includes
3034  * the current +dam of the player.
3035  */
3036 static void compare_weapon_aux2(object_type *o_ptr, int numblows,
3037                                 int r, int c, int mult, cptr attr,
3038                                 u32b f1, u32b f2, u32b f3, byte color)
3039 {
3040         char tmp_str[80];
3041
3042         /* Print the intro text */
3043         c_put_str(color, attr, r, c);
3044
3045         /* Calculate the min and max damage figures */
3046 #ifdef JP
3047 sprintf(tmp_str, "£±¥¿¡¼¥ó: %d-%d ¥À¥á¡¼¥¸",
3048 #else
3049         sprintf(tmp_str, "Attack: %d-%d damage",
3050 #endif
3051
3052             (numblows * (mult * o_ptr->dd /60 + o_ptr->to_d + p_ptr->to_d[0])),
3053             (numblows * (mult * o_ptr->ds * o_ptr->dd /60 + o_ptr->to_d + p_ptr->to_d[0])));
3054
3055         /* Print the damage */
3056         put_str(tmp_str, r, c + 8);
3057 }
3058
3059
3060 /*
3061  * Show the damage figures for the various monster types
3062  *
3063  * Only accurate for the current weapon, because it includes
3064  * the current number of blows for the player.
3065  */
3066 static void compare_weapon_aux1(object_type *o_ptr, int col, int r)
3067 {
3068         int mult = 60;
3069         u32b f1, f2, f3;
3070
3071         /* Get the flags of the weapon */
3072         object_flags(o_ptr, &f1, &f2, &f3);
3073
3074         if (p_ptr->riding)
3075         {
3076                 if ((o_ptr->tval == TV_POLEARM) && ((o_ptr->sval == SV_LANCE) || (o_ptr->sval == SV_HEAVY_LANCE)))
3077                         mult = mult * (o_ptr->dd + 2) / o_ptr->dd;
3078         }
3079         if ((p_ptr->pclass != CLASS_SAMURAI) && (f1 & TR1_FORCE_WEAPON) && (p_ptr->csp > (o_ptr->dd * o_ptr->ds / 5))) mult = mult * 7 / 2;
3080
3081         /* Print the relevant lines */
3082 #ifdef JP
3083 if (f1 & TR1_FORCE_WEAPON)     compare_weapon_aux2(o_ptr, p_ptr->num_blow[0], r++, col, 1*mult, "ÍýÎÏ:", f1, f2, f3, TERM_L_BLUE);
3084 if (f1 & TR1_SLAY_ANIMAL) compare_weapon_aux2(o_ptr, p_ptr->num_blow[0], r++, col, 2*mult, "ưʪ:", f1, f2, f3, TERM_YELLOW);
3085 if (f1 & TR1_SLAY_EVIL)   compare_weapon_aux2(o_ptr, p_ptr->num_blow[0], r++, col, 2*mult, "¼Ù°­:", f1, f2, f3, TERM_YELLOW);
3086 if (f3 & TR3_SLAY_HUMAN)   compare_weapon_aux2(o_ptr, p_ptr->num_blow[0], r++, col, 2*mult, "¿Í´Ö:", f1, f2, f3, TERM_YELLOW);
3087 if (f1 & TR1_SLAY_UNDEAD) compare_weapon_aux2(o_ptr, p_ptr->num_blow[0], r++, col, 3*mult, "ÉÔ»à:", f1, f2, f3, TERM_YELLOW);
3088 if (f1 & TR1_SLAY_DEMON)  compare_weapon_aux2(o_ptr, p_ptr->num_blow[0], r++, col, 3*mult, "°­Ëâ:", f1, f2, f3, TERM_YELLOW);
3089 if (f1 & TR1_SLAY_ORC)    compare_weapon_aux2(o_ptr, p_ptr->num_blow[0], r++, col, 3*mult, "¥ª¡¼¥¯:", f1, f2, f3, TERM_YELLOW);
3090 if (f1 & TR1_SLAY_TROLL)  compare_weapon_aux2(o_ptr, p_ptr->num_blow[0], r++, col, 3*mult, "¥È¥í¥ë:", f1, f2, f3, TERM_YELLOW);
3091 if (f1 & TR1_SLAY_GIANT)  compare_weapon_aux2(o_ptr, p_ptr->num_blow[0], r++, col, 3*mult, "µð¿Í:", f1, f2, f3, TERM_YELLOW);
3092 if (f1 & TR1_KILL_DRAGON) compare_weapon_aux2(o_ptr, p_ptr->num_blow[0], r++, col, 5*mult, "ε:", f1, f2, f3, TERM_YELLOW);
3093 else if (f1 & TR1_SLAY_DRAGON) compare_weapon_aux2(o_ptr, p_ptr->num_blow[0], r++, col, 3*mult, "ε:", f1, f2, f3, TERM_YELLOW);
3094 if (f1 & TR1_BRAND_ACID)  compare_weapon_aux2(o_ptr, p_ptr->num_blow[0], r++, col, 5*mult/2, "»À°À­:", f1, f2, f3, TERM_RED);
3095 if (f1 & TR1_BRAND_ELEC)  compare_weapon_aux2(o_ptr, p_ptr->num_blow[0], r++, col, 5*mult/2, "ÅÅ°À­:", f1, f2, f3, TERM_RED);
3096 if (f1 & TR1_BRAND_FIRE)  compare_weapon_aux2(o_ptr, p_ptr->num_blow[0], r++, col, 5*mult/2, "±ê°À­:", f1, f2, f3, TERM_RED);
3097 if (f1 & TR1_BRAND_COLD)  compare_weapon_aux2(o_ptr, p_ptr->num_blow[0], r++, col, 5*mult/2, "Îä°À­:", f1, f2, f3, TERM_RED);
3098 if (f1 & TR1_BRAND_POIS)  compare_weapon_aux2(o_ptr, p_ptr->num_blow[0], r++, col, 5*mult/2, "ÆÇ°À­:", f1, f2, f3, TERM_RED);
3099 #else
3100         if (f1 & TR1_FORCE_WEAPON)     compare_weapon_aux2(o_ptr, p_ptr->num_blow[0], r++, col, 1*mult, "Force  :", f1, f2, f3, TERM_L_BLUE);
3101         if (f1 & TR1_SLAY_ANIMAL) compare_weapon_aux2(o_ptr, p_ptr->num_blow[0], r++, col, 2*mult, "Animals:", f1, f2, f3, TERM_YELLOW);
3102         if (f1 & TR1_SLAY_EVIL)   compare_weapon_aux2(o_ptr, p_ptr->num_blow[0], r++, col, 2*mult, "Evil:", f1, f2, f3, TERM_YELLOW);
3103         if (f3 & TR3_SLAY_HUMAN)   compare_weapon_aux2(o_ptr, p_ptr->num_blow[0], r++, col, 2*mult, "Human:", f1, f2, f3, TERM_YELLOW);
3104         if (f1 & TR1_SLAY_UNDEAD) compare_weapon_aux2(o_ptr, p_ptr->num_blow[0], r++, col, 3*mult, "Undead:", f1, f2, f3, TERM_YELLOW);
3105         if (f1 & TR1_SLAY_DEMON)  compare_weapon_aux2(o_ptr, p_ptr->num_blow[0], r++, col, 3*mult, "Demons:", f1, f2, f3, TERM_YELLOW);
3106         if (f1 & TR1_SLAY_ORC)    compare_weapon_aux2(o_ptr, p_ptr->num_blow[0], r++, col, 3*mult, "Orcs:", f1, f2, f3, TERM_YELLOW);
3107         if (f1 & TR1_SLAY_TROLL)  compare_weapon_aux2(o_ptr, p_ptr->num_blow[0], r++, col, 3*mult, "Trolls:", f1, f2, f3, TERM_YELLOW);
3108         if (f1 & TR1_SLAY_GIANT)  compare_weapon_aux2(o_ptr, p_ptr->num_blow[0], r++, col, 3*mult, "Giants:", f1, f2, f3, TERM_YELLOW);
3109         if (f1 & TR1_KILL_DRAGON) compare_weapon_aux2(o_ptr, p_ptr->num_blow[0], r++, col, 5*mult, "Dragons:", f1, f2, f3, TERM_YELLOW);
3110         else if (f1 & TR1_SLAY_DRAGON) compare_weapon_aux2(o_ptr, p_ptr->num_blow[0], r++, col, 3*mult, "Dragons:", f1, f2, f3, TERM_YELLOW);
3111         if (f1 & TR1_BRAND_ACID)  compare_weapon_aux2(o_ptr, p_ptr->num_blow[0], r++, col, 3*mult, "Acid:", f1, f2, f3, TERM_RED);
3112         if (f1 & TR1_BRAND_ELEC)  compare_weapon_aux2(o_ptr, p_ptr->num_blow[0], r++, col, 3*mult, "Elec:", f1, f2, f3, TERM_RED);
3113         if (f1 & TR1_BRAND_FIRE)  compare_weapon_aux2(o_ptr, p_ptr->num_blow[0], r++, col, 3*mult, "Fire:", f1, f2, f3, TERM_RED);
3114         if (f1 & TR1_BRAND_COLD)  compare_weapon_aux2(o_ptr, p_ptr->num_blow[0], r++, col, 3*mult, "Cold:", f1, f2, f3, TERM_RED);
3115         if (f1 & TR1_BRAND_POIS)  compare_weapon_aux2(o_ptr, p_ptr->num_blow[0], r++, col, 3*mult, "Poison:", f1, f2, f3, TERM_RED);
3116 #endif
3117
3118 }
3119
3120 static int hit_chance(int to_h, int ac)
3121 {
3122         int chance = 0;
3123         int meichuu = p_ptr->skill_thn + (p_ptr->to_h[0] + to_h) * BTH_PLUS_ADJ;
3124
3125         if (meichuu <= 0) return 5;
3126
3127         chance = 100 - ((ac * 75) / meichuu);
3128
3129         if (chance > 95) chance = 95;
3130         if (chance < 5) chance = 5;
3131         if (p_ptr->pseikaku == SEIKAKU_NAMAKE)
3132                 chance = (chance*19+9)/20;
3133         return chance;
3134 }
3135
3136 /*
3137  * Displays all info about a weapon
3138  *
3139  * Only accurate for the current weapon, because it includes
3140  * various info about the player's +to_dam and number of blows.
3141  */
3142 static void list_weapon(object_type *o_ptr, int row, int col)
3143 {
3144         char o_name[MAX_NLEN];
3145         char tmp_str[80];
3146
3147         /* Print the weapon name */
3148         object_desc(o_name, o_ptr, TRUE, 0);
3149         c_put_str(TERM_YELLOW, o_name, row, col);
3150
3151         /* Print the player's number of blows */
3152 #ifdef JP
3153 sprintf(tmp_str, "¹¶·â²ó¿ô: %d", p_ptr->num_blow[0]);
3154 #else
3155         sprintf(tmp_str, "Number of Blows: %d", p_ptr->num_blow[0]);
3156 #endif
3157
3158         put_str(tmp_str, row+1, col);
3159
3160         /* Print to_hit and to_dam of the weapon */
3161 #ifdef JP
3162 sprintf(tmp_str, "Ì¿ÃæΨ:  0  50 100 150 200 (Ũ¤ÎAC)");
3163 #else
3164 sprintf(tmp_str, "To Hit:  0  50 100 150 200 (AC)");
3165 #endif
3166
3167         put_str(tmp_str, row+2, col);
3168
3169         /* Print the weapons base damage dice */
3170 #ifdef JP
3171 sprintf(tmp_str, "        %2d  %2d  %2d  %2d  %2d (%%)", hit_chance(o_ptr->to_h, 0), hit_chance(o_ptr->to_h, 50), hit_chance(o_ptr->to_h, 100), hit_chance(o_ptr->to_h, 150), hit_chance(o_ptr->to_h, 200));
3172 #else
3173 sprintf(tmp_str, "        %2d  %2d  %2d  %2d  %2d (%%)", hit_chance(o_ptr->to_h, 0), hit_chance(o_ptr->to_h, 50), hit_chance(o_ptr->to_h, 100), hit_chance(o_ptr->to_h, 150), hit_chance(o_ptr->to_h, 200));
3174 #endif
3175
3176         put_str(tmp_str, row+3, col);
3177
3178 #ifdef JP
3179 c_put_str(TERM_YELLOW, "²Äǽ¤Ê¥À¥á¡¼¥¸:", row+5, col);
3180 #else
3181         c_put_str(TERM_YELLOW, "Possible Damage:", row+5, col);
3182 #endif
3183
3184
3185         /* Damage for one blow (if it hits) */
3186 #ifdef JP
3187 sprintf(tmp_str, "¹¶·â°ì²ó¤Ë¤Ä¤­ %d-%d",
3188 #else
3189         sprintf(tmp_str, "One Strike: %d-%d damage",
3190 #endif
3191
3192             o_ptr->dd + o_ptr->to_d + p_ptr->to_d[0],
3193             o_ptr->ds * o_ptr->dd + o_ptr->to_d + p_ptr->to_d[0]);
3194         put_str(tmp_str, row+6, col+1);
3195
3196         /* Damage for the complete attack (if all blows hit) */
3197 #ifdef JP
3198 sprintf(tmp_str, "£±¥¿¡¼¥ó¤Ë¤Ä¤­ %d-%d",
3199 #else
3200         sprintf(tmp_str, "One Attack: %d-%d damage",
3201 #endif
3202
3203             p_ptr->num_blow[0] * (o_ptr->dd + o_ptr->to_d + p_ptr->to_d[0]),
3204             p_ptr->num_blow[0] * (o_ptr->ds * o_ptr->dd + o_ptr->to_d + p_ptr->to_d[0]));
3205         put_str(tmp_str, row+7, col+1);
3206 }
3207
3208
3209 /*
3210  * Hook to specify "weapon"
3211  */
3212 static bool item_tester_hook_melee_weapon(object_type *o_ptr)
3213 {
3214         switch (o_ptr->tval)
3215         {
3216                 case TV_HAFTED:
3217                 case TV_POLEARM:
3218                 case TV_DIGGING:
3219                 {
3220                         return (TRUE);
3221                 }
3222                 case TV_SWORD:
3223                 {
3224                         if (o_ptr->sval != SV_DOKUBARI) return (TRUE);
3225                 }
3226         }
3227
3228         return (FALSE);
3229 }
3230
3231
3232 /*
3233  * Hook to specify "ammo"
3234  */
3235 static bool item_tester_hook_ammo(object_type *o_ptr)
3236 {
3237         switch (o_ptr->tval)
3238         {
3239                 case TV_SHOT:
3240                 case TV_ARROW:
3241                 case TV_BOLT:
3242                 {
3243                         return (TRUE);
3244                 }
3245         }
3246
3247         return (FALSE);
3248 }
3249
3250
3251 /*
3252  * Compare weapons
3253  *
3254  * Copies the weapons to compare into the weapon-slot and
3255  * compares the values for both weapons.
3256  */
3257 static bool compare_weapons(void)
3258 {
3259         int item, item2;
3260         object_type *o1_ptr, *o2_ptr;
3261         object_type orig_weapon;
3262         object_type *i_ptr;
3263         cptr q, s;
3264         int row = 2;
3265
3266         screen_save();
3267         /* Clear the screen */
3268         clear_bldg(0, 22);
3269
3270         /* Store copy of original wielded weapon */
3271         i_ptr = &inventory[INVEN_RARM];
3272         object_copy(&orig_weapon, i_ptr);
3273
3274         item_tester_no_ryoute = TRUE;
3275         /* Only compare melee weapons */
3276         item_tester_hook = item_tester_hook_melee_weapon;
3277
3278         /* Get the first weapon */
3279 #ifdef JP
3280 q = "Âè°ì¤ÎÉð´ï¤Ï¡©";
3281 s = "Èæ¤Ù¤ë¤â¤Î¤¬¤¢¤ê¤Þ¤»¤ó¡£";
3282 #else
3283         q = "What is your first weapon? ";
3284         s = "You have nothing to compare.";
3285 #endif
3286
3287         if (!get_item(&item, q, s, (USE_EQUIP | USE_INVEN)))
3288         {
3289                 screen_load();
3290                 return (FALSE);
3291         }
3292
3293         /* Get the item (in the pack) */
3294         o1_ptr = &inventory[item];
3295
3296         /* Clear the screen */
3297         clear_bldg(0, 22);
3298
3299         item_tester_no_ryoute = TRUE;
3300         /* Only compare melee weapons */
3301         item_tester_hook = item_tester_hook_melee_weapon;
3302
3303         /* Get the second weapon */
3304 #ifdef JP
3305 q = "ÂèÆó¤ÎÉð´ï¤Ï¡©";
3306 s = "Èæ¤Ù¤ë¤â¤Î¤¬¤¢¤ê¤Þ¤»¤ó¡£";
3307 #else
3308         q = "What is your second weapon? ";
3309         s = "You have nothing to compare.";
3310 #endif
3311
3312         if (!get_item(&item2, q, s, (USE_EQUIP | USE_INVEN)))
3313         {
3314                 screen_load();
3315                 return (FALSE);
3316         }
3317
3318         /* Get the item (in the pack) */
3319         o2_ptr = &inventory[item2];
3320
3321         /* Clear the screen */
3322         clear_bldg(0, 22);
3323
3324         /* Copy first weapon into the weapon slot (if it's not already there) */
3325         if (o1_ptr != i_ptr)
3326                 object_copy(i_ptr, o1_ptr);
3327
3328         /* Get the new values */
3329         calc_bonuses();
3330
3331         /* List the new values */
3332         list_weapon(o1_ptr, row, 2);
3333         compare_weapon_aux1(o1_ptr, 2, row + 8);
3334
3335         /* Copy second weapon into the weapon slot (if it's not already there) */
3336         if (o2_ptr != i_ptr)
3337                 object_copy(i_ptr, o2_ptr);
3338         else
3339                 object_copy(i_ptr, &orig_weapon);
3340
3341         /* Get the new values */
3342         calc_bonuses();
3343
3344         /* List the new values */
3345         list_weapon(o2_ptr, row, 40);
3346         compare_weapon_aux1(o2_ptr, 40, row + 8);
3347
3348         /* Copy back the original weapon into the weapon slot */
3349         object_copy(i_ptr, &orig_weapon);
3350
3351         /* Reset the values for the old weapon */
3352         calc_bonuses();
3353
3354 #ifdef JP
3355 put_str("(°ìÈֹ⤤¥À¥á¡¼¥¸¤¬Å¬ÍѤµ¤ì¤Þ¤¹¡£Ê£¿ô¤ÎÇÜÂǸú²Ì¤Ï­¤·»»¤µ¤ì¤Þ¤»¤ó¡£)", row + 4, 0);
3356 #else
3357         put_str("(Only highest damage applies per monster. Special damage not cumulative.)", row + 4, 0);
3358 #endif
3359
3360 #ifdef JP
3361 msg_print("¸½ºß¤Îµ»Î̤«¤éȽÃǤ¹¤ë¤È¡¢¤¢¤Ê¤¿¤ÎÉð´ï¤Ï°Ê²¼¤Î¤è¤¦¤Ê°ÒÎϤòȯ´ø¤·¤Þ¤¹:");
3362 #else
3363         msg_print("Based on your current abilities, here is what your weapons will do");
3364 #endif
3365
3366
3367         flush();
3368         (void)inkey();
3369         screen_load();
3370
3371         /* Done */
3372         return (TRUE);
3373 }
3374
3375
3376 /*
3377  * Enchant item
3378  */
3379 static bool enchant_item(int cost, int to_hit, int to_dam, int to_ac)
3380 {
3381         int         i, item;
3382         bool        okay = FALSE;
3383         object_type *o_ptr;
3384         cptr        q, s;
3385         int         maxenchant = (p_ptr->lev / 5);
3386         char        tmp_str[MAX_NLEN];
3387
3388
3389         clear_bldg(4, 18);
3390 #ifdef JP
3391 prt(format("¸½ºß¤Î¤¢¤Ê¤¿¤Îµ»Î̤À¤È¡¢+%d ¤Þ¤Ç²þÎɤǤ­¤Þ¤¹¡£", maxenchant), 5, 0);
3392 prt(format(" ²þÎɤÎÎÁ¶â¤Ï°ì¸Ä¤Ë¤Ä¤­¡ð%d ¤Ç¤¹¡£", cost), 7, 0);
3393 #else
3394         prt(format("  Based on your skill, we can improve up to +%d.", maxenchant), 5, 0);
3395         prt(format("  The price for the service is %d gold per item.", cost), 7, 0);
3396 #endif
3397
3398         item_tester_no_ryoute = TRUE;
3399
3400         /* Get an item */
3401 #ifdef JP
3402 q = "¤É¤Î¥¢¥¤¥Æ¥à¤ò²þÎɤ·¤Þ¤¹¤«¡©";
3403 s = "²þÎɤǤ­¤ë¤â¤Î¤¬¤¢¤ê¤Þ¤»¤ó¡£";
3404 #else
3405         q = "Improve which item? ";
3406         s = "You have nothing to improve.";
3407 #endif
3408
3409         if (!get_item(&item, q, s, (USE_INVEN | USE_EQUIP))) return (FALSE);
3410
3411         /* Get the item (in the pack) */
3412         o_ptr = &inventory[item];
3413
3414         /* Check if the player has enough money */
3415         if (p_ptr->au < (cost * o_ptr->number))
3416         {
3417                 object_desc(tmp_str, o_ptr, TRUE, 0);
3418 #ifdef JP
3419 msg_format("%s¤ò²þÎɤ¹¤ë¤À¤±¤Î¥´¡¼¥ë¥É¤¬¤¢¤ê¤Þ¤»¤ó¡ª", tmp_str);
3420 #else
3421                 msg_format("You do not have the gold to improve %s!", tmp_str);
3422 #endif
3423
3424                 return (FALSE);
3425         }
3426
3427         /* Enchant to hit */
3428         for (i = 0; i < to_hit; i++)
3429         {
3430                 if (o_ptr->to_h < maxenchant)
3431                 {
3432                         if (enchant(o_ptr, 1, (ENCH_TOHIT | ENCH_FORCE)))
3433                         {
3434                                 okay = TRUE;
3435                                 break;
3436                         }
3437                 }
3438         }
3439
3440         /* Enchant to damage */
3441         for (i = 0; i < to_dam; i++)
3442         {
3443                 if (o_ptr->to_d < maxenchant)
3444                 {
3445                         if (enchant(o_ptr, 1, (ENCH_TODAM | ENCH_FORCE)))
3446                         {
3447                                 okay = TRUE;
3448                                 break;
3449                         }
3450                 }
3451         }
3452
3453         /* Enchant to AC */
3454         for (i = 0; i < to_ac; i++)
3455         {
3456                 if (o_ptr->to_a < maxenchant)
3457                 {
3458                         if (enchant(o_ptr, 1, (ENCH_TOAC | ENCH_FORCE)))
3459                         {
3460                                 okay = TRUE;
3461                                 break;
3462                         }
3463                 }
3464         }
3465
3466         /* Failure */
3467         if (!okay)
3468         {
3469                 /* Flush */
3470                 if (flush_failure) flush();
3471
3472                 /* Message */
3473 #ifdef JP
3474 msg_print("²þÎɤ˼ºÇÔ¤·¤¿¡£");
3475 #else
3476                 msg_print("The improvement failed.");
3477 #endif
3478
3479
3480                 return (FALSE);
3481         }
3482         else
3483         {
3484                 object_desc(tmp_str, o_ptr, TRUE, 1);
3485 #ifdef JP
3486 msg_format("¡ð%d ¤Ç%s¤ò²þÎɤ·¤Þ¤·¤¿¡£", cost * o_ptr->number, tmp_str );
3487 #else
3488                 msg_format("Improved %s for %d gold.", tmp_str, cost * o_ptr->number);
3489 #endif
3490
3491                 /* Charge the money */
3492                 p_ptr->au -= (cost * o_ptr->number);
3493
3494                 if (item >= INVEN_RARM) calc_android_exp();
3495
3496                 /* Something happened */
3497                 return (TRUE);
3498         }
3499 }
3500
3501
3502 /*
3503  * Recharge rods, wands and staves
3504  *
3505  * The player can select the number of charges to add
3506  * (up to a limit), and the recharge never fails.
3507  *
3508  * The cost for rods depends on the level of the rod. The prices
3509  * for recharging wands and staves are dependent on the cost of
3510  * the base-item.
3511  */
3512 static void building_recharge(void)
3513 {
3514         int         item, lev;
3515         object_type *o_ptr;
3516         object_kind *k_ptr;
3517         cptr        q, s;
3518         int         price;
3519         int         charges;
3520         int         max_charges;
3521         char        tmp_str[MAX_NLEN];
3522
3523         msg_flag = FALSE;
3524
3525         /* Display some info */
3526         clear_bldg(4, 18);
3527 #ifdef JP
3528 prt("  ºÆ½¼Å¶¤ÎÈñÍѤϥ¢¥¤¥Æ¥à¤Î¼ïÎà¤Ë¤è¤ê¤Þ¤¹¡£", 6, 0);
3529 #else
3530         prt("  The prices of recharge depend on the type.", 6, 0);
3531 #endif
3532
3533
3534         /* Only accept legal items */
3535         item_tester_hook = item_tester_hook_recharge;
3536
3537         /* Get an item */
3538 #ifdef JP
3539 q = "¤É¤Î¥¢¥¤¥Æ¥à¤ËËâÎϤò½¼Å¶¤·¤Þ¤¹¤«? ";
3540 s = "ËâÎϤò½¼Å¶¤¹¤Ù¤­¥¢¥¤¥Æ¥à¤¬¤Ê¤¤¡£";
3541 #else
3542         q = "Recharge which item? ";
3543         s = "You have nothing to recharge.";
3544 #endif
3545
3546         if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return;
3547
3548         /* Get the item (in the pack) */
3549         if (item >= 0)
3550         {
3551                 o_ptr = &inventory[item];
3552         }
3553
3554         /* Get the item (on the floor) */
3555         else
3556         {
3557                 o_ptr = &o_list[0 - item];
3558         }
3559
3560         k_ptr = &k_info[o_ptr->k_idx];
3561
3562         /*
3563          * We don't want to give the player free info about
3564          * the level of the item or the number of charges.
3565          */
3566         /* The item must be "known" */
3567         if (!object_known_p(o_ptr))
3568         {
3569 #ifdef JP
3570 msg_format("½¼Å¶¤¹¤ëÁ°¤Ë´ÕÄꤵ¤ì¤Æ¤¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡ª");
3571 #else
3572                 msg_format("The item must be identified first!");
3573 #endif
3574
3575                 msg_print(NULL);
3576
3577                 if ((p_ptr->au >= 50) &&
3578 #ifdef JP
3579 get_check("¡ð50¤Ç´ÕÄꤷ¤Þ¤¹¤«¡© "))
3580 #else
3581                         get_check("Identify for 50 gold? "))
3582 #endif
3583
3584                 {
3585                         /* Pay the price */
3586                         p_ptr->au -= 50;
3587
3588                         /* Identify it */
3589                         identify_item(o_ptr);
3590
3591                         /* Description */
3592                         object_desc(tmp_str, o_ptr, TRUE, 3);
3593
3594 #ifdef JP
3595 msg_format("%s ¤Ç¤¹¡£", tmp_str);
3596 #else
3597                         msg_format("You have: %s.", tmp_str);
3598 #endif
3599
3600
3601                         /* Update the gold display */
3602                         building_prt_gold();
3603                 }
3604                 else
3605                 {
3606                         return;
3607                 }
3608         }
3609
3610         /* Extract the object "level" */
3611         lev = get_object_level(o_ptr);
3612
3613         /* Price for a rod */
3614         if (o_ptr->tval == TV_ROD)
3615         {
3616                 if (o_ptr->timeout > 0)
3617                 {
3618                         /* Fully recharge */
3619                         price = (lev * 50 * o_ptr->timeout) / k_ptr->pval;
3620                 }
3621                 else
3622                 {
3623                         /* No recharge necessary */
3624                         price = 0;
3625 #ifdef JP
3626 msg_format("¤½¤ì¤ÏºÆ½¼Å¶¤¹¤ëɬÍפϤ¢¤ê¤Þ¤»¤ó¡£");
3627 #else
3628                         msg_format("That doesn't need to be recharged.");
3629 #endif
3630
3631                         return;
3632                 }
3633         }
3634         else if (o_ptr->tval == TV_STAFF)
3635         {
3636                 /* Price per charge ( = double the price paid by shopkeepers for the charge) */
3637                 price = (get_object_cost(o_ptr) / 10) * o_ptr->number;
3638
3639                 /* Pay at least 10 gold per charge */
3640                 price = MAX(10, price);
3641         }
3642         else
3643         {
3644                 /* Price per charge ( = double the price paid by shopkeepers for the charge) */
3645                 price = (get_object_cost(o_ptr) / 10);
3646
3647                 /* Pay at least 10 gold per charge */
3648                 price = MAX(10, price);
3649         }
3650
3651         /* Limit the number of charges for wands and staffs */
3652         if (o_ptr->tval == TV_WAND
3653                 && (o_ptr->pval / o_ptr->number >= k_ptr->pval))
3654         {
3655                 if (o_ptr->number > 1)
3656                 {
3657 #ifdef JP
3658 msg_print("¤³¤ÎËâË¡ËÀ¤Ï¤â¤¦½¼Ê¬¤Ë½¼Å¶¤µ¤ì¤Æ¤¤¤Þ¤¹¡£");
3659 #else
3660                         msg_print("These wands are already fully charged.");
3661 #endif
3662                 }
3663                 else
3664                 {
3665 #ifdef JP
3666 msg_print("¤³¤ÎËâË¡ËÀ¤Ï¤â¤¦½¼Ê¬¤Ë½¼Å¶¤µ¤ì¤Æ¤¤¤Þ¤¹¡£");
3667 #else
3668                         msg_print("This wand is already fully charged.");
3669 #endif
3670                 }
3671                 return;
3672         }
3673         else if (o_ptr->tval == TV_STAFF && o_ptr->pval >= k_ptr->pval)
3674         {
3675                 if (o_ptr->number > 1)
3676                 {
3677 #ifdef JP
3678 msg_print("¤³¤Î¾ó¤Ï¤â¤¦½¼Ê¬¤Ë½¼Å¶¤µ¤ì¤Æ¤¤¤Þ¤¹¡£");
3679 #else
3680                         msg_print("These staffs are already fully charged.");
3681 #endif
3682                 }
3683                 else
3684                 {
3685 #ifdef JP
3686 msg_print("¤³¤Î¾ó¤Ï¤â¤¦½¼Ê¬¤Ë½¼Å¶¤µ¤ì¤Æ¤¤¤Þ¤¹¡£");
3687 #else
3688                         msg_print("This staff is already fully charged.");
3689 #endif
3690                 }
3691                 return;
3692         }
3693
3694         /* Check if the player has enough money */
3695         if (p_ptr->au < price)
3696         {
3697                 object_desc(tmp_str, o_ptr, TRUE, 0);
3698 #ifdef JP
3699 msg_format("%s¤òºÆ½¼Å¶¤¹¤ë¤Ë¤Ï¡ð%d É¬ÍפǤ¹¡ª", tmp_str,price );
3700 #else
3701                 msg_format("You need %d gold to recharge %s!", price, tmp_str);
3702 #endif
3703
3704                 return;
3705         }
3706
3707         if (o_ptr->tval == TV_ROD)
3708         {
3709 #ifdef JP
3710 if (get_check(format("¤½¤Î¥í¥Ã¥É¤ò¡ð%d ¤ÇºÆ½¼Å¶¤·¤Þ¤¹¤«¡©",
3711  price)))
3712 #else
3713                 if (get_check(format("Recharge the %s for %d gold? ",
3714                         ((o_ptr->number > 1) ? "rods" : "rod"), price)))
3715 #endif
3716
3717                 {
3718                         /* Recharge fully */
3719                         o_ptr->timeout = 0;
3720                 }
3721                 else
3722                 {
3723                         return;
3724                 }
3725         }
3726         else
3727         {
3728                 if (o_ptr->tval == TV_STAFF)
3729                         max_charges = k_ptr->pval - o_ptr->pval;
3730                 else
3731                         max_charges = o_ptr->number * k_ptr->pval - o_ptr->pval;
3732
3733                 /* Get the quantity for staves and wands */
3734 #ifdef JP
3735 charges = get_quantity(format("°ì²óʬ¡ð%d ¤Ç²¿²óʬ½¼Å¶¤·¤Þ¤¹¤«¡©",
3736 #else
3737                 charges = get_quantity(format("Add how many charges for %d gold? ",
3738 #endif
3739
3740                               price), MIN(p_ptr->au / price, max_charges));
3741
3742                 /* Do nothing */
3743                 if (charges < 1) return;
3744
3745                 /* Get the new price */
3746                 price *= charges;
3747
3748                 /* Recharge */
3749                 o_ptr->pval += charges;
3750
3751                 /* We no longer think the item is empty */
3752                 o_ptr->ident &= ~(IDENT_EMPTY);
3753         }
3754
3755         /* Give feedback */
3756         object_desc(tmp_str, o_ptr, TRUE, 3);
3757 #ifdef JP
3758 msg_format("%s¤ò¡ð%d ¤ÇºÆ½¼Å¶¤·¤Þ¤·¤¿¡£", tmp_str, price);
3759 #else
3760         msg_format("%^s %s recharged for %d gold.", tmp_str, ((o_ptr->number > 1) ? "were" : "was"), price);
3761 #endif
3762
3763         /* Combine / Reorder the pack (later) */
3764         p_ptr->notice |= (PN_COMBINE | PN_REORDER);
3765
3766         /* Window stuff */
3767         p_ptr->window |= (PW_INVEN);
3768
3769         /* Pay the price */
3770         p_ptr->au -= price;
3771
3772         /* Finished */
3773         return;
3774 }
3775
3776
3777 /*
3778  * Recharge rods, wands and staves
3779  *
3780  * The player can select the number of charges to add
3781  * (up to a limit), and the recharge never fails.
3782  *
3783  * The cost for rods depends on the level of the rod. The prices
3784  * for recharging wands and staves are dependent on the cost of
3785  * the base-item.
3786  */
3787 static void building_recharge_all(void)
3788 {
3789         int         i;
3790         int         lev;
3791         object_type *o_ptr;
3792         object_kind *k_ptr;
3793         int         price = 0;
3794         int         total_cost = 0;
3795
3796
3797         /* Display some info */
3798         msg_flag = FALSE;
3799         clear_bldg(4, 18);
3800 #ifdef JP
3801         prt("  ºÆ½¼Å¶¤ÎÈñÍѤϥ¢¥¤¥Æ¥à¤Î¼ïÎà¤Ë¤è¤ê¤Þ¤¹¡£", 6, 0);
3802 #else
3803         prt("  The prices of recharge depend on the type.", 6, 0);
3804 #endif
3805
3806         /* Calculate cost */
3807         for ( i = 0; i < INVEN_PACK; i++)
3808         {
3809                 o_ptr = &inventory[i];
3810                                 
3811                 /* skip non magic device */
3812                 if (o_ptr->tval < TV_STAFF || o_ptr->tval > TV_ROD) continue;
3813
3814                 /* need identified */
3815                 if (!object_known_p(o_ptr)) total_cost += 50;
3816
3817                 /* Extract the object "level" */
3818                 lev = get_object_level(o_ptr);
3819
3820                 k_ptr = &k_info[o_ptr->k_idx];
3821
3822                 switch (o_ptr->tval)
3823                 {
3824                 case TV_ROD:
3825                         price = (lev * 50 * o_ptr->timeout) / k_ptr->pval;
3826                         break;
3827
3828                 case TV_STAFF:
3829                         /* Price per charge ( = double the price paid by shopkeepers for the charge) */
3830                         price = (get_object_cost(o_ptr) / 10) * o_ptr->number;
3831
3832                         /* Pay at least 10 gold per charge */
3833                         price = MAX(10, price);
3834
3835                         /* Fully charge */
3836                         price = (k_ptr->pval - o_ptr->pval) * price;
3837                         break;
3838
3839                 case TV_WAND:
3840                         /* Price per charge ( = double the price paid by shopkeepers for the charge) */
3841                         price = (get_object_cost(o_ptr) / 10);
3842
3843                         /* Pay at least 10 gold per charge */
3844                         price = MAX(10, price);
3845
3846                         /* Fully charge */
3847                         price = (o_ptr->number * k_ptr->pval - o_ptr->pval) * price;
3848                         break;
3849                 }
3850
3851                 /* if price <= 0 then item have enough charge */
3852                 if (price > 0) total_cost += price;
3853         }
3854
3855         if (!total_cost)
3856         {
3857 #ifdef JP
3858                 msg_print("½¼Å¶¤¹¤ëɬÍפϤ¢¤ê¤Þ¤»¤ó¡£");
3859 #else
3860                 msg_print("No need to recharge.");
3861 #endif
3862
3863                 msg_print(NULL);
3864                 return;
3865         }
3866
3867         /* Check if the player has enough money */
3868         if (p_ptr->au < total_cost)
3869         {
3870 #ifdef JP
3871                 msg_format("¤¹¤Ù¤Æ¤Î¥¢¥¤¥Æ¥à¤òºÆ½¼Å¶¤¹¤ë¤Ë¤Ï¡ð%d É¬ÍפǤ¹¡ª", total_cost );
3872 #else
3873                 msg_format("You need %d gold to recharge all items!",total_cost);
3874 #endif
3875
3876                 msg_print(NULL);
3877                 return;
3878         }
3879
3880 #ifdef JP
3881         if (!get_check(format("¤¹¤Ù¤Æ¤Î¥¢¥¤¥Æ¥à¤ò ¡ð%d ¤ÇºÆ½¼Å¶¤·¤Þ¤¹¤«¡©",  total_cost))) return;
3882 #else
3883         if (!get_check(format("Recharge all items for %d gold? ", total_cost))) return;
3884 #endif
3885
3886         for (i = 0; i < INVEN_PACK; i++)
3887         {
3888                 o_ptr = &inventory[i];
3889                 k_ptr = &k_info[o_ptr->k_idx];
3890                                 
3891                 /* skip non magic device */
3892                 if (o_ptr->tval < TV_STAFF || o_ptr->tval > TV_ROD) continue;
3893
3894                 /* Identify it */
3895                 if (!object_known_p(o_ptr)) identify_item(o_ptr);
3896
3897                 /* Recharge */
3898                 switch (o_ptr->tval)
3899                 {
3900                 case TV_ROD:
3901                         o_ptr->timeout = 0;
3902                         break;
3903                 case TV_STAFF:
3904                         if (o_ptr->pval < k_ptr->pval) o_ptr->pval = k_ptr->pval;
3905                         /* We no longer think the item is empty */
3906                         o_ptr->ident &= ~(IDENT_EMPTY);
3907                         break;
3908                 case TV_WAND:
3909                         if (o_ptr->pval < o_ptr->number * k_ptr->pval)
3910                                 o_ptr->pval = o_ptr->number * k_ptr->pval;
3911                         /* We no longer think the item is empty */
3912                         o_ptr->ident &= ~(IDENT_EMPTY);
3913                         break;
3914                 }
3915         }
3916
3917         /* Give feedback */
3918 #ifdef JP
3919         msg_format("¡ð%d ¤ÇºÆ½¼Å¶¤·¤Þ¤·¤¿¡£", total_cost);
3920 #else
3921         msg_format("You pay %d gold.", total_cost);
3922 #endif
3923
3924         msg_print(NULL);
3925
3926         /* Combine / Reorder the pack (later) */
3927         p_ptr->notice |= (PN_COMBINE | PN_REORDER);
3928
3929         /* Window stuff */
3930         p_ptr->window |= (PW_INVEN);
3931
3932         /* Pay the price */
3933         p_ptr->au -= total_cost;
3934
3935         /* Finished */
3936         return;
3937 }
3938
3939
3940 bool tele_town(void)
3941 {
3942         int i, x, y;
3943         int num = 0;
3944
3945         if (dun_level)
3946         {
3947 #ifdef JP
3948                 msg_print("¤³¤ÎËâË¡¤ÏÃϾå¤Ç¤·¤«»È¤¨¤Ê¤¤¡ª");
3949 #else
3950                 msg_print("This spell can only be used on the surface!");
3951 #endif
3952                 return FALSE;
3953         }
3954
3955         if (p_ptr->inside_arena || p_ptr->inside_battle)
3956         {
3957 #ifdef JP
3958                 msg_print("¤³¤ÎËâË¡¤Ï³°¤Ç¤·¤«»È¤¨¤Ê¤¤¡ª");
3959 #else
3960                 msg_print("This spell can only be used outside!");
3961 #endif
3962                 return FALSE;
3963         }
3964
3965         screen_save();
3966         clear_bldg(4, 10);
3967
3968         for (i=1;i<max_towns;i++)
3969         {
3970                 char buf[80];
3971
3972                 if ((i == NO_TOWN) || (i == SECRET_TOWN) || (i == p_ptr->town_num) || !(p_ptr->visit & (1L << (i-1)))) continue;
3973
3974                 sprintf(buf,"%c) %-20s", I2A(i-1), town[i].name);
3975                 prt(buf, 5+i, 5);
3976                 num++;
3977         }
3978
3979         if (!num)
3980         {
3981 #ifdef JP
3982                 msg_print("¤Þ¤À¹Ô¤±¤ë¤È¤³¤í¤¬¤Ê¤¤¡£");
3983 #else
3984                 msg_print("You have not yet visited any town.");
3985 #endif
3986
3987                 msg_print(NULL);
3988                 screen_load();
3989                 return FALSE;
3990         }
3991
3992 #ifdef JP
3993         prt("¤É¤³¤Ë¹Ô¤­¤Þ¤¹¤«:", 0, 0);
3994 #else
3995         prt("Which town you go: ", 0, 0);
3996 #endif
3997         while(1)
3998         {
3999                 i = inkey();
4000
4001                 if (i == ESCAPE)
4002                 {
4003                         screen_load();
4004                         return FALSE;
4005                 }
4006                 else if ((i < 'a') || (i > ('a'+max_towns-2))) continue;
4007                 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;
4008                 break;
4009         }
4010
4011         for (y = 0; y < max_wild_y; y++)
4012         {
4013                 for (x = 0; x < max_wild_x; x++)
4014                 {
4015                         if(wilderness[y][x].town == (i-'a'+1))
4016                         {
4017                                 p_ptr->wilderness_y = y;
4018                                 p_ptr->wilderness_x = x;
4019                         }
4020                 }
4021         }
4022         p_ptr->leftbldg = TRUE;
4023         p_ptr->leaving = TRUE;
4024         leave_bldg = TRUE;
4025         p_ptr->teleport_town = TRUE;
4026         screen_load();
4027         return TRUE;
4028 }
4029
4030
4031 /*
4032  * Execute a building command
4033  */
4034 static void bldg_process_command(building_type *bldg, int i)
4035 {
4036         int bact = bldg->actions[i];
4037         int bcost;
4038         bool paid = FALSE;
4039         bool set_reward = FALSE;
4040         int amt;
4041
4042         /* Flush messages XXX XXX XXX */
4043         msg_flag = FALSE;
4044         msg_print(NULL);
4045
4046         if (is_owner(bldg))
4047                 bcost = bldg->member_costs[i];
4048         else
4049                 bcost = bldg->other_costs[i];
4050
4051         /* action restrictions */
4052         if (((bldg->action_restr[i] == 1) && !is_member(bldg)) ||
4053             ((bldg->action_restr[i] == 2) && !is_owner(bldg)))
4054         {
4055 #ifdef JP
4056 msg_print("¤½¤ì¤òÁªÂò¤¹¤ë¸¢Íø¤Ï¤¢¤ê¤Þ¤»¤ó¡ª");
4057 #else
4058                 msg_print("You have no right to choose that!");
4059 #endif
4060                 return;
4061         }
4062
4063         /* check gold (HACK - Recharge uses variable costs) */
4064         if ((bact != BACT_RECHARGE) &&
4065             (((bldg->member_costs[i] > p_ptr->au) && is_owner(bldg)) ||
4066              ((bldg->other_costs[i] > p_ptr->au) && !is_owner(bldg))))
4067         {
4068 #ifdef JP
4069 msg_print("¤ª¶â¤¬Â­¤ê¤Þ¤»¤ó¡ª");
4070 #else
4071                 msg_print("You do not have the gold!");
4072 #endif
4073                 return;
4074         }
4075
4076         if (!bcost) set_reward = TRUE;
4077
4078         switch (bact)
4079         {
4080         case BACT_NOTHING:
4081                                 /* Do nothing */
4082                 break;
4083         case BACT_RESEARCH_ITEM:
4084                 paid = identify_fully(FALSE);
4085                 break;
4086         case BACT_TOWN_HISTORY:
4087                 town_history();
4088                 break;
4089         case BACT_RACE_LEGENDS:
4090                 race_legends();
4091                 break;
4092         case BACT_QUEST:
4093                 castle_quest();
4094                 break;
4095         case BACT_KING_LEGENDS:
4096         case BACT_ARENA_LEGENDS:
4097         case BACT_LEGENDS:
4098                 show_highclass(building_loc);
4099                 break;
4100         case BACT_POSTER:
4101         case BACT_ARENA_RULES:
4102         case BACT_ARENA:
4103                 arena_comm(bact);
4104                 break;
4105         case BACT_IN_BETWEEN:
4106         case BACT_CRAPS:
4107         case BACT_SPIN_WHEEL:
4108         case BACT_DICE_SLOTS:
4109         case BACT_GAMBLE_RULES:
4110         case BACT_POKER:
4111                 gamble_comm(bact);
4112                 break;
4113         case BACT_REST:
4114         case BACT_RUMORS:
4115         case BACT_FOOD:
4116                 paid = inn_comm(bact);
4117                 break;
4118         case BACT_RESEARCH_MONSTER:
4119                 paid = research_mon();
4120                 break;
4121         case BACT_COMPARE_WEAPONS:
4122                 paid = compare_weapons();
4123                 break;
4124         case BACT_ENCHANT_WEAPON:
4125                 item_tester_hook = item_tester_hook_melee_weapon;
4126                 enchant_item(bcost, 1, 1, 0);
4127                 break;
4128         case BACT_ENCHANT_ARMOR:
4129                 item_tester_hook = item_tester_hook_armour;
4130                 enchant_item(bcost, 0, 0, 1);
4131                 break;
4132         case BACT_RECHARGE:
4133                 building_recharge();
4134                 break;
4135         case BACT_RECHARGE_ALL:
4136                 building_recharge_all();
4137                 break;
4138         case BACT_IDENTS: /* needs work */
4139 #ifdef JP
4140                 if (!get_check("»ý¤Áʪ¤òÁ´¤Æ´ÕÄꤷ¤Æ¤è¤í¤·¤¤¤Ç¤¹¤«¡©")) break;
4141                 identify_pack();
4142                 msg_print(" »ý¤ÁʪÁ´¤Æ¤¬´ÕÄꤵ¤ì¤Þ¤·¤¿¡£");
4143 #else
4144                 if (!get_check("Do you pay for identify all your possession? ")) break;
4145                 identify_pack();
4146                 msg_print("Your possessions have been identified.");
4147 #endif
4148
4149                 paid = TRUE;
4150                 break;
4151         case BACT_IDENT_ONE: /* needs work */
4152                 paid = ident_spell(FALSE);
4153                 break;
4154         case BACT_LEARN:
4155                 do_cmd_study();
4156                 break;
4157         case BACT_HEALING: /* needs work */
4158                 hp_player(200);
4159                 set_poisoned(0);
4160                 set_blind(0);
4161                 set_confused(0);
4162                 set_cut(0);
4163                 set_stun(0);
4164                 paid = TRUE;
4165                 break;
4166         case BACT_RESTORE: /* needs work */
4167                 if (do_res_stat(A_STR)) paid = TRUE;
4168                 if (do_res_stat(A_INT)) paid = TRUE;
4169                 if (do_res_stat(A_WIS)) paid = TRUE;
4170                 if (do_res_stat(A_DEX)) paid = TRUE;
4171                 if (do_res_stat(A_CON)) paid = TRUE;
4172                 if (do_res_stat(A_CHR)) paid = TRUE;
4173                 break;
4174         case BACT_GOLD: /* set timed reward flag */
4175                 if (!p_ptr->rewards[BACT_GOLD])
4176                 {
4177                         share_gold();
4178                         p_ptr->rewards[BACT_GOLD] = TRUE;
4179                 }
4180                 else
4181                 {
4182 #ifdef JP
4183                         msg_print("º£Æü¤Îʬ¤±Á°¤Ï¤¹¤Ç¤Ë»Ùʧ¤Ã¤¿¤¾¡ª");
4184 #else
4185                         msg_print("You just had your daily allowance!");
4186 #endif
4187                 }
4188                 break;
4189         case BACT_ENCHANT_ARROWS:
4190                 item_tester_hook = item_tester_hook_ammo;
4191                 enchant_item(bcost, 1, 1, 0);
4192                 break;
4193         case BACT_ENCHANT_BOW:
4194                 item_tester_tval = TV_BOW;
4195                 enchant_item(bcost, 1, 1, 0);
4196                 break;
4197         case BACT_RECALL:
4198                 if (recall_player(1)) paid = TRUE;
4199                 break;
4200         case BACT_TELEPORT_LEVEL:
4201         {
4202                 int select_dungeon;
4203                 int i, num = 0;
4204                 s16b *dun;
4205                 int max_depth;
4206
4207                 /* Allocate the "dun" array */
4208                 C_MAKE(dun, max_d_idx, s16b);
4209
4210                 screen_save();
4211                 clear_bldg(4, 20);
4212
4213                 for(i = 1; i < max_d_idx; i++)
4214                 {
4215                         char buf[80];
4216                         bool seiha = FALSE;
4217
4218                         if (!d_info[i].maxdepth) continue;
4219                         if (!max_dlv[i]) continue;
4220                         if (d_info[i].final_guardian)
4221                         {
4222                                 if (!r_info[d_info[i].final_guardian].max_num) seiha = TRUE;
4223                         }
4224                         else if (max_dlv[i] == d_info[i].maxdepth) seiha = TRUE;
4225
4226 #ifdef JP
4227                         sprintf(buf,"%c) %c%-12s : ºÇÂç %d ³¬", 'a'+num, seiha ? '!' : ' ', d_name + d_info[i].name, max_dlv[i]);
4228 #else
4229                         sprintf(buf,"%c) %c%-12s : Max level %d", 'a'+num, seiha ? '!' : ' ', d_name + d_info[i].name, max_dlv[i]);
4230 #endif
4231                         put_str(buf, 4+num, 5);
4232                         dun[num] = i;
4233                         num++;
4234                 }
4235 #ifdef JP
4236                 prt("¤É¤Î¥À¥ó¥¸¥ç¥ó¤Ë¥Æ¥ì¥Ý¡¼¥È¤·¤Þ¤¹¤«:", 0, 0);
4237 #else
4238                 prt("Which dungeon do you teleport?: ", 0, 0);
4239 #endif
4240                 while(1)
4241                 {
4242                         i = inkey();
4243
4244                         if (i == ESCAPE)
4245                         {
4246                                 /* Free the "dun" array */
4247                                 C_KILL(dun, max_d_idx, s16b);
4248
4249                                 screen_load();
4250                                 return;
4251                         }
4252                         if (i >= 'a' && i <('a'+num))
4253                         {
4254                                 select_dungeon = dun[i-'a'];
4255                                 break;
4256                         }
4257                         else bell();
4258                 }
4259                 screen_load();
4260
4261                 /* Free the "dun" array */
4262                 C_KILL(dun, max_d_idx, s16b);
4263
4264                 max_depth = d_info[select_dungeon].maxdepth;
4265
4266                 /* Limit depth in Angband */
4267                 if (select_dungeon == DUNGEON_ANGBAND)
4268                 {
4269                         if (quest[QUEST_OBERON].status != QUEST_STATUS_FINISHED) max_depth = 98;
4270                         else if(quest[QUEST_SERPENT].status != QUEST_STATUS_FINISHED) max_depth = 99;
4271                 }
4272
4273 #ifdef JP
4274                 amt = get_quantity(format("%s¤Î²¿³¬¤Ë¥Æ¥ì¥Ý¡¼¥È¤·¤Þ¤¹¤«¡©", d_name + d_info[select_dungeon].name), max_depth);
4275 #else
4276                 amt = get_quantity(format("Teleport to which level of %s? ", d_name + d_info[select_dungeon].name), max_depth);
4277 #endif
4278
4279                 if (amt > 0)
4280                 {
4281                         p_ptr->word_recall = 1;
4282                         p_ptr->recall_dungeon = select_dungeon;
4283                         max_dlv[p_ptr->recall_dungeon] = ((amt > d_info[select_dungeon].maxdepth) ? d_info[select_dungeon].maxdepth : ((amt < d_info[select_dungeon].mindepth) ? d_info[select_dungeon].mindepth : amt));
4284                         if (record_maxdeapth)
4285 #ifdef JP
4286                                 do_cmd_write_nikki(NIKKI_TRUMP, select_dungeon, "¥È¥é¥ó¥×¥¿¥ï¡¼¤Ç");
4287 #else
4288                         do_cmd_write_nikki(NIKKI_TRUMP, select_dungeon, "at Trump Tower");
4289 #endif
4290 #ifdef JP
4291                         msg_print("²ó¤ê¤ÎÂ絤¤¬Ä¥¤ê¤Ä¤á¤Æ¤­¤¿...");
4292 #else
4293                         msg_print("The air about you becomes charged...");
4294 #endif
4295
4296                         paid = TRUE;
4297                         p_ptr->redraw |= (PR_STATUS);
4298                 }
4299                 break;
4300         }
4301         case BACT_LOSE_MUTATION:
4302                 paid = lose_mutation(0);
4303                 /* ToDo: Better message text. */
4304                 if (!paid)
4305 #ifdef JP
4306                         msg_print("´ñ̯¤Ê¤¯¤é¤¤ÉáÄ̤ˤʤ俵¤¤¬¤¹¤ë¡£");
4307 #else
4308                 msg_print("You feel oddly normal.");
4309 #endif
4310
4311
4312                 break;
4313         case BACT_BATTLE:
4314                 kakutoujou();
4315                 break;
4316         case BACT_TSUCHINOKO:
4317                 tsuchinoko();
4318                 break;
4319         case BACT_KUBI:
4320                 shoukinkubi();
4321                 break;
4322         case BACT_TARGET:
4323                 today_target();
4324                 break;
4325         case BACT_KANKIN:
4326                 kankin();
4327                 break;
4328         case BACT_HEIKOUKA:
4329 #ifdef JP
4330                 msg_print("Ê¿¹Õ²½¤Îµ·¼°¤ò¹Ô¤Ê¤Ã¤¿¡£");
4331 #else
4332                 msg_print("You received an equalization ritual.");
4333 #endif
4334                 set_virtue(V_COMPASSION, 0);
4335                 set_virtue(V_HONOUR, 0);
4336                 set_virtue(V_JUSTICE, 0);
4337                 set_virtue(V_SACRIFICE, 0);
4338                 set_virtue(V_KNOWLEDGE, 0);
4339                 set_virtue(V_FAITH, 0);
4340                 set_virtue(V_ENLIGHTEN, 0);
4341                 set_virtue(V_ENCHANT, 0);
4342                 set_virtue(V_CHANCE, 0);
4343                 set_virtue(V_NATURE, 0);
4344                 set_virtue(V_HARMONY, 0);
4345                 set_virtue(V_VITALITY, 0);
4346                 set_virtue(V_UNLIFE, 0);
4347                 set_virtue(V_PATIENCE, 0);
4348                 set_virtue(V_TEMPERANCE, 0);
4349                 set_virtue(V_DILIGENCE, 0);
4350                 set_virtue(V_VALOUR, 0);
4351                 set_virtue(V_INDIVIDUALISM, 0);
4352                 get_virtues();
4353                 paid = TRUE;
4354                 break;
4355         case BACT_TELE_TOWN:
4356                 paid = tele_town();
4357                 break;
4358         }
4359
4360         if (paid)
4361         {
4362                 p_ptr->au -= bcost;
4363         }
4364 }
4365
4366
4367 /*
4368  * Enter quest level
4369  */
4370 void do_cmd_quest(void)
4371 {
4372         energy_use = 100;
4373
4374         if (cave[py][px].feat != FEAT_QUEST_ENTER)
4375         {
4376 #ifdef JP
4377 msg_print("¤³¤³¤Ë¤Ï¥¯¥¨¥¹¥È¤ÎÆþ¸ý¤Ï¤Ê¤¤¡£");
4378 #else
4379                 msg_print("You see no quest level here.");
4380 #endif
4381
4382                 return;
4383         }
4384         else
4385         {
4386 #ifdef JP
4387                 msg_print("¤³¤³¤Ë¤Ï¥¯¥¨¥¹¥È¤Ø¤ÎÆþ¸ý¤¬¤¢¤ê¤Þ¤¹¡£");
4388                 if (!get_check("¥¯¥¨¥¹¥È¤ËÆþ¤ê¤Þ¤¹¤«¡©")) return;
4389                 if ((p_ptr->pseikaku == SEIKAKU_COMBAT) || (inventory[INVEN_BOW].name1 == ART_CRIMSON))
4390                         msg_print("¡Ø¤È¤Ë¤«¤¯Æþ¤Ã¤Æ¤ß¤è¤¦¤¼¤§¡£¡Ù");
4391 #else
4392                 msg_print("There is an entry of a quest.");
4393                 if (!get_check("Do you enter? ")) return;
4394 #endif
4395
4396                 /* Player enters a new quest */
4397                 p_ptr->oldpy = 0;
4398                 p_ptr->oldpx = 0;
4399
4400                 leave_quest_check();
4401
4402                 p_ptr->inside_quest = cave[py][px].special;
4403                 if(quest[leaving_quest].type != QUEST_TYPE_RANDOM) dun_level = 1;
4404                 p_ptr->leftbldg = TRUE;
4405                 p_ptr->leaving = TRUE;
4406         }
4407 }
4408
4409
4410 /*
4411  * Do building commands
4412  */
4413 void do_cmd_bldg(void)
4414 {
4415         int             i, which;
4416         char            command;
4417         bool            validcmd;
4418         building_type   *bldg;
4419
4420
4421         energy_use = 100;
4422
4423         if (!((cave[py][px].feat >= FEAT_BLDG_HEAD) &&
4424                   (cave[py][px].feat <= FEAT_BLDG_TAIL)))
4425         {
4426 #ifdef JP
4427 msg_print("¤³¤³¤Ë¤Ï·úʪ¤Ï¤Ê¤¤¡£");
4428 #else
4429                 msg_print("You see no building here.");
4430 #endif
4431
4432                 return;
4433         }
4434
4435         which = (cave[py][px].feat - FEAT_BLDG_HEAD);
4436         building_loc = which;
4437
4438         bldg = &building[which];
4439
4440         /* Don't re-init the wilderness */
4441         reinit_wilderness = FALSE;
4442
4443         if ((which == 2) && (p_ptr->arena_number == 99))
4444         {
4445 #ifdef JP
4446 msg_print("¡ÖÇÔ¼Ô¤ËÍѤϤʤ¤¡£¡×");
4447 #else
4448                 msg_print("'There is no place for LOSER.'");
4449 #endif
4450                 return;
4451         }
4452         else if ((which == 2) && p_ptr->inside_arena && !p_ptr->exit_bldg)
4453         {
4454 #ifdef JP
4455 prt("¥²¡¼¥È¤ÏÊĤޤäƤ¤¤ë¡£¥â¥ó¥¹¥¿¡¼¤¬¤¢¤Ê¤¿¤òÂԤäƤ¤¤ë¡ª",0,0);
4456 #else
4457                 prt("The gates are closed.  The monster awaits!", 0, 0);
4458 #endif
4459
4460                 return;
4461         }
4462         else if ((which == 2) && p_ptr->inside_arena)
4463         {
4464                 p_ptr->leaving = TRUE;
4465                 p_ptr->inside_arena = FALSE;
4466         }
4467         else if (p_ptr->inside_battle)
4468         {
4469                 p_ptr->leaving = TRUE;
4470                 p_ptr->inside_battle = FALSE;
4471         }
4472         else
4473         {
4474                 p_ptr->oldpy = py;
4475                 p_ptr->oldpx = px;
4476         }
4477
4478         /* Forget the lite */
4479         forget_lite();
4480
4481         /* Forget the view */
4482         forget_view();
4483
4484         /* Hack -- Increase "icky" depth */
4485         character_icky++;
4486
4487         command_arg = 0;
4488         command_rep = 0;
4489         command_new = 0;
4490
4491         show_building(bldg);
4492         leave_bldg = FALSE;
4493
4494         while (!leave_bldg)
4495         {
4496                 validcmd = FALSE;
4497                 prt("", 1, 0);
4498
4499                 building_prt_gold();
4500
4501                 command = inkey();
4502
4503                 if (command == ESCAPE)
4504                 {
4505                         leave_bldg = TRUE;
4506                         p_ptr->inside_arena = FALSE;
4507                         p_ptr->inside_battle = FALSE;
4508                         break;
4509                 }
4510
4511                 for (i = 0; i < 8; i++)
4512                 {
4513                         if (bldg->letters[i])
4514                         {
4515                                 if (bldg->letters[i] == command)
4516                                 {
4517                                         validcmd = TRUE;
4518                                         break;
4519                                 }
4520                         }
4521                 }
4522
4523                 if (validcmd)
4524                         bldg_process_command(bldg, i);
4525
4526                 /* Notice stuff */
4527                 notice_stuff();
4528
4529                 /* Handle stuff */
4530                 handle_stuff();
4531         }
4532
4533         /* Flush messages XXX XXX XXX */
4534         msg_flag = FALSE;
4535         msg_print(NULL);
4536
4537         /* Reinit wilderness to activate quests ... */
4538         if (reinit_wilderness)
4539                 p_ptr->leaving = TRUE;
4540
4541         /* Hack -- Decrease "icky" depth */
4542         character_icky--;
4543
4544         /* Clear the screen */
4545         Term_clear();
4546
4547         /* Update the visuals */
4548         p_ptr->update |= (PU_VIEW | PU_MONSTERS | PU_BONUS | PU_LITE | PU_MON_LITE);
4549
4550         /* Redraw entire screen */
4551         p_ptr->redraw |= (PR_BASIC | PR_EXTRA | PR_EQUIPPY | PR_MAP);
4552
4553         /* Window stuff */
4554         p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
4555 }
4556
4557
4558 /* Array of places to find an inscription */
4559 static cptr find_quest[] =
4560 {
4561 #ifdef JP
4562 "¾²¤Ë¥á¥Ã¥»¡¼¥¸¤¬¹ï¤Þ¤ì¤Æ¤¤¤ë:",
4563 #else
4564         "You find the following inscription in the floor",
4565 #endif
4566
4567 #ifdef JP
4568 "Êɤ˥á¥Ã¥»¡¼¥¸¤¬¹ï¤Þ¤ì¤Æ¤¤¤ë:",
4569 #else
4570         "You see a message inscribed in the wall",
4571 #endif
4572
4573 #ifdef JP
4574 "¥á¥Ã¥»¡¼¥¸¤ò¸«¤Ä¤±¤¿:",
4575 #else
4576         "There is a sign saying",
4577 #endif
4578
4579 #ifdef JP
4580 "²¿¤«¤¬³¬Ãʤξå¤Ë½ñ¤¤¤Æ¤¢¤ë:",
4581 #else
4582         "Something is written on the staircase",
4583 #endif
4584
4585 #ifdef JP
4586 "´¬Êª¤ò¸«¤Ä¤±¤¿¡£¥á¥Ã¥»¡¼¥¸¤¬½ñ¤¤¤Æ¤¢¤ë:",
4587 #else
4588         "You find a scroll with the following message",
4589 #endif
4590
4591 };
4592
4593
4594 /*
4595  * Discover quest
4596  */
4597 void quest_discovery(int q_idx)
4598 {
4599         quest_type      *q_ptr = &quest[q_idx];
4600         monster_race    *r_ptr = &r_info[q_ptr->r_idx];
4601         int             q_num = q_ptr->max_num;
4602         char            name[80];
4603
4604         /* No quest index */
4605         if (!q_idx) return;
4606
4607         strcpy(name, (r_name + r_ptr->name));
4608
4609         msg_print(find_quest[rand_range(0, 4)]);
4610         msg_print(NULL);
4611
4612         if (q_num == 1)
4613         {
4614                 /* Unique */
4615 #ifdef JP
4616 msg_format("Ãí°Õ¤»¤è¡ª¤³¤Î³¬¤Ï%s¤Ë¤è¤Ã¤Æ¼é¤é¤ì¤Æ¤¤¤ë¡ª", name);
4617 #else
4618                 msg_format("Beware, this level is protected by %s!", name);
4619 #endif
4620
4621         }
4622         else
4623         {
4624                 /* Normal monsters */
4625 #ifdef JP
4626 msg_format("Ãí°Õ¤·¤í¡ª¤³¤Î³¬¤Ï%dÂΤÎ%s¤Ë¤è¤Ã¤Æ¼é¤é¤ì¤Æ¤¤¤ë¡ª", q_num, name);
4627 #else
4628                 plural_aux(name);
4629                 msg_format("Be warned, this level is guarded by %d %s!", q_num, name);
4630 #endif
4631
4632         }
4633 }
4634
4635
4636 /*
4637  * Hack -- Check if a level is a "quest" level
4638  */
4639 int quest_number(int level)
4640 {
4641         int i;
4642
4643         /* Check quests */
4644         if (p_ptr->inside_quest)
4645                 return (p_ptr->inside_quest);
4646
4647         for (i = 0; i < max_quests; i++)
4648         {
4649                 if (quest[i].status != QUEST_STATUS_TAKEN) continue;
4650
4651                 if ((quest[i].type == QUEST_TYPE_KILL_LEVEL) &&
4652                         !(quest[i].flags & QUEST_FLAG_PRESET) &&
4653                     (quest[i].level == level) &&
4654                     (quest[i].dungeon == dungeon_type))
4655                         return (i);
4656         }
4657
4658         /* Check for random quest */
4659         return (random_quest_number(level));
4660 }
4661
4662
4663 /*
4664  * Return the index of the random quest on this level
4665  * (or zero)
4666  */
4667 int random_quest_number(int level)
4668 {
4669         int i;
4670
4671         if (dungeon_type != DUNGEON_ANGBAND) return 0;
4672
4673         for (i = MIN_RANDOM_QUEST; i < MAX_RANDOM_QUEST + 1; i++)
4674         {
4675                 if ((quest[i].type == QUEST_TYPE_RANDOM) &&
4676                     (quest[i].status == QUEST_STATUS_TAKEN) &&
4677                     (quest[i].level == level) &&
4678                     (quest[i].dungeon == DUNGEON_ANGBAND))
4679                 {
4680                         return i;
4681                 }
4682         }
4683
4684         /* Nope */
4685         return 0;
4686 }