OSDN Git Service

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