From 7e98e49be639a3800b9f68ca48e3663cd38f4e76 Mon Sep 17 00:00:00 2001 From: Hourier Date: Wed, 7 Oct 2020 23:29:48 +0900 Subject: [PATCH] =?utf8?q?[Implement]=20#37285=20calc=5Fblow=5Fun=5Fpower(?= =?utf8?q?)=20=E3=81=A8process=5Fun=5Fpower()=E3=81=AB=E3=81=8A=E3=81=84?= =?utf8?q?=E3=81=A6=E3=80=81=E9=AD=94=E9=81=93=E5=85=B7=E4=BD=BF=E7=94=A8?= =?utf8?q?=E8=83=BD=E5=8A=9B=E5=90=91=E4=B8=8A=E3=83=95=E3=83=A9=E3=82=B0?= =?utf8?q?=E3=81=AB=E3=82=88=E3=82=8B=E3=83=80=E3=83=A1=E3=83=BC=E3=82=B8?= =?utf8?q?=E6=B8=9B=E8=A1=B0=E5=87=A6=E7=90=86=E3=82=92=E8=BF=BD=E5=8A=A0?= =?utf8?q?=20/=20Added=20attenuating=20calculation=20for=20un-power=20into?= =?utf8?q?=20calc=5Fblow=5Fun=5Fpower()=20and=20process=5Fun=5Fpower()?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- src/monster-attack/monster-attack-switcher.c | 55 ++++++++++++++++++++-------- src/monster-attack/monster-eating.c | 18 +++++---- 2 files changed, 50 insertions(+), 23 deletions(-) diff --git a/src/monster-attack/monster-attack-switcher.c b/src/monster-attack/monster-attack-switcher.c index bcd4adde2..3647c76dc 100644 --- a/src/monster-attack/monster-attack-switcher.c +++ b/src/monster-attack/monster-attack-switcher.c @@ -71,6 +71,43 @@ static void calc_blow_disenchant(player_type *target_ptr, monap_type *monap_ptr) } /*! + * @brief 魔道具吸収ダメージを計算する (消費魔力減少、呪文失敗率減少、魔道具使用能力向上があればそれぞれ-7.5%) + * @param target_ptr プレーヤーへの参照ポインタ + * @param monap_ptr モンスターからプレーヤーへの直接攻撃構造体への参照ポインタ + * @return なし + * @detals 魔道具使用能力向上フラグがあれば、吸収対象のアイテムをスキャンされる回数が半分で済む + */ +static void calc_blow_un_power(player_type *target_ptr, monap_type *monap_ptr) +{ + int damage_ratio = 1000; + if (has_dec_mana(target_ptr)) + damage_ratio -= 75; + + if (has_easy_spell(target_ptr)) + damage_ratio -= 75; + + bool is_magic_mastery = has_magic_mastery(target_ptr) != 0; + if (is_magic_mastery) + damage_ratio -= 75; + + monap_ptr->damage = monap_ptr->damage * damage_ratio / 1000; + monap_ptr->get_damage += take_hit(target_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc, -1); + if (target_ptr->is_dead || check_multishadow(target_ptr)) + return; + + int max_draining_item = is_magic_mastery ? 5 : 10; + for (int i = 0; i < max_draining_item; i++) { + INVENTORY_IDX i_idx = (INVENTORY_IDX)randint0(INVEN_PACK); + monap_ptr->o_ptr = &target_ptr->inventory_list[i_idx]; + if (monap_ptr->o_ptr->k_idx == 0) + continue; + + if (process_un_power(target_ptr, monap_ptr)) + break; + } +} + +/*! * @brief 盲目ダメージを計算する (耐性があれば、(1d4 + 3) / 8になる) * @param target_ptr プレーヤーへの参照ポインタ * @param monap_ptr モンスターからプレーヤーへの直接攻撃構造体への参照ポインタ @@ -281,23 +318,9 @@ void switch_monster_blow_to_player(player_type *target_ptr, monap_type *monap_pt case RBE_UN_BONUS: calc_blow_disenchant(target_ptr, monap_ptr); break; - case RBE_UN_POWER: { - monap_ptr->get_damage += take_hit(target_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc, -1); - if (target_ptr->is_dead || check_multishadow(target_ptr)) - break; - - for (int i = 0; i < 10; i++) { - INVENTORY_IDX i_idx = (INVENTORY_IDX)randint0(INVEN_PACK); - monap_ptr->o_ptr = &target_ptr->inventory_list[i_idx]; - if (monap_ptr->o_ptr->k_idx == 0) - continue; - - if (process_un_power(target_ptr, monap_ptr)) - break; - } - + case RBE_UN_POWER: + calc_blow_un_power(target_ptr, monap_ptr); break; - } case RBE_EAT_GOLD: { monap_ptr->get_damage += take_hit(target_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc, -1); if (monster_confused_remaining(monap_ptr->m_ptr)) diff --git a/src/monster-attack/monster-eating.c b/src/monster-attack/monster-eating.c index 0c9168f51..8b59bf527 100644 --- a/src/monster-attack/monster-eating.c +++ b/src/monster-attack/monster-eating.c @@ -20,6 +20,7 @@ #include "object/object-mark-types.h" #include "player-info/avatar.h" #include "player/mimic-info-table.h" +#include "player/player-status-flags.h" #include "player/player-status-table.h" #include "status/experience.h" #include "system/floor-type-definition.h" @@ -196,29 +197,32 @@ void process_eat_lite(player_type *target_ptr, monap_type *monap_ptr) * @param target_ptr プレーヤーへの参照ポインタ * @monap_ptr モンスターからモンスターへの直接攻撃構造体への参照ポインタ * @return 吸収されたらTRUE、されなかったらFALSE + * @details 魔道具使用能力向上フラグがあれば、吸収量は全部ではなく半分で済む */ 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; + bool is_magic_mastery = has_magic_mastery(target_ptr) != 0; + int drain_ratio = is_magic_mastery ? 2 : 1; + int heal = monap_ptr->rlev * monap_ptr->o_ptr->pval / drain_ratio; 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); + heal = MIN(heal, (monap_ptr->m_ptr->maxhp - monap_ptr->m_ptr->hp) / drain_ratio); 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); + target_ptr->redraw |= PR_HEALTH; if (target_ptr->riding == monap_ptr->m_idx) - target_ptr->redraw |= (PR_UHEALTH); + target_ptr->redraw |= PR_UHEALTH; - monap_ptr->o_ptr->pval = 0; - target_ptr->update |= (PU_COMBINE | PU_REORDER); - target_ptr->window |= (PW_INVEN); + monap_ptr->o_ptr->pval = !is_magic_mastery || (monap_ptr->o_ptr->pval == 1) ? 0 : (monap_ptr->o_ptr->pval + 1) / 2; + target_ptr->update |= PU_COMBINE | PU_REORDER; + target_ptr->window |= PW_INVEN; return TRUE; } -- 2.11.0