OSDN Git Service

[Refactor] #3496 optional 型の存在判定 has_value() を撤廃した その4
[hengbandforosx/hengbandosx.git] / src / object-enchant / others / apply-magic-amulet.cpp
index a3f6866..39ce00d 100644 (file)
@@ -1,4 +1,4 @@
-/*!
+/*!
  * @brief アミュレットを強化生成する処理
  * @date 2021/04/30
  * @author Hourier
@@ -10,9 +10,9 @@
 #include "object-enchant/object-ego.h"
 #include "object-enchant/special-object-flags.h"
 #include "object-enchant/trc-types.h"
-#include "object/object-kind.h"
 #include "sv-definition/sv-amulet-types.h"
-#include "system/object-type-definition.h"
+#include "system/baseitem-info.h"
+#include "system/item-entity.h"
 #include "system/player-type-definition.h"
 #include "util/bit-flags-calculator.h"
 
@@ -23,7 +23,7 @@
  * @param level 生成基準階
  * @param power 生成ランク
  */
-AmuletEnchanter::AmuletEnchanter(PlayerType *player_ptr, ObjectType *o_ptr, DEPTH level, int power)
+AmuletEnchanter::AmuletEnchanter(PlayerType *player_ptr, ItemEntity *o_ptr, DEPTH level, int power)
     : player_ptr(player_ptr)
     , o_ptr(o_ptr)
     , level(level)
@@ -68,7 +68,12 @@ void AmuletEnchanter::apply_magic()
 
 void AmuletEnchanter::sval_enchant()
 {
-    switch (this->o_ptr->sval) {
+    const auto sval = this->o_ptr->bi_key.sval();
+    if (!sval) {
+        return;
+    }
+
+    switch (sval.value()) {
     case SV_AMULET_INTELLIGENCE:
     case SV_AMULET_WISDOM:
     case SV_AMULET_CHARISMA:
@@ -151,16 +156,16 @@ void AmuletEnchanter::sval_enchant()
 
 void AmuletEnchanter::give_ego_index()
 {
-    while (this->o_ptr->name2 == EgoType::NONE) {
-        auto *k_ptr = &k_info[this->o_ptr->k_idx];
+    while (!this->o_ptr->is_ego()) {
+        const auto &baseitem = this->o_ptr->get_baseitem();
         switch (randint1(21)) {
         case 1:
         case 2:
-            if (k_ptr->flags.has(TR_SLOW_DIGEST)) {
+            if (baseitem.flags.has(TR_SLOW_DIGEST)) {
                 break;
             }
 
-            this->o_ptr->name2 = EgoType::AMU_SLOW_D;
+            this->o_ptr->ego_idx = EgoType::AMU_SLOW_D;
             break;
         case 3:
         case 4:
@@ -168,83 +173,83 @@ void AmuletEnchanter::give_ego_index()
                 break;
             }
 
-            this->o_ptr->name2 = EgoType::AMU_INFRA;
+            this->o_ptr->ego_idx = EgoType::AMU_INFRA;
             break;
         case 5:
         case 6:
-            if (k_ptr->flags.has(TR_SEE_INVIS)) {
+            if (baseitem.flags.has(TR_SEE_INVIS)) {
                 break;
             }
 
-            this->o_ptr->name2 = EgoType::AMU_SEE_INVIS;
+            this->o_ptr->ego_idx = EgoType::AMU_SEE_INVIS;
             break;
         case 7:
         case 8:
-            if (k_ptr->flags.has(TR_HOLD_EXP)) {
+            if (baseitem.flags.has(TR_HOLD_EXP)) {
                 break;
             }
 
-            this->o_ptr->name2 = EgoType::AMU_HOLD_EXP;
+            this->o_ptr->ego_idx = EgoType::AMU_HOLD_EXP;
             break;
         case 9:
-            if (k_ptr->flags.has(TR_LEVITATION)) {
+            if (baseitem.flags.has(TR_LEVITATION)) {
                 break;
             }
 
-            this->o_ptr->name2 = EgoType::AMU_LEVITATION;
+            this->o_ptr->ego_idx = EgoType::AMU_LEVITATION;
             break;
         case 10:
         case 11:
         case 21:
-            this->o_ptr->name2 = EgoType::AMU_AC;
+            this->o_ptr->ego_idx = EgoType::AMU_AC;
             break;
         case 12:
-            if (k_ptr->flags.has(TR_RES_FIRE)) {
+            if (baseitem.flags.has(TR_RES_FIRE)) {
                 break;
             }
 
             if (m_bonus(10, this->level) > 8) {
-                this->o_ptr->name2 = EgoType::AMU_RES_FIRE_;
+                this->o_ptr->ego_idx = EgoType::AMU_RES_FIRE_;
                 break;
             }
 
-            this->o_ptr->name2 = EgoType::AMU_RES_FIRE;
+            this->o_ptr->ego_idx = EgoType::AMU_RES_FIRE;
             break;
         case 13:
-            if (k_ptr->flags.has(TR_RES_COLD)) {
+            if (baseitem.flags.has(TR_RES_COLD)) {
                 break;
             }
 
             if (m_bonus(10, this->level) > 8) {
-                this->o_ptr->name2 = EgoType::AMU_RES_COLD_;
+                this->o_ptr->ego_idx = EgoType::AMU_RES_COLD_;
                 break;
             }
 
-            this->o_ptr->name2 = EgoType::AMU_RES_COLD;
+            this->o_ptr->ego_idx = EgoType::AMU_RES_COLD;
             break;
         case 14:
-            if (k_ptr->flags.has(TR_RES_ELEC)) {
+            if (baseitem.flags.has(TR_RES_ELEC)) {
                 break;
             }
 
             if (m_bonus(10, this->level) > 8) {
-                this->o_ptr->name2 = EgoType::AMU_RES_ELEC_;
+                this->o_ptr->ego_idx = EgoType::AMU_RES_ELEC_;
                 break;
             }
 
-            this->o_ptr->name2 = EgoType::AMU_RES_ELEC;
+            this->o_ptr->ego_idx = EgoType::AMU_RES_ELEC;
             break;
         case 15:
-            if (k_ptr->flags.has(TR_RES_ACID)) {
+            if (baseitem.flags.has(TR_RES_ACID)) {
                 break;
             }
 
             if (m_bonus(10, this->level) > 8) {
-                this->o_ptr->name2 = EgoType::AMU_RES_ACID_;
+                this->o_ptr->ego_idx = EgoType::AMU_RES_ACID_;
                 break;
             }
 
-            this->o_ptr->name2 = EgoType::AMU_RES_ACID;
+            this->o_ptr->ego_idx = EgoType::AMU_RES_ACID;
             break;
         case 16:
         case 17:
@@ -259,63 +264,68 @@ void AmuletEnchanter::give_ego_index()
 
 void AmuletEnchanter::give_high_ego_index()
 {
-    switch (this->o_ptr->sval) {
+    const auto sval = this->o_ptr->bi_key.sval();
+    if (!sval) {
+        return;
+    }
+
+    switch (sval.value()) {
     case SV_AMULET_TELEPORT:
         if (m_bonus(10, this->level) > 9) {
-            this->o_ptr->name2 = EgoType::AMU_D_DOOR;
+            this->o_ptr->ego_idx = EgoType::AMU_D_DOOR;
             break;
         }
 
         if (one_in_(2)) {
-            this->o_ptr->name2 = EgoType::AMU_JUMP;
+            this->o_ptr->ego_idx = EgoType::AMU_JUMP;
             break;
         }
 
-        this->o_ptr->name2 = EgoType::AMU_TELEPORT;
+        this->o_ptr->ego_idx = EgoType::AMU_TELEPORT;
         break;
     case SV_AMULET_RESIST_ACID:
         if ((m_bonus(10, this->level) > 6) && one_in_(2)) {
-            this->o_ptr->name2 = EgoType::AMU_RES_ACID_;
+            this->o_ptr->ego_idx = EgoType::AMU_RES_ACID_;
         }
 
         break;
     case SV_AMULET_SEARCHING:
-        this->o_ptr->name2 = EgoType::AMU_STEALTH;
+        this->o_ptr->ego_idx = EgoType::AMU_STEALTH;
         break;
     case SV_AMULET_BRILLIANCE:
         if (!one_in_(3)) {
             break;
         }
 
-        this->o_ptr->name2 = EgoType::AMU_IDENT;
+        this->o_ptr->ego_idx = EgoType::AMU_IDENT;
         break;
     case SV_AMULET_CHARISMA:
         if (!one_in_(3)) {
             break;
         }
 
-        this->o_ptr->name2 = EgoType::AMU_CHARM;
+        this->o_ptr->ego_idx = EgoType::AMU_CHARM;
         break;
     case SV_AMULET_THE_MAGI:
         if (one_in_(2)) {
             break;
         }
 
-        this->o_ptr->name2 = EgoType::AMU_GREAT;
+        this->o_ptr->ego_idx = EgoType::AMU_GREAT;
         break;
     case SV_AMULET_RESISTANCE:
         if (!one_in_(5)) {
             break;
         }
 
-        this->o_ptr->name2 = EgoType::AMU_DEFENDER;
+        this->o_ptr->ego_idx = EgoType::AMU_DEFENDER;
         break;
     case SV_AMULET_TELEPATHY:
         if (!one_in_(3)) {
             break;
         }
 
-        this->o_ptr->name2 = EgoType::AMU_DETECTION;
+        this->o_ptr->ego_idx = EgoType::AMU_DETECTION;
         break;
     default:
         break;
@@ -340,35 +350,35 @@ void AmuletEnchanter::give_cursed()
         this->o_ptr->pval = 0 - this->o_ptr->pval;
     }
 
-    while (this->o_ptr->name2 == EgoType::NONE) {
-        auto *k_ptr = &k_info[this->o_ptr->k_idx];
+    while (!this->o_ptr->is_ego()) {
+        const auto &baseitem = this->o_ptr->get_baseitem();
         switch (randint1(5)) {
         case 1:
-            if (k_ptr->flags.has(TR_DRAIN_EXP)) {
+            if (baseitem.flags.has(TR_DRAIN_EXP)) {
                 break;
             }
 
-            this->o_ptr->name2 = EgoType::AMU_DRAIN_EXP;
+            this->o_ptr->ego_idx = EgoType::AMU_DRAIN_EXP;
             break;
         case 2:
-            this->o_ptr->name2 = EgoType::AMU_FOOL;
+            this->o_ptr->ego_idx = EgoType::AMU_FOOL;
             break;
         case 3:
-            if (k_ptr->flags.has(TR_AGGRAVATE)) {
+            if (baseitem.flags.has(TR_AGGRAVATE)) {
                 break;
             }
 
-            this->o_ptr->name2 = EgoType::AMU_AGGRAVATE;
+            this->o_ptr->ego_idx = EgoType::AMU_AGGRAVATE;
             break;
         case 4:
-            if (k_ptr->flags.has(TR_TY_CURSE)) {
+            if (baseitem.flags.has(TR_TY_CURSE)) {
                 break;
             }
 
-            this->o_ptr->name2 = EgoType::AMU_TY_CURSE;
+            this->o_ptr->ego_idx = EgoType::AMU_TY_CURSE;
             break;
         case 5:
-            this->o_ptr->name2 = EgoType::AMU_NAIVETY;
+            this->o_ptr->ego_idx = EgoType::AMU_NAIVETY;
             break;
         }
     }