1 #include "save/monster-writer.h"
2 #include "load/old/monster-flag-types-savefile50.h"
3 #include "monster-race/monster-race.h"
4 #include "monster/monster-info.h"
5 #include "monster/monster-status.h"
6 #include "save/save-util.h"
7 #include "system/monster-race-definition.h"
8 #include "system/monster-type-definition.h"
9 #include "util/bit-flags-calculator.h"
10 #include "util/enum-converter.h"
11 #include "util/quarks.h"
13 static void write_monster_flags(MonsterEntity *m_ptr, BIT_FLAGS *flags)
15 if (!m_ptr->is_original_ap()) {
16 set_bits(*flags, SaveDataMonsterFlagType::AP_R_IDX);
19 if (m_ptr->sub_align) {
20 set_bits(*flags, SaveDataMonsterFlagType::SUB_ALIGN);
23 if (m_ptr->is_asleep()) {
24 set_bits(*flags, SaveDataMonsterFlagType::CSLEEP);
27 if (m_ptr->is_accelerated()) {
28 set_bits(*flags, SaveDataMonsterFlagType::FAST);
31 if (m_ptr->is_decelerated()) {
32 set_bits(*flags, SaveDataMonsterFlagType::SLOW);
35 if (m_ptr->is_stunned()) {
36 set_bits(*flags, SaveDataMonsterFlagType::STUNNED);
39 if (m_ptr->is_confused()) {
40 set_bits(*flags, SaveDataMonsterFlagType::CONFUSED);
43 if (m_ptr->is_fearful()) {
44 set_bits(*flags, SaveDataMonsterFlagType::MONFEAR);
47 if (m_ptr->target_y) {
48 set_bits(*flags, SaveDataMonsterFlagType::TARGET_Y);
51 if (m_ptr->target_x) {
52 set_bits(*flags, SaveDataMonsterFlagType::TARGET_X);
55 if (m_ptr->is_invulnerable()) {
56 set_bits(*flags, SaveDataMonsterFlagType::INVULNER);
59 if (m_ptr->smart.any()) {
60 set_bits(*flags, SaveDataMonsterFlagType::SMART);
64 set_bits(*flags, SaveDataMonsterFlagType::EXP);
67 if (m_ptr->mflag2.any()) {
68 set_bits(*flags, SaveDataMonsterFlagType::MFLAG2);
71 if (m_ptr->nickname) {
72 set_bits(*flags, SaveDataMonsterFlagType::NICKNAME);
75 if (m_ptr->parent_m_idx) {
76 set_bits(*flags, SaveDataMonsterFlagType::PARENT);
82 static void write_monster_info(MonsterEntity *m_ptr, const BIT_FLAGS flags)
85 if (any_bits(flags, SaveDataMonsterFlagType::FAST)) {
86 tmp8u = (byte)m_ptr->mtimed[MTIMED_FAST];
90 if (any_bits(flags, SaveDataMonsterFlagType::SLOW)) {
91 tmp8u = (byte)m_ptr->mtimed[MTIMED_SLOW];
95 if (any_bits(flags, SaveDataMonsterFlagType::STUNNED)) {
96 tmp8u = (byte)m_ptr->mtimed[MTIMED_STUNNED];
100 if (any_bits(flags, SaveDataMonsterFlagType::CONFUSED)) {
101 tmp8u = (byte)m_ptr->mtimed[MTIMED_CONFUSED];
105 if (any_bits(flags, SaveDataMonsterFlagType::MONFEAR)) {
106 tmp8u = (byte)m_ptr->mtimed[MTIMED_MONFEAR];
110 if (any_bits(flags, SaveDataMonsterFlagType::TARGET_Y)) {
111 wr_s16b((int16_t)m_ptr->target_y);
114 if (any_bits(flags, SaveDataMonsterFlagType::TARGET_X)) {
115 wr_s16b((int16_t)m_ptr->target_x);
118 if (any_bits(flags, SaveDataMonsterFlagType::INVULNER)) {
119 tmp8u = (byte)m_ptr->mtimed[MTIMED_INVULNER];
123 if (any_bits(flags, SaveDataMonsterFlagType::SMART)) {
124 wr_FlagGroup(m_ptr->smart, wr_byte);
127 if (any_bits(flags, SaveDataMonsterFlagType::EXP)) {
131 if (any_bits(flags, SaveDataMonsterFlagType::MFLAG2)) {
132 wr_FlagGroup(m_ptr->mflag2, wr_byte);
135 if (any_bits(flags, SaveDataMonsterFlagType::NICKNAME)) {
136 wr_string(quark_str(m_ptr->nickname));
139 if (any_bits(flags, SaveDataMonsterFlagType::PARENT)) {
140 wr_s16b(m_ptr->parent_m_idx);
145 * @brief モンスター情報を書き込む / Write a "monster" record
146 * @param m_ptr モンスター情報保存元ポインタ
148 void wr_monster(MonsterEntity *m_ptr)
150 BIT_FLAGS flags = 0x00000000;
151 write_monster_flags(m_ptr, &flags);
153 wr_s16b(enum2i(m_ptr->r_idx));
154 wr_byte((byte)m_ptr->fy);
155 wr_byte((byte)m_ptr->fx);
156 wr_s16b((int16_t)m_ptr->hp);
157 wr_s16b((int16_t)m_ptr->maxhp);
158 wr_s16b((int16_t)m_ptr->max_maxhp);
159 wr_u32b(m_ptr->dealt_damage);
161 if (any_bits(flags, SaveDataMonsterFlagType::AP_R_IDX)) {
162 wr_s16b(enum2i(m_ptr->ap_r_idx));
165 if (any_bits(flags, SaveDataMonsterFlagType::SUB_ALIGN)) {
166 wr_byte(m_ptr->sub_align);
169 if (any_bits(flags, SaveDataMonsterFlagType::CSLEEP)) {
170 wr_s16b(m_ptr->mtimed[MTIMED_CSLEEP]);
173 wr_byte((byte)m_ptr->mspeed);
174 wr_s16b(m_ptr->energy_need);
175 write_monster_info(m_ptr, flags);
179 * @brief モンスターの思い出を書き込む / Write a "lore" record
180 * @param r_idx モンスター種族ID
182 void wr_lore(MonsterRaceId r_idx)
184 auto *r_ptr = &monraces_info[r_idx];
185 wr_s16b((int16_t)r_ptr->r_sights);
186 wr_s16b((int16_t)r_ptr->r_deaths);
187 wr_s16b((int16_t)r_ptr->r_pkills);
188 wr_s16b((int16_t)r_ptr->r_akills);
189 wr_s16b((int16_t)r_ptr->r_tkills);
191 wr_byte(r_ptr->r_wake);
192 wr_byte(r_ptr->r_ignore);
194 byte tmp8u = r_ptr->r_can_evolve ? 1 : 0;
197 wr_byte((byte)r_ptr->r_drop_gold);
198 wr_byte((byte)r_ptr->r_drop_item);
200 wr_byte(0); /* unused now */
201 wr_byte(r_ptr->r_cast_spell);
203 wr_byte(r_ptr->r_blows[0]);
204 wr_byte(r_ptr->r_blows[1]);
205 wr_byte(r_ptr->r_blows[2]);
206 wr_byte(r_ptr->r_blows[3]);
208 wr_u32b(r_ptr->r_flags1);
209 wr_u32b(r_ptr->r_flags2);
210 wr_u32b(r_ptr->r_flags3);
211 wr_FlagGroup(r_ptr->r_resistance_flags, wr_byte);
212 wr_FlagGroup(r_ptr->r_ability_flags, wr_byte);
213 wr_FlagGroup(r_ptr->r_aura_flags, wr_byte);
214 wr_FlagGroup(r_ptr->r_behavior_flags, wr_byte);
215 wr_FlagGroup(r_ptr->r_kind_flags, wr_byte);
216 wr_FlagGroup(r_ptr->r_drop_flags, wr_byte);
217 wr_FlagGroup(r_ptr->r_feature_flags, wr_byte);
219 wr_byte((byte)r_ptr->max_num);
220 wr_s16b(r_ptr->floor_id);
222 wr_s16b(r_ptr->defeat_level);
223 wr_u32b(r_ptr->defeat_time);