OSDN Git Service

Merge remote-tracking branch 'remotes/origin/For2.2.2-Fix-Hourier' into For2.2.2...
[hengband/hengband.git] / src / monster / monster-processor-util.c
1 /*!
2  * @brief monster-processのための構造体群初期化処理と共通性の極めて高い処理
3  * @date 2020/03/07
4  * @author Hourier
5  * @details
6  * 概ね、player_type 構造体が引数でない場合はここへ移動させることを検討しても良い
7  * 引数に入っていたらここには移動させないこと
8  */
9
10 #include "monster/monster-processor-util.h"
11 #include "game-option/birth-options.h"
12 #include "monster/monster-status.h"
13
14  /*!
15   * @brief ターン経過フラグ構造体の初期化
16   * @param riding_idx 乗馬中のモンスターID
17   * @param m_idx モンスターID
18   * @return 初期化済のターン経過フラグ
19   */
20 turn_flags *init_turn_flags(MONSTER_IDX riding_idx, MONSTER_IDX m_idx, turn_flags *turn_flags_ptr)
21 {
22         turn_flags_ptr->is_riding_mon = (m_idx == riding_idx);
23         turn_flags_ptr->do_turn = FALSE;
24         turn_flags_ptr->do_move = FALSE;
25         turn_flags_ptr->do_view = FALSE;
26         turn_flags_ptr->must_alter_to_move = FALSE;
27         turn_flags_ptr->did_open_door = FALSE;
28         turn_flags_ptr->did_bash_door = FALSE;
29         turn_flags_ptr->did_take_item = FALSE;
30         turn_flags_ptr->did_kill_item = FALSE;
31         turn_flags_ptr->did_move_body = FALSE;
32         turn_flags_ptr->did_pass_wall = FALSE;
33         turn_flags_ptr->did_kill_wall = FALSE;
34         return turn_flags_ptr;
35 }
36
37
38 /*!
39  * @brief old_race_flags_ptr の初期化
40  */
41 old_race_flags *init_old_race_flags(old_race_flags *old_race_flags_ptr)
42 {
43         old_race_flags_ptr->old_r_flags1 = 0L;
44         old_race_flags_ptr->old_r_flags2 = 0L;
45         old_race_flags_ptr->old_r_flags3 = 0L;
46         old_race_flags_ptr->old_r_flags4 = 0L;
47         old_race_flags_ptr->old_r_flags5 = 0L;
48         old_race_flags_ptr->old_r_flags6 = 0L;
49         old_race_flags_ptr->old_r_flagsr = 0L;
50
51         old_race_flags_ptr->old_r_blows0 = 0;
52         old_race_flags_ptr->old_r_blows1 = 0;
53         old_race_flags_ptr->old_r_blows2 = 0;
54         old_race_flags_ptr->old_r_blows3 = 0;
55
56         old_race_flags_ptr->old_r_cast_spell = 0;
57         return old_race_flags_ptr;
58 }
59
60
61 /*!
62  * @brief coordinate_candidate の初期化
63  * @param なし
64  * @return 初期化済の構造体
65  */
66 coordinate_candidate init_coordinate_candidate(void)
67 {
68         coordinate_candidate candidate;
69         candidate.gy = 0;
70         candidate.gx = 0;
71         candidate.gdis = 0;
72         return candidate;
73 }
74
75
76 /*!
77  * @brief モンスターの移動方向を保存する
78  * @param mm 移動方向
79  * @param y 移動先Y座標
80  * @param x 移動先X座標
81  */
82 void store_enemy_approch_direction(int *mm, POSITION y, POSITION x)
83 {
84         /* North, South, East, West, North-West, North-East, South-West, South-East */
85         if ((y < 0) && (x == 0))
86         {
87                 mm[0] = 8;
88                 mm[1] = 7;
89                 mm[2] = 9;
90         }
91         else if ((y > 0) && (x == 0))
92         {
93                 mm[0] = 2;
94                 mm[1] = 1;
95                 mm[2] = 3;
96         }
97         else if ((x > 0) && (y == 0))
98         {
99                 mm[0] = 6;
100                 mm[1] = 9;
101                 mm[2] = 3;
102         }
103         else if ((x < 0) && (y == 0))
104         {
105                 mm[0] = 4;
106                 mm[1] = 7;
107                 mm[2] = 1;
108         }
109         else if ((y < 0) && (x < 0))
110         {
111                 mm[0] = 7;
112                 mm[1] = 4;
113                 mm[2] = 8;
114         }
115         else if ((y < 0) && (x > 0))
116         {
117                 mm[0] = 9;
118                 mm[1] = 6;
119                 mm[2] = 8;
120         }
121         else if ((y > 0) && (x < 0))
122         {
123                 mm[0] = 1;
124                 mm[1] = 4;
125                 mm[2] = 2;
126         }
127         else if ((y > 0) && (x > 0))
128         {
129                 mm[0] = 3;
130                 mm[1] = 6;
131                 mm[2] = 2;
132         }
133 }
134
135
136 /*!
137  * @brief get_movable_grid() における移動の方向を保存する
138  * @param mm 移動方向
139  * @param y 移動先Y座標
140  * @param x 移動先X座標
141  * @return なし
142  */
143 void store_moves_val(int *mm, int y, int x)
144 {
145         POSITION ax = ABS(x);
146         POSITION ay = ABS(y);
147
148         int move_val = 0;
149         if (y < 0) move_val += 8;
150         if (x > 0) move_val += 4;
151
152         if (ay > (ax << 1)) move_val += 2;
153         else if (ax > (ay << 1)) move_val++;
154
155         switch (move_val)
156         {
157         case 0:
158         {
159                 mm[0] = 9;
160                 if (ay > ax)
161                 {
162                         mm[1] = 8;
163                         mm[2] = 6;
164                         mm[3] = 7;
165                         mm[4] = 3;
166                 }
167                 else
168                 {
169                         mm[1] = 6;
170                         mm[2] = 8;
171                         mm[3] = 3;
172                         mm[4] = 7;
173                 }
174
175                 break;
176         }
177         case 1:
178         case 9:
179         {
180                 mm[0] = 6;
181                 if (y < 0)
182                 {
183                         mm[1] = 3;
184                         mm[2] = 9;
185                         mm[3] = 2;
186                         mm[4] = 8;
187                 }
188                 else
189                 {
190                         mm[1] = 9;
191                         mm[2] = 3;
192                         mm[3] = 8;
193                         mm[4] = 2;
194                 }
195
196                 break;
197         }
198         case 2:
199         case 6:
200         {
201                 mm[0] = 8;
202                 if (x < 0)
203                 {
204                         mm[1] = 9;
205                         mm[2] = 7;
206                         mm[3] = 6;
207                         mm[4] = 4;
208                 }
209                 else
210                 {
211                         mm[1] = 7;
212                         mm[2] = 9;
213                         mm[3] = 4;
214                         mm[4] = 6;
215                 }
216
217                 break;
218         }
219         case 4:
220         {
221                 mm[0] = 7;
222                 if (ay > ax)
223                 {
224                         mm[1] = 8;
225                         mm[2] = 4;
226                         mm[3] = 9;
227                         mm[4] = 1;
228                 }
229                 else
230                 {
231                         mm[1] = 4;
232                         mm[2] = 8;
233                         mm[3] = 1;
234                         mm[4] = 9;
235                 }
236
237                 break;
238         }
239         case 5:
240         case 13:
241         {
242                 mm[0] = 4;
243                 if (y < 0)
244                 {
245                         mm[1] = 1;
246                         mm[2] = 7;
247                         mm[3] = 2;
248                         mm[4] = 8;
249                 }
250                 else
251                 {
252                         mm[1] = 7;
253                         mm[2] = 1;
254                         mm[3] = 8;
255                         mm[4] = 2;
256                 }
257
258                 break;
259         }
260         case 8:
261         {
262                 mm[0] = 3;
263                 if (ay > ax)
264                 {
265                         mm[1] = 2;
266                         mm[2] = 6;
267                         mm[3] = 1;
268                         mm[4] = 9;
269                 }
270                 else
271                 {
272                         mm[1] = 6;
273                         mm[2] = 2;
274                         mm[3] = 9;
275                         mm[4] = 1;
276                 }
277         
278                 break;
279         }
280         case 10:
281         case 14:
282         {
283                 mm[0] = 2;
284                 if (x < 0)
285                 {
286                         mm[1] = 3;
287                         mm[2] = 1;
288                         mm[3] = 6;
289                         mm[4] = 4;
290                 }
291                 else
292                 {
293                         mm[1] = 1;
294                         mm[2] = 3;
295                         mm[3] = 4;
296                         mm[4] = 6;
297                 }
298
299                 break;
300         }
301         case 12:
302         {
303                 mm[0] = 1;
304                 if (ay > ax)
305                 {
306                         mm[1] = 2;
307                         mm[2] = 4;
308                         mm[3] = 3;
309                         mm[4] = 7;
310                 }
311                 else
312                 {
313                         mm[1] = 4;
314                         mm[2] = 2;
315                         mm[3] = 7;
316                         mm[4] = 3;
317                 }
318
319                 break;
320         }
321         }
322 }
323
324
325 /*!
326  * @brief 古いモンスター情報の保存
327  * @param monster_race_idx モンスターID
328  * @param old_race_flags_ptr モンスターフラグへの参照ポインタ
329  * @return なし
330  */
331 void save_old_race_flags(MONRACE_IDX monster_race_idx, old_race_flags *old_race_flags_ptr)
332 {
333         if (monster_race_idx == 0) return;
334
335         monster_race *r_ptr;
336         r_ptr = &r_info[monster_race_idx];
337
338         old_race_flags_ptr->old_r_flags1 = r_ptr->r_flags1;
339         old_race_flags_ptr->old_r_flags2 = r_ptr->r_flags2;
340         old_race_flags_ptr->old_r_flags3 = r_ptr->r_flags3;
341         old_race_flags_ptr->old_r_flags4 = r_ptr->r_flags4;
342         old_race_flags_ptr->old_r_flags5 = r_ptr->r_flags5;
343         old_race_flags_ptr->old_r_flags6 = r_ptr->r_flags6;
344         old_race_flags_ptr->old_r_flagsr = r_ptr->r_flagsr;
345
346         old_race_flags_ptr->old_r_blows0 = r_ptr->r_blows[0];
347         old_race_flags_ptr->old_r_blows1 = r_ptr->r_blows[1];
348         old_race_flags_ptr->old_r_blows2 = r_ptr->r_blows[2];
349         old_race_flags_ptr->old_r_blows3 = r_ptr->r_blows[3];
350
351         old_race_flags_ptr->old_r_cast_spell = r_ptr->r_cast_spell;
352 }
353
354
355 /*!
356  * @brief モンスターの加速値を決定する
357  * @param m_ptr モンスターへの参照ポインタ
358  * return モンスターの加速値
359  */
360 SPEED decide_monster_speed(monster_type *m_ptr)
361 {
362         SPEED speed = m_ptr->mspeed;
363         if (ironman_nightmare) speed += 5;
364
365         if (monster_fast_remaining(m_ptr)) speed += 10;
366         if (monster_slow_remaining(m_ptr)) speed -= 10;
367
368         return speed;
369 }