OSDN Git Service

Merge pull request #2013 from sikabane-works/release/3.0.0Alpha51
[hengbandforosx/hengbandosx.git] / src / save / item-writer.cpp
1 #include "save/item-writer.h"
2 #include "artifact/random-art-effects.h"
3 #include "load/old/item-flag-types-savefile10.h"
4 #include "object/object-kind.h"
5 #include "save/save-util.h"
6 #include "system/object-type-definition.h"
7 #include "util/bit-flags-calculator.h"
8 #include "util/enum-converter.h"
9 #include "util/quarks.h"
10
11 static void write_item_flags(object_type *o_ptr, BIT_FLAGS *flags)
12 {
13     if (o_ptr->pval)
14         set_bits(*flags, SaveDataItemFlagType::PVAL);
15
16     if (o_ptr->discount)
17         set_bits(*flags, SaveDataItemFlagType::DISCOUNT);
18
19     if (o_ptr->number != 1)
20         set_bits(*flags, SaveDataItemFlagType::NUMBER);
21
22     if (o_ptr->name1)
23         set_bits(*flags, SaveDataItemFlagType::NAME1);
24
25     if (o_ptr->name2)
26         set_bits(*flags, SaveDataItemFlagType::NAME2);
27
28     if (o_ptr->timeout)
29         set_bits(*flags, SaveDataItemFlagType::TIMEOUT);
30
31     if (o_ptr->to_h)
32         set_bits(*flags, SaveDataItemFlagType::TO_H);
33
34     if (o_ptr->to_d)
35         set_bits(*flags, SaveDataItemFlagType::TO_D);
36
37     if (o_ptr->to_a)
38         set_bits(*flags, SaveDataItemFlagType::TO_A);
39
40     if (o_ptr->ac)
41         set_bits(*flags, SaveDataItemFlagType::AC);
42
43     if (o_ptr->dd)
44         set_bits(*flags, SaveDataItemFlagType::DD);
45
46     if (o_ptr->ds)
47         set_bits(*flags, SaveDataItemFlagType::DS);
48
49     if (o_ptr->ident)
50         set_bits(*flags, SaveDataItemFlagType::IDENT);
51
52     if (o_ptr->marked)
53         set_bits(*flags, SaveDataItemFlagType::MARKED);
54
55     if (o_ptr->art_flags.any())
56         set_bits(*flags, SaveDataItemFlagType::ART_FLAGS);
57
58     if (o_ptr->curse_flags.any())
59         set_bits(*flags, SaveDataItemFlagType::CURSE_FLAGS);
60
61     if (o_ptr->held_m_idx)
62         set_bits(*flags, SaveDataItemFlagType::HELD_M_IDX);
63
64     if (o_ptr->xtra1)
65         set_bits(*flags, SaveDataItemFlagType::XTRA1);
66
67     if (o_ptr->activation_id > RandomArtActType::NONE)
68         set_bits(*flags, SaveDataItemFlagType::ACTIVATION_ID);
69
70     if (o_ptr->xtra3)
71         set_bits(*flags, SaveDataItemFlagType::XTRA3);
72
73     if (o_ptr->xtra4)
74         set_bits(*flags, SaveDataItemFlagType::XTRA4);
75
76     if (o_ptr->xtra5)
77         set_bits(*flags, SaveDataItemFlagType::XTRA5);
78
79     if (o_ptr->feeling)
80         set_bits(*flags, SaveDataItemFlagType::FEELING);
81
82     if (o_ptr->inscription)
83         set_bits(*flags, SaveDataItemFlagType::INSCRIPTION);
84
85     if (o_ptr->art_name)
86         set_bits(*flags, SaveDataItemFlagType::ART_NAME);
87
88     if (o_ptr->stack_idx)
89         set_bits(*flags, SaveDataItemFlagType::STACK_IDX);
90
91     if (o_ptr->is_smith()) {
92         set_bits(*flags, SaveDataItemFlagType::SMITH);
93     }
94
95     wr_u32b(*flags);
96 }
97
98 static void write_item_info(object_type *o_ptr, const BIT_FLAGS flags)
99 {
100     wr_s16b((int16_t)o_ptr->weight);
101     if (any_bits(flags, SaveDataItemFlagType::NAME1))
102         wr_s16b(o_ptr->name1);
103
104     if (any_bits(flags, SaveDataItemFlagType::NAME2))
105         wr_byte((byte)o_ptr->name2);
106
107     if (any_bits(flags, SaveDataItemFlagType::TIMEOUT))
108         wr_s16b(o_ptr->timeout);
109
110     if (any_bits(flags, SaveDataItemFlagType::TO_H))
111         wr_s16b(o_ptr->to_h);
112
113     if (any_bits(flags, SaveDataItemFlagType::TO_D))
114         wr_s16b((int16_t)o_ptr->to_d);
115
116     if (any_bits(flags, SaveDataItemFlagType::TO_A))
117         wr_s16b(o_ptr->to_a);
118
119     if (any_bits(flags, SaveDataItemFlagType::AC))
120         wr_s16b(o_ptr->ac);
121
122     if (any_bits(flags, SaveDataItemFlagType::DD))
123         wr_byte((byte)o_ptr->dd);
124
125     if (any_bits(flags, SaveDataItemFlagType::DS))
126         wr_byte((byte)o_ptr->ds);
127
128     if (any_bits(flags, SaveDataItemFlagType::IDENT))
129         wr_byte(o_ptr->ident);
130
131     if (any_bits(flags, SaveDataItemFlagType::MARKED))
132         wr_byte(o_ptr->marked);
133
134     if (any_bits(flags, SaveDataItemFlagType::ART_FLAGS))
135         wr_FlagGroup(o_ptr->art_flags, wr_byte);
136
137     if (any_bits(flags, SaveDataItemFlagType::CURSE_FLAGS))
138         wr_FlagGroup(o_ptr->curse_flags, wr_byte);
139
140     if (any_bits(flags, SaveDataItemFlagType::HELD_M_IDX))
141         wr_s16b(o_ptr->held_m_idx);
142
143     if (any_bits(flags, SaveDataItemFlagType::XTRA1))
144         wr_byte(o_ptr->xtra1);
145
146     if (any_bits(flags, SaveDataItemFlagType::ACTIVATION_ID))
147         wr_s16b(enum2i(o_ptr->activation_id));
148
149     if (any_bits(flags, SaveDataItemFlagType::XTRA3))
150         wr_byte(o_ptr->xtra3);
151
152     if (any_bits(flags, SaveDataItemFlagType::XTRA4))
153         wr_s16b(o_ptr->xtra4);
154
155     if (any_bits(flags, SaveDataItemFlagType::XTRA5))
156         wr_s16b(o_ptr->xtra5);
157
158     if (any_bits(flags, SaveDataItemFlagType::FEELING))
159         wr_byte(o_ptr->feeling);
160
161     if (any_bits(flags, SaveDataItemFlagType::STACK_IDX))
162         wr_s16b(o_ptr->stack_idx);
163
164     if (any_bits(flags, SaveDataItemFlagType::SMITH)) {
165         if (o_ptr->smith_effect.has_value()) {
166             wr_s16b(enum2i(o_ptr->smith_effect.value()));
167         } else {
168             wr_s16b(0);
169         }
170
171         if (o_ptr->smith_act_idx.has_value()) {
172             wr_s16b(enum2i(o_ptr->smith_act_idx.value()));
173         } else {
174             wr_s16b(0);
175         }
176     }
177 }
178
179 /*!
180  * @brief アイテムオブジェクトを書き込む / Write an "item" record
181  * @param o_ptr アイテムオブジェクト保存元ポインタ
182  */
183 void wr_item(object_type *o_ptr)
184 {
185     BIT_FLAGS flags = 0x00000000;
186     write_item_flags(o_ptr, &flags);
187
188     wr_s16b(o_ptr->k_idx);
189     wr_byte((byte)o_ptr->iy);
190     wr_byte((byte)o_ptr->ix);
191     if (any_bits(flags, SaveDataItemFlagType::PVAL))
192         wr_s16b(o_ptr->pval);
193
194     if (any_bits(flags, SaveDataItemFlagType::DISCOUNT))
195         wr_byte(o_ptr->discount);
196
197     if (any_bits(flags, SaveDataItemFlagType::NUMBER))
198         wr_byte((byte)o_ptr->number);
199
200     write_item_info(o_ptr, flags);
201     if (any_bits(flags, SaveDataItemFlagType::INSCRIPTION))
202         wr_string(quark_str(o_ptr->inscription));
203
204     if (any_bits(flags, SaveDataItemFlagType::ART_NAME))
205         wr_string(quark_str(o_ptr->art_name));
206 }
207
208 /*!
209  * @brief セーブデータにアイテムの鑑定情報を書き込む / Write an "perception" record
210  * @param k_idx ベースアイテムのID
211  */
212 void wr_perception(KIND_OBJECT_IDX k_idx)
213 {
214     byte tmp8u = 0;
215     object_kind *k_ptr = &k_info[k_idx];
216     if (k_ptr->aware)
217         tmp8u |= 0x01;
218
219     if (k_ptr->tried)
220         tmp8u |= 0x02;
221
222     wr_byte(tmp8u);
223 }