OSDN Git Service

[Refactor] #3736 find_activation_info() をItemEntity のオブジェクトメソッドへ繰り込んだ
authorHourier <66951241+Hourier@users.noreply.github.com>
Sat, 11 Nov 2023 10:39:19 +0000 (19:39 +0900)
committerHourier <66951241+Hourier@users.noreply.github.com>
Mon, 27 Nov 2023 07:42:42 +0000 (16:42 +0900)
src/action/activation-execution.cpp
src/artifact/artifact-info.cpp
src/artifact/artifact-info.h
src/object/object-info.cpp
src/object/object-value-calc.cpp
src/system/item-entity.cpp
src/system/item-entity.h

index 3eda2d9..f2343cf 100644 (file)
@@ -60,9 +60,9 @@ static void decide_activation_level(ae_type *ae_ptr)
     }
 
     if (ae_ptr->o_ptr->is_random_artifact()) {
-        auto act_ptr = find_activation_info(ae_ptr->o_ptr);
-        if (act_ptr) {
-            ae_ptr->lev = (*act_ptr)->level;
+        const auto act_ptr = ae_ptr->o_ptr->find_activation_info();
+        if (act_ptr != activation_info.end()) {
+            ae_ptr->lev = act_ptr->level;
         }
 
         return;
@@ -155,27 +155,27 @@ static bool check_activation_conditions(PlayerType *player_ptr, ae_type *ae_ptr)
  */
 static bool activate_artifact(PlayerType *player_ptr, ItemEntity *o_ptr)
 {
-    const auto act_ptr = find_activation_info(o_ptr);
-    if (!act_ptr) {
+    const auto act_ptr = o_ptr->find_activation_info();
+    if (act_ptr == activation_info.end()) {
         msg_print("Activation information is not found.");
         return false;
     }
 
     const auto item_name = describe_flavor(player_ptr, o_ptr, OD_NAME_ONLY | OD_OMIT_PREFIX | OD_BASE_NAME);
-    if (!switch_activation(player_ptr, &o_ptr, *act_ptr, item_name.data())) {
+    if (!switch_activation(player_ptr, &o_ptr, &(*act_ptr), item_name.data())) {
         return false;
     }
 
-    if ((*act_ptr)->timeout.constant >= 0) {
-        o_ptr->timeout = (int16_t)(*act_ptr)->timeout.constant;
-        if ((*act_ptr)->timeout.dice > 0) {
-            o_ptr->timeout += randint1((*act_ptr)->timeout.dice);
+    if (act_ptr->timeout.constant >= 0) {
+        o_ptr->timeout = (int16_t)act_ptr->timeout.constant;
+        if (act_ptr->timeout.dice > 0) {
+            o_ptr->timeout += randint1(act_ptr->timeout.dice);
         }
 
         return true;
     }
 
-    switch ((*act_ptr)->index) {
+    switch (act_ptr->index) {
     case RandomArtActType::BR_FIRE:
         o_ptr->timeout = o_ptr->bi_key == BaseitemKey(ItemKindType::RING, SV_RING_FLAMES) ? 200 : 250;
         return true;
@@ -188,7 +188,7 @@ static bool activate_artifact(PlayerType *player_ptr, ItemEntity *o_ptr)
     case RandomArtActType::MURAMASA:
         return true;
     default:
-        msg_format("Special timeout is not implemented: %d.", enum2i((*act_ptr)->index));
+        msg_format("Special timeout is not implemented: %d.", enum2i(act_ptr->index));
         return false;
     }
 }
index 7d77c30..183117a 100644 (file)
@@ -51,21 +51,3 @@ RandomArtActType activation_index(const ItemEntity *o_ptr)
 
     return o_ptr->activation_id;
 }
-
-/*!
- * @brief オブジェクトから発動効果構造体のポインタを取得する。
- * @details activation_index() 関数の結果から参照する。
- * @param o_ptr 対象のオブジェクト構造体ポインタ
- * @return 発動効果構造体のポインタを返す
- */
-std::optional<const activation_type *> find_activation_info(const ItemEntity *o_ptr)
-{
-    const auto index = activation_index(o_ptr);
-    for (const auto &p : activation_info) {
-        if (p.index == index) {
-            return &p;
-        }
-    }
-
-    return std::nullopt;
-}
index dc5b3e9..6ad2e73 100644 (file)
@@ -5,10 +5,6 @@
 
 #pragma once
 
-#include <optional>
-
 enum class RandomArtActType : short;
-struct activation_type;
 class ItemEntity;
 RandomArtActType activation_index(const ItemEntity *o_ptr);
-std::optional<const activation_type *> find_activation_info(const ItemEntity *o_ptr);
index 73dd53c..693fca0 100644 (file)
@@ -69,15 +69,14 @@ static std::string item_activation_dragon_breath(const ItemEntity *o_ptr)
 static concptr item_activation_aux(const ItemEntity *o_ptr)
 {
     static std::string activation_detail;
-    auto tmp_act_ptr = find_activation_info(o_ptr);
-    if (!tmp_act_ptr) {
+    const auto it = o_ptr->find_activation_info();
+    if (it == activation_info.end()) {
         return _("未定義", "something undefined");
     }
 
-    auto *act_ptr = *tmp_act_ptr;
-    concptr desc = act_ptr->desc;
+    concptr desc = it->desc;
     std::string dragon_breath;
-    switch (act_ptr->index) {
+    switch (it->index) {
     case RandomArtActType::NONE:
         break;
     case RandomArtActType::BR_FIRE:
@@ -135,14 +134,14 @@ static concptr item_activation_aux(const ItemEntity *o_ptr)
 
     /* Timeout description */
     std::stringstream timeout;
-    int constant = act_ptr->timeout.constant;
-    int dice = act_ptr->timeout.dice;
+    int constant = it->timeout.constant;
+    int dice = it->timeout.dice;
     if (constant == 0 && dice == 0) {
         /* We can activate it every turn */
         timeout << _("いつでも", "every turn");
     } else if (constant < 0) {
         /* Activations that have special timeout */
-        switch (act_ptr->index) {
+        switch (it->index) {
         case RandomArtActType::BR_FIRE:
             timeout << _("", "every ") << (o_ptr->bi_key == BaseitemKey(ItemKindType::RING, SV_RING_FLAMES) ? 200 : 250) << _(" ターン毎", " turns");
             break;
index 81afef7..c8b14a5 100644 (file)
@@ -528,9 +528,9 @@ PRICE flag_cost(const ItemEntity *o_ptr, int plusses)
 
     /* Also, give some extra for activatable powers... */
     if (o_ptr->is_random_artifact() && o_ptr->art_flags.has(TR_ACTIVATE)) {
-        auto act_ptr = find_activation_info(o_ptr);
-        if (act_ptr) {
-            total += (*act_ptr)->value;
+        const auto act_ptr = o_ptr->find_activation_info();
+        if (act_ptr != activation_info.end()) {
+            total += act_ptr->value;
         }
     }
 
index ee82a2a..ca142ce 100644 (file)
@@ -7,9 +7,11 @@
  */
 
 #include "system/item-entity.h"
+#include "artifact/artifact-info.h" // 暫定的インクルード.
 #include "artifact/fixed-art-types.h"
 #include "artifact/random-art-effects.h"
 #include "monster-race/monster-race.h"
+#include "object-enchant/activation-info-table.h"
 #include "object-enchant/item-feeling.h"
 #include "object-enchant/object-curse.h"
 #include "object-enchant/special-object-flags.h"
@@ -806,6 +808,23 @@ bool ItemEntity::is_inscribed() const
     return this->inscription != std::nullopt;
 }
 
+/*!
+ * @brief オブジェクトから発動効果構造体を取得する。
+ * @return 発動効果構造体 (なかったら無効イテレータ)
+ */
+std::vector<activation_type>::const_iterator ItemEntity::find_activation_info() const
+{
+    const auto index = activation_index(this);
+    const auto end = activation_info.end();
+    for (auto it = activation_info.begin(); it != end; it++) {
+        if (it->index == index) {
+            return it;
+        }
+    }
+
+    return end;
+}
+
 BaseitemInfo &ItemEntity::get_baseitem() const
 {
     return baseitems_info[this->bi_id];
index 8d657bd..6d47c1c 100644 (file)
@@ -16,6 +16,7 @@
 #include "system/system-variables.h"
 #include "util/flag-group.h"
 #include <optional>
+#include <vector>
 
 enum class FixedArtifactId : short;
 enum class ItemKindType : short;
@@ -25,6 +26,7 @@ enum class RandomArtActType : short;
 class ArtifactType;
 class EgoItemDefinition;
 class BaseitemInfo;
+struct activation_type;
 class ItemEntity {
 public:
     ItemEntity();
@@ -136,6 +138,7 @@ public:
     bool is_armour() const;
     bool is_cross_bow() const;
     bool is_inscribed() const;
+    std::vector<activation_type>::const_iterator find_activation_info() const;
 
     BaseitemInfo &get_baseitem() const;
     EgoItemDefinition &get_ego() const;