OSDN Git Service

6475049f1b85f9a43ce7ef1741425a9d4991f2cc
[hengband/hengband.git] / src / load / item-loader.c
1 #include "load/item-loader.h"
2 #include "art-definition/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         rd_byte(&tmp8u);
67         o_ptr->name1 = tmp8u;
68     } else
69         o_ptr->name1 = 0;
70
71     if (flags & SAVE_ITEM_NAME2) {
72         rd_byte(&tmp8u);
73         o_ptr->name2 = tmp8u;
74     } else
75         o_ptr->name2 = 0;
76
77     if (flags & SAVE_ITEM_TIMEOUT)
78         rd_s16b(&o_ptr->timeout);
79     else
80         o_ptr->timeout = 0;
81
82     if (flags & SAVE_ITEM_TO_H)
83         rd_s16b(&o_ptr->to_h);
84     else
85         o_ptr->to_h = 0;
86
87     if (flags & SAVE_ITEM_TO_D) {
88         rd_s16b(&tmp16s);
89         o_ptr->to_d = tmp16s;
90     } else
91         o_ptr->to_d = 0;
92
93     if (flags & SAVE_ITEM_TO_A)
94         rd_s16b(&o_ptr->to_a);
95     else
96         o_ptr->to_a = 0;
97
98     if (flags & SAVE_ITEM_AC)
99         rd_s16b(&o_ptr->ac);
100     else
101         o_ptr->ac = 0;
102
103     if (flags & SAVE_ITEM_DD) {
104         rd_byte(&tmp8u);
105         o_ptr->dd = tmp8u;
106     } else
107         o_ptr->dd = 0;
108
109     if (flags & SAVE_ITEM_DS) {
110         rd_byte(&tmp8u);
111         o_ptr->ds = tmp8u;
112     } else
113         o_ptr->ds = 0;
114
115     if (flags & SAVE_ITEM_IDENT)
116         rd_byte(&o_ptr->ident);
117     else
118         o_ptr->ident = 0;
119
120     if (flags & SAVE_ITEM_MARKED)
121         rd_byte(&o_ptr->marked);
122     else
123         o_ptr->marked = 0;
124
125     /* Object flags */
126     if (flags & SAVE_ITEM_ART_FLAGS0)
127         rd_u32b(&o_ptr->art_flags[0]);
128     else
129         o_ptr->art_flags[0] = 0;
130
131     if (flags & SAVE_ITEM_ART_FLAGS1)
132         rd_u32b(&o_ptr->art_flags[1]);
133     else
134         o_ptr->art_flags[1] = 0;
135
136     if (flags & SAVE_ITEM_ART_FLAGS2)
137         rd_u32b(&o_ptr->art_flags[2]);
138     else
139         o_ptr->art_flags[2] = 0;
140
141     if (flags & SAVE_ITEM_ART_FLAGS3)
142         rd_u32b(&o_ptr->art_flags[3]);
143     else
144         o_ptr->art_flags[3] = 0;
145
146     if (flags & SAVE_ITEM_ART_FLAGS4)
147         rd_u32b(&o_ptr->art_flags[4]);
148     else
149         o_ptr->art_flags[4] = 0;
150
151     if (flags & SAVE_ITEM_CURSE_FLAGS)
152         rd_u32b(&o_ptr->curse_flags);
153     else
154         o_ptr->curse_flags = 0;
155
156     /* Monster holding object */
157     if (flags & SAVE_ITEM_HELD_M_IDX)
158         rd_s16b(&o_ptr->held_m_idx);
159     else
160         o_ptr->held_m_idx = 0;
161
162     /* Special powers */
163     if (flags & SAVE_ITEM_XTRA1)
164         rd_byte(&o_ptr->xtra1);
165     else
166         o_ptr->xtra1 = 0;
167
168     if (flags & SAVE_ITEM_XTRA2)
169         rd_byte(&o_ptr->xtra2);
170     else
171         o_ptr->xtra2 = 0;
172
173     if (flags & SAVE_ITEM_XTRA3)
174         rd_byte(&o_ptr->xtra3);
175     else
176         o_ptr->xtra3 = 0;
177
178     if (flags & SAVE_ITEM_XTRA4)
179         rd_s16b(&o_ptr->xtra4);
180     else
181         o_ptr->xtra4 = 0;
182
183     if (flags & SAVE_ITEM_XTRA5)
184         rd_s16b(&o_ptr->xtra5);
185     else
186         o_ptr->xtra5 = 0;
187
188     if (flags & SAVE_ITEM_FEELING)
189         rd_byte(&o_ptr->feeling);
190     else
191         o_ptr->feeling = 0;
192
193     if (flags & SAVE_ITEM_INSCRIPTION) {
194         char buf[128];
195         rd_string(buf, sizeof(buf));
196         o_ptr->inscription = quark_add(buf);
197     } else
198         o_ptr->inscription = 0;
199
200     if (flags & SAVE_ITEM_ART_NAME) {
201         char buf[128];
202         rd_string(buf, sizeof(buf));
203         o_ptr->art_name = quark_add(buf);
204     } else {
205         o_ptr->art_name = 0;
206     }
207
208     if (!h_older_than(2, 1, 2, 4))
209         return;
210
211     BIT_FLAGS flgs[TR_FLAG_SIZE];
212     object_flags(player_ptr, o_ptr, flgs);
213
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);
219         return;
220     }
221
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);
225             return;
226         }
227
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);
234         }
235
236         return;
237     }
238
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);
242             return;
243         }
244
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);
248             return;
249         }
250
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);
254             return;
255         }
256
257         if (o_ptr->sval == SV_LITE_FEANOR) {
258             add_flag(o_ptr->art_flags, TR_LITE_2);
259             return;
260         }
261     }
262 }
263
264 errr load_item(void)
265 {
266     u16b tmp16u;
267     rd_u16b(&tmp16u);
268     if (tmp16u > max_k_idx) {
269         load_note(format(_("アイテムの種類が多すぎる(%u)!", "Too many (%u) object kinds!"), tmp16u));
270         return 22;
271     }
272
273     byte tmp8u;
274     for (int i = 0; i < tmp16u; i++) {
275         object_kind *k_ptr = &k_info[i];
276         rd_byte(&tmp8u);
277         k_ptr->aware = (tmp8u & 0x01) ? TRUE : FALSE;
278         k_ptr->tried = (tmp8u & 0x02) ? TRUE : FALSE;
279     }
280
281     if (arg_fiddle)
282         load_note(_("アイテムの記録をロードしました", "Loaded Object Memory"));
283
284     return 0;
285 }
286
287 errr load_artifact(void)
288 {
289     u16b tmp16u;
290     rd_u16b(&tmp16u);
291     if (tmp16u > max_a_idx) {
292         load_note(format(_("伝説のアイテムが多すぎる(%u)!", "Too many (%u) artifacts!"), tmp16u));
293         return 24;
294     }
295
296     byte tmp8u;
297     for (int i = 0; i < tmp16u; i++) {
298         artifact_type *a_ptr = &a_info[i];
299         rd_byte(&tmp8u);
300         a_ptr->cur_num = tmp8u;
301         if (h_older_than(1, 5, 0, 0)) {
302             a_ptr->floor_id = 0;
303             rd_byte(&tmp8u);
304             rd_byte(&tmp8u);
305             rd_byte(&tmp8u);
306         } else {
307             rd_s16b(&a_ptr->floor_id);
308         }
309     }
310
311     if (arg_fiddle)
312         load_note(_("伝説のアイテムをロードしました", "Loaded Artifacts"));
313
314     return 0;
315 }