OSDN Git Service

[Refactor] #2628 Renamed object-type-definition.cpp/h to item-entity.cpp/h
[hengbandforosx/hengbandosx.git] / src / save / monster-writer.cpp
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"
12
13 static void write_monster_flags(MonsterEntity *m_ptr, BIT_FLAGS *flags)
14 {
15     if (!m_ptr->is_original_ap()) {
16         set_bits(*flags, SaveDataMonsterFlagType::AP_R_IDX);
17     }
18
19     if (m_ptr->sub_align) {
20         set_bits(*flags, SaveDataMonsterFlagType::SUB_ALIGN);
21     }
22
23     if (m_ptr->is_asleep()) {
24         set_bits(*flags, SaveDataMonsterFlagType::CSLEEP);
25     }
26
27     if (m_ptr->is_accelerated()) {
28         set_bits(*flags, SaveDataMonsterFlagType::FAST);
29     }
30
31     if (m_ptr->is_decelerated()) {
32         set_bits(*flags, SaveDataMonsterFlagType::SLOW);
33     }
34
35     if (m_ptr->is_stunned()) {
36         set_bits(*flags, SaveDataMonsterFlagType::STUNNED);
37     }
38
39     if (m_ptr->is_confused()) {
40         set_bits(*flags, SaveDataMonsterFlagType::CONFUSED);
41     }
42
43     if (m_ptr->is_fearful()) {
44         set_bits(*flags, SaveDataMonsterFlagType::MONFEAR);
45     }
46
47     if (m_ptr->target_y) {
48         set_bits(*flags, SaveDataMonsterFlagType::TARGET_Y);
49     }
50
51     if (m_ptr->target_x) {
52         set_bits(*flags, SaveDataMonsterFlagType::TARGET_X);
53     }
54
55     if (m_ptr->is_invulnerable()) {
56         set_bits(*flags, SaveDataMonsterFlagType::INVULNER);
57     }
58
59     if (m_ptr->smart.any()) {
60         set_bits(*flags, SaveDataMonsterFlagType::SMART);
61     }
62
63     if (m_ptr->exp) {
64         set_bits(*flags, SaveDataMonsterFlagType::EXP);
65     }
66
67     if (m_ptr->mflag2.any()) {
68         set_bits(*flags, SaveDataMonsterFlagType::MFLAG2);
69     }
70
71     if (m_ptr->nickname) {
72         set_bits(*flags, SaveDataMonsterFlagType::NICKNAME);
73     }
74
75     if (m_ptr->parent_m_idx) {
76         set_bits(*flags, SaveDataMonsterFlagType::PARENT);
77     }
78
79     wr_u32b(*flags);
80 }
81
82 static void write_monster_info(MonsterEntity *m_ptr, const BIT_FLAGS flags)
83 {
84     byte tmp8u;
85     if (any_bits(flags, SaveDataMonsterFlagType::FAST)) {
86         tmp8u = (byte)m_ptr->mtimed[MTIMED_FAST];
87         wr_byte(tmp8u);
88     }
89
90     if (any_bits(flags, SaveDataMonsterFlagType::SLOW)) {
91         tmp8u = (byte)m_ptr->mtimed[MTIMED_SLOW];
92         wr_byte(tmp8u);
93     }
94
95     if (any_bits(flags, SaveDataMonsterFlagType::STUNNED)) {
96         tmp8u = (byte)m_ptr->mtimed[MTIMED_STUNNED];
97         wr_byte(tmp8u);
98     }
99
100     if (any_bits(flags, SaveDataMonsterFlagType::CONFUSED)) {
101         tmp8u = (byte)m_ptr->mtimed[MTIMED_CONFUSED];
102         wr_byte(tmp8u);
103     }
104
105     if (any_bits(flags, SaveDataMonsterFlagType::MONFEAR)) {
106         tmp8u = (byte)m_ptr->mtimed[MTIMED_MONFEAR];
107         wr_byte(tmp8u);
108     }
109
110     if (any_bits(flags, SaveDataMonsterFlagType::TARGET_Y)) {
111         wr_s16b((int16_t)m_ptr->target_y);
112     }
113
114     if (any_bits(flags, SaveDataMonsterFlagType::TARGET_X)) {
115         wr_s16b((int16_t)m_ptr->target_x);
116     }
117
118     if (any_bits(flags, SaveDataMonsterFlagType::INVULNER)) {
119         tmp8u = (byte)m_ptr->mtimed[MTIMED_INVULNER];
120         wr_byte(tmp8u);
121     }
122
123     if (any_bits(flags, SaveDataMonsterFlagType::SMART)) {
124         wr_FlagGroup(m_ptr->smart, wr_byte);
125     }
126
127     if (any_bits(flags, SaveDataMonsterFlagType::EXP)) {
128         wr_u32b(m_ptr->exp);
129     }
130
131     if (any_bits(flags, SaveDataMonsterFlagType::MFLAG2)) {
132         wr_FlagGroup(m_ptr->mflag2, wr_byte);
133     }
134
135     if (any_bits(flags, SaveDataMonsterFlagType::NICKNAME)) {
136         wr_string(quark_str(m_ptr->nickname));
137     }
138
139     if (any_bits(flags, SaveDataMonsterFlagType::PARENT)) {
140         wr_s16b(m_ptr->parent_m_idx);
141     }
142 }
143
144 /*!
145  * @brief モンスター情報を書き込む / Write a "monster" record
146  * @param m_ptr モンスター情報保存元ポインタ
147  */
148 void wr_monster(MonsterEntity *m_ptr)
149 {
150     BIT_FLAGS flags = 0x00000000;
151     write_monster_flags(m_ptr, &flags);
152
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);
160
161     if (any_bits(flags, SaveDataMonsterFlagType::AP_R_IDX)) {
162         wr_s16b(enum2i(m_ptr->ap_r_idx));
163     }
164
165     if (any_bits(flags, SaveDataMonsterFlagType::SUB_ALIGN)) {
166         wr_byte(m_ptr->sub_align);
167     }
168
169     if (any_bits(flags, SaveDataMonsterFlagType::CSLEEP)) {
170         wr_s16b(m_ptr->mtimed[MTIMED_CSLEEP]);
171     }
172
173     wr_byte((byte)m_ptr->mspeed);
174     wr_s16b(m_ptr->energy_need);
175     write_monster_info(m_ptr, flags);
176 }
177
178 /*!
179  * @brief モンスターの思い出を書き込む / Write a "lore" record
180  * @param r_idx モンスター種族ID
181  */
182 void wr_lore(MonsterRaceId r_idx)
183 {
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);
190
191     wr_byte(r_ptr->r_wake);
192     wr_byte(r_ptr->r_ignore);
193
194     byte tmp8u = r_ptr->r_can_evolve ? 1 : 0;
195     wr_byte(tmp8u);
196
197     wr_byte((byte)r_ptr->r_drop_gold);
198     wr_byte((byte)r_ptr->r_drop_item);
199
200     wr_byte(0); /* unused now */
201     wr_byte(r_ptr->r_cast_spell);
202
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]);
207
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);
218
219     wr_byte((byte)r_ptr->max_num);
220     wr_s16b(r_ptr->floor_id);
221
222     wr_s16b(r_ptr->defeat_level);
223     wr_u32b(r_ptr->defeat_time);
224     wr_byte(0);
225 }