OSDN Git Service

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