OSDN Git Service

[Refactor] #1796 Reshaped item-loader-savefile10.cpp
[hengbandforosx/hengbandosx.git] / src / load / old / item-loader-savefile10.cpp
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"
21
22 /*!
23  * @brief アイテムオブジェクトを読み込む(v3.0.0 Savefile ver10まで)
24  * @param o_ptr アイテムオブジェクト保存先ポインタ
25  */
26 void rd_item(object_type *o_ptr)
27 {
28     if (h_older_than(1, 5, 0, 0)) {
29         rd_item_old(o_ptr);
30         return;
31     }
32
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();
47         } else {
48             o_ptr->name1 = rd_s16b();
49         }
50     } else {
51         o_ptr->name1 = 0;
52     }
53
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;
64
65     /* Object flags */
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,
73         };
74         auto start = 0;
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);
79             }
80             start += 32;
81         }
82     } else {
83         if (any_bits(flags, SaveDataItemFlagType::ART_FLAGS)) {
84             rd_FlagGroup(o_ptr->art_flags, rd_byte);
85         } else {
86             o_ptr->art_flags.clear();
87         }
88     }
89
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);
94         } else {
95             rd_FlagGroup(o_ptr->curse_flags, rd_byte);
96         }
97     } else {
98         o_ptr->curse_flags.clear();
99     }
100
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());
106         } else {
107             o_ptr->activation_id = i2enum<RandomArtActType>(rd_s16b());
108         }
109     } else {
110         o_ptr->activation_id = i2enum<RandomArtActType>(0);
111     }
112
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);
121         }
122
123         if (auto tmp16s = rd_s16b(); tmp16s > 0) {
124             o_ptr->smith_act_idx = static_cast<RandomArtActType>(tmp16s);
125         }
126     }
127
128     if (any_bits(flags, SaveDataItemFlagType::INSCRIPTION)) {
129         char buf[128];
130         rd_string(buf, sizeof(buf));
131         o_ptr->inscription = quark_add(buf);
132     } else {
133         o_ptr->inscription = 0;
134     }
135
136     if (any_bits(flags, SaveDataItemFlagType::ART_NAME)) {
137         char buf[128];
138         rd_string(buf, sizeof(buf));
139         o_ptr->art_name = quark_add(buf);
140     } else {
141         o_ptr->art_name = 0;
142     }
143
144     if (!h_older_than(2, 1, 2, 4)) {
145         return;
146     }
147
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);
153         return;
154     }
155
156     if (o_ptr->name2 == EGO_LITE_DARKNESS) {
157         if (o_ptr->tval != ItemKindType::LITE) {
158             o_ptr->art_flags.set(TR_LITE_M1);
159             return;
160         }
161
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);
168         }
169
170         return;
171     }
172
173     if (o_ptr->tval == ItemKindType::LITE) {
174         if (o_ptr->is_fixed_artifact()) {
175             o_ptr->art_flags.set(TR_LITE_3);
176             return;
177         }
178
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);
182             return;
183         }
184
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);
188             return;
189         }
190
191         if (o_ptr->sval == SV_LITE_FEANOR) {
192             o_ptr->art_flags.set(TR_LITE_2);
193             return;
194         }
195     }
196 }
197
198 /*!
199  * @brief アイテムオブジェクトの鑑定情報をロードする.
200  */
201 void load_item(void)
202 {
203     auto loading_max_k_idx = rd_u16b();
204     object_kind dummy;
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);
210     }
211
212     load_note(_("アイテムの記録をロードしました", "Loaded Object Memory"));
213 }
214
215 /*!
216  * @brief 固定アーティファクトの出現情報をロードする.
217  */
218 void load_artifact(void)
219 {
220     auto loading_max_a_idx = rd_u16b();
221     artifact_type dummy;
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)) {
226             a_ptr->floor_id = 0;
227             strip_bytes(3);
228         } else {
229             a_ptr->floor_id = rd_s16b();
230         }
231     }
232
233     load_note(_("伝説のアイテムをロードしました", "Loaded Artifacts"));
234 }