OSDN Git Service

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