OSDN Git Service

Merge branch 'For3.0.0-Monster-Adjustment' into release/3.0.0Alpha
[hengband/hengband.git] / src / save / item-writer.c
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)
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     wr_u32b(*flags);
98 }
99
100 static void write_item_info(object_type *o_ptr, const BIT_FLAGS flags)
101 {
102     wr_s16b((s16b)o_ptr->weight);
103     if (flags & SAVE_ITEM_NAME1)
104         wr_byte((byte)o_ptr->name1);
105
106     if (flags & SAVE_ITEM_NAME2)
107         wr_byte((byte)o_ptr->name2);
108
109     if (flags & SAVE_ITEM_TIMEOUT)
110         wr_s16b(o_ptr->timeout);
111
112     if (flags & SAVE_ITEM_TO_H)
113         wr_s16b(o_ptr->to_h);
114
115     if (flags & SAVE_ITEM_TO_D)
116         wr_s16b((s16b)o_ptr->to_d);
117
118     if (flags & SAVE_ITEM_TO_A)
119         wr_s16b(o_ptr->to_a);
120
121     if (flags & SAVE_ITEM_AC)
122         wr_s16b(o_ptr->ac);
123
124     if (flags & SAVE_ITEM_DD)
125         wr_byte((byte)o_ptr->dd);
126
127     if (flags & SAVE_ITEM_DS)
128         wr_byte((byte)o_ptr->ds);
129
130     if (flags & SAVE_ITEM_IDENT)
131         wr_byte(o_ptr->ident);
132
133     if (flags & SAVE_ITEM_MARKED)
134         wr_byte(o_ptr->marked);
135
136     if (flags & SAVE_ITEM_ART_FLAGS0)
137         wr_u32b(o_ptr->art_flags[0]);
138
139     if (flags & SAVE_ITEM_ART_FLAGS1)
140         wr_u32b(o_ptr->art_flags[1]);
141
142     if (flags & SAVE_ITEM_ART_FLAGS2)
143         wr_u32b(o_ptr->art_flags[2]);
144
145     if (flags & SAVE_ITEM_ART_FLAGS3)
146         wr_u32b(o_ptr->art_flags[3]);
147
148     if (flags & SAVE_ITEM_ART_FLAGS4)
149         wr_u32b(o_ptr->art_flags[4]);
150
151     if (flags & SAVE_ITEM_CURSE_FLAGS)
152         wr_u32b(o_ptr->curse_flags);
153
154     if (flags & SAVE_ITEM_HELD_M_IDX)
155         wr_s16b(o_ptr->held_m_idx);
156
157     if (flags & SAVE_ITEM_XTRA1)
158         wr_byte(o_ptr->xtra1);
159
160     if (flags & SAVE_ITEM_XTRA2)
161         wr_byte(o_ptr->xtra2);
162
163     if (flags & SAVE_ITEM_XTRA3)
164         wr_byte(o_ptr->xtra3);
165
166     if (flags & SAVE_ITEM_XTRA4)
167         wr_s16b(o_ptr->xtra4);
168
169     if (flags & SAVE_ITEM_XTRA5)
170         wr_s16b(o_ptr->xtra5);
171
172     if (flags & SAVE_ITEM_FEELING)
173         wr_byte(o_ptr->feeling);
174 }
175
176 /*!
177  * @brief アイテムオブジェクトを書き込む / Write an "item" record
178  * @param o_ptr アイテムオブジェクト保存元ポインタ
179  * @return なし
180  */
181 void wr_item(object_type *o_ptr)
182 {
183     BIT_FLAGS flags = 0x00000000;
184     write_item_flags(o_ptr, &flags);
185
186     wr_s16b(o_ptr->k_idx);
187     wr_byte((byte)o_ptr->iy);
188     wr_byte((byte)o_ptr->ix);
189     if (flags & SAVE_ITEM_PVAL)
190         wr_s16b(o_ptr->pval);
191
192     if (flags & SAVE_ITEM_DISCOUNT)
193         wr_byte(o_ptr->discount);
194
195     if (flags & SAVE_ITEM_NUMBER)
196         wr_byte((byte)o_ptr->number);
197
198     write_item_info(o_ptr, flags);
199     if (flags & SAVE_ITEM_INSCRIPTION)
200         wr_string(quark_str(o_ptr->inscription));
201
202     if (flags & SAVE_ITEM_ART_NAME)
203         wr_string(quark_str(o_ptr->art_name));
204 }
205
206 /*!
207  * @brief セーブデータにアイテムの鑑定情報を書き込む / Write an "perception" record
208  * @param k_idx ベースアイテムのID
209  * @return なし
210  */
211 void wr_perception(KIND_OBJECT_IDX k_idx)
212 {
213     byte tmp8u = 0;
214     object_kind *k_ptr = &k_info[k_idx];
215     if (k_ptr->aware)
216         tmp8u |= 0x01;
217
218     if (k_ptr->tried)
219         tmp8u |= 0x02;
220
221     wr_byte(tmp8u);
222 }