2 * @brief モンスターの思い出表示に必要なフラグ類の処理
7 #include "lore/monster-lore.h"
8 #include "locale/english.h"
9 #include "locale/japanese.h"
10 #include "lore/lore-calculator.h"
11 #include "lore/lore-util.h"
12 #include "lore/magic-types-setter.h"
13 #include "monster-race/race-flags-ability1.h"
14 #include "monster-race/race-flags-ability2.h"
15 #include "monster-race/race-flags-resistance.h"
16 #include "monster-race/race-flags1.h"
17 #include "monster-race/race-flags2.h"
18 #include "monster-race/race-flags3.h"
19 #include "monster-race/race-flags4.h"
20 #include "monster-race/race-flags7.h"
21 #include "monster-race/race-indice-types.h"
22 #include "mspell/monster-spell.h"
23 #include "mspell/mspell-damage-calculator.h"
24 #include "mspell/mspell-type.h"
25 #include "term/term-color-types.h"
26 #include "util/util.h"
27 #include "view/display-lore-drops.h"
28 #include "view/display-lore-magics.h"
29 #include "view/display-lore-status.h"
30 #include "view/display-lore.h"
32 static void set_msex_flags(lore_type *lore_ptr)
34 lore_ptr->msex = MSEX_NONE;
35 if (lore_ptr->r_ptr->flags1 & RF1_FEMALE) {
36 lore_ptr->msex = MSEX_FEMALE;
40 if (lore_ptr->r_ptr->flags1 & RF1_MALE)
41 lore_ptr->msex = MSEX_MALE;
44 static void set_flags1(lore_type *lore_ptr)
46 if (lore_ptr->r_ptr->flags1 & RF1_UNIQUE)
47 lore_ptr->flags1 |= (RF1_UNIQUE);
49 if (lore_ptr->r_ptr->flags1 & RF1_QUESTOR)
50 lore_ptr->flags1 |= (RF1_QUESTOR);
52 if (lore_ptr->r_ptr->flags1 & RF1_MALE)
53 lore_ptr->flags1 |= (RF1_MALE);
55 if (lore_ptr->r_ptr->flags1 & RF1_FEMALE)
56 lore_ptr->flags1 |= (RF1_FEMALE);
58 if (lore_ptr->r_ptr->flags1 & RF1_FRIENDS)
59 lore_ptr->flags1 |= (RF1_FRIENDS);
61 if (lore_ptr->r_ptr->flags1 & RF1_ESCORT)
62 lore_ptr->flags1 |= (RF1_ESCORT);
64 if (lore_ptr->r_ptr->flags1 & RF1_ESCORTS)
65 lore_ptr->flags1 |= (RF1_ESCORTS);
68 static void set_race_flags(lore_type *lore_ptr)
70 if (!lore_ptr->r_ptr->r_tkills && !lore_ptr->know_everything)
73 if (lore_ptr->r_ptr->flags3 & RF3_ORC)
74 lore_ptr->flags3 |= (RF3_ORC);
76 if (lore_ptr->r_ptr->flags3 & RF3_TROLL)
77 lore_ptr->flags3 |= (RF3_TROLL);
79 if (lore_ptr->r_ptr->flags3 & RF3_GIANT)
80 lore_ptr->flags3 |= (RF3_GIANT);
82 if (lore_ptr->r_ptr->flags3 & RF3_DRAGON)
83 lore_ptr->flags3 |= (RF3_DRAGON);
85 if (lore_ptr->r_ptr->flags3 & RF3_DEMON)
86 lore_ptr->flags3 |= (RF3_DEMON);
88 if (lore_ptr->r_ptr->flags3 & RF3_UNDEAD)
89 lore_ptr->flags3 |= (RF3_UNDEAD);
91 if (lore_ptr->r_ptr->flags3 & RF3_EVIL)
92 lore_ptr->flags3 |= (RF3_EVIL);
94 if (lore_ptr->r_ptr->flags3 & RF3_GOOD)
95 lore_ptr->flags3 |= (RF3_GOOD);
97 if (lore_ptr->r_ptr->flags3 & RF3_ANIMAL)
98 lore_ptr->flags3 |= (RF3_ANIMAL);
100 if (lore_ptr->r_ptr->flags3 & RF3_AMBERITE)
101 lore_ptr->flags3 |= (RF3_AMBERITE);
103 if (lore_ptr->r_ptr->flags2 & RF2_HUMAN)
104 lore_ptr->flags2 |= (RF2_HUMAN);
106 if (lore_ptr->r_ptr->flags2 & RF2_QUANTUM)
107 lore_ptr->flags2 |= (RF2_QUANTUM);
109 if (lore_ptr->r_ptr->flags1 & RF1_FORCE_DEPTH)
110 lore_ptr->flags1 |= (RF1_FORCE_DEPTH);
112 if (lore_ptr->r_ptr->flags1 & RF1_FORCE_MAXHP)
113 lore_ptr->flags1 |= (RF1_FORCE_MAXHP);
117 * @brief モンスターの思い出情報を表示するメインルーチン
118 * Hack -- display monster information using "hooked_roff()"
119 * @param r_idx モンスターの種族ID
120 * @param mode 表示オプション
123 * This function should only be called with the cursor placed at the
124 * left edge of the screen, on a cleared line, in which the recall is
125 * to take place. One extra blank line is left after the recall.
127 void process_monster_lore(player_type *player_ptr, MONRACE_IDX r_idx, BIT_FLAGS mode)
130 lore_type *lore_ptr = initialize_lore_type(&tmp_lore, r_idx, mode);
131 for (int n = 0; n < A_MAX; n++) {
132 if (lore_ptr->r_ptr->reinforce_id[n] > 0)
133 lore_ptr->reinforce = TRUE;
136 if (cheat_know || (mode & 0x01))
137 lore_ptr->know_everything = TRUE;
139 set_drop_flags(lore_ptr);
140 set_msex_flags(lore_ptr);
141 set_flags1(lore_ptr);
142 set_race_flags(lore_ptr);
143 display_kill_numbers(lore_ptr);
144 concptr tmp = r_text + lore_ptr->r_ptr->text;
150 if (r_idx == MON_KAGE) {
155 if (!display_where_to_appear(lore_ptr))
158 display_monster_move(lore_ptr);
159 display_monster_never_move(lore_ptr);
161 hooked_roff(_("。", ". "));
162 lore_ptr->old = FALSE;
165 display_lore_this(player_ptr, lore_ptr);
166 display_monster_aura(lore_ptr);
167 if (lore_ptr->flags2 & RF2_REFLECTING)
168 hooked_roff(format(_("%^sは矢の呪文を跳ね返す。", "%^s reflects bolt spells. "), wd_he[lore_ptr->msex]));
170 display_monster_collective(lore_ptr);
172 if (lore_ptr->flags4 & RF4_SHRIEK) {
173 lore_ptr->vp[lore_ptr->vn] = _("悲鳴で助けを求める", "shriek for help");
174 lore_ptr->color[lore_ptr->vn++] = TERM_L_WHITE;
177 display_monster_launching(player_ptr, lore_ptr);
178 if (lore_ptr->a_ability_flags2 & (RF6_SPECIAL)) {
179 lore_ptr->vp[lore_ptr->vn] = _("特別な行動をする", "do something");
180 lore_ptr->color[lore_ptr->vn++] = TERM_VIOLET;
183 display_monster_sometimes(lore_ptr);
184 set_breath_types(player_ptr, lore_ptr);
185 display_monster_breath(lore_ptr);
188 set_ball_types(player_ptr, lore_ptr);
189 set_particular_types(player_ptr, lore_ptr);
190 set_bolt_types(player_ptr, lore_ptr);
191 set_status_types(lore_ptr);
192 set_teleport_types(lore_ptr);
193 set_floor_types(player_ptr, lore_ptr);
194 set_summon_types(lore_ptr);
195 display_monster_magic_types(lore_ptr);
196 display_mosnter_magic_possibility(lore_ptr);
197 display_monster_hp_ac(lore_ptr);
200 display_monster_concrete_abilities(lore_ptr);
201 display_monster_abilities(lore_ptr);
202 display_monster_constitutions(lore_ptr);
205 display_monster_concrete_weakness(lore_ptr);
206 display_monster_weakness(lore_ptr);
209 display_monster_concrete_resistances(lore_ptr);
210 display_monster_resistances(lore_ptr);
211 display_monster_evolution(lore_ptr);
214 display_monster_concrete_immunities(lore_ptr);
215 display_monster_immunities(lore_ptr);
216 display_monster_alert(lore_ptr);
217 display_monster_drop(lore_ptr);
219 const int max_attack_numbers = 4;
221 for (int m = 0; m < max_attack_numbers; m++) {
222 if (!lore_ptr->r_ptr->blow[m].method || (lore_ptr->r_ptr->blow[m].method == RBM_SHOOT))
225 if (lore_ptr->r_ptr->r_blows[m] || lore_ptr->know_everything)
229 int attack_numbers = 0;
230 for (int m = 0; m < max_attack_numbers; m++) {
231 if (!lore_ptr->r_ptr->blow[m].method || (lore_ptr->r_ptr->blow[m].method == RBM_SHOOT)
232 || (((lore_ptr->r_ptr->r_blows[m] == 0) && !lore_ptr->know_everything)))
235 rbm_type method = lore_ptr->r_ptr->blow[m].method;
236 int effect = lore_ptr->r_ptr->blow[m].effect;
237 int d1 = lore_ptr->r_ptr->blow[m].d_dice;
238 int d2 = lore_ptr->r_ptr->blow[m].d_side;
246 p = _("触る", "touch");
249 p = _("パンチする", "punch");
255 p = _("ひっかく", "claw");
261 p = _("刺す", "sting");
264 p = _("斬る", "slash");
267 p = _("角で突く", "butt");
270 p = _("体当たりする", "crush");
273 p = _("飲み込む", "engulf");
276 p = _("請求書をよこす", "charge");
279 p = _("体の上を這い回る", "crawl on you");
282 p = _("よだれをたらす", "drool on you");
285 p = _("つばを吐く", "spit");
288 p = _("爆発する", "explode");
291 p = _("にらむ", "gaze");
294 p = _("泣き叫ぶ", "wail");
297 p = _("胞子を飛ばす", "release spores");
302 p = _("金をせがむ", "beg");
305 p = _("侮辱する", "insult");
308 p = _("うめく", "moan");
318 q = _("強力に攻撃する", "slaughter");
321 q = _("攻撃する", "attack");
324 q = _("毒をくらわす", "poison");
327 q = _("劣化させる", "disenchant");
330 q = _("充填魔力を吸収する", "drain charges");
333 q = _("金を盗む", "steal gold");
336 q = _("アイテムを盗む", "steal items");
339 q = _("あなたの食料を食べる", "eat your food");
342 q = _("明かりを吸収する", "absorb light");
345 q = _("酸を飛ばす", "shoot acid");
348 q = _("感電させる", "electrocute");
351 q = _("燃やす", "burn");
354 q = _("凍らせる", "freeze");
357 q = _("盲目にする", "blind");
360 q = _("混乱させる", "confuse");
363 q = _("恐怖させる", "terrify");
366 q = _("麻痺させる", "paralyze");
369 q = _("腕力を減少させる", "reduce strength");
372 q = _("知能を減少させる", "reduce intelligence");
375 q = _("賢さを減少させる", "reduce wisdom");
378 q = _("器用さを減少させる", "reduce dexterity");
381 q = _("耐久力を減少させる", "reduce constitution");
384 q = _("魅力を減少させる", "reduce charisma");
387 q = _("全ステータスを減少させる", "reduce all stats");
390 q = _("粉砕する", "shatter");
393 q = _("経験値を減少(10d6+)させる", "lower experience (by 10d6+)");
396 q = _("経験値を減少(20d6+)させる", "lower experience (by 20d6+)");
399 q = _("経験値を減少(40d6+)させる", "lower experience (by 40d6+)");
402 q = _("経験値を減少(80d6+)させる", "lower experience (by 80d6+)");
405 q = _("病気にする", "disease");
408 q = _("時間を逆戻りさせる", "time");
411 q = _("生命力を吸収する", "drain life");
414 q = _("魔力を奪う", "drain mana force");
417 q = _("減速させる", "slow");
420 q = _("朦朧とさせる", "stun");
425 if (attack_numbers == 0) {
426 hooked_roff(format("%^sは", wd_he[lore_ptr->msex]));
429 if (d1 && d2 && (lore_ptr->know_everything || know_damage(r_idx, m))) {
430 hooked_roff(format(" %dd%d ", d1, d2));
431 hooked_roff("のダメージで");
437 /* XXしてYYし/XXしてYYする/XXし/XXする */
439 jverb(p, lore_ptr->jverb_buf, JVERB_TO);
440 else if (attack_numbers != count - 1)
441 jverb(p, lore_ptr->jverb_buf, JVERB_AND);
443 strcpy(lore_ptr->jverb_buf, p);
445 hooked_roff(lore_ptr->jverb_buf);
447 if (attack_numbers != count - 1)
448 jverb(q, lore_ptr->jverb_buf, JVERB_AND);
450 strcpy(lore_ptr->jverb_buf, q);
451 hooked_roff(lore_ptr->jverb_buf);
454 if (attack_numbers != count - 1)
457 if (attack_numbers == 0) {
458 hooked_roff(format("%^s can ", wd_he[lore_ptr->msex]));
459 } else if (attack_numbers < count - 1) {
462 hooked_roff(", and ");
466 p = "do something weird";
471 if (d1 && d2 && (lore_ptr->know_everything || know_damage(r_idx, m))) {
472 hooked_roff(" with damage");
473 hooked_roff(format(" %dd%d", d1, d2));
481 if (attack_numbers > 0) {
482 hooked_roff(_("。", ". "));
483 } else if (lore_ptr->flags1 & RF1_NEVER_BLOW) {
484 hooked_roff(format(_("%^sは物理的な攻撃方法を持たない。", "%^s has no physical attacks. "), wd_he[lore_ptr->msex]));
486 hooked_roff(format(_("%s攻撃については何も知らない。", "Nothing is known about %s attack. "), wd_his[lore_ptr->msex]));
489 bool is_kingpin = (lore_ptr->flags1 & RF1_QUESTOR) != 0;
490 is_kingpin &= lore_ptr->r_ptr->r_sights > 0;
491 is_kingpin &= lore_ptr->r_ptr->max_num > 0;
492 is_kingpin &= (r_idx == MON_OBERON) || (r_idx == MON_SERPENT);
494 hook_c_roff(TERM_VIOLET, _("あなたはこのモンスターを殺したいという強い欲望を感じている...", "You feel an intense desire to kill this monster... "));
495 } else if (lore_ptr->flags7 & RF7_GUARDIAN) {
496 hook_c_roff(TERM_L_RED, _("このモンスターはダンジョンの主である。", "This monster is the master of a dungeon."));