OSDN Git Service

Merge pull request #3569 from sikabane-works/release/3.0.0.88-alpha
[hengbandforosx/hengbandosx.git] / src / load / lore-loader.cpp
1 #include "load/lore-loader.h"
2 #include "game-option/runtime-arguments.h"
3 #include "load/angband-version-comparer.h"
4 #include "load/load-util.h"
5 #include "load/old/load-v1-5-0.h"
6 #include "load/savedata-old-flag-types.h"
7 #include "monster-race/monster-race.h"
8 #include "monster-race/race-flags1.h"
9 #include "monster-race/race-flags2.h"
10 #include "monster-race/race-flags3.h"
11 #include "monster-race/race-flags7.h"
12 #include "system/angband.h"
13 #include "system/monster-race-info.h"
14 #include "util/bit-flags-calculator.h"
15 #include "util/enum-converter.h"
16
17 static void migrate_old_feature_flags(MonsterRaceInfo *r_ptr, BIT_FLAGS old_flags)
18 {
19     if (any_bits(old_flags, enum2i(SavedataLoreOlderThan19FlagType::RF2_PASS_WALL))) {
20         r_ptr->r_feature_flags.set(MonsterFeatureType::PASS_WALL);
21     }
22     if (any_bits(old_flags, enum2i(SavedataLoreOlderThan19FlagType::RF2_KILL_WALL))) {
23         r_ptr->r_feature_flags.set(MonsterFeatureType::KILL_WALL);
24     }
25 }
26
27 static void migrate_old_aura_flags(MonsterRaceInfo *r_ptr)
28 {
29     if (any_bits(r_ptr->r_flags2, SavedataLoreOlderThan10FlagType::AURA_FIRE_OLD)) {
30         r_ptr->r_aura_flags.set(MonsterAuraType::FIRE);
31     }
32
33     if (any_bits(r_ptr->r_flags3, SavedataLoreOlderThan10FlagType::AURA_COLD_OLD)) {
34         r_ptr->r_aura_flags.set(MonsterAuraType::COLD);
35     }
36
37     if (any_bits(r_ptr->r_flags2, SavedataLoreOlderThan10FlagType::AURA_ELEC_OLD)) {
38         r_ptr->r_aura_flags.set(MonsterAuraType::ELEC);
39     }
40 }
41
42 static void migrate_old_resistance_flags(MonsterRaceInfo *r_ptr, BIT_FLAGS old_flags)
43 {
44     struct flag_list_ver14 {
45         SavedataLoreOlderThan14FlagType old_flag;
46         MonsterResistanceType flag;
47     };
48     const std::vector<flag_list_ver14> flag_list = {
49         { SavedataLoreOlderThan14FlagType::RFR_IM_ACID, MonsterResistanceType::IMMUNE_ACID },
50         { SavedataLoreOlderThan14FlagType::RFR_IM_ELEC, MonsterResistanceType::IMMUNE_ELEC },
51         { SavedataLoreOlderThan14FlagType::RFR_IM_FIRE, MonsterResistanceType::IMMUNE_FIRE },
52         { SavedataLoreOlderThan14FlagType::RFR_IM_COLD, MonsterResistanceType::IMMUNE_COLD },
53         { SavedataLoreOlderThan14FlagType::RFR_IM_POIS, MonsterResistanceType::IMMUNE_POISON },
54         { SavedataLoreOlderThan14FlagType::RFR_RES_LITE, MonsterResistanceType::RESIST_LITE },
55         { SavedataLoreOlderThan14FlagType::RFR_RES_DARK, MonsterResistanceType::RESIST_DARK },
56         { SavedataLoreOlderThan14FlagType::RFR_RES_NETH, MonsterResistanceType::RESIST_NETHER },
57         { SavedataLoreOlderThan14FlagType::RFR_RES_WATE, MonsterResistanceType::RESIST_WATER },
58         { SavedataLoreOlderThan14FlagType::RFR_RES_PLAS, MonsterResistanceType::RESIST_PLASMA },
59         { SavedataLoreOlderThan14FlagType::RFR_RES_SHAR, MonsterResistanceType::RESIST_SHARDS },
60         { SavedataLoreOlderThan14FlagType::RFR_RES_SOUN, MonsterResistanceType::RESIST_SOUND },
61         { SavedataLoreOlderThan14FlagType::RFR_RES_CHAO, MonsterResistanceType::RESIST_CHAOS },
62         { SavedataLoreOlderThan14FlagType::RFR_RES_NEXU, MonsterResistanceType::RESIST_NEXUS },
63         { SavedataLoreOlderThan14FlagType::RFR_RES_DISE, MonsterResistanceType::RESIST_DISENCHANT },
64         { SavedataLoreOlderThan14FlagType::RFR_RES_WALL, MonsterResistanceType::RESIST_FORCE },
65         { SavedataLoreOlderThan14FlagType::RFR_RES_INER, MonsterResistanceType::RESIST_INERTIA },
66         { SavedataLoreOlderThan14FlagType::RFR_RES_TIME, MonsterResistanceType::RESIST_TIME },
67         { SavedataLoreOlderThan14FlagType::RFR_RES_GRAV, MonsterResistanceType::RESIST_GRAVITY },
68         { SavedataLoreOlderThan14FlagType::RFR_RES_ALL, MonsterResistanceType::RESIST_ALL },
69         { SavedataLoreOlderThan14FlagType::RFR_RES_TELE, MonsterResistanceType::RESIST_TELEPORT }
70     };
71
72     if (old_flags == 0) {
73         return;
74     }
75
76     for (const auto &f : flag_list) {
77         if (any_bits(old_flags, f.old_flag)) {
78             r_ptr->r_resistance_flags.set(f.flag);
79         }
80     }
81 }
82
83 static void migrate_old_drop_flags(MonsterRaceInfo *r_ptr, BIT_FLAGS old_flags1)
84 {
85     struct flag_list_ver18 {
86         SavedataLoreOlderThan18FlagType old_flag;
87         MonsterDropType flag;
88     };
89
90     std::vector<flag_list_ver18> flag_list = {
91         { SavedataLoreOlderThan18FlagType::RF1_ONLY_GOLD, MonsterDropType::ONLY_GOLD },
92         { SavedataLoreOlderThan18FlagType::RF1_ONLY_ITEM, MonsterDropType::ONLY_ITEM },
93         { SavedataLoreOlderThan18FlagType::RF1_DROP_GOOD, MonsterDropType::DROP_GOOD },
94         { SavedataLoreOlderThan18FlagType::RF1_DROP_GREAT, MonsterDropType::DROP_GREAT },
95         { SavedataLoreOlderThan18FlagType::RF1_DROP_60, MonsterDropType::DROP_60 },
96         { SavedataLoreOlderThan18FlagType::RF1_DROP_90, MonsterDropType::DROP_90 },
97         { SavedataLoreOlderThan18FlagType::RF1_DROP_1D2, MonsterDropType::DROP_1D2 },
98         { SavedataLoreOlderThan18FlagType::RF1_DROP_2D2, MonsterDropType::DROP_2D2 },
99         { SavedataLoreOlderThan18FlagType::RF1_DROP_3D2, MonsterDropType::DROP_3D2 },
100         { SavedataLoreOlderThan18FlagType::RF1_DROP_4D2, MonsterDropType::DROP_4D2 },
101     };
102
103     for (const auto &l : flag_list) {
104         if (any_bits(old_flags1, enum2i(l.old_flag))) {
105             r_ptr->r_drop_flags.set(l.flag);
106         }
107     }
108 }
109
110 static void rd_r_drop_flags(MonsterRaceInfo *r_ptr)
111 {
112     if (loading_savefile_version_is_older_than(18)) {
113         migrate_old_drop_flags(r_ptr, r_ptr->r_flags1);
114         return;
115     }
116
117     rd_FlagGroup(r_ptr->r_drop_flags, rd_byte);
118 }
119
120 static void rd_r_ability_flags(MonsterRaceInfo *r_ptr, const MonsterRaceId r_idx)
121 {
122     if (loading_savefile_version_is_older_than(3)) {
123         BIT_FLAGS r_flagsr = 0;
124         uint32_t f4 = rd_u32b();
125         uint32_t f5 = rd_u32b();
126         uint32_t f6 = rd_u32b();
127         if (h_older_than(1, 5, 0, 3)) {
128             set_old_lore(r_ptr, f4, r_idx);
129         } else {
130             r_flagsr = rd_u32b();
131         }
132
133         migrate_bitflag_to_flaggroup(r_ptr->r_ability_flags, f4, sizeof(uint32_t) * 8 * 0);
134         migrate_bitflag_to_flaggroup(r_ptr->r_ability_flags, f5, sizeof(uint32_t) * 8 * 1);
135         migrate_bitflag_to_flaggroup(r_ptr->r_ability_flags, f6, sizeof(uint32_t) * 8 * 2);
136
137         migrate_old_resistance_flags(r_ptr, r_flagsr);
138     } else if (loading_savefile_version_is_older_than(14)) {
139         BIT_FLAGS r_flagsr = rd_u32b();
140         rd_FlagGroup(r_ptr->r_ability_flags, rd_byte);
141
142         migrate_old_resistance_flags(r_ptr, r_flagsr);
143     } else {
144         rd_FlagGroup(r_ptr->r_resistance_flags, rd_byte);
145         rd_FlagGroup(r_ptr->r_ability_flags, rd_byte);
146     }
147 }
148
149 static void rd_r_aura_flags(MonsterRaceInfo *r_ptr)
150 {
151     if (loading_savefile_version_is_older_than(10)) {
152         return;
153     }
154
155     rd_FlagGroup(r_ptr->r_aura_flags, rd_byte);
156 }
157
158 static void rd_r_kind_flags(MonsterRaceInfo *r_ptr)
159 {
160     if (loading_savefile_version_is_older_than(12)) {
161         struct flag_list_ver12 {
162             BIT_FLAGS check_flag;
163             MonsterKindType flag;
164         };
165
166         const std::vector<flag_list_ver12> flag1 = {
167             { RF1_UNIQUE, MonsterKindType::UNIQUE },
168         };
169
170         const std::vector<flag_list_ver12> flag2 = {
171             { static_cast<BIT_FLAGS>(RF2_HUMAN), MonsterKindType::HUMAN },
172             { static_cast<BIT_FLAGS>(RF2_QUANTUM), MonsterKindType::QUANTUM },
173         };
174
175         const std::vector<flag_list_ver12> flag3 = {
176             { RF3_ORC, MonsterKindType::ORC },
177             { RF3_TROLL, MonsterKindType::TROLL },
178             { RF3_GIANT, MonsterKindType::GIANT },
179             { RF3_DRAGON, MonsterKindType::DRAGON },
180             { RF3_DEMON, MonsterKindType::DEMON },
181             { RF3_AMBERITE, MonsterKindType::AMBERITE },
182             { RF3_ANGEL, MonsterKindType::ANGEL },
183             { RF3_DRAGON, MonsterKindType::DRAGON },
184             { RF3_EVIL, MonsterKindType::EVIL },
185             { RF3_GOOD, MonsterKindType::GOOD },
186             { RF3_ANIMAL, MonsterKindType::ANIMAL },
187             { RF3_UNDEAD, MonsterKindType::UNDEAD },
188
189         };
190
191         for (const auto &f : flag1) {
192             if (any_bits(r_ptr->r_flags1, f.check_flag)) {
193                 r_ptr->r_kind_flags.set(f.flag);
194             }
195         }
196
197         for (const auto &f : flag2) {
198             if (any_bits(r_ptr->r_flags2, f.check_flag)) {
199                 r_ptr->r_kind_flags.set(f.flag);
200             }
201         }
202
203         for (const auto &f : flag3) {
204             if (any_bits(r_ptr->r_flags3, f.check_flag)) {
205                 r_ptr->r_kind_flags.set(f.flag);
206             }
207         }
208
209         return;
210     }
211
212     rd_FlagGroup(r_ptr->r_kind_flags, rd_byte);
213 }
214
215 static void rd_r_behavior_flags(MonsterRaceInfo *r_ptr)
216 {
217     if (loading_savefile_version_is_older_than(11)) {
218         struct flag_list_ver11 {
219             BIT_FLAGS check_flag;
220             MonsterBehaviorType flag;
221         };
222
223         const std::vector<flag_list_ver11> flag1 = {
224             { RF1_NEVER_BLOW, MonsterBehaviorType::NEVER_BLOW },
225             { RF1_NEVER_MOVE, MonsterBehaviorType::NEVER_MOVE },
226             { RF1_RAND_25, MonsterBehaviorType::RAND_MOVE_25 },
227             { RF1_RAND_50, MonsterBehaviorType::RAND_MOVE_50 },
228         };
229
230         const std::vector<flag_list_ver11> flag2 = {
231             { RF2_OPEN_DOOR, MonsterBehaviorType::OPEN_DOOR },
232             { RF2_BASH_DOOR, MonsterBehaviorType::BASH_DOOR },
233             { RF2_MOVE_BODY, MonsterBehaviorType::MOVE_BODY },
234             { RF2_KILL_BODY, MonsterBehaviorType::KILL_BODY },
235             { RF2_TAKE_ITEM, MonsterBehaviorType::TAKE_ITEM },
236             { RF2_KILL_ITEM, MonsterBehaviorType::KILL_ITEM },
237             { RF2_STUPID, MonsterBehaviorType::STUPID },
238             { RF2_SMART, MonsterBehaviorType::SMART },
239         };
240
241         for (const auto &f : flag1) {
242             if (any_bits(r_ptr->r_flags1, f.check_flag)) {
243                 r_ptr->r_behavior_flags.set(f.flag);
244             }
245         }
246
247         for (const auto &f : flag2) {
248             if (any_bits(r_ptr->r_flags2, f.check_flag)) {
249                 r_ptr->r_behavior_flags.set(f.flag);
250             }
251         }
252
253         return;
254     }
255
256     rd_FlagGroup(r_ptr->r_behavior_flags, rd_byte);
257 }
258
259 static void rd_r_feature_flags(MonsterRaceInfo *r_ptr)
260 {
261     if (loading_savefile_version_is_older_than(19)) {
262         migrate_old_feature_flags(r_ptr, r_ptr->r_flags2);
263         return;
264     }
265     rd_FlagGroup(r_ptr->r_feature_flags, rd_byte);
266 }
267
268 /*!
269  * @brief モンスターの思い出を読み込む / Read the monster lore
270  * @param r_ptr 読み込み先モンスター種族情報へのポインタ
271  * @param r_idx 読み込み先モンスターID(種族特定用)
272  */
273 static void rd_lore(MonsterRaceInfo *r_ptr, const MonsterRaceId r_idx)
274 {
275     r_ptr->r_sights = rd_s16b();
276     r_ptr->r_deaths = rd_s16b();
277     r_ptr->r_pkills = rd_s16b();
278
279     if (h_older_than(1, 7, 0, 5)) {
280         r_ptr->r_akills = r_ptr->r_pkills;
281     } else {
282         r_ptr->r_akills = rd_s16b();
283     }
284
285     r_ptr->r_tkills = rd_s16b();
286
287     r_ptr->r_wake = rd_byte();
288     r_ptr->r_ignore = rd_byte();
289
290     r_ptr->r_can_evolve = rd_byte() > 0;
291     if (loading_savefile_version_is_older_than(6)) {
292         // かつては未使用フラグr_ptr->r_xtra2だった.
293         strip_bytes(1);
294     }
295
296     r_ptr->r_drop_gold = rd_byte();
297     r_ptr->r_drop_item = rd_byte();
298
299     strip_bytes(1);
300     r_ptr->r_cast_spell = rd_byte();
301
302     r_ptr->r_blows[0] = rd_byte();
303     r_ptr->r_blows[1] = rd_byte();
304     r_ptr->r_blows[2] = rd_byte();
305     r_ptr->r_blows[3] = rd_byte();
306
307     r_ptr->r_flags1 = rd_u32b();
308     r_ptr->r_flags2 = rd_u32b();
309     r_ptr->r_flags3 = rd_u32b();
310     migrate_old_aura_flags(r_ptr);
311     rd_r_ability_flags(r_ptr, r_idx);
312     rd_r_aura_flags(r_ptr);
313     rd_r_behavior_flags(r_ptr);
314     rd_r_kind_flags(r_ptr);
315     rd_r_drop_flags(r_ptr);
316     rd_r_feature_flags(r_ptr);
317     r_ptr->max_num = rd_byte();
318     r_ptr->floor_id = rd_s16b();
319
320     if (!loading_savefile_version_is_older_than(4)) {
321         r_ptr->defeat_level = rd_s16b();
322         r_ptr->defeat_time = rd_u32b();
323     }
324
325     strip_bytes(1);
326
327     r_ptr->r_flags1 &= r_ptr->flags1;
328     r_ptr->r_flags2 &= r_ptr->flags2;
329     r_ptr->r_flags3 &= r_ptr->flags3;
330     r_ptr->r_resistance_flags &= r_ptr->resistance_flags;
331     r_ptr->r_ability_flags &= r_ptr->ability_flags;
332     r_ptr->r_aura_flags &= r_ptr->aura_flags;
333     r_ptr->r_behavior_flags &= r_ptr->behavior_flags;
334     r_ptr->r_drop_flags &= r_ptr->drop_flags;
335     r_ptr->r_kind_flags &= r_ptr->kind_flags;
336     r_ptr->r_feature_flags &= r_ptr->feature_flags;
337 }
338
339 void load_lore(void)
340 {
341     auto loading_max_r_idx = rd_u16b();
342     MonsterRaceInfo dummy;
343     for (auto i = 0U; i < loading_max_r_idx; i++) {
344         auto r_idx = static_cast<MonsterRaceId>(i);
345         auto *r_ptr = i < monraces_info.size() ? &monraces_info[r_idx] : &dummy;
346         rd_lore(r_ptr, r_idx);
347     }
348
349     load_note(_("モンスターの思い出をロードしました", "Loaded Monster Memory"));
350 }