OSDN Git Service

Add Doxygen comment to monster1.c.
[hengband/hengband.git] / src / monster1.c
1 /*!
2  * @file monster1.c
3  * @brief ¥â¥ó¥¹¥¿¡¼¾ðÊó¤Îµ­½Ò / describe monsters (using monster memory)
4  * @date 2013/12/11
5  * @author
6  * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke
7  * This software may be copied and distributed for educational, research,
8  * and not for profit purposes provided that this copyright and statement
9  * are included in all such copies.  Other copyrights may also apply.
10  * 2014 Deskull rearranged comment for Doxygen.
11  */
12
13 #include "angband.h"
14
15
16 /*
17  * Pronoun arrays, by gender.
18  */
19 static cptr wd_he[3] =
20 #ifdef JP
21 { "¤½¤ì", "Èà", "Èà½÷" };
22 #else
23 { "it", "he", "she" };
24 #endif
25
26 static cptr wd_his[3] =
27 #ifdef JP
28 { "¤½¤ì¤Î", "Èà¤Î", "Èà½÷¤Î" };
29 #else
30 { "its", "his", "her" };
31 #endif
32
33
34
35 /*!
36  * ±Ñ¸ì¤ÎÊ£¿ô·Ïµ­½ÒÍÑ¥Þ¥¯¥í / Pluralizer.  Args(count, singular, plural)
37  */
38 #define plural(c,s,p) \
39     (((c) == 1) ? (s) : (p))
40
41
42
43 /*!
44  * @brief ¥â¥ó¥¹¥¿¡¼¤ÎAC¾ðÊó¤òÆÀ¤ë¤³¤È¤¬¤Ç¤­¤ë¤«¤òÊÖ¤¹ / Determine if the "armor" is known
45  * @param r_idx ¥â¥ó¥¹¥¿¡¼¤Î¼ï²ID
46  * @return Å¨¤ÎAC¤òÃΤë¾ò·ï¤¬Ëþ¤¿¤µ¤ì¤Æ¤¤¤ë¤Ê¤éTRUE¤òÊÖ¤¹
47  * @details
48  * The higher the level, the fewer kills needed.
49  */
50 static bool know_armour(int r_idx)
51 {
52         monster_race *r_ptr = &r_info[r_idx];
53
54         s32b level = r_ptr->level;
55
56         s32b kills = r_ptr->r_tkills;
57
58         if (cheat_know) return (TRUE);
59
60         /* Normal monsters */
61         if (kills > 304 / (4 + level)) return (TRUE);
62
63         /* Skip non-uniques */
64         if (!(r_ptr->flags1 & RF1_UNIQUE)) return (FALSE);
65
66         /* Unique monsters */
67         if (kills > 304 / (38 + (5 * level) / 4)) return (TRUE);
68
69         /* Assume false */
70         return (FALSE);
71 }
72
73
74 /*!
75  * @brief ¥â¥ó¥¹¥¿¡¼¤ÎÂÇ·â°ÒÎϤòÃΤ뤳¤È¤¬¤Ç¤­¤ë¤«¤É¤¦¤«¤òÊÖ¤¹
76  * Determine if the "damage" of the given attack is known
77  * @param r_idx ¥â¥ó¥¹¥¿¡¼¤Î¼ï²ID
78  * @param i ³Îǧ¤·¤¿¤¤¹¶·â¼êÈÖ
79  * @return Å¨¤Î¥À¥á¡¼¥¸¥À¥¤¥¹¤òÃΤë¾ò·ï¤¬Ëþ¤¿¤µ¤ì¤Æ¤¤¤ë¤Ê¤éTRUE¤òÊÖ¤¹
80  * @details
81  * <pre>
82  * the higher the level of the monster, the fewer the attacks you need,
83  * the more damage an attack does, the more attacks you need
84  * </pre>
85  */
86 static bool know_damage(int r_idx, int i)
87 {
88         monster_race *r_ptr = &r_info[r_idx];
89
90         s32b level = r_ptr->level;
91
92         s32b a = r_ptr->r_blows[i];
93
94         s32b d1 = r_ptr->blow[i].d_dice;
95         s32b d2 = r_ptr->blow[i].d_side;
96
97         s32b d = d1 * d2;
98
99         if (d >= ((4+level)*MAX_UCHAR)/80) d = ((4+level)*MAX_UCHAR-1)/80;
100
101         /* Normal monsters */
102         if ((4 + level) * a > 80 * d) return (TRUE);
103
104         /* Skip non-uniques */
105         if (!(r_ptr->flags1 & RF1_UNIQUE)) return (FALSE);
106
107         /* Unique monsters */
108         if ((4 + level) * (2 * a) > 80 * d) return (TRUE);
109
110         /* Assume false */
111         return (FALSE);
112 }
113
114
115 /*
116  * Prepare hook for c_roff(). It will be changed for spoiler generation in wizard1.c.
117  */
118 void (*hook_c_roff)(byte attr, cptr str) = c_roff;
119
120 static void hooked_roff(cptr str)
121 {
122         /* Spawn */
123         hook_c_roff(TERM_WHITE, str);
124 }
125
126
127 /*!
128  * @brief ¥â¥ó¥¹¥¿¡¼¤Î»×¤¤½Ð¾ðÊó¤òɽ¼¨¤¹¤ë
129  * Hack -- display monster information using "hooked_roff()"
130  * @param r_idx ¥â¥ó¥¹¥¿¡¼¤Î¼ï²ID
131  * @param mode É½¼¨¥ª¥×¥·¥ç¥ó
132  * @return ¤Ê¤·
133  * @details
134  * This function should only be called with the cursor placed at the
135  * left edge of the screen, on a cleared line, in which the recall is
136  * to take place.  One extra blank line is left after the recall.
137  */
138 static void roff_aux(int r_idx, int mode)
139 {
140         monster_race    *r_ptr = &r_info[r_idx];
141
142         bool            old = FALSE;
143
144         int             m, n, r;
145
146         cptr            p, q;
147
148 #ifdef JP
149         char            jverb_buf[64];
150 #else
151         bool            sin = FALSE;
152 #endif
153         int             msex = 0;
154
155         bool nightmare = ironman_nightmare && !(mode & 0x02);
156         int speed = nightmare ? r_ptr->speed + 5 : r_ptr->speed;
157
158         bool            breath = FALSE;
159         bool            magic = FALSE;
160         bool            reinforce = FALSE;
161
162         u32b            flags1;
163         u32b            flags2;
164         u32b            flags3;
165         u32b            flags4;
166         u32b            flags5;
167         u32b            flags6;
168         u32b            flags7;
169         u32b            flagsr;
170
171         byte drop_gold, drop_item;
172
173         int             vn = 0;
174         byte            color[96];
175         cptr            vp[96];
176
177         bool know_everything = FALSE;
178
179         /* Obtain a copy of the "known" number of drops */
180         drop_gold = r_ptr->r_drop_gold;
181         drop_item = r_ptr->r_drop_item;
182
183         /* Obtain a copy of the "known" flags */
184         flags1 = (r_ptr->flags1 & r_ptr->r_flags1);
185         flags2 = (r_ptr->flags2 & r_ptr->r_flags2);
186         flags3 = (r_ptr->flags3 & r_ptr->r_flags3);
187         flags4 = (r_ptr->flags4 & r_ptr->r_flags4);
188         flags5 = (r_ptr->flags5 & r_ptr->r_flags5);
189         flags6 = (r_ptr->flags6 & r_ptr->r_flags6);
190         flags7 = (r_ptr->flags7 & r_ptr->flags7);
191         flagsr = (r_ptr->flagsr & r_ptr->r_flagsr);
192
193         for(n = 0; n < 6; n++)
194         {
195                 if(r_ptr->reinforce_id[n] > 0) reinforce = TRUE;
196         }
197
198         /* cheat_know or research_mon() */
199         if (cheat_know || (mode & 0x01))
200                 know_everything = TRUE;
201
202         /* Cheat -- Know everything */
203         if (know_everything)
204         {
205                 /* Hack -- maximal drops */
206                 drop_gold = drop_item =
207                 (((r_ptr->flags1 & RF1_DROP_4D2) ? 8 : 0) +
208                  ((r_ptr->flags1 & RF1_DROP_3D2) ? 6 : 0) +
209                  ((r_ptr->flags1 & RF1_DROP_2D2) ? 4 : 0) +
210                  ((r_ptr->flags1 & RF1_DROP_1D2) ? 2 : 0) +
211                  ((r_ptr->flags1 & RF1_DROP_90)  ? 1 : 0) +
212                  ((r_ptr->flags1 & RF1_DROP_60)  ? 1 : 0));
213
214                 /* Hack -- but only "valid" drops */
215                 if (r_ptr->flags1 & RF1_ONLY_GOLD) drop_item = 0;
216                 if (r_ptr->flags1 & RF1_ONLY_ITEM) drop_gold = 0;
217
218                 /* Hack -- know all the flags */
219                 flags1 = r_ptr->flags1;
220                 flags2 = r_ptr->flags2;
221                 flags3 = r_ptr->flags3;
222                 flags4 = r_ptr->flags4;
223                 flags5 = r_ptr->flags5;
224                 flags6 = r_ptr->flags6;
225                 flagsr = r_ptr->flagsr;
226         }
227
228
229         /* Extract a gender (if applicable) */
230         if (r_ptr->flags1 & RF1_FEMALE) msex = 2;
231         else if (r_ptr->flags1 & RF1_MALE) msex = 1;
232
233         /* Assume some "obvious" flags */
234         if (r_ptr->flags1 & RF1_UNIQUE)  flags1 |= (RF1_UNIQUE);
235         if (r_ptr->flags1 & RF1_QUESTOR) flags1 |= (RF1_QUESTOR);
236         if (r_ptr->flags1 & RF1_MALE)    flags1 |= (RF1_MALE);
237         if (r_ptr->flags1 & RF1_FEMALE)  flags1 |= (RF1_FEMALE);
238
239         /* Assume some "creation" flags */
240         if (r_ptr->flags1 & RF1_FRIENDS) flags1 |= (RF1_FRIENDS);
241         if (r_ptr->flags1 & RF1_ESCORT)  flags1 |= (RF1_ESCORT);
242         if (r_ptr->flags1 & RF1_ESCORTS) flags1 |= (RF1_ESCORTS);
243
244         /* Killing a monster reveals some properties */
245         if (r_ptr->r_tkills || know_everything)
246         {
247                 /* Know "race" flags */
248                 if (r_ptr->flags3 & RF3_ORC)      flags3 |= (RF3_ORC);
249                 if (r_ptr->flags3 & RF3_TROLL)    flags3 |= (RF3_TROLL);
250                 if (r_ptr->flags3 & RF3_GIANT)    flags3 |= (RF3_GIANT);
251                 if (r_ptr->flags3 & RF3_DRAGON)   flags3 |= (RF3_DRAGON);
252                 if (r_ptr->flags3 & RF3_DEMON)    flags3 |= (RF3_DEMON);
253                 if (r_ptr->flags3 & RF3_UNDEAD)   flags3 |= (RF3_UNDEAD);
254                 if (r_ptr->flags3 & RF3_EVIL)     flags3 |= (RF3_EVIL);
255                 if (r_ptr->flags3 & RF3_GOOD)     flags3 |= (RF3_GOOD);
256                 if (r_ptr->flags3 & RF3_ANIMAL)   flags3 |= (RF3_ANIMAL);
257                 if (r_ptr->flags3 & RF3_AMBERITE) flags3 |= (RF3_AMBERITE);
258                 if (r_ptr->flags2 & RF2_HUMAN)    flags2 |= (RF2_HUMAN);
259
260                 /* Know 'quantum' flag */
261                 if (r_ptr->flags2 & RF2_QUANTUM)  flags2 |= (RF2_QUANTUM);
262
263                 /* Know "forced" flags */
264                 if (r_ptr->flags1 & RF1_FORCE_DEPTH) flags1 |= (RF1_FORCE_DEPTH);
265                 if (r_ptr->flags1 & RF1_FORCE_MAXHP) flags1 |= (RF1_FORCE_MAXHP);
266         }
267
268         /* For output_monster_spoiler() */
269         if (mode & 0x02)
270         {
271                 /* Nothing to do */
272         }
273         else
274
275         /* Treat uniques differently */
276         if (flags1 & RF1_UNIQUE)
277         {
278                 /* Hack -- Determine if the unique is "dead" */
279                 bool dead = (r_ptr->max_num == 0) ? TRUE : FALSE;
280
281                 /* We've been killed... */
282                 if (r_ptr->r_deaths)
283                 {
284                         /* Killed ancestors */
285                         hooked_roff(format(_("%^s¤Ï¤¢¤Ê¤¿¤ÎÀèÁĤò %d ¿ÍÁò¤Ã¤Æ¤¤¤ë", "%^s has slain %d of your ancestors"),
286                                            wd_he[msex], r_ptr->r_deaths));
287
288                         /* But we've also killed it */
289                         if (dead)
290                         {
291                                 hooked_roff(format(
292                                         _("¤¬¡¢¤¹¤Ç¤ËµØƤ¤Á¤Ï²Ì¤¿¤·¤Æ¤¤¤ë¡ª", 
293                                          (", but you have avenged %s!  ", plural(r_ptr->r_deaths, "him", "them")))));
294                         }
295
296                         /* Unavenged (ever) */
297                         else
298                         {
299                                 hooked_roff(format(
300                                         _("¤Î¤Ë¡¢¤Þ¤ÀµØƤ¤Á¤ò²Ì¤¿¤·¤Æ¤¤¤Ê¤¤¡£", 
301                                          (", who %s unavenged.  ", plural(r_ptr->r_deaths, "remains", "remain")))));
302                         }
303
304                         /* Start a new line */
305                         hooked_roff("\n");
306                 }
307
308                 /* Dead unique who never hurt us */
309                 else if (dead)
310                 {
311                         hooked_roff(_("¤¢¤Ê¤¿¤Ï¤³¤ÎµØŨ¤ò¤¹¤Ç¤ËÁò¤êµî¤Ã¤Æ¤¤¤ë¡£", "You have slain this foe.  "));
312
313                         /* Start a new line */
314                         hooked_roff("\n");
315                 }
316         }
317
318         /* Not unique, but killed us */
319         else if (r_ptr->r_deaths)
320         {
321                 /* Dead ancestors */
322                 hooked_roff(
323                         _(format("¤³¤Î¥â¥ó¥¹¥¿¡¼¤Ï¤¢¤Ê¤¿¤ÎÀèÁĤò %d ¿ÍÁò¤Ã¤Æ¤¤¤ë", r_ptr->r_deaths),
324                           format("%d of your ancestors %s been killed by this creature, ", r_ptr->r_deaths, plural(r_ptr->r_deaths, "has", "have"))));
325
326                 /* Some kills this life */
327                 if (r_ptr->r_pkills)
328                 {
329                         hooked_roff(format(
330                                 _("¤¬¡¢¤¢¤Ê¤¿¤Ï¤³¤Î¥â¥ó¥¹¥¿¡¼¤ò¾¯¤Ê¤¯¤È¤â %d ÂΤÏÅݤ·¤Æ¤¤¤ë¡£", 
331                                  "and you have exterminated at least %d of the creatures.  "), r_ptr->r_pkills));
332                 }
333
334                 /* Some kills past lives */
335                 else if (r_ptr->r_tkills)
336                 {
337                         hooked_roff(format(
338                                 _("¤¬¡¢¤¢¤Ê¤¿¤ÎÀèÁĤϤ³¤Î¥â¥ó¥¹¥¿¡¼¤ò¾¯¤Ê¤¯¤È¤â %d ÂΤÏÅݤ·¤Æ¤¤¤ë¡£", 
339                                   "and your ancestors have exterminated at least %d of the creatures.  "), r_ptr->r_tkills));
340                 }
341
342                 /* No kills */
343                 else
344                 {
345                         hooked_roff(format(
346                                 _("¤¬¡¢¤Þ¤À%s¤òÅݤ·¤¿¤³¤È¤Ï¤Ê¤¤¡£", 
347                                   "and %s is not ever known to have been defeated.  "), wd_he[msex]));
348                 }
349
350                 /* Start a new line */
351                 hooked_roff("\n");
352         }
353
354         /* Normal monsters */
355         else
356         {
357                 /* Killed some this life */
358                 if (r_ptr->r_pkills)
359                 {
360                         hooked_roff(format(
361                                 _("¤¢¤Ê¤¿¤Ï¤³¤Î¥â¥ó¥¹¥¿¡¼¤ò¾¯¤Ê¤¯¤È¤â %d ÂΤϻ¦¤·¤Æ¤¤¤ë¡£",
362                                   "You have killed at least %d of these creatures.  "), r_ptr->r_pkills));
363                 }
364
365                 /* Killed some last life */
366                 else if (r_ptr->r_tkills)
367                 {
368                         hooked_roff(format(
369                                 _("¤¢¤Ê¤¿¤ÎÀèÁĤϤ³¤Î¥â¥ó¥¹¥¿¡¼¤ò¾¯¤Ê¤¯¤È¤â %d ÂΤϻ¦¤·¤Æ¤¤¤ë¡£", 
370                                   "Your ancestors have killed at least %d of these creatures.  "), r_ptr->r_tkills));
371                 }
372
373                 /* Killed none */
374                 else
375                 {
376                         hooked_roff(_("¤³¤Î¥â¥ó¥¹¥¿¡¼¤òÅݤ·¤¿¤³¤È¤Ï¤Ê¤¤¡£", "No battles to the death are recalled.  "));
377                 }
378
379                 /* Start a new line */
380                 hooked_roff("\n");
381         }
382
383         /* Descriptions */
384         {
385                 cptr tmp = r_text + r_ptr->text;
386
387                 if (tmp[0])
388                 {
389                         /* Dump it */
390                         hooked_roff(tmp);
391
392                         /* Start a new line */
393                         hooked_roff("\n");
394                 }
395         }
396
397         if (r_idx == MON_KAGE)
398         {
399                 /* All done */
400                 hooked_roff("\n");
401
402                 return;
403         }
404
405         /* Nothing yet */
406         old = FALSE;
407
408         /* Describe location */
409         if (r_ptr->level == 0)
410         {
411                 hooked_roff(format(_("%^s¤ÏÄ®¤Ë½»¤ß", "%^s lives in the town"), wd_he[msex]));
412                 old = TRUE;
413         }
414         else if (r_ptr->r_tkills || know_everything)
415         {
416                 if (depth_in_feet)
417                 {
418                         hooked_roff(format(
419                                 _("%^s¤ÏÄ̾ïÃϲ¼ %d ¥Õ¥£¡¼¥È¤Ç½Ð¸½¤·", "%^s is normally found at depths of %d feet"),
420                                   wd_he[msex], r_ptr->level * 50));
421                 }
422                 else
423                 {
424                         hooked_roff(format(
425                                 _("%^s¤ÏÄ̾ïÃϲ¼ %d ³¬¤Ç½Ð¸½¤·", "%^s is normally found on dungeon level %d"),
426                                   wd_he[msex], r_ptr->level));
427                 }
428                 old = TRUE;
429         }
430
431
432         /* Describe movement */
433         if (r_idx == MON_CHAMELEON)
434         {
435                 hooked_roff(_("¡¢Â¾¤Î¥â¥ó¥¹¥¿¡¼¤Ë²½¤±¤ë¡£", "and can take the shape of other monster."));
436                 return;
437         }
438         else
439         {
440                 /* Introduction */
441                 if (old)
442                 {
443                         hooked_roff(_("¡¢", ", and "));
444                 }
445                 else
446                 {
447                         hooked_roff(format(_("%^s¤Ï", "%^s "), wd_he[msex]));
448                         old = TRUE;
449                 }
450 #ifndef JP
451                 hooked_roff("moves");
452 #endif
453
454                 /* Random-ness */
455                 if ((flags1 & RF1_RAND_50) || (flags1 & RF1_RAND_25))
456                 {
457                         /* Adverb */
458                         if ((flags1 & RF1_RAND_50) && (flags1 & RF1_RAND_25))
459                         {
460                                 hooked_roff(_("¤«¤Ê¤ê", " extremely"));
461                         }
462                         else if (flags1 & RF1_RAND_50)
463                         {
464                                 hooked_roff(_("´öʬ", " somewhat"));
465                         }
466                         else if (flags1 & RF1_RAND_25)
467                         {
468                                 hooked_roff(_("¾¯¡¹", " a bit"));
469                         }
470
471                         /* Adjective */
472                         hooked_roff(_("ÉÔµ¬Â§¤Ë", " erratically"));
473
474                         /* Hack -- Occasional conjunction */
475                         if (speed != 110) hooked_roff(_("¡¢¤«¤Ä", ", and"));
476                 }
477
478                 /* Speed */
479                 if (speed > 110)
480                 {
481                         if (speed > 139) hook_c_roff(TERM_RED, _("¿®¤¸Æñ¤¤¤Û¤É", " incredibly"));
482                         else if (speed > 134) hook_c_roff(TERM_ORANGE, _("ÌÔÎõ¤Ë", " extremely"));
483                         else if (speed > 129) hook_c_roff(TERM_ORANGE, _("Èó¾ï¤Ë", " very"));
484                         else if (speed > 124) hook_c_roff(TERM_UMBER, _("¤«¤Ê¤ê", " fairly"));
485                         else if (speed < 120) hook_c_roff(TERM_L_UMBER, _("¤ä¤ä", " somewhat"));
486                         hook_c_roff(TERM_L_RED, _("ÁÇÁ᤯", " quickly"));
487                 }
488                 else if (speed < 110)
489                 {
490                         if (speed < 90) hook_c_roff(TERM_L_GREEN, _("¿®¤¸Æñ¤¤¤Û¤É", " incredibly"));
491                         else if (speed < 95) hook_c_roff(TERM_BLUE, _("Èó¾ï¤Ë", " very"));
492                         else if (speed < 100) hook_c_roff(TERM_BLUE, _("¤«¤Ê¤ê", " fairly"));
493                         else if (speed > 104) hook_c_roff(TERM_GREEN, _("¤ä¤ä", " somewhat"));
494                         hook_c_roff(TERM_L_BLUE, _("¤æ¤Ã¤¯¤ê¤È", " slowly"));
495                 }
496                 else
497                 {
498                         hooked_roff(_("ÉáÄ̤ή¤µ¤Ç", " at normal speed"));
499                 }
500 #ifdef JP
501                 hooked_roff("Æ°¤¤¤Æ¤¤¤ë");
502 #endif
503         }
504
505         /* The code above includes "attack speed" */
506         if (flags1 & RF1_NEVER_MOVE)
507         {
508                 /* Introduce */
509                 if (old)
510                 {
511                         hooked_roff(_("¡¢¤·¤«¤·", ", but "));
512                 }
513                 else
514                 {
515                         hooked_roff(format(_("%^s¤Ï", "%^s "), wd_he[msex]));
516                         old = TRUE;
517                 }
518
519                 /* Describe */
520                 hooked_roff(_("¿¯Æþ¼Ô¤òÄÉÀפ·¤Ê¤¤", "does not deign to chase intruders"));
521         }
522
523         /* End this sentence */
524         if (old)
525         {
526                 hooked_roff(_("¡£", ".  "));
527                 old = FALSE;
528         }
529
530
531         /* Describe experience if known */
532         if (r_ptr->r_tkills || know_everything)
533         {
534                 /* Introduction */
535 #ifdef JP
536                 hooked_roff("¤³¤Î");
537 #else
538                 if (flags1 & RF1_UNIQUE)
539                 {
540                         hooked_roff("Killing this");
541                 }
542                 else
543                 {
544                         hooked_roff("A kill of this");
545                 }
546 #endif
547
548
549                 /* Describe the "quality" */
550                 if (flags2 & RF2_ELDRITCH_HORROR) hook_c_roff(TERM_VIOLET, _("¶¸µ¤¤òͶ¤¦", " sanity-blasting"));/*nuke me*/
551                 if (flags3 & RF3_ANIMAL)          hook_c_roff(TERM_L_GREEN, _("¼«Á³³¦¤Î", " natural"));
552                 if (flags3 & RF3_EVIL)            hook_c_roff(TERM_L_DARK, _("¼Ù°­¤Ê¤ë", " evil"));
553                 if (flags3 & RF3_GOOD)            hook_c_roff(TERM_YELLOW, _("Á±ÎɤÊ", " good"));
554                 if (flags3 & RF3_UNDEAD)          hook_c_roff(TERM_VIOLET, _("¥¢¥ó¥Ç¥Ã¥É¤Î", " undead"));
555                 if (flags3 & RF3_AMBERITE)        hook_c_roff(TERM_VIOLET, _("¥¢¥ó¥Ð¡¼¤Î²¦Â²¤Î", " Amberite"));
556
557                 if ((flags3 & (RF3_DRAGON | RF3_DEMON | RF3_GIANT | RF3_TROLL | RF3_ORC)) || (flags2 & (RF2_QUANTUM | RF2_HUMAN)))
558                 {
559                 /* Describe the "race" */
560                         if (flags3 & RF3_DRAGON)   hook_c_roff(TERM_ORANGE, _("¥É¥é¥´¥ó", " dragon"));
561                         if (flags3 & RF3_DEMON)    hook_c_roff(TERM_VIOLET, _("¥Ç¡¼¥â¥ó", " demon"));
562                         if (flags3 & RF3_GIANT)    hook_c_roff(TERM_L_UMBER, _("¥¸¥ã¥¤¥¢¥ó¥È", " giant"));
563                         if (flags3 & RF3_TROLL)    hook_c_roff(TERM_BLUE, _("¥È¥í¥ë", " troll"));
564                         if (flags3 & RF3_ORC)      hook_c_roff(TERM_UMBER, _("¥ª¡¼¥¯", " orc"));
565                         if (flags2 & RF2_HUMAN)    hook_c_roff(TERM_L_WHITE, _("¿Í´Ö", " human"));
566                         if (flags2 & RF2_QUANTUM)  hook_c_roff(TERM_VIOLET, _("ÎÌ»ÒÀ¸Êª", " quantum creature"));
567                 }
568                 else
569                 {
570                         hooked_roff(_("¥â¥ó¥¹¥¿¡¼", " creature"));
571                 }
572
573 #ifdef JP
574                 hooked_roff("¤òÅݤ¹¤³¤È¤Ï");
575 #endif
576                 /* Group some variables */
577                 {
578                         long i, j;
579
580 #ifdef JP
581                         i = p_ptr->lev;
582                         hooked_roff(format(" %lu ¥ì¥Ù¥ë¤Î¥­¥ã¥é¥¯¥¿¤Ë¤È¤Ã¤Æ", (long)i));
583
584                         i = (long)r_ptr->mexp * r_ptr->level / (p_ptr->max_plv+2);
585                         j = ((((long)r_ptr->mexp * r_ptr->level % (p_ptr->max_plv+2)) *
586                                (long)1000 / (p_ptr->max_plv+2) + 5) / 10);
587
588                         hooked_roff(format(" Ìó%ld.%02ld ¥Ý¥¤¥ó¥È¤Î·Ð¸³¤È¤Ê¤ë¡£",
589                                 (long)i, (long)j ));
590 #else
591                         /* calculate the integer exp part */
592                         i = (long)r_ptr->mexp * r_ptr->level / (p_ptr->max_plv+2);
593
594                         /* calculate the fractional exp part scaled by 100, */
595                         /* must use long arithmetic to avoid overflow  */
596                         j = ((((long)r_ptr->mexp * r_ptr->level % (p_ptr->max_plv+2)) *
597                                (long)1000 / (p_ptr->max_plv+2) + 5) / 10);
598
599                         /* Mention the experience */
600                         hooked_roff(format(" is worth about %ld.%02ld point%s",
601                                     (long)i, (long)j,
602                                     (((i == 1) && (j == 0)) ? "" : "s")));
603
604                         /* Take account of annoying English */
605                         p = "th";
606                         i = p_ptr->lev % 10;
607                         if ((p_ptr->lev / 10) == 1) /* nothing */;
608                         else if (i == 1) p = "st";
609                         else if (i == 2) p = "nd";
610                         else if (i == 3) p = "rd";
611
612                         /* Take account of "leading vowels" in numbers */
613                         q = "";
614                         i = p_ptr->lev;
615                         if ((i == 8) || (i == 11) || (i == 18)) q = "n";
616
617                         /* Mention the dependance on the player's level */
618                         hooked_roff(format(" for a%s %lu%s level character.  ",
619                                     q, (long)i, p));
620 #endif
621
622                 }
623         }
624
625         if ((flags2 & RF2_AURA_FIRE) && (flags2 & RF2_AURA_ELEC) && (flags3 & RF3_AURA_COLD))
626         {
627                 hook_c_roff(TERM_VIOLET, format(
628                         _("%^s¤Ï±ê¤Èɹ¤È¥¹¥Ñ¡¼¥¯¤ËÊñ¤Þ¤ì¤Æ¤¤¤ë¡£", "%^s is surrounded by flames, ice and electricity.  "), wd_he[msex]));
629         }
630         else if ((flags2 & RF2_AURA_FIRE) && (flags2 & RF2_AURA_ELEC))
631         {
632                 hook_c_roff(TERM_L_RED, format(
633                         _("%^s¤Ï±ê¤È¥¹¥Ñ¡¼¥¯¤ËÊñ¤Þ¤ì¤Æ¤¤¤ë¡£", "%^s is surrounded by flames and electricity.  "), wd_he[msex]));
634         }
635         else if ((flags2 & RF2_AURA_FIRE) && (flags3 & RF3_AURA_COLD))
636         {
637                 hook_c_roff(TERM_BLUE, format(
638                         _("%^s¤Ï±ê¤Èɹ¤ËÊñ¤Þ¤ì¤Æ¤¤¤ë¡£", "%^s is surrounded by flames and ice.  "), wd_he[msex]));
639         }
640         else if ((flags3 & RF3_AURA_COLD) && (flags2 & RF2_AURA_ELEC))
641         {
642                 hook_c_roff(TERM_L_GREEN, format(
643                         _("%^s¤Ïɹ¤È¥¹¥Ñ¡¼¥¯¤ËÊñ¤Þ¤ì¤Æ¤¤¤ë¡£", "%^s is surrounded by ice and electricity.  "), wd_he[msex]));
644         }
645         else if (flags2 & RF2_AURA_FIRE)
646         {
647                 hook_c_roff(TERM_RED, format(
648                         _("%^s¤Ï±ê¤ËÊñ¤Þ¤ì¤Æ¤¤¤ë¡£", "%^s is surrounded by flames.  "), wd_he[msex]));
649         }
650         else if (flags3 & RF3_AURA_COLD)
651         {
652                 hook_c_roff(TERM_BLUE, format(
653                         _("%^s¤Ïɹ¤ËÊñ¤Þ¤ì¤Æ¤¤¤ë¡£", "%^s is surrounded by ice.  "), wd_he[msex]));
654         }
655         else if (flags2 & RF2_AURA_ELEC)
656         {
657                 hook_c_roff(TERM_L_BLUE, format(
658                         _("%^s¤Ï¥¹¥Ñ¡¼¥¯¤ËÊñ¤Þ¤ì¤Æ¤¤¤ë¡£", "%^s is surrounded by electricity.  "), wd_he[msex]));
659         }
660
661         if (flags2 & RF2_REFLECTING)
662                 hooked_roff(format(_("%^s¤ÏÌð¤Î¼öʸ¤òÄ·¤ÍÊÖ¤¹¡£", "%^s reflects bolt spells.  "), wd_he[msex]));
663
664         /* Describe escorts */
665         if ((flags1 & RF1_ESCORT) || (flags1 & RF1_ESCORTS) || reinforce)
666         {
667                 hooked_roff(format(
668                         _("%^s¤ÏÄ̾ï¸î±Ò¤òȼ¤Ã¤Æ¸½¤ì¤ë¡£", "%^s usually appears with escorts.  "), wd_he[msex]));
669
670                 if(reinforce)
671                 {
672                         hooked_roff(_("¸î±Ò¤Î¹½À®¤Ï", "These escorts"));
673                         if((flags1 & RF1_ESCORT) || (flags1 & RF1_ESCORTS))
674                         {
675                                 hooked_roff(_("¾¯¤Ê¤¯¤È¤â", " at the least"));
676                         }
677 #ifndef JP
678                         hooked_roff(" contain ");
679 #endif                  
680                         for(n = 0; n < 6; n++)
681                         {
682                                 if(r_ptr->reinforce_id[n] && r_ptr->reinforce_dd[n] && r_ptr->reinforce_ds[n])
683                                 {
684                                         monster_race *rf_ptr = &r_info[r_ptr->reinforce_id[n]];
685                                         if(rf_ptr->flags1 & RF1_UNIQUE)
686                                         {
687                                                 hooked_roff(format(_("¡¢%s", ", %s"), r_name + rf_ptr->name));
688                                         }
689                                         else
690                                         {
691 #ifdef JP
692                                                 hooked_roff(format("¡¢ %dd%d ÂΤÎ%s", r_ptr->reinforce_dd[n], r_ptr->reinforce_ds[n],
693                                                         r_name + rf_ptr->name));
694 #else
695                                                 bool plural = (r_ptr->reinforce_dd[n] * r_ptr->reinforce_ds[n] > 1);
696                                                 char name[80];
697                                                 strcpy(name, r_name + rf_ptr->name);
698                                                 if(plural) plural_aux(name);
699                                                 hooked_roff(format(",%dd%d %s", r_ptr->reinforce_dd[n], r_ptr->reinforce_ds[n], name));
700 #endif
701                                         }
702                                 }
703                         }
704                         hooked_roff(_("¤ÇÀ®¤êΩ¤Ã¤Æ¤¤¤ë¡£", "."));
705                 }
706         }
707
708         /* Describe friends */
709         else if (flags1 & RF1_FRIENDS)
710         {
711                 hooked_roff(format(_("%^s¤ÏÄ̾クÃĤǸ½¤ì¤ë¡£", "%^s usually appears in groups.  "), wd_he[msex]));
712         }
713
714
715         /* Collect inate attacks */
716         vn = 0;
717         if (flags4 & RF4_SHRIEK)  { vp[vn] = _("ÈáÌĤǽõ¤±¤òµá¤á¤ë", "shriek for help"); color[vn++] = TERM_L_WHITE; }
718         if (flags4 & RF4_ROCKET)  { vp[vn] = _("¥í¥±¥Ã¥È¤òȯ¼Í¤¹¤ë", "shoot a rocket"); color[vn++] = TERM_UMBER; }
719         if (flags4 & RF4_SHOOT) { vp[vn] = _("¼Í·â¤ò¤¹¤ë", "fire an arrow"); color[vn++] = TERM_UMBER; }
720         if (flags6 & (RF6_SPECIAL)) { vp[vn] = _("ÆÃÊ̤ʹÔÆ°¤ò¤¹¤ë", "do something"); color[vn++] = TERM_VIOLET; }
721
722         /* Describe inate attacks */
723         if (vn)
724         {
725                 /* Intro */
726                 hooked_roff(format(_("%^s¤Ï", "%^s"), wd_he[msex]));
727
728
729                 /* Scan */
730                 for (n = 0; n < vn; n++)
731                 {
732 #ifdef JP
733                         if (n != vn - 1)
734                         {
735                                 jverb(vp[n], jverb_buf, JVERB_OR);
736                                 hook_c_roff(color[n], jverb_buf);
737                                 hook_c_roff(color[n], "¤ê");
738                                 hooked_roff("¡¢");
739                         }
740                         else hook_c_roff(color[n], vp[n]);
741 #else
742                         /* Intro */
743                         if (n == 0) hooked_roff(" may ");
744                         else if (n < vn - 1) hooked_roff(", ");
745                         else hooked_roff(" or ");
746
747                         /* Dump */
748                         hook_c_roff(color[n], vp[n]);
749 #endif
750
751                 }
752
753                 /* End */
754                 hooked_roff(_("¤³¤È¤¬¤¢¤ë¡£", ".  "));
755         }
756
757
758         /* Collect breaths */
759         vn = 0;
760         if (flags4 & (RF4_BR_ACID))             { vp[vn] = _("»À", "acid"); color[vn++] = TERM_GREEN; }
761         if (flags4 & (RF4_BR_ELEC))             { vp[vn] = _("°ðºÊ", "lightning"); color[vn++] = TERM_BLUE; }
762         if (flags4 & (RF4_BR_FIRE))             { vp[vn] = _("²Ð±ê", "fire"); color[vn++] = TERM_RED; }
763         if (flags4 & (RF4_BR_COLD))             { vp[vn] = _("Î䵤", "frost"); color[vn++] = TERM_L_WHITE; }
764         if (flags4 & (RF4_BR_POIS))             { vp[vn] = _("ÆÇ", "poison"); color[vn++] = TERM_L_GREEN; }
765         if (flags4 & (RF4_BR_NETH))             { vp[vn] = _("ÃϹö", "nether"); color[vn++] = TERM_L_DARK; }
766         if (flags4 & (RF4_BR_LITE))             { vp[vn] = _("Á®¸÷", "light"); color[vn++] = TERM_YELLOW; }
767         if (flags4 & (RF4_BR_DARK))             { vp[vn] = _("°Å¹õ", "darkness"); color[vn++] = TERM_L_DARK; }
768         if (flags4 & (RF4_BR_CONF))             { vp[vn] = _("º®Íð", "confusion"); color[vn++] = TERM_L_UMBER; }
769         if (flags4 & (RF4_BR_SOUN))             { vp[vn] = _("¹ì²»", "sound"); color[vn++] = TERM_ORANGE; }
770         if (flags4 & (RF4_BR_CHAO))             { vp[vn] = _("¥«¥ª¥¹", "chaos"); color[vn++] = TERM_VIOLET; }
771         if (flags4 & (RF4_BR_DISE))             { vp[vn] = _("Îô²½", "disenchantment"); color[vn++] = TERM_VIOLET; }
772         if (flags4 & (RF4_BR_NEXU))             { vp[vn] = _("°ø²Ìº®Íð", "nexus"); color[vn++] = TERM_VIOLET; }
773         if (flags4 & (RF4_BR_TIME))             { vp[vn] = _("»þ´ÖµÕž", "time"); color[vn++] = TERM_L_BLUE; }
774         if (flags4 & (RF4_BR_INER))             { vp[vn] = _("ÃÙÆß", "inertia"); color[vn++] = TERM_SLATE; }
775         if (flags4 & (RF4_BR_GRAV))             { vp[vn] = _("½ÅÎÏ", "gravity"); color[vn++] = TERM_SLATE; }
776         if (flags4 & (RF4_BR_SHAR))             { vp[vn] = _("ÇËÊÒ", "shards"); color[vn++] = TERM_L_UMBER; }
777         if (flags4 & (RF4_BR_PLAS))             { vp[vn] = _("¥×¥é¥º¥Þ", "plasma"); color[vn++] = TERM_L_RED; }
778         if (flags4 & (RF4_BR_WALL))             { vp[vn] = _("¥Õ¥©¡¼¥¹", "force"); color[vn++] = TERM_UMBER; }
779         if (flags4 & (RF4_BR_MANA))             { vp[vn] = _("ËâÎÏ", "mana"); color[vn++] = TERM_L_BLUE; }
780         if (flags4 & (RF4_BR_NUKE))             { vp[vn] = _("Êü¼ÍÀ­ÇÑ´þʪ", "toxic waste"); color[vn++] = TERM_L_GREEN; }
781         if (flags4 & (RF4_BR_DISI))             { vp[vn] = _("ʬ²ò", "disintegration"); color[vn++] = TERM_SLATE; }
782
783         /* Describe breaths */
784         if (vn)
785         {
786                 /* Note breath */
787                 breath = TRUE;
788
789                 /* Intro */
790                 hooked_roff(format(_("%^s¤Ï", "%^s"), wd_he[msex]));
791
792                 /* Scan */
793                 for (n = 0; n < vn; n++)
794                 {
795                         /* Intro */
796 #ifdef JP
797                         if ( n != 0 ) hooked_roff("¤ä");
798 #else
799                         if (n == 0) hooked_roff(" may breathe ");
800                         else if (n < vn-1) hooked_roff(", ");
801                         else hooked_roff(" or ");
802 #endif
803
804
805                         /* Dump */
806                         hook_c_roff(color[n], vp[n]);
807                 }
808 #ifdef JP
809                 hooked_roff("¤Î¥Ö¥ì¥¹¤òÅǤ¯¤³¤È¤¬¤¢¤ë");
810 #endif
811         }
812
813
814         /* Collect spells */
815         vn = 0;
816         if (flags5 & (RF5_BA_ACID))         { vp[vn] = _("¥¢¥·¥Ã¥É¡¦¥Ü¡¼¥ë", "produce acid balls"); color[vn++] = TERM_GREEN; }
817         if (flags5 & (RF5_BA_ELEC))         { vp[vn] = _("¥µ¥ó¥À¡¼¡¦¥Ü¡¼¥ë", "produce lightning balls"); color[vn++] = TERM_BLUE; }
818         if (flags5 & (RF5_BA_FIRE))         { vp[vn] = _("¥Õ¥¡¥¤¥¢¡¦¥Ü¡¼¥ë", "produce fire balls"); color[vn++] = TERM_RED; }
819         if (flags5 & (RF5_BA_COLD))         { vp[vn] = _("¥¢¥¤¥¹¡¦¥Ü¡¼¥ë", "produce frost balls"); color[vn++] = TERM_L_WHITE; }
820         if (flags5 & (RF5_BA_POIS))         { vp[vn] = _("°­½­±À", "produce poison balls"); color[vn++] = TERM_L_GREEN; }
821         if (flags5 & (RF5_BA_NETH))         { vp[vn] = _("ÃϹöµå", "produce nether balls"); color[vn++] = TERM_L_DARK; }
822         if (flags5 & (RF5_BA_WATE))         { vp[vn] = _("¥¦¥©¡¼¥¿¡¼¡¦¥Ü¡¼¥ë", "produce water balls"); color[vn++] = TERM_BLUE; }
823         if (flags4 & (RF4_BA_NUKE))         { vp[vn] = _("Êü¼Íǽµå", "produce balls of radiation"); color[vn++] = TERM_L_GREEN; }
824         if (flags5 & (RF5_BA_MANA))         { vp[vn] = _("ËâÎϤÎÍò", "invoke mana storms"); color[vn++] = TERM_L_BLUE; }
825         if (flags5 & (RF5_BA_DARK))         { vp[vn] = _("°Å¹õ¤ÎÍò", "invoke darkness storms"); color[vn++] = TERM_L_DARK; }
826         if (flags5 & (RF5_BA_LITE))         { vp[vn] = _("¥¹¥¿¡¼¥Ð¡¼¥¹¥È", "invoke starburst"); color[vn++] = TERM_YELLOW; }
827         if (flags4 & (RF4_BA_CHAO))         { vp[vn] = _("½ã¥í¥°¥ë¥¹", "invoke raw Logrus"); color[vn++] = TERM_VIOLET; }
828         if (flags6 & (RF6_HAND_DOOM))       { vp[vn] = _("ÇËÌǤμê", "invoke the Hand of Doom"); color[vn++] = TERM_VIOLET; }
829         if (flags6 & (RF6_PSY_SPEAR))       { vp[vn] = _("¸÷¤Î·õ", "psycho-spear"); color[vn++] = TERM_YELLOW; }
830         if (flags5 & (RF5_DRAIN_MANA))      { vp[vn] = _("ËâÎϵۼý", "drain mana"); color[vn++] = TERM_SLATE; }
831         if (flags5 & (RF5_MIND_BLAST))      { vp[vn] = _("Àº¿À¹¶·â", "cause mind blasting"); color[vn++] = TERM_L_RED; }
832         if (flags5 & (RF5_BRAIN_SMASH))     { vp[vn] = _("Ǿ¹¶·â", "cause brain smashing"); color[vn++] = TERM_RED; }
833         if (flags5 & (RF5_CAUSE_1))         { vp[vn] = _("·Ú½ý¡Ü¼ö¤¤", "cause light wounds and cursing"); color[vn++] = TERM_L_WHITE; }
834         if (flags5 & (RF5_CAUSE_2))         { vp[vn] = _("½Å½ý¡Ü¼ö¤¤", "cause serious wounds and cursing"); color[vn++] = TERM_L_WHITE; }
835         if (flags5 & (RF5_CAUSE_3))         { vp[vn] = _("Ã×Ì¿½ý¡Ü¼ö¤¤", "cause critical wounds and cursing"); color[vn++] = TERM_L_WHITE; }
836         if (flags5 & (RF5_CAUSE_4))         { vp[vn] = _("È빦¤òÆͤ¯", "cause mortal wounds"); color[vn++] = TERM_L_WHITE; }
837         if (flags5 & (RF5_BO_ACID))         { vp[vn] = _("¥¢¥·¥Ã¥É¡¦¥Ü¥ë¥È", "produce acid bolts"); color[vn++] = TERM_GREEN; }
838         if (flags5 & (RF5_BO_ELEC))         { vp[vn] = _("¥µ¥ó¥À¡¼¡¦¥Ü¥ë¥È", "produce lightning bolts"); color[vn++] = TERM_BLUE; }
839         if (flags5 & (RF5_BO_FIRE))         { vp[vn] = _("¥Õ¥¡¥¤¥¢¡¦¥Ü¥ë¥È", "produce fire bolts"); color[vn++] = TERM_RED; }
840         if (flags5 & (RF5_BO_COLD))         { vp[vn] = _("¥¢¥¤¥¹¡¦¥Ü¥ë¥È", "produce frost bolts"); color[vn++] = TERM_L_WHITE; }
841         if (flags5 & (RF5_BO_NETH))         { vp[vn] = _("ÃϹö¤ÎÌð", "produce nether bolts"); color[vn++] = TERM_L_DARK; }
842         if (flags5 & (RF5_BO_WATE))         { vp[vn] = _("¥¦¥©¡¼¥¿¡¼¡¦¥Ü¥ë¥È", "produce water bolts"); color[vn++] = TERM_BLUE; }
843         if (flags5 & (RF5_BO_MANA))         { vp[vn] = _("ËâÎϤÎÌð", "produce mana bolts"); color[vn++] = TERM_L_BLUE; }
844         if (flags5 & (RF5_BO_PLAS))         { vp[vn] = _("¥×¥é¥º¥Þ¡¦¥Ü¥ë¥È", "produce plasma bolts"); color[vn++] = TERM_L_RED; }
845         if (flags5 & (RF5_BO_ICEE))         { vp[vn] = _("¶Ë´¨¤ÎÌð", "produce ice bolts"); color[vn++] = TERM_WHITE; }
846         if (flags5 & (RF5_MISSILE))         { vp[vn] = _("¥Þ¥¸¥Ã¥¯¥ß¥µ¥¤¥ë", "produce magic missiles"); color[vn++] = TERM_SLATE; }
847         if (flags5 & (RF5_SCARE))           { vp[vn] = _("¶²ÉÝ", "terrify"); color[vn++] = TERM_SLATE; }
848         if (flags5 & (RF5_BLIND))           { vp[vn] = _("Ìܤ¯¤é¤Þ¤·", "blind"); color[vn++] = TERM_L_DARK; }
849         if (flags5 & (RF5_CONF))            { vp[vn] = _("º®Íð", "confuse"); color[vn++] = TERM_L_UMBER; }
850         if (flags5 & (RF5_SLOW))            { vp[vn] = _("¸ºÂ®", "slow"); color[vn++] = TERM_UMBER; }
851         if (flags5 & (RF5_HOLD))            { vp[vn] = _("Ëãáã", "paralyze"); color[vn++] = TERM_RED; }
852         if (flags6 & (RF6_HASTE))           { vp[vn] = _("²Ã®", "haste-self"); color[vn++] = TERM_L_GREEN; }
853         if (flags6 & (RF6_HEAL))            { vp[vn] = _("¼£Ìþ", "heal-self"); color[vn++] = TERM_WHITE; }
854         if (flags6 & (RF6_INVULNER))        { vp[vn] = _("̵Ũ²½", "make invulnerable"); color[vn++] = TERM_WHITE; }
855         if (flags4 & RF4_DISPEL)            { vp[vn] = _("ËâÎϾõî", "dispel-magic"); color[vn++] = TERM_L_WHITE; }
856         if (flags6 & (RF6_BLINK))           { vp[vn] = _("¥·¥ç¡¼¥È¥Æ¥ì¥Ý¡¼¥È", "blink-self"); color[vn++] = TERM_UMBER; }
857         if (flags6 & (RF6_TPORT))           { vp[vn] = _("¥Æ¥ì¥Ý¡¼¥È", "teleport-self"); color[vn++] = TERM_ORANGE; }
858         if (flags6 & (RF6_WORLD))           { vp[vn] = _("»þ¤ò»ß¤á¤ë", "stop the time"); color[vn++] = TERM_L_BLUE; }
859         if (flags6 & (RF6_TELE_TO))         { vp[vn] = _("¥Æ¥ì¥Ý¡¼¥È¥Ð¥Ã¥¯", "teleport to"); color[vn++] = TERM_L_UMBER; }
860         if (flags6 & (RF6_TELE_AWAY))       { vp[vn] = _("¥Æ¥ì¥Ý¡¼¥È¥¢¥¦¥§¥¤", "teleport away"); color[vn++] = TERM_UMBER; }
861         if (flags6 & (RF6_TELE_LEVEL))      { vp[vn] = _("¥Æ¥ì¥Ý¡¼¥È¡¦¥ì¥Ù¥ë", "teleport level"); color[vn++] = TERM_ORANGE; }
862
863         if (flags6 & (RF6_DARKNESS))
864         {
865                 if ((p_ptr->pclass != CLASS_NINJA) || (r_ptr->flags3 & (RF3_UNDEAD | RF3_HURT_LITE)) || (r_ptr->flags7 & RF7_DARK_MASK))
866                 {
867                         vp[vn] = _("°Å°Ç", "create darkness"); color[vn++] = TERM_L_DARK;
868                 }
869                 else
870                 {
871                         vp[vn] = _("Á®¸÷", "create light"); color[vn++] = TERM_YELLOW;
872                 }
873         }
874
875         if (flags6 & (RF6_TRAPS))           { vp[vn] = _("¥È¥é¥Ã¥×", "create traps"); color[vn++] = TERM_BLUE; }
876         if (flags6 & (RF6_FORGET))          { vp[vn] = _("µ­²±¾Ãµî", "cause amnesia"); color[vn++] = TERM_BLUE; }
877         if (flags6 & (RF6_RAISE_DEAD))      { vp[vn] = _("»à¼ÔÉü³è", "raise dead"); color[vn++] = TERM_RED; }
878         if (flags6 & (RF6_S_MONSTER))       { vp[vn] = _("¥â¥ó¥¹¥¿¡¼°ìÂξ¤´­", "summon a monster"); color[vn++] = TERM_SLATE; }
879         if (flags6 & (RF6_S_MONSTERS))      { vp[vn] = _("¥â¥ó¥¹¥¿¡¼Ê£¿ô¾¤´­", "summon monsters"); color[vn++] = TERM_L_WHITE; }
880         if (flags6 & (RF6_S_KIN))           { vp[vn] = _("µß±ç¾¤´­", "summon aid"); color[vn++] = TERM_ORANGE; }
881         if (flags6 & (RF6_S_ANT))           { vp[vn] = _("¥¢¥ê¾¤´­", "summon ants"); color[vn++] = TERM_RED; }
882         if (flags6 & (RF6_S_SPIDER))        { vp[vn] = _("¥¯¥â¾¤´­", "summon spiders"); color[vn++] = TERM_L_DARK; }
883         if (flags6 & (RF6_S_HOUND))         { vp[vn] = _("¥Ï¥¦¥ó¥É¾¤´­", "summon hounds"); color[vn++] = TERM_L_UMBER; }
884         if (flags6 & (RF6_S_HYDRA))         { vp[vn] = _("¥Ò¥É¥é¾¤´­", "summon hydras"); color[vn++] = TERM_L_GREEN; }
885         if (flags6 & (RF6_S_ANGEL))         { vp[vn] = _("Å·»È°ìÂξ¤´­", "summon an angel"); color[vn++] = TERM_YELLOW; }
886         if (flags6 & (RF6_S_DEMON))         { vp[vn] = _("¥Ç¡¼¥â¥ó°ìÂξ¤´­", "summon a demon"); color[vn++] = TERM_L_RED; }
887         if (flags6 & (RF6_S_UNDEAD))        { vp[vn] = _("¥¢¥ó¥Ç¥Ã¥É°ìÂξ¤´­", "summon an undead"); color[vn++] = TERM_L_DARK; }
888         if (flags6 & (RF6_S_DRAGON))        { vp[vn] = _("¥É¥é¥´¥ó°ìÂξ¤´­", "summon a dragon"); color[vn++] = TERM_ORANGE; }
889         if (flags6 & (RF6_S_HI_UNDEAD))     { vp[vn] = _("¶¯ÎϤʥ¢¥ó¥Ç¥Ã¥É¾¤´­", "summon Greater Undead"); color[vn++] = TERM_L_DARK; }
890         if (flags6 & (RF6_S_HI_DRAGON))     { vp[vn] = _("¸ÅÂå¥É¥é¥´¥ó¾¤´­", "summon Ancient Dragons"); color[vn++] = TERM_ORANGE; }    
891         if (flags6 & (RF6_S_CYBER))         { vp[vn] = _("¥µ¥¤¥Ð¡¼¥Ç¡¼¥â¥ó¾¤´­", "summon Cyberdemons"); color[vn++] = TERM_UMBER; }
892         if (flags6 & (RF6_S_AMBERITES))     { vp[vn] = _("¥¢¥ó¥Ð¡¼¤Î²¦Â²¾¤´­", "summon Lords of Amber"); color[vn++] = TERM_VIOLET; }
893         if (flags6 & (RF6_S_UNIQUE))        { vp[vn] = _("¥æ¥Ë¡¼¥¯¡¦¥â¥ó¥¹¥¿¡¼¾¤´­", "summon Unique Monsters"); color[vn++] = TERM_VIOLET; }
894
895
896         /* Describe spells */
897         if (vn)
898         {
899                 /* Note magic */
900                 magic = TRUE;
901
902                 /* Intro */
903                 if (breath)
904                 {
905                         hooked_roff(_("¡¢¤Ê¤ª¤«¤Ä", ", and is also"));
906                 }
907                 else
908                 {
909                         hooked_roff(format(_("%^s¤Ï", "%^s is"), wd_he[msex]));
910                 }
911
912 #ifdef JP
913                 /* Adverb */
914                 if (flags2 & (RF2_SMART)) hook_c_roff(TERM_YELLOW, "Ū³Î¤Ë");
915
916                 /* Verb Phrase */
917                 hooked_roff("ËâË¡¤ò»È¤¦¤³¤È¤¬¤Ç¤­¡¢");
918 #else
919                 /* Verb Phrase */
920                 hooked_roff(" magical, casting spells");
921
922                 /* Adverb */
923                 if (flags2 & RF2_SMART) hook_c_roff(TERM_YELLOW, " intelligently");
924 #endif
925
926
927                 /* Scan */
928                 for (n = 0; n < vn; n++)
929                 {
930                         /* Intro */
931 #ifdef JP
932                         if ( n != 0 ) hooked_roff("¡¢");
933 #else
934                         if (n == 0) hooked_roff(" which ");
935                         else if (n < vn-1) hooked_roff(", ");
936                         else hooked_roff(" or ");
937 #endif
938
939
940                         /* Dump */
941                         hook_c_roff(color[n], vp[n]);
942                 }
943 #ifdef JP
944                 hooked_roff("¤Î¼öʸ¤ò¾§¤¨¤ë¤³¤È¤¬¤¢¤ë");
945 #endif
946         }
947
948
949         /* End the sentence about inate/other spells */
950         if (breath || magic)
951         {
952                 /* Total casting */
953                 m = r_ptr->r_cast_spell;
954
955                 /* Average frequency */
956                 n = r_ptr->freq_spell;
957
958                 /* Describe the spell frequency */
959                 if (m > 100 || know_everything)
960                 {
961                         hooked_roff(format(
962                                 _("(³ÎΨ:1/%d)", "; 1 time in %d"), 100 / n));
963                 }
964
965                 /* Guess at the frequency */
966                 else if (m)
967                 {
968                         n = ((n + 9) / 10) * 10;
969                         hooked_roff(format(
970                                 _("(³ÎΨ:Ìó1/%d)", "; about 1 time in %d"), 100 / n));
971                 }
972
973                 /* End this sentence */
974                 hooked_roff(_("¡£", ".  "));
975         }
976
977         /* Describe monster "toughness" */
978         if (know_armour(r_idx))
979         {
980                 /* Armor */
981                 hooked_roff(format(
982                         _("%^s¤Ï AC%d ¤ÎËɸæÎϤÈ", "%^s has an armor rating of %d"),
983                             wd_he[msex], r_ptr->ac));
984
985                 /* Maximized hitpoints */
986                 if ((flags1 & RF1_FORCE_MAXHP) || (r_ptr->hside == 1))
987                 {
988                         u32b hp = r_ptr->hdice * (nightmare ? 2 : 1) * r_ptr->hside;
989                         hooked_roff(format(
990                                 _(" %d ¤ÎÂÎÎϤ¬¤¢¤ë¡£", " and a life rating of %d.  "),
991                                     (s16b)MIN(30000, hp)));
992                 }
993
994                 /* Variable hitpoints */
995                 else
996                 {
997                         hooked_roff(format(
998                                 _(" %dd%d ¤ÎÂÎÎϤ¬¤¢¤ë¡£", " and a life rating of %dd%d.  "),
999                                     r_ptr->hdice * (nightmare ? 2 : 1), r_ptr->hside));
1000                 }
1001         }
1002
1003
1004
1005         /* Collect special abilities. */
1006         vn = 0;
1007         if (flags7 & (RF7_HAS_LITE_1 | RF7_HAS_LITE_2)) { vp[vn] = _("¥À¥ó¥¸¥ç¥ó¤ò¾È¤é¤¹", "illuminate the dungeon");     color[vn++] = TERM_WHITE; }
1008         if (flags7 & (RF7_HAS_DARK_1 | RF7_HAS_DARK_2)) { vp[vn] = _("¥À¥ó¥¸¥ç¥ó¤ò°Å¤¯¤¹¤ë", "darken the dungeon");   color[vn++] = TERM_L_DARK; }
1009         if (flags2 & RF2_OPEN_DOOR) { vp[vn] = _("¥É¥¢¤ò³«¤±¤ë", "open doors"); color[vn++] = TERM_WHITE; }
1010         if (flags2 & RF2_BASH_DOOR) { vp[vn] = _("¥É¥¢¤òÂǤÁÇˤë", "bash down doors"); color[vn++] = TERM_WHITE; }
1011         if (flags7 & RF7_CAN_FLY)  { vp[vn] = _("¶õ¤òÈô¤Ö", "fly"); color[vn++] = TERM_WHITE; }
1012         if (flags7 & RF7_CAN_SWIM)   { vp[vn] = _("¿å¤òÅϤë", "swim"); color[vn++] = TERM_WHITE; }
1013         if (flags2 & RF2_PASS_WALL) { vp[vn] = _("Êɤò¤¹¤êÈ´¤±¤ë", "pass through walls"); color[vn++] = TERM_WHITE; }
1014         if (flags2 & RF2_KILL_WALL) { vp[vn] = _("Êɤò·¡¤ê¿Ê¤à", "bore through walls"); color[vn++] = TERM_WHITE; }
1015         if (flags2 & RF2_MOVE_BODY) { vp[vn] = _("¼å¤¤¥â¥ó¥¹¥¿¡¼¤ò²¡¤·¤Î¤±¤ë", "push past weaker monsters"); color[vn++] = TERM_WHITE; }
1016         if (flags2 & RF2_KILL_BODY) { vp[vn] = _("¼å¤¤¥â¥ó¥¹¥¿¡¼¤òÅݤ¹", "destroy weaker monsters"); color[vn++] = TERM_WHITE; }
1017         if (flags2 & RF2_TAKE_ITEM) { vp[vn] = _("¥¢¥¤¥Æ¥à¤ò½¦¤¦", "pick up objects"); color[vn++] = TERM_WHITE; }
1018         if (flags2 & RF2_KILL_ITEM) { vp[vn] = _("¥¢¥¤¥Æ¥à¤ò²õ¤¹", "destroy objects"); color[vn++] = TERM_WHITE; }
1019
1020
1021         /* Describe special abilities. */
1022         if (vn)
1023         {
1024                 /* Intro */
1025                 hooked_roff(format(_("%^s¤Ï", "%^s"), wd_he[msex]));
1026
1027                 /* Scan */
1028                 for (n = 0; n < vn; n++)
1029                 {
1030                         /* Intro */
1031 #ifdef JP
1032                         if (n != vn - 1)
1033                         {
1034                                 jverb(vp[n], jverb_buf, JVERB_AND);
1035                                 hook_c_roff(color[n], jverb_buf);
1036                                 hooked_roff("¡¢");
1037                         }
1038                         else hook_c_roff(color[n], vp[n]);
1039 #else
1040                         if (n == 0) hooked_roff(" can ");
1041                         else if (n < vn - 1) hooked_roff(", ");
1042                         else hooked_roff(" and ");
1043
1044                         /* Dump */
1045                         hook_c_roff(color[n], vp[n]);
1046 #endif
1047
1048                 }
1049
1050                 /* End */
1051                 hooked_roff(_("¤³¤È¤¬¤Ç¤­¤ë¡£", ".  "));
1052
1053         }
1054         
1055         /* Aquatic */
1056         if (flags7 & RF7_AQUATIC)
1057         {
1058                 hooked_roff(format(_("%^s¤Ï¿åÃæ¤ËÀ³¤ó¤Ç¤¤¤ë¡£", "%^s lives in water.  "), wd_he[msex]));
1059         }
1060
1061         /* Describe special abilities. */
1062         if (flags7 & (RF7_SELF_LITE_1 | RF7_SELF_LITE_2))
1063         {
1064                 hooked_roff(format(_("%^s¤Ï¸÷¤Ã¤Æ¤¤¤ë¡£", "%^s is shining.  "), wd_he[msex]));
1065         }
1066         if (flags7 & (RF7_SELF_DARK_1 | RF7_SELF_DARK_2))
1067         {
1068                 hook_c_roff(TERM_L_DARK, format(_("%^s¤Ï°Å¹õ¤ËÊñ¤Þ¤ì¤Æ¤¤¤ë¡£", "%^s is surrounded by darkness.  "), wd_he[msex]));
1069         }
1070         if (flags2 & RF2_INVISIBLE)
1071         {
1072                 hooked_roff(format(_("%^s¤ÏÆ©ÌÀ¤ÇÌܤ˸«¤¨¤Ê¤¤¡£", "%^s is invisible.  "), wd_he[msex]));
1073         }
1074         if (flags2 & RF2_COLD_BLOOD)
1075         {
1076                 hooked_roff(format(_("%^s¤ÏÎä·ìưʪ¤Ç¤¢¤ë¡£", "%^s is cold blooded.  "), wd_he[msex]));
1077         }
1078         if (flags2 & RF2_EMPTY_MIND)
1079         {
1080                 hooked_roff(format(_("%^s¤Ï¥Æ¥ì¥Ñ¥·¡¼¤Ç¤Ï´¶ÃΤǤ­¤Ê¤¤¡£", "%^s is not detected by telepathy.  "), wd_he[msex]));
1081         }
1082         else if (flags2 & RF2_WEIRD_MIND)
1083         {
1084                 hooked_roff(format(_("%^s¤Ï¤Þ¤ì¤Ë¥Æ¥ì¥Ñ¥·¡¼¤Ç´¶ÃΤǤ­¤ë¡£", "%^s is rarely detected by telepathy.  "), wd_he[msex]));
1085         }
1086         if (flags2 & RF2_MULTIPLY)
1087         {
1088                 hook_c_roff(TERM_L_UMBER, format(_("%^s¤ÏÇúȯŪ¤ËÁý¿£¤¹¤ë¡£", "%^s breeds explosively.  "), wd_he[msex]));
1089         }
1090         if (flags2 & RF2_REGENERATE)
1091         {
1092                 hook_c_roff(TERM_L_WHITE, format(_("%^s¤ÏÁÇÁ᤯ÂÎÎϤò²óÉü¤¹¤ë¡£", "%^s regenerates quickly.  "), wd_he[msex]));
1093         }
1094         if (flags7 & RF7_RIDING)
1095         {
1096                 hook_c_roff(TERM_SLATE, format(_("%^s¤Ë¾è¤ë¤³¤È¤¬¤Ç¤­¤ë¡£", "%^s is suitable for riding.  "), wd_he[msex]));
1097         }
1098
1099
1100         /* Collect susceptibilities */
1101         vn = 0;
1102         if (flags3 & RF3_HURT_ROCK) { vp[vn] = _("´ä¤ò½üµî¤¹¤ë¤â¤Î", "rock remover"); color[vn++] = TERM_UMBER; }
1103         if (flags3 & RF3_HURT_LITE) { vp[vn] = _("ÌÀ¤ë¤¤¸÷", "bright light"); color[vn++] = TERM_YELLOW; }
1104         if (flags3 & RF3_HURT_FIRE) { vp[vn] = _("±ê", "fire"); color[vn++] = TERM_RED; }
1105         if (flags3 & RF3_HURT_COLD) { vp[vn] = _("Î䵤", "cold"); color[vn++] = TERM_L_WHITE; }
1106
1107
1108         /* Describe susceptibilities */
1109         if (vn)
1110         {
1111                 /* Intro */
1112                 hooked_roff(format(_("%^s¤Ë¤Ï", "%^s"), wd_he[msex]));
1113
1114                 /* Scan */
1115                 for (n = 0; n < vn; n++)
1116                 {
1117                         /* Intro */
1118 #ifdef JP
1119                         if ( n != 0 ) hooked_roff("¤ä");
1120 #else
1121                         if (n == 0) hooked_roff(" is hurt by ");
1122                         else if (n < vn-1) hooked_roff(", ");
1123                         else hooked_roff(" and ");
1124 #endif
1125
1126
1127                         /* Dump */
1128                         hook_c_roff(color[n], vp[n]);
1129                 }
1130
1131                 /* End */
1132                 hooked_roff(_("¤Ç¥À¥á¡¼¥¸¤òÍ¿¤¨¤é¤ì¤ë¡£", ".  "));
1133         }
1134
1135
1136         /* Collect immunities */
1137         vn = 0;
1138         if (flagsr & RFR_IM_ACID) { vp[vn] = _("»À", "acid"); color[vn++] = TERM_GREEN; }
1139         if (flagsr & RFR_IM_ELEC) { vp[vn] = _("°ðºÊ", "lightning"); color[vn++] = TERM_BLUE; }
1140         if (flagsr & RFR_IM_FIRE) { vp[vn] = _("±ê", "fire"); color[vn++] = TERM_RED; }
1141         if (flagsr & RFR_IM_COLD) { vp[vn] = _("Î䵤", "cold"); color[vn++] = TERM_L_WHITE; }
1142         if (flagsr & RFR_IM_POIS) { vp[vn] = _("ÆÇ", "poison"); color[vn++] = TERM_L_GREEN; }
1143
1144
1145         /* Collect resistances */
1146         if (flagsr & RFR_RES_LITE) { vp[vn] = _("Á®¸÷", "light"); color[vn++] = TERM_YELLOW; }
1147         if (flagsr & RFR_RES_DARK) { vp[vn] = _("°Å¹õ", "dark"); color[vn++] = TERM_L_DARK; }
1148         if (flagsr & RFR_RES_NETH) { vp[vn] = _("ÃϹö", "nether"); color[vn++] = TERM_L_DARK; }
1149         if (flagsr & RFR_RES_WATE) { vp[vn] = _("¿å", "water"); color[vn++] = TERM_BLUE; }
1150         if (flagsr & RFR_RES_PLAS) { vp[vn] = _("¥×¥é¥º¥Þ", "plasma"); color[vn++] = TERM_L_RED; }
1151         if (flagsr & RFR_RES_SHAR) { vp[vn] = _("ÇËÊÒ", "shards"); color[vn++] = TERM_L_UMBER; }
1152         if (flagsr & RFR_RES_SOUN) { vp[vn] = _("¹ì²»", "sound"); color[vn++] = TERM_ORANGE; }
1153         if (flagsr & RFR_RES_CHAO) { vp[vn] = _("¥«¥ª¥¹", "chaos"); color[vn++] = TERM_VIOLET; }
1154         if (flagsr & RFR_RES_NEXU) { vp[vn] = _("°ø²Ìº®Íð", "nexus"); color[vn++] = TERM_VIOLET; }
1155         if (flagsr & RFR_RES_DISE) { vp[vn] = _("Îô²½", "disenchantment"); color[vn++] = TERM_VIOLET; }
1156         if (flagsr & RFR_RES_WALL) { vp[vn] = _("¥Õ¥©¡¼¥¹", "force"); color[vn++] = TERM_UMBER; }
1157         if (flagsr & RFR_RES_INER) { vp[vn] = _("ÃÙÆß", "inertia"); color[vn++] = TERM_SLATE; }
1158         if (flagsr & RFR_RES_TIME) { vp[vn] = _("»þ´ÖµÕž", "time"); color[vn++] = TERM_L_BLUE; }
1159         if (flagsr & RFR_RES_GRAV) { vp[vn] = _("½ÅÎÏ", "gravity"); color[vn++] = TERM_SLATE; }
1160         if (flagsr & RFR_RES_ALL) { vp[vn] = _("¤¢¤é¤æ¤ë¹¶·â", "all"); color[vn++] = TERM_YELLOW; }
1161         if ((flagsr & RFR_RES_TELE) && !(r_ptr->flags1 & RF1_UNIQUE)) { vp[vn] = _("¥Æ¥ì¥Ý¡¼¥È", "teleportation"); color[vn++] = TERM_ORANGE; }
1162
1163         /* Describe immunities and resistances */
1164         if (vn)
1165         {
1166                 /* Intro */
1167                 hooked_roff(format(_("%^s¤Ï", "%^s"), wd_he[msex]));
1168
1169                 /* Scan */
1170                 for (n = 0; n < vn; n++)
1171                 {
1172                         /* Intro */
1173 #ifdef JP
1174                         if ( n != 0 ) hooked_roff("¤È");
1175 #else
1176                         if (n == 0) hooked_roff(" resists ");
1177                         else if (n < vn-1) hooked_roff(", ");
1178                         else hooked_roff(" and ");
1179 #endif
1180
1181
1182                         /* Dump */
1183                         hook_c_roff(color[n], vp[n]);
1184                 }
1185
1186                 /* End */
1187                 hooked_roff(_("¤ÎÂÑÀ­¤ò»ý¤Ã¤Æ¤¤¤ë¡£", ".  "));
1188         }
1189
1190
1191         if ((r_ptr->r_xtra1 & MR1_SINKA) || know_everything)
1192         {
1193                 if (r_ptr->next_r_idx)
1194                 {
1195                         hooked_roff(format(_("%^s¤Ï·Ð¸³¤òÀѤà¤È¡¢", "%^s will evolve into "), wd_he[msex]));
1196                         hook_c_roff(TERM_YELLOW, format("%s", r_name+r_info[r_ptr->next_r_idx].name));
1197                         hooked_roff(format(
1198                                 _(("¤Ë¿Ê²½¤¹¤ë¡£"), 
1199                                   (" when %s gets enugh experience.  ", wd_he[msex]))));
1200                 }
1201                 else if (!(r_ptr->flags1 & RF1_UNIQUE))
1202                 {
1203                         hooked_roff(format(_("%s¤Ï¿Ê²½¤·¤Ê¤¤¡£", "%s won't evolve.  "), wd_he[msex]));
1204                 }
1205         }
1206
1207         /* Collect non-effects */
1208         vn = 0;
1209         if (flags3 & RF3_NO_STUN)  { vp[vn] = _("Û¯Û°¤È¤·¤Ê¤¤", "stunned"); color[vn++] = TERM_ORANGE; }
1210         if (flags3 & RF3_NO_FEAR)  { vp[vn] = _("¶²Éݤò´¶¤¸¤Ê¤¤", "frightened"); color[vn++] = TERM_SLATE; }
1211         if (flags3 & RF3_NO_CONF)  { vp[vn] = _("º®Í𤷤ʤ¤", "confused"); color[vn++] = TERM_L_UMBER; }
1212         if (flags3 & RF3_NO_SLEEP) { vp[vn] = _("̲¤é¤µ¤ì¤Ê¤¤", "slept"); color[vn++] = TERM_BLUE; }
1213         if ((flagsr & RFR_RES_TELE) && (r_ptr->flags1 & RF1_UNIQUE)) { vp[vn] = _("¥Æ¥ì¥Ý¡¼¥È¤µ¤ì¤Ê¤¤", "teleported"); color[vn++] = TERM_ORANGE; }
1214
1215         /* Describe non-effects */
1216         if (vn)
1217         {
1218                 /* Intro */
1219                 hooked_roff(format(
1220                         _("%^s¤Ï", "%^s"), wd_he[msex]));
1221
1222                 /* Scan */
1223                 for (n = 0; n < vn; n++)
1224                 {
1225                         /* Intro */
1226 #ifdef JP
1227                         if ( n != 0 ) hooked_roff("¤·¡¢");
1228 #else
1229                         if (n == 0) hooked_roff(" cannot be ");
1230                         else if (n < vn - 1) hooked_roff(", ");
1231                         else hooked_roff(" or ");
1232 #endif
1233
1234
1235                         /* Dump */
1236                         hook_c_roff(color[n], vp[n]);
1237                 }
1238
1239                 /* End */
1240                 hooked_roff(_("¡£", ".  "));
1241         }
1242
1243
1244         /* Do we know how aware it is? */
1245         if ((((int)r_ptr->r_wake * (int)r_ptr->r_wake) > r_ptr->sleep) ||
1246                   (r_ptr->r_ignore == MAX_UCHAR) ||
1247             (r_ptr->sleep == 0 && r_ptr->r_tkills >= 10) || know_everything)
1248         {
1249                 cptr act;
1250
1251                 if (r_ptr->sleep > 200)
1252                 {
1253                         act = _("¤ò̵»ë¤·¤¬¤Á¤Ç¤¢¤ë¤¬", "prefers to ignore");
1254                 }
1255                 else if (r_ptr->sleep > 95)
1256                 {
1257                         act = _("¤ËÂФ·¤Æ¤Û¤È¤ó¤ÉÃí°Õ¤òʧ¤ï¤Ê¤¤¤¬", "pays very little attention to");
1258                 }
1259                 else if (r_ptr->sleep > 75)
1260                 {
1261                         act = _("¤ËÂФ·¤Æ¤¢¤Þ¤êÃí°Õ¤òʧ¤ï¤Ê¤¤¤¬", "pays little attention to");
1262                 }
1263                 else if (r_ptr->sleep > 45)
1264                 {
1265                         act = _("¤ò¸«²á¤´¤·¤¬¤Á¤Ç¤¢¤ë¤¬", "tends to overlook");
1266                 }
1267                 else if (r_ptr->sleep > 25)
1268                 {
1269                         act = _("¤ò¤Û¤ó¤Î¾¯¤·¤Ï¸«¤Æ¤ª¤ê", "takes quite a while to see");
1270                 }
1271                 else if (r_ptr->sleep > 10)
1272                 {
1273                         act = _("¤ò¤·¤Ð¤é¤¯¤Ï¸«¤Æ¤ª¤ê", "takes a while to see");
1274                 }
1275                 else if (r_ptr->sleep > 5)
1276                 {
1277                         act = _("¤ò´öʬÃí°Õ¿¼¤¯¸«¤Æ¤ª¤ê", "is fairly observant of");
1278                 }
1279                 else if (r_ptr->sleep > 3)
1280                 {
1281                         act = _("¤òÃí°Õ¿¼¤¯¸«¤Æ¤ª¤ê", "is observant of");
1282                 }
1283                 else if (r_ptr->sleep > 1)
1284                 {
1285                         act = _("¤ò¤«¤Ê¤êÃí°Õ¿¼¤¯¸«¤Æ¤ª¤ê", "is very observant of");
1286                 }
1287                 else if (r_ptr->sleep > 0)
1288                 {
1289                         act = _("¤ò·Ù²ü¤·¤Æ¤ª¤ê", "is vigilant for");
1290                 }
1291                 else
1292                 {
1293                         act = _("¤ò¤«¤Ê¤ê·Ù²ü¤·¤Æ¤ª¤ê", "is ever vigilant for");
1294                 }
1295
1296                 hooked_roff(
1297                         _(format("%^s¤Ï¿¯Æþ¼Ô%s¡¢ %d ¥Õ¥£¡¼¥ÈÀ褫¤é¿¯Æþ¼Ô¤Ëµ¤ÉÕ¤¯¤³¤È¤¬¤¢¤ë¡£", wd_he[msex], act, 10 * r_ptr->aaf),
1298                           format("%^s %s intruders, which %s may notice from %d feet.  ", wd_he[msex], act, wd_he[msex], 10 * r_ptr->aaf)));
1299         }
1300
1301
1302         /* Drops gold and/or items */
1303         if (drop_gold || drop_item)
1304         {
1305                 /* Intro */
1306                 hooked_roff(format(
1307                         _("%^s¤Ï", "%^s may carry"), wd_he[msex]));
1308 #ifndef JP
1309                 /* No "n" needed */
1310                 sin = FALSE;
1311 #endif
1312
1313
1314                 /* Count maximum drop */
1315                 n = MAX(drop_gold, drop_item);
1316
1317                 /* One drop (may need an "n") */
1318                 if (n == 1)
1319                 {
1320                         hooked_roff(_("°ì¤Ä¤Î", " a"));
1321 #ifndef JP
1322                         sin = TRUE;
1323 #endif
1324                 }
1325
1326                 /* Two drops */
1327                 else if (n == 2)
1328                 {
1329                         hooked_roff(
1330                                 _("°ì¤Ä¤«Æó¤Ä¤Î", " one or two"));
1331                 }
1332
1333                 /* Many drops */
1334                 else
1335                 {
1336                         hooked_roff(format(
1337                                 _(" %d ¸Ä¤Þ¤Ç¤Î", " up to %d"), n));
1338                 }
1339
1340
1341                 /* Great */
1342                 if (flags1 & RF1_DROP_GREAT)
1343                 {
1344                         p = _("ÆÃÊ̤Ê", " exceptional");
1345                 }
1346
1347                 /* Good (no "n" needed) */
1348                 else if (flags1 & RF1_DROP_GOOD)
1349                 {
1350                         p = _("¾å¼Á¤Ê", " good");
1351 #ifndef JP
1352                         sin = FALSE;
1353 #endif
1354                 }
1355
1356                 /* Okay */
1357                 else
1358                 {
1359                         p = NULL;
1360                 }
1361
1362
1363                 /* Objects */
1364                 if (drop_item)
1365                 {
1366                         /* Handle singular "an" */
1367 #ifndef JP
1368                         if (sin) hooked_roff("n");
1369                         sin = FALSE;
1370 #endif
1371
1372                         /* Dump "object(s)" */
1373                         if (p) hooked_roff(p);
1374                         hooked_roff(
1375                                 _("¥¢¥¤¥Æ¥à", " object"));
1376
1377 #ifndef JP
1378                         if (n != 1) hooked_roff("s");
1379 #endif
1380
1381                         /* Conjunction replaces variety, if needed for "gold" below */
1382                         p = _("¤ä", " or");
1383                 }
1384
1385                 /* Treasures */
1386                 if (drop_gold)
1387                 {
1388 #ifndef JP
1389                         /* Cancel prefix */
1390                         if (!p) sin = FALSE;
1391
1392                         /* Handle singular "an" */
1393                         if (sin) hooked_roff("n");
1394                         sin = FALSE;
1395 #endif
1396
1397                         /* Dump "treasure(s)" */
1398                         if (p) hooked_roff(p);
1399                         hooked_roff(_("ºâÊõ", " treasure"));
1400 #ifndef JP
1401                         if (n != 1) hooked_roff("s");
1402 #endif
1403
1404                 }
1405
1406                 /* End this sentence */
1407                 hooked_roff(_("¤ò»ý¤Ã¤Æ¤¤¤ë¤³¤È¤¬¤¢¤ë¡£", ".  "));
1408         }
1409
1410
1411         /* Count the number of "known" attacks */
1412         for (n = 0, m = 0; m < 4; m++)
1413         {
1414                 /* Skip non-attacks */
1415                 if (!r_ptr->blow[m].method) continue;
1416                 if (r_ptr->blow[m].method == RBM_SHOOT) continue;
1417
1418                 /* Count known attacks */
1419                 if (r_ptr->r_blows[m] || know_everything) n++;
1420         }
1421
1422         /* Examine (and count) the actual attacks */
1423         for (r = 0, m = 0; m < 4; m++)
1424         {
1425                 int method, effect, d1, d2;
1426
1427                 /* Skip non-attacks */
1428                 if (!r_ptr->blow[m].method) continue;
1429                 if (r_ptr->blow[m].method == RBM_SHOOT) continue;
1430
1431                 /* Skip unknown attacks */
1432                 if (!r_ptr->r_blows[m] && !know_everything) continue;
1433
1434                 /* Extract the attack info */
1435                 method = r_ptr->blow[m].method;
1436                 effect = r_ptr->blow[m].effect;
1437                 d1 = r_ptr->blow[m].d_dice;
1438                 d2 = r_ptr->blow[m].d_side;
1439
1440                 /* No method yet */
1441                 p = NULL;
1442
1443                 /* Acquire the method */
1444                 switch (method)
1445                 {
1446                         case RBM_HIT:           p = _("²¥¤ë", "hit"); break;
1447                         case RBM_TOUCH:         p = _("¿¨¤ë", "touch"); break;
1448                         case RBM_PUNCH:         p = _("¥Ñ¥ó¥Á¤¹¤ë", "punch"); break;
1449                         case RBM_KICK:          p = _("½³¤ë", "kick"); break;
1450                         case RBM_CLAW:          p = _("¤Ò¤Ã¤«¤¯", "claw"); break;
1451                         case RBM_BITE:          p = _("³ú¤à", "bite"); break;
1452                         case RBM_STING:         p = _("»É¤¹", "sting"); break;
1453                         case RBM_SLASH:         p = _("»Â¤ë", "slash"); break;
1454                         case RBM_BUTT:          p = _("³Ñ¤ÇÆͤ¯", "butt"); break;
1455                         case RBM_CRUSH:         p = _("ÂÎÅö¤¿¤ê¤¹¤ë", "crush"); break;
1456                         case RBM_ENGULF:        p = _("°û¤ß¹þ¤à", "engulf"); break;
1457                         case RBM_CHARGE:        p = _("ÀÁµá½ñ¤ò¤è¤³¤¹", "charge"); break;
1458                         case RBM_CRAWL:         p = _("ÂΤξå¤òÇ礤²ó¤ë", "crawl on you"); break;
1459                         case RBM_DROOL:         p = _("¤è¤À¤ì¤ò¤¿¤é¤¹", "drool on you"); break;
1460                         case RBM_SPIT:          p = _("¤Ä¤Ð¤òÅǤ¯", "spit"); break;
1461                         case RBM_EXPLODE:       p = _("Çúȯ¤¹¤ë", "explode"); break;
1462                         case RBM_GAZE:          p = _("¤Ë¤é¤à", "gaze"); break;
1463                         case RBM_WAIL:          p = _("µã¤­¶«¤Ö", "wail"); break;
1464                         case RBM_SPORE:         p = _("˦»Ò¤òÈô¤Ð¤¹", "release spores"); break;
1465                         case RBM_XXX4:          break;
1466                         case RBM_BEG:           p = _("¶â¤ò¤»¤¬¤à", "beg"); break;
1467                         case RBM_INSULT:        p = _("Éî¿«¤¹¤ë", "insult"); break;
1468                         case RBM_MOAN:          p = _("¤¦¤á¤¯", "moan"); break;
1469                         case RBM_SHOW:          p = _("²Î¤¦", "sing"); break;
1470                 }
1471
1472
1473                 /* Default effect */
1474                 q = NULL;
1475
1476                 /* Acquire the effect */
1477                 switch (effect)
1478                 {
1479                         case RBE_SUPERHURT:
1480                         case RBE_HURT:          q = _("¹¶·â¤¹¤ë", "attack"); break;
1481                         case RBE_POISON:        q = _("ÆǤò¤¯¤é¤ï¤¹", "poison"); break;
1482                         case RBE_UN_BONUS:      q = _("Îô²½¤µ¤»¤ë", "disenchant"); break;
1483                         case RBE_UN_POWER:      q = _("½¼Å¶ËâÎϤòµÛ¼ý¤¹¤ë", "drain charges"); break;
1484                         case RBE_EAT_GOLD:      q = _("¶â¤òÅð¤à", "steal gold"); break;
1485                         case RBE_EAT_ITEM:      q = _("¥¢¥¤¥Æ¥à¤òÅð¤à", "steal items"); break;
1486                         case RBE_EAT_FOOD:      q = _("¤¢¤Ê¤¿¤Î¿©ÎÁ¤ò¿©¤Ù¤ë", "eat your food"); break;
1487                         case RBE_EAT_LITE:      q = _("ÌÀ¤«¤ê¤òµÛ¼ý¤¹¤ë", "absorb light"); break;
1488                         case RBE_ACID:          q = _("»À¤òÈô¤Ð¤¹", "shoot acid"); break;
1489                         case RBE_ELEC:          q = _("´¶ÅŤµ¤»¤ë", "electrocute"); break;
1490                         case RBE_FIRE:          q = _("dz¤ä¤¹", "burn"); break;
1491                         case RBE_COLD:          q = _("Åà¤é¤»¤ë", "freeze"); break;
1492                         case RBE_BLIND:         q = _("ÌÕÌܤˤ¹¤ë", "blind"); break;
1493                         case RBE_CONFUSE:       q = _("º®Í𤵤»¤ë", "confuse"); break;
1494                         case RBE_TERRIFY:       q = _("¶²Éݤµ¤»¤ë", "terrify"); break;
1495                         case RBE_PARALYZE:      q = _("Ëãá㤵¤»¤ë", "paralyze"); break;
1496                         case RBE_LOSE_STR:      q = _("ÏÓÎϤò¸º¾¯¤µ¤»¤ë", "reduce strength"); break;
1497                         case RBE_LOSE_INT:      q = _("ÃÎǽ¤ò¸º¾¯¤µ¤»¤ë", "reduce intelligence"); break;
1498                         case RBE_LOSE_WIS:      q = _("¸­¤µ¤ò¸º¾¯¤µ¤»¤ë", "reduce wisdom"); break;
1499                         case RBE_LOSE_DEX:      q = _("´ïÍѤµ¤ò¸º¾¯¤µ¤»¤ë", "reduce dexterity"); break;
1500                         case RBE_LOSE_CON:      q = _("Âѵ×ÎϤò¸º¾¯¤µ¤»¤ë", "reduce constitution"); break;
1501                         case RBE_LOSE_CHR:      q = _("Ì¥ÎϤò¸º¾¯¤µ¤»¤ë", "reduce charisma"); break;
1502                         case RBE_LOSE_ALL:      q = _("Á´¥¹¥Æ¡¼¥¿¥¹¤ò¸º¾¯¤µ¤»¤ë", "reduce all stats"); break;
1503                         case RBE_SHATTER:       q = _("Ê´ºÕ¤¹¤ë", "shatter"); break;
1504                         case RBE_EXP_10:        q = _("·Ð¸³Ãͤò¸º¾¯(10d6+)¤µ¤»¤ë", "lower experience (by 10d6+)"); break;
1505                         case RBE_EXP_20:        q = _("·Ð¸³Ãͤò¸º¾¯(20d6+)¤µ¤»¤ë", "lower experience (by 20d6+)"); break;
1506                         case RBE_EXP_40:        q = _("·Ð¸³Ãͤò¸º¾¯(40d6+)¤µ¤»¤ë", "lower experience (by 40d6+)"); break;
1507                         case RBE_EXP_80:        q = _("·Ð¸³Ãͤò¸º¾¯(80d6+)¤µ¤»¤ë", "lower experience (by 80d6+)"); break;
1508                         case RBE_DISEASE:       q = _("ɵ¤¤Ë¤¹¤ë", "disease"); break;
1509                         case RBE_TIME:      q = _("»þ´Ö¤òµÕÌá¤ê¤µ¤»¤ë", "time"); break;
1510                         case RBE_DR_LIFE:   q = _("À¸Ì¿ÎϤòµÛ¼ý¤¹¤ë", "drain life"); break;
1511                         case RBE_DR_MANA:   q = _("ËâÎϤòÃ¥¤¦", "drain mana force"); break;
1512                         case RBE_INERTIA:   q = _("¸ºÂ®¤µ¤»¤ë", "slow"); break;
1513                         case RBE_STUN:      q = _("Û¯Û°¤È¤µ¤»¤ë", "stun"); break;
1514                 }
1515
1516
1517 #ifdef JP
1518                 if ( r == 0 ) hooked_roff( format("%^s¤Ï", wd_he[msex]) );
1519
1520                 /***¼ã´³É½¸½¤òÊѹ¹ ita ***/
1521
1522                         /* Describe damage (if known) */
1523                 if (d1 && d2 && (know_everything || know_damage(r_idx, m)))
1524                   {
1525                     
1526                     /* Display the damage */
1527                     hooked_roff(format(" %dd%d ", d1, d2));
1528                     hooked_roff("¤Î¥À¥á¡¼¥¸¤Ç");
1529                   }
1530                 /* Hack -- force a method */
1531                 if (!p) p = "²¿¤«´ñ̯¤Ê¤³¤È¤ò¤¹¤ë";
1532
1533                 /* Describe the method */
1534                 /* XX¤·¤ÆYY¤·/XX¤·¤ÆYY¤¹¤ë/XX¤·/XX¤¹¤ë */
1535                 if(q) jverb( p ,jverb_buf, JVERB_TO);
1536                 else if(r!=n-1) jverb( p ,jverb_buf, JVERB_AND);
1537                 else strcpy(jverb_buf, p);
1538
1539                 hooked_roff(jverb_buf);
1540
1541                 /* Describe the effect (if any) */
1542                 if (q)
1543                 {
1544                   if(r!=n-1) jverb( q,jverb_buf, JVERB_AND);
1545                   else strcpy(jverb_buf,q); 
1546                   hooked_roff(jverb_buf);
1547                 }
1548                 if(r!=n-1) hooked_roff("¡¢");
1549 #else
1550                 /* Introduce the attack description */
1551                 if (!r)
1552                 {
1553                         hooked_roff(format("%^s can ", wd_he[msex]));
1554                 }
1555                 else if (r < n-1)
1556                 {
1557                         hooked_roff(", ");
1558                 }
1559                 else
1560                 {
1561                         hooked_roff(", and ");
1562                 }
1563
1564
1565                 /* Hack -- force a method */
1566                 if (!p) p = "do something weird";
1567
1568                 /* Describe the method */
1569                 hooked_roff(p);
1570
1571
1572                 /* Describe the effect (if any) */
1573                 if (q)
1574                 {
1575                         /* Describe the attack type */
1576                         hooked_roff(" to ");
1577                         hooked_roff(q);
1578
1579                         /* Describe damage (if known) */
1580                         if (d1 && d2 && (know_everything || know_damage(r_idx, m)))
1581                         {
1582                                 /* Display the damage */
1583                                 hooked_roff(" with damage");
1584                                 hooked_roff(format(" %dd%d", d1, d2));
1585                         }
1586                 }
1587 #endif
1588
1589
1590
1591                 /* Count the attacks as printed */
1592                 r++;
1593         }
1594
1595         /* Finish sentence above */
1596         if (r)
1597         {
1598                 hooked_roff(_("¡£", ".  "));
1599         }
1600
1601         /* Notice lack of attacks */
1602         else if (flags1 & RF1_NEVER_BLOW)
1603         {
1604                 hooked_roff(format(
1605                         _("%^s¤ÏʪÍýŪ¤Ê¹¶·âÊýË¡¤ò»ý¤¿¤Ê¤¤¡£",
1606                           "%^s has no physical attacks.  "), wd_he[msex]));
1607         }
1608
1609         /* Or describe the lack of knowledge */
1610         else
1611         {
1612                 hooked_roff(format(
1613                         _("%s¹¶·â¤Ë¤Ä¤¤¤Æ¤Ï²¿¤âÃΤé¤Ê¤¤¡£",
1614                           "Nothing is known about %s attack.  "), wd_his[msex]));
1615         }
1616
1617
1618         /*
1619          * Notice "Quest" monsters, but only if you
1620          * already encountered the monster.
1621          */
1622         if ((flags1 & RF1_QUESTOR) && ((r_ptr->r_sights) && (r_ptr->max_num) && ((r_idx == MON_OBERON) || (r_idx == MON_SERPENT))))
1623         {
1624                 hook_c_roff(TERM_VIOLET, 
1625                         _("¤¢¤Ê¤¿¤Ï¤³¤Î¥â¥ó¥¹¥¿¡¼¤ò»¦¤·¤¿¤¤¤È¤¤¤¦¶¯¤¤Íß˾¤ò´¶¤¸¤Æ¤¤¤ë...",
1626                           "You feel an intense desire to kill this monster...  "));
1627         }
1628
1629         else if (flags7 & RF7_GUARDIAN)
1630         {
1631                 hook_c_roff(TERM_L_RED, 
1632                         _("¤³¤Î¥â¥ó¥¹¥¿¡¼¤Ï¥À¥ó¥¸¥ç¥ó¤Î¼ç¤Ç¤¢¤ë¡£",
1633                           "This monster is the master of a dungeon."));
1634         }
1635
1636
1637         /* All done */
1638         hooked_roff("\n");
1639
1640 }
1641
1642
1643 /*!
1644  * @brief ¥â¥ó¥¹¥¿¡¼¾ðÊó¤Î¥Ø¥Ã¥À¤òµ­½Ò¤¹¤ë
1645  * Hack -- Display the "name" and "attr/chars" of a monster race
1646  * @param r_idx ¥â¥ó¥¹¥¿¡¼¤Î¼ï²ID
1647  * @return ¤Ê¤·
1648  */
1649 void roff_top(int r_idx)
1650 {
1651         monster_race    *r_ptr = &r_info[r_idx];
1652
1653         byte            a1, a2;
1654         char            c1, c2;
1655
1656
1657         /* Access the chars */
1658         c1 = r_ptr->d_char;
1659         c2 = r_ptr->x_char;
1660
1661         /* Access the attrs */
1662         a1 = r_ptr->d_attr;
1663         a2 = r_ptr->x_attr;
1664
1665
1666         /* Clear the top line */
1667         Term_erase(0, 0, 255);
1668
1669         /* Reset the cursor */
1670         Term_gotoxy(0, 0);
1671
1672 #ifndef JP
1673         /* A title (use "The" for non-uniques) */
1674         if (!(r_ptr->flags1 & RF1_UNIQUE))
1675         {
1676                 Term_addstr(-1, TERM_WHITE, "The ");
1677         }
1678 #endif
1679
1680         /* Dump the name */
1681         Term_addstr(-1, TERM_WHITE, (r_name + r_ptr->name));
1682
1683         /* Append the "standard" attr/char info */
1684         Term_addstr(-1, TERM_WHITE, " ('");
1685         Term_add_bigch(a1, c1);
1686         Term_addstr(-1, TERM_WHITE, "')");
1687
1688         /* Append the "optional" attr/char info */
1689         Term_addstr(-1, TERM_WHITE, "/('");
1690         Term_add_bigch(a2, c2);
1691         Term_addstr(-1, TERM_WHITE, "'):");
1692
1693         /* Wizards get extra info */
1694         if (p_ptr->wizard)
1695         {
1696                 char buf[6];
1697
1698                 sprintf(buf, "%d", r_idx);
1699
1700                 Term_addstr(-1, TERM_WHITE, " (");
1701                 Term_addstr(-1, TERM_L_BLUE, buf);
1702                 Term_addch(TERM_WHITE, ')');
1703         }
1704 }
1705
1706
1707
1708 /*!
1709  * @brief  ¥â¥ó¥¹¥¿¡¼¾ðÊó¤Îɽ¼¨¤È¶¦¤Ë²èÌ̤ò°ì»þ¾Ãµî¤¹¤ë¥µ¥Ö¥ë¡¼¥Á¥ó /
1710  * Hack -- describe the given monster race at the top of the screen
1711  * @param r_idx ¥â¥ó¥¹¥¿¡¼¤Î¼ï²ID
1712  * @param mode É½¼¨¥ª¥×¥·¥ç¥ó
1713  * @return ¤Ê¤·
1714  */
1715 void screen_roff(int r_idx, int mode)
1716 {
1717         /* Flush messages */
1718         msg_print(NULL);
1719
1720         /* Begin recall */
1721         Term_erase(0, 1, 255);
1722
1723         hook_c_roff = c_roff;
1724
1725         /* Recall monster */
1726         roff_aux(r_idx, mode);
1727
1728         /* Describe monster */
1729         roff_top(r_idx);
1730 }
1731
1732
1733
1734
1735 /*!
1736  * @brief ¥â¥ó¥¹¥¿¡¼¾ðÊó¤Î¸½ºß¤Î¥¦¥£¥ó¥É¥¦¤Ëɽ¼¨¤¹¤ë /
1737  * Hack -- describe the given monster race in the current "term" window
1738  * @param r_idx ¥â¥ó¥¹¥¿¡¼¤Î¼ï²ID
1739  * @return ¤Ê¤·
1740  */
1741 void display_roff(int r_idx)
1742 {
1743         int y;
1744
1745         /* Erase the window */
1746         for (y = 0; y < Term->hgt; y++)
1747         {
1748                 /* Erase the line */
1749                 Term_erase(0, y, 255);
1750         }
1751
1752         /* Begin recall */
1753         Term_gotoxy(0, 1);
1754
1755         hook_c_roff = c_roff;
1756
1757         /* Recall monster */
1758         roff_aux(r_idx, 0);
1759
1760         /* Describe monster */
1761         roff_top(r_idx);
1762 }
1763
1764
1765 /*!
1766  * @brief ¥â¥ó¥¹¥¿¡¼¾ÜºÙ¾ðÊó¤ò¼«Æ°¥¹¥Ý¥¤¥é¡¼¸þ¤±¤Ë½ÐÎϤ¹¤ë /
1767  * Hack -- output description of the given monster race
1768  * @param r_idx ¥â¥ó¥¹¥¿¡¼¤Î¼ï²ID
1769  * @param roff_func ½ÐÎϽèÍý¤ò¹Ô¤¦´Ø¿ô¥Ý¥¤¥ó¥¿
1770  * @return ¤Ê¤·
1771  */
1772 void output_monster_spoiler(int r_idx, void (*roff_func)(byte attr, cptr str))
1773 {
1774         hook_c_roff = roff_func;
1775
1776         /* Recall monster */
1777         roff_aux(r_idx, 0x03);
1778 }
1779
1780
1781 bool mon_hook_dungeon(int r_idx)
1782 {
1783         monster_race *r_ptr = &r_info[r_idx];
1784
1785         if (!(r_ptr->flags8 & RF8_WILD_ONLY))
1786                 return TRUE;
1787         else
1788         {
1789                 dungeon_info_type *d_ptr = &d_info[dungeon_type];
1790                 if ((d_ptr->mflags8 & RF8_WILD_MOUNTAIN) &&
1791                     (r_ptr->flags8 & RF8_WILD_MOUNTAIN)) return TRUE;
1792                 return FALSE;
1793         }
1794 }
1795
1796
1797 static bool mon_hook_ocean(int r_idx)
1798 {
1799         monster_race *r_ptr = &r_info[r_idx];
1800
1801         if (r_ptr->flags8 & RF8_WILD_OCEAN)
1802                 return TRUE;
1803         else
1804                 return FALSE;
1805 }
1806
1807
1808 static bool mon_hook_shore(int r_idx)
1809 {
1810         monster_race *r_ptr = &r_info[r_idx];
1811
1812         if (r_ptr->flags8 & RF8_WILD_SHORE)
1813                 return TRUE;
1814         else
1815                 return FALSE;
1816 }
1817
1818
1819 static bool mon_hook_waste(int r_idx)
1820 {
1821         monster_race *r_ptr = &r_info[r_idx];
1822
1823         if (r_ptr->flags8 & (RF8_WILD_WASTE | RF8_WILD_ALL))
1824                 return TRUE;
1825         else
1826                 return FALSE;
1827 }
1828
1829
1830 static bool mon_hook_town(int r_idx)
1831 {
1832         monster_race *r_ptr = &r_info[r_idx];
1833
1834         if (r_ptr->flags8 & (RF8_WILD_TOWN | RF8_WILD_ALL))
1835                 return TRUE;
1836         else
1837                 return FALSE;
1838 }
1839
1840
1841 static bool mon_hook_wood(int r_idx)
1842 {
1843         monster_race *r_ptr = &r_info[r_idx];
1844
1845         if (r_ptr->flags8 & (RF8_WILD_WOOD | RF8_WILD_ALL))
1846                 return TRUE;
1847         else
1848                 return FALSE;
1849 }
1850
1851
1852 static bool mon_hook_volcano(int r_idx)
1853 {
1854         monster_race *r_ptr = &r_info[r_idx];
1855
1856         if (r_ptr->flags8 & RF8_WILD_VOLCANO)
1857                 return TRUE;
1858         else
1859                 return FALSE;
1860 }
1861
1862
1863 static bool mon_hook_mountain(int r_idx)
1864 {
1865         monster_race *r_ptr = &r_info[r_idx];
1866
1867         if (r_ptr->flags8 & RF8_WILD_MOUNTAIN)
1868                 return TRUE;
1869         else
1870                 return FALSE;
1871 }
1872
1873
1874 static bool mon_hook_grass(int r_idx)
1875 {
1876         monster_race *r_ptr = &r_info[r_idx];
1877
1878         if (r_ptr->flags8 & (RF8_WILD_GRASS | RF8_WILD_ALL))
1879                 return TRUE;
1880         else
1881                 return FALSE;
1882 }
1883
1884
1885 static bool mon_hook_deep_water(int r_idx)
1886 {
1887         monster_race *r_ptr = &r_info[r_idx];
1888
1889         if (!mon_hook_dungeon(r_idx)) return FALSE;
1890
1891         if (r_ptr->flags7 & RF7_AQUATIC)
1892                 return TRUE;
1893         else
1894                 return FALSE;
1895 }
1896
1897
1898 static bool mon_hook_shallow_water(int r_idx)
1899 {
1900         monster_race *r_ptr = &r_info[r_idx];
1901
1902         if (!mon_hook_dungeon(r_idx)) return FALSE;
1903
1904         if (r_ptr->flags2 & RF2_AURA_FIRE)
1905                 return FALSE;
1906         else
1907                 return TRUE;
1908 }
1909
1910
1911 static bool mon_hook_lava(int r_idx)
1912 {
1913         monster_race *r_ptr = &r_info[r_idx];
1914
1915         if (!mon_hook_dungeon(r_idx)) return FALSE;
1916
1917         if (((r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK) ||
1918              (r_ptr->flags7 & RF7_CAN_FLY)) &&
1919             !(r_ptr->flags3 & RF3_AURA_COLD))
1920                 return TRUE;
1921         else
1922                 return FALSE;
1923 }
1924
1925
1926 static bool mon_hook_floor(int r_idx)
1927 {
1928         monster_race *r_ptr = &r_info[r_idx];
1929
1930         if (!(r_ptr->flags7 & RF7_AQUATIC) ||
1931             (r_ptr->flags7 & RF7_CAN_FLY))
1932                 return TRUE;
1933         else
1934                 return FALSE;
1935 }
1936
1937
1938 monster_hook_type get_monster_hook(void)
1939 {
1940         if (!dun_level && !p_ptr->inside_quest)
1941         {
1942                 switch (wilderness[p_ptr->wilderness_y][p_ptr->wilderness_x].terrain)
1943                 {
1944                 case TERRAIN_TOWN:
1945                         return (monster_hook_type)mon_hook_town;
1946                 case TERRAIN_DEEP_WATER:
1947                         return (monster_hook_type)mon_hook_ocean;
1948                 case TERRAIN_SHALLOW_WATER:
1949                 case TERRAIN_SWAMP:
1950                         return (monster_hook_type)mon_hook_shore;
1951                 case TERRAIN_DIRT:
1952                 case TERRAIN_DESERT:
1953                         return (monster_hook_type)mon_hook_waste;
1954                 case TERRAIN_GRASS:
1955                         return (monster_hook_type)mon_hook_grass;
1956                 case TERRAIN_TREES:
1957                         return (monster_hook_type)mon_hook_wood;
1958                 case TERRAIN_SHALLOW_LAVA:
1959                 case TERRAIN_DEEP_LAVA:
1960                         return (monster_hook_type)mon_hook_volcano;
1961                 case TERRAIN_MOUNTAIN:
1962                         return (monster_hook_type)mon_hook_mountain;
1963                 default:
1964                         return (monster_hook_type)mon_hook_dungeon;
1965                 }
1966         }
1967         else
1968         {
1969                 return (monster_hook_type)mon_hook_dungeon;
1970         }
1971 }
1972
1973
1974 monster_hook_type get_monster_hook2(int y, int x)
1975 {
1976         feature_type *f_ptr = &f_info[cave[y][x].feat];
1977
1978         /* Set the monster list */
1979
1980         /* Water */
1981         if (have_flag(f_ptr->flags, FF_WATER))
1982         {
1983                 /* Deep water */
1984                 if (have_flag(f_ptr->flags, FF_DEEP))
1985                 {
1986                         return (monster_hook_type)mon_hook_deep_water;
1987                 }
1988
1989                 /* Shallow water */
1990                 else
1991                 {
1992                         return (monster_hook_type)mon_hook_shallow_water;
1993                 }
1994         }
1995
1996         /* Lava */
1997         else if (have_flag(f_ptr->flags, FF_LAVA))
1998         {
1999                 return (monster_hook_type)mon_hook_lava;
2000         }
2001
2002         else return (monster_hook_type)mon_hook_floor;
2003 }
2004
2005
2006 void set_friendly(monster_type *m_ptr)
2007 {
2008         m_ptr->smart |= SM_FRIENDLY;
2009 }
2010
2011 void set_pet(monster_type *m_ptr)
2012 {
2013         if (!is_pet(m_ptr)) check_pets_num_and_align(m_ptr, TRUE);
2014
2015         /* Check for quest completion */
2016         check_quest_completion(m_ptr);
2017
2018         m_ptr->smart |= SM_PET;
2019         if (!(r_info[m_ptr->r_idx].flags3 & (RF3_EVIL | RF3_GOOD)))
2020                 m_ptr->sub_align = SUB_ALIGN_NEUTRAL;
2021 }
2022
2023 /*
2024  * Makes the monster hostile towards the player
2025  */
2026 void set_hostile(monster_type *m_ptr)
2027 {
2028         if (p_ptr->inside_battle) return;
2029
2030         if (is_pet(m_ptr)) check_pets_num_and_align(m_ptr, FALSE);
2031
2032         m_ptr->smart &= ~SM_PET;
2033         m_ptr->smart &= ~SM_FRIENDLY;
2034 }
2035
2036
2037 /*
2038  * Anger the monster
2039  */
2040 void anger_monster(monster_type *m_ptr)
2041 {
2042         if (p_ptr->inside_battle) return;
2043         if (is_friendly(m_ptr))
2044         {
2045                 char m_name[80];
2046
2047                 monster_desc(m_name, m_ptr, 0);
2048 #ifdef JP
2049 msg_format("%^s¤ÏÅܤä¿¡ª", m_name);
2050 #else
2051                 msg_format("%^s gets angry!", m_name);
2052 #endif
2053
2054                 set_hostile(m_ptr);
2055
2056                 chg_virtue(V_INDIVIDUALISM, 1);
2057                 chg_virtue(V_HONOUR, -1);
2058                 chg_virtue(V_JUSTICE, -1);
2059                 chg_virtue(V_COMPASSION, -1);
2060         }
2061 }
2062
2063
2064 /*
2065  * Check if monster can cross terrain
2066  */
2067 bool monster_can_cross_terrain(s16b feat, monster_race *r_ptr, u16b mode)
2068 {
2069         feature_type *f_ptr = &f_info[feat];
2070
2071         /* Pattern */
2072         if (have_flag(f_ptr->flags, FF_PATTERN))
2073         {
2074                 if (!(mode & CEM_RIDING))
2075                 {
2076                         if (!(r_ptr->flags7 & RF7_CAN_FLY)) return FALSE;
2077                 }
2078                 else
2079                 {
2080                         if (!(mode & CEM_P_CAN_ENTER_PATTERN)) return FALSE;
2081                 }
2082         }
2083
2084         /* "CAN" flags */
2085         if (have_flag(f_ptr->flags, FF_CAN_FLY) && (r_ptr->flags7 & RF7_CAN_FLY)) return TRUE;
2086         if (have_flag(f_ptr->flags, FF_CAN_SWIM) && (r_ptr->flags7 & RF7_CAN_SWIM)) return TRUE;
2087         if (have_flag(f_ptr->flags, FF_CAN_PASS))
2088         {
2089                 if ((r_ptr->flags2 & RF2_PASS_WALL) && (!(mode & CEM_RIDING) || p_ptr->pass_wall)) return TRUE;
2090         }
2091
2092         if (!have_flag(f_ptr->flags, FF_MOVE)) return FALSE;
2093
2094         /* Some monsters can walk on mountains */
2095         if (have_flag(f_ptr->flags, FF_MOUNTAIN) && (r_ptr->flags8 & RF8_WILD_MOUNTAIN)) return TRUE;
2096
2097         /* Water */
2098         if (have_flag(f_ptr->flags, FF_WATER))
2099         {
2100                 if (!(r_ptr->flags7 & RF7_AQUATIC))
2101                 {
2102                         /* Deep water */
2103                         if (have_flag(f_ptr->flags, FF_DEEP)) return FALSE;
2104
2105                         /* Shallow water */
2106                         else if (r_ptr->flags2 & RF2_AURA_FIRE) return FALSE;
2107                 }
2108         }
2109
2110         /* Aquatic monster into non-water? */
2111         else if (r_ptr->flags7 & RF7_AQUATIC) return FALSE;
2112
2113         /* Lava */
2114         if (have_flag(f_ptr->flags, FF_LAVA))
2115         {
2116                 if (!(r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK)) return FALSE;
2117         }
2118
2119         return TRUE;
2120 }
2121
2122
2123 /*
2124  * Strictly check if monster can enter the grid
2125  */
2126 bool monster_can_enter(int y, int x, monster_race *r_ptr, u16b mode)
2127 {
2128         cave_type *c_ptr = &cave[y][x];
2129
2130         /* Player or other monster */
2131         if (player_bold(y, x)) return FALSE;
2132         if (c_ptr->m_idx) return FALSE;
2133
2134         return monster_can_cross_terrain(c_ptr->feat, r_ptr, mode);
2135 }
2136
2137
2138 /*
2139  * Check if this monster has "hostile" alignment (aux)
2140  */
2141 static bool check_hostile_align(byte sub_align1, byte sub_align2)
2142 {
2143         if (sub_align1 != sub_align2)
2144         {
2145                 if (((sub_align1 & SUB_ALIGN_EVIL) && (sub_align2 & SUB_ALIGN_GOOD)) ||
2146                         ((sub_align1 & SUB_ALIGN_GOOD) && (sub_align2 & SUB_ALIGN_EVIL)))
2147                         return TRUE;
2148         }
2149
2150         /* Non-hostile alignment */
2151         return FALSE;
2152 }
2153
2154
2155 /*
2156  * Check if two monsters are enemies
2157  */
2158 bool are_enemies(monster_type *m_ptr, monster_type *n_ptr)
2159 {
2160         monster_race *r_ptr = &r_info[m_ptr->r_idx];
2161         monster_race *s_ptr = &r_info[n_ptr->r_idx];
2162
2163         if (p_ptr->inside_battle)
2164         {
2165                 if (is_pet(m_ptr) || is_pet(n_ptr)) return FALSE;
2166                 return TRUE;
2167         }
2168
2169         if ((r_ptr->flags8 & (RF8_WILD_TOWN | RF8_WILD_ALL))
2170             && (s_ptr->flags8 & (RF8_WILD_TOWN | RF8_WILD_ALL)))
2171         {
2172                 if (!is_pet(m_ptr) && !is_pet(n_ptr)) return FALSE;
2173         }
2174
2175         /* Friendly vs. opposite aligned normal or pet */
2176         if (check_hostile_align(m_ptr->sub_align, n_ptr->sub_align))
2177         {
2178                 if (!(m_ptr->mflag2 & MFLAG2_CHAMELEON) || !(n_ptr->mflag2 & MFLAG2_CHAMELEON)) return TRUE;
2179         }
2180
2181         /* Hostile vs. non-hostile */
2182         if (is_hostile(m_ptr) != is_hostile(n_ptr))
2183         {
2184                 return TRUE;
2185         }
2186
2187         /* Default */
2188         return FALSE;
2189 }
2190
2191
2192 /*
2193  * Check if this monster race has "hostile" alignment
2194  * If user is player, m_ptr == NULL.
2195  */
2196 bool monster_has_hostile_align(monster_type *m_ptr, int pa_good, int pa_evil, monster_race *r_ptr)
2197 {
2198         byte sub_align1 = SUB_ALIGN_NEUTRAL;
2199         byte sub_align2 = SUB_ALIGN_NEUTRAL;
2200
2201         if (m_ptr) /* For a monster */
2202         {
2203                 sub_align1 = m_ptr->sub_align;
2204         }
2205         else /* For player */
2206         {
2207                 if (p_ptr->align >= pa_good) sub_align1 |= SUB_ALIGN_GOOD;
2208                 if (p_ptr->align <= pa_evil) sub_align1 |= SUB_ALIGN_EVIL;
2209         }
2210
2211         /* Racial alignment flags */
2212         if (r_ptr->flags3 & RF3_EVIL) sub_align2 |= SUB_ALIGN_EVIL;
2213         if (r_ptr->flags3 & RF3_GOOD) sub_align2 |= SUB_ALIGN_GOOD;
2214
2215         if (check_hostile_align(sub_align1, sub_align2)) return TRUE;
2216
2217         /* Non-hostile alignment */
2218         return FALSE;
2219 }
2220
2221
2222 /*
2223  * Is the monster "alive"?
2224  *
2225  * Used to determine the message to print for a killed monster.
2226  * ("dies", "destroyed")
2227  */
2228 bool monster_living(monster_race *r_ptr)
2229 {
2230         /* Non-living, undead, or demon */
2231         if (r_ptr->flags3 & (RF3_DEMON | RF3_UNDEAD | RF3_NONLIVING))
2232                 return FALSE;
2233         else
2234                 return TRUE;
2235 }
2236
2237
2238 /*
2239  * Is this monster declined to be questor or bounty?
2240  */
2241 bool no_questor_or_bounty_uniques(int r_idx)
2242 {
2243         switch (r_idx)
2244         {
2245         /*
2246          * Decline them to be questor or bounty because they use
2247          * special motion "split and combine"
2248          */
2249         case MON_BANORLUPART:
2250         case MON_BANOR:
2251         case MON_LUPART:
2252                 return TRUE;
2253         default:
2254                 return FALSE;
2255         }
2256 }