OSDN Git Service

[fix] #41503 超能力者でゲームを開始しようとするとクラッシュ
[hengband/hengband.git] / src / save / monster-writer.c
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"
9
10 static void write_monster_flags(monster_type *m_ptr, BIT_FLAGS *flags)
11 {
12     if (!is_original_ap(m_ptr))
13         *flags |= SAVE_MON_AP_R_IDX;
14
15     if (m_ptr->sub_align)
16         *flags |= SAVE_MON_SUB_ALIGN;
17
18     if (monster_csleep_remaining(m_ptr))
19         *flags |= SAVE_MON_CSLEEP;
20
21     if (monster_fast_remaining(m_ptr))
22         *flags |= SAVE_MON_FAST;
23
24     if (monster_slow_remaining(m_ptr))
25         *flags |= SAVE_MON_SLOW;
26
27     if (monster_stunned_remaining(m_ptr))
28         *flags |= SAVE_MON_STUNNED;
29
30     if (monster_confused_remaining(m_ptr))
31         *flags |= SAVE_MON_CONFUSED;
32
33     if (monster_fear_remaining(m_ptr))
34         *flags |= SAVE_MON_MONFEAR;
35
36     if (m_ptr->target_y)
37         *flags |= SAVE_MON_TARGET_Y;
38
39     if (m_ptr->target_x)
40         *flags |= SAVE_MON_TARGET_X;
41
42     if (monster_invulner_remaining(m_ptr))
43         *flags |= SAVE_MON_INVULNER;
44
45     if (m_ptr->smart)
46         *flags |= SAVE_MON_SMART;
47
48     if (m_ptr->exp)
49         *flags |= SAVE_MON_EXP;
50
51     if (m_ptr->mflag2)
52         *flags |= SAVE_MON_MFLAG2;
53
54     if (m_ptr->nickname)
55         *flags |= SAVE_MON_NICKNAME;
56
57     if (m_ptr->parent_m_idx)
58         *flags |= SAVE_MON_PARENT;
59
60     wr_u32b(*flags);
61 }
62
63 static void write_monster_info(monster_type *m_ptr, const BIT_FLAGS flags)
64 {
65     byte tmp8u;
66     if (flags & SAVE_MON_FAST) {
67         tmp8u = (byte)m_ptr->mtimed[MTIMED_FAST];
68         wr_byte(tmp8u);
69     }
70
71     if (flags & SAVE_MON_SLOW) {
72         tmp8u = (byte)m_ptr->mtimed[MTIMED_SLOW];
73         wr_byte(tmp8u);
74     }
75
76     if (flags & SAVE_MON_STUNNED) {
77         tmp8u = (byte)m_ptr->mtimed[MTIMED_STUNNED];
78         wr_byte(tmp8u);
79     }
80
81     if (flags & SAVE_MON_CONFUSED) {
82         tmp8u = (byte)m_ptr->mtimed[MTIMED_CONFUSED];
83         wr_byte(tmp8u);
84     }
85
86     if (flags & SAVE_MON_MONFEAR) {
87         tmp8u = (byte)m_ptr->mtimed[MTIMED_MONFEAR];
88         wr_byte(tmp8u);
89     }
90
91     if (flags & SAVE_MON_TARGET_Y)
92         wr_s16b((s16b)m_ptr->target_y);
93
94     if (flags & SAVE_MON_TARGET_X)
95         wr_s16b((s16b)m_ptr->target_x);
96
97     if (flags & SAVE_MON_INVULNER) {
98         tmp8u = (byte)m_ptr->mtimed[MTIMED_INVULNER];
99         wr_byte(tmp8u);
100     }
101
102     if (flags & SAVE_MON_SMART)
103         wr_u32b(m_ptr->smart);
104
105     if (flags & SAVE_MON_EXP)
106         wr_u32b(m_ptr->exp);
107
108     if (flags & SAVE_MON_MFLAG2)
109         wr_byte(m_ptr->mflag2);
110
111     if (flags & SAVE_MON_NICKNAME)
112         wr_string(quark_str(m_ptr->nickname));
113
114     if (flags & SAVE_MON_PARENT)
115         wr_s16b(m_ptr->parent_m_idx);
116 }
117
118 /*!
119  * @brief モンスター情報を書き込む / Write a "monster" record
120  * @param m_ptr モンスター情報保存元ポインタ
121  * @return なし
122  */
123 void wr_monster(monster_type *m_ptr)
124 {
125     BIT_FLAGS flags = 0x00000000;
126     write_monster_flags(m_ptr, &flags);
127
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);
135
136     if (flags & SAVE_MON_AP_R_IDX)
137         wr_s16b(m_ptr->ap_r_idx);
138
139     if (flags & SAVE_MON_SUB_ALIGN)
140         wr_byte(m_ptr->sub_align);
141
142     if (flags & SAVE_MON_CSLEEP)
143         wr_s16b(m_ptr->mtimed[MTIMED_CSLEEP]);
144
145     wr_byte((byte)m_ptr->mspeed);
146     wr_s16b(m_ptr->energy_need);
147     write_monster_info(m_ptr, flags);
148 }
149
150 /*!
151  * @brief モンスターの思い出を書き込む / Write a "lore" record
152  * @param r_idx モンスター種族ID
153  * @return なし
154  */
155 void wr_lore(MONRACE_IDX r_idx)
156 {
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);
163
164     wr_byte(r_ptr->r_wake);
165     wr_byte(r_ptr->r_ignore);
166
167     wr_byte(r_ptr->r_xtra1);
168     wr_byte(r_ptr->r_xtra2);
169
170     wr_byte((byte)r_ptr->r_drop_gold);
171     wr_byte((byte)r_ptr->r_drop_item);
172
173     wr_byte(0); /* unused now */
174     wr_byte(r_ptr->r_cast_spell);
175
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]);
180
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);
188
189     wr_byte((byte)r_ptr->max_num);
190     wr_s16b(r_ptr->floor_id);
191     wr_byte(0);
192 }