}
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;
*/
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;
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;
}
}
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;
-}
#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);
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:
/* 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;
/* 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;
}
}
*/
#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"
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];
#include "system/system-variables.h"
#include "util/flag-group.h"
#include <optional>
+#include <vector>
enum class FixedArtifactId : short;
enum class ItemKindType : short;
class ArtifactType;
class EgoItemDefinition;
class BaseitemInfo;
+struct activation_type;
class ItemEntity {
public:
ItemEntity();
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;