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"
10 static bool effect_monster_away_resist(player_type *caster_ptr, effect_monster_type *em_ptr)
12 if ((em_ptr->r_ptr->flagsr & RFR_RES_TELE) == 0) return FALSE;
14 if ((em_ptr->r_ptr->flags1 & (RF1_UNIQUE)) || (em_ptr->r_ptr->flagsr & RFR_RES_ALL))
16 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flagsr |= RFR_RES_TELE;
17 em_ptr->note = _("には効果がなかった。", " is unaffected.");
21 if (em_ptr->r_ptr->level > randint1(100))
23 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flagsr |= RFR_RES_TELE;
24 em_ptr->note = _("には耐性がある!", " resists!");
32 process_result effect_monster_away_undead(player_type *caster_ptr, effect_monster_type *em_ptr)
34 if ((em_ptr->r_ptr->flags3 & (RF3_UNDEAD)) == 0)
36 em_ptr->skipped = TRUE;
38 return PROCESS_CONTINUE;
41 bool resists_tele = effect_monster_away_resist(caster_ptr, em_ptr);
44 if (em_ptr->seen) em_ptr->obvious = TRUE;
45 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
46 em_ptr->r_ptr->r_flags3 |= (RF3_UNDEAD);
48 em_ptr->do_dist = em_ptr->dam;
52 return PROCESS_CONTINUE;
56 process_result effect_monster_away_evil(player_type *caster_ptr, effect_monster_type *em_ptr)
58 if ((em_ptr->r_ptr->flags3 & (RF3_EVIL)) == 0)
60 em_ptr->skipped = TRUE;
62 return PROCESS_CONTINUE;
65 bool resists_tele = effect_monster_away_resist(caster_ptr, em_ptr);
68 if (em_ptr->seen) em_ptr->obvious = TRUE;
69 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
70 em_ptr->r_ptr->r_flags3 |= (RF3_EVIL);
72 em_ptr->do_dist = em_ptr->dam;
76 return PROCESS_CONTINUE;
80 process_result effect_monster_away_all(player_type *caster_ptr, effect_monster_type *em_ptr)
82 bool resists_tele = effect_monster_away_resist(caster_ptr, em_ptr);
85 if (em_ptr->seen) em_ptr->obvious = TRUE;
87 em_ptr->do_dist = em_ptr->dam;
91 return PROCESS_CONTINUE;
95 process_result effect_monster_turn_undead(player_type *caster_ptr, effect_monster_type *em_ptr)
97 if ((em_ptr->r_ptr->flags3 & (RF3_UNDEAD)) == 0)
99 em_ptr->skipped = TRUE;
101 return PROCESS_CONTINUE;
104 if (em_ptr->seen) em_ptr->obvious = TRUE;
106 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flags3 |= (RF3_UNDEAD);
108 em_ptr->do_fear = damroll(3, (em_ptr->dam / 2)) + 1;
109 if (em_ptr->r_ptr->level > randint1((em_ptr->dam - 10) < 1 ? 1 : (em_ptr->dam - 10)) + 10)
111 em_ptr->note = _("には効果がなかった。", " is unaffected.");
112 em_ptr->obvious = FALSE;
117 return PROCESS_CONTINUE;
121 process_result effect_monster_turn_evil(player_type *caster_ptr, effect_monster_type *em_ptr)
123 if ((em_ptr->r_ptr->flags3 & (RF3_EVIL)) == 0)
125 em_ptr->skipped = TRUE;
127 return PROCESS_CONTINUE;
130 if (em_ptr->seen) em_ptr->obvious = TRUE;
132 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flags3 |= (RF3_EVIL);
134 em_ptr->do_fear = damroll(3, (em_ptr->dam / 2)) + 1;
135 if (em_ptr->r_ptr->level > randint1((em_ptr->dam - 10) < 1 ? 1 : (em_ptr->dam - 10)) + 10)
137 em_ptr->note = _("には効果がなかった。", " is unaffected.");
138 em_ptr->obvious = FALSE;
143 return PROCESS_CONTINUE;
147 process_result effect_monster_turn_all(effect_monster_type *em_ptr)
149 if (em_ptr->seen) em_ptr->obvious = TRUE;
151 em_ptr->do_fear = damroll(3, (em_ptr->dam / 2)) + 1;
152 if ((em_ptr->r_ptr->flags1 & (RF1_UNIQUE)) ||
153 (em_ptr->r_ptr->flags3 & (RF3_NO_FEAR)) ||
154 (em_ptr->r_ptr->level > randint1((em_ptr->dam - 10) < 1 ? 1 : (em_ptr->dam - 10)) + 10))
156 em_ptr->note = _("には効果がなかった。", " is unaffected.");
157 em_ptr->obvious = FALSE;
162 return PROCESS_CONTINUE;
166 process_result effect_monster_disp_undead(player_type *caster_ptr, effect_monster_type *em_ptr)
168 if ((em_ptr->r_ptr->flags3 & (RF3_UNDEAD)) == 0)
170 em_ptr->skipped = TRUE;
172 return PROCESS_CONTINUE;
175 if (em_ptr->seen) em_ptr->obvious = TRUE;
177 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
178 em_ptr->r_ptr->r_flags3 |= (RF3_UNDEAD);
180 em_ptr->note = _("は身震いした。", " shudders.");
181 em_ptr->note_dies = _("はドロドロに溶けた!", " dissolves!");
182 return PROCESS_CONTINUE;
186 process_result effect_monster_disp_evil(player_type *caster_ptr, effect_monster_type *em_ptr)
188 if ((em_ptr->r_ptr->flags3 & (RF3_EVIL)) == 0)
190 em_ptr->skipped = TRUE;
192 return PROCESS_CONTINUE;
195 if (em_ptr->seen) em_ptr->obvious = TRUE;
197 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flags3 |= (RF3_EVIL);
199 em_ptr->note = _("は身震いした。", " shudders.");
200 em_ptr->note_dies = _("はドロドロに溶けた!", " dissolves!");
201 return PROCESS_CONTINUE;
205 process_result effect_monster_disp_good(player_type *caster_ptr, effect_monster_type *em_ptr)
207 if ((em_ptr->r_ptr->flags3 & (RF3_GOOD)) == 0)
209 em_ptr->skipped = TRUE;
211 return PROCESS_CONTINUE;
214 if (em_ptr->seen) em_ptr->obvious = TRUE;
216 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flags3 |= (RF3_GOOD);
218 em_ptr->note = _("は身震いした。", " shudders.");
219 em_ptr->note_dies = _("はドロドロに溶けた!", " dissolves!");
220 return PROCESS_CONTINUE;
224 process_result effect_monster_disp_living(effect_monster_type *em_ptr)
226 if (!monster_living(em_ptr->m_ptr->r_idx))
228 em_ptr->skipped = TRUE;
230 return PROCESS_CONTINUE;
233 if (em_ptr->seen) em_ptr->obvious = TRUE;
235 em_ptr->note = _("は身震いした。", " shudders.");
236 em_ptr->note_dies = _("はドロドロに溶けた!", " dissolves!");
237 return PROCESS_CONTINUE;
241 process_result effect_monster_disp_demon(player_type *caster_ptr, effect_monster_type *em_ptr)
243 if ((em_ptr->r_ptr->flags3 & (RF3_DEMON)) == 0)
245 em_ptr->skipped = TRUE;
247 return PROCESS_CONTINUE;
250 if (em_ptr->seen) em_ptr->obvious = TRUE;
252 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flags3 |= (RF3_DEMON);
254 em_ptr->note = _("は身震いした。", " shudders.");
255 em_ptr->note_dies = _("はドロドロに溶けた!", " dissolves!");
256 return PROCESS_CONTINUE;
260 process_result effect_monster_disp_all(effect_monster_type *em_ptr)
262 if (em_ptr->seen) em_ptr->obvious = TRUE;
264 em_ptr->note = _("は身震いした。", " shudders.");
265 em_ptr->note_dies = _("はドロドロに溶けた!", " dissolves!");
266 return PROCESS_CONTINUE;