From 59bf2d6a447c56c1d46ef1e133d5fb458f7b3735 Mon Sep 17 00:00:00 2001 From: Hourier Date: Sun, 31 May 2020 14:38:03 +0900 Subject: [PATCH] [Refactor] #40416 Moved process_un_power(), check_drain_hp() and process_drain_life() from monster-attack-player.c to monster-eating.c/h --- src/combat/monster-attack-player.c | 72 ------------------------------------ src/combat/monster-eating.c | 75 +++++++++++++++++++++++++++++++++++++- src/combat/monster-eating.h | 4 ++ 3 files changed, 78 insertions(+), 73 deletions(-) diff --git a/src/combat/monster-attack-player.c b/src/combat/monster-attack-player.c index c7b771a11..5d2b8d01b 100644 --- a/src/combat/monster-attack-player.c +++ b/src/combat/monster-attack-player.c @@ -21,7 +21,6 @@ #include "mind/racial-mirror-master.h" #include "monster/monster-status.h" #include "object/object-hook.h" -#include "player/mimic-info-table.h" #include "player/player-damage.h" #include "player/player-effects.h" #include "player/player-move.h" @@ -206,77 +205,6 @@ static void describe_silly_attacks(monap_type *monap_ptr) #endif } -/*! - * @brief モンスターからの攻撃による充填魔力吸収処理 - * @param target_ptr プレーヤーへの参照ポインタ - * @monap_ptr モンスターからモンスターへの直接攻撃構造体への参照ポインタ - * @return 吸収されたらTRUE、されなかったらFALSE - */ -static bool process_un_power(player_type *target_ptr, monap_type *monap_ptr) -{ - if (((monap_ptr->o_ptr->tval != TV_STAFF) && (monap_ptr->o_ptr->tval != TV_WAND)) || (monap_ptr->o_ptr->pval == 0)) - return FALSE; - - int heal = monap_ptr->rlev * monap_ptr->o_ptr->pval; - if (monap_ptr->o_ptr->tval == TV_STAFF) - heal *= monap_ptr->o_ptr->number; - - heal = MIN(heal, monap_ptr->m_ptr->maxhp - monap_ptr->m_ptr->hp); - msg_print(_("ザックからエネルギーが吸い取られた!", "Energy drains from your pack!")); - monap_ptr->obvious = TRUE; - monap_ptr->m_ptr->hp += (HIT_POINT)heal; - if (target_ptr->health_who == monap_ptr->m_idx) - target_ptr->redraw |= (PR_HEALTH); - - if (target_ptr->riding == monap_ptr->m_idx) - target_ptr->redraw |= (PR_UHEALTH); - - monap_ptr->o_ptr->pval = 0; - target_ptr->update |= (PU_COMBINE | PU_REORDER); - target_ptr->window |= (PW_INVEN); - return TRUE; -} - -static bool check_drain_hp(player_type *target_ptr, const s32b d) -{ - bool resist_drain = !drain_exp(target_ptr, d, d / 10, 50); - if (target_ptr->mimic_form) - return (mimic_info[target_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_NONLIVING) != 0 ? TRUE : resist_drain; - - switch (target_ptr->prace) { - case RACE_ZOMBIE: - case RACE_VAMPIRE: - case RACE_SPECTRE: - case RACE_SKELETON: - case RACE_BALROG: - case RACE_GOLEM: - case RACE_ANDROID: - return TRUE; - default: - return resist_drain; - } -} - -static void process_drain_life(player_type *target_ptr, monap_type *monap_ptr, const bool resist_drain) -{ - if ((monap_ptr->damage <= 5) || resist_drain) - return; - - bool did_heal = monap_ptr->m_ptr->hp < monap_ptr->m_ptr->maxhp; - monap_ptr->m_ptr->hp += damroll(4, monap_ptr->damage / 6); - if (monap_ptr->m_ptr->hp > monap_ptr->m_ptr->maxhp) - monap_ptr->m_ptr->hp = monap_ptr->m_ptr->maxhp; - - if (target_ptr->health_who == monap_ptr->m_idx) - target_ptr->redraw |= (PR_HEALTH); - - if (target_ptr->riding == monap_ptr->m_idx) - target_ptr->redraw |= (PR_UHEALTH); - - if (monap_ptr->m_ptr->ml && did_heal) - msg_format(_("%sは体力を回復したようだ。", "%^s appears healthier."), monap_ptr->m_name); -} - static void process_blind_attack(player_type *target_ptr, monap_type *monap_ptr) { if (target_ptr->resist_blind || check_multishadow(target_ptr)) diff --git a/src/combat/monster-eating.c b/src/combat/monster-eating.c index 5c979290d..b4fd87d4a 100644 --- a/src/combat/monster-eating.c +++ b/src/combat/monster-eating.c @@ -1,5 +1,5 @@ /*! - * @brief プレーヤーのアイテム・お金・明かりの残りターンを盗んだり減少させたりする処理 + * @brief プレーヤーのHP、アイテム、お金・明かりの残りターン、充填魔力を盗んだり減少させたりする処理 * @date 2020/05/31 * @author Hourier */ @@ -12,6 +12,8 @@ #include "object/object-hook.h" #include "object/object-mark-types.h" #include "player/avatar.h" +#include "player/mimic-info-table.h" +#include "player/player-effects.h" void process_eat_gold(player_type *target_ptr, monap_type *monap_ptr) { @@ -177,3 +179,74 @@ void process_eat_lite(player_type *target_ptr, monap_type *monap_ptr) target_ptr->window |= (PW_EQUIP); } + +/*! + * @brief モンスターからの攻撃による充填魔力吸収処理 + * @param target_ptr プレーヤーへの参照ポインタ + * @monap_ptr モンスターからモンスターへの直接攻撃構造体への参照ポインタ + * @return 吸収されたらTRUE、されなかったらFALSE + */ +bool process_un_power(player_type *target_ptr, monap_type *monap_ptr) +{ + if (((monap_ptr->o_ptr->tval != TV_STAFF) && (monap_ptr->o_ptr->tval != TV_WAND)) || (monap_ptr->o_ptr->pval == 0)) + return FALSE; + + int heal = monap_ptr->rlev * monap_ptr->o_ptr->pval; + if (monap_ptr->o_ptr->tval == TV_STAFF) + heal *= monap_ptr->o_ptr->number; + + heal = MIN(heal, monap_ptr->m_ptr->maxhp - monap_ptr->m_ptr->hp); + msg_print(_("ザックからエネルギーが吸い取られた!", "Energy drains from your pack!")); + monap_ptr->obvious = TRUE; + monap_ptr->m_ptr->hp += (HIT_POINT)heal; + if (target_ptr->health_who == monap_ptr->m_idx) + target_ptr->redraw |= (PR_HEALTH); + + if (target_ptr->riding == monap_ptr->m_idx) + target_ptr->redraw |= (PR_UHEALTH); + + monap_ptr->o_ptr->pval = 0; + target_ptr->update |= (PU_COMBINE | PU_REORDER); + target_ptr->window |= (PW_INVEN); + return TRUE; +} + +bool check_drain_hp(player_type *target_ptr, const s32b d) +{ + bool resist_drain = !drain_exp(target_ptr, d, d / 10, 50); + if (target_ptr->mimic_form) + return (mimic_info[target_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_NONLIVING) != 0 ? TRUE : resist_drain; + + switch (target_ptr->prace) { + case RACE_ZOMBIE: + case RACE_VAMPIRE: + case RACE_SPECTRE: + case RACE_SKELETON: + case RACE_BALROG: + case RACE_GOLEM: + case RACE_ANDROID: + return TRUE; + default: + return resist_drain; + } +} + +void process_drain_life(player_type *target_ptr, monap_type *monap_ptr, const bool resist_drain) +{ + if ((monap_ptr->damage <= 5) || resist_drain) + return; + + bool did_heal = monap_ptr->m_ptr->hp < monap_ptr->m_ptr->maxhp; + monap_ptr->m_ptr->hp += damroll(4, monap_ptr->damage / 6); + if (monap_ptr->m_ptr->hp > monap_ptr->m_ptr->maxhp) + monap_ptr->m_ptr->hp = monap_ptr->m_ptr->maxhp; + + if (target_ptr->health_who == monap_ptr->m_idx) + target_ptr->redraw |= (PR_HEALTH); + + if (target_ptr->riding == monap_ptr->m_idx) + target_ptr->redraw |= (PR_UHEALTH); + + if (monap_ptr->m_ptr->ml && did_heal) + msg_format(_("%sは体力を回復したようだ。", "%^s appears healthier."), monap_ptr->m_name); +} diff --git a/src/combat/monster-eating.h b/src/combat/monster-eating.h index d46b00649..0c0ae34f8 100644 --- a/src/combat/monster-eating.h +++ b/src/combat/monster-eating.h @@ -8,3 +8,7 @@ bool check_eat_item(player_type *target_ptr, monap_type *monap_ptr); void process_eat_item(player_type *target_ptr, monap_type *monap_ptr); void process_eat_food(player_type *target_ptr, monap_type *monap_ptr); void process_eat_lite(player_type *target_ptr, monap_type *monap_ptr); + +bool process_un_power(player_type *target_ptr, monap_type *monap_ptr); +bool check_drain_hp(player_type *target_ptr, const s32b d); +void process_drain_life(player_type *target_ptr, monap_type *monap_ptr, const bool resist_drain); -- 2.11.0