OSDN Git Service

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