OSDN Git Service

[Refactor] #1301 Reshaped apply_magic_to_object()
authorHourier <grapefox.whitelucifer.0408@gmail.com>
Sun, 1 Aug 2021 13:29:39 +0000 (22:29 +0900)
committerHourier <grapefox.whitelucifer.0408@gmail.com>
Sun, 1 Aug 2021 13:29:39 +0000 (22:29 +0900)
src/object-enchant/abstract-protector-enchanter.cpp
src/object-enchant/apply-magic-amulet.cpp
src/object-enchant/apply-magic-armor.cpp
src/object-enchant/apply-magic-boots.cpp
src/object-enchant/apply-magic-cloak.cpp
src/object-enchant/apply-magic-ring.cpp
src/object-enchant/apply-magic-shield.cpp
src/object-enchant/apply-magic-shield.h
src/object-enchant/apply-magic.cpp

index 6a209d4..147f3e1 100644 (file)
  * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
  * @param level 生成基準階
  * @param power 生成ランク
- * @details パワー0の時は何もしない
  */
 AbstractProtectorEnchanter::AbstractProtectorEnchanter(object_type *o_ptr, DEPTH level, int power)
     : o_ptr(o_ptr)
     , power(power)
 {
+    if (this->power == 0) {
+        return;
+    }
+
     auto toac1 = (ARMOUR_CLASS)(randint1(5) + m_bonus(5, level));
     auto toac2 = (ARMOUR_CLASS)m_bonus(10, level);
     if (this->power > 0) {
index fd4c782..14af673 100644 (file)
@@ -44,7 +44,11 @@ AmuletEnchanter::AmuletEnchanter(player_type *owner_ptr, object_type *o_ptr, DEP
  */
 void AmuletEnchanter::apply_magic()
 {
-    enchant();
+    if (!this->power && (randint0(100) < 50)) {
+        this->power = -1;
+    }
+
+    this->enchant();
     if ((one_in_(150) && (this->power > 0) && !object_is_cursed(this->o_ptr) && (this->level > 79)) || (this->power > 2)) {
         this->o_ptr->pval = MIN(this->o_ptr->pval, 4);
         become_random_artifact(owner_ptr, this->o_ptr, false);
index ba53d8a..8af7c46 100644 (file)
@@ -31,6 +31,10 @@ ArmorEnchanter::ArmorEnchanter(player_type *owner_ptr, object_type *o_ptr, DEPTH
  */
 void ArmorEnchanter::apply_magic()
 {
+    if (this->power == 0) {
+        return;
+    }
+
     switch (this->o_ptr->tval) {
     case TV_DRAG_ARMOR:
         if (one_in_(50) || (this->power > 2)) {
@@ -45,6 +49,10 @@ void ArmorEnchanter::apply_magic()
 
         break;
     case TV_SOFT_ARMOR: {
+        if (this->o_ptr->sval == SV_KUROSHOUZOKU) {
+            this->o_ptr->pval = randint1(4);
+        }
+
         if (this->power > 1) {
             this->try_generate_twilight_robe();
             break;
index 4d56718..6d2d960 100644 (file)
@@ -10,8 +10,8 @@
 #include "inventory/inventory-slot-types.h"
 #include "object-enchant/object-boost.h"
 #include "object-enchant/object-ego.h"
-#include "system/object-type-definition.h"
 #include "sv-definition/sv-protector-types.h"
+#include "system/object-type-definition.h"
 
 /*
  * @brief コンストラクタ
@@ -45,7 +45,10 @@ void BootsEnchanter::apply_magic()
         }
 
         this->o_ptr->name2 = get_random_ego(INVEN_FEET, true);
-    } else if (this->power < -1) {
+        return;
+    }
+
+    if (this->power < -1) {
         this->o_ptr->name2 = get_random_ego(INVEN_FEET, false);
     }
 }
index acf523a..f5fd4d7 100644 (file)
@@ -8,6 +8,7 @@
 #include "artifact/random-art-generator.h"
 #include "inventory/inventory-slot-types.h"
 #include "object-enchant/object-ego.h"
+#include "sv-definition/sv-protector-types.h"
 #include "system/object-type-definition.h"
 
 /*
@@ -28,6 +29,10 @@ CloakEnchanter::CloakEnchanter(player_type *owner_ptr, object_type *o_ptr, DEPTH
  */
 void CloakEnchanter::apply_magic()
 {
+    if (this->o_ptr->sval == SV_ELVEN_CLOAK) {
+        this->o_ptr->pval = randint1(4);
+    }
+
     if (this->power > 1) {
         if (one_in_(20) || (this->power > 2)) {
             become_random_artifact(this->owner_ptr, this->o_ptr, false);
index d8db5a9..e6c93c3 100644 (file)
@@ -44,7 +44,11 @@ RingEnchanter::RingEnchanter(player_type *owner_ptr, object_type *o_ptr, DEPTH l
  */
 void RingEnchanter::apply_magic()
 {
-    enchant();
+    if ((this->power == 0) && (randint0(100) < 50)) {
+        this->power = -1;
+    }
+
+    this->enchant();
     if ((one_in_(400) && (this->power > 0) && !object_is_cursed(this->o_ptr) && (this->level > 79)) || (this->power > 2)) {
         this->o_ptr->pval = MIN(this->o_ptr->pval, 4);
         become_random_artifact(this->owner_ptr, this->o_ptr, false);
index 23a3f18..2df117b 100644 (file)
@@ -27,13 +27,15 @@ ShieldEnchanter::ShieldEnchanter(player_type *owner_ptr, object_type *o_ptr, DEP
 }
 
 /*
- * @details 金属製の盾は魔法を受け付けない. power > 2はデバッグ専用.
+ * @details power > 2はデバッグ専用.
  */
 void ShieldEnchanter::apply_magic()
 {
-    this->enchant();
-    if (this->stop_continuous_application) {
-        return;
+    if (this->o_ptr->sval == SV_DRAGON_SHIELD) {
+        dragon_resist(this->o_ptr);
+        if (!one_in_(3)) {
+            return;
+        }
     }
 
     if (this->power <= 1) {
@@ -48,22 +50,8 @@ void ShieldEnchanter::apply_magic()
     this->give_ego_index();
 }
 
-void ShieldEnchanter::enchant()
-{
-    switch (this->o_ptr->sval) {
-    case SV_DRAGON_SHIELD:
-        dragon_resist(this->o_ptr);
-        if (!one_in_(3)) {
-            this->stop_continuous_application = true;
-        }
-
-        return;
-    default:
-        return;
-    }
-}
-
 /*
+ * @details 金属製の盾は魔法を受け付けない.
  * @todo ミラー・シールドはエゴの付与確率が低い. この仕様で良いか要確認.
  */
 void ShieldEnchanter::give_ego_index()
index a575dfb..fc56c0e 100644 (file)
@@ -14,7 +14,7 @@ public:
     void apply_magic() override;
 
 protected:
-    void enchant() override;
+    void enchant(){};
     void give_ego_index() override;
     void give_high_ego_index(){};
     void give_cursed(){};
index 4531725..baee255 100644 (file)
@@ -133,94 +133,50 @@ void apply_magic_to_object(player_type *owner_ptr, object_type *o_ptr, DEPTH lev
 
         break;
     case TV_POLEARM:
-        if ((power != 0) && !(o_ptr->sval == SV_DEATH_SCYTHE)) {
+        if ((power != 0) && (o_ptr->sval != SV_DEATH_SCYTHE)) {
             apply_magic_weapon(owner_ptr, o_ptr, lev, power);
         }
 
         break;
     case TV_SWORD:
-        if ((power != 0) && !(o_ptr->sval == SV_POISON_NEEDLE)) {
+        if ((power != 0) && (o_ptr->sval != SV_POISON_NEEDLE)) {
             apply_magic_weapon(owner_ptr, o_ptr, lev, power);
         }
 
         break;
     case TV_SHIELD:
-        if ((power != 0) || (o_ptr->sval == SV_DRAGON_SHIELD)) {
-            ShieldEnchanter(owner_ptr, o_ptr, lev, power).apply_magic();
-        }
-
+        ShieldEnchanter(owner_ptr, o_ptr, lev, power).apply_magic();
         break;
     case TV_CLOAK:
-        if (o_ptr->sval == SV_ELVEN_CLOAK) {
-            o_ptr->pval = randint1(4);
-        }
-
-        if (power != 0) {
-            CloakEnchanter(owner_ptr, o_ptr, lev, power).apply_magic();
-        }
-
+        CloakEnchanter(owner_ptr, o_ptr, lev, power).apply_magic();
         break;
     case TV_HELM:
-        if ((power != 0) || (o_ptr->sval == SV_DRAGON_HELM)) {
-            HelmEnchanter(owner_ptr, o_ptr, lev, power).apply_magic();
-        }
-
+        HelmEnchanter(owner_ptr, o_ptr, lev, power).apply_magic();
         break;
     case TV_CROWN:
-        if (power != 0) {
-            CrownEnchanter(owner_ptr, o_ptr, lev, power).apply_magic();
-        }
-
+        CrownEnchanter(owner_ptr, o_ptr, lev, power).apply_magic();
         break;
     case TV_BOOTS:
-        if ((power != 0) || (o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE)) {
-            BootsEnchanter(owner_ptr, o_ptr, lev, power).apply_magic();
-        }
-
+        BootsEnchanter(owner_ptr, o_ptr, lev, power).apply_magic();
         break;
     case TV_DRAG_ARMOR:
     case TV_HARD_ARMOR:
-        if (power != 0) {
-            ArmorEnchanter(owner_ptr, o_ptr, lev, power).apply_magic();
-        }
-
-        break;
     case TV_SOFT_ARMOR:
-        if (o_ptr->sval == SV_KUROSHOUZOKU) {
-            o_ptr->pval = randint1(4);
-        }
-
-        if (power != 0) {
-            ArmorEnchanter(owner_ptr, o_ptr, lev, power).apply_magic();
-        }
-
+        ArmorEnchanter(owner_ptr, o_ptr, lev, power).apply_magic();
         break;
     case TV_GLOVES:
-        if ((power != 0) || (o_ptr->sval == SV_SET_OF_DRAGON_GLOVES)) {
-            GlovesEnchanter(owner_ptr, o_ptr, lev, power).apply_magic();
-        }
-
+        GlovesEnchanter(owner_ptr, o_ptr, lev, power).apply_magic();
         break;
     case TV_RING:
-        if (!power && (randint0(100) < 50)) {
-            power = -1;
-        }
-
         RingEnchanter(owner_ptr, o_ptr, lev, power).apply_magic();
         break;
-    case TV_AMULET: {
-        if (!power && (randint0(100) < 50)) {
-            power = -1;
-        }
-
+    case TV_AMULET:
         AmuletEnchanter(owner_ptr, o_ptr, lev, power).apply_magic();
         break;
-    }
-    default: {
+    default:
         apply_magic_others(owner_ptr, o_ptr, power);
         break;
     }
-    }
 
     if ((o_ptr->tval == TV_SOFT_ARMOR) && (o_ptr->sval == SV_ABUNAI_MIZUGI) && (owner_ptr->pseikaku == PERSONALITY_SEXY)) {
         o_ptr->pval = 3;