OSDN Git Service

Merge pull request #1186 from dis-/feature/Fix-calc_num_fire
[hengbandforosx/hengbandosx.git] / src / save / item-writer.cpp
1 #include "save/item-writer.h"
2 #include "load/savedata-flag-types.h"
3 #include "object/object-kind.h"
4 #include "save/save-util.h"
5 #include "system/object-type-definition.h"
6 #include "util/quarks.h"
7
8 static void write_item_flags(object_type *o_ptr, BIT_FLAGS *flags)
9 {
10     if (o_ptr->pval)
11         *flags |= SAVE_ITEM_PVAL;
12
13     if (o_ptr->discount)
14         *flags |= SAVE_ITEM_DISCOUNT;
15
16     if (o_ptr->number != 1)
17         *flags |= SAVE_ITEM_NUMBER;
18
19     if (o_ptr->name1)
20         *flags |= SAVE_ITEM_NAME1;
21
22     if (o_ptr->name2)
23         *flags |= SAVE_ITEM_NAME2;
24
25     if (o_ptr->timeout)
26         *flags |= SAVE_ITEM_TIMEOUT;
27
28     if (o_ptr->to_h)
29         *flags |= SAVE_ITEM_TO_H;
30
31     if (o_ptr->to_d)
32         *flags |= SAVE_ITEM_TO_D;
33
34     if (o_ptr->to_a)
35         *flags |= SAVE_ITEM_TO_A;
36
37     if (o_ptr->ac)
38         *flags |= SAVE_ITEM_AC;
39
40     if (o_ptr->dd)
41         *flags |= SAVE_ITEM_DD;
42
43     if (o_ptr->ds)
44         *flags |= SAVE_ITEM_DS;
45
46     if (o_ptr->ident)
47         *flags |= SAVE_ITEM_IDENT;
48
49     if (o_ptr->marked)
50         *flags |= SAVE_ITEM_MARKED;
51
52     if (o_ptr->art_flags[0])
53         *flags |= SAVE_ITEM_ART_FLAGS0;
54
55     if (o_ptr->art_flags[1])
56         *flags |= SAVE_ITEM_ART_FLAGS1;
57
58     if (o_ptr->art_flags[2])
59         *flags |= SAVE_ITEM_ART_FLAGS2;
60
61     if (o_ptr->art_flags[3])
62         *flags |= SAVE_ITEM_ART_FLAGS3;
63
64     if (o_ptr->art_flags[4])
65         *flags |= SAVE_ITEM_ART_FLAGS4;
66
67     if (o_ptr->curse_flags.any())
68         *flags |= SAVE_ITEM_CURSE_FLAGS;
69
70     if (o_ptr->held_m_idx)
71         *flags |= SAVE_ITEM_HELD_M_IDX;
72
73     if (o_ptr->xtra1)
74         *flags |= SAVE_ITEM_XTRA1;
75
76     if (o_ptr->xtra2)
77         *flags |= SAVE_ITEM_XTRA2;
78
79     if (o_ptr->xtra3)
80         *flags |= SAVE_ITEM_XTRA3;
81
82     if (o_ptr->xtra4)
83         *flags |= SAVE_ITEM_XTRA4;
84
85     if (o_ptr->xtra5)
86         *flags |= SAVE_ITEM_XTRA5;
87
88     if (o_ptr->feeling)
89         *flags |= SAVE_ITEM_FEELING;
90
91     if (o_ptr->inscription)
92         *flags |= SAVE_ITEM_INSCRIPTION;
93
94     if (o_ptr->art_name)
95         *flags |= SAVE_ITEM_ART_NAME;
96
97     if (o_ptr->stack_idx)
98         *flags |= SAVE_ITEM_STACK_IDX;
99
100     wr_u32b(*flags);
101 }
102
103 static void write_item_info(object_type *o_ptr, const BIT_FLAGS flags)
104 {
105     wr_s16b((s16b)o_ptr->weight);
106     if (flags & SAVE_ITEM_NAME1)
107         wr_s16b(o_ptr->name1);
108
109     if (flags & SAVE_ITEM_NAME2)
110         wr_byte((byte)o_ptr->name2);
111
112     if (flags & SAVE_ITEM_TIMEOUT)
113         wr_s16b(o_ptr->timeout);
114
115     if (flags & SAVE_ITEM_TO_H)
116         wr_s16b(o_ptr->to_h);
117
118     if (flags & SAVE_ITEM_TO_D)
119         wr_s16b((s16b)o_ptr->to_d);
120
121     if (flags & SAVE_ITEM_TO_A)
122         wr_s16b(o_ptr->to_a);
123
124     if (flags & SAVE_ITEM_AC)
125         wr_s16b(o_ptr->ac);
126
127     if (flags & SAVE_ITEM_DD)
128         wr_byte((byte)o_ptr->dd);
129
130     if (flags & SAVE_ITEM_DS)
131         wr_byte((byte)o_ptr->ds);
132
133     if (flags & SAVE_ITEM_IDENT)
134         wr_byte(o_ptr->ident);
135
136     if (flags & SAVE_ITEM_MARKED)
137         wr_byte(o_ptr->marked);
138
139     if (flags & SAVE_ITEM_ART_FLAGS0)
140         wr_u32b(o_ptr->art_flags[0]);
141
142     if (flags & SAVE_ITEM_ART_FLAGS1)
143         wr_u32b(o_ptr->art_flags[1]);
144
145     if (flags & SAVE_ITEM_ART_FLAGS2)
146         wr_u32b(o_ptr->art_flags[2]);
147
148     if (flags & SAVE_ITEM_ART_FLAGS3)
149         wr_u32b(o_ptr->art_flags[3]);
150
151     if (flags & SAVE_ITEM_ART_FLAGS4)
152         wr_u32b(o_ptr->art_flags[4]);
153
154     if (flags & SAVE_ITEM_CURSE_FLAGS)
155         wr_FlagGroup(o_ptr->curse_flags, wr_byte);
156
157     if (flags & SAVE_ITEM_HELD_M_IDX)
158         wr_s16b(o_ptr->held_m_idx);
159
160     if (flags & SAVE_ITEM_XTRA1)
161         wr_byte(o_ptr->xtra1);
162
163     if (flags & SAVE_ITEM_XTRA2)
164         wr_s16b(o_ptr->xtra2);
165
166     if (flags & SAVE_ITEM_XTRA3)
167         wr_byte(o_ptr->xtra3);
168
169     if (flags & SAVE_ITEM_XTRA4)
170         wr_s16b(o_ptr->xtra4);
171
172     if (flags & SAVE_ITEM_XTRA5)
173         wr_s16b(o_ptr->xtra5);
174
175     if (flags & SAVE_ITEM_FEELING)
176         wr_byte(o_ptr->feeling);
177
178     if (flags & SAVE_ITEM_STACK_IDX)
179         wr_s16b(o_ptr->stack_idx);
180 }
181
182 /*!
183  * @brief アイテムオブジェクトを書き込む / Write an "item" record
184  * @param o_ptr アイテムオブジェクト保存元ポインタ
185  */
186 void wr_item(object_type *o_ptr)
187 {
188     BIT_FLAGS flags = 0x00000000;
189     write_item_flags(o_ptr, &flags);
190
191     wr_s16b(o_ptr->k_idx);
192     wr_byte((byte)o_ptr->iy);
193     wr_byte((byte)o_ptr->ix);
194     if (flags & SAVE_ITEM_PVAL)
195         wr_s16b(o_ptr->pval);
196
197     if (flags & SAVE_ITEM_DISCOUNT)
198         wr_byte(o_ptr->discount);
199
200     if (flags & SAVE_ITEM_NUMBER)
201         wr_byte((byte)o_ptr->number);
202
203     write_item_info(o_ptr, flags);
204     if (flags & SAVE_ITEM_INSCRIPTION)
205         wr_string(quark_str(o_ptr->inscription));
206
207     if (flags & SAVE_ITEM_ART_NAME)
208         wr_string(quark_str(o_ptr->art_name));
209 }
210
211 /*!
212  * @brief セーブデータにアイテムの鑑定情報を書き込む / Write an "perception" record
213  * @param k_idx ベースアイテムのID
214  */
215 void wr_perception(KIND_OBJECT_IDX k_idx)
216 {
217     byte tmp8u = 0;
218     object_kind *k_ptr = &k_info[k_idx];
219     if (k_ptr->aware)
220         tmp8u |= 0x01;
221
222     if (k_ptr->tried)
223         tmp8u |= 0x02;
224
225     wr_byte(tmp8u);
226 }