OSDN Git Service

[Refactor] #3381 old_race_flags にコンストラクタを定義し、初期値を追加した。もって未初期化警告に対応した
[hengbandforosx/hengbandosx.git] / src / monster / monster-processor-util.cpp
1 /*!
2  * @brief monster-processのための構造体群初期化処理と共通性の極めて高い処理
3  * @date 2020/03/07
4  * @author Hourier
5  * @details
6  * 概ね、PlayerType 構造体が引数でない場合はここへ移動させることを検討しても良い
7  * 引数に入っていたらここには移動させないこと
8  */
9
10 #include "monster/monster-processor-util.h"
11 #include "monster-race/monster-race.h"
12 #include "monster/monster-status.h"
13 #include "system/monster-entity.h"
14 #include "system/monster-race-info.h"
15
16 /*!
17  * @brief ターン経過フラグ構造体の初期化
18  * @param riding_idx 乗馬中のモンスターID
19  * @param m_idx モンスターID
20  * @return 初期化済のターン経過フラグ
21  */
22 turn_flags *init_turn_flags(MONSTER_IDX riding_idx, MONSTER_IDX m_idx, turn_flags *turn_flags_ptr)
23 {
24     turn_flags_ptr->is_riding_mon = (m_idx == riding_idx);
25     turn_flags_ptr->do_turn = false;
26     turn_flags_ptr->do_move = false;
27     turn_flags_ptr->do_view = false;
28     turn_flags_ptr->must_alter_to_move = false;
29     turn_flags_ptr->did_open_door = false;
30     turn_flags_ptr->did_bash_door = false;
31     turn_flags_ptr->did_take_item = false;
32     turn_flags_ptr->did_kill_item = false;
33     turn_flags_ptr->did_move_body = false;
34     turn_flags_ptr->did_pass_wall = false;
35     turn_flags_ptr->did_kill_wall = false;
36     return turn_flags_ptr;
37 }
38 /*!
39  * @brief coordinate_candidate の初期化
40  * @param なし
41  * @return 初期化済の構造体
42  */
43 coordinate_candidate init_coordinate_candidate(void)
44 {
45     coordinate_candidate candidate;
46     candidate.gy = 0;
47     candidate.gx = 0;
48     candidate.gdis = 0;
49     return candidate;
50 }
51
52 /*!
53  * @brief モンスターの移動方向を保存する
54  * @param mm 移動方向
55  * @param y 移動先Y座標
56  * @param x 移動先X座標
57  */
58 void store_enemy_approch_direction(int *mm, POSITION y, POSITION x)
59 {
60     /* North, South, East, West, North-West, North-East, South-West, South-East */
61     if ((y < 0) && (x == 0)) {
62         mm[0] = 8;
63         mm[1] = 7;
64         mm[2] = 9;
65     } else if ((y > 0) && (x == 0)) {
66         mm[0] = 2;
67         mm[1] = 1;
68         mm[2] = 3;
69     } else if ((x > 0) && (y == 0)) {
70         mm[0] = 6;
71         mm[1] = 9;
72         mm[2] = 3;
73     } else if ((x < 0) && (y == 0)) {
74         mm[0] = 4;
75         mm[1] = 7;
76         mm[2] = 1;
77     } else if ((y < 0) && (x < 0)) {
78         mm[0] = 7;
79         mm[1] = 4;
80         mm[2] = 8;
81     } else if ((y < 0) && (x > 0)) {
82         mm[0] = 9;
83         mm[1] = 6;
84         mm[2] = 8;
85     } else if ((y > 0) && (x < 0)) {
86         mm[0] = 1;
87         mm[1] = 4;
88         mm[2] = 2;
89     } else if ((y > 0) && (x > 0)) {
90         mm[0] = 3;
91         mm[1] = 6;
92         mm[2] = 2;
93     }
94 }
95
96 /*!
97  * @brief get_movable_grid() における移動の方向を保存する
98  * @param mm 移動方向
99  * @param y 移動先Y座標
100  * @param x 移動先X座標
101  */
102 void store_moves_val(int *mm, int y, int x)
103 {
104     POSITION ax = std::abs(x);
105     POSITION ay = std::abs(y);
106
107     int move_val = 0;
108     if (y < 0) {
109         move_val += 8;
110     }
111     if (x > 0) {
112         move_val += 4;
113     }
114
115     if (ay > (ax << 1)) {
116         move_val += 2;
117     } else if (ax > (ay << 1)) {
118         move_val++;
119     }
120
121     switch (move_val) {
122     case 0: {
123         mm[0] = 9;
124         if (ay > ax) {
125             mm[1] = 8;
126             mm[2] = 6;
127             mm[3] = 7;
128             mm[4] = 3;
129         } else {
130             mm[1] = 6;
131             mm[2] = 8;
132             mm[3] = 3;
133             mm[4] = 7;
134         }
135
136         break;
137     }
138     case 1:
139     case 9: {
140         mm[0] = 6;
141         if (y < 0) {
142             mm[1] = 3;
143             mm[2] = 9;
144             mm[3] = 2;
145             mm[4] = 8;
146         } else {
147             mm[1] = 9;
148             mm[2] = 3;
149             mm[3] = 8;
150             mm[4] = 2;
151         }
152
153         break;
154     }
155     case 2:
156     case 6: {
157         mm[0] = 8;
158         if (x < 0) {
159             mm[1] = 9;
160             mm[2] = 7;
161             mm[3] = 6;
162             mm[4] = 4;
163         } else {
164             mm[1] = 7;
165             mm[2] = 9;
166             mm[3] = 4;
167             mm[4] = 6;
168         }
169
170         break;
171     }
172     case 4: {
173         mm[0] = 7;
174         if (ay > ax) {
175             mm[1] = 8;
176             mm[2] = 4;
177             mm[3] = 9;
178             mm[4] = 1;
179         } else {
180             mm[1] = 4;
181             mm[2] = 8;
182             mm[3] = 1;
183             mm[4] = 9;
184         }
185
186         break;
187     }
188     case 5:
189     case 13: {
190         mm[0] = 4;
191         if (y < 0) {
192             mm[1] = 1;
193             mm[2] = 7;
194             mm[3] = 2;
195             mm[4] = 8;
196         } else {
197             mm[1] = 7;
198             mm[2] = 1;
199             mm[3] = 8;
200             mm[4] = 2;
201         }
202
203         break;
204     }
205     case 8: {
206         mm[0] = 3;
207         if (ay > ax) {
208             mm[1] = 2;
209             mm[2] = 6;
210             mm[3] = 1;
211             mm[4] = 9;
212         } else {
213             mm[1] = 6;
214             mm[2] = 2;
215             mm[3] = 9;
216             mm[4] = 1;
217         }
218
219         break;
220     }
221     case 10:
222     case 14: {
223         mm[0] = 2;
224         if (x < 0) {
225             mm[1] = 3;
226             mm[2] = 1;
227             mm[3] = 6;
228             mm[4] = 4;
229         } else {
230             mm[1] = 1;
231             mm[2] = 3;
232             mm[3] = 4;
233             mm[4] = 6;
234         }
235
236         break;
237     }
238     case 12: {
239         mm[0] = 1;
240         if (ay > ax) {
241             mm[1] = 2;
242             mm[2] = 4;
243             mm[3] = 3;
244             mm[4] = 7;
245         } else {
246             mm[1] = 4;
247             mm[2] = 2;
248             mm[3] = 7;
249             mm[4] = 3;
250         }
251
252         break;
253     }
254     }
255 }
256
257 /*!
258  * @brief 古いモンスター情報の保存
259  * @param monster_race_idx モンスターID
260  * @param old_race_flags_ptr モンスターフラグへの参照ポインタ
261  */
262 void save_old_race_flags(MonsterRaceId monster_race_idx, old_race_flags *old_race_flags_ptr)
263 {
264     if (!MonsterRace(monster_race_idx).is_valid()) {
265         return;
266     }
267
268     MonsterRaceInfo *r_ptr;
269     r_ptr = &monraces_info[monster_race_idx];
270
271     old_race_flags_ptr->old_r_flags1 = r_ptr->r_flags1;
272     old_race_flags_ptr->old_r_flags2 = r_ptr->r_flags2;
273     old_race_flags_ptr->old_r_flags3 = r_ptr->r_flags3;
274     old_race_flags_ptr->old_r_resistance_flags = r_ptr->r_resistance_flags;
275     old_race_flags_ptr->old_r_ability_flags = r_ptr->r_ability_flags;
276     old_race_flags_ptr->old_r_behavior_flags = r_ptr->r_behavior_flags;
277     old_race_flags_ptr->old_r_kind_flags = r_ptr->r_kind_flags;
278     old_race_flags_ptr->old_r_drop_flags = r_ptr->r_drop_flags;
279     old_race_flags_ptr->old_r_feature_flags = r_ptr->r_feature_flags;
280
281     old_race_flags_ptr->old_r_blows0 = r_ptr->r_blows[0];
282     old_race_flags_ptr->old_r_blows1 = r_ptr->r_blows[1];
283     old_race_flags_ptr->old_r_blows2 = r_ptr->r_blows[2];
284     old_race_flags_ptr->old_r_blows3 = r_ptr->r_blows[3];
285
286     old_race_flags_ptr->old_r_cast_spell = r_ptr->r_cast_spell;
287 }