From bebad99ffcdebe10e1ab7b8563b42fe63b863a73 Mon Sep 17 00:00:00 2001 From: Hourier Date: Sun, 31 May 2020 15:55:40 +0900 Subject: [PATCH] [Refcator] #40416 Separated aura_*_by_monster_attack() from make_attack_normal() --- src/combat/monster-attack-player.c | 131 +++++++++++++++++++++---------------- src/combat/monster-attack-util.c | 1 + src/combat/monster-attack-util.h | 1 + 3 files changed, 78 insertions(+), 55 deletions(-) diff --git a/src/combat/monster-attack-player.c b/src/combat/monster-attack-player.c index 9e4dadf9e..e97b67952 100644 --- a/src/combat/monster-attack-player.c +++ b/src/combat/monster-attack-player.c @@ -219,6 +219,72 @@ static void calc_player_stun(player_type *target_ptr, monap_type *monap_ptr) (void)set_stun(target_ptr, target_ptr->stun + stun_plus); } +static void aura_fire_by_monster_attack(player_type *target_ptr, monap_type *monap_ptr) +{ + if (!target_ptr->sh_fire || !monap_ptr->alive || target_ptr->is_dead) + return; + + monster_race *r_ptr = &r_info[monap_ptr->m_ptr->r_idx]; + if ((r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK) != 0) { + if (is_original_ap_and_seen(target_ptr, monap_ptr->m_ptr)) + r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK); + + return; + } + + HIT_POINT dam = damroll(2, 6); + dam = mon_damage_mod(target_ptr, monap_ptr->m_ptr, dam, FALSE); + msg_format(_("%^sは突然熱くなった!", "%^s is suddenly very hot!"), monap_ptr->m_name); + if (mon_take_hit(target_ptr, monap_ptr->m_idx, dam, &monap_ptr->fear, _("は灰の山になった。", " turns into a pile of ash."))) { + monap_ptr->blinked = FALSE; + monap_ptr->alive = FALSE; + } +} + +static void aura_elec_by_monster_attack(player_type *target_ptr, monap_type *monap_ptr) +{ + if (!target_ptr->sh_elec || !monap_ptr->alive || target_ptr->is_dead) + return; + + monster_race *r_ptr = &r_info[monap_ptr->m_ptr->r_idx]; + if ((r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK) != 0) { + if (is_original_ap_and_seen(target_ptr, monap_ptr->m_ptr)) + r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK); + + return; + } + + HIT_POINT dam = damroll(2, 6); + dam = mon_damage_mod(target_ptr, monap_ptr->m_ptr, dam, FALSE); + msg_format(_("%^sは電撃をくらった!", "%^s gets zapped!"), monap_ptr->m_name); + if (mon_take_hit(target_ptr, monap_ptr->m_idx, dam, &monap_ptr->fear, _("は燃え殻の山になった。", " turns into a pile of cinder."))) { + monap_ptr->blinked = FALSE; + monap_ptr->alive = FALSE; + } +} + +static void aura_cold_by_monster_attack(player_type *target_ptr, monap_type *monap_ptr) +{ + if (!target_ptr->sh_cold || !monap_ptr->alive || target_ptr->is_dead) + return; + + monster_race *r_ptr = &r_info[monap_ptr->m_ptr->r_idx]; + if ((r_ptr->flagsr & RFR_EFF_IM_COLD_MASK) != 0) { + if (is_original_ap_and_seen(target_ptr, monap_ptr->m_ptr)) + r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_COLD_MASK); + + return; + } + + HIT_POINT dam = damroll(2, 6); + dam = mon_damage_mod(target_ptr, monap_ptr->m_ptr, dam, FALSE); + msg_format(_("%^sは冷気をくらった!", "%^s is very cold!"), monap_ptr->m_name); + if (mon_take_hit(target_ptr, monap_ptr->m_idx, dam, &monap_ptr->fear, _("は凍りついた。", " was frozen."))) { + monap_ptr->blinked = FALSE; + monap_ptr->alive = FALSE; + } +} + /*! * @brief モンスターからプレイヤーへの打撃処理 / Attack the player via physical attacks. * @param m_idx 打撃を行うモンスターのID @@ -228,8 +294,6 @@ bool make_attack_normal(player_type *target_ptr, MONSTER_IDX m_idx) { monap_type tmp_monap; monap_type *monap_ptr = initialize_monap_type(target_ptr, &tmp_monap, m_idx); - - bool fear = FALSE; check_no_blow(target_ptr, monap_ptr); monster_race *r_ptr = &r_info[monap_ptr->m_ptr->r_idx]; monap_ptr->rlev = ((r_ptr->level >= 1) ? r_ptr->level : 1); @@ -287,65 +351,22 @@ bool make_attack_normal(player_type *target_ptr, MONSTER_IDX m_idx) if (monap_ptr->explode) { sound(SOUND_EXPLODE); - if (mon_take_hit(target_ptr, m_idx, monap_ptr->m_ptr->hp + 1, &fear, NULL)) { + if (mon_take_hit(target_ptr, m_idx, monap_ptr->m_ptr->hp + 1, &monap_ptr->fear, NULL)) { monap_ptr->blinked = FALSE; monap_ptr->alive = FALSE; } } if (monap_ptr->touched) { - if (target_ptr->sh_fire && monap_ptr->alive && !target_ptr->is_dead) { - if (!(r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK)) { - HIT_POINT dam = damroll(2, 6); - dam = mon_damage_mod(target_ptr, monap_ptr->m_ptr, dam, FALSE); - msg_format(_("%^sは突然熱くなった!", "%^s is suddenly very hot!"), monap_ptr->m_name); - if (mon_take_hit(target_ptr, m_idx, dam, &fear, _("は灰の山になった。", " turns into a pile of ash."))) { - monap_ptr->blinked = FALSE; - monap_ptr->alive = FALSE; - } - - } else { - if (is_original_ap_and_seen(target_ptr, monap_ptr->m_ptr)) - r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK); - } - } - - if (target_ptr->sh_elec && monap_ptr->alive && !target_ptr->is_dead) { - if (!(r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK)) { - HIT_POINT dam = damroll(2, 6); - dam = mon_damage_mod(target_ptr, monap_ptr->m_ptr, dam, FALSE); - msg_format(_("%^sは電撃をくらった!", "%^s gets zapped!"), monap_ptr->m_name); - if (mon_take_hit(target_ptr, m_idx, dam, &fear, _("は燃え殻の山になった。", " turns into a pile of cinder."))) { - monap_ptr->blinked = FALSE; - monap_ptr->alive = FALSE; - } - } else { - if (is_original_ap_and_seen(target_ptr, monap_ptr->m_ptr)) - r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK); - } - } - - if (target_ptr->sh_cold && monap_ptr->alive && !target_ptr->is_dead) { - if (!(r_ptr->flagsr & RFR_EFF_IM_COLD_MASK)) { - HIT_POINT dam = damroll(2, 6); - dam = mon_damage_mod(target_ptr, monap_ptr->m_ptr, dam, FALSE); - msg_format(_("%^sは冷気をくらった!", "%^s is very cold!"), monap_ptr->m_name); - if (mon_take_hit(target_ptr, m_idx, dam, &fear, _("は凍りついた。", " was frozen."))) { - monap_ptr->blinked = FALSE; - monap_ptr->alive = FALSE; - } - } else { - if (is_original_ap_and_seen(target_ptr, monap_ptr->m_ptr)) - r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_COLD_MASK); - } - } - + aura_fire_by_monster_attack(target_ptr, monap_ptr); + aura_elec_by_monster_attack(target_ptr, monap_ptr); + aura_cold_by_monster_attack(target_ptr, monap_ptr); if (target_ptr->dustrobe && monap_ptr->alive && !target_ptr->is_dead) { if (!(r_ptr->flagsr & RFR_EFF_RES_SHAR_MASK)) { HIT_POINT dam = damroll(2, 6); dam = mon_damage_mod(target_ptr, monap_ptr->m_ptr, dam, FALSE); msg_format(_("%^sは鏡の破片をくらった!", "%^s gets zapped!"), monap_ptr->m_name); - if (mon_take_hit(target_ptr, m_idx, dam, &fear, _("はズタズタになった。", " had torn to pieces."))) { + if (mon_take_hit(target_ptr, m_idx, dam, &monap_ptr->fear, _("はズタズタになった。", " had torn to pieces."))) { monap_ptr->blinked = FALSE; monap_ptr->alive = FALSE; } @@ -365,7 +386,7 @@ bool make_attack_normal(player_type *target_ptr, MONSTER_IDX m_idx) HIT_POINT dam = damroll(2, 6); dam = mon_damage_mod(target_ptr, monap_ptr->m_ptr, dam, FALSE); msg_format(_("%^sは聖なるオーラで傷ついた!", "%^s is injured by holy power!"), monap_ptr->m_name); - if (mon_take_hit(target_ptr, m_idx, dam, &fear, _("は倒れた。", " is destroyed."))) { + if (mon_take_hit(target_ptr, m_idx, dam, &monap_ptr->fear, _("は倒れた。", " is destroyed."))) { monap_ptr->blinked = FALSE; monap_ptr->alive = FALSE; } @@ -383,7 +404,7 @@ bool make_attack_normal(player_type *target_ptr, MONSTER_IDX m_idx) HIT_POINT dam = damroll(2, 6); dam = mon_damage_mod(target_ptr, monap_ptr->m_ptr, dam, FALSE); msg_format(_("%^sが鋭い闘気のオーラで傷ついた!", "%^s is injured by the Force"), monap_ptr->m_name); - if (mon_take_hit(target_ptr, m_idx, dam, &fear, _("は倒れた。", " is destroyed."))) { + if (mon_take_hit(target_ptr, m_idx, dam, &monap_ptr->fear, _("は倒れた。", " is destroyed."))) { monap_ptr->blinked = FALSE; monap_ptr->alive = FALSE; } @@ -408,7 +429,7 @@ bool make_attack_normal(player_type *target_ptr, MONSTER_IDX m_idx) dam = mon_damage_mod(target_ptr, monap_ptr->m_ptr, dam, FALSE); msg_format(_("影のオーラが%^sに反撃した!", "Enveloping shadows attack %^s."), monap_ptr->m_name); - if (mon_take_hit(target_ptr, m_idx, dam, &fear, _("は倒れた。", " is destroyed."))) { + if (mon_take_hit(target_ptr, m_idx, dam, &monap_ptr->fear, _("は倒れた。", " is destroyed."))) { monap_ptr->blinked = FALSE; monap_ptr->alive = FALSE; } else /* monster does not dead */ @@ -525,7 +546,7 @@ bool make_attack_normal(player_type *target_ptr, MONSTER_IDX m_idx) target_ptr->csp -= 7; msg_format(_("%^sに反撃した!", "You counterattacked %s!"), m_target_name); do_cmd_attack(target_ptr, monap_ptr->m_ptr->fy, monap_ptr->m_ptr->fx, HISSATSU_COUNTER); - fear = FALSE; + monap_ptr->fear = FALSE; target_ptr->redraw |= (PR_MANA); } @@ -541,7 +562,7 @@ bool make_attack_normal(player_type *target_ptr, MONSTER_IDX m_idx) if (target_ptr->is_dead && (r_ptr->r_deaths < MAX_SHORT) && !floor_ptr->inside_arena) r_ptr->r_deaths++; - if (monap_ptr->m_ptr->ml && fear && monap_ptr->alive && !target_ptr->is_dead) { + if (monap_ptr->m_ptr->ml && monap_ptr->fear && monap_ptr->alive && !target_ptr->is_dead) { sound(SOUND_FLEE); msg_format(_("%^sは恐怖で逃げ出した!", "%^s flees in terror!"), monap_ptr->m_name); } diff --git a/src/combat/monster-attack-util.c b/src/combat/monster-attack-util.c index 38adae982..755e0bf4e 100644 --- a/src/combat/monster-attack-util.c +++ b/src/combat/monster-attack-util.c @@ -20,5 +20,6 @@ monap_type *initialize_monap_type(player_type *target_ptr, monap_type *monap_ptr monap_ptr->obvious = FALSE; monap_ptr->get_damage = 0; monap_ptr->alive = FALSE; + monap_ptr->fear = FALSE; return monap_ptr; } diff --git a/src/combat/monster-attack-util.h b/src/combat/monster-attack-util.h index 2b76206a3..9bb719a3d 100644 --- a/src/combat/monster-attack-util.h +++ b/src/combat/monster-attack-util.h @@ -30,6 +30,7 @@ typedef struct monap_type { GAME_TEXT ddesc[80]; ARMOUR_CLASS ac; bool alive; + bool fear; } monap_type; monap_type *initialize_monap_type(player_type *target_ptr, monap_type *monap_ptr, MONSTER_IDX m_idx); -- 2.11.0