OSDN Git Service

6850a87675ff807898dbe143d7b6763c8536ca00
[hengband/hengband.git] / src / view / display-lore.c
1 /*!
2  * @brief モンスターの思い出を表示する処理
3  * @date 2020/06/09
4  * @author Hourier
5  */
6
7 #include "view/display-lore.h"
8 #include "game-option/text-display-options.h"
9 #include "locale/english.h"
10 #include "locale/japanese.h"
11 #include "lore/lore-calculator.h"
12 #include "lore/monster-lore.h"
13 #include "monster-race/race-flags1.h"
14 #include "monster-race/race-flags2.h"
15 #include "monster-race/race-flags3.h"
16 #include "monster-race/race-flags4.h"
17 #include "monster-race/race-flags7.h"
18 #include "monster-race/race-indice-types.h"
19 #include "mspell/mspell-type.h"
20 #include "term/screen-processor.h"
21 #include "term/term-color-types.h"
22 #include "view/display-messages.h"
23 #include "world/world.h"
24
25 /*!
26  * 英語の複数系記述用マクロ / Pluralizer.  Args(count, singular, plural)
27  */
28 #define plural(c, s, p) (((c) == 1) ? (s) : (p))
29
30 /*!
31  * @brief モンスター情報のヘッダを記述する
32  * Hack -- Display the "name" and "attr/chars" of a monster race
33  * @param r_idx モンスターの種族ID
34  * @return なし
35  */
36 void roff_top(MONRACE_IDX r_idx)
37 {
38     monster_race *r_ptr = &r_info[r_idx];
39     char c1 = r_ptr->d_char;
40     char c2 = r_ptr->x_char;
41
42     TERM_COLOR a1 = r_ptr->d_attr;
43     TERM_COLOR a2 = r_ptr->x_attr;
44
45     Term_erase(0, 0, 255);
46     Term_gotoxy(0, 0);
47
48 #ifdef JP
49 #else
50     if (!(r_ptr->flags1 & RF1_UNIQUE)) {
51         Term_addstr(-1, TERM_WHITE, "The ");
52     }
53 #endif
54
55     Term_addstr(-1, TERM_WHITE, (r_name + r_ptr->name));
56
57     Term_addstr(-1, TERM_WHITE, " ('");
58     Term_add_bigch(a1, c1);
59     Term_addstr(-1, TERM_WHITE, "')");
60
61     Term_addstr(-1, TERM_WHITE, "/('");
62     Term_add_bigch(a2, c2);
63     Term_addstr(-1, TERM_WHITE, "'):");
64
65     if (!current_world_ptr->wizard)
66         return;
67
68     char buf[16];
69     sprintf(buf, "%d", r_idx);
70     Term_addstr(-1, TERM_WHITE, " (");
71     Term_addstr(-1, TERM_L_BLUE, buf);
72     Term_addch(TERM_WHITE, ')');
73 }
74
75 /*!
76  * @brief  モンスター情報の表示と共に画面を一時消去するサブルーチン /
77  * Hack -- describe the given monster race at the top of the screen
78  * @param r_idx モンスターの種族ID
79  * @param mode 表示オプション
80  * @return なし
81  */
82 void screen_roff(player_type *player_ptr, MONRACE_IDX r_idx, BIT_FLAGS mode)
83 {
84     msg_erase();
85     Term_erase(0, 1, 255);
86     hook_c_roff = c_roff;
87     process_monster_lore(player_ptr, r_idx, mode);
88     roff_top(r_idx);
89 }
90
91 /*!
92  * @brief モンスター情報の現在のウィンドウに表示する /
93  * Hack -- describe the given monster race in the current "term" window
94  * @param r_idx モンスターの種族ID
95  * @return なし
96  */
97 void display_roff(player_type *player_ptr)
98 {
99     for (int y = 0; y < Term->hgt; y++) {
100         Term_erase(0, y, 255);
101     }
102
103     Term_gotoxy(0, 1);
104     hook_c_roff = c_roff;
105     MONRACE_IDX r_idx = player_ptr->monster_race_idx;
106     process_monster_lore(player_ptr, r_idx, 0);
107     roff_top(r_idx);
108 }
109
110 /*!
111  * @brief モンスター詳細情報を自動スポイラー向けに出力する /
112  * Hack -- output description of the given monster race
113  * @param r_idx モンスターの種族ID
114  * @param roff_func 出力処理を行う関数ポインタ
115  * @return なし
116  */
117 void output_monster_spoiler(player_type *player_ptr, MONRACE_IDX r_idx, void (*roff_func)(TERM_COLOR attr, concptr str))
118 {
119     hook_c_roff = roff_func;
120     process_monster_lore(player_ptr, r_idx, 0x03);
121 }
122
123 static bool display_kill_unique(lore_type *lore_ptr)
124 {
125     if ((lore_ptr->flags1 & RF1_UNIQUE) == 0)
126         return FALSE;
127
128     bool dead = (lore_ptr->r_ptr->max_num == 0);
129     if (lore_ptr->r_ptr->r_deaths) {
130         hooked_roff(format(_("%^sはあなたの先祖を %d 人葬っている", "%^s has slain %d of your ancestors"), wd_he[lore_ptr->msex], lore_ptr->r_ptr->r_deaths));
131
132         if (dead) {
133             hooked_roff(
134                 _(format("が、すでに仇討ちは果たしている!"), format(", but you have avenged %s!  ", plural(lore_ptr->r_ptr->r_deaths, "him", "them"))));
135         } else {
136             hooked_roff(
137                 _(format("のに、まだ仇討ちを果たしていない。"), format(", who %s unavenged.  ", plural(lore_ptr->r_ptr->r_deaths, "remains", "remain"))));
138         }
139
140         hooked_roff("\n");
141     } else if (dead) {
142         hooked_roff(_("あなたはこの仇敵をすでに葬り去っている。", "You have slain this foe.  "));
143         hooked_roff("\n");
144     }
145
146     return TRUE;
147 }
148
149 static bool display_killed(lore_type *lore_ptr)
150 {
151     if (lore_ptr->r_ptr->r_deaths == 0)
152         return FALSE;
153
154     hooked_roff(_(format("このモンスターはあなたの先祖を %d 人葬っている", lore_ptr->r_ptr->r_deaths),
155         format("%d of your ancestors %s been killed by this creature, ", lore_ptr->r_ptr->r_deaths, plural(lore_ptr->r_ptr->r_deaths, "has", "have"))));
156
157     if (lore_ptr->r_ptr->r_pkills) {
158         hooked_roff(format(_("が、あなたはこのモンスターを少なくとも %d 体は倒している。", "and you have exterminated at least %d of the creatures.  "),
159             lore_ptr->r_ptr->r_pkills));
160     } else if (lore_ptr->r_ptr->r_tkills) {
161         hooked_roff(format(
162             _("が、あなたの先祖はこのモンスターを少なくとも %d 体は倒している。", "and your ancestors have exterminated at least %d of the creatures.  "),
163             lore_ptr->r_ptr->r_tkills));
164     } else {
165         hooked_roff(format(_("が、まだ%sを倒したことはない。", "and %s is not ever known to have been defeated.  "), wd_he[lore_ptr->msex]));
166     }
167
168     hooked_roff("\n");
169     return TRUE;
170 }
171
172 void display_kill_numbers(lore_type *lore_ptr)
173 {
174     if ((lore_ptr->mode & 0x02) != 0)
175         return;
176
177     if (display_kill_unique(lore_ptr))
178         return;
179
180     if (display_killed(lore_ptr))
181         return;
182
183     if (lore_ptr->r_ptr->r_pkills) {
184         hooked_roff(format(
185             _("あなたはこのモンスターを少なくとも %d 体は殺している。", "You have killed at least %d of these creatures.  "), lore_ptr->r_ptr->r_pkills));
186     } else if (lore_ptr->r_ptr->r_tkills) {
187         hooked_roff(format(_("あなたの先祖はこのモンスターを少なくとも %d 体は殺している。", "Your ancestors have killed at least %d of these creatures.  "),
188             lore_ptr->r_ptr->r_tkills));
189     } else {
190         hooked_roff(_("このモンスターを倒したことはない。", "No battles to the death are recalled.  "));
191     }
192
193     hooked_roff("\n");
194 }
195
196 /*!
197  * @brief どこに出没するかを表示する
198  * @param lore_ptr モンスターの思い出構造体への参照ポインタ
199  * @return たぬきならFALSE、それ以外はTRUE
200  */
201 bool display_where_to_appear(lore_type *lore_ptr)
202 {
203     lore_ptr->old = FALSE;
204     if (lore_ptr->r_ptr->level == 0) {
205         hooked_roff(format(_("%^sは町に住み", "%^s lives in the town"), wd_he[lore_ptr->msex]));
206         lore_ptr->old = TRUE;
207     } else if (lore_ptr->r_ptr->r_tkills || lore_ptr->know_everything) {
208         if (depth_in_feet) {
209             hooked_roff(format(
210                 _("%^sは通常地下 %d フィートで出現し", "%^s is normally found at depths of %d feet"), wd_he[lore_ptr->msex], lore_ptr->r_ptr->level * 50));
211         } else {
212             hooked_roff(format(_("%^sは通常地下 %d 階で出現し", "%^s is normally found on dungeon level %d"), wd_he[lore_ptr->msex], lore_ptr->r_ptr->level));
213         }
214
215         lore_ptr->old = TRUE;
216     }
217
218     if (lore_ptr->r_idx == MON_CHAMELEON) {
219         hooked_roff(_("、他のモンスターに化ける。", "and can take the shape of other monster."));
220         return FALSE;
221     }
222
223     if (lore_ptr->old) {
224         hooked_roff(_("、", ", and "));
225     } else {
226         hooked_roff(format(_("%^sは", "%^s "), wd_he[lore_ptr->msex]));
227         lore_ptr->old = TRUE;
228     }
229
230     return TRUE;
231 }
232
233 void display_monster_move(lore_type *lore_ptr)
234 {
235 #ifdef JP
236 #else
237     hooked_roff("moves");
238 #endif
239
240     display_random_move(lore_ptr);
241     if (lore_ptr->speed > 110) {
242         if (lore_ptr->speed > 139)
243             hook_c_roff(TERM_RED, _("信じ難いほど", " incredibly"));
244         else if (lore_ptr->speed > 134)
245             hook_c_roff(TERM_ORANGE, _("猛烈に", " extremely"));
246         else if (lore_ptr->speed > 129)
247             hook_c_roff(TERM_ORANGE, _("非常に", " very"));
248         else if (lore_ptr->speed > 124)
249             hook_c_roff(TERM_UMBER, _("かなり", " fairly"));
250         else if (lore_ptr->speed < 120)
251             hook_c_roff(TERM_L_UMBER, _("やや", " somewhat"));
252         hook_c_roff(TERM_L_RED, _("素早く", " quickly"));
253     } else if (lore_ptr->speed < 110) {
254         if (lore_ptr->speed < 90)
255             hook_c_roff(TERM_L_GREEN, _("信じ難いほど", " incredibly"));
256         else if (lore_ptr->speed < 95)
257             hook_c_roff(TERM_BLUE, _("非常に", " very"));
258         else if (lore_ptr->speed < 100)
259             hook_c_roff(TERM_BLUE, _("かなり", " fairly"));
260         else if (lore_ptr->speed > 104)
261             hook_c_roff(TERM_GREEN, _("やや", " somewhat"));
262         hook_c_roff(TERM_L_BLUE, _("ゆっくりと", " slowly"));
263     } else {
264         hooked_roff(_("普通の速さで", " at normal speed"));
265     }
266
267 #ifdef JP
268     hooked_roff("動いている");
269 #endif
270 }
271
272 void display_random_move(lore_type *lore_ptr)
273 {
274     if (((lore_ptr->flags1 & RF1_RAND_50) == 0) && ((lore_ptr->flags1 & RF1_RAND_25) == 0))
275         return;
276
277     if ((lore_ptr->flags1 & RF1_RAND_50) && (lore_ptr->flags1 & RF1_RAND_25)) {
278         hooked_roff(_("かなり", " extremely"));
279     } else if (lore_ptr->flags1 & RF1_RAND_50) {
280         hooked_roff(_("幾分", " somewhat"));
281     } else if (lore_ptr->flags1 & RF1_RAND_25) {
282         hooked_roff(_("少々", " a bit"));
283     }
284
285     hooked_roff(_("不規則に", " erratically"));
286     if (lore_ptr->speed != 110)
287         hooked_roff(_("、かつ", ", and"));
288 }
289
290 void display_monster_never_move(lore_type *lore_ptr)
291 {
292     if ((lore_ptr->flags1 & RF1_NEVER_MOVE) == 0)
293         return;
294
295     if (lore_ptr->old) {
296         hooked_roff(_("、しかし", ", but "));
297     } else {
298         hooked_roff(format(_("%^sは", "%^s "), wd_he[lore_ptr->msex]));
299         lore_ptr->old = TRUE;
300     }
301
302     hooked_roff(_("侵入者を追跡しない", "does not deign to chase intruders"));
303 }
304
305 void display_monster_kind(lore_type *lore_ptr)
306 {
307     if (((lore_ptr->flags3 & (RF3_DRAGON | RF3_DEMON | RF3_GIANT | RF3_TROLL | RF3_ORC | RF3_ANGEL)) == 0) && ((lore_ptr->flags2 & (RF2_QUANTUM | RF2_HUMAN)) == 0)) {
308         hooked_roff(_("モンスター", " creature"));
309         return;
310     }
311
312     if (lore_ptr->flags3 & RF3_DRAGON)
313         hook_c_roff(TERM_ORANGE, _("ドラゴン", " dragon"));
314
315     if (lore_ptr->flags3 & RF3_DEMON)
316         hook_c_roff(TERM_VIOLET, _("デーモン", " demon"));
317
318     if (lore_ptr->flags3 & RF3_GIANT)
319         hook_c_roff(TERM_L_UMBER, _("巨人", " giant"));
320
321     if (lore_ptr->flags3 & RF3_TROLL)
322         hook_c_roff(TERM_BLUE, _("トロル", " troll"));
323
324     if (lore_ptr->flags3 & RF3_ORC)
325         hook_c_roff(TERM_UMBER, _("オーク", " orc"));
326
327     if (lore_ptr->flags2 & RF2_HUMAN)
328         hook_c_roff(TERM_L_WHITE, _("人間", " human"));
329
330     if (lore_ptr->flags2 & RF2_QUANTUM)
331         hook_c_roff(TERM_VIOLET, _("量子生物", " quantum creature"));
332
333     if (lore_ptr->flags3 & RF3_ANGEL)
334         hook_c_roff(TERM_YELLOW, _("天使", " angel"));
335 }
336
337 void display_monster_alignment(lore_type *lore_ptr)
338 {
339     if (lore_ptr->flags2 & RF2_ELDRITCH_HORROR)
340         hook_c_roff(TERM_VIOLET, _("狂気を誘う", " sanity-blasting"));
341
342     if (lore_ptr->flags3 & RF3_ANIMAL)
343         hook_c_roff(TERM_L_GREEN, _("自然界の", " natural"));
344
345     if (lore_ptr->flags3 & RF3_EVIL)
346         hook_c_roff(TERM_L_DARK, _("邪悪なる", " evil"));
347
348     if (lore_ptr->flags3 & RF3_GOOD)
349         hook_c_roff(TERM_YELLOW, _("善良な", " good"));
350
351     if (lore_ptr->flags3 & RF3_UNDEAD)
352         hook_c_roff(TERM_VIOLET, _("アンデッドの", " undead"));
353
354     if (lore_ptr->flags3 & RF3_AMBERITE)
355         hook_c_roff(TERM_VIOLET, _("アンバーの王族の", " Amberite"));
356 }
357
358 void display_monster_exp(player_type *player_ptr, lore_type *lore_ptr)
359 {
360 #ifdef JP
361     hooked_roff("を倒すことは");
362 #endif
363     long exp_integer = (long)lore_ptr->r_ptr->mexp * lore_ptr->r_ptr->level / (player_ptr->max_plv + 2) * 3 / 2;
364     long exp_decimal
365         = ((((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);
366
367 #ifdef JP
368     hooked_roff(format(" %d レベルのキャラクタにとって 約%ld.%02ld ポイントの経験となる。", player_ptr->lev, (long)exp_integer, (long)exp_decimal));
369 #else
370     hooked_roff(format(" is worth about %ld.%02ld point%s", (long)exp_integer, (long)exp_decimal, ((exp_integer == 1) && (exp_decimal == 0)) ? "" : "s"));
371
372     char *ordinal;
373     ordinal = "th";
374     exp_integer = player_ptr->lev % 10;
375     if ((player_ptr->lev / 10) != 1) {
376         if (exp_integer == 1)
377             ordinal = "st";
378         else if (exp_integer == 2)
379             ordinal = "nd";
380         else if (exp_integer == 3)
381             ordinal = "rd";
382     }
383
384     char *vowel;
385     vowel = "";
386     exp_integer = player_ptr->lev;
387     if ((exp_integer == 8) || (exp_integer == 11) || (exp_integer == 18))
388         vowel = "n";
389
390     hooked_roff(format(" for a%s %lu%s level character.  ", vowel, (long)exp_integer, ordinal));
391 #endif
392 }
393
394 void display_monster_aura(lore_type *lore_ptr)
395 {
396     if ((lore_ptr->flags2 & RF2_AURA_FIRE) && (lore_ptr->flags2 & RF2_AURA_ELEC) && (lore_ptr->flags3 & RF3_AURA_COLD))
397         hook_c_roff(
398             TERM_VIOLET, format(_("%^sは炎と氷とスパークに包まれている。", "%^s is surrounded by flames, ice and electricity.  "), wd_he[lore_ptr->msex]));
399     else if ((lore_ptr->flags2 & RF2_AURA_FIRE) && (lore_ptr->flags2 & RF2_AURA_ELEC))
400         hook_c_roff(TERM_L_RED, format(_("%^sは炎とスパークに包まれている。", "%^s is surrounded by flames and electricity.  "), wd_he[lore_ptr->msex]));
401     else if ((lore_ptr->flags2 & RF2_AURA_FIRE) && (lore_ptr->flags3 & RF3_AURA_COLD))
402         hook_c_roff(TERM_BLUE, format(_("%^sは炎と氷に包まれている。", "%^s is surrounded by flames and ice.  "), wd_he[lore_ptr->msex]));
403     else if ((lore_ptr->flags3 & RF3_AURA_COLD) && (lore_ptr->flags2 & RF2_AURA_ELEC))
404         hook_c_roff(TERM_L_GREEN, format(_("%^sは氷とスパークに包まれている。", "%^s is surrounded by ice and electricity.  "), wd_he[lore_ptr->msex]));
405     else if (lore_ptr->flags2 & RF2_AURA_FIRE)
406         hook_c_roff(TERM_RED, format(_("%^sは炎に包まれている。", "%^s is surrounded by flames.  "), wd_he[lore_ptr->msex]));
407     else if (lore_ptr->flags3 & RF3_AURA_COLD)
408         hook_c_roff(TERM_BLUE, format(_("%^sは氷に包まれている。", "%^s is surrounded by ice.  "), wd_he[lore_ptr->msex]));
409     else if (lore_ptr->flags2 & RF2_AURA_ELEC)
410         hook_c_roff(TERM_L_BLUE, format(_("%^sはスパークに包まれている。", "%^s is surrounded by electricity.  "), wd_he[lore_ptr->msex]));
411 }
412
413 void display_lore_this(player_type *player_ptr, lore_type *lore_ptr)
414 {
415     if ((lore_ptr->r_ptr->r_tkills == 0) && !lore_ptr->know_everything)
416         return;
417
418 #ifdef JP
419     hooked_roff("この");
420 #else
421     if (lore_ptr->flags1 & RF1_UNIQUE) {
422         hooked_roff("Killing this");
423     } else {
424         hooked_roff("A kill of this");
425     }
426 #endif
427
428     display_monster_alignment(lore_ptr);
429     display_monster_kind(lore_ptr);
430     display_monster_exp(player_ptr, lore_ptr);
431 }
432
433 static void display_monster_escort_contents(lore_type *lore_ptr)
434 {
435     if (!lore_ptr->reinforce)
436         return;
437
438     hooked_roff(_("護衛の構成は", "These escorts"));
439     if ((lore_ptr->flags1 & RF1_ESCORT) || (lore_ptr->flags1 & RF1_ESCORTS)) {
440         hooked_roff(_("少なくとも", " at the least"));
441     }
442
443 #ifdef JP
444 #else
445     hooked_roff(" contain ");
446 #endif
447
448     for (int n = 0; n < A_MAX; n++) {
449         bool is_reinforced = lore_ptr->r_ptr->reinforce_id[n] > 0;
450         is_reinforced &= lore_ptr->r_ptr->reinforce_dd[n] > 0;
451         is_reinforced &= lore_ptr->r_ptr->reinforce_ds[n] > 0;
452         if (!is_reinforced)
453             continue;
454
455         monster_race *rf_ptr = &r_info[lore_ptr->r_ptr->reinforce_id[n]];
456         if (rf_ptr->flags1 & RF1_UNIQUE) {
457             hooked_roff(format(_("、%s", ", %s"), r_name + rf_ptr->name));
458             continue;
459         }
460
461 #ifdef JP
462         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));
463 #else
464         bool plural = (lore_ptr->r_ptr->reinforce_dd[n] * lore_ptr->r_ptr->reinforce_ds[n] > 1);
465         GAME_TEXT name[MAX_NLEN];
466         strcpy(name, r_name + rf_ptr->name);
467         if (plural)
468             plural_aux(name);
469         hooked_roff(format(",%dd%d %s", lore_ptr->r_ptr->reinforce_dd[n], lore_ptr->r_ptr->reinforce_ds[n], name));
470 #endif
471     }
472
473     hooked_roff(_("で成り立っている。", "."));
474 }
475
476 void display_monster_collective(lore_type *lore_ptr)
477 {
478     if ((lore_ptr->flags1 & RF1_ESCORT) || (lore_ptr->flags1 & RF1_ESCORTS) || lore_ptr->reinforce) {
479         hooked_roff(format(_("%^sは通常護衛を伴って現れる。", "%^s usually appears with escorts.  "), wd_he[lore_ptr->msex]));
480         display_monster_escort_contents(lore_ptr);
481     }
482     else if (lore_ptr->flags1 & RF1_FRIENDS) {
483         hooked_roff(format(_("%^sは通常集団で現れる。", "%^s usually appears in groups.  "), wd_he[lore_ptr->msex]));
484     }
485 }
486
487 void display_monster_launching(player_type *player_ptr, lore_type *lore_ptr)
488 {
489     if (lore_ptr->flags4 & RF4_ROCKET) {
490         set_damage(player_ptr, lore_ptr->r_idx, (MS_ROCKET), _("ロケット%sを発射する", "shoot a rocket%s"), lore_ptr->tmp_msg[lore_ptr->vn]);
491         lore_ptr->vp[lore_ptr->vn] = lore_ptr->tmp_msg[lore_ptr->vn];
492         lore_ptr->color[lore_ptr->vn++] = TERM_UMBER;
493     }
494
495     if ((lore_ptr->flags4 & RF4_SHOOT) == 0)
496         return;
497
498     for (int m = 0; m < 4; m++) {
499         if (lore_ptr->r_ptr->blow[m].method != RBM_SHOOT)
500             continue;
501
502         if (know_armour(lore_ptr->r_idx))
503             sprintf(lore_ptr->tmp_msg[lore_ptr->vn], _("威力 %dd%d の射撃をする", "fire an arrow (Power:%dd%d)"), lore_ptr->r_ptr->blow[m].d_side,
504                 lore_ptr->r_ptr->blow[m].d_dice);
505         else
506             sprintf(lore_ptr->tmp_msg[lore_ptr->vn], _("射撃をする", "fire an arrow"));
507         lore_ptr->vp[lore_ptr->vn] = lore_ptr->tmp_msg[lore_ptr->vn];
508         lore_ptr->color[lore_ptr->vn++] = TERM_UMBER;
509         break;
510     }
511 }
512
513 void display_monster_sometimes(lore_type *lore_ptr)
514 {
515     if (lore_ptr->vn <= 0)
516         return;
517
518     hooked_roff(format(_("%^sは", "%^s"), wd_he[lore_ptr->msex]));
519     for (int n = 0; n < lore_ptr->vn; n++) {
520 #ifdef JP
521         if (n != lore_ptr->vn - 1) {
522             jverb(lore_ptr->vp[n], lore_ptr->jverb_buf, JVERB_OR);
523             hook_c_roff(lore_ptr->color[n], lore_ptr->jverb_buf);
524             hook_c_roff(lore_ptr->color[n], "り");
525             hooked_roff("、");
526         } else
527             hook_c_roff(lore_ptr->color[n], lore_ptr->vp[n]);
528 #else
529         if (n == 0)
530             hooked_roff(" may ");
531         else if (n < lore_ptr->vn - 1)
532             hooked_roff(", ");
533         else
534             hooked_roff(" or ");
535
536         hook_c_roff(lore_ptr->color[n], lore_ptr->vp[n]);
537 #endif
538     }
539
540     hooked_roff(_("ことがある。", ".  "));
541 }
542
543 void display_monster_guardian(lore_type *lore_ptr)
544 {
545     bool is_kingpin = (lore_ptr->flags1 & RF1_QUESTOR) != 0;
546     is_kingpin &= lore_ptr->r_ptr->r_sights > 0;
547     is_kingpin &= lore_ptr->r_ptr->max_num > 0;
548     is_kingpin &= (lore_ptr->r_idx == MON_OBERON) || (lore_ptr->r_idx == MON_SERPENT);
549     if (is_kingpin) {
550         hook_c_roff(TERM_VIOLET, _("あなたはこのモンスターを殺したいという強い欲望を感じている...", "You feel an intense desire to kill this monster...  "));
551     } else if (lore_ptr->flags7 & RF7_GUARDIAN) {
552         hook_c_roff(TERM_L_RED, _("このモンスターはダンジョンの主である。", "This monster is the master of a dungeon."));
553     }
554
555     hooked_roff("\n");
556 }