OSDN Git Service

Initial revision
[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 = rand_int(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()
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()
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()
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()
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()
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()
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()
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 = randint(10);
1368                                         roll2 = randint(10);
1369                                         choice = randint(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 = randint(6);
1398                                         roll2 = randint(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 = randint(6);
1424                                                         roll2 = randint(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 = rand_int(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 = randint(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 = randint(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 = randint(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 = randint(MIN(max_dl, 122))+5;
1713         if (rand_int(100) < 60)
1714         {
1715                 i = randint(MIN(max_dl, 122))+5;
1716                 mon_level = MAX(i, mon_level);
1717         }
1718         if (rand_int(100) < 30)
1719         {
1720                 i = randint(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) && rand_int(20)) break;
1910                         if (power[i] < 101) power[i] = 100 + randint(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) > 5000)
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                         c_put_str(TERM_RED,"ºÑ", y+7, 56);
2148                 else
2149                 {
2150                         sprintf(buf,"$%d", 300 * (r_ptr->level + 1));
2151                         prt(buf, y+7, 56);
2152                 }
2153                 y = (y+1) % 10;
2154                 if (!y && (i < MAX_KUBI -1))
2155                 {
2156 #ifdef JP
2157                         prt("²¿¤«¥­¡¼¤ò²¡¤·¤Æ¤¯¤À¤µ¤¤", 0, 0);
2158 #else
2159                         prt("Hit any key.", 0, 0);
2160 #endif
2161                         (void)inkey();
2162                         prt("", 0, 0);
2163                         clear_bldg(7,18);
2164                 }
2165         }
2166 }
2167
2168 static bool kankin(void)
2169 {
2170         int i, j;
2171         bool change = FALSE;
2172         char o_name[MAX_NLEN];
2173         object_type *o_ptr;
2174
2175         for (i = 0;i <= INVEN_LARM; i++)
2176         {
2177                 o_ptr = &inventory[i];
2178                 if ((o_ptr->tval == TV_CAPTURE) && (o_ptr->pval == MON_TSUCHINOKO))
2179                 {
2180                         char buf[MAX_NLEN+20];
2181                         object_desc(o_name, o_ptr, TRUE, 3);
2182 #ifdef JP
2183                         sprintf(buf, "%s ¤ò´¹¶â¤·¤Þ¤¹¤«¡©",o_name);
2184 #else
2185                         sprintf(buf, "Convert %s into maney? ",o_name);
2186 #endif
2187                         if (get_check(buf))
2188                         {
2189 #ifdef JP
2190                                 msg_format("¾Þ¶â %ld¡ð¤ò¼ê¤ËÆþ¤ì¤¿¡£", 1000000L * o_ptr->number);
2191 #else
2192                                 msg_format("You get %ldgp.", 1000000L * o_ptr->number);
2193 #endif
2194                                 p_ptr->au += 1000000L * o_ptr->number;
2195                                 p_ptr->redraw |= (PR_GOLD);
2196                                 inven_item_increase(i, -o_ptr->number);
2197                                 inven_item_describe(i);
2198                                 inven_item_optimize(i);
2199                         }
2200                         change = TRUE;
2201                 }
2202         }
2203         for (i = 0;i <= INVEN_LARM; i++)
2204         {
2205                 o_ptr = &inventory[i];
2206                 if ((o_ptr->tval == TV_CORPSE) && (o_ptr->sval == SV_CORPSE) && (o_ptr->pval == MON_TSUCHINOKO))
2207                 {
2208                         char buf[MAX_NLEN+20];
2209                         object_desc(o_name, o_ptr, TRUE, 3);
2210 #ifdef JP
2211                         sprintf(buf, "%s ¤ò´¹¶â¤·¤Þ¤¹¤«¡©",o_name);
2212 #else
2213                         sprintf(buf, "Convert %s into maney? ",o_name);
2214 #endif
2215                         if (get_check(buf))
2216                         {
2217 #ifdef JP
2218                                 msg_format("¾Þ¶â %ld¡ð¤ò¼ê¤ËÆþ¤ì¤¿¡£", 200000L * o_ptr->number);
2219 #else
2220                                 msg_format("You get %ldgp.", 200000L * o_ptr->number);
2221 #endif
2222                                 p_ptr->au += 200000L * o_ptr->number;
2223                                 p_ptr->redraw |= (PR_GOLD);
2224                                 inven_item_increase(i, -o_ptr->number);
2225                                 inven_item_describe(i);
2226                                 inven_item_optimize(i);
2227                         }
2228                         change = TRUE;
2229                 }
2230         }
2231         for (i = 0;i <= INVEN_LARM; i++)
2232         {
2233                 o_ptr = &inventory[i];
2234                 if ((o_ptr->tval == TV_CORPSE) && (o_ptr->sval == SV_SKELETON) && (o_ptr->pval == MON_TSUCHINOKO))
2235                 {
2236                         char buf[MAX_NLEN+20];
2237                         object_desc(o_name, o_ptr, TRUE, 3);
2238 #ifdef JP
2239                         sprintf(buf, "%s ¤ò´¹¶â¤·¤Þ¤¹¤«¡©",o_name);
2240 #else
2241                         sprintf(buf, "Convert %s into maney? ",o_name);
2242 #endif
2243                         if (get_check(buf))
2244                         {
2245 #ifdef JP
2246                                 msg_format("¾Þ¶â %ld¡ð¤ò¼ê¤ËÆþ¤ì¤¿¡£", 100000L * o_ptr->number);
2247 #else
2248                                 msg_format("You get %ldgp.", 100000L * o_ptr->number);
2249 #endif
2250                                 p_ptr->au += 100000L * o_ptr->number;
2251                                 p_ptr->redraw |= (PR_GOLD);
2252                                 inven_item_increase(i, -o_ptr->number);
2253                                 inven_item_describe(i);
2254                                 inven_item_optimize(i);
2255                         }
2256                         change = TRUE;
2257                 }
2258         }
2259
2260         for (i = 0;i <= INVEN_LARM; i++)
2261         {
2262                 o_ptr = &inventory[i];
2263                 if ((o_ptr->tval == TV_CORPSE) && (o_ptr->sval == SV_CORPSE) && (o_ptr->pval == today_mon))
2264                 {
2265                         char buf[MAX_NLEN+20];
2266                         object_desc(o_name, o_ptr, TRUE, 3);
2267 #ifdef JP
2268                         sprintf(buf, "%s ¤ò´¹¶â¤·¤Þ¤¹¤«¡©",o_name);
2269 #else
2270                         sprintf(buf, "Convert %s into maney? ",o_name);
2271 #endif
2272                         if (get_check(buf))
2273                         {
2274 #ifdef JP
2275                                 msg_format("¾Þ¶â %ld¡ð¤ò¼ê¤ËÆþ¤ì¤¿¡£", (r_info[today_mon].level * 50 + 100) * o_ptr->number);
2276 #else
2277                                 msg_format("You get %ldgp.", (r_info[today_mon].level * 50 + 100) * o_ptr->number);
2278 #endif
2279                                 p_ptr->au += (r_info[today_mon].level * 50 + 100) * o_ptr->number;
2280                                 p_ptr->redraw |= (PR_GOLD);
2281                                 inven_item_increase(i, -o_ptr->number);
2282                                 inven_item_describe(i);
2283                                 inven_item_optimize(i);
2284                         }
2285                         change = TRUE;
2286                 }
2287         }
2288         for (i = 0;i <= INVEN_LARM; i++)
2289         {
2290                 o_ptr = &inventory[i];
2291                 if ((o_ptr->tval == TV_CORPSE) && (o_ptr->sval == SV_SKELETON) && (o_ptr->pval == today_mon))
2292                 {
2293                         char buf[MAX_NLEN+20];
2294                         object_desc(o_name, o_ptr, TRUE, 3);
2295 #ifdef JP
2296                         sprintf(buf, "%s ¤ò´¹¶â¤·¤Þ¤¹¤«¡©",o_name);
2297 #else
2298                         sprintf(buf, "Convert %s into maney? ",o_name);
2299 #endif
2300                         if (get_check(buf))
2301                         {
2302 #ifdef JP
2303                                 msg_format("¾Þ¶â %ld¡ð¤ò¼ê¤ËÆþ¤ì¤¿¡£", (r_info[today_mon].level * 30 + 60) * o_ptr->number);
2304 #else
2305                                 msg_format("You get %ldgp.", (r_info[today_mon].level * 30 + 60) * o_ptr->number);
2306 #endif
2307                                 p_ptr->au += (r_info[today_mon].level * 30 + 60) * o_ptr->number;
2308                                 p_ptr->redraw |= (PR_GOLD);
2309                                 inven_item_increase(i, -o_ptr->number);
2310                                 inven_item_describe(i);
2311                                 inven_item_optimize(i);
2312                         }
2313                         change = TRUE;
2314                 }
2315         }
2316
2317         for (j = 0; j < MAX_KUBI; j++)
2318         {
2319                 for (i = 0;i <= INVEN_LARM; i++)
2320                 {
2321                         o_ptr = &inventory[i];
2322                         if ((o_ptr->tval == TV_CORPSE) && (o_ptr->sval == SV_CORPSE) && (o_ptr->pval == kubi_r_idx[j]))
2323                         {
2324                                 char buf[MAX_NLEN+20];
2325                                 object_desc(o_name, o_ptr, TRUE, 3);
2326 #ifdef JP
2327                                 sprintf(buf, "%s ¤ò´¹¶â¤·¤Þ¤¹¤«¡©",o_name);
2328 #else
2329                                 sprintf(buf, "Convert %s into maney? ",o_name);
2330 #endif
2331                                 if (get_check(buf))
2332                                 {
2333 #ifdef JP
2334                                         msg_format("¾Þ¶â %ld¡ð¤ò¼ê¤ËÆþ¤ì¤¿¡£", (r_info[kubi_r_idx[j]].level + 1) * 300 * o_ptr->number);
2335 #else
2336                                         msg_format("You get %ldgp.", (r_info[kubi_r_idx[j]].level + 1) * 300 * o_ptr->number);
2337 #endif
2338                                         p_ptr->au += (r_info[kubi_r_idx[j]].level+1) * 300 * o_ptr->number;
2339                                         p_ptr->redraw |= (PR_GOLD);
2340                                         inven_item_increase(i, -o_ptr->number);
2341                                         inven_item_describe(i);
2342                                         inven_item_optimize(i);
2343                                         chg_virtue(V_JUSTICE, 5);
2344                                         kubi_r_idx[j] += 10000;
2345                                 }
2346                                 change = TRUE;
2347                         }
2348                 }
2349         }
2350
2351         if (!change)
2352         {
2353 #ifdef JP
2354                 msg_print("¾Þ¶â¤òÆÀ¤é¤ì¤½¤¦¤Ê¤â¤Î¤Ï»ý¤Ã¤Æ¤¤¤Ê¤«¤Ã¤¿¡£");
2355 #else
2356                 msg_print("You have nothing.");
2357 #endif
2358                 msg_print(NULL);
2359                 return FALSE;
2360         }
2361 //      msg_print(NULL);
2362         return TRUE;
2363 }
2364
2365 bool get_nightmare(int r_idx)
2366 {
2367         monster_race *r_ptr = &r_info[r_idx];
2368
2369         /* Require eldritch horrors */
2370         if (!(r_ptr->flags2 & (RF2_ELDRITCH_HORROR))) return (FALSE);
2371
2372         /* Require high level */
2373         if (r_ptr->level <= p_ptr->lev) return (FALSE);
2374
2375         /* Accept this monster */
2376         return (TRUE);
2377 }
2378
2379
2380 void have_nightmare(int r_idx)
2381 {
2382         bool happened = FALSE;
2383
2384         int power = 100;
2385
2386         monster_race *r_ptr = &r_info[r_idx];
2387
2388         char m_name[80];
2389         cptr desc = r_name + r_ptr->name;
2390
2391
2392         power = r_ptr->level + 10;
2393
2394 #ifdef JP
2395         if (0)
2396 #else
2397         if (!(r_ptr->flags1 & RF1_UNIQUE))
2398 #endif
2399
2400         {
2401                 /* Describe it */
2402                 sprintf(m_name, "%s %s", (is_a_vowel(desc[0]) ? "an" : "a"), desc);
2403
2404                 if (r_ptr->flags1 & RF1_FRIENDS)
2405                 {
2406                         power /= 2;
2407                 }
2408         }
2409         else
2410         {
2411                 /* Describe it */
2412                 sprintf(m_name, "%s", desc);
2413
2414                 power *= 2;
2415         }
2416
2417         if (saving_throw(p_ptr->skill_sav * 100 / power))
2418         {
2419 #ifdef JP
2420         msg_format("Ì´¤ÎÃæ¤Ç%s¤ËÄɤ¤¤«¤±¤é¤ì¤¿¡£", m_name);
2421 #else
2422         msg_format("%^s chases you through your dreams.", m_name);
2423 #endif
2424
2425
2426                 /* Safe */
2427                 return;
2428         }
2429
2430         if (p_ptr->image)
2431         {
2432                 /* Something silly happens... */
2433 #ifdef JP
2434 msg_format("%s%s¤Î´é¤ò¸«¤Æ¤·¤Þ¤Ã¤¿¡ª",
2435 #else
2436                 msg_format("You behold the %s visage of %s!",
2437 #endif
2438
2439                                           funny_desc[rand_int(MAX_SAN_FUNNY)], m_name);
2440
2441                 if (one_in_(3))
2442                 {
2443                         msg_print(funny_comments[rand_int(MAX_SAN_COMMENT)]);
2444                         p_ptr->image = p_ptr->image + randint(r_ptr->level);
2445                 }
2446
2447                 /* Never mind; we can't see it clearly enough */
2448                 return;
2449         }
2450
2451         /* Something frightening happens... */
2452 #ifdef JP
2453 msg_format("%s%s¤Î´é¤ò¸«¤Æ¤·¤Þ¤Ã¤¿¡ª",
2454 #else
2455         msg_format("You behold the %s visage of %s!",
2456 #endif
2457
2458                                   horror_desc[rand_int(MAX_SAN_HORROR)], desc);
2459
2460         r_ptr->r_flags2 |= RF2_ELDRITCH_HORROR;
2461
2462         switch(p_ptr->prace)
2463         {
2464                 /* Imps may make a saving throw */
2465                 case RACE_IMP:
2466                 case RACE_DEMON:
2467                 {
2468                         if (saving_throw(20 + p_ptr->lev)) return;
2469                 }
2470                 /* Undead may make a saving throw */
2471                 case RACE_SKELETON:
2472                 case RACE_ZOMBIE:
2473                 case RACE_SPECTRE:
2474                 case RACE_VAMPIRE:
2475                 {
2476                         if (saving_throw(10 + p_ptr->lev)) return;
2477                 }
2478         }
2479
2480         /* Mind blast */
2481         if (!saving_throw(p_ptr->skill_sav * 100 / power))
2482         {
2483                 if (!p_ptr->resist_conf)
2484                 {
2485                         (void)set_confused(p_ptr->confused + rand_int(4) + 4);
2486                 }
2487                 if (!p_ptr->resist_chaos && one_in_(3))
2488                 {
2489                         (void)set_image(p_ptr->image + rand_int(250) + 150);
2490                 }
2491                 return;
2492         }
2493
2494         /* Lose int & wis */
2495         if (!saving_throw(p_ptr->skill_sav * 100 / power))
2496         {
2497                 do_dec_stat(A_INT);
2498                 do_dec_stat(A_WIS);
2499                 return;
2500         }
2501
2502         /* Brain smash */
2503         if (!saving_throw(p_ptr->skill_sav * 100 / power))
2504         {
2505                 if (!p_ptr->resist_conf)
2506                 {
2507                         (void)set_confused(p_ptr->confused + rand_int(4) + 4);
2508                 }
2509                 if (!p_ptr->free_act)
2510                 {
2511                         (void)set_paralyzed(p_ptr->paralyzed + rand_int(4) + 4);
2512                 }
2513                 while (!saving_throw(p_ptr->skill_sav))
2514                 {
2515                         (void)do_dec_stat(A_INT);
2516                 }
2517                 while (!saving_throw(p_ptr->skill_sav))
2518                 {
2519                         (void)do_dec_stat(A_WIS);
2520                 }
2521                 if (!p_ptr->resist_chaos)
2522                 {
2523                         (void)set_image(p_ptr->image + rand_int(250) + 150);
2524                 }
2525                 return;
2526         }
2527
2528
2529         /* Amnesia */
2530         if (!saving_throw(p_ptr->skill_sav * 100 / power))
2531         {
2532                 if (lose_all_info())
2533                 {
2534 #ifdef JP
2535 msg_print("¤¢¤Þ¤ê¤Î¶²ÉݤËÁ´¤Æ¤Î¤³¤È¤ò˺¤ì¤Æ¤·¤Þ¤Ã¤¿¡ª");
2536 #else
2537                         msg_print("You forget everything in your utmost terror!");
2538 #endif
2539
2540                 }
2541                 return;
2542         }
2543
2544         /* Else gain permanent insanity */
2545         if ((p_ptr->muta3 & MUT3_MORONIC) && (p_ptr->muta2 & MUT2_BERS_RAGE) &&
2546                 ((p_ptr->muta2 & MUT2_COWARDICE) || (p_ptr->resist_fear)) &&
2547                 ((p_ptr->muta2 & MUT2_HALLU) || (p_ptr->resist_chaos)))
2548         {
2549                 /* The poor bastard already has all possible insanities! */
2550                 return;
2551         }
2552
2553         while (!happened)
2554         {
2555                 switch (randint(4))
2556                 {
2557                         case 1:
2558                         {
2559                                 if (!(p_ptr->muta3 & MUT3_MORONIC))
2560                                 {
2561                                         if ((p_ptr->stat_use[A_INT] < 4) && (p_ptr->stat_use[A_WIS] < 4))
2562                                         {
2563 #ifdef JP
2564 msg_print("¤¢¤Ê¤¿¤Ï´°àú¤ÊÇϼ¯¤Ë¤Ê¤Ã¤¿¤è¤¦¤Êµ¤¤¬¤·¤¿¡£¤·¤«¤·¤½¤ì¤Ï¸µ¡¹¤À¤Ã¤¿¡£");
2565 #else
2566                                                 msg_print("You turn into an utter moron!");
2567 #endif
2568                                         }
2569                                         else
2570                                         {
2571 #ifdef JP
2572 msg_print("¤¢¤Ê¤¿¤Ï´°àú¤ÊÇϼ¯¤Ë¤Ê¤Ã¤¿¡ª");
2573 #else
2574                                                 msg_print("You turn into an utter moron!");
2575 #endif
2576                                         }
2577
2578                                         if (p_ptr->muta3 & MUT3_HYPER_INT)
2579                                         {
2580 #ifdef JP
2581 msg_print("¤¢¤Ê¤¿¤ÎǾ¤ÏÀ¸ÂÎ¥³¥ó¥Ô¥å¡¼¥¿¤Ç¤Ï¤Ê¤¯¤Ê¤Ã¤¿¡£");
2582 #else
2583                                                 msg_print("Your brain is no longer a living computer.");
2584 #endif
2585
2586                                                 p_ptr->muta3 &= ~(MUT3_HYPER_INT);
2587                                         }
2588                                         p_ptr->muta3 |= MUT3_MORONIC;
2589                                         happened = TRUE;
2590                                 }
2591                                 break;
2592                         }
2593                         case 2:
2594                         {
2595                                 if (!(p_ptr->muta2 & MUT2_COWARDICE) && !p_ptr->resist_fear)
2596                                 {
2597 #ifdef JP
2598 msg_print("¤¢¤Ê¤¿¤Ï¥Ñ¥é¥Î¥¤¥¢¤Ë¤Ê¤Ã¤¿¡ª");
2599 #else
2600                                         msg_print("You become paranoid!");
2601 #endif
2602
2603
2604                                         /* Duh, the following should never happen, but anyway... */
2605                                         if (p_ptr->muta3 & MUT3_FEARLESS)
2606                                         {
2607 #ifdef JP
2608 msg_print("¤¢¤Ê¤¿¤Ï¤â¤¦¶²¤ìÃΤ餺¤Ç¤Ï¤Ê¤¯¤Ê¤Ã¤¿¡£");
2609 #else
2610                                                 msg_print("You are no longer fearless.");
2611 #endif
2612
2613                                                 p_ptr->muta3 &= ~(MUT3_FEARLESS);
2614                                         }
2615
2616                                         p_ptr->muta2 |= MUT2_COWARDICE;
2617                                         happened = TRUE;
2618                                 }
2619                                 break;
2620                         }
2621                         case 3:
2622                         {
2623                                 if (!(p_ptr->muta2 & MUT2_HALLU) && !p_ptr->resist_chaos)
2624                                 {
2625 #ifdef JP
2626 msg_print("¸¸³Ð¤ò¤Ò¤­µ¯¤³¤¹Àº¿ÀºøÍð¤Ë´Ù¤Ã¤¿¡ª");
2627 #else
2628                                         msg_print("You are afflicted by a hallucinatory insanity!");
2629 #endif
2630
2631                                         p_ptr->muta2 |= MUT2_HALLU;
2632                                         happened = TRUE;
2633                                 }
2634                                 break;
2635                         }
2636                         default:
2637                         {
2638                                 if (!(p_ptr->muta2 & MUT2_BERS_RAGE))
2639                                 {
2640 #ifdef JP
2641 msg_print("·ãÎõ¤Ê´¶¾ð¤Îȯºî¤Ë¤ª¤½¤ï¤ì¤ë¤è¤¦¤Ë¤Ê¤Ã¤¿¡ª");
2642 #else
2643                                         msg_print("You become subject to fits of berserk rage!");
2644 #endif
2645
2646                                         p_ptr->muta2 |= MUT2_BERS_RAGE;
2647                                         happened = TRUE;
2648                                 }
2649                                 break;
2650                         }
2651                 }
2652         }
2653
2654         p_ptr->update |= PU_BONUS;
2655         handle_stuff();
2656 }
2657
2658
2659 /*
2660  * inn commands
2661  * Note that resting for the night was a perfect way to avoid player
2662  * ghosts in the town *if* you could only make it to the inn in time (-:
2663  * Now that the ghosts are temporarily disabled in 2.8.X, this function
2664  * will not be that useful.  I will keep it in the hopes the player
2665  * ghost code does become a reality again. Does help to avoid filthy urchins.
2666  * Resting at night is also a quick way to restock stores -KMW-
2667  */
2668 static bool inn_comm(int cmd)
2669 {
2670         int dawnval;
2671
2672         switch (cmd)
2673         {
2674                 case BACT_FOOD: /* Buy food & drink */
2675 #ifdef JP
2676 msg_print("¥Ð¡¼¥Æ¥ó¤Ï¤¤¤¯¤é¤«¤Î¿©¤Ùʪ¤È¥Ó¡¼¥ë¤ò¤¯¤ì¤¿¡£");
2677 #else
2678                         msg_print("The barkeep gives you some gruel and a beer.");
2679 #endif
2680
2681 //                      msg_print(NULL);
2682                         (void)set_food(PY_FOOD_MAX - 1);
2683                         break;
2684
2685                 case BACT_REST: /* Rest for the night */
2686                         dawnval = ((turn % (20L * TOWN_DAWN)));
2687                         if (dawnval > 50000)
2688                         {  /* nighttime */
2689                                 if ((p_ptr->poisoned) || (p_ptr->cut))
2690                                 {
2691 #ifdef JP
2692 msg_print("¤¢¤Ê¤¿¤ËɬÍפʤΤÏÉô²°¤Ç¤Ï¤Ê¤¯¡¢¼£ÎżԤǤ¹¡£");
2693 #else
2694                                         msg_print("You need a healer, not a room.");
2695 #endif
2696
2697                                         msg_print(NULL);
2698 #ifdef JP
2699 msg_print("¤¹¤ß¤Þ¤»¤ó¡¢¤Ç¤â¤¦¤Á¤Ç狼¤Ë»à¤Ê¤ì¤Á¤ãº¤¤ê¤Þ¤¹¤ó¤Ç¡£");
2700 #else
2701                                         msg_print("Sorry, but don't want anyone dying in here.");
2702 #endif
2703
2704 //                                      return (FALSE);
2705                                 }
2706                                 else
2707                                 {
2708                                         int oldturn = turn;
2709 #ifdef JP
2710                                         do_cmd_write_nikki(NIKKI_BUNSHOU, 0, "½É²°¤ËÇñ¤Þ¤Ã¤¿¡£");
2711 #else
2712                                         do_cmd_write_nikki(NIKKI_BUNSHOU, 0, "stay over night at the inn");
2713 #endif
2714                                         turn = ((turn / 100000) + 1) * 100000;
2715                                         if (((oldturn + 5L * TOWN_DAWN) % (20L * TOWN_DAWN)) > 50000L) do_cmd_write_nikki(NIKKI_HIGAWARI, 0, NULL);
2716                                         p_ptr->chp = p_ptr->mhp;
2717
2718                                         dungeon_turn += MIN(turn - oldturn, 5000);
2719
2720                                         if (ironman_nightmare)
2721                                         {
2722 #ifdef JP
2723 msg_print("̲¤ê¤Ë½¢¤¯¤È¶²¤í¤·¤¤¸÷·Ê¤¬¿´¤ò¤è¤®¤Ã¤¿¡£");
2724 #else
2725                                                 msg_print("Horrible visions flit through your mind as you sleep.");
2726 #endif
2727
2728
2729                                                 /* Pick a nightmare */
2730                                                 get_mon_num_prep(get_nightmare, NULL);
2731
2732                                                 /* Have some nightmares */
2733                                                 while(1)
2734                                                 {
2735                                                         have_nightmare(get_mon_num(MAX_DEPTH));
2736
2737                                                         if (!one_in_(3)) break;
2738                                                 }
2739
2740                                                 /* Remove the monster restriction */
2741                                                 get_mon_num_prep(NULL, NULL);
2742
2743 #ifdef JP
2744 msg_print("¤¢¤Ê¤¿¤ÏÀ䶫¤·¤ÆÌܤò³Ð¤Þ¤·¤¿¡£");
2745 #else
2746                                                 msg_print("You awake screaming.");
2747 #endif
2748
2749 #ifdef JP
2750                                                 do_cmd_write_nikki(NIKKI_BUNSHOU, 0, "°­Ì´¤Ë¤¦¤Ê¤µ¤ì¤Æ¤è¤¯Ì²¤ì¤Ê¤«¤Ã¤¿¡£");
2751 #else
2752                                                 do_cmd_write_nikki(NIKKI_BUNSHOU, 0, "be troubled by a nightmare.");
2753 #endif
2754                                         }
2755                                         else
2756                                         {
2757                                                 set_blind(0);
2758                                                 set_confused(0);
2759                                                 p_ptr->stun = 0;
2760                                                 p_ptr->chp = p_ptr->mhp;
2761                                                 p_ptr->csp = p_ptr->msp;
2762                                                 if (p_ptr->pclass == CLASS_MAGIC_EATER)
2763                                                 {
2764                                                         int i;
2765                                                         for (i = 0; i < 72; i++)
2766                                                         {
2767                                                                 p_ptr->magic_num1[i] = p_ptr->magic_num2[i]*0x10000;
2768                                                         }
2769                                                         for (; i < 108; i++)
2770                                                         {
2771                                                                 p_ptr->magic_num1[i] = 0;
2772                                                         }
2773                                                 }
2774
2775 #ifdef JP
2776 msg_print("¤¢¤Ê¤¿¤Ï¥ê¥Õ¥ì¥Ã¥·¥å¤·¤ÆÌܳФᡢ¿·¤¿¤ÊÆü¤ò·Þ¤¨¤¿¡£");
2777 #else
2778                                                 msg_print("You awake refreshed for the new day.");
2779 #endif
2780
2781 #ifdef JP
2782                                                 do_cmd_write_nikki(NIKKI_BUNSHOU, 0, "¤¹¤¬¤¹¤¬¤·¤¤Ä«¤ò¤à¤«¤¨¤¿¡£");
2783 #else
2784                                                 do_cmd_write_nikki(NIKKI_BUNSHOU, 0, "awake refreshed.");
2785 #endif
2786                                         }
2787
2788 //                                      msg_print(NULL);
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 //                              msg_print(NULL);
2801                                 return (FALSE);
2802                         }
2803                         break;
2804                 case BACT_RUMORS: /* Listen for rumors */
2805                         {
2806                                 char Rumor[1024];
2807
2808 #ifdef JP
2809                                 if (!get_rnd_line_jonly("rumors_j.txt", 0, Rumor, 10))
2810 #else
2811                                 if (!get_rnd_line("rumors.txt", 0, Rumor))
2812 #endif
2813
2814                                         msg_format("%s", Rumor);
2815 //                              msg_print(NULL);
2816                                 break;
2817                         }
2818         }
2819
2820         return (TRUE);
2821 }
2822
2823
2824 /*
2825  * Share gold for thieves
2826  */
2827 static void share_gold(void)
2828 {
2829         int i = (p_ptr->lev * 2) * 10;
2830 #ifdef JP
2831 msg_format("¡ð%d ¤ò¼ê¤ËÆþ¤ì¤¿¡£", i);
2832 #else
2833         msg_format("You collect %d gold pieces", i);
2834 #endif
2835
2836 //      msg_print(NULL);
2837         p_ptr->au += i;
2838 }
2839
2840
2841 /*
2842  * Display quest information
2843  */
2844 static void get_questinfo(int questnum)
2845 {
2846         int     i;
2847         int     old_quest;
2848         char    tmp_str[80];
2849
2850
2851         /* Clear the text */
2852         for (i = 0; i < 10; i++)
2853         {
2854                 quest_text[i][0] = '\0';
2855         }
2856
2857         quest_text_line = 0;
2858
2859         /* Set the quest number temporary */
2860         old_quest = p_ptr->inside_quest;
2861         p_ptr->inside_quest = questnum;
2862
2863         /* Get the quest text */
2864         init_flags = INIT_SHOW_TEXT | INIT_ASSIGN;
2865
2866 process_dungeon_file("q_info_j.txt", 0, 0, 0, 0);
2867
2868         /* Reset the old quest number */
2869         p_ptr->inside_quest = old_quest;
2870
2871         /* Print the quest info */
2872 #ifdef JP
2873 sprintf(tmp_str, "¥¯¥¨¥¹¥È¾ðÊó (´í¸±ÅÙ: %d ³¬ÁêÅö)", quest[questnum].level);
2874 #else
2875         sprintf(tmp_str, "Quest Information (Danger level: %d)", quest[questnum].level);
2876 #endif
2877
2878         prt(tmp_str, 5, 0);
2879
2880         prt(quest[questnum].name, 7, 0);
2881
2882         for (i = 0; i < 10; i++)
2883         {
2884                 c_put_str(TERM_YELLOW, quest_text[i], i + 8, 0);
2885         }
2886 }
2887
2888
2889 /*
2890  * Request a quest from the Lord.
2891  */
2892 static void castle_quest(void)
2893 {
2894         int             q_index = 0;
2895         monster_race    *r_ptr;
2896         quest_type      *q_ptr;
2897         cptr            name;
2898
2899
2900         clear_bldg(4, 18);
2901
2902         /* Current quest of the building */
2903         q_index = cave[py][px].special;
2904
2905         /* Is there a quest available at the building? */
2906         if (!q_index)
2907         {
2908 #ifdef JP
2909 put_str("º£¤Î¤È¤³¤í¥¯¥¨¥¹¥È¤Ï¤¢¤ê¤Þ¤»¤ó¡£", 8, 0);
2910 #else
2911                 put_str("I don't have a quest for you at the moment.", 8, 0);
2912 #endif
2913
2914                 return;
2915         }
2916
2917         q_ptr = &quest[q_index];
2918
2919         /* Quest is completed */
2920         if (q_ptr->status == QUEST_STATUS_COMPLETED)
2921         {
2922                 /* Rewarded quest */
2923                 q_ptr->status = QUEST_STATUS_REWARDED;
2924
2925                 get_questinfo(q_index);
2926
2927                 reinit_wilderness = TRUE;
2928         }
2929         /* Failed quest */
2930         else if (q_ptr->status == QUEST_STATUS_FAILED)
2931         {
2932                 get_questinfo(q_index);
2933
2934                 /* Mark quest as done (but failed) */
2935                 q_ptr->status = QUEST_STATUS_FAILED_DONE;
2936
2937                 reinit_wilderness = TRUE;
2938         }
2939         /* Quest is still unfinished */
2940         else if (q_ptr->status == QUEST_STATUS_TAKEN)
2941         {
2942 #ifdef JP
2943 put_str("¤¢¤Ê¤¿¤Ï¸½ºß¤Î¥¯¥¨¥¹¥È¤ò½ªÎ»¤µ¤»¤Æ¤¤¤Þ¤»¤ó¡ª", 8, 0);
2944 #else
2945                 put_str("You have not completed your current quest yet!", 8, 0);
2946 #endif
2947
2948 #ifdef JP
2949 put_str("CTRL-Q¤ò»È¤¨¤Ð¥¯¥¨¥¹¥È¤Î¾õÂÖ¤¬¥Á¥§¥Ã¥¯¤Ç¤­¤Þ¤¹¡£", 9, 0);
2950 #else
2951                 put_str("Use CTRL-Q to check the status of your quest.", 9, 0);
2952 #endif
2953
2954 #ifdef JP
2955 put_str("¥¯¥¨¥¹¥È¤ò½ª¤ï¤é¤»¤¿¤éÌá¤Ã¤ÆÍè¤Æ²¼¤µ¤¤¡£", 12, 0);
2956 #else
2957                 put_str("Return when you have completed your quest.", 12, 0);
2958 #endif
2959
2960         }
2961         /* No quest yet */
2962         else if (q_ptr->status == QUEST_STATUS_UNTAKEN)
2963         {
2964                 q_ptr->status = QUEST_STATUS_TAKEN;
2965
2966                 reinit_wilderness = TRUE;
2967
2968                 /* Assign a new quest */
2969                 if (q_ptr->type == QUEST_TYPE_KILL_ANY_LEVEL)
2970                 {
2971                         if (q_ptr->r_idx == 0)
2972                         {
2973                                 /* Random monster at least 5 - 10 levels out of deep */
2974                                 q_ptr->r_idx = get_mon_num(q_ptr->level + 4 + randint(6));
2975                         }
2976
2977                         r_ptr = &r_info[q_ptr->r_idx];
2978
2979                         while ((r_ptr->flags1 & RF1_UNIQUE) || (r_ptr->rarity != 1))
2980                         {
2981                                 q_ptr->r_idx = get_mon_num(q_ptr->level) + 4 + randint(6);
2982                                 r_ptr = &r_info[q_ptr->r_idx];
2983                         }
2984
2985                         if (q_ptr->max_num == 0)
2986                         {
2987                                 /* Random monster number */
2988                                 if (randint(10) > 7)
2989                                         q_ptr->max_num = 1;
2990                                 else
2991                                         q_ptr->max_num = randint(3) + 1;
2992                         }
2993
2994                         q_ptr->cur_num = 0;
2995                         name = (r_name + r_ptr->name);
2996 #ifdef JP
2997 msg_format("¥¯¥¨¥¹¥È: %s¤ò %dÂÎÅݤ¹", name,q_ptr->max_num);
2998 #else
2999                         msg_format("Your quest: kill %d %s", q_ptr->max_num, name);
3000 #endif
3001
3002 //                      msg_print(NULL);
3003                 }
3004                 else
3005                 {
3006                         get_questinfo(q_index);
3007                 }
3008         }
3009 }
3010
3011
3012 /*
3013  * Display town history
3014  */
3015 static void town_history(void)
3016 {
3017         /* Save screen */
3018         screen_save();
3019
3020         /* Peruse the building help file */
3021 #ifdef JP
3022 (void)show_file(TRUE, "bldg_j.txt", NULL, 0, 0);
3023 #else
3024         (void)show_file(TRUE, "bldg.txt", NULL, 0, 0);
3025 #endif
3026
3027
3028         /* Load screen */
3029         screen_load();
3030 }
3031
3032
3033 /*
3034  * Display the damage figure of an object
3035  * (used by compare_weapon_aux1)
3036  *
3037  * Only accurate for the current weapon, because it includes
3038  * the current +dam of the player.
3039  */
3040 static void compare_weapon_aux2(object_type *o_ptr, int numblows,
3041                                 int r, int c, int mult, char attr[80],
3042                                 u32b f1, u32b f2, u32b f3, byte color)
3043 {
3044         char tmp_str[80];
3045
3046         /* Print the intro text */
3047         c_put_str(color, attr, r, c);
3048
3049         /* Calculate the min and max damage figures */
3050 #ifdef JP
3051 sprintf(tmp_str, "£±¥¿¡¼¥ó: %d-%d ¥À¥á¡¼¥¸",
3052 #else
3053         sprintf(tmp_str, "Attack: %d-%d damage",
3054 #endif
3055
3056             (numblows * (mult * o_ptr->dd /60 + o_ptr->to_d + p_ptr->to_d[0])),
3057             (numblows * (mult * o_ptr->ds * o_ptr->dd /60 + o_ptr->to_d + p_ptr->to_d[0])));
3058
3059         /* Print the damage */
3060         put_str(tmp_str, r, c + 8);
3061 }
3062
3063
3064 /*
3065  * Show the damage figures for the various monster types
3066  *
3067  * Only accurate for the current weapon, because it includes
3068  * the current number of blows for the player.
3069  */
3070 static void compare_weapon_aux1(object_type *o_ptr, int col, int r)
3071 {
3072         int mult = 60;
3073         u32b f1, f2, f3;
3074
3075         /* Get the flags of the weapon */
3076         object_flags(o_ptr, &f1, &f2, &f3);
3077
3078         if (p_ptr->riding)
3079         {
3080                 if ((o_ptr->tval == TV_POLEARM) && ((o_ptr->sval == SV_LANCE) || (o_ptr->sval == SV_HEAVY_LANCE)))
3081                         mult = mult * (o_ptr->dd + 2) / o_ptr->dd;
3082         }
3083         if ((p_ptr->pclass != CLASS_SAMURAI) && (f1 & TR1_FORCE_WEPON) && (p_ptr->csp > (o_ptr->dd * o_ptr->ds / 5))) mult = mult * 7 / 2;
3084
3085         /* Print the relevant lines */
3086 #ifdef JP
3087 if (f1 & TR1_FORCE_WEPON)     compare_weapon_aux2(o_ptr, p_ptr->num_blow[0], r++, col, 1*mult, "ÍýÎÏ:", f1, f2, f3, TERM_L_BLUE);
3088 if (f1 & TR1_SLAY_ANIMAL) compare_weapon_aux2(o_ptr, p_ptr->num_blow[0], r++, col, 2*mult, "ưʪ:", f1, f2, f3, TERM_YELLOW);
3089 if (f1 & TR1_SLAY_EVIL)   compare_weapon_aux2(o_ptr, p_ptr->num_blow[0], r++, col, 2*mult, "¼Ù°­:", f1, f2, f3, TERM_YELLOW);
3090 if (f1 & TR1_SLAY_UNDEAD) compare_weapon_aux2(o_ptr, p_ptr->num_blow[0], r++, col, 3*mult, "ÉÔ»à:", f1, f2, f3, TERM_YELLOW);
3091 if (f1 & TR1_SLAY_DEMON)  compare_weapon_aux2(o_ptr, p_ptr->num_blow[0], r++, col, 3*mult, "°­Ëâ:", f1, f2, f3, TERM_YELLOW);
3092 if (f1 & TR1_SLAY_ORC)    compare_weapon_aux2(o_ptr, p_ptr->num_blow[0], r++, col, 3*mult, "¥ª¡¼¥¯:", f1, f2, f3, TERM_YELLOW);
3093 if (f1 & TR1_SLAY_TROLL)  compare_weapon_aux2(o_ptr, p_ptr->num_blow[0], r++, col, 3*mult, "¥È¥í¥ë:", f1, f2, f3, TERM_YELLOW);
3094 if (f1 & TR1_SLAY_GIANT)  compare_weapon_aux2(o_ptr, p_ptr->num_blow[0], r++, col, 3*mult, "µð¿Í:", f1, f2, f3, TERM_YELLOW);
3095 if (f1 & TR1_KILL_DRAGON) compare_weapon_aux2(o_ptr, p_ptr->num_blow[0], r++, col, 5*mult, "ε:", f1, f2, f3, TERM_YELLOW);
3096 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);
3097 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);
3098 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);
3099 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);
3100 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);
3101 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);
3102 #else
3103         if (f1 & TR1_FORCE_WEPON)     compare_weapon_aux2(o_ptr, p_ptr->num_blow[0], r++, col, 1*mult, "Force  :", f1, f2, f3, TERM_L_BLUE);
3104         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);
3105         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);
3106         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);
3107         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);
3108         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);
3109         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);
3110         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);
3111         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);
3112         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);
3113         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);
3114         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);
3115         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);
3116         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);
3117         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);
3118 #endif
3119
3120 }
3121
3122 static int hit_chance(int to_h, int ac)
3123 {
3124         int chance = 0;
3125         int meichuu = p_ptr->skill_thn + (p_ptr->to_h[0] + to_h) * BTH_PLUS_ADJ;
3126
3127         if (meichuu <= 0) return 5;
3128
3129         chance = 100 - ((ac * 75) / meichuu);
3130
3131         if (chance > 95) chance = 95;
3132         if (chance < 5) chance = 5;
3133         if (p_ptr->pseikaku == SEIKAKU_NAMAKE)
3134                 chance = (chance*19+9)/20;
3135         return chance;
3136 }
3137
3138 /*
3139  * Displays all info about a weapon
3140  *
3141  * Only accurate for the current weapon, because it includes
3142  * various info about the player's +to_dam and number of blows.
3143  */
3144 static void list_weapon(object_type *o_ptr, int row, int col)
3145 {
3146         char o_name[MAX_NLEN];
3147         char tmp_str[80];
3148
3149         /* Print the weapon name */
3150         object_desc(o_name, o_ptr, TRUE, 0);
3151         c_put_str(TERM_YELLOW, o_name, row, col);
3152
3153         /* Print the player's number of blows */
3154 #ifdef JP
3155 sprintf(tmp_str, "¹¶·â²ó¿ô: %d", p_ptr->num_blow[0]);
3156 #else
3157         sprintf(tmp_str, "Number of Blows: %d", p_ptr->num_blow[0]);
3158 #endif
3159
3160         put_str(tmp_str, row+1, col);
3161
3162         /* Print to_hit and to_dam of the weapon */
3163 #ifdef JP
3164 sprintf(tmp_str, "Ì¿ÃæΨ:  0  50 100 150 200 (Ũ¤ÎAC)");
3165 #else
3166 sprintf(tmp_str, "To Hit:  0  50 100 150 200 (AC)");
3167 #endif
3168
3169         put_str(tmp_str, row+2, col);
3170
3171         /* Print the weapons base damage dice */
3172 #ifdef JP
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 #else
3175 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));
3176 #endif
3177
3178         put_str(tmp_str, row+3, col);
3179
3180 #ifdef JP
3181 c_put_str(TERM_YELLOW, "²Äǽ¤Ê¥À¥á¡¼¥¸:", row+5, col);
3182 #else
3183         c_put_str(TERM_YELLOW, "Possible Damage:", row+5, col);
3184 #endif
3185
3186
3187         /* Damage for one blow (if it hits) */
3188 #ifdef JP
3189 sprintf(tmp_str, "¹¶·â°ì²ó¤Ë¤Ä¤­ %d-%d",
3190 #else
3191         sprintf(tmp_str, "One Strike: %d-%d damage",
3192 #endif
3193
3194             o_ptr->dd + o_ptr->to_d + p_ptr->to_d[0],
3195             o_ptr->ds * o_ptr->dd + o_ptr->to_d + p_ptr->to_d[0]);
3196         put_str(tmp_str, row+6, col+1);
3197
3198         /* Damage for the complete attack (if all blows hit) */
3199 #ifdef JP
3200 sprintf(tmp_str, "£±¥¿¡¼¥ó¤Ë¤Ä¤­ %d-%d",
3201 #else
3202         sprintf(tmp_str, "One Attack: %d-%d damage",
3203 #endif
3204
3205             p_ptr->num_blow[0] * (o_ptr->dd + o_ptr->to_d + p_ptr->to_d[0]),
3206             p_ptr->num_blow[0] * (o_ptr->ds * o_ptr->dd + o_ptr->to_d + p_ptr->to_d[0]));
3207         put_str(tmp_str, row+7, col+1);
3208 }
3209
3210
3211 /*
3212  * Hook to specify "weapon"
3213  */
3214 static bool item_tester_hook_melee_weapon(object_type *o_ptr)
3215 {
3216         switch (o_ptr->tval)
3217         {
3218                 case TV_HAFTED:
3219                 case TV_POLEARM:
3220                 case TV_DIGGING:
3221                 {
3222                         return (TRUE);
3223                 }
3224                 case TV_SWORD:
3225                 {
3226                         if (o_ptr->sval != SV_DOKUBARI) return (TRUE);
3227                 }
3228         }
3229
3230         return (FALSE);
3231 }
3232
3233
3234 /*
3235  * Hook to specify "ammo"
3236  */
3237 static bool item_tester_hook_ammo(object_type *o_ptr)
3238 {
3239         switch (o_ptr->tval)
3240         {
3241                 case TV_SHOT:
3242                 case TV_ARROW:
3243                 case TV_BOLT:
3244                 {
3245                         return (TRUE);
3246                 }
3247         }
3248
3249         return (FALSE);
3250 }
3251
3252
3253 /*
3254  * Compare weapons
3255  *
3256  * Copies the weapons to compare into the weapon-slot and
3257  * compares the values for both weapons.
3258  */
3259 static bool compare_weapons(void)
3260 {
3261         int item, item2;
3262         object_type *o1_ptr, *o2_ptr;
3263         object_type orig_weapon;
3264         object_type *i_ptr;
3265         cptr q, s;
3266         int row = 2;
3267
3268         screen_save();
3269         /* Clear the screen */
3270         clear_bldg(0, 22);
3271
3272         /* Store copy of original wielded weapon */
3273         i_ptr = &inventory[INVEN_RARM];
3274         object_copy(&orig_weapon, i_ptr);
3275
3276         item_tester_no_ryoute = TRUE;
3277         /* Only compare melee weapons */
3278         item_tester_hook = item_tester_hook_melee_weapon;
3279
3280         /* Get the first weapon */
3281 #ifdef JP
3282 q = "Âè°ì¤ÎÉð´ï¤Ï¡©";
3283 s = "Èæ¤Ù¤ë¤â¤Î¤¬¤¢¤ê¤Þ¤»¤ó¡£";
3284 #else
3285         q = "What is your first weapon? ";
3286         s = "You have nothing to compare.";
3287 #endif
3288
3289         if (!get_item(&item, q, s, (USE_EQUIP | USE_INVEN)))
3290         {
3291                 screen_load();
3292                 return (FALSE);
3293         }
3294
3295         /* Get the item (in the pack) */
3296         o1_ptr = &inventory[item];
3297
3298         /* Clear the screen */
3299         clear_bldg(0, 22);
3300
3301         item_tester_no_ryoute = TRUE;
3302         /* Only compare melee weapons */
3303         item_tester_hook = item_tester_hook_melee_weapon;
3304
3305         /* Get the second weapon */
3306 #ifdef JP
3307 q = "ÂèÆó¤ÎÉð´ï¤Ï¡©";
3308 s = "Èæ¤Ù¤ë¤â¤Î¤¬¤¢¤ê¤Þ¤»¤ó¡£";
3309 #else
3310         q = "What is your second weapon? ";
3311         s = "You have nothing to compare.";
3312 #endif
3313
3314         if (!get_item(&item2, q, s, (USE_EQUIP | USE_INVEN)))
3315         {
3316                 screen_load();
3317                 return (FALSE);
3318         }
3319
3320         /* Get the item (in the pack) */
3321         o2_ptr = &inventory[item2];
3322
3323         /* Clear the screen */
3324         clear_bldg(0, 22);
3325
3326         /* Copy first weapon into the weapon slot (if it's not already there) */
3327         if (o1_ptr != i_ptr)
3328                 object_copy(i_ptr, o1_ptr);
3329
3330         /* Get the new values */
3331         calc_bonuses();
3332
3333         /* List the new values */
3334         list_weapon(o1_ptr, row, 2);
3335         compare_weapon_aux1(o1_ptr, 2, row + 8);
3336
3337         /* Copy second weapon into the weapon slot (if it's not already there) */
3338         if (o2_ptr != i_ptr)
3339                 object_copy(i_ptr, o2_ptr);
3340         else
3341                 object_copy(i_ptr, &orig_weapon);
3342
3343         /* Get the new values */
3344         calc_bonuses();
3345
3346         /* List the new values */
3347         list_weapon(o2_ptr, row, 40);
3348         compare_weapon_aux1(o2_ptr, 40, row + 8);
3349
3350         /* Copy back the original weapon into the weapon slot */
3351         object_copy(i_ptr, &orig_weapon);
3352
3353         /* Reset the values for the old weapon */
3354         calc_bonuses();
3355
3356 #ifdef JP
3357 put_str("(°ìÈֹ⤤¥À¥á¡¼¥¸¤¬Å¬ÍѤµ¤ì¤Þ¤¹¡£Ê£¿ô¤ÎÇÜÂǸú²Ì¤Ï­¤·»»¤µ¤ì¤Þ¤»¤ó¡£)", row + 4, 0);
3358 #else
3359         put_str("(Only highest damage applies per monster. Special damage not cumulative.)", row + 4, 0);
3360 #endif
3361
3362 #ifdef JP
3363 msg_print("¸½ºß¤Îµ»Î̤«¤éȽÃǤ¹¤ë¤È¡¢¤¢¤Ê¤¿¤ÎÉð´ï¤Ï°Ê²¼¤Î¤è¤¦¤Ê°ÒÎϤòȯ´ø¤·¤Þ¤¹:");
3364 #else
3365         msg_print("Based on your current abilities, here is what your weapons will do");
3366 #endif
3367
3368
3369         flush();
3370         (void)inkey();
3371         screen_load();
3372
3373         /* Done */
3374         return (TRUE);
3375 }
3376
3377
3378 /*
3379  * Enchant item
3380  */
3381 static bool enchant_item(int cost, int to_hit, int to_dam, int to_ac)
3382 {
3383         int         i, item;
3384         bool        okay = FALSE;
3385         object_type *o_ptr;
3386         cptr        q, s;
3387         int         maxenchant = (p_ptr->lev / 5);
3388         char        tmp_str[MAX_NLEN];
3389
3390
3391         clear_bldg(4, 18);
3392 #ifdef JP
3393 prt(format("¸½ºß¤Î¤¢¤Ê¤¿¤Îµ»Î̤À¤È¡¢+%d ¤Þ¤Ç²þÎɤǤ­¤Þ¤¹¡£", maxenchant), 5, 0);
3394 prt(format(" ²þÎɤÎÎÁ¶â¤Ï°ì¸Ä¤Ë¤Ä¤­¡ð%d ¤Ç¤¹¡£", cost), 7, 0);
3395 #else
3396         prt(format("  Based on your skill, we can improve up to +%d.", maxenchant), 5, 0);
3397         prt(format("  The price for the service is %d gold per item.", cost), 7, 0);
3398 #endif
3399
3400         item_tester_no_ryoute = TRUE;
3401
3402         /* Get an item */
3403 #ifdef JP
3404 q = "¤É¤Î¥¢¥¤¥Æ¥à¤ò²þÎɤ·¤Þ¤¹¤«¡©";
3405 s = "²þÎɤǤ­¤ë¤â¤Î¤¬¤¢¤ê¤Þ¤»¤ó¡£";
3406 #else
3407         q = "Improve which item? ";
3408         s = "You have nothing to improve.";
3409 #endif
3410
3411         if (!get_item(&item, q, s, (USE_INVEN | USE_EQUIP))) return (FALSE);
3412
3413         /* Get the item (in the pack) */
3414         o_ptr = &inventory[item];
3415
3416         /* Check if the player has enough money */
3417         if (p_ptr->au < (cost * o_ptr->number))
3418         {
3419                 object_desc(tmp_str, o_ptr, TRUE, 0);
3420 #ifdef JP
3421 msg_format("%s¤ò²þÎɤ¹¤ë¤À¤±¤Î¥´¡¼¥ë¥É¤¬¤¢¤ê¤Þ¤»¤ó¡ª", tmp_str);
3422 #else
3423                 msg_format("You do not have the gold to improve %s!", tmp_str);
3424 #endif
3425
3426 //              msg_print(NULL);
3427                 return (FALSE);
3428         }
3429
3430         /* Enchant to hit */
3431         for (i = 0; i < to_hit; i++)
3432         {
3433                 if (o_ptr->to_h < maxenchant)
3434                 {
3435                         if (enchant(o_ptr, 1, (ENCH_TOHIT | ENCH_FORCE)))
3436                         {
3437                                 okay = TRUE;
3438                                 break;
3439                         }
3440                 }
3441         }
3442
3443         /* Enchant to damage */
3444         for (i = 0; i < to_dam; i++)
3445         {
3446                 if (o_ptr->to_d < maxenchant)
3447                 {
3448                         if (enchant(o_ptr, 1, (ENCH_TODAM | ENCH_FORCE)))
3449                         {
3450                                 okay = TRUE;
3451                                 break;
3452                         }
3453                 }
3454         }
3455
3456         /* Enchant to AC */
3457         for (i = 0; i < to_ac; i++)
3458         {
3459                 if (o_ptr->to_a < maxenchant)
3460                 {
3461                         if (enchant(o_ptr, 1, (ENCH_TOAC | ENCH_FORCE)))
3462                         {
3463                                 okay = TRUE;
3464                                 break;
3465                         }
3466                 }
3467         }
3468
3469         /* Failure */
3470         if (!okay)
3471         {
3472                 /* Flush */
3473                 if (flush_failure) flush();
3474
3475                 /* Message */
3476 #ifdef JP
3477 msg_print("²þÎɤ˼ºÇÔ¤·¤¿¡£");
3478 #else
3479                 msg_print("The improvement failed.");
3480 #endif
3481
3482
3483                 return (FALSE);
3484         }
3485         else
3486         {
3487                 object_desc(tmp_str, o_ptr, TRUE, 1);
3488 #ifdef JP
3489 msg_format("¡ð%d ¤Ç%s¤ò²þÎɤ·¤Þ¤·¤¿¡£", cost * o_ptr->number, tmp_str );
3490 #else
3491                 msg_format("Improved %s for %d gold.", tmp_str, cost * o_ptr->number);
3492 #endif
3493
3494 //              msg_print(NULL);
3495
3496                 /* Charge the money */
3497                 p_ptr->au -= (cost * o_ptr->number);
3498
3499                 if (item >= INVEN_RARM) calc_android_exp();
3500
3501                 /* Something happened */
3502                 return (TRUE);
3503         }
3504 }
3505
3506
3507 /*
3508  * Recharge rods, wands and staves
3509  *
3510  * The player can select the number of charges to add
3511  * (up to a limit), and the recharge never fails.
3512  *
3513  * The cost for rods depends on the level of the rod. The prices
3514  * for recharging wands and staves are dependent on the cost of
3515  * the base-item.
3516  */
3517 static void building_recharge(void)
3518 {
3519         int         item, lev;
3520         object_type *o_ptr;
3521         object_kind *k_ptr;
3522         cptr        q, s;
3523         int         price;
3524         int         charges;
3525         int         max_charges;
3526         char        tmp_str[MAX_NLEN];
3527
3528         msg_flag = FALSE;
3529
3530         /* Display some info */
3531         clear_bldg(4, 18);
3532 #ifdef JP
3533 prt("  ºÆ½¼Å¶¤ÎÈñÍѤϥ¢¥¤¥Æ¥à¤Î¼ïÎà¤Ë¤è¤ê¤Þ¤¹¡£", 6, 0);
3534 #else
3535         prt("  The prices of recharge depend on the type.", 6, 0);
3536 #endif
3537
3538
3539         /* Only accept legal items */
3540         item_tester_hook = item_tester_hook_recharge;
3541
3542         /* Get an item */
3543 #ifdef JP
3544 q = "¤É¤Î¥¢¥¤¥Æ¥à¤ËËâÎϤò½¼Å¶¤·¤Þ¤¹¤«? ";
3545 s = "ËâÎϤò½¼Å¶¤¹¤Ù¤­¥¢¥¤¥Æ¥à¤¬¤Ê¤¤¡£";
3546 #else
3547         q = "Recharge which item? ";
3548         s = "You have nothing to recharge.";
3549 #endif
3550
3551         if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return;
3552
3553         /* Get the item (in the pack) */
3554         if (item >= 0)
3555         {
3556                 o_ptr = &inventory[item];
3557         }
3558
3559         /* Get the item (on the floor) */
3560         else
3561         {
3562                 o_ptr = &o_list[0 - item];
3563         }
3564
3565         k_ptr = &k_info[o_ptr->k_idx];
3566
3567         /*
3568          * We don't want to give the player free info about
3569          * the level of the item or the number of charges.
3570          */
3571         /* The item must be "known" */
3572         if (!object_known_p(o_ptr))
3573         {
3574 #ifdef JP
3575 msg_format("½¼Å¶¤¹¤ëÁ°¤Ë´ÕÄꤵ¤ì¤Æ¤¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡ª");
3576 #else
3577                 msg_format("The item must be identified first!");
3578 #endif
3579
3580                 msg_print(NULL);
3581
3582                 if ((p_ptr->au >= 50) &&
3583 #ifdef JP
3584 get_check("¡ð50¤Ç´ÕÄꤷ¤Þ¤¹¤«¡© "))
3585 #else
3586                         get_check("Identify for 50 gold? "))
3587 #endif
3588
3589                 {
3590                         /* Pay the price */
3591                         p_ptr->au -= 50;
3592
3593                         /* Identify it */
3594                         identify_item(o_ptr);
3595
3596                         /* Description */
3597                         object_desc(tmp_str, o_ptr, TRUE, 3);
3598
3599 #ifdef JP
3600 msg_format("%s ¤Ç¤¹¡£", tmp_str);
3601 #else
3602                         msg_format("You have: %s.", tmp_str);
3603 #endif
3604
3605
3606                         /* Update the gold display */
3607                         building_prt_gold();
3608                 }
3609                 else
3610                 {
3611                         return;
3612                 }
3613         }
3614
3615         /* Extract the object "level" */
3616         lev = get_object_level(o_ptr);
3617
3618         /* Price for a rod */
3619         if (o_ptr->tval == TV_ROD)
3620         {
3621                 if (o_ptr->timeout > 0)
3622                 {
3623                         /* Fully recharge */
3624                         price = (lev * 50 * o_ptr->timeout) / k_ptr->pval;
3625                 }
3626                 else
3627                 {
3628                         /* No recharge necessary */
3629                         price = 0;
3630 #ifdef JP
3631 msg_format("¤½¤ì¤ÏºÆ½¼Å¶¤¹¤ëɬÍפϤ¢¤ê¤Þ¤»¤ó¡£");
3632 #else
3633                         msg_format("That doesn't need to be recharged.");
3634 #endif
3635
3636 //                      msg_print(NULL);
3637                         return;
3638                 }
3639         }
3640         else if (o_ptr->tval == TV_STAFF)
3641         {
3642                 /* Price per charge ( = double the price paid by shopkeepers for the charge) */
3643                 price = (get_object_cost(o_ptr) / 10) * o_ptr->number;
3644
3645                 /* Pay at least 10 gold per charge */
3646                 price = MAX(10, price);
3647         }
3648         else
3649         {
3650                 /* Price per charge ( = double the price paid by shopkeepers for the charge) */
3651                 price = (get_object_cost(o_ptr) / 10);
3652
3653                 /* Pay at least 10 gold per charge */
3654                 price = MAX(10, price);
3655         }
3656
3657         /* Limit the number of charges for wands and staffs */
3658         if (o_ptr->tval == TV_WAND
3659                 && (o_ptr->pval / o_ptr->number >= k_ptr->pval))
3660         {
3661                 if (o_ptr->number > 1)
3662                 {
3663 #ifdef JP
3664 msg_print("¤³¤ÎËâË¡ËÀ¤Ï¤â¤¦½¼Ê¬¤Ë½¼Å¶¤µ¤ì¤Æ¤¤¤Þ¤¹¡£");
3665 #else
3666                         msg_print("These wands are already fully charged.");
3667 #endif
3668                 }
3669                 else
3670                 {
3671 #ifdef JP
3672 msg_print("¤³¤ÎËâË¡ËÀ¤Ï¤â¤¦½¼Ê¬¤Ë½¼Å¶¤µ¤ì¤Æ¤¤¤Þ¤¹¡£");
3673 #else
3674                         msg_print("This wand is already fully charged.");
3675 #endif
3676                 }
3677 //              msg_print(NULL);
3678                 return;
3679         }
3680         else if (o_ptr->tval == TV_STAFF && o_ptr->pval >= k_ptr->pval)
3681         {
3682                 if (o_ptr->number > 1)
3683                 {
3684 #ifdef JP
3685 msg_print("¤³¤Î¾ó¤Ï¤â¤¦½¼Ê¬¤Ë½¼Å¶¤µ¤ì¤Æ¤¤¤Þ¤¹¡£");
3686 #else
3687                         msg_print("These staffs are already fully charged.");
3688 #endif
3689                 }
3690                 else
3691                 {
3692 #ifdef JP
3693 msg_print("¤³¤Î¾ó¤Ï¤â¤¦½¼Ê¬¤Ë½¼Å¶¤µ¤ì¤Æ¤¤¤Þ¤¹¡£");
3694 #else
3695                         msg_print("This staff is already fully charged.");
3696 #endif
3697                 }
3698 //              msg_print(NULL);
3699                 return;
3700         }
3701
3702         /* Check if the player has enough money */
3703         if (p_ptr->au < price)
3704         {
3705                 object_desc(tmp_str, o_ptr, TRUE, 0);
3706 #ifdef JP
3707 msg_format("%s¤òºÆ½¼Å¶¤¹¤ë¤Ë¤Ï¡ð%d É¬ÍפǤ¹¡ª", tmp_str,price );
3708 #else
3709                 msg_format("You need %d gold to recharge %s!", price, tmp_str);
3710 #endif
3711
3712 //              msg_print(NULL);
3713                 return;
3714         }
3715
3716         if (o_ptr->tval == TV_ROD)
3717         {
3718 #ifdef JP
3719 if (get_check(format("¤½¤Î¥í¥Ã¥É¤ò¡ð%d ¤ÇºÆ½¼Å¶¤·¤Þ¤¹¤«¡©",
3720  price)))
3721 #else
3722                 if (get_check(format("Recharge the %s for %d gold? ",
3723                         ((o_ptr->number > 1) ? "rods" : "rod"), price)))
3724 #endif
3725
3726                 {
3727                         /* Recharge fully */
3728                         o_ptr->timeout = 0;
3729                 }
3730                 else
3731                 {
3732                         return;
3733                 }
3734         }
3735         else
3736         {
3737                 if (o_ptr->tval == TV_STAFF)
3738                         max_charges = k_ptr->pval - o_ptr->pval;
3739                 else
3740                         max_charges = o_ptr->number * k_ptr->pval - o_ptr->pval;
3741
3742                 /* Get the quantity for staves and wands */
3743 #ifdef JP
3744 charges = get_quantity(format("°ì²óʬ¡ð%d ¤Ç²¿²óʬ½¼Å¶¤·¤Þ¤¹¤«¡©",
3745 #else
3746                 charges = get_quantity(format("Add how many charges for %d gold? ",
3747 #endif
3748
3749                               price), MIN(p_ptr->au / price, max_charges));
3750
3751                 /* Do nothing */
3752                 if (charges < 1) return;
3753
3754                 /* Get the new price */
3755                 price *= charges;
3756
3757                 /* Recharge */
3758                 o_ptr->pval += charges;
3759
3760                 /* We no longer think the item is empty */
3761                 o_ptr->ident &= ~(IDENT_EMPTY);
3762         }
3763
3764         /* Give feedback */
3765         object_desc(tmp_str, o_ptr, TRUE, 3);
3766 #ifdef JP
3767 msg_format("%s¤ò¡ð%d ¤ÇºÆ½¼Å¶¤·¤Þ¤·¤¿¡£", tmp_str, price);
3768 #else
3769         msg_format("%^s %s recharged for %d gold.", tmp_str, ((o_ptr->number > 1) ? "were" : "was"), price);
3770 #endif
3771
3772 //      msg_print(NULL);
3773
3774         /* Combine / Reorder the pack (later) */
3775         p_ptr->notice |= (PN_COMBINE | PN_REORDER);
3776
3777         /* Window stuff */
3778         p_ptr->window |= (PW_INVEN);
3779
3780         /* Pay the price */
3781         p_ptr->au -= price;
3782
3783         /* Finished */
3784         return;
3785 }
3786
3787
3788 /*
3789  * Recharge rods, wands and staves
3790  *
3791  * The player can select the number of charges to add
3792  * (up to a limit), and the recharge never fails.
3793  *
3794  * The cost for rods depends on the level of the rod. The prices
3795  * for recharging wands and staves are dependent on the cost of
3796  * the base-item.
3797  */
3798 static void building_recharge_all(void)
3799 {
3800         int         i;
3801         int         lev;
3802         object_type *o_ptr;
3803         object_kind *k_ptr;
3804         int         price = 0;
3805         int         total_cost = 0;
3806
3807
3808         /* Display some info */
3809         msg_flag = FALSE;
3810         clear_bldg(4, 18);
3811 #ifdef JP
3812         prt("  ºÆ½¼Å¶¤ÎÈñÍѤϥ¢¥¤¥Æ¥à¤Î¼ïÎà¤Ë¤è¤ê¤Þ¤¹¡£", 6, 0);
3813 #else
3814         prt("  The prices of recharge depend on the type.", 6, 0);
3815 #endif
3816
3817         /* Calculate cost */
3818         for ( i = 0; i < INVEN_PACK; i++)
3819         {
3820                 o_ptr = &inventory[i];
3821                                 
3822                 /* skip non magic device */
3823                 if (o_ptr->tval < TV_STAFF || o_ptr->tval > TV_ROD) continue;
3824
3825                 /* need identified */
3826                 if (!object_known_p(o_ptr)) total_cost += 50;
3827
3828                 /* Extract the object "level" */
3829                 lev = get_object_level(o_ptr);
3830
3831                 k_ptr = &k_info[o_ptr->k_idx];
3832
3833                 switch (o_ptr->tval)
3834                 {
3835                 case TV_ROD:
3836                         price = (lev * 50 * o_ptr->timeout) / k_ptr->pval;
3837                         break;
3838
3839                 case TV_STAFF:
3840                         /* Price per charge ( = double the price paid by shopkeepers for the charge) */
3841                         price = (get_object_cost(o_ptr) / 10) * o_ptr->number;
3842
3843                         /* Pay at least 10 gold per charge */
3844                         price = MAX(10, price);
3845
3846                         /* Fully charge */
3847                         price = (k_ptr->pval - o_ptr->pval) * price;
3848                         break;
3849
3850                 case TV_WAND:
3851                         /* Price per charge ( = double the price paid by shopkeepers for the charge) */
3852                         price = (get_object_cost(o_ptr) / 10);
3853
3854                         /* Pay at least 10 gold per charge */
3855                         price = MAX(10, price);
3856
3857                         /* Fully charge */
3858                         price = (o_ptr->number * k_ptr->pval - o_ptr->pval) * price;
3859                         break;
3860                 }
3861
3862                 /* if price <= 0 then item have enough charge */
3863                 if (price > 0) total_cost += price;
3864         }
3865
3866         if (!total_cost)
3867         {
3868 #ifdef JP
3869                 msg_print("½¼Å¶¤¹¤ëɬÍפϤ¢¤ê¤Þ¤»¤ó¡£");
3870 #else
3871                 msg_print("No need to recharge.");
3872 #endif
3873
3874                 msg_print(NULL);
3875                 return;
3876         }
3877
3878         /* Check if the player has enough money */
3879         if (p_ptr->au < total_cost)
3880         {
3881 #ifdef JP
3882                 msg_format("¤¹¤Ù¤Æ¤Î¥¢¥¤¥Æ¥à¤òºÆ½¼Å¶¤¹¤ë¤Ë¤Ï¡ð%d É¬ÍפǤ¹¡ª", total_cost );
3883 #else
3884                 msg_format("You need %d gold to recharge all items!",total_cost);
3885 #endif
3886
3887                 msg_print(NULL);
3888                 return;
3889         }
3890
3891 #ifdef JP
3892         if (!get_check(format("¤¹¤Ù¤Æ¤Î¥¢¥¤¥Æ¥à¤ò ¡ð%d ¤ÇºÆ½¼Å¶¤·¤Þ¤¹¤«¡©",  total_cost))) return;
3893 #else
3894         if (!get_check(format("Recharge all items for %d gold? ", total_cost))) return;
3895 #endif
3896
3897         for (i = 0; i < INVEN_PACK; i++)
3898         {
3899                 o_ptr = &inventory[i];
3900                 k_ptr = &k_info[o_ptr->k_idx];
3901                                 
3902                 /* skip non magic device */
3903                 if (o_ptr->tval < TV_STAFF || o_ptr->tval > TV_ROD) continue;
3904
3905                 /* Identify it */
3906                 if (!object_known_p(o_ptr)) identify_item(o_ptr);
3907
3908                 /* Recharge */
3909                 switch (o_ptr->tval)
3910                 {
3911                 case TV_ROD:
3912                         o_ptr->timeout = 0;
3913                         break;
3914                 case TV_STAFF:
3915                         if (o_ptr->pval < k_ptr->pval) o_ptr->pval = k_ptr->pval;
3916                         /* We no longer think the item is empty */
3917                         o_ptr->ident &= ~(IDENT_EMPTY);
3918                         break;
3919                 case TV_WAND:
3920                         if (o_ptr->pval < o_ptr->number * k_ptr->pval)
3921                                 o_ptr->pval = o_ptr->number * k_ptr->pval;
3922                         /* We no longer think the item is empty */
3923                         o_ptr->ident &= ~(IDENT_EMPTY);
3924                         break;
3925                 }
3926         }
3927
3928         /* Give feedback */
3929 #ifdef JP
3930         msg_format("¡ð%d ¤ÇºÆ½¼Å¶¤·¤Þ¤·¤¿¡£", total_cost);
3931 #else
3932         msg_format("You pay %d gold.", total_cost);
3933 #endif
3934
3935         msg_print(NULL);
3936
3937         /* Combine / Reorder the pack (later) */
3938         p_ptr->notice |= (PN_COMBINE | PN_REORDER);
3939
3940         /* Window stuff */
3941         p_ptr->window |= (PW_INVEN);
3942
3943         /* Pay the price */
3944         p_ptr->au -= total_cost;
3945
3946         /* Finished */
3947         return;
3948 }
3949
3950
3951 bool tele_town(void)
3952 {
3953         int i, x, y;
3954         int num = 0;
3955
3956         if (dun_level)
3957         {
3958 #ifdef JP
3959                 msg_print("¤³¤ÎËâË¡¤ÏÃϾå¤Ç¤·¤«»È¤¨¤Ê¤¤¡ª");
3960 #else
3961                 msg_print("This spell can only be used on the surface!");
3962 #endif
3963                 return FALSE;
3964         }
3965
3966         if (p_ptr->inside_arena || p_ptr->inside_battle)
3967         {
3968 #ifdef JP
3969                 msg_print("¤³¤ÎËâË¡¤Ï³°¤Ç¤·¤«»È¤¨¤Ê¤¤¡ª");
3970 #else
3971                 msg_print("This spell can only be used outside!");
3972 #endif
3973                 return FALSE;
3974         }
3975
3976         screen_save();
3977         clear_bldg(4, 10);
3978
3979         for (i=1;i<max_towns;i++)
3980         {
3981                 char buf[80];
3982
3983                 if ((i == NO_TOWN) || (i == SECRET_TOWN) || (i == p_ptr->town_num) || !(p_ptr->visit & (1L << (i-1)))) continue;
3984
3985                 sprintf(buf,"%c) %-20s", I2A(i-1), town[i].name);
3986                 prt(buf, 5+i, 5);
3987                 num++;
3988         }
3989
3990         if (!num)
3991         {
3992 #ifdef JP
3993                 msg_print("¤Þ¤À¹Ô¤±¤ë¤È¤³¤í¤¬¤Ê¤¤¡£");
3994 #else
3995                 msg_print("You have not yet visited any town.");
3996 #endif
3997
3998                 msg_print(NULL);
3999                 screen_load();
4000                 return FALSE;
4001         }
4002
4003 #ifdef JP
4004         prt("¤É¤³¤Ë¹Ô¤­¤Þ¤¹¤«:", 0, 0);
4005 #else
4006         prt("Which town you go: ", 0, 0);
4007 #endif
4008         while(1)
4009         {
4010                 i = inkey();
4011
4012                 if (i == ESCAPE)
4013                 {
4014                         screen_load();
4015                         return FALSE;
4016                 }
4017                 else if ((i < 'a') || (i > ('a'+max_towns-2))) continue;
4018                 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;
4019                 break;
4020         }
4021
4022         for (y = 0; y < max_wild_y; y++)
4023         {
4024                 for (x = 0; x < max_wild_x; x++)
4025                 {
4026                         if(wilderness[y][x].town == (i-'a'+1))
4027                         {
4028                                 p_ptr->wilderness_y = y;
4029                                 p_ptr->wilderness_x = x;
4030                         }
4031                 }
4032         }
4033         p_ptr->leftbldg = TRUE;
4034         p_ptr->leaving = TRUE;
4035         leave_bldg = TRUE;
4036         p_ptr->teleport_town = TRUE;
4037         screen_load();
4038         return TRUE;
4039 }
4040
4041
4042 /*
4043  * Execute a building command
4044  */
4045 static void bldg_process_command(building_type *bldg, int i)
4046 {
4047         int bact = bldg->actions[i];
4048         int bcost;
4049         bool paid = FALSE;
4050         bool set_reward = FALSE;
4051         int amt;
4052
4053         /* Flush messages XXX XXX XXX */
4054         msg_flag = FALSE;
4055         msg_print(NULL);
4056
4057         if (is_owner(bldg))
4058                 bcost = bldg->member_costs[i];
4059         else
4060                 bcost = bldg->other_costs[i];
4061
4062         /* action restrictions */
4063         if (((bldg->action_restr[i] == 1) && !is_member(bldg)) ||
4064             ((bldg->action_restr[i] == 2) && !is_owner(bldg)))
4065         {
4066 #ifdef JP
4067 msg_print("¤½¤ì¤òÁªÂò¤¹¤ë¸¢Íø¤Ï¤¢¤ê¤Þ¤»¤ó¡ª");
4068 #else
4069                 msg_print("You have no right to choose that!");
4070 #endif
4071
4072 //              msg_print(NULL);
4073                 return;
4074         }
4075
4076         /* check gold (HACK - Recharge uses variable costs) */
4077         if ((bact != BACT_RECHARGE) &&
4078             (((bldg->member_costs[i] > p_ptr->au) && is_owner(bldg)) ||
4079              ((bldg->other_costs[i] > p_ptr->au) && !is_owner(bldg))))
4080         {
4081 #ifdef JP
4082 msg_print("¤ª¶â¤¬Â­¤ê¤Þ¤»¤ó¡ª");
4083 #else
4084                 msg_print("You do not have the gold!");
4085 #endif
4086
4087 //              msg_print(NULL);
4088                 return;
4089         }
4090
4091         if (!bcost) set_reward = TRUE;
4092
4093 #ifdef USE_SCRIPT
4094
4095         if (building_command_callback(cave[py][px].feat - FEAT_BLDG_HEAD, i))
4096         {
4097                 /* Script paid the price */
4098                 paid = TRUE;
4099         }
4100         else
4101
4102 #endif /* USE_SCRIPT */
4103
4104         {
4105                 switch (bact)
4106                 {
4107                         case BACT_NOTHING:
4108                                 /* Do nothing */
4109                                 break;
4110                         case BACT_RESEARCH_ITEM:
4111                                 paid = identify_fully(FALSE);
4112                                 break;
4113                         case BACT_TOWN_HISTORY:
4114                                 town_history();
4115                                 break;
4116                         case BACT_RACE_LEGENDS:
4117                                 race_legends();
4118                                 break;
4119                         case BACT_QUEST:
4120                                 castle_quest();
4121                                 break;
4122                         case BACT_KING_LEGENDS:
4123                         case BACT_ARENA_LEGENDS:
4124                         case BACT_LEGENDS:
4125                                 show_highclass(building_loc);
4126                                 break;
4127                         case BACT_POSTER:
4128                         case BACT_ARENA_RULES:
4129                         case BACT_ARENA:
4130                                 arena_comm(bact);
4131                                 break;
4132                         case BACT_IN_BETWEEN:
4133                         case BACT_CRAPS:
4134                         case BACT_SPIN_WHEEL:
4135                         case BACT_DICE_SLOTS:
4136                         case BACT_GAMBLE_RULES:
4137                         case BACT_POKER:
4138                                 gamble_comm(bact);
4139                                 break;
4140                         case BACT_REST:
4141                         case BACT_RUMORS:
4142                         case BACT_FOOD:
4143                                 paid = inn_comm(bact);
4144                                 break;
4145                         case BACT_RESEARCH_MONSTER:
4146                                 paid = research_mon();
4147                                 break;
4148                         case BACT_COMPARE_WEAPONS:
4149                                 paid = compare_weapons();
4150                                 break;
4151                         case BACT_ENCHANT_WEAPON:
4152                                 item_tester_hook = item_tester_hook_melee_weapon;
4153                                 enchant_item(bcost, 1, 1, 0);
4154                                 break;
4155                         case BACT_ENCHANT_ARMOR:
4156                                 item_tester_hook = item_tester_hook_armour;
4157                                 enchant_item(bcost, 0, 0, 1);
4158                                 break;
4159                         case BACT_RECHARGE:
4160                                 building_recharge();
4161                                 break;
4162                         case BACT_RECHARGE_ALL:
4163                                 building_recharge_all();
4164                                 break;
4165                         case BACT_IDENTS: /* needs work */
4166 #ifdef JP
4167                                 if (!get_check("»ý¤Áʪ¤òÁ´¤Æ´ÕÄꤷ¤Æ¤è¤í¤·¤¤¤Ç¤¹¤«¡©")) break;
4168                                 identify_pack();
4169                                 msg_print(" »ý¤ÁʪÁ´¤Æ¤¬´ÕÄꤵ¤ì¤Þ¤·¤¿¡£");
4170 #else
4171                                 if (!get_check("Do you pay for identify all your possession? ")) break;
4172                                 identify_pack();
4173                                 msg_print("Your possessions have been identified.");
4174 #endif
4175
4176                                 paid = TRUE;
4177                                 break;
4178                         case BACT_IDENT_ONE: /* needs work */
4179                                 paid = ident_spell(FALSE);
4180                                 break;
4181                         case BACT_LEARN:
4182                                 do_cmd_study();
4183                                 break;
4184                         case BACT_HEALING: /* needs work */
4185                                 hp_player(200);
4186                                 set_poisoned(0);
4187                                 set_blind(0);
4188                                 set_confused(0);
4189                                 set_cut(0);
4190                                 set_stun(0);
4191                                 paid = TRUE;
4192                                 break;
4193                         case BACT_RESTORE: /* needs work */
4194                                 if (do_res_stat(A_STR)) paid = TRUE;
4195                                 if (do_res_stat(A_INT)) paid = TRUE;
4196                                 if (do_res_stat(A_WIS)) paid = TRUE;
4197                                 if (do_res_stat(A_DEX)) paid = TRUE;
4198                                 if (do_res_stat(A_CON)) paid = TRUE;
4199                                 if (do_res_stat(A_CHR)) paid = TRUE;
4200                                 break;
4201                         case BACT_GOLD: /* set timed reward flag */
4202                                 if (!p_ptr->rewards[BACT_GOLD])
4203                                 {
4204                                         share_gold();
4205                                         p_ptr->rewards[BACT_GOLD] = TRUE;
4206                                 }
4207                                 else
4208                                 {
4209 #ifdef JP
4210 msg_print("º£Æü¤Îʬ¤±Á°¤Ï¤¹¤Ç¤Ë»Ùʧ¤Ã¤¿¤¾¡ª");
4211 #else
4212                                         msg_print("You just had your daily allowance!");
4213 #endif
4214
4215 //                                      msg_print(NULL);
4216                                 }
4217                                 break;
4218                         case BACT_ENCHANT_ARROWS:
4219                                 item_tester_hook = item_tester_hook_ammo;
4220                                 enchant_item(bcost, 1, 1, 0);
4221                                 break;
4222                         case BACT_ENCHANT_BOW:
4223                                 item_tester_tval = TV_BOW;
4224                                 enchant_item(bcost, 1, 1, 0);
4225                                 break;
4226                         case BACT_RECALL:
4227                                 if (recall_player(1)) paid = TRUE;
4228                                 break;
4229                         case BACT_TELEPORT_LEVEL:
4230                         {
4231                                 int select_dungeon;
4232                                 int i, num = 0;
4233                                 s16b *dun;
4234                                 int max_depth;
4235
4236                                 /* Allocate the "dun" array */
4237                                 C_MAKE(dun, max_d_idx, s16b);
4238
4239                                 screen_save();
4240                                 clear_bldg(4, 20);
4241
4242                                 for(i = 1; i < max_d_idx; i++)
4243                                 {
4244                                         char buf[80];
4245                                         bool seiha = FALSE;
4246
4247                                         if (!d_info[i].maxdepth) continue;
4248                                         if (!max_dlv[i]) continue;
4249                                         if (d_info[i].final_guardian)
4250                                         {
4251                                                 if (!r_info[d_info[i].final_guardian].max_num) seiha = TRUE;
4252                                         }
4253                                         else if (max_dlv[i] == d_info[i].maxdepth) seiha = TRUE;
4254
4255 #ifdef JP
4256                                         sprintf(buf,"%c) %c%-12s : ºÇÂç %d ³¬", 'a'+num, seiha ? '!' : ' ', d_name + d_info[i].name, max_dlv[i]);
4257 #else
4258                                         sprintf(buf,"%c) %c%-12s : Max level %d", 'a'+num, seiha ? '!' : ' ', d_name + d_info[i].name, max_dlv[i]);
4259 #endif
4260                                         put_str(buf, 4+num, 5);
4261                                         dun[num] = i;
4262                                         num++;
4263                                 }
4264 #ifdef JP
4265                                 prt("¤É¤Î¥À¥ó¥¸¥ç¥ó¤Ë¥Æ¥ì¥Ý¡¼¥È¤·¤Þ¤¹¤«:", 0, 0);
4266 #else
4267                                 prt("Which dungeon do you teleport?: ", 0, 0);
4268 #endif
4269                                 while(1)
4270                                 {
4271                                         i = inkey();
4272
4273                                         if (i == ESCAPE)
4274                                         {
4275                                                 screen_load();
4276                                                 return;
4277                                         }
4278                                         if (i >= 'a' && i <('a'+num))
4279                                         {
4280                                                 select_dungeon = dun[i-'a'];
4281                                                 break;
4282                                         }
4283                                         else bell();
4284                                 }
4285                                 screen_load();
4286
4287                                 max_depth = d_info[select_dungeon].maxdepth;
4288
4289                                 /* Limit depth in Angband */
4290                                 if (select_dungeon == DUNGEON_ANGBAND)
4291                                 {
4292                                         if (quest[QUEST_OBERON].status != QUEST_STATUS_FINISHED) max_depth = 98;
4293                                         else if(quest[QUEST_SERPENT].status != QUEST_STATUS_FINISHED) max_depth = 99;
4294                                 }
4295
4296 #ifdef JP
4297 amt = get_quantity(format("%s¤Î²¿³¬¤Ë¥Æ¥ì¥Ý¡¼¥È¤·¤Þ¤¹¤«¡©", d_name + d_info[select_dungeon].name), max_depth);
4298 #else
4299 amt = get_quantity(format("Teleport to which level of %s? ", d_name + d_info[select_dungeon].name), max_depth);
4300 #endif
4301
4302                                 if (amt > 0)
4303                                 {
4304                                         p_ptr->word_recall = 1;
4305                                         p_ptr->recall_dungeon = select_dungeon;
4306                                         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));
4307                                         if (record_maxdeapth)
4308 #ifdef JP
4309                                                 do_cmd_write_nikki(NIKKI_TRUMP, select_dungeon, "¥È¥é¥ó¥×¥¿¥ï¡¼¤Ç");
4310 #else
4311                                                 do_cmd_write_nikki(NIKKI_TRUMP, select_dungeon, "at Trump Tower");
4312 #endif
4313 #ifdef JP
4314 msg_print("²ó¤ê¤ÎÂ絤¤¬Ä¥¤ê¤Ä¤á¤Æ¤­¤¿...");
4315 #else
4316                                         msg_print("The air about you becomes charged...");
4317 #endif
4318
4319                                         paid = TRUE;
4320                                         p_ptr->redraw |= (PR_STATUS);
4321                                 }
4322                                 break;
4323                         }
4324                         case BACT_LOSE_MUTATION:
4325                                 paid = lose_mutation(0);
4326                                 /* ToDo: Better message text. */
4327                                 if (!paid)
4328 #ifdef JP
4329 msg_print("´ñ̯¤Ê¤¯¤é¤¤ÉáÄ̤ˤʤ俵¤¤¬¤¹¤ë¡£");
4330 #else
4331                                         msg_print("You feel oddly normal.");
4332 #endif
4333
4334
4335                                 break;
4336                         case BACT_BATTLE:
4337                                 kakutoujou();
4338                                 break;
4339                         case BACT_TSUCHINOKO:
4340                                 tsuchinoko();
4341                                 break;
4342                         case BACT_KUBI:
4343                                 shoukinkubi();
4344                                 break;
4345                         case BACT_TARGET:
4346                                 today_target();
4347                                 break;
4348                         case BACT_KANKIN:
4349                                 kankin();
4350                                 break;
4351                         case BACT_HEIKOUKA:
4352 #ifdef JP
4353 msg_print("Ê¿¹Õ²½¤Îµ·¼°¤ò¹Ô¤Ê¤Ã¤¿¡£");
4354 #else
4355  msg_print("You received an equalization ritual.");
4356 #endif
4357                                 set_virtue(V_COMPASSION, 0);
4358                                 set_virtue(V_HONOUR, 0);
4359                                 set_virtue(V_JUSTICE, 0);
4360                                 set_virtue(V_SACRIFICE, 0);
4361                                 set_virtue(V_KNOWLEDGE, 0);
4362                                 set_virtue(V_FAITH, 0);
4363                                 set_virtue(V_ENLIGHTEN, 0);
4364                                 set_virtue(V_ENCHANT, 0);
4365                                 set_virtue(V_CHANCE, 0);
4366                                 set_virtue(V_NATURE, 0);
4367                                 set_virtue(V_HARMONY, 0);
4368                                 set_virtue(V_VITALITY, 0);
4369                                 set_virtue(V_UNLIFE, 0);
4370                                 set_virtue(V_PATIENCE, 0);
4371                                 set_virtue(V_TEMPERANCE, 0);
4372                                 set_virtue(V_DILIGENCE, 0);
4373                                 set_virtue(V_VALOUR, 0);
4374                                 set_virtue(V_INDIVIDUALISM, 0);
4375                                 get_virtues();
4376                                 paid = TRUE;
4377                                 break;
4378                         case BACT_TELE_TOWN:
4379                                 paid = tele_town();
4380                                 break;
4381                 }
4382         }
4383
4384         if (paid)
4385         {
4386                 p_ptr->au -= bcost;
4387         }
4388 }
4389
4390
4391 /*
4392  * Enter quest level
4393  */
4394 void do_cmd_quest(void)
4395 {
4396         energy_use = 100;
4397
4398         if (cave[py][px].feat != FEAT_QUEST_ENTER)
4399         {
4400 #ifdef JP
4401 msg_print("¤³¤³¤Ë¤Ï¥¯¥¨¥¹¥È¤ÎÆþ¸ý¤Ï¤Ê¤¤¡£");
4402 #else
4403                 msg_print("You see no quest level here.");
4404 #endif
4405
4406                 return;
4407         }
4408         else
4409         {
4410 #ifdef JP
4411                 msg_print("¤³¤³¤Ë¤Ï¥¯¥¨¥¹¥È¤Ø¤ÎÆþ¸ý¤¬¤¢¤ê¤Þ¤¹¡£");
4412                 if (!get_check("¥¯¥¨¥¹¥È¤ËÆþ¤ê¤Þ¤¹¤«¡©")) return;
4413                 if ((p_ptr->pseikaku == SEIKAKU_COMBAT) || (inventory[INVEN_BOW].name1 == ART_CRIMSON))
4414                         msg_print("¡Ø¤È¤Ë¤«¤¯Æþ¤Ã¤Æ¤ß¤è¤¦¤¼¤§¡£¡Ù");
4415 #else
4416                 msg_print("There is an entry of a quest.");
4417                 if (!get_check("Do you enter? ")) return;
4418 #endif
4419
4420                 /* Player enters a new quest */
4421                 p_ptr->oldpy = 0;
4422                 p_ptr->oldpx = 0;
4423
4424                 leaving_quest = p_ptr->inside_quest;
4425
4426                 /* Leaving an 'only once' quest marks it as failed */
4427                 if (leaving_quest &&
4428                         ((quest[leaving_quest].flags & QUEST_FLAG_ONCE) || (quest[leaving_quest].type == QUEST_TYPE_RANDOM)) &&
4429                         (quest[leaving_quest].status == QUEST_STATUS_TAKEN))
4430                 {
4431                         quest[leaving_quest].status = QUEST_STATUS_FAILED;
4432                         quest[leaving_quest].complev = p_ptr->lev;
4433                         if (quest[leaving_quest].type == QUEST_TYPE_RANDOM)
4434                         {
4435                                 r_info[quest[leaving_quest].r_idx].flags1 &= ~(RF1_QUESTOR);
4436                                 do_cmd_write_nikki(NIKKI_RAND_QUEST_F, leaving_quest, NULL);
4437                         }
4438                         else if (record_fix_quest)
4439                                 do_cmd_write_nikki(NIKKI_FIX_QUEST_F, leaving_quest, NULL);
4440                 }
4441
4442                 p_ptr->inside_quest = cave[py][px].special;
4443                 if(quest[leaving_quest].type != QUEST_TYPE_RANDOM) dun_level = 1;
4444                 p_ptr->leftbldg = TRUE;
4445                 p_ptr->leaving = TRUE;
4446         }
4447 }
4448
4449
4450 /*
4451  * Do building commands
4452  */
4453 void do_cmd_bldg(void)
4454 {
4455         int             i, which;
4456         char            command;
4457         bool            validcmd;
4458         building_type   *bldg;
4459
4460
4461         energy_use = 100;
4462
4463         if (!((cave[py][px].feat >= FEAT_BLDG_HEAD) &&
4464                   (cave[py][px].feat <= FEAT_BLDG_TAIL)))
4465         {
4466 #ifdef JP
4467 msg_print("¤³¤³¤Ë¤Ï·úʪ¤Ï¤Ê¤¤¡£");
4468 #else
4469                 msg_print("You see no building here.");
4470 #endif
4471
4472                 return;
4473         }
4474
4475         which = (cave[py][px].feat - FEAT_BLDG_HEAD);
4476         building_loc = which;
4477
4478         bldg = &building[which];
4479
4480         /* Don't re-init the wilderness */
4481         reinit_wilderness = FALSE;
4482
4483         if ((which == 2) && (p_ptr->arena_number == 99))
4484         {
4485 #ifdef JP
4486 msg_print("¡ÖÇÔ¼Ô¤ËÍѤϤʤ¤¡£¡×");
4487 #else
4488                 msg_print("'There is no place for LOSER.'");
4489 #endif
4490                 return;
4491         }
4492         else if ((which == 2) && p_ptr->inside_arena && !p_ptr->exit_bldg)
4493         {
4494 #ifdef JP
4495 prt("¥²¡¼¥È¤ÏÊĤޤäƤ¤¤ë¡£¥â¥ó¥¹¥¿¡¼¤¬¤¢¤Ê¤¿¤òÂԤäƤ¤¤ë¡ª",0,0);
4496 #else
4497                 prt("The gates are closed.  The monster awaits!", 0, 0);
4498 #endif
4499
4500                 return;
4501         }
4502         else if ((which == 2) && p_ptr->inside_arena)
4503         {
4504                 p_ptr->leaving = TRUE;
4505                 p_ptr->inside_arena = FALSE;
4506         }
4507         else if (p_ptr->inside_battle)
4508         {
4509                 p_ptr->leaving = TRUE;
4510                 p_ptr->inside_battle = FALSE;
4511         }
4512         else
4513         {
4514                 p_ptr->oldpy = py;
4515                 p_ptr->oldpx = px;
4516         }
4517
4518         /* Forget the lite */
4519         forget_lite();
4520
4521         /* Forget the view */
4522         forget_view();
4523
4524         /* Hack -- Increase "icky" depth */
4525         character_icky++;
4526
4527         command_arg = 0;
4528         command_rep = 0;
4529         command_new = 0;
4530
4531         show_building(bldg);
4532         leave_bldg = FALSE;
4533
4534         while (!leave_bldg)
4535         {
4536                 validcmd = FALSE;
4537                 prt("", 1, 0);
4538
4539                 building_prt_gold();
4540
4541                 command = inkey();
4542
4543                 if (command == ESCAPE)
4544                 {
4545                         leave_bldg = TRUE;
4546                         p_ptr->inside_arena = FALSE;
4547                         p_ptr->inside_battle = FALSE;
4548                         break;
4549                 }
4550
4551                 for (i = 0; i < 8; i++)
4552                 {
4553                         if (bldg->letters[i])
4554                         {
4555                                 if (bldg->letters[i] == command)
4556                                 {
4557                                         validcmd = TRUE;
4558                                         break;
4559                                 }
4560                         }
4561                 }
4562
4563                 if (validcmd)
4564                         bldg_process_command(bldg, i);
4565
4566                 /* Notice stuff */
4567                 notice_stuff();
4568
4569                 /* Handle stuff */
4570                 handle_stuff();
4571         }
4572
4573         /* Flush messages XXX XXX XXX */
4574         msg_flag = FALSE;
4575         msg_print(NULL);
4576
4577         /* Reinit wilderness to activate quests ... */
4578         if (reinit_wilderness)
4579                 p_ptr->leaving = TRUE;
4580
4581         /* Hack -- Decrease "icky" depth */
4582         character_icky--;
4583
4584         /* Clear the screen */
4585         Term_clear();
4586
4587         /* Update the visuals */
4588         p_ptr->update |= (PU_VIEW | PU_MONSTERS | PU_BONUS | PU_LITE | PU_MON_LITE);
4589
4590         /* Redraw entire screen */
4591         p_ptr->redraw |= (PR_BASIC | PR_EXTRA | PR_EQUIPPY | PR_MAP);
4592
4593         /* Window stuff */
4594         p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
4595 }
4596
4597
4598 /* Array of places to find an inscription */
4599 static cptr find_quest[] =
4600 {
4601 #ifdef JP
4602 "¾²¤Ë¥á¥Ã¥»¡¼¥¸¤¬¹ï¤Þ¤ì¤Æ¤¤¤ë:",
4603 #else
4604         "You find the following inscription in the floor",
4605 #endif
4606
4607 #ifdef JP
4608 "Êɤ˥á¥Ã¥»¡¼¥¸¤¬¹ï¤Þ¤ì¤Æ¤¤¤ë:",
4609 #else
4610         "You see a message inscribed in the wall",
4611 #endif
4612
4613 #ifdef JP
4614 "¥á¥Ã¥»¡¼¥¸¤ò¸«¤Ä¤±¤¿:",
4615 #else
4616         "There is a sign saying",
4617 #endif
4618
4619 #ifdef JP
4620 "²¿¤«¤¬³¬Ãʤξå¤Ë½ñ¤¤¤Æ¤¢¤ë:",
4621 #else
4622         "Something is written on the staircase",
4623 #endif
4624
4625 #ifdef JP
4626 "´¬Êª¤ò¸«¤Ä¤±¤¿¡£¥á¥Ã¥»¡¼¥¸¤¬½ñ¤¤¤Æ¤¢¤ë:",
4627 #else
4628         "You find a scroll with the following message",
4629 #endif
4630
4631 };
4632
4633
4634 /*
4635  * Discover quest
4636  */
4637 void quest_discovery(int q_idx)
4638 {
4639         quest_type      *q_ptr = &quest[q_idx];
4640         monster_race    *r_ptr = &r_info[q_ptr->r_idx];
4641         int             q_num = q_ptr->max_num;
4642         char            name[80];
4643
4644         /* No quest index */
4645         if (!q_idx) return;
4646
4647         strcpy(name, (r_name + r_ptr->name));
4648
4649         msg_print(find_quest[rand_range(0, 4)]);
4650         msg_print(NULL);
4651
4652         if (q_num == 1)
4653         {
4654                 /* Unique */
4655 #ifdef JP
4656 msg_format("Ãí°Õ¤»¤è¡ª¤³¤Î³¬¤Ï%s¤Ë¤è¤Ã¤Æ¼é¤é¤ì¤Æ¤¤¤ë¡ª", name);
4657 #else
4658                 msg_format("Beware, this level is protected by %s!", name);
4659 #endif
4660
4661         }
4662         else
4663         {
4664                 /* Normal monsters */
4665 #ifdef JP
4666 msg_format("Ãí°Õ¤·¤í¡ª¤³¤Î³¬¤Ï%dÂΤÎ%s¤Ë¤è¤Ã¤Æ¼é¤é¤ì¤Æ¤¤¤ë¡ª", q_num, name);
4667 #else
4668                 plural_aux(name);
4669                 msg_format("Be warned, this level is guarded by %d %s!", q_num, name);
4670 #endif
4671
4672         }
4673 }
4674
4675
4676 /*
4677  * Hack -- Check if a level is a "quest" level
4678  */
4679 int quest_number(int level)
4680 {
4681         int i;
4682
4683         /* Check quests */
4684         if (p_ptr->inside_quest)
4685                 return (p_ptr->inside_quest);
4686
4687         for (i = 0; i < max_quests; i++)
4688         {
4689                 if (quest[i].status != QUEST_STATUS_TAKEN) continue;
4690
4691                 if ((quest[i].type == QUEST_TYPE_KILL_LEVEL) &&
4692                         !(quest[i].flags & QUEST_FLAG_PRESET) &&
4693                     (quest[i].level == level) &&
4694                     (quest[i].dungeon == dungeon_type))
4695                         return (i);
4696         }
4697
4698         /* Check for random quest */
4699         return (random_quest_number(level));
4700 }
4701
4702
4703 /*
4704  * Return the index of the random quest on this level
4705  * (or zero)
4706  */
4707 int random_quest_number(int level)
4708 {
4709         int i;
4710
4711         if (dungeon_type != DUNGEON_ANGBAND) return 0;
4712
4713         for (i = MIN_RANDOM_QUEST; i < MAX_RANDOM_QUEST + 1; i++)
4714         {
4715                 if ((quest[i].type == QUEST_TYPE_RANDOM) &&
4716                     (quest[i].status == QUEST_STATUS_TAKEN) &&
4717                     (quest[i].level == level) &&
4718                     (quest[i].dungeon == DUNGEON_ANGBAND))
4719                 {
4720                         return i;
4721                 }
4722         }
4723
4724         /* Nope */
4725         return 0;
4726 }