From: Hourier <66951241+Hourier@users.noreply.github.com> Date: Sat, 11 Nov 2023 10:39:19 +0000 (+0900) Subject: [Refactor] #3736 find_activation_info() をItemEntity のオブジェクトメソッドへ繰り込んだ X-Git-Tag: 3.0.1.3-Beta~9^2~3 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=dbcbdbbddcf786c873b1512800c53c62f46364ae;p=hengbandforosx%2Fhengbandosx.git [Refactor] #3736 find_activation_info() をItemEntity のオブジェクトメソッドへ繰り込んだ --- diff --git a/src/action/activation-execution.cpp b/src/action/activation-execution.cpp index 3eda2d93d..f2343cf85 100644 --- a/src/action/activation-execution.cpp +++ b/src/action/activation-execution.cpp @@ -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; } } diff --git a/src/artifact/artifact-info.cpp b/src/artifact/artifact-info.cpp index 7d77c3040..183117ac8 100644 --- a/src/artifact/artifact-info.cpp +++ b/src/artifact/artifact-info.cpp @@ -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 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; -} diff --git a/src/artifact/artifact-info.h b/src/artifact/artifact-info.h index dc5b3e92d..6ad2e73a9 100644 --- a/src/artifact/artifact-info.h +++ b/src/artifact/artifact-info.h @@ -5,10 +5,6 @@ #pragma once -#include - enum class RandomArtActType : short; -struct activation_type; class ItemEntity; RandomArtActType activation_index(const ItemEntity *o_ptr); -std::optional find_activation_info(const ItemEntity *o_ptr); diff --git a/src/object/object-info.cpp b/src/object/object-info.cpp index 73dd53c72..693fca06e 100644 --- a/src/object/object-info.cpp +++ b/src/object/object-info.cpp @@ -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; diff --git a/src/object/object-value-calc.cpp b/src/object/object-value-calc.cpp index 81afef7fc..c8b14a56d 100644 --- a/src/object/object-value-calc.cpp +++ b/src/object/object-value-calc.cpp @@ -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; } } diff --git a/src/system/item-entity.cpp b/src/system/item-entity.cpp index ee82a2ad6..ca142ce08 100644 --- a/src/system/item-entity.cpp +++ b/src/system/item-entity.cpp @@ -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::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]; diff --git a/src/system/item-entity.h b/src/system/item-entity.h index 8d657bd44..6d47c1cc9 100644 --- a/src/system/item-entity.h +++ b/src/system/item-entity.h @@ -16,6 +16,7 @@ #include "system/system-variables.h" #include "util/flag-group.h" #include +#include 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::const_iterator find_activation_info() const; BaseitemInfo &get_baseitem() const; EgoItemDefinition &get_ego() const;