OSDN Git Service

[Fix] 元素魔法の単体抹殺が発動しなかったのを修正
authoriks <iks3@users.noreply.github.com>
Wed, 24 Mar 2021 13:13:48 +0000 (22:13 +0900)
committeriks <iks3@users.noreply.github.com>
Wed, 24 Mar 2021 13:13:48 +0000 (22:13 +0900)
処理にも不具合などがあったので修正

src/effect/effect-monster-switcher.cpp
src/mind/mind-elementalist.cpp

index c5aea5f..44c8a5d 100644 (file)
@@ -456,6 +456,8 @@ process_result switch_effects_monster(player_type *caster_ptr, effect_monster_ty
         return effect_monster_crusade(caster_ptr, em_ptr);
     case GF_WOUNDS:
         return effect_monster_wounds(em_ptr);
+    case GF_E_GENOCIDE:
+        return effect_monster_elemental_genocide(caster_ptr, em_ptr);
     default: {
         em_ptr->skipped = TRUE;
         em_ptr->dam = 0;
index 6fbe8c7..00de503 100644 (file)
@@ -956,65 +956,83 @@ void do_cmd_element_browse(player_type *caster_ptr)
     }
 }
 
-
 /*!
- * @brief å\85\83ç´ é­\94æ³\95ã\81®å\8d\98ä½\93æ\8a¹æ®ºã\81®å\8a¹æ\9e\9cã\82\92ç\99ºå\8b\95ã\81\99ã\82\8b 
- * @param caster_ptr プレイヤー情報への参照ポインタ
- * @param em_ptr 魔法効果情報への参照ポインタ
- * @return 効果処理を続けるかどうか
+ * @brief å\85\83ç´ é­\94æ³\95ã\81®å\8d\98ä½\93æ\8a¹æ®ºã\81\8cæ\9c\89å\8a¹ã\81\8b確èª\8dã\81\99ã\82\8b
+ * @param r_ptr モンスター種族への参照ポインタ
+ * @param type 魔法攻撃属性
+ * @return 効果があるならTRUE、なければFALSE
  */
-process_result effect_monster_elemental_genocide(player_type *caster_ptr, effect_monster_type *em_ptr)
+bool is_elemental_genocide_effective(monster_race *r_ptr, spells_type type)
 {
-    auto types = get_element_types(caster_ptr->realm1);
-    char m_name[160];
-
-    monster_desc(caster_ptr, m_name, em_ptr->m_ptr, 0);
-    msg_format(_("%sが%sを包み込んだ。", "The %s surrounds %s."), types[0], m_name);
-
-    auto realm = static_cast<ElementRealm>(caster_ptr->realm1);
-    switch (realm) {
-    case ElementRealm::FIRE:
-        if (any_bits(em_ptr->r_ptr->r_flagsr, RFR_IM_FIRE))
-            return PROCESS_CONTINUE;
+    switch (type) {
+    case GF_FIRE:
+        if (any_bits(r_ptr->flagsr, RFR_IM_FIRE))
+            return FALSE;
         break;
-    case ElementRealm::ICE:
-        if (any_bits(em_ptr->r_ptr->r_flagsr, RFR_IM_COLD))
-            return PROCESS_CONTINUE;
+    case GF_COLD:
+        if (any_bits(r_ptr->flagsr, RFR_IM_COLD))
+            return FALSE;
         break;
-    case ElementRealm::SKY:
-        if (any_bits(em_ptr->r_ptr->r_flagsr, RFR_IM_ELEC))
-            return PROCESS_CONTINUE;
+    case GF_ELEC:
+        if (any_bits(r_ptr->flagsr, RFR_IM_ELEC))
+            return FALSE;
         break;
-    case ElementRealm::SEA:
-        if (any_bits(em_ptr->r_ptr->r_flagsr, RFR_IM_ACID))
-            return PROCESS_CONTINUE;
+    case GF_ACID:
+        if (any_bits(r_ptr->flagsr, RFR_IM_ACID))
+            return FALSE;
         break;
-    case ElementRealm::DARKNESS:
-        if (any_bits(em_ptr->r_ptr->r_flagsr, RFR_RES_DARK) || any_bits(em_ptr->r_ptr->r_flags3, RF3_HURT_LITE))
-            return PROCESS_CONTINUE;
+    case GF_DARK:
+        if (any_bits(r_ptr->flagsr, RFR_RES_DARK) || any_bits(r_ptr->r_flags3, RF3_HURT_LITE))
+            return FALSE;
         break;
-    case ElementRealm::CHAOS:
-        if (any_bits(em_ptr->r_ptr->r_flags3, RF3_NO_CONF))
-            return PROCESS_CONTINUE;
+    case GF_CONFUSION:
+        if (any_bits(r_ptr->flags3, RF3_NO_CONF))
+            return FALSE;
         break;
-    case ElementRealm::EARTH:
-        if (any_bits(em_ptr->r_ptr->r_flagsr, RFR_RES_SHAR))
-            return PROCESS_CONTINUE;
+    case GF_SHARDS:
+        if (any_bits(r_ptr->flagsr, RFR_RES_SHAR))
+            return FALSE;
         break;
-    case ElementRealm::DEATH:
-        if (any_bits(em_ptr->r_ptr->r_flagsr, RFR_IM_POIS))
-            return PROCESS_CONTINUE;
+    case GF_POIS:
+        if (any_bits(r_ptr->flagsr, RFR_IM_POIS))
+            return FALSE;
         break;
     default:
-        return PROCESS_CONTINUE;
+        return FALSE;
     }
 
+    return TRUE;
+}
+
+/*!
+ * @brief 元素魔法の単体抹殺の効果を発動する 
+ * @param caster_ptr プレイヤー情報への参照ポインタ
+ * @param em_ptr 魔法効果情報への参照ポインタ
+ * @return 効果処理を続けるかどうか
+ */
+process_result effect_monster_elemental_genocide(player_type *caster_ptr, effect_monster_type *em_ptr)
+{
+    auto type = get_element_type(caster_ptr->realm1, 0);
+    auto name = get_element_name(caster_ptr->realm1, 0);
+    bool b = is_elemental_genocide_effective(em_ptr->r_ptr, type);
+
+    if (em_ptr->seen_msg)
+        msg_format(_("%sが%sを包み込んだ。", "The %s surrounds %s."), name, em_ptr->m_name);
+
     if (em_ptr->seen)
         em_ptr->obvious = TRUE;
 
+    if (!b) {
+        if (em_ptr->seen_msg)
+            msg_format(_("%sには効果がなかった。", "%^s is unaffected."), em_ptr->m_name);
+        em_ptr->dam = 0;
+        return PROCESS_TRUE;
+    }
+
     if (genocide_aux(caster_ptr, em_ptr->g_ptr->m_idx, em_ptr->dam, !em_ptr->who, (em_ptr->r_ptr->level + 1) / 2, _("モンスター消滅", "Genocide One"))) {
         if (em_ptr->seen_msg)
             msg_format(_("%sは消滅した!", "%^s disappeared!"), em_ptr->m_name);
+        em_ptr->dam = 0;
         chg_virtue(caster_ptr, V_VITALITY, -1);
         return PROCESS_TRUE;
     }