OSDN Git Service

Merge pull request #3569 from sikabane-works/release/3.0.0.88-alpha
[hengbandforosx/hengbandosx.git] / src / effect / effect-monster-evil.cpp
1 #include "effect/effect-monster-evil.h"
2 #include "effect/effect-monster-util.h"
3 #include "monster-race/monster-race-hook.h"
4 #include "monster-race/monster-race.h"
5 #include "monster-race/race-flags-resistance.h"
6 #include "monster-race/race-flags1.h"
7 #include "monster-race/race-flags3.h"
8 #include "monster/monster-info.h"
9 #include "system/monster-entity.h"
10 #include "system/monster-race-info.h"
11 #include "system/player-type-definition.h"
12
13 static bool effect_monster_away_resist(PlayerType *player_ptr, EffectMonster *em_ptr)
14 {
15     if (em_ptr->r_ptr->resistance_flags.has_not(MonsterResistanceType::RESIST_TELEPORT)) {
16         return false;
17     }
18
19     if (em_ptr->r_ptr->kind_flags.has(MonsterKindType::UNIQUE) || em_ptr->r_ptr->resistance_flags.has(MonsterResistanceType::RESIST_ALL)) {
20         if (is_original_ap_and_seen(player_ptr, em_ptr->m_ptr)) {
21             em_ptr->r_ptr->r_resistance_flags.set(MonsterResistanceType::RESIST_TELEPORT);
22         }
23         em_ptr->note = _("には効果がなかった。", " is unaffected.");
24         return true;
25     }
26
27     if (em_ptr->r_ptr->level > randint1(100)) {
28         if (is_original_ap_and_seen(player_ptr, em_ptr->m_ptr)) {
29             em_ptr->r_ptr->r_resistance_flags.set(MonsterResistanceType::RESIST_TELEPORT);
30         }
31         em_ptr->note = _("には耐性がある!", " resists!");
32         return true;
33     }
34
35     return false;
36 }
37
38 ProcessResult effect_monster_away_undead(PlayerType *player_ptr, EffectMonster *em_ptr)
39 {
40     if (em_ptr->r_ptr->kind_flags.has_not(MonsterKindType::UNDEAD)) {
41         em_ptr->skipped = true;
42         em_ptr->dam = 0;
43         return ProcessResult::PROCESS_CONTINUE;
44     }
45
46     bool resists_tele = effect_monster_away_resist(player_ptr, em_ptr);
47     if (!resists_tele) {
48         if (em_ptr->seen) {
49             em_ptr->obvious = true;
50         }
51         if (is_original_ap_and_seen(player_ptr, em_ptr->m_ptr)) {
52             em_ptr->r_ptr->r_kind_flags.set(MonsterKindType::UNDEAD);
53         }
54
55         em_ptr->do_dist = em_ptr->dam;
56     }
57
58     em_ptr->dam = 0;
59     return ProcessResult::PROCESS_CONTINUE;
60 }
61
62 ProcessResult effect_monster_away_evil(PlayerType *player_ptr, EffectMonster *em_ptr)
63 {
64     if (em_ptr->r_ptr->kind_flags.has_not(MonsterKindType::EVIL)) {
65         em_ptr->skipped = true;
66         em_ptr->dam = 0;
67         return ProcessResult::PROCESS_CONTINUE;
68     }
69
70     bool resists_tele = effect_monster_away_resist(player_ptr, em_ptr);
71     if (!resists_tele) {
72         if (em_ptr->seen) {
73             em_ptr->obvious = true;
74         }
75         if (is_original_ap_and_seen(player_ptr, em_ptr->m_ptr)) {
76             em_ptr->r_ptr->r_kind_flags.set(MonsterKindType::EVIL);
77         }
78
79         em_ptr->do_dist = em_ptr->dam;
80     }
81
82     em_ptr->dam = 0;
83     return ProcessResult::PROCESS_CONTINUE;
84 }
85
86 ProcessResult effect_monster_away_all(PlayerType *player_ptr, EffectMonster *em_ptr)
87 {
88     bool resists_tele = effect_monster_away_resist(player_ptr, em_ptr);
89     if (!resists_tele) {
90         if (em_ptr->seen) {
91             em_ptr->obvious = true;
92         }
93
94         em_ptr->do_dist = em_ptr->dam;
95     }
96
97     em_ptr->dam = 0;
98     return ProcessResult::PROCESS_CONTINUE;
99 }
100
101 ProcessResult effect_monster_turn_undead(PlayerType *player_ptr, EffectMonster *em_ptr)
102 {
103     if (em_ptr->r_ptr->kind_flags.has_not(MonsterKindType::UNDEAD)) {
104         em_ptr->skipped = true;
105         em_ptr->dam = 0;
106         return ProcessResult::PROCESS_CONTINUE;
107     }
108
109     if (em_ptr->seen) {
110         em_ptr->obvious = true;
111     }
112
113     if (is_original_ap_and_seen(player_ptr, em_ptr->m_ptr)) {
114         em_ptr->r_ptr->r_kind_flags.set(MonsterKindType::UNDEAD);
115     }
116
117     em_ptr->do_fear = damroll(3, (em_ptr->dam / 2)) + 1;
118     if (em_ptr->r_ptr->level > randint1((em_ptr->dam - 10) < 1 ? 1 : (em_ptr->dam - 10)) + 10) {
119         em_ptr->note = _("には効果がなかった。", " is unaffected.");
120         em_ptr->obvious = false;
121         em_ptr->do_fear = 0;
122     }
123
124     em_ptr->dam = 0;
125     return ProcessResult::PROCESS_CONTINUE;
126 }
127
128 ProcessResult effect_monster_turn_evil(PlayerType *player_ptr, EffectMonster *em_ptr)
129 {
130     if (em_ptr->r_ptr->kind_flags.has_not(MonsterKindType::EVIL)) {
131         em_ptr->skipped = true;
132         em_ptr->dam = 0;
133         return ProcessResult::PROCESS_CONTINUE;
134     }
135
136     if (em_ptr->seen) {
137         em_ptr->obvious = true;
138     }
139
140     if (is_original_ap_and_seen(player_ptr, em_ptr->m_ptr)) {
141         em_ptr->r_ptr->r_kind_flags.set(MonsterKindType::EVIL);
142     }
143
144     em_ptr->do_fear = damroll(3, (em_ptr->dam / 2)) + 1;
145     if (em_ptr->r_ptr->level > randint1((em_ptr->dam - 10) < 1 ? 1 : (em_ptr->dam - 10)) + 10) {
146         em_ptr->note = _("には効果がなかった。", " is unaffected.");
147         em_ptr->obvious = false;
148         em_ptr->do_fear = 0;
149     }
150
151     em_ptr->dam = 0;
152     return ProcessResult::PROCESS_CONTINUE;
153 }
154
155 ProcessResult effect_monster_turn_all(EffectMonster *em_ptr)
156 {
157     if (em_ptr->seen) {
158         em_ptr->obvious = true;
159     }
160
161     em_ptr->do_fear = damroll(3, (em_ptr->dam / 2)) + 1;
162     if (em_ptr->r_ptr->kind_flags.has(MonsterKindType::UNIQUE) ||
163         (em_ptr->r_ptr->flags3 & (RF3_NO_FEAR)) ||
164         (em_ptr->r_ptr->level > randint1((em_ptr->dam - 10) < 1 ? 1 : (em_ptr->dam - 10)) + 10)) {
165         em_ptr->note = _("には効果がなかった。", " is unaffected.");
166         em_ptr->obvious = false;
167         em_ptr->do_fear = 0;
168     }
169
170     em_ptr->dam = 0;
171     return ProcessResult::PROCESS_CONTINUE;
172 }
173
174 ProcessResult effect_monster_disp_undead(PlayerType *player_ptr, EffectMonster *em_ptr)
175 {
176     if (em_ptr->r_ptr->kind_flags.has_not(MonsterKindType::UNDEAD)) {
177         em_ptr->skipped = true;
178         em_ptr->dam = 0;
179         return ProcessResult::PROCESS_CONTINUE;
180     }
181
182     if (em_ptr->seen) {
183         em_ptr->obvious = true;
184     }
185
186     if (is_original_ap_and_seen(player_ptr, em_ptr->m_ptr)) {
187         em_ptr->r_ptr->r_kind_flags.set(MonsterKindType::UNDEAD);
188     }
189
190     em_ptr->note = _("は身震いした。", " shudders.");
191     em_ptr->note_dies = _("はドロドロに溶けた!", " dissolves!");
192     return ProcessResult::PROCESS_CONTINUE;
193 }
194
195 ProcessResult effect_monster_disp_evil(PlayerType *player_ptr, EffectMonster *em_ptr)
196 {
197     if (em_ptr->r_ptr->kind_flags.has_not(MonsterKindType::EVIL)) {
198         em_ptr->skipped = true;
199         em_ptr->dam = 0;
200         return ProcessResult::PROCESS_CONTINUE;
201     }
202
203     if (em_ptr->seen) {
204         em_ptr->obvious = true;
205     }
206
207     if (is_original_ap_and_seen(player_ptr, em_ptr->m_ptr)) {
208         em_ptr->r_ptr->r_kind_flags.set(MonsterKindType::EVIL);
209     }
210
211     em_ptr->note = _("は身震いした。", " shudders.");
212     em_ptr->note_dies = _("はドロドロに溶けた!", " dissolves!");
213     return ProcessResult::PROCESS_CONTINUE;
214 }
215
216 ProcessResult effect_monster_disp_good(PlayerType *player_ptr, EffectMonster *em_ptr)
217 {
218     if (em_ptr->r_ptr->kind_flags.has_not(MonsterKindType::GOOD)) {
219         em_ptr->skipped = true;
220         em_ptr->dam = 0;
221         return ProcessResult::PROCESS_CONTINUE;
222     }
223
224     if (em_ptr->seen) {
225         em_ptr->obvious = true;
226     }
227
228     if (is_original_ap_and_seen(player_ptr, em_ptr->m_ptr)) {
229         em_ptr->r_ptr->r_kind_flags.set(MonsterKindType::GOOD);
230     }
231
232     em_ptr->note = _("は身震いした。", " shudders.");
233     em_ptr->note_dies = _("はドロドロに溶けた!", " dissolves!");
234     return ProcessResult::PROCESS_CONTINUE;
235 }
236
237 ProcessResult effect_monster_disp_living(EffectMonster *em_ptr)
238 {
239     if (!em_ptr->m_ptr->has_living_flag()) {
240         em_ptr->skipped = true;
241         em_ptr->dam = 0;
242         return ProcessResult::PROCESS_CONTINUE;
243     }
244
245     if (em_ptr->seen) {
246         em_ptr->obvious = true;
247     }
248
249     em_ptr->note = _("は身震いした。", " shudders.");
250     em_ptr->note_dies = _("はドロドロに溶けた!", " dissolves!");
251     return ProcessResult::PROCESS_CONTINUE;
252 }
253
254 ProcessResult effect_monster_disp_demon(PlayerType *player_ptr, EffectMonster *em_ptr)
255 {
256     if (em_ptr->r_ptr->kind_flags.has_not(MonsterKindType::DEMON)) {
257         em_ptr->skipped = true;
258         em_ptr->dam = 0;
259         return ProcessResult::PROCESS_CONTINUE;
260     }
261
262     if (em_ptr->seen) {
263         em_ptr->obvious = true;
264     }
265
266     if (is_original_ap_and_seen(player_ptr, em_ptr->m_ptr)) {
267         em_ptr->r_ptr->r_kind_flags.set(MonsterKindType::DEMON);
268     }
269
270     em_ptr->note = _("は身震いした。", " shudders.");
271     em_ptr->note_dies = _("はドロドロに溶けた!", " dissolves!");
272     return ProcessResult::PROCESS_CONTINUE;
273 }
274
275 ProcessResult effect_monster_disp_all(EffectMonster *em_ptr)
276 {
277     if (em_ptr->seen) {
278         em_ptr->obvious = true;
279     }
280
281     em_ptr->note = _("は身震いした。", " shudders.");
282     em_ptr->note_dies = _("はドロドロに溶けた!", " dissolves!");
283     return ProcessResult::PROCESS_CONTINUE;
284 }