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"
11 static void write_item_flags(ItemEntity *o_ptr, BIT_FLAGS *flags)
14 set_bits(*flags, SaveDataItemFlagType::PVAL);
17 if (o_ptr->discount) {
18 set_bits(*flags, SaveDataItemFlagType::DISCOUNT);
21 if (o_ptr->number != 1) {
22 set_bits(*flags, SaveDataItemFlagType::NUMBER);
25 if (o_ptr->is_fixed_artifact()) {
26 set_bits(*flags, SaveDataItemFlagType::FIXED_ARTIFACT_IDX);
29 if (o_ptr->is_ego()) {
30 set_bits(*flags, SaveDataItemFlagType::EGO_IDX);
34 set_bits(*flags, SaveDataItemFlagType::TIMEOUT);
38 set_bits(*flags, SaveDataItemFlagType::TO_H);
42 set_bits(*flags, SaveDataItemFlagType::TO_D);
46 set_bits(*flags, SaveDataItemFlagType::TO_A);
50 set_bits(*flags, SaveDataItemFlagType::AC);
54 set_bits(*flags, SaveDataItemFlagType::DD);
58 set_bits(*flags, SaveDataItemFlagType::DS);
62 set_bits(*flags, SaveDataItemFlagType::IDENT);
65 if (o_ptr->marked.any()) {
66 set_bits(*flags, SaveDataItemFlagType::MARKED);
69 if (o_ptr->art_flags.any()) {
70 set_bits(*flags, SaveDataItemFlagType::ART_FLAGS);
73 if (o_ptr->curse_flags.any()) {
74 set_bits(*flags, SaveDataItemFlagType::CURSE_FLAGS);
77 if (o_ptr->held_m_idx) {
78 set_bits(*flags, SaveDataItemFlagType::HELD_M_IDX);
81 if (o_ptr->activation_id > RandomArtActType::NONE) {
82 set_bits(*flags, SaveDataItemFlagType::ACTIVATION_ID);
85 if (o_ptr->chest_level > 0) {
86 set_bits(*flags, SaveDataItemFlagType::CHEST_LEVEL);
89 if (o_ptr->captured_monster_speed > 0) {
90 set_bits(*flags, SaveDataItemFlagType::CAPTURED_MONSTER_SPEED);
93 if (o_ptr->fuel > 0) {
94 set_bits(*flags, SaveDataItemFlagType::FUEL);
97 if (o_ptr->captured_monster_current_hp > 0) {
98 set_bits(*flags, SaveDataItemFlagType::CAPTURED_MONSTER_CURRENT_HP);
101 if (o_ptr->captured_monster_max_hp) {
102 set_bits(*flags, SaveDataItemFlagType::XTRA5);
105 if (o_ptr->feeling) {
106 set_bits(*flags, SaveDataItemFlagType::FEELING);
109 if (o_ptr->is_inscribed()) {
110 set_bits(*flags, SaveDataItemFlagType::INSCRIPTION);
113 if (o_ptr->is_random_artifact()) {
114 set_bits(*flags, SaveDataItemFlagType::ART_NAME);
117 if (o_ptr->stack_idx) {
118 set_bits(*flags, SaveDataItemFlagType::STACK_IDX);
121 if (o_ptr->is_smith()) {
122 set_bits(*flags, SaveDataItemFlagType::SMITH);
128 static void write_item_info(ItemEntity *o_ptr, const BIT_FLAGS flags)
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));
135 if (any_bits(flags, SaveDataItemFlagType::EGO_IDX)) {
136 wr_byte((byte)o_ptr->ego_idx);
139 if (any_bits(flags, SaveDataItemFlagType::TIMEOUT)) {
140 wr_s16b(o_ptr->timeout);
143 if (any_bits(flags, SaveDataItemFlagType::TO_H)) {
144 wr_s16b(o_ptr->to_h);
147 if (any_bits(flags, SaveDataItemFlagType::TO_D)) {
148 wr_s16b((int16_t)o_ptr->to_d);
151 if (any_bits(flags, SaveDataItemFlagType::TO_A)) {
152 wr_s16b(o_ptr->to_a);
155 if (any_bits(flags, SaveDataItemFlagType::AC)) {
159 if (any_bits(flags, SaveDataItemFlagType::DD)) {
160 wr_byte((byte)o_ptr->dd);
163 if (any_bits(flags, SaveDataItemFlagType::DS)) {
164 wr_byte((byte)o_ptr->ds);
167 if (any_bits(flags, SaveDataItemFlagType::IDENT)) {
168 wr_byte(o_ptr->ident);
171 if (any_bits(flags, SaveDataItemFlagType::MARKED)) {
172 wr_FlagGroup_bytes(o_ptr->marked, wr_byte, 1);
175 if (any_bits(flags, SaveDataItemFlagType::ART_FLAGS)) {
176 wr_FlagGroup(o_ptr->art_flags, wr_byte);
179 if (any_bits(flags, SaveDataItemFlagType::CURSE_FLAGS)) {
180 wr_FlagGroup(o_ptr->curse_flags, wr_byte);
183 if (any_bits(flags, SaveDataItemFlagType::HELD_M_IDX)) {
184 wr_s16b(o_ptr->held_m_idx);
187 if (any_bits(flags, SaveDataItemFlagType::ACTIVATION_ID)) {
188 wr_s16b(enum2i(o_ptr->activation_id));
191 if (any_bits(flags, SaveDataItemFlagType::CHEST_LEVEL)) {
192 wr_byte(o_ptr->chest_level);
195 if (any_bits(flags, SaveDataItemFlagType::CAPTURED_MONSTER_SPEED)) {
196 wr_byte(o_ptr->captured_monster_speed);
199 if (any_bits(flags, SaveDataItemFlagType::FUEL)) {
200 wr_s16b(o_ptr->fuel);
203 if (any_bits(flags, SaveDataItemFlagType::CAPTURED_MONSTER_CURRENT_HP)) {
204 wr_s16b(o_ptr->captured_monster_current_hp);
207 if (any_bits(flags, SaveDataItemFlagType::XTRA5)) {
208 wr_s16b(o_ptr->captured_monster_max_hp);
211 if (any_bits(flags, SaveDataItemFlagType::FEELING)) {
212 wr_byte(o_ptr->feeling);
215 if (any_bits(flags, SaveDataItemFlagType::STACK_IDX)) {
216 wr_s16b(o_ptr->stack_idx);
219 if (any_bits(flags, SaveDataItemFlagType::SMITH)) {
220 if (o_ptr->smith_effect.has_value()) {
221 wr_s16b(enum2i(o_ptr->smith_effect.value()));
226 if (o_ptr->smith_act_idx.has_value()) {
227 wr_s16b(enum2i(o_ptr->smith_act_idx.value()));
232 wr_byte(o_ptr->smith_hit);
233 wr_byte(o_ptr->smith_damage);
238 * @brief アイテムオブジェクトを書き込む / Write an "item" record
239 * @param o_ptr アイテムオブジェクト保存元ポインタ
241 void wr_item(ItemEntity *o_ptr)
243 BIT_FLAGS flags = 0x00000000;
244 write_item_flags(o_ptr, &flags);
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);
253 if (any_bits(flags, SaveDataItemFlagType::DISCOUNT)) {
254 wr_byte(o_ptr->discount);
257 if (any_bits(flags, SaveDataItemFlagType::NUMBER)) {
258 wr_byte((byte)o_ptr->number);
261 write_item_info(o_ptr, flags);
262 if (any_bits(flags, SaveDataItemFlagType::INSCRIPTION)) {
263 wr_string(quark_str(o_ptr->inscription));
266 if (any_bits(flags, SaveDataItemFlagType::ART_NAME)) {
267 wr_string(o_ptr->randart_name.value());
272 * @brief セーブデータにアイテムの鑑定情報を書き込む / Write an "perception" record
273 * @param bi_id ベースアイテムのID
275 void wr_perception(short bi_id)
278 const auto &baseitem = baseitems_info[bi_id];
279 if (baseitem.aware) {
283 if (baseitem.tried) {