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-brightness-flags.h"
5 #include "monster-race/race-flags-resistance.h"
6 #include "monster-race/race-indice-types.h"
7 #include "monster/monster-info.h"
8 #include "monster/monster-status-setter.h"
9 #include "monster/monster-status.h"
10 #include "system/grid-type-definition.h"
11 #include "system/monster-entity.h"
12 #include "system/monster-race-info.h"
13 #include "system/player-type-definition.h"
14 #include "util/bit-flags-calculator.h"
17 * @brief モンスターの耐性がなく、効果もない場合の処理
18 * @param em_ptr 魔法効果情報への参照ポインタ
21 ProcessResult effect_monster_nothing(EffectMonster *em_ptr)
24 em_ptr->obvious = true;
27 return ProcessResult::PROCESS_CONTINUE;
30 ProcessResult effect_monster_acid(PlayerType *player_ptr, EffectMonster *em_ptr)
33 em_ptr->obvious = true;
36 if (em_ptr->r_ptr->resistance_flags.has_not(MonsterResistanceType::IMMUNE_ACID)) {
37 return ProcessResult::PROCESS_CONTINUE;
40 em_ptr->note = _("にはかなり耐性がある!", " resists a lot.");
42 if (is_original_ap_and_seen(player_ptr, em_ptr->m_ptr)) {
43 em_ptr->r_ptr->r_resistance_flags.set(MonsterResistanceType::IMMUNE_ACID);
46 return ProcessResult::PROCESS_CONTINUE;
49 ProcessResult effect_monster_elec(PlayerType *player_ptr, EffectMonster *em_ptr)
52 em_ptr->obvious = true;
55 if (em_ptr->r_ptr->resistance_flags.has_not(MonsterResistanceType::IMMUNE_ELEC)) {
56 return ProcessResult::PROCESS_CONTINUE;
59 em_ptr->note = _("にはかなり耐性がある!", " resists a lot.");
61 if (is_original_ap_and_seen(player_ptr, em_ptr->m_ptr)) {
62 em_ptr->r_ptr->r_resistance_flags.set(MonsterResistanceType::IMMUNE_ELEC);
65 return ProcessResult::PROCESS_CONTINUE;
68 ProcessResult effect_monster_fire(PlayerType *player_ptr, EffectMonster *em_ptr)
71 em_ptr->obvious = true;
74 if (em_ptr->r_ptr->resistance_flags.has(MonsterResistanceType::IMMUNE_FIRE)) {
75 em_ptr->note = _("にはかなり耐性がある!", " resists a lot.");
77 if (is_original_ap_and_seen(player_ptr, em_ptr->m_ptr)) {
78 em_ptr->r_ptr->r_resistance_flags.set(MonsterResistanceType::IMMUNE_FIRE);
81 return ProcessResult::PROCESS_CONTINUE;
84 if (em_ptr->r_ptr->resistance_flags.has_not(MonsterResistanceType::HURT_FIRE)) {
85 return ProcessResult::PROCESS_CONTINUE;
88 em_ptr->note = _("はひどい痛手をうけた。", " is hit hard.");
90 if (is_original_ap_and_seen(player_ptr, em_ptr->m_ptr)) {
91 em_ptr->r_ptr->r_resistance_flags.set(MonsterResistanceType::HURT_FIRE);
94 return ProcessResult::PROCESS_CONTINUE;
97 ProcessResult effect_monster_cold(PlayerType *player_ptr, EffectMonster *em_ptr)
100 em_ptr->obvious = true;
103 if (em_ptr->r_ptr->resistance_flags.has(MonsterResistanceType::IMMUNE_COLD)) {
104 em_ptr->note = _("にはかなり耐性がある!", " resists a lot.");
106 if (is_original_ap_and_seen(player_ptr, em_ptr->m_ptr)) {
107 em_ptr->r_ptr->r_resistance_flags.set(MonsterResistanceType::IMMUNE_COLD);
110 return ProcessResult::PROCESS_CONTINUE;
113 if (em_ptr->r_ptr->resistance_flags.has_not(MonsterResistanceType::HURT_COLD)) {
114 return ProcessResult::PROCESS_CONTINUE;
117 em_ptr->note = _("はひどい痛手をうけた。", " is hit hard.");
119 if (is_original_ap_and_seen(player_ptr, em_ptr->m_ptr)) {
120 em_ptr->r_ptr->r_resistance_flags.set(MonsterResistanceType::HURT_COLD);
123 return ProcessResult::PROCESS_CONTINUE;
126 ProcessResult effect_monster_pois(PlayerType *player_ptr, EffectMonster *em_ptr)
129 em_ptr->obvious = true;
132 if (em_ptr->r_ptr->resistance_flags.has_not(MonsterResistanceType::IMMUNE_POISON)) {
133 return ProcessResult::PROCESS_CONTINUE;
136 em_ptr->note = _("にはかなり耐性がある!", " resists a lot.");
138 if (is_original_ap_and_seen(player_ptr, em_ptr->m_ptr)) {
139 em_ptr->r_ptr->r_resistance_flags.set(MonsterResistanceType::IMMUNE_POISON);
142 return ProcessResult::PROCESS_CONTINUE;
145 ProcessResult effect_monster_nuke(PlayerType *player_ptr, EffectMonster *em_ptr)
148 em_ptr->obvious = true;
151 if (em_ptr->r_ptr->resistance_flags.has(MonsterResistanceType::IMMUNE_POISON)) {
152 em_ptr->note = _("には耐性がある。", " resists.");
154 em_ptr->dam /= randint1(6) + 6;
155 if (is_original_ap_and_seen(player_ptr, em_ptr->m_ptr)) {
156 em_ptr->r_ptr->r_resistance_flags.set(MonsterResistanceType::IMMUNE_POISON);
159 return ProcessResult::PROCESS_CONTINUE;
163 em_ptr->do_polymorph = true;
166 return ProcessResult::PROCESS_CONTINUE;
169 ProcessResult effect_monster_hell_fire(PlayerType *player_ptr, EffectMonster *em_ptr)
172 em_ptr->obvious = true;
175 if (em_ptr->r_ptr->kind_flags.has_not(MonsterKindType::GOOD)) {
176 return ProcessResult::PROCESS_CONTINUE;
179 em_ptr->note = _("はひどい痛手をうけた。", " is hit hard.");
181 if (is_original_ap_and_seen(player_ptr, em_ptr->m_ptr)) {
182 em_ptr->r_ptr->r_kind_flags.set(MonsterKindType::GOOD);
185 return ProcessResult::PROCESS_CONTINUE;
188 ProcessResult effect_monster_holy_fire(PlayerType *player_ptr, EffectMonster *em_ptr)
191 em_ptr->obvious = true;
194 if (em_ptr->r_ptr->kind_flags.has(MonsterKindType::GOOD)) {
195 em_ptr->note = _("には完全な耐性がある!", " is immune.");
197 if (is_original_ap_and_seen(player_ptr, em_ptr->m_ptr)) {
198 em_ptr->r_ptr->r_kind_flags.set(MonsterKindType::GOOD);
200 return ProcessResult::PROCESS_CONTINUE;
203 if (em_ptr->r_ptr->kind_flags.has(MonsterKindType::EVIL)) {
205 em_ptr->note = _("はひどい痛手をうけた。", " is hit hard.");
206 if (is_original_ap_and_seen(player_ptr, em_ptr->m_ptr)) {
207 em_ptr->r_ptr->r_kind_flags.set(MonsterKindType::EVIL);
209 return ProcessResult::PROCESS_CONTINUE;
212 em_ptr->note = _("には耐性がある。", " resists.");
214 em_ptr->dam /= randint1(6) + 6;
216 return ProcessResult::PROCESS_CONTINUE;
219 ProcessResult effect_monster_plasma(PlayerType *player_ptr, EffectMonster *em_ptr)
222 em_ptr->obvious = true;
225 if (em_ptr->r_ptr->resistance_flags.has_not(MonsterResistanceType::RESIST_PLASMA)) {
226 return ProcessResult::PROCESS_CONTINUE;
229 em_ptr->note = _("には耐性がある。", " resists.");
231 em_ptr->dam /= randint1(6) + 6;
232 if (is_original_ap_and_seen(player_ptr, em_ptr->m_ptr)) {
233 em_ptr->r_ptr->r_resistance_flags.set(MonsterResistanceType::RESIST_PLASMA);
236 return ProcessResult::PROCESS_CONTINUE;
239 static bool effect_monster_nether_resist(PlayerType *player_ptr, EffectMonster *em_ptr)
241 if (em_ptr->r_ptr->resistance_flags.has_not(MonsterResistanceType::RESIST_NETHER)) {
245 if (em_ptr->r_ptr->kind_flags.has(MonsterKindType::UNDEAD)) {
246 em_ptr->note = _("には完全な耐性がある!", " is immune.");
248 if (is_original_ap_and_seen(player_ptr, em_ptr->m_ptr)) {
249 em_ptr->r_ptr->r_kind_flags.set(MonsterKindType::UNDEAD);
252 em_ptr->note = _("には耐性がある。", " resists.");
254 em_ptr->dam /= randint1(6) + 6;
257 if (is_original_ap_and_seen(player_ptr, em_ptr->m_ptr)) {
258 em_ptr->r_ptr->r_resistance_flags.set(MonsterResistanceType::RESIST_NETHER);
264 ProcessResult effect_monster_nether(PlayerType *player_ptr, EffectMonster *em_ptr)
267 em_ptr->obvious = true;
270 if (effect_monster_nether_resist(player_ptr, em_ptr) || (em_ptr->r_ptr->kind_flags.has_not(MonsterKindType::EVIL))) {
271 return ProcessResult::PROCESS_CONTINUE;
274 em_ptr->note = _("はいくらか耐性を示した。", " resists somewhat.");
276 if (is_original_ap_and_seen(player_ptr, em_ptr->m_ptr)) {
277 em_ptr->r_ptr->r_kind_flags.set(MonsterKindType::EVIL);
280 return ProcessResult::PROCESS_CONTINUE;
283 ProcessResult effect_monster_water(PlayerType *player_ptr, EffectMonster *em_ptr)
286 em_ptr->obvious = true;
289 if (em_ptr->r_ptr->resistance_flags.has_not(MonsterResistanceType::RESIST_WATER)) {
290 return ProcessResult::PROCESS_CONTINUE;
293 if ((em_ptr->m_ptr->r_idx == MonsterRaceId::WATER_ELEM) || (em_ptr->m_ptr->r_idx == MonsterRaceId::UNMAKER)) {
294 em_ptr->note = _("には完全な耐性がある!", " is immune.");
297 em_ptr->note = _("には耐性がある。", " resists.");
299 em_ptr->dam /= randint1(6) + 6;
302 if (is_original_ap_and_seen(player_ptr, em_ptr->m_ptr)) {
303 em_ptr->r_ptr->r_resistance_flags.set(MonsterResistanceType::RESIST_WATER);
306 return ProcessResult::PROCESS_CONTINUE;
309 ProcessResult effect_monster_chaos(PlayerType *player_ptr, EffectMonster *em_ptr)
312 em_ptr->obvious = true;
315 if (em_ptr->r_ptr->resistance_flags.has(MonsterResistanceType::RESIST_CHAOS)) {
316 em_ptr->note = _("には耐性がある。", " resists.");
318 em_ptr->dam /= randint1(6) + 6;
319 if (is_original_ap_and_seen(player_ptr, em_ptr->m_ptr)) {
320 em_ptr->r_ptr->r_resistance_flags.set(MonsterResistanceType::RESIST_CHAOS);
322 } else if (em_ptr->r_ptr->kind_flags.has(MonsterKindType::DEMON) && one_in_(3)) {
323 em_ptr->note = _("はいくらか耐性を示した。", " resists somewhat.");
325 em_ptr->dam /= randint1(6) + 6;
326 if (is_original_ap_and_seen(player_ptr, em_ptr->m_ptr)) {
327 em_ptr->r_ptr->r_kind_flags.set(MonsterKindType::DEMON);
330 em_ptr->do_polymorph = true;
331 em_ptr->do_conf = (5 + randint1(11) + em_ptr->r) / (em_ptr->r + 1);
334 return ProcessResult::PROCESS_CONTINUE;
337 ProcessResult effect_monster_shards(PlayerType *player_ptr, EffectMonster *em_ptr)
340 em_ptr->obvious = true;
343 if (em_ptr->r_ptr->resistance_flags.has_not(MonsterResistanceType::RESIST_SHARDS)) {
344 return ProcessResult::PROCESS_CONTINUE;
347 em_ptr->note = _("には耐性がある。", " resists.");
349 em_ptr->dam /= randint1(6) + 6;
350 if (is_original_ap_and_seen(player_ptr, em_ptr->m_ptr)) {
351 em_ptr->r_ptr->r_resistance_flags.set(MonsterResistanceType::RESIST_SHARDS);
354 return ProcessResult::PROCESS_CONTINUE;
357 ProcessResult effect_monster_rocket(PlayerType *player_ptr, EffectMonster *em_ptr)
360 em_ptr->obvious = true;
363 if (em_ptr->r_ptr->resistance_flags.has_not(MonsterResistanceType::RESIST_SHARDS)) {
364 return ProcessResult::PROCESS_CONTINUE;
367 em_ptr->note = _("はいくらか耐性を示した。", " resists somewhat.");
369 if (is_original_ap_and_seen(player_ptr, em_ptr->m_ptr)) {
370 em_ptr->r_ptr->r_resistance_flags.set(MonsterResistanceType::RESIST_SHARDS);
373 return ProcessResult::PROCESS_CONTINUE;
376 ProcessResult effect_monster_sound(PlayerType *player_ptr, EffectMonster *em_ptr)
379 em_ptr->obvious = true;
382 if (em_ptr->r_ptr->resistance_flags.has_not(MonsterResistanceType::RESIST_SOUND)) {
383 em_ptr->do_stun = (10 + randint1(15) + em_ptr->r) / (em_ptr->r + 1);
384 return ProcessResult::PROCESS_CONTINUE;
387 em_ptr->note = _("には耐性がある。", " resists.");
389 em_ptr->dam /= randint1(6) + 6;
390 if (is_original_ap_and_seen(player_ptr, em_ptr->m_ptr)) {
391 em_ptr->r_ptr->r_resistance_flags.set(MonsterResistanceType::RESIST_SOUND);
394 return ProcessResult::PROCESS_CONTINUE;
397 ProcessResult effect_monster_confusion(PlayerType *player_ptr, EffectMonster *em_ptr)
400 em_ptr->obvious = true;
403 if (em_ptr->r_ptr->resistance_flags.has_not(MonsterResistanceType::NO_CONF)) {
404 em_ptr->do_conf = (10 + randint1(15) + em_ptr->r) / (em_ptr->r + 1);
405 return ProcessResult::PROCESS_CONTINUE;
408 em_ptr->note = _("には耐性がある。", " resists.");
410 em_ptr->dam /= randint1(6) + 6;
411 if (is_original_ap_and_seen(player_ptr, em_ptr->m_ptr)) {
412 em_ptr->r_ptr->resistance_flags.set(MonsterResistanceType::NO_CONF);
415 return ProcessResult::PROCESS_CONTINUE;
418 ProcessResult effect_monster_disenchant(PlayerType *player_ptr, EffectMonster *em_ptr)
421 em_ptr->obvious = true;
424 if (em_ptr->r_ptr->resistance_flags.has_not(MonsterResistanceType::RESIST_DISENCHANT)) {
425 return ProcessResult::PROCESS_CONTINUE;
428 em_ptr->note = _("には耐性がある。", " resists.");
430 em_ptr->dam /= randint1(6) + 6;
431 if (is_original_ap_and_seen(player_ptr, em_ptr->m_ptr)) {
432 em_ptr->r_ptr->r_resistance_flags.set(MonsterResistanceType::RESIST_DISENCHANT);
435 return ProcessResult::PROCESS_CONTINUE;
438 ProcessResult effect_monster_nexus(PlayerType *player_ptr, EffectMonster *em_ptr)
441 em_ptr->obvious = true;
444 if (em_ptr->r_ptr->resistance_flags.has_not(MonsterResistanceType::RESIST_NEXUS)) {
445 return ProcessResult::PROCESS_CONTINUE;
448 em_ptr->note = _("には耐性がある。", " resists.");
450 em_ptr->dam /= randint1(6) + 6;
451 if (is_original_ap_and_seen(player_ptr, em_ptr->m_ptr)) {
452 em_ptr->r_ptr->r_resistance_flags.set(MonsterResistanceType::RESIST_NEXUS);
455 return ProcessResult::PROCESS_CONTINUE;
458 ProcessResult effect_monster_force(PlayerType *player_ptr, EffectMonster *em_ptr)
461 em_ptr->obvious = true;
464 if (em_ptr->r_ptr->resistance_flags.has_not(MonsterResistanceType::RESIST_FORCE)) {
465 em_ptr->do_stun = (randint1(15) + em_ptr->r) / (em_ptr->r + 1);
466 return ProcessResult::PROCESS_CONTINUE;
469 em_ptr->note = _("には耐性がある。", " resists.");
471 em_ptr->dam /= randint1(6) + 6;
472 if (is_original_ap_and_seen(player_ptr, em_ptr->m_ptr)) {
473 em_ptr->r_ptr->r_resistance_flags.set(MonsterResistanceType::RESIST_FORCE);
476 return ProcessResult::PROCESS_CONTINUE;
479 // Powerful monsters can resists and normal monsters slow down.
480 ProcessResult effect_monster_inertial(PlayerType *player_ptr, EffectMonster *em_ptr)
483 em_ptr->obvious = true;
486 if (em_ptr->r_ptr->resistance_flags.has(MonsterResistanceType::RESIST_INERTIA)) {
487 em_ptr->note = _("には耐性がある。", " resists.");
489 em_ptr->dam /= randint1(6) + 6;
490 if (is_original_ap_and_seen(player_ptr, em_ptr->m_ptr)) {
491 em_ptr->r_ptr->r_resistance_flags.set(MonsterResistanceType::RESIST_INERTIA);
494 return ProcessResult::PROCESS_CONTINUE;
497 bool cancel_effect = em_ptr->r_ptr->kind_flags.has(MonsterKindType::UNIQUE);
498 cancel_effect |= (em_ptr->r_ptr->level > randint1(std::max(1, em_ptr->dam - 10)) + 10);
500 em_ptr->obvious = false;
501 return ProcessResult::PROCESS_CONTINUE;
504 if (set_monster_slow(player_ptr, em_ptr->g_ptr->m_idx, em_ptr->m_ptr->get_remaining_deceleration() + 50)) {
505 em_ptr->note = _("の動きが遅くなった。", " starts moving slower.");
508 return ProcessResult::PROCESS_CONTINUE;
511 ProcessResult effect_monster_time(PlayerType *player_ptr, EffectMonster *em_ptr)
514 em_ptr->obvious = true;
517 if (em_ptr->r_ptr->resistance_flags.has_not(MonsterResistanceType::RESIST_TIME)) {
518 em_ptr->do_time = (em_ptr->dam + 1) / 2;
519 return ProcessResult::PROCESS_CONTINUE;
522 em_ptr->note = _("には耐性がある。", " resists.");
524 em_ptr->dam /= randint1(6) + 6;
525 if (is_original_ap_and_seen(player_ptr, em_ptr->m_ptr)) {
526 em_ptr->r_ptr->r_resistance_flags.set(MonsterResistanceType::RESIST_TIME);
529 return ProcessResult::PROCESS_CONTINUE;
532 static bool effect_monster_gravity_resist_teleport(PlayerType *player_ptr, EffectMonster *em_ptr)
534 if (em_ptr->r_ptr->resistance_flags.has_not(MonsterResistanceType::RESIST_TELEPORT)) {
535 em_ptr->obvious = true;
539 if (em_ptr->r_ptr->kind_flags.has(MonsterKindType::UNIQUE)) {
540 if (is_original_ap_and_seen(player_ptr, em_ptr->m_ptr)) {
541 em_ptr->r_ptr->r_resistance_flags.set(MonsterResistanceType::RESIST_TELEPORT);
544 em_ptr->note = _("には効果がなかった。", " is unaffected!");
548 if (em_ptr->r_ptr->level <= randint1(100)) {
549 em_ptr->obvious = true;
553 if (is_original_ap_and_seen(player_ptr, em_ptr->m_ptr)) {
554 em_ptr->r_ptr->r_resistance_flags.set(MonsterResistanceType::RESIST_TELEPORT);
557 em_ptr->note = _("には耐性がある!", " resists!");
561 static void effect_monster_gravity_slow(PlayerType *player_ptr, EffectMonster *em_ptr)
563 bool cancel_effect = em_ptr->r_ptr->kind_flags.has(MonsterKindType::UNIQUE);
564 cancel_effect |= (em_ptr->r_ptr->level > randint1(std::max(1, em_ptr->dam - 10)) + 10);
566 em_ptr->obvious = false;
570 if (set_monster_slow(player_ptr, em_ptr->g_ptr->m_idx, em_ptr->m_ptr->get_remaining_deceleration() + 50)) {
571 em_ptr->note = _("の動きが遅くなった。", " starts moving slower.");
573 em_ptr->obvious = true;
576 static void effect_monster_gravity_stun(EffectMonster *em_ptr)
578 em_ptr->do_stun = damroll((em_ptr->caster_lev / 20) + 3, (em_ptr->dam)) + 1;
579 bool has_resistance = em_ptr->r_ptr->kind_flags.has(MonsterKindType::UNIQUE);
580 has_resistance |= (em_ptr->r_ptr->level > randint1(std::max(1, em_ptr->dam - 10)) + 10);
581 if (has_resistance) {
585 em_ptr->obvious = true;
589 * Powerful monsters can resist and normal monsters slow down
590 * Furthermore, this magic can make non-unique monsters slow/stun.
592 ProcessResult effect_monster_gravity(PlayerType *player_ptr, EffectMonster *em_ptr)
594 em_ptr->do_dist = effect_monster_gravity_resist_teleport(player_ptr, em_ptr) ? 0 : 10;
595 if (player_ptr->riding && (em_ptr->g_ptr->m_idx == player_ptr->riding)) {
599 if (em_ptr->r_ptr->resistance_flags.has(MonsterResistanceType::RESIST_GRAVITY)) {
600 em_ptr->note = _("には耐性がある!", " resists!");
602 em_ptr->dam /= randint1(6) + 6;
604 if (is_original_ap_and_seen(player_ptr, em_ptr->m_ptr)) {
605 em_ptr->r_ptr->r_resistance_flags.set(MonsterResistanceType::RESIST_GRAVITY);
607 return ProcessResult::PROCESS_CONTINUE;
610 em_ptr->note = _("には効果がなかった。", " is unaffected!");
612 effect_monster_gravity_slow(player_ptr, em_ptr);
613 effect_monster_gravity_stun(em_ptr);
614 return ProcessResult::PROCESS_CONTINUE;
617 ProcessResult effect_monster_disintegration(PlayerType *player_ptr, EffectMonster *em_ptr)
620 em_ptr->obvious = true;
623 if (em_ptr->r_ptr->resistance_flags.has_not(MonsterResistanceType::HURT_ROCK)) {
624 return ProcessResult::PROCESS_CONTINUE;
627 if (is_original_ap_and_seen(player_ptr, em_ptr->m_ptr)) {
628 em_ptr->r_ptr->r_resistance_flags.set(MonsterResistanceType::HURT_ROCK);
631 em_ptr->note = _("の皮膚がただれた!", " loses some skin!");
632 em_ptr->note_dies = _("は蒸発した!", " evaporates!");
634 return ProcessResult::PROCESS_CONTINUE;
637 ProcessResult effect_monster_icee_bolt(PlayerType *player_ptr, EffectMonster *em_ptr)
640 em_ptr->obvious = true;
643 em_ptr->do_stun = (randint1(15) + 1) / (em_ptr->r + 1);
644 if (em_ptr->r_ptr->resistance_flags.has(MonsterResistanceType::IMMUNE_COLD)) {
645 em_ptr->note = _("にはかなり耐性がある!", " resists a lot.");
647 if (is_original_ap_and_seen(player_ptr, em_ptr->m_ptr)) {
648 em_ptr->r_ptr->r_resistance_flags.set(MonsterResistanceType::IMMUNE_COLD);
650 } else if (em_ptr->r_ptr->resistance_flags.has(MonsterResistanceType::HURT_COLD)) {
651 em_ptr->note = _("はひどい痛手をうけた。", " is hit hard.");
653 if (is_original_ap_and_seen(player_ptr, em_ptr->m_ptr)) {
654 em_ptr->r_ptr->r_resistance_flags.set(MonsterResistanceType::HURT_COLD);
658 return ProcessResult::PROCESS_CONTINUE;
662 * @brief 虚無属性の耐性と効果の発動
663 * @param player_ptr プレイヤー情報への参照ポインタ
664 * @em_ptr 魔法効果情報への参照ポインタ
665 * @return 効果処理を続けるかどうか
667 * 量子生物に倍打、壁抜けに1.5倍打、テレポート耐性が耐性
669 ProcessResult effect_monster_void(PlayerType *player_ptr, EffectMonster *em_ptr)
672 em_ptr->obvious = true;
675 if (em_ptr->r_ptr->kind_flags.has(MonsterKindType::QUANTUM)) {
676 em_ptr->note = _("の存在確率が減少した。", "'s wave function is reduced.");
677 em_ptr->note_dies = _("は観測されなくなった。", "'s wave function collapses.");
679 if (is_original_ap_and_seen(player_ptr, em_ptr->m_ptr)) {
680 em_ptr->r_ptr->r_kind_flags.set(MonsterKindType::QUANTUM);
682 } else if (em_ptr->r_ptr->feature_flags.has(MonsterFeatureType::PASS_WALL)) {
683 em_ptr->note = _("の存在が薄れていく。", "is fading out.");
684 em_ptr->note_dies = _("は消えてしまった。", "has disappeared.");
687 if (is_original_ap_and_seen(player_ptr, em_ptr->m_ptr)) {
688 em_ptr->r_ptr->r_feature_flags.set(MonsterFeatureType::PASS_WALL);
690 } else if (em_ptr->r_ptr->resistance_flags.has_any_of({ MonsterResistanceType::RESIST_TELEPORT, MonsterResistanceType::RESIST_FORCE, MonsterResistanceType::RESIST_GRAVITY })) {
691 em_ptr->note = _("には耐性がある!", " resists!");
693 em_ptr->dam /= randint1(6) + 6;
694 if (is_original_ap_and_seen(player_ptr, em_ptr->m_ptr)) {
695 if (em_ptr->r_ptr->resistance_flags.has(MonsterResistanceType::RESIST_TELEPORT)) {
696 em_ptr->r_ptr->r_resistance_flags.set(MonsterResistanceType::RESIST_TELEPORT);
698 if (em_ptr->r_ptr->resistance_flags.has(MonsterResistanceType::RESIST_FORCE)) {
699 em_ptr->r_ptr->r_resistance_flags.set(MonsterResistanceType::RESIST_FORCE);
701 if (em_ptr->r_ptr->resistance_flags.has(MonsterResistanceType::RESIST_GRAVITY)) {
702 em_ptr->r_ptr->r_resistance_flags.set(MonsterResistanceType::RESIST_GRAVITY);
706 em_ptr->note_dies = _("は消滅してしまった。", "has vanished.");
709 return ProcessResult::PROCESS_CONTINUE;
713 * @brief 深淵属性の耐性と効果の発動
714 * @param player_ptr プレイヤー情報への参照ポインタ
715 * @em_ptr 魔法効果情報への参照ポインタ
716 * @return 効果処理を続けるかどうか
718 * 飛ばないテレポート耐性に1.25倍打、暗黒耐性が耐性
721 ProcessResult effect_monster_abyss(PlayerType *player_ptr, EffectMonster *em_ptr)
724 em_ptr->obvious = true;
727 auto dark = { MonsterBrightnessType::SELF_DARK_1, MonsterBrightnessType::SELF_DARK_2, MonsterBrightnessType::HAS_DARK_1, MonsterBrightnessType::HAS_DARK_2 };
729 if (em_ptr->r_ptr->brightness_flags.has_any_of(dark)) {
730 em_ptr->note = _("には耐性がある!", " resists!");
732 em_ptr->dam /= (randint1(6) + 6);
733 } else if (em_ptr->r_ptr->resistance_flags.has(MonsterResistanceType::RESIST_DARK)) {
734 em_ptr->note = _("には耐性がある!", " resists!");
736 em_ptr->dam /= (randint1(4) + 5);
737 if (is_original_ap_and_seen(player_ptr, em_ptr->m_ptr)) {
738 em_ptr->r_ptr->r_resistance_flags.set(MonsterResistanceType::RESIST_DARK);
740 } else if (em_ptr->r_ptr->feature_flags.has_not(MonsterFeatureType::CAN_FLY)) {
741 if (em_ptr->r_ptr->resistance_flags.has(MonsterResistanceType::RESIST_TELEPORT)) {
744 if (is_original_ap_and_seen(player_ptr, em_ptr->m_ptr)) {
745 em_ptr->r_ptr->r_resistance_flags.set(MonsterResistanceType::RESIST_TELEPORT);
749 em_ptr->note = _("は深淵に囚われていく。", " is trapped in the abyss.");
750 em_ptr->note_dies = _("は深淵に堕ちてしまった。", " has fallen into the abyss.");
752 if (one_in_(3) && set_monster_slow(player_ptr, em_ptr->g_ptr->m_idx, em_ptr->m_ptr->get_remaining_deceleration() + 50)) {
753 em_ptr->note = _("の動きが遅くなった。", " starts moving slower.");
757 if (em_ptr->r_ptr->misc_flags.has(MonsterMiscType::ELDRITCH_HORROR) || em_ptr->r_ptr->misc_flags.has(MonsterMiscType::EMPTY_MIND)) {
758 return ProcessResult::PROCESS_CONTINUE;
763 em_ptr->do_conf = (10 + randint1(15) + em_ptr->r) / (em_ptr->r + 1);
765 em_ptr->do_fear = (10 + randint1(15) + em_ptr->r) / (em_ptr->r + 1);
769 return ProcessResult::PROCESS_CONTINUE;
772 ProcessResult effect_monster_meteor(PlayerType *player_ptr, EffectMonster *em_ptr)
775 em_ptr->obvious = true;
778 if (em_ptr->r_ptr->resistance_flags.has_not(MonsterResistanceType::RESIST_METEOR)) {
779 return ProcessResult::PROCESS_CONTINUE;
782 em_ptr->note = _("には耐性がある!", " resists!");
784 em_ptr->dam /= randint1(6) + 6;
785 if (is_original_ap_and_seen(player_ptr, em_ptr->m_ptr)) {
786 em_ptr->r_ptr->r_resistance_flags.set(MonsterResistanceType::RESIST_METEOR);
789 return ProcessResult::PROCESS_CONTINUE;