OSDN Git Service

Merge branch 'master' of https://github.com/hengband/hengband
[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 /*!
40  * @brief old_race_flags_ptr の初期化
41  */
42 old_race_flags *init_old_race_flags(old_race_flags *old_race_flags_ptr)
43 {
44     old_race_flags_ptr->old_r_flags1 = 0L;
45     old_race_flags_ptr->old_r_flags2 = 0L;
46     old_race_flags_ptr->old_r_flags3 = 0L;
47     old_race_flags_ptr->old_r_resistance_flags.clear();
48     old_race_flags_ptr->old_r_ability_flags.clear();
49     old_race_flags_ptr->old_r_behavior_flags.clear();
50     old_race_flags_ptr->old_r_kind_flags.clear();
51     old_race_flags_ptr->old_r_drop_flags.clear();
52     old_race_flags_ptr->old_r_feature_flags.clear();
53
54     old_race_flags_ptr->old_r_blows0 = 0;
55     old_race_flags_ptr->old_r_blows1 = 0;
56     old_race_flags_ptr->old_r_blows2 = 0;
57     old_race_flags_ptr->old_r_blows3 = 0;
58
59     old_race_flags_ptr->old_r_cast_spell = 0;
60     return old_race_flags_ptr;
61 }
62
63 /*!
64  * @brief coordinate_candidate の初期化
65  * @param なし
66  * @return 初期化済の構造体
67  */
68 coordinate_candidate init_coordinate_candidate(void)
69 {
70     coordinate_candidate candidate;
71     candidate.gy = 0;
72     candidate.gx = 0;
73     candidate.gdis = 0;
74     return candidate;
75 }
76
77 /*!
78  * @brief モンスターの移動方向を保存する
79  * @param mm 移動方向
80  * @param y 移動先Y座標
81  * @param x 移動先X座標
82  */
83 void store_enemy_approch_direction(int *mm, POSITION y, POSITION x)
84 {
85     /* North, South, East, West, North-West, North-East, South-West, South-East */
86     if ((y < 0) && (x == 0)) {
87         mm[0] = 8;
88         mm[1] = 7;
89         mm[2] = 9;
90     } else if ((y > 0) && (x == 0)) {
91         mm[0] = 2;
92         mm[1] = 1;
93         mm[2] = 3;
94     } else if ((x > 0) && (y == 0)) {
95         mm[0] = 6;
96         mm[1] = 9;
97         mm[2] = 3;
98     } else if ((x < 0) && (y == 0)) {
99         mm[0] = 4;
100         mm[1] = 7;
101         mm[2] = 1;
102     } else if ((y < 0) && (x < 0)) {
103         mm[0] = 7;
104         mm[1] = 4;
105         mm[2] = 8;
106     } else if ((y < 0) && (x > 0)) {
107         mm[0] = 9;
108         mm[1] = 6;
109         mm[2] = 8;
110     } else if ((y > 0) && (x < 0)) {
111         mm[0] = 1;
112         mm[1] = 4;
113         mm[2] = 2;
114     } else if ((y > 0) && (x > 0)) {
115         mm[0] = 3;
116         mm[1] = 6;
117         mm[2] = 2;
118     }
119 }
120
121 /*!
122  * @brief get_movable_grid() における移動の方向を保存する
123  * @param mm 移動方向
124  * @param y 移動先Y座標
125  * @param x 移動先X座標
126  */
127 void store_moves_val(int *mm, int y, int x)
128 {
129     POSITION ax = std::abs(x);
130     POSITION ay = std::abs(y);
131
132     int move_val = 0;
133     if (y < 0) {
134         move_val += 8;
135     }
136     if (x > 0) {
137         move_val += 4;
138     }
139
140     if (ay > (ax << 1)) {
141         move_val += 2;
142     } else if (ax > (ay << 1)) {
143         move_val++;
144     }
145
146     switch (move_val) {
147     case 0: {
148         mm[0] = 9;
149         if (ay > ax) {
150             mm[1] = 8;
151             mm[2] = 6;
152             mm[3] = 7;
153             mm[4] = 3;
154         } else {
155             mm[1] = 6;
156             mm[2] = 8;
157             mm[3] = 3;
158             mm[4] = 7;
159         }
160
161         break;
162     }
163     case 1:
164     case 9: {
165         mm[0] = 6;
166         if (y < 0) {
167             mm[1] = 3;
168             mm[2] = 9;
169             mm[3] = 2;
170             mm[4] = 8;
171         } else {
172             mm[1] = 9;
173             mm[2] = 3;
174             mm[3] = 8;
175             mm[4] = 2;
176         }
177
178         break;
179     }
180     case 2:
181     case 6: {
182         mm[0] = 8;
183         if (x < 0) {
184             mm[1] = 9;
185             mm[2] = 7;
186             mm[3] = 6;
187             mm[4] = 4;
188         } else {
189             mm[1] = 7;
190             mm[2] = 9;
191             mm[3] = 4;
192             mm[4] = 6;
193         }
194
195         break;
196     }
197     case 4: {
198         mm[0] = 7;
199         if (ay > ax) {
200             mm[1] = 8;
201             mm[2] = 4;
202             mm[3] = 9;
203             mm[4] = 1;
204         } else {
205             mm[1] = 4;
206             mm[2] = 8;
207             mm[3] = 1;
208             mm[4] = 9;
209         }
210
211         break;
212     }
213     case 5:
214     case 13: {
215         mm[0] = 4;
216         if (y < 0) {
217             mm[1] = 1;
218             mm[2] = 7;
219             mm[3] = 2;
220             mm[4] = 8;
221         } else {
222             mm[1] = 7;
223             mm[2] = 1;
224             mm[3] = 8;
225             mm[4] = 2;
226         }
227
228         break;
229     }
230     case 8: {
231         mm[0] = 3;
232         if (ay > ax) {
233             mm[1] = 2;
234             mm[2] = 6;
235             mm[3] = 1;
236             mm[4] = 9;
237         } else {
238             mm[1] = 6;
239             mm[2] = 2;
240             mm[3] = 9;
241             mm[4] = 1;
242         }
243
244         break;
245     }
246     case 10:
247     case 14: {
248         mm[0] = 2;
249         if (x < 0) {
250             mm[1] = 3;
251             mm[2] = 1;
252             mm[3] = 6;
253             mm[4] = 4;
254         } else {
255             mm[1] = 1;
256             mm[2] = 3;
257             mm[3] = 4;
258             mm[4] = 6;
259         }
260
261         break;
262     }
263     case 12: {
264         mm[0] = 1;
265         if (ay > ax) {
266             mm[1] = 2;
267             mm[2] = 4;
268             mm[3] = 3;
269             mm[4] = 7;
270         } else {
271             mm[1] = 4;
272             mm[2] = 2;
273             mm[3] = 7;
274             mm[4] = 3;
275         }
276
277         break;
278     }
279     }
280 }
281
282 /*!
283  * @brief 古いモンスター情報の保存
284  * @param monster_race_idx モンスターID
285  * @param old_race_flags_ptr モンスターフラグへの参照ポインタ
286  */
287 void save_old_race_flags(MonsterRaceId monster_race_idx, old_race_flags *old_race_flags_ptr)
288 {
289     if (!MonsterRace(monster_race_idx).is_valid()) {
290         return;
291     }
292
293     MonsterRaceInfo *r_ptr;
294     r_ptr = &monraces_info[monster_race_idx];
295
296     old_race_flags_ptr->old_r_flags1 = r_ptr->r_flags1;
297     old_race_flags_ptr->old_r_flags2 = r_ptr->r_flags2;
298     old_race_flags_ptr->old_r_flags3 = r_ptr->r_flags3;
299     old_race_flags_ptr->old_r_resistance_flags = r_ptr->r_resistance_flags;
300     old_race_flags_ptr->old_r_ability_flags = r_ptr->r_ability_flags;
301     old_race_flags_ptr->old_r_behavior_flags = r_ptr->r_behavior_flags;
302     old_race_flags_ptr->old_r_kind_flags = r_ptr->r_kind_flags;
303     old_race_flags_ptr->old_r_drop_flags = r_ptr->r_drop_flags;
304     old_race_flags_ptr->old_r_feature_flags = r_ptr->r_feature_flags;
305
306     old_race_flags_ptr->old_r_blows0 = r_ptr->r_blows[0];
307     old_race_flags_ptr->old_r_blows1 = r_ptr->r_blows[1];
308     old_race_flags_ptr->old_r_blows2 = r_ptr->r_blows[2];
309     old_race_flags_ptr->old_r_blows3 = r_ptr->r_blows[3];
310
311     old_race_flags_ptr->old_r_cast_spell = r_ptr->r_cast_spell;
312 }