OSDN Git Service

Merge pull request #41491 (taotao/hengband/fix-impure_calc_num_blow into develop).
[hengband/hengband.git] / src / load / item-loader.c
1 #include "load/item-loader.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/load-v1-5-0.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"
18
19 /*!
20  * @brief アイテムオブジェクトを読み込む(現版) / Read an object (New method)
21  * @param o_ptr アイテムオブジェクト保存先ポインタ
22  * @return なし
23  */
24 void rd_item(player_type *player_ptr, object_type *o_ptr)
25 {
26     if (h_older_than(1, 5, 0, 0)) {
27         rd_item_old(player_ptr, o_ptr);
28         return;
29     }
30
31     BIT_FLAGS flags;
32     rd_u32b(&flags);
33     rd_s16b(&o_ptr->k_idx);
34
35     byte tmp8u;
36     rd_byte(&tmp8u);
37     o_ptr->iy = (POSITION)tmp8u;
38     rd_byte(&tmp8u);
39     o_ptr->ix = (POSITION)tmp8u;
40
41     object_kind *k_ptr;
42     k_ptr = &k_info[o_ptr->k_idx];
43     o_ptr->tval = k_ptr->tval;
44     o_ptr->sval = k_ptr->sval;
45
46     if (flags & SAVE_ITEM_PVAL)
47         rd_s16b(&o_ptr->pval);
48     else
49         o_ptr->pval = 0;
50
51     if (flags & SAVE_ITEM_DISCOUNT)
52         rd_byte(&o_ptr->discount);
53     else
54         o_ptr->discount = 0;
55     if (flags & SAVE_ITEM_NUMBER) {
56         rd_byte(&tmp8u);
57         o_ptr->number = tmp8u;
58     } else
59         o_ptr->number = 1;
60
61     s16b tmp16s;
62     rd_s16b(&tmp16s);
63     o_ptr->weight = tmp16s;
64
65     if (flags & SAVE_ITEM_NAME1) {
66         if (h_older_than(3, 0, 0, 2)) {
67             rd_byte(&tmp8u);
68             o_ptr->name1 = tmp8u;
69         } else {
70             rd_s16b(&tmp16s);
71             o_ptr->name1 = tmp16s;
72         }
73     } else
74         o_ptr->name1 = 0;
75
76     if (flags & SAVE_ITEM_NAME2) {
77         rd_byte(&tmp8u);
78         o_ptr->name2 = tmp8u;
79     } else
80         o_ptr->name2 = 0;
81
82     if (flags & SAVE_ITEM_TIMEOUT)
83         rd_s16b(&o_ptr->timeout);
84     else
85         o_ptr->timeout = 0;
86
87     if (flags & SAVE_ITEM_TO_H)
88         rd_s16b(&o_ptr->to_h);
89     else
90         o_ptr->to_h = 0;
91
92     if (flags & SAVE_ITEM_TO_D) {
93         rd_s16b(&tmp16s);
94         o_ptr->to_d = tmp16s;
95     } else
96         o_ptr->to_d = 0;
97
98     if (flags & SAVE_ITEM_TO_A)
99         rd_s16b(&o_ptr->to_a);
100     else
101         o_ptr->to_a = 0;
102
103     if (flags & SAVE_ITEM_AC)
104         rd_s16b(&o_ptr->ac);
105     else
106         o_ptr->ac = 0;
107
108     if (flags & SAVE_ITEM_DD) {
109         rd_byte(&tmp8u);
110         o_ptr->dd = tmp8u;
111     } else
112         o_ptr->dd = 0;
113
114     if (flags & SAVE_ITEM_DS) {
115         rd_byte(&tmp8u);
116         o_ptr->ds = tmp8u;
117     } else
118         o_ptr->ds = 0;
119
120     if (flags & SAVE_ITEM_IDENT)
121         rd_byte(&o_ptr->ident);
122     else
123         o_ptr->ident = 0;
124
125     if (flags & SAVE_ITEM_MARKED)
126         rd_byte(&o_ptr->marked);
127     else
128         o_ptr->marked = 0;
129
130     /* Object flags */
131     if (flags & SAVE_ITEM_ART_FLAGS0)
132         rd_u32b(&o_ptr->art_flags[0]);
133     else
134         o_ptr->art_flags[0] = 0;
135
136     if (flags & SAVE_ITEM_ART_FLAGS1)
137         rd_u32b(&o_ptr->art_flags[1]);
138     else
139         o_ptr->art_flags[1] = 0;
140
141     if (flags & SAVE_ITEM_ART_FLAGS2)
142         rd_u32b(&o_ptr->art_flags[2]);
143     else
144         o_ptr->art_flags[2] = 0;
145
146     if (flags & SAVE_ITEM_ART_FLAGS3)
147         rd_u32b(&o_ptr->art_flags[3]);
148     else
149         o_ptr->art_flags[3] = 0;
150
151     if (flags & SAVE_ITEM_ART_FLAGS4)
152         rd_u32b(&o_ptr->art_flags[4]);
153     else
154         o_ptr->art_flags[4] = 0;
155
156     if (flags & SAVE_ITEM_CURSE_FLAGS)
157         rd_u32b(&o_ptr->curse_flags);
158     else
159         o_ptr->curse_flags = 0;
160
161     /* Monster holding object */
162     if (flags & SAVE_ITEM_HELD_M_IDX)
163         rd_s16b(&o_ptr->held_m_idx);
164     else
165         o_ptr->held_m_idx = 0;
166
167     /* Special powers */
168     if (flags & SAVE_ITEM_XTRA1)
169         rd_byte(&o_ptr->xtra1);
170     else
171         o_ptr->xtra1 = 0;
172
173     if (flags & SAVE_ITEM_XTRA2) {
174         if (h_older_than(3, 0, 0, 2)) {
175             rd_byte(&tmp8u);
176             o_ptr->xtra2 = tmp8u;
177         } else {
178             rd_s16b(&tmp16s);
179             o_ptr->xtra2 = tmp16s;
180         }
181     } else
182         o_ptr->xtra2 = 0;
183
184     if (flags & SAVE_ITEM_XTRA3)
185         rd_byte(&o_ptr->xtra3);
186     else
187         o_ptr->xtra3 = 0;
188
189     if (flags & SAVE_ITEM_XTRA4)
190         rd_s16b(&o_ptr->xtra4);
191     else
192         o_ptr->xtra4 = 0;
193
194     if (flags & SAVE_ITEM_XTRA5)
195         rd_s16b(&o_ptr->xtra5);
196     else
197         o_ptr->xtra5 = 0;
198
199     if (flags & SAVE_ITEM_FEELING)
200         rd_byte(&o_ptr->feeling);
201     else
202         o_ptr->feeling = 0;
203
204     if (flags & SAVE_ITEM_INSCRIPTION) {
205         char buf[128];
206         rd_string(buf, sizeof(buf));
207         o_ptr->inscription = quark_add(buf);
208     } else
209         o_ptr->inscription = 0;
210
211     if (flags & SAVE_ITEM_ART_NAME) {
212         char buf[128];
213         rd_string(buf, sizeof(buf));
214         o_ptr->art_name = quark_add(buf);
215     } else {
216         o_ptr->art_name = 0;
217     }
218
219     if (!h_older_than(2, 1, 2, 4))
220         return;
221
222     BIT_FLAGS flgs[TR_FLAG_SIZE];
223     object_flags(player_ptr, o_ptr, flgs);
224
225     if ((o_ptr->name2 == EGO_DARK) || (o_ptr->name2 == EGO_ANCIENT_CURSE) || (o_ptr->name1 == ART_NIGHT)) {
226         add_flag(o_ptr->art_flags, TR_LITE_M1);
227         remove_flag(o_ptr->art_flags, TR_LITE_1);
228         remove_flag(o_ptr->art_flags, TR_LITE_2);
229         remove_flag(o_ptr->art_flags, TR_LITE_3);
230         return;
231     }
232
233     if (o_ptr->name2 == EGO_LITE_DARKNESS) {
234         if (o_ptr->tval != TV_LITE) {
235             add_flag(o_ptr->art_flags, TR_LITE_M1);
236             return;
237         }
238
239         if (o_ptr->sval == SV_LITE_TORCH) {
240             add_flag(o_ptr->art_flags, TR_LITE_M1);
241         } else if (o_ptr->sval == SV_LITE_LANTERN) {
242             add_flag(o_ptr->art_flags, TR_LITE_M2);
243         } else if (o_ptr->sval == SV_LITE_FEANOR) {
244             add_flag(o_ptr->art_flags, TR_LITE_M3);
245         }
246
247         return;
248     }
249
250     if (o_ptr->tval == TV_LITE) {
251         if (object_is_fixed_artifact(o_ptr)) {
252             add_flag(o_ptr->art_flags, TR_LITE_3);
253             return;
254         }
255
256         if (o_ptr->sval == SV_LITE_TORCH) {
257             add_flag(o_ptr->art_flags, TR_LITE_1);
258             add_flag(o_ptr->art_flags, TR_LITE_FUEL);
259             return;
260         }
261
262         if (o_ptr->sval == SV_LITE_LANTERN) {
263             add_flag(o_ptr->art_flags, TR_LITE_2);
264             add_flag(o_ptr->art_flags, TR_LITE_FUEL);
265             return;
266         }
267
268         if (o_ptr->sval == SV_LITE_FEANOR) {
269             add_flag(o_ptr->art_flags, TR_LITE_2);
270             return;
271         }
272     }
273 }
274
275 errr load_item(void)
276 {
277     u16b tmp16u;
278     rd_u16b(&tmp16u);
279     if (tmp16u > max_k_idx) {
280         load_note(format(_("アイテムの種類が多すぎる(%u)!", "Too many (%u) object kinds!"), tmp16u));
281         return 22;
282     }
283
284     byte tmp8u;
285     for (int i = 0; i < tmp16u; i++) {
286         object_kind *k_ptr = &k_info[i];
287         rd_byte(&tmp8u);
288         k_ptr->aware = (tmp8u & 0x01) ? TRUE : FALSE;
289         k_ptr->tried = (tmp8u & 0x02) ? TRUE : FALSE;
290     }
291
292     if (arg_fiddle)
293         load_note(_("アイテムの記録をロードしました", "Loaded Object Memory"));
294
295     return 0;
296 }
297
298 errr load_artifact(void)
299 {
300     u16b tmp16u;
301     rd_u16b(&tmp16u);
302     if (tmp16u > max_a_idx) {
303         load_note(format(_("伝説のアイテムが多すぎる(%u)!", "Too many (%u) artifacts!"), tmp16u));
304         return 24;
305     }
306
307     byte tmp8u;
308     for (int i = 0; i < tmp16u; i++) {
309         artifact_type *a_ptr = &a_info[i];
310         rd_byte(&tmp8u);
311         a_ptr->cur_num = tmp8u;
312         if (h_older_than(1, 5, 0, 0)) {
313             a_ptr->floor_id = 0;
314             rd_byte(&tmp8u);
315             rd_byte(&tmp8u);
316             rd_byte(&tmp8u);
317         } else {
318             rd_s16b(&a_ptr->floor_id);
319         }
320     }
321
322     if (arg_fiddle)
323         load_note(_("伝説のアイテムをロードしました", "Loaded Artifacts"));
324
325     return 0;
326 }