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"
17 static void migrate_old_feature_flags(MonsterRaceInfo *r_ptr, BIT_FLAGS old_flags)
19 if (any_bits(old_flags, enum2i(SavedataLoreOlderThan19FlagType::RF2_PASS_WALL))) {
20 r_ptr->r_feature_flags.set(MonsterFeatureType::PASS_WALL);
22 if (any_bits(old_flags, enum2i(SavedataLoreOlderThan19FlagType::RF2_KILL_WALL))) {
23 r_ptr->r_feature_flags.set(MonsterFeatureType::KILL_WALL);
27 static void migrate_old_aura_flags(MonsterRaceInfo *r_ptr)
29 if (any_bits(r_ptr->r_flags2, SavedataLoreOlderThan10FlagType::AURA_FIRE_OLD)) {
30 r_ptr->r_aura_flags.set(MonsterAuraType::FIRE);
33 if (any_bits(r_ptr->r_flags3, SavedataLoreOlderThan10FlagType::AURA_COLD_OLD)) {
34 r_ptr->r_aura_flags.set(MonsterAuraType::COLD);
37 if (any_bits(r_ptr->r_flags2, SavedataLoreOlderThan10FlagType::AURA_ELEC_OLD)) {
38 r_ptr->r_aura_flags.set(MonsterAuraType::ELEC);
42 static void migrate_old_resistance_flags(MonsterRaceInfo *r_ptr, BIT_FLAGS old_flags)
44 struct flag_list_ver14 {
45 SavedataLoreOlderThan14FlagType old_flag;
46 MonsterResistanceType flag;
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 }
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);
83 static void migrate_old_drop_flags(MonsterRaceInfo *r_ptr, BIT_FLAGS old_flags1)
85 struct flag_list_ver18 {
86 SavedataLoreOlderThan18FlagType old_flag;
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 },
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);
110 static void rd_r_drop_flags(MonsterRaceInfo *r_ptr)
112 if (loading_savefile_version_is_older_than(18)) {
113 migrate_old_drop_flags(r_ptr, r_ptr->r_flags1);
117 rd_FlagGroup(r_ptr->r_drop_flags, rd_byte);
120 static void rd_r_ability_flags(MonsterRaceInfo *r_ptr, const MonsterRaceId r_idx)
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);
130 r_flagsr = rd_u32b();
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);
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);
142 migrate_old_resistance_flags(r_ptr, r_flagsr);
144 rd_FlagGroup(r_ptr->r_resistance_flags, rd_byte);
145 rd_FlagGroup(r_ptr->r_ability_flags, rd_byte);
149 static void rd_r_aura_flags(MonsterRaceInfo *r_ptr)
151 if (loading_savefile_version_is_older_than(10)) {
155 rd_FlagGroup(r_ptr->r_aura_flags, rd_byte);
158 static void rd_r_kind_flags(MonsterRaceInfo *r_ptr)
160 if (loading_savefile_version_is_older_than(12)) {
161 struct flag_list_ver12 {
162 BIT_FLAGS check_flag;
163 MonsterKindType flag;
166 const std::vector<flag_list_ver12> flag1 = {
167 { RF1_UNIQUE, MonsterKindType::UNIQUE },
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 },
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 },
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);
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);
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);
212 rd_FlagGroup(r_ptr->r_kind_flags, rd_byte);
215 static void rd_r_behavior_flags(MonsterRaceInfo *r_ptr)
217 if (loading_savefile_version_is_older_than(11)) {
218 struct flag_list_ver11 {
219 BIT_FLAGS check_flag;
220 MonsterBehaviorType flag;
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 },
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 },
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);
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);
256 rd_FlagGroup(r_ptr->r_behavior_flags, rd_byte);
259 static void rd_r_feature_flags(MonsterRaceInfo *r_ptr)
261 if (loading_savefile_version_is_older_than(19)) {
262 migrate_old_feature_flags(r_ptr, r_ptr->r_flags2);
265 rd_FlagGroup(r_ptr->r_feature_flags, rd_byte);
269 * @brief モンスターの思い出を読み込む / Read the monster lore
270 * @param r_ptr 読み込み先モンスター種族情報へのポインタ
271 * @param r_idx 読み込み先モンスターID(種族特定用)
273 static void rd_lore(MonsterRaceInfo *r_ptr, const MonsterRaceId r_idx)
275 r_ptr->r_sights = rd_s16b();
276 r_ptr->r_deaths = rd_s16b();
277 r_ptr->r_pkills = rd_s16b();
279 if (h_older_than(1, 7, 0, 5)) {
280 r_ptr->r_akills = r_ptr->r_pkills;
282 r_ptr->r_akills = rd_s16b();
285 r_ptr->r_tkills = rd_s16b();
287 r_ptr->r_wake = rd_byte();
288 r_ptr->r_ignore = rd_byte();
290 r_ptr->r_can_evolve = rd_byte() > 0;
291 if (loading_savefile_version_is_older_than(6)) {
292 // かつては未使用フラグr_ptr->r_xtra2だった.
296 r_ptr->r_drop_gold = rd_byte();
297 r_ptr->r_drop_item = rd_byte();
300 r_ptr->r_cast_spell = rd_byte();
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();
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();
320 if (!loading_savefile_version_is_older_than(4)) {
321 r_ptr->defeat_level = rd_s16b();
322 r_ptr->defeat_time = rd_u32b();
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;
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);
349 load_note(_("モンスターの思い出をロードしました", "Loaded Monster Memory"));