OSDN Git Service

Merge pull request #2182 from sikabane-works/feature/fix-wiz_kill_enemy
[hengbandforosx/hengbandosx.git] / src / load / old / item-loader-savefile50.cpp
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"
20
21 /*!
22  * @brief アイテムオブジェクトを読み込む(v3.0.0 Savefile ver50まで)
23  * @param o_ptr アイテムオブジェクト保存先ポインタ
24  */
25 void ItemLoader50::rd_item(ObjectType *o_ptr)
26 {
27     if (h_older_than(1, 5, 0, 0)) {
28         rd_item_old(o_ptr);
29         return;
30     }
31
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::NAME1)) {
44         if (h_older_than(3, 0, 0, 2)) {
45             o_ptr->name1 = rd_byte();
46         } else {
47             o_ptr->name1 = rd_s16b();
48         }
49     } else {
50         o_ptr->name1 = 0;
51     }
52
53     o_ptr->name2 = any_bits(flags, SaveDataItemFlagType::NAME2) ? 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;
63
64     /* Object flags */
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,
72         };
73         auto start = 0;
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);
78             }
79             start += 32;
80         }
81     } else {
82         if (any_bits(flags, SaveDataItemFlagType::ART_FLAGS)) {
83             rd_FlagGroup(o_ptr->art_flags, rd_byte);
84         } else {
85             o_ptr->art_flags.clear();
86         }
87     }
88
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);
93         } else {
94             rd_FlagGroup(o_ptr->curse_flags, rd_byte);
95         }
96     } else {
97         o_ptr->curse_flags.clear();
98     }
99
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)) {
103             strip_bytes(1);
104         }
105     }
106
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());
110         } else {
111             o_ptr->activation_id = i2enum<RandomArtActType>(rd_s16b());
112         }
113     } else {
114         o_ptr->activation_id = i2enum<RandomArtActType>(0);
115     }
116
117     // xtra3フィールドが複数目的に共用されていた頃の名残.
118     if (loading_savefile_version_is_older_than(12)) {
119         int8_t tmp8s = any_bits(flags, SavedataItemOlderThan12FlagType::XTRA3) ? rd_byte() : 0;
120         if (o_ptr->tval == ItemKindType::CHEST) {
121             o_ptr->chest_level = static_cast<uint8_t>(tmp8s);
122         } else if (o_ptr->tval == ItemKindType::CAPTURE) {
123             o_ptr->captured_monster_speed = tmp8s;
124         }
125     } else {
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;
128     }
129
130     o_ptr->xtra4 = any_bits(flags, SaveDataItemFlagType::XTRA4) ? rd_s16b() : 0;
131     o_ptr->xtra5 = any_bits(flags, SaveDataItemFlagType::XTRA5) ? rd_s16b() : 0;
132     o_ptr->feeling = any_bits(flags, SaveDataItemFlagType::FEELING) ? rd_byte() : 0;
133     o_ptr->stack_idx = any_bits(flags, SaveDataItemFlagType::STACK_IDX) ? rd_s16b() : 0;
134     if (any_bits(flags, SaveDataItemFlagType::SMITH) && !loading_savefile_version_is_older_than(7)) {
135         if (auto tmp16s = rd_s16b(); tmp16s > 0) {
136             o_ptr->smith_effect = static_cast<SmithEffectType>(tmp16s);
137         }
138
139         if (auto tmp16s = rd_s16b(); tmp16s > 0) {
140             o_ptr->smith_act_idx = static_cast<RandomArtActType>(tmp16s);
141         }
142     }
143
144     if (any_bits(flags, SaveDataItemFlagType::INSCRIPTION)) {
145         char buf[128];
146         rd_string(buf, sizeof(buf));
147         o_ptr->inscription = quark_add(buf);
148     } else {
149         o_ptr->inscription = 0;
150     }
151
152     if (any_bits(flags, SaveDataItemFlagType::ART_NAME)) {
153         char buf[128];
154         rd_string(buf, sizeof(buf));
155         o_ptr->art_name = quark_add(buf);
156     } else {
157         o_ptr->art_name = 0;
158     }
159
160     if (!h_older_than(2, 1, 2, 4)) {
161         return;
162     }
163
164     if ((o_ptr->name2 == EGO_DARK) || (o_ptr->name2 == EGO_ANCIENT_CURSE) || (o_ptr->name1 == ART_NIGHT)) {
165         o_ptr->art_flags.set(TR_LITE_M1);
166         o_ptr->art_flags.reset(TR_LITE_1);
167         o_ptr->art_flags.reset(TR_LITE_2);
168         o_ptr->art_flags.reset(TR_LITE_3);
169         return;
170     }
171
172     if (o_ptr->name2 == EGO_LITE_DARKNESS) {
173         if (o_ptr->tval != ItemKindType::LITE) {
174             o_ptr->art_flags.set(TR_LITE_M1);
175             return;
176         }
177
178         if (o_ptr->sval == SV_LITE_TORCH) {
179             o_ptr->art_flags.set(TR_LITE_M1);
180         } else if (o_ptr->sval == SV_LITE_LANTERN) {
181             o_ptr->art_flags.set(TR_LITE_M2);
182         } else if (o_ptr->sval == SV_LITE_FEANOR) {
183             o_ptr->art_flags.set(TR_LITE_M3);
184         }
185
186         return;
187     }
188
189     if (o_ptr->tval == ItemKindType::LITE) {
190         if (o_ptr->is_fixed_artifact()) {
191             o_ptr->art_flags.set(TR_LITE_3);
192             return;
193         }
194
195         if (o_ptr->sval == SV_LITE_TORCH) {
196             o_ptr->art_flags.set(TR_LITE_1);
197             o_ptr->art_flags.set(TR_LITE_FUEL);
198             return;
199         }
200
201         if (o_ptr->sval == SV_LITE_LANTERN) {
202             o_ptr->art_flags.set(TR_LITE_2);
203             o_ptr->art_flags.set(TR_LITE_FUEL);
204             return;
205         }
206
207         if (o_ptr->sval == SV_LITE_FEANOR) {
208             o_ptr->art_flags.set(TR_LITE_2);
209             return;
210         }
211     }
212 }