1 #include "effect/effect-monster-resist-hurt.h"
2 #include "effect/effect-monster-util.h"
3 #include "monster-race/monster-race.h"
4 #include "monster-race/race-flags-resistance.h"
5 #include "monster-race/race-flags1.h"
6 #include "monster-race/race-flags3.h"
7 #include "monster-race/race-indice-types.h"
8 #include "monster/monster-status-setter.h"
9 #include "monster/monster-status.h"
10 #include "monster/monster-info.h"
12 process_result effect_monster_void(effect_monster_type *em_ptr)
14 if (em_ptr->seen) em_ptr->obvious = TRUE;
16 return PROCESS_CONTINUE;
19 process_result effect_monster_acid(player_type *caster_ptr, effect_monster_type *em_ptr)
21 if (em_ptr->seen) em_ptr->obvious = TRUE;
22 if ((em_ptr->r_ptr->flagsr & RFR_IM_ACID) == 0) return PROCESS_CONTINUE;
24 em_ptr->note = _("にはかなり耐性がある!", " resists a lot.");
26 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
27 em_ptr->r_ptr->r_flagsr |= (RFR_IM_ACID);
29 return PROCESS_CONTINUE;
33 process_result effect_monster_elec(player_type *caster_ptr, effect_monster_type *em_ptr)
35 if (em_ptr->seen) em_ptr->obvious = TRUE;
36 if ((em_ptr->r_ptr->flagsr & RFR_IM_ELEC) == 0) return PROCESS_CONTINUE;
38 em_ptr->note = _("にはかなり耐性がある!", " resists a lot.");
40 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
41 em_ptr->r_ptr->r_flagsr |= (RFR_IM_ELEC);
43 return PROCESS_CONTINUE;
47 process_result effect_monster_fire(player_type *caster_ptr, effect_monster_type *em_ptr)
49 if (em_ptr->seen) em_ptr->obvious = TRUE;
50 if (em_ptr->r_ptr->flagsr & RFR_IM_FIRE)
52 em_ptr->note = _("にはかなり耐性がある!", " resists a lot.");
54 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
55 em_ptr->r_ptr->r_flagsr |= (RFR_IM_FIRE);
57 return PROCESS_CONTINUE;
60 if ((em_ptr->r_ptr->flags3 & (RF3_HURT_FIRE)) == 0) return PROCESS_CONTINUE;
62 em_ptr->note = _("はひどい痛手をうけた。", " is hit hard.");
64 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
65 em_ptr->r_ptr->r_flags3 |= (RF3_HURT_FIRE);
67 return PROCESS_CONTINUE;
71 process_result effect_monster_cold(player_type *caster_ptr, effect_monster_type *em_ptr)
73 if (em_ptr->seen) em_ptr->obvious = TRUE;
74 if (em_ptr->r_ptr->flagsr & RFR_IM_COLD)
76 em_ptr->note = _("にはかなり耐性がある!", " resists a lot.");
78 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
79 em_ptr->r_ptr->r_flagsr |= (RFR_IM_COLD);
81 return PROCESS_CONTINUE;
84 if ((em_ptr->r_ptr->flags3 & (RF3_HURT_COLD)) == 0) return PROCESS_CONTINUE;
86 em_ptr->note = _("はひどい痛手をうけた。", " is hit hard.");
88 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
89 em_ptr->r_ptr->r_flags3 |= (RF3_HURT_COLD);
91 return PROCESS_CONTINUE;
95 process_result effect_monster_pois(player_type *caster_ptr, effect_monster_type *em_ptr)
97 if (em_ptr->seen) em_ptr->obvious = TRUE;
98 if ((em_ptr->r_ptr->flagsr & RFR_IM_POIS) == 0) return PROCESS_CONTINUE;
100 em_ptr->note = _("にはかなり耐性がある!", " resists a lot.");
102 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
103 em_ptr->r_ptr->r_flagsr |= (RFR_IM_POIS);
105 return PROCESS_CONTINUE;
109 process_result effect_monster_nuke(player_type *caster_ptr, effect_monster_type *em_ptr)
111 if (em_ptr->seen) em_ptr->obvious = TRUE;
112 if (em_ptr->r_ptr->flagsr & RFR_IM_POIS)
114 em_ptr->note = _("には耐性がある。", " resists.");
115 em_ptr->dam *= 3; em_ptr->dam /= randint1(6) + 6;
116 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
117 em_ptr->r_ptr->r_flagsr |= (RFR_IM_POIS);
119 return PROCESS_CONTINUE;
122 if (one_in_(3)) em_ptr->do_polymorph = TRUE;
124 return PROCESS_CONTINUE;
128 process_result effect_monster_hell_fire(player_type *caster_ptr, effect_monster_type *em_ptr)
130 if (em_ptr->seen) em_ptr->obvious = TRUE;
131 if ((em_ptr->r_ptr->flags3 & RF3_GOOD) == 0) return PROCESS_CONTINUE;
133 em_ptr->note = _("はひどい痛手をうけた。", " is hit hard.");
135 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
136 em_ptr->r_ptr->r_flags3 |= RF3_GOOD;
138 return PROCESS_CONTINUE;
142 process_result effect_monster_holy_fire(player_type *caster_ptr, effect_monster_type *em_ptr)
144 if (em_ptr->seen) em_ptr->obvious = TRUE;
145 if ((em_ptr->r_ptr->flags3 & RF3_EVIL) == 0)
147 em_ptr->note = _("には耐性がある。", " resists.");
148 em_ptr->dam *= 3; em_ptr->dam /= randint1(6) + 6;
149 return PROCESS_CONTINUE;
153 em_ptr->note = _("はひどい痛手をうけた。", " is hit hard.");
154 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
155 em_ptr->r_ptr->r_flags3 |= RF3_EVIL;
157 return PROCESS_CONTINUE;
161 process_result effect_monster_plasma(player_type *caster_ptr, effect_monster_type *em_ptr)
163 if (em_ptr->seen) em_ptr->obvious = TRUE;
164 if ((em_ptr->r_ptr->flagsr & RFR_RES_PLAS) == 0) return PROCESS_CONTINUE;
166 em_ptr->note = _("には耐性がある。", " resists.");
167 em_ptr->dam *= 3; em_ptr->dam /= randint1(6) + 6;
168 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
169 em_ptr->r_ptr->r_flagsr |= (RFR_RES_PLAS);
171 return PROCESS_CONTINUE;
175 static bool effect_monster_nether_resist(player_type *caster_ptr, effect_monster_type *em_ptr)
177 if ((em_ptr->r_ptr->flagsr & RFR_RES_NETH) == 0) return FALSE;
179 if (em_ptr->r_ptr->flags3 & RF3_UNDEAD)
181 em_ptr->note = _("には完全な耐性がある!", " is immune.");
183 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
184 em_ptr->r_ptr->r_flags3 |= (RF3_UNDEAD);
188 em_ptr->note = _("には耐性がある。", " resists.");
189 em_ptr->dam *= 3; em_ptr->dam /= randint1(6) + 6;
192 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
193 em_ptr->r_ptr->r_flagsr |= (RFR_RES_NETH);
199 process_result effect_monster_nether(player_type *caster_ptr, effect_monster_type *em_ptr)
201 if (em_ptr->seen) em_ptr->obvious = TRUE;
203 if (effect_monster_nether_resist(caster_ptr, em_ptr)) return PROCESS_CONTINUE;
204 if ((em_ptr->r_ptr->flags3 & RF3_EVIL) == 0) return PROCESS_CONTINUE;
206 em_ptr->note = _("はいくらか耐性を示した。", " resists somewhat.");
208 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
209 em_ptr->r_ptr->r_flags3 |= (RF3_EVIL);
211 return PROCESS_CONTINUE;
215 process_result effect_monster_water(player_type *caster_ptr, effect_monster_type *em_ptr)
217 if (em_ptr->seen) em_ptr->obvious = TRUE;
218 if ((em_ptr->r_ptr->flagsr & RFR_RES_WATE) == 0) return PROCESS_CONTINUE;
220 if ((em_ptr->m_ptr->r_idx == MON_WATER_ELEM) || (em_ptr->m_ptr->r_idx == MON_UNMAKER))
222 em_ptr->note = _("には完全な耐性がある!", " is immune.");
227 em_ptr->note = _("には耐性がある。", " resists.");
228 em_ptr->dam *= 3; em_ptr->dam /= randint1(6) + 6;
231 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
232 em_ptr->r_ptr->r_flagsr |= (RFR_RES_WATE);
234 return PROCESS_CONTINUE;
238 process_result effect_monster_chaos(player_type *caster_ptr, effect_monster_type *em_ptr)
240 if (em_ptr->seen) em_ptr->obvious = TRUE;
241 if (em_ptr->r_ptr->flagsr & RFR_RES_CHAO)
243 em_ptr->note = _("には耐性がある。", " resists.");
244 em_ptr->dam *= 3; em_ptr->dam /= randint1(6) + 6;
245 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
246 em_ptr->r_ptr->r_flagsr |= (RFR_RES_CHAO);
248 else if ((em_ptr->r_ptr->flags3 & RF3_DEMON) && one_in_(3))
250 em_ptr->note = _("はいくらか耐性を示した。", " resists somewhat.");
251 em_ptr->dam *= 3; em_ptr->dam /= randint1(6) + 6;
252 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
253 em_ptr->r_ptr->r_flags3 |= (RF3_DEMON);
257 em_ptr->do_polymorph = TRUE;
258 em_ptr->do_conf = (5 + randint1(11) + em_ptr->r) / (em_ptr->r + 1);
261 return PROCESS_CONTINUE;
265 process_result effect_monster_shards(player_type *caster_ptr, effect_monster_type *em_ptr)
267 if (em_ptr->seen) em_ptr->obvious = TRUE;
268 if ((em_ptr->r_ptr->flagsr & RFR_RES_SHAR) == 0) return PROCESS_CONTINUE;
270 em_ptr->note = _("には耐性がある。", " resists.");
271 em_ptr->dam *= 3; em_ptr->dam /= randint1(6) + 6;
272 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
273 em_ptr->r_ptr->r_flagsr |= (RFR_RES_SHAR);
275 return PROCESS_CONTINUE;
279 process_result effect_monster_rocket(player_type *caster_ptr, effect_monster_type *em_ptr)
281 if (em_ptr->seen) em_ptr->obvious = TRUE;
282 if ((em_ptr->r_ptr->flagsr & RFR_RES_SHAR) == 0) return PROCESS_CONTINUE;
284 em_ptr->note = _("はいくらか耐性を示した。", " resists somewhat.");
286 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
287 em_ptr->r_ptr->r_flagsr |= (RFR_RES_SHAR);
289 return PROCESS_CONTINUE;
293 process_result effect_monster_sound(player_type *caster_ptr, effect_monster_type *em_ptr)
295 if (em_ptr->seen) em_ptr->obvious = TRUE;
296 if ((em_ptr->r_ptr->flagsr & RFR_RES_SOUN) == 0)
298 em_ptr->do_stun = (10 + randint1(15) + em_ptr->r) / (em_ptr->r + 1);
299 return PROCESS_CONTINUE;
302 em_ptr->note = _("には耐性がある。", " resists.");
303 em_ptr->dam *= 2; em_ptr->dam /= randint1(6) + 6;
304 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
305 em_ptr->r_ptr->r_flagsr |= (RFR_RES_SOUN);
307 return PROCESS_CONTINUE;
311 process_result effect_monster_confusion(player_type *caster_ptr, effect_monster_type *em_ptr)
313 if (em_ptr->seen) em_ptr->obvious = TRUE;
314 if ((em_ptr->r_ptr->flags3 & RF3_NO_CONF) == 0)
316 em_ptr->do_conf = (10 + randint1(15) + em_ptr->r) / (em_ptr->r + 1);
317 return PROCESS_CONTINUE;
320 em_ptr->note = _("には耐性がある。", " resists.");
321 em_ptr->dam *= 3; em_ptr->dam /= randint1(6) + 6;
322 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
323 em_ptr->r_ptr->r_flags3 |= (RF3_NO_CONF);
325 return PROCESS_CONTINUE;
329 process_result effect_monster_disenchant(player_type *caster_ptr, effect_monster_type *em_ptr)
331 if (em_ptr->seen) em_ptr->obvious = TRUE;
332 if ((em_ptr->r_ptr->flagsr & RFR_RES_DISE) == 0) return PROCESS_CONTINUE;
334 em_ptr->note = _("には耐性がある。", " resists.");
335 em_ptr->dam *= 3; em_ptr->dam /= randint1(6) + 6;
336 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
337 em_ptr->r_ptr->r_flagsr |= (RFR_RES_DISE);
339 return PROCESS_CONTINUE;
343 process_result effect_monster_nexus(player_type *caster_ptr, effect_monster_type *em_ptr)
345 if (em_ptr->seen) em_ptr->obvious = TRUE;
346 if ((em_ptr->r_ptr->flagsr & RFR_RES_NEXU) == 0) return PROCESS_CONTINUE;
348 em_ptr->note = _("には耐性がある。", " resists.");
349 em_ptr->dam *= 3; em_ptr->dam /= randint1(6) + 6;
350 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
351 em_ptr->r_ptr->r_flagsr |= (RFR_RES_NEXU);
353 return PROCESS_CONTINUE;
357 process_result effect_monster_force(player_type *caster_ptr, effect_monster_type *em_ptr)
359 if (em_ptr->seen) em_ptr->obvious = TRUE;
360 if ((em_ptr->r_ptr->flagsr & RFR_RES_WALL) == 0)
362 em_ptr->do_stun = (randint1(15) + em_ptr->r) / (em_ptr->r + 1);
363 return PROCESS_CONTINUE;
366 em_ptr->note = _("には耐性がある。", " resists.");
367 em_ptr->dam *= 3; em_ptr->dam /= randint1(6) + 6;
368 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
369 em_ptr->r_ptr->r_flagsr |= (RFR_RES_WALL);
371 return PROCESS_CONTINUE;
375 // Powerful monsters can resists and normal monsters slow down.
376 process_result effect_monster_inertial(player_type *caster_ptr, effect_monster_type *em_ptr)
378 if (em_ptr->seen) em_ptr->obvious = TRUE;
379 if (em_ptr->r_ptr->flagsr & RFR_RES_INER)
381 em_ptr->note = _("には耐性がある。", " resists.");
382 em_ptr->dam *= 3; em_ptr->dam /= randint1(6) + 6;
383 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
384 em_ptr->r_ptr->r_flagsr |= (RFR_RES_INER);
386 return PROCESS_CONTINUE;
389 if ((em_ptr->r_ptr->flags1 & (RF1_UNIQUE)) ||
390 (em_ptr->r_ptr->level > randint1((em_ptr->dam - 10) < 1 ? 1 : (em_ptr->dam - 10)) + 10))
392 em_ptr->obvious = FALSE;
393 return PROCESS_CONTINUE;
396 if (set_monster_slow(caster_ptr, em_ptr->g_ptr->m_idx, monster_slow_remaining(em_ptr->m_ptr) + 50))
397 em_ptr->note = _("の動きが遅くなった。", " starts moving slower.");
399 return PROCESS_CONTINUE;
403 process_result effect_monster_time(player_type *caster_ptr, effect_monster_type *em_ptr)
405 if (em_ptr->seen) em_ptr->obvious = TRUE;
406 if ((em_ptr->r_ptr->flagsr & RFR_RES_TIME) == 0)
408 em_ptr->do_time = (em_ptr->dam + 1) / 2;
409 return PROCESS_CONTINUE;
412 em_ptr->note = _("には耐性がある。", " resists.");
413 em_ptr->dam *= 3; em_ptr->dam /= randint1(6) + 6;
414 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
415 em_ptr->r_ptr->r_flagsr |= (RFR_RES_TIME);
417 return PROCESS_CONTINUE;
421 static bool effect_monster_gravity_resist_teleport(player_type *caster_ptr, effect_monster_type *em_ptr)
424 if (em_ptr->seen) em_ptr->obvious = TRUE;
425 if ((em_ptr->r_ptr->flagsr & RFR_RES_TELE) == 0) return FALSE;
427 if (em_ptr->r_ptr->flags1 & (RF1_UNIQUE))
429 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
430 em_ptr->r_ptr->r_flagsr |= RFR_RES_TELE;
432 em_ptr->note = _("には効果がなかった。", " is unaffected!");
436 if (em_ptr->r_ptr->level <= randint1(100)) return FALSE;
438 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
439 em_ptr->r_ptr->r_flagsr |= RFR_RES_TELE;
441 em_ptr->note = _("には耐性がある!", " resists!");
446 static void effect_monster_gravity_slow(player_type *caster_ptr, effect_monster_type *em_ptr)
448 if ((em_ptr->r_ptr->flags1 & (RF1_UNIQUE)) ||
449 (em_ptr->r_ptr->level > randint1((em_ptr->dam - 10) < 1 ? 1 : (em_ptr->dam - 10)) + 10))
450 em_ptr->obvious = FALSE;
452 if (set_monster_slow(caster_ptr, em_ptr->g_ptr->m_idx, monster_slow_remaining(em_ptr->m_ptr) + 50))
453 em_ptr->note = _("の動きが遅くなった。", " starts moving slower.");
457 static void effect_monster_gravity_stun(effect_monster_type *em_ptr)
459 em_ptr->do_stun = damroll((em_ptr->caster_lev / 20) + 3, (em_ptr->dam)) + 1;
460 if ((em_ptr->r_ptr->flags1 & (RF1_UNIQUE)) ||
461 (em_ptr->r_ptr->level > randint1((em_ptr->dam - 10) < 1 ? 1 : (em_ptr->dam - 10)) + 10))
464 em_ptr->note = _("には効果がなかった。", " is unaffected!");
465 em_ptr->obvious = FALSE;
471 * Powerful monsters can resist and normal monsters slow down
472 * Furthermore, this magic can make non-unique monsters slow/stun.
474 process_result effect_monster_gravity(player_type *caster_ptr, effect_monster_type *em_ptr)
476 em_ptr->do_dist = effect_monster_gravity_resist_teleport(caster_ptr, em_ptr) ? 0 : 10;
477 if (caster_ptr->riding && (em_ptr->g_ptr->m_idx == caster_ptr->riding)) em_ptr->do_dist = 0;
479 if (em_ptr->r_ptr->flagsr & RFR_RES_GRAV)
481 em_ptr->note = _("には耐性がある!", " resists!");
482 em_ptr->dam *= 3; em_ptr->dam /= randint1(6) + 6;
484 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
485 em_ptr->r_ptr->r_flagsr |= (RFR_RES_GRAV);
487 return PROCESS_CONTINUE;
490 effect_monster_gravity_slow(caster_ptr, em_ptr);
491 effect_monster_gravity_stun(em_ptr);
492 return PROCESS_CONTINUE;
496 process_result effect_monster_disintegration(player_type *caster_ptr, effect_monster_type *em_ptr)
498 if (em_ptr->seen) em_ptr->obvious = TRUE;
499 if ((em_ptr->r_ptr->flags3 & RF3_HURT_ROCK) == 0) return PROCESS_CONTINUE;
501 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
502 em_ptr->r_ptr->r_flags3 |= (RF3_HURT_ROCK);
504 em_ptr->note = _("の皮膚がただれた!", " loses some skin!");
505 em_ptr->note_dies = _("は蒸発した!", " evaporates!");
507 return PROCESS_CONTINUE;
510 process_result effect_monster_icee_bolt(player_type *caster_ptr, effect_monster_type *em_ptr)
512 if (em_ptr->seen) em_ptr->obvious = TRUE;
514 em_ptr->do_stun = (randint1(15) + 1) / (em_ptr->r + 1);
515 if (em_ptr->r_ptr->flagsr & RFR_IM_COLD)
517 em_ptr->note = _("にはかなり耐性がある!", " resists a lot.");
519 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
520 em_ptr->r_ptr->r_flagsr |= (RFR_IM_COLD);
522 else if (em_ptr->r_ptr->flags3 & (RF3_HURT_COLD))
524 em_ptr->note = _("はひどい痛手をうけた。", " is hit hard.");
526 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
527 em_ptr->r_ptr->r_flags3 |= (RF3_HURT_COLD);
530 return PROCESS_CONTINUE;