OSDN Git Service

[Refactor] #40414 Separated display_never_move() from process_monster_lore()
[hengband/hengband.git] / src / lore / monster-lore.c
1 /*!
2  * @brief モンスターの思い出を表示する処理
3  * @date 2020/06/09
4  * @author Hourier
5  */
6
7 #include "lore/monster-lore.h"
8 #include "locale/english.h"
9 #include "locale/japanese.h"
10 #include "lore/lore-util.h"
11 #include "monster-race/race-flags-ability1.h"
12 #include "monster-race/race-flags-ability2.h"
13 #include "monster-race/race-flags-resistance.h"
14 #include "monster-race/race-flags1.h"
15 #include "monster-race/race-flags2.h"
16 #include "monster-race/race-flags3.h"
17 #include "monster-race/race-flags4.h"
18 #include "monster-race/race-flags7.h"
19 #include "monster-race/race-indice-types.h"
20 #include "mspell/monster-spell.h"
21 #include "mspell/mspell-damage-calculator.h"
22 #include "mspell/mspell-type.h"
23 #include "term/term-color-types.h"
24 #include "util/util.h"
25 #include "view/display-monster-lore.h"
26
27 /*!
28  * 英語の複数系記述用マクロ / Pluralizer.  Args(count, singular, plural)
29  */
30 #define plural(c, s, p) (((c) == 1) ? (s) : (p))
31
32 /*!
33  * @brief ダイス目を文字列に変換する
34  * @param base_damage 固定値
35  * @param dice_num ダイス数
36  * @param dice_side ダイス面
37  * @param dice_mult ダイス倍率
38  * @param dice_div ダイス除数
39  * @param msg 文字列を格納するポインタ
40  * @return なし
41  */
42 void dice_to_string(int base_damage, int dice_num, int dice_side, int dice_mult, int dice_div, char *msg)
43 {
44     char base[80] = "", dice[80] = "", mult[80] = "";
45
46     if (dice_num == 0) {
47         sprintf(msg, "%d", base_damage);
48         return;
49     }
50
51     if (base_damage != 0)
52         sprintf(base, "%d+", base_damage);
53
54     if (dice_num == 1)
55         sprintf(dice, "d%d", dice_side);
56     else
57         sprintf(dice, "%dd%d", dice_num, dice_side);
58
59     if (dice_mult != 1 || dice_div != 1) {
60         if (dice_div == 1)
61             sprintf(mult, "*%d", dice_mult);
62         else
63             sprintf(mult, "*(%d/%d)", dice_mult, dice_div);
64     }
65
66     sprintf(msg, "%s%s%s", base, dice, mult);
67 }
68
69 /*!
70  * @brief モンスターのAC情報を得ることができるかを返す / Determine if the "armor" is known
71  * @param r_idx モンスターの種族ID
72  * @return 敵のACを知る条件が満たされているならTRUEを返す
73  * @details
74  * The higher the level, the fewer kills needed.
75  */
76 static bool know_armour(MONRACE_IDX r_idx)
77 {
78     monster_race *r_ptr = &r_info[r_idx];
79     DEPTH level = r_ptr->level;
80     MONSTER_NUMBER kills = r_ptr->r_tkills;
81
82     bool known = (r_ptr->r_cast_spell == MAX_UCHAR) ? TRUE : FALSE;
83
84     if (cheat_know || known)
85         return TRUE;
86     if (kills > 304 / (4 + level))
87         return TRUE;
88     if (!(r_ptr->flags1 & RF1_UNIQUE))
89         return FALSE;
90     if (kills > 304 / (38 + (5 * level) / 4))
91         return TRUE;
92     return FALSE;
93 }
94
95 /*!
96  * @brief モンスターの打撃威力を知ることができるかどうかを返す
97  * Determine if the "damage" of the given attack is known
98  * @param r_idx モンスターの種族ID
99  * @param i 確認したい攻撃手番
100  * @return 敵のダメージダイスを知る条件が満たされているならTRUEを返す
101  * @details
102  * <pre>
103  * the higher the level of the monster, the fewer the attacks you need,
104  * the more damage an attack does, the more attacks you need
105  * </pre>
106  */
107 static bool know_damage(MONRACE_IDX r_idx, int i)
108 {
109     monster_race *r_ptr = &r_info[r_idx];
110     DEPTH level = r_ptr->level;
111     s32b a = r_ptr->r_blows[i];
112
113     s32b d1 = r_ptr->blow[i].d_dice;
114     s32b d2 = r_ptr->blow[i].d_side;
115     s32b d = d1 * d2;
116
117     if (d >= ((4 + level) * MAX_UCHAR) / 80)
118         d = ((4 + level) * MAX_UCHAR - 1) / 80;
119     if ((4 + level) * a > 80 * d)
120         return TRUE;
121     if (!(r_ptr->flags1 & RF1_UNIQUE))
122         return FALSE;
123     if ((4 + level) * (2 * a) > 80 * d)
124         return TRUE;
125
126     return FALSE;
127 }
128
129 /*!
130  * @brief 文字列にモンスターの攻撃力を加える
131  * @param r_idx モンスターの種族ID
132  * @param SPELL_NUM 呪文番号
133  * @param msg 表示する文字列
134  * @param tmp 返すメッセージを格納する配列
135  * @return なし
136  */
137 static void set_damage(player_type *player_ptr, MONRACE_IDX r_idx, monster_spell_type ms_type, char *msg, char *tmp)
138 {
139     int base_damage = monspell_race_damage(player_ptr, ms_type, r_idx, BASE_DAM);
140     int dice_num = monspell_race_damage(player_ptr, ms_type, r_idx, DICE_NUM);
141     int dice_side = monspell_race_damage(player_ptr, ms_type, r_idx, DICE_SIDE);
142     int dice_mult = monspell_race_damage(player_ptr, ms_type, r_idx, DICE_MULT);
143     int dice_div = monspell_race_damage(player_ptr, ms_type, r_idx, DICE_DIV);
144     char dmg_str[80], dice_str[80];
145     dice_to_string(base_damage, dice_num, dice_side, dice_mult, dice_div, dmg_str);
146     sprintf(dice_str, "(%s)", dmg_str);
147
148     if (know_armour(r_idx))
149         sprintf(tmp, msg, dice_str);
150     else
151         sprintf(tmp, msg, "");
152 }
153
154 static void set_drop_flags(lore_type *lore_ptr)
155 {
156     if (!lore_ptr->know_everything)
157         return;
158
159     lore_ptr->drop_gold = lore_ptr->drop_item = (((lore_ptr->r_ptr->flags1 & RF1_DROP_4D2) ? 8 : 0) + ((lore_ptr->r_ptr->flags1 & RF1_DROP_3D2) ? 6 : 0)
160         + ((lore_ptr->r_ptr->flags1 & RF1_DROP_2D2) ? 4 : 0) + ((lore_ptr->r_ptr->flags1 & RF1_DROP_1D2) ? 2 : 0)
161         + ((lore_ptr->r_ptr->flags1 & RF1_DROP_90) ? 1 : 0) + ((lore_ptr->r_ptr->flags1 & RF1_DROP_60) ? 1 : 0));
162
163     if (lore_ptr->r_ptr->flags1 & RF1_ONLY_GOLD)
164         lore_ptr->drop_item = 0;
165
166     if (lore_ptr->r_ptr->flags1 & RF1_ONLY_ITEM)
167         lore_ptr->drop_gold = 0;
168
169     lore_ptr->flags1 = lore_ptr->r_ptr->flags1;
170     lore_ptr->flags2 = lore_ptr->r_ptr->flags2;
171     lore_ptr->flags3 = lore_ptr->r_ptr->flags3;
172     lore_ptr->flags4 = lore_ptr->r_ptr->flags4;
173     lore_ptr->a_ability_flags1 = lore_ptr->r_ptr->a_ability_flags1;
174     lore_ptr->a_ability_flags2 = lore_ptr->r_ptr->a_ability_flags2;
175     lore_ptr->flagsr = lore_ptr->r_ptr->flagsr;
176 }
177
178 static void set_msex_flags(lore_type *lore_ptr)
179 {
180     lore_ptr->msex = MSEX_NONE;
181     if (lore_ptr->r_ptr->flags1 & RF1_FEMALE) {
182         lore_ptr->msex = MSEX_FEMALE;
183         return;
184     }
185
186     if (lore_ptr->r_ptr->flags1 & RF1_MALE)
187         lore_ptr->msex = MSEX_MALE;
188 }
189
190 static void set_flags1(lore_type *lore_ptr)
191 {
192     if (lore_ptr->r_ptr->flags1 & RF1_UNIQUE)
193         lore_ptr->flags1 |= (RF1_UNIQUE);
194
195     if (lore_ptr->r_ptr->flags1 & RF1_QUESTOR)
196         lore_ptr->flags1 |= (RF1_QUESTOR);
197
198     if (lore_ptr->r_ptr->flags1 & RF1_MALE)
199         lore_ptr->flags1 |= (RF1_MALE);
200
201     if (lore_ptr->r_ptr->flags1 & RF1_FEMALE)
202         lore_ptr->flags1 |= (RF1_FEMALE);
203
204     if (lore_ptr->r_ptr->flags1 & RF1_FRIENDS)
205         lore_ptr->flags1 |= (RF1_FRIENDS);
206
207     if (lore_ptr->r_ptr->flags1 & RF1_ESCORT)
208         lore_ptr->flags1 |= (RF1_ESCORT);
209
210     if (lore_ptr->r_ptr->flags1 & RF1_ESCORTS)
211         lore_ptr->flags1 |= (RF1_ESCORTS);
212 }
213
214 static void set_race_flags(lore_type *lore_ptr)
215 {
216     if (!lore_ptr->r_ptr->r_tkills && !lore_ptr->know_everything)
217         return;
218
219     if (lore_ptr->r_ptr->flags3 & RF3_ORC)
220         lore_ptr->flags3 |= (RF3_ORC);
221
222     if (lore_ptr->r_ptr->flags3 & RF3_TROLL)
223         lore_ptr->flags3 |= (RF3_TROLL);
224
225     if (lore_ptr->r_ptr->flags3 & RF3_GIANT)
226         lore_ptr->flags3 |= (RF3_GIANT);
227
228     if (lore_ptr->r_ptr->flags3 & RF3_DRAGON)
229         lore_ptr->flags3 |= (RF3_DRAGON);
230
231     if (lore_ptr->r_ptr->flags3 & RF3_DEMON)
232         lore_ptr->flags3 |= (RF3_DEMON);
233
234     if (lore_ptr->r_ptr->flags3 & RF3_UNDEAD)
235         lore_ptr->flags3 |= (RF3_UNDEAD);
236
237     if (lore_ptr->r_ptr->flags3 & RF3_EVIL)
238         lore_ptr->flags3 |= (RF3_EVIL);
239
240     if (lore_ptr->r_ptr->flags3 & RF3_GOOD)
241         lore_ptr->flags3 |= (RF3_GOOD);
242
243     if (lore_ptr->r_ptr->flags3 & RF3_ANIMAL)
244         lore_ptr->flags3 |= (RF3_ANIMAL);
245
246     if (lore_ptr->r_ptr->flags3 & RF3_AMBERITE)
247         lore_ptr->flags3 |= (RF3_AMBERITE);
248
249     if (lore_ptr->r_ptr->flags2 & RF2_HUMAN)
250         lore_ptr->flags2 |= (RF2_HUMAN);
251
252     if (lore_ptr->r_ptr->flags2 & RF2_QUANTUM)
253         lore_ptr->flags2 |= (RF2_QUANTUM);
254
255     if (lore_ptr->r_ptr->flags1 & RF1_FORCE_DEPTH)
256         lore_ptr->flags1 |= (RF1_FORCE_DEPTH);
257
258     if (lore_ptr->r_ptr->flags1 & RF1_FORCE_MAXHP)
259         lore_ptr->flags1 |= (RF1_FORCE_MAXHP);
260 }
261
262 /*!
263  * @brief モンスターの思い出情報を表示するメインルーチン
264  * Hack -- display monster information using "hooked_roff()"
265  * @param r_idx モンスターの種族ID
266  * @param mode 表示オプション
267  * @return なし
268  * @details
269  * This function should only be called with the cursor placed at the
270  * left edge of the screen, on a cleared line, in which the recall is
271  * to take place.  One extra blank line is left after the recall.
272  */
273 void process_monster_lore(player_type *player_ptr, MONRACE_IDX r_idx, BIT_FLAGS mode)
274 {
275     lore_type tmp_lore;
276     lore_type *lore_ptr = initialize_lore_type(&tmp_lore, r_idx, mode);
277     for (int n = 0; n < A_MAX; n++) {
278         if (lore_ptr->r_ptr->reinforce_id[n] > 0)
279             lore_ptr->reinforce = TRUE;
280     }
281
282     if (cheat_know || (mode & 0x01))
283         lore_ptr->know_everything = TRUE;
284
285     set_drop_flags(lore_ptr);
286     set_msex_flags(lore_ptr);
287     set_flags1(lore_ptr);
288     set_race_flags(lore_ptr);
289     display_kill_numbers(lore_ptr);
290     concptr tmp = r_text + lore_ptr->r_ptr->text;
291     if (tmp[0]) {
292         hooked_roff(tmp);
293         hooked_roff("\n");
294     }
295
296     if (r_idx == MON_KAGE) {
297         hooked_roff("\n");
298         return;
299     }
300
301     if (!display_where_to_appear(lore_ptr))
302         return;
303
304     display_monster_move(lore_ptr);
305     display_monster_never_move(lore_ptr);
306     if (lore_ptr->old) {
307         hooked_roff(_("。", ".  "));
308         lore_ptr->old = FALSE;
309     }
310
311     if (lore_ptr->r_ptr->r_tkills || lore_ptr->know_everything) {
312 #ifdef JP
313         hooked_roff("この");
314 #else
315         if (lore_ptr->flags1 & RF1_UNIQUE) {
316             hooked_roff("Killing this");
317         } else {
318             hooked_roff("A kill of this");
319         }
320 #endif
321
322         if (lore_ptr->flags2 & RF2_ELDRITCH_HORROR)
323             hook_c_roff(TERM_VIOLET, _("狂気を誘う", " sanity-blasting"));
324
325         if (lore_ptr->flags3 & RF3_ANIMAL)
326             hook_c_roff(TERM_L_GREEN, _("自然界の", " natural"));
327
328         if (lore_ptr->flags3 & RF3_EVIL)
329             hook_c_roff(TERM_L_DARK, _("邪悪なる", " evil"));
330
331         if (lore_ptr->flags3 & RF3_GOOD)
332             hook_c_roff(TERM_YELLOW, _("善良な", " good"));
333
334         if (lore_ptr->flags3 & RF3_UNDEAD)
335             hook_c_roff(TERM_VIOLET, _("アンデッドの", " undead"));
336
337         if (lore_ptr->flags3 & RF3_AMBERITE)
338             hook_c_roff(TERM_VIOLET, _("アンバーの王族の", " Amberite"));
339
340         if ((lore_ptr->flags3 & (RF3_DRAGON | RF3_DEMON | RF3_GIANT | RF3_TROLL | RF3_ORC | RF3_ANGEL)) || (lore_ptr->flags2 & (RF2_QUANTUM | RF2_HUMAN))) {
341             if (lore_ptr->flags3 & RF3_DRAGON)
342                 hook_c_roff(TERM_ORANGE, _("ドラゴン", " dragon"));
343             if (lore_ptr->flags3 & RF3_DEMON)
344                 hook_c_roff(TERM_VIOLET, _("デーモン", " demon"));
345             if (lore_ptr->flags3 & RF3_GIANT)
346                 hook_c_roff(TERM_L_UMBER, _("巨人", " giant"));
347             if (lore_ptr->flags3 & RF3_TROLL)
348                 hook_c_roff(TERM_BLUE, _("トロル", " troll"));
349             if (lore_ptr->flags3 & RF3_ORC)
350                 hook_c_roff(TERM_UMBER, _("オーク", " orc"));
351             if (lore_ptr->flags2 & RF2_HUMAN)
352                 hook_c_roff(TERM_L_WHITE, _("人間", " human"));
353             if (lore_ptr->flags2 & RF2_QUANTUM)
354                 hook_c_roff(TERM_VIOLET, _("量子生物", " quantum creature"));
355             if (lore_ptr->flags3 & RF3_ANGEL)
356                 hook_c_roff(TERM_YELLOW, _("天使", " angel"));
357         } else {
358             hooked_roff(_("モンスター", " creature"));
359         }
360
361 #ifdef JP
362         hooked_roff("を倒すことは");
363 #endif
364         long exp_integer = (long)lore_ptr->r_ptr->mexp * lore_ptr->r_ptr->level / (player_ptr->max_plv + 2) * 3 / 2;
365         long exp_decimal
366             = ((((long)lore_ptr->r_ptr->mexp * lore_ptr->r_ptr->level % (player_ptr->max_plv + 2) * 3 / 2) * (long)1000 / (player_ptr->max_plv + 2) + 5) / 10);
367
368 #ifdef JP
369         hooked_roff(format(" %d レベルのキャラクタにとって 約%ld.%02ld ポイントの経験となる。", player_ptr->lev, (long)exp_integer, (long)exp_decimal));
370 #else
371         hooked_roff(format(" is worth about %ld.%02ld point%s", (long)exp_integer, (long)exp_decimal, ((exp_integer == 1) && (exp_decimal == 0)) ? "" : "s"));
372
373         char *ordinal;
374         ordinal = "th";
375         exp_integer = player_ptr->lev % 10;
376         if ((player_ptr->lev / 10) != 1) {
377             if (exp_integer == 1)
378                 ordinal = "st";
379             else if (exp_integer == 2)
380                 ordinal = "nd";
381             else if (exp_integer == 3)
382                 ordinal = "rd";
383         }
384
385         char *vowel;
386         vowel = "";
387         exp_integer = player_ptr->lev;
388         if ((exp_integer == 8) || (exp_integer == 11) || (exp_integer == 18))
389             vowel = "n";
390
391         hooked_roff(format(" for a%s %lu%s level character.  ", vowel, (long)exp_integer, ordinal));
392 #endif
393     }
394
395     if ((lore_ptr->flags2 & RF2_AURA_FIRE) && (lore_ptr->flags2 & RF2_AURA_ELEC) && (lore_ptr->flags3 & RF3_AURA_COLD)) {
396         hook_c_roff(
397             TERM_VIOLET, format(_("%^sは炎と氷とスパークに包まれている。", "%^s is surrounded by flames, ice and electricity.  "), wd_he[lore_ptr->msex]));
398     } else if ((lore_ptr->flags2 & RF2_AURA_FIRE) && (lore_ptr->flags2 & RF2_AURA_ELEC)) {
399         hook_c_roff(TERM_L_RED, format(_("%^sは炎とスパークに包まれている。", "%^s is surrounded by flames and electricity.  "), wd_he[lore_ptr->msex]));
400     } else if ((lore_ptr->flags2 & RF2_AURA_FIRE) && (lore_ptr->flags3 & RF3_AURA_COLD)) {
401         hook_c_roff(TERM_BLUE, format(_("%^sは炎と氷に包まれている。", "%^s is surrounded by flames and ice.  "), wd_he[lore_ptr->msex]));
402     } else if ((lore_ptr->flags3 & RF3_AURA_COLD) && (lore_ptr->flags2 & RF2_AURA_ELEC)) {
403         hook_c_roff(TERM_L_GREEN, format(_("%^sは氷とスパークに包まれている。", "%^s is surrounded by ice and electricity.  "), wd_he[lore_ptr->msex]));
404     } else if (lore_ptr->flags2 & RF2_AURA_FIRE) {
405         hook_c_roff(TERM_RED, format(_("%^sは炎に包まれている。", "%^s is surrounded by flames.  "), wd_he[lore_ptr->msex]));
406     } else if (lore_ptr->flags3 & RF3_AURA_COLD) {
407         hook_c_roff(TERM_BLUE, format(_("%^sは氷に包まれている。", "%^s is surrounded by ice.  "), wd_he[lore_ptr->msex]));
408     } else if (lore_ptr->flags2 & RF2_AURA_ELEC) {
409         hook_c_roff(TERM_L_BLUE, format(_("%^sはスパークに包まれている。", "%^s is surrounded by electricity.  "), wd_he[lore_ptr->msex]));
410     }
411
412     if (lore_ptr->flags2 & RF2_REFLECTING)
413         hooked_roff(format(_("%^sは矢の呪文を跳ね返す。", "%^s reflects bolt spells.  "), wd_he[lore_ptr->msex]));
414
415     if ((lore_ptr->flags1 & RF1_ESCORT) || (lore_ptr->flags1 & RF1_ESCORTS) || lore_ptr->reinforce) {
416         hooked_roff(format(_("%^sは通常護衛を伴って現れる。", "%^s usually appears with escorts.  "), wd_he[lore_ptr->msex]));
417
418         if (lore_ptr->reinforce) {
419             hooked_roff(_("護衛の構成は", "These escorts"));
420             if ((lore_ptr->flags1 & RF1_ESCORT) || (lore_ptr->flags1 & RF1_ESCORTS)) {
421                 hooked_roff(_("少なくとも", " at the least"));
422             }
423 #ifdef JP
424 #else
425             hooked_roff(" contain ");
426 #endif
427             for (int n = 0; n < A_MAX; n++) {
428                 bool is_reinforced = lore_ptr->r_ptr->reinforce_id[n] > 0;
429                 is_reinforced &= lore_ptr->r_ptr->reinforce_dd[n] > 0;
430                 is_reinforced &= lore_ptr->r_ptr->reinforce_ds[n] > 0;
431                 if (!is_reinforced)
432                     continue;
433
434                 monster_race *rf_ptr = &r_info[lore_ptr->r_ptr->reinforce_id[n]];
435                 if (rf_ptr->flags1 & RF1_UNIQUE) {
436                     hooked_roff(format(_("、%s", ", %s"), r_name + rf_ptr->name));
437                     continue;
438                 }
439
440 #ifdef JP
441                 hooked_roff(format("、 %dd%d 体の%s", lore_ptr->r_ptr->reinforce_dd[n], lore_ptr->r_ptr->reinforce_ds[n], r_name + rf_ptr->name));
442 #else
443                 bool plural = (lore_ptr->r_ptr->reinforce_dd[n] * lore_ptr->r_ptr->reinforce_ds[n] > 1);
444                 GAME_TEXT name[MAX_NLEN];
445                 strcpy(name, r_name + rf_ptr->name);
446                 if (plural)
447                     plural_aux(name);
448                 hooked_roff(format(",%dd%d %s", lore_ptr->r_ptr->reinforce_dd[n], lore_ptr->r_ptr->reinforce_ds[n], name));
449 #endif
450             }
451
452             hooked_roff(_("で成り立っている。", "."));
453         }
454     }
455
456     else if (lore_ptr->flags1 & RF1_FRIENDS) {
457         hooked_roff(format(_("%^sは通常集団で現れる。", "%^s usually appears in groups.  "), wd_he[lore_ptr->msex]));
458     }
459
460     int vn = 0;
461     byte color[96];
462     concptr vp[96];
463     char tmp_msg[96][96];
464     if (lore_ptr->flags4 & RF4_SHRIEK) {
465         vp[vn] = _("悲鳴で助けを求める", "shriek for help");
466         color[vn++] = TERM_L_WHITE;
467     }
468
469     if (lore_ptr->flags4 & RF4_ROCKET) {
470         set_damage(player_ptr, r_idx, (MS_ROCKET), _("ロケット%sを発射する", "shoot a rocket%s"), tmp_msg[vn]);
471         vp[vn] = tmp_msg[vn];
472         color[vn++] = TERM_UMBER;
473     }
474
475     if (lore_ptr->flags4 & RF4_SHOOT) {
476         for (int m = 0; m < 4; m++) {
477             if (lore_ptr->r_ptr->blow[m].method != RBM_SHOOT)
478                 continue;
479
480             if (know_armour(r_idx))
481                 sprintf(
482                     tmp_msg[vn], _("威力 %dd%d の射撃をする", "fire an arrow (Power:%dd%d)"), lore_ptr->r_ptr->blow[m].d_side, lore_ptr->r_ptr->blow[m].d_dice);
483             else
484                 sprintf(tmp_msg[vn], _("射撃をする", "fire an arrow"));
485             vp[vn] = tmp_msg[vn];
486             color[vn++] = TERM_UMBER;
487             break;
488         }
489     }
490
491     if (lore_ptr->a_ability_flags2 & (RF6_SPECIAL)) {
492         vp[vn] = _("特別な行動をする", "do something");
493         color[vn++] = TERM_VIOLET;
494     }
495
496     if (vn > 0) {
497         hooked_roff(format(_("%^sは", "%^s"), wd_he[lore_ptr->msex]));
498         for (int n = 0; n < vn; n++) {
499 #ifdef JP
500             if (n != vn - 1) {
501                 jverb(vp[n], lore_ptr->jverb_buf, JVERB_OR);
502                 hook_c_roff(color[n], lore_ptr->jverb_buf);
503                 hook_c_roff(color[n], "り");
504                 hooked_roff("、");
505             } else
506                 hook_c_roff(color[n], vp[n]);
507 #else
508             if (n == 0)
509                 hooked_roff(" may ");
510             else if (n < vn - 1)
511                 hooked_roff(", ");
512             else
513                 hooked_roff(" or ");
514
515             hook_c_roff(color[n], vp[n]);
516 #endif
517         }
518
519         hooked_roff(_("ことがある。", ".  "));
520     }
521
522     vn = 0;
523     if (lore_ptr->flags4 & (RF4_BR_ACID)) {
524         set_damage(player_ptr, r_idx, (MS_BR_ACID), _("酸%s", "acid%s"), tmp_msg[vn]);
525         vp[vn] = tmp_msg[vn];
526         color[vn++] = TERM_GREEN;
527     }
528
529     if (lore_ptr->flags4 & (RF4_BR_ELEC)) {
530         set_damage(player_ptr, r_idx, (MS_BR_ELEC), _("稲妻%s", "lightning%s"), tmp_msg[vn]);
531         vp[vn] = tmp_msg[vn];
532         color[vn++] = TERM_BLUE;
533     }
534
535     if (lore_ptr->flags4 & (RF4_BR_FIRE)) {
536         set_damage(player_ptr, r_idx, (MS_BR_FIRE), _("火炎%s", "fire%s"), tmp_msg[vn]);
537         vp[vn] = tmp_msg[vn];
538         color[vn++] = TERM_RED;
539     }
540
541     if (lore_ptr->flags4 & (RF4_BR_COLD)) {
542         set_damage(player_ptr, r_idx, (MS_BR_COLD), _("冷気%s", "frost%s"), tmp_msg[vn]);
543         vp[vn] = tmp_msg[vn];
544         color[vn++] = TERM_L_WHITE;
545     }
546
547     if (lore_ptr->flags4 & (RF4_BR_POIS)) {
548         set_damage(player_ptr, r_idx, (MS_BR_POIS), _("毒%s", "poison%s"), tmp_msg[vn]);
549         vp[vn] = tmp_msg[vn];
550         color[vn++] = TERM_L_GREEN;
551     }
552
553     if (lore_ptr->flags4 & (RF4_BR_NETH)) {
554         set_damage(player_ptr, r_idx, (MS_BR_NETHER), _("地獄%s", "nether%s"), tmp_msg[vn]);
555         vp[vn] = tmp_msg[vn];
556         color[vn++] = TERM_L_DARK;
557     }
558
559     if (lore_ptr->flags4 & (RF4_BR_LITE)) {
560         set_damage(player_ptr, r_idx, (MS_BR_LITE), _("閃光%s", "light%s"), tmp_msg[vn]);
561         vp[vn] = tmp_msg[vn];
562         color[vn++] = TERM_YELLOW;
563     }
564
565     if (lore_ptr->flags4 & (RF4_BR_DARK)) {
566         set_damage(player_ptr, r_idx, (MS_BR_DARK), _("暗黒%s", "darkness%s"), tmp_msg[vn]);
567         vp[vn] = tmp_msg[vn];
568         color[vn++] = TERM_L_DARK;
569     }
570
571     if (lore_ptr->flags4 & (RF4_BR_CONF)) {
572         set_damage(player_ptr, r_idx, (MS_BR_CONF), _("混乱%s", "confusion%s"), tmp_msg[vn]);
573         vp[vn] = tmp_msg[vn];
574         color[vn++] = TERM_L_UMBER;
575     }
576
577     if (lore_ptr->flags4 & (RF4_BR_SOUN)) {
578         set_damage(player_ptr, r_idx, (MS_BR_SOUND), _("轟音%s", "sound%s"), tmp_msg[vn]);
579         vp[vn] = tmp_msg[vn];
580         color[vn++] = TERM_ORANGE;
581     }
582
583     if (lore_ptr->flags4 & (RF4_BR_CHAO)) {
584         set_damage(player_ptr, r_idx, (MS_BR_CHAOS), _("カオス%s", "chaos%s"), tmp_msg[vn]);
585         vp[vn] = tmp_msg[vn];
586         color[vn++] = TERM_VIOLET;
587     }
588
589     if (lore_ptr->flags4 & (RF4_BR_DISE)) {
590         set_damage(player_ptr, r_idx, (MS_BR_DISEN), _("劣化%s", "disenchantment%s"), tmp_msg[vn]);
591         vp[vn] = tmp_msg[vn];
592         color[vn++] = TERM_VIOLET;
593     }
594
595     if (lore_ptr->flags4 & (RF4_BR_NEXU)) {
596         set_damage(player_ptr, r_idx, (MS_BR_NEXUS), _("因果混乱%s", "nexus%s"), tmp_msg[vn]);
597         vp[vn] = tmp_msg[vn];
598         color[vn++] = TERM_VIOLET;
599     }
600
601     if (lore_ptr->flags4 & (RF4_BR_TIME)) {
602         set_damage(player_ptr, r_idx, (MS_BR_TIME), _("時間逆転%s", "time%s"), tmp_msg[vn]);
603         vp[vn] = tmp_msg[vn];
604         color[vn++] = TERM_L_BLUE;
605     }
606
607     if (lore_ptr->flags4 & (RF4_BR_INER)) {
608         set_damage(player_ptr, r_idx, (MS_BR_INERTIA), _("遅鈍%s", "inertia%s"), tmp_msg[vn]);
609         vp[vn] = tmp_msg[vn];
610         color[vn++] = TERM_SLATE;
611     }
612
613     if (lore_ptr->flags4 & (RF4_BR_GRAV)) {
614         set_damage(player_ptr, r_idx, (MS_BR_GRAVITY), _("重力%s", "gravity%s"), tmp_msg[vn]);
615         vp[vn] = tmp_msg[vn];
616         color[vn++] = TERM_SLATE;
617     }
618
619     if (lore_ptr->flags4 & (RF4_BR_SHAR)) {
620         set_damage(player_ptr, r_idx, (MS_BR_SHARDS), _("破片%s", "shards%s"), tmp_msg[vn]);
621         vp[vn] = tmp_msg[vn];
622         color[vn++] = TERM_L_UMBER;
623     }
624
625     if (lore_ptr->flags4 & (RF4_BR_PLAS)) {
626         set_damage(player_ptr, r_idx, (MS_BR_PLASMA), _("プラズマ%s", "plasma%s"), tmp_msg[vn]);
627         vp[vn] = tmp_msg[vn];
628         color[vn++] = TERM_L_RED;
629     }
630
631     if (lore_ptr->flags4 & (RF4_BR_WALL)) {
632         set_damage(player_ptr, r_idx, (MS_BR_FORCE), _("フォース%s", "force%s"), tmp_msg[vn]);
633         vp[vn] = tmp_msg[vn];
634         color[vn++] = TERM_UMBER;
635     }
636
637     if (lore_ptr->flags4 & (RF4_BR_MANA)) {
638         set_damage(player_ptr, r_idx, (MS_BR_MANA), _("魔力%s", "mana%s"), tmp_msg[vn]);
639         vp[vn] = tmp_msg[vn];
640         color[vn++] = TERM_L_BLUE;
641     }
642
643     if (lore_ptr->flags4 & (RF4_BR_NUKE)) {
644         set_damage(player_ptr, r_idx, (MS_BR_NUKE), _("放射性廃棄物%s", "toxic waste%s"), tmp_msg[vn]);
645         vp[vn] = tmp_msg[vn];
646         color[vn++] = TERM_L_GREEN;
647     }
648
649     if (lore_ptr->flags4 & (RF4_BR_DISI)) {
650         set_damage(player_ptr, r_idx, (MS_BR_DISI), _("分解%s", "disintegration%s"), tmp_msg[vn]);
651         vp[vn] = tmp_msg[vn];
652         color[vn++] = TERM_SLATE;
653     }
654
655     bool breath = FALSE;
656     if (vn > 0) {
657         breath = TRUE;
658         hooked_roff(format(_("%^sは", "%^s"), wd_he[lore_ptr->msex]));
659         for (int n = 0; n < vn; n++) {
660 #ifdef JP
661             if (n != 0)
662                 hooked_roff("や");
663 #else
664             if (n == 0)
665                 hooked_roff(" may breathe ");
666             else if (n < vn - 1)
667                 hooked_roff(", ");
668             else
669                 hooked_roff(" or ");
670 #endif
671             hook_c_roff(color[n], vp[n]);
672         }
673
674 #ifdef JP
675         hooked_roff("のブレスを吐くことがある");
676 #endif
677     }
678
679     vn = 0;
680     if (lore_ptr->a_ability_flags1 & (RF5_BA_ACID)) {
681         set_damage(player_ptr, r_idx, (MS_BALL_ACID), _("アシッド・ボール%s", "produce acid balls%s"), tmp_msg[vn]);
682         vp[vn] = tmp_msg[vn];
683         color[vn++] = TERM_GREEN;
684     }
685
686     if (lore_ptr->a_ability_flags1 & (RF5_BA_ELEC)) {
687         set_damage(player_ptr, r_idx, (MS_BALL_ELEC), _("サンダー・ボール%s", "produce lightning balls%s"), tmp_msg[vn]);
688         vp[vn] = tmp_msg[vn];
689         color[vn++] = TERM_BLUE;
690     }
691
692     if (lore_ptr->a_ability_flags1 & (RF5_BA_FIRE)) {
693         set_damage(player_ptr, r_idx, (MS_BALL_FIRE), _("ファイア・ボール%s", "produce fire balls%s"), tmp_msg[vn]);
694         vp[vn] = tmp_msg[vn];
695         color[vn++] = TERM_RED;
696     }
697
698     if (lore_ptr->a_ability_flags1 & (RF5_BA_COLD)) {
699         set_damage(player_ptr, r_idx, (MS_BALL_COLD), _("アイス・ボール%s", "produce frost balls%s"), tmp_msg[vn]);
700         vp[vn] = tmp_msg[vn];
701         color[vn++] = TERM_L_WHITE;
702     }
703
704     if (lore_ptr->a_ability_flags1 & (RF5_BA_POIS)) {
705         set_damage(player_ptr, r_idx, (MS_BALL_POIS), _("悪臭雲%s", "produce poison balls%s"), tmp_msg[vn]);
706         vp[vn] = tmp_msg[vn];
707         color[vn++] = TERM_L_GREEN;
708     }
709
710     if (lore_ptr->a_ability_flags1 & (RF5_BA_NETH)) {
711         set_damage(player_ptr, r_idx, (MS_BALL_NETHER), _("地獄球%s", "produce nether balls%s"), tmp_msg[vn]);
712         vp[vn] = tmp_msg[vn];
713         color[vn++] = TERM_L_DARK;
714     }
715
716     if (lore_ptr->a_ability_flags1 & (RF5_BA_WATE)) {
717         set_damage(player_ptr, r_idx, (MS_BALL_WATER), _("ウォーター・ボール%s", "produce water balls%s"), tmp_msg[vn]);
718         vp[vn] = tmp_msg[vn];
719         color[vn++] = TERM_BLUE;
720     }
721
722     if (lore_ptr->flags4 & (RF4_BA_NUKE)) {
723         set_damage(player_ptr, r_idx, (MS_BALL_NUKE), _("放射能球%s", "produce balls of radiation%s"), tmp_msg[vn]);
724         vp[vn] = tmp_msg[vn];
725         color[vn++] = TERM_L_GREEN;
726     }
727
728     if (lore_ptr->a_ability_flags1 & (RF5_BA_MANA)) {
729         set_damage(player_ptr, r_idx, (MS_BALL_MANA), _("魔力の嵐%s", "invoke mana storms%s"), tmp_msg[vn]);
730         vp[vn] = tmp_msg[vn];
731         color[vn++] = TERM_L_BLUE;
732     }
733
734     if (lore_ptr->a_ability_flags1 & (RF5_BA_DARK)) {
735         set_damage(player_ptr, r_idx, (MS_BALL_DARK), _("暗黒の嵐%s", "invoke darkness storms%s"), tmp_msg[vn]);
736         vp[vn] = tmp_msg[vn];
737         color[vn++] = TERM_L_DARK;
738     }
739
740     if (lore_ptr->a_ability_flags1 & (RF5_BA_LITE)) {
741         set_damage(player_ptr, r_idx, (MS_STARBURST), _("スターバースト%s", "invoke starburst%s"), tmp_msg[vn]);
742         vp[vn] = tmp_msg[vn];
743         color[vn++] = TERM_YELLOW;
744     }
745
746     if (lore_ptr->flags4 & (RF4_BA_CHAO)) {
747         set_damage(player_ptr, r_idx, (MS_BALL_CHAOS), _("純ログルス%s", "invoke raw Logrus%s"), tmp_msg[vn]);
748         vp[vn] = tmp_msg[vn];
749         color[vn++] = TERM_VIOLET;
750     }
751
752     if (lore_ptr->a_ability_flags2 & (RF6_HAND_DOOM)) {
753         vp[vn] = _("破滅の手(40%-60%)", "invoke the Hand of Doom(40%-60%)");
754         color[vn++] = TERM_VIOLET;
755     }
756
757     if (lore_ptr->a_ability_flags2 & (RF6_PSY_SPEAR)) {
758         set_damage(player_ptr, r_idx, (MS_PSY_SPEAR), _("光の剣%s", "psycho-spear%s"), tmp_msg[vn]);
759         vp[vn] = tmp_msg[vn];
760         color[vn++] = TERM_YELLOW;
761     }
762
763     if (lore_ptr->a_ability_flags1 & (RF5_DRAIN_MANA)) {
764         set_damage(player_ptr, r_idx, (MS_DRAIN_MANA), _("魔力吸収%s", "drain mana%s"), tmp_msg[vn]);
765         vp[vn] = tmp_msg[vn];
766         color[vn++] = TERM_SLATE;
767     }
768
769     if (lore_ptr->a_ability_flags1 & (RF5_MIND_BLAST)) {
770         set_damage(player_ptr, r_idx, (MS_MIND_BLAST), _("精神攻撃%s", "cause mind blasting%s"), tmp_msg[vn]);
771         vp[vn] = tmp_msg[vn];
772         color[vn++] = TERM_L_RED;
773     }
774
775     if (lore_ptr->a_ability_flags1 & (RF5_BRAIN_SMASH)) {
776         set_damage(player_ptr, r_idx, (MS_BRAIN_SMASH), _("脳攻撃%s", "cause brain smashing%s"), tmp_msg[vn]);
777         vp[vn] = tmp_msg[vn];
778         color[vn++] = TERM_RED;
779     }
780
781     if (lore_ptr->a_ability_flags1 & (RF5_CAUSE_1)) {
782         set_damage(player_ptr, r_idx, (MS_CAUSE_1), _("軽傷+呪い%s", "cause light wounds and cursing%s"), tmp_msg[vn]);
783         vp[vn] = tmp_msg[vn];
784         color[vn++] = TERM_L_WHITE;
785     }
786
787     if (lore_ptr->a_ability_flags1 & (RF5_CAUSE_2)) {
788         set_damage(player_ptr, r_idx, (MS_CAUSE_2), _("重傷+呪い%s", "cause serious wounds and cursing%s"), tmp_msg[vn]);
789         vp[vn] = tmp_msg[vn];
790         color[vn++] = TERM_L_WHITE;
791     }
792
793     if (lore_ptr->a_ability_flags1 & (RF5_CAUSE_3)) {
794         set_damage(player_ptr, r_idx, (MS_CAUSE_3), _("致命傷+呪い%s", "cause critical wounds and cursing%s"), tmp_msg[vn]);
795         vp[vn] = tmp_msg[vn];
796         color[vn++] = TERM_L_WHITE;
797     }
798
799     if (lore_ptr->a_ability_flags1 & (RF5_CAUSE_4)) {
800         set_damage(player_ptr, r_idx, (MS_CAUSE_4), _("秘孔を突く%s", "cause mortal wounds%s"), tmp_msg[vn]);
801         vp[vn] = tmp_msg[vn];
802         color[vn++] = TERM_L_WHITE;
803     }
804
805     if (lore_ptr->a_ability_flags1 & (RF5_BO_ACID)) {
806         set_damage(player_ptr, r_idx, (MS_BOLT_ACID), _("アシッド・ボルト%s", "produce acid bolts%s"), tmp_msg[vn]);
807         vp[vn] = tmp_msg[vn];
808         color[vn++] = TERM_GREEN;
809     }
810
811     if (lore_ptr->a_ability_flags1 & (RF5_BO_ELEC)) {
812         set_damage(player_ptr, r_idx, (MS_BOLT_ELEC), _("サンダー・ボルト%s", "produce lightning bolts%s"), tmp_msg[vn]);
813         vp[vn] = tmp_msg[vn];
814         color[vn++] = TERM_BLUE;
815     }
816
817     if (lore_ptr->a_ability_flags1 & (RF5_BO_FIRE)) {
818         set_damage(player_ptr, r_idx, (MS_BOLT_FIRE), _("ファイア・ボルト%s", "produce fire bolts%s"), tmp_msg[vn]);
819         vp[vn] = tmp_msg[vn];
820         color[vn++] = TERM_RED;
821     }
822
823     if (lore_ptr->a_ability_flags1 & (RF5_BO_COLD)) {
824         set_damage(player_ptr, r_idx, (MS_BOLT_COLD), _("アイス・ボルト%s", "produce frost bolts%s"), tmp_msg[vn]);
825         vp[vn] = tmp_msg[vn];
826         color[vn++] = TERM_L_WHITE;
827     }
828
829     if (lore_ptr->a_ability_flags1 & (RF5_BO_NETH)) {
830         set_damage(player_ptr, r_idx, (MS_BOLT_NETHER), _("地獄の矢%s", "produce nether bolts%s"), tmp_msg[vn]);
831         vp[vn] = tmp_msg[vn];
832         color[vn++] = TERM_L_DARK;
833     }
834
835     if (lore_ptr->a_ability_flags1 & (RF5_BO_WATE)) {
836         set_damage(player_ptr, r_idx, (MS_BOLT_WATER), _("ウォーター・ボルト%s", "produce water bolts%s"), tmp_msg[vn]);
837         vp[vn] = tmp_msg[vn];
838         color[vn++] = TERM_BLUE;
839     }
840
841     if (lore_ptr->a_ability_flags1 & (RF5_BO_MANA)) {
842         set_damage(player_ptr, r_idx, (MS_BOLT_MANA), _("魔力の矢%s", "produce mana bolts%s"), tmp_msg[vn]);
843         vp[vn] = tmp_msg[vn];
844         color[vn++] = TERM_L_BLUE;
845     }
846
847     if (lore_ptr->a_ability_flags1 & (RF5_BO_PLAS)) {
848         set_damage(player_ptr, r_idx, (MS_BOLT_PLASMA), _("プラズマ・ボルト%s", "produce plasma bolts%s"), tmp_msg[vn]);
849         vp[vn] = tmp_msg[vn];
850         color[vn++] = TERM_L_RED;
851     }
852
853     if (lore_ptr->a_ability_flags1 & (RF5_BO_ICEE)) {
854         set_damage(player_ptr, r_idx, (MS_BOLT_ICE), _("極寒の矢%s", "produce ice bolts%s"), tmp_msg[vn]);
855         vp[vn] = tmp_msg[vn];
856         color[vn++] = TERM_WHITE;
857     }
858
859     if (lore_ptr->a_ability_flags1 & (RF5_MISSILE)) {
860         set_damage(player_ptr, r_idx, (MS_MAGIC_MISSILE), _("マジックミサイル%s", "produce magic missiles%s"), tmp_msg[vn]);
861         vp[vn] = tmp_msg[vn];
862         color[vn++] = TERM_SLATE;
863     }
864
865     if (lore_ptr->a_ability_flags1 & (RF5_SCARE)) {
866         vp[vn] = _("恐怖", "terrify");
867         color[vn++] = TERM_SLATE;
868     }
869     if (lore_ptr->a_ability_flags1 & (RF5_BLIND)) {
870         vp[vn] = _("目くらまし", "blind");
871         color[vn++] = TERM_L_DARK;
872     }
873     if (lore_ptr->a_ability_flags1 & (RF5_CONF)) {
874         vp[vn] = _("混乱", "confuse");
875         color[vn++] = TERM_L_UMBER;
876     }
877     if (lore_ptr->a_ability_flags1 & (RF5_SLOW)) {
878         vp[vn] = _("減速", "slow");
879         color[vn++] = TERM_UMBER;
880     }
881     if (lore_ptr->a_ability_flags1 & (RF5_HOLD)) {
882         vp[vn] = _("麻痺", "paralyze");
883         color[vn++] = TERM_RED;
884     }
885     if (lore_ptr->a_ability_flags2 & (RF6_HASTE)) {
886         vp[vn] = _("加速", "haste-self");
887         color[vn++] = TERM_L_GREEN;
888     }
889     if (lore_ptr->a_ability_flags2 & (RF6_HEAL)) {
890         vp[vn] = _("治癒", "heal-self");
891         color[vn++] = TERM_WHITE;
892     }
893     if (lore_ptr->a_ability_flags2 & (RF6_INVULNER)) {
894         vp[vn] = _("無敵化", "make invulnerable");
895         color[vn++] = TERM_WHITE;
896     }
897     if (lore_ptr->flags4 & RF4_DISPEL) {
898         vp[vn] = _("魔力消去", "dispel-magic");
899         color[vn++] = TERM_L_WHITE;
900     }
901     if (lore_ptr->a_ability_flags2 & (RF6_BLINK)) {
902         vp[vn] = _("ショートテレポート", "blink-self");
903         color[vn++] = TERM_UMBER;
904     }
905     if (lore_ptr->a_ability_flags2 & (RF6_TPORT)) {
906         vp[vn] = _("テレポート", "teleport-self");
907         color[vn++] = TERM_ORANGE;
908     }
909     if (lore_ptr->a_ability_flags2 & (RF6_WORLD)) {
910         vp[vn] = _("時を止める", "stop the time");
911         color[vn++] = TERM_L_BLUE;
912     }
913     if (lore_ptr->a_ability_flags2 & (RF6_TELE_TO)) {
914         vp[vn] = _("テレポートバック", "teleport to");
915         color[vn++] = TERM_L_UMBER;
916     }
917     if (lore_ptr->a_ability_flags2 & (RF6_TELE_AWAY)) {
918         vp[vn] = _("テレポートアウェイ", "teleport away");
919         color[vn++] = TERM_UMBER;
920     }
921     if (lore_ptr->a_ability_flags2 & (RF6_TELE_LEVEL)) {
922         vp[vn] = _("テレポート・レベル", "teleport level");
923         color[vn++] = TERM_ORANGE;
924     }
925
926     if (lore_ptr->a_ability_flags2 & (RF6_DARKNESS)) {
927         if ((player_ptr->pclass != CLASS_NINJA) || (lore_ptr->r_ptr->flags3 & (RF3_UNDEAD | RF3_HURT_LITE)) || (lore_ptr->r_ptr->flags7 & RF7_DARK_MASK)) {
928             vp[vn] = _("暗闇", "create darkness");
929             color[vn++] = TERM_L_DARK;
930         } else {
931             vp[vn] = _("閃光", "create light");
932             color[vn++] = TERM_YELLOW;
933         }
934     }
935
936     if (lore_ptr->a_ability_flags2 & (RF6_TRAPS)) {
937         vp[vn] = _("トラップ", "create traps");
938         color[vn++] = TERM_BLUE;
939     }
940     if (lore_ptr->a_ability_flags2 & (RF6_FORGET)) {
941         vp[vn] = _("記憶消去", "cause amnesia");
942         color[vn++] = TERM_BLUE;
943     }
944     if (lore_ptr->a_ability_flags2 & (RF6_RAISE_DEAD)) {
945         vp[vn] = _("死者復活", "raise dead");
946         color[vn++] = TERM_RED;
947     }
948     if (lore_ptr->a_ability_flags2 & (RF6_S_MONSTER)) {
949         vp[vn] = _("モンスター一体召喚", "summon a monster");
950         color[vn++] = TERM_SLATE;
951     }
952     if (lore_ptr->a_ability_flags2 & (RF6_S_MONSTERS)) {
953         vp[vn] = _("モンスター複数召喚", "summon monsters");
954         color[vn++] = TERM_L_WHITE;
955     }
956     if (lore_ptr->a_ability_flags2 & (RF6_S_KIN)) {
957         vp[vn] = _("救援召喚", "summon aid");
958         color[vn++] = TERM_ORANGE;
959     }
960     if (lore_ptr->a_ability_flags2 & (RF6_S_ANT)) {
961         vp[vn] = _("アリ召喚", "summon ants");
962         color[vn++] = TERM_RED;
963     }
964     if (lore_ptr->a_ability_flags2 & (RF6_S_SPIDER)) {
965         vp[vn] = _("クモ召喚", "summon spiders");
966         color[vn++] = TERM_L_DARK;
967     }
968     if (lore_ptr->a_ability_flags2 & (RF6_S_HOUND)) {
969         vp[vn] = _("ハウンド召喚", "summon hounds");
970         color[vn++] = TERM_L_UMBER;
971     }
972     if (lore_ptr->a_ability_flags2 & (RF6_S_HYDRA)) {
973         vp[vn] = _("ヒドラ召喚", "summon hydras");
974         color[vn++] = TERM_L_GREEN;
975     }
976     if (lore_ptr->a_ability_flags2 & (RF6_S_ANGEL)) {
977         vp[vn] = _("天使一体召喚", "summon an angel");
978         color[vn++] = TERM_YELLOW;
979     }
980     if (lore_ptr->a_ability_flags2 & (RF6_S_DEMON)) {
981         vp[vn] = _("デーモン一体召喚", "summon a demon");
982         color[vn++] = TERM_L_RED;
983     }
984     if (lore_ptr->a_ability_flags2 & (RF6_S_UNDEAD)) {
985         vp[vn] = _("アンデッド一体召喚", "summon an undead");
986         color[vn++] = TERM_L_DARK;
987     }
988     if (lore_ptr->a_ability_flags2 & (RF6_S_DRAGON)) {
989         vp[vn] = _("ドラゴン一体召喚", "summon a dragon");
990         color[vn++] = TERM_ORANGE;
991     }
992     if (lore_ptr->a_ability_flags2 & (RF6_S_HI_UNDEAD)) {
993         vp[vn] = _("強力なアンデッド召喚", "summon Greater Undead");
994         color[vn++] = TERM_L_DARK;
995     }
996     if (lore_ptr->a_ability_flags2 & (RF6_S_HI_DRAGON)) {
997         vp[vn] = _("古代ドラゴン召喚", "summon Ancient Dragons");
998         color[vn++] = TERM_ORANGE;
999     }
1000     if (lore_ptr->a_ability_flags2 & (RF6_S_CYBER)) {
1001         vp[vn] = _("サイバーデーモン召喚", "summon Cyberdemons");
1002         color[vn++] = TERM_UMBER;
1003     }
1004     if (lore_ptr->a_ability_flags2 & (RF6_S_AMBERITES)) {
1005         vp[vn] = _("アンバーの王族召喚", "summon Lords of Amber");
1006         color[vn++] = TERM_VIOLET;
1007     }
1008     if (lore_ptr->a_ability_flags2 & (RF6_S_UNIQUE)) {
1009         vp[vn] = _("ユニーク・モンスター召喚", "summon Unique Monsters");
1010         color[vn++] = TERM_VIOLET;
1011     }
1012
1013     bool magic = FALSE;
1014     if (vn) {
1015         magic = TRUE;
1016         if (breath) {
1017             hooked_roff(_("、なおかつ", ", and is also"));
1018         } else {
1019             hooked_roff(format(_("%^sは", "%^s is"), wd_he[lore_ptr->msex]));
1020         }
1021
1022 #ifdef JP
1023         if (lore_ptr->flags2 & (RF2_SMART))
1024             hook_c_roff(TERM_YELLOW, "的確に");
1025         hooked_roff("魔法を使うことができ、");
1026 #else
1027         hooked_roff(" magical, casting spells");
1028         if (lore_ptr->flags2 & RF2_SMART)
1029             hook_c_roff(TERM_YELLOW, " intelligently");
1030 #endif
1031
1032         for (int n = 0; n < vn; n++) {
1033 #ifdef JP
1034             if (n != 0)
1035                 hooked_roff("、");
1036 #else
1037             if (n == 0)
1038                 hooked_roff(" which ");
1039             else if (n < vn - 1)
1040                 hooked_roff(", ");
1041             else
1042                 hooked_roff(" or ");
1043 #endif
1044             hook_c_roff(color[n], vp[n]);
1045         }
1046
1047 #ifdef JP
1048         hooked_roff("の呪文を唱えることがある");
1049 #endif
1050     }
1051
1052     if (breath || magic) {
1053         int m = lore_ptr->r_ptr->r_cast_spell;
1054         int n = lore_ptr->r_ptr->freq_spell;
1055         if (m > 100 || lore_ptr->know_everything) {
1056             hooked_roff(format(_("(確率:1/%d)", "; 1 time in %d"), 100 / n));
1057         } else if (m) {
1058             n = ((n + 9) / 10) * 10;
1059             hooked_roff(format(_("(確率:約1/%d)", "; about 1 time in %d"), 100 / n));
1060         }
1061
1062         hooked_roff(_("。", ".  "));
1063     }
1064
1065     if (lore_ptr->know_everything || know_armour(r_idx)) {
1066         hooked_roff(format(_("%^sは AC%d の防御力と", "%^s has an armor rating of %d"), wd_he[lore_ptr->msex], lore_ptr->r_ptr->ac));
1067
1068         if ((lore_ptr->flags1 & RF1_FORCE_MAXHP) || (lore_ptr->r_ptr->hside == 1)) {
1069             u32b hp = lore_ptr->r_ptr->hdice * (lore_ptr->nightmare ? 2 : 1) * lore_ptr->r_ptr->hside;
1070             hooked_roff(format(_(" %d の体力がある。", " and a life rating of %d.  "), (s16b)MIN(30000, hp)));
1071         } else {
1072             hooked_roff(format(
1073                 _(" %dd%d の体力がある。", " and a life rating of %dd%d.  "), lore_ptr->r_ptr->hdice * (lore_ptr->nightmare ? 2 : 1), lore_ptr->r_ptr->hside));
1074         }
1075     }
1076
1077     vn = 0;
1078     if (lore_ptr->flags7 & (RF7_HAS_LITE_1 | RF7_HAS_LITE_2)) {
1079         vp[vn] = _("ダンジョンを照らす", "illuminate the dungeon");
1080         color[vn++] = TERM_WHITE;
1081     }
1082     if (lore_ptr->flags7 & (RF7_HAS_DARK_1 | RF7_HAS_DARK_2)) {
1083         vp[vn] = _("ダンジョンを暗くする", "darken the dungeon");
1084         color[vn++] = TERM_L_DARK;
1085     }
1086     if (lore_ptr->flags2 & RF2_OPEN_DOOR) {
1087         vp[vn] = _("ドアを開ける", "open doors");
1088         color[vn++] = TERM_WHITE;
1089     }
1090     if (lore_ptr->flags2 & RF2_BASH_DOOR) {
1091         vp[vn] = _("ドアを打ち破る", "bash down doors");
1092         color[vn++] = TERM_WHITE;
1093     }
1094     if (lore_ptr->flags7 & RF7_CAN_FLY) {
1095         vp[vn] = _("空を飛ぶ", "fly");
1096         color[vn++] = TERM_WHITE;
1097     }
1098     if (lore_ptr->flags7 & RF7_CAN_SWIM) {
1099         vp[vn] = _("水を渡る", "swim");
1100         color[vn++] = TERM_WHITE;
1101     }
1102     if (lore_ptr->flags2 & RF2_PASS_WALL) {
1103         vp[vn] = _("壁をすり抜ける", "pass through walls");
1104         color[vn++] = TERM_WHITE;
1105     }
1106     if (lore_ptr->flags2 & RF2_KILL_WALL) {
1107         vp[vn] = _("壁を掘り進む", "bore through walls");
1108         color[vn++] = TERM_WHITE;
1109     }
1110     if (lore_ptr->flags2 & RF2_MOVE_BODY) {
1111         vp[vn] = _("弱いモンスターを押しのける", "push past weaker monsters");
1112         color[vn++] = TERM_WHITE;
1113     }
1114     if (lore_ptr->flags2 & RF2_KILL_BODY) {
1115         vp[vn] = _("弱いモンスターを倒す", "destroy weaker monsters");
1116         color[vn++] = TERM_WHITE;
1117     }
1118     if (lore_ptr->flags2 & RF2_TAKE_ITEM) {
1119         vp[vn] = _("アイテムを拾う", "pick up objects");
1120         color[vn++] = TERM_WHITE;
1121     }
1122     if (lore_ptr->flags2 & RF2_KILL_ITEM) {
1123         vp[vn] = _("アイテムを壊す", "destroy objects");
1124         color[vn++] = TERM_WHITE;
1125     }
1126
1127     if (vn > 0) {
1128         hooked_roff(format(_("%^sは", "%^s"), wd_he[lore_ptr->msex]));
1129         for (int n = 0; n < vn; n++) {
1130 #ifdef JP
1131             if (n != vn - 1) {
1132                 jverb(vp[n], lore_ptr->jverb_buf, JVERB_AND);
1133                 hook_c_roff(color[n], lore_ptr->jverb_buf);
1134                 hooked_roff("、");
1135             } else {
1136                 hook_c_roff(color[n], vp[n]);
1137             }
1138 #else
1139             if (n == 0)
1140                 hooked_roff(" can ");
1141             else if (n < vn - 1)
1142                 hooked_roff(", ");
1143             else
1144                 hooked_roff(" and ");
1145
1146             hook_c_roff(color[n], vp[n]);
1147 #endif
1148         }
1149
1150         hooked_roff(_("ことができる。", ".  "));
1151     }
1152
1153     if (lore_ptr->flags7 & RF7_AQUATIC) {
1154         hooked_roff(format(_("%^sは水中に棲んでいる。", "%^s lives in water.  "), wd_he[lore_ptr->msex]));
1155     }
1156
1157     if (lore_ptr->flags7 & (RF7_SELF_LITE_1 | RF7_SELF_LITE_2)) {
1158         hooked_roff(format(_("%^sは光っている。", "%^s is shining.  "), wd_he[lore_ptr->msex]));
1159     }
1160
1161     if (lore_ptr->flags7 & (RF7_SELF_DARK_1 | RF7_SELF_DARK_2)) {
1162         hook_c_roff(TERM_L_DARK, format(_("%^sは暗黒に包まれている。", "%^s is surrounded by darkness.  "), wd_he[lore_ptr->msex]));
1163     }
1164
1165     if (lore_ptr->flags2 & RF2_INVISIBLE) {
1166         hooked_roff(format(_("%^sは透明で目に見えない。", "%^s is invisible.  "), wd_he[lore_ptr->msex]));
1167     }
1168
1169     if (lore_ptr->flags2 & RF2_COLD_BLOOD) {
1170         hooked_roff(format(_("%^sは冷血動物である。", "%^s is cold blooded.  "), wd_he[lore_ptr->msex]));
1171     }
1172
1173     if (lore_ptr->flags2 & RF2_EMPTY_MIND) {
1174         hooked_roff(format(_("%^sはテレパシーでは感知できない。", "%^s is not detected by telepathy.  "), wd_he[lore_ptr->msex]));
1175     } else if (lore_ptr->flags2 & RF2_WEIRD_MIND) {
1176         hooked_roff(format(_("%^sはまれにテレパシーで感知できる。", "%^s is rarely detected by telepathy.  "), wd_he[lore_ptr->msex]));
1177     }
1178
1179     if (lore_ptr->flags2 & RF2_MULTIPLY) {
1180         hook_c_roff(TERM_L_UMBER, format(_("%^sは爆発的に増殖する。", "%^s breeds explosively.  "), wd_he[lore_ptr->msex]));
1181     }
1182
1183     if (lore_ptr->flags2 & RF2_REGENERATE) {
1184         hook_c_roff(TERM_L_WHITE, format(_("%^sは素早く体力を回復する。", "%^s regenerates quickly.  "), wd_he[lore_ptr->msex]));
1185     }
1186
1187     if (lore_ptr->flags7 & RF7_RIDING) {
1188         hook_c_roff(TERM_SLATE, format(_("%^sに乗ることができる。", "%^s is suitable for riding.  "), wd_he[lore_ptr->msex]));
1189     }
1190
1191     vn = 0;
1192     if (lore_ptr->flags3 & RF3_HURT_ROCK) {
1193         vp[vn] = _("岩を除去するもの", "rock remover");
1194         color[vn++] = TERM_UMBER;
1195     }
1196     if (lore_ptr->flags3 & RF3_HURT_LITE) {
1197         vp[vn] = _("明るい光", "bright light");
1198         color[vn++] = TERM_YELLOW;
1199     }
1200     if (lore_ptr->flags3 & RF3_HURT_FIRE) {
1201         vp[vn] = _("炎", "fire");
1202         color[vn++] = TERM_RED;
1203     }
1204     if (lore_ptr->flags3 & RF3_HURT_COLD) {
1205         vp[vn] = _("冷気", "cold");
1206         color[vn++] = TERM_L_WHITE;
1207     }
1208
1209     if (vn > 0) {
1210         hooked_roff(format(_("%^sには", "%^s"), wd_he[lore_ptr->msex]));
1211
1212         for (int n = 0; n < vn; n++) {
1213 #ifdef JP
1214             if (n != 0)
1215                 hooked_roff("や");
1216 #else
1217             if (n == 0)
1218                 hooked_roff(" is hurt by ");
1219             else if (n < vn - 1)
1220                 hooked_roff(", ");
1221             else
1222                 hooked_roff(" and ");
1223 #endif
1224             hook_c_roff(color[n], vp[n]);
1225         }
1226
1227         hooked_roff(_("でダメージを与えられる。", ".  "));
1228     }
1229
1230     vn = 0;
1231     if (lore_ptr->flagsr & RFR_IM_ACID) {
1232         vp[vn] = _("酸", "acid");
1233         color[vn++] = TERM_GREEN;
1234     }
1235     if (lore_ptr->flagsr & RFR_IM_ELEC) {
1236         vp[vn] = _("稲妻", "lightning");
1237         color[vn++] = TERM_BLUE;
1238     }
1239     if (lore_ptr->flagsr & RFR_IM_FIRE) {
1240         vp[vn] = _("炎", "fire");
1241         color[vn++] = TERM_RED;
1242     }
1243     if (lore_ptr->flagsr & RFR_IM_COLD) {
1244         vp[vn] = _("冷気", "cold");
1245         color[vn++] = TERM_L_WHITE;
1246     }
1247     if (lore_ptr->flagsr & RFR_IM_POIS) {
1248         vp[vn] = _("毒", "poison");
1249         color[vn++] = TERM_L_GREEN;
1250     }
1251
1252     if (lore_ptr->flagsr & RFR_RES_LITE) {
1253         vp[vn] = _("閃光", "light");
1254         color[vn++] = TERM_YELLOW;
1255     }
1256     if (lore_ptr->flagsr & RFR_RES_DARK) {
1257         vp[vn] = _("暗黒", "dark");
1258         color[vn++] = TERM_L_DARK;
1259     }
1260     if (lore_ptr->flagsr & RFR_RES_NETH) {
1261         vp[vn] = _("地獄", "nether");
1262         color[vn++] = TERM_L_DARK;
1263     }
1264     if (lore_ptr->flagsr & RFR_RES_WATE) {
1265         vp[vn] = _("水", "water");
1266         color[vn++] = TERM_BLUE;
1267     }
1268     if (lore_ptr->flagsr & RFR_RES_PLAS) {
1269         vp[vn] = _("プラズマ", "plasma");
1270         color[vn++] = TERM_L_RED;
1271     }
1272     if (lore_ptr->flagsr & RFR_RES_SHAR) {
1273         vp[vn] = _("破片", "shards");
1274         color[vn++] = TERM_L_UMBER;
1275     }
1276     if (lore_ptr->flagsr & RFR_RES_SOUN) {
1277         vp[vn] = _("轟音", "sound");
1278         color[vn++] = TERM_ORANGE;
1279     }
1280     if (lore_ptr->flagsr & RFR_RES_CHAO) {
1281         vp[vn] = _("カオス", "chaos");
1282         color[vn++] = TERM_VIOLET;
1283     }
1284     if (lore_ptr->flagsr & RFR_RES_NEXU) {
1285         vp[vn] = _("因果混乱", "nexus");
1286         color[vn++] = TERM_VIOLET;
1287     }
1288     if (lore_ptr->flagsr & RFR_RES_DISE) {
1289         vp[vn] = _("劣化", "disenchantment");
1290         color[vn++] = TERM_VIOLET;
1291     }
1292     if (lore_ptr->flagsr & RFR_RES_WALL) {
1293         vp[vn] = _("フォース", "force");
1294         color[vn++] = TERM_UMBER;
1295     }
1296     if (lore_ptr->flagsr & RFR_RES_INER) {
1297         vp[vn] = _("遅鈍", "inertia");
1298         color[vn++] = TERM_SLATE;
1299     }
1300     if (lore_ptr->flagsr & RFR_RES_TIME) {
1301         vp[vn] = _("時間逆転", "time");
1302         color[vn++] = TERM_L_BLUE;
1303     }
1304     if (lore_ptr->flagsr & RFR_RES_GRAV) {
1305         vp[vn] = _("重力", "gravity");
1306         color[vn++] = TERM_SLATE;
1307     }
1308     if (lore_ptr->flagsr & RFR_RES_ALL) {
1309         vp[vn] = _("あらゆる攻撃", "all");
1310         color[vn++] = TERM_YELLOW;
1311     }
1312     if ((lore_ptr->flagsr & RFR_RES_TELE) && !(lore_ptr->r_ptr->flags1 & RF1_UNIQUE)) {
1313         vp[vn] = _("テレポート", "teleportation");
1314         color[vn++] = TERM_ORANGE;
1315     }
1316
1317     if (vn > 0) {
1318         hooked_roff(format(_("%^sは", "%^s"), wd_he[lore_ptr->msex]));
1319         for (int n = 0; n < vn; n++) {
1320 #ifdef JP
1321             if (n != 0)
1322                 hooked_roff("と");
1323 #else
1324             if (n == 0)
1325                 hooked_roff(" resists ");
1326             else if (n < vn - 1)
1327                 hooked_roff(", ");
1328             else
1329                 hooked_roff(" and ");
1330 #endif
1331             hook_c_roff(color[n], vp[n]);
1332         }
1333
1334         hooked_roff(_("の耐性を持っている。", ".  "));
1335     }
1336
1337     if ((lore_ptr->r_ptr->r_xtra1 & MR1_SINKA) || lore_ptr->know_everything) {
1338         if (lore_ptr->r_ptr->next_r_idx) {
1339             hooked_roff(format(_("%^sは経験を積むと、", "%^s will evolve into "), wd_he[lore_ptr->msex]));
1340             hook_c_roff(TERM_YELLOW, format("%s", r_name + r_info[lore_ptr->r_ptr->next_r_idx].name));
1341
1342             hooked_roff(_(format("に進化する。"), format(" when %s gets enough experience.  ", wd_he[lore_ptr->msex])));
1343         } else if (!(lore_ptr->r_ptr->flags1 & RF1_UNIQUE)) {
1344             hooked_roff(format(_("%sは進化しない。", "%s won't evolve.  "), wd_he[lore_ptr->msex]));
1345         }
1346     }
1347
1348     vn = 0;
1349     if (lore_ptr->flags3 & RF3_NO_STUN) {
1350         vp[vn] = _("朦朧としない", "stunned");
1351         color[vn++] = TERM_ORANGE;
1352     }
1353     if (lore_ptr->flags3 & RF3_NO_FEAR) {
1354         vp[vn] = _("恐怖を感じない", "frightened");
1355         color[vn++] = TERM_SLATE;
1356     }
1357     if (lore_ptr->flags3 & RF3_NO_CONF) {
1358         vp[vn] = _("混乱しない", "confused");
1359         color[vn++] = TERM_L_UMBER;
1360     }
1361     if (lore_ptr->flags3 & RF3_NO_SLEEP) {
1362         vp[vn] = _("眠らされない", "slept");
1363         color[vn++] = TERM_BLUE;
1364     }
1365     if ((lore_ptr->flagsr & RFR_RES_TELE) && (lore_ptr->r_ptr->flags1 & RF1_UNIQUE)) {
1366         vp[vn] = _("テレポートされない", "teleported");
1367         color[vn++] = TERM_ORANGE;
1368     }
1369
1370     if (vn > 0) {
1371         hooked_roff(format(_("%^sは", "%^s"), wd_he[lore_ptr->msex]));
1372         for (int n = 0; n < vn; n++) {
1373 #ifdef JP
1374             if (n != 0)
1375                 hooked_roff("し、");
1376 #else
1377             if (n == 0)
1378                 hooked_roff(" cannot be ");
1379             else if (n < vn - 1)
1380                 hooked_roff(", ");
1381             else
1382                 hooked_roff(" or ");
1383 #endif
1384             hook_c_roff(color[n], vp[n]);
1385         }
1386
1387         hooked_roff(_("。", ".  "));
1388     }
1389
1390     if ((((int)lore_ptr->r_ptr->r_wake * (int)lore_ptr->r_ptr->r_wake) > lore_ptr->r_ptr->sleep) || (lore_ptr->r_ptr->r_ignore == MAX_UCHAR)
1391         || (lore_ptr->r_ptr->sleep == 0 && lore_ptr->r_ptr->r_tkills >= 10) || lore_ptr->know_everything) {
1392         concptr act;
1393         if (lore_ptr->r_ptr->sleep > 200) {
1394             act = _("を無視しがちであるが", "prefers to ignore");
1395         } else if (lore_ptr->r_ptr->sleep > 95) {
1396             act = _("に対してほとんど注意を払わないが", "pays very little attention to");
1397         } else if (lore_ptr->r_ptr->sleep > 75) {
1398             act = _("に対してあまり注意を払わないが", "pays little attention to");
1399         } else if (lore_ptr->r_ptr->sleep > 45) {
1400             act = _("を見過ごしがちであるが", "tends to overlook");
1401         } else if (lore_ptr->r_ptr->sleep > 25) {
1402             act = _("をほんの少しは見ており", "takes quite a while to see");
1403         } else if (lore_ptr->r_ptr->sleep > 10) {
1404             act = _("をしばらくは見ており", "takes a while to see");
1405         } else if (lore_ptr->r_ptr->sleep > 5) {
1406             act = _("を幾分注意深く見ており", "is fairly observant of");
1407         } else if (lore_ptr->r_ptr->sleep > 3) {
1408             act = _("を注意深く見ており", "is observant of");
1409         } else if (lore_ptr->r_ptr->sleep > 1) {
1410             act = _("をかなり注意深く見ており", "is very observant of");
1411         } else if (lore_ptr->r_ptr->sleep > 0) {
1412             act = _("を警戒しており", "is vigilant for");
1413         } else {
1414             act = _("をかなり警戒しており", "is ever vigilant for");
1415         }
1416
1417         hooked_roff(_(format("%^sは侵入者%s、 %d フィート先から侵入者に気付くことがある。", wd_he[lore_ptr->msex], act, 10 * lore_ptr->r_ptr->aaf),
1418             format("%^s %s intruders, which %s may notice from %d feet.  ", wd_he[lore_ptr->msex], act, wd_he[lore_ptr->msex], 10 * lore_ptr->r_ptr->aaf)));
1419     }
1420
1421     if (lore_ptr->drop_gold || lore_ptr->drop_item) {
1422         hooked_roff(format(_("%^sは", "%^s may carry"), wd_he[lore_ptr->msex]));
1423 #ifdef JP
1424 #else
1425         lore_ptr->sin = FALSE;
1426 #endif
1427
1428         int n = MAX(lore_ptr->drop_gold, lore_ptr->drop_item);
1429         if (n == 1) {
1430             hooked_roff(_("一つの", " a"));
1431 #ifdef JP
1432 #else
1433             lore_ptr->sin = TRUE;
1434 #endif
1435         } else if (n == 2) {
1436             hooked_roff(_("一つか二つの", " one or two"));
1437         } else {
1438             hooked_roff(format(_(" %d 個までの", " up to %d"), n));
1439         }
1440
1441         concptr p;
1442         if (lore_ptr->flags1 & RF1_DROP_GREAT) {
1443             p = _("特別な", " exceptional");
1444         } else if (lore_ptr->flags1 & RF1_DROP_GOOD) {
1445             p = _("上質な", " good");
1446 #ifdef JP
1447 #else
1448             lore_ptr->sin = FALSE;
1449 #endif
1450         } else {
1451             p = NULL;
1452         }
1453
1454         if (lore_ptr->drop_item) {
1455 #ifdef JP
1456 #else
1457             if (lore_ptr->sin)
1458                 hooked_roff("n");
1459
1460             lore_ptr->sin = FALSE;
1461 #endif
1462             if (p)
1463                 hooked_roff(p);
1464             hooked_roff(_("アイテム", " object"));
1465 #ifdef JP
1466 #else
1467             if (n != 1)
1468                 hooked_roff("s");
1469 #endif
1470             p = _("や", " or");
1471         }
1472
1473         if (lore_ptr->drop_gold) {
1474 #ifdef JP
1475 #else
1476             if (!p)
1477                 lore_ptr->sin = FALSE;
1478
1479             if (lore_ptr->sin)
1480                 hooked_roff("n");
1481
1482             lore_ptr->sin = FALSE;
1483 #endif
1484             if (p)
1485                 hooked_roff(p);
1486             hooked_roff(_("財宝", " treasure"));
1487 #ifdef JP
1488 #else
1489             if (n != 1)
1490                 hooked_roff("s");
1491 #endif
1492         }
1493
1494         hooked_roff(_("を持っていることがある。", ".  "));
1495     }
1496
1497     const int max_attack_numbers = 4;
1498     int count = 0;
1499     for (int m = 0; m < max_attack_numbers; m++) {
1500         if (!lore_ptr->r_ptr->blow[m].method)
1501             continue;
1502         if (lore_ptr->r_ptr->blow[m].method == RBM_SHOOT)
1503             continue;
1504
1505         if (lore_ptr->r_ptr->r_blows[m] || lore_ptr->know_everything)
1506             count++;
1507     }
1508
1509     int attack_numbers = 0;
1510     for (int m = 0; m < max_attack_numbers; m++) {
1511         if (!lore_ptr->r_ptr->blow[m].method)
1512             continue;
1513         if (lore_ptr->r_ptr->blow[m].method == RBM_SHOOT)
1514             continue;
1515         if (!lore_ptr->r_ptr->r_blows[m] && !lore_ptr->know_everything)
1516             continue;
1517
1518         rbm_type method = lore_ptr->r_ptr->blow[m].method;
1519         int effect = lore_ptr->r_ptr->blow[m].effect;
1520         int d1 = lore_ptr->r_ptr->blow[m].d_dice;
1521         int d2 = lore_ptr->r_ptr->blow[m].d_side;
1522
1523         concptr p = NULL;
1524         switch (method) {
1525         case RBM_HIT:
1526             p = _("殴る", "hit");
1527             break;
1528         case RBM_TOUCH:
1529             p = _("触る", "touch");
1530             break;
1531         case RBM_PUNCH:
1532             p = _("パンチする", "punch");
1533             break;
1534         case RBM_KICK:
1535             p = _("蹴る", "kick");
1536             break;
1537         case RBM_CLAW:
1538             p = _("ひっかく", "claw");
1539             break;
1540         case RBM_BITE:
1541             p = _("噛む", "bite");
1542             break;
1543         case RBM_STING:
1544             p = _("刺す", "sting");
1545             break;
1546         case RBM_SLASH:
1547             p = _("斬る", "slash");
1548             break;
1549         case RBM_BUTT:
1550             p = _("角で突く", "butt");
1551             break;
1552         case RBM_CRUSH:
1553             p = _("体当たりする", "crush");
1554             break;
1555         case RBM_ENGULF:
1556             p = _("飲み込む", "engulf");
1557             break;
1558         case RBM_CHARGE:
1559             p = _("請求書をよこす", "charge");
1560             break;
1561         case RBM_CRAWL:
1562             p = _("体の上を這い回る", "crawl on you");
1563             break;
1564         case RBM_DROOL:
1565             p = _("よだれをたらす", "drool on you");
1566             break;
1567         case RBM_SPIT:
1568             p = _("つばを吐く", "spit");
1569             break;
1570         case RBM_EXPLODE:
1571             p = _("爆発する", "explode");
1572             break;
1573         case RBM_GAZE:
1574             p = _("にらむ", "gaze");
1575             break;
1576         case RBM_WAIL:
1577             p = _("泣き叫ぶ", "wail");
1578             break;
1579         case RBM_SPORE:
1580             p = _("胞子を飛ばす", "release spores");
1581             break;
1582         case RBM_XXX4:
1583             break;
1584         case RBM_BEG:
1585             p = _("金をせがむ", "beg");
1586             break;
1587         case RBM_INSULT:
1588             p = _("侮辱する", "insult");
1589             break;
1590         case RBM_MOAN:
1591             p = _("うめく", "moan");
1592             break;
1593         case RBM_SHOW:
1594             p = _("歌う", "sing");
1595             break;
1596         }
1597
1598         concptr q = NULL;
1599         switch (effect) {
1600         case RBE_SUPERHURT:
1601             q = _("強力に攻撃する", "slaughter");
1602             break;
1603         case RBE_HURT:
1604             q = _("攻撃する", "attack");
1605             break;
1606         case RBE_POISON:
1607             q = _("毒をくらわす", "poison");
1608             break;
1609         case RBE_UN_BONUS:
1610             q = _("劣化させる", "disenchant");
1611             break;
1612         case RBE_UN_POWER:
1613             q = _("充填魔力を吸収する", "drain charges");
1614             break;
1615         case RBE_EAT_GOLD:
1616             q = _("金を盗む", "steal gold");
1617             break;
1618         case RBE_EAT_ITEM:
1619             q = _("アイテムを盗む", "steal items");
1620             break;
1621         case RBE_EAT_FOOD:
1622             q = _("あなたの食料を食べる", "eat your food");
1623             break;
1624         case RBE_EAT_LITE:
1625             q = _("明かりを吸収する", "absorb light");
1626             break;
1627         case RBE_ACID:
1628             q = _("酸を飛ばす", "shoot acid");
1629             break;
1630         case RBE_ELEC:
1631             q = _("感電させる", "electrocute");
1632             break;
1633         case RBE_FIRE:
1634             q = _("燃やす", "burn");
1635             break;
1636         case RBE_COLD:
1637             q = _("凍らせる", "freeze");
1638             break;
1639         case RBE_BLIND:
1640             q = _("盲目にする", "blind");
1641             break;
1642         case RBE_CONFUSE:
1643             q = _("混乱させる", "confuse");
1644             break;
1645         case RBE_TERRIFY:
1646             q = _("恐怖させる", "terrify");
1647             break;
1648         case RBE_PARALYZE:
1649             q = _("麻痺させる", "paralyze");
1650             break;
1651         case RBE_LOSE_STR:
1652             q = _("腕力を減少させる", "reduce strength");
1653             break;
1654         case RBE_LOSE_INT:
1655             q = _("知能を減少させる", "reduce intelligence");
1656             break;
1657         case RBE_LOSE_WIS:
1658             q = _("賢さを減少させる", "reduce wisdom");
1659             break;
1660         case RBE_LOSE_DEX:
1661             q = _("器用さを減少させる", "reduce dexterity");
1662             break;
1663         case RBE_LOSE_CON:
1664             q = _("耐久力を減少させる", "reduce constitution");
1665             break;
1666         case RBE_LOSE_CHR:
1667             q = _("魅力を減少させる", "reduce charisma");
1668             break;
1669         case RBE_LOSE_ALL:
1670             q = _("全ステータスを減少させる", "reduce all stats");
1671             break;
1672         case RBE_SHATTER:
1673             q = _("粉砕する", "shatter");
1674             break;
1675         case RBE_EXP_10:
1676             q = _("経験値を減少(10d6+)させる", "lower experience (by 10d6+)");
1677             break;
1678         case RBE_EXP_20:
1679             q = _("経験値を減少(20d6+)させる", "lower experience (by 20d6+)");
1680             break;
1681         case RBE_EXP_40:
1682             q = _("経験値を減少(40d6+)させる", "lower experience (by 40d6+)");
1683             break;
1684         case RBE_EXP_80:
1685             q = _("経験値を減少(80d6+)させる", "lower experience (by 80d6+)");
1686             break;
1687         case RBE_DISEASE:
1688             q = _("病気にする", "disease");
1689             break;
1690         case RBE_TIME:
1691             q = _("時間を逆戻りさせる", "time");
1692             break;
1693         case RBE_DR_LIFE:
1694             q = _("生命力を吸収する", "drain life");
1695             break;
1696         case RBE_DR_MANA:
1697             q = _("魔力を奪う", "drain mana force");
1698             break;
1699         case RBE_INERTIA:
1700             q = _("減速させる", "slow");
1701             break;
1702         case RBE_STUN:
1703             q = _("朦朧とさせる", "stun");
1704             break;
1705         }
1706
1707 #ifdef JP
1708         if (attack_numbers == 0) {
1709             hooked_roff(format("%^sは", wd_he[lore_ptr->msex]));
1710         }
1711
1712         if (d1 && d2 && (lore_ptr->know_everything || know_damage(r_idx, m))) {
1713             hooked_roff(format(" %dd%d ", d1, d2));
1714             hooked_roff("のダメージで");
1715         }
1716
1717         if (!p)
1718             p = "何か奇妙なことをする";
1719
1720         /* XXしてYYし/XXしてYYする/XXし/XXする */
1721         if (q != NULL)
1722             jverb(p, lore_ptr->jverb_buf, JVERB_TO);
1723         else if (attack_numbers != count - 1)
1724             jverb(p, lore_ptr->jverb_buf, JVERB_AND);
1725         else
1726             strcpy(lore_ptr->jverb_buf, p);
1727
1728         hooked_roff(lore_ptr->jverb_buf);
1729         if (q) {
1730             if (attack_numbers != count - 1)
1731                 jverb(q, lore_ptr->jverb_buf, JVERB_AND);
1732             else
1733                 strcpy(lore_ptr->jverb_buf, q);
1734             hooked_roff(lore_ptr->jverb_buf);
1735         }
1736
1737         if (attack_numbers != count - 1)
1738             hooked_roff("、");
1739 #else
1740         if (attack_numbers == 0) {
1741             hooked_roff(format("%^s can ", wd_he[lore_ptr->msex]));
1742         } else if (attack_numbers < count - 1) {
1743             hooked_roff(", ");
1744         } else {
1745             hooked_roff(", and ");
1746         }
1747
1748         if (!p)
1749             p = "do something weird";
1750         hooked_roff(p);
1751         if (q) {
1752             hooked_roff(" to ");
1753             hooked_roff(q);
1754             if (d1 && d2 && (lore_ptr->know_everything || know_damage(r_idx, m))) {
1755                 hooked_roff(" with damage");
1756                 hooked_roff(format(" %dd%d", d1, d2));
1757             }
1758         }
1759 #endif
1760
1761         attack_numbers++;
1762     }
1763
1764     if (attack_numbers > 0) {
1765         hooked_roff(_("。", ".  "));
1766     } else if (lore_ptr->flags1 & RF1_NEVER_BLOW) {
1767         hooked_roff(format(_("%^sは物理的な攻撃方法を持たない。", "%^s has no physical attacks.  "), wd_he[lore_ptr->msex]));
1768     } else {
1769         hooked_roff(format(_("%s攻撃については何も知らない。", "Nothing is known about %s attack.  "), wd_his[lore_ptr->msex]));
1770     }
1771
1772     bool is_kingpin = (lore_ptr->flags1 & RF1_QUESTOR) != 0;
1773     is_kingpin &= lore_ptr->r_ptr->r_sights > 0;
1774     is_kingpin &= lore_ptr->r_ptr->max_num > 0;
1775     is_kingpin &= (r_idx == MON_OBERON) || (r_idx == MON_SERPENT);
1776     if (is_kingpin) {
1777         hook_c_roff(TERM_VIOLET, _("あなたはこのモンスターを殺したいという強い欲望を感じている...", "You feel an intense desire to kill this monster...  "));
1778     } else if (lore_ptr->flags7 & RF7_GUARDIAN) {
1779         hook_c_roff(TERM_L_RED, _("このモンスターはダンジョンの主である。", "This monster is the master of a dungeon."));
1780     }
1781
1782     hooked_roff("\n");
1783 }