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"
11 static void write_item_flags(object_type *o_ptr, BIT_FLAGS *flags)
14 set_bits(*flags, SaveDataItemFlagType::PVAL);
17 set_bits(*flags, SaveDataItemFlagType::DISCOUNT);
19 if (o_ptr->number != 1)
20 set_bits(*flags, SaveDataItemFlagType::NUMBER);
23 set_bits(*flags, SaveDataItemFlagType::NAME1);
26 set_bits(*flags, SaveDataItemFlagType::NAME2);
29 set_bits(*flags, SaveDataItemFlagType::TIMEOUT);
32 set_bits(*flags, SaveDataItemFlagType::TO_H);
35 set_bits(*flags, SaveDataItemFlagType::TO_D);
38 set_bits(*flags, SaveDataItemFlagType::TO_A);
41 set_bits(*flags, SaveDataItemFlagType::AC);
44 set_bits(*flags, SaveDataItemFlagType::DD);
47 set_bits(*flags, SaveDataItemFlagType::DS);
50 set_bits(*flags, SaveDataItemFlagType::IDENT);
53 set_bits(*flags, SaveDataItemFlagType::MARKED);
55 if (o_ptr->art_flags.any())
56 set_bits(*flags, SaveDataItemFlagType::ART_FLAGS);
58 if (o_ptr->curse_flags.any())
59 set_bits(*flags, SaveDataItemFlagType::CURSE_FLAGS);
61 if (o_ptr->held_m_idx)
62 set_bits(*flags, SaveDataItemFlagType::HELD_M_IDX);
65 set_bits(*flags, SaveDataItemFlagType::XTRA1);
67 if (o_ptr->activation_id > RandomArtActType::NONE)
68 set_bits(*flags, SaveDataItemFlagType::ACTIVATION_ID);
71 set_bits(*flags, SaveDataItemFlagType::XTRA3);
74 set_bits(*flags, SaveDataItemFlagType::XTRA4);
77 set_bits(*flags, SaveDataItemFlagType::XTRA5);
80 set_bits(*flags, SaveDataItemFlagType::FEELING);
82 if (o_ptr->inscription)
83 set_bits(*flags, SaveDataItemFlagType::INSCRIPTION);
86 set_bits(*flags, SaveDataItemFlagType::ART_NAME);
89 set_bits(*flags, SaveDataItemFlagType::STACK_IDX);
91 if (o_ptr->is_smith()) {
92 set_bits(*flags, SaveDataItemFlagType::SMITH);
98 static void write_item_info(object_type *o_ptr, const BIT_FLAGS flags)
100 wr_s16b((int16_t)o_ptr->weight);
101 if (any_bits(flags, SaveDataItemFlagType::NAME1))
102 wr_s16b(o_ptr->name1);
104 if (any_bits(flags, SaveDataItemFlagType::NAME2))
105 wr_byte((byte)o_ptr->name2);
107 if (any_bits(flags, SaveDataItemFlagType::TIMEOUT))
108 wr_s16b(o_ptr->timeout);
110 if (any_bits(flags, SaveDataItemFlagType::TO_H))
111 wr_s16b(o_ptr->to_h);
113 if (any_bits(flags, SaveDataItemFlagType::TO_D))
114 wr_s16b((int16_t)o_ptr->to_d);
116 if (any_bits(flags, SaveDataItemFlagType::TO_A))
117 wr_s16b(o_ptr->to_a);
119 if (any_bits(flags, SaveDataItemFlagType::AC))
122 if (any_bits(flags, SaveDataItemFlagType::DD))
123 wr_byte((byte)o_ptr->dd);
125 if (any_bits(flags, SaveDataItemFlagType::DS))
126 wr_byte((byte)o_ptr->ds);
128 if (any_bits(flags, SaveDataItemFlagType::IDENT))
129 wr_byte(o_ptr->ident);
131 if (any_bits(flags, SaveDataItemFlagType::MARKED))
132 wr_byte(o_ptr->marked);
134 if (any_bits(flags, SaveDataItemFlagType::ART_FLAGS))
135 wr_FlagGroup(o_ptr->art_flags, wr_byte);
137 if (any_bits(flags, SaveDataItemFlagType::CURSE_FLAGS))
138 wr_FlagGroup(o_ptr->curse_flags, wr_byte);
140 if (any_bits(flags, SaveDataItemFlagType::HELD_M_IDX))
141 wr_s16b(o_ptr->held_m_idx);
143 if (any_bits(flags, SaveDataItemFlagType::XTRA1))
144 wr_byte(o_ptr->xtra1);
146 if (any_bits(flags, SaveDataItemFlagType::ACTIVATION_ID))
147 wr_s16b(enum2i(o_ptr->activation_id));
149 if (any_bits(flags, SaveDataItemFlagType::XTRA3))
150 wr_byte(o_ptr->xtra3);
152 if (any_bits(flags, SaveDataItemFlagType::XTRA4))
153 wr_s16b(o_ptr->xtra4);
155 if (any_bits(flags, SaveDataItemFlagType::XTRA5))
156 wr_s16b(o_ptr->xtra5);
158 if (any_bits(flags, SaveDataItemFlagType::FEELING))
159 wr_byte(o_ptr->feeling);
161 if (any_bits(flags, SaveDataItemFlagType::STACK_IDX))
162 wr_s16b(o_ptr->stack_idx);
164 if (any_bits(flags, SaveDataItemFlagType::SMITH)) {
165 if (o_ptr->smith_effect.has_value()) {
166 wr_s16b(enum2i(o_ptr->smith_effect.value()));
171 if (o_ptr->smith_act_idx.has_value()) {
172 wr_s16b(enum2i(o_ptr->smith_act_idx.value()));
180 * @brief アイテムオブジェクトを書き込む / Write an "item" record
181 * @param o_ptr アイテムオブジェクト保存元ポインタ
183 void wr_item(object_type *o_ptr)
185 BIT_FLAGS flags = 0x00000000;
186 write_item_flags(o_ptr, &flags);
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);
194 if (any_bits(flags, SaveDataItemFlagType::DISCOUNT))
195 wr_byte(o_ptr->discount);
197 if (any_bits(flags, SaveDataItemFlagType::NUMBER))
198 wr_byte((byte)o_ptr->number);
200 write_item_info(o_ptr, flags);
201 if (any_bits(flags, SaveDataItemFlagType::INSCRIPTION))
202 wr_string(quark_str(o_ptr->inscription));
204 if (any_bits(flags, SaveDataItemFlagType::ART_NAME))
205 wr_string(quark_str(o_ptr->art_name));
209 * @brief セーブデータにアイテムの鑑定情報を書き込む / Write an "perception" record
210 * @param k_idx ベースアイテムのID
212 void wr_perception(KIND_OBJECT_IDX k_idx)
215 object_kind *k_ptr = &k_info[k_idx];