OSDN Git Service

strchr_j()を英語版の含めて、my_strchr()にまとめた。strstr_j()についても同じく。
[hengbandforosx/hengbandosx.git] / src / spells2.c
1 /* File: spells2.c */
2
3 /*
4  * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke
5  *
6  * This software may be copied and distributed for educational, research,
7  * and not for profit purposes provided that this copyright and statement
8  * are included in all such copies.  Other copyrights may also apply.
9  */
10
11 /* Purpose: Spell code (part 2) */
12
13 #include "angband.h"
14 #include "grid.h"
15
16
17 /*
18  * self-knowledge... idea from nethack.  Useful for determining powers and
19  * resistences of items.  It saves the screen, clears it, then starts listing
20  * attributes, a screenful at a time.  (There are a LOT of attributes to
21  * list.  It will probably take 2 or 3 screens for a powerful character whose
22  * using several artifacts...) -CFT
23  *
24  * It is now a lot more efficient. -BEN-
25  *
26  * See also "identify_fully()".
27  *
28  * XXX XXX XXX Use the "show_file()" method, perhaps.
29  */
30 void self_knowledge(void)
31 {
32         int i = 0, j, k;
33
34         int v_nr = 0;
35         char v_string [8] [128];
36         char s_string [6] [128];
37
38         u32b flgs[TR_FLAG_SIZE];
39
40         object_type *o_ptr;
41
42         char Dummy[80];
43         char buf[2][80];
44
45         cptr info[220];
46
47         int plev = p_ptr->lev;
48
49         int percent;
50
51         for (j = 0; j < TR_FLAG_SIZE; j++)
52                 flgs[j] = 0L;
53
54         p_ptr->knowledge |= (KNOW_STAT | KNOW_HPRATE);
55
56         strcpy(Dummy, "");
57
58         percent = (int)(((long)p_ptr->player_hp[PY_MAX_LEVEL - 1] * 200L) /
59                 (2 * p_ptr->hitdie +
60                 ((PY_MAX_LEVEL - 1+3) * (p_ptr->hitdie + 1))));
61
62 #ifdef JP
63 sprintf(Dummy, "¸½ºß¤ÎÂÎÎÏ¥é¥ó¥¯ : %d/100", percent);
64 #else
65         sprintf(Dummy, "Your current Life Rating is %d/100.", percent);
66 #endif
67
68         strcpy(buf[0], Dummy);
69         info[i++] = buf[0];
70         info[i++] = "";
71
72         chg_virtue(V_KNOWLEDGE, 1);
73         chg_virtue(V_ENLIGHTEN, 1);
74
75         /* Acquire item flags from equipment */
76         for (k = INVEN_RARM; k < INVEN_TOTAL; k++)
77         {
78                 u32b tflgs[TR_FLAG_SIZE];
79
80                 o_ptr = &inventory[k];
81
82                 /* Skip non-objects */
83                 if (!o_ptr->k_idx) continue;
84
85                 /* Extract the flags */
86                 object_flags(o_ptr, tflgs);
87
88                 /* Extract flags */
89                 for (j = 0; j < TR_FLAG_SIZE; j++)
90                         flgs[j] |= tflgs[j];
91         }
92
93 #ifdef JP
94         info[i++] = "ǽÎϤκÇÂçÃÍ";
95 #else
96         info[i++] = "Limits of maximum stats";
97 #endif
98
99         for (v_nr = 0; v_nr < 6; v_nr++)
100         {
101                 char stat_desc[80];
102
103                 sprintf(stat_desc, "%s 18/%d", stat_names[v_nr], p_ptr->stat_max_max[v_nr]-18);
104
105                 strcpy(s_string[v_nr], stat_desc);
106
107                 info[i++] = s_string[v_nr];
108         }
109         info[i++] = "";
110
111 #ifdef JP
112         sprintf(Dummy, "¸½ºß¤Î°À­ : %s(%ld)", your_alignment(), p_ptr->align);
113 #else
114         sprintf(Dummy, "Your alighnment : %s(%ld)", your_alignment(), p_ptr->align);
115 #endif
116         strcpy(buf[1], Dummy);
117         info[i++] = buf[1];
118         for (v_nr = 0; v_nr < 8; v_nr++)
119         {
120                 char v_name [20];
121                 char vir_desc[80];
122                 int tester = p_ptr->virtues[v_nr];
123         
124                 strcpy(v_name, virtue[(p_ptr->vir_types[v_nr])-1]);
125  
126 #ifdef JP
127                 sprintf(vir_desc, "¤ª¤Ã¤È¡£%s¤Î¾ðÊó¤Ê¤·¡£", v_name);
128 #else
129                 sprintf(vir_desc, "Oops. No info about %s.", v_name);
130 #endif
131                 if (tester < -100)
132 #ifdef JP
133                         sprintf(vir_desc, "[%s]¤ÎÂжˠ(%d)",
134 #else
135                         sprintf(vir_desc, "You are the polar opposite of %s (%d).",
136 #endif
137                                 v_name, tester);
138                 else if (tester < -80)
139 #ifdef JP
140                         sprintf(vir_desc, "[%s]¤ÎÂçŨ (%d)",
141 #else
142                         sprintf(vir_desc, "You are an arch-enemy of %s (%d).",
143 #endif
144                                 v_name, tester);
145                 else if (tester < -60)
146 #ifdef JP
147                         sprintf(vir_desc, "[%s]¤Î¶¯Å¨ (%d)",
148 #else
149                         sprintf(vir_desc, "You are a bitter enemy of %s (%d).",
150 #endif
151                                 v_name, tester);
152                 else if (tester < -40)
153 #ifdef JP
154                         sprintf(vir_desc, "[%s]¤ÎŨ (%d)",
155 #else
156                         sprintf(vir_desc, "You are an enemy of %s (%d).",
157 #endif
158                                 v_name, tester);
159                 else if (tester < -20)
160 #ifdef JP
161                         sprintf(vir_desc, "[%s]¤Îºá¼Ô (%d)",
162 #else
163                         sprintf(vir_desc, "You have sinned against %s (%d).",
164 #endif
165                                 v_name, tester);
166                 else if (tester < 0)
167 #ifdef JP
168                         sprintf(vir_desc, "[%s]¤ÎÌÂÆ»¼Ô (%d)",
169 #else
170                         sprintf(vir_desc, "You have strayed from the path of %s (%d).",
171 #endif
172                                 v_name, tester);
173                 else if (tester == 0)                   
174 #ifdef JP
175                         sprintf(vir_desc, "[%s]¤ÎÃæΩ¼Ô (%d)",
176 #else
177                         sprintf(vir_desc,"You are neutral to %s (%d).",
178 #endif
179                                 v_name, tester);
180                 else if (tester < 20)
181 #ifdef JP
182                         sprintf(vir_desc, "[%s]¤Î¾®ÆÁ¼Ô (%d)",
183 #else
184                         sprintf(vir_desc,"You are somewhat virtuous in %s (%d).",
185 #endif
186                                 v_name, tester);
187                 else if (tester < 40)
188 #ifdef JP
189                         sprintf(vir_desc, "[%s]¤ÎÃæÆÁ¼Ô (%d)",
190 #else
191                         sprintf(vir_desc,"You are virtuous in %s (%d).",
192 #endif
193                                 v_name, tester);
194                 else if (tester < 60)
195 #ifdef JP
196                         sprintf(vir_desc, "[%s]¤Î¹âÆÁ¼Ô (%d)",
197 #else
198                         sprintf(vir_desc,"You are very virtuous in %s (%d).",
199 #endif
200                                 v_name, tester);
201                 else if (tester < 80)
202 #ifdef JP
203                         sprintf(vir_desc, "[%s]¤ÎÇƼԠ(%d)",
204 #else
205                         sprintf(vir_desc,"You are a champion of %s (%d).",
206 #endif
207                                 v_name, tester);
208                 else if (tester < 100)
209 #ifdef JP
210                         sprintf(vir_desc, "[%s]¤Î°ÎÂç¤ÊÇƼԠ(%d)",
211 #else
212                         sprintf(vir_desc,"You are a great champion of %s (%d).",
213 #endif
214                                 v_name, tester);
215                 else
216 #ifdef JP
217                         sprintf(vir_desc, "[%s]¤Î¶ñ¸½¼Ô (%d)",
218 #else
219                         sprintf(vir_desc,"You are the living embodiment of %s (%d).",
220 #endif
221                 v_name, tester);
222         
223                 strcpy(v_string[v_nr], vir_desc);
224         
225                 info[i++] = v_string[v_nr];
226         }
227         info[i++] = "";
228         
229         /* Racial powers... */
230         if (p_ptr->mimic_form)
231         {
232                 switch (p_ptr->mimic_form)
233                 {
234                         case MIMIC_DEMON:
235                         case MIMIC_DEMON_LORD:
236 #ifdef JP
237 sprintf(Dummy, "¤¢¤Ê¤¿¤Ï %d ¥À¥á¡¼¥¸¤ÎÃϹö¤«²Ð±ê¤Î¥Ö¥ì¥¹¤òÅǤ¯¤³¤È¤¬¤Ç¤­¤ë¡£(%d MP)", 3 * plev, 10+plev/3);
238 #else
239                                 sprintf(Dummy, "You can nether breathe, dam. %d (cost %d).", 3 * plev, 10+plev/3);
240 #endif
241
242                                 info[i++] = Dummy;
243                         break;
244                 case MIMIC_VAMPIRE:
245                         if (plev > 1)
246                         {
247 #ifdef JP
248 sprintf(Dummy, "¤¢¤Ê¤¿¤ÏŨ¤«¤é %d-%d HP ¤ÎÀ¸Ì¿ÎϤòµÛ¼ý¤Ç¤­¤ë¡£(%d MP)",
249 #else
250                                 sprintf(Dummy, "You can steal life from a foe, dam. %d-%d (cost %d).",
251 #endif
252
253                                     plev + MAX(1, plev / 10), plev + plev * MAX(1, plev / 10), 1 + (plev / 3));
254                                 info[i++] = Dummy;
255                         }
256                         break;
257                 }
258         }
259         else
260         {
261         switch (p_ptr->prace)
262         {
263                 case RACE_NIBELUNG:
264                 case RACE_DWARF:
265                         if (plev > 4)
266 #ifdef JP
267 info[i++] = "¤¢¤Ê¤¿¤Ï櫤ȥɥ¢¤È³¬Ãʤò´¶ÃΤǤ­¤ë¡£(5 MP)";
268 #else
269                                 info[i++] = "You can find traps, doors and stairs (cost 5).";
270 #endif
271
272                         break;
273                 case RACE_HOBBIT:
274                         if (plev > 14)
275                         {
276 #ifdef JP
277 info[i++] = "¤¢¤Ê¤¿¤Ï¿©ÎÁ¤òÀ¸À®¤Ç¤­¤ë¡£(10 MP)";
278 #else
279                                 info[i++] = "You can produce food (cost 10).";
280 #endif
281
282                         }
283                         break;
284                 case RACE_GNOME:
285                         if (plev > 4)
286                         {
287 #ifdef JP
288 sprintf(Dummy, "¤¢¤Ê¤¿¤ÏÈÏ°Ï %d °ÊÆâ¤Ë¥Æ¥ì¥Ý¡¼¥È¤Ç¤­¤ë¡£(%d MP)",
289 #else
290                                 sprintf(Dummy, "You can teleport, range %d (cost %d).",
291 #endif
292
293                                     (1 + plev), (5 + (plev / 5)));
294                                 info[i++] = Dummy;
295                         }
296                         break;
297                 case RACE_HALF_ORC:
298                         if (plev > 2)
299 #ifdef JP
300 info[i++] = "¤¢¤Ê¤¿¤Ï¶²Éݤò½üµî¤Ç¤­¤ë¡£(5 MP)";
301 #else
302                                 info[i++] = "You can remove fear (cost 5).";
303 #endif
304
305                         break;
306                 case RACE_HALF_TROLL:
307                         if (plev > 9)
308 #ifdef JP
309 info[i++] = "¤¢¤Ê¤¿¤Ï¶¸Ë½²½¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¡£(12 MP) ";
310 #else
311                                 info[i++] = "You enter berserk fury (cost 12).";
312 #endif
313
314                         break;
315                 case RACE_AMBERITE:
316                         if (plev > 29)
317 #ifdef JP
318 info[i++] = "¤¢¤Ê¤¿¤Ï¥·¥ã¥É¥¦¥·¥Õ¥È¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¡£(50 MP)";
319 #else
320                                 info[i++] = "You can Shift Shadows (cost 50).";
321 #endif
322
323                         if (plev > 39)
324 #ifdef JP
325 info[i++] = "¤¢¤Ê¤¿¤Ï¡Ö¥Ñ¥¿¡¼¥ó¡×¤ò¿´¤ËÉÁ¤¤¤ÆÊ⤯¤³¤È¤¬¤Ç¤­¤ë¡£(75 MP)";
326 #else
327                                 info[i++] = "You can mentally Walk the Pattern (cost 75).";
328 #endif
329
330                         break;
331                 case RACE_BARBARIAN:
332                         if (plev > 7)
333 #ifdef JP
334 info[i++] = "¤¢¤Ê¤¿¤Ï¶¸Ë½²½¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¡£(10 MP) ";
335 #else
336                                 info[i++] = "You can enter berserk fury (cost 10).";
337 #endif
338
339                         break;
340                 case RACE_HALF_OGRE:
341                         if (plev > 24)
342 #ifdef JP
343 info[i++] = "¤¢¤Ê¤¿¤ÏÇúȯ¤Î¥ë¡¼¥ó¤ò»Å³Ý¤±¤ë¤³¤È¤¬¤Ç¤­¤ë¡£(35 MP)";
344 #else
345                                 info[i++] = "You can set an Explosive Rune (cost 35).";
346 #endif
347
348                         break;
349                 case RACE_HALF_GIANT:
350                         if (plev > 19)
351 #ifdef JP
352 info[i++] = "¤¢¤Ê¤¿¤ÏÀФÎÊɤò²õ¤¹¤³¤È¤¬¤Ç¤­¤ë¡£(10 MP)";
353 #else
354                                 info[i++] = "You can break stone walls (cost 10).";
355 #endif
356
357                         break;
358                 case RACE_HALF_TITAN:
359                         if (plev > 34)
360 #ifdef JP
361 info[i++] = "¤¢¤Ê¤¿¤Ï¥â¥ó¥¹¥¿¡¼¤ò¥¹¥­¥ã¥ó¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¡£(20 MP)";
362 #else
363                                 info[i++] = "You can probe monsters (cost 20).";
364 #endif
365
366                         break;
367                 case RACE_CYCLOPS:
368                         if (plev > 19)
369                         {
370 #ifdef JP
371 sprintf(Dummy, "¤¢¤Ê¤¿¤Ï %d ¥À¥á¡¼¥¸¤Î´äÀФòÅꤲ¤ë¤³¤È¤¬¤Ç¤­¤ë¡£(15 MP)",
372 #else
373                                 sprintf(Dummy, "You can throw a boulder, dam. %d (cost 15).",
374 #endif
375
376                                     3 * plev);
377                                 info[i++] = Dummy;
378                         }
379                         break;
380                 case RACE_YEEK:
381                         if (plev > 14)
382 #ifdef JP
383 info[i++] = "¤¢¤Ê¤¿¤Ï¶²Éݤò¸Æ¤Óµ¯¤³¤¹¶«¤ÓÀ¼¤òȯ¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¡£(15 MP)";
384 #else
385                                 info[i++] = "You can make a terrifying scream (cost 15).";
386 #endif
387
388                         break;
389                 case RACE_KLACKON:
390                         if (plev > 8)
391                         {
392 #ifdef JP
393 sprintf(Dummy, "¤¢¤Ê¤¿¤Ï %d ¥À¥á¡¼¥¸¤Î»À¤ò¿á¤­¤«¤±¤ë¤³¤È¤¬¤Ç¤­¤ë¡£(9 MP)", plev);
394 #else
395                                 sprintf(Dummy, "You can spit acid, dam. %d (cost 9).", plev);
396 #endif
397
398                                 info[i++] = Dummy;
399                         }
400                         break;
401                 case RACE_KOBOLD:
402                         if (plev > 11)
403                         {
404                                 sprintf(Dummy,
405 #ifdef JP
406     "¤¢¤Ê¤¿¤Ï %d ¥À¥á¡¼¥¸¤ÎÆÇÌð¤òÅꤲ¤ë¤³¤È¤¬¤Ç¤­¤ë¡£(8 MP)", plev);
407 #else
408                                     "You can throw a dart of poison, dam. %d (cost 8).", plev);
409 #endif
410
411                                 info[i++] = Dummy;
412                         }
413                         break;
414                 case RACE_DARK_ELF:
415                         if (plev > 1)
416                         {
417 #ifdef JP
418 sprintf(Dummy, "¤¢¤Ê¤¿¤Ï %d ¥À¥á¡¼¥¸¤Î¥Þ¥¸¥Ã¥¯¡¦¥ß¥µ¥¤¥ë¤Î¼öʸ¤ò»È¤¨¤ë¡£(2 MP)",
419 #else
420                                 sprintf(Dummy, "You can cast a Magic Missile, dam %d (cost 2).",
421 #endif
422
423                                     (3 + ((plev-1) / 5)));
424                                 info[i++] = Dummy;
425                         }
426                         break;
427                 case RACE_DRACONIAN:
428 #ifdef JP
429 sprintf(Dummy, "¤¢¤Ê¤¿¤Ï %d ¥À¥á¡¼¥¸¤Î¥Ö¥ì¥¹¤òÅǤ¯¤³¤È¤¬¤Ç¤­¤ë¡£(%d MP)", 2 * plev, plev);
430 #else
431                         sprintf(Dummy, "You can breathe, dam. %d (cost %d).", 2 * plev, plev);
432 #endif
433
434                         info[i++] = Dummy;
435                         break;
436                 case RACE_MIND_FLAYER:
437                         if (plev > 14)
438 #ifdef JP
439 sprintf(Dummy, "¤¢¤Ê¤¿¤Ï %d ¥À¥á¡¼¥¸¤ÎÀº¿À¹¶·â¤ò¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¡£(12 MP)", plev);
440 #else
441                                 sprintf(Dummy, "You can mind blast your enemies, dam %d (cost 12).", plev);
442 #endif
443
444                         info[i++] = Dummy;
445                         break;
446                 case RACE_IMP:
447                         if (plev > 29)
448                         {
449 #ifdef JP
450 sprintf(Dummy, "¤¢¤Ê¤¿¤Ï %d ¥À¥á¡¼¥¸¤Î¥Õ¥¡¥¤¥¢¡¦¥Ü¡¼¥ë¤Î¼öʸ¤ò»È¤¨¤ë¡£(15 MP)", plev);
451 #else
452                                 sprintf(Dummy, "You can cast a Fire Ball, dam. %d (cost 15).", plev);
453 #endif
454
455                                 info[i++] = Dummy;
456                         }
457                         else if (plev > 8)
458                         {
459 #ifdef JP
460 sprintf(Dummy, "¤¢¤Ê¤¿¤Ï %d ¥À¥á¡¼¥¸¤Î¥Õ¥¡¥¤¥¢¡¦¥Ü¥ë¥È¤Î¼öʸ¤ò»È¤¨¤ë¡£(15 MP)", plev);
461 #else
462                                 sprintf(Dummy, "You can cast a Fire Bolt, dam. %d (cost 15).", plev);
463 #endif
464
465                                 info[i++] = Dummy;
466                         }
467                         break;
468                 case RACE_GOLEM:
469                         if (plev > 19)
470 #ifdef JP
471 info[i++] = "¤¢¤Ê¤¿¤Ï d20+30 ¥¿¡¼¥ó¤Î´ÖÈ©¤òÀФËÊѲ½¤µ¤»¤é¤ì¤ë¡£(15 MP)";
472 #else
473                                 info[i++] = "You can turn your skin to stone, dur d20+30 (cost 15).";
474 #endif
475
476                         break;
477                 case RACE_ZOMBIE:
478                 case RACE_SKELETON:
479                         if (plev > 29)
480 #ifdef JP
481 info[i++] = "¤¢¤Ê¤¿¤Ï¼º¤Ã¤¿À¸Ì¿ÎϤò²óÉü¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¡£(30 MP)";
482 #else
483                                 info[i++] = "You can restore lost life forces (cost 30).";
484 #endif
485
486                         break;
487                 case RACE_VAMPIRE:
488                         if (plev > 1)
489                         {
490 #ifdef JP
491 sprintf(Dummy, "¤¢¤Ê¤¿¤ÏŨ¤«¤é %d-%d HP ¤ÎÀ¸Ì¿ÎϤòµÛ¼ý¤Ç¤­¤ë¡£(%d MP)",
492 #else
493                                 sprintf(Dummy, "You can steal life from a foe, dam. %d-%d (cost %d).",
494 #endif
495
496                                     plev + MAX(1, plev / 10), plev + plev * MAX(1, plev / 10), 1 + (plev / 3));
497                                 info[i++] = Dummy;
498                         }
499                         break;
500                 case RACE_SPECTRE:
501                         if (plev > 3)
502                         {
503 #ifdef JP
504 info[i++] = "¤¢¤Ê¤¿¤Ïµã¤­¶«¤ó¤ÇŨ¤ò¶²Éݤµ¤»¤ë¤³¤È¤¬¤Ç¤­¤ë¡£(3 MP)";
505 #else
506                                 info[i++] = "You can wail to terrify your enemies (cost 3).";
507 #endif
508
509                         }
510                         break;
511                 case RACE_SPRITE:
512                         if (plev > 11)
513                         {
514 #ifdef JP
515 info[i++] = "¤¢¤Ê¤¿¤ÏŨ¤ò̲¤é¤»¤ëËâË¡¤ÎÊ´¤òÅꤲ¤ë¤³¤È¤¬¤Ç¤­¤ë¡£(12 MP)";
516 #else
517                                 info[i++] = "You can throw magical dust which induces sleep (cost 12).";
518 #endif
519
520                         }
521                         break;
522                 case RACE_DEMON:
523 #ifdef JP
524 sprintf(Dummy, "¤¢¤Ê¤¿¤Ï %d ¥À¥á¡¼¥¸¤ÎÃϹö¤«²Ð±ê¤Î¥Ö¥ì¥¹¤òÅǤ¯¤³¤È¤¬¤Ç¤­¤ë¡£(%d MP)", 3 * plev, 10+plev/3);
525 #else
526                         sprintf(Dummy, "You can breathe nether, dam. %d (cost %d).", 3 * plev, 10+plev/3);
527 #endif
528
529                         info[i++] = Dummy;
530                         break;
531                 case RACE_KUTA:
532                         if (plev > 19)
533 #ifdef JP
534 info[i++] = "¤¢¤Ê¤¿¤Ï d20+30 ¥¿¡¼¥ó¤Î´Ö²£¤Ë¿­¤Ó¤ë¤³¤È¤¬¤Ç¤­¤ë¡£(15 MP)";
535 #else
536                                 info[i++] = "You can expand horizontally, dur d20+30 (cost 15).";
537 #endif
538
539                         break;
540                 case RACE_ANDROID:
541                         if (plev < 10)
542 #ifdef JP
543 sprintf(Dummy, "¤¢¤Ê¤¿¤Ï %d ¥À¥á¡¼¥¸¤Î¥ì¥¤¥¬¥ó¤ò·â¤Ä¤³¤È¤¬¤Ç¤­¤ë¡£(7 MP)", (plev + 1) / 2);
544 #else
545                                 sprintf(Dummy, "You can fire a ray gun with damage %d (cost 7).", (plev+1)/2);
546 #endif
547                         else if (plev < 25)
548 #ifdef JP
549 sprintf(Dummy, "¤¢¤Ê¤¿¤Ï %d ¥À¥á¡¼¥¸¤Î¥Ö¥é¥¹¥¿¡¼¤ò·â¤Ä¤³¤È¤¬¤Ç¤­¤ë¡£(13 MP)", plev);
550 #else
551                                 sprintf(Dummy, "You can fire a blaster with damage %d (cost 13).", plev);
552 #endif
553                         else if (plev < 35)
554 #ifdef JP
555 sprintf(Dummy, "¤¢¤Ê¤¿¤Ï %d ¥À¥á¡¼¥¸¤Î¥Ð¥º¡¼¥«¤ò·â¤Ä¤³¤È¤¬¤Ç¤­¤ë¡£(26 MP)", plev * 2);
556 #else
557                                 sprintf(Dummy, "You can fire a bazooka with damage %d (cost 26).", plev * 2);
558 #endif
559                         else if (plev < 45)
560 #ifdef JP
561 sprintf(Dummy, "¤¢¤Ê¤¿¤Ï %d ¥À¥á¡¼¥¸¤Î¥Ó¡¼¥à¥­¥ã¥Î¥ó¤ò·â¤Ä¤³¤È¤¬¤Ç¤­¤ë¡£(40 MP)", plev * 2);
562 #else
563                                 sprintf(Dummy, "You can fire a beam cannon with damage %d (cost 40).", plev * 2);
564 #endif
565                         else
566 #ifdef JP
567 sprintf(Dummy, "¤¢¤Ê¤¿¤Ï %d ¥À¥á¡¼¥¸¤Î¥í¥±¥Ã¥È¤ò·â¤Ä¤³¤È¤¬¤Ç¤­¤ë¡£(60 MP)", plev * 5);
568 #else
569                                 sprintf(Dummy, "You can fire a rocket with damage %d (cost 60).", plev * 5);
570 #endif
571
572                         info[i++] = Dummy;
573                         break;
574                 default:
575                         break;
576         }
577         }
578
579         switch(p_ptr->pclass)
580         {
581                 case CLASS_WARRIOR:
582                         if (plev > 39)
583                         {
584 #ifdef JP
585 info[i++] = "¤¢¤Ê¤¿¤Ï¥é¥ó¥À¥à¤ÊÊý¸þ¤ËÂФ·¤Æ¿ô²ó¹¶·â¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¡£(75 MP)";
586 #else
587                                 info[i++] = "You can attack some random directions at a time (cost 75).";
588 #endif
589                         }
590                         break;
591                 case CLASS_MAGE:
592                 case CLASS_HIGH_MAGE:
593                 case CLASS_SORCERER:
594                         if (plev > 24)
595                         {
596 #ifdef JP
597 info[i++] = "¤¢¤Ê¤¿¤Ï¥¢¥¤¥Æ¥à¤ÎËâÎϤòµÛ¼ý¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¡£(1 MP)";
598 #else
599                                 info[i++] = "You can absorb charges from an item (cost 1).";
600 #endif
601                         }
602                         break;
603                 case CLASS_PRIEST:
604                         if (is_good_realm(p_ptr->realm1))
605                         {
606                                 if (plev > 34)
607                                 {
608 #ifdef JP
609 info[i++] = "¤¢¤Ê¤¿¤ÏÉð´ï¤ò½ËÊ¡¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¡£(70 MP)";
610 #else
611                                         info[i++] = "You can bless a weapon (cost 70).";
612 #endif
613                                 }
614                         }
615                         else
616                         {
617                                 if (plev > 41)
618                                 {
619 #ifdef JP
620 info[i++] = "¤¢¤Ê¤¿¤Ï¼þ¤ê¤Î¤¹¤Ù¤Æ¤Î¥â¥ó¥¹¥¿¡¼¤ò¹¶·â¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¡£(40 MP)";
621 #else
622                                         info[i++] = "You can damages all monsters in sight (cost 40).";
623 #endif
624                                 }
625                         }
626                         break;
627                 case CLASS_ROGUE:
628                         if (plev > 7)
629                         {
630 #ifdef JP
631 info[i++] = "¤¢¤Ê¤¿¤Ï¹¶·â¤·¤Æ¨ºÂ¤Ëƨ¤²¤ë¤³¤È¤¬¤Ç¤­¤ë¡£(12 MP)";
632 #else
633                                 info[i++] = "You can hit a monster and teleport at a time (cost 12).";
634 #endif
635                         }
636                         break;
637                 case CLASS_RANGER:
638                         if (plev > 14)
639                         {
640 #ifdef JP
641 info[i++] = "¤¢¤Ê¤¿¤Ï²øʪ¤òÄ´ºº¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¡£(20 MP)";
642 #else
643                                 info[i++] = "You can prove monsters (cost 20).";
644 #endif
645                         }
646                         break;
647                 case CLASS_PALADIN:
648                         if (is_good_realm(p_ptr->realm1))
649                         {
650                                 if (plev > 29)
651                                 {
652 #ifdef JP
653 info[i++] = "¤¢¤Ê¤¿¤ÏÀ»¤Ê¤ëÁä¤òÊü¤Ä¤³¤È¤¬¤Ç¤­¤ë¡£(30 MP)";
654 #else
655                                         info[i++] = "You can fires a holy spear (cost 30).";
656 #endif
657                                 }
658                         }
659                         else
660                         {
661                                 if (plev > 29)
662                                 {
663 #ifdef JP
664 info[i++] = "¤¢¤Ê¤¿¤ÏÀ¸Ì¿ÎϤò¸º¾¯¤µ¤»¤ëÁä¤òÊü¤Ä¤³¤È¤¬¤Ç¤­¤ë¡£(30 MP)";
665 #else
666                                         info[i++] = "You can fires a spear which drains vitality (cost 30).";
667 #endif
668                                 }
669                         }
670                         break;
671                 case CLASS_WARRIOR_MAGE:
672                         if (plev > 24)
673                         {
674 #ifdef JP
675 info[i++] = "¤¢¤Ê¤¿¤Ï£È£Ð¤ò£Í£Ð¤ËÊÑ´¹¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¡£(0 MP)";
676 #else
677                                 info[i++] = "You can convert HP to SP (cost 0).";
678 #endif
679 #ifdef JP
680 info[i++] = "¤¢¤Ê¤¿¤Ï£Í£Ð¤ò£È£Ð¤ËÊÑ´¹¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¡£(0 MP)";
681 #else
682                                 info[i++] = "You can convert SP to HP (cost 0).";
683 #endif
684                         }
685                         break;
686                 case CLASS_CHAOS_WARRIOR:
687                         if (plev > 39)
688                         {
689 #ifdef JP
690 info[i++] = "¤¢¤Ê¤¿¤Ï¼þ°Ï¤Ë²øʪ¤òÏǤ魯¸÷¤òȯÀ¸¤µ¤»¤ë¤³¤È¤¬¤Ç¤­¤ë¡£(50 MP)";
691 #else
692                                 info[i++] = "You can radiate light which confuses nearby monsters (cost 50).";
693 #endif
694                         }
695                         break;
696                 case CLASS_MONK:
697                         if (plev > 24)
698                         {
699 #ifdef JP
700 info[i++] = "¤¢¤Ê¤¿¤Ï¹½¤¨¤ë¤³¤È¤¬¤Ç¤­¤ë¡£(0 MP)";
701 #else
702                                 info[i++] = "You can assume a posture of special form (cost 0).";
703 #endif
704                         }
705                         if (plev > 29)
706                         {
707 #ifdef JP
708 info[i++] = "¤¢¤Ê¤¿¤ÏÄ̾ï¤Î2Çܤι¶·â¤ò¹Ô¤¦¤³¤È¤¬¤Ç¤­¤ë¡£(30 MP)";
709 #else
710                                 info[i++] = "You can perform double attacks in a time (cost 30).";
711 #endif
712                         }
713                         break;
714                 case CLASS_MINDCRAFTER:
715                 case CLASS_FORCETRAINER:
716                         if (plev > 14)
717                         {
718 #ifdef JP
719 info[i++] = "¤¢¤Ê¤¿¤ÏÀº¿À¤ò½¸Ã椷¤Æ£Í£Ð¤ò²óÉü¤µ¤»¤ë¤³¤È¤¬¤Ç¤­¤ë¡£(0 MP)";
720 #else
721                                 info[i++] = "You can concentrate to regenerate your mana (cost 0).";
722 #endif
723                         }
724                         break;
725                 case CLASS_TOURIST:
726 #ifdef JP
727 info[i++] = "¤¢¤Ê¤¿¤Ï¼Ì¿¿¤ò»£±Æ¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¡£(0 MP)";
728 #else
729                                 info[i++] = "You can take a photograph (cost 0).";
730 #endif
731                         if (plev > 24)
732                         {
733 #ifdef JP
734 info[i++] = "¤¢¤Ê¤¿¤Ï¥¢¥¤¥Æ¥à¤ò´°Á´¤Ë´ÕÄꤹ¤ë¤³¤È¤¬¤Ç¤­¤ë¡£(20 MP)";
735 #else
736                                 info[i++] = "You can *identify* items (cost 20).";
737 #endif
738                         }
739                         break;
740                 case CLASS_IMITATOR:
741                         if (plev > 29)
742                         {
743 #ifdef JP
744 info[i++] = "¤¢¤Ê¤¿¤Ï²øʪ¤ÎÆü칶·â¤ò¥À¥á¡¼¥¸2ÇܤǤޤͤ뤳¤È¤¬¤Ç¤­¤ë¡£(100 MP)";
745 #else
746                                 info[i++] = "You can imitate monster's special attacks with double damage (cost 100).";
747 #endif
748                         }
749                         break;
750                 case CLASS_BEASTMASTER:
751 #ifdef JP
752 info[i++] = "¤¢¤Ê¤¿¤Ï1ɤ¤ÎÀ¸Ì¿¤Î¤¢¤ë¥â¥ó¥¹¥¿¡¼¤ò»ÙÇÛ¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¡£(¥ì¥Ù¥ë/4 MP)";
753 #else
754                         info[i++] = "You can dominate a monster (cost level/4).";
755 #endif
756                         if (plev > 29)
757                         {
758 #ifdef JP
759 info[i++] = "¤¢¤Ê¤¿¤Ï»ë³¦Æâ¤ÎÀ¸Ì¿¤Î¤¢¤ë¥â¥ó¥¹¥¿¡¼¤ò»ÙÇÛ¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¡£((¥ì¥Ù¥ë+20)/2 MP)";
760 #else
761                                 info[i++] = "You can dominate living monsters in sight (cost (level+20)/4).";
762 #endif
763                         }
764                         break;
765                 case CLASS_MAGIC_EATER:
766 #ifdef JP
767 info[i++] = "¤¢¤Ê¤¿¤Ï¾ó/ËâË¡ËÀ/¥í¥Ã¥É¤ÎËâÎϤò¼«Ê¬¤Î¤â¤Î¤Ë¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¡£";
768 #else
769                         info[i++] = "You can absorb a staff, wand or rod itself.";
770 #endif
771                         break;
772                 case CLASS_RED_MAGE:
773                         if (plev > 47)
774                         {
775 #ifdef JP
776 info[i++] = "¤¢¤Ê¤¿¤Ï1¥¿¡¼¥ó¤Ë2²óËâË¡¤ò¾§¤¨¤ë¤³¤È¤¬¤Ç¤­¤ë¡£(77 MP)";
777 #else
778                                 info[i++] = "You can cast two spells in one time (cost 77).";
779 #endif
780                         }
781                         break;
782                 case CLASS_SAMURAI:
783                         {
784 #ifdef JP
785 info[i++] = "¤¢¤Ê¤¿¤ÏÀº¿À¤ò½¸Ã椷¤Æµ¤¹ç¤¤¤òί¤á¤ë¤³¤È¤¬¤Ç¤­¤ë¡£";
786 #else
787                                 info[i++] = "You can concentrate to regenerate your mana.";
788 #endif
789                         }
790                         if (plev > 24)
791                         {
792 #ifdef JP
793 info[i++] = "¤¢¤Ê¤¿¤ÏÆüì¤Ê·¿¤Ç¹½¤¨¤ë¤³¤È¤¬¤Ç¤­¤ë¡£";
794 #else
795                                 info[i++] = "You can assume a posture of special form.";
796 #endif
797                         }
798                         break;
799                 case CLASS_BLUE_MAGE:
800 #ifdef JP
801 info[i++] = "¤¢¤Ê¤¿¤ÏÁê¼ê¤Ë»È¤ï¤ì¤¿ËâË¡¤ò³Ø¤Ö¤³¤È¤¬¤Ç¤­¤ë¡£";
802 #else
803                         info[i++] = "You can study spells which your enemy casts on you.";
804 #endif
805                         break;
806                 case CLASS_CAVALRY:
807                         if (plev > 9)
808                         {
809 #ifdef JP
810 info[i++] = "¤¢¤Ê¤¿¤Ï¥â¥ó¥¹¥¿¡¼¤Ë¾è¤Ã¤Æ̵ÍýÌðÍý¥Ú¥Ã¥È¤Ë¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¡£";
811 #else
812                                 info[i++] = "You can ride on a hostile monster forcibly to turn it into pet.";
813 #endif
814                         }
815                         break;
816                 case CLASS_BERSERKER:
817                         if (plev > 9)
818                         {
819 #ifdef JP
820 info[i++] = "¤¢¤Ê¤¿¤Ï³¹¤È¥À¥ó¥¸¥ç¥ó¤Î´Ö¤ò¹Ô¤­Í褹¤ë¤³¤È¤¬¤Ç¤­¤ë¡£";
821 #else
822                         info[i++] = "You can travel between town and the depths.";
823 #endif
824                         }
825                         break;
826                 case CLASS_MIRROR_MASTER:
827 #ifdef JP
828 info[i++] = "¤¢¤Ê¤¿¤Ï¶À¤òºî¤ê½Ð¤¹¤³¤È¤¬¤Ç¤­¤ë¡£(2 MP)";
829 #else
830                                 info[i++] = "You can create a Mirror (cost 2).";
831 #endif
832 #ifdef JP
833 info[i++] = "¤¢¤Ê¤¿¤Ï¶À¤ò³ä¤ë¤³¤È¤¬¤Ç¤­¤ë¡£(0 MP)";
834 #else
835                                 info[i++] = "You can break distant Mirrors (cost 0).";
836 #endif
837                         break;
838                 case CLASS_NINJA:
839                         if (plev > 19)
840                         {
841 #ifdef JP
842 info[i++] = "¤¢¤Ê¤¿¤ÏÁÇÁ᤯°ÜÆ°¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¡£";
843 #else
844                                 info[i++] = "You can walk extremery fast.";
845 #endif
846                         }
847                         break;
848         }
849
850         if (p_ptr->muta1)
851         {
852                 if (p_ptr->muta1 & MUT1_SPIT_ACID)
853                 {
854 #ifdef JP
855 info[i++] = "¤¢¤Ê¤¿¤Ï»À¤ò¿á¤­¤«¤±¤ë¤³¤È¤¬¤Ç¤­¤ë¡£(¥À¥á¡¼¥¸ ¥ì¥Ù¥ëX1)";
856 #else
857                         info[i++] = "You can spit acid (dam lvl).";
858 #endif
859
860                 }
861                 if (p_ptr->muta1 & MUT1_BR_FIRE)
862                 {
863 #ifdef JP
864 info[i++] = "¤¢¤Ê¤¿¤Ï±ê¤Î¥Ö¥ì¥¹¤òÅǤ¯¤³¤È¤¬¤Ç¤­¤ë¡£(¥À¥á¡¼¥¸ ¥ì¥Ù¥ëX2)";
865 #else
866                         info[i++] = "You can breathe fire (dam lvl * 2).";
867 #endif
868
869                 }
870                 if (p_ptr->muta1 & MUT1_HYPN_GAZE)
871                 {
872 #ifdef JP
873 info[i++] = "¤¢¤Ê¤¿¤ÎâˤߤϺÅ̲¸ú²Ì¤ò¤â¤Ä¡£";
874 #else
875                         info[i++] = "Your gaze is hypnotic.";
876 #endif
877
878                 }
879                 if (p_ptr->muta1 & MUT1_TELEKINES)
880                 {
881 #ifdef JP
882 info[i++] = "¤¢¤Ê¤¿¤ÏÇ°Æ°ÎϤò¤â¤Ã¤Æ¤¤¤ë¡£";
883 #else
884                         info[i++] = "You are telekinetic.";
885 #endif
886
887                 }
888                 if (p_ptr->muta1 & MUT1_VTELEPORT)
889                 {
890 #ifdef JP
891 info[i++] = "¤¢¤Ê¤¿¤Ï¼«Ê¬¤Î°Õ»×¤Ç¥Æ¥ì¥Ý¡¼¥È¤Ç¤­¤ë¡£";
892 #else
893                         info[i++] = "You can teleport at will.";
894 #endif
895
896                 }
897                 if (p_ptr->muta1 & MUT1_MIND_BLST)
898                 {
899 #ifdef JP
900 info[i++] = "¤¢¤Ê¤¿¤ÏÀº¿À¹¶·â¤ò¹Ô¤¨¤ë¡£(¥À¥á¡¼¥¸ 3¡Á12d3)";
901 #else
902                         info[i++] = "You can Mind Blast your enemies (3 to 12d3 dam).";
903 #endif
904
905                 }
906                 if (p_ptr->muta1 & MUT1_RADIATION)
907                 {
908 #ifdef JP
909 info[i++] = "¤¢¤Ê¤¿¤Ï¼«Ê¬¤Î°Õ»×¤Ç¶¯¤¤Êü¼ÍÀþ¤òȯÀ¸¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¡£(¥À¥á¡¼¥¸ ¥ì¥Ù¥ëX2)";
910 #else
911                         info[i++] = "You can emit hard radiation at will (dam lvl * 2).";
912 #endif
913
914                 }
915                 if (p_ptr->muta1 & MUT1_VAMPIRISM)
916                 {
917 #ifdef JP
918 info[i++] = "¤¢¤Ê¤¿¤ÏµÛ·ìµ´¤Î¤è¤¦¤ËŨ¤«¤éÀ¸Ì¿ÎϤòµÛ¼ý¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¡£(¥À¥á¡¼¥¸ ¥ì¥Ù¥ëX2)";
919 #else
920                         info[i++] = "You can drain life from a foe like a vampire (dam lvl * 2).";
921 #endif
922
923                 }
924                 if (p_ptr->muta1 & MUT1_SMELL_MET)
925                 {
926 #ifdef JP
927 info[i++] = "¤¢¤Ê¤¿¤Ï¶á¤¯¤Ë¤¢¤ëµ®¶â°¤ò¤«¤®Ê¬¤±¤ë¤³¤È¤¬¤Ç¤­¤ë¡£";
928 #else
929                         info[i++] = "You can smell nearby precious metal.";
930 #endif
931
932                 }
933                 if (p_ptr->muta1 & MUT1_SMELL_MON)
934                 {
935 #ifdef JP
936 info[i++] = "¤¢¤Ê¤¿¤Ï¶á¤¯¤Î¥â¥ó¥¹¥¿¡¼¤Î¸ºß¤ò¤«¤®Ê¬¤±¤ë¤³¤È¤¬¤Ç¤­¤ë¡£";
937 #else
938                         info[i++] = "You can smell nearby monsters.";
939 #endif
940
941                 }
942                 if (p_ptr->muta1 & MUT1_BLINK)
943                 {
944 #ifdef JP
945 info[i++] = "¤¢¤Ê¤¿¤Ïû¤¤µ÷Î¥¤ò¥Æ¥ì¥Ý¡¼¥È¤Ç¤­¤ë¡£";
946 #else
947                         info[i++] = "You can teleport yourself short distances.";
948 #endif
949
950                 }
951                 if (p_ptr->muta1 & MUT1_EAT_ROCK)
952                 {
953 #ifdef JP
954 info[i++] = "¤¢¤Ê¤¿¤Ï¹Å¤¤´ä¤ò¿©¤Ù¤ë¤³¤È¤¬¤Ç¤­¤ë¡£";
955 #else
956                         info[i++] = "You can consume solid rock.";
957 #endif
958
959                 }
960                 if (p_ptr->muta1 & MUT1_SWAP_POS)
961                 {
962 #ifdef JP
963 info[i++] = "¤¢¤Ê¤¿¤Ï¾¤Î¼Ô¤È¾ì½ê¤òÆþ¤ìÂؤï¤ë¤³¤È¤¬¤Ç¤­¤ë¡£";
964 #else
965                         info[i++] = "You can switch locations with another being.";
966 #endif
967
968                 }
969                 if (p_ptr->muta1 & MUT1_SHRIEK)
970                 {
971 #ifdef JP
972 info[i++] = "¤¢¤Ê¤¿¤Ï¿È¤ÎÌÓ¤â¤è¤À¤Ä¶«¤ÓÀ¼¤òȯ¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¡£(¥À¥á¡¼¥¸ ¥ì¥Ù¥ëX2)";
973 #else
974                         info[i++] = "You can emit a horrible shriek (dam 2 * lvl).";
975 #endif
976
977                 }
978                 if (p_ptr->muta1 & MUT1_ILLUMINE)
979                 {
980 #ifdef JP
981 info[i++] = "¤¢¤Ê¤¿¤ÏÌÀ¤ë¤¤¸÷¤òÊü¤Ä¤³¤È¤¬¤Ç¤­¤ë¡£";
982 #else
983                         info[i++] = "You can emit bright light.";
984 #endif
985
986                 }
987                 if (p_ptr->muta1 & MUT1_DET_CURSE)
988                 {
989 #ifdef JP
990 info[i++] = "¤¢¤Ê¤¿¤Ï¼Ù°­¤ÊËâË¡¤Î´í¸±¤ò´¶¤¸¤È¤ë¤³¤È¤¬¤Ç¤­¤ë¡£";
991 #else
992                         info[i++] = "You can feel the danger of evil magic.";
993 #endif
994
995                 }
996                 if (p_ptr->muta1 & MUT1_BERSERK)
997                 {
998 #ifdef JP
999 info[i++] = "¤¢¤Ê¤¿¤Ï¼«Ê¬¤Î°Õ»×¤Ç¶¸ÍðÀïÆ®¾õÂ֤ˤʤ뤳¤È¤¬¤Ç¤­¤ë¡£";
1000 #else
1001                         info[i++] = "You can drive yourself into a berserk frenzy.";
1002 #endif
1003
1004                 }
1005                 if (p_ptr->muta1 & MUT1_POLYMORPH)
1006                 {
1007 #ifdef JP
1008 info[i++] = "¤¢¤Ê¤¿¤Ï¼«Ê¬¤Î°Õ»Ö¤ÇÊѲ½¤Ç¤­¤ë¡£";
1009 #else
1010                         info[i++] = "You can polymorph yourself at will.";
1011 #endif
1012
1013                 }
1014                 if (p_ptr->muta1 & MUT1_MIDAS_TCH)
1015                 {
1016 #ifdef JP
1017 info[i++] = "¤¢¤Ê¤¿¤ÏÄ̾異¥¤¥Æ¥à¤ò¶â¤ËÊѤ¨¤ë¤³¤È¤¬¤Ç¤­¤ë¡£";
1018 #else
1019                         info[i++] = "You can turn ordinary items to gold.";
1020 #endif
1021
1022                 }
1023                 if (p_ptr->muta1 & MUT1_GROW_MOLD)
1024                 {
1025 #ifdef JP
1026 info[i++] = "¤¢¤Ê¤¿¤Ï¼þ°Ï¤Ë¥­¥Î¥³¤òÀ¸¤ä¤¹¤³¤È¤¬¤Ç¤­¤ë¡£";
1027 #else
1028                         info[i++] = "You can cause mold to grow near you.";
1029 #endif
1030
1031                 }
1032                 if (p_ptr->muta1 & MUT1_RESIST)
1033                 {
1034 #ifdef JP
1035 info[i++] = "¤¢¤Ê¤¿¤Ï¸µÁǤι¶·â¤ËÂФ·¤Æ¿È¤ò¹Å¤¯¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¡£";
1036 #else
1037                         info[i++] = "You can harden yourself to the ravages of the elements.";
1038 #endif
1039
1040                 }
1041                 if (p_ptr->muta1 & MUT1_EARTHQUAKE)
1042                 {
1043 #ifdef JP
1044 info[i++] = "¤¢¤Ê¤¿¤Ï¼þ°Ï¤Î¥À¥ó¥¸¥ç¥ó¤òÊø²õ¤µ¤»¤ë¤³¤È¤¬¤Ç¤­¤ë¡£";
1045 #else
1046                         info[i++] = "You can bring down the dungeon around your ears.";
1047 #endif
1048
1049                 }
1050                 if (p_ptr->muta1 & MUT1_EAT_MAGIC)
1051                 {
1052 #ifdef JP
1053 info[i++] = "¤¢¤Ê¤¿¤ÏËâË¡¤Î¥¨¥Í¥ë¥®¡¼¤ò¼«Ê¬¤Îʪ¤È¤·¤Æ»ÈÍѤǤ­¤ë¡£";
1054 #else
1055                         info[i++] = "You can consume magic energy for your own use.";
1056 #endif
1057
1058                 }
1059                 if (p_ptr->muta1 & MUT1_WEIGH_MAG)
1060                 {
1061 #ifdef JP
1062 info[i++] = "¤¢¤Ê¤¿¤Ï¼«Ê¬¤Ë±Æ¶Á¤òÍ¿¤¨¤ëËâË¡¤ÎÎϤò´¶¤¸¤ë¤³¤È¤¬¤Ç¤­¤ë¡£";
1063 #else
1064                         info[i++] = "You can feel the strength of the magics affecting you.";
1065 #endif
1066
1067                 }
1068                 if (p_ptr->muta1 & MUT1_STERILITY)
1069                 {
1070 #ifdef JP
1071 info[i++] = "¤¢¤Ê¤¿¤Ï½¸ÃÄŪÀ¸¿£ÉÔǽ¤òµ¯¤³¤¹¤³¤È¤¬¤Ç¤­¤ë¡£";
1072 #else
1073                         info[i++] = "You can cause mass impotence.";
1074 #endif
1075
1076                 }
1077                 if (p_ptr->muta1 & MUT1_PANIC_HIT)
1078                 {
1079 #ifdef JP
1080 info[i++] = "¤¢¤Ê¤¿¤Ï¹¶·â¤·¤¿¸å¿È¤ò¼é¤ë¤¿¤áƨ¤²¤ë¤³¤È¤¬¤Ç¤­¤ë¡£";
1081 #else
1082                         info[i++] = "You can run for your life after hitting something.";
1083 #endif
1084
1085                 }
1086                 if (p_ptr->muta1 & MUT1_DAZZLE)
1087                 {
1088 #ifdef JP
1089 info[i++] = "¤¢¤Ê¤¿¤Ïº®Íð¤ÈÌÕÌܤò°ú¤­µ¯¤³¤¹Êü¼Íǽ¤òȯÀ¸¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¡£ ";
1090 #else
1091                         info[i++] = "You can emit confusing, blinding radiation.";
1092 #endif
1093
1094                 }
1095                 if (p_ptr->muta1 & MUT1_LASER_EYE)
1096                 {
1097 #ifdef JP
1098 info[i++] = "¤¢¤Ê¤¿¤ÏÌܤ«¤é¥ì¡¼¥¶¡¼¸÷Àþ¤òȯ¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¡£(¥À¥á¡¼¥¸ ¥ì¥Ù¥ëX2)";
1099 #else
1100                         info[i++] = "Your eyes can fire laser beams (dam 2 * lvl).";
1101 #endif
1102
1103                 }
1104                 if (p_ptr->muta1 & MUT1_RECALL)
1105                 {
1106 #ifdef JP
1107 info[i++] = "¤¢¤Ê¤¿¤Ï³¹¤È¥À¥ó¥¸¥ç¥ó¤Î´Ö¤ò¹Ô¤­Í褹¤ë¤³¤È¤¬¤Ç¤­¤ë¡£";
1108 #else
1109                         info[i++] = "You can travel between town and the depths.";
1110 #endif
1111
1112                 }
1113                 if (p_ptr->muta1 & MUT1_BANISH)
1114                 {
1115 #ifdef JP
1116 info[i++] = "¤¢¤Ê¤¿¤Ï¼Ù°­¤Ê¥â¥ó¥¹¥¿¡¼¤òÃϹö¤ËÍî¤È¤¹¤³¤È¤¬¤Ç¤­¤ë¡£";
1117 #else
1118                         info[i++] = "You can send evil creatures directly to Hell.";
1119 #endif
1120
1121                 }
1122                 if (p_ptr->muta1 & MUT1_COLD_TOUCH)
1123                 {
1124 #ifdef JP
1125 info[i++] = "¤¢¤Ê¤¿¤ÏŨ¤ò¿¨¤Ã¤ÆÅà¤é¤»¤ë¤³¤È¤¬¤Ç¤­¤ë¡£(¥À¥á¡¼¥¸ ¥ì¥Ù¥ëX3)";
1126 #else
1127                         info[i++] = "You can freeze things with a touch (dam 3 * lvl).";
1128 #endif
1129
1130                 }
1131                 if (p_ptr->muta1 & MUT1_LAUNCHER)
1132                 {
1133 #ifdef JP
1134 info[i++] = "¤¢¤Ê¤¿¤Ï¥¢¥¤¥Æ¥à¤òÎ϶¯¤¯Åꤲ¤ë¤³¤È¤¬¤Ç¤­¤ë¡£";
1135 #else
1136                         info[i++] = "You can hurl objects with great force.";
1137 #endif
1138
1139                 }
1140         }
1141
1142         if (p_ptr->muta2)
1143         {
1144                 if (p_ptr->muta2 & MUT2_BERS_RAGE)
1145                 {
1146 #ifdef JP
1147 info[i++] = "¤¢¤Ê¤¿¤Ï¶¸Àï»Î²½¤Îȯºî¤òµ¯¤³¤¹¡£";
1148 #else
1149                         info[i++] = "You are subject to berserker fits.";
1150 #endif
1151
1152                 }
1153                 if (p_ptr->muta2 & MUT2_COWARDICE)
1154                 {
1155 #ifdef JP
1156 info[i++] = "¤¢¤Ê¤¿¤Ï»þ¡¹²²É¤ˤʤ롣";
1157 #else
1158                         info[i++] = "You are subject to cowardice.";
1159 #endif
1160
1161                 }
1162                 if (p_ptr->muta2 & MUT2_RTELEPORT)
1163                 {
1164 #ifdef JP
1165 info[i++] = "¤¢¤Ê¤¿¤Ï¥é¥ó¥À¥à¤Ë¥Æ¥ì¥Ý¡¼¥È¤¹¤ë¡£";
1166 #else
1167                         info[i++] = "You are teleporting randomly.";
1168 #endif
1169
1170                 }
1171                 if (p_ptr->muta2 & MUT2_ALCOHOL)
1172                 {
1173 #ifdef JP
1174 info[i++] = "¤¢¤Ê¤¿¤ÎÂΤϥ¢¥ë¥³¡¼¥ë¤òʬÈ礹¤ë¡£";
1175 #else
1176                         info[i++] = "Your body produces alcohol.";
1177 #endif
1178
1179                 }
1180                 if (p_ptr->muta2 & MUT2_HALLU)
1181                 {
1182 #ifdef JP
1183 info[i++] = "¤¢¤Ê¤¿¤Ï¸¸³Ð¤ò°ú¤­µ¯¤³¤¹Àº¿ÀºøÍð¤Ë¿¯¤µ¤ì¤Æ¤¤¤ë¡£";
1184 #else
1185                         info[i++] = "You have a hallucinatory insanity.";
1186 #endif
1187
1188                 }
1189                 if (p_ptr->muta2 & MUT2_FLATULENT)
1190                 {
1191 #ifdef JP
1192 info[i++] = "¤¢¤Ê¤¿¤ÏÀ©¸æ¤Ç¤­¤Ê¤¤¶¯Îõ¤ÊÕû¤ò¤³¤¯¡£";
1193 #else
1194                         info[i++] = "You are subject to uncontrollable flatulence.";
1195 #endif
1196
1197                 }
1198                 if (p_ptr->muta2 & MUT2_PROD_MANA)
1199                 {
1200 #ifdef JP
1201 info[i++] = "¤¢¤Ê¤¿¤ÏÀ©¸æÉÔǽ¤ÊËâË¡¤Î¥¨¥Í¥ë¥®¡¼¤òȯ¤·¤Æ¤¤¤ë¡£";
1202 #else
1203                         info[i++] = "You are producing magical energy uncontrollably.";
1204 #endif
1205
1206                 }
1207                 if (p_ptr->muta2 & MUT2_ATT_DEMON)
1208                 {
1209 #ifdef JP
1210 info[i++] = "¤¢¤Ê¤¿¤Ï¥Ç¡¼¥â¥ó¤ò°ú¤­¤Ä¤±¤ë¡£";
1211 #else
1212                         info[i++] = "You attract demons.";
1213 #endif
1214
1215                 }
1216                 if (p_ptr->muta2 & MUT2_SCOR_TAIL)
1217                 {
1218 #ifdef JP
1219 info[i++] = "¤¢¤Ê¤¿¤Ï¥µ¥½¥ê¤Î¿¬Èø¤¬À¸¤¨¤Æ¤¤¤ë¡£(ÆÇ¡¢¥À¥á¡¼¥¸ 3d7)";
1220 #else
1221                         info[i++] = "You have a scorpion tail (poison, 3d7).";
1222 #endif
1223
1224                 }
1225                 if (p_ptr->muta2 & MUT2_HORNS)
1226                 {
1227 #ifdef JP
1228 info[i++] = "¤¢¤Ê¤¿¤Ï³Ñ¤¬À¸¤¨¤Æ¤¤¤ë¡£(¥À¥á¡¼¥¸ 2d6)";
1229 #else
1230                         info[i++] = "You have horns (dam. 2d6).";
1231 #endif
1232
1233                 }
1234                 if (p_ptr->muta2 & MUT2_BEAK)
1235                 {
1236 #ifdef JP
1237 info[i++] = "¤¢¤Ê¤¿¤Ï¥¯¥Á¥Ð¥·¤¬À¸¤¨¤Æ¤¤¤ë¡£(¥À¥á¡¼¥¸ 2d4)";
1238 #else
1239                         info[i++] = "You have a beak (dam. 2d4).";
1240 #endif
1241
1242                 }
1243                 if (p_ptr->muta2 & MUT2_SPEED_FLUX)
1244                 {
1245 #ifdef JP
1246 info[i++] = "¤¢¤Ê¤¿¤Ï¥é¥ó¥À¥à¤ËÁ᤯ư¤¤¤¿¤êÃÙ¤¯Æ°¤¤¤¿¤ê¤¹¤ë¡£";
1247 #else
1248                         info[i++] = "You move faster or slower randomly.";
1249 #endif
1250
1251                 }
1252                 if (p_ptr->muta2 & MUT2_BANISH_ALL)
1253                 {
1254 #ifdef JP
1255 info[i++] = "¤¢¤Ê¤¿¤Ï»þ¡¹¶á¤¯¤Î¥â¥ó¥¹¥¿¡¼¤ò¾ÃÌǤµ¤»¤ë¡£";
1256 #else
1257                         info[i++] = "You sometimes cause nearby creatures to vanish.";
1258 #endif
1259
1260                 }
1261                 if (p_ptr->muta2 & MUT2_EAT_LIGHT)
1262                 {
1263 #ifdef JP
1264 info[i++] = "¤¢¤Ê¤¿¤Ï»þ¡¹¼þ°Ï¤Î¸÷¤òµÛ¼ý¤·¤Æ±ÉÍܤˤ¹¤ë¡£";
1265 #else
1266                         info[i++] = "You sometimes feed off of the light around you.";
1267 #endif
1268
1269                 }
1270                 if (p_ptr->muta2 & MUT2_TRUNK)
1271                 {
1272 #ifdef JP
1273 info[i++] = "¤¢¤Ê¤¿¤Ï¾Ý¤Î¤è¤¦¤ÊÉ¡¤ò»ý¤Ã¤Æ¤¤¤ë¡£(¥À¥á¡¼¥¸ 1d4)";
1274 #else
1275                         info[i++] = "You have an elephantine trunk (dam 1d4).";
1276 #endif
1277
1278                 }
1279                 if (p_ptr->muta2 & MUT2_ATT_ANIMAL)
1280                 {
1281 #ifdef JP
1282 info[i++] = "¤¢¤Ê¤¿¤Ïưʪ¤ò°ú¤­¤Ä¤±¤ë¡£";
1283 #else
1284                         info[i++] = "You attract animals.";
1285 #endif
1286
1287                 }
1288                 if (p_ptr->muta2 & MUT2_TENTACLES)
1289                 {
1290 #ifdef JP
1291 info[i++] = "¤¢¤Ê¤¿¤Ï¼Ù°­¤Ê¿¨¼ê¤ò»ý¤Ã¤Æ¤¤¤ë¡£(¥À¥á¡¼¥¸ 2d5)";
1292 #else
1293                         info[i++] = "You have evil looking tentacles (dam 2d5).";
1294 #endif
1295
1296                 }
1297                 if (p_ptr->muta2 & MUT2_RAW_CHAOS)
1298                 {
1299 #ifdef JP
1300 info[i++] = "¤¢¤Ê¤¿¤Ï¤·¤Ð¤·¤Ð½ã¥«¥ª¥¹¤ËÊñ¤Þ¤ì¤ë¡£";
1301 #else
1302                         info[i++] = "You occasionally are surrounded with raw chaos.";
1303 #endif
1304
1305                 }
1306                 if (p_ptr->muta2 & MUT2_NORMALITY)
1307                 {
1308 #ifdef JP
1309 info[i++] = "¤¢¤Ê¤¿¤ÏÊÑ°Û¤·¤Æ¤¤¤¿¤¬¡¢²óÉü¤·¤Æ¤­¤Æ¤¤¤ë¡£";
1310 #else
1311                         info[i++] = "You may be mutated, but you're recovering.";
1312 #endif
1313
1314                 }
1315                 if (p_ptr->muta2 & MUT2_WRAITH)
1316                 {
1317 #ifdef JP
1318 info[i++] = "¤¢¤Ê¤¿¤ÎÆùÂΤÏÍ©Â⽤·¤¿¤ê¼ÂÂ⽤·¤¿¤ê¤¹¤ë¡£";
1319 #else
1320                         info[i++] = "You fade in and out of physical reality.";
1321 #endif
1322
1323                 }
1324                 if (p_ptr->muta2 & MUT2_POLY_WOUND)
1325                 {
1326 #ifdef JP
1327 info[i++] = "¤¢¤Ê¤¿¤Î·ò¹¯¤Ï¥«¥ª¥¹¤ÎÎϤ˱ƶÁ¤ò¼õ¤±¤ë¡£";
1328 #else
1329                         info[i++] = "Your health is subject to chaotic forces.";
1330 #endif
1331
1332                 }
1333                 if (p_ptr->muta2 & MUT2_WASTING)
1334                 {
1335 #ifdef JP
1336 info[i++] = "¤¢¤Ê¤¿¤Ï¿ê¼å¤¹¤ë¶²¤í¤·¤¤Éµ¤¤Ë¤«¤«¤Ã¤Æ¤¤¤ë¡£";
1337 #else
1338                         info[i++] = "You have a horrible wasting disease.";
1339 #endif
1340
1341                 }
1342                 if (p_ptr->muta2 & MUT2_ATT_DRAGON)
1343                 {
1344 #ifdef JP
1345 info[i++] = "¤¢¤Ê¤¿¤Ï¥É¥é¥´¥ó¤ò°ú¤­¤Ä¤±¤ë¡£";
1346 #else
1347                         info[i++] = "You attract dragons.";
1348 #endif
1349
1350                 }
1351                 if (p_ptr->muta2 & MUT2_WEIRD_MIND)
1352                 {
1353 #ifdef JP
1354 info[i++] = "¤¢¤Ê¤¿¤ÎÀº¿À¤Ï¥é¥ó¥À¥à¤Ë³ÈÂ礷¤¿¤ê½Ì¾®¤·¤¿¤ê¤·¤Æ¤¤¤ë¡£";
1355 #else
1356                         info[i++] = "Your mind randomly expands and contracts.";
1357 #endif
1358
1359                 }
1360                 if (p_ptr->muta2 & MUT2_NAUSEA)
1361                 {
1362 #ifdef JP
1363 info[i++] = "¤¢¤Ê¤¿¤Î°ß¤ÏÈó¾ï¤ËÍî¤ÁÃ夭¤¬¤Ê¤¤¡£";
1364 #else
1365                         info[i++] = "You have a seriously upset stomach.";
1366 #endif
1367
1368                 }
1369                 if (p_ptr->muta2 & MUT2_CHAOS_GIFT)
1370                 {
1371 #ifdef JP
1372 info[i++] = "¤¢¤Ê¤¿¤Ï¥«¥ª¥¹¤Î¼é¸î°­Ë⤫¤éË«Èþ¤ò¤¦¤±¤È¤ë¡£";
1373 #else
1374                         info[i++] = "Chaos deities give you gifts.";
1375 #endif
1376
1377                 }
1378                 if (p_ptr->muta2 & MUT2_WALK_SHAD)
1379                 {
1380 #ifdef JP
1381 info[i++] = "¤¢¤Ê¤¿¤Ï¤·¤Ð¤·¤Ð¾¤Î¡Ö±Æ¡×¤Ë̤¤¹þ¤à¡£";
1382 #else
1383                         info[i++] = "You occasionally stumble into other shadows.";
1384 #endif
1385
1386                 }
1387                 if (p_ptr->muta2 & MUT2_WARNING)
1388                 {
1389 #ifdef JP
1390 info[i++] = "¤¢¤Ê¤¿¤ÏŨ¤Ë´Ø¤¹¤ë·Ù¹ð¤ò´¶¤¸¤ë¡£";
1391 #else
1392                         info[i++] = "You receive warnings about your foes.";
1393 #endif
1394
1395                 }
1396                 if (p_ptr->muta2 & MUT2_INVULN)
1397                 {
1398 #ifdef JP
1399 info[i++] = "¤¢¤Ê¤¿¤Ï»þ¡¹É餱ÃΤ餺¤Êµ¤Ê¬¤Ë¤Ê¤ë¡£";
1400 #else
1401                         info[i++] = "You occasionally feel invincible.";
1402 #endif
1403
1404                 }
1405                 if (p_ptr->muta2 & MUT2_SP_TO_HP)
1406                 {
1407 #ifdef JP
1408 info[i++] = "¤¢¤Ê¤¿¤Ï»þ¡¹·ì¤¬¶ÚÆù¤Ë¤É¤Ã¤Èή¤ì¤ë¡£";
1409 #else
1410                         info[i++] = "Your blood sometimes rushes to your muscles.";
1411 #endif
1412
1413                 }
1414                 if (p_ptr->muta2 & MUT2_HP_TO_SP)
1415                 {
1416 #ifdef JP
1417 info[i++] = "¤¢¤Ê¤¿¤Ï»þ¡¹Æ¬¤Ë·ì¤¬¤É¤Ã¤Èή¤ì¤ë¡£";
1418 #else
1419                         info[i++] = "Your blood sometimes rushes to your head.";
1420 #endif
1421
1422                 }
1423                 if (p_ptr->muta2 & MUT2_DISARM)
1424                 {
1425 #ifdef JP
1426 info[i++] = "¤¢¤Ê¤¿¤Ï¤è¤¯¤Ä¤Þ¤Å¤¤¤Æʪ¤òÍî¤È¤¹¡£";
1427 #else
1428                         info[i++] = "You occasionally stumble and drop things.";
1429 #endif
1430
1431                 }
1432         }
1433
1434         if (p_ptr->muta3)
1435         {
1436                 if (p_ptr->muta3 & MUT3_HYPER_STR)
1437                 {
1438 #ifdef JP
1439 info[i++] = "¤¢¤Ê¤¿¤ÏĶ¿ÍŪ¤Ë¶¯¤¤¡£(ÏÓÎÏ+4)";
1440 #else
1441                         info[i++] = "You are superhumanly strong (+4 STR).";
1442 #endif
1443
1444                 }
1445                 if (p_ptr->muta3 & MUT3_PUNY)
1446                 {
1447 #ifdef JP
1448 info[i++] = "¤¢¤Ê¤¿¤Ïµõ¼å¤À¡£(ÏÓÎÏ-4)";
1449 #else
1450                         info[i++] = "You are puny (-4 STR).";
1451 #endif
1452
1453                 }
1454                 if (p_ptr->muta3 & MUT3_HYPER_INT)
1455                 {
1456 #ifdef JP
1457 info[i++] = "¤¢¤Ê¤¿¤ÎǾ¤ÏÀ¸ÂÎ¥³¥ó¥Ô¥å¡¼¥¿¤À¡£(ÃÎǽ¡õ¸­¤µ+4)";
1458 #else
1459                         info[i++] = "Your brain is a living computer (+4 INT/WIS).";
1460 #endif
1461
1462                 }
1463                 if (p_ptr->muta3 & MUT3_MORONIC)
1464                 {
1465 #ifdef JP
1466 info[i++] = "¤¢¤Ê¤¿¤ÏÀº¿ÀÇö¼å¤À¡£(ÃÎǽ¡õ¸­¤µ-4)";
1467 #else
1468                         info[i++] = "You are moronic (-4 INT/WIS).";
1469 #endif
1470
1471                 }
1472                 if (p_ptr->muta3 & MUT3_RESILIENT)
1473                 {
1474 #ifdef JP
1475 info[i++] = "¤¢¤Ê¤¿¤ÏÈó¾ï¤Ë¥¿¥Õ¤À¡£(Âѵ×+4)";
1476 #else
1477                         info[i++] = "You are very resilient (+4 CON).";
1478 #endif
1479
1480                 }
1481                 if (p_ptr->muta3 & MUT3_XTRA_FAT)
1482                 {
1483 #ifdef JP
1484 info[i++] = "¤¢¤Ê¤¿¤Ï¶Ëü¤ËÂÀ¤Ã¤Æ¤¤¤ë¡£(Âѵ×+2,¥¹¥Ô¡¼¥É-2)";
1485 #else
1486                         info[i++] = "You are extremely fat (+2 CON, -2 speed).";
1487 #endif
1488
1489                 }
1490                 if (p_ptr->muta3 & MUT3_ALBINO)
1491                 {
1492 #ifdef JP
1493 info[i++] = "¤¢¤Ê¤¿¤Ï¥¢¥ë¥Ó¥Î¤À¡£(Âѵ×-4)";
1494 #else
1495                         info[i++] = "You are albino (-4 CON).";
1496 #endif
1497
1498                 }
1499                 if (p_ptr->muta3 & MUT3_FLESH_ROT)
1500                 {
1501 #ifdef JP
1502 info[i++] = "¤¢¤Ê¤¿¤ÎÆùÂΤÏÉåÇÔ¤·¤Æ¤¤¤ë¡£(Âѵ×-2,Ì¥ÎÏ-1)";
1503 #else
1504                         info[i++] = "Your flesh is rotting (-2 CON, -1 CHR).";
1505 #endif
1506
1507                 }
1508                 if (p_ptr->muta3 & MUT3_SILLY_VOI)
1509                 {
1510 #ifdef JP
1511 info[i++] = "¤¢¤Ê¤¿¤ÎÀ¼¤Ï´ÖÈ´¤±¤Ê¥­¡¼¥­¡¼À¼¤À¡£(Ì¥ÎÏ-4)";
1512 #else
1513                         info[i++] = "Your voice is a silly squeak (-4 CHR).";
1514 #endif
1515
1516                 }
1517                 if (p_ptr->muta3 & MUT3_BLANK_FAC)
1518                 {
1519 #ifdef JP
1520 info[i++] = "¤¢¤Ê¤¿¤Ï¤Î¤Ã¤Ú¤é¤Ü¤¦¤À¡£(Ì¥ÎÏ-1)";
1521 #else
1522                         info[i++] = "Your face is featureless (-1 CHR).";
1523 #endif
1524
1525                 }
1526                 if (p_ptr->muta3 & MUT3_ILL_NORM)
1527                 {
1528 #ifdef JP
1529 info[i++] = "¤¢¤Ê¤¿¤Ï¸¸±Æ¤Ëʤ¤ï¤ì¤Æ¤¤¤ë¡£";
1530 #else
1531                         info[i++] = "Your appearance is masked with illusion.";
1532 #endif
1533
1534                 }
1535                 if (p_ptr->muta3 & MUT3_XTRA_EYES)
1536                 {
1537 #ifdef JP
1538 info[i++] = "¤¢¤Ê¤¿¤Ï;ʬ¤ËÆó¤Ä¤ÎÌܤò»ý¤Ã¤Æ¤¤¤ë¡£(õº÷+15)";
1539 #else
1540                         info[i++] = "You have an extra pair of eyes (+15 search).";
1541 #endif
1542
1543                 }
1544                 if (p_ptr->muta3 & MUT3_MAGIC_RES)
1545                 {
1546 #ifdef JP
1547 info[i++] = "¤¢¤Ê¤¿¤ÏËâË¡¤Ø¤ÎÂÑÀ­¤ò¤â¤Ã¤Æ¤¤¤ë¡£";
1548 #else
1549                         info[i++] = "You are resistant to magic.";
1550 #endif
1551
1552                 }
1553                 if (p_ptr->muta3 & MUT3_XTRA_NOIS)
1554                 {
1555 #ifdef JP
1556 info[i++] = "¤¢¤Ê¤¿¤ÏÊѤʲ»¤òȯ¤·¤Æ¤¤¤ë¡£(±£Ì©-3)";
1557 #else
1558                         info[i++] = "You make a lot of strange noise (-3 stealth).";
1559 #endif
1560
1561                 }
1562                 if (p_ptr->muta3 & MUT3_INFRAVIS)
1563                 {
1564 #ifdef JP
1565 info[i++] = "¤¢¤Ê¤¿¤ÏÁÇÀ²¤é¤·¤¤ÀÖ³°Àþ»ëÎϤò»ý¤Ã¤Æ¤¤¤ë¡£(+3)";
1566 #else
1567                         info[i++] = "You have remarkable infravision (+3).";
1568 #endif
1569
1570                 }
1571                 if (p_ptr->muta3 & MUT3_XTRA_LEGS)
1572                 {
1573 #ifdef JP
1574 info[i++] = "¤¢¤Ê¤¿¤Ï;ʬ¤ËÆóËܤέ¤¬À¸¤¨¤Æ¤¤¤ë¡£(²Ã®+3)";
1575 #else
1576                         info[i++] = "You have an extra pair of legs (+3 speed).";
1577 #endif
1578
1579                 }
1580                 if (p_ptr->muta3 & MUT3_SHORT_LEG)
1581                 {
1582 #ifdef JP
1583 info[i++] = "¤¢¤Ê¤¿¤Î­¤Ïû¤¤Æ͵¯¤À¡£(²Ã®-3)";
1584 #else
1585                         info[i++] = "Your legs are short stubs (-3 speed).";
1586 #endif
1587
1588                 }
1589                 if (p_ptr->muta3 & MUT3_ELEC_TOUC)
1590                 {
1591 #ifdef JP
1592 info[i++] = "¤¢¤Ê¤¿¤Î·ì´É¤Ë¤ÏÅÅή¤¬Î®¤ì¤Æ¤¤¤ë¡£";
1593 #else
1594                         info[i++] = "Electricity is running through your veins.";
1595 #endif
1596
1597                 }
1598                 if (p_ptr->muta3 & MUT3_FIRE_BODY)
1599                 {
1600 #ifdef JP
1601 info[i++] = "¤¢¤Ê¤¿¤ÎÂΤϱê¤Ë¤Ä¤Ä¤Þ¤ì¤Æ¤¤¤ë¡£";
1602 #else
1603                         info[i++] = "Your body is enveloped in flames.";
1604 #endif
1605                 }
1606                 if (p_ptr->muta3 & MUT3_WART_SKIN)
1607                 {
1608 #ifdef JP
1609 info[i++] = "¤¢¤Ê¤¿¤ÎÈ©¤Ï¥¤¥Ü¤ËÈï¤ï¤ì¤Æ¤¤¤ë¡£(Ì¥ÎÏ-2, AC+5)";
1610 #else
1611                         info[i++] = "Your skin is covered with warts (-2 CHR, +5 AC).";
1612 #endif
1613
1614                 }
1615                 if (p_ptr->muta3 & MUT3_SCALES)
1616                 {
1617 #ifdef JP
1618 info[i++] = "¤¢¤Ê¤¿¤ÎÈ©¤ÏÎڤˤʤäƤ¤¤ë¡£(Ì¥ÎÏ-1, AC+10)";
1619 #else
1620                         info[i++] = "Your skin has turned into scales (-1 CHR, +10 AC).";
1621 #endif
1622
1623                 }
1624                 if (p_ptr->muta3 & MUT3_IRON_SKIN)
1625                 {
1626 #ifdef JP
1627 info[i++] = "¤¢¤Ê¤¿¤ÎÈ©¤ÏÅ´¤Ç¤Ç¤­¤Æ¤¤¤ë¡£(´ïÍÑ-1, AC+25)";
1628 #else
1629                         info[i++] = "Your skin is made of steel (-1 DEX, +25 AC).";
1630 #endif
1631
1632                 }
1633                 if (p_ptr->muta3 & MUT3_WINGS)
1634                 {
1635 #ifdef JP
1636 info[i++] = "¤¢¤Ê¤¿¤Ï±©¤ò»ý¤Ã¤Æ¤¤¤ë¡£";
1637 #else
1638                         info[i++] = "You have wings.";
1639 #endif
1640
1641                 }
1642                 if (p_ptr->muta3 & MUT3_FEARLESS)
1643                 {
1644                         /* Unnecessary */
1645                 }
1646                 if (p_ptr->muta3 & MUT3_REGEN)
1647                 {
1648                         /* Unnecessary */
1649                 }
1650                 if (p_ptr->muta3 & MUT3_ESP)
1651                 {
1652                         /* Unnecessary */
1653                 }
1654                 if (p_ptr->muta3 & MUT3_LIMBER)
1655                 {
1656 #ifdef JP
1657 info[i++] = "¤¢¤Ê¤¿¤ÎÂΤÏÈó¾ï¤Ë¤·¤Ê¤ä¤«¤À¡£(´ïÍÑ+3)";
1658 #else
1659                         info[i++] = "Your body is very limber (+3 DEX).";
1660 #endif
1661
1662                 }
1663                 if (p_ptr->muta3 & MUT3_ARTHRITIS)
1664                 {
1665 #ifdef JP
1666 info[i++] = "¤¢¤Ê¤¿¤Ï¤¤¤Ä¤â´ØÀá¤ËÄˤߤò´¶¤¸¤Æ¤¤¤ë¡£(´ïÍÑ-3)";
1667 #else
1668                         info[i++] = "Your joints ache constantly (-3 DEX).";
1669 #endif
1670
1671                 }
1672                 if (p_ptr->muta3 & MUT3_VULN_ELEM)
1673                 {
1674 #ifdef JP
1675 info[i++] = "¤¢¤Ê¤¿¤Ï¸µÁǤι¶·â¤Ë¼å¤¤¡£";
1676 #else
1677                         info[i++] = "You are susceptible to damage from the elements.";
1678 #endif
1679
1680                 }
1681                 if (p_ptr->muta3 & MUT3_MOTION)
1682                 {
1683 #ifdef JP
1684 info[i++] = "¤¢¤Ê¤¿¤ÎÆ°ºî¤ÏÀµ³Î¤ÇÎ϶¯¤¤¡£(±£Ì©+1)";
1685 #else
1686                         info[i++] = "Your movements are precise and forceful (+1 STL).";
1687 #endif
1688
1689                 }
1690                 if (p_ptr->muta3 & MUT3_GOOD_LUCK)
1691                 {
1692 #ifdef JP
1693 info[i++] = "¤¢¤Ê¤¿¤ÏÇò¤¤¥ª¡¼¥é¤Ë¤Ä¤Ä¤Þ¤ì¤Æ¤¤¤ë¡£";
1694 #else
1695                         info[i++] = "There is a white aura surrounding you.";
1696 #endif
1697                 }
1698                 if (p_ptr->muta3 & MUT3_BAD_LUCK)
1699                 {
1700 #ifdef JP
1701 info[i++] = "¤¢¤Ê¤¿¤Ï¹õ¤¤¥ª¡¼¥é¤Ë¤Ä¤Ä¤Þ¤ì¤Æ¤¤¤ë¡£";
1702 #else
1703                         info[i++] = "There is a black aura surrounding you.";
1704 #endif
1705                 }
1706         }
1707
1708         if (p_ptr->blind)
1709         {
1710 #ifdef JP
1711 info[i++] = "¤¢¤Ê¤¿¤ÏÌܤ¬¸«¤¨¤Ê¤¤¡£";
1712 #else
1713                 info[i++] = "You cannot see.";
1714 #endif
1715
1716         }
1717         if (p_ptr->confused)
1718         {
1719 #ifdef JP
1720 info[i++] = "¤¢¤Ê¤¿¤Ïº®Í𤷤Ƥ¤¤ë¡£";
1721 #else
1722                 info[i++] = "You are confused.";
1723 #endif
1724
1725         }
1726         if (p_ptr->afraid)
1727         {
1728 #ifdef JP
1729 info[i++] = "¤¢¤Ê¤¿¤Ï¶²Éݤ˿¯¤µ¤ì¤Æ¤¤¤ë¡£";
1730 #else
1731                 info[i++] = "You are terrified.";
1732 #endif
1733
1734         }
1735         if (p_ptr->cut)
1736         {
1737 #ifdef JP
1738 info[i++] = "¤¢¤Ê¤¿¤Ï½Ð·ì¤·¤Æ¤¤¤ë¡£";
1739 #else
1740                 info[i++] = "You are bleeding.";
1741 #endif
1742
1743         }
1744         if (p_ptr->stun)
1745         {
1746 #ifdef JP
1747 info[i++] = "¤¢¤Ê¤¿¤Ï¤â¤¦¤í¤¦¤È¤·¤Æ¤¤¤ë¡£";
1748 #else
1749                 info[i++] = "You are stunned.";
1750 #endif
1751
1752         }
1753         if (p_ptr->poisoned)
1754         {
1755 #ifdef JP
1756 info[i++] = "¤¢¤Ê¤¿¤ÏÆǤ˿¯¤µ¤ì¤Æ¤¤¤ë¡£";
1757 #else
1758                 info[i++] = "You are poisoned.";
1759 #endif
1760
1761         }
1762         if (p_ptr->image)
1763         {
1764 #ifdef JP
1765 info[i++] = "¤¢¤Ê¤¿¤Ï¸¸³Ð¤ò¸«¤Æ¤¤¤ë¡£";
1766 #else
1767                 info[i++] = "You are hallucinating.";
1768 #endif
1769
1770         }
1771         if (p_ptr->cursed & TRC_TY_CURSE)
1772         {
1773 #ifdef JP
1774 info[i++] = "¤¢¤Ê¤¿¤Ï¼Ù°­¤Ê±åÇ°¤ËÊñ¤Þ¤ì¤Æ¤¤¤ë¡£";
1775 #else
1776                 info[i++] = "You carry an ancient foul curse.";
1777 #endif
1778
1779         }
1780         if (p_ptr->cursed & TRC_AGGRAVATE)
1781         {
1782 #ifdef JP
1783 info[i++] = "¤¢¤Ê¤¿¤Ï¥â¥ó¥¹¥¿¡¼¤òÅܤ餻¤Æ¤¤¤ë¡£";
1784 #else
1785                 info[i++] = "You aggravate monsters.";
1786 #endif
1787
1788         }
1789         if (p_ptr->cursed & TRC_DRAIN_EXP)
1790         {
1791 #ifdef JP
1792 info[i++] = "¤¢¤Ê¤¿¤Ï·Ð¸³ÃͤòµÛ¤ï¤ì¤Æ¤¤¤ë¡£";
1793 #else
1794                 info[i++] = "You are drained.";
1795 #endif
1796
1797         }
1798         if (p_ptr->cursed & TRC_SLOW_REGEN)
1799         {
1800 #ifdef JP
1801 info[i++] = "¤¢¤Ê¤¿¤Î²óÉüÎϤÏÈó¾ï¤ËÃÙ¤¤¡£";
1802 #else
1803                 info[i++] = "You regenerate slowly.";
1804 #endif
1805
1806         }
1807         if (p_ptr->cursed & TRC_ADD_L_CURSE)
1808         {
1809 #ifdef JP
1810 info[i++] = "¤¢¤Ê¤¿¤Î¼å¤¤¼ö¤¤¤ÏÁý¤¨¤ë¡£"; /* »ÃÄêŪ -- henkma */
1811 #else
1812                 info[i++] = "Your weak curses multiply.";
1813 #endif
1814
1815         }
1816         if (p_ptr->cursed & TRC_ADD_H_CURSE)
1817         {
1818 #ifdef JP
1819 info[i++] = "¤¢¤Ê¤¿¤Î¶¯¤¤¼ö¤¤¤ÏÁý¤¨¤ë¡£"; /* »ÃÄêŪ -- henkma */
1820 #else
1821                 info[i++] = "Your heavy curses multiply.";
1822 #endif
1823
1824         }
1825         if (p_ptr->cursed & TRC_CALL_ANIMAL)
1826         {
1827 #ifdef JP
1828 info[i++] = "¤¢¤Ê¤¿¤Ïưʪ¤ËÁÀ¤ï¤ì¤Æ¤¤¤ë¡£";
1829 #else
1830                 info[i++] = "You attract animals.";
1831 #endif
1832
1833         }
1834         if (p_ptr->cursed & TRC_CALL_DEMON)
1835         {
1836 #ifdef JP
1837 info[i++] = "¤¢¤Ê¤¿¤Ï°­Ëâ¤ËÁÀ¤ï¤ì¤Æ¤¤¤ë¡£";
1838 #else
1839                 info[i++] = "You attract demons.";
1840 #endif
1841
1842         }
1843         if (p_ptr->cursed & TRC_CALL_DRAGON)
1844         {
1845 #ifdef JP
1846 info[i++] = "¤¢¤Ê¤¿¤Ï¥É¥é¥´¥ó¤ËÁÀ¤ï¤ì¤Æ¤¤¤ë¡£";
1847 #else
1848                 info[i++] = "You attract dragons.";
1849 #endif
1850
1851         }
1852         if (p_ptr->cursed & TRC_COWARDICE)
1853         {
1854 #ifdef JP
1855 info[i++] = "¤¢¤Ê¤¿¤Ï»þ¡¹²²É¤ˤʤ롣";
1856 #else
1857                 info[i++] = "You are subject to cowardice.";
1858 #endif
1859
1860         }
1861         if (p_ptr->cursed & TRC_TELEPORT)
1862         {
1863 #ifdef JP
1864 info[i++] = "¤¢¤Ê¤¿¤Î°ÌÃ֤ϤҤ¸¤ç¤¦¤ËÉÔ°ÂÄê¤À¡£";
1865 #else
1866                 info[i++] = "Your position is very uncertain.";
1867 #endif
1868
1869         }
1870         if (p_ptr->cursed & TRC_LOW_MELEE)
1871         {
1872 #ifdef JP
1873 info[i++] = "¤¢¤Ê¤¿¤ÎÉð´ï¤Ï¹¶·â¤ò³°¤·¤ä¤¹¤¤¡£";
1874 #else
1875                 info[i++] = "Your weapon causes you to miss blows.";
1876 #endif
1877
1878         }
1879         if (p_ptr->cursed & TRC_LOW_AC)
1880         {
1881 #ifdef JP
1882 info[i++] = "¤¢¤Ê¤¿¤Ï¹¶·â¤ò¼õ¤±¤ä¤¹¤¤¡£";
1883 #else
1884                 info[i++] = "You are subject to be hit.";
1885 #endif
1886
1887         }
1888         if (p_ptr->cursed & TRC_LOW_MAGIC)
1889         {
1890 #ifdef JP
1891 info[i++] = "¤¢¤Ê¤¿¤ÏËâË¡¤ò¼ºÇÔ¤·¤ä¤¹¤¤¡£";
1892 #else
1893                 info[i++] = "You are subject to fail spellcasting.";
1894 #endif
1895
1896         }
1897         if (p_ptr->cursed & TRC_FAST_DIGEST)
1898         {
1899 #ifdef JP
1900 info[i++] = "¤¢¤Ê¤¿¤Ï¤¹¤°¤ªÊ¢¤¬¤Ø¤ë¡£";
1901 #else
1902                 info[i++] = "You have a good appetite.";
1903 #endif
1904
1905         }
1906         if (p_ptr->cursed & TRC_DRAIN_HP)
1907         {
1908 #ifdef JP
1909 info[i++] = "¤¢¤Ê¤¿¤ÏÂÎÎϤòµÛ¤ï¤ì¤Æ¤¤¤ë¡£";
1910 #else
1911                 info[i++] = "You are drained.";
1912 #endif
1913
1914         }
1915         if (p_ptr->cursed & TRC_DRAIN_MANA)
1916         {
1917 #ifdef JP
1918 info[i++] = "¤¢¤Ê¤¿¤ÏËâÎϤòµÛ¤ï¤ì¤Æ¤¤¤ë¡£";
1919 #else
1920                 info[i++] = "You brain is drained.";
1921 #endif
1922
1923         }
1924         if (IS_BLESSED())
1925         {
1926 #ifdef JP
1927 info[i++] = "¤¢¤Ê¤¿¤Ï¸øÀµ¤µ¤ò´¶¤¸¤Æ¤¤¤ë¡£";
1928 #else
1929                 info[i++] = "You feel rightous.";
1930 #endif
1931
1932         }
1933         if (IS_HERO())
1934         {
1935 #ifdef JP
1936 info[i++] = "¤¢¤Ê¤¿¤Ï¥Ò¡¼¥í¡¼µ¤Ê¬¤À¡£";
1937 #else
1938                 info[i++] = "You feel heroic.";
1939 #endif
1940
1941         }
1942         if (p_ptr->shero)
1943         {
1944 #ifdef JP
1945 info[i++] = "¤¢¤Ê¤¿¤ÏÀïÆ®¶¸¤À¡£";
1946 #else
1947                 info[i++] = "You are in a battle rage.";
1948 #endif
1949
1950         }
1951         if (p_ptr->protevil)
1952         {
1953 #ifdef JP
1954 info[i++] = "¤¢¤Ê¤¿¤Ï¼Ù°­¤Ê¤ë¸ºß¤«¤é¼é¤é¤ì¤Æ¤¤¤ë¡£";
1955 #else
1956                 info[i++] = "You are protected from evil.";
1957 #endif
1958
1959         }
1960         if (p_ptr->shield)
1961         {
1962 #ifdef JP
1963 info[i++] = "¤¢¤Ê¤¿¤Ï¿ÀÈë¤Î¥·¡¼¥ë¥É¤Ç¼é¤é¤ì¤Æ¤¤¤ë¡£";
1964 #else
1965                 info[i++] = "You are protected by a mystic shield.";
1966 #endif
1967
1968         }
1969         if (IS_INVULN())
1970         {
1971 #ifdef JP
1972 info[i++] = "¤¢¤Ê¤¿¤Ï¸½ºß½ý¤Ä¤«¤Ê¤¤¡£";
1973 #else
1974                 info[i++] = "You are temporarily invulnerable.";
1975 #endif
1976
1977         }
1978         if (p_ptr->wraith_form)
1979         {
1980 #ifdef JP
1981 info[i++] = "¤¢¤Ê¤¿¤Ï°ì»þŪ¤ËÍ©Â⽤·¤Æ¤¤¤ë¡£";
1982 #else
1983                 info[i++] = "You are temporarily incorporeal.";
1984 #endif
1985
1986         }
1987         if (p_ptr->special_attack & ATTACK_CONFUSE)
1988         {
1989 #ifdef JP
1990 info[i++] = "¤¢¤Ê¤¿¤Î¼ê¤ÏÀÖ¤¯µ±¤¤¤Æ¤¤¤ë¡£";
1991 #else
1992                 info[i++] = "Your hands are glowing dull red.";
1993 #endif
1994
1995         }
1996         if (p_ptr->special_attack & ATTACK_FIRE)
1997         {
1998 #ifdef JP
1999 info[i++] = "¤¢¤Ê¤¿¤Î¼ê¤Ï²Ð±ê¤Ëʤ¤ï¤ì¤Æ¤¤¤ë¡£";
2000 #else
2001                 info[i++] = "You can strike the enemy with flame.";
2002 #endif
2003
2004         }
2005         if (p_ptr->special_attack & ATTACK_COLD)
2006         {
2007 #ifdef JP
2008 info[i++] = "¤¢¤Ê¤¿¤Î¼ê¤ÏÎ䵤¤Ëʤ¤ï¤ì¤Æ¤¤¤ë¡£";
2009 #else
2010                 info[i++] = "You can strike the enemy with cold.";
2011 #endif
2012
2013         }
2014         if (p_ptr->special_attack & ATTACK_ACID)
2015         {
2016 #ifdef JP
2017 info[i++] = "¤¢¤Ê¤¿¤Î¼ê¤Ï»À¤Ëʤ¤ï¤ì¤Æ¤¤¤ë¡£";
2018 #else
2019                 info[i++] = "You can strike the enemy with acid.";
2020 #endif
2021
2022         }
2023         if (p_ptr->special_attack & ATTACK_ELEC)
2024         {
2025 #ifdef JP
2026 info[i++] = "¤¢¤Ê¤¿¤Î¼ê¤ÏÅÅ·â¤Ëʤ¤ï¤ì¤Æ¤¤¤ë¡£";
2027 #else
2028                 info[i++] = "You can strike the enemy with electoric shock.";
2029 #endif
2030
2031         }
2032         if (p_ptr->special_attack & ATTACK_POIS)
2033         {
2034 #ifdef JP
2035 info[i++] = "¤¢¤Ê¤¿¤Î¼ê¤ÏÆǤËʤ¤ï¤ì¤Æ¤¤¤ë¡£";
2036 #else
2037                 info[i++] = "You can strike the enemy with poison.";
2038 #endif
2039
2040         }
2041         switch (p_ptr->action)
2042         {
2043                 case ACTION_SEARCH:
2044 #ifdef JP
2045 info[i++] = "¤¢¤Ê¤¿¤Ï¤Ò¤¸¤ç¤¦¤ËÃí°Õ¿¼¤¯¼þ°Ï¤ò¸«ÅϤ·¤Æ¤¤¤ë¡£";
2046 #else
2047                         info[i++] = "You are looking around very carefully.";
2048 #endif
2049                         break;
2050         }
2051         if (p_ptr->new_spells)
2052         {
2053 #ifdef JP
2054 info[i++] = "¤¢¤Ê¤¿¤Ï¼öʸ¤äµ§¤ê¤ò³Ø¤Ö¤³¤È¤¬¤Ç¤­¤ë¡£";
2055 #else
2056                 info[i++] = "You can learn some spells/prayers.";
2057 #endif
2058
2059         }
2060         if (p_ptr->word_recall)
2061         {
2062 #ifdef JP
2063 info[i++] = "¤¢¤Ê¤¿¤Ï¤¹¤°¤Ëµ¢´Ô¤¹¤ë¤À¤í¤¦¡£";
2064 #else
2065                 info[i++] = "You will soon be recalled.";
2066 #endif
2067
2068         }
2069         if (p_ptr->alter_reality)
2070         {
2071 #ifdef JP
2072                 info[i++] = "¤¢¤Ê¤¿¤Ï¤¹¤°¤Ë¤³¤ÎÀ¤³¦¤òÎ¥¤ì¤ë¤À¤í¤¦¡£";
2073 #else
2074                 info[i++] = "You will soon be altered.";
2075 #endif
2076
2077         }
2078         if (p_ptr->see_infra)
2079         {
2080 #ifdef JP
2081 info[i++] = "¤¢¤Ê¤¿¤ÎÆ·¤ÏÀÖ³°Àþ¤ËÉÒ´¶¤Ç¤¢¤ë¡£";
2082 #else
2083                 info[i++] = "Your eyes are sensitive to infrared light.";
2084 #endif
2085
2086         }
2087         if (p_ptr->see_inv)
2088         {
2089 #ifdef JP
2090 info[i++] = "¤¢¤Ê¤¿¤ÏÆ©ÌÀ¤Ê¥â¥ó¥¹¥¿¡¼¤ò¸«¤ë¤³¤È¤¬¤Ç¤­¤ë¡£";
2091 #else
2092                 info[i++] = "You can see invisible creatures.";
2093 #endif
2094
2095         }
2096         if (p_ptr->ffall)
2097         {
2098 #ifdef JP
2099 info[i++] = "¤¢¤Ê¤¿¤ÏÈô¤Ö¤³¤È¤¬¤Ç¤­¤ë¡£";
2100 #else
2101                 info[i++] = "You can fly.";
2102 #endif
2103
2104         }
2105         if (p_ptr->free_act)
2106         {
2107 #ifdef JP
2108 info[i++] = "¤¢¤Ê¤¿¤ÏËãáãÃΤ餺¤Î¸ú²Ì¤ò»ý¤Ã¤Æ¤¤¤ë¡£";
2109 #else
2110                 info[i++] = "You have free action.";
2111 #endif
2112
2113         }
2114         if (p_ptr->regenerate)
2115         {
2116 #ifdef JP
2117 info[i++] = "¤¢¤Ê¤¿¤ÏÁÇÁ᤯ÂÎÎϤò²óÉü¤¹¤ë¡£";
2118 #else
2119                 info[i++] = "You regenerate quickly.";
2120 #endif
2121
2122         }
2123         if (p_ptr->slow_digest)
2124         {
2125 #ifdef JP
2126 info[i++] = "¤¢¤Ê¤¿¤Ï¿©Íߤ¬¾¯¤Ê¤¤¡£";
2127 #else
2128                 info[i++] = "Your appetite is small.";
2129 #endif
2130
2131         }
2132         if (p_ptr->telepathy)
2133         {
2134 #ifdef JP
2135 info[i++] = "¤¢¤Ê¤¿¤Ï¥Æ¥ì¥Ñ¥·¡¼Ç½ÎϤò»ý¤Ã¤Æ¤¤¤ë¡£";
2136 #else
2137                 info[i++] = "You have ESP.";
2138 #endif
2139
2140         }
2141         if (p_ptr->esp_animal)
2142         {
2143 #ifdef JP
2144 info[i++] = "¤¢¤Ê¤¿¤Ï¼«Á³³¦¤ÎÀ¸Êª¤Î¸ºß¤ò´¶¤¸¤ëǽÎϤò»ý¤Ã¤Æ¤¤¤ë¡£";
2145 #else
2146                 info[i++] = "You sense natural creatures.";
2147 #endif
2148
2149         }
2150         if (p_ptr->esp_undead)
2151         {
2152 #ifdef JP
2153 info[i++] = "¤¢¤Ê¤¿¤Ï¥¢¥ó¥Ç¥Ã¥É¤Î¸ºß¤ò´¶¤¸¤ëǽÎϤò»ý¤Ã¤Æ¤¤¤ë¡£";
2154 #else
2155                 info[i++] = "You sense undead.";
2156 #endif
2157
2158         }
2159         if (p_ptr->esp_demon)
2160         {
2161 #ifdef JP
2162 info[i++] = "¤¢¤Ê¤¿¤Ï°­Ëâ¤Î¸ºß¤ò´¶¤¸¤ëǽÎϤò»ý¤Ã¤Æ¤¤¤ë¡£";
2163 #else
2164                 info[i++] = "You sense demons.";
2165 #endif
2166
2167         }
2168         if (p_ptr->esp_orc)
2169         {
2170 #ifdef JP
2171 info[i++] = "¤¢¤Ê¤¿¤Ï¥ª¡¼¥¯¤Î¸ºß¤ò´¶¤¸¤ëǽÎϤò»ý¤Ã¤Æ¤¤¤ë¡£";
2172 #else
2173                 info[i++] = "You sense orcs.";
2174 #endif
2175
2176         }
2177         if (p_ptr->esp_troll)
2178         {
2179 #ifdef JP
2180 info[i++] = "¤¢¤Ê¤¿¤Ï¥È¥í¥ë¤Î¸ºß¤ò´¶¤¸¤ëǽÎϤò»ý¤Ã¤Æ¤¤¤ë¡£";
2181 #else
2182                 info[i++] = "You sense trolls.";
2183 #endif
2184
2185         }
2186         if (p_ptr->esp_giant)
2187         {
2188 #ifdef JP
2189 info[i++] = "¤¢¤Ê¤¿¤Ïµð¿Í¤Î¸ºß¤ò´¶¤¸¤ëǽÎϤò»ý¤Ã¤Æ¤¤¤ë¡£";
2190 #else
2191                 info[i++] = "You sense giants.";
2192 #endif
2193
2194         }
2195         if (p_ptr->esp_dragon)
2196         {
2197 #ifdef JP
2198 info[i++] = "¤¢¤Ê¤¿¤Ï¥É¥é¥´¥ó¤Î¸ºß¤ò´¶¤¸¤ëǽÎϤò»ý¤Ã¤Æ¤¤¤ë¡£";
2199 #else
2200                 info[i++] = "You sense dragons.";
2201 #endif
2202
2203         }
2204         if (p_ptr->esp_human)
2205         {
2206 #ifdef JP
2207 info[i++] = "¤¢¤Ê¤¿¤Ï¿Í´Ö¤Î¸ºß¤ò´¶¤¸¤ëǽÎϤò»ý¤Ã¤Æ¤¤¤ë¡£";
2208 #else
2209                 info[i++] = "You sense humans.";
2210 #endif
2211
2212         }
2213         if (p_ptr->esp_evil)
2214         {
2215 #ifdef JP
2216 info[i++] = "¤¢¤Ê¤¿¤Ï¼Ù°­¤ÊÀ¸¤­Êª¤Î¸ºß¤ò´¶¤¸¤ëǽÎϤò»ý¤Ã¤Æ¤¤¤ë¡£";
2217 #else
2218                 info[i++] = "You sense evil creatures.";
2219 #endif
2220
2221         }
2222         if (p_ptr->esp_good)
2223         {
2224 #ifdef JP
2225 info[i++] = "¤¢¤Ê¤¿¤ÏÁ±ÎɤÊÀ¸¤­Êª¤Î¸ºß¤ò´¶¤¸¤ëǽÎϤò»ý¤Ã¤Æ¤¤¤ë¡£";
2226 #else
2227                 info[i++] = "You sense good creatures.";
2228 #endif
2229
2230         }
2231         if (p_ptr->esp_nonliving)
2232         {
2233 #ifdef JP
2234 info[i++] = "¤¢¤Ê¤¿¤Ï³èÆ°¤¹¤ë̵À¸ÊªÂΤθºß¤ò´¶¤¸¤ëǽÎϤò»ý¤Ã¤Æ¤¤¤ë¡£";
2235 #else
2236                 info[i++] = "You sense non-living creatures.";
2237 #endif
2238
2239         }
2240         if (p_ptr->esp_unique)
2241         {
2242 #ifdef JP
2243 info[i++] = "¤¢¤Ê¤¿¤ÏÆÃÊ̤ʶ¯Å¨¤Î¸ºß¤ò´¶¤¸¤ëǽÎϤò»ý¤Ã¤Æ¤¤¤ë¡£";
2244 #else
2245                 info[i++] = "You sense unique monsters.";
2246 #endif
2247
2248         }
2249         if (p_ptr->hold_life)
2250         {
2251 #ifdef JP
2252 info[i++] = "¤¢¤Ê¤¿¤Ï¼«¸Ê¤ÎÀ¸Ì¿ÎϤò¤·¤Ã¤«¤ê¤È°Ý»ý¤¹¤ë¡£";
2253 #else
2254                 info[i++] = "You have a firm hold on your life force.";
2255 #endif
2256
2257         }
2258         if (p_ptr->reflect)
2259         {
2260 #ifdef JP
2261 info[i++] = "¤¢¤Ê¤¿¤ÏÌð¤ä¥Ü¥ë¥È¤òÈ¿¼Í¤¹¤ë¡£";
2262 #else
2263                 info[i++] = "You reflect arrows and bolts.";
2264 #endif
2265
2266         }
2267         if (p_ptr->sh_fire)
2268         {
2269 #ifdef JP
2270 info[i++] = "¤¢¤Ê¤¿¤Ï±ê¤Î¥ª¡¼¥é¤ËÊñ¤Þ¤ì¤Æ¤¤¤ë¡£";
2271 #else
2272                 info[i++] = "You are surrounded with a fiery aura.";
2273 #endif
2274
2275         }
2276         if (p_ptr->sh_elec)
2277         {
2278 #ifdef JP
2279 info[i++] = "¤¢¤Ê¤¿¤ÏÅŵ¤¤ËÊñ¤Þ¤ì¤Æ¤¤¤ë¡£";
2280 #else
2281                 info[i++] = "You are surrounded with electricity.";
2282 #endif
2283
2284         }
2285         if (p_ptr->sh_cold)
2286         {
2287 #ifdef JP
2288 info[i++] = "¤¢¤Ê¤¿¤ÏÎ䵤¤Î¥ª¡¼¥é¤ËÊñ¤Þ¤ì¤Æ¤¤¤ë¡£";
2289 #else
2290                 info[i++] = "You are surrounded with an aura of coldness.";
2291 #endif
2292
2293         }
2294         if (p_ptr->tim_sh_holy)
2295         {
2296 #ifdef JP
2297 info[i++] = "¤¢¤Ê¤¿¤ÏÀ»¤Ê¤ë¥ª¡¼¥é¤ËÊñ¤Þ¤ì¤Æ¤¤¤ë¡£";
2298 #else
2299                 info[i++] = "You are surrounded with a holy aura.";
2300 #endif
2301
2302         }
2303         if (p_ptr->tim_sh_touki)
2304         {
2305 #ifdef JP
2306 info[i++] = "¤¢¤Ê¤¿¤ÏÆ®µ¤¤Î¥ª¡¼¥é¤ËÊñ¤Þ¤ì¤Æ¤¤¤ë¡£";
2307 #else
2308                 info[i++] = "You are surrounded with a energy aura.";
2309 #endif
2310
2311         }
2312         if (p_ptr->anti_magic)
2313         {
2314 #ifdef JP
2315 info[i++] = "¤¢¤Ê¤¿¤ÏÈ¿ËâË¡¥·¡¼¥ë¥É¤ËÊñ¤Þ¤ì¤Æ¤¤¤ë¡£";
2316 #else
2317                 info[i++] = "You are surrounded by an anti-magic shell.";
2318 #endif
2319
2320         }
2321         if (p_ptr->anti_tele)
2322         {
2323 #ifdef JP
2324 info[i++] = "¤¢¤Ê¤¿¤Ï¥Æ¥ì¥Ý¡¼¥È¤Ç¤­¤Ê¤¤¡£";
2325 #else
2326                 info[i++] = "You cannot teleport.";
2327 #endif
2328
2329         }
2330         if (p_ptr->lite)
2331         {
2332 #ifdef JP
2333 info[i++] = "¤¢¤Ê¤¿¤Î¿ÈÂΤϸ÷¤Ã¤Æ¤¤¤ë¡£";
2334 #else
2335                 info[i++] = "You are carrying a permanent light.";
2336 #endif
2337
2338         }
2339         if (p_ptr->warning)
2340         {
2341 #ifdef JP
2342 info[i++] = "¤¢¤Ê¤¿¤Ï¹ÔÆ°¤ÎÁ°¤Ë´í¸±¤ò»¡ÃΤ¹¤ë¤³¤È¤¬¤Ç¤­¤ë¡£";
2343 #else
2344                 info[i++] = "You will be warned before dangerous actions.";
2345 #endif
2346
2347         }
2348         if (p_ptr->dec_mana)
2349         {
2350 #ifdef JP
2351 info[i++] = "¤¢¤Ê¤¿¤Ï¾¯¤Ê¤¤¾ÃÈñËâÎϤÇËâË¡¤ò¾§¤¨¤ë¤³¤È¤¬¤Ç¤­¤ë¡£";
2352 #else
2353                 info[i++] = "You can cast spells with fewer mana points.";
2354 #endif
2355
2356         }
2357         if (p_ptr->easy_spell)
2358         {
2359 #ifdef JP
2360 info[i++] = "¤¢¤Ê¤¿¤ÏÄ㤤¼ºÇÔΨ¤ÇËâË¡¤ò¾§¤¨¤ë¤³¤È¤¬¤Ç¤­¤ë¡£";
2361 #else
2362                 info[i++] = "Fail rate of your magic is decreased.";
2363 #endif
2364
2365         }
2366         if (p_ptr->heavy_spell)
2367         {
2368 #ifdef JP
2369 info[i++] = "¤¢¤Ê¤¿¤Ï¹â¤¤¼ºÇÔΨ¤ÇËâË¡¤ò¾§¤¨¤Ê¤±¤ì¤Ð¤¤¤±¤Ê¤¤¡£";
2370 #else
2371                 info[i++] = "Fail rate of your magic is increased.";
2372 #endif
2373
2374         }
2375         if (p_ptr->mighty_throw)
2376         {
2377 #ifdef JP
2378 info[i++] = "¤¢¤Ê¤¿¤Ï¶¯¤¯Êª¤òÅꤲ¤ë¡£";
2379 #else
2380                 info[i++] = "You can throw objects powerfully.";
2381 #endif
2382
2383         }
2384
2385         if (p_ptr->immune_acid)
2386         {
2387 #ifdef JP
2388 info[i++] = "¤¢¤Ê¤¿¤Ï»À¤ËÂФ¹¤ë´°Á´¤Ê¤ëÌȱ֤ò»ý¤Ã¤Æ¤¤¤ë¡£";
2389 #else
2390                 info[i++] = "You are completely immune to acid.";
2391 #endif
2392
2393         }
2394         else if (p_ptr->resist_acid && IS_OPPOSE_ACID())
2395         {
2396 #ifdef JP
2397 info[i++] = "¤¢¤Ê¤¿¤Ï»À¤Ø¤Î¶¯ÎϤÊÂÑÀ­¤ò»ý¤Ã¤Æ¤¤¤ë¡£";
2398 #else
2399                 info[i++] = "You resist acid exceptionally well.";
2400 #endif
2401
2402         }
2403         else if (p_ptr->resist_acid || IS_OPPOSE_ACID())
2404         {
2405 #ifdef JP
2406 info[i++] = "¤¢¤Ê¤¿¤Ï»À¤Ø¤ÎÂÑÀ­¤ò»ý¤Ã¤Æ¤¤¤ë¡£";
2407 #else
2408                 info[i++] = "You are resistant to acid.";
2409 #endif
2410
2411         }
2412
2413         if (p_ptr->immune_elec)
2414         {
2415 #ifdef JP
2416 info[i++] = "¤¢¤Ê¤¿¤ÏÅÅ·â¤ËÂФ¹¤ë´°Á´¤Ê¤ëÌȱ֤ò»ý¤Ã¤Æ¤¤¤ë¡£";
2417 #else
2418                 info[i++] = "You are completely immune to lightning.";
2419 #endif
2420
2421         }
2422         else if (p_ptr->resist_elec && IS_OPPOSE_ELEC())
2423         {
2424 #ifdef JP
2425 info[i++] = "¤¢¤Ê¤¿¤ÏÅÅ·â¤Ø¤Î¶¯ÎϤÊÂÑÀ­¤ò»ý¤Ã¤Æ¤¤¤ë¡£";
2426 #else
2427                 info[i++] = "You resist lightning exceptionally well.";
2428 #endif
2429
2430         }
2431         else if (p_ptr->resist_elec || IS_OPPOSE_ELEC())
2432         {
2433 #ifdef JP
2434 info[i++] = "¤¢¤Ê¤¿¤ÏÅÅ·â¤Ø¤ÎÂÑÀ­¤ò»ý¤Ã¤Æ¤¤¤ë¡£";
2435 #else
2436                 info[i++] = "You are resistant to lightning.";
2437 #endif
2438
2439         }
2440
2441         if (prace_is_(RACE_ANDROID) && !p_ptr->immune_elec)
2442         {
2443 #ifdef JP
2444 info[i++] = "¤¢¤Ê¤¿¤ÏÅÅ·â¤Ë¼å¤¤¡£";
2445 #else
2446                 info[i++] = "You are susceptible to damage from lightning.";
2447 #endif
2448
2449         }
2450
2451         if (p_ptr->immune_fire)
2452         {
2453 #ifdef JP
2454 info[i++] = "¤¢¤Ê¤¿¤Ï²Ð¤ËÂФ¹¤ë´°Á´¤Ê¤ëÌȱ֤ò»ý¤Ã¤Æ¤¤¤ë¡£";
2455 #else
2456                 info[i++] = "You are completely immune to fire.";
2457 #endif
2458
2459         }
2460         else if (p_ptr->resist_fire && IS_OPPOSE_FIRE())
2461         {
2462 #ifdef JP
2463 info[i++] = "¤¢¤Ê¤¿¤Ï²Ð¤Ø¤Î¶¯ÎϤÊÂÑÀ­¤ò»ý¤Ã¤Æ¤¤¤ë¡£";
2464 #else
2465                 info[i++] = "You resist fire exceptionally well.";
2466 #endif
2467
2468         }
2469         else if (p_ptr->resist_fire || IS_OPPOSE_FIRE())
2470         {
2471 #ifdef JP
2472 info[i++] = "¤¢¤Ê¤¿¤Ï²Ð¤Ø¤ÎÂÑÀ­¤ò»ý¤Ã¤Æ¤¤¤ë¡£";
2473 #else
2474                 info[i++] = "You are resistant to fire.";
2475 #endif
2476
2477         }
2478
2479         if (prace_is_(RACE_ENT) && !p_ptr->immune_fire)
2480         {
2481 #ifdef JP
2482 info[i++] = "¤¢¤Ê¤¿¤Ï²Ð¤Ë¼å¤¤¡£";
2483 #else
2484                 info[i++] = "You are susceptible to damage from fire.";
2485 #endif
2486
2487         }
2488
2489         if (p_ptr->immune_cold)
2490         {
2491 #ifdef JP
2492 info[i++] = "¤¢¤Ê¤¿¤ÏÎ䵤¤ËÂФ¹¤ë´°Á´¤Ê¤ëÌȱ֤ò»ý¤Ã¤Æ¤¤¤ë¡£";
2493 #else
2494                 info[i++] = "You are completely immune to cold.";
2495 #endif
2496
2497         }
2498         else if (p_ptr->resist_cold && IS_OPPOSE_COLD())
2499         {
2500 #ifdef JP
2501 info[i++] = "¤¢¤Ê¤¿¤ÏÎ䵤¤Ø¤Î¶¯ÎϤÊÂÑÀ­¤ò»ý¤Ã¤Æ¤¤¤ë¡£";
2502 #else
2503                 info[i++] = "You resist cold exceptionally well.";
2504 #endif
2505
2506         }
2507         else if (p_ptr->resist_cold || IS_OPPOSE_COLD())
2508         {
2509 #ifdef JP
2510 info[i++] = "¤¢¤Ê¤¿¤ÏÎ䵤¤Ø¤ÎÂÑÀ­¤ò»ý¤Ã¤Æ¤¤¤ë¡£";
2511 #else
2512                 info[i++] = "You are resistant to cold.";
2513 #endif
2514
2515         }
2516
2517         if (p_ptr->resist_pois && IS_OPPOSE_POIS())
2518         {
2519 #ifdef JP
2520 info[i++] = "¤¢¤Ê¤¿¤ÏÆǤؤζ¯ÎϤÊÂÑÀ­¤ò»ý¤Ã¤Æ¤¤¤ë¡£";
2521 #else
2522                 info[i++] = "You resist poison exceptionally well.";
2523 #endif
2524
2525         }
2526         else if (p_ptr->resist_pois || IS_OPPOSE_POIS())
2527         {
2528 #ifdef JP
2529 info[i++] = "¤¢¤Ê¤¿¤ÏÆǤؤÎÂÑÀ­¤ò»ý¤Ã¤Æ¤¤¤ë¡£";
2530 #else
2531                 info[i++] = "You are resistant to poison.";
2532 #endif
2533
2534         }
2535
2536         if (p_ptr->resist_lite)
2537         {
2538 #ifdef JP
2539 info[i++] = "¤¢¤Ê¤¿¤ÏÁ®¸÷¤Ø¤ÎÂÑÀ­¤ò»ý¤Ã¤Æ¤¤¤ë¡£";
2540 #else
2541                 info[i++] = "You are resistant to bright light.";
2542 #endif
2543
2544         }
2545
2546         if (prace_is_(RACE_VAMPIRE) || prace_is_(RACE_S_FAIRY) || (p_ptr->mimic_form == MIMIC_VAMPIRE))
2547         {
2548 #ifdef JP
2549 info[i++] = "¤¢¤Ê¤¿¤ÏÁ®¸÷¤Ë¼å¤¤¡£";
2550 #else
2551                 info[i++] = "You are susceptible to damage from bright light.";
2552 #endif
2553
2554         }
2555
2556         if (prace_is_(RACE_VAMPIRE) || (p_ptr->mimic_form == MIMIC_VAMPIRE) || p_ptr->wraith_form)
2557         {
2558 #ifdef JP
2559 info[i++] = "¤¢¤Ê¤¿¤Ï°Å¹õ¤ËÂФ¹¤ë´°Á´¤Ê¤ëÌȱ֤ò»ý¤Ã¤Æ¤¤¤ë¡£";
2560 #else
2561                 info[i++] = "You are completely immune to darkness.";
2562 #endif
2563         }
2564
2565         else if (p_ptr->resist_dark)
2566         {
2567 #ifdef JP
2568 info[i++] = "¤¢¤Ê¤¿¤Ï°Å¹õ¤Ø¤ÎÂÑÀ­¤ò»ý¤Ã¤Æ¤¤¤ë¡£";
2569 #else
2570                 info[i++] = "You are resistant to darkness.";
2571 #endif
2572
2573         }
2574         if (p_ptr->resist_conf)
2575         {
2576 #ifdef JP
2577 info[i++] = "¤¢¤Ê¤¿¤Ïº®Íð¤Ø¤ÎÂÑÀ­¤ò»ý¤Ã¤Æ¤¤¤ë¡£";
2578 #else
2579                 info[i++] = "You are resistant to confusion.";
2580 #endif
2581
2582         }
2583         if (p_ptr->resist_sound)
2584         {
2585 #ifdef JP
2586 info[i++] = "¤¢¤Ê¤¿¤Ï²»ÇȤξ׷â¤Ø¤ÎÂÑÀ­¤ò»ý¤Ã¤Æ¤¤¤ë¡£";
2587 #else
2588                 info[i++] = "You are resistant to sonic attacks.";
2589 #endif
2590
2591         }
2592         if (p_ptr->resist_disen)
2593         {
2594 #ifdef JP
2595 info[i++] = "¤¢¤Ê¤¿¤ÏÎô²½¤Ø¤ÎÂÑÀ­¤ò»ý¤Ã¤Æ¤¤¤ë¡£";
2596 #else
2597                 info[i++] = "You are resistant to disenchantment.";
2598 #endif
2599
2600         }
2601         if (p_ptr->resist_chaos)
2602         {
2603 #ifdef JP
2604 info[i++] = "¤¢¤Ê¤¿¤Ï¥«¥ª¥¹¤ÎÎϤؤÎÂÑÀ­¤ò»ý¤Ã¤Æ¤¤¤ë¡£";
2605 #else
2606                 info[i++] = "You are resistant to chaos.";
2607 #endif
2608
2609         }
2610         if (p_ptr->resist_shard)
2611         {
2612 #ifdef JP
2613 info[i++] = "¤¢¤Ê¤¿¤ÏÇËÊҤι¶·â¤Ø¤ÎÂÑÀ­¤ò»ý¤Ã¤Æ¤¤¤ë¡£";
2614 #else
2615                 info[i++] = "You are resistant to blasts of shards.";
2616 #endif
2617
2618         }
2619         if (p_ptr->resist_nexus)
2620         {
2621 #ifdef JP
2622 info[i++] = "¤¢¤Ê¤¿¤Ï°ø²Ìº®Íð¤Î¹¶·â¤Ø¤ÎÂÑÀ­¤ò»ý¤Ã¤Æ¤¤¤ë¡£";
2623 #else
2624                 info[i++] = "You are resistant to nexus attacks.";
2625 #endif
2626
2627         }
2628
2629         if (prace_is_(RACE_SPECTRE))
2630         {
2631 #ifdef JP
2632 info[i++] = "¤¢¤Ê¤¿¤ÏÃϹö¤ÎÎϤòµÛ¼ý¤Ç¤­¤ë¡£";
2633 #else
2634                 info[i++] = "You can drain nether forces.";
2635 #endif
2636
2637         }
2638         else if (p_ptr->resist_neth)
2639         {
2640 #ifdef JP
2641 info[i++] = "¤¢¤Ê¤¿¤ÏÃϹö¤ÎÎϤؤÎÂÑÀ­¤ò»ý¤Ã¤Æ¤¤¤ë¡£";
2642 #else
2643                 info[i++] = "You are resistant to nether forces.";
2644 #endif
2645
2646         }
2647         if (p_ptr->resist_fear)
2648         {
2649 #ifdef JP
2650 info[i++] = "¤¢¤Ê¤¿¤ÏÁ´¤¯¶²Éݤò´¶¤¸¤Ê¤¤¡£";
2651 #else
2652                 info[i++] = "You are completely fearless.";
2653 #endif
2654
2655         }
2656         if (p_ptr->resist_blind)
2657         {
2658 #ifdef JP
2659 info[i++] = "¤¢¤Ê¤¿¤ÎÌܤÏÌÕÌܤؤÎÂÑÀ­¤ò»ý¤Ã¤Æ¤¤¤ë¡£";
2660 #else
2661                 info[i++] = "Your eyes are resistant to blindness.";
2662 #endif
2663
2664         }
2665         if (p_ptr->resist_time)
2666         {
2667 #ifdef JP
2668 info[i++] = "¤¢¤Ê¤¿¤Ï»þ´ÖµÕž¤Ø¤ÎÂÑÀ­¤ò»ý¤Ã¤Æ¤¤¤ë¡£";
2669 #else
2670                 info[i++] = "You are resistant to time.";
2671 #endif
2672
2673         }
2674
2675         if (p_ptr->sustain_str)
2676         {
2677 #ifdef JP
2678 info[i++] = "¤¢¤Ê¤¿¤ÎÏÓÎϤϰݻý¤µ¤ì¤Æ¤¤¤ë¡£";
2679 #else
2680                 info[i++] = "Your strength is sustained.";
2681 #endif
2682
2683         }
2684         if (p_ptr->sustain_int)
2685         {
2686 #ifdef JP
2687 info[i++] = "¤¢¤Ê¤¿¤ÎÃÎǽ¤Ï°Ý»ý¤µ¤ì¤Æ¤¤¤ë¡£";
2688 #else
2689                 info[i++] = "Your intelligence is sustained.";
2690 #endif
2691
2692         }
2693         if (p_ptr->sustain_wis)
2694         {
2695 #ifdef JP
2696 info[i++] = "¤¢¤Ê¤¿¤Î¸­¤µ¤Ï°Ý»ý¤µ¤ì¤Æ¤¤¤ë¡£";
2697 #else
2698                 info[i++] = "Your wisdom is sustained.";
2699 #endif
2700
2701         }
2702         if (p_ptr->sustain_con)
2703         {
2704 #ifdef JP
2705 info[i++] = "¤¢¤Ê¤¿¤ÎÂѵ×ÎϤϰݻý¤µ¤ì¤Æ¤¤¤ë¡£";
2706 #else
2707                 info[i++] = "Your constitution is sustained.";
2708 #endif
2709
2710         }
2711         if (p_ptr->sustain_dex)
2712         {
2713 #ifdef JP
2714 info[i++] = "¤¢¤Ê¤¿¤Î´ïÍѤµ¤Ï°Ý»ý¤µ¤ì¤Æ¤¤¤ë¡£";
2715 #else
2716                 info[i++] = "Your dexterity is sustained.";
2717 #endif
2718
2719         }
2720         if (p_ptr->sustain_chr)
2721         {
2722 #ifdef JP
2723 info[i++] = "¤¢¤Ê¤¿¤ÎÌ¥ÎϤϰݻý¤µ¤ì¤Æ¤¤¤ë¡£";
2724 #else
2725                 info[i++] = "Your charisma is sustained.";
2726 #endif
2727
2728         }
2729
2730         if (have_flag(flgs, TR_STR))
2731         {
2732 #ifdef JP
2733 info[i++] = "¤¢¤Ê¤¿¤ÎÏÓÎϤÏÁõÈ÷¤Ë¤è¤Ã¤Æ±Æ¶Á¤ò¼õ¤±¤Æ¤¤¤ë¡£";
2734 #else
2735                 info[i++] = "Your strength is affected by your equipment.";
2736 #endif
2737
2738         }
2739         if (have_flag(flgs, TR_INT))
2740         {
2741 #ifdef JP
2742 info[i++] = "¤¢¤Ê¤¿¤ÎÃÎǽ¤ÏÁõÈ÷¤Ë¤è¤Ã¤Æ±Æ¶Á¤ò¼õ¤±¤Æ¤¤¤ë¡£";
2743 #else
2744                 info[i++] = "Your intelligence is affected by your equipment.";
2745 #endif
2746
2747         }
2748         if (have_flag(flgs, TR_WIS))
2749         {
2750 #ifdef JP
2751 info[i++] = "¤¢¤Ê¤¿¤Î¸­¤µ¤ÏÁõÈ÷¤Ë¤è¤Ã¤Æ±Æ¶Á¤ò¼õ¤±¤Æ¤¤¤ë¡£";
2752 #else
2753                 info[i++] = "Your wisdom is affected by your equipment.";
2754 #endif
2755
2756         }
2757         if (have_flag(flgs, TR_DEX))
2758         {
2759 #ifdef JP
2760 info[i++] = "¤¢¤Ê¤¿¤Î´ïÍѤµ¤ÏÁõÈ÷¤Ë¤è¤Ã¤Æ±Æ¶Á¤ò¼õ¤±¤Æ¤¤¤ë¡£";
2761 #else
2762                 info[i++] = "Your dexterity is affected by your equipment.";
2763 #endif
2764
2765         }
2766         if (have_flag(flgs, TR_CON))
2767         {
2768 #ifdef JP
2769 info[i++] = "¤¢¤Ê¤¿¤ÎÂѵ×ÎϤÏÁõÈ÷¤Ë¤è¤Ã¤Æ±Æ¶Á¤ò¼õ¤±¤Æ¤¤¤ë¡£";
2770 #else
2771                 info[i++] = "Your constitution is affected by your equipment.";
2772 #endif
2773
2774         }
2775         if (have_flag(flgs, TR_CHR))
2776         {
2777 #ifdef JP
2778 info[i++] = "¤¢¤Ê¤¿¤ÎÌ¥ÎϤÏÁõÈ÷¤Ë¤è¤Ã¤Æ±Æ¶Á¤ò¼õ¤±¤Æ¤¤¤ë¡£";
2779 #else
2780                 info[i++] = "Your charisma is affected by your equipment.";
2781 #endif
2782
2783         }
2784
2785         if (have_flag(flgs, TR_STEALTH))
2786         {
2787 #ifdef JP
2788 info[i++] = "¤¢¤Ê¤¿¤Î±£Ì©¹ÔưǽÎϤÏÁõÈ÷¤Ë¤è¤Ã¤Æ±Æ¶Á¤ò¼õ¤±¤Æ¤¤¤ë¡£";
2789 #else
2790                 info[i++] = "Your stealth is affected by your equipment.";
2791 #endif
2792
2793         }
2794         if (have_flag(flgs, TR_SEARCH))
2795         {
2796 #ifdef JP
2797 info[i++] = "¤¢¤Ê¤¿¤Îõº÷ǽÎϤÏÁõÈ÷¤Ë¤è¤Ã¤Æ±Æ¶Á¤ò¼õ¤±¤Æ¤¤¤ë¡£";
2798 #else
2799                 info[i++] = "Your searching ability is affected by your equipment.";
2800 #endif
2801
2802         }
2803         if (have_flag(flgs, TR_INFRA))
2804         {
2805 #ifdef JP
2806 info[i++] = "¤¢¤Ê¤¿¤ÎÀÖ³°Àþ»ëÎϤÏÁõÈ÷¤Ë¤è¤Ã¤Æ±Æ¶Á¤ò¼õ¤±¤Æ¤¤¤ë¡£";
2807 #else
2808                 info[i++] = "Your infravision is affected by your equipment.";
2809 #endif
2810
2811         }
2812         if (have_flag(flgs, TR_TUNNEL))
2813         {
2814 #ifdef JP
2815 info[i++] = "¤¢¤Ê¤¿¤ÎºÎ·¡Ç½ÎϤÏÁõÈ÷¤Ë¤è¤Ã¤Æ±Æ¶Á¤ò¼õ¤±¤Æ¤¤¤ë¡£";
2816 #else
2817                 info[i++] = "Your digging ability is affected by your equipment.";
2818 #endif
2819
2820         }
2821         if (have_flag(flgs, TR_SPEED))
2822         {
2823 #ifdef JP
2824 info[i++] = "¤¢¤Ê¤¿¤Î¥¹¥Ô¡¼¥É¤ÏÁõÈ÷¤Ë¤è¤Ã¤Æ±Æ¶Á¤ò¼õ¤±¤Æ¤¤¤ë¡£";
2825 #else
2826                 info[i++] = "Your speed is affected by your equipment.";
2827 #endif
2828
2829         }
2830         if (have_flag(flgs, TR_BLOWS))
2831         {
2832 #ifdef JP
2833 info[i++] = "¤¢¤Ê¤¿¤Î¹¶·â®ÅÙ¤ÏÁõÈ÷¤Ë¤è¤Ã¤Æ±Æ¶Á¤ò¼õ¤±¤Æ¤¤¤ë¡£";
2834 #else
2835                 info[i++] = "Your attack speed is affected by your equipment.";
2836 #endif
2837
2838         }
2839
2840
2841         /* Access the current weapon */
2842         o_ptr = &inventory[INVEN_RARM];
2843
2844         /* Analyze the weapon */
2845         if (o_ptr->k_idx)
2846         {
2847                 /* Indicate Blessing */
2848                 if (have_flag(flgs, TR_BLESSED))
2849                 {
2850 #ifdef JP
2851 info[i++] = "¤¢¤Ê¤¿¤ÎÉð´ï¤Ï¿À¤Î½ËÊ¡¤ò¼õ¤±¤Æ¤¤¤ë¡£";
2852 #else
2853                         info[i++] = "Your weapon has been blessed by the gods.";
2854 #endif
2855
2856                 }
2857
2858                 if (have_flag(flgs, TR_CHAOTIC))
2859                 {
2860 #ifdef JP
2861 info[i++] = "¤¢¤Ê¤¿¤ÎÉð´ï¤Ï¥í¥°¥ë¥¹¤Îħ¤Î°À­¤ò¤â¤Ä¡£";
2862 #else
2863                         info[i++] = "Your weapon is branded with the Sign of Logrus.";
2864 #endif
2865
2866                 }
2867
2868                 /* Hack */
2869                 if (have_flag(flgs, TR_IMPACT))
2870                 {
2871 #ifdef JP
2872 info[i++] = "¤¢¤Ê¤¿¤ÎÉð´ï¤ÏÂÇ·â¤ÇÃϿ̤òȯÀ¸¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¡£";
2873 #else
2874                         info[i++] = "The impact of your weapon can cause earthquakes.";
2875 #endif
2876
2877                 }
2878
2879                 if (have_flag(flgs, TR_VORPAL))
2880                 {
2881 #ifdef JP
2882 info[i++] = "¤¢¤Ê¤¿¤ÎÉð´ï¤ÏÈó¾ï¤Ë±Ô¤¤¡£";
2883 #else
2884                         info[i++] = "Your weapon is very sharp.";
2885 #endif
2886
2887                 }
2888
2889                 if (have_flag(flgs, TR_VAMPIRIC))
2890                 {
2891 #ifdef JP
2892 info[i++] = "¤¢¤Ê¤¿¤ÎÉð´ï¤ÏŨ¤«¤éÀ¸Ì¿ÎϤòµÛ¼ý¤¹¤ë¡£";
2893 #else
2894                         info[i++] = "Your weapon drains life from your foes.";
2895 #endif
2896
2897                 }
2898
2899                 /* Special "Attack Bonuses" */
2900                 if (have_flag(flgs, TR_BRAND_ACID))
2901                 {
2902 #ifdef JP
2903 info[i++] = "¤¢¤Ê¤¿¤ÎÉð´ï¤ÏŨ¤òÍϤ«¤¹¡£";
2904 #else
2905                         info[i++] = "Your weapon melts your foes.";
2906 #endif
2907
2908                 }
2909                 if (have_flag(flgs, TR_BRAND_ELEC))
2910                 {
2911 #ifdef JP
2912 info[i++] = "¤¢¤Ê¤¿¤ÎÉð´ï¤ÏŨ¤ò´¶ÅŤµ¤»¤ë¡£";
2913 #else
2914                         info[i++] = "Your weapon shocks your foes.";
2915 #endif
2916
2917                 }
2918                 if (have_flag(flgs, TR_BRAND_FIRE))
2919                 {
2920 #ifdef JP
2921 info[i++] = "¤¢¤Ê¤¿¤ÎÉð´ï¤ÏŨ¤òdz¤ä¤¹¡£";
2922 #else
2923                         info[i++] = "Your weapon burns your foes.";
2924 #endif
2925
2926                 }
2927                 if (have_flag(flgs, TR_BRAND_COLD))
2928                 {
2929 #ifdef JP
2930 info[i++] = "¤¢¤Ê¤¿¤ÎÉð´ï¤ÏŨ¤òÅà¤é¤»¤ë¡£";
2931 #else
2932                         info[i++] = "Your weapon freezes your foes.";
2933 #endif
2934
2935                 }
2936                 if (have_flag(flgs, TR_BRAND_POIS))
2937                 {
2938 #ifdef JP
2939 info[i++] = "¤¢¤Ê¤¿¤ÎÉð´ï¤ÏŨ¤òÆǤǿ¯¤¹¡£";
2940 #else
2941                         info[i++] = "Your weapon poisons your foes.";
2942 #endif
2943
2944                 }
2945
2946                 /* Special "slay" flags */
2947                 if (have_flag(flgs, TR_KILL_ANIMAL))
2948                 {
2949 #ifdef JP
2950 info[i++] = "¤¢¤Ê¤¿¤ÎÉð´ï¤Ïưʪ¤ÎŷŨ¤Ç¤¢¤ë¡£";
2951 #else
2952                         info[i++] = "Your weapon is a great bane of animals.";
2953 #endif
2954
2955                 }
2956                 else if (have_flag(flgs, TR_SLAY_ANIMAL))
2957                 {
2958 #ifdef JP
2959 info[i++] = "¤¢¤Ê¤¿¤ÎÉð´ï¤Ïưʪ¤ËÂФ·¤Æ¶¯¤¤ÎϤòȯ´ø¤¹¤ë¡£";
2960 #else
2961                         info[i++] = "Your weapon strikes at animals with extra force.";
2962 #endif
2963
2964                 }
2965                 if (have_flag(flgs, TR_KILL_EVIL))
2966                 {
2967 #ifdef JP
2968 info[i++] = "¤¢¤Ê¤¿¤ÎÉð´ï¤Ï¼Ù°­¤Ê¤ë¸ºß¤ÎŷŨ¤Ç¤¢¤ë¡£";
2969 #else
2970                         info[i++] = "Your weapon is a great bane of evil.";
2971 #endif
2972
2973                 }
2974                 else if (have_flag(flgs, TR_SLAY_EVIL))
2975                 {
2976 #ifdef JP
2977 info[i++] = "¤¢¤Ê¤¿¤ÎÉð´ï¤Ï¼Ù°­¤Ê¤ë¸ºß¤ËÂФ·¤Æ¶¯¤¤ÎϤòȯ´ø¤¹¤ë¡£";
2978 #else
2979                         info[i++] = "Your weapon strikes at evil with extra force.";
2980 #endif
2981
2982                 }
2983                 if (have_flag(flgs, TR_KILL_HUMAN))
2984                 {
2985 #ifdef JP
2986 info[i++] = "¤¢¤Ê¤¿¤ÎÉð´ï¤Ï¿Í´Ö¤ÎŷŨ¤Ç¤¢¤ë¡£";
2987 #else
2988                         info[i++] = "Your weapon is a great bane of humans.";
2989 #endif
2990
2991                 }
2992                 else if (have_flag(flgs, TR_SLAY_HUMAN))
2993                 {
2994 #ifdef JP
2995 info[i++] = "¤¢¤Ê¤¿¤ÎÉð´ï¤Ï¿Í´Ö¤ËÂФ·¤ÆÆä˶¯¤¤ÎϤòȯ´ø¤¹¤ë¡£";
2996 #else
2997                         info[i++] = "Your weapon is especially deadly against humans.";
2998 #endif
2999
3000                 }
3001                 if (have_flag(flgs, TR_KILL_UNDEAD))
3002                 {
3003 #ifdef JP
3004 info[i++] = "¤¢¤Ê¤¿¤ÎÉð´ï¤Ï¥¢¥ó¥Ç¥Ã¥É¤ÎŷŨ¤Ç¤¢¤ë¡£";
3005 #else
3006                         info[i++] = "Your weapon is a great bane of undead.";
3007 #endif
3008
3009                 }
3010                 else if (have_flag(flgs, TR_SLAY_UNDEAD))
3011                 {
3012 #ifdef JP
3013 info[i++] = "¤¢¤Ê¤¿¤ÎÉð´ï¤Ï¥¢¥ó¥Ç¥Ã¥É¤ËÂФ·¤Æ¿ÀÀ»¤Ê¤ëÎϤòȯ´ø¤¹¤ë¡£";
3014 #else
3015                         info[i++] = "Your weapon strikes at undead with holy wrath.";
3016 #endif
3017
3018                 }
3019                 if (have_flag(flgs, TR_KILL_DEMON))
3020                 {
3021 #ifdef JP
3022 info[i++] = "¤¢¤Ê¤¿¤ÎÉð´ï¤Ï¥Ç¡¼¥â¥ó¤ÎŷŨ¤Ç¤¢¤ë¡£";
3023 #else
3024                         info[i++] = "Your weapon is a great bane of demons.";
3025 #endif
3026
3027                 }
3028                 else if (have_flag(flgs, TR_SLAY_DEMON))
3029                 {
3030 #ifdef JP
3031 info[i++] = "¤¢¤Ê¤¿¤ÎÉð´ï¤Ï¥Ç¡¼¥â¥ó¤ËÂФ·¤Æ¿ÀÀ»¤Ê¤ëÎϤòȯ´ø¤¹¤ë¡£";
3032 #else
3033                         info[i++] = "Your weapon strikes at demons with holy wrath.";
3034 #endif
3035
3036                 }
3037                 if (have_flag(flgs, TR_KILL_ORC))
3038                 {
3039 #ifdef JP
3040 info[i++] = "¤¢¤Ê¤¿¤ÎÉð´ï¤Ï¥ª¡¼¥¯¤ÎŷŨ¤Ç¤¢¤ë¡£";
3041 #else
3042                         info[i++] = "Your weapon is a great bane of orcs.";
3043 #endif
3044
3045                 }
3046                 else if (have_flag(flgs, TR_SLAY_ORC))
3047                 {
3048 #ifdef JP
3049 info[i++] = "¤¢¤Ê¤¿¤ÎÉð´ï¤Ï¥ª¡¼¥¯¤ËÂФ·¤ÆÆä˶¯¤¤ÎϤòȯ´ø¤¹¤ë¡£";
3050 #else
3051                         info[i++] = "Your weapon is especially deadly against orcs.";
3052 #endif
3053
3054                 }
3055                 if (have_flag(flgs, TR_KILL_TROLL))
3056                 {
3057 #ifdef JP
3058 info[i++] = "¤¢¤Ê¤¿¤ÎÉð´ï¤Ï¥È¥í¥ë¤ÎŷŨ¤Ç¤¢¤ë¡£";
3059 #else
3060                         info[i++] = "Your weapon is a great bane of trolls.";
3061 #endif
3062
3063                 }
3064                 else if (have_flag(flgs, TR_SLAY_TROLL))
3065                 {
3066 #ifdef JP
3067 info[i++] = "¤¢¤Ê¤¿¤ÎÉð´ï¤Ï¥È¥í¥ë¤ËÂФ·¤ÆÆä˶¯¤¤ÎϤòȯ´ø¤¹¤ë¡£";
3068 #else
3069                         info[i++] = "Your weapon is especially deadly against trolls.";
3070 #endif
3071
3072                 }
3073                 if (have_flag(flgs, TR_KILL_GIANT))
3074                 {
3075 #ifdef JP
3076 info[i++] = "¤¢¤Ê¤¿¤ÎÉð´ï¤Ï¥¸¥ã¥¤¥¢¥ó¥È¤ÎŷŨ¤Ç¤¢¤ë¡£";
3077 #else
3078                         info[i++] = "Your weapon is a great bane of giants.";
3079 #endif
3080
3081                 }
3082                 else if (have_flag(flgs, TR_SLAY_GIANT))
3083                 {
3084 #ifdef JP
3085 info[i++] = "¤¢¤Ê¤¿¤ÎÉð´ï¤Ï¥¸¥ã¥¤¥¢¥ó¥È¤ËÂФ·¤ÆÆä˶¯¤¤ÎϤòȯ´ø¤¹¤ë¡£";
3086 #else
3087                         info[i++] = "Your weapon is especially deadly against giants.";
3088 #endif
3089
3090                 }
3091                 /* Special "kill" flags */
3092                 if (have_flag(flgs, TR_KILL_DRAGON))
3093                 {
3094 #ifdef JP
3095 info[i++] = "¤¢¤Ê¤¿¤ÎÉð´ï¤Ï¥É¥é¥´¥ó¤ÎŷŨ¤Ç¤¢¤ë¡£";
3096 #else
3097                         info[i++] = "Your weapon is a great bane of dragons.";
3098 #endif
3099
3100                 }
3101                 else if (have_flag(flgs, TR_SLAY_DRAGON))
3102                 {
3103 #ifdef JP
3104 info[i++] = "¤¢¤Ê¤¿¤ÎÉð´ï¤Ï¥É¥é¥´¥ó¤ËÂФ·¤ÆÆä˶¯¤¤ÎϤòȯ´ø¤¹¤ë¡£";
3105 #else
3106                         info[i++] = "Your weapon is especially deadly against dragons.";
3107 #endif
3108
3109                 }
3110
3111                 if (have_flag(flgs, TR_FORCE_WEAPON))
3112                 {
3113 #ifdef JP
3114 info[i++] = "¤¢¤Ê¤¿¤ÎÉð´ï¤ÏMP¤ò»È¤Ã¤Æ¹¶·â¤¹¤ë¡£";
3115 #else
3116                         info[i++] = "Your weapon causes greate damages using your MP.";
3117 #endif
3118
3119                 }
3120                 if (have_flag(flgs, TR_THROW))
3121                 {
3122 #ifdef JP
3123 info[i++] = "¤¢¤Ê¤¿¤ÎÉð´ï¤ÏÅꤲ¤ä¤¹¤¤¡£";
3124 #else
3125                         info[i++] = "Your weapon can be thrown well.";
3126 #endif
3127                 }
3128         }
3129
3130
3131         /* Save the screen */
3132         screen_save();
3133
3134         /* Erase the screen */
3135         for (k = 1; k < 24; k++) prt("", k, 13);
3136
3137         /* Label the information */
3138 #ifdef JP
3139 prt("        ¤¢¤Ê¤¿¤Î¾õÂÖ:", 1, 15);
3140 #else
3141         prt("     Your Attributes:", 1, 15);
3142 #endif
3143
3144
3145         /* We will print on top of the map (column 13) */
3146         for (k = 2, j = 0; j < i; j++)
3147         {
3148                 /* Show the info */
3149                 prt(info[j], k++, 15);
3150
3151                 /* Every 20 entries (lines 2 to 21), start over */
3152                 if ((k == 22) && (j+1 < i))
3153                 {
3154 #ifdef JP
3155 prt("-- Â³¤¯ --", k, 15);
3156 #else
3157                         prt("-- more --", k, 15);
3158 #endif
3159
3160                         inkey();
3161                         for (; k > 2; k--) prt("", k, 15);
3162                 }
3163         }
3164
3165         /* Pause */
3166 #ifdef JP
3167 prt("[²¿¤«¥­¡¼¤ò²¡¤¹¤È¥²¡¼¥à¤ËÌá¤ê¤Þ¤¹]", k, 13);
3168 #else
3169         prt("[Press any key to continue]", k, 13);
3170 #endif
3171
3172         inkey();
3173
3174         /* Restore the screen */
3175         screen_load();
3176 }
3177
3178
3179 static int report_magics_aux(int dur)
3180 {
3181         if (dur <= 5)
3182         {
3183                 return 0;
3184         }
3185         else if (dur <= 10)
3186         {
3187                 return 1;
3188         }
3189         else if (dur <= 20)
3190         {
3191                 return 2;
3192         }
3193         else if (dur <= 50)
3194         {
3195                 return 3;
3196         }
3197         else if (dur <= 100)
3198         {
3199                 return 4;
3200         }
3201         else if (dur <= 200)
3202         {
3203                 return 5;
3204         }
3205         else
3206         {
3207                 return 6;
3208         }
3209 }
3210
3211 static cptr report_magic_durations[] =
3212 {
3213 #ifdef JP
3214 "¤´¤¯Ã»¤¤´Ö",
3215 "¾¯¤·¤Î´Ö",
3216 "¤·¤Ð¤é¤¯¤Î´Ö",
3217 "¿¾¯Ä¹¤¤´Ö",
3218 "Ť¤´Ö",
3219 "Èó¾ï¤ËŤ¤´Ö",
3220 "¿®¤¸Æñ¤¤¤Û¤ÉŤ¤´Ö",
3221 "¥â¥ó¥¹¥¿¡¼¤ò¹¶·â¤¹¤ë¤Þ¤Ç"
3222 #else
3223         "for a short time",
3224         "for a little while",
3225         "for a while",
3226         "for a long while",
3227         "for a long time",
3228         "for a very long time",
3229         "for an incredibly long time",
3230         "until you hit a monster"
3231 #endif
3232
3233 };
3234
3235
3236 /*
3237  * Report all currently active magical effects.
3238  */
3239 void report_magics(void)
3240 {
3241         int     i = 0, j, k;
3242         char    Dummy[80];
3243         cptr    info[128];
3244         int     info2[128];
3245
3246
3247         if (p_ptr->blind)
3248         {
3249                 info2[i]  = report_magics_aux(p_ptr->blind);
3250 #ifdef JP
3251 info[i++] = "¤¢¤Ê¤¿¤ÏÌܤ¬¸«¤¨¤Ê¤¤¡£";
3252 #else
3253                 info[i++] = "You cannot see";
3254 #endif
3255
3256         }
3257         if (p_ptr->confused)
3258         {
3259                 info2[i]  = report_magics_aux(p_ptr->confused);
3260 #ifdef JP
3261 info[i++] = "¤¢¤Ê¤¿¤Ïº®Í𤷤Ƥ¤¤ë¡£";
3262 #else
3263                 info[i++] = "You are confused";
3264 #endif
3265
3266         }
3267         if (p_ptr->afraid)
3268         {
3269                 info2[i]  = report_magics_aux(p_ptr->afraid);
3270 #ifdef JP
3271 info[i++] = "¤¢¤Ê¤¿¤Ï¶²Éݤ˿¯¤µ¤ì¤Æ¤¤¤ë¡£";
3272 #else
3273                 info[i++] = "You are terrified";
3274 #endif
3275
3276         }
3277         if (p_ptr->poisoned)
3278         {
3279                 info2[i]  = report_magics_aux(p_ptr->poisoned);
3280 #ifdef JP
3281 info[i++] = "¤¢¤Ê¤¿¤ÏÆǤ˿¯¤µ¤ì¤Æ¤¤¤ë¡£";
3282 #else
3283                 info[i++] = "You are poisoned";
3284 #endif
3285
3286         }
3287         if (p_ptr->image)
3288         {
3289                 info2[i]  = report_magics_aux(p_ptr->image);
3290 #ifdef JP
3291 info[i++] = "¤¢¤Ê¤¿¤Ï¸¸³Ð¤ò¸«¤Æ¤¤¤ë¡£";
3292 #else
3293                 info[i++] = "You are hallucinating";
3294 #endif
3295
3296         }
3297         if (p_ptr->blessed)
3298         {
3299                 info2[i]  = report_magics_aux(p_ptr->blessed);
3300 #ifdef JP
3301 info[i++] = "¤¢¤Ê¤¿¤Ï¸øÀµ¤µ¤ò´¶¤¸¤Æ¤¤¤ë¡£";
3302 #else
3303                 info[i++] = "You feel rightous";
3304 #endif
3305
3306         }
3307         if (p_ptr->hero)
3308         {
3309                 info2[i]  = report_magics_aux(p_ptr->hero);
3310 #ifdef JP
3311 info[i++] = "¤¢¤Ê¤¿¤Ï¥Ò¡¼¥í¡¼µ¤Ê¬¤À¡£";
3312 #else
3313                 info[i++] = "You feel heroic";
3314 #endif
3315
3316         }
3317         if (p_ptr->shero)
3318         {
3319                 info2[i]  = report_magics_aux(p_ptr->shero);
3320 #ifdef JP
3321 info[i++] = "¤¢¤Ê¤¿¤ÏÀïÆ®¶¸¤À¡£";
3322 #else
3323                 info[i++] = "You are in a battle rage";
3324 #endif
3325
3326         }
3327         if (p_ptr->protevil)
3328         {
3329                 info2[i]  = report_magics_aux(p_ptr->protevil);
3330 #ifdef JP
3331 info[i++] = "¤¢¤Ê¤¿¤Ï¼Ù°­¤Ê¤ë¸ºß¤«¤é¼é¤é¤ì¤Æ¤¤¤ë¡£";
3332 #else
3333                 info[i++] = "You are protected from evil";
3334 #endif
3335
3336         }
3337         if (p_ptr->shield)
3338         {
3339                 info2[i]  = report_magics_aux(p_ptr->shield);
3340 #ifdef JP
3341 info[i++] = "¤¢¤Ê¤¿¤Ï¿ÀÈë¤Î¥·¡¼¥ë¥É¤Ç¼é¤é¤ì¤Æ¤¤¤ë¡£";
3342 #else
3343                 info[i++] = "You are protected by a mystic shield";
3344 #endif
3345
3346         }
3347         if (p_ptr->invuln)
3348         {
3349                 info2[i]  = report_magics_aux(p_ptr->invuln);
3350 #ifdef JP
3351 info[i++] = "̵Ũ¤Ç¤¤¤é¤ì¤ë¡£";
3352 #else
3353                 info[i++] = "You are invulnerable";
3354 #endif
3355
3356         }
3357         if (p_ptr->wraith_form)
3358         {
3359                 info2[i]  = report_magics_aux(p_ptr->wraith_form);
3360 #ifdef JP
3361 info[i++] = "Í©Âβ½¤Ç¤­¤ë¡£";
3362 #else
3363                 info[i++] = "You are incorporeal";
3364 #endif
3365
3366         }
3367         if (p_ptr->special_attack & ATTACK_CONFUSE)
3368         {
3369                 info2[i]  = 7;
3370 #ifdef JP
3371 info[i++] = "¤¢¤Ê¤¿¤Î¼ê¤ÏÀÖ¤¯µ±¤¤¤Æ¤¤¤ë¡£";
3372 #else
3373                 info[i++] = "Your hands are glowing dull red.";
3374 #endif
3375
3376         }
3377         if (p_ptr->word_recall)
3378         {
3379                 info2[i]  = report_magics_aux(p_ptr->word_recall);
3380 #ifdef JP
3381                 info[i++] = "¤³¤Î¸åµ¢´Ô¤Î¾Û¤òȯư¤¹¤ë¡£";
3382 #else
3383                 info[i++] = "You are waiting to be recalled";
3384 #endif
3385
3386         }
3387         if (p_ptr->alter_reality)
3388         {
3389                 info2[i]  = report_magics_aux(p_ptr->alter_reality);
3390 #ifdef JP
3391                 info[i++] = "¤³¤Î¸å¸½¼ÂÊÑÍƤ¬È¯Æ°¤¹¤ë¡£";
3392 #else
3393                 info[i++] = "You waiting to be altered";
3394 #endif
3395
3396         }
3397         if (p_ptr->oppose_acid)
3398         {
3399                 info2[i]  = report_magics_aux(p_ptr->oppose_acid);
3400 #ifdef JP
3401 info[i++] = "¤¢¤Ê¤¿¤Ï»À¤Ø¤ÎÂÑÀ­¤ò»ý¤Ã¤Æ¤¤¤ë¡£";
3402 #else
3403                 info[i++] = "You are resistant to acid";
3404 #endif
3405
3406         }
3407         if (p_ptr->oppose_elec)
3408         {
3409                 info2[i]  = report_magics_aux(p_ptr->oppose_elec);
3410 #ifdef JP
3411 info[i++] = "¤¢¤Ê¤¿¤ÏÅÅ·â¤Ø¤ÎÂÑÀ­¤ò»ý¤Ã¤Æ¤¤¤ë¡£";
3412 #else
3413                 info[i++] = "You are resistant to lightning";
3414 #endif
3415
3416         }
3417         if (p_ptr->oppose_fire)
3418         {
3419                 info2[i]  = report_magics_aux(p_ptr->oppose_fire);
3420 #ifdef JP
3421 info[i++] = "¤¢¤Ê¤¿¤Ï²Ð¤Ø¤ÎÂÑÀ­¤ò»ý¤Ã¤Æ¤¤¤ë¡£";
3422 #else
3423                 info[i++] = "You are resistant to fire";
3424 #endif
3425
3426         }
3427         if (p_ptr->oppose_cold)
3428         {
3429                 info2[i]  = report_magics_aux(p_ptr->oppose_cold);
3430 #ifdef JP
3431 info[i++] = "¤¢¤Ê¤¿¤ÏÎ䵤¤Ø¤ÎÂÑÀ­¤ò»ý¤Ã¤Æ¤¤¤ë¡£";
3432 #else
3433                 info[i++] = "You are resistant to cold";
3434 #endif
3435
3436         }
3437         if (p_ptr->oppose_pois)
3438         {
3439                 info2[i]  = report_magics_aux(p_ptr->oppose_pois);
3440 #ifdef JP
3441 info[i++] = "¤¢¤Ê¤¿¤ÏÆǤؤÎÂÑÀ­¤ò»ý¤Ã¤Æ¤¤¤ë¡£";
3442 #else
3443                 info[i++] = "You are resistant to poison";
3444 #endif
3445
3446         }
3447
3448         /* Save the screen */
3449         screen_save();
3450
3451         /* Erase the screen */
3452         for (k = 1; k < 24; k++) prt("", k, 13);
3453
3454         /* Label the information */
3455 #ifdef JP
3456 prt("           ËâË¡        :", 1, 15);
3457 #else
3458         prt("     Your Current Magic:", 1, 15);
3459 #endif
3460
3461
3462         /* We will print on top of the map (column 13) */
3463         for (k = 2, j = 0; j < i; j++)
3464         {
3465                 /* Show the info */
3466 #ifdef JP
3467 sprintf(Dummy, "¤¢¤Ê¤¿¤Ï%s%s", info[j],
3468 #else
3469                 sprintf(Dummy, "%s %s.", info[j],
3470 #endif
3471
3472                         report_magic_durations[info2[j]]);
3473                 prt(Dummy, k++, 15);
3474
3475                 /* Every 20 entries (lines 2 to 21), start over */
3476                 if ((k == 22) && (j + 1 < i))
3477                 {
3478 #ifdef JP
3479 prt("-- Â³¤¯ --", k, 15);
3480 #else
3481                         prt("-- more --", k, 15);
3482 #endif
3483
3484                         inkey();
3485                         for (; k > 2; k--) prt("", k, 15);
3486                 }
3487         }
3488
3489         /* Pause */
3490 #ifdef JP
3491 prt("[²¿¤«¥­¡¼¤ò²¡¤¹¤È¥²¡¼¥à¤ËÌá¤ê¤Þ¤¹]", k, 13);
3492 #else
3493         prt("[Press any key to continue]", k, 13);
3494 #endif
3495
3496         inkey();
3497
3498         /* Restore the screen */
3499         screen_load();
3500 }
3501
3502
3503 /*
3504  * Detect all traps on current panel
3505  */
3506 bool detect_traps(int range, bool known)
3507 {
3508         int             x, y;
3509         bool            detect = FALSE;
3510         cave_type       *c_ptr;
3511
3512
3513         if (d_info[dungeon_type].flags1 & DF1_DARKNESS) range /= 3;
3514
3515         /* Scan the current panel */
3516         for (y = 1; y < cur_hgt - 1; y++)
3517         {
3518                 for (x = 1; x <= cur_wid - 1; x++)
3519                 {
3520                         int dist = distance(py, px, y, x);
3521                         if (dist > range) continue;
3522
3523                         /* Access the grid */
3524                         c_ptr = &cave[y][x];
3525
3526                         /* Mark as detected */
3527                         if (dist <= range && known)
3528                         {
3529                                 if (dist <= range - 1)
3530                                         c_ptr->info |= (CAVE_IN_DETECT);
3531
3532                                 c_ptr->info &= ~(CAVE_UNSAFE);
3533
3534                                 /* Redraw */
3535                                 lite_spot(y, x);
3536                         }
3537
3538                         /* Detect traps */
3539                         if (is_trap(c_ptr->feat))
3540                         {
3541                                 /* Hack -- Memorize */
3542                                 c_ptr->info |= (CAVE_MARK);
3543
3544                                 if (c_ptr->mimic)
3545                                 {
3546                                         /* Disclose a hidden trap */
3547                                         disclose_grid(y, x);
3548                                 }
3549                                 else
3550                                 {
3551                                         /* Redraw */
3552                                         lite_spot(y, x);
3553                                 }
3554
3555                                 /* Obvious */
3556                                 detect = TRUE;
3557                         }
3558                 }
3559         }
3560
3561         if (known) p_ptr->dtrap = TRUE;
3562
3563         if ((p_ptr->pclass == CLASS_BARD) && (p_ptr->magic_num1[0] > MUSIC_DETECT)) detect = FALSE;
3564
3565         /* Describe */
3566         if (detect)
3567         {
3568 #ifdef JP
3569 msg_print("¥È¥é¥Ã¥×¤Î¸ºß¤ò´¶¤¸¤È¤Ã¤¿¡ª");
3570 #else
3571                 msg_print("You sense the presence of traps!");
3572 #endif
3573
3574         }
3575
3576         /* Result */
3577         return (detect);
3578 }
3579
3580
3581
3582 /*
3583  * Detect all doors on current panel
3584  */
3585 bool detect_doors(int range)
3586 {
3587         int y, x;
3588
3589         bool detect = FALSE;
3590
3591         cave_type *c_ptr;
3592
3593         if (d_info[dungeon_type].flags1 & DF1_DARKNESS) range /= 3;
3594
3595         /* Scan the panel */
3596         for (y = 1; y < cur_hgt - 1; y++)
3597         {
3598                 for (x = 1; x < cur_wid - 1; x++)
3599                 {
3600                         if (distance(py, px, y, x) > range) continue;
3601
3602                         c_ptr = &cave[y][x];
3603
3604                         /* Detect secret doors */
3605                         if (is_hidden_door(c_ptr))
3606                         {
3607                                 /* Pick a door */
3608                                 disclose_grid(y, x);
3609                         }
3610
3611                         /* Detect doors */
3612                         if (((c_ptr->feat >= FEAT_DOOR_HEAD) &&
3613                              (c_ptr->feat <= FEAT_DOOR_TAIL)) ||
3614                             ((c_ptr->feat == FEAT_OPEN) ||
3615                              (c_ptr->feat == FEAT_BROKEN)))
3616                         {
3617                                 /* Hack -- Memorize */
3618                                 c_ptr->info |= (CAVE_MARK);
3619
3620                                 /* Redraw */
3621                                 lite_spot(y, x);
3622
3623                                 /* Obvious */
3624                                 detect = TRUE;
3625                         }
3626                 }
3627         }
3628
3629         if ((p_ptr->pclass == CLASS_BARD) && (p_ptr->magic_num1[0] > MUSIC_DETECT)) detect = FALSE;
3630
3631         /* Describe */
3632         if (detect)
3633         {
3634 #ifdef JP
3635 msg_print("¥É¥¢¤Î¸ºß¤ò´¶¤¸¤È¤Ã¤¿¡ª");
3636 #else
3637                 msg_print("You sense the presence of doors!");
3638 #endif
3639
3640         }
3641
3642         /* Result */
3643         return (detect);
3644 }
3645
3646
3647 /*
3648  * Detect all stairs on current panel
3649  */
3650 bool detect_stairs(int range)
3651 {
3652         int y, x;
3653
3654         bool detect = FALSE;
3655
3656         cave_type *c_ptr;
3657
3658         if (d_info[dungeon_type].flags1 & DF1_DARKNESS) range /= 3;
3659
3660         /* Scan the panel */
3661         for (y = 1; y < cur_hgt - 1; y++)
3662         {
3663                 for (x = 1; x < cur_wid - 1; x++)
3664                 {
3665                         if (distance(py, px, y, x) > range) continue;
3666
3667                         c_ptr = &cave[y][x];
3668
3669                         /* Detect stairs */
3670                         if ((c_ptr->feat == FEAT_LESS) ||
3671                             (c_ptr->feat == FEAT_LESS_LESS) ||
3672                             (c_ptr->feat == FEAT_MORE) ||
3673                             (c_ptr->feat == FEAT_MORE_MORE) ||
3674                             (c_ptr->feat == FEAT_ENTRANCE))
3675                         {
3676                                 /* Hack -- Memorize */
3677                                 c_ptr->info |= (CAVE_MARK);
3678
3679                                 /* Redraw */
3680                                 lite_spot(y, x);
3681
3682                                 /* Obvious */
3683                                 detect = TRUE;
3684                         }
3685                 }
3686         }
3687
3688         if ((p_ptr->pclass == CLASS_BARD) && (p_ptr->magic_num1[0] > MUSIC_DETECT)) detect = FALSE;
3689
3690         /* Describe */
3691         if (detect)
3692         {
3693 #ifdef JP
3694 msg_print("³¬Ãʤθºß¤ò´¶¤¸¤È¤Ã¤¿¡ª");
3695 #else
3696                 msg_print("You sense the presence of stairs!");
3697 #endif
3698
3699         }
3700
3701         /* Result */
3702         return (detect);
3703 }
3704
3705
3706 /*
3707  * Detect any treasure on the current panel
3708  */
3709 bool detect_treasure(int range)
3710 {
3711         int y, x;
3712
3713         bool detect = FALSE;
3714
3715         cave_type *c_ptr;
3716
3717         if (d_info[dungeon_type].flags1 & DF1_DARKNESS) range /= 3;
3718
3719         /* Scan the current panel */
3720         for (y = 1; y < cur_hgt; y++)
3721         {
3722                 for (x = 1; x < cur_wid; x++)
3723                 {
3724                         if (distance(py, px, y, x) > range) continue;
3725
3726                         c_ptr = &cave[y][x];
3727
3728                         /* Notice embedded gold */
3729                         if ((c_ptr->feat == FEAT_MAGMA_H) ||
3730                             (c_ptr->feat == FEAT_QUARTZ_H))
3731                         {
3732                                 /* Expose the gold */
3733                                 c_ptr->feat += 0x02;
3734                         }
3735
3736                         /* Magma/Quartz + Known Gold */
3737                         if ((c_ptr->feat == FEAT_MAGMA_K) ||
3738                             (c_ptr->feat == FEAT_QUARTZ_K))
3739                         {
3740                                 /* Hack -- Memorize */
3741                                 c_ptr->info |= (CAVE_MARK);
3742
3743                                 /* Redraw */
3744                                 lite_spot(y, x);
3745
3746                                 /* Detect */
3747                                 detect = TRUE;
3748                         }
3749                 }
3750         }
3751
3752         if ((p_ptr->pclass == CLASS_BARD) && (p_ptr->magic_num1[0] > MUSIC_DETECT+6)) detect = FALSE;
3753
3754         /* Describe */
3755         if (detect)
3756         {
3757 #ifdef JP
3758 msg_print("Ë䢤µ¤ì¤¿ºâÊõ¤Î¸ºß¤ò´¶¤¸¤È¤Ã¤¿¡ª");
3759 #else
3760                 msg_print("You sense the presence of buried treasure!");
3761 #endif
3762
3763         }
3764
3765
3766         /* Result */
3767         return (detect);
3768 }
3769
3770
3771
3772 /*
3773  * Detect all "gold" objects on the current panel
3774  */
3775 bool detect_objects_gold(int range)
3776 {
3777         int i, y, x;
3778         int range2 = range;
3779
3780         bool detect = FALSE;
3781
3782         if (d_info[dungeon_type].flags1 & DF1_DARKNESS) range2 /= 3;
3783
3784         /* Scan objects */
3785         for (i = 1; i < o_max; i++)
3786         {
3787                 object_type *o_ptr = &o_list[i];
3788
3789                 /* Skip dead objects */
3790                 if (!o_ptr->k_idx) continue;
3791
3792                 /* Skip held objects */
3793                 if (o_ptr->held_m_idx) continue;
3794
3795                 /* Location */
3796                 y = o_ptr->iy;
3797                 x = o_ptr->ix;
3798
3799                 /* Only detect nearby objects */
3800                 if (distance(py, px, y, x) > range2) continue;
3801
3802                 /* Detect "gold" objects */
3803                 if (o_ptr->tval == TV_GOLD)
3804                 {
3805                         /* Hack -- memorize it */
3806                         o_ptr->marked |= OM_FOUND;
3807
3808                         /* Redraw */
3809                         lite_spot(y, x);
3810
3811                         /* Detect */
3812                         detect = TRUE;
3813                 }
3814         }
3815
3816         if ((p_ptr->pclass == CLASS_BARD) && (p_ptr->magic_num1[0] > MUSIC_DETECT+6)) detect = FALSE;
3817
3818         /* Describe */
3819         if (detect)
3820         {
3821 #ifdef JP
3822 msg_print("ºâÊõ¤Î¸ºß¤ò´¶¤¸¤È¤Ã¤¿¡ª");
3823 #else
3824                 msg_print("You sense the presence of treasure!");
3825 #endif
3826
3827         }
3828
3829         if (detect_monsters_string(range, "$"))
3830         {
3831                 detect = TRUE;
3832         }
3833
3834         /* Result */
3835         return (detect);
3836 }
3837
3838
3839 /*
3840  * Detect all "normal" objects on the current panel
3841  */
3842 bool detect_objects_normal(int range)
3843 {
3844         int i, y, x;
3845         int range2 = range;
3846
3847         bool detect = FALSE;
3848
3849         if (d_info[dungeon_type].flags1 & DF1_DARKNESS) range2 /= 3;
3850
3851         /* Scan objects */
3852         for (i = 1; i < o_max; i++)
3853         {
3854                 object_type *o_ptr = &o_list[i];
3855
3856                 /* Skip dead objects */
3857                 if (!o_ptr->k_idx) continue;
3858
3859                 /* Skip held objects */
3860                 if (o_ptr->held_m_idx) continue;
3861
3862                 /* Location */
3863                 y = o_ptr->iy;
3864                 x = o_ptr->ix;
3865
3866                 /* Only detect nearby objects */
3867                 if (distance(py, px, y, x) > range2) continue;
3868
3869                 /* Detect "real" objects */
3870                 if (o_ptr->tval != TV_GOLD)
3871                 {
3872                         /* Hack -- memorize it */
3873                         o_ptr->marked |= OM_FOUND;
3874
3875                         /* Redraw */
3876                         lite_spot(y, x);
3877
3878                         /* Detect */
3879                         detect = TRUE;
3880                 }
3881         }
3882
3883         if ((p_ptr->pclass == CLASS_BARD) && (p_ptr->magic_num1[0] > MUSIC_DETECT+6)) detect = FALSE;
3884
3885         /* Describe */
3886         if (detect)
3887         {
3888 #ifdef JP
3889 msg_print("¥¢¥¤¥Æ¥à¤Î¸ºß¤ò´¶¤¸¤È¤Ã¤¿¡ª");
3890 #else
3891                 msg_print("You sense the presence of objects!");
3892 #endif
3893
3894         }
3895
3896         if (detect_monsters_string(range, "!=?|/`"))
3897         {
3898                 detect = TRUE;
3899         }
3900
3901         /* Result */
3902         return (detect);
3903 }
3904
3905
3906 /*
3907  * Detect all "magic" objects on the current panel.
3908  *
3909  * This will light up all spaces with "magic" items, including artifacts,
3910  * ego-items, potions, scrolls, books, rods, wands, staves, amulets, rings,
3911  * and "enchanted" items of the "good" variety.
3912  *
3913  * It can probably be argued that this function is now too powerful.
3914  */
3915 bool detect_objects_magic(int range)
3916 {
3917         int i, y, x, tv;
3918
3919         bool detect = FALSE;
3920
3921         if (d_info[dungeon_type].flags1 & DF1_DARKNESS) range /= 3;
3922
3923         /* Scan all objects */
3924         for (i = 1; i < o_max; i++)
3925         {
3926                 object_type *o_ptr = &o_list[i];
3927
3928                 /* Skip dead objects */
3929                 if (!o_ptr->k_idx) continue;
3930
3931                 /* Skip held objects */
3932                 if (o_ptr->held_m_idx) continue;
3933
3934                 /* Location */
3935                 y = o_ptr->iy;
3936                 x = o_ptr->ix;
3937
3938                 /* Only detect nearby objects */
3939                 if (distance(py, px, y, x) > range) continue;
3940
3941                 /* Examine the tval */
3942                 tv = o_ptr->tval;
3943
3944                 /* Artifacts, misc magic items, or enchanted wearables */
3945                 if (artifact_p(o_ptr) ||
3946                         ego_item_p(o_ptr) ||
3947                         o_ptr->art_name ||
3948                     (tv == TV_WHISTLE) ||
3949                     (tv == TV_AMULET) ||
3950                         (tv == TV_RING) ||
3951                     (tv == TV_STAFF) ||
3952                         (tv == TV_WAND) ||
3953                         (tv == TV_ROD) ||
3954                     (tv == TV_SCROLL) ||
3955                         (tv == TV_POTION) ||
3956                     (tv == TV_LIFE_BOOK) ||
3957                         (tv == TV_SORCERY_BOOK) ||
3958                     (tv == TV_NATURE_BOOK) ||
3959                         (tv == TV_CHAOS_BOOK) ||
3960                     (tv == TV_DEATH_BOOK) ||
3961                     (tv == TV_TRUMP_BOOK) ||
3962                         (tv == TV_ARCANE_BOOK) ||
3963                         (tv == TV_ENCHANT_BOOK) ||
3964                         (tv == TV_DAEMON_BOOK) ||
3965                         (tv == TV_CRUSADE_BOOK) ||
3966                         (tv == TV_MUSIC_BOOK) ||
3967                         (tv == TV_HISSATSU_BOOK) ||
3968                     ((o_ptr->to_a > 0) || (o_ptr->to_h + o_ptr->to_d > 0)))
3969                 {
3970                         /* Memorize the item */
3971                         o_ptr->marked |= OM_FOUND;
3972
3973                         /* Redraw */
3974                         lite_spot(y, x);
3975
3976                         /* Detect */
3977                         detect = TRUE;
3978                 }
3979         }
3980
3981         /* Describe */
3982         if (detect)
3983         {
3984 #ifdef JP
3985 msg_print("ËâË¡¤Î¥¢¥¤¥Æ¥à¤Î¸ºß¤ò´¶¤¸¤È¤Ã¤¿¡ª");
3986 #else
3987                 msg_print("You sense the presence of magic objects!");
3988 #endif
3989
3990         }
3991
3992         /* Return result */
3993         return (detect);
3994 }
3995
3996
3997 /*
3998  * Detect all "normal" monsters on the current panel
3999  */
4000 bool detect_monsters_normal(int range)
4001 {
4002         int i, y, x;
4003
4004         bool flag = FALSE;
4005
4006         if (d_info[dungeon_type].flags1 & DF1_DARKNESS) range /= 3;
4007
4008         /* Scan monsters */
4009         for (i = 1; i < m_max; i++)
4010         {
4011                 monster_type *m_ptr = &m_list[i];
4012                 monster_race *r_ptr = &r_info[m_ptr->r_idx];
4013
4014                 /* Skip dead monsters */
4015                 if (!m_ptr->r_idx) continue;
4016
4017                 /* Location */
4018                 y = m_ptr->fy;
4019                 x = m_ptr->fx;
4020
4021                 /* Only detect nearby monsters */
4022                 if (distance(py, px, y, x) > range) continue;
4023
4024                 /* Detect all non-invisible monsters */
4025                 if (!(r_ptr->flags2 & RF2_INVISIBLE) || p_ptr->see_inv)
4026                 {
4027                         /* Repair visibility later */
4028                         repair_monsters = TRUE;
4029
4030                         /* Hack -- Detect monster */
4031                         m_ptr->mflag2 |= (MFLAG2_MARK | MFLAG2_SHOW);
4032
4033                         /* Update the monster */
4034                         update_mon(i, FALSE);
4035
4036                         /* Detect */
4037                         flag = TRUE;
4038                 }
4039         }
4040
4041         if ((p_ptr->pclass == CLASS_BARD) && (p_ptr->magic_num1[0] > MUSIC_DETECT+3)) flag = FALSE;
4042
4043         /* Describe */
4044         if (flag)
4045         {
4046                 /* Describe result */
4047 #ifdef JP
4048 msg_print("¥â¥ó¥¹¥¿¡¼¤Î¸ºß¤ò´¶¤¸¤È¤Ã¤¿¡ª");
4049 #else
4050                 msg_print("You sense the presence of monsters!");
4051 #endif
4052
4053         }
4054
4055         /* Result */
4056         return (flag);
4057 }
4058
4059
4060 /*
4061  * Detect all "invisible" monsters around the player
4062  */
4063 bool detect_monsters_invis(int range)
4064 {
4065         int i, y, x;
4066         bool flag = FALSE;
4067
4068         if (d_info[dungeon_type].flags1 & DF1_DARKNESS) range /= 3;
4069
4070         /* Scan monsters */
4071         for (i = 1; i < m_max; i++)
4072         {
4073                 monster_type *m_ptr = &m_list[i];
4074                 monster_race *r_ptr = &r_info[m_ptr->r_idx];
4075
4076                 /* Skip dead monsters */
4077                 if (!m_ptr->r_idx) continue;
4078
4079                 /* Location */
4080                 y = m_ptr->fy;
4081                 x = m_ptr->fx;
4082
4083                 /* Only detect nearby monsters */
4084                 if (distance(py, px, y, x) > range) continue;
4085
4086                 /* Detect invisible monsters */
4087                 if (r_ptr->flags2 & RF2_INVISIBLE)
4088                 {
4089                         /* Update monster recall window */
4090                         if (p_ptr->monster_race_idx == m_ptr->r_idx)
4091                         {
4092                                 /* Window stuff */
4093                                 p_ptr->window |= (PW_MONSTER);
4094                         }
4095
4096                         /* Repair visibility later */
4097                         repair_monsters = TRUE;
4098
4099                         /* Hack -- Detect monster */
4100                         m_ptr->mflag2 |= (MFLAG2_MARK | MFLAG2_SHOW);
4101
4102                         /* Update the monster */
4103                         update_mon(i, FALSE);
4104
4105                         /* Detect */
4106                         flag = TRUE;
4107                 }
4108         }
4109
4110         if ((p_ptr->pclass == CLASS_BARD) && (p_ptr->magic_num1[0] > MUSIC_DETECT+3)) flag = FALSE;
4111
4112         /* Describe */
4113         if (flag)
4114         {
4115                 /* Describe result */
4116 #ifdef JP
4117 msg_print("Æ©ÌÀ¤ÊÀ¸Êª¤Î¸ºß¤ò´¶¤¸¤È¤Ã¤¿¡ª");
4118 #else
4119                 msg_print("You sense the presence of invisible creatures!");
4120 #endif
4121
4122         }
4123
4124         /* Result */
4125         return (flag);
4126 }
4127
4128
4129
4130 /*
4131  * Detect all "evil" monsters on current panel
4132  */
4133 bool detect_monsters_evil(int range)
4134 {
4135         int i, y, x;
4136         bool flag = FALSE;
4137
4138         if (d_info[dungeon_type].flags1 & DF1_DARKNESS) range /= 3;
4139
4140         /* Scan monsters */
4141         for (i = 1; i < m_max; i++)
4142         {
4143                 monster_type *m_ptr = &m_list[i];
4144                 monster_race *r_ptr = &r_info[m_ptr->r_idx];
4145
4146                 /* Skip dead monsters */
4147                 if (!m_ptr->r_idx) continue;
4148
4149                 /* Location */
4150                 y = m_ptr->fy;
4151                 x = m_ptr->fx;
4152
4153                 /* Only detect nearby monsters */
4154                 if (distance(py, px, y, x) > range) continue;
4155
4156                 /* Detect evil monsters */
4157                 if (r_ptr->flags3 & RF3_EVIL)
4158                 {
4159                         if (is_original_ap(m_ptr))
4160                         {
4161                                 /* Take note that they are evil */
4162                                 r_ptr->r_flags3 |= (RF3_EVIL);
4163
4164                                 /* Update monster recall window */
4165                                 if (p_ptr->monster_race_idx == m_ptr->r_idx)
4166                                 {
4167                                         /* Window stuff */
4168                                         p_ptr->window |= (PW_MONSTER);
4169                                 }
4170                         }
4171
4172                         /* Repair visibility later */
4173                         repair_monsters = TRUE;
4174
4175                         /* Hack -- Detect monster */
4176                         m_ptr->mflag2 |= (MFLAG2_MARK | MFLAG2_SHOW);
4177
4178                         /* Update the monster */
4179                         update_mon(i, FALSE);
4180
4181                         /* Detect */
4182                         flag = TRUE;
4183                 }
4184         }
4185
4186         /* Describe */
4187         if (flag)
4188         {
4189                 /* Describe result */
4190 #ifdef JP
4191 msg_print("¼Ù°­¤Ê¤ëÀ¸Êª¤Î¸ºß¤ò´¶¤¸¤È¤Ã¤¿¡ª");
4192 #else
4193                 msg_print("You sense the presence of evil creatures!");
4194 #endif
4195
4196         }
4197
4198         /* Result */
4199         return (flag);
4200 }
4201
4202
4203
4204
4205 /*
4206  * Detect all "nonliving", "undead" or "demonic" monsters on current panel
4207  */
4208 bool detect_monsters_nonliving(int range)
4209 {
4210         int     i, y, x;
4211         bool    flag = FALSE;
4212
4213         if (d_info[dungeon_type].flags1 & DF1_DARKNESS) range /= 3;
4214
4215         /* Scan monsters */
4216         for (i = 1; i < m_max; i++)
4217         {
4218                 monster_type *m_ptr = &m_list[i];
4219                 monster_race *r_ptr = &r_info[m_ptr->r_idx];
4220
4221                 /* Skip dead monsters */
4222                 if (!m_ptr->r_idx) continue;
4223
4224                 /* Location */
4225                 y = m_ptr->fy;
4226                 x = m_ptr->fx;
4227
4228                 /* Only detect nearby monsters */
4229                 if (distance(py, px, y, x) > range) continue;
4230
4231                 /* Detect non-living monsters */
4232                 if (!monster_living(r_ptr))
4233                 {
4234                         /* Update monster recall window */
4235                         if (p_ptr->monster_race_idx == m_ptr->r_idx)
4236                         {
4237                                 /* Window stuff */
4238                                 p_ptr->window |= (PW_MONSTER);
4239                         }
4240
4241                         /* Repair visibility later */
4242                         repair_monsters = TRUE;
4243
4244                         /* Hack -- Detect monster */
4245                         m_ptr->mflag2 |= (MFLAG2_MARK | MFLAG2_SHOW);
4246
4247                         /* Update the monster */
4248                         update_mon(i, FALSE);
4249
4250                         /* Detect */
4251                         flag = TRUE;
4252                 }
4253         }
4254
4255         /* Describe */
4256         if (flag)
4257         {
4258                 /* Describe result */
4259 #ifdef JP
4260 msg_print("¼«Á³¤Ç¤Ê¤¤¥â¥ó¥¹¥¿¡¼¤Î¸ºß¤ò´¶¤¸¤¿¡ª");
4261 #else
4262                 msg_print("You sense the presence of unnatural beings!");
4263 #endif
4264
4265         }
4266
4267         /* Result */
4268         return (flag);
4269 }
4270
4271
4272 /*
4273  * Detect all monsters it has mind on current panel
4274  */
4275 bool detect_monsters_mind(int range)
4276 {
4277         int     i, y, x;
4278         bool    flag = FALSE;
4279
4280         if (d_info[dungeon_type].flags1 & DF1_DARKNESS) range /= 3;
4281
4282         /* Scan monsters */
4283         for (i = 1; i < m_max; i++)
4284         {
4285                 monster_type *m_ptr = &m_list[i];
4286                 monster_race *r_ptr = &r_info[m_ptr->r_idx];
4287
4288                 /* Skip dead monsters */
4289                 if (!m_ptr->r_idx) continue;
4290
4291                 /* Location */
4292                 y = m_ptr->fy;
4293                 x = m_ptr->fx;
4294
4295                 /* Only detect nearby monsters */
4296                 if (distance(py, px, y, x) > range) continue;
4297
4298                 /* Detect non-living monsters */
4299                 if (!(r_ptr->flags2 & RF2_EMPTY_MIND))
4300                 {
4301                         /* Update monster recall window */
4302                         if (p_ptr->monster_race_idx == m_ptr->r_idx)
4303                         {
4304                                 /* Window stuff */
4305                                 p_ptr->window |= (PW_MONSTER);
4306                         }
4307
4308                         /* Repair visibility later */
4309                         repair_monsters = TRUE;
4310
4311                         /* Hack -- Detect monster */
4312                         m_ptr->mflag2 |= (MFLAG2_MARK | MFLAG2_SHOW);
4313
4314                         /* Update the monster */
4315                         update_mon(i, FALSE);
4316
4317                         /* Detect */
4318                         flag = TRUE;
4319                 }
4320         }
4321
4322         /* Describe */
4323         if (flag)
4324         {
4325                 /* Describe result */
4326 #ifdef JP
4327 msg_print("»¦µ¤¤ò´¶¤¸¤È¤Ã¤¿¡ª");
4328 #else
4329                 msg_print("You sense the presence of someone's mind!");
4330 #endif
4331
4332         }
4333
4334         /* Result */
4335         return (flag);
4336 }
4337
4338
4339 /*
4340  * Detect all (string) monsters on current panel
4341  */
4342 bool detect_monsters_string(int range, cptr Match)
4343 {
4344         int i, y, x;
4345         bool flag = FALSE;
4346
4347         if (d_info[dungeon_type].flags1 & DF1_DARKNESS) range /= 3;
4348
4349         /* Scan monsters */
4350         for (i = 1; i < m_max; i++)
4351         {
4352                 monster_type *m_ptr = &m_list[i];
4353                 monster_race *r_ptr = &r_info[m_ptr->r_idx];
4354
4355                 /* Skip dead monsters */
4356                 if (!m_ptr->r_idx) continue;
4357
4358                 /* Location */
4359                 y = m_ptr->fy;
4360                 x = m_ptr->fx;
4361
4362                 /* Only detect nearby monsters */
4363                 if (distance(py, px, y, x) > range) continue;
4364
4365                 /* Detect monsters with the same symbol */
4366                 if (my_strchr(Match, r_ptr->d_char))
4367                 {
4368                         /* Update monster recall window */
4369                         if (p_ptr->monster_race_idx == m_ptr->r_idx)
4370                         {
4371                                 /* Window stuff */
4372                                 p_ptr->window |= (PW_MONSTER);
4373                         }
4374
4375                         /* Repair visibility later */
4376                         repair_monsters = TRUE;
4377
4378                         /* Hack -- Detect monster */
4379                         m_ptr->mflag2 |= (MFLAG2_MARK | MFLAG2_SHOW);
4380
4381                         /* Update the monster */
4382                         update_mon(i, FALSE);
4383
4384                         /* Detect */
4385                         flag = TRUE;
4386                 }
4387         }
4388
4389         if ((p_ptr->pclass == CLASS_BARD) && (p_ptr->magic_num1[0] > MUSIC_DETECT+3)) flag = FALSE;
4390
4391         /* Describe */
4392         if (flag)
4393         {
4394                 /* Describe result */
4395 #ifdef JP
4396 msg_print("¥â¥ó¥¹¥¿¡¼¤Î¸ºß¤ò´¶¤¸¤È¤Ã¤¿¡ª");
4397 #else
4398                 msg_print("You sense the presence of monsters!");
4399 #endif
4400
4401         }
4402
4403         /* Result */
4404         return (flag);
4405 }
4406
4407
4408 /*
4409  * A "generic" detect monsters routine, tagged to flags3
4410  */
4411 bool detect_monsters_xxx(int range, u32b match_flag)
4412 {
4413         int  i, y, x;
4414         bool flag = FALSE;
4415 #ifdef JP
4416 cptr desc_monsters = "ÊѤʥâ¥ó¥¹¥¿¡¼";
4417 #else
4418         cptr desc_monsters = "weird monsters";
4419 #endif
4420
4421         if (d_info[dungeon_type].flags1 & DF1_DARKNESS) range /= 3;
4422
4423         /* Scan monsters */
4424         for (i = 1; i < m_max; i++)
4425         {
4426                 monster_type *m_ptr = &m_list[i];
4427                 monster_race *r_ptr = &r_info[m_ptr->r_idx];
4428
4429                 /* Skip dead monsters */
4430                 if (!m_ptr->r_idx) continue;
4431
4432                 /* Location */
4433                 y = m_ptr->fy;
4434                 x = m_ptr->fx;
4435
4436                 /* Only detect nearby monsters */
4437                 if (distance(py, px, y, x) > range) continue;
4438
4439                 /* Detect evil monsters */
4440                 if (r_ptr->flags3 & (match_flag))
4441                 {
4442                         if (is_original_ap(m_ptr))
4443                         {
4444                                 /* Take note that they are something */
4445                                 r_ptr->r_flags3 |= (match_flag);
4446
4447                                 /* Update monster recall window */
4448                                 if (p_ptr->monster_race_idx == m_ptr->r_idx)
4449                                 {
4450                                         /* Window stuff */
4451                                         p_ptr->window |= (PW_MONSTER);
4452                                 }
4453                         }
4454
4455                         /* Repair visibility later */
4456                         repair_monsters = TRUE;
4457
4458                         /* Hack -- Detect monster */
4459                         m_ptr->mflag2 |= (MFLAG2_MARK | MFLAG2_SHOW);
4460
4461                         /* Update the monster */
4462                         update_mon(i, FALSE);
4463
4464                         /* Detect */
4465                         flag = TRUE;
4466                 }
4467         }
4468
4469         /* Describe */
4470         if (flag)
4471         {
4472                 switch (match_flag)
4473                 {
4474                         case RF3_DEMON:
4475 #ifdef JP
4476 desc_monsters = "¥Ç¡¼¥â¥ó";
4477 #else
4478                                 desc_monsters = "demons";
4479 #endif
4480
4481                                 break;
4482                         case RF3_UNDEAD:
4483 #ifdef JP
4484 desc_monsters = "¥¢¥ó¥Ç¥Ã¥É";
4485 #else
4486                                 desc_monsters = "the undead";
4487 #endif
4488
4489                                 break;
4490                 }
4491
4492                 /* Describe result */
4493 #ifdef JP
4494 msg_format("%s¤Î¸ºß¤ò´¶¤¸¤È¤Ã¤¿¡ª", desc_monsters);
4495 #else
4496                 msg_format("You sense the presence of %s!", desc_monsters);
4497 #endif
4498
4499                 msg_print(NULL);
4500         }
4501
4502         /* Result */
4503         return (flag);
4504 }
4505
4506
4507 /*
4508  * Detect everything
4509  */
4510 bool detect_all(int range)
4511 {
4512         bool detect = FALSE;
4513
4514         /* Detect everything */
4515         if (detect_traps(range, TRUE)) detect = TRUE;
4516         if (detect_doors(range)) detect = TRUE;
4517         if (detect_stairs(range)) detect = TRUE;
4518
4519         /* There are too many hidden treasure.  So... */
4520         /* if (detect_treasure(range)) detect = TRUE; */
4521
4522         if (detect_objects_gold(range)) detect = TRUE;
4523         if (detect_objects_normal(range)) detect = TRUE;
4524         if (detect_monsters_invis(range)) detect = TRUE;
4525         if (detect_monsters_normal(range)) detect = TRUE;
4526
4527         /* Result */
4528         return (detect);
4529 }
4530
4531
4532 /*
4533  * Apply a "project()" directly to all viewable monsters
4534  *
4535  * Note that affected monsters are NOT auto-tracked by this usage.
4536  *
4537  * To avoid misbehavior when monster deaths have side-effects,
4538  * this is done in two passes. -- JDL
4539  */
4540 bool project_hack(int typ, int dam)
4541 {
4542         int     i, x, y;
4543         int     flg = PROJECT_JUMP | PROJECT_KILL | PROJECT_HIDE;
4544         bool    obvious = FALSE;
4545
4546
4547         /* Mark all (nearby) monsters */
4548         for (i = 1; i < m_max; i++)
4549         {
4550                 monster_type *m_ptr = &m_list[i];
4551
4552                 /* Paranoia -- Skip dead monsters */
4553                 if (!m_ptr->r_idx) continue;
4554
4555                 /* Location */
4556                 y = m_ptr->fy;
4557                 x = m_ptr->fx;
4558
4559                 /* Require line of sight */
4560                 if (!player_has_los_bold(y, x)) continue;
4561
4562                 /* Mark the monster */
4563                 m_ptr->mflag |= (MFLAG_TEMP);
4564         }
4565
4566         /* Affect all marked monsters */
4567         for (i = 1; i < m_max; i++)
4568         {
4569                 monster_type *m_ptr = &m_list[i];
4570
4571                 /* Skip unmarked monsters */
4572                 if (!(m_ptr->mflag & (MFLAG_TEMP))) continue;
4573
4574                 /* Remove mark */
4575                 m_ptr->mflag &= ~(MFLAG_TEMP);
4576
4577                 /* Location */
4578                 y = m_ptr->fy;
4579                 x = m_ptr->fx;
4580
4581                 /* Jump directly to the target monster */
4582                 if (project(0, 0, y, x, dam, typ, flg, -1)) obvious = TRUE;
4583         }
4584
4585         /* Result */
4586         return (obvious);
4587 }
4588
4589
4590 /*
4591  * Speed monsters
4592  */
4593 bool speed_monsters(void)
4594 {
4595         return (project_hack(GF_OLD_SPEED, p_ptr->lev));
4596 }
4597
4598 /*
4599  * Slow monsters
4600  */
4601 bool slow_monsters(void)
4602 {
4603         return (project_hack(GF_OLD_SLOW, p_ptr->lev));
4604 }
4605
4606 /*
4607  * Sleep monsters
4608  */
4609 bool sleep_monsters(void)
4610 {
4611         return (project_hack(GF_OLD_SLEEP, p_ptr->lev));
4612 }
4613
4614
4615 /*
4616  * Banish evil monsters
4617  */
4618 bool banish_evil(int dist)
4619 {
4620         return (project_hack(GF_AWAY_EVIL, dist));
4621 }
4622
4623
4624 /*
4625  * Turn undead
4626  */
4627 bool turn_undead(void)
4628 {
4629         bool tester = (project_hack(GF_TURN_UNDEAD, p_ptr->lev));
4630         if (tester)
4631                 chg_virtue(V_UNLIFE, -1);
4632         return tester;
4633 }
4634
4635
4636 /*
4637  * Dispel undead monsters
4638  */
4639 bool dispel_undead(int dam)
4640 {
4641         bool tester = (project_hack(GF_DISP_UNDEAD, dam));
4642         if (tester)
4643                 chg_virtue(V_UNLIFE, -2);
4644         return tester;
4645 }
4646
4647 /*
4648  * Dispel evil monsters
4649  */
4650 bool dispel_evil(int dam)
4651 {
4652         return (project_hack(GF_DISP_EVIL, dam));
4653 }
4654
4655 /*
4656  * Dispel good monsters
4657  */
4658 bool dispel_good(int dam)
4659 {
4660         return (project_hack(GF_DISP_GOOD, dam));
4661 }
4662
4663 /*
4664  * Dispel all monsters
4665  */
4666 bool dispel_monsters(int dam)
4667 {
4668         return (project_hack(GF_DISP_ALL, dam));
4669 }
4670
4671 /*
4672  * Dispel 'living' monsters
4673  */
4674 bool dispel_living(int dam)
4675 {
4676         return (project_hack(GF_DISP_LIVING, dam));
4677 }
4678
4679 /*
4680  * Dispel demons
4681  */
4682 bool dispel_demons(int dam)
4683 {
4684         return (project_hack(GF_DISP_DEMON, dam));
4685 }
4686
4687
4688 /*
4689  * Crusade
4690  */
4691 bool crusade(void)
4692 {
4693         return (project_hack(GF_CRUSADE, p_ptr->lev*4));
4694 }
4695
4696
4697 /*
4698  * Wake up all monsters, and speed up "los" monsters.
4699  */
4700 void aggravate_monsters(int who)
4701 {
4702         int     i;
4703         bool    sleep = FALSE;
4704         bool    speed = FALSE;
4705
4706
4707         /* Aggravate everyone nearby */
4708         for (i = 1; i < m_max; i++)
4709         {
4710                 monster_type    *m_ptr = &m_list[i];
4711 /*              monster_race    *r_ptr = &r_info[m_ptr->r_idx]; */
4712
4713                 /* Paranoia -- Skip dead monsters */
4714                 if (!m_ptr->r_idx) continue;
4715
4716                 /* Skip aggravating monster (or player) */
4717                 if (i == who) continue;
4718
4719                 /* Wake up nearby sleeping monsters */
4720                 if (m_ptr->cdis < MAX_SIGHT * 2)
4721                 {
4722                         /* Wake up */
4723                         if (m_ptr->csleep)
4724                         {
4725                                 /* Wake up */
4726                                 m_ptr->csleep = 0;
4727                                 if (r_info[m_ptr->r_idx].flags7 & RF7_HAS_LD_MASK) p_ptr->update |= (PU_MON_LITE);
4728                                 sleep = TRUE;
4729                         }
4730                         if (!is_pet(m_ptr)) m_ptr->mflag2 |= MFLAG2_NOPET;
4731                 }
4732
4733                 /* Speed up monsters in line of sight */
4734                 if (player_has_los_bold(m_ptr->fy, m_ptr->fx))
4735                 {
4736                         if (!is_pet(m_ptr))
4737                         {
4738                                 m_ptr->fast = MIN(200, m_ptr->fast + 100);
4739                                 speed = TRUE;
4740                         }
4741                 }
4742         }
4743
4744         /* Messages */
4745 #ifdef JP
4746 if (speed) msg_print("ÉÕ¶á¤Ç²¿¤«¤¬ÆÍÇ¡¶½Ê³¤·¤¿¤è¤¦¤Ê´¶¤¸¤ò¼õ¤±¤¿¡ª");
4747 else if (sleep) msg_print("²¿¤«¤¬ÆÍÇ¡¶½Ê³¤·¤¿¤è¤¦¤ÊÁû¡¹¤·¤¤²»¤¬±ó¤¯¤Ëʹ¤³¤¨¤¿¡ª");
4748 #else
4749         if (speed) msg_print("You feel a sudden stirring nearby!");
4750         else if (sleep) msg_print("You hear a sudden stirring in the distance!");
4751 #endif
4752         if (p_ptr->riding) p_ptr->update |= PU_BONUS;
4753 }
4754
4755
4756
4757 /*
4758  * Delete all non-unique/non-quest monsters of a given "type" from the level
4759  */
4760 bool symbol_genocide(int power, int player_cast)
4761 {
4762         int     i;
4763         char    typ;
4764         bool    result = FALSE;
4765         int     msec = delay_factor * delay_factor * delay_factor;
4766
4767         /* Prevent genocide in quest levels */
4768         if (p_ptr->inside_quest && !random_quest_number(dun_level))
4769         {
4770                 return (FALSE);
4771         }
4772
4773         /* Mega-Hack -- Get a monster symbol */
4774 #ifdef JP
4775 while(!get_com("¤É¤Î¼ïÎà(ʸ»ú)¤Î¥â¥ó¥¹¥¿¡¼¤òËõ»¦¤·¤Þ¤¹¤«: ", &typ, FALSE));
4776 #else
4777         while(!get_com("Choose a monster race (by symbol) to genocide: ", &typ, FALSE));
4778 #endif
4779
4780
4781         /* Delete the monsters of that "type" */
4782         for (i = 1; i < m_max; i++)
4783         {
4784                 monster_type    *m_ptr = &m_list[i];
4785                 monster_race    *r_ptr = &r_info[m_ptr->r_idx];
4786                 bool angry = FALSE;
4787                 char m_name[80];
4788
4789                 /* Paranoia -- Skip dead monsters */
4790                 if (!m_ptr->r_idx) continue;
4791
4792                 /* Skip "wrong" monsters */
4793                 if (r_ptr->d_char != typ) continue;
4794
4795                 if (is_pet(m_ptr) && !player_cast) continue;
4796
4797                 /* Hack -- Skip Unique Monsters */
4798                 if (r_ptr->flags1 & (RF1_UNIQUE)) angry = TRUE;
4799
4800                 /* Hack -- Skip Quest Monsters */
4801                 else if (r_ptr->flags1 & RF1_QUESTOR) angry = TRUE;
4802
4803                 else if (r_ptr->flags7 & RF7_UNIQUE2) angry = TRUE;
4804
4805                 else if (i == p_ptr->riding) angry = TRUE;
4806
4807                 else if (player_cast && (r_ptr->level > randint0(power))) angry = TRUE;
4808
4809                 else if (player_cast && (m_ptr->mflag2 & MFLAG2_NOGENO)) angry = TRUE;
4810
4811                 /* Delete the monster */
4812                 else delete_monster_idx(i);
4813
4814                 if (angry && player_cast)
4815                 {
4816                         monster_desc(m_name, m_ptr, 0);
4817                         if (m_ptr->ml && !p_ptr->blind)
4818                         {
4819 #ifdef JP
4820 msg_format("%^s¤Ë¤Ï¸ú²Ì¤¬¤Ê¤«¤Ã¤¿¡£", m_name);
4821 #else
4822                                 msg_format("%^s is unaffected.", m_name);
4823 #endif
4824                         }
4825                         if (m_ptr->csleep)
4826                         {
4827                                 m_ptr->csleep = 0;
4828                                 if (r_ptr->flags7 & RF7_HAS_LD_MASK) p_ptr->update |= (PU_MON_LITE);
4829                                 if (m_ptr->ml && !p_ptr->blind)
4830                                 {
4831 #ifdef JP
4832 msg_format("%^s¤¬Ìܤò³Ð¤Þ¤·¤¿¡£", m_name);
4833 #else
4834                                         msg_format("%^s wakes up.", m_name);
4835 #endif
4836                                 }
4837                         }
4838                         if (is_friendly(m_ptr) && !is_pet(m_ptr))
4839                         {
4840                                 if (m_ptr->ml && !p_ptr->blind)
4841                                 {
4842 #ifdef JP
4843                                         msg_format("%s¤ÏÅܤä¿¡ª", m_name);
4844 #else
4845                                         msg_format("%^s gets angry!", m_name);
4846 #endif
4847                                 }
4848                                 set_hostile(m_ptr);
4849                         }
4850                         if (one_in_(13)) m_ptr->mflag2 |= MFLAG2_NOGENO;
4851                 }
4852
4853                 if (player_cast)
4854                 {
4855                         /* Take damage */
4856 #ifdef JP
4857 take_hit(DAMAGE_GENO, randint1(4), "Ëõ»¦¤Î¼öʸ¤ò¾§¤¨¤¿ÈèÏ«", -1);
4858 #else
4859                         take_hit(DAMAGE_GENO, randint1(4), "the strain of casting Genocide", -1);
4860 #endif
4861
4862                 }
4863
4864                 /* Visual feedback */
4865                 move_cursor_relative(py, px);
4866
4867                 /* Redraw */
4868                 p_ptr->redraw |= (PR_HP);
4869
4870                 /* Window stuff */
4871                 p_ptr->window |= (PW_PLAYER);
4872
4873                 /* Handle */
4874                 handle_stuff();
4875
4876                 /* Fresh */
4877                 Term_fresh();
4878
4879                 /* Delay */
4880                 Term_xtra(TERM_XTRA_DELAY, msec);
4881
4882                 /* Take note */
4883                 result = TRUE;
4884         }
4885         if (result)
4886         {
4887                 chg_virtue(V_VITALITY, -2);
4888                 chg_virtue(V_CHANCE, -1);
4889         }
4890
4891         return (result);
4892 }
4893
4894
4895 /*
4896  * Delete all nearby (non-unique) monsters
4897  */
4898 bool mass_genocide(int power, int player_cast)
4899 {
4900         int     i;
4901         bool    result = FALSE;
4902         int     msec = delay_factor * delay_factor * delay_factor;
4903
4904
4905         /* Prevent mass genocide in quest levels */
4906         if (p_ptr->inside_quest && !random_quest_number(dun_level))
4907         {
4908                 return (FALSE);
4909         }
4910
4911         /* Delete the (nearby) monsters */
4912         for (i = 1; i < m_max; i++)
4913         {
4914                 monster_type    *m_ptr = &m_list[i];
4915                 monster_race    *r_ptr = &r_info[m_ptr->r_idx];
4916                 bool angry = FALSE;
4917                 char m_name[80];
4918
4919                 /* Paranoia -- Skip dead monsters */
4920                 if (!m_ptr->r_idx) continue;
4921
4922                 /* Skip distant monsters */
4923                 if (m_ptr->cdis > MAX_SIGHT) continue;
4924
4925                 if (is_pet(m_ptr) && !player_cast) continue;
4926
4927                 /* Hack -- Skip unique monsters */
4928                 if (r_ptr->flags1 & (RF1_UNIQUE)) angry = TRUE;
4929
4930                 /* Hack -- Skip Quest Monsters */
4931                 else if (r_ptr->flags1 & RF1_QUESTOR) angry = TRUE;
4932
4933                 else if (r_ptr->flags7 & RF7_UNIQUE2) angry = TRUE;
4934
4935                 else if (i == p_ptr->riding) angry = TRUE;
4936
4937                 else if (player_cast && (r_ptr->level > randint0(power))) angry = TRUE;
4938
4939                 else if (player_cast && (m_ptr->mflag2 & MFLAG2_NOGENO)) angry = TRUE;
4940
4941                 /* Delete the monster */
4942                 else delete_monster_idx(i);
4943
4944                 if (angry && player_cast)
4945                 {
4946                         monster_desc(m_name, m_ptr, 0);
4947                         if (m_ptr->ml && !p_ptr->blind)
4948                         {
4949 #ifdef JP
4950 msg_format("%^s¤Ë¤Ï¸ú²Ì¤¬¤Ê¤«¤Ã¤¿¡£", m_name);
4951 #else
4952                                 msg_format("%^s is unaffected.", m_name);
4953 #endif
4954                         }
4955                         if (m_ptr->csleep)
4956                         {
4957                                 m_ptr->csleep = 0;
4958                                 if (r_ptr->flags7 & RF7_HAS_LD_MASK) p_ptr->update |= (PU_MON_LITE);
4959                                 if (m_ptr->ml && !p_ptr->blind)
4960                                 {
4961 #ifdef JP
4962 msg_format("%^s¤¬Ìܤò³Ð¤Þ¤·¤¿¡£", m_name);
4963 #else
4964                                         msg_format("%^s wakes up.", m_name);
4965 #endif
4966                                 }
4967                         }
4968                         if (is_friendly(m_ptr) && !is_pet(m_ptr))
4969                         {
4970                                 if (m_ptr->ml && !p_ptr->blind)
4971                                 {
4972 #ifdef JP
4973                                         msg_format("%s¤ÏÅܤä¿¡ª", m_name);
4974 #else
4975                                         msg_format("%^s gets angry!", m_name);
4976 #endif
4977                                 }
4978                                 set_hostile(m_ptr);
4979                         }
4980                         if (one_in_(13)) m_ptr->mflag2 |= MFLAG2_NOGENO;
4981                 }
4982
4983                 if (player_cast)
4984                 {
4985                         /* Hack -- visual feedback */
4986 #ifdef JP
4987 take_hit(DAMAGE_GENO, randint1(3), "¼þÊÕËõ»¦¤Î¼öʸ¤ò¾§¤¨¤¿ÈèÏ«", -1);
4988 #else
4989                         take_hit(DAMAGE_GENO, randint1(3), "the strain of casting Mass Genocide", -1);
4990 #endif
4991
4992                 }
4993
4994                 move_cursor_relative(py, px);
4995
4996                 /* Redraw */
4997                 p_ptr->redraw |= (PR_HP);
4998
4999                 /* Window stuff */
5000                 p_ptr->window |= (PW_PLAYER);
5001
5002                 /* Handle */
5003                 handle_stuff();
5004
5005                 /* Fresh */
5006                 Term_fresh();
5007
5008                 /* Delay */
5009                 Term_xtra(TERM_XTRA_DELAY, msec);
5010
5011                 /* Note effect */
5012                 result = TRUE;
5013         }
5014
5015         if (result)
5016         {
5017                 chg_virtue(V_VITALITY, -2);
5018                 chg_virtue(V_CHANCE, -1);
5019         }
5020
5021         return (result);
5022 }
5023
5024
5025
5026 /*
5027  * Delete all nearby (non-unique) undead
5028  */
5029 bool mass_genocide_undead(int power, int player_cast)
5030 {
5031         int     i;
5032         bool    result = FALSE;
5033         int     msec = delay_factor * delay_factor * delay_factor;
5034
5035
5036         /* Prevent mass genocide in quest levels */
5037         if (p_ptr->inside_quest && !random_quest_number(dun_level))
5038         {
5039                 return (FALSE);
5040         }
5041
5042         /* Delete the (nearby) monsters */
5043         for (i = 1; i < m_max; i++)
5044         {
5045                 monster_type    *m_ptr = &m_list[i];
5046                 monster_race    *r_ptr = &r_info[m_ptr->r_idx];
5047                 bool angry = FALSE;
5048                 char m_name[80];
5049
5050                 /* Paranoia -- Skip dead monsters */
5051                 if (!m_ptr->r_idx) continue;
5052
5053                 if (!(r_ptr->flags3 & RF3_UNDEAD)) continue;
5054
5055                 /* Skip distant monsters */
5056                 if (m_ptr->cdis > MAX_SIGHT) continue;
5057
5058                 if (is_pet(m_ptr) && !player_cast) continue;
5059
5060                 /* Hack -- Skip unique monsters */
5061                 if (r_ptr->flags1 & (RF1_UNIQUE)) angry = TRUE;
5062
5063                 /* Hack -- Skip Quest Monsters */
5064                 else if (r_ptr->flags1 & RF1_QUESTOR) angry = TRUE;
5065
5066                 else if (r_ptr->flags7 & RF7_UNIQUE2) angry = TRUE;
5067
5068                 else if (i == p_ptr->riding) angry = TRUE;
5069
5070                 else if (player_cast && (r_ptr->level > randint0(power))) angry = TRUE;
5071
5072                 else if (player_cast && (m_ptr->mflag2 & MFLAG2_NOGENO)) angry = TRUE;
5073
5074                 /* Delete the monster */
5075                 else delete_monster_idx(i);
5076
5077                 if (angry && player_cast)
5078                 {
5079                         monster_desc(m_name, m_ptr, 0);
5080                         if (m_ptr->ml && !p_ptr->blind)
5081                         {
5082 #ifdef JP
5083 msg_format("%^s¤Ë¤Ï¸ú²Ì¤¬¤Ê¤«¤Ã¤¿¡£", m_name);
5084 #else
5085                                 msg_format("%^s is unaffected.", m_name);
5086 #endif
5087                         }
5088                         if (m_ptr->csleep)
5089                         {
5090                                 m_ptr->csleep = 0;
5091                                 if (r_ptr->flags7 & RF7_HAS_LD_MASK) p_ptr->update |= (PU_MON_LITE);
5092                                 if (m_ptr->ml && !p_ptr->blind)
5093                                 {
5094 #ifdef JP
5095 msg_format("%^s¤¬Ìܤò³Ð¤Þ¤·¤¿¡£", m_name);
5096 #else
5097                                         msg_format("%^s wakes up.", m_name);
5098 #endif
5099                                 }
5100                         }
5101                         if (is_friendly(m_ptr) && !is_pet(m_ptr))
5102                         {
5103                                 if (m_ptr->ml && !p_ptr->blind)
5104                                 {
5105 #ifdef JP
5106                                         msg_format("%s¤ÏÅܤä¿¡ª", m_name);
5107 #else
5108                                         msg_format("%^s gets angry!", m_name);
5109 #endif
5110                                 }
5111                                 set_hostile(m_ptr);
5112                         }
5113                         if (one_in_(13)) m_ptr->mflag2 |= MFLAG2_NOGENO;
5114                 }
5115
5116                 if (player_cast)
5117                 {
5118                         /* Hack -- visual feedback */
5119 #ifdef JP
5120 take_hit(DAMAGE_GENO, randint1(3), "¥¢¥ó¥Ç¥Ã¥É¾ÃÌǤμöʸ¤ò¾§¤¨¤¿ÈèÏ«", -1);
5121 #else
5122                         take_hit(DAMAGE_GENO, randint1(3), "the strain of casting Mass Genocide", -1);
5123 #endif
5124
5125                 }
5126
5127                 move_cursor_relative(py, px);
5128
5129                 /* Redraw */
5130                 p_ptr->redraw |= (PR_HP);
5131
5132                 /* Window stuff */
5133                 p_ptr->window |= (PW_PLAYER);
5134
5135                 /* Handle */
5136                 handle_stuff();
5137
5138                 /* Fresh */
5139                 Term_fresh();
5140
5141                 /* Delay */
5142                 Term_xtra(TERM_XTRA_DELAY, msec);
5143
5144                 /* Note effect */
5145                 result = TRUE;
5146         }
5147
5148         if (result)
5149         {
5150                 chg_virtue(V_UNLIFE, -2);
5151                 chg_virtue(V_CHANCE, -1);
5152         }
5153
5154         return (result);
5155 }
5156
5157
5158
5159 /*
5160  * Probe nearby monsters
5161  */
5162 bool probing(void)
5163 {
5164         int     i, speed;
5165         int cu, cv;
5166         bool    probe = FALSE;
5167         char buf[256];
5168         cptr align;
5169
5170         cu = Term->scr->cu;
5171         cv = Term->scr->cv;
5172         Term->scr->cu = 0;
5173         Term->scr->cv = 1;
5174
5175         /* Probe all (nearby) monsters */
5176         for (i = 1; i < m_max; i++)
5177         {
5178                 monster_type *m_ptr = &m_list[i];
5179                 monster_race *r_ptr = &r_info[m_ptr->r_idx];
5180
5181                 /* Paranoia -- Skip dead monsters */
5182                 if (!m_ptr->r_idx) continue;
5183
5184                 /* Require line of sight */
5185                 if (!player_has_los_bold(m_ptr->fy, m_ptr->fx)) continue;
5186
5187                 /* Probe visible monsters */
5188                 if (m_ptr->ml)
5189                 {
5190                         char m_name[80];
5191
5192                         /* Start the message */
5193                         if (!probe)
5194                         {
5195 #ifdef JP
5196                                 msg_print("Ä´ººÃæ...");
5197 #else
5198                                 msg_print("Probing...");
5199 #endif
5200                         }
5201
5202                         msg_print(NULL);
5203
5204                         if (m_ptr->ap_r_idx != m_ptr->r_idx)
5205                         {
5206                                 if (m_ptr->mflag2 & MFLAG2_KAGE)
5207                                         m_ptr->mflag2 &= ~(MFLAG2_KAGE);
5208
5209                                 m_ptr->ap_r_idx = m_ptr->r_idx;
5210                                 lite_spot(m_ptr->fy, m_ptr->fx);
5211                         }
5212                         /* Get "the monster" or "something" */
5213                         monster_desc(m_name, m_ptr, MD_IGNORE_HALLU | MD_INDEF_HIDDEN);
5214
5215                         speed = m_ptr->mspeed - 110;
5216                         if(m_ptr->fast) speed += 10;
5217                         if(m_ptr->slow) speed -= 10;
5218
5219                         /* Get the monster's alignment */
5220 #ifdef JP
5221                         if ((r_ptr->flags3 & (RF3_EVIL | RF3_GOOD)) == (RF3_EVIL | RF3_GOOD)) align = "Á±°­";
5222                         else if (r_ptr->flags3 & RF3_EVIL) align = "¼Ù°­";
5223                         else if (r_ptr->flags3 & RF3_GOOD) align = "Á±ÎÉ";
5224                         else if ((m_ptr->sub_align & (SUB_ALIGN_EVIL | SUB_ALIGN_GOOD)) == (SUB_ALIGN_EVIL | SUB_ALIGN_GOOD)) align = "ÃæΩ(Á±°­)";
5225                         else if (m_ptr->sub_align & SUB_ALIGN_EVIL) align = "ÃæΩ(¼Ù°­)";
5226                         else if (m_ptr->sub_align & SUB_ALIGN_GOOD) align = "ÃæΩ(Á±ÎÉ)";
5227                         else align = "ÃæΩ";
5228 #else
5229                         if ((r_ptr->flags3 & (RF3_EVIL | RF3_GOOD)) == (RF3_EVIL | RF3_GOOD)) align = "good&evil";
5230                         else if (r_ptr->flags3 & RF3_EVIL) align = "evil";
5231                         else if (r_ptr->flags3 & RF3_GOOD) align = "good";
5232                         else if ((m_ptr->sub_align & (SUB_ALIGN_EVIL | SUB_ALIGN_GOOD)) == (SUB_ALIGN_EVIL | SUB_ALIGN_GOOD)) align = "neutral(good&evil)";
5233                         else if (m_ptr->sub_align & SUB_ALIGN_EVIL) align = "neutral(evil)";
5234                         else if (m_ptr->sub_align & SUB_ALIGN_GOOD) align = "neutral(good)";
5235                         else align = "neutral";
5236 #endif
5237
5238                         /* Describe the monster */
5239 #ifdef JP
5240 sprintf(buf,"%s ... Â°À­:%s HP:%d/%d AC:%d Â®ÅÙ:%s%d ·Ð¸³:", m_name, align, m_ptr->hp, m_ptr->maxhp, r_ptr->ac, (speed > 0) ? "+" : "", speed);
5241 #else
5242 sprintf(buf, "%s ... align:%s HP:%d/%d AC:%d speed:%s%d exp:", m_name, align, m_ptr->hp, m_ptr->maxhp, r_ptr->ac, (speed > 0) ? "+" : "", speed);
5243 #endif
5244                         if (r_ptr->next_r_idx)
5245                         {
5246                                 strcat(buf, format("%d/%d ", m_ptr->exp, r_ptr->next_exp));
5247                         }
5248                         else
5249                         {
5250                                 strcat(buf, "xxx ");
5251                         }
5252
5253 #ifdef JP
5254                         if (m_ptr->csleep) strcat(buf,"¿ç̲ ");
5255                         if (m_ptr->stunned) strcat(buf,"ۯ۰ ");
5256                         if (m_ptr->monfear) strcat(buf,"¶²ÉÝ ");
5257                         if (m_ptr->confused) strcat(buf,"º®Íð ");
5258                         if (m_ptr->invulner) strcat(buf,"̵Ũ ");
5259 #else
5260                         if (m_ptr->csleep) strcat(buf,"sleeping ");
5261                         if (m_ptr->stunned) strcat(buf,"stunned ");
5262                         if (m_ptr->monfear) strcat(buf,"scared ");
5263                         if (m_ptr->confused) strcat(buf,"confused ");
5264                         if (m_ptr->invulner) strcat(buf,"invulnerable ");
5265 #endif
5266                         buf[strlen(buf)-1] = '\0';
5267                         prt(buf,0,0);
5268
5269                         /* HACK : Add the line to message buffer */
5270                         message_add(buf);
5271                         p_ptr->window |= (PW_MESSAGE);
5272                         window_stuff();
5273
5274                         if (m_ptr->ml) move_cursor_relative(m_ptr->fy, m_ptr->fx);
5275                         inkey();
5276
5277                         Term_erase(0, 0, 255);
5278
5279                         /* Learn everything about this monster */
5280                         if (lore_do_probe(m_ptr->r_idx))
5281                         {
5282                                 char buf[80];
5283
5284                                 /* Get base name of monster */
5285                                 strcpy(buf, (r_name + r_ptr->name));
5286
5287 #ifdef JP
5288                                 /* Note that we learnt some new flags  -Mogami- */
5289                                 msg_format("%s¤Ë¤Ä¤¤¤Æ¤µ¤é¤Ë¾Ü¤·¤¯¤Ê¤Ã¤¿µ¤¤¬¤¹¤ë¡£", buf);
5290 #else
5291                                 /* Pluralize it */
5292                                 plural_aux(buf);
5293
5294                                 /* Note that we learnt some new flags  -Mogami- */
5295                                 msg_format("You now know more about %s.", buf);
5296 #endif
5297                                 /* Clear -more- prompt */
5298                                 msg_print(NULL);
5299                         }
5300
5301                         /* Probe worked */
5302                         probe = TRUE;
5303                 }
5304         }
5305
5306         Term->scr->cu = cu;
5307         Term->scr->cv = cv;
5308         Term_fresh();
5309
5310         /* Done */
5311         if (probe)
5312         {
5313                 chg_virtue(V_KNOWLEDGE, 1);
5314
5315 #ifdef JP
5316 msg_print("¤³¤ì¤ÇÁ´Éô¤Ç¤¹¡£");
5317 #else
5318                 msg_print("That's all.");
5319 #endif
5320
5321         }
5322
5323         /* Result */
5324         return (probe);
5325 }
5326
5327
5328
5329 /*
5330  * The spell of destruction
5331  *
5332  * This spell "deletes" monsters (instead of "killing" them).
5333  *
5334  * Later we may use one function for both "destruction" and
5335  * "earthquake" by using the "full" to select "destruction".
5336  */
5337 bool destroy_area(int y1, int x1, int r, bool in_generate)
5338 {
5339         int       y, x, k, t;
5340         cave_type *c_ptr;
5341         bool      flag = FALSE;
5342
5343         /* Prevent destruction of quest levels and town */
5344         if ((p_ptr->inside_quest && is_fixed_quest_idx(p_ptr->inside_quest)) || !dun_level)
5345         {
5346                 return (FALSE);
5347         }
5348
5349         /* Big area of affect */
5350         for (y = (y1 - r); y <= (y1 + r); y++)
5351         {
5352                 for (x = (x1 - r); x <= (x1 + r); x++)
5353                 {
5354                         /* Skip illegal grids */
5355                         if (!in_bounds(y, x)) continue;
5356
5357                         /* Extract the distance */
5358                         k = distance(y1, x1, y, x);
5359
5360                         /* Stay in the circle of death */
5361                         if (k > r) continue;
5362
5363                         /* Access the grid */
5364                         c_ptr = &cave[y][x];
5365
5366                         /* Lose room and vault */
5367                         c_ptr->info &= ~(CAVE_ROOM | CAVE_ICKY);
5368
5369                         /* Lose light and knowledge */
5370                         c_ptr->info &= ~(CAVE_MARK | CAVE_GLOW);
5371
5372                         if (!in_generate) /* Normal */
5373                         {
5374                                 /* Lose unsafety and runes/mirrors */
5375                                 c_ptr->info &= ~(CAVE_UNSAFE | CAVE_OBJECT);
5376
5377                                 /* Hack -- Notice player affect */
5378                                 if (player_bold(y, x))
5379                                 {
5380                                         /* Hurt the player later */
5381                                         flag = TRUE;
5382
5383                                         /* Do not hurt this grid */
5384                                         continue;
5385                                 }
5386                         }
5387
5388                         /* Hack -- Skip the epicenter */
5389                         if ((y == y1) && (x == x1)) continue;
5390
5391                         if (c_ptr->m_idx)
5392                         {
5393                                 monster_type *m_ptr = &m_list[c_ptr->m_idx];
5394                                 monster_race *r_ptr = &r_info[m_ptr->r_idx];
5395
5396                                 if (in_generate) /* In generation */
5397                                 {
5398                                         /* Delete the monster (if any) */
5399                                         delete_monster(y, x);
5400                                 }
5401                                 else if (r_ptr->flags1 & RF1_QUESTOR)
5402                                 {
5403                                         /* Heal the monster */
5404                                         m_ptr->hp = m_ptr->maxhp;
5405
5406                                         /* Try to teleport away quest monsters */
5407                                         if (!teleport_away(c_ptr->m_idx, (r * 2) + 1, TRUE)) continue;
5408                                 }
5409                                 else
5410                                 {
5411                                         if (record_named_pet && is_pet(m_ptr) && m_ptr->nickname)
5412                                         {
5413                                                 char m_name[80];
5414
5415                                                 monster_desc(m_name, m_ptr, MD_INDEF_VISIBLE);
5416                                                 do_cmd_write_nikki(NIKKI_NAMED_PET, 6, m_name);
5417                                         }
5418
5419                                         /* Delete the monster (if any) */
5420                                         delete_monster(y, x);
5421                                 }
5422                         }
5423
5424                         /* During generation, destroyed artifacts are "preserved" */
5425                         if (preserve_mode || in_generate)
5426                         {
5427                                 s16b this_o_idx, next_o_idx = 0;
5428
5429                                 /* Scan all objects in the grid */
5430                                 for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
5431                                 {
5432                                         object_type *o_ptr;
5433
5434                                         /* Acquire object */
5435                                         o_ptr = &o_list[this_o_idx];
5436
5437                                         /* Acquire next object */
5438                                         next_o_idx = o_ptr->next_o_idx;
5439
5440                                         /* Hack -- Preserve unknown artifacts */
5441                                         if (artifact_p(o_ptr) && (!object_known_p(o_ptr) || in_generate))
5442                                         {
5443                                                 /* Mega-Hack -- Preserve the artifact */
5444                                                 a_info[o_ptr->name1].cur_num = 0;
5445
5446                                                 if (in_generate && cheat_peek)
5447                                                 {
5448                                                         char o_name[MAX_NLEN];
5449                                                         object_desc_store(o_name, o_ptr, FALSE, 0);
5450 #ifdef JP
5451                                                         msg_format("ÅÁÀâ¤Î¥¢¥¤¥Æ¥à (%s) ¤ÏÀ¸À®Ãæ¤Ë*Ç˲õ*¤µ¤ì¤¿¡£", o_name);
5452 #else
5453                                                         msg_format("Artifact (%s) was *destroyed* during generation.", o_name);
5454 #endif
5455                                                 }
5456                                         }
5457                                         else if (in_generate && cheat_peek && o_ptr->art_name)
5458                                         {
5459 #ifdef JP
5460                                                 msg_print("¥é¥ó¥À¥à¡¦¥¢¡¼¥Æ¥£¥Õ¥¡¥¯¥È¤Î1¤Ä¤ÏÀ¸À®Ãæ¤Ë*Ç˲õ*¤µ¤ì¤¿¡£");
5461 #else
5462                                                 msg_print("One of the random artifacts was *destroyed* during generation.");
5463 #endif
5464                                         }
5465                                 }
5466                         }
5467
5468                         /* Delete objects */
5469                         delete_object(y, x);
5470
5471                         /* Destroy "non-permanent" grids */
5472                         if (!cave_perma_bold(y, x))
5473                         {
5474                                 /* Wall (or floor) type */
5475                                 t = randint0(200);
5476
5477                                 if (!in_generate) /* Normal */
5478                                 {
5479                                         if (t < 20)
5480                                         {
5481                                                 /* Create granite wall */
5482                                                 cave_set_feat(y, x, FEAT_WALL_EXTRA);
5483                                         }
5484                                         else if (t < 70)
5485                                         {
5486                                                 /* Create quartz vein */
5487                                                 cave_set_feat(y, x, FEAT_QUARTZ);
5488                                         }
5489                                         else if (t < 100)
5490                                         {
5491                                                 /* Create magma vein */
5492                                                 cave_set_feat(y, x, FEAT_MAGMA);
5493                                         }
5494                                         else
5495                                         {
5496                                                 /* Create floor */
5497                                                 cave_set_feat(y, x, floor_type[randint0(100)]);
5498                                         }
5499                                 }
5500                                 else /* In generation */
5501                                 {
5502                                         if (t < 20)
5503                                         {
5504                                                 /* Create granite wall */
5505                                                 place_extra_grid(c_ptr);
5506                                         }
5507                                         else if (t < 70)
5508                                         {
5509                                                 /* Create quartz vein */
5510                                                 c_ptr->feat = FEAT_QUARTZ;
5511                                         }
5512                                         else if (t < 100)
5513                                         {
5514                                                 /* Create magma vein */
5515                                                 c_ptr->feat = FEAT_MAGMA;
5516                                         }
5517                                         else
5518                                         {
5519                                                 /* Create floor */
5520                                                 place_floor_grid(c_ptr);
5521                                         }
5522
5523                                         /* Clear garbage of hidden trap or door */
5524                                         c_ptr->mimic = 0;
5525                                 }
5526                         }
5527                 }
5528         }
5529
5530
5531         if (!in_generate)
5532         {
5533                 /* Hack -- Affect player */
5534                 if (flag)
5535                 {
5536                         /* Message */
5537 #ifdef JP
5538                         msg_print("dz¤¨¤ë¤è¤¦¤ÊÁ®¸÷¤¬È¯À¸¤·¤¿¡ª");
5539 #else
5540                         msg_print("There is a searing blast of light!");
5541 #endif
5542
5543                         /* Blind the player */
5544                         if (!p_ptr->resist_blind && !p_ptr->resist_lite)
5545                         {
5546                                 /* Become blind */
5547                                 (void)set_blind(p_ptr->blind + 10 + randint1(10));
5548                         }
5549                 }
5550
5551                 forget_flow();
5552
5553                 /* Mega-Hack -- Forget the view and lite */
5554                 p_ptr->update |= (PU_UN_VIEW | PU_UN_LITE);
5555
5556                 /* Update stuff */
5557                 p_ptr->update |= (PU_VIEW | PU_LITE | PU_FLOW | PU_MON_LITE);
5558
5559                 /* Update the monsters */
5560                 p_ptr->update |= (PU_MONSTERS);
5561
5562                 /* Redraw map */
5563                 p_ptr->redraw |= (PR_MAP);
5564
5565                 /* Window stuff */
5566                 p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
5567         }
5568
5569         /* Success */
5570         return (TRUE);
5571 }
5572
5573
5574 /*
5575  * Induce an "earthquake" of the given radius at the given location.
5576  *
5577  * This will turn some walls into floors and some floors into walls.
5578  *
5579  * The player will take damage and "jump" into a safe grid if possible,
5580  * otherwise, he will "tunnel" through the rubble instantaneously.
5581  *
5582  * Monsters will take damage, and "jump" into a safe grid if possible,
5583  * otherwise they will be "buried" in the rubble, disappearing from
5584  * the level in the same way that they do when genocided.
5585  *
5586  * Note that thus the player and monsters (except eaters of walls and
5587  * passers through walls) will never occupy the same grid as a wall.
5588  * Note that as of now (2.7.8) no monster may occupy a "wall" grid, even
5589  * for a single turn, unless that monster can pass_walls or kill_walls.
5590  * This has allowed massive simplification of the "monster" code.
5591  */
5592 bool earthquake(int cy, int cx, int r)
5593 {
5594         int             i, t, y, x, yy, xx, dy, dx, oy, ox;
5595         int             damage = 0;
5596         int             sn = 0, sy = 0, sx = 0;
5597         bool            hurt = FALSE;
5598         cave_type       *c_ptr;
5599         bool            map[32][32];
5600
5601
5602         /* Prevent destruction of quest levels and town */
5603         if ((p_ptr->inside_quest && is_fixed_quest_idx(p_ptr->inside_quest)) || !dun_level)
5604         {
5605                 return (FALSE);
5606         }
5607
5608         /* Paranoia -- Enforce maximum range */
5609         if (r > 12) r = 12;
5610
5611         /* Clear the "maximal blast" area */
5612         for (y = 0; y < 32; y++)
5613         {
5614                 for (x = 0; x < 32; x++)
5615                 {
5616                         map[y][x] = FALSE;
5617                 }
5618         }
5619
5620         /* Check around the epicenter */
5621         for (dy = -r; dy <= r; dy++)
5622         {
5623                 for (dx = -r; dx <= r; dx++)
5624                 {
5625                         /* Extract the location */
5626                         yy = cy + dy;
5627                         xx = cx + dx;
5628
5629                         /* Skip illegal grids */
5630                         if (!in_bounds(yy, xx)) continue;
5631
5632                         /* Skip distant grids */
5633                         if (distance(cy, cx, yy, xx) > r) continue;
5634
5635                         /* Access the grid */
5636                         c_ptr = &cave[yy][xx];
5637
5638                         /* Lose room and vault */
5639                         c_ptr->info &= ~(CAVE_ROOM | CAVE_ICKY | CAVE_UNSAFE);
5640
5641                         /* Lose light and knowledge */
5642                         c_ptr->info &= ~(CAVE_GLOW | CAVE_MARK);
5643
5644                         /* Skip the epicenter */
5645                         if (!dx && !dy) continue;
5646
5647                         /* Skip most grids */
5648                         if (randint0(100) < 85) continue;
5649
5650                         /* Damage this grid */
5651                         map[16+yy-cy][16+xx-cx] = TRUE;
5652
5653                         /* Hack -- Take note of player damage */
5654                         if (player_bold(yy, xx)) hurt = TRUE;
5655                 }
5656         }
5657
5658         /* First, affect the player (if necessary) */
5659         if (hurt && !prace_is_(RACE_SPECTRE) && !p_ptr->wraith_form && !p_ptr->kabenuke)
5660         {
5661                 /* Check around the player */
5662                 for (i = 0; i < 8; i++)
5663                 {
5664                         /* Access the location */
5665                         y = py + ddy_ddd[i];
5666                         x = px + ddx_ddd[i];
5667
5668                         /* Skip non-empty grids */
5669                         if (!cave_empty_bold(y, x)) continue;
5670
5671                         /* Important -- Skip "quake" grids */
5672                         if (map[16+y-cy][16+x-cx]) continue;
5673
5674                         if (cave[y][x].m_idx) continue;
5675
5676                         /* Count "safe" grids */
5677                         sn++;
5678
5679                         /* Randomize choice */
5680                         if (randint0(sn) > 0) continue;
5681
5682                         /* Save the safe location */
5683                         sy = y; sx = x;
5684                 }
5685
5686                 /* Random message */
5687                 switch (randint1(3))
5688                 {
5689                         case 1:
5690                         {
5691 #ifdef JP
5692 msg_print("¥À¥ó¥¸¥ç¥ó¤ÎÊɤ¬Êø¤ì¤¿¡ª");
5693 #else
5694                                 msg_print("The cave ceiling collapses!");
5695 #endif
5696
5697                                 break;
5698                         }
5699                         case 2:
5700                         {
5701 #ifdef JP
5702 msg_print("¥À¥ó¥¸¥ç¥ó¤Î¾²¤¬ÉÔ¼«Á³¤Ë¤Í¤¸¶Ê¤¬¤Ã¤¿¡ª");
5703 #else
5704                                 msg_print("The cave floor twists in an unnatural way!");
5705 #endif
5706
5707                                 break;
5708                         }
5709                         default:
5710                         {
5711 #ifdef JP
5712 msg_print("¥À¥ó¥¸¥ç¥ó¤¬Íɤ줿¡ªÊø¤ì¤¿´ä¤¬Æ¬¤Ë¹ß¤Ã¤Æ¤­¤¿¡ª");
5713 #else
5714                                 msg_print("The cave quakes!  You are pummeled with debris!");
5715 #endif
5716
5717                                 break;
5718                         }
5719                 }
5720
5721                 /* Hurt the player a lot */
5722                 if (!sn)
5723                 {
5724                         /* Message and damage */
5725 #ifdef JP
5726 msg_print("¤¢¤Ê¤¿¤Ï¤Ò¤É¤¤²ø²æ¤òÉé¤Ã¤¿¡ª");
5727 #else
5728                         msg_print("You are severely crushed!");
5729 #endif
5730
5731                         damage = 200;
5732                 }
5733
5734                 /* Destroy the grid, and push the player to safety */
5735                 else
5736                 {
5737                         /* Calculate results */
5738                         switch (randint1(3))
5739                         {
5740                                 case 1:
5741                                 {
5742 #ifdef JP
5743 msg_print("¹ß¤êÃí¤°´ä¤ò¤¦¤Þ¤¯Èò¤±¤¿¡ª");
5744 #else
5745                                         msg_print("You nimbly dodge the blast!");
5746 #endif
5747
5748                                         damage = 0;
5749                                         break;
5750                                 }
5751                                 case 2:
5752                                 {
5753 #ifdef JP
5754 msg_print("´äÀФ¬¤¢¤Ê¤¿¤Ëľ·â¤·¤¿!");
5755 #else
5756                                         msg_print("You are bashed by rubble!");
5757 #endif
5758
5759                                         damage = damroll(10, 4);
5760                                         (void)set_stun(p_ptr->stun + randint1(50));
5761                                         break;
5762                                 }
5763                                 case 3:
5764                                 {
5765 #ifdef JP
5766 msg_print("¤¢¤Ê¤¿¤Ï¾²¤ÈÊɤȤδ֤˶´¤Þ¤ì¤Æ¤·¤Þ¤Ã¤¿¡ª");
5767 #else
5768                                         msg_print("You are crushed between the floor and ceiling!");
5769 #endif
5770
5771                                         damage = damroll(10, 4);
5772                                         (void)set_stun(p_ptr->stun + randint1(50));
5773                                         break;
5774                                 }
5775                         }
5776
5777                         /* Save the old location */
5778                         oy = py;
5779                         ox = px;
5780
5781                         /* Move the player to the safe location */
5782                         py = sy;
5783                         px = sx;
5784
5785                         if (p_ptr->riding)
5786                         {
5787                                 cave[oy][ox].m_idx = cave[py][px].m_idx;
5788                                 cave[py][px].m_idx = p_ptr->riding;
5789                                 m_list[p_ptr->riding].fy = py;
5790                                 m_list[p_ptr->riding].fx = px;
5791                                 update_mon(p_ptr->riding, TRUE);
5792                         }
5793
5794                         /* Redraw the old spot */
5795                         lite_spot(oy, ox);
5796
5797                         /* Redraw the new spot */
5798                         lite_spot(py, px);
5799
5800                         /* Check for new panel */
5801                         verify_panel();
5802                 }
5803
5804                 /* Important -- no wall on player */
5805                 map[16+py-cy][16+px-cx] = FALSE;
5806
5807                 /* Take some damage */
5808 #ifdef JP
5809 if (damage) take_hit(DAMAGE_ATTACK, damage, "ÃÏ¿Ì", -1);
5810 #else
5811                 if (damage) take_hit(DAMAGE_ATTACK, damage, "an earthquake", -1);
5812 #endif
5813
5814         }
5815
5816
5817         /* Examine the quaked region */
5818         for (dy = -r; dy <= r; dy++)
5819         {
5820                 for (dx = -r; dx <= r; dx++)
5821                 {
5822                         /* Extract the location */
5823                         yy = cy + dy;
5824                         xx = cx + dx;
5825
5826                         /* Skip unaffected grids */
5827                         if (!map[16+yy-cy][16+xx-cx]) continue;
5828
5829                         /* Access the grid */
5830                         c_ptr = &cave[yy][xx];
5831
5832                         if (c_ptr->m_idx == p_ptr->riding) continue;
5833
5834                         /* Process monsters */
5835                         if (c_ptr->m_idx)
5836                         {
5837                                 monster_type *m_ptr = &m_list[c_ptr->m_idx];
5838                                 monster_race *r_ptr = &r_info[m_ptr->r_idx];
5839
5840                                 /* Quest monsters */
5841                                 if (r_ptr->flags1 & RF1_QUESTOR)
5842                                 {
5843                                         /* No wall on quest monsters */
5844                                         map[16+yy-cy][16+xx-cx] = FALSE;
5845
5846                                         continue;
5847                                 }
5848
5849                                 /* Most monsters cannot co-exist with rock */
5850                                 if (!(r_ptr->flags2 & (RF2_KILL_WALL)) &&
5851                                     !(r_ptr->flags2 & (RF2_PASS_WALL)))
5852                                 {
5853                                         char m_name[80];
5854
5855                                         /* Assume not safe */
5856                                         sn = 0;
5857
5858                                         /* Monster can move to escape the wall */
5859                                         if (!(r_ptr->flags1 & (RF1_NEVER_MOVE)))
5860                                         {
5861                                                 /* Look for safety */
5862                                                 for (i = 0; i < 8; i++)
5863                                                 {
5864                                                         /* Access the grid */
5865                                                         y = yy + ddy_ddd[i];
5866                                                         x = xx + ddx_ddd[i];
5867
5868                                                         /* Skip non-empty grids */
5869                                                         if (!cave_empty_bold(y, x)) continue;
5870
5871                                                         /* Hack -- no safety on glyph of warding */
5872                                                         if (is_glyph_grid(&cave[y][x])) continue;
5873                                                         if (is_explosive_rune_grid(&cave[y][x])) continue;
5874
5875                                                         /* ... nor on the Pattern */
5876                                                         if ((cave[y][x].feat <= FEAT_PATTERN_XTRA2) &&
5877                                                             (cave[y][x].feat >= FEAT_PATTERN_START))
5878                                                                 continue;
5879
5880                                                         /* Important -- Skip "quake" grids */
5881                                                         if (map[16+y-cy][16+x-cx]) continue;
5882
5883                                                         if (cave[y][x].m_idx) continue;
5884                                                         if (player_bold(y, x)) continue;
5885
5886                                                         /* Count "safe" grids */
5887                                                         sn++;
5888
5889                                                         /* Randomize choice */
5890                                                         if (randint0(sn) > 0) continue;
5891
5892                                                         /* Save the safe grid */
5893                                                         sy = y; sx = x;
5894                                                 }
5895                                         }
5896
5897                                         /* Describe the monster */
5898                                         monster_desc(m_name, m_ptr, 0);
5899
5900                                         /* Scream in pain */
5901 #ifdef JP
5902 msg_format("%^s¤Ï¶ìÄˤǵ㤭¤ï¤á¤¤¤¿¡ª", m_name);
5903 #else
5904                                         msg_format("%^s wails out in pain!", m_name);
5905 #endif
5906
5907
5908                                         /* Take damage from the quake */
5909                                         damage = (sn ? damroll(4, 8) : (m_ptr->hp + 1));
5910
5911                                         /* Monster is certainly awake */
5912                                         m_ptr->csleep = 0;
5913
5914                                         /* Apply damage directly */
5915                                         m_ptr->hp -= damage;
5916
5917                                         /* Delete (not kill) "dead" monsters */
5918                                         if (m_ptr->hp < 0)
5919                                         {
5920                                                 /* Message */
5921 #ifdef JP
5922 msg_format("%^s¤Ï´äÀФËËä¤â¤ì¤Æ¤·¤Þ¤Ã¤¿¡ª", m_name);
5923 #else
5924                                                 msg_format("%^s is embedded in the rock!", m_name);
5925 #endif
5926
5927                                                 if (c_ptr->m_idx)
5928                                                 {
5929                                                         if (record_named_pet && is_pet(&m_list[c_ptr->m_idx]) && m_list[c_ptr->m_idx].nickname)
5930                                                         {
5931                                                                 char m2_name[80];
5932
5933                                                                 monster_desc(m2_name, m_ptr, MD_INDEF_VISIBLE);
5934                                                                 do_cmd_write_nikki(NIKKI_NAMED_PET, 7, m2_name);
5935                                                         }
5936                                                 }
5937
5938                                                 /* Delete the monster */
5939                                                 delete_monster(yy, xx);
5940
5941                                                 /* No longer safe */
5942                                                 sn = 0;
5943                                         }
5944
5945                                         /* Hack -- Escape from the rock */
5946                                         if (sn)
5947                                         {
5948                                                 int m_idx = cave[yy][xx].m_idx;
5949
5950                                                 /* Update the new location */
5951                                                 cave[sy][sx].m_idx = m_idx;
5952
5953                                                 /* Update the old location */
5954                                                 cave[yy][xx].m_idx = 0;
5955
5956                                                 /* Move the monster */
5957                                                 m_ptr->fy = sy;
5958                                                 m_ptr->fx = sx;
5959
5960                                                 /* Update the monster (new location) */
5961                                                 update_mon(m_idx, TRUE);
5962
5963                                                 /* Redraw the old grid */
5964                                                 lite_spot(yy, xx);
5965
5966                                                 /* Redraw the new grid */
5967                                                 lite_spot(sy, sx);
5968                                         }
5969                                 }
5970                         }
5971                 }
5972         }
5973
5974
5975         /* Examine the quaked region */
5976         for (dy = -r; dy <= r; dy++)
5977         {
5978                 for (dx = -r; dx <= r; dx++)
5979                 {
5980                         /* Extract the location */
5981                         yy = cy + dy;
5982                         xx = cx + dx;
5983
5984                         /* Skip unaffected grids */
5985                         if (!map[16+yy-cy][16+xx-cx]) continue;
5986
5987                         /* Access the cave grid */
5988                         c_ptr = &cave[yy][xx];
5989
5990                         /* Paranoia -- never affect player */
5991 /*                      if (player_bold(yy, xx)) continue; */
5992
5993                         /* Destroy location (if valid) */
5994                         if (cave_valid_bold(yy, xx))
5995                         {
5996                                 bool floor = cave_floor_bold(yy, xx);
5997
5998                                 /* Delete objects */
5999                                 delete_object(yy, xx);
6000
6001                                 /* Clear mirror, runes flag */
6002                                 c_ptr->info &= ~CAVE_OBJECT;
6003
6004                                 /* Wall (or floor) type */
6005                                 t = (floor ? randint0(100) : 200);
6006
6007                                 /* Granite */
6008                                 if (t < 20)
6009                                 {
6010                                         /* Create granite wall */
6011                                         cave_set_feat(yy, xx, FEAT_WALL_EXTRA);
6012                                 }
6013
6014                                 /* Quartz */
6015                                 else if (t < 70)
6016                                 {
6017                                         /* Create quartz vein */
6018                                         cave_set_feat(yy, xx, FEAT_QUARTZ);
6019                                 }
6020
6021                                 /* Magma */
6022                                 else if (t < 100)
6023                                 {
6024                                         /* Create magma vein */
6025                                         cave_set_feat(yy, xx, FEAT_MAGMA);
6026                                 }
6027
6028                                 /* Floor */
6029                                 else
6030                                 {
6031                                         /* Create floor */
6032                                         cave_set_feat(yy, xx, floor_type[randint0(100)]);
6033                                 }
6034                         }
6035                 }
6036         }
6037
6038
6039         /* Mega-Hack -- Forget the view and lite */
6040         p_ptr->update |= (PU_UN_VIEW | PU_UN_LITE);
6041
6042         /* Update stuff */
6043         p_ptr->update |= (PU_VIEW | PU_LITE | PU_FLOW | PU_MON_LITE);
6044
6045         /* Update the monsters */
6046         p_ptr->update |= (PU_DISTANCE);
6047
6048         /* Update the health bar */
6049         p_ptr->redraw |= (PR_HEALTH | PR_UHEALTH);
6050
6051         /* Redraw map */
6052         p_ptr->redraw |= (PR_MAP);
6053
6054         /* Window stuff */
6055         p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
6056
6057         /* Success */
6058         return (TRUE);
6059 }
6060
6061
6062 void discharge_minion(void)
6063 {
6064         int i;
6065         bool okay = TRUE;
6066
6067         for (i = 1; i < m_max; i++)
6068         {
6069                 monster_type *m_ptr = &m_list[i];
6070                 if (!m_ptr->r_idx || !is_pet(m_ptr)) continue;
6071                 if (m_ptr->nickname) okay = FALSE;
6072         }
6073         if (!okay || p_ptr->riding)
6074         {
6075 #ifdef JP
6076                 if (!get_check("ËÜÅö¤ËÁ´¥Ú¥Ã¥È¤òÇúÇˤ·¤Þ¤¹¤«¡©"))
6077 #else
6078                 if (!get_check("You will blast all pets. Are you sure? "))
6079 #endif
6080                         return;
6081         }
6082         for (i = 1; i < m_max; i++)
6083         {
6084                 int dam;
6085                 monster_type *m_ptr = &m_list[i];
6086                 monster_race *r_ptr;
6087
6088                 if (!m_ptr->r_idx || !is_pet(m_ptr)) continue;
6089                 r_ptr = &r_info[m_ptr->r_idx];
6090
6091                 /* Uniques resist discharging */
6092                 if (r_ptr->flags1 & RF1_UNIQUE)
6093                 {
6094                         char m_name[80];
6095                         monster_desc(m_name, m_ptr, 0x00);
6096 #ifdef JP
6097                         msg_format("%s¤ÏÇúÇˤµ¤ì¤ë¤Î¤ò·ù¤¬¤ê¡¢¾¡¼ê¤Ë¼«Ê¬¤ÎÀ¤³¦¤Ø¤Èµ¢¤Ã¤¿¡£", m_name);
6098 #else
6099                         msg_format("%^s resists to be blasted, and run away.", m_name);
6100 #endif
6101                         delete_monster_idx(i);
6102                         continue;
6103                 }
6104                 dam = m_ptr->maxhp / 2;
6105                 if (dam > 100) dam = (dam-100)/2 + 100;
6106                 if (dam > 400) dam = (dam-400)/2 + 400;
6107                 if (dam > 800) dam = 800;
6108                 project(i, 2+(r_ptr->level/20), m_ptr->fy,
6109                         m_ptr->fx, dam, GF_PLASMA, 
6110                         PROJECT_STOP | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL, -1);
6111                 delete_monster_idx(i);
6112         }
6113 }
6114
6115
6116 /*
6117  * This routine clears the entire "temp" set.
6118  *
6119  * This routine will Perma-Lite all "temp" grids.
6120  *
6121  * This routine is used (only) by "lite_room()"
6122  *
6123  * Dark grids are illuminated.
6124  *
6125  * Also, process all affected monsters.
6126  *
6127  * SMART monsters always wake up when illuminated
6128  * NORMAL monsters wake up 1/4 the time when illuminated
6129  * STUPID monsters wake up 1/10 the time when illuminated
6130  */
6131 static void cave_temp_room_lite(void)
6132 {
6133         int i;
6134
6135         /* Clear them all */
6136         for (i = 0; i < temp_n; i++)
6137         {
6138                 int y = temp_y[i];
6139                 int x = temp_x[i];
6140
6141                 cave_type *c_ptr = &cave[y][x];
6142
6143                 /* No longer in the array */
6144                 c_ptr->info &= ~(CAVE_TEMP);
6145
6146                 /* Update only non-CAVE_GLOW grids */
6147                 /* if (c_ptr->info & (CAVE_GLOW)) continue; */
6148
6149                 /* Perma-Lite */
6150                 c_ptr->info |= (CAVE_GLOW);
6151
6152                 /* Process affected monsters */
6153                 if (c_ptr->m_idx)
6154                 {
6155                         int chance = 25;
6156
6157                         monster_type    *m_ptr = &m_list[c_ptr->m_idx];
6158
6159                         monster_race    *r_ptr = &r_info[m_ptr->r_idx];
6160
6161                         /* Update the monster */
6162                         update_mon(c_ptr->m_idx, FALSE);
6163
6164                         /* Stupid monsters rarely wake up */
6165                         if (r_ptr->flags2 & (RF2_STUPID)) chance = 10;
6166
6167                         /* Smart monsters always wake up */
6168                         if (r_ptr->flags2 & (RF2_SMART)) chance = 100;
6169
6170                         /* Sometimes monsters wake up */
6171                         if (m_ptr->csleep && (randint0(100) < chance))
6172                         {
6173                                 /* Wake up! */
6174                                 m_ptr->csleep = 0;
6175
6176                                 if (r_ptr->flags7 & RF7_HAS_LD_MASK) p_ptr->update |= (PU_MON_LITE);
6177
6178                                 /* Notice the "waking up" */
6179                                 if (m_ptr->ml)
6180                                 {
6181                                         char m_name[80];
6182
6183                                         /* Acquire the monster name */
6184                                         monster_desc(m_name, m_ptr, 0);
6185
6186                                         /* Dump a message */
6187 #ifdef JP
6188 msg_format("%^s¤¬Ìܤò³Ð¤Þ¤·¤¿¡£", m_name);
6189 #else
6190                                         msg_format("%^s wakes up.", m_name);
6191 #endif
6192                                         /* Redraw the health bar */
6193                                         if (p_ptr->health_who == c_ptr->m_idx)
6194                                                 p_ptr->redraw |= (PR_HEALTH);
6195
6196                                 }
6197                         }
6198                 }
6199
6200                 /* Note */
6201                 note_spot(y, x);
6202
6203                 /* Redraw */
6204                 lite_spot(y, x);
6205         }
6206
6207         /* None left */
6208         temp_n = 0;
6209 }
6210
6211
6212
6213 /*
6214  * This routine clears the entire "temp" set.
6215  *
6216  * This routine will "darken" all "temp" grids.
6217  *
6218  * In addition, some of these grids will be "unmarked".
6219  *
6220  * This routine is used (only) by "unlite_room()"
6221  *
6222  * Also, process all affected monsters
6223  */
6224 static void cave_temp_room_unlite(void)
6225 {
6226         int i;
6227
6228         /* Clear them all */
6229         for (i = 0; i < temp_n; i++)
6230         {
6231                 int y = temp_y[i];
6232                 int x = temp_x[i];
6233
6234                 cave_type *c_ptr = &cave[y][x];
6235
6236                 /* No longer in the array */
6237                 c_ptr->info &= ~(CAVE_TEMP);
6238
6239                 /* Darken the grid */
6240                 if (!is_mirror_grid(c_ptr)) c_ptr->info &= ~(CAVE_GLOW);
6241
6242                 /* Hack -- Forget "boring" grids */
6243                 if ((c_ptr->feat <= FEAT_INVIS) || (c_ptr->feat == FEAT_DIRT) || (c_ptr->feat == FEAT_GRASS))
6244                 {
6245                         /* Forget the grid */
6246                         if (!view_torch_grids) c_ptr->info &= ~(CAVE_MARK);
6247
6248                         /* Notice */
6249                         note_spot(y, x);
6250                 }
6251
6252                 /* Process affected monsters */
6253                 if (c_ptr->m_idx)
6254                 {
6255                         /* Update the monster */
6256                         update_mon(c_ptr->m_idx, FALSE);
6257                 }
6258
6259                 /* Redraw */
6260                 lite_spot(y, x);
6261         }
6262
6263         /* None left */
6264         temp_n = 0;
6265 }
6266
6267
6268
6269 /*
6270  * Determine how much contiguous open space this grid is next to
6271  */
6272 static int next_to_open(int cy, int cx)
6273 {
6274         int i;
6275
6276         int y, x;
6277
6278         int len = 0;
6279         int blen = 0;
6280
6281         for (i = 0; i < 16; i++)
6282         {
6283                 y = cy + ddy_cdd[i % 8];
6284                 x = cx + ddx_cdd[i % 8];
6285
6286                 /* Found a wall, break the length */
6287                 if (!cave_floor_bold(y, x))
6288                 {
6289                         /* Track best length */
6290                         if (len > blen)
6291                         {
6292                                 blen = len;
6293                         }
6294
6295                         len = 0;
6296                 }
6297                 else
6298                 {
6299                         len++;
6300                 }
6301         }
6302
6303         return (MAX(len, blen));
6304 }
6305
6306
6307 static int next_to_walls_adj(int cy, int cx)
6308 {
6309         int i;
6310
6311         int y, x;
6312
6313         int c = 0;
6314
6315         for (i = 0; i < 8; i++)
6316         {
6317                 y = cy + ddy_ddd[i];
6318                 x = cx + ddx_ddd[i];
6319
6320                 if (!cave_floor_bold(y, x)) c++;
6321         }
6322
6323         return c;
6324 }
6325
6326
6327 /*
6328  * Aux function -- see below
6329  */
6330 static void cave_temp_room_aux(int y, int x, bool only_room)
6331 {
6332         cave_type *c_ptr;
6333
6334         /* Get the grid */
6335         c_ptr = &cave[y][x];
6336
6337         /* Avoid infinite recursion */
6338         if (c_ptr->info & (CAVE_TEMP)) return;
6339
6340         /* Do not "leave" the current room */
6341         if (!(c_ptr->info & (CAVE_ROOM)))
6342         {
6343                 if (only_room) return;
6344
6345                 /* Verify */
6346                 if (!in_bounds2(y, x)) return;
6347
6348                 /* Do not exceed the maximum spell range */
6349                 if (distance(py, px, y, x) > MAX_RANGE) return;
6350
6351                 /* Verify this grid */
6352                 /*
6353                  * The reason why it is ==6 instead of >5 is that 8 is impossible
6354                  * due to the check for cave_bold above.
6355                  * 7 lights dead-end corridors (you need to do this for the
6356                  * checkboard interesting rooms, so that the boundary is lit
6357                  * properly.
6358                  * This leaves only a check for 6 bounding walls!
6359                  */
6360                 if (in_bounds(y, x) && cave_floor_bold(y, x) &&
6361                     (next_to_walls_adj(y, x) == 6) && (next_to_open(y, x) <= 1)) return;
6362         }
6363
6364         /* Paranoia -- verify space */
6365         if (temp_n == TEMP_MAX) return;
6366
6367         /* Mark the grid as "seen" */
6368         c_ptr->info |= (CAVE_TEMP);
6369
6370         /* Add it to the "seen" set */
6371         temp_y[temp_n] = y;
6372         temp_x[temp_n] = x;
6373         temp_n++;
6374 }
6375
6376 /*
6377  * Aux function -- see below
6378  */
6379 static void cave_temp_lite_room_aux(int y, int x)
6380 {
6381         cave_temp_room_aux(y, x, FALSE);
6382 }
6383
6384 /*
6385  * Aux function -- see below
6386  */
6387 static void cave_temp_unlite_room_aux(int y, int x)
6388 {
6389         cave_temp_room_aux(y, x, TRUE);
6390 }
6391
6392
6393
6394
6395 /*
6396  * Illuminate any room containing the given location.
6397  */
6398 void lite_room(int y1, int x1)
6399 {
6400         int i, x, y;
6401
6402         /* Add the initial grid */
6403         cave_temp_lite_room_aux(y1, x1);
6404
6405         /* While grids are in the queue, add their neighbors */
6406         for (i = 0; i < temp_n; i++)
6407         {
6408                 x = temp_x[i], y = temp_y[i];
6409
6410                 /* Walls get lit, but stop light */
6411                 if (!cave_floor_bold(y, x)) continue;
6412
6413                 /* Spread adjacent */
6414                 cave_temp_lite_room_aux(y + 1, x);
6415                 cave_temp_lite_room_aux(y - 1, x);
6416                 cave_temp_lite_room_aux(y, x + 1);
6417                 cave_temp_lite_room_aux(y, x - 1);
6418
6419                 /* Spread diagonal */
6420                 cave_temp_lite_room_aux(y + 1, x + 1);
6421                 cave_temp_lite_room_aux(y - 1, x - 1);
6422                 cave_temp_lite_room_aux(y - 1, x + 1);
6423                 cave_temp_lite_room_aux(y + 1, x - 1);
6424         }
6425
6426         /* Now, lite them all up at once */
6427         cave_temp_room_lite();
6428 }
6429
6430
6431 /*
6432  * Darken all rooms containing the given location
6433  */
6434 void unlite_room(int y1, int x1)
6435 {
6436         int i, x, y;
6437
6438         /* Add the initial grid */
6439         cave_temp_unlite_room_aux(y1, x1);
6440
6441         /* Spread, breadth first */
6442         for (i = 0; i < temp_n; i++)
6443         {
6444                 x = temp_x[i], y = temp_y[i];
6445
6446                 /* Walls get dark, but stop darkness */
6447                 if (!cave_floor_bold(y, x)) continue;
6448
6449                 /* Spread adjacent */
6450                 cave_temp_unlite_room_aux(y + 1, x);
6451                 cave_temp_unlite_room_aux(y - 1, x);
6452                 cave_temp_unlite_room_aux(y, x + 1);
6453                 cave_temp_unlite_room_aux(y, x - 1);
6454
6455                 /* Spread diagonal */
6456                 cave_temp_unlite_room_aux(y + 1, x + 1);
6457                 cave_temp_unlite_room_aux(y - 1, x - 1);
6458                 cave_temp_unlite_room_aux(y - 1, x + 1);
6459                 cave_temp_unlite_room_aux(y + 1, x - 1);
6460         }
6461
6462         /* Now, darken them all at once */
6463         cave_temp_room_unlite();
6464 }
6465
6466
6467
6468 /*
6469  * Hack -- call light around the player
6470  * Affect all monsters in the projection radius
6471  */
6472 bool lite_area(int dam, int rad)
6473 {
6474         int flg = PROJECT_GRID | PROJECT_KILL;
6475
6476         if (d_info[dungeon_type].flags1 & DF1_DARKNESS)
6477         {
6478 #ifdef JP
6479                 msg_print("¥À¥ó¥¸¥ç¥ó¤¬¸÷¤òµÛ¼ý¤·¤¿¡£");
6480 #else
6481                 msg_print("The darkness of this dungeon absorb your light.");
6482 #endif
6483                 return FALSE;
6484         }
6485
6486         /* Hack -- Message */
6487         if (!p_ptr->blind)
6488         {
6489 #ifdef JP
6490 msg_print("Çò¤¤¸÷¤¬ÊÕ¤ê¤òʤ¤Ã¤¿¡£");
6491 #else
6492                 msg_print("You are surrounded by a white light.");
6493 #endif
6494
6495         }
6496
6497         /* Hook into the "project()" function */
6498         (void)project(0, rad, py, px, dam, GF_LITE_WEAK, flg, -1);
6499
6500         /* Lite up the room */
6501         lite_room(py, px);
6502
6503         if (p_ptr->special_defense & NINJA_S_STEALTH)
6504         {
6505                 set_superstealth(FALSE);
6506         }
6507
6508         /* Assume seen */
6509         return (TRUE);
6510 }
6511
6512
6513 /*
6514  * Hack -- call darkness around the player
6515  * Affect all monsters in the projection radius
6516  */
6517 bool unlite_area(int dam, int rad)
6518 {
6519         int flg = PROJECT_GRID | PROJECT_KILL;
6520
6521         /* Hack -- Message */
6522         if (!p_ptr->blind)
6523         {
6524 #ifdef JP
6525 msg_print("°Å°Ç¤¬ÊÕ¤ê¤òʤ¤Ã¤¿¡£");
6526 #else
6527                 msg_print("Darkness surrounds you.");
6528 #endif
6529
6530         }
6531
6532         /* Hook into the "project()" function */
6533         (void)project(0, rad, py, px, dam, GF_DARK_WEAK, flg, -1);
6534
6535         /* Lite up the room */
6536         unlite_room(py, px);
6537
6538         /* Assume seen */
6539         return (TRUE);
6540 }
6541
6542
6543
6544 /*
6545  * Cast a ball spell
6546  * Stop if we hit a monster, act as a "ball"
6547  * Allow "target" mode to pass over monsters
6548  * Affect grids, objects, and monsters
6549  */
6550 bool fire_ball(int typ, int dir, int dam, int rad)
6551 {
6552         int tx, ty;
6553
6554         int flg = PROJECT_STOP | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL;
6555
6556         if (typ == GF_CONTROL_LIVING) flg|= PROJECT_HIDE;
6557         /* Use the given direction */
6558         tx = px + 99 * ddx[dir];
6559         ty = py + 99 * ddy[dir];
6560
6561         /* Hack -- Use an actual "target" */
6562         if ((dir == 5) && target_okay())
6563         {
6564                 flg &= ~(PROJECT_STOP);
6565                 tx = target_col;
6566                 ty = target_row;
6567         }
6568
6569         /* Analyze the "dir" and the "target".  Hurt items on floor. */
6570         return (project(0, rad, ty, tx, dam, typ, flg, -1));
6571 }
6572
6573
6574 /*
6575  * Cast a ball spell
6576  * Stop if we hit a monster, act as a "ball"
6577  * Allow "target" mode to pass over monsters
6578  * Affect grids, objects, and monsters
6579  */
6580 bool fire_rocket(int typ, int dir, int dam, int rad)
6581 {
6582         int tx, ty;
6583
6584         int flg = PROJECT_STOP | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL;
6585
6586         /* Use the given direction */
6587         tx = px + 99 * ddx[dir];
6588         ty = py + 99 * ddy[dir];
6589
6590         /* Hack -- Use an actual "target" */
6591         if ((dir == 5) && target_okay())
6592         {
6593                 tx = target_col;
6594                 ty = target_row;
6595         }
6596
6597         /* Analyze the "dir" and the "target".  Hurt items on floor. */
6598         return (project(0, rad, ty, tx, dam, typ, flg, -1));
6599 }
6600
6601
6602 /*
6603  * Cast a ball spell
6604  * Stop if we hit a monster, act as a "ball"
6605  * Allow "target" mode to pass over monsters
6606  * Affect grids, objects, and monsters
6607  */
6608 bool fire_ball_hide(int typ, int dir, int dam, int rad)
6609 {
6610         int tx, ty;
6611
6612         int flg = PROJECT_STOP | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL | PROJECT_HIDE;
6613
6614         /* Use the given direction */
6615         tx = px + 99 * ddx[dir];
6616         ty = py + 99 * ddy[dir];
6617
6618         /* Hack -- Use an actual "target" */
6619         if ((dir == 5) && target_okay())
6620         {
6621                 flg &= ~(PROJECT_STOP);
6622                 tx = target_col;
6623                 ty = target_row;
6624         }
6625
6626         /* Analyze the "dir" and the "target".  Hurt items on floor. */
6627         return (project(0, rad, ty, tx, dam, typ, flg, -1));
6628 }
6629
6630
6631 /*
6632  * Cast a meteor spell, defined as a ball spell cast by an arbitary monster, 
6633  * player, or outside source, that starts out at an arbitrary location, and 
6634  * leaving no trail from the "caster" to the target.  This function is 
6635  * especially useful for bombardments and similar. -LM-
6636  *
6637  * Option to hurt the player.
6638  */
6639 bool fire_meteor(int who, int typ, int y, int x, int dam, int rad)
6640 {
6641         int flg = PROJECT_STOP | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL;
6642
6643         /* Analyze the "target" and the caster. */
6644         return (project(who, rad, y, x, dam, typ, flg, -1));
6645 }
6646
6647
6648 bool fire_blast(int typ, int dir, int dd, int ds, int num, int dev)
6649 {
6650         int ly, lx, ld;
6651         int ty, tx, y, x;
6652         int i;
6653
6654         int flg = PROJECT_FAST | PROJECT_THRU | PROJECT_STOP | PROJECT_KILL | PROJECT_REFLECTABLE | PROJECT_GRID;
6655
6656         /* Assume okay */
6657         bool result = TRUE;
6658
6659         /* Use the given direction */
6660         if (dir != 5)
6661         {
6662                 ly = ty = py + 20 * ddy[dir];
6663                 lx = tx = px + 20 * ddx[dir];
6664         }
6665
6666         /* Use an actual "target" */
6667         else if (dir == 5)
6668         {
6669                 tx = target_col;
6670                 ty = target_row;
6671
6672                 lx = 20 * (tx - px) + px;
6673                 ly = 20 * (ty - py) + py;
6674         }
6675
6676         ld = distance(py, px, ly, lx);
6677
6678         /* Blast */
6679         for (i = 0; i < num; i++)
6680         {
6681                 while (1)
6682                 {
6683                         /* Get targets for some bolts */
6684                         y = rand_spread(ly, ld * dev / 20);
6685                         x = rand_spread(lx, ld * dev / 20);
6686
6687                         if (distance(ly, lx, y, x) <= ld * dev / 20) break;
6688                 }
6689
6690                 /* Analyze the "dir" and the "target". */
6691                 if (!project(0, 0, y, x, damroll(dd, ds), typ, flg, -1))
6692                 {
6693                         result = FALSE;
6694                 }
6695         }
6696
6697         return (result);
6698 }
6699
6700
6701 /*
6702  * Switch position with a monster.
6703  */
6704 bool teleport_swap(int dir)
6705 {
6706         int tx, ty;
6707         cave_type * c_ptr;
6708         monster_type * m_ptr;
6709         monster_race * r_ptr;
6710
6711         if ((dir == 5) && target_okay())
6712         {
6713                 tx = target_col;
6714                 ty = target_row;
6715         }
6716         else
6717         {
6718                 tx = px + ddx[dir];
6719                 ty = py + ddy[dir];
6720         }
6721         c_ptr = &cave[ty][tx];
6722
6723         if (p_ptr->anti_tele)
6724         {
6725 #ifdef JP
6726 msg_print("ÉԻ׵ĤÊÎϤ¬¥Æ¥ì¥Ý¡¼¥È¤òËɤ¤¤À¡ª");
6727 #else
6728                 msg_print("A mysterious force prevents you from teleporting!");
6729 #endif
6730
6731                 return FALSE;
6732         }
6733
6734         if (!c_ptr->m_idx || (c_ptr->m_idx == p_ptr->riding))
6735         {
6736 #ifdef JP
6737 msg_print("¤½¤ì¤È¤Ï¾ì½ê¤ò¸ò´¹¤Ç¤­¤Þ¤»¤ó¡£");
6738 #else
6739                 msg_print("You can't trade places with that!");
6740 #endif
6741
6742
6743                 /* Failure */
6744                 return FALSE;
6745         }
6746
6747         if ((c_ptr->info & CAVE_ICKY) || (distance(ty, tx, py, px) > p_ptr->lev * 3 / 2 + 10))
6748         {
6749 #ifdef JP
6750 msg_print("¼ºÇÔ¤·¤¿¡£");
6751 #else
6752                 msg_print("Failed to swap.");
6753 #endif
6754
6755
6756                 /* Failure */
6757                 return FALSE;
6758         }
6759
6760         m_ptr = &m_list[c_ptr->m_idx];
6761         r_ptr = &r_info[m_ptr->r_idx];
6762
6763         if (r_ptr->flagsr & RFR_RES_TELE)
6764         {
6765 #ifdef JP
6766 msg_print("¥Æ¥ì¥Ý¡¼¥È¤ò¼ÙË⤵¤ì¤¿¡ª");
6767 #else
6768                 msg_print("Your teleportation is blocked!");
6769 #endif
6770
6771                 if (m_ptr->ml && is_original_ap(m_ptr)) r_ptr->r_flagsr |= RFR_RES_TELE;
6772
6773                 m_ptr->csleep = 0;
6774                 if (r_ptr->flags7 & RF7_HAS_LD_MASK) p_ptr->update |= (PU_MON_LITE);
6775
6776                 /* Failure */
6777                 return FALSE;
6778         }
6779
6780         sound(SOUND_TELEPORT);
6781
6782         cave[py][px].m_idx = c_ptr->m_idx;
6783
6784         /* Update the old location */
6785         c_ptr->m_idx = p_ptr->riding;
6786
6787         /* Move the monster */
6788         m_ptr->fy = py;
6789         m_ptr->fx = px;
6790
6791         /* Move the player */
6792         px = tx;
6793         py = ty;
6794
6795         if (p_ptr->riding)
6796         {
6797                 m_list[p_ptr->riding].fy = ty;
6798                 m_list[p_ptr->riding].fx = tx;
6799
6800                 /* Update the monster (new location) */
6801                 update_mon(p_ptr->riding, TRUE);
6802         }
6803
6804         tx = m_ptr->fx;
6805         ty = m_ptr->fy;
6806
6807         m_ptr->csleep = 0;
6808
6809         /* Update the monster (new location) */
6810         update_mon(cave[ty][tx].m_idx, TRUE);
6811
6812         /* Redraw the old grid */
6813         lite_spot(ty, tx);
6814
6815         /* Redraw the new grid */
6816         lite_spot(py, px);
6817
6818         /* Check for new panel (redraw map) */
6819         verify_panel();
6820
6821         /* Update stuff */
6822         p_ptr->update |= (PU_VIEW | PU_LITE | PU_FLOW | PU_MON_LITE);
6823
6824         /* Update the monsters */
6825         p_ptr->update |= (PU_DISTANCE);
6826
6827         /* Window stuff */
6828         p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
6829
6830         /* Redraw the health bar */
6831         if (p_ptr->health_who == cave[ty][tx].m_idx)
6832                 p_ptr->redraw |= (PR_HEALTH);
6833
6834         /* Handle stuff XXX XXX XXX */
6835         handle_stuff();
6836
6837         /* Success */
6838         return TRUE;
6839 }
6840
6841
6842 /*
6843  * Hack -- apply a "projection()" in a direction (or at the target)
6844  */
6845 bool project_hook(int typ, int dir, int dam, int flg)
6846 {
6847         int tx, ty;
6848
6849         /* Pass through the target if needed */
6850         flg |= (PROJECT_THRU);
6851
6852         /* Use the given direction */
6853         tx = px + ddx[dir];
6854         ty = py + ddy[dir];
6855
6856         /* Hack -- Use an actual "target" */
6857         if ((dir == 5) && target_okay())
6858         {
6859                 tx = target_col;
6860                 ty = target_row;
6861         }
6862
6863         /* Analyze the "dir" and the "target", do NOT explode */
6864         return (project(0, 0, ty, tx, dam, typ, flg, -1));
6865 }
6866
6867
6868 /*
6869  * Cast a bolt spell
6870  * Stop if we hit a monster, as a "bolt"
6871  * Affect monsters (not grids or objects)
6872  */
6873 bool fire_bolt(int typ, int dir, int dam)
6874 {
6875         int flg = PROJECT_STOP | PROJECT_KILL | PROJECT_REFLECTABLE | PROJECT_GRID;
6876         return (project_hook(typ, dir, dam, flg));
6877 }
6878
6879
6880 /*
6881  * Cast a beam spell
6882  * Pass through monsters, as a "beam"
6883  * Affect monsters (not grids or objects)
6884  */
6885 bool fire_beam(int typ, int dir, int dam)
6886 {
6887         int flg = PROJECT_BEAM | PROJECT_KILL | PROJECT_GRID | PROJECT_ITEM;
6888         return (project_hook(typ, dir, dam, flg));
6889 }
6890
6891
6892 /*
6893  * Cast a bolt spell, or rarely, a beam spell
6894  */
6895 bool fire_bolt_or_beam(int prob, int typ, int dir, int dam)
6896 {
6897         if (randint0(100) < prob)
6898         {
6899                 return (fire_beam(typ, dir, dam));
6900         }
6901         else
6902         {
6903                 return (fire_bolt(typ, dir, dam));
6904         }
6905 }
6906
6907
6908 /*
6909  * Some of the old functions
6910  */
6911 bool lite_line(int dir)
6912 {
6913         int flg = PROJECT_BEAM | PROJECT_GRID | PROJECT_KILL;
6914         return (project_hook(GF_LITE_WEAK, dir, damroll(6, 8), flg));
6915 }
6916
6917
6918 bool drain_life(int dir, int dam)
6919 {
6920         int flg = PROJECT_STOP | PROJECT_KILL | PROJECT_REFLECTABLE;
6921         return (project_hook(GF_OLD_DRAIN, dir, dam, flg));
6922 }
6923
6924
6925 bool wall_to_mud(int dir)
6926 {
6927         int flg = PROJECT_BEAM | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL;
6928         return (project_hook(GF_KILL_WALL, dir, 20 + randint1(30), flg));
6929 }
6930
6931
6932 bool wizard_lock(int dir)
6933 {
6934         int flg = PROJECT_BEAM | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL;
6935         return (project_hook(GF_JAM_DOOR, dir, 20 + randint1(30), flg));
6936 }
6937
6938
6939 bool destroy_door(int dir)
6940 {
6941         int flg = PROJECT_BEAM | PROJECT_GRID | PROJECT_ITEM;
6942         return (project_hook(GF_KILL_DOOR, dir, 0, flg));
6943 }
6944
6945
6946 bool disarm_trap(int dir)
6947 {
6948         int flg = PROJECT_BEAM | PROJECT_GRID | PROJECT_ITEM;
6949         return (project_hook(GF_KILL_TRAP, dir, 0, flg));
6950 }
6951
6952
6953 bool heal_monster(int dir, int dam)
6954 {
6955         int flg = PROJECT_STOP | PROJECT_KILL | PROJECT_REFLECTABLE;
6956         return (project_hook(GF_OLD_HEAL, dir, dam, flg));
6957 }
6958
6959
6960 bool speed_monster(int dir)
6961 {
6962         int flg = PROJECT_STOP | PROJECT_KILL | PROJECT_REFLECTABLE;
6963         return (project_hook(GF_OLD_SPEED, dir, p_ptr->lev, flg));
6964 }
6965
6966
6967 bool slow_monster(int dir)
6968 {
6969         int flg = PROJECT_STOP | PROJECT_KILL | PROJECT_REFLECTABLE;
6970         return (project_hook(GF_OLD_SLOW, dir, p_ptr->lev, flg));
6971 }
6972
6973
6974 bool sleep_monster(int dir)
6975 {
6976         int flg = PROJECT_STOP | PROJECT_KILL | PROJECT_REFLECTABLE;
6977         return (project_hook(GF_OLD_SLEEP, dir, p_ptr->lev, flg));
6978 }
6979
6980
6981 bool stasis_monster(int dir)
6982 {
6983         return (fire_ball_hide(GF_STASIS, dir, p_ptr->lev*2, 0));
6984 }
6985
6986
6987 bool stasis_evil(int dir)
6988 {
6989         return (fire_ball_hide(GF_STASIS_EVIL, dir, p_ptr->lev*2, 0));
6990 }
6991
6992
6993 bool confuse_monster(int dir, int plev)
6994 {
6995         int flg = PROJECT_STOP | PROJECT_KILL | PROJECT_REFLECTABLE;
6996         return (project_hook(GF_OLD_CONF, dir, plev, flg));
6997 }
6998
6999
7000 bool stun_monster(int dir, int plev)
7001 {
7002         int flg = PROJECT_STOP | PROJECT_KILL | PROJECT_REFLECTABLE;
7003         return (project_hook(GF_STUN, dir, plev, flg));
7004 }
7005
7006
7007 bool poly_monster(int dir)
7008 {
7009         int flg = PROJECT_STOP | PROJECT_KILL | PROJECT_REFLECTABLE;
7010         bool tester = (project_hook(GF_OLD_POLY, dir, p_ptr->lev, flg));
7011         if (tester)
7012                 chg_virtue(V_CHANCE, 1);
7013         return(tester);
7014 }
7015
7016
7017 bool clone_monster(int dir)
7018 {
7019         int flg = PROJECT_STOP | PROJECT_KILL | PROJECT_REFLECTABLE;
7020         return (project_hook(GF_OLD_CLONE, dir, 0, flg));
7021 }
7022
7023
7024 bool fear_monster(int dir, int plev)
7025 {
7026         int flg = PROJECT_STOP | PROJECT_KILL | PROJECT_REFLECTABLE;
7027         return (project_hook(GF_TURN_ALL, dir, plev, flg));
7028 }
7029
7030
7031 bool death_ray(int dir, int plev)
7032 {
7033         int flg = PROJECT_STOP | PROJECT_KILL | PROJECT_REFLECTABLE;
7034         return (project_hook(GF_DEATH_RAY, dir, plev * 200, flg));
7035 }
7036
7037
7038 bool teleport_monster(int dir)
7039 {
7040         int flg = PROJECT_BEAM | PROJECT_KILL;
7041         return (project_hook(GF_AWAY_ALL, dir, MAX_SIGHT * 5, flg));
7042 }
7043
7044 /*
7045  * Hooks -- affect adjacent grids (radius 1 ball attack)
7046  */
7047 bool door_creation(void)
7048 {
7049         int flg = PROJECT_GRID | PROJECT_ITEM | PROJECT_HIDE;
7050         return (project(0, 1, py, px, 0, GF_MAKE_DOOR, flg, -1));
7051 }
7052
7053
7054 bool trap_creation(int y, int x)
7055 {
7056         int flg = PROJECT_GRID | PROJECT_ITEM | PROJECT_HIDE;
7057         return (project(0, 1, y, x, 0, GF_MAKE_TRAP, flg, -1));
7058 }
7059
7060
7061 bool tree_creation(void)
7062 {
7063         int flg = PROJECT_GRID | PROJECT_ITEM | PROJECT_HIDE;
7064         return (project(0, 1, py, px, 0, GF_MAKE_TREE, flg, -1));
7065 }
7066
7067
7068 bool glyph_creation(void)
7069 {
7070         int flg = PROJECT_GRID | PROJECT_ITEM;
7071         return (project(0, 1, py, px, 0, GF_MAKE_GLYPH, flg, -1));
7072 }
7073
7074
7075 bool wall_stone(void)
7076 {
7077         int flg = PROJECT_GRID | PROJECT_ITEM | PROJECT_HIDE;
7078
7079         bool dummy = (project(0, 1, py, px, 0, GF_STONE_WALL, flg, -1));
7080
7081         /* Update stuff */
7082         p_ptr->update |= (PU_VIEW | PU_LITE | PU_FLOW | PU_MON_LITE);
7083
7084         /* Update the monsters */
7085         p_ptr->update |= (PU_MONSTERS);
7086
7087         /* Redraw map */
7088         p_ptr->redraw |= (PR_MAP);
7089
7090         /* Window stuff */
7091         p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
7092
7093         return dummy;
7094 }
7095
7096
7097 bool destroy_doors_touch(void)
7098 {
7099         int flg = PROJECT_GRID | PROJECT_ITEM | PROJECT_HIDE;
7100         return (project(0, 1, py, px, 0, GF_KILL_DOOR, flg, -1));
7101 }
7102
7103
7104 bool sleep_monsters_touch(void)
7105 {
7106         int flg = PROJECT_KILL | PROJECT_HIDE;
7107         return (project(0, 1, py, px, p_ptr->lev, GF_OLD_SLEEP, flg, -1));
7108 }
7109
7110
7111 bool animate_dead(int who, int y, int x)
7112 {
7113         int flg = PROJECT_ITEM | PROJECT_HIDE;
7114         return (project(who, 5, y, x, 0, GF_ANIM_DEAD, flg, -1));
7115 }
7116
7117
7118 void call_chaos(void)
7119 {
7120         int Chaos_type, dummy, dir;
7121         int plev = p_ptr->lev;
7122         bool line_chaos = FALSE;
7123
7124         int hurt_types[31] =
7125         {
7126                 GF_ELEC,      GF_POIS,    GF_ACID,    GF_COLD,
7127                 GF_FIRE,      GF_MISSILE, GF_ARROW,   GF_PLASMA,
7128                 GF_HOLY_FIRE, GF_WATER,   GF_LITE,    GF_DARK,
7129                 GF_FORCE,     GF_INERTIA, GF_MANA,    GF_METEOR,
7130                 GF_ICE,       GF_CHAOS,   GF_NETHER,  GF_DISENCHANT,
7131                 GF_SHARDS,    GF_SOUND,   GF_NEXUS,   GF_CONFUSION,
7132                 GF_TIME,      GF_GRAVITY, GF_ROCKET,  GF_NUKE,
7133                 GF_HELL_FIRE, GF_DISINTEGRATE, GF_PSY_SPEAR
7134         };
7135
7136         Chaos_type = hurt_types[randint0(31)];
7137         if (one_in_(4)) line_chaos = TRUE;
7138
7139         if (one_in_(6))
7140         {
7141                 for (dummy = 1; dummy < 10; dummy++)
7142                 {
7143                         if (dummy - 5)
7144                         {
7145                                 if (line_chaos)
7146                                         fire_beam(Chaos_type, dummy, 150);
7147                                 else
7148                                         fire_ball(Chaos_type, dummy, 150, 2);
7149                         }
7150                 }
7151         }
7152         else if (one_in_(3))
7153         {
7154                 fire_ball(Chaos_type, 0, 500, 8);
7155         }
7156         else
7157         {
7158                 if (!get_aim_dir(&dir)) return;
7159                 if (line_chaos)
7160                         fire_beam(Chaos_type, dir, 250);
7161                 else
7162                         fire_ball(Chaos_type, dir, 250, 3 + (plev / 35));
7163         }
7164 }
7165
7166
7167 /*
7168  * Activate the evil Topi Ylinen curse
7169  * rr9: Stop the nasty things when a Cyberdemon is summoned
7170  * or the player gets paralyzed.
7171  */
7172 bool activate_ty_curse(bool stop_ty, int *count)
7173 {
7174         int     i = 0;
7175
7176         int flg = (PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL | PROJECT_JUMP);
7177
7178         do
7179         {
7180                 switch (randint1(34))
7181                 {
7182                 case 28: case 29:
7183                         if (!(*count))
7184                         {
7185 #ifdef JP
7186 msg_print("ÃÏÌ̤¬Íɤ줿...");
7187 #else
7188                                 msg_print("The ground trembles...");
7189 #endif
7190
7191                                 earthquake(py, px, 5 + randint0(10));
7192                                 if (!one_in_(6)) break;
7193                         }
7194                 case 30: case 31:
7195                         if (!(*count))
7196                         {
7197                                 int dam = damroll(10, 10);
7198 #ifdef JP
7199 msg_print("½ã¿è¤ÊËâÎϤμ¡¸µ¤Ø¤ÎÈ⤬³«¤¤¤¿¡ª");
7200 #else
7201                                 msg_print("A portal opens to a plane of raw mana!");
7202 #endif
7203
7204                                 project(0, 8, py, px, dam, GF_MANA, flg, -1);
7205 #ifdef JP
7206                                 take_hit(DAMAGE_NOESCAPE, dam, "½ã¿è¤ÊËâÎϤβòÊü", -1);
7207 #else
7208                                 take_hit(DAMAGE_NOESCAPE, dam, "released pure mana", -1);
7209 #endif
7210                                 if (!one_in_(6)) break;
7211                         }
7212                 case 32: case 33:
7213                         if (!(*count))
7214                 {
7215 #ifdef JP
7216 msg_print("¼þ°Ï¤Î¶õ´Ö¤¬ÏĤó¤À¡ª");
7217 #else
7218                                 msg_print("Space warps about you!");
7219 #endif
7220
7221                                 teleport_player(damroll(10, 10));
7222                                 if (randint0(13)) (*count) += activate_hi_summon(py, px, FALSE);
7223                                 if (!one_in_(6)) break;
7224                         }
7225                 case 34:
7226 #ifdef JP
7227 msg_print("¥¨¥Í¥ë¥®¡¼¤Î¤¦¤Í¤ê¤ò´¶¤¸¤¿¡ª");
7228 #else
7229                         msg_print("You feel a surge of energy!");
7230 #endif
7231
7232                         wall_breaker();
7233                         if (!randint0(7))
7234                         {
7235                                 project(0, 7, py, px, 50, GF_KILL_WALL, flg, -1);
7236 #ifdef JP
7237                                 take_hit(DAMAGE_NOESCAPE, 50, "¥¨¥Í¥ë¥®¡¼¤Î¤¦¤Í¤ê", -1);
7238 #else
7239                                 take_hit(DAMAGE_NOESCAPE, 50, "surge of energy", -1);
7240 #endif
7241                         }
7242                         if (!one_in_(6)) break;
7243                 case 1: case 2: case 3: case 16: case 17:
7244                         aggravate_monsters(0);
7245                         if (!one_in_(6)) break;
7246                 case 4: case 5: case 6:
7247                         (*count) += activate_hi_summon(py, px, FALSE);
7248                         if (!one_in_(6)) break;
7249                 case 7: case 8: case 9: case 18:
7250                         (*count) += summon_specific(0, py, px, dun_level, 0, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET));
7251                         if (!one_in_(6)) break;
7252                 case 10: case 11: case 12:
7253 #ifdef JP
7254 msg_print("À¸Ì¿ÎϤ¬ÂΤ«¤éµÛ¤¤¼è¤é¤ì¤¿µ¤¤¬¤¹¤ë¡ª");
7255 #else
7256                         msg_print("You feel your life draining away...");
7257 #endif
7258
7259                         lose_exp(p_ptr->exp / 16);
7260                         if (!one_in_(6)) break;
7261                 case 13: case 14: case 15: case 19: case 20:
7262                         if (stop_ty || (p_ptr->free_act && (randint1(125) < p_ptr->skill_sav)) || (p_ptr->pclass == CLASS_BERSERKER))
7263                         {
7264                                 /* Do nothing */ ;
7265                         }
7266                         else
7267                         {
7268 #ifdef JP
7269 msg_print("ĦÁü¤Ë¤Ê¤Ã¤¿µ¤Ê¬¤À¡ª");
7270 #else
7271                                 msg_print("You feel like a statue!");
7272 #endif
7273
7274                                 if (p_ptr->free_act)
7275                                         set_paralyzed(p_ptr->paralyzed + randint1(3));
7276                                 else
7277                                         set_paralyzed(p_ptr->paralyzed + randint1(13));
7278                                 stop_ty = TRUE;
7279                         }
7280                         if (!one_in_(6)) break;
7281                 case 21: case 22: case 23:
7282                         (void)do_dec_stat(randint0(6));
7283                         if (!one_in_(6)) break;
7284                 case 24:
7285 #ifdef JP
7286 msg_print("¤Û¤¨¡©»ä¤Ïï¡©¤³¤³¤Ç²¿¤·¤Æ¤ë¡©");
7287 #else
7288                         msg_print("Huh? Who am I? What am I doing here?");
7289 #endif
7290
7291                         lose_all_info();
7292                         if (!one_in_(6)) break;
7293                 case 25:
7294                         /*
7295                          * Only summon Cyberdemons deep in the dungeon.
7296                          */
7297                         if ((dun_level > 65) && !stop_ty)
7298                         {
7299                                 (*count) += summon_cyber(-1, py, px);
7300                                 stop_ty = TRUE;
7301                                 break;
7302                         }
7303                         if (!one_in_(6)) break;
7304                 default:
7305                         while (i < 6)
7306                         {
7307                                 do
7308                                 {
7309                                         (void)do_dec_stat(i);
7310                                 }
7311                                 while (one_in_(2));
7312
7313                                 i++;
7314                         }
7315                 }
7316         }
7317         while (one_in_(3) && !stop_ty);
7318
7319         return stop_ty;
7320 }
7321
7322
7323 int activate_hi_summon(int y, int x, bool can_pet)
7324 {
7325         int i;
7326         int count = 0;
7327         int summon_lev;
7328         u32b mode = PM_ALLOW_GROUP;
7329         bool pet = FALSE;
7330
7331         if (can_pet)
7332         {
7333                 if (one_in_(4))
7334                 {
7335                         mode |= PM_FORCE_FRIENDLY;
7336                 }
7337                 else
7338                 {
7339                         mode |= PM_FORCE_PET;
7340                         pet = TRUE;
7341                 }
7342         }
7343
7344         if (!pet) mode |= PM_NO_PET;
7345
7346         summon_lev = (pet ? p_ptr->lev * 2 / 3 + randint1(p_ptr->lev / 2) : dun_level);
7347
7348         for (i = 0; i < (randint1(7) + (dun_level / 40)); i++)
7349         {
7350                 switch (randint1(25) + (dun_level / 20))
7351                 {
7352                         case 1: case 2:
7353                                 count += summon_specific((pet ? -1 : 0), y, x, summon_lev, SUMMON_ANT, mode);
7354                                 break;
7355                         case 3: case 4:
7356                                 count += summon_specific((pet ? -1 : 0), y, x, summon_lev, SUMMON_SPIDER, mode);
7357                                 break;
7358                         case 5: case 6:
7359                                 count += summon_specific((pet ? -1 : 0), y, x, summon_lev, SUMMON_HOUND, mode);
7360                                 break;
7361                         case 7: case 8:
7362                                 count += summon_specific((pet ? -1 : 0), y, x, summon_lev, SUMMON_HYDRA, mode);
7363                                 break;
7364                         case 9: case 10:
7365                                 count += summon_specific((pet ? -1 : 0), y, x, summon_lev, SUMMON_ANGEL, mode);
7366                                 break;
7367                         case 11: case 12:
7368                                 count += summon_specific((pet ? -1 : 0), y, x, summon_lev, SUMMON_UNDEAD, mode);
7369                                 break;
7370                         case 13: case 14:
7371                                 count += summon_specific((pet ? -1 : 0), y, x, summon_lev, SUMMON_DRAGON, mode);
7372                                 break;
7373                         case 15: case 16:
7374                                 count += summon_specific((pet ? -1 : 0), y, x, summon_lev, SUMMON_DEMON, mode);
7375                                 break;
7376                         case 17:
7377                                 if (can_pet) break;
7378                                 count += summon_specific((pet ? -1 : 0), y, x, summon_lev, SUMMON_AMBERITES, (mode | PM_ALLOW_UNIQUE));
7379                                 break;
7380                         case 18: case 19:
7381                                 if (can_pet) break;
7382                                 count += summon_specific((pet ? -1 : 0), y, x, summon_lev, SUMMON_UNIQUE, (mode | PM_ALLOW_UNIQUE));
7383                                 break;
7384                         case 20: case 21:
7385                                 if (!can_pet) mode |= PM_ALLOW_UNIQUE;
7386                                 count += summon_specific((pet ? -1 : 0), y, x, summon_lev, SUMMON_HI_UNDEAD, mode);
7387                                 break;
7388                         case 22: case 23:
7389                                 if (!can_pet) mode |= PM_ALLOW_UNIQUE;
7390                                 count += summon_specific((pet ? -1 : 0), y, x, summon_lev, SUMMON_HI_DRAGON, mode);
7391                                 break;
7392                         case 24:
7393                                 count += summon_specific((pet ? -1 : 0), y, x, 100, SUMMON_CYBER, mode);
7394                                 break;
7395                         default:
7396                                 if (!can_pet) mode |= PM_ALLOW_UNIQUE;
7397                                 count += summon_specific((pet ? -1 : 0), y, x,pet ? summon_lev : (((summon_lev * 3) / 2) + 5), 0, mode);
7398                 }
7399         }
7400
7401         return count;
7402 }
7403
7404
7405 /* ToDo: check */
7406 int summon_cyber(int who, int y, int x)
7407 {
7408         int i;
7409         int max_cyber = (easy_band ? 1 : (dun_level / 50) + randint1(2));
7410         int count = 0;
7411         u32b mode = PM_ALLOW_GROUP;
7412
7413         /* Summoned by a monster */
7414         if (who > 0)
7415         {
7416                 monster_type *m_ptr = &m_list[who];
7417                 if (is_pet(m_ptr)) mode |= PM_FORCE_PET;
7418         }
7419
7420         if (max_cyber > 4) max_cyber = 4;
7421
7422         for (i = 0; i < max_cyber; i++)
7423         {
7424                 count += summon_specific(who, y, x, 100, SUMMON_CYBER, mode);
7425         }
7426
7427         return count;
7428 }
7429
7430
7431 void wall_breaker(void)
7432 {
7433         int i;
7434         int y, x;
7435         int attempts = 1000;
7436
7437         if (randint1(80 + p_ptr->lev) < 70)
7438         {
7439                 while (attempts--)
7440                 {
7441                         scatter(&y, &x, py, px, 4, 0);
7442
7443                         if (!cave_floor_bold(y, x)) continue;
7444
7445                         if (!player_bold(y, x)) break;
7446                 }
7447
7448                 project(0, 0, y, x, 20 + randint1(30), GF_KILL_WALL,
7449                                   (PROJECT_BEAM | PROJECT_THRU | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL), -1);
7450         }
7451         else if (randint1(100) > 30)
7452         {
7453                 earthquake(py, px, 1);
7454         }
7455         else
7456         {
7457                 int num = damroll(5, 3);
7458
7459                 for (i = 0; i < num; i++)
7460                 {
7461                         while (1)
7462                         {
7463                                 scatter(&y, &x, py, px, 10, 0);
7464
7465                                 if (!player_bold(y, x)) break;
7466                         }
7467
7468                         project(0, 0, y, x, 20 + randint1(30), GF_KILL_WALL,
7469                                           (PROJECT_BEAM | PROJECT_THRU | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL), -1);
7470                 }
7471         }
7472 }
7473
7474
7475 /*
7476  * Confuse monsters
7477  */
7478 bool confuse_monsters(int dam)
7479 {
7480         return (project_hack(GF_OLD_CONF, dam));
7481 }
7482
7483
7484 /*
7485  * Charm monsters
7486  */
7487 bool charm_monsters(int dam)
7488 {
7489         return (project_hack(GF_CHARM, dam));
7490 }
7491
7492
7493 /*
7494  * Charm animals
7495  */
7496 bool charm_animals(int dam)
7497 {
7498         return (project_hack(GF_CONTROL_ANIMAL, dam));
7499 }
7500
7501
7502 /*
7503  * Stun monsters
7504  */
7505 bool stun_monsters(int dam)
7506 {
7507         return (project_hack(GF_STUN, dam));
7508 }
7509
7510
7511 /*
7512  * Stasis monsters
7513  */
7514 bool stasis_monsters(int dam)
7515 {
7516         return (project_hack(GF_STASIS, dam));
7517 }
7518
7519
7520 /*
7521  * Mindblast monsters
7522  */
7523 bool mindblast_monsters(int dam)
7524 {
7525         return (project_hack(GF_PSI, dam));
7526 }
7527
7528
7529 /*
7530  * Banish all monsters
7531  */
7532 bool banish_monsters(int dist)
7533 {
7534         return (project_hack(GF_AWAY_ALL, dist));
7535 }
7536
7537
7538 /*
7539  * Turn evil
7540  */
7541 bool turn_evil(int dam)
7542 {
7543         return (project_hack(GF_TURN_EVIL, dam));
7544 }
7545
7546
7547 /*
7548  * Turn everyone
7549  */
7550 bool turn_monsters(int dam)
7551 {
7552         return (project_hack(GF_TURN_ALL, dam));
7553 }
7554
7555
7556 /*
7557  * Death-ray all monsters (note: OBSCENELY powerful)
7558  */
7559 bool deathray_monsters(void)
7560 {
7561         return (project_hack(GF_DEATH_RAY, p_ptr->lev * 200));
7562 }
7563
7564
7565 bool charm_monster(int dir, int plev)
7566 {
7567         int flg = PROJECT_STOP | PROJECT_KILL;
7568         return (project_hook(GF_CHARM, dir, plev, flg));
7569 }
7570
7571
7572 bool control_one_undead(int dir, int plev)
7573 {
7574         int flg = PROJECT_STOP | PROJECT_KILL;
7575         return (project_hook(GF_CONTROL_UNDEAD, dir, plev, flg));
7576 }
7577
7578
7579 bool control_one_demon(int dir, int plev)
7580 {
7581         int flg = PROJECT_STOP | PROJECT_KILL;
7582         return (project_hook(GF_CONTROL_DEMON, dir, plev, flg));
7583 }
7584
7585
7586 bool charm_animal(int dir, int plev)
7587 {
7588         int flg = PROJECT_STOP | PROJECT_KILL;
7589         return (project_hook(GF_CONTROL_ANIMAL, dir, plev, flg));
7590 }
7591
7592
7593 bool charm_living(int dir, int plev)
7594 {
7595         int flg = PROJECT_STOP | PROJECT_KILL;
7596         return (project_hook(GF_CONTROL_LIVING, dir, plev, flg));
7597 }
7598
7599
7600 void kawarimi(bool success)
7601 {
7602         object_type forge;
7603         object_type *q_ptr = &forge;
7604         int y, x;
7605
7606         if (p_ptr->confused || p_ptr->blind || p_ptr->paralyzed || p_ptr->image) return;
7607         if (randint0(200) < p_ptr->stun) return;
7608
7609         if (!success && one_in_(3))
7610         {
7611 #ifdef JP
7612                 msg_print("¼ºÇÔ¡ªÆ¨¤²¤é¤ì¤Ê¤«¤Ã¤¿¡£");
7613 #else
7614                 msg_print("Failed! You couldn't run away.");
7615 #endif
7616                 p_ptr->special_defense &= ~(NINJA_KAWARIMI);
7617                 p_ptr->redraw |= (PR_STATUS);
7618                 return;
7619         }
7620
7621         y = py;
7622         x = px;
7623
7624         teleport_player(10+randint1(90));
7625
7626         object_wipe(q_ptr);
7627
7628         object_prep(q_ptr, lookup_kind(TV_STATUE, SV_WOODEN_STATUE));
7629
7630         q_ptr->pval = MON_NINJA;
7631
7632         /* Drop it in the dungeon */
7633         (void)drop_near(q_ptr, -1, y, x);
7634
7635 #ifdef JP
7636         if (success) msg_print("¹¶·â¤ò¼õ¤±¤ëÁ°¤ËÁÇÁ᤯¿È¤ò¤Ò¤ë¤¬¤¨¤·¤¿¡£");
7637         else msg_print("¼ºÇÔ¡ª¹¶·â¤ò¼õ¤±¤Æ¤·¤Þ¤Ã¤¿¡£");
7638 #else
7639         if (success) msg_print("You have turned around just before the attack hit you.");
7640         else msg_print("Failed! You are hit by the attack.");
7641 #endif
7642
7643         p_ptr->special_defense &= ~(NINJA_KAWARIMI);
7644         p_ptr->redraw |= (PR_STATUS);
7645 }
7646
7647
7648 /*
7649  * "Rush Attack" routine for Samurai or Ninja
7650  * Return value is for checking "done"
7651  */
7652 bool rush_attack(bool *mdeath)
7653 {
7654         int dir;
7655         int tx, ty, nx, ny;
7656         int tm_idx = 0;
7657         u16b path_g[32];
7658         int path_n, i;
7659         bool tmp_mdeath = FALSE;
7660
7661         if (mdeath) *mdeath = FALSE;
7662
7663         project_length = 5;
7664         if (!get_aim_dir(&dir)) return FALSE;
7665
7666         /* Use the given direction */
7667         tx = px + project_length * ddx[dir];
7668         ty = py + project_length * ddy[dir];
7669
7670         /* Hack -- Use an actual "target" */
7671         if ((dir == 5) && target_okay())
7672         {
7673                 tx = target_col;
7674                 ty = target_row;
7675         }
7676
7677         if (in_bounds(ty, tx)) tm_idx = cave[ty][tx].m_idx;
7678
7679         path_n = project_path(path_g, project_length, py, px, ty, tx, PROJECT_STOP | PROJECT_KILL);
7680         project_length = 0;
7681
7682         /* No need to move */
7683         if (!path_n) return TRUE;
7684
7685         /* Use ty and tx as to-move point */
7686         ty = py;
7687         tx = px;
7688
7689         /* Project along the path */
7690         for (i = 0; i < path_n; i++)
7691         {
7692                 ny = GRID_Y(path_g[i]);
7693                 nx = GRID_X(path_g[i]);
7694
7695                 if (!cave_empty_bold(ny, nx) || !player_can_enter(cave[ny][nx].feat))
7696                 {
7697                         if (cave[ny][nx].m_idx)
7698                         {
7699                                 monster_type *m_ptr = &m_list[cave[ny][nx].m_idx];
7700
7701                                 if (tm_idx != cave[ny][nx].m_idx)
7702                                 {
7703 #ifdef JP
7704                                         msg_format("%s%s¤¬Î©¤Á¤Õ¤µ¤¬¤Ã¤Æ¤¤¤ë¡ª", tm_idx ? "Ê̤Î" : "",
7705                                                 m_ptr->ml ? "¥â¥ó¥¹¥¿¡¼" : "²¿¤«");
7706 #else
7707                                         msg_format("There is %s in the way!", m_ptr->ml ? (tm_idx ? "another monster" : "a monster") :
7708                                                 "someone");
7709 #endif
7710                                 }
7711                                 else
7712                                 {
7713                                         if (!player_bold(ty, tx))
7714                                         {
7715                                                 /* Hold the monster name */
7716                                                 char m_name[80];
7717
7718                                                 /* Get the monster name (BEFORE polymorphing) */
7719                                                 monster_desc(m_name, m_ptr, 0);
7720 #ifdef JP
7721                                                 msg_format("ÁÇÁ᤯%s¤Î²û¤ËÆþ¤ê¹þ¤ó¤À¡ª", m_name);
7722 #else
7723                                                 msg_format("You quickly jump in and attack %s!", m_name);
7724 #endif
7725                                         }
7726                                 }
7727
7728                                 tmp_mdeath = py_attack(ny, nx, HISSATSU_NYUSIN);
7729                         }
7730                         else
7731                         {
7732                                 if (tm_idx)
7733                                 {
7734 #ifdef JP
7735                                         msg_print("¼ºÇÔ¡ª");
7736 #else
7737                                         msg_print("Failed!");
7738 #endif
7739                                 }
7740                                 else
7741                                 {
7742 #ifdef JP
7743                                         msg_print("¤³¤³¤Ë¤ÏÆþ¿È¤Ç¤ÏÆþ¤ì¤Ê¤¤¡£");
7744 #else
7745                                         msg_print("You can't move to that place.");
7746 #endif
7747                                 }
7748                         }
7749                         break;
7750                 }
7751                 else
7752                 {
7753                         ty = ny;
7754                         tx = nx;
7755                 }
7756         }
7757
7758         if (!player_bold(ty, tx)) teleport_player_to(ty, tx, FALSE);
7759
7760         if (mdeath) *mdeath = tmp_mdeath;
7761         return TRUE;
7762 }
7763
7764
7765 /*
7766  * Remove all mirrors in this floor
7767  */
7768 void remove_all_mirrors(bool explode)
7769 {
7770         int x, y;
7771
7772         for (x = 0; x < cur_wid; x++)
7773         {
7774                 for (y = 0; y < cur_hgt; y++)
7775                 {
7776                         if (is_mirror_grid(&cave[y][x]))
7777                         {
7778                                 remove_mirror(y, x);
7779                                 if (explode)
7780                                         project(0, 2, y, x, p_ptr->lev / 2 + 5, GF_SHARDS,
7781                                                 (PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL | PROJECT_JUMP | PROJECT_NO_HANGEKI), -1);
7782                         }
7783                 }
7784         }
7785 }