OSDN Git Service

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