OSDN Git Service

[Refactor] #2141 monster_race *r_ptrの宣言をautoに差し替えた
[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/quarks.h"
11
12 static void write_monster_flags(monster_type *m_ptr, BIT_FLAGS *flags)
13 {
14     if (!is_original_ap(m_ptr))
15         set_bits(*flags, SaveDataMonsterFlagType::AP_R_IDX);
16
17     if (m_ptr->sub_align)
18         set_bits(*flags, SaveDataMonsterFlagType::SUB_ALIGN);
19
20     if (monster_csleep_remaining(m_ptr))
21         set_bits(*flags, SaveDataMonsterFlagType::CSLEEP);
22
23     if (monster_fast_remaining(m_ptr))
24         set_bits(*flags, SaveDataMonsterFlagType::FAST);
25
26     if (monster_slow_remaining(m_ptr))
27         set_bits(*flags, SaveDataMonsterFlagType::SLOW);
28
29     if (monster_stunned_remaining(m_ptr))
30         set_bits(*flags, SaveDataMonsterFlagType::STUNNED);
31
32     if (monster_confused_remaining(m_ptr))
33         set_bits(*flags, SaveDataMonsterFlagType::CONFUSED);
34
35     if (monster_fear_remaining(m_ptr))
36         set_bits(*flags, SaveDataMonsterFlagType::MONFEAR);
37
38     if (m_ptr->target_y)
39         set_bits(*flags, SaveDataMonsterFlagType::TARGET_Y);
40
41     if (m_ptr->target_x)
42         set_bits(*flags, SaveDataMonsterFlagType::TARGET_X);
43
44     if (monster_invulner_remaining(m_ptr))
45         set_bits(*flags, SaveDataMonsterFlagType::INVULNER);
46
47     if (m_ptr->smart.any())
48         set_bits(*flags, SaveDataMonsterFlagType::SMART);
49
50     if (m_ptr->exp)
51         set_bits(*flags, SaveDataMonsterFlagType::EXP);
52
53     if (m_ptr->mflag2.any())
54         set_bits(*flags, SaveDataMonsterFlagType::MFLAG2);
55
56     if (m_ptr->nickname)
57         set_bits(*flags, SaveDataMonsterFlagType::NICKNAME);
58
59     if (m_ptr->parent_m_idx)
60         set_bits(*flags, SaveDataMonsterFlagType::PARENT);
61
62     wr_u32b(*flags);
63 }
64
65 static void write_monster_info(monster_type *m_ptr, const BIT_FLAGS flags)
66 {
67     byte tmp8u;
68     if (any_bits(flags, SaveDataMonsterFlagType::FAST)) {
69         tmp8u = (byte)m_ptr->mtimed[MTIMED_FAST];
70         wr_byte(tmp8u);
71     }
72
73     if (any_bits(flags, SaveDataMonsterFlagType::SLOW)) {
74         tmp8u = (byte)m_ptr->mtimed[MTIMED_SLOW];
75         wr_byte(tmp8u);
76     }
77
78     if (any_bits(flags, SaveDataMonsterFlagType::STUNNED)) {
79         tmp8u = (byte)m_ptr->mtimed[MTIMED_STUNNED];
80         wr_byte(tmp8u);
81     }
82
83     if (any_bits(flags, SaveDataMonsterFlagType::CONFUSED)) {
84         tmp8u = (byte)m_ptr->mtimed[MTIMED_CONFUSED];
85         wr_byte(tmp8u);
86     }
87
88     if (any_bits(flags, SaveDataMonsterFlagType::MONFEAR)) {
89         tmp8u = (byte)m_ptr->mtimed[MTIMED_MONFEAR];
90         wr_byte(tmp8u);
91     }
92
93     if (any_bits(flags, SaveDataMonsterFlagType::TARGET_Y))
94         wr_s16b((int16_t)m_ptr->target_y);
95
96     if (any_bits(flags, SaveDataMonsterFlagType::TARGET_X))
97         wr_s16b((int16_t)m_ptr->target_x);
98
99     if (any_bits(flags, SaveDataMonsterFlagType::INVULNER)) {
100         tmp8u = (byte)m_ptr->mtimed[MTIMED_INVULNER];
101         wr_byte(tmp8u);
102     }
103
104     if (any_bits(flags, SaveDataMonsterFlagType::SMART))
105         wr_FlagGroup(m_ptr->smart, wr_byte);
106
107     if (any_bits(flags, SaveDataMonsterFlagType::EXP))
108         wr_u32b(m_ptr->exp);
109
110     if (any_bits(flags, SaveDataMonsterFlagType::MFLAG2))
111         wr_FlagGroup(m_ptr->mflag2, wr_byte);
112
113     if (any_bits(flags, SaveDataMonsterFlagType::NICKNAME))
114         wr_string(quark_str(m_ptr->nickname));
115
116     if (any_bits(flags, SaveDataMonsterFlagType::PARENT))
117         wr_s16b(m_ptr->parent_m_idx);
118 }
119
120 /*!
121  * @brief モンスター情報を書き込む / Write a "monster" record
122  * @param m_ptr モンスター情報保存元ポインタ
123  */
124 void wr_monster(monster_type *m_ptr)
125 {
126     BIT_FLAGS flags = 0x00000000;
127     write_monster_flags(m_ptr, &flags);
128
129     wr_s16b(m_ptr->r_idx);
130     wr_byte((byte)m_ptr->fy);
131     wr_byte((byte)m_ptr->fx);
132     wr_s16b((int16_t)m_ptr->hp);
133     wr_s16b((int16_t)m_ptr->maxhp);
134     wr_s16b((int16_t)m_ptr->max_maxhp);
135     wr_u32b(m_ptr->dealt_damage);
136
137     if (any_bits(flags, SaveDataMonsterFlagType::AP_R_IDX))
138         wr_s16b(m_ptr->ap_r_idx);
139
140     if (any_bits(flags, SaveDataMonsterFlagType::SUB_ALIGN))
141         wr_byte(m_ptr->sub_align);
142
143     if (any_bits(flags, SaveDataMonsterFlagType::CSLEEP))
144         wr_s16b(m_ptr->mtimed[MTIMED_CSLEEP]);
145
146     wr_byte((byte)m_ptr->mspeed);
147     wr_s16b(m_ptr->energy_need);
148     write_monster_info(m_ptr, flags);
149 }
150
151 /*!
152  * @brief モンスターの思い出を書き込む / Write a "lore" record
153  * @param r_idx モンスター種族ID
154  */
155 void wr_lore(MONRACE_IDX r_idx)
156 {
157     auto *r_ptr = &r_info[r_idx];
158     wr_s16b((int16_t)r_ptr->r_sights);
159     wr_s16b((int16_t)r_ptr->r_deaths);
160     wr_s16b((int16_t)r_ptr->r_pkills);
161     wr_s16b((int16_t)r_ptr->r_akills);
162     wr_s16b((int16_t)r_ptr->r_tkills);
163
164     wr_byte(r_ptr->r_wake);
165     wr_byte(r_ptr->r_ignore);
166
167     byte tmp8u = r_ptr->r_can_evolve ? 1 : 0;
168     wr_byte(tmp8u);
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_flagsr);
185     wr_FlagGroup(r_ptr->r_ability_flags, wr_byte);
186     wr_FlagGroup(r_ptr->r_aura_flags, wr_byte);
187     wr_FlagGroup(r_ptr->r_behavior_flags, wr_byte);
188
189     wr_byte((byte)r_ptr->max_num);
190     wr_s16b(r_ptr->floor_id);
191
192     wr_s16b(r_ptr->defeat_level);
193     wr_u32b(r_ptr->defeat_time);
194     wr_byte(0);
195 }