1 #include "effect/effect-monster-resist-hurt.h"
2 #include "monster-race/monster-race.h"
3 #include "monster-race/race-flags-resistance.h"
4 #include "monster-race/race-flags1.h"
5 #include "monster-race/race-flags3.h"
6 #include "monster-race/race-indice-types.h"
7 #include "monster/monster-status.h"
8 #include "monster/monster-info.h"
10 switch_result effect_monster_void(effect_monster_type *em_ptr)
12 if (em_ptr->seen) em_ptr->obvious = TRUE;
14 return SWITCH_CONTINUE;
17 switch_result effect_monster_acid(player_type *caster_ptr, effect_monster_type *em_ptr)
19 if (em_ptr->seen) em_ptr->obvious = TRUE;
20 if ((em_ptr->r_ptr->flagsr & RFR_IM_ACID) == 0) return SWITCH_CONTINUE;
22 em_ptr->note = _("にはかなり耐性がある!", " resists a lot.");
24 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
25 em_ptr->r_ptr->r_flagsr |= (RFR_IM_ACID);
27 return SWITCH_CONTINUE;
31 switch_result effect_monster_elec(player_type *caster_ptr, effect_monster_type *em_ptr)
33 if (em_ptr->seen) em_ptr->obvious = TRUE;
34 if ((em_ptr->r_ptr->flagsr & RFR_IM_ELEC) == 0) return SWITCH_CONTINUE;
36 em_ptr->note = _("にはかなり耐性がある!", " resists a lot.");
38 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
39 em_ptr->r_ptr->r_flagsr |= (RFR_IM_ELEC);
41 return SWITCH_CONTINUE;
45 switch_result effect_monster_fire(player_type *caster_ptr, effect_monster_type *em_ptr)
47 if (em_ptr->seen) em_ptr->obvious = TRUE;
48 if (em_ptr->r_ptr->flagsr & RFR_IM_FIRE)
50 em_ptr->note = _("にはかなり耐性がある!", " resists a lot.");
52 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
53 em_ptr->r_ptr->r_flagsr |= (RFR_IM_FIRE);
55 return SWITCH_CONTINUE;
58 if ((em_ptr->r_ptr->flags3 & (RF3_HURT_FIRE)) == 0) return SWITCH_CONTINUE;
60 em_ptr->note = _("はひどい痛手をうけた。", " is hit hard.");
62 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
63 em_ptr->r_ptr->r_flags3 |= (RF3_HURT_FIRE);
65 return SWITCH_CONTINUE;
69 switch_result effect_monster_cold(player_type *caster_ptr, effect_monster_type *em_ptr)
71 if (em_ptr->seen) em_ptr->obvious = TRUE;
72 if (em_ptr->r_ptr->flagsr & RFR_IM_COLD)
74 em_ptr->note = _("にはかなり耐性がある!", " resists a lot.");
76 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
77 em_ptr->r_ptr->r_flagsr |= (RFR_IM_COLD);
79 return SWITCH_CONTINUE;
82 if ((em_ptr->r_ptr->flags3 & (RF3_HURT_COLD)) == 0) return SWITCH_CONTINUE;
84 em_ptr->note = _("はひどい痛手をうけた。", " is hit hard.");
86 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
87 em_ptr->r_ptr->r_flags3 |= (RF3_HURT_COLD);
89 return SWITCH_CONTINUE;
93 switch_result effect_monster_pois(player_type *caster_ptr, effect_monster_type *em_ptr)
95 if (em_ptr->seen) em_ptr->obvious = TRUE;
96 if ((em_ptr->r_ptr->flagsr & RFR_IM_POIS) == 0) return SWITCH_CONTINUE;
98 em_ptr->note = _("にはかなり耐性がある!", " resists a lot.");
100 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
101 em_ptr->r_ptr->r_flagsr |= (RFR_IM_POIS);
103 return SWITCH_CONTINUE;
107 switch_result effect_monster_nuke(player_type *caster_ptr, effect_monster_type *em_ptr)
109 if (em_ptr->seen) em_ptr->obvious = TRUE;
110 if (em_ptr->r_ptr->flagsr & RFR_IM_POIS)
112 em_ptr->note = _("には耐性がある。", " resists.");
113 em_ptr->dam *= 3; em_ptr->dam /= randint1(6) + 6;
114 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
115 em_ptr->r_ptr->r_flagsr |= (RFR_IM_POIS);
117 return SWITCH_CONTINUE;
120 if (one_in_(3)) em_ptr->do_polymorph = TRUE;
122 return SWITCH_CONTINUE;
126 switch_result effect_monster_hell_fire(player_type *caster_ptr, effect_monster_type *em_ptr)
128 if (em_ptr->seen) em_ptr->obvious = TRUE;
129 if ((em_ptr->r_ptr->flags3 & RF3_GOOD) == 0) return SWITCH_CONTINUE;
131 em_ptr->note = _("はひどい痛手をうけた。", " is hit hard.");
133 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
134 em_ptr->r_ptr->r_flags3 |= RF3_GOOD;
136 return SWITCH_CONTINUE;
140 switch_result effect_monster_holy_fire(player_type *caster_ptr, effect_monster_type *em_ptr)
142 if (em_ptr->seen) em_ptr->obvious = TRUE;
143 if ((em_ptr->r_ptr->flags3 & RF3_EVIL) == 0)
145 em_ptr->note = _("には耐性がある。", " resists.");
146 em_ptr->dam *= 3; em_ptr->dam /= randint1(6) + 6;
147 return SWITCH_CONTINUE;
151 em_ptr->note = _("はひどい痛手をうけた。", " is hit hard.");
152 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
153 em_ptr->r_ptr->r_flags3 |= RF3_EVIL;
155 return SWITCH_CONTINUE;
159 switch_result effect_monster_plasma(player_type *caster_ptr, effect_monster_type *em_ptr)
161 if (em_ptr->seen) em_ptr->obvious = TRUE;
162 if ((em_ptr->r_ptr->flagsr & RFR_RES_PLAS) == 0) return SWITCH_CONTINUE;
164 em_ptr->note = _("には耐性がある。", " resists.");
165 em_ptr->dam *= 3; em_ptr->dam /= randint1(6) + 6;
166 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
167 em_ptr->r_ptr->r_flagsr |= (RFR_RES_PLAS);
169 return SWITCH_CONTINUE;
173 static bool effect_monster_nether_resist(player_type *caster_ptr, effect_monster_type *em_ptr)
175 if ((em_ptr->r_ptr->flagsr & RFR_RES_NETH) == 0) return FALSE;
177 if (em_ptr->r_ptr->flags3 & RF3_UNDEAD)
179 em_ptr->note = _("には完全な耐性がある!", " is immune.");
181 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
182 em_ptr->r_ptr->r_flags3 |= (RF3_UNDEAD);
186 em_ptr->note = _("には耐性がある。", " resists.");
187 em_ptr->dam *= 3; em_ptr->dam /= randint1(6) + 6;
190 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
191 em_ptr->r_ptr->r_flagsr |= (RFR_RES_NETH);
197 switch_result effect_monster_nether(player_type *caster_ptr, effect_monster_type *em_ptr)
199 if (em_ptr->seen) em_ptr->obvious = TRUE;
201 if (effect_monster_nether_resist(caster_ptr, em_ptr)) return SWITCH_CONTINUE;
202 if ((em_ptr->r_ptr->flags3 & RF3_EVIL) == 0) return SWITCH_CONTINUE;
204 em_ptr->note = _("はいくらか耐性を示した。", " resists somewhat.");
206 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
207 em_ptr->r_ptr->r_flags3 |= (RF3_EVIL);
209 return SWITCH_CONTINUE;
213 switch_result effect_monster_water(player_type *caster_ptr, effect_monster_type *em_ptr)
215 if (em_ptr->seen) em_ptr->obvious = TRUE;
216 if ((em_ptr->r_ptr->flagsr & RFR_RES_WATE) == 0) return SWITCH_CONTINUE;
218 if ((em_ptr->m_ptr->r_idx == MON_WATER_ELEM) || (em_ptr->m_ptr->r_idx == MON_UNMAKER))
220 em_ptr->note = _("には完全な耐性がある!", " is immune.");
225 em_ptr->note = _("には耐性がある。", " resists.");
226 em_ptr->dam *= 3; em_ptr->dam /= randint1(6) + 6;
229 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
230 em_ptr->r_ptr->r_flagsr |= (RFR_RES_WATE);
232 return SWITCH_CONTINUE;
236 switch_result effect_monster_chaos(player_type *caster_ptr, effect_monster_type *em_ptr)
238 if (em_ptr->seen) em_ptr->obvious = TRUE;
239 if (em_ptr->r_ptr->flagsr & RFR_RES_CHAO)
241 em_ptr->note = _("には耐性がある。", " resists.");
242 em_ptr->dam *= 3; em_ptr->dam /= randint1(6) + 6;
243 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
244 em_ptr->r_ptr->r_flagsr |= (RFR_RES_CHAO);
246 else if ((em_ptr->r_ptr->flags3 & RF3_DEMON) && one_in_(3))
248 em_ptr->note = _("はいくらか耐性を示した。", " resists somewhat.");
249 em_ptr->dam *= 3; em_ptr->dam /= randint1(6) + 6;
250 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
251 em_ptr->r_ptr->r_flags3 |= (RF3_DEMON);
255 em_ptr->do_polymorph = TRUE;
256 em_ptr->do_conf = (5 + randint1(11) + em_ptr->r) / (em_ptr->r + 1);
259 return SWITCH_CONTINUE;
263 switch_result effect_monster_shards(player_type *caster_ptr, effect_monster_type *em_ptr)
265 if (em_ptr->seen) em_ptr->obvious = TRUE;
266 if ((em_ptr->r_ptr->flagsr & RFR_RES_SHAR) == 0) return SWITCH_CONTINUE;
268 em_ptr->note = _("には耐性がある。", " resists.");
269 em_ptr->dam *= 3; em_ptr->dam /= randint1(6) + 6;
270 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
271 em_ptr->r_ptr->r_flagsr |= (RFR_RES_SHAR);
273 return SWITCH_CONTINUE;
277 switch_result effect_monster_rocket(player_type *caster_ptr, effect_monster_type *em_ptr)
279 if (em_ptr->seen) em_ptr->obvious = TRUE;
280 if ((em_ptr->r_ptr->flagsr & RFR_RES_SHAR) == 0) return SWITCH_CONTINUE;
282 em_ptr->note = _("はいくらか耐性を示した。", " resists somewhat.");
284 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
285 em_ptr->r_ptr->r_flagsr |= (RFR_RES_SHAR);
287 return SWITCH_CONTINUE;
291 switch_result effect_monster_sound(player_type *caster_ptr, effect_monster_type *em_ptr)
293 if (em_ptr->seen) em_ptr->obvious = TRUE;
294 if ((em_ptr->r_ptr->flagsr & RFR_RES_SOUN) == 0)
296 em_ptr->do_stun = (10 + randint1(15) + em_ptr->r) / (em_ptr->r + 1);
297 return SWITCH_CONTINUE;
300 em_ptr->note = _("には耐性がある。", " resists.");
301 em_ptr->dam *= 2; em_ptr->dam /= randint1(6) + 6;
302 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
303 em_ptr->r_ptr->r_flagsr |= (RFR_RES_SOUN);
305 return SWITCH_CONTINUE;
309 switch_result effect_monster_confusion(player_type *caster_ptr, effect_monster_type *em_ptr)
311 if (em_ptr->seen) em_ptr->obvious = TRUE;
312 if ((em_ptr->r_ptr->flags3 & RF3_NO_CONF) == 0)
314 em_ptr->do_conf = (10 + randint1(15) + em_ptr->r) / (em_ptr->r + 1);
315 return SWITCH_CONTINUE;
318 em_ptr->note = _("には耐性がある。", " resists.");
319 em_ptr->dam *= 3; em_ptr->dam /= randint1(6) + 6;
320 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
321 em_ptr->r_ptr->r_flags3 |= (RF3_NO_CONF);
323 return SWITCH_CONTINUE;
327 switch_result effect_monster_disenchant(player_type *caster_ptr, effect_monster_type *em_ptr)
329 if (em_ptr->seen) em_ptr->obvious = TRUE;
330 if ((em_ptr->r_ptr->flagsr & RFR_RES_DISE) == 0) return SWITCH_CONTINUE;
332 em_ptr->note = _("には耐性がある。", " resists.");
333 em_ptr->dam *= 3; em_ptr->dam /= randint1(6) + 6;
334 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
335 em_ptr->r_ptr->r_flagsr |= (RFR_RES_DISE);
337 return SWITCH_CONTINUE;
341 switch_result effect_monster_nexus(player_type *caster_ptr, effect_monster_type *em_ptr)
343 if (em_ptr->seen) em_ptr->obvious = TRUE;
344 if ((em_ptr->r_ptr->flagsr & RFR_RES_NEXU) == 0) return SWITCH_CONTINUE;
346 em_ptr->note = _("には耐性がある。", " resists.");
347 em_ptr->dam *= 3; em_ptr->dam /= randint1(6) + 6;
348 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
349 em_ptr->r_ptr->r_flagsr |= (RFR_RES_NEXU);
351 return SWITCH_CONTINUE;
355 switch_result effect_monster_force(player_type *caster_ptr, effect_monster_type *em_ptr)
357 if (em_ptr->seen) em_ptr->obvious = TRUE;
358 if ((em_ptr->r_ptr->flagsr & RFR_RES_WALL) == 0)
360 em_ptr->do_stun = (randint1(15) + em_ptr->r) / (em_ptr->r + 1);
361 return SWITCH_CONTINUE;
364 em_ptr->note = _("には耐性がある。", " resists.");
365 em_ptr->dam *= 3; em_ptr->dam /= randint1(6) + 6;
366 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
367 em_ptr->r_ptr->r_flagsr |= (RFR_RES_WALL);
369 return SWITCH_CONTINUE;
373 // Powerful monsters can resists and normal monsters slow down.
374 switch_result effect_monster_inertial(player_type *caster_ptr, effect_monster_type *em_ptr)
376 if (em_ptr->seen) em_ptr->obvious = TRUE;
377 if (em_ptr->r_ptr->flagsr & RFR_RES_INER)
379 em_ptr->note = _("には耐性がある。", " resists.");
380 em_ptr->dam *= 3; em_ptr->dam /= randint1(6) + 6;
381 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
382 em_ptr->r_ptr->r_flagsr |= (RFR_RES_INER);
384 return SWITCH_CONTINUE;
387 if ((em_ptr->r_ptr->flags1 & (RF1_UNIQUE)) ||
388 (em_ptr->r_ptr->level > randint1((em_ptr->dam - 10) < 1 ? 1 : (em_ptr->dam - 10)) + 10))
390 em_ptr->obvious = FALSE;
391 return SWITCH_CONTINUE;
394 if (set_monster_slow(caster_ptr, em_ptr->g_ptr->m_idx, monster_slow_remaining(em_ptr->m_ptr) + 50))
395 em_ptr->note = _("の動きが遅くなった。", " starts moving slower.");
397 return SWITCH_CONTINUE;
401 switch_result effect_monster_time(player_type *caster_ptr, effect_monster_type *em_ptr)
403 if (em_ptr->seen) em_ptr->obvious = TRUE;
404 if ((em_ptr->r_ptr->flagsr & RFR_RES_TIME) == 0)
406 em_ptr->do_time = (em_ptr->dam + 1) / 2;
407 return SWITCH_CONTINUE;
410 em_ptr->note = _("には耐性がある。", " resists.");
411 em_ptr->dam *= 3; em_ptr->dam /= randint1(6) + 6;
412 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
413 em_ptr->r_ptr->r_flagsr |= (RFR_RES_TIME);
415 return SWITCH_CONTINUE;
419 static bool effect_monster_gravity_resist_teleport(player_type *caster_ptr, effect_monster_type *em_ptr)
422 if (em_ptr->seen) em_ptr->obvious = TRUE;
423 if ((em_ptr->r_ptr->flagsr & RFR_RES_TELE) == 0) return FALSE;
425 if (em_ptr->r_ptr->flags1 & (RF1_UNIQUE))
427 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
428 em_ptr->r_ptr->r_flagsr |= RFR_RES_TELE;
430 em_ptr->note = _("には効果がなかった。", " is unaffected!");
434 if (em_ptr->r_ptr->level <= randint1(100)) return FALSE;
436 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
437 em_ptr->r_ptr->r_flagsr |= RFR_RES_TELE;
439 em_ptr->note = _("には耐性がある!", " resists!");
444 static void effect_monster_gravity_slow(player_type *caster_ptr, effect_monster_type *em_ptr)
446 if ((em_ptr->r_ptr->flags1 & (RF1_UNIQUE)) ||
447 (em_ptr->r_ptr->level > randint1((em_ptr->dam - 10) < 1 ? 1 : (em_ptr->dam - 10)) + 10))
448 em_ptr->obvious = FALSE;
450 if (set_monster_slow(caster_ptr, em_ptr->g_ptr->m_idx, monster_slow_remaining(em_ptr->m_ptr) + 50))
451 em_ptr->note = _("の動きが遅くなった。", " starts moving slower.");
455 static void effect_monster_gravity_stun(effect_monster_type *em_ptr)
457 em_ptr->do_stun = damroll((em_ptr->caster_lev / 20) + 3, (em_ptr->dam)) + 1;
458 if ((em_ptr->r_ptr->flags1 & (RF1_UNIQUE)) ||
459 (em_ptr->r_ptr->level > randint1((em_ptr->dam - 10) < 1 ? 1 : (em_ptr->dam - 10)) + 10))
462 em_ptr->note = _("には効果がなかった。", " is unaffected!");
463 em_ptr->obvious = FALSE;
469 * Powerful monsters can resist and normal monsters slow down
470 * Furthermore, this magic can make non-unique monsters slow/stun.
472 switch_result effect_monster_gravity(player_type *caster_ptr, effect_monster_type *em_ptr)
474 em_ptr->do_dist = effect_monster_gravity_resist_teleport(caster_ptr, em_ptr) ? 0 : 10;
475 if (caster_ptr->riding && (em_ptr->g_ptr->m_idx == caster_ptr->riding)) em_ptr->do_dist = 0;
477 if (em_ptr->r_ptr->flagsr & RFR_RES_GRAV)
479 em_ptr->note = _("には耐性がある!", " resists!");
480 em_ptr->dam *= 3; em_ptr->dam /= randint1(6) + 6;
482 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
483 em_ptr->r_ptr->r_flagsr |= (RFR_RES_GRAV);
485 return SWITCH_CONTINUE;
488 effect_monster_gravity_slow(caster_ptr, em_ptr);
489 effect_monster_gravity_stun(em_ptr);
490 return SWITCH_CONTINUE;
494 switch_result effect_monster_disintegration(player_type *caster_ptr, effect_monster_type *em_ptr)
496 if (em_ptr->seen) em_ptr->obvious = TRUE;
497 if ((em_ptr->r_ptr->flags3 & RF3_HURT_ROCK) == 0) return SWITCH_CONTINUE;
499 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
500 em_ptr->r_ptr->r_flags3 |= (RF3_HURT_ROCK);
502 em_ptr->note = _("の皮膚がただれた!", " loses some skin!");
503 em_ptr->note_dies = _("は蒸発した!", " evaporates!");
505 return SWITCH_CONTINUE;
508 switch_result effect_monster_icee_bolt(player_type *caster_ptr, effect_monster_type *em_ptr)
510 if (em_ptr->seen) em_ptr->obvious = TRUE;
512 em_ptr->do_stun = (randint1(15) + 1) / (em_ptr->r + 1);
513 if (em_ptr->r_ptr->flagsr & RFR_IM_COLD)
515 em_ptr->note = _("にはかなり耐性がある!", " resists a lot.");
517 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
518 em_ptr->r_ptr->r_flagsr |= (RFR_IM_COLD);
520 else if (em_ptr->r_ptr->flags3 & (RF3_HURT_COLD))
522 em_ptr->note = _("はひどい痛手をうけた。", " is hit hard.");
524 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
525 em_ptr->r_ptr->r_flags3 |= (RF3_HURT_COLD);
528 return SWITCH_CONTINUE;