1 #include "view/display-lore-status.h"
2 #include "locale/japanese.h"
3 #include "lore/lore-calculator.h"
4 #include "lore/lore-util.h"
5 #include "monster-race/monster-race.h"
6 #include "monster-race/race-flags-resistance.h"
7 #include "monster-race/race-flags1.h"
8 #include "monster-race/race-flags2.h"
9 #include "monster-race/race-flags3.h"
10 #include "monster-race/race-flags7.h"
11 #include "system/monster-race-definition.h"
12 #include "system/monster-type-definition.h"
13 #include "term/term-color-types.h"
15 void display_monster_hp_ac(lore_type *lore_ptr)
17 if (!know_armour(lore_ptr->r_idx, lore_ptr->know_everything))
20 hooked_roff(format(_("%^sは AC%d の防御力と", "%^s has an armor rating of %d"), Who::who(lore_ptr->msex), lore_ptr->r_ptr->ac));
21 if ((lore_ptr->flags1 & RF1_FORCE_MAXHP) || (lore_ptr->r_ptr->hside == 1)) {
22 auto hp = lore_ptr->r_ptr->hdice * (lore_ptr->nightmare ? 2 : 1) * lore_ptr->r_ptr->hside;
23 hooked_roff(format(_(" %d の体力がある。", " and a life rating of %d. "), std::min(MONSTER_MAXHP, hp)));
26 _(" %dd%d の体力がある。", " and a life rating of %dd%d. "), lore_ptr->r_ptr->hdice * (lore_ptr->nightmare ? 2 : 1), lore_ptr->r_ptr->hside));
30 void display_monster_concrete_abilities(lore_type *lore_ptr)
32 if (lore_ptr->flags7 & (RF7_HAS_LITE_1 | RF7_HAS_LITE_2)) {
33 lore_ptr->vp[lore_ptr->vn] = _("ダンジョンを照らす", "illuminate the dungeon");
34 lore_ptr->color[lore_ptr->vn++] = TERM_WHITE;
37 if (lore_ptr->flags7 & (RF7_HAS_DARK_1 | RF7_HAS_DARK_2)) {
38 lore_ptr->vp[lore_ptr->vn] = _("ダンジョンを暗くする", "darken the dungeon");
39 lore_ptr->color[lore_ptr->vn++] = TERM_L_DARK;
42 if (lore_ptr->behavior_flags.has(MonsterBehaviorType::OPEN_DOOR)) {
43 lore_ptr->vp[lore_ptr->vn] = _("ドアを開ける", "open doors");
44 lore_ptr->color[lore_ptr->vn++] = TERM_WHITE;
47 if (lore_ptr->behavior_flags.has(MonsterBehaviorType::BASH_DOOR)) {
48 lore_ptr->vp[lore_ptr->vn] = _("ドアを打ち破る", "bash down doors");
49 lore_ptr->color[lore_ptr->vn++] = TERM_WHITE;
52 if (lore_ptr->flags7 & RF7_CAN_FLY) {
53 lore_ptr->vp[lore_ptr->vn] = _("空を飛ぶ", "fly");
54 lore_ptr->color[lore_ptr->vn++] = TERM_WHITE;
57 if (lore_ptr->flags7 & RF7_CAN_SWIM) {
58 lore_ptr->vp[lore_ptr->vn] = _("水を渡る", "swim");
59 lore_ptr->color[lore_ptr->vn++] = TERM_WHITE;
62 if (lore_ptr->flags2 & RF2_PASS_WALL) {
63 lore_ptr->vp[lore_ptr->vn] = _("壁をすり抜ける", "pass through walls");
64 lore_ptr->color[lore_ptr->vn++] = TERM_WHITE;
67 if (lore_ptr->flags2 & RF2_KILL_WALL) {
68 lore_ptr->vp[lore_ptr->vn] = _("壁を掘り進む", "bore through walls");
69 lore_ptr->color[lore_ptr->vn++] = TERM_WHITE;
72 if (lore_ptr->behavior_flags.has(MonsterBehaviorType::MOVE_BODY)) {
73 lore_ptr->vp[lore_ptr->vn] = _("弱いモンスターを押しのける", "push past weaker monsters");
74 lore_ptr->color[lore_ptr->vn++] = TERM_WHITE;
77 if (lore_ptr->behavior_flags.has(MonsterBehaviorType::KILL_BODY)) {
78 lore_ptr->vp[lore_ptr->vn] = _("弱いモンスターを倒す", "destroy weaker monsters");
79 lore_ptr->color[lore_ptr->vn++] = TERM_WHITE;
82 if (lore_ptr->behavior_flags.has(MonsterBehaviorType::TAKE_ITEM)) {
83 lore_ptr->vp[lore_ptr->vn] = _("アイテムを拾う", "pick up objects");
84 lore_ptr->color[lore_ptr->vn++] = TERM_WHITE;
87 if (lore_ptr->behavior_flags.has(MonsterBehaviorType::KILL_ITEM)) {
88 lore_ptr->vp[lore_ptr->vn] = _("アイテムを壊す", "destroy objects");
89 lore_ptr->color[lore_ptr->vn++] = TERM_WHITE;
93 void display_monster_abilities(lore_type *lore_ptr)
95 if (lore_ptr->vn <= 0)
98 hooked_roff(format(_("%^sは", "%^s"), Who::who(lore_ptr->msex)));
99 for (int n = 0; n < lore_ptr->vn; n++) {
101 if (n != lore_ptr->vn - 1) {
102 jverb(lore_ptr->vp[n], lore_ptr->jverb_buf, JVERB_AND);
103 hook_c_roff(lore_ptr->color[n], lore_ptr->jverb_buf);
106 hook_c_roff(lore_ptr->color[n], lore_ptr->vp[n]);
110 hooked_roff(" can ");
111 else if (n < lore_ptr->vn - 1)
114 hooked_roff(" and ");
116 hook_c_roff(lore_ptr->color[n], lore_ptr->vp[n]);
120 hooked_roff(_("ことができる。", ". "));
123 void display_monster_constitutions(lore_type *lore_ptr)
125 if (lore_ptr->flags7 & RF7_AQUATIC)
126 hooked_roff(format(_("%^sは水中に棲んでいる。", "%^s lives in water. "), Who::who(lore_ptr->msex)));
128 if (lore_ptr->flags7 & (RF7_SELF_LITE_1 | RF7_SELF_LITE_2))
129 hooked_roff(format(_("%^sは光っている。", "%^s is shining. "), Who::who(lore_ptr->msex)));
131 if (lore_ptr->flags7 & (RF7_SELF_DARK_1 | RF7_SELF_DARK_2))
132 hook_c_roff(TERM_L_DARK, format(_("%^sは暗黒に包まれている。", "%^s is surrounded by darkness. "), Who::who(lore_ptr->msex)));
134 if (lore_ptr->flags2 & RF2_INVISIBLE)
135 hooked_roff(format(_("%^sは透明で目に見えない。", "%^s is invisible. "), Who::who(lore_ptr->msex)));
137 if (lore_ptr->flags2 & RF2_COLD_BLOOD)
138 hooked_roff(format(_("%^sは冷血動物である。", "%^s is cold blooded. "), Who::who(lore_ptr->msex)));
140 if (lore_ptr->flags2 & RF2_EMPTY_MIND)
141 hooked_roff(format(_("%^sはテレパシーでは感知できない。", "%^s is not detected by telepathy. "), Who::who(lore_ptr->msex)));
142 else if (lore_ptr->flags2 & RF2_WEIRD_MIND)
143 hooked_roff(format(_("%^sはまれにテレパシーで感知できる。", "%^s is rarely detected by telepathy. "), Who::who(lore_ptr->msex)));
145 if (lore_ptr->flags2 & RF2_MULTIPLY)
146 hook_c_roff(TERM_L_UMBER, format(_("%^sは爆発的に増殖する。", "%^s breeds explosively. "), Who::who(lore_ptr->msex)));
148 if (lore_ptr->flags2 & RF2_REGENERATE)
149 hook_c_roff(TERM_L_WHITE, format(_("%^sは素早く体力を回復する。", "%^s regenerates quickly. "), Who::who(lore_ptr->msex)));
151 if (lore_ptr->flags7 & RF7_RIDING)
152 hook_c_roff(TERM_SLATE, format(_("%^sに乗ることができる。", "%^s is suitable for riding. "), Who::who(lore_ptr->msex)));
155 void display_monster_concrete_weakness(lore_type *lore_ptr)
157 if (lore_ptr->flags3 & RF3_HURT_ROCK) {
158 lore_ptr->vp[lore_ptr->vn] = _("岩を除去するもの", "rock remover");
159 lore_ptr->color[lore_ptr->vn++] = TERM_UMBER;
162 if (lore_ptr->flags3 & RF3_HURT_LITE) {
163 lore_ptr->vp[lore_ptr->vn] = _("明るい光", "bright light");
164 lore_ptr->color[lore_ptr->vn++] = TERM_YELLOW;
167 if (lore_ptr->flags3 & RF3_HURT_FIRE) {
168 lore_ptr->vp[lore_ptr->vn] = _("炎", "fire");
169 lore_ptr->color[lore_ptr->vn++] = TERM_RED;
172 if (lore_ptr->flags3 & RF3_HURT_COLD) {
173 lore_ptr->vp[lore_ptr->vn] = _("冷気", "cold");
174 lore_ptr->color[lore_ptr->vn++] = TERM_L_WHITE;
178 void display_monster_weakness(lore_type *lore_ptr)
180 if (lore_ptr->vn <= 0)
183 hooked_roff(format(_("%^sには", "%^s"), Who::who(lore_ptr->msex)));
184 for (int n = 0; n < lore_ptr->vn; n++) {
190 hooked_roff(" is hurt by ");
191 else if (n < lore_ptr->vn - 1)
194 hooked_roff(" and ");
196 hook_c_roff(lore_ptr->color[n], lore_ptr->vp[n]);
199 hooked_roff(_("でダメージを与えられる。", ". "));
202 void display_monster_concrete_resistances(lore_type *lore_ptr)
204 if (lore_ptr->flagsr & RFR_IM_ACID) {
205 lore_ptr->vp[lore_ptr->vn] = _("酸", "acid");
206 lore_ptr->color[lore_ptr->vn++] = TERM_GREEN;
209 if (lore_ptr->flagsr & RFR_IM_ELEC) {
210 lore_ptr->vp[lore_ptr->vn] = _("稲妻", "lightning");
211 lore_ptr->color[lore_ptr->vn++] = TERM_BLUE;
214 if (lore_ptr->flagsr & RFR_IM_FIRE) {
215 lore_ptr->vp[lore_ptr->vn] = _("炎", "fire");
216 lore_ptr->color[lore_ptr->vn++] = TERM_RED;
219 if (lore_ptr->flagsr & RFR_IM_COLD) {
220 lore_ptr->vp[lore_ptr->vn] = _("冷気", "cold");
221 lore_ptr->color[lore_ptr->vn++] = TERM_L_WHITE;
224 if (lore_ptr->flagsr & RFR_IM_POIS) {
225 lore_ptr->vp[lore_ptr->vn] = _("毒", "poison");
226 lore_ptr->color[lore_ptr->vn++] = TERM_L_GREEN;
229 if (lore_ptr->flagsr & RFR_RES_LITE) {
230 lore_ptr->vp[lore_ptr->vn] = _("閃光", "light");
231 lore_ptr->color[lore_ptr->vn++] = TERM_YELLOW;
234 if (lore_ptr->flagsr & RFR_RES_DARK) {
235 lore_ptr->vp[lore_ptr->vn] = _("暗黒", "dark");
236 lore_ptr->color[lore_ptr->vn++] = TERM_L_DARK;
239 if (lore_ptr->flagsr & RFR_RES_NETH) {
240 lore_ptr->vp[lore_ptr->vn] = _("地獄", "nether");
241 lore_ptr->color[lore_ptr->vn++] = TERM_L_DARK;
244 if (lore_ptr->flagsr & RFR_RES_WATE) {
245 lore_ptr->vp[lore_ptr->vn] = _("水", "water");
246 lore_ptr->color[lore_ptr->vn++] = TERM_BLUE;
249 if (lore_ptr->flagsr & RFR_RES_PLAS) {
250 lore_ptr->vp[lore_ptr->vn] = _("プラズマ", "plasma");
251 lore_ptr->color[lore_ptr->vn++] = TERM_L_RED;
254 if (lore_ptr->flagsr & RFR_RES_SHAR) {
255 lore_ptr->vp[lore_ptr->vn] = _("破片", "shards");
256 lore_ptr->color[lore_ptr->vn++] = TERM_L_UMBER;
259 if (lore_ptr->flagsr & RFR_RES_SOUN) {
260 lore_ptr->vp[lore_ptr->vn] = _("轟音", "sound");
261 lore_ptr->color[lore_ptr->vn++] = TERM_ORANGE;
264 if (lore_ptr->flagsr & RFR_RES_CHAO) {
265 lore_ptr->vp[lore_ptr->vn] = _("カオス", "chaos");
266 lore_ptr->color[lore_ptr->vn++] = TERM_VIOLET;
269 if (lore_ptr->flagsr & RFR_RES_NEXU) {
270 lore_ptr->vp[lore_ptr->vn] = _("因果混乱", "nexus");
271 lore_ptr->color[lore_ptr->vn++] = TERM_VIOLET;
274 if (lore_ptr->flagsr & RFR_RES_DISE) {
275 lore_ptr->vp[lore_ptr->vn] = _("劣化", "disenchantment");
276 lore_ptr->color[lore_ptr->vn++] = TERM_VIOLET;
279 if (lore_ptr->flagsr & RFR_RES_WALL) {
280 lore_ptr->vp[lore_ptr->vn] = _("フォース", "force");
281 lore_ptr->color[lore_ptr->vn++] = TERM_UMBER;
284 if (lore_ptr->flagsr & RFR_RES_INER) {
285 lore_ptr->vp[lore_ptr->vn] = _("遅鈍", "inertia");
286 lore_ptr->color[lore_ptr->vn++] = TERM_SLATE;
289 if (lore_ptr->flagsr & RFR_RES_TIME) {
290 lore_ptr->vp[lore_ptr->vn] = _("時間逆転", "time");
291 lore_ptr->color[lore_ptr->vn++] = TERM_L_BLUE;
294 if (lore_ptr->flagsr & RFR_RES_GRAV) {
295 lore_ptr->vp[lore_ptr->vn] = _("重力", "gravity");
296 lore_ptr->color[lore_ptr->vn++] = TERM_SLATE;
299 if (lore_ptr->flagsr & RFR_RES_ALL) {
300 lore_ptr->vp[lore_ptr->vn] = _("あらゆる攻撃", "all");
301 lore_ptr->color[lore_ptr->vn++] = TERM_YELLOW;
304 if ((lore_ptr->flagsr & RFR_RES_TELE) && lore_ptr->r_ptr->kind_flags.has_not(MonsterKindType::UNIQUE)) {
305 lore_ptr->vp[lore_ptr->vn] = _("テレポート", "teleportation");
306 lore_ptr->color[lore_ptr->vn++] = TERM_ORANGE;
310 void display_monster_resistances(lore_type *lore_ptr)
312 if (lore_ptr->vn <= 0)
315 hooked_roff(format(_("%^sは", "%^s"), Who::who(lore_ptr->msex)));
316 for (int n = 0; n < lore_ptr->vn; n++) {
322 hooked_roff(" resists ");
323 else if (n < lore_ptr->vn - 1)
326 hooked_roff(" and ");
328 hook_c_roff(lore_ptr->color[n], lore_ptr->vp[n]);
331 hooked_roff(_("の耐性を持っている。", ". "));
334 void display_monster_evolution(lore_type *lore_ptr)
336 if (!lore_ptr->r_ptr->r_can_evolve && !lore_ptr->know_everything)
339 if (lore_ptr->r_ptr->next_r_idx) {
340 hooked_roff(format(_("%^sは経験を積むと、", "%^s will evolve into "), Who::who(lore_ptr->msex)));
341 hook_c_roff(TERM_YELLOW, format("%s", r_info[lore_ptr->r_ptr->next_r_idx].name.c_str()));
343 hooked_roff(_(format("に進化する。"), format(" when %s gets enough experience. ", Who::who(lore_ptr->msex))));
344 } else if (lore_ptr->r_ptr->kind_flags.has_not(MonsterKindType::UNIQUE)) {
345 hooked_roff(format(_("%sは進化しない。", "%s won't evolve. "), Who::who(lore_ptr->msex)));
349 void display_monster_concrete_immunities(lore_type *lore_ptr)
351 if (lore_ptr->flags3 & RF3_NO_STUN) {
352 lore_ptr->vp[lore_ptr->vn] = _("朦朧としない", "stunned");
353 lore_ptr->color[lore_ptr->vn++] = TERM_ORANGE;
356 if (lore_ptr->flags3 & RF3_NO_FEAR) {
357 lore_ptr->vp[lore_ptr->vn] = _("恐怖を感じない", "frightened");
358 lore_ptr->color[lore_ptr->vn++] = TERM_SLATE;
361 if (lore_ptr->flags3 & RF3_NO_CONF) {
362 lore_ptr->vp[lore_ptr->vn] = _("混乱しない", "confused");
363 lore_ptr->color[lore_ptr->vn++] = TERM_L_UMBER;
366 if (lore_ptr->flags3 & RF3_NO_SLEEP) {
367 lore_ptr->vp[lore_ptr->vn] = _("眠らされない", "slept");
368 lore_ptr->color[lore_ptr->vn++] = TERM_BLUE;
371 if ((lore_ptr->flagsr & RFR_RES_TELE) && lore_ptr->r_ptr->kind_flags.has(MonsterKindType::UNIQUE)) {
372 lore_ptr->vp[lore_ptr->vn] = _("テレポートされない", "teleported");
373 lore_ptr->color[lore_ptr->vn++] = TERM_ORANGE;
377 void display_monster_immunities(lore_type *lore_ptr)
379 if (lore_ptr->vn <= 0)
382 hooked_roff(format(_("%^sは", "%^s"), Who::who(lore_ptr->msex)));
383 for (int n = 0; n < lore_ptr->vn; n++) {
389 hooked_roff(" cannot be ");
390 else if (n < lore_ptr->vn - 1)
395 hook_c_roff(lore_ptr->color[n], lore_ptr->vp[n]);
398 hooked_roff(_("。", ". "));
401 void display_monster_alert(lore_type *lore_ptr)
403 bool alert = ((int)lore_ptr->r_ptr->r_wake * (int)lore_ptr->r_ptr->r_wake) > lore_ptr->r_ptr->sleep;
404 alert |= lore_ptr->r_ptr->r_ignore == MAX_UCHAR;
405 alert |= (lore_ptr->r_ptr->sleep == 0) && (lore_ptr->r_ptr->r_tkills >= 10);
406 alert |= lore_ptr->know_everything;
411 if (lore_ptr->r_ptr->sleep > 200) {
412 act = _("を無視しがちであるが", "prefers to ignore");
413 } else if (lore_ptr->r_ptr->sleep > 95) {
414 act = _("に対してほとんど注意を払わないが", "pays very little attention to");
415 } else if (lore_ptr->r_ptr->sleep > 75) {
416 act = _("に対してあまり注意を払わないが", "pays little attention to");
417 } else if (lore_ptr->r_ptr->sleep > 45) {
418 act = _("を見過ごしがちであるが", "tends to overlook");
419 } else if (lore_ptr->r_ptr->sleep > 25) {
420 act = _("をほんの少しは見ており", "takes quite a while to see");
421 } else if (lore_ptr->r_ptr->sleep > 10) {
422 act = _("をしばらくは見ており", "takes a while to see");
423 } else if (lore_ptr->r_ptr->sleep > 5) {
424 act = _("を幾分注意深く見ており", "is fairly observant of");
425 } else if (lore_ptr->r_ptr->sleep > 3) {
426 act = _("を注意深く見ており", "is observant of");
427 } else if (lore_ptr->r_ptr->sleep > 1) {
428 act = _("をかなり注意深く見ており", "is very observant of");
429 } else if (lore_ptr->r_ptr->sleep > 0) {
430 act = _("を警戒しており", "is vigilant for");
432 act = _("をかなり警戒しており", "is ever vigilant for");
435 hooked_roff(_(format("%^sは侵入者%s、 %d フィート先から侵入者に気付くことがある。", Who::who(lore_ptr->msex), act, 10 * lore_ptr->r_ptr->aaf),
436 format("%^s %s intruders, which %s may notice from %d feet. ", Who::who(lore_ptr->msex), act, Who::who(lore_ptr->msex), 10 * lore_ptr->r_ptr->aaf)));