OSDN Git Service

d9e56b4362b70a60aefc738b7b49a2231c86ac13
[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-savefile50.h"
4 #include "save/save-util.h"
5 #include "system/baseitem-info.h"
6 #include "system/item-entity.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(ItemEntity *o_ptr, BIT_FLAGS *flags)
12 {
13     if (o_ptr->pval) {
14         set_bits(*flags, SaveDataItemFlagType::PVAL);
15     }
16
17     if (o_ptr->discount) {
18         set_bits(*flags, SaveDataItemFlagType::DISCOUNT);
19     }
20
21     if (o_ptr->number != 1) {
22         set_bits(*flags, SaveDataItemFlagType::NUMBER);
23     }
24
25     if (o_ptr->is_fixed_artifact()) {
26         set_bits(*flags, SaveDataItemFlagType::FIXED_ARTIFACT_IDX);
27     }
28
29     if (o_ptr->is_ego()) {
30         set_bits(*flags, SaveDataItemFlagType::EGO_IDX);
31     }
32
33     if (o_ptr->timeout) {
34         set_bits(*flags, SaveDataItemFlagType::TIMEOUT);
35     }
36
37     if (o_ptr->to_h) {
38         set_bits(*flags, SaveDataItemFlagType::TO_H);
39     }
40
41     if (o_ptr->to_d) {
42         set_bits(*flags, SaveDataItemFlagType::TO_D);
43     }
44
45     if (o_ptr->to_a) {
46         set_bits(*flags, SaveDataItemFlagType::TO_A);
47     }
48
49     if (o_ptr->ac) {
50         set_bits(*flags, SaveDataItemFlagType::AC);
51     }
52
53     if (o_ptr->dd) {
54         set_bits(*flags, SaveDataItemFlagType::DD);
55     }
56
57     if (o_ptr->ds) {
58         set_bits(*flags, SaveDataItemFlagType::DS);
59     }
60
61     if (o_ptr->ident) {
62         set_bits(*flags, SaveDataItemFlagType::IDENT);
63     }
64
65     if (o_ptr->marked.any()) {
66         set_bits(*flags, SaveDataItemFlagType::MARKED);
67     }
68
69     if (o_ptr->art_flags.any()) {
70         set_bits(*flags, SaveDataItemFlagType::ART_FLAGS);
71     }
72
73     if (o_ptr->curse_flags.any()) {
74         set_bits(*flags, SaveDataItemFlagType::CURSE_FLAGS);
75     }
76
77     if (o_ptr->held_m_idx) {
78         set_bits(*flags, SaveDataItemFlagType::HELD_M_IDX);
79     }
80
81     if (o_ptr->activation_id > RandomArtActType::NONE) {
82         set_bits(*flags, SaveDataItemFlagType::ACTIVATION_ID);
83     }
84
85     if (o_ptr->chest_level > 0) {
86         set_bits(*flags, SaveDataItemFlagType::CHEST_LEVEL);
87     }
88
89     if (o_ptr->captured_monster_speed > 0) {
90         set_bits(*flags, SaveDataItemFlagType::CAPTURED_MONSTER_SPEED);
91     }
92
93     if (o_ptr->fuel > 0) {
94         set_bits(*flags, SaveDataItemFlagType::FUEL);
95     }
96
97     if (o_ptr->captured_monster_current_hp > 0) {
98         set_bits(*flags, SaveDataItemFlagType::CAPTURED_MONSTER_CURRENT_HP);
99     }
100
101     if (o_ptr->captured_monster_max_hp) {
102         set_bits(*flags, SaveDataItemFlagType::XTRA5);
103     }
104
105     if (o_ptr->feeling) {
106         set_bits(*flags, SaveDataItemFlagType::FEELING);
107     }
108
109     if (o_ptr->is_inscribed()) {
110         set_bits(*flags, SaveDataItemFlagType::INSCRIPTION);
111     }
112
113     if (o_ptr->is_random_artifact()) {
114         set_bits(*flags, SaveDataItemFlagType::ART_NAME);
115     }
116
117     if (o_ptr->stack_idx) {
118         set_bits(*flags, SaveDataItemFlagType::STACK_IDX);
119     }
120
121     if (o_ptr->is_smith()) {
122         set_bits(*flags, SaveDataItemFlagType::SMITH);
123     }
124
125     wr_u32b(*flags);
126 }
127
128 static void write_item_info(ItemEntity *o_ptr, const BIT_FLAGS flags)
129 {
130     wr_s16b((int16_t)o_ptr->weight);
131     if (any_bits(flags, SaveDataItemFlagType::FIXED_ARTIFACT_IDX)) {
132         wr_s16b(enum2i(o_ptr->fixed_artifact_idx));
133     }
134
135     if (any_bits(flags, SaveDataItemFlagType::EGO_IDX)) {
136         wr_byte((byte)o_ptr->ego_idx);
137     }
138
139     if (any_bits(flags, SaveDataItemFlagType::TIMEOUT)) {
140         wr_s16b(o_ptr->timeout);
141     }
142
143     if (any_bits(flags, SaveDataItemFlagType::TO_H)) {
144         wr_s16b(o_ptr->to_h);
145     }
146
147     if (any_bits(flags, SaveDataItemFlagType::TO_D)) {
148         wr_s16b((int16_t)o_ptr->to_d);
149     }
150
151     if (any_bits(flags, SaveDataItemFlagType::TO_A)) {
152         wr_s16b(o_ptr->to_a);
153     }
154
155     if (any_bits(flags, SaveDataItemFlagType::AC)) {
156         wr_s16b(o_ptr->ac);
157     }
158
159     if (any_bits(flags, SaveDataItemFlagType::DD)) {
160         wr_byte((byte)o_ptr->dd);
161     }
162
163     if (any_bits(flags, SaveDataItemFlagType::DS)) {
164         wr_byte((byte)o_ptr->ds);
165     }
166
167     if (any_bits(flags, SaveDataItemFlagType::IDENT)) {
168         wr_byte(o_ptr->ident);
169     }
170
171     if (any_bits(flags, SaveDataItemFlagType::MARKED)) {
172         wr_FlagGroup_bytes(o_ptr->marked, wr_byte, 1);
173     }
174
175     if (any_bits(flags, SaveDataItemFlagType::ART_FLAGS)) {
176         wr_FlagGroup(o_ptr->art_flags, wr_byte);
177     }
178
179     if (any_bits(flags, SaveDataItemFlagType::CURSE_FLAGS)) {
180         wr_FlagGroup(o_ptr->curse_flags, wr_byte);
181     }
182
183     if (any_bits(flags, SaveDataItemFlagType::HELD_M_IDX)) {
184         wr_s16b(o_ptr->held_m_idx);
185     }
186
187     if (any_bits(flags, SaveDataItemFlagType::ACTIVATION_ID)) {
188         wr_s16b(enum2i(o_ptr->activation_id));
189     }
190
191     if (any_bits(flags, SaveDataItemFlagType::CHEST_LEVEL)) {
192         wr_byte(o_ptr->chest_level);
193     }
194
195     if (any_bits(flags, SaveDataItemFlagType::CAPTURED_MONSTER_SPEED)) {
196         wr_byte(o_ptr->captured_monster_speed);
197     }
198
199     if (any_bits(flags, SaveDataItemFlagType::FUEL)) {
200         wr_s16b(o_ptr->fuel);
201     }
202
203     if (any_bits(flags, SaveDataItemFlagType::CAPTURED_MONSTER_CURRENT_HP)) {
204         wr_s16b(o_ptr->captured_monster_current_hp);
205     }
206
207     if (any_bits(flags, SaveDataItemFlagType::XTRA5)) {
208         wr_s16b(o_ptr->captured_monster_max_hp);
209     }
210
211     if (any_bits(flags, SaveDataItemFlagType::FEELING)) {
212         wr_byte(o_ptr->feeling);
213     }
214
215     if (any_bits(flags, SaveDataItemFlagType::STACK_IDX)) {
216         wr_s16b(o_ptr->stack_idx);
217     }
218
219     if (any_bits(flags, SaveDataItemFlagType::SMITH)) {
220         if (o_ptr->smith_effect.has_value()) {
221             wr_s16b(enum2i(o_ptr->smith_effect.value()));
222         } else {
223             wr_s16b(0);
224         }
225
226         if (o_ptr->smith_act_idx.has_value()) {
227             wr_s16b(enum2i(o_ptr->smith_act_idx.value()));
228         } else {
229             wr_s16b(0);
230         }
231
232         wr_byte(o_ptr->smith_hit);
233         wr_byte(o_ptr->smith_damage);
234     }
235 }
236
237 /*!
238  * @brief アイテムオブジェクトを書き込む / Write an "item" record
239  * @param o_ptr アイテムオブジェクト保存元ポインタ
240  */
241 void wr_item(ItemEntity *o_ptr)
242 {
243     BIT_FLAGS flags = 0x00000000;
244     write_item_flags(o_ptr, &flags);
245
246     wr_s16b(o_ptr->bi_id);
247     wr_byte((byte)o_ptr->iy);
248     wr_byte((byte)o_ptr->ix);
249     if (any_bits(flags, SaveDataItemFlagType::PVAL)) {
250         wr_s16b(o_ptr->pval);
251     }
252
253     if (any_bits(flags, SaveDataItemFlagType::DISCOUNT)) {
254         wr_byte(o_ptr->discount);
255     }
256
257     if (any_bits(flags, SaveDataItemFlagType::NUMBER)) {
258         wr_byte((byte)o_ptr->number);
259     }
260
261     write_item_info(o_ptr, flags);
262     if (any_bits(flags, SaveDataItemFlagType::INSCRIPTION)) {
263         wr_string(quark_str(o_ptr->inscription));
264     }
265
266     if (any_bits(flags, SaveDataItemFlagType::ART_NAME)) {
267         wr_string(o_ptr->randart_name.value());
268     }
269 }
270
271 /*!
272  * @brief セーブデータにアイテムの鑑定情報を書き込む / Write an "perception" record
273  * @param bi_id ベースアイテムのID
274  */
275 void wr_perception(short bi_id)
276 {
277     byte tmp8u = 0;
278     const auto &baseitem = baseitems_info[bi_id];
279     if (baseitem.aware) {
280         tmp8u |= 0x01;
281     }
282
283     if (baseitem.tried) {
284         tmp8u |= 0x02;
285     }
286
287     wr_byte(tmp8u);
288 }