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"
13 static bool effect_monster_away_resist(PlayerType *player_ptr, EffectMonster *em_ptr)
15 if (em_ptr->r_ptr->resistance_flags.has_not(MonsterResistanceType::RESIST_TELEPORT)) {
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);
23 em_ptr->note = _("には効果がなかった。", " is unaffected.");
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);
31 em_ptr->note = _("には耐性がある!", " resists!");
38 ProcessResult effect_monster_away_undead(PlayerType *player_ptr, EffectMonster *em_ptr)
40 if (em_ptr->r_ptr->kind_flags.has_not(MonsterKindType::UNDEAD)) {
41 em_ptr->skipped = true;
43 return ProcessResult::PROCESS_CONTINUE;
46 bool resists_tele = effect_monster_away_resist(player_ptr, em_ptr);
49 em_ptr->obvious = true;
51 if (is_original_ap_and_seen(player_ptr, em_ptr->m_ptr)) {
52 em_ptr->r_ptr->r_kind_flags.set(MonsterKindType::UNDEAD);
55 em_ptr->do_dist = em_ptr->dam;
59 return ProcessResult::PROCESS_CONTINUE;
62 ProcessResult effect_monster_away_evil(PlayerType *player_ptr, EffectMonster *em_ptr)
64 if (em_ptr->r_ptr->kind_flags.has_not(MonsterKindType::EVIL)) {
65 em_ptr->skipped = true;
67 return ProcessResult::PROCESS_CONTINUE;
70 bool resists_tele = effect_monster_away_resist(player_ptr, em_ptr);
73 em_ptr->obvious = true;
75 if (is_original_ap_and_seen(player_ptr, em_ptr->m_ptr)) {
76 em_ptr->r_ptr->r_kind_flags.set(MonsterKindType::EVIL);
79 em_ptr->do_dist = em_ptr->dam;
83 return ProcessResult::PROCESS_CONTINUE;
86 ProcessResult effect_monster_away_all(PlayerType *player_ptr, EffectMonster *em_ptr)
88 bool resists_tele = effect_monster_away_resist(player_ptr, em_ptr);
91 em_ptr->obvious = true;
94 em_ptr->do_dist = em_ptr->dam;
98 return ProcessResult::PROCESS_CONTINUE;
101 ProcessResult effect_monster_turn_undead(PlayerType *player_ptr, EffectMonster *em_ptr)
103 if (em_ptr->r_ptr->kind_flags.has_not(MonsterKindType::UNDEAD)) {
104 em_ptr->skipped = true;
106 return ProcessResult::PROCESS_CONTINUE;
110 em_ptr->obvious = true;
113 if (is_original_ap_and_seen(player_ptr, em_ptr->m_ptr)) {
114 em_ptr->r_ptr->r_kind_flags.set(MonsterKindType::UNDEAD);
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;
125 return ProcessResult::PROCESS_CONTINUE;
128 ProcessResult effect_monster_turn_evil(PlayerType *player_ptr, EffectMonster *em_ptr)
130 if (em_ptr->r_ptr->kind_flags.has_not(MonsterKindType::EVIL)) {
131 em_ptr->skipped = true;
133 return ProcessResult::PROCESS_CONTINUE;
137 em_ptr->obvious = true;
140 if (is_original_ap_and_seen(player_ptr, em_ptr->m_ptr)) {
141 em_ptr->r_ptr->r_kind_flags.set(MonsterKindType::EVIL);
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;
152 return ProcessResult::PROCESS_CONTINUE;
155 ProcessResult effect_monster_turn_all(EffectMonster *em_ptr)
158 em_ptr->obvious = true;
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;
171 return ProcessResult::PROCESS_CONTINUE;
174 ProcessResult effect_monster_disp_undead(PlayerType *player_ptr, EffectMonster *em_ptr)
176 if (em_ptr->r_ptr->kind_flags.has_not(MonsterKindType::UNDEAD)) {
177 em_ptr->skipped = true;
179 return ProcessResult::PROCESS_CONTINUE;
183 em_ptr->obvious = true;
186 if (is_original_ap_and_seen(player_ptr, em_ptr->m_ptr)) {
187 em_ptr->r_ptr->r_kind_flags.set(MonsterKindType::UNDEAD);
190 em_ptr->note = _("は身震いした。", " shudders.");
191 em_ptr->note_dies = _("はドロドロに溶けた!", " dissolves!");
192 return ProcessResult::PROCESS_CONTINUE;
195 ProcessResult effect_monster_disp_evil(PlayerType *player_ptr, EffectMonster *em_ptr)
197 if (em_ptr->r_ptr->kind_flags.has_not(MonsterKindType::EVIL)) {
198 em_ptr->skipped = true;
200 return ProcessResult::PROCESS_CONTINUE;
204 em_ptr->obvious = true;
207 if (is_original_ap_and_seen(player_ptr, em_ptr->m_ptr)) {
208 em_ptr->r_ptr->r_kind_flags.set(MonsterKindType::EVIL);
211 em_ptr->note = _("は身震いした。", " shudders.");
212 em_ptr->note_dies = _("はドロドロに溶けた!", " dissolves!");
213 return ProcessResult::PROCESS_CONTINUE;
216 ProcessResult effect_monster_disp_good(PlayerType *player_ptr, EffectMonster *em_ptr)
218 if (em_ptr->r_ptr->kind_flags.has_not(MonsterKindType::GOOD)) {
219 em_ptr->skipped = true;
221 return ProcessResult::PROCESS_CONTINUE;
225 em_ptr->obvious = true;
228 if (is_original_ap_and_seen(player_ptr, em_ptr->m_ptr)) {
229 em_ptr->r_ptr->r_kind_flags.set(MonsterKindType::GOOD);
232 em_ptr->note = _("は身震いした。", " shudders.");
233 em_ptr->note_dies = _("はドロドロに溶けた!", " dissolves!");
234 return ProcessResult::PROCESS_CONTINUE;
237 ProcessResult effect_monster_disp_living(EffectMonster *em_ptr)
239 if (!em_ptr->m_ptr->has_living_flag()) {
240 em_ptr->skipped = true;
242 return ProcessResult::PROCESS_CONTINUE;
246 em_ptr->obvious = true;
249 em_ptr->note = _("は身震いした。", " shudders.");
250 em_ptr->note_dies = _("はドロドロに溶けた!", " dissolves!");
251 return ProcessResult::PROCESS_CONTINUE;
254 ProcessResult effect_monster_disp_demon(PlayerType *player_ptr, EffectMonster *em_ptr)
256 if (em_ptr->r_ptr->kind_flags.has_not(MonsterKindType::DEMON)) {
257 em_ptr->skipped = true;
259 return ProcessResult::PROCESS_CONTINUE;
263 em_ptr->obvious = true;
266 if (is_original_ap_and_seen(player_ptr, em_ptr->m_ptr)) {
267 em_ptr->r_ptr->r_kind_flags.set(MonsterKindType::DEMON);
270 em_ptr->note = _("は身震いした。", " shudders.");
271 em_ptr->note_dies = _("はドロドロに溶けた!", " dissolves!");
272 return ProcessResult::PROCESS_CONTINUE;
275 ProcessResult effect_monster_disp_all(EffectMonster *em_ptr)
278 em_ptr->obvious = true;
281 em_ptr->note = _("は身震いした。", " shudders.");
282 em_ptr->note_dies = _("はドロドロに溶けた!", " dissolves!");
283 return ProcessResult::PROCESS_CONTINUE;