From ef4573860572668bb24515cd4a9c8f58a68da9d3 Mon Sep 17 00:00:00 2001 From: Hourier Date: Sat, 26 Sep 2020 13:37:25 +0900 Subject: [PATCH] =?utf8?q?[Implement]=20#37285=20=E7=97=85=E6=B0=97?= =?utf8?q?=E3=83=80=E3=83=A1=E3=83=BC=E3=82=B8=E3=81=AE=E6=B8=9B=E8=A1=B0?= =?utf8?q?=E5=BC=8F=E3=82=92=E8=BF=BD=E5=8A=A0=20/=20Added=20attenuating?= =?utf8?q?=20calculation=20for=20disease=20blow?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- src/monster-attack/monster-attack-switcher.c | 54 +++++++++++++++++----------- 1 file changed, 34 insertions(+), 20 deletions(-) diff --git a/src/monster-attack/monster-attack-switcher.c b/src/monster-attack/monster-attack-switcher.c index e11ef68e0..008c6b7f9 100644 --- a/src/monster-attack/monster-attack-switcher.c +++ b/src/monster-attack/monster-attack-switcher.c @@ -150,6 +150,38 @@ static void calc_blow_paralysis(player_type *target_ptr, monap_type *monap_ptr) update_smart_learn(target_ptr, monap_ptr->m_idx, DRS_FREE); } +/*! + * @brief 病気ダメージを計算する (耐性があれば、(1d4 + 4) / 9になり、病気になる確率が無耐性の場合より更に2/5へ低下する。二重耐性なら更に低下する) + * @param target_ptr プレーヤーへの参照ポインタ + * @param monap_ptr モンスターからプレーヤーへの直接攻撃構造体への参照ポインタ + * @return なし + */ +static void calc_blow_disease(player_type *target_ptr, monap_type *monap_ptr) +{ + if (is_resist_pois(target_ptr)) + monap_ptr->damage = monap_ptr->damage * (randint1(4) + 4) / 9; + + if (is_oppose_pois(target_ptr)) + monap_ptr->damage = monap_ptr->damage * (randint1(4) + 4) / 9; + + 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; + + if (!(target_ptr->resist_pois || is_oppose_pois(target_ptr)) && set_poisoned(target_ptr, target_ptr->poisoned + randint1(monap_ptr->rlev) + 5)) + monap_ptr->obvious = TRUE; + + bool disease_possibility = randint1(100) > calc_nuke_damage_rate(target_ptr); + if (disease_possibility || (randint1(100) >= 11) || (target_ptr->prace == RACE_ANDROID)) + return; + + bool perm = one_in_(10); + if (dec_stat(target_ptr, A_CON, randint1(10), perm)) { + msg_print(_("病があなたを蝕んでいる気がする。", "You feel sickly.")); + monap_ptr->obvious = TRUE; + } +} + void switch_monster_blow_to_player(player_type *target_ptr, monap_type *monap_ptr) { switch (monap_ptr->effect) { @@ -404,27 +436,9 @@ void switch_monster_blow_to_player(player_type *target_ptr, monap_type *monap_pt (void)drain_exp(target_ptr, d, d / 10, 50); break; } - case RBE_DISEASE: { - 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; - - if (!(target_ptr->resist_pois || is_oppose_pois(target_ptr))) { - if (set_poisoned(target_ptr, target_ptr->poisoned + randint1(monap_ptr->rlev) + 5)) { - monap_ptr->obvious = TRUE; - } - } - - if ((randint1(100) < 11) && (target_ptr->prace != RACE_ANDROID)) { - bool perm = one_in_(10); - if (dec_stat(target_ptr, A_CON, randint1(10), perm)) { - msg_print(_("病があなたを蝕んでいる気がする。", "You feel sickly.")); - monap_ptr->obvious = TRUE; - } - } - + case RBE_DISEASE: + calc_blow_didease(target_ptr, monap_ptr); break; - } case RBE_TIME: { if (monap_ptr->explode) break; -- 2.11.0