OSDN Git Service

[Refactor] モンスターの思い出表示のモードをenumに変更
[hengbandforosx/hengbandosx.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 "game-option/cheat-options.h"
9 #include "lore/lore-calculator.h"
10 #include "lore/lore-util.h"
11 #include "lore/magic-types-setter.h"
12 #include "monster-race/monster-race.h"
13 #include "monster-race/race-flags-ability2.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-indice-types.h"
19 #include "term/term-color-types.h"
20 #include "view/display-lore-attacks.h"
21 #include "view/display-lore-drops.h"
22 #include "view/display-lore-magics.h"
23 #include "view/display-lore-status.h"
24 #include "view/display-lore.h"
25
26 static void set_msex_flags(lore_type *lore_ptr)
27 {
28     lore_ptr->msex = MSEX_NONE;
29     if (lore_ptr->r_ptr->flags1 & RF1_FEMALE) {
30         lore_ptr->msex = MSEX_FEMALE;
31         return;
32     }
33
34     if (lore_ptr->r_ptr->flags1 & RF1_MALE)
35         lore_ptr->msex = MSEX_MALE;
36 }
37
38 static void set_flags1(lore_type *lore_ptr)
39 {
40     if (lore_ptr->r_ptr->flags1 & RF1_UNIQUE)
41         lore_ptr->flags1 |= (RF1_UNIQUE);
42
43     if (lore_ptr->r_ptr->flags1 & RF1_QUESTOR)
44         lore_ptr->flags1 |= (RF1_QUESTOR);
45
46     if (lore_ptr->r_ptr->flags1 & RF1_MALE)
47         lore_ptr->flags1 |= (RF1_MALE);
48
49     if (lore_ptr->r_ptr->flags1 & RF1_FEMALE)
50         lore_ptr->flags1 |= (RF1_FEMALE);
51
52     if (lore_ptr->r_ptr->flags1 & RF1_FRIENDS)
53         lore_ptr->flags1 |= (RF1_FRIENDS);
54
55     if (lore_ptr->r_ptr->flags1 & RF1_ESCORT)
56         lore_ptr->flags1 |= (RF1_ESCORT);
57
58     if (lore_ptr->r_ptr->flags1 & RF1_ESCORTS)
59         lore_ptr->flags1 |= (RF1_ESCORTS);
60 }
61
62 static void set_race_flags(lore_type *lore_ptr)
63 {
64     if (!lore_ptr->r_ptr->r_tkills && !lore_ptr->know_everything)
65         return;
66
67     if (lore_ptr->r_ptr->flags3 & RF3_ORC)
68         lore_ptr->flags3 |= (RF3_ORC);
69
70     if (lore_ptr->r_ptr->flags3 & RF3_TROLL)
71         lore_ptr->flags3 |= (RF3_TROLL);
72
73     if (lore_ptr->r_ptr->flags3 & RF3_GIANT)
74         lore_ptr->flags3 |= (RF3_GIANT);
75
76     if (lore_ptr->r_ptr->flags3 & RF3_DRAGON)
77         lore_ptr->flags3 |= (RF3_DRAGON);
78
79     if (lore_ptr->r_ptr->flags3 & RF3_DEMON)
80         lore_ptr->flags3 |= (RF3_DEMON);
81
82     if (lore_ptr->r_ptr->flags3 & RF3_UNDEAD)
83         lore_ptr->flags3 |= (RF3_UNDEAD);
84
85     if (lore_ptr->r_ptr->flags3 & RF3_EVIL)
86         lore_ptr->flags3 |= (RF3_EVIL);
87
88     if (lore_ptr->r_ptr->flags3 & RF3_GOOD)
89         lore_ptr->flags3 |= (RF3_GOOD);
90
91     if (lore_ptr->r_ptr->flags3 & RF3_ANIMAL)
92         lore_ptr->flags3 |= (RF3_ANIMAL);
93
94     if (lore_ptr->r_ptr->flags3 & RF3_AMBERITE)
95         lore_ptr->flags3 |= (RF3_AMBERITE);
96
97     if (lore_ptr->r_ptr->flags2 & RF2_HUMAN)
98         lore_ptr->flags2 |= (RF2_HUMAN);
99
100     if (lore_ptr->r_ptr->flags2 & RF2_QUANTUM)
101         lore_ptr->flags2 |= (RF2_QUANTUM);
102
103     if (lore_ptr->r_ptr->flags1 & RF1_FORCE_DEPTH)
104         lore_ptr->flags1 |= (RF1_FORCE_DEPTH);
105
106     if (lore_ptr->r_ptr->flags1 & RF1_FORCE_MAXHP)
107         lore_ptr->flags1 |= (RF1_FORCE_MAXHP);
108 }
109
110 /*!
111  * @brief モンスターの思い出情報を表示するメインルーチン
112  * Hack -- display monster information using "hooked_roff()"
113  * @param r_idx モンスターの種族ID
114  * @param mode 表示オプション
115  * @return なし
116  * @details
117  * This function should only be called with the cursor placed at the
118  * left edge of the screen, on a cleared line, in which the recall is
119  * to take place.  One extra blank line is left after the recall.
120  */
121 void process_monster_lore(player_type *player_ptr, MONRACE_IDX r_idx, monster_lore_mode mode)
122 {
123     lore_type tmp_lore;
124     lore_type *lore_ptr = initialize_lore_type(&tmp_lore, r_idx, mode);
125     for (int n = 0; n < A_MAX; n++) {
126         if (lore_ptr->r_ptr->reinforce_id[n] > 0)
127             lore_ptr->reinforce = TRUE;
128     }
129
130     if (cheat_know || (mode == MONSTER_LORE_RESEARCH) || (mode == MONSTER_LORE_DEBUG))
131         lore_ptr->know_everything = TRUE;
132
133     set_drop_flags(lore_ptr);
134     set_msex_flags(lore_ptr);
135     set_flags1(lore_ptr);
136     set_race_flags(lore_ptr);
137     display_kill_numbers(lore_ptr);
138     concptr tmp = r_text + lore_ptr->r_ptr->text;
139     if (tmp[0]) {
140         hooked_roff(tmp);
141         hooked_roff("\n");
142     }
143
144     if (r_idx == MON_KAGE) {
145         hooked_roff("\n");
146         return;
147     }
148
149     if (!display_where_to_appear(lore_ptr))
150         return;
151
152     display_monster_move(lore_ptr);
153     display_monster_never_move(lore_ptr);
154     if (lore_ptr->old) {
155         hooked_roff(_("。", ".  "));
156         lore_ptr->old = FALSE;
157     }
158
159     display_lore_this(player_ptr, lore_ptr);
160     display_monster_aura(lore_ptr);
161     if (lore_ptr->flags2 & RF2_REFLECTING)
162         hooked_roff(format(_("%^sは矢の呪文を跳ね返す。", "%^s reflects bolt spells.  "), wd_he[lore_ptr->msex]));
163
164     display_monster_collective(lore_ptr);
165     lore_ptr->vn = 0;
166     if (lore_ptr->flags4 & RF4_SHRIEK) {
167         lore_ptr->vp[lore_ptr->vn] = _("悲鳴で助けを求める", "shriek for help");
168         lore_ptr->color[lore_ptr->vn++] = TERM_L_WHITE;
169     }
170
171     display_monster_launching(player_ptr, lore_ptr);
172     if (lore_ptr->a_ability_flags2 & (RF6_SPECIAL)) {
173         lore_ptr->vp[lore_ptr->vn] = _("特別な行動をする", "do something");
174         lore_ptr->color[lore_ptr->vn++] = TERM_VIOLET;
175     }
176
177     display_monster_sometimes(lore_ptr);
178     set_breath_types(player_ptr, lore_ptr);
179     display_monster_breath(lore_ptr);
180
181     lore_ptr->vn = 0;
182     set_ball_types(player_ptr, lore_ptr);
183     set_particular_types(player_ptr, lore_ptr);
184     set_bolt_types(player_ptr, lore_ptr);
185     set_status_types(lore_ptr);
186     set_teleport_types(lore_ptr);
187     set_floor_types(player_ptr, lore_ptr);
188     set_summon_types(lore_ptr);
189     display_monster_magic_types(lore_ptr);
190     display_mosnter_magic_possibility(lore_ptr);
191     display_monster_hp_ac(lore_ptr);
192
193     lore_ptr->vn = 0;
194     display_monster_concrete_abilities(lore_ptr);
195     display_monster_abilities(lore_ptr);
196     display_monster_constitutions(lore_ptr);
197
198     lore_ptr->vn = 0;
199     display_monster_concrete_weakness(lore_ptr);
200     display_monster_weakness(lore_ptr);
201
202     lore_ptr->vn = 0;
203     display_monster_concrete_resistances(lore_ptr);
204     display_monster_resistances(lore_ptr);
205     display_monster_evolution(lore_ptr);
206
207     lore_ptr->vn = 0;
208     display_monster_concrete_immunities(lore_ptr);
209     display_monster_immunities(lore_ptr);
210     display_monster_alert(lore_ptr);
211     display_monster_drops(lore_ptr);
212     display_monster_attacks(lore_ptr);
213     display_monster_guardian(lore_ptr);
214 }