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-info.h"
9 #include "monster/monster-status-setter.h"
10 #include "monster/monster-status.h"
12 process_result effect_monster_void(effect_monster_type *em_ptr)
15 em_ptr->obvious = TRUE;
17 return PROCESS_CONTINUE;
20 process_result effect_monster_acid(player_type *caster_ptr, effect_monster_type *em_ptr)
23 em_ptr->obvious = TRUE;
25 if ((em_ptr->r_ptr->flagsr & RFR_IM_ACID) == 0)
26 return PROCESS_CONTINUE;
28 em_ptr->note = _("にはかなり耐性がある!", " resists a lot.");
30 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
31 em_ptr->r_ptr->r_flagsr |= (RFR_IM_ACID);
33 return PROCESS_CONTINUE;
36 process_result effect_monster_elec(player_type *caster_ptr, effect_monster_type *em_ptr)
39 em_ptr->obvious = TRUE;
41 if ((em_ptr->r_ptr->flagsr & RFR_IM_ELEC) == 0)
42 return PROCESS_CONTINUE;
44 em_ptr->note = _("にはかなり耐性がある!", " resists a lot.");
46 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
47 em_ptr->r_ptr->r_flagsr |= (RFR_IM_ELEC);
49 return PROCESS_CONTINUE;
52 process_result effect_monster_fire(player_type *caster_ptr, effect_monster_type *em_ptr)
55 em_ptr->obvious = TRUE;
57 if (em_ptr->r_ptr->flagsr & RFR_IM_FIRE) {
58 em_ptr->note = _("にはかなり耐性がある!", " resists a lot.");
60 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
61 em_ptr->r_ptr->r_flagsr |= (RFR_IM_FIRE);
63 return PROCESS_CONTINUE;
66 if ((em_ptr->r_ptr->flags3 & (RF3_HURT_FIRE)) == 0)
67 return PROCESS_CONTINUE;
69 em_ptr->note = _("はひどい痛手をうけた。", " is hit hard.");
71 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
72 em_ptr->r_ptr->r_flags3 |= (RF3_HURT_FIRE);
74 return PROCESS_CONTINUE;
77 process_result effect_monster_cold(player_type *caster_ptr, effect_monster_type *em_ptr)
80 em_ptr->obvious = TRUE;
82 if (em_ptr->r_ptr->flagsr & RFR_IM_COLD) {
83 em_ptr->note = _("にはかなり耐性がある!", " resists a lot.");
85 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
86 em_ptr->r_ptr->r_flagsr |= (RFR_IM_COLD);
88 return PROCESS_CONTINUE;
91 if ((em_ptr->r_ptr->flags3 & (RF3_HURT_COLD)) == 0)
92 return PROCESS_CONTINUE;
94 em_ptr->note = _("はひどい痛手をうけた。", " is hit hard.");
96 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
97 em_ptr->r_ptr->r_flags3 |= (RF3_HURT_COLD);
99 return PROCESS_CONTINUE;
102 process_result effect_monster_pois(player_type *caster_ptr, effect_monster_type *em_ptr)
105 em_ptr->obvious = TRUE;
107 if ((em_ptr->r_ptr->flagsr & RFR_IM_POIS) == 0)
108 return PROCESS_CONTINUE;
110 em_ptr->note = _("にはかなり耐性がある!", " resists a lot.");
112 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
113 em_ptr->r_ptr->r_flagsr |= (RFR_IM_POIS);
115 return PROCESS_CONTINUE;
118 process_result effect_monster_nuke(player_type *caster_ptr, effect_monster_type *em_ptr)
121 em_ptr->obvious = TRUE;
123 if (em_ptr->r_ptr->flagsr & RFR_IM_POIS) {
124 em_ptr->note = _("には耐性がある。", " resists.");
126 em_ptr->dam /= randint1(6) + 6;
127 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
128 em_ptr->r_ptr->r_flagsr |= (RFR_IM_POIS);
130 return PROCESS_CONTINUE;
134 em_ptr->do_polymorph = TRUE;
136 return PROCESS_CONTINUE;
139 process_result effect_monster_hell_fire(player_type *caster_ptr, effect_monster_type *em_ptr)
142 em_ptr->obvious = TRUE;
144 if ((em_ptr->r_ptr->flags3 & RF3_GOOD) == 0)
145 return PROCESS_CONTINUE;
147 em_ptr->note = _("はひどい痛手をうけた。", " is hit hard.");
149 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
150 em_ptr->r_ptr->r_flags3 |= RF3_GOOD;
152 return PROCESS_CONTINUE;
155 process_result effect_monster_holy_fire(player_type *caster_ptr, effect_monster_type *em_ptr)
158 em_ptr->obvious = TRUE;
160 if ((em_ptr->r_ptr->flags3 & RF3_EVIL) == 0) {
161 em_ptr->note = _("には耐性がある。", " resists.");
163 em_ptr->dam /= randint1(6) + 6;
164 return PROCESS_CONTINUE;
168 em_ptr->note = _("はひどい痛手をうけた。", " is hit hard.");
169 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
170 em_ptr->r_ptr->r_flags3 |= RF3_EVIL;
172 return PROCESS_CONTINUE;
175 process_result effect_monster_plasma(player_type *caster_ptr, effect_monster_type *em_ptr)
178 em_ptr->obvious = TRUE;
180 if ((em_ptr->r_ptr->flagsr & RFR_RES_PLAS) == 0)
181 return PROCESS_CONTINUE;
183 em_ptr->note = _("には耐性がある。", " resists.");
185 em_ptr->dam /= randint1(6) + 6;
186 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
187 em_ptr->r_ptr->r_flagsr |= (RFR_RES_PLAS);
189 return PROCESS_CONTINUE;
192 static bool effect_monster_nether_resist(player_type *caster_ptr, effect_monster_type *em_ptr)
194 if ((em_ptr->r_ptr->flagsr & RFR_RES_NETH) == 0)
197 if (em_ptr->r_ptr->flags3 & RF3_UNDEAD) {
198 em_ptr->note = _("には完全な耐性がある!", " is immune.");
200 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
201 em_ptr->r_ptr->r_flags3 |= (RF3_UNDEAD);
203 em_ptr->note = _("には耐性がある。", " resists.");
205 em_ptr->dam /= randint1(6) + 6;
208 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
209 em_ptr->r_ptr->r_flagsr |= (RFR_RES_NETH);
214 process_result effect_monster_nether(player_type *caster_ptr, effect_monster_type *em_ptr)
217 em_ptr->obvious = TRUE;
219 if (effect_monster_nether_resist(caster_ptr, em_ptr) || ((em_ptr->r_ptr->flags3 & RF3_EVIL) == 0))
220 return PROCESS_CONTINUE;
222 em_ptr->note = _("はいくらか耐性を示した。", " resists somewhat.");
224 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
225 em_ptr->r_ptr->r_flags3 |= (RF3_EVIL);
227 return PROCESS_CONTINUE;
230 process_result effect_monster_water(player_type *caster_ptr, effect_monster_type *em_ptr)
233 em_ptr->obvious = TRUE;
235 if ((em_ptr->r_ptr->flagsr & RFR_RES_WATE) == 0)
236 return PROCESS_CONTINUE;
238 if ((em_ptr->m_ptr->r_idx == MON_WATER_ELEM) || (em_ptr->m_ptr->r_idx == MON_UNMAKER)) {
239 em_ptr->note = _("には完全な耐性がある!", " is immune.");
242 em_ptr->note = _("には耐性がある。", " resists.");
244 em_ptr->dam /= randint1(6) + 6;
247 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
248 em_ptr->r_ptr->r_flagsr |= (RFR_RES_WATE);
250 return PROCESS_CONTINUE;
253 process_result effect_monster_chaos(player_type *caster_ptr, effect_monster_type *em_ptr)
256 em_ptr->obvious = TRUE;
258 if (em_ptr->r_ptr->flagsr & RFR_RES_CHAO) {
259 em_ptr->note = _("には耐性がある。", " resists.");
261 em_ptr->dam /= randint1(6) + 6;
262 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
263 em_ptr->r_ptr->r_flagsr |= (RFR_RES_CHAO);
264 } else if ((em_ptr->r_ptr->flags3 & RF3_DEMON) && one_in_(3)) {
265 em_ptr->note = _("はいくらか耐性を示した。", " resists somewhat.");
267 em_ptr->dam /= randint1(6) + 6;
268 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
269 em_ptr->r_ptr->r_flags3 |= (RF3_DEMON);
271 em_ptr->do_polymorph = TRUE;
272 em_ptr->do_conf = (5 + randint1(11) + em_ptr->r) / (em_ptr->r + 1);
275 return PROCESS_CONTINUE;
278 process_result effect_monster_shards(player_type *caster_ptr, effect_monster_type *em_ptr)
281 em_ptr->obvious = TRUE;
283 if ((em_ptr->r_ptr->flagsr & RFR_RES_SHAR) == 0)
284 return PROCESS_CONTINUE;
286 em_ptr->note = _("には耐性がある。", " resists.");
288 em_ptr->dam /= randint1(6) + 6;
289 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
290 em_ptr->r_ptr->r_flagsr |= (RFR_RES_SHAR);
292 return PROCESS_CONTINUE;
295 process_result effect_monster_rocket(player_type *caster_ptr, effect_monster_type *em_ptr)
298 em_ptr->obvious = TRUE;
300 if ((em_ptr->r_ptr->flagsr & RFR_RES_SHAR) == 0)
301 return PROCESS_CONTINUE;
303 em_ptr->note = _("はいくらか耐性を示した。", " resists somewhat.");
305 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
306 em_ptr->r_ptr->r_flagsr |= (RFR_RES_SHAR);
308 return PROCESS_CONTINUE;
311 process_result effect_monster_sound(player_type *caster_ptr, effect_monster_type *em_ptr)
314 em_ptr->obvious = TRUE;
316 if ((em_ptr->r_ptr->flagsr & RFR_RES_SOUN) == 0) {
317 em_ptr->do_stun = (10 + randint1(15) + em_ptr->r) / (em_ptr->r + 1);
318 return PROCESS_CONTINUE;
321 em_ptr->note = _("には耐性がある。", " resists.");
323 em_ptr->dam /= randint1(6) + 6;
324 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
325 em_ptr->r_ptr->r_flagsr |= (RFR_RES_SOUN);
327 return PROCESS_CONTINUE;
330 process_result effect_monster_confusion(player_type *caster_ptr, effect_monster_type *em_ptr)
333 em_ptr->obvious = TRUE;
335 if ((em_ptr->r_ptr->flags3 & RF3_NO_CONF) == 0) {
336 em_ptr->do_conf = (10 + randint1(15) + em_ptr->r) / (em_ptr->r + 1);
337 return PROCESS_CONTINUE;
340 em_ptr->note = _("には耐性がある。", " resists.");
342 em_ptr->dam /= randint1(6) + 6;
343 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
344 em_ptr->r_ptr->r_flags3 |= (RF3_NO_CONF);
346 return PROCESS_CONTINUE;
349 process_result effect_monster_disenchant(player_type *caster_ptr, effect_monster_type *em_ptr)
352 em_ptr->obvious = TRUE;
354 if ((em_ptr->r_ptr->flagsr & RFR_RES_DISE) == 0)
355 return PROCESS_CONTINUE;
357 em_ptr->note = _("には耐性がある。", " resists.");
359 em_ptr->dam /= randint1(6) + 6;
360 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
361 em_ptr->r_ptr->r_flagsr |= (RFR_RES_DISE);
363 return PROCESS_CONTINUE;
366 process_result effect_monster_nexus(player_type *caster_ptr, effect_monster_type *em_ptr)
369 em_ptr->obvious = TRUE;
371 if ((em_ptr->r_ptr->flagsr & RFR_RES_NEXU) == 0)
372 return PROCESS_CONTINUE;
374 em_ptr->note = _("には耐性がある。", " resists.");
376 em_ptr->dam /= randint1(6) + 6;
377 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
378 em_ptr->r_ptr->r_flagsr |= (RFR_RES_NEXU);
380 return PROCESS_CONTINUE;
383 process_result effect_monster_force(player_type *caster_ptr, effect_monster_type *em_ptr)
386 em_ptr->obvious = TRUE;
388 if ((em_ptr->r_ptr->flagsr & RFR_RES_WALL) == 0) {
389 em_ptr->do_stun = (randint1(15) + em_ptr->r) / (em_ptr->r + 1);
390 return PROCESS_CONTINUE;
393 em_ptr->note = _("には耐性がある。", " resists.");
395 em_ptr->dam /= randint1(6) + 6;
396 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
397 em_ptr->r_ptr->r_flagsr |= (RFR_RES_WALL);
399 return PROCESS_CONTINUE;
402 // Powerful monsters can resists and normal monsters slow down.
403 process_result effect_monster_inertial(player_type *caster_ptr, effect_monster_type *em_ptr)
406 em_ptr->obvious = TRUE;
408 if (em_ptr->r_ptr->flagsr & RFR_RES_INER) {
409 em_ptr->note = _("には耐性がある。", " resists.");
411 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_INER);
415 return PROCESS_CONTINUE;
418 if ((em_ptr->r_ptr->flags1 & (RF1_UNIQUE)) || (em_ptr->r_ptr->level > randint1((em_ptr->dam - 10) < 1 ? 1 : (em_ptr->dam - 10)) + 10)) {
419 em_ptr->obvious = FALSE;
420 return PROCESS_CONTINUE;
423 if (set_monster_slow(caster_ptr, em_ptr->g_ptr->m_idx, monster_slow_remaining(em_ptr->m_ptr) + 50))
424 em_ptr->note = _("の動きが遅くなった。", " starts moving slower.");
426 return PROCESS_CONTINUE;
429 process_result effect_monster_time(player_type *caster_ptr, effect_monster_type *em_ptr)
432 em_ptr->obvious = TRUE;
434 if ((em_ptr->r_ptr->flagsr & RFR_RES_TIME) == 0) {
435 em_ptr->do_time = (em_ptr->dam + 1) / 2;
436 return PROCESS_CONTINUE;
439 em_ptr->note = _("には耐性がある。", " resists.");
441 em_ptr->dam /= randint1(6) + 6;
442 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
443 em_ptr->r_ptr->r_flagsr |= (RFR_RES_TIME);
445 return PROCESS_CONTINUE;
448 static bool effect_monster_gravity_resist_teleport(player_type *caster_ptr, effect_monster_type *em_ptr)
451 em_ptr->obvious = TRUE;
453 if ((em_ptr->r_ptr->flagsr & RFR_RES_TELE) == 0)
456 if (em_ptr->r_ptr->flags1 & (RF1_UNIQUE)) {
457 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
458 em_ptr->r_ptr->r_flagsr |= RFR_RES_TELE;
460 em_ptr->note = _("には効果がなかった。", " is unaffected!");
464 if (em_ptr->r_ptr->level <= randint1(100))
467 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
468 em_ptr->r_ptr->r_flagsr |= RFR_RES_TELE;
470 em_ptr->note = _("には耐性がある!", " resists!");
474 static void effect_monster_gravity_slow(player_type *caster_ptr, effect_monster_type *em_ptr)
476 if ((em_ptr->r_ptr->flags1 & (RF1_UNIQUE)) || (em_ptr->r_ptr->level > randint1((em_ptr->dam - 10) < 1 ? 1 : (em_ptr->dam - 10)) + 10))
477 em_ptr->obvious = FALSE;
479 if (set_monster_slow(caster_ptr, em_ptr->g_ptr->m_idx, monster_slow_remaining(em_ptr->m_ptr) + 50))
480 em_ptr->note = _("の動きが遅くなった。", " starts moving slower.");
483 static void effect_monster_gravity_stun(effect_monster_type *em_ptr)
485 em_ptr->do_stun = damroll((em_ptr->caster_lev / 20) + 3, (em_ptr->dam)) + 1;
486 if ((em_ptr->r_ptr->flags1 & (RF1_UNIQUE)) || (em_ptr->r_ptr->level > randint1((em_ptr->dam - 10) < 1 ? 1 : (em_ptr->dam - 10)) + 10)) {
488 em_ptr->note = _("には効果がなかった。", " is unaffected!");
489 em_ptr->obvious = FALSE;
494 * Powerful monsters can resist and normal monsters slow down
495 * Furthermore, this magic can make non-unique monsters slow/stun.
497 process_result effect_monster_gravity(player_type *caster_ptr, effect_monster_type *em_ptr)
499 em_ptr->do_dist = effect_monster_gravity_resist_teleport(caster_ptr, em_ptr) ? 0 : 10;
500 if (caster_ptr->riding && (em_ptr->g_ptr->m_idx == caster_ptr->riding))
503 if (em_ptr->r_ptr->flagsr & RFR_RES_GRAV) {
504 em_ptr->note = _("には耐性がある!", " resists!");
506 em_ptr->dam /= randint1(6) + 6;
508 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
509 em_ptr->r_ptr->r_flagsr |= (RFR_RES_GRAV);
511 return PROCESS_CONTINUE;
514 effect_monster_gravity_slow(caster_ptr, em_ptr);
515 effect_monster_gravity_stun(em_ptr);
516 return PROCESS_CONTINUE;
519 process_result effect_monster_disintegration(player_type *caster_ptr, effect_monster_type *em_ptr)
522 em_ptr->obvious = TRUE;
524 if ((em_ptr->r_ptr->flags3 & RF3_HURT_ROCK) == 0)
525 return PROCESS_CONTINUE;
527 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
528 em_ptr->r_ptr->r_flags3 |= (RF3_HURT_ROCK);
530 em_ptr->note = _("の皮膚がただれた!", " loses some skin!");
531 em_ptr->note_dies = _("は蒸発した!", " evaporates!");
533 return PROCESS_CONTINUE;
536 process_result effect_monster_icee_bolt(player_type *caster_ptr, effect_monster_type *em_ptr)
539 em_ptr->obvious = TRUE;
541 em_ptr->do_stun = (randint1(15) + 1) / (em_ptr->r + 1);
542 if (em_ptr->r_ptr->flagsr & RFR_IM_COLD) {
543 em_ptr->note = _("にはかなり耐性がある!", " resists a lot.");
545 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
546 em_ptr->r_ptr->r_flagsr |= (RFR_IM_COLD);
547 } else if (em_ptr->r_ptr->flags3 & (RF3_HURT_COLD)) {
548 em_ptr->note = _("はひどい痛手をうけた。", " is hit hard.");
550 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
551 em_ptr->r_ptr->r_flags3 |= (RF3_HURT_COLD);
554 return PROCESS_CONTINUE;