OSDN Git Service

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