OSDN Git Service

[Refactor] #40514 player_type の resist_disen 変数を廃止. / Abolished the resist_disen...
[hengband/hengband.git] / src / monster-attack / monster-attack-switcher.c
index 6625ca1..8bba812 100644 (file)
@@ -38,7 +38,7 @@ static void calc_blow_poison(player_type *target_ptr, monap_type *monap_ptr)
     if (monap_ptr->explode)
         return;
 
-    if (!(target_ptr->resist_pois || is_oppose_pois(target_ptr)) && !check_multishadow(target_ptr)
+    if (!(has_resist_pois(target_ptr) || is_oppose_pois(target_ptr)) && !check_multishadow(target_ptr)
         && set_poisoned(target_ptr, target_ptr->poisoned + randint1(monap_ptr->rlev) + 5))
         monap_ptr->obvious = TRUE;
 
@@ -58,7 +58,7 @@ static void calc_blow_disenchant(player_type *target_ptr, monap_type *monap_ptr)
     if (monap_ptr->explode)
         return;
 
-    if (!target_ptr->resist_disen && !check_multishadow(target_ptr) && apply_disenchant(target_ptr, 0)) {
+    if (!has_resist_disen(target_ptr) && !check_multishadow(target_ptr) && apply_disenchant(target_ptr, 0)) {
         update_creature(target_ptr);
         monap_ptr->obvious = TRUE;
     }
@@ -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 モンスターからプレーヤーへの直接攻撃構造体への参照ポインタ
@@ -107,7 +144,7 @@ static void calc_blow_confusion(player_type *target_ptr, monap_type *monap_ptr)
     if (target_ptr->is_dead)
         return;
 
-    if (!target_ptr->resist_conf && !check_multishadow(target_ptr) && set_confused(target_ptr, target_ptr->confused + 3 + randint1(monap_ptr->rlev)))
+    if (!has_resist_conf(target_ptr) && !check_multishadow(target_ptr) && set_confused(target_ptr, target_ptr->confused + 3 + randint1(monap_ptr->rlev)))
         monap_ptr->obvious = TRUE;
 
     update_smart_learn(target_ptr, monap_ptr->m_idx, DRS_CONF);
@@ -281,35 +318,17 @@ 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: {
+    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))
-            break;
-
-        if (target_ptr->is_dead || check_multishadow(target_ptr))
+        if (monster_confused_remaining(monap_ptr->m_ptr) || target_ptr->is_dead || check_multishadow(target_ptr))
             break;
 
         monap_ptr->obvious = TRUE;
         process_eat_gold(target_ptr, monap_ptr);
         break;
-    }
     case RBE_EAT_ITEM: {
         monap_ptr->get_damage += take_hit(target_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc, -1);
         if (!check_eat_item(target_ptr, monap_ptr))
@@ -446,7 +465,7 @@ void switch_monster_blow_to_player(player_type *target_ptr, monap_type *monap_pt
     case RBE_INERTIA:
         calc_blow_inertia(target_ptr, monap_ptr);
         break;
-    case RBE_STUN: {
+    case RBE_STUN:
         monap_ptr->get_damage += take_hit(target_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc, -1);
         if (target_ptr->is_dead)
             break;
@@ -454,5 +473,4 @@ void switch_monster_blow_to_player(player_type *target_ptr, monap_type *monap_pt
         process_stun_attack(target_ptr, monap_ptr);
         break;
     }
-    }
 }