1 #include "save/monster-writer.h"
2 #include "load/savedata-flag-types.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-type-definition.h"
8 #include "util/quarks.h"
10 static void write_monster_flags(monster_type *m_ptr, BIT_FLAGS *flags)
12 if (!is_original_ap(m_ptr))
13 *flags |= SAVE_MON_AP_R_IDX;
16 *flags |= SAVE_MON_SUB_ALIGN;
18 if (monster_csleep_remaining(m_ptr))
19 *flags |= SAVE_MON_CSLEEP;
21 if (monster_fast_remaining(m_ptr))
22 *flags |= SAVE_MON_FAST;
24 if (monster_slow_remaining(m_ptr))
25 *flags |= SAVE_MON_SLOW;
27 if (monster_stunned_remaining(m_ptr))
28 *flags |= SAVE_MON_STUNNED;
30 if (monster_confused_remaining(m_ptr))
31 *flags |= SAVE_MON_CONFUSED;
33 if (monster_fear_remaining(m_ptr))
34 *flags |= SAVE_MON_MONFEAR;
37 *flags |= SAVE_MON_TARGET_Y;
40 *flags |= SAVE_MON_TARGET_X;
42 if (monster_invulner_remaining(m_ptr))
43 *flags |= SAVE_MON_INVULNER;
46 *flags |= SAVE_MON_SMART;
49 *flags |= SAVE_MON_EXP;
52 *flags |= SAVE_MON_MFLAG2;
55 *flags |= SAVE_MON_NICKNAME;
57 if (m_ptr->parent_m_idx)
58 *flags |= SAVE_MON_PARENT;
63 static void write_monster_info(monster_type *m_ptr, const BIT_FLAGS flags)
66 if (flags & SAVE_MON_FAST) {
67 tmp8u = (byte)m_ptr->mtimed[MTIMED_FAST];
71 if (flags & SAVE_MON_SLOW) {
72 tmp8u = (byte)m_ptr->mtimed[MTIMED_SLOW];
76 if (flags & SAVE_MON_STUNNED) {
77 tmp8u = (byte)m_ptr->mtimed[MTIMED_STUNNED];
81 if (flags & SAVE_MON_CONFUSED) {
82 tmp8u = (byte)m_ptr->mtimed[MTIMED_CONFUSED];
86 if (flags & SAVE_MON_MONFEAR) {
87 tmp8u = (byte)m_ptr->mtimed[MTIMED_MONFEAR];
91 if (flags & SAVE_MON_TARGET_Y)
92 wr_s16b((s16b)m_ptr->target_y);
94 if (flags & SAVE_MON_TARGET_X)
95 wr_s16b((s16b)m_ptr->target_x);
97 if (flags & SAVE_MON_INVULNER) {
98 tmp8u = (byte)m_ptr->mtimed[MTIMED_INVULNER];
102 if (flags & SAVE_MON_SMART)
103 wr_u32b(m_ptr->smart);
105 if (flags & SAVE_MON_EXP)
108 if (flags & SAVE_MON_MFLAG2)
109 wr_byte(m_ptr->mflag2);
111 if (flags & SAVE_MON_NICKNAME)
112 wr_string(quark_str(m_ptr->nickname));
114 if (flags & SAVE_MON_PARENT)
115 wr_s16b(m_ptr->parent_m_idx);
119 * @brief モンスター情報を書き込む / Write a "monster" record
120 * @param m_ptr モンスター情報保存元ポインタ
123 void wr_monster(monster_type *m_ptr)
125 BIT_FLAGS flags = 0x00000000;
126 write_monster_flags(m_ptr, &flags);
128 wr_s16b(m_ptr->r_idx);
129 wr_byte((byte)m_ptr->fy);
130 wr_byte((byte)m_ptr->fx);
131 wr_s16b((s16b)m_ptr->hp);
132 wr_s16b((s16b)m_ptr->maxhp);
133 wr_s16b((s16b)m_ptr->max_maxhp);
134 wr_u32b(m_ptr->dealt_damage);
136 if (flags & SAVE_MON_AP_R_IDX)
137 wr_s16b(m_ptr->ap_r_idx);
139 if (flags & SAVE_MON_SUB_ALIGN)
140 wr_byte(m_ptr->sub_align);
142 if (flags & SAVE_MON_CSLEEP)
143 wr_s16b(m_ptr->mtimed[MTIMED_CSLEEP]);
145 wr_byte((byte)m_ptr->mspeed);
146 wr_s16b(m_ptr->energy_need);
147 write_monster_info(m_ptr, flags);
151 * @brief モンスターの思い出を書き込む / Write a "lore" record
152 * @param r_idx モンスター種族ID
155 void wr_lore(MONRACE_IDX r_idx)
157 monster_race *r_ptr = &r_info[r_idx];
158 wr_s16b((s16b)r_ptr->r_sights);
159 wr_s16b((s16b)r_ptr->r_deaths);
160 wr_s16b((s16b)r_ptr->r_pkills);
161 wr_s16b((s16b)r_ptr->r_akills);
162 wr_s16b((s16b)r_ptr->r_tkills);
164 wr_byte(r_ptr->r_wake);
165 wr_byte(r_ptr->r_ignore);
167 wr_byte(r_ptr->r_xtra1);
168 wr_byte(r_ptr->r_xtra2);
170 wr_byte((byte)r_ptr->r_drop_gold);
171 wr_byte((byte)r_ptr->r_drop_item);
173 wr_byte(0); /* unused now */
174 wr_byte(r_ptr->r_cast_spell);
176 wr_byte(r_ptr->r_blows[0]);
177 wr_byte(r_ptr->r_blows[1]);
178 wr_byte(r_ptr->r_blows[2]);
179 wr_byte(r_ptr->r_blows[3]);
181 wr_u32b(r_ptr->r_flags1);
182 wr_u32b(r_ptr->r_flags2);
183 wr_u32b(r_ptr->r_flags3);
184 wr_u32b(r_ptr->r_flags4);
185 wr_u32b(r_ptr->r_flags5);
186 wr_u32b(r_ptr->r_flags6);
187 wr_u32b(r_ptr->r_flagsr);
189 wr_byte((byte)r_ptr->max_num);
190 wr_s16b(r_ptr->floor_id);