From 0b298959ab6325864a5ac2dbba34c569601e647b Mon Sep 17 00:00:00 2001 From: Habu Date: Wed, 15 Sep 2021 07:06:16 +0900 Subject: [PATCH] =?utf8?q?[Feature]=20=E9=8D=9B=E5=86=B6=E5=8A=B9=E6=9E=9C?= =?utf8?q?=E3=82=92=E4=BB=98=E4=B8=8E=E3=81=97=E3=81=9F=E3=82=A2=E3=82=A4?= =?utf8?q?=E3=83=86=E3=83=A0=E3=81=AE=E4=BB=95=E6=A7=98=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 今まで付与した鍛冶効果を object_type::xtra3(他の情報と共用) に持たせていたが そこまでメモリをケチる必要も無いので専用の効果保存メンバ object_type::smith_effect を設けてそこに格納するようにする。 また、発動効果の付与を別枠でできるようにするための準備として、発動効果を 格納する object_type::smith_act_idx も用意しておく。 --- src/load/item-loader.cpp | 12 ++++++++++++ src/load/savedata-flag-types.h | 2 +- src/object-enchant/object-smith.cpp | 7 +------ src/object-enchant/smith-info.cpp | 4 ++-- src/object-enchant/smith-types.h | 4 ++-- src/save/item-writer.cpp | 18 ++++++++++++++++++ src/system/object-type-definition.h | 11 +++++++++-- 7 files changed, 45 insertions(+), 13 deletions(-) diff --git a/src/load/item-loader.cpp b/src/load/item-loader.cpp index 393e090bc..10fc6e9b2 100644 --- a/src/load/item-loader.cpp +++ b/src/load/item-loader.cpp @@ -213,6 +213,18 @@ void rd_item(object_type *o_ptr) else o_ptr->stack_idx = 0; + if ((flags & SAVE_ITEM_SMITH) && !loading_savefile_version_is_older_than(7)) { + int16_t tmp16s; + rd_s16b(&tmp16s); + if (tmp16s > 0) { + o_ptr->smith_effect = static_cast(tmp16s); + } + rd_s16b(&tmp16s); + if (tmp16s > 0) { + o_ptr->smith_act_idx = static_cast(tmp16s); + } + } + if (flags & SAVE_ITEM_INSCRIPTION) { char buf[128]; rd_string(buf, sizeof(buf)); diff --git a/src/load/savedata-flag-types.h b/src/load/savedata-flag-types.h index cffbf7d8b..cf488aac2 100644 --- a/src/load/savedata-flag-types.h +++ b/src/load/savedata-flag-types.h @@ -15,7 +15,7 @@ enum savedata_item_flag_type { SAVE_ITEM_DS = 0x00000800, SAVE_ITEM_IDENT = 0x00001000, SAVE_ITEM_MARKED = 0x00002000, - SAVE_ITEM_00004000 = 0x00004000, // Smith::get_effect_activation(SmithEffe */ std::optional Smith::object_effect(const object_type *o_ptr) { - auto effect = i2enum(o_ptr->xtra3); - if (!o_ptr->is_weapon_armour_ammo() || effect == SmithEffect::NONE) { - return std::nullopt; - } - - return effect; + return o_ptr->smith_effect; } /*! diff --git a/src/object-enchant/smith-info.cpp b/src/object-enchant/smith-info.cpp index 3a7a25d2e..cab785a3b 100644 --- a/src/object-enchant/smith-info.cpp +++ b/src/object-enchant/smith-info.cpp @@ -33,14 +33,14 @@ BasicSmithInfo::BasicSmithInfo(SmithEffect effect, concptr name, SmithCategory c bool BasicSmithInfo::add_essence(player_type *, object_type *o_ptr, int) const { - o_ptr->xtra3 = static_castxtra3)>(effect); + o_ptr->smith_effect = effect; return true; } void BasicSmithInfo::erase_essence(object_type *o_ptr) const { - o_ptr->xtra3 = 0; + o_ptr->smith_effect = std::nullopt; auto flgs = object_flags(o_ptr); if (flgs.has_none_of(TR_PVAL_FLAG_MASK)) o_ptr->pval = 0; diff --git a/src/object-enchant/smith-types.h b/src/object-enchant/smith-types.h index b692d0a66..3beb9df14 100644 --- a/src/object-enchant/smith-types.h +++ b/src/object-enchant/smith-types.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include "system/system-variables.h" @@ -126,7 +126,7 @@ enum class SmithEffect { RESISTANCE = 220, //!< 全耐性 SLAY_GLOVE = 221, //!< 殺戮の小手 - SAVE_EFFECT_MAX = 256, //!< 鍛冶師の銘付きアイテムに付与された鍛冶効果の保存領域が1バイトなので、この値未満を割り当てる必要あり + SAVE_EFFECT_MAX = 8192, //!< 鍛冶師の銘付きアイテムに付与された鍛冶効果の保存領域は2バイト。とりあえず余裕を持って8192としておく。 //! @note これ以降は鍛冶師の銘付きアイテムになる鍛冶効果ではないので、効果番号を保存しなくてよい。 // 鍛冶効果のリストを管理するためだけのものである。したがって SAVE_EFFECT_MAX 以降に自動的に番号の割り振りを行う diff --git a/src/save/item-writer.cpp b/src/save/item-writer.cpp index fcd9a456c..d28c265ac 100644 --- a/src/save/item-writer.cpp +++ b/src/save/item-writer.cpp @@ -3,6 +3,7 @@ #include "object/object-kind.h" #include "save/save-util.h" #include "system/object-type-definition.h" +#include "util/enum-converter.h" #include "util/quarks.h" static void write_item_flags(object_type *o_ptr, BIT_FLAGS *flags) @@ -85,6 +86,10 @@ static void write_item_flags(object_type *o_ptr, BIT_FLAGS *flags) if (o_ptr->stack_idx) *flags |= SAVE_ITEM_STACK_IDX; + if (o_ptr->is_smith()) { + *flags |= SAVE_ITEM_SMITH; + } + wr_u32b(*flags); } @@ -153,6 +158,19 @@ static void write_item_info(object_type *o_ptr, const BIT_FLAGS flags) if (flags & SAVE_ITEM_STACK_IDX) wr_s16b(o_ptr->stack_idx); + + if (flags & SAVE_ITEM_SMITH) { + if (o_ptr->smith_effect.has_value()){ + wr_s16b(enum2i(o_ptr->smith_effect.value())); + } else { + wr_s16b(0); + } + if (o_ptr->smith_act_idx.has_value()) { + wr_s16b(enum2i(o_ptr->smith_act_idx.value())); + } else { + wr_s16b(0); + } + } } /*! diff --git a/src/system/object-type-definition.h b/src/system/object-type-definition.h index e3e87662a..b1603778a 100644 --- a/src/system/object-type-definition.h +++ b/src/system/object-type-definition.h @@ -7,13 +7,17 @@ * @date 2021/05/02 */ +#include "object-enchant/tr-flags.h" #include "object-enchant/trc-types.h" #include "object/tval-types.h" #include "system/angband.h" #include "system/system-variables.h" #include "util/flag-group.h" -#include "object-enchant/tr-flags.h" +#include + +enum class SmithEffect; +enum random_art_activation_type : uint8_t; struct player_type; typedef struct object_type { @@ -33,10 +37,13 @@ typedef struct object_type { XTRA8 xtra1{}; /*!< Extra info type (now unused) */ XTRA16 xtra2{}; /*!< エゴ/アーティファクトの発動ID / Extra info activation index */ - XTRA8 xtra3{}; /*!< 複数の使用用途 捕らえたモンスターの速度,付加した特殊なエッセンスID / Extra info for weaponsmith */ + XTRA8 xtra3{}; /*!< 複数の使用用途 捕らえたモンスターの速度 / Extra info */ XTRA16 xtra4{}; /*!< 複数の使用用途 光源の残り寿命、あるいは捕らえたモンスターの現HP / Extra info fuel or captured monster's current HP */ XTRA16 xtra5{}; /*!< 複数の使用用途 捕らえたモンスターの最大HP / Extra info captured monster's max HP */ + std::optional smith_effect; //!< 鍛冶で付与された効果 + std::optional smith_act_idx; //!< 鍛冶で付与された発動効果のID + HIT_PROB to_h{}; /*!< Plusses to hit */ HIT_POINT to_d{}; /*!< Plusses to damage */ ARMOUR_CLASS to_a{}; /*!< Plusses to AC */ -- 2.11.0