1 #include "load/old/item-loader-savefile10.h"
2 #include "artifact/fixed-art-types.h"
3 #include "game-option/runtime-arguments.h"
4 #include "load/angband-version-comparer.h"
5 #include "load/load-util.h"
6 #include "load/old/load-v1-5-0.h"
7 #include "load/old/savedata10-item-flag-types.h"
8 #include "load/savedata-old-flag-types.h"
9 #include "object-enchant/object-ego.h"
10 #include "object-enchant/tr-types.h"
11 #include "object/object-flags.h"
12 #include "object/object-kind.h"
13 #include "sv-definition/sv-lite-types.h"
14 #include "system/angband.h"
15 #include "system/artifact-type-definition.h"
16 #include "system/object-type-definition.h"
17 #include "system/player-type-definition.h"
18 #include "util/bit-flags-calculator.h"
19 #include "util/enum-converter.h"
20 #include "util/quarks.h"
23 * @brief アイテムオブジェクトを読み込む(v3.0.0 Savefile ver10まで)
24 * @param o_ptr アイテムオブジェクト保存先ポインタ
26 void rd_item(object_type *o_ptr)
28 if (h_older_than(1, 5, 0, 0)) {
33 auto flags = rd_u32b();
34 o_ptr->k_idx = rd_s16b();
35 o_ptr->iy = rd_byte();
36 o_ptr->ix = rd_byte();
37 auto *k_ptr = &k_info[o_ptr->k_idx];
38 o_ptr->tval = k_ptr->tval;
39 o_ptr->sval = k_ptr->sval;
40 o_ptr->pval = any_bits(flags, SaveDataItemFlagType::PVAL) ? rd_s16b() : 0;
41 o_ptr->discount = any_bits(flags, SaveDataItemFlagType::DISCOUNT) ? rd_byte() : 0;
42 o_ptr->number = any_bits(flags, SaveDataItemFlagType::NUMBER) ? rd_byte() : 1;
43 o_ptr->weight = rd_s16b();
44 if (any_bits(flags, SaveDataItemFlagType::NAME1)) {
45 if (h_older_than(3, 0, 0, 2)) {
46 o_ptr->name1 = rd_byte();
48 o_ptr->name1 = rd_s16b();
54 o_ptr->name2 = any_bits(flags, SaveDataItemFlagType::NAME2) ? rd_byte() : 0;
55 o_ptr->timeout = any_bits(flags, SaveDataItemFlagType::TIMEOUT) ? rd_s16b() : 0;
56 o_ptr->to_h = any_bits(flags, SaveDataItemFlagType::TO_H) ? rd_s16b() : 0;
57 o_ptr->to_d = any_bits(flags, SaveDataItemFlagType::TO_D) ? rd_s16b() : 0;
58 o_ptr->to_a = any_bits(flags, SaveDataItemFlagType::TO_A) ? rd_s16b() : 0;
59 o_ptr->ac = any_bits(flags, SaveDataItemFlagType::AC) ? rd_s16b() : 0;
60 o_ptr->dd = any_bits(flags, SaveDataItemFlagType::DD) ? rd_byte() : 0;
61 o_ptr->ds = any_bits(flags, SaveDataItemFlagType::DS) ? rd_byte() : 0;
62 o_ptr->ident = any_bits(flags, SaveDataItemFlagType::IDENT) ? rd_byte() : 0;
63 o_ptr->marked = any_bits(flags, SaveDataItemFlagType::MARKED) ? rd_byte() : 0;
66 if (loading_savefile_version_is_older_than(7)) {
67 constexpr SavedataItemOlderThan7FlagType old_savefile_art_flags[] = {
68 SavedataItemOlderThan7FlagType::ART_FLAGS0,
69 SavedataItemOlderThan7FlagType::ART_FLAGS1,
70 SavedataItemOlderThan7FlagType::ART_FLAGS2,
71 SavedataItemOlderThan7FlagType::ART_FLAGS3,
72 SavedataItemOlderThan7FlagType::ART_FLAGS4,
75 for (auto f : old_savefile_art_flags) {
76 if (any_bits(flags, f)) {
77 auto tmp32u = rd_u32b();
78 migrate_bitflag_to_flaggroup(o_ptr->art_flags, tmp32u, start);
83 if (any_bits(flags, SaveDataItemFlagType::ART_FLAGS)) {
84 rd_FlagGroup(o_ptr->art_flags, rd_byte);
86 o_ptr->art_flags.clear();
90 if (any_bits(flags, SaveDataItemFlagType::CURSE_FLAGS)) {
91 if (loading_savefile_version_is_older_than(5)) {
92 auto tmp32u = rd_u32b();
93 migrate_bitflag_to_flaggroup(o_ptr->curse_flags, tmp32u);
95 rd_FlagGroup(o_ptr->curse_flags, rd_byte);
98 o_ptr->curse_flags.clear();
101 o_ptr->held_m_idx = any_bits(flags, SaveDataItemFlagType::HELD_M_IDX) ? rd_s16b() : 0;
102 o_ptr->xtra1 = any_bits(flags, SaveDataItemFlagType::XTRA1) ? rd_byte() : 0;
103 if (any_bits(flags, SaveDataItemFlagType::ACTIVATION_ID)) {
104 if (h_older_than(3, 0, 0, 2)) {
105 o_ptr->activation_id = i2enum<RandomArtActType>(rd_byte());
107 o_ptr->activation_id = i2enum<RandomArtActType>(rd_s16b());
110 o_ptr->activation_id = i2enum<RandomArtActType>(0);
113 o_ptr->xtra3 = any_bits(flags, SaveDataItemFlagType::XTRA3) ? rd_byte() : 0;
114 o_ptr->xtra4 = any_bits(flags, SaveDataItemFlagType::XTRA4) ? rd_s16b() : 0;
115 o_ptr->xtra5 = any_bits(flags, SaveDataItemFlagType::XTRA5) ? rd_s16b() : 0;
116 o_ptr->feeling = any_bits(flags, SaveDataItemFlagType::FEELING) ? rd_byte() : 0;
117 o_ptr->stack_idx = any_bits(flags, SaveDataItemFlagType::STACK_IDX) ? rd_s16b() : 0;
118 if (any_bits(flags, SaveDataItemFlagType::SMITH) && !loading_savefile_version_is_older_than(7)) {
119 if (auto tmp16s = rd_s16b(); tmp16s > 0) {
120 o_ptr->smith_effect = static_cast<SmithEffect>(tmp16s);
123 if (auto tmp16s = rd_s16b(); tmp16s > 0) {
124 o_ptr->smith_act_idx = static_cast<RandomArtActType>(tmp16s);
128 if (any_bits(flags, SaveDataItemFlagType::INSCRIPTION)) {
130 rd_string(buf, sizeof(buf));
131 o_ptr->inscription = quark_add(buf);
133 o_ptr->inscription = 0;
136 if (any_bits(flags, SaveDataItemFlagType::ART_NAME)) {
138 rd_string(buf, sizeof(buf));
139 o_ptr->art_name = quark_add(buf);
144 if (!h_older_than(2, 1, 2, 4)) {
148 if ((o_ptr->name2 == EGO_DARK) || (o_ptr->name2 == EGO_ANCIENT_CURSE) || (o_ptr->name1 == ART_NIGHT)) {
149 o_ptr->art_flags.set(TR_LITE_M1);
150 o_ptr->art_flags.reset(TR_LITE_1);
151 o_ptr->art_flags.reset(TR_LITE_2);
152 o_ptr->art_flags.reset(TR_LITE_3);
156 if (o_ptr->name2 == EGO_LITE_DARKNESS) {
157 if (o_ptr->tval != ItemKindType::LITE) {
158 o_ptr->art_flags.set(TR_LITE_M1);
162 if (o_ptr->sval == SV_LITE_TORCH) {
163 o_ptr->art_flags.set(TR_LITE_M1);
164 } else if (o_ptr->sval == SV_LITE_LANTERN) {
165 o_ptr->art_flags.set(TR_LITE_M2);
166 } else if (o_ptr->sval == SV_LITE_FEANOR) {
167 o_ptr->art_flags.set(TR_LITE_M3);
173 if (o_ptr->tval == ItemKindType::LITE) {
174 if (o_ptr->is_fixed_artifact()) {
175 o_ptr->art_flags.set(TR_LITE_3);
179 if (o_ptr->sval == SV_LITE_TORCH) {
180 o_ptr->art_flags.set(TR_LITE_1);
181 o_ptr->art_flags.set(TR_LITE_FUEL);
185 if (o_ptr->sval == SV_LITE_LANTERN) {
186 o_ptr->art_flags.set(TR_LITE_2);
187 o_ptr->art_flags.set(TR_LITE_FUEL);
191 if (o_ptr->sval == SV_LITE_FEANOR) {
192 o_ptr->art_flags.set(TR_LITE_2);
199 * @brief アイテムオブジェクトの鑑定情報をロードする.
203 auto loading_max_k_idx = rd_u16b();
205 for (auto i = 0U; i < loading_max_k_idx; i++) {
206 auto *k_ptr = i < k_info.size() ? &k_info[i] : &dummy;
207 auto tmp8u = rd_byte();
208 k_ptr->aware = any_bits(tmp8u, 0x01);
209 k_ptr->tried = any_bits(tmp8u, 0x02);
212 load_note(_("アイテムの記録をロードしました", "Loaded Object Memory"));
216 * @brief 固定アーティファクトの出現情報をロードする.
218 void load_artifact(void)
220 auto loading_max_a_idx = rd_u16b();
222 for (auto i = 0U; i < loading_max_a_idx; i++) {
223 auto *a_ptr = i < a_info.size() ? &a_info[i] : &dummy;
224 a_ptr->cur_num = rd_byte();
225 if (h_older_than(1, 5, 0, 0)) {
229 a_ptr->floor_id = rd_s16b();
233 load_note(_("伝説のアイテムをロードしました", "Loaded Artifacts"));