1 #include "load/old/item-loader-savefile50.h"
2 #include "artifact/fixed-art-types.h"
3 #include "game-option/runtime-arguments.h"
4 #include "load/angband-version-comparer.h"
5 #include "load/load-util.h"
6 #include "load/old/item-flag-types-savefile50.h"
7 #include "load/old/load-v1-5-0.h"
8 #include "load/savedata-old-flag-types.h"
9 #include "object-enchant/object-ego.h"
10 #include "object-enchant/tr-types.h"
11 #include "object/object-flags.h"
12 #include "object/object-kind.h"
13 #include "sv-definition/sv-lite-types.h"
14 #include "system/angband.h"
15 #include "system/object-type-definition.h"
16 #include "system/player-type-definition.h"
17 #include "util/bit-flags-calculator.h"
18 #include "util/enum-converter.h"
19 #include "util/quarks.h"
22 * @brief アイテムオブジェクトを読み込む(v3.0.0 Savefile ver50まで)
23 * @param o_ptr アイテムオブジェクト保存先ポインタ
25 void ItemLoader50::rd_item(ObjectType *o_ptr)
27 if (h_older_than(1, 5, 0, 0)) {
32 auto flags = rd_u32b();
33 o_ptr->k_idx = rd_s16b();
34 o_ptr->iy = rd_byte();
35 o_ptr->ix = rd_byte();
36 auto *k_ptr = &k_info[o_ptr->k_idx];
37 o_ptr->tval = k_ptr->tval;
38 o_ptr->sval = k_ptr->sval;
39 o_ptr->pval = any_bits(flags, SaveDataItemFlagType::PVAL) ? rd_s16b() : 0;
40 o_ptr->discount = any_bits(flags, SaveDataItemFlagType::DISCOUNT) ? rd_byte() : 0;
41 o_ptr->number = any_bits(flags, SaveDataItemFlagType::NUMBER) ? rd_byte() : 1;
42 o_ptr->weight = rd_s16b();
43 if (any_bits(flags, SaveDataItemFlagType::FIXED_ARTIFACT_IDX)) {
44 if (h_older_than(3, 0, 0, 2)) {
45 o_ptr->fixed_artifact_idx = rd_byte();
47 o_ptr->fixed_artifact_idx = rd_s16b();
50 o_ptr->fixed_artifact_idx = 0;
53 o_ptr->ego_idx = i2enum<EgoType>(any_bits(flags, SaveDataItemFlagType::EGO_IDX) ? rd_byte() : 0);
54 o_ptr->timeout = any_bits(flags, SaveDataItemFlagType::TIMEOUT) ? rd_s16b() : 0;
55 o_ptr->to_h = any_bits(flags, SaveDataItemFlagType::TO_H) ? rd_s16b() : 0;
56 o_ptr->to_d = any_bits(flags, SaveDataItemFlagType::TO_D) ? rd_s16b() : 0;
57 o_ptr->to_a = any_bits(flags, SaveDataItemFlagType::TO_A) ? rd_s16b() : 0;
58 o_ptr->ac = any_bits(flags, SaveDataItemFlagType::AC) ? rd_s16b() : 0;
59 o_ptr->dd = any_bits(flags, SaveDataItemFlagType::DD) ? rd_byte() : 0;
60 o_ptr->ds = any_bits(flags, SaveDataItemFlagType::DS) ? rd_byte() : 0;
61 o_ptr->ident = any_bits(flags, SaveDataItemFlagType::IDENT) ? rd_byte() : 0;
62 o_ptr->marked = any_bits(flags, SaveDataItemFlagType::MARKED) ? rd_byte() : 0;
65 if (loading_savefile_version_is_older_than(7)) {
66 constexpr SavedataItemOlderThan7FlagType old_savefile_art_flags[] = {
67 SavedataItemOlderThan7FlagType::ART_FLAGS0,
68 SavedataItemOlderThan7FlagType::ART_FLAGS1,
69 SavedataItemOlderThan7FlagType::ART_FLAGS2,
70 SavedataItemOlderThan7FlagType::ART_FLAGS3,
71 SavedataItemOlderThan7FlagType::ART_FLAGS4,
74 for (auto f : old_savefile_art_flags) {
75 if (any_bits(flags, f)) {
76 auto tmp32u = rd_u32b();
77 migrate_bitflag_to_flaggroup(o_ptr->art_flags, tmp32u, start);
82 if (any_bits(flags, SaveDataItemFlagType::ART_FLAGS)) {
83 rd_FlagGroup(o_ptr->art_flags, rd_byte);
85 o_ptr->art_flags.clear();
89 if (any_bits(flags, SaveDataItemFlagType::CURSE_FLAGS)) {
90 if (loading_savefile_version_is_older_than(5)) {
91 auto tmp32u = rd_u32b();
92 migrate_bitflag_to_flaggroup(o_ptr->curse_flags, tmp32u);
94 rd_FlagGroup(o_ptr->curse_flags, rd_byte);
97 o_ptr->curse_flags.clear();
100 o_ptr->held_m_idx = any_bits(flags, SaveDataItemFlagType::HELD_M_IDX) ? rd_s16b() : 0;
101 if (loading_savefile_version_is_older_than(12)) {
102 if (any_bits(flags, SavedataItemOlderThan12FlagType::XTRA1)) {
107 if (any_bits(flags, SaveDataItemFlagType::ACTIVATION_ID)) {
108 if (h_older_than(3, 0, 0, 2)) {
109 o_ptr->activation_id = i2enum<RandomArtActType>(rd_byte());
111 o_ptr->activation_id = i2enum<RandomArtActType>(rd_s16b());
114 o_ptr->activation_id = i2enum<RandomArtActType>(0);
117 // xtra3フィールドが複数目的に共用されていた頃の名残.
118 if (loading_savefile_version_is_older_than(12)) {
119 uint8_t tmp8s = any_bits(flags, SavedataItemOlderThan12FlagType::XTRA3) ? rd_byte() : 0;
120 if (o_ptr->tval == ItemKindType::CHEST) {
121 o_ptr->chest_level = tmp8s;
122 } else if (o_ptr->tval == ItemKindType::CAPTURE) {
123 o_ptr->captured_monster_speed = tmp8s;
126 o_ptr->chest_level = any_bits(flags, SaveDataItemFlagType::CHEST_LEVEL) ? rd_byte() : 0;
127 o_ptr->captured_monster_speed = any_bits(flags, SaveDataItemFlagType::CAPTURED_MONSTER_SPEED) ? rd_byte() : 0;
130 // xtra4フィールドが複数目的に共用されていた頃の名残.
131 if (loading_savefile_version_is_older_than(13)) {
132 int16_t xtra4 = any_bits(flags, SavedataItemOlderThan13FlagType::XTRA4) ? rd_s16b() : 0;
133 if (o_ptr->is_fuel()) {
134 o_ptr->fuel = static_cast<short>(xtra4);
135 } else if (o_ptr->tval == ItemKindType::CAPTURE) {
136 o_ptr->captured_monster_current_hp = xtra4;
138 o_ptr->smith_hit = static_cast<byte>(xtra4 >> 8);
139 o_ptr->smith_damage = static_cast<byte>(xtra4 & 0x000f);
142 o_ptr->fuel = any_bits(flags, SaveDataItemFlagType::FUEL) ? rd_s16b() : 0;
143 o_ptr->captured_monster_current_hp = any_bits(flags, SaveDataItemFlagType::CAPTURED_MONSTER_CURRENT_HP) ? rd_s16b() : 0;
146 if (o_ptr->is_fuel() && (o_ptr->tval == ItemKindType::LITE)) {
147 const auto fuel_max = o_ptr->sval == SV_LITE_TORCH ? FUEL_TORCH : FUEL_LAMP;
148 if (o_ptr->fuel < 0 || o_ptr->fuel > fuel_max) {
153 o_ptr->captured_monster_max_hp = any_bits(flags, SaveDataItemFlagType::XTRA5) ? rd_s16b() : 0;
154 o_ptr->feeling = any_bits(flags, SaveDataItemFlagType::FEELING) ? rd_byte() : 0;
155 o_ptr->stack_idx = any_bits(flags, SaveDataItemFlagType::STACK_IDX) ? rd_s16b() : 0;
156 if (any_bits(flags, SaveDataItemFlagType::SMITH) && !loading_savefile_version_is_older_than(7)) {
157 if (auto tmp16s = rd_s16b(); tmp16s > 0) {
158 o_ptr->smith_effect = static_cast<SmithEffectType>(tmp16s);
161 if (auto tmp16s = rd_s16b(); tmp16s > 0) {
162 o_ptr->smith_act_idx = static_cast<RandomArtActType>(tmp16s);
165 if (!loading_savefile_version_is_older_than(13)) {
166 o_ptr->smith_hit = rd_byte();
167 o_ptr->smith_damage = rd_byte();
171 if (any_bits(flags, SaveDataItemFlagType::INSCRIPTION)) {
173 rd_string(buf, sizeof(buf));
174 o_ptr->inscription = quark_add(buf);
176 o_ptr->inscription = 0;
179 if (any_bits(flags, SaveDataItemFlagType::ART_NAME)) {
181 rd_string(buf, sizeof(buf));
182 o_ptr->art_name = quark_add(buf);
187 if (!h_older_than(2, 1, 2, 4)) {
191 if ((o_ptr->ego_idx == EgoType::DARK) || (o_ptr->ego_idx == EgoType::ANCIENT_CURSE) || (o_ptr->fixed_artifact_idx == ART_NIGHT)) {
192 o_ptr->art_flags.set(TR_LITE_M1);
193 o_ptr->art_flags.reset(TR_LITE_1);
194 o_ptr->art_flags.reset(TR_LITE_2);
195 o_ptr->art_flags.reset(TR_LITE_3);
199 if (o_ptr->ego_idx == EgoType::LITE_DARKNESS) {
200 if (o_ptr->tval != ItemKindType::LITE) {
201 o_ptr->art_flags.set(TR_LITE_M1);
205 if (o_ptr->sval == SV_LITE_TORCH) {
206 o_ptr->art_flags.set(TR_LITE_M1);
207 } else if (o_ptr->sval == SV_LITE_LANTERN) {
208 o_ptr->art_flags.set(TR_LITE_M2);
209 } else if (o_ptr->sval == SV_LITE_FEANOR) {
210 o_ptr->art_flags.set(TR_LITE_M3);
216 if (o_ptr->tval == ItemKindType::LITE) {
217 if (o_ptr->is_fixed_artifact()) {
218 o_ptr->art_flags.set(TR_LITE_3);
222 if (o_ptr->sval == SV_LITE_TORCH) {
223 o_ptr->art_flags.set(TR_LITE_1);
224 o_ptr->art_flags.set(TR_LITE_FUEL);
228 if (o_ptr->sval == SV_LITE_LANTERN) {
229 o_ptr->art_flags.set(TR_LITE_2);
230 o_ptr->art_flags.set(TR_LITE_FUEL);
234 if (o_ptr->sval == SV_LITE_FEANOR) {
235 o_ptr->art_flags.set(TR_LITE_2);