OSDN Git Service

[Refactor] 再定義したものへ置き換え
[hengbandforosx/hengbandosx.git] / src / view / display-lore-status.cpp
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"
14
15 void display_monster_hp_ac(lore_type *lore_ptr)
16 {
17     if (!know_armour(lore_ptr->r_idx, lore_ptr->know_everything))
18         return;
19
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)));
24     } else {
25         hooked_roff(format(
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));
27     }
28 }
29
30 void display_monster_concrete_abilities(lore_type *lore_ptr)
31 {
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;
35     }
36
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;
40     }
41
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;
45     }
46
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;
50     }
51
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;
55     }
56
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;
60     }
61
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;
65     }
66
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;
70     }
71
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;
75     }
76
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;
80     }
81
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;
85     }
86
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;
90     }
91 }
92
93 void display_monster_abilities(lore_type *lore_ptr)
94 {
95     if (lore_ptr->vn <= 0)
96         return;
97
98     hooked_roff(format(_("%^sは", "%^s"), Who::who(lore_ptr->msex)));
99     for (int n = 0; n < lore_ptr->vn; n++) {
100 #ifdef JP
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);
104             hooked_roff("、");
105         } else {
106             hook_c_roff(lore_ptr->color[n], lore_ptr->vp[n]);
107         }
108 #else
109         if (n == 0)
110             hooked_roff(" can ");
111         else if (n < lore_ptr->vn - 1)
112             hooked_roff(", ");
113         else
114             hooked_roff(" and ");
115
116         hook_c_roff(lore_ptr->color[n], lore_ptr->vp[n]);
117 #endif
118     }
119
120     hooked_roff(_("ことができる。", ".  "));
121 }
122
123 void display_monster_constitutions(lore_type *lore_ptr)
124 {
125     if (lore_ptr->flags7 & RF7_AQUATIC)
126         hooked_roff(format(_("%^sは水中に棲んでいる。", "%^s lives in water.  "), Who::who(lore_ptr->msex)));
127
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)));
130
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)));
133
134     if (lore_ptr->flags2 & RF2_INVISIBLE)
135         hooked_roff(format(_("%^sは透明で目に見えない。", "%^s is invisible.  "), Who::who(lore_ptr->msex)));
136
137     if (lore_ptr->flags2 & RF2_COLD_BLOOD)
138         hooked_roff(format(_("%^sは冷血動物である。", "%^s is cold blooded.  "), Who::who(lore_ptr->msex)));
139
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)));
144
145     if (lore_ptr->flags2 & RF2_MULTIPLY)
146         hook_c_roff(TERM_L_UMBER, format(_("%^sは爆発的に増殖する。", "%^s breeds explosively.  "), Who::who(lore_ptr->msex)));
147
148     if (lore_ptr->flags2 & RF2_REGENERATE)
149         hook_c_roff(TERM_L_WHITE, format(_("%^sは素早く体力を回復する。", "%^s regenerates quickly.  "), Who::who(lore_ptr->msex)));
150
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)));
153 }
154
155 void display_monster_concrete_weakness(lore_type *lore_ptr)
156 {
157     if (lore_ptr->resistance_flags.has(MonsterResistanceType::HURT_ROCK)) {
158         lore_ptr->vp[lore_ptr->vn] = _("岩を除去するもの", "rock remover");
159         lore_ptr->color[lore_ptr->vn++] = TERM_UMBER;
160     }
161
162     if (lore_ptr->resistance_flags.has(MonsterResistanceType::HURT_LITE)) {
163         lore_ptr->vp[lore_ptr->vn] = _("明るい光", "bright light");
164         lore_ptr->color[lore_ptr->vn++] = TERM_YELLOW;
165     }
166
167     if (lore_ptr->resistance_flags.has(MonsterResistanceType::HURT_FIRE)) {
168         lore_ptr->vp[lore_ptr->vn] = _("炎", "fire");
169         lore_ptr->color[lore_ptr->vn++] = TERM_RED;
170     }
171
172     if (lore_ptr->resistance_flags.has(MonsterResistanceType::HURT_COLD)) {
173         lore_ptr->vp[lore_ptr->vn] = _("冷気", "cold");
174         lore_ptr->color[lore_ptr->vn++] = TERM_L_WHITE;
175     }
176 }
177
178 void display_monster_weakness(lore_type *lore_ptr)
179 {
180     if (lore_ptr->vn <= 0)
181         return;
182
183     hooked_roff(format(_("%^sには", "%^s"), Who::who(lore_ptr->msex)));
184     for (int n = 0; n < lore_ptr->vn; n++) {
185 #ifdef JP
186         if (n != 0)
187             hooked_roff("や");
188 #else
189         if (n == 0)
190             hooked_roff(" is hurt by ");
191         else if (n < lore_ptr->vn - 1)
192             hooked_roff(", ");
193         else
194             hooked_roff(" and ");
195 #endif
196         hook_c_roff(lore_ptr->color[n], lore_ptr->vp[n]);
197     }
198
199     hooked_roff(_("でダメージを与えられる。", ".  "));
200 }
201
202 void display_monster_concrete_resistances(lore_type *lore_ptr)
203 {
204     if (lore_ptr->resistance_flags.has(MonsterResistanceType::IMMUNE_ACID)) {
205         lore_ptr->vp[lore_ptr->vn] = _("酸", "acid");
206         lore_ptr->color[lore_ptr->vn++] = TERM_GREEN;
207     }
208
209     if (lore_ptr->resistance_flags.has(MonsterResistanceType::IMMUNE_ELEC)) {
210         lore_ptr->vp[lore_ptr->vn] = _("稲妻", "lightning");
211         lore_ptr->color[lore_ptr->vn++] = TERM_BLUE;
212     }
213
214     if (lore_ptr->resistance_flags.has(MonsterResistanceType::IMMUNE_FIRE)) {
215         lore_ptr->vp[lore_ptr->vn] = _("炎", "fire");
216         lore_ptr->color[lore_ptr->vn++] = TERM_RED;
217     }
218
219     if (lore_ptr->resistance_flags.has(MonsterResistanceType::IMMUNE_COLD)) {
220         lore_ptr->vp[lore_ptr->vn] = _("冷気", "cold");
221         lore_ptr->color[lore_ptr->vn++] = TERM_L_WHITE;
222     }
223
224     if (lore_ptr->resistance_flags.has(MonsterResistanceType::IMMUNE_POISON)) {
225         lore_ptr->vp[lore_ptr->vn] = _("毒", "poison");
226         lore_ptr->color[lore_ptr->vn++] = TERM_L_GREEN;
227     }
228
229     if (lore_ptr->resistance_flags.has(MonsterResistanceType::RESIST_LITE)) {
230         lore_ptr->vp[lore_ptr->vn] = _("閃光", "light");
231         lore_ptr->color[lore_ptr->vn++] = TERM_YELLOW;
232     }
233
234     if (lore_ptr->resistance_flags.has(MonsterResistanceType::RESIST_DARK)) {
235         lore_ptr->vp[lore_ptr->vn] = _("暗黒", "dark");
236         lore_ptr->color[lore_ptr->vn++] = TERM_L_DARK;
237     }
238
239     if (lore_ptr->resistance_flags.has(MonsterResistanceType::RESIST_NETHER)) {
240         lore_ptr->vp[lore_ptr->vn] = _("地獄", "nether");
241         lore_ptr->color[lore_ptr->vn++] = TERM_L_DARK;
242     }
243
244     if (lore_ptr->resistance_flags.has(MonsterResistanceType::RESIST_WATER)) {
245         lore_ptr->vp[lore_ptr->vn] = _("水", "water");
246         lore_ptr->color[lore_ptr->vn++] = TERM_BLUE;
247     }
248
249     if (lore_ptr->resistance_flags.has(MonsterResistanceType::RESIST_PLASMA)) {
250         lore_ptr->vp[lore_ptr->vn] = _("プラズマ", "plasma");
251         lore_ptr->color[lore_ptr->vn++] = TERM_L_RED;
252     }
253
254     if (lore_ptr->resistance_flags.has(MonsterResistanceType::RESIST_SHARDS)) {
255         lore_ptr->vp[lore_ptr->vn] = _("破片", "shards");
256         lore_ptr->color[lore_ptr->vn++] = TERM_L_UMBER;
257     }
258
259     if (lore_ptr->resistance_flags.has(MonsterResistanceType::RESIST_SOUND)) {
260         lore_ptr->vp[lore_ptr->vn] = _("轟音", "sound");
261         lore_ptr->color[lore_ptr->vn++] = TERM_ORANGE;
262     }
263
264     if (lore_ptr->resistance_flags.has(MonsterResistanceType::RESIST_CHAOS)) {
265         lore_ptr->vp[lore_ptr->vn] = _("カオス", "chaos");
266         lore_ptr->color[lore_ptr->vn++] = TERM_VIOLET;
267     }
268
269     if (lore_ptr->resistance_flags.has(MonsterResistanceType::RESIST_NEXUS)) {
270         lore_ptr->vp[lore_ptr->vn] = _("因果混乱", "nexus");
271         lore_ptr->color[lore_ptr->vn++] = TERM_VIOLET;
272     }
273
274     if (lore_ptr->resistance_flags.has(MonsterResistanceType::RESIST_DISENCHANT)) {
275         lore_ptr->vp[lore_ptr->vn] = _("劣化", "disenchantment");
276         lore_ptr->color[lore_ptr->vn++] = TERM_VIOLET;
277     }
278
279     if (lore_ptr->resistance_flags.has(MonsterResistanceType::RESIST_FORCE)) {
280         lore_ptr->vp[lore_ptr->vn] = _("フォース", "force");
281         lore_ptr->color[lore_ptr->vn++] = TERM_UMBER;
282     }
283
284     if (lore_ptr->resistance_flags.has(MonsterResistanceType::RESIST_INERTIA)) {
285         lore_ptr->vp[lore_ptr->vn] = _("遅鈍", "inertia");
286         lore_ptr->color[lore_ptr->vn++] = TERM_SLATE;
287     }
288
289     if (lore_ptr->resistance_flags.has(MonsterResistanceType::RESIST_TIME)) {
290         lore_ptr->vp[lore_ptr->vn] = _("時間逆転", "time");
291         lore_ptr->color[lore_ptr->vn++] = TERM_L_BLUE;
292     }
293
294     if (lore_ptr->resistance_flags.has(MonsterResistanceType::RESIST_GRAVITY)) {
295         lore_ptr->vp[lore_ptr->vn] = _("重力", "gravity");
296         lore_ptr->color[lore_ptr->vn++] = TERM_SLATE;
297     }
298
299     if (lore_ptr->resistance_flags.has(MonsterResistanceType::RESIST_ALL)) {
300         lore_ptr->vp[lore_ptr->vn] = _("あらゆる攻撃", "all");
301         lore_ptr->color[lore_ptr->vn++] = TERM_YELLOW;
302     }
303
304     if (lore_ptr->resistance_flags.has(MonsterResistanceType::RESIST_TELEPORT) && 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;
307     }
308 }
309
310 void display_monster_resistances(lore_type *lore_ptr)
311 {
312     if (lore_ptr->vn <= 0)
313         return;
314
315     hooked_roff(format(_("%^sは", "%^s"), Who::who(lore_ptr->msex)));
316     for (int n = 0; n < lore_ptr->vn; n++) {
317 #ifdef JP
318         if (n != 0)
319             hooked_roff("と");
320 #else
321         if (n == 0)
322             hooked_roff(" resists ");
323         else if (n < lore_ptr->vn - 1)
324             hooked_roff(", ");
325         else
326             hooked_roff(" and ");
327 #endif
328         hook_c_roff(lore_ptr->color[n], lore_ptr->vp[n]);
329     }
330
331     hooked_roff(_("の耐性を持っている。", ".  "));
332 }
333
334 void display_monster_evolution(lore_type *lore_ptr)
335 {
336     if (!lore_ptr->r_ptr->r_can_evolve && !lore_ptr->know_everything)
337         return;
338
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()));
342
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)));
346     }
347 }
348
349 void display_monster_concrete_immunities(lore_type *lore_ptr)
350 {
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;
354     }
355
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;
359     }
360
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;
364     }
365
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;
369     }
370
371     if (lore_ptr->resistance_flags.has(MonsterResistanceType::RESIST_TELEPORT) && 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;
374     }
375 }
376
377 void display_monster_immunities(lore_type *lore_ptr)
378 {
379     if (lore_ptr->vn <= 0)
380         return;
381
382     hooked_roff(format(_("%^sは", "%^s"), Who::who(lore_ptr->msex)));
383     for (int n = 0; n < lore_ptr->vn; n++) {
384 #ifdef JP
385         if (n != 0)
386             hooked_roff("し、");
387 #else
388         if (n == 0)
389             hooked_roff(" cannot be ");
390         else if (n < lore_ptr->vn - 1)
391             hooked_roff(", ");
392         else
393             hooked_roff(" or ");
394 #endif
395         hook_c_roff(lore_ptr->color[n], lore_ptr->vp[n]);
396     }
397
398     hooked_roff(_("。", ".  "));
399 }
400
401 void display_monster_alert(lore_type *lore_ptr)
402 {
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;
407     if (!alert)
408         return;
409
410     concptr act;
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");
431     } else {
432         act = _("をかなり警戒しており", "is ever vigilant for");
433     }
434
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)));
437 }