From 0720967cd8b7d5ef374e88a3422408bd8eddfea4 Mon Sep 17 00:00:00 2001 From: Hourier Date: Sun, 1 Aug 2021 22:29:39 +0900 Subject: [PATCH] [Refactor] #1301 Reshaped apply_magic_to_object() --- .../abstract-protector-enchanter.cpp | 5 +- src/object-enchant/apply-magic-amulet.cpp | 6 +- src/object-enchant/apply-magic-armor.cpp | 8 +++ src/object-enchant/apply-magic-boots.cpp | 7 ++- src/object-enchant/apply-magic-cloak.cpp | 5 ++ src/object-enchant/apply-magic-ring.cpp | 6 +- src/object-enchant/apply-magic-shield.cpp | 26 +++------ src/object-enchant/apply-magic-shield.h | 2 +- src/object-enchant/apply-magic.cpp | 66 ++++------------------ 9 files changed, 51 insertions(+), 80 deletions(-) diff --git a/src/object-enchant/abstract-protector-enchanter.cpp b/src/object-enchant/abstract-protector-enchanter.cpp index 6a209d49f..147f3e19c 100644 --- a/src/object-enchant/abstract-protector-enchanter.cpp +++ b/src/object-enchant/abstract-protector-enchanter.cpp @@ -13,12 +13,15 @@ * @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) { diff --git a/src/object-enchant/apply-magic-amulet.cpp b/src/object-enchant/apply-magic-amulet.cpp index fd4c78280..14af673ac 100644 --- a/src/object-enchant/apply-magic-amulet.cpp +++ b/src/object-enchant/apply-magic-amulet.cpp @@ -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); diff --git a/src/object-enchant/apply-magic-armor.cpp b/src/object-enchant/apply-magic-armor.cpp index ba53d8a3b..8af7c462c 100644 --- a/src/object-enchant/apply-magic-armor.cpp +++ b/src/object-enchant/apply-magic-armor.cpp @@ -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; diff --git a/src/object-enchant/apply-magic-boots.cpp b/src/object-enchant/apply-magic-boots.cpp index 4d56718c4..6d2d9606f 100644 --- a/src/object-enchant/apply-magic-boots.cpp +++ b/src/object-enchant/apply-magic-boots.cpp @@ -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); } } diff --git a/src/object-enchant/apply-magic-cloak.cpp b/src/object-enchant/apply-magic-cloak.cpp index acf523a7a..f5fd4d71c 100644 --- a/src/object-enchant/apply-magic-cloak.cpp +++ b/src/object-enchant/apply-magic-cloak.cpp @@ -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); diff --git a/src/object-enchant/apply-magic-ring.cpp b/src/object-enchant/apply-magic-ring.cpp index d8db5a95f..e6c93c325 100644 --- a/src/object-enchant/apply-magic-ring.cpp +++ b/src/object-enchant/apply-magic-ring.cpp @@ -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); diff --git a/src/object-enchant/apply-magic-shield.cpp b/src/object-enchant/apply-magic-shield.cpp index 23a3f1827..2df117b6a 100644 --- a/src/object-enchant/apply-magic-shield.cpp +++ b/src/object-enchant/apply-magic-shield.cpp @@ -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() diff --git a/src/object-enchant/apply-magic-shield.h b/src/object-enchant/apply-magic-shield.h index a575dfb0e..fc56c0e57 100644 --- a/src/object-enchant/apply-magic-shield.h +++ b/src/object-enchant/apply-magic-shield.h @@ -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(){}; diff --git a/src/object-enchant/apply-magic.cpp b/src/object-enchant/apply-magic.cpp index 453172505..baee2552d 100644 --- a/src/object-enchant/apply-magic.cpp +++ b/src/object-enchant/apply-magic.cpp @@ -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; -- 2.11.0