OSDN Git Service

Merge pull request #2013 from sikabane-works/release/3.0.0Alpha51
[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 "game-option/birth-options.h"
12 #include "monster-race/monster-race.h"
13 #include "monster/monster-status.h"
14 #include "system/monster-race-definition.h"
15 #include "system/monster-type-definition.h"
16
17  /*!
18   * @brief ターン経過フラグ構造体の初期化
19   * @param riding_idx 乗馬中のモンスターID
20   * @param m_idx モンスターID
21   * @return 初期化済のターン経過フラグ
22   */
23 turn_flags *init_turn_flags(MONSTER_IDX riding_idx, MONSTER_IDX m_idx, turn_flags *turn_flags_ptr)
24 {
25         turn_flags_ptr->is_riding_mon = (m_idx == riding_idx);
26         turn_flags_ptr->do_turn = false;
27         turn_flags_ptr->do_move = false;
28         turn_flags_ptr->do_view = false;
29         turn_flags_ptr->must_alter_to_move = false;
30         turn_flags_ptr->did_open_door = false;
31         turn_flags_ptr->did_bash_door = false;
32         turn_flags_ptr->did_take_item = false;
33         turn_flags_ptr->did_kill_item = false;
34         turn_flags_ptr->did_move_body = false;
35         turn_flags_ptr->did_pass_wall = false;
36         turn_flags_ptr->did_kill_wall = false;
37         return turn_flags_ptr;
38 }
39
40
41 /*!
42  * @brief old_race_flags_ptr の初期化
43  */
44 old_race_flags *init_old_race_flags(old_race_flags *old_race_flags_ptr)
45 {
46         old_race_flags_ptr->old_r_flags1 = 0L;
47         old_race_flags_ptr->old_r_flags2 = 0L;
48         old_race_flags_ptr->old_r_flags3 = 0L;
49         old_race_flags_ptr->old_r_flagsr = 0L;
50         old_race_flags_ptr->old_r_ability_flags.clear();
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  */
143 void store_moves_val(int *mm, int y, int x)
144 {
145         POSITION ax = std::abs(x);
146         POSITION ay = std::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  */
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_flagsr = r_ptr->r_flagsr;
341         old_race_flags_ptr->old_r_ability_flags = r_ptr->r_ability_flags;
342
343         old_race_flags_ptr->old_r_blows0 = r_ptr->r_blows[0];
344         old_race_flags_ptr->old_r_blows1 = r_ptr->r_blows[1];
345         old_race_flags_ptr->old_r_blows2 = r_ptr->r_blows[2];
346         old_race_flags_ptr->old_r_blows3 = r_ptr->r_blows[3];
347
348         old_race_flags_ptr->old_r_cast_spell = r_ptr->r_cast_spell;
349 }
350
351
352 /*!
353  * @brief モンスターの加速値を決定する
354  * @param m_ptr モンスターへの参照ポインタ
355  * return モンスターの加速値
356  */
357 SPEED decide_monster_speed(monster_type *m_ptr)
358 {
359         SPEED speed = m_ptr->mspeed;
360         if (ironman_nightmare) speed += 5;
361
362         if (monster_fast_remaining(m_ptr)) speed += 10;
363         if (monster_slow_remaining(m_ptr)) speed -= 10;
364
365         return speed;
366 }