1 #include "load/old/monster-loader-savefile50.h"
2 #include "load/angband-version-comparer.h"
3 #include "load/load-util.h"
4 #include "load/old/load-v1-5-0.h"
5 #include "load/old/monster-flag-types-savefile50.h"
6 #include "system/monster-type-definition.h"
7 #include "system/player-type-definition.h"
8 #include "util/bit-flags-calculator.h"
9 #include "util/enum-converter.h"
10 #include "util/quarks.h"
12 MonsterLoader50::MonsterLoader50(PlayerType *player_ptr)
13 : player_ptr(player_ptr)
18 * @brief モンスターを読み込む(v3.0.0 Savefile ver50まで)
20 void MonsterLoader50::rd_monster(monster_type *m_ptr_)
23 if (h_older_than(1, 5, 0, 0)) {
24 rd_monster_old(this->player_ptr, this->m_ptr);
28 auto flags = rd_u32b();
29 this->m_ptr->r_idx = rd_s16b();
30 this->m_ptr->fy = rd_byte();
31 this->m_ptr->fx = rd_byte();
33 this->m_ptr->hp = rd_s16b();
34 this->m_ptr->maxhp = rd_s16b();
35 this->m_ptr->max_maxhp = rd_s16b();
37 if (h_older_than(2, 1, 2, 1)) {
38 this->m_ptr->dealt_damage = 0;
40 this->m_ptr->dealt_damage = rd_s32b();
43 this->m_ptr->ap_r_idx = any_bits(flags, SaveDataMonsterFlagType::AP_R_IDX) ? rd_s16b() : this->m_ptr->r_idx;
44 this->m_ptr->sub_align = any_bits(flags, SaveDataMonsterFlagType::SUB_ALIGN) ? rd_byte() : 0;
45 this->m_ptr->mtimed[MTIMED_CSLEEP] = any_bits(flags, SaveDataMonsterFlagType::CSLEEP) ? rd_s16b() : 0;
46 this->m_ptr->mspeed = rd_byte();
47 this->m_ptr->energy_need = rd_s16b();
48 this->m_ptr->mtimed[MTIMED_FAST] = any_bits(flags, SaveDataMonsterFlagType::FAST) ? rd_byte() : 0;
49 this->m_ptr->mtimed[MTIMED_SLOW] = any_bits(flags, SaveDataMonsterFlagType::SLOW) ? rd_byte() : 0;
50 this->m_ptr->mtimed[MTIMED_STUNNED] = any_bits(flags, SaveDataMonsterFlagType::STUNNED) ? rd_byte() : 0;
51 this->m_ptr->mtimed[MTIMED_CONFUSED] = any_bits(flags, SaveDataMonsterFlagType::CONFUSED) ? rd_byte() : 0;
52 this->m_ptr->mtimed[MTIMED_MONFEAR] = any_bits(flags, SaveDataMonsterFlagType::MONFEAR) ? rd_byte() : 0;
53 this->m_ptr->target_y = any_bits(flags, SaveDataMonsterFlagType::TARGET_Y) ? rd_s16b() : 0;
54 this->m_ptr->target_x = any_bits(flags, SaveDataMonsterFlagType::TARGET_X) ? rd_s16b() : 0;
55 this->m_ptr->mtimed[MTIMED_INVULNER] = any_bits(flags, SaveDataMonsterFlagType::INVULNER) ? rd_byte() : 0;
56 this->m_ptr->mflag.clear();
57 this->m_ptr->mflag2.clear();
58 if (any_bits(flags, SaveDataMonsterFlagType::SMART)) {
59 if (loading_savefile_version_is_older_than(2)) {
60 auto tmp32u = rd_u32b();
61 migrate_bitflag_to_flaggroup(this->m_ptr->smart, tmp32u);
63 // 3.0.0Alpha10以前のSM_CLONED(ビット位置22)、SM_PET(23)、SM_FRIEDLY(28)をMFLAG2に移行する
64 // ビット位置の定義はなくなるので、ビット位置の値をハードコードする。
65 std::bitset<32> rd_bits(tmp32u);
66 this->m_ptr->mflag2[MonsterConstantFlagType::CLONED] = rd_bits[22];
67 this->m_ptr->mflag2[MonsterConstantFlagType::PET] = rd_bits[23];
68 this->m_ptr->mflag2[MonsterConstantFlagType::FRIENDLY] = rd_bits[28];
69 this->m_ptr->smart.reset(i2enum<MonsterSmartLearnType>(22)).reset(i2enum<MonsterSmartLearnType>(23)).reset(i2enum<MonsterSmartLearnType>(28));
71 rd_FlagGroup(this->m_ptr->smart, rd_byte);
74 this->m_ptr->smart.clear();
77 this->m_ptr->exp = any_bits(flags, SaveDataMonsterFlagType::EXP) ? rd_u32b() : 0;
78 if (any_bits(flags, SaveDataMonsterFlagType::MFLAG2)) {
79 if (loading_savefile_version_is_older_than(2)) {
80 auto tmp8u = rd_byte();
81 constexpr auto base = enum2i(MonsterConstantFlagType::KAGE);
82 migrate_bitflag_to_flaggroup(this->m_ptr->mflag2, tmp8u, base, 7);
84 rd_FlagGroup(this->m_ptr->mflag2, rd_byte);
88 if (any_bits(flags, SaveDataMonsterFlagType::NICKNAME)) {
90 rd_string(buf, sizeof(buf));
91 this->m_ptr->nickname = quark_add(buf);
93 this->m_ptr->nickname = 0;
96 this->m_ptr->parent_m_idx = any_bits(flags, SaveDataMonsterFlagType::PARENT) ? rd_s16b() : 0;