OSDN Git Service

Merge pull request #2013 from sikabane-works/release/3.0.0Alpha51
[hengbandforosx/hengbandosx.git] / src / load / old / monster-loader-savefile50.cpp
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"
11
12 MonsterLoader50::MonsterLoader50(PlayerType *player_ptr)
13     : player_ptr(player_ptr)
14 {
15 }
16
17 /*!
18  * @brief モンスターを読み込む(v3.0.0 Savefile ver50まで)
19  */
20 void MonsterLoader50::rd_monster(monster_type *m_ptr_)
21 {
22     this->m_ptr = m_ptr_;
23     if (h_older_than(1, 5, 0, 0)) {
24         rd_monster_old(this->player_ptr, this->m_ptr);
25         return;
26     }
27
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();
32
33     this->m_ptr->hp = rd_s16b();
34     this->m_ptr->maxhp = rd_s16b();
35     this->m_ptr->max_maxhp = rd_s16b();
36
37     if (h_older_than(2, 1, 2, 1)) {
38         this->m_ptr->dealt_damage = 0;
39     } else {
40         this->m_ptr->dealt_damage = rd_s32b();
41     }
42
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);
62
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));
70         } else {
71             rd_FlagGroup(this->m_ptr->smart, rd_byte);
72         }
73     } else {
74         this->m_ptr->smart.clear();
75     }
76
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);
83         } else {
84             rd_FlagGroup(this->m_ptr->mflag2, rd_byte);
85         }
86     }
87
88     if (any_bits(flags, SaveDataMonsterFlagType::NICKNAME)) {
89         char buf[128];
90         rd_string(buf, sizeof(buf));
91         this->m_ptr->nickname = quark_add(buf);
92     } else {
93         this->m_ptr->nickname = 0;
94     }
95
96     this->m_ptr->parent_m_idx = any_bits(flags, SaveDataMonsterFlagType::PARENT) ? rd_s16b() : 0;
97 }