1 #include "load/item-loader.h"
2 #include "art-definition/art-accessory-types.h"
3 #include "game-option/runtime-arguments.h"
4 #include "load/angband-version-comparer.h"
5 #include "load/load-v1-5-0.h"
6 #include "load/load-util.h"
7 #include "load/savedata-flag-types.h"
8 #include "object-enchant/object-ego.h"
9 #include "object-enchant/tr-types.h"
10 #include "object-hook/hook-enchant.h"
11 #include "object/object-flags.h"
12 #include "object/object-kind.h"
13 #include "sv-definition/sv-lite-types.h"
14 #include "system/artifact-type-definition.h"
15 #include "system/object-type-definition.h"
16 #include "util/bit-flags-calculator.h"
17 #include "util/quarks.h"
20 * @brief アイテムオブジェクトを読み込む(現版) / Read an object (New method)
21 * @param o_ptr アイテムオブジェクト保存先ポインタ
24 void rd_item(player_type *player_ptr, object_type *o_ptr)
26 if (h_older_than(1, 5, 0, 0)) {
27 rd_item_old(player_ptr, o_ptr);
33 rd_s16b(&o_ptr->k_idx);
37 o_ptr->iy = (POSITION)tmp8u;
39 o_ptr->ix = (POSITION)tmp8u;
42 k_ptr = &k_info[o_ptr->k_idx];
43 o_ptr->tval = k_ptr->tval;
44 o_ptr->sval = k_ptr->sval;
46 if (flags & SAVE_ITEM_PVAL)
47 rd_s16b(&o_ptr->pval);
51 if (flags & SAVE_ITEM_DISCOUNT)
52 rd_byte(&o_ptr->discount);
55 if (flags & SAVE_ITEM_NUMBER) {
57 o_ptr->number = tmp8u;
63 o_ptr->weight = tmp16s;
65 if (flags & SAVE_ITEM_NAME1) {
71 if (flags & SAVE_ITEM_NAME2) {
77 if (flags & SAVE_ITEM_TIMEOUT)
78 rd_s16b(&o_ptr->timeout);
82 if (flags & SAVE_ITEM_TO_H)
83 rd_s16b(&o_ptr->to_h);
87 if (flags & SAVE_ITEM_TO_D) {
93 if (flags & SAVE_ITEM_TO_A)
94 rd_s16b(&o_ptr->to_a);
98 if (flags & SAVE_ITEM_AC)
103 if (flags & SAVE_ITEM_DD) {
109 if (flags & SAVE_ITEM_DS) {
115 if (flags & SAVE_ITEM_IDENT)
116 rd_byte(&o_ptr->ident);
120 if (flags & SAVE_ITEM_MARKED)
121 rd_byte(&o_ptr->marked);
126 if (flags & SAVE_ITEM_ART_FLAGS0)
127 rd_u32b(&o_ptr->art_flags[0]);
129 o_ptr->art_flags[0] = 0;
131 if (flags & SAVE_ITEM_ART_FLAGS1)
132 rd_u32b(&o_ptr->art_flags[1]);
134 o_ptr->art_flags[1] = 0;
136 if (flags & SAVE_ITEM_ART_FLAGS2)
137 rd_u32b(&o_ptr->art_flags[2]);
139 o_ptr->art_flags[2] = 0;
141 if (flags & SAVE_ITEM_ART_FLAGS3)
142 rd_u32b(&o_ptr->art_flags[3]);
144 o_ptr->art_flags[3] = 0;
146 if (flags & SAVE_ITEM_ART_FLAGS4)
147 rd_u32b(&o_ptr->art_flags[4]);
149 o_ptr->art_flags[4] = 0;
151 if (flags & SAVE_ITEM_CURSE_FLAGS)
152 rd_u32b(&o_ptr->curse_flags);
154 o_ptr->curse_flags = 0;
156 /* Monster holding object */
157 if (flags & SAVE_ITEM_HELD_M_IDX)
158 rd_s16b(&o_ptr->held_m_idx);
160 o_ptr->held_m_idx = 0;
163 if (flags & SAVE_ITEM_XTRA1)
164 rd_byte(&o_ptr->xtra1);
168 if (flags & SAVE_ITEM_XTRA2)
169 rd_byte(&o_ptr->xtra2);
173 if (flags & SAVE_ITEM_XTRA3)
174 rd_byte(&o_ptr->xtra3);
178 if (flags & SAVE_ITEM_XTRA4)
179 rd_s16b(&o_ptr->xtra4);
183 if (flags & SAVE_ITEM_XTRA5)
184 rd_s16b(&o_ptr->xtra5);
188 if (flags & SAVE_ITEM_FEELING)
189 rd_byte(&o_ptr->feeling);
193 if (flags & SAVE_ITEM_INSCRIPTION) {
195 rd_string(buf, sizeof(buf));
196 o_ptr->inscription = quark_add(buf);
198 o_ptr->inscription = 0;
200 if (flags & SAVE_ITEM_ART_NAME) {
202 rd_string(buf, sizeof(buf));
203 o_ptr->art_name = quark_add(buf);
208 if (!h_older_than(2, 1, 2, 4))
211 BIT_FLAGS flgs[TR_FLAG_SIZE];
212 object_flags(player_ptr, o_ptr, flgs);
214 if ((o_ptr->name2 == EGO_DARK) || (o_ptr->name2 == EGO_ANCIENT_CURSE) || (o_ptr->name1 == ART_NIGHT)) {
215 add_flag(o_ptr->art_flags, TR_LITE_M1);
216 remove_flag(o_ptr->art_flags, TR_LITE_1);
217 remove_flag(o_ptr->art_flags, TR_LITE_2);
218 remove_flag(o_ptr->art_flags, TR_LITE_3);
222 if (o_ptr->name2 == EGO_LITE_DARKNESS) {
223 if (o_ptr->tval != TV_LITE) {
224 add_flag(o_ptr->art_flags, TR_LITE_M1);
228 if (o_ptr->sval == SV_LITE_TORCH) {
229 add_flag(o_ptr->art_flags, TR_LITE_M1);
230 } else if (o_ptr->sval == SV_LITE_LANTERN) {
231 add_flag(o_ptr->art_flags, TR_LITE_M2);
232 } else if (o_ptr->sval == SV_LITE_FEANOR) {
233 add_flag(o_ptr->art_flags, TR_LITE_M3);
239 if (o_ptr->tval == TV_LITE) {
240 if (object_is_fixed_artifact(o_ptr)) {
241 add_flag(o_ptr->art_flags, TR_LITE_3);
245 if (o_ptr->sval == SV_LITE_TORCH) {
246 add_flag(o_ptr->art_flags, TR_LITE_1);
247 add_flag(o_ptr->art_flags, TR_LITE_FUEL);
251 if (o_ptr->sval == SV_LITE_LANTERN) {
252 add_flag(o_ptr->art_flags, TR_LITE_2);
253 add_flag(o_ptr->art_flags, TR_LITE_FUEL);
257 if (o_ptr->sval == SV_LITE_FEANOR) {
258 add_flag(o_ptr->art_flags, TR_LITE_2);
268 if (tmp16u > max_k_idx) {
269 load_note(format(_("アイテムの種類が多すぎる(%u)!", "Too many (%u) object kinds!"), tmp16u));
274 for (int i = 0; i < tmp16u; i++) {
275 object_kind *k_ptr = &k_info[i];
277 k_ptr->aware = (tmp8u & 0x01) ? TRUE : FALSE;
278 k_ptr->tried = (tmp8u & 0x02) ? TRUE : FALSE;
282 load_note(_("アイテムの記録をロードしました", "Loaded Object Memory"));
287 errr load_artifact(void)
291 if (tmp16u > max_a_idx) {
292 load_note(format(_("伝説のアイテムが多すぎる(%u)!", "Too many (%u) artifacts!"), tmp16u));
297 for (int i = 0; i < tmp16u; i++) {
298 artifact_type *a_ptr = &a_info[i];
300 a_ptr->cur_num = tmp8u;
301 if (h_older_than(1, 5, 0, 0)) {
307 rd_s16b(&a_ptr->floor_id);
312 load_note(_("伝説のアイテムをロードしました", "Loaded Artifacts"));