4 * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke
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.
11 /* Purpose: describe monsters (using monster memory) */
17 * Pronoun arrays, by gender.
19 static cptr wd_he[3] =
21 { "¤½¤ì", "Èà", "Èà½÷" };
23 { "it", "he", "she" };
26 static cptr wd_his[3] =
28 { "¤½¤ì¤Î", "Èà¤Î", "Èà½÷¤Î" };
30 { "its", "his", "her" };
36 * Pluralizer. Args(count, singular, plural)
38 #define plural(c,s,p) \
39 (((c) == 1) ? (s) : (p))
47 * Determine if the "armor" is known
48 * The higher the level, the fewer kills needed.
50 static bool know_armour(int r_idx)
52 monster_race *r_ptr = &r_info[r_idx];
54 s32b level = r_ptr->level;
56 s32b kills = r_ptr->r_tkills;
58 if (cheat_know) return (TRUE);
61 if (kills > 304 / (4 + level)) return (TRUE);
63 /* Skip non-uniques */
64 if (!(r_ptr->flags1 & RF1_UNIQUE)) return (FALSE);
67 if (kills > 304 / (38 + (5 * level) / 4)) return (TRUE);
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
79 static bool know_damage(int r_idx, int i)
81 monster_race *r_ptr = &r_info[r_idx];
83 s32b level = r_ptr->level;
85 s32b a = r_ptr->r_blows[i];
87 s32b d1 = r_ptr->blow[i].d_dice;
88 s32b d2 = r_ptr->blow[i].d_side;
92 if (d >= ((4+level)*MAX_UCHAR)/80) d = ((4+level)*MAX_UCHAR-1)/80;
95 if ((4 + level) * a > 80 * d) return (TRUE);
97 /* Skip non-uniques */
98 if (!(r_ptr->flags1 & RF1_UNIQUE)) return (FALSE);
100 /* Unique monsters */
101 if ((4 + level) * (2 * a) > 80 * d) return (TRUE);
109 * Prepare hook for c_roff(). It will be changed for spoiler generation in wizard1.c.
111 void (*hook_c_roff)(byte attr, cptr str) = c_roff;
113 static void hooked_roff(cptr str)
116 hook_c_roff(TERM_WHITE, str);
121 * Hack -- display monster information using "hooked_roff()"
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.
127 static void roff_aux(int r_idx, int mode)
129 monster_race *r_ptr = &r_info[r_idx];
144 bool nightmare = ironman_nightmare && !(mode & 0x02);
145 int speed = nightmare ? r_ptr->speed + 5 : r_ptr->speed;
149 bool reinforce = FALSE;
160 byte drop_gold, drop_item;
166 bool know_everything = FALSE;
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;
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);
182 for(n = 0; n < 6; n++)
184 if(r_ptr->reinforce_id[n] > 0) reinforce = TRUE;
187 /* cheat_know or research_mon() */
188 if (cheat_know || (mode & 0x01))
189 know_everything = TRUE;
191 /* Cheat -- Know everything */
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));
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;
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;
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;
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);
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);
233 /* Killing a monster reveals some properties */
234 if (r_ptr->r_tkills || know_everything)
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);
249 /* Know 'quantum' flag */
250 if (r_ptr->flags2 & RF2_QUANTUM) flags2 |= (RF2_QUANTUM);
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);
257 /* For output_monster_spoiler() */
264 /* Treat uniques differently */
265 if (flags1 & RF1_UNIQUE)
267 /* Hack -- Determine if the unique is "dead" */
268 bool dead = (r_ptr->max_num == 0) ? TRUE : FALSE;
270 /* We've been killed... */
273 /* Killed ancestors */
275 hooked_roff(format("%^s¤Ï¤¢¤Ê¤¿¤ÎÀèÁĤò %d ¿ÍÁò¤Ã¤Æ¤¤¤ë",
276 wd_he[msex], r_ptr->r_deaths));
278 hooked_roff(format("%^s has slain %d of your ancestors",
279 wd_he[msex], r_ptr->r_deaths));
283 /* But we've also killed it */
287 hooked_roff(format("¤¬¡¢¤¹¤Ç¤ËµØƤ¤Á¤Ï²Ì¤¿¤·¤Æ¤¤¤ë¡ª"));
289 hooked_roff(format(", but you have avenged %s! ",
290 plural(r_ptr->r_deaths, "him", "them")));
295 /* Unavenged (ever) */
299 hooked_roff(format("¤Î¤Ë¡¢¤Þ¤ÀµØƤ¤Á¤ò²Ì¤¿¤·¤Æ¤¤¤Ê¤¤¡£"));
301 hooked_roff(format(", who %s unavenged. ",
302 plural(r_ptr->r_deaths, "remains", "remain")));
307 /* Start a new line */
311 /* Dead unique who never hurt us */
315 hooked_roff("¤¢¤Ê¤¿¤Ï¤³¤ÎµØŨ¤ò¤¹¤Ç¤ËÁò¤êµî¤Ã¤Æ¤¤¤ë¡£");
317 hooked_roff("You have slain this foe. ");
320 /* Start a new line */
325 /* Not unique, but killed us */
326 else if (r_ptr->r_deaths)
330 hooked_roff(format("¤³¤Î¥â¥ó¥¹¥¿¡¼¤Ï¤¢¤Ê¤¿¤ÎÀèÁĤò %d ¿ÍÁò¤Ã¤Æ¤¤¤ë",
333 hooked_roff(format("%d of your ancestors %s been killed by this creature, ",
334 r_ptr->r_deaths, plural(r_ptr->r_deaths, "has", "have")));
338 /* Some kills this life */
342 hooked_roff(format("¤¬¡¢¤¢¤Ê¤¿¤Ï¤³¤Î¥â¥ó¥¹¥¿¡¼¤ò¾¯¤Ê¤¯¤È¤â %d ÂΤÏÅݤ·¤Æ¤¤¤ë¡£", r_ptr->r_pkills));
344 hooked_roff(format("and you have exterminated at least %d of the creatures. ", r_ptr->r_pkills));
349 /* Some kills past lives */
350 else if (r_ptr->r_tkills)
353 hooked_roff(format("¤¬¡¢%s¤Ï¤³¤Î¥â¥ó¥¹¥¿¡¼¤ò¾¯¤Ê¤¯¤È¤â %d ÂΤÏÅݤ·¤Æ¤¤¤ë¡£",
354 "¤¢¤Ê¤¿¤ÎÀèÁÄ", r_ptr->r_tkills));
356 hooked_roff(format("and %s have exterminated at least %d of the creatures. ",
357 "your ancestors", r_ptr->r_tkills));
366 hooked_roff(format("¤¬¡¢¤Þ¤À%s¤òÅݤ·¤¿¤³¤È¤Ï¤Ê¤¤¡£", wd_he[msex]));
368 hooked_roff(format("and %s is not ever known to have been defeated. ", wd_he[msex]));
373 /* Start a new line */
377 /* Normal monsters */
380 /* Killed some this life */
384 hooked_roff(format("¤¢¤Ê¤¿¤Ï¤³¤Î¥â¥ó¥¹¥¿¡¼¤ò¾¯¤Ê¤¯¤È¤â %d ÂΤϻ¦¤·¤Æ¤¤¤ë¡£", r_ptr->r_pkills));
386 hooked_roff(format("You have killed at least %d of these creatures. ", r_ptr->r_pkills));
391 /* Killed some last life */
392 else if (r_ptr->r_tkills)
395 hooked_roff(format("¤¢¤Ê¤¿¤ÎÀèÁĤϤ³¤Î¥â¥ó¥¹¥¿¡¼¤ò¾¯¤Ê¤¯¤È¤â %d ÂΤϻ¦¤·¤Æ¤¤¤ë¡£", r_ptr->r_tkills));
397 hooked_roff(format("Your ancestors have killed at least %d of these creatures. ", r_ptr->r_tkills));
406 hooked_roff("¤³¤Î¥â¥ó¥¹¥¿¡¼¤òÅݤ·¤¿¤³¤È¤Ï¤Ê¤¤¡£");
408 hooked_roff("No battles to the death are recalled. ");
412 /* Start a new line */
418 cptr tmp = r_text + r_ptr->text;
425 /* Start a new line */
430 if (r_idx == MON_KAGE)
441 /* Describe location */
442 if (r_ptr->level == 0)
445 hooked_roff(format("%^s¤ÏÄ®¤Ë½»¤ß", wd_he[msex]));
447 hooked_roff(format("%^s lives in the town", wd_he[msex]));
452 else if (r_ptr->r_tkills || know_everything)
457 hooked_roff(format("%^s¤ÏÄ̾ïÃϲ¼ %d ¥Õ¥£¡¼¥È¤Ç½Ð¸½¤·",
459 hooked_roff(format("%^s is normally found at depths of %d feet",
462 wd_he[msex], r_ptr->level * 50));
467 hooked_roff(format("%^s¤ÏÄ̾ïÃϲ¼ %d ³¬¤Ç½Ð¸½¤·",
469 hooked_roff(format("%^s is normally found on dungeon level %d",
472 wd_he[msex], r_ptr->level));
478 /* Describe movement */
479 if (r_idx == MON_CHAMELEON)
482 hooked_roff("¡¢Â¾¤Î¥â¥ó¥¹¥¿¡¼¤Ë²½¤±¤ë¡£");
484 hooked_roff("and can take the shape of other monster.");
496 hooked_roff(", and ");
503 hooked_roff(format("%^s¤Ï", wd_he[msex]));
505 hooked_roff(format("%^s ", wd_he[msex]));
511 hooked_roff("moves");
515 if ((flags1 & RF1_RAND_50) || (flags1 & RF1_RAND_25))
518 if ((flags1 & RF1_RAND_50) && (flags1 & RF1_RAND_25))
521 hooked_roff("¤«¤Ê¤ê");
523 hooked_roff(" extremely");
527 else if (flags1 & RF1_RAND_50)
532 hooked_roff(" somewhat");
536 else if (flags1 & RF1_RAND_25)
541 hooked_roff(" a bit");
548 hooked_roff("ÉÔµ¬Â§¤Ë");
550 hooked_roff(" erratically");
554 /* Hack -- Occasional conjunction */
556 if (speed != 110) hooked_roff("¡¢¤«¤Ä");
558 if (speed != 110) hooked_roff(", and");
567 if (speed > 139) hook_c_roff(TERM_RED, "¿®¤¸Æñ¤¤¤Û¤É");
568 else if (speed > 134) hook_c_roff(TERM_ORANGE, "ÌÔÎõ¤Ë");
569 else if (speed > 129) hook_c_roff(TERM_ORANGE, "Èó¾ï¤Ë");
570 else if (speed > 124) hook_c_roff(TERM_UMBER, "¤«¤Ê¤ê");
571 else if (speed < 120) hook_c_roff(TERM_L_UMBER, "¤ä¤ä");
572 hook_c_roff(TERM_L_RED, "ÁÇÁ᤯");
574 if (speed > 139) hook_c_roff(TERM_RED, " incredibly");
575 else if (speed > 134) hook_c_roff(TERM_ORANGE, " extremely");
576 else if (speed > 129) hook_c_roff(TERM_ORANGE, " very");
577 else if (speed > 124) hook_c_roff(TERM_UMBER, " fairly");
578 else if (speed < 120) hook_c_roff(TERM_L_UMBER, " somewhat");
579 hook_c_roff(TERM_L_RED, " quickly");
583 else if (speed < 110)
586 if (speed < 90) hook_c_roff(TERM_L_GREEN, "¿®¤¸Æñ¤¤¤Û¤É");
587 else if (speed < 95) hook_c_roff(TERM_BLUE, "Èó¾ï¤Ë");
588 else if (speed < 100) hook_c_roff(TERM_BLUE, "¤«¤Ê¤ê");
589 else if (speed > 104) hook_c_roff(TERM_GREEN, "¤ä¤ä");
590 hook_c_roff(TERM_L_BLUE, "¤æ¤Ã¤¯¤ê¤È");
592 if (speed < 90) hook_c_roff(TERM_L_GREEN, " incredibly");
593 else if (speed < 95) hook_c_roff(TERM_BLUE, " very");
594 else if (speed < 100) hook_c_roff(TERM_BLUE, " fairly");
595 else if (speed > 104) hook_c_roff(TERM_GREEN, " somewhat");
596 hook_c_roff(TERM_L_BLUE, " slowly");
603 hooked_roff("ÉáÄ̤ή¤µ¤Ç");
605 hooked_roff(" at normal speed");
610 hooked_roff("Æ°¤¤¤Æ¤¤¤ë");
614 /* The code above includes "attack speed" */
615 if (flags1 & RF1_NEVER_MOVE)
621 hooked_roff("¡¢¤·¤«¤·");
623 hooked_roff(", but ");
630 hooked_roff(format("%^s¤Ï", wd_he[msex]));
632 hooked_roff(format("%^s ", wd_he[msex]));
640 hooked_roff("¿¯Æþ¼Ô¤òÄÉÀפ·¤Ê¤¤");
642 hooked_roff("does not deign to chase intruders");
647 /* End this sentence */
660 /* Describe experience if known */
661 if (r_ptr->r_tkills || know_everything)
667 if (flags1 & RF1_UNIQUE)
669 hooked_roff("Killing this");
673 hooked_roff("A kill of this");
678 /* Describe the "quality" */
680 if (flags2 & RF2_ELDRITCH_HORROR) hook_c_roff(TERM_VIOLET, "¶¸µ¤¤òͶ¤¦");/*nuke me*/
682 if (flags2 & RF2_ELDRITCH_HORROR) hook_c_roff(TERM_VIOLET, " sanity-blasting");
686 if (flags3 & RF3_ANIMAL) hook_c_roff(TERM_L_GREEN, "¼«Á³³¦¤Î");
688 if (flags3 & RF3_ANIMAL) hook_c_roff(TERM_L_GREEN, " natural");
692 if (flags3 & RF3_EVIL) hook_c_roff(TERM_L_DARK, "¼Ù°¤Ê¤ë");
694 if (flags3 & RF3_EVIL) hook_c_roff(TERM_L_DARK, " evil");
698 if (flags3 & RF3_GOOD) hook_c_roff(TERM_YELLOW, "Á±ÎɤÊ");
700 if (flags3 & RF3_GOOD) hook_c_roff(TERM_YELLOW, " good");
704 if (flags3 & RF3_UNDEAD) hook_c_roff(TERM_VIOLET, "¥¢¥ó¥Ç¥Ã¥É¤Î");
706 if (flags3 & RF3_UNDEAD) hook_c_roff(TERM_VIOLET, " undead");
709 if (flags3 & RF3_AMBERITE) hook_c_roff(TERM_VIOLET, "¥¢¥ó¥Ð¡¼¤Î²¦Â²¤Î");
711 if (flags3 & RF3_AMBERITE) hook_c_roff(TERM_VIOLET, " Amberite");
715 if ((flags3 & (RF3_DRAGON | RF3_DEMON | RF3_GIANT | RF3_TROLL | RF3_ORC)) || (flags2 & (RF2_QUANTUM | RF2_HUMAN)))
717 /* Describe the "race" */
719 if (flags3 & RF3_DRAGON) hook_c_roff(TERM_ORANGE, "¥É¥é¥´¥ó");
721 if (flags3 & RF3_DRAGON) hook_c_roff(TERM_ORANGE, " dragon");
725 if (flags3 & RF3_DEMON) hook_c_roff(TERM_VIOLET, "¥Ç¡¼¥â¥ó");
727 if (flags3 & RF3_DEMON) hook_c_roff(TERM_VIOLET, " demon");
731 if (flags3 & RF3_GIANT) hook_c_roff(TERM_L_UMBER, "¥¸¥ã¥¤¥¢¥ó¥È");
733 if (flags3 & RF3_GIANT) hook_c_roff(TERM_L_UMBER, " giant");
737 if (flags3 & RF3_TROLL) hook_c_roff(TERM_BLUE, "¥È¥í¥ë");
739 if (flags3 & RF3_TROLL) hook_c_roff(TERM_BLUE, " troll");
743 if (flags3 & RF3_ORC) hook_c_roff(TERM_UMBER, "¥ª¡¼¥¯");
745 if (flags3 & RF3_ORC) hook_c_roff(TERM_UMBER, " orc");
749 if (flags2 & RF2_HUMAN) hook_c_roff(TERM_L_WHITE, "¿Í´Ö");
751 if (flags2 & RF2_HUMAN) hook_c_roff(TERM_L_WHITE, " human");
755 if (flags2 & RF2_QUANTUM) hook_c_roff(TERM_VIOLET, "ÎÌ»ÒÀ¸Êª");
757 if (flags2 & RF2_QUANTUM) hook_c_roff(TERM_VIOLET, " quantum creature");
762 else hooked_roff("¥â¥ó¥¹¥¿¡¼");
764 else hooked_roff(" creature");
769 hooked_roff("¤òÅݤ¹¤³¤È¤Ï");
771 /* Group some variables */
777 hooked_roff(format(" %lu ¥ì¥Ù¥ë¤Î¥¥ã¥é¥¯¥¿¤Ë¤È¤Ã¤Æ", (long)i));
779 i = (long)r_ptr->mexp * r_ptr->level / (p_ptr->max_plv+2);
780 j = ((((long)r_ptr->mexp * r_ptr->level % (p_ptr->max_plv+2)) *
781 (long)1000 / (p_ptr->max_plv+2) + 5) / 10);
783 hooked_roff(format(" Ìó%ld.%02ld ¥Ý¥¤¥ó¥È¤Î·Ð¸³¤È¤Ê¤ë¡£",
786 /* calculate the integer exp part */
787 i = (long)r_ptr->mexp * r_ptr->level / (p_ptr->max_plv+2);
789 /* calculate the fractional exp part scaled by 100, */
790 /* must use long arithmetic to avoid overflow */
791 j = ((((long)r_ptr->mexp * r_ptr->level % (p_ptr->max_plv+2)) *
792 (long)1000 / (p_ptr->max_plv+2) + 5) / 10);
794 /* Mention the experience */
795 hooked_roff(format(" is worth about %ld.%02ld point%s",
797 (((i == 1) && (j == 0)) ? "" : "s")));
799 /* Take account of annoying English */
802 if ((p_ptr->lev / 10) == 1) /* nothing */;
803 else if (i == 1) p = "st";
804 else if (i == 2) p = "nd";
805 else if (i == 3) p = "rd";
807 /* Take account of "leading vowels" in numbers */
810 if ((i == 8) || (i == 11) || (i == 18)) q = "n";
812 /* Mention the dependance on the player's level */
813 hooked_roff(format(" for a%s %lu%s level character. ",
820 if ((flags2 & RF2_AURA_FIRE) && (flags2 & RF2_AURA_ELEC) && (flags3 & RF3_AURA_COLD))
823 hook_c_roff(TERM_VIOLET, format("%^s¤Ï±ê¤Èɹ¤È¥¹¥Ñ¡¼¥¯¤ËÊñ¤Þ¤ì¤Æ¤¤¤ë¡£", wd_he[msex]));
825 hook_c_roff(TERM_VIOLET, format("%^s is surrounded by flames, ice and electricity. ", wd_he[msex]));
828 else if ((flags2 & RF2_AURA_FIRE) && (flags2 & RF2_AURA_ELEC))
831 hook_c_roff(TERM_L_RED, format("%^s¤Ï±ê¤È¥¹¥Ñ¡¼¥¯¤ËÊñ¤Þ¤ì¤Æ¤¤¤ë¡£", wd_he[msex]));
833 hook_c_roff(TERM_L_RED, format("%^s is surrounded by flames and electricity. ", wd_he[msex]));
836 else if ((flags2 & RF2_AURA_FIRE) && (flags3 & RF3_AURA_COLD))
839 hook_c_roff(TERM_BLUE, format("%^s¤Ï±ê¤Èɹ¤ËÊñ¤Þ¤ì¤Æ¤¤¤ë¡£", wd_he[msex]));
841 hook_c_roff(TERM_BLUE, format("%^s is surrounded by flames and ice. ", wd_he[msex]));
844 else if ((flags3 & RF3_AURA_COLD) && (flags2 & RF2_AURA_ELEC))
847 hook_c_roff(TERM_L_GREEN, format("%^s¤Ïɹ¤È¥¹¥Ñ¡¼¥¯¤ËÊñ¤Þ¤ì¤Æ¤¤¤ë¡£", wd_he[msex]));
849 hook_c_roff(TERM_L_GREEN, format("%^s is surrounded by ice and electricity. ", wd_he[msex]));
852 else if (flags2 & RF2_AURA_FIRE)
855 hook_c_roff(TERM_RED, format("%^s¤Ï±ê¤ËÊñ¤Þ¤ì¤Æ¤¤¤ë¡£", wd_he[msex]));
857 hook_c_roff(TERM_RED, format("%^s is surrounded by flames. ", wd_he[msex]));
860 else if (flags3 & RF3_AURA_COLD)
863 hook_c_roff(TERM_BLUE, format("%^s¤Ïɹ¤ËÊñ¤Þ¤ì¤Æ¤¤¤ë¡£", wd_he[msex]));
865 hook_c_roff(TERM_BLUE, format("%^s is surrounded by ice. ", wd_he[msex]));
868 else if (flags2 & RF2_AURA_ELEC)
871 hook_c_roff(TERM_L_BLUE, format("%^s¤Ï¥¹¥Ñ¡¼¥¯¤ËÊñ¤Þ¤ì¤Æ¤¤¤ë¡£", wd_he[msex]));
873 hook_c_roff(TERM_L_BLUE, format("%^s is surrounded by electricity. ", wd_he[msex]));
877 if (flags2 & RF2_REFLECTING)
880 hooked_roff(format("%^s¤ÏÌð¤Î¼öʸ¤òÄ·¤ÍÊÖ¤¹¡£", wd_he[msex]));
882 hooked_roff(format("%^s reflects bolt spells. ", wd_he[msex]));
887 /* Describe escorts */
888 if ((flags1 & RF1_ESCORT) || (flags1 & RF1_ESCORTS) || reinforce)
891 hooked_roff(format("%^s¤ÏÄ̾ï¸î±Ò¤òȼ¤Ã¤Æ¸½¤ì¤ë¡£",
893 hooked_roff(format("%^s usually appears with escorts. ",
900 hooked_roff("¸î±Ò¤Î¹½À®¤Ï");
901 if((flags1 & RF1_ESCORT) || (flags1 & RF1_ESCORTS))
903 hooked_roff("¾¯¤Ê¤¯¤È¤â");
906 hooked_roff("These escorts");
907 if((flags1 & RF1_ESCORT) || (flags1 & RF1_ESCORTS))
909 hooked_roff(" at the least");
911 hooked_roff(" contain ");
913 for(n = 0; n < 6; n++)
916 if(r_ptr->reinforce_id[n] && r_ptr->reinforce_dd[n] && r_ptr->reinforce_ds[n])
918 monster_race *rf_ptr = &r_info[r_ptr->reinforce_id[n]];
919 if(rf_ptr->flags1 & RF1_UNIQUE)
921 hooked_roff(format("¡¢%s", r_name + rf_ptr->name));
925 hooked_roff(format("¡¢ %dd%d ÂΤÎ%s", r_ptr->reinforce_dd[n], r_ptr->reinforce_ds[n],
926 r_name + rf_ptr->name));
930 if(r_ptr->reinforce_id[n] && r_ptr->reinforce_dd[n] && r_ptr->reinforce_ds[n])
932 monster_race *rf_ptr = &r_info[r_ptr->reinforce_id[n]];
933 if(rf_ptr->flags1 & RF1_UNIQUE)
935 hooked_roff(format(", %s", r_name + rf_ptr->name));
939 bool plural = (r_ptr->reinforce_dd[n] * r_ptr->reinforce_ds[n] > 1);
941 strcpy(name, r_name + rf_ptr->name);
942 if(plural) plural_aux(name);
943 hooked_roff(format(",%dd%d %s", r_ptr->reinforce_dd[n], r_ptr->reinforce_ds[n], name));
949 hooked_roff("¤ÇÀ®¤êΩ¤Ã¤Æ¤¤¤ë¡£");
956 /* Describe friends */
957 else if (flags1 & RF1_FRIENDS)
960 hooked_roff(format("%^s¤ÏÄ̾クÃĤǸ½¤ì¤ë¡£",
962 hooked_roff(format("%^s usually appears in groups. ",
969 /* Collect inate attacks */
972 if (flags4 & RF4_SHRIEK) {vp[vn] = "ÈáÌĤǽõ¤±¤òµá¤á¤ë";color[vn++] = TERM_L_WHITE;}
974 if (flags4 & RF4_SHRIEK) {vp[vn] = "shriek for help";color[vn++] = TERM_L_WHITE;}
978 if (flags4 & RF4_ROCKET) {vp[vn] = "¥í¥±¥Ã¥È¤òȯ¼Í¤¹¤ë";color[vn++] = TERM_UMBER;}
980 if (flags4 & RF4_ROCKET) {vp[vn] = "shoot a rocket";color[vn++] = TERM_UMBER;}
984 if (flags4 & RF4_SHOOT) {vp[vn] = "¼Í·â¤ò¤¹¤ë";color[vn++] = TERM_UMBER;}
986 if (flags4 & RF4_SHOOT) {vp[vn] = "fire an arrow";color[vn++] = TERM_UMBER;}
990 if (flags6 & (RF6_SPECIAL)) {vp[vn] = "ÆÃÊ̤ʹÔÆ°¤ò¤¹¤ë";color[vn++] = TERM_VIOLET;}
992 if (flags6 & (RF6_SPECIAL)) {vp[vn] = "do something";color[vn++] = TERM_VIOLET;}
995 /* Describe inate attacks */
1000 hooked_roff(format("%^s¤Ï", wd_he[msex]));
1002 hooked_roff(format("%^s", wd_he[msex]));
1007 for (n = 0; n < vn; n++)
1012 jverb(vp[n], jverb_buf, JVERB_OR);
1013 hook_c_roff(color[n], jverb_buf);
1014 hook_c_roff(color[n], "¤ê");
1017 else hook_c_roff(color[n], vp[n]);
1020 if (n == 0) hooked_roff(" may ");
1021 else if (n < vn - 1) hooked_roff(", ");
1022 else hooked_roff(" or ");
1025 hook_c_roff(color[n], vp[n]);
1032 hooked_roff("¤³¤È¤¬¤¢¤ë¡£");
1040 /* Collect breaths */
1043 if (flags4 & (RF4_BR_ACID)) {vp[vn] = "»À";color[vn++] = TERM_GREEN;}
1045 if (flags4 & (RF4_BR_ACID)) {vp[vn] = "acid";color[vn++] = TERM_GREEN;}
1049 if (flags4 & (RF4_BR_ELEC)) {vp[vn] = "°ðºÊ";color[vn++] = TERM_BLUE;}
1051 if (flags4 & (RF4_BR_ELEC)) {vp[vn] = "lightning";color[vn++] = TERM_BLUE;}
1055 if (flags4 & (RF4_BR_FIRE)) {vp[vn] = "²Ð±ê";color[vn++] = TERM_RED;}
1057 if (flags4 & (RF4_BR_FIRE)) {vp[vn] = "fire";color[vn++] = TERM_RED;}
1061 if (flags4 & (RF4_BR_COLD)) {vp[vn] = "Î䵤";color[vn++] = TERM_L_WHITE;}
1063 if (flags4 & (RF4_BR_COLD)) {vp[vn] = "frost";color[vn++] = TERM_L_WHITE;}
1067 if (flags4 & (RF4_BR_POIS)) {vp[vn] = "ÆÇ";color[vn++] = TERM_L_GREEN;}
1069 if (flags4 & (RF4_BR_POIS)) {vp[vn] = "poison";color[vn++] = TERM_L_GREEN;}
1073 if (flags4 & (RF4_BR_NETH)) {vp[vn] = "ÃϹö";color[vn++] = TERM_L_DARK;}
1075 if (flags4 & (RF4_BR_NETH)) {vp[vn] = "nether";color[vn++] = TERM_L_DARK;}
1079 if (flags4 & (RF4_BR_LITE)) {vp[vn] = "Á®¸÷";color[vn++] = TERM_YELLOW;}
1081 if (flags4 & (RF4_BR_LITE)) {vp[vn] = "light";color[vn++] = TERM_YELLOW;}
1085 if (flags4 & (RF4_BR_DARK)) {vp[vn] = "°Å¹õ";color[vn++] = TERM_L_DARK;}
1087 if (flags4 & (RF4_BR_DARK)) {vp[vn] = "darkness";color[vn++] = TERM_L_DARK;}
1091 if (flags4 & (RF4_BR_CONF)) {vp[vn] = "º®Íð";color[vn++] = TERM_L_UMBER;}
1093 if (flags4 & (RF4_BR_CONF)) {vp[vn] = "confusion";color[vn++] = TERM_L_UMBER;}
1097 if (flags4 & (RF4_BR_SOUN)) {vp[vn] = "¹ì²»";color[vn++] = TERM_ORANGE;}
1099 if (flags4 & (RF4_BR_SOUN)) {vp[vn] = "sound";color[vn++] = TERM_ORANGE;}
1103 if (flags4 & (RF4_BR_CHAO)) {vp[vn] = "¥«¥ª¥¹";color[vn++] = TERM_VIOLET;}
1105 if (flags4 & (RF4_BR_CHAO)) {vp[vn] = "chaos";color[vn++] = TERM_VIOLET;}
1109 if (flags4 & (RF4_BR_DISE)) {vp[vn] = "Îô²½";color[vn++] = TERM_VIOLET;}
1111 if (flags4 & (RF4_BR_DISE)) {vp[vn] = "disenchantment";color[vn++] = TERM_VIOLET;}
1115 if (flags4 & (RF4_BR_NEXU)) {vp[vn] = "°ø²Ìº®Íð";color[vn++] = TERM_VIOLET;}
1117 if (flags4 & (RF4_BR_NEXU)) {vp[vn] = "nexus";color[vn++] = TERM_VIOLET;}
1121 if (flags4 & (RF4_BR_TIME)) {vp[vn] = "»þ´ÖµÕž";color[vn++] = TERM_L_BLUE;}
1123 if (flags4 & (RF4_BR_TIME)) {vp[vn] = "time";color[vn++] = TERM_L_BLUE;}
1127 if (flags4 & (RF4_BR_INER)) {vp[vn] = "ÃÙÆß";color[vn++] = TERM_SLATE;}
1129 if (flags4 & (RF4_BR_INER)) {vp[vn] = "inertia";color[vn++] = TERM_SLATE;}
1133 if (flags4 & (RF4_BR_GRAV)) {vp[vn] = "½ÅÎÏ";color[vn++] = TERM_SLATE;}
1135 if (flags4 & (RF4_BR_GRAV)) {vp[vn] = "gravity";color[vn++] = TERM_SLATE;}
1139 if (flags4 & (RF4_BR_SHAR)) {vp[vn] = "ÇËÊÒ";color[vn++] = TERM_L_UMBER;}
1141 if (flags4 & (RF4_BR_SHAR)) {vp[vn] = "shards";color[vn++] = TERM_L_UMBER;}
1145 if (flags4 & (RF4_BR_PLAS)) {vp[vn] = "¥×¥é¥º¥Þ";color[vn++] = TERM_L_RED;}
1147 if (flags4 & (RF4_BR_PLAS)) {vp[vn] = "plasma";color[vn++] = TERM_L_RED;}
1151 if (flags4 & (RF4_BR_WALL)) {vp[vn] = "¥Õ¥©¡¼¥¹";color[vn++] = TERM_UMBER;}
1153 if (flags4 & (RF4_BR_WALL)) {vp[vn] = "force";color[vn++] = TERM_UMBER;}
1157 if (flags4 & (RF4_BR_MANA)) {vp[vn] = "ËâÎÏ";color[vn++] = TERM_L_BLUE;}
1159 if (flags4 & (RF4_BR_MANA)) {vp[vn] = "mana";color[vn++] = TERM_L_BLUE;}
1163 if (flags4 & (RF4_BR_NUKE)) {vp[vn] = "Êü¼ÍÀÇÑ´þʪ";color[vn++] = TERM_L_GREEN;}
1165 if (flags4 & (RF4_BR_NUKE)) {vp[vn] = "toxic waste";color[vn++] = TERM_L_GREEN;}
1169 if (flags4 & (RF4_BR_DISI)) {vp[vn] = "ʬ²ò";color[vn++] = TERM_SLATE;}
1171 if (flags4 & (RF4_BR_DISI)) {vp[vn] = "disintegration";color[vn++] = TERM_SLATE;}
1175 /* Describe breaths */
1183 hooked_roff(format("%^s¤Ï", wd_he[msex]));
1185 hooked_roff(format("%^s", wd_he[msex]));
1190 for (n = 0; n < vn; n++)
1194 if ( n != 0 ) hooked_roff("¤ä");
1196 if (n == 0) hooked_roff(" may breathe ");
1197 else if (n < vn-1) hooked_roff(", ");
1198 else hooked_roff(" or ");
1203 hook_c_roff(color[n], vp[n]);
1206 hooked_roff("¤Î¥Ö¥ì¥¹¤òÅǤ¯¤³¤È¤¬¤¢¤ë");
1211 /* Collect spells */
1214 if (flags5 & (RF5_BA_ACID)) {vp[vn] = "¥¢¥·¥Ã¥É¡¦¥Ü¡¼¥ë";color[vn++] = TERM_GREEN;}
1216 if (flags5 & (RF5_BA_ACID)) {vp[vn] = "produce acid balls";color[vn++] = TERM_GREEN;}
1220 if (flags5 & (RF5_BA_ELEC)) {vp[vn] = "¥µ¥ó¥À¡¼¡¦¥Ü¡¼¥ë";color[vn++] = TERM_BLUE;}
1222 if (flags5 & (RF5_BA_ELEC)) {vp[vn] = "produce lightning balls";color[vn++] = TERM_BLUE;}
1226 if (flags5 & (RF5_BA_FIRE)) {vp[vn] = "¥Õ¥¡¥¤¥¢¡¦¥Ü¡¼¥ë";color[vn++] = TERM_RED;}
1228 if (flags5 & (RF5_BA_FIRE)) {vp[vn] = "produce fire balls";color[vn++] = TERM_RED;}
1232 if (flags5 & (RF5_BA_COLD)) {vp[vn] = "¥¢¥¤¥¹¡¦¥Ü¡¼¥ë";color[vn++] = TERM_L_WHITE;}
1234 if (flags5 & (RF5_BA_COLD)) {vp[vn] = "produce frost balls";color[vn++] = TERM_L_WHITE;}
1238 if (flags5 & (RF5_BA_POIS)) {vp[vn] = "°½±À";color[vn++] = TERM_L_GREEN;}
1240 if (flags5 & (RF5_BA_POIS)) {vp[vn] = "produce poison balls";color[vn++] = TERM_L_GREEN;}
1244 if (flags5 & (RF5_BA_NETH)) {vp[vn] = "ÃϹöµå";color[vn++] = TERM_L_DARK;}
1246 if (flags5 & (RF5_BA_NETH)) {vp[vn] = "produce nether balls";color[vn++] = TERM_L_DARK;}
1250 if (flags5 & (RF5_BA_WATE)) {vp[vn] = "¥¦¥©¡¼¥¿¡¼¡¦¥Ü¡¼¥ë";color[vn++] = TERM_BLUE;}
1252 if (flags5 & (RF5_BA_WATE)) {vp[vn] = "produce water balls";color[vn++] = TERM_BLUE;}
1256 if (flags4 & (RF4_BA_NUKE)) {vp[vn] = "Êü¼Íǽµå";color[vn++] = TERM_L_GREEN;}
1258 if (flags4 & (RF4_BA_NUKE)) {vp[vn] = "produce balls of radiation";color[vn++] = TERM_L_GREEN;}
1262 if (flags5 & (RF5_BA_MANA)) {vp[vn] = "ËâÎϤÎÍò";color[vn++] = TERM_L_BLUE;}
1264 if (flags5 & (RF5_BA_MANA)) {vp[vn] = "invoke mana storms";color[vn++] = TERM_L_BLUE;}
1268 if (flags5 & (RF5_BA_DARK)) {vp[vn] = "°Å¹õ¤ÎÍò";color[vn++] = TERM_L_DARK;}
1270 if (flags5 & (RF5_BA_DARK)) {vp[vn] = "invoke darkness storms";color[vn++] = TERM_L_DARK;}
1274 if (flags5 & (RF5_BA_LITE)) {vp[vn] = "¥¹¥¿¡¼¥Ð¡¼¥¹¥È";color[vn++] = TERM_YELLOW;}
1276 if (flags5 & (RF5_BA_LITE)) {vp[vn] = "invoke starburst";color[vn++] = TERM_YELLOW;}
1280 if (flags4 & (RF4_BA_CHAO)) {vp[vn] = "½ã¥í¥°¥ë¥¹";color[vn++] = TERM_VIOLET;}
1282 if (flags4 & (RF4_BA_CHAO)) {vp[vn] = "invoke raw Logrus";color[vn++] = TERM_VIOLET;}
1286 if (flags6 & (RF6_HAND_DOOM)) {vp[vn] = "ÇËÌǤμê";color[vn++] = TERM_VIOLET;}
1288 if (flags6 & (RF6_HAND_DOOM)) {vp[vn] = "invoke the Hand of Doom";color[vn++] = TERM_VIOLET;}
1292 if (flags6 & (RF6_PSY_SPEAR)) {vp[vn] = "¸÷¤Î·õ";color[vn++] = TERM_YELLOW;}
1294 if (flags6 & (RF6_PSY_SPEAR)) {vp[vn] = "psycho-spear";color[vn++] = TERM_YELLOW;}
1298 if (flags5 & (RF5_DRAIN_MANA)) {vp[vn] = "ËâÎϵۼý";color[vn++] = TERM_SLATE;}
1300 if (flags5 & (RF5_DRAIN_MANA)) {vp[vn] = "drain mana";color[vn++] = TERM_SLATE;}
1304 if (flags5 & (RF5_MIND_BLAST)) {vp[vn] = "Àº¿À¹¶·â";color[vn++] = TERM_L_RED;}
1306 if (flags5 & (RF5_MIND_BLAST)) {vp[vn] = "cause mind blasting";color[vn++] = TERM_L_RED;}
1310 if (flags5 & (RF5_BRAIN_SMASH)) {vp[vn] = "Ǿ¹¶·â";color[vn++] = TERM_RED;}
1312 if (flags5 & (RF5_BRAIN_SMASH)) {vp[vn] = "cause brain smashing";color[vn++] = TERM_RED;}
1316 if (flags5 & (RF5_CAUSE_1)) {vp[vn] = "·Ú½ý¡Ü¼ö¤¤";color[vn++] = TERM_L_WHITE;}
1318 if (flags5 & (RF5_CAUSE_1)) {vp[vn] = "cause light wounds and cursing";color[vn++] = TERM_L_WHITE;}
1322 if (flags5 & (RF5_CAUSE_2)) {vp[vn] = "½Å½ý¡Ü¼ö¤¤";color[vn++] = TERM_L_WHITE;}
1324 if (flags5 & (RF5_CAUSE_2)) {vp[vn] = "cause serious wounds and cursing";color[vn++] = TERM_L_WHITE;}
1328 if (flags5 & (RF5_CAUSE_3)) {vp[vn] = "Ã×Ì¿½ý¡Ü¼ö¤¤";color[vn++] = TERM_L_WHITE;}
1330 if (flags5 & (RF5_CAUSE_3)) {vp[vn] = "cause critical wounds and cursing";color[vn++] = TERM_L_WHITE;}
1334 if (flags5 & (RF5_CAUSE_4)) {vp[vn] = "È빦¤òÆͤ¯";color[vn++] = TERM_L_WHITE;}
1336 if (flags5 & (RF5_CAUSE_4)) {vp[vn] = "cause mortal wounds";color[vn++] = TERM_L_WHITE;}
1340 if (flags5 & (RF5_BO_ACID)) {vp[vn] = "¥¢¥·¥Ã¥É¡¦¥Ü¥ë¥È";color[vn++] = TERM_GREEN;}
1342 if (flags5 & (RF5_BO_ACID)) {vp[vn] = "produce acid bolts";color[vn++] = TERM_GREEN;}
1346 if (flags5 & (RF5_BO_ELEC)) {vp[vn] = "¥µ¥ó¥À¡¼¡¦¥Ü¥ë¥È";color[vn++] = TERM_BLUE;}
1348 if (flags5 & (RF5_BO_ELEC)) {vp[vn] = "produce lightning bolts";color[vn++] = TERM_BLUE;}
1352 if (flags5 & (RF5_BO_FIRE)) {vp[vn] = "¥Õ¥¡¥¤¥¢¡¦¥Ü¥ë¥È";color[vn++] = TERM_RED;}
1354 if (flags5 & (RF5_BO_FIRE)) {vp[vn] = "produce fire bolts";color[vn++] = TERM_RED;}
1358 if (flags5 & (RF5_BO_COLD)) {vp[vn] = "¥¢¥¤¥¹¡¦¥Ü¥ë¥È";color[vn++] = TERM_L_WHITE;}
1360 if (flags5 & (RF5_BO_COLD)) {vp[vn] = "produce frost bolts";color[vn++] = TERM_L_WHITE;}
1364 if (flags5 & (RF5_BO_NETH)) {vp[vn] = "ÃϹö¤ÎÌð";color[vn++] = TERM_L_DARK;}
1366 if (flags5 & (RF5_BO_NETH)) {vp[vn] = "produce nether bolts";color[vn++] = TERM_L_DARK;}
1370 if (flags5 & (RF5_BO_WATE)) {vp[vn] = "¥¦¥©¡¼¥¿¡¼¡¦¥Ü¥ë¥È";color[vn++] = TERM_BLUE;}
1372 if (flags5 & (RF5_BO_WATE)) {vp[vn] = "produce water bolts";color[vn++] = TERM_BLUE;}
1376 if (flags5 & (RF5_BO_MANA)) {vp[vn] = "ËâÎϤÎÌð";color[vn++] = TERM_L_BLUE;}
1378 if (flags5 & (RF5_BO_MANA)) {vp[vn] = "produce mana bolts";color[vn++] = TERM_L_BLUE;}
1382 if (flags5 & (RF5_BO_PLAS)) {vp[vn] = "¥×¥é¥º¥Þ¡¦¥Ü¥ë¥È";color[vn++] = TERM_L_RED;}
1384 if (flags5 & (RF5_BO_PLAS)) {vp[vn] = "produce plasma bolts";color[vn++] = TERM_L_RED;}
1388 if (flags5 & (RF5_BO_ICEE)) {vp[vn] = "¶Ë´¨¤ÎÌð";color[vn++] = TERM_WHITE;}
1390 if (flags5 & (RF5_BO_ICEE)) {vp[vn] = "produce ice bolts";color[vn++] = TERM_WHITE;}
1394 if (flags5 & (RF5_MISSILE)) {vp[vn] = "¥Þ¥¸¥Ã¥¯¥ß¥µ¥¤¥ë";color[vn++] = TERM_SLATE;}
1396 if (flags5 & (RF5_MISSILE)) {vp[vn] = "produce magic missiles";color[vn++] = TERM_SLATE;}
1400 if (flags5 & (RF5_SCARE)) {vp[vn] = "¶²ÉÝ";color[vn++] = TERM_SLATE;}
1402 if (flags5 & (RF5_SCARE)) {vp[vn] = "terrify";color[vn++] = TERM_SLATE;}
1406 if (flags5 & (RF5_BLIND)) {vp[vn] = "Ìܤ¯¤é¤Þ¤·";color[vn++] = TERM_L_DARK;}
1408 if (flags5 & (RF5_BLIND)) {vp[vn] = "blind";color[vn++] = TERM_L_DARK;}
1412 if (flags5 & (RF5_CONF)) {vp[vn] = "º®Íð";color[vn++] = TERM_L_UMBER;}
1414 if (flags5 & (RF5_CONF)) {vp[vn] = "confuse";color[vn++] = TERM_L_UMBER;}
1418 if (flags5 & (RF5_SLOW)) {vp[vn] = "¸ºÂ®";color[vn++] = TERM_UMBER;}
1420 if (flags5 & (RF5_SLOW)) {vp[vn] = "slow";color[vn++] = TERM_UMBER;}
1424 if (flags5 & (RF5_HOLD)) {vp[vn] = "Ëãáã";color[vn++] = TERM_RED;}
1426 if (flags5 & (RF5_HOLD)) {vp[vn] = "paralyze";color[vn++] = TERM_RED;}
1430 if (flags6 & (RF6_HASTE)) {vp[vn] = "²Ã®";color[vn++] = TERM_L_GREEN;}
1432 if (flags6 & (RF6_HASTE)) {vp[vn] = "haste-self";color[vn++] = TERM_L_GREEN;}
1436 if (flags6 & (RF6_HEAL)) {vp[vn] = "¼£Ìþ";color[vn++] = TERM_WHITE;}
1438 if (flags6 & (RF6_HEAL)) {vp[vn] = "heal-self";color[vn++] = TERM_WHITE;}
1442 if (flags6 & (RF6_INVULNER)) {vp[vn] = "̵Ũ²½";color[vn++] = TERM_WHITE;}
1444 if (flags6 & (RF6_INVULNER)) {vp[vn] = "make invulnerable";color[vn++] = TERM_WHITE;}
1448 if (flags4 & RF4_DISPEL) {vp[vn] = "ËâÎϾõî";color[vn++] = TERM_L_WHITE;}
1450 if (flags4 & RF4_DISPEL) {vp[vn] = "dispel-magic";color[vn++] = TERM_L_WHITE;}
1454 if (flags6 & (RF6_BLINK)) {vp[vn] = "¥·¥ç¡¼¥È¥Æ¥ì¥Ý¡¼¥È";color[vn++] = TERM_UMBER;}
1456 if (flags6 & (RF6_BLINK)) {vp[vn] = "blink-self";color[vn++] = TERM_UMBER;}
1460 if (flags6 & (RF6_TPORT)) {vp[vn] = "¥Æ¥ì¥Ý¡¼¥È";color[vn++] = TERM_ORANGE;}
1462 if (flags6 & (RF6_TPORT)) {vp[vn] = "teleport-self";color[vn++] = TERM_ORANGE;}
1466 if (flags6 & (RF6_WORLD)) {vp[vn] = "»þ¤ò»ß¤á¤ë";color[vn++] = TERM_L_BLUE;}
1468 if (flags6 & (RF6_WORLD)) {vp[vn] = "stop the time";color[vn++] = TERM_L_BLUE;}
1472 if (flags6 & (RF6_TELE_TO)) {vp[vn] = "¥Æ¥ì¥Ý¡¼¥È¥Ð¥Ã¥¯";color[vn++] = TERM_L_UMBER;}
1474 if (flags6 & (RF6_TELE_TO)) {vp[vn] = "teleport to";color[vn++] = TERM_L_UMBER;}
1478 if (flags6 & (RF6_TELE_AWAY)) {vp[vn] = "¥Æ¥ì¥Ý¡¼¥È¥¢¥¦¥§¥¤";color[vn++] = TERM_UMBER;}
1480 if (flags6 & (RF6_TELE_AWAY)) {vp[vn] = "teleport away";color[vn++] = TERM_UMBER;}
1484 if (flags6 & (RF6_TELE_LEVEL)) {vp[vn] = "¥Æ¥ì¥Ý¡¼¥È¡¦¥ì¥Ù¥ë";color[vn++] = TERM_ORANGE;}
1486 if (flags6 & (RF6_TELE_LEVEL)) {vp[vn] = "teleport level";color[vn++] = TERM_ORANGE;}
1489 if (flags6 & (RF6_DARKNESS))
1491 if ((p_ptr->pclass != CLASS_NINJA) || (r_ptr->flags3 & (RF3_UNDEAD | RF3_HURT_LITE)) || (r_ptr->flags7 & RF7_DARK_MASK))
1494 vp[vn] = "°Å°Ç"; color[vn++] = TERM_L_DARK;
1496 vp[vn] = "create darkness"; color[vn++] = TERM_L_DARK;
1502 vp[vn] = "Á®¸÷"; color[vn++] = TERM_YELLOW;
1504 vp[vn] = "create light"; color[vn++] = TERM_YELLOW;
1510 if (flags6 & (RF6_TRAPS)) {vp[vn] = "¥È¥é¥Ã¥×";color[vn++] = TERM_BLUE;}
1512 if (flags6 & (RF6_TRAPS)) {vp[vn] = "create traps";color[vn++] = TERM_BLUE;}
1516 if (flags6 & (RF6_FORGET)) {vp[vn] = "µ²±¾Ãµî";color[vn++] = TERM_BLUE;}
1518 if (flags6 & (RF6_FORGET)) {vp[vn] = "cause amnesia";color[vn++] = TERM_BLUE;}
1522 if (flags6 & (RF6_RAISE_DEAD)) {vp[vn] = "»à¼ÔÉü³è";color[vn++] = TERM_RED;}
1524 if (flags6 & (RF6_RAISE_DEAD)) {vp[vn] = "raise dead";color[vn++] = TERM_RED;}
1528 if (flags6 & (RF6_S_MONSTER)) {vp[vn] = "¥â¥ó¥¹¥¿¡¼°ìÂξ¤´";color[vn++] = TERM_SLATE;}
1530 if (flags6 & (RF6_S_MONSTER)) {vp[vn] = "summon a monster";color[vn++] = TERM_SLATE;}
1534 if (flags6 & (RF6_S_MONSTERS)) {vp[vn] = "¥â¥ó¥¹¥¿¡¼Ê£¿ô¾¤´";color[vn++] = TERM_L_WHITE;}
1536 if (flags6 & (RF6_S_MONSTERS)) {vp[vn] = "summon monsters";color[vn++] = TERM_L_WHITE;}
1540 if (flags6 & (RF6_S_KIN)) {vp[vn] = "µß±ç¾¤´";color[vn++] = TERM_ORANGE;}
1542 if (flags6 & (RF6_S_KIN)) {vp[vn] = "summon aid";color[vn++] = TERM_ORANGE;}
1546 if (flags6 & (RF6_S_ANT)) {vp[vn] = "¥¢¥ê¾¤´";color[vn++] = TERM_RED;}
1548 if (flags6 & (RF6_S_ANT)) {vp[vn] = "summon ants";color[vn++] = TERM_RED;}
1552 if (flags6 & (RF6_S_SPIDER)) {vp[vn] = "¥¯¥â¾¤´";color[vn++] = TERM_L_DARK;}
1554 if (flags6 & (RF6_S_SPIDER)) {vp[vn] = "summon spiders";color[vn++] = TERM_L_DARK;}
1558 if (flags6 & (RF6_S_HOUND)) {vp[vn] = "¥Ï¥¦¥ó¥É¾¤´";color[vn++] = TERM_L_UMBER;}
1560 if (flags6 & (RF6_S_HOUND)) {vp[vn] = "summon hounds";color[vn++] = TERM_L_UMBER;}
1564 if (flags6 & (RF6_S_HYDRA)) {vp[vn] = "¥Ò¥É¥é¾¤´";color[vn++] = TERM_L_GREEN;}
1566 if (flags6 & (RF6_S_HYDRA)) {vp[vn] = "summon hydras";color[vn++] = TERM_L_GREEN;}
1570 if (flags6 & (RF6_S_ANGEL)) {vp[vn] = "Å·»È°ìÂξ¤´";color[vn++] = TERM_YELLOW;}
1572 if (flags6 & (RF6_S_ANGEL)) {vp[vn] = "summon an angel";color[vn++] = TERM_YELLOW;}
1576 if (flags6 & (RF6_S_DEMON)) {vp[vn] = "¥Ç¡¼¥â¥ó°ìÂξ¤´";color[vn++] = TERM_L_RED;}
1578 if (flags6 & (RF6_S_DEMON)) {vp[vn] = "summon a demon";color[vn++] = TERM_L_RED;}
1582 if (flags6 & (RF6_S_UNDEAD)) {vp[vn] = "¥¢¥ó¥Ç¥Ã¥É°ìÂξ¤´";color[vn++] = TERM_L_DARK;}
1584 if (flags6 & (RF6_S_UNDEAD)) {vp[vn] = "summon an undead";color[vn++] = TERM_L_DARK;}
1588 if (flags6 & (RF6_S_DRAGON)) {vp[vn] = "¥É¥é¥´¥ó°ìÂξ¤´";color[vn++] = TERM_ORANGE;}
1590 if (flags6 & (RF6_S_DRAGON)) {vp[vn] = "summon a dragon";color[vn++] = TERM_ORANGE;}
1594 if (flags6 & (RF6_S_HI_UNDEAD)) {vp[vn] = "¶¯ÎϤʥ¢¥ó¥Ç¥Ã¥É¾¤´";color[vn++] = TERM_L_DARK;}
1596 if (flags6 & (RF6_S_HI_UNDEAD)) {vp[vn] = "summon Greater Undead";color[vn++] = TERM_L_DARK;}
1600 if (flags6 & (RF6_S_HI_DRAGON)) {vp[vn] = "¸ÅÂå¥É¥é¥´¥ó¾¤´";color[vn++] = TERM_ORANGE;}
1602 if (flags6 & (RF6_S_HI_DRAGON)) {vp[vn] = "summon Ancient Dragons";color[vn++] = TERM_ORANGE;}
1606 if (flags6 & (RF6_S_CYBER)) {vp[vn] = "¥µ¥¤¥Ð¡¼¥Ç¡¼¥â¥ó¾¤´";color[vn++] = TERM_UMBER;}
1608 if (flags6 & (RF6_S_CYBER)) {vp[vn] = "summon Cyberdemons";color[vn++] = TERM_UMBER;}
1612 if (flags6 & (RF6_S_AMBERITES)) {vp[vn] = "¥¢¥ó¥Ð¡¼¤Î²¦Â²¾¤´";color[vn++] = TERM_VIOLET;}
1614 if (flags6 & (RF6_S_AMBERITES)) {vp[vn] = "summon Lords of Amber";color[vn++] = TERM_VIOLET;}
1618 if (flags6 & (RF6_S_UNIQUE)) {vp[vn] = "¥æ¥Ë¡¼¥¯¡¦¥â¥ó¥¹¥¿¡¼¾¤´";color[vn++] = TERM_VIOLET;}
1620 if (flags6 & (RF6_S_UNIQUE)) {vp[vn] = "summon Unique Monsters";color[vn++] = TERM_VIOLET;}
1624 /* Describe spells */
1634 hooked_roff("¡¢¤Ê¤ª¤«¤Ä");
1636 hooked_roff(", and is also");
1643 hooked_roff(format("%^s¤Ï", wd_he[msex]));
1645 hooked_roff(format("%^s is", wd_he[msex]));
1652 if (flags2 & (RF2_SMART)) hook_c_roff(TERM_YELLOW, "Ū³Î¤Ë");
1655 hooked_roff("ËâË¡¤ò»È¤¦¤³¤È¤¬¤Ç¤¡¢");
1658 hooked_roff(" magical, casting spells");
1661 if (flags2 & RF2_SMART) hook_c_roff(TERM_YELLOW, " intelligently");
1666 for (n = 0; n < vn; n++)
1670 if ( n != 0 ) hooked_roff("¡¢");
1672 if (n == 0) hooked_roff(" which ");
1673 else if (n < vn-1) hooked_roff(", ");
1674 else hooked_roff(" or ");
1679 hook_c_roff(color[n], vp[n]);
1682 hooked_roff("¤Î¼öʸ¤ò¾§¤¨¤ë¤³¤È¤¬¤¢¤ë");
1687 /* End the sentence about inate/other spells */
1688 if (breath || magic)
1691 m = r_ptr->r_cast_spell;
1693 /* Average frequency */
1694 n = r_ptr->freq_spell;
1696 /* Describe the spell frequency */
1697 if (m > 100 || know_everything)
1700 hooked_roff(format("(³ÎΨ:1/%d)", 100 / n));
1702 hooked_roff(format("; 1 time in %d", 100 / n));
1707 /* Guess at the frequency */
1710 n = ((n + 9) / 10) * 10;
1712 hooked_roff(format("(³ÎΨ:Ìó1/%d)", 100 / n));
1714 hooked_roff(format("; about 1 time in %d", 100 / n));
1719 /* End this sentence */
1728 /* Describe monster "toughness" */
1729 if (know_armour(r_idx))
1733 hooked_roff(format("%^s¤Ï AC%d ¤ÎËɸæÎϤÈ",
1735 hooked_roff(format("%^s has an armor rating of %d",
1738 wd_he[msex], r_ptr->ac));
1740 /* Maximized hitpoints */
1741 if ((flags1 & RF1_FORCE_MAXHP) || (r_ptr->hside == 1))
1743 u32b hp = r_ptr->hdice * (nightmare ? 2 : 1) * r_ptr->hside;
1745 hooked_roff(format(" %d ¤ÎÂÎÎϤ¬¤¢¤ë¡£",
1747 hooked_roff(format(" and a life rating of %d. ",
1749 (s16b)MIN(30000, hp)));
1752 /* Variable hitpoints */
1756 hooked_roff(format(" %dd%d ¤ÎÂÎÎϤ¬¤¢¤ë¡£",
1758 hooked_roff(format(" and a life rating of %dd%d. ",
1760 r_ptr->hdice * (nightmare ? 2 : 1), r_ptr->hside));
1766 /* Collect special abilities. */
1768 if (flags7 & (RF7_HAS_LITE_1 | RF7_HAS_LITE_2)) { vp[vn] = _("¥À¥ó¥¸¥ç¥ó¤ò¾È¤é¤¹", "illuminate the dungeon"); color[vn++] = TERM_WHITE; }
1769 if (flags7 & (RF7_HAS_DARK_1 | RF7_HAS_DARK_2)) { vp[vn] = _("¥À¥ó¥¸¥ç¥ó¤ò°Å¤¯¤¹¤ë", "darken the dungeon"); color[vn++] = TERM_L_DARK; }
1770 if (flags2 & RF2_OPEN_DOOR) { vp[vn] = _("¥É¥¢¤ò³«¤±¤ë", "open doors"); color[vn++] = TERM_WHITE; }
1771 if (flags2 & RF2_BASH_DOOR) { vp[vn] = _("¥É¥¢¤òÂǤÁÇˤë", "bash down doors"); color[vn++] = TERM_WHITE; }
1772 if (flags7 & RF7_CAN_FLY) { vp[vn] = _("¶õ¤òÈô¤Ö", "fly"); color[vn++] = TERM_WHITE; }
1773 if (flags7 & RF7_CAN_SWIM) { vp[vn] = _("¿å¤òÅϤë", "swim"); color[vn++] = TERM_WHITE; }
1774 if (flags2 & RF2_PASS_WALL) { vp[vn] = _("Êɤò¤¹¤êÈ´¤±¤ë", "pass through walls"); color[vn++] = TERM_WHITE; }
1775 if (flags2 & RF2_KILL_WALL) { vp[vn] = _("Êɤò·¡¤ê¿Ê¤à", "bore through walls"); color[vn++] = TERM_WHITE; }
1776 if (flags2 & RF2_MOVE_BODY) { vp[vn] = _("¼å¤¤¥â¥ó¥¹¥¿¡¼¤ò²¡¤·¤Î¤±¤ë", "push past weaker monsters"); color[vn++] = TERM_WHITE; }
1777 if (flags2 & RF2_KILL_BODY) { vp[vn] = _("¼å¤¤¥â¥ó¥¹¥¿¡¼¤òÅݤ¹", "destroy weaker monsters"); color[vn++] = TERM_WHITE; }
1778 if (flags2 & RF2_TAKE_ITEM) { vp[vn] = _("¥¢¥¤¥Æ¥à¤ò½¦¤¦", "pick up objects"); color[vn++] = TERM_WHITE; }
1779 if (flags2 & RF2_KILL_ITEM) { vp[vn] = _("¥¢¥¤¥Æ¥à¤ò²õ¤¹", "destroy objects"); color[vn++] = TERM_WHITE; }
1782 /* Describe special abilities. */
1786 hooked_roff(format(_("%^s¤Ï", "%^s"), wd_he[msex]));
1789 for (n = 0; n < vn; n++)
1795 jverb(vp[n], jverb_buf, JVERB_AND);
1796 hook_c_roff(color[n], jverb_buf);
1799 else hook_c_roff(color[n], vp[n]);
1801 if (n == 0) hooked_roff(" can ");
1802 else if (n < vn - 1) hooked_roff(", ");
1803 else hooked_roff(" and ");
1806 hook_c_roff(color[n], vp[n]);
1812 hooked_roff(_("¤³¤È¤¬¤Ç¤¤ë¡£", ". "));
1817 if (flags7 & RF7_AQUATIC)
1819 hooked_roff(format(_("%^s¤Ï¿åÃæ¤ËÀ³¤ó¤Ç¤¤¤ë¡£", "%^s lives in water. "), wd_he[msex]));
1822 /* Describe special abilities. */
1823 if (flags7 & (RF7_SELF_LITE_1 | RF7_SELF_LITE_2))
1825 hooked_roff(format(_("%^s¤Ï¸÷¤Ã¤Æ¤¤¤ë¡£", "%^s is shining. "), wd_he[msex]));
1827 if (flags7 & (RF7_SELF_DARK_1 | RF7_SELF_DARK_2))
1829 hook_c_roff(TERM_L_DARK, format(_("%^s¤Ï°Å¹õ¤ËÊñ¤Þ¤ì¤Æ¤¤¤ë¡£", "%^s is surrounded by darkness. "), wd_he[msex]));
1831 if (flags2 & RF2_INVISIBLE)
1833 hooked_roff(format(_("%^s¤ÏÆ©ÌÀ¤ÇÌܤ˸«¤¨¤Ê¤¤¡£", "%^s is invisible. "), wd_he[msex]));
1835 if (flags2 & RF2_COLD_BLOOD)
1837 hooked_roff(format(_("%^s¤ÏÎä·ìưʪ¤Ç¤¢¤ë¡£", "%^s is cold blooded. "), wd_he[msex]));
1839 if (flags2 & RF2_EMPTY_MIND)
1841 hooked_roff(format(_("%^s¤Ï¥Æ¥ì¥Ñ¥·¡¼¤Ç¤Ï´¶ÃΤǤ¤Ê¤¤¡£", "%^s is not detected by telepathy. "), wd_he[msex]));
1843 else if (flags2 & RF2_WEIRD_MIND)
1845 hooked_roff(format(_("%^s¤Ï¤Þ¤ì¤Ë¥Æ¥ì¥Ñ¥·¡¼¤Ç´¶ÃΤǤ¤ë¡£", "%^s is rarely detected by telepathy. "), wd_he[msex]));
1847 if (flags2 & RF2_MULTIPLY)
1849 hook_c_roff(TERM_L_UMBER, format(_("%^s¤ÏÇúȯŪ¤ËÁý¿£¤¹¤ë¡£", "%^s breeds explosively. "), wd_he[msex]));
1851 if (flags2 & RF2_REGENERATE)
1853 hook_c_roff(TERM_L_WHITE, format(_("%^s¤ÏÁÇÁ᤯ÂÎÎϤò²óÉü¤¹¤ë¡£", "%^s regenerates quickly. "), wd_he[msex]));
1855 if (flags7 & RF7_RIDING)
1857 hook_c_roff(TERM_SLATE, format(_("%^s¤Ë¾è¤ë¤³¤È¤¬¤Ç¤¤ë¡£", "%^s is suitable for riding. "), wd_he[msex]));
1861 /* Collect susceptibilities */
1864 if (flags3 & RF3_HURT_ROCK) {vp[vn] = "´ä¤ò½üµî¤¹¤ë¤â¤Î";color[vn++] = TERM_UMBER;}
1866 if (flags3 & RF3_HURT_ROCK) {vp[vn] = "rock remover";color[vn++] = TERM_UMBER;}
1870 if (flags3 & RF3_HURT_LITE) {vp[vn] = "ÌÀ¤ë¤¤¸÷";color[vn++] = TERM_YELLOW;}
1872 if (flags3 & RF3_HURT_LITE) {vp[vn] = "bright light";color[vn++] = TERM_YELLOW;}
1876 if (flags3 & RF3_HURT_FIRE) {vp[vn] = "±ê";color[vn++] = TERM_RED;}
1878 if (flags3 & RF3_HURT_FIRE) {vp[vn] = "fire";color[vn++] = TERM_RED;}
1882 if (flags3 & RF3_HURT_COLD) {vp[vn] = "Î䵤";color[vn++] = TERM_L_WHITE;}
1884 if (flags3 & RF3_HURT_COLD) {vp[vn] = "cold";color[vn++] = TERM_L_WHITE;}
1888 /* Describe susceptibilities */
1893 hooked_roff(format("%^s¤Ë¤Ï", wd_he[msex]));
1895 hooked_roff(format("%^s", wd_he[msex]));
1900 for (n = 0; n < vn; n++)
1904 if ( n != 0 ) hooked_roff("¤ä");
1906 if (n == 0) hooked_roff(" is hurt by ");
1907 else if (n < vn-1) hooked_roff(", ");
1908 else hooked_roff(" and ");
1913 hook_c_roff(color[n], vp[n]);
1918 hooked_roff("¤Ç¥À¥á¡¼¥¸¤òÍ¿¤¨¤é¤ì¤ë¡£");
1926 /* Collect immunities */
1929 if (flagsr & RFR_IM_ACID) {vp[vn] = "»À";color[vn++] = TERM_GREEN;}
1931 if (flagsr & RFR_IM_ACID) {vp[vn] = "acid";color[vn++] = TERM_GREEN;}
1935 if (flagsr & RFR_IM_ELEC) {vp[vn] = "°ðºÊ";color[vn++] = TERM_BLUE;}
1937 if (flagsr & RFR_IM_ELEC) {vp[vn] = "lightning";color[vn++] = TERM_BLUE;}
1941 if (flagsr & RFR_IM_FIRE) {vp[vn] = "±ê";color[vn++] = TERM_RED;}
1943 if (flagsr & RFR_IM_FIRE) {vp[vn] = "fire";color[vn++] = TERM_RED;}
1947 if (flagsr & RFR_IM_COLD) {vp[vn] = "Î䵤";color[vn++] = TERM_L_WHITE;}
1949 if (flagsr & RFR_IM_COLD) {vp[vn] = "cold";color[vn++] = TERM_L_WHITE;}
1953 if (flagsr & RFR_IM_POIS) {vp[vn] = "ÆÇ";color[vn++] = TERM_L_GREEN;}
1955 if (flagsr & RFR_IM_POIS) {vp[vn] = "poison";color[vn++] = TERM_L_GREEN;}
1959 /* Collect resistances */
1961 if (flagsr & RFR_RES_LITE) {vp[vn] = "Á®¸÷";color[vn++] = TERM_YELLOW;}
1963 if (flagsr & RFR_RES_LITE) {vp[vn] = "light";color[vn++] = TERM_YELLOW;}
1967 if (flagsr & RFR_RES_DARK) {vp[vn] = "°Å¹õ";color[vn++] = TERM_L_DARK;}
1969 if (flagsr & RFR_RES_DARK) {vp[vn] = "dark";color[vn++] = TERM_L_DARK;}
1973 if (flagsr & RFR_RES_NETH) {vp[vn] = "ÃϹö";color[vn++] = TERM_L_DARK;}
1975 if (flagsr & RFR_RES_NETH) {vp[vn] = "nether";color[vn++] = TERM_L_DARK;}
1979 if (flagsr & RFR_RES_WATE) {vp[vn] = "¿å";color[vn++] = TERM_BLUE;}
1981 if (flagsr & RFR_RES_WATE) {vp[vn] = "water";color[vn++] = TERM_BLUE;}
1985 if (flagsr & RFR_RES_PLAS) {vp[vn] = "¥×¥é¥º¥Þ";color[vn++] = TERM_L_RED;}
1987 if (flagsr & RFR_RES_PLAS) {vp[vn] = "plasma";color[vn++] = TERM_L_RED;}
1991 if (flagsr & RFR_RES_SHAR) {vp[vn] = "ÇËÊÒ";color[vn++] = TERM_L_UMBER;}
1993 if (flagsr & RFR_RES_SHAR) {vp[vn] = "shards";color[vn++] = TERM_L_UMBER;}
1997 if (flagsr & RFR_RES_SOUN) {vp[vn] = "¹ì²»";color[vn++] = TERM_ORANGE;}
1999 if (flagsr & RFR_RES_SOUN) {vp[vn] = "sound";color[vn++] = TERM_ORANGE;}
2003 if (flagsr & RFR_RES_CHAO) {vp[vn] = "¥«¥ª¥¹";color[vn++] = TERM_VIOLET;}
2005 if (flagsr & RFR_RES_CHAO) {vp[vn] = "chaos";color[vn++] = TERM_VIOLET;}
2009 if (flagsr & RFR_RES_NEXU) {vp[vn] = "°ø²Ìº®Íð";color[vn++] = TERM_VIOLET;}
2011 if (flagsr & RFR_RES_NEXU) {vp[vn] = "nexus";color[vn++] = TERM_VIOLET;}
2015 if (flagsr & RFR_RES_DISE) {vp[vn] = "Îô²½";color[vn++] = TERM_VIOLET;}
2017 if (flagsr & RFR_RES_DISE) {vp[vn] = "disenchantment";color[vn++] = TERM_VIOLET;}
2021 if (flagsr & RFR_RES_WALL) {vp[vn] = "¥Õ¥©¡¼¥¹";color[vn++] = TERM_UMBER;}
2023 if (flagsr & RFR_RES_WALL) {vp[vn] = "force";color[vn++] = TERM_UMBER;}
2027 if (flagsr & RFR_RES_INER) {vp[vn] = "ÃÙÆß";color[vn++] = TERM_SLATE;}
2029 if (flagsr & RFR_RES_INER) {vp[vn] = "inertia";color[vn++] = TERM_SLATE;}
2033 if (flagsr & RFR_RES_TIME) {vp[vn] = "»þ´ÖµÕž";color[vn++] = TERM_L_BLUE;}
2035 if (flagsr & RFR_RES_TIME) {vp[vn] = "time";color[vn++] = TERM_L_BLUE;}
2039 if (flagsr & RFR_RES_GRAV) {vp[vn] = "½ÅÎÏ";color[vn++] = TERM_SLATE;}
2041 if (flagsr & RFR_RES_GRAV) {vp[vn] = "gravity";color[vn++] = TERM_SLATE;}
2045 if (flagsr & RFR_RES_ALL) {vp[vn] = "¤¢¤é¤æ¤ë¹¶·â";color[vn++] = TERM_YELLOW;}
2047 if (flagsr & RFR_RES_ALL) {vp[vn] = "all";color[vn++] = TERM_YELLOW;}
2051 if ((flagsr & RFR_RES_TELE) && !(r_ptr->flags1 & RF1_UNIQUE)) {vp[vn] = "¥Æ¥ì¥Ý¡¼¥È";color[vn++] = TERM_ORANGE;}
2053 if ((flagsr & RFR_RES_TELE) && !(r_ptr->flags1 & RF1_UNIQUE)) {vp[vn] = "teleportation";color[vn++] = TERM_ORANGE;}
2057 /* Describe immunities and resistances */
2062 hooked_roff(format("%^s¤Ï", wd_he[msex]));
2064 hooked_roff(format("%^s", wd_he[msex]));
2069 for (n = 0; n < vn; n++)
2073 if ( n != 0 ) hooked_roff("¤È");
2075 if (n == 0) hooked_roff(" resists ");
2076 else if (n < vn-1) hooked_roff(", ");
2077 else hooked_roff(" and ");
2082 hook_c_roff(color[n], vp[n]);
2087 hooked_roff("¤ÎÂÑÀ¤ò»ý¤Ã¤Æ¤¤¤ë¡£");
2095 if ((r_ptr->r_xtra1 & MR1_SINKA) || know_everything)
2097 if (r_ptr->next_r_idx)
2100 hooked_roff(format("%^s¤Ï·Ð¸³¤òÀѤà¤È¡¢", wd_he[msex]));
2102 hooked_roff(format("%^s will evolve into ", wd_he[msex]));
2104 hook_c_roff(TERM_YELLOW, format("%s", r_name+r_info[r_ptr->next_r_idx].name));
2106 hooked_roff(format("¤Ë¿Ê²½¤¹¤ë¡£"));
2108 hooked_roff(format(" when %s gets enugh experience. ", wd_he[msex]));
2111 else if (!(r_ptr->flags1 & RF1_UNIQUE))
2114 hooked_roff(format("%s¤Ï¿Ê²½¤·¤Ê¤¤¡£", wd_he[msex]));
2116 hooked_roff(format("%s won't evolve. ", wd_he[msex]));
2121 /* Collect non-effects */
2124 if (flags3 & RF3_NO_STUN) {vp[vn] = "Û¯Û°¤È¤·¤Ê¤¤";color[vn++] = TERM_ORANGE;}
2126 if (flags3 & RF3_NO_STUN) {vp[vn] = "stunned";color[vn++] = TERM_ORANGE;}
2130 if (flags3 & RF3_NO_FEAR) {vp[vn] = "¶²Éݤò´¶¤¸¤Ê¤¤";color[vn++] = TERM_SLATE;}
2132 if (flags3 & RF3_NO_FEAR) {vp[vn] = "frightened";color[vn++] = TERM_SLATE;}
2136 if (flags3 & RF3_NO_CONF) {vp[vn] = "º®Í𤷤ʤ¤";color[vn++] = TERM_L_UMBER;}
2138 if (flags3 & RF3_NO_CONF) {vp[vn] = "confused";color[vn++] = TERM_L_UMBER;}
2142 if (flags3 & RF3_NO_SLEEP) {vp[vn] = "̲¤é¤µ¤ì¤Ê¤¤";color[vn++] = TERM_BLUE;}
2144 if (flags3 & RF3_NO_SLEEP) {vp[vn] = "slept";color[vn++] = TERM_BLUE;}
2148 if ((flagsr & RFR_RES_TELE) && (r_ptr->flags1 & RF1_UNIQUE)) {vp[vn] = "¥Æ¥ì¥Ý¡¼¥È¤µ¤ì¤Ê¤¤";color[vn++] = TERM_ORANGE;}
2150 if ((flagsr & RFR_RES_TELE) && (r_ptr->flags1 & RF1_UNIQUE)) {vp[vn] = "teleported";color[vn++] = TERM_ORANGE;}
2153 /* Describe non-effects */
2158 hooked_roff(format("%^s¤Ï", wd_he[msex]));
2160 hooked_roff(format("%^s", wd_he[msex]));
2165 for (n = 0; n < vn; n++)
2169 if ( n != 0 ) hooked_roff("¤·¡¢");
2171 if (n == 0) hooked_roff(" cannot be ");
2172 else if (n < vn - 1) hooked_roff(", ");
2173 else hooked_roff(" or ");
2178 hook_c_roff(color[n], vp[n]);
2191 /* Do we know how aware it is? */
2192 if ((((int)r_ptr->r_wake * (int)r_ptr->r_wake) > r_ptr->sleep) ||
2193 (r_ptr->r_ignore == MAX_UCHAR) ||
2194 (r_ptr->sleep == 0 && r_ptr->r_tkills >= 10) || know_everything)
2198 if (r_ptr->sleep > 200)
2201 act = "¤ò̵»ë¤·¤¬¤Á¤Ç¤¢¤ë¤¬";
2203 act = "prefers to ignore";
2207 else if (r_ptr->sleep > 95)
2210 act = "¤ËÂФ·¤Æ¤Û¤È¤ó¤ÉÃí°Õ¤òʧ¤ï¤Ê¤¤¤¬";
2212 act = "pays very little attention to";
2216 else if (r_ptr->sleep > 75)
2219 act = "¤ËÂФ·¤Æ¤¢¤Þ¤êÃí°Õ¤òʧ¤ï¤Ê¤¤¤¬";
2221 act = "pays little attention to";
2225 else if (r_ptr->sleep > 45)
2228 act = "¤ò¸«²á¤´¤·¤¬¤Á¤Ç¤¢¤ë¤¬";
2230 act = "tends to overlook";
2234 else if (r_ptr->sleep > 25)
2237 act = "¤ò¤Û¤ó¤Î¾¯¤·¤Ï¸«¤Æ¤ª¤ê";
2239 act = "takes quite a while to see";
2243 else if (r_ptr->sleep > 10)
2246 act = "¤ò¤·¤Ð¤é¤¯¤Ï¸«¤Æ¤ª¤ê";
2248 act = "takes a while to see";
2252 else if (r_ptr->sleep > 5)
2255 act = "¤ò´öʬÃí°Õ¿¼¤¯¸«¤Æ¤ª¤ê";
2257 act = "is fairly observant of";
2261 else if (r_ptr->sleep > 3)
2264 act = "¤òÃí°Õ¿¼¤¯¸«¤Æ¤ª¤ê";
2266 act = "is observant of";
2270 else if (r_ptr->sleep > 1)
2273 act = "¤ò¤«¤Ê¤êÃí°Õ¿¼¤¯¸«¤Æ¤ª¤ê";
2275 act = "is very observant of";
2279 else if (r_ptr->sleep > 0)
2282 act = "¤ò·Ù²ü¤·¤Æ¤ª¤ê";
2284 act = "is vigilant for";
2291 act = "¤ò¤«¤Ê¤ê·Ù²ü¤·¤Æ¤ª¤ê";
2293 act = "is ever vigilant for";
2299 hooked_roff(format("%^s¤Ï¿¯Æþ¼Ô%s¡¢ %d ¥Õ¥£¡¼¥ÈÀ褫¤é¿¯Æþ¼Ô¤Ëµ¤ÉÕ¤¯¤³¤È¤¬¤¢¤ë¡£",
2300 wd_he[msex], act, 10 * r_ptr->aaf));
2302 hooked_roff(format("%^s %s intruders, which %s may notice from %d feet. ",
2303 wd_he[msex], act, wd_he[msex], 10 * r_ptr->aaf));
2309 /* Drops gold and/or items */
2310 if (drop_gold || drop_item)
2314 hooked_roff(format("%^s¤Ï", wd_he[msex]));
2316 hooked_roff(format("%^s may carry", wd_he[msex]));
2323 /* Count maximum drop */
2324 n = MAX(drop_gold, drop_item);
2326 /* One drop (may need an "n") */
2330 hooked_roff("°ì¤Ä¤Î");
2341 hooked_roff("°ì¤Ä¤«Æó¤Ä¤Î");
2343 hooked_roff(" one or two");
2352 hooked_roff(format(" %d ¸Ä¤Þ¤Ç¤Î", n));
2354 hooked_roff(format(" up to %d", n));
2361 if (flags1 & RF1_DROP_GREAT)
2371 /* Good (no "n" needed) */
2372 else if (flags1 & RF1_DROP_GOOD)
2392 /* Handle singular "an" */
2394 if (sin) hooked_roff("n");
2398 /* Dump "object(s)" */
2399 if (p) hooked_roff(p);
2401 hooked_roff("¥¢¥¤¥Æ¥à");
2403 hooked_roff(" object");
2404 if (n != 1) hooked_roff("s");
2408 /* Conjunction replaces variety, if needed for "gold" below */
2422 if (!p) sin = FALSE;
2424 /* Handle singular "an" */
2425 if (sin) hooked_roff("n");
2429 /* Dump "treasure(s)" */
2430 if (p) hooked_roff(p);
2432 hooked_roff("ºâÊõ");
2434 hooked_roff(" treasure");
2435 if (n != 1) hooked_roff("s");
2440 /* End this sentence */
2442 hooked_roff("¤ò»ý¤Ã¤Æ¤¤¤ë¤³¤È¤¬¤¢¤ë¡£");
2450 /* Count the number of "known" attacks */
2451 for (n = 0, m = 0; m < 4; m++)
2453 /* Skip non-attacks */
2454 if (!r_ptr->blow[m].method) continue;
2455 if (r_ptr->blow[m].method == RBM_SHOOT) continue;
2457 /* Count known attacks */
2458 if (r_ptr->r_blows[m] || know_everything) n++;
2461 /* Examine (and count) the actual attacks */
2462 for (r = 0, m = 0; m < 4; m++)
2464 int method, effect, d1, d2;
2466 /* Skip non-attacks */
2467 if (!r_ptr->blow[m].method) continue;
2468 if (r_ptr->blow[m].method == RBM_SHOOT) continue;
2470 /* Skip unknown attacks */
2471 if (!r_ptr->r_blows[m] && !know_everything) continue;
2473 /* Extract the attack info */
2474 method = r_ptr->blow[m].method;
2475 effect = r_ptr->blow[m].effect;
2476 d1 = r_ptr->blow[m].d_dice;
2477 d2 = r_ptr->blow[m].d_side;
2482 /* Acquire the method */
2486 case RBM_HIT: p = "²¥¤ë"; break;
2488 case RBM_HIT: p = "hit"; break;
2492 case RBM_TOUCH: p = "¿¨¤ë"; break;
2494 case RBM_TOUCH: p = "touch"; break;
2498 case RBM_PUNCH: p = "¥Ñ¥ó¥Á¤¹¤ë"; break;
2500 case RBM_PUNCH: p = "punch"; break;
2504 case RBM_KICK: p = "½³¤ë"; break;
2506 case RBM_KICK: p = "kick"; break;
2510 case RBM_CLAW: p = "¤Ò¤Ã¤«¤¯"; break;
2512 case RBM_CLAW: p = "claw"; break;
2516 case RBM_BITE: p = "³ú¤à"; break;
2518 case RBM_BITE: p = "bite"; break;
2522 case RBM_STING: p = "»É¤¹"; break;
2524 case RBM_STING: p = "sting"; break;
2528 case RBM_SLASH: p = "»Â¤ë"; break;
2530 case RBM_SLASH: p = "slash"; break;
2534 case RBM_BUTT: p = "³Ñ¤ÇÆͤ¯"; break;
2536 case RBM_BUTT: p = "butt"; break;
2540 case RBM_CRUSH: p = "ÂÎÅö¤¿¤ê¤¹¤ë"; break;
2542 case RBM_CRUSH: p = "crush"; break;
2546 case RBM_ENGULF: p = "°û¤ß¹þ¤à"; break;
2548 case RBM_ENGULF: p = "engulf"; break;
2552 case RBM_CHARGE: p = "ÀÁµá½ñ¤ò¤è¤³¤¹"; break;
2554 case RBM_CHARGE: p = "charge"; break;
2558 case RBM_CRAWL: p = "ÂΤξå¤òÇ礤²ó¤ë"; break;
2560 case RBM_CRAWL: p = "crawl on you"; break;
2564 case RBM_DROOL: p = "¤è¤À¤ì¤ò¤¿¤é¤¹"; break;
2566 case RBM_DROOL: p = "drool on you"; break;
2570 case RBM_SPIT: p = "¤Ä¤Ð¤òÅǤ¯"; break;
2572 case RBM_SPIT: p = "spit"; break;
2576 case RBM_EXPLODE: p = "Çúȯ¤¹¤ë"; break;
2578 case RBM_EXPLODE: p = "explode"; break;
2582 case RBM_GAZE: p = "¤Ë¤é¤à"; break;
2584 case RBM_GAZE: p = "gaze"; break;
2588 case RBM_WAIL: p = "µã¤¶«¤Ö"; break;
2590 case RBM_WAIL: p = "wail"; break;
2594 case RBM_SPORE: p = "˦»Ò¤òÈô¤Ð¤¹"; break;
2596 case RBM_SPORE: p = "release spores"; break;
2599 case RBM_XXX4: break;
2601 case RBM_BEG: p = "¶â¤ò¤»¤¬¤à"; break;
2603 case RBM_BEG: p = "beg"; break;
2607 case RBM_INSULT: p = "Éî¿«¤¹¤ë"; break;
2609 case RBM_INSULT: p = "insult"; break;
2613 case RBM_MOAN: p = "¤¦¤á¤¯"; break;
2615 case RBM_MOAN: p = "moan"; break;
2619 case RBM_SHOW: p = "²Î¤¦"; break;
2621 case RBM_SHOW: p = "sing"; break;
2627 /* Default effect */
2630 /* Acquire the effect */
2635 case RBE_HURT: q = "¹¶·â¤¹¤ë"; break;
2638 case RBE_HURT: q = "attack"; break;
2642 case RBE_POISON: q = "ÆǤò¤¯¤é¤ï¤¹"; break;
2644 case RBE_POISON: q = "poison"; break;
2648 case RBE_UN_BONUS: q = "Îô²½¤µ¤»¤ë"; break;
2650 case RBE_UN_BONUS: q = "disenchant"; break;
2654 case RBE_UN_POWER: q = "ËâÎϤòµÛ¤¤¼è¤ë"; break;
2656 case RBE_UN_POWER: q = "drain charges"; break;
2660 case RBE_EAT_GOLD: q = "¶â¤òÅð¤à"; break;
2662 case RBE_EAT_GOLD: q = "steal gold"; break;
2666 case RBE_EAT_ITEM: q = "¥¢¥¤¥Æ¥à¤òÅð¤à"; break;
2668 case RBE_EAT_ITEM: q = "steal items"; break;
2672 case RBE_EAT_FOOD: q = "¤¢¤Ê¤¿¤Î¿©ÎÁ¤ò¿©¤Ù¤ë"; break;
2674 case RBE_EAT_FOOD: q = "eat your food"; break;
2678 case RBE_EAT_LITE: q = "ÌÀ¤«¤ê¤òµÛ¼ý¤¹¤ë"; break;
2680 case RBE_EAT_LITE: q = "absorb light"; break;
2684 case RBE_ACID: q = "»À¤òÈô¤Ð¤¹"; break;
2686 case RBE_ACID: q = "shoot acid"; break;
2690 case RBE_ELEC: q = "´¶ÅŤµ¤»¤ë"; break;
2692 case RBE_ELEC: q = "electrocute"; break;
2696 case RBE_FIRE: q = "dz¤ä¤¹"; break;
2698 case RBE_FIRE: q = "burn"; break;
2702 case RBE_COLD: q = "Åà¤é¤»¤ë"; break;
2704 case RBE_COLD: q = "freeze"; break;
2708 case RBE_BLIND: q = "ÌÕÌܤˤ¹¤ë"; break;
2710 case RBE_BLIND: q = "blind"; break;
2714 case RBE_CONFUSE: q = "º®Í𤵤»¤ë"; break;
2716 case RBE_CONFUSE: q = "confuse"; break;
2720 case RBE_TERRIFY: q = "¶²Éݤµ¤»¤ë"; break;
2722 case RBE_TERRIFY: q = "terrify"; break;
2726 case RBE_PARALYZE: q = "Ëãá㤵¤»¤ë"; break;
2728 case RBE_PARALYZE: q = "paralyze"; break;
2732 case RBE_LOSE_STR: q = "ÏÓÎϤò¸º¾¯¤µ¤»¤ë"; break;
2734 case RBE_LOSE_STR: q = "reduce strength"; break;
2738 case RBE_LOSE_INT: q = "ÃÎǽ¤ò¸º¾¯¤µ¤»¤ë"; break;
2740 case RBE_LOSE_INT: q = "reduce intelligence"; break;
2744 case RBE_LOSE_WIS: q = "¸¤µ¤ò¸º¾¯¤µ¤»¤ë"; break;
2746 case RBE_LOSE_WIS: q = "reduce wisdom"; break;
2750 case RBE_LOSE_DEX: q = "´ïÍѤµ¤ò¸º¾¯¤µ¤»¤ë"; break;
2752 case RBE_LOSE_DEX: q = "reduce dexterity"; break;
2756 case RBE_LOSE_CON: q = "Âѵ×ÎϤò¸º¾¯¤µ¤»¤ë"; break;
2758 case RBE_LOSE_CON: q = "reduce constitution"; break;
2762 case RBE_LOSE_CHR: q = "Ì¥ÎϤò¸º¾¯¤µ¤»¤ë"; break;
2764 case RBE_LOSE_CHR: q = "reduce charisma"; break;
2768 case RBE_LOSE_ALL: q = "Á´¥¹¥Æ¡¼¥¿¥¹¤ò¸º¾¯¤µ¤»¤ë"; break;
2770 case RBE_LOSE_ALL: q = "reduce all stats"; break;
2774 case RBE_SHATTER: q = "Ê´ºÕ¤¹¤ë"; break;
2776 case RBE_SHATTER: q = "shatter"; break;
2780 case RBE_EXP_10: q = "·Ð¸³Ãͤò¸º¾¯(10d6+)¤µ¤»¤ë"; break;
2782 case RBE_EXP_10: q = "lower experience (by 10d6+)"; break;
2786 case RBE_EXP_20: q = "·Ð¸³Ãͤò¸º¾¯(20d6+)¤µ¤»¤ë"; break;
2788 case RBE_EXP_20: q = "lower experience (by 20d6+)"; break;
2792 case RBE_EXP_40: q = "·Ð¸³Ãͤò¸º¾¯(40d6+)¤µ¤»¤ë"; break;
2794 case RBE_EXP_40: q = "lower experience (by 40d6+)"; break;
2798 case RBE_EXP_80: q = "·Ð¸³Ãͤò¸º¾¯(80d6+)¤µ¤»¤ë"; break;
2800 case RBE_EXP_80: q = "lower experience (by 80d6+)"; break;
2804 case RBE_DISEASE: q = "ɵ¤¤Ë¤¹¤ë"; break;
2806 case RBE_DISEASE: q = "disease"; break;
2810 case RBE_TIME: q = "»þ´Ö¤òµÕÌá¤ê¤µ¤»¤ë"; break;
2812 case RBE_TIME: q = "time"; break;
2816 case RBE_EXP_VAMP: q = "À¸Ì¿ÎϤòµÛ¼ý¤¹¤ë"; break;
2818 case RBE_EXP_VAMP: q = "drain life force"; break;
2822 case RBE_DR_MANA: q = "ËâÎϤòÃ¥¤¦"; break;
2824 case RBE_DR_MANA: q = "drain mana force"; break;
2828 case RBE_INERTIA: q = "¸ºÂ®¤µ¤»¤ë"; break;
2829 case RBE_STUN: q = "Û¯Û°¤È¤µ¤»¤ë"; break;
2831 case RBE_INERTIA: q = "slow"; break;
2832 case RBE_STUN: q = "stun"; break;
2838 if ( r == 0 ) hooked_roff( format("%^s¤Ï", wd_he[msex]) );
2840 /***¼ã´³É½¸½¤òÊѹ¹ ita ***/
2842 /* Describe damage (if known) */
2843 if (d1 && d2 && (know_everything || know_damage(r_idx, m)))
2846 /* Display the damage */
2847 hooked_roff(format(" %dd%d ", d1, d2));
2848 hooked_roff("¤Î¥À¥á¡¼¥¸¤Ç");
2850 /* Hack -- force a method */
2851 if (!p) p = "²¿¤«´ñ̯¤Ê¤³¤È¤ò¤¹¤ë";
2853 /* Describe the method */
2854 /* XX¤·¤ÆYY¤·/XX¤·¤ÆYY¤¹¤ë/XX¤·/XX¤¹¤ë */
2855 if(q) jverb( p ,jverb_buf, JVERB_TO);
2856 else if(r!=n-1) jverb( p ,jverb_buf, JVERB_AND);
2857 else strcpy(jverb_buf, p);
2859 hooked_roff(jverb_buf);
2861 /* Describe the effect (if any) */
2864 if(r!=n-1) jverb( q,jverb_buf, JVERB_AND);
2865 else strcpy(jverb_buf,q);
2866 hooked_roff(jverb_buf);
2868 if(r!=n-1) hooked_roff("¡¢");
2870 /* Introduce the attack description */
2873 hooked_roff(format("%^s can ", wd_he[msex]));
2881 hooked_roff(", and ");
2885 /* Hack -- force a method */
2886 if (!p) p = "do something weird";
2888 /* Describe the method */
2892 /* Describe the effect (if any) */
2895 /* Describe the attack type */
2896 hooked_roff(" to ");
2899 /* Describe damage (if known) */
2900 if (d1 && d2 && (know_everything || know_damage(r_idx, m)))
2902 /* Display the damage */
2903 hooked_roff(" with damage");
2904 hooked_roff(format(" %dd%d", d1, d2));
2911 /* Count the attacks as printed */
2915 /* Finish sentence above */
2926 /* Notice lack of attacks */
2927 else if (flags1 & RF1_NEVER_BLOW)
2930 hooked_roff(format("%^s¤ÏʪÍýŪ¤Ê¹¶·âÊýË¡¤ò»ý¤¿¤Ê¤¤¡£", wd_he[msex]));
2932 hooked_roff(format("%^s has no physical attacks. ", wd_he[msex]));
2937 /* Or describe the lack of knowledge */
2941 hooked_roff(format("%s¹¶·â¤Ë¤Ä¤¤¤Æ¤Ï²¿¤âÃΤé¤Ê¤¤¡£", wd_his[msex]));
2943 hooked_roff(format("Nothing is known about %s attack. ", wd_his[msex]));
2950 * Notice "Quest" monsters, but only if you
2951 * already encountered the monster.
2953 if ((flags1 & RF1_QUESTOR) && ((r_ptr->r_sights) && (r_ptr->max_num) && ((r_idx == MON_OBERON) || (r_idx == MON_SERPENT))))
2956 hook_c_roff(TERM_VIOLET, "¤¢¤Ê¤¿¤Ï¤³¤Î¥â¥ó¥¹¥¿¡¼¤ò»¦¤·¤¿¤¤¤È¤¤¤¦¶¯¤¤Íß˾¤ò´¶¤¸¤Æ¤¤¤ë...");
2958 hook_c_roff(TERM_VIOLET, "You feel an intense desire to kill this monster... ");
2963 else if (flags7 & RF7_GUARDIAN)
2966 hook_c_roff(TERM_L_RED, "¤³¤Î¥â¥ó¥¹¥¿¡¼¤Ï¥À¥ó¥¸¥ç¥ó¤Î¼ç¤Ç¤¢¤ë¡£");
2968 hook_c_roff(TERM_L_RED, "This monster is the master of a dungeon.");
2982 * Hack -- Display the "name" and "attr/chars" of a monster race
2984 void roff_top(int r_idx)
2986 monster_race *r_ptr = &r_info[r_idx];
2992 /* Access the chars */
2996 /* Access the attrs */
3001 /* Clear the top line */
3002 Term_erase(0, 0, 255);
3004 /* Reset the cursor */
3008 /* A title (use "The" for non-uniques) */
3009 if (!(r_ptr->flags1 & RF1_UNIQUE))
3011 Term_addstr(-1, TERM_WHITE, "The ");
3016 Term_addstr(-1, TERM_WHITE, (r_name + r_ptr->name));
3018 /* Append the "standard" attr/char info */
3019 Term_addstr(-1, TERM_WHITE, " ('");
3020 Term_add_bigch(a1, c1);
3021 Term_addstr(-1, TERM_WHITE, "')");
3023 /* Append the "optional" attr/char info */
3024 Term_addstr(-1, TERM_WHITE, "/('");
3025 Term_add_bigch(a2, c2);
3026 Term_addstr(-1, TERM_WHITE, "'):");
3028 /* Wizards get extra info */
3033 sprintf(buf, "%d", r_idx);
3035 Term_addstr(-1, TERM_WHITE, " (");
3036 Term_addstr(-1, TERM_L_BLUE, buf);
3037 Term_addch(TERM_WHITE, ')');
3044 * Hack -- describe the given monster race at the top of the screen
3046 void screen_roff(int r_idx, int mode)
3048 /* Flush messages */
3052 Term_erase(0, 1, 255);
3054 hook_c_roff = c_roff;
3056 /* Recall monster */
3057 roff_aux(r_idx, mode);
3059 /* Describe monster */
3067 * Hack -- describe the given monster race in the current "term" window
3069 void display_roff(int r_idx)
3073 /* Erase the window */
3074 for (y = 0; y < Term->hgt; y++)
3076 /* Erase the line */
3077 Term_erase(0, y, 255);
3083 hook_c_roff = c_roff;
3085 /* Recall monster */
3088 /* Describe monster */
3095 * Hack -- output description of the given monster race
3097 void output_monster_spoiler(int r_idx, void (*roff_func)(byte attr, cptr str))
3099 hook_c_roff = roff_func;
3101 /* Recall monster */
3102 roff_aux(r_idx, 0x03);
3106 bool mon_hook_dungeon(int r_idx)
3108 monster_race *r_ptr = &r_info[r_idx];
3110 if (!(r_ptr->flags8 & RF8_WILD_ONLY))
3114 dungeon_info_type *d_ptr = &d_info[dungeon_type];
3115 if ((d_ptr->mflags8 & RF8_WILD_MOUNTAIN) &&
3116 (r_ptr->flags8 & RF8_WILD_MOUNTAIN)) return TRUE;
3122 static bool mon_hook_ocean(int r_idx)
3124 monster_race *r_ptr = &r_info[r_idx];
3126 if (r_ptr->flags8 & RF8_WILD_OCEAN)
3133 static bool mon_hook_shore(int r_idx)
3135 monster_race *r_ptr = &r_info[r_idx];
3137 if (r_ptr->flags8 & RF8_WILD_SHORE)
3144 static bool mon_hook_waste(int r_idx)
3146 monster_race *r_ptr = &r_info[r_idx];
3148 if (r_ptr->flags8 & (RF8_WILD_WASTE | RF8_WILD_ALL))
3155 static bool mon_hook_town(int r_idx)
3157 monster_race *r_ptr = &r_info[r_idx];
3159 if (r_ptr->flags8 & (RF8_WILD_TOWN | RF8_WILD_ALL))
3166 static bool mon_hook_wood(int r_idx)
3168 monster_race *r_ptr = &r_info[r_idx];
3170 if (r_ptr->flags8 & (RF8_WILD_WOOD | RF8_WILD_ALL))
3177 static bool mon_hook_volcano(int r_idx)
3179 monster_race *r_ptr = &r_info[r_idx];
3181 if (r_ptr->flags8 & RF8_WILD_VOLCANO)
3188 static bool mon_hook_mountain(int r_idx)
3190 monster_race *r_ptr = &r_info[r_idx];
3192 if (r_ptr->flags8 & RF8_WILD_MOUNTAIN)
3199 static bool mon_hook_grass(int r_idx)
3201 monster_race *r_ptr = &r_info[r_idx];
3203 if (r_ptr->flags8 & (RF8_WILD_GRASS | RF8_WILD_ALL))
3210 static bool mon_hook_deep_water(int r_idx)
3212 monster_race *r_ptr = &r_info[r_idx];
3214 if (!mon_hook_dungeon(r_idx)) return FALSE;
3216 if (r_ptr->flags7 & RF7_AQUATIC)
3223 static bool mon_hook_shallow_water(int r_idx)
3225 monster_race *r_ptr = &r_info[r_idx];
3227 if (!mon_hook_dungeon(r_idx)) return FALSE;
3229 if (r_ptr->flags2 & RF2_AURA_FIRE)
3236 static bool mon_hook_lava(int r_idx)
3238 monster_race *r_ptr = &r_info[r_idx];
3240 if (!mon_hook_dungeon(r_idx)) return FALSE;
3242 if (((r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK) ||
3243 (r_ptr->flags7 & RF7_CAN_FLY)) &&
3244 !(r_ptr->flags3 & RF3_AURA_COLD))
3251 static bool mon_hook_floor(int r_idx)
3253 monster_race *r_ptr = &r_info[r_idx];
3255 if (!(r_ptr->flags7 & RF7_AQUATIC) ||
3256 (r_ptr->flags7 & RF7_CAN_FLY))
3263 monster_hook_type get_monster_hook(void)
3265 if (!dun_level && !p_ptr->inside_quest)
3267 switch (wilderness[p_ptr->wilderness_y][p_ptr->wilderness_x].terrain)
3270 return (monster_hook_type)mon_hook_town;
3271 case TERRAIN_DEEP_WATER:
3272 return (monster_hook_type)mon_hook_ocean;
3273 case TERRAIN_SHALLOW_WATER:
3275 return (monster_hook_type)mon_hook_shore;
3277 case TERRAIN_DESERT:
3278 return (monster_hook_type)mon_hook_waste;
3280 return (monster_hook_type)mon_hook_grass;
3282 return (monster_hook_type)mon_hook_wood;
3283 case TERRAIN_SHALLOW_LAVA:
3284 case TERRAIN_DEEP_LAVA:
3285 return (monster_hook_type)mon_hook_volcano;
3286 case TERRAIN_MOUNTAIN:
3287 return (monster_hook_type)mon_hook_mountain;
3289 return (monster_hook_type)mon_hook_dungeon;
3294 return (monster_hook_type)mon_hook_dungeon;
3299 monster_hook_type get_monster_hook2(int y, int x)
3301 feature_type *f_ptr = &f_info[cave[y][x].feat];
3303 /* Set the monster list */
3306 if (have_flag(f_ptr->flags, FF_WATER))
3309 if (have_flag(f_ptr->flags, FF_DEEP))
3311 return (monster_hook_type)mon_hook_deep_water;
3317 return (monster_hook_type)mon_hook_shallow_water;
3322 else if (have_flag(f_ptr->flags, FF_LAVA))
3324 return (monster_hook_type)mon_hook_lava;
3327 else return (monster_hook_type)mon_hook_floor;
3331 void set_friendly(monster_type *m_ptr)
3333 m_ptr->smart |= SM_FRIENDLY;
3336 void set_pet(monster_type *m_ptr)
3338 if (!is_pet(m_ptr)) check_pets_num_and_align(m_ptr, TRUE);
3340 /* Check for quest completion */
3341 check_quest_completion(m_ptr);
3343 m_ptr->smart |= SM_PET;
3344 if (!(r_info[m_ptr->r_idx].flags3 & (RF3_EVIL | RF3_GOOD)))
3345 m_ptr->sub_align = SUB_ALIGN_NEUTRAL;
3349 * Makes the monster hostile towards the player
3351 void set_hostile(monster_type *m_ptr)
3353 if (p_ptr->inside_battle) return;
3355 if (is_pet(m_ptr)) check_pets_num_and_align(m_ptr, FALSE);
3357 m_ptr->smart &= ~SM_PET;
3358 m_ptr->smart &= ~SM_FRIENDLY;
3365 void anger_monster(monster_type *m_ptr)
3367 if (p_ptr->inside_battle) return;
3368 if (is_friendly(m_ptr))
3372 monster_desc(m_name, m_ptr, 0);
3374 msg_format("%^s¤ÏÅܤä¿¡ª", m_name);
3376 msg_format("%^s gets angry!", m_name);
3381 chg_virtue(V_INDIVIDUALISM, 1);
3382 chg_virtue(V_HONOUR, -1);
3383 chg_virtue(V_JUSTICE, -1);
3384 chg_virtue(V_COMPASSION, -1);
3390 * Check if monster can cross terrain
3392 bool monster_can_cross_terrain(s16b feat, monster_race *r_ptr, u16b mode)
3394 feature_type *f_ptr = &f_info[feat];
3397 if (have_flag(f_ptr->flags, FF_PATTERN))
3399 if (!(mode & CEM_RIDING))
3401 if (!(r_ptr->flags7 & RF7_CAN_FLY)) return FALSE;
3405 if (!(mode & CEM_P_CAN_ENTER_PATTERN)) return FALSE;
3410 if (have_flag(f_ptr->flags, FF_CAN_FLY) && (r_ptr->flags7 & RF7_CAN_FLY)) return TRUE;
3411 if (have_flag(f_ptr->flags, FF_CAN_SWIM) && (r_ptr->flags7 & RF7_CAN_SWIM)) return TRUE;
3412 if (have_flag(f_ptr->flags, FF_CAN_PASS))
3414 if ((r_ptr->flags2 & RF2_PASS_WALL) && (!(mode & CEM_RIDING) || p_ptr->pass_wall)) return TRUE;
3417 if (!have_flag(f_ptr->flags, FF_MOVE)) return FALSE;
3419 /* Some monsters can walk on mountains */
3420 if (have_flag(f_ptr->flags, FF_MOUNTAIN) && (r_ptr->flags8 & RF8_WILD_MOUNTAIN)) return TRUE;
3423 if (have_flag(f_ptr->flags, FF_WATER))
3425 if (!(r_ptr->flags7 & RF7_AQUATIC))
3428 if (have_flag(f_ptr->flags, FF_DEEP)) return FALSE;
3431 else if (r_ptr->flags2 & RF2_AURA_FIRE) return FALSE;
3435 /* Aquatic monster into non-water? */
3436 else if (r_ptr->flags7 & RF7_AQUATIC) return FALSE;
3439 if (have_flag(f_ptr->flags, FF_LAVA))
3441 if (!(r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK)) return FALSE;
3449 * Strictly check if monster can enter the grid
3451 bool monster_can_enter(int y, int x, monster_race *r_ptr, u16b mode)
3453 cave_type *c_ptr = &cave[y][x];
3455 /* Player or other monster */
3456 if (player_bold(y, x)) return FALSE;
3457 if (c_ptr->m_idx) return FALSE;
3459 return monster_can_cross_terrain(c_ptr->feat, r_ptr, mode);
3464 * Check if this monster has "hostile" alignment (aux)
3466 static bool check_hostile_align(byte sub_align1, byte sub_align2)
3468 if (sub_align1 != sub_align2)
3470 if (((sub_align1 & SUB_ALIGN_EVIL) && (sub_align2 & SUB_ALIGN_GOOD)) ||
3471 ((sub_align1 & SUB_ALIGN_GOOD) && (sub_align2 & SUB_ALIGN_EVIL)))
3475 /* Non-hostile alignment */
3481 * Check if two monsters are enemies
3483 bool are_enemies(monster_type *m_ptr, monster_type *n_ptr)
3485 monster_race *r_ptr = &r_info[m_ptr->r_idx];
3486 monster_race *s_ptr = &r_info[n_ptr->r_idx];
3488 if (p_ptr->inside_battle)
3490 if (is_pet(m_ptr) || is_pet(n_ptr)) return FALSE;
3494 if ((r_ptr->flags8 & (RF8_WILD_TOWN | RF8_WILD_ALL))
3495 && (s_ptr->flags8 & (RF8_WILD_TOWN | RF8_WILD_ALL)))
3497 if (!is_pet(m_ptr) && !is_pet(n_ptr)) return FALSE;
3500 /* Friendly vs. opposite aligned normal or pet */
3501 if (check_hostile_align(m_ptr->sub_align, n_ptr->sub_align))
3503 if (!(m_ptr->mflag2 & MFLAG2_CHAMELEON) || !(n_ptr->mflag2 & MFLAG2_CHAMELEON)) return TRUE;
3506 /* Hostile vs. non-hostile */
3507 if (is_hostile(m_ptr) != is_hostile(n_ptr))
3518 * Check if this monster race has "hostile" alignment
3519 * If user is player, m_ptr == NULL.
3521 bool monster_has_hostile_align(monster_type *m_ptr, int pa_good, int pa_evil, monster_race *r_ptr)
3523 byte sub_align1 = SUB_ALIGN_NEUTRAL;
3524 byte sub_align2 = SUB_ALIGN_NEUTRAL;
3526 if (m_ptr) /* For a monster */
3528 sub_align1 = m_ptr->sub_align;
3530 else /* For player */
3532 if (p_ptr->align >= pa_good) sub_align1 |= SUB_ALIGN_GOOD;
3533 if (p_ptr->align <= pa_evil) sub_align1 |= SUB_ALIGN_EVIL;
3536 /* Racial alignment flags */
3537 if (r_ptr->flags3 & RF3_EVIL) sub_align2 |= SUB_ALIGN_EVIL;
3538 if (r_ptr->flags3 & RF3_GOOD) sub_align2 |= SUB_ALIGN_GOOD;
3540 if (check_hostile_align(sub_align1, sub_align2)) return TRUE;
3542 /* Non-hostile alignment */
3548 * Is the monster "alive"?
3550 * Used to determine the message to print for a killed monster.
3551 * ("dies", "destroyed")
3553 bool monster_living(monster_race *r_ptr)
3555 /* Non-living, undead, or demon */
3556 if (r_ptr->flags3 & (RF3_DEMON | RF3_UNDEAD | RF3_NONLIVING))
3564 * Is this monster declined to be questor or bounty?
3566 bool no_questor_or_bounty_uniques(int r_idx)
3571 * Decline them to be questor or bounty because they use
3572 * special motion "split and combine"
3574 case MON_BANORLUPART: