OSDN Git Service

[Refactor] #40498 Separated player-update-types.h from player-status.h
[hengband/hengband.git] / src / monster-floor / monster-move.c
1 /*!
2  * @brief モンスターの移動に関する処理
3  * @date 2020/03/08
4  * @author Hourier
5  */
6
7 #include "monster-floor/monster-move.h"
8 #include "core/player-update-types.h"
9 #include "core/speed-table.h"
10 #include "effect/effect-characteristics.h"
11 #include "game-option/disturbance-options.h"
12 #include "grid/feature.h"
13 #include "io/files-util.h"
14 #include "monster-attack/monster-attack-processor.h"
15 #include "monster-floor/monster-object.h"
16 #include "monster-race/monster-race.h"
17 #include "monster-race/race-flags1.h"
18 #include "monster-race/race-flags2.h"
19 #include "monster-race/race-flags7.h"
20 #include "monster-race/race-flags8.h"
21 #include "monster-race/race-indice-types.h"
22 #include "monster/monster-describer.h"
23 #include "monster/monster-flag-types.h"
24 #include "monster/monster-info.h"
25 #include "monster/monster-status.h"
26 #include "monster/monster-update.h"
27 #include "pet/pet-util.h"
28 #include "player/player-move.h"
29 #include "spell/process-effect.h"
30 #include "spell/spell-types.h"
31 #include "util/bit-flags-calculator.h"
32 #include "view/display-messages.h"
33
34 static bool check_hp_for_feat_destruction(feature_type *f_ptr, monster_type *m_ptr)
35 {
36         return !have_flag(f_ptr->flags, FF_GLASS) ||
37                 (r_info[m_ptr->r_idx].flags2 & RF2_STUPID) ||
38                 (m_ptr->hp >= MAX(m_ptr->maxhp / 3, 200));
39 }
40
41
42 /*!
43   * @brief モンスターによる壁の透過・破壊を行う
44   * @param target_ptr プレーヤーへの参照ポインタ
45   * @param m_ptr モンスターへの参照ポインタ
46   * @param ny モンスターのY座標
47   * @param nx モンスターのX座標
48   * @param can_cross モンスターが地形を踏破できるならばTRUE
49   * @return 透過も破壊もしなかった場合はFALSE、それ以外はTRUE
50   */
51 static bool process_wall(player_type *target_ptr, turn_flags *turn_flags_ptr, monster_type *m_ptr, POSITION ny, POSITION nx, bool can_cross)
52 {
53         monster_race *r_ptr = &r_info[m_ptr->r_idx];
54         grid_type *g_ptr;
55         g_ptr = &target_ptr->current_floor_ptr->grid_array[ny][nx];
56         feature_type *f_ptr;
57         f_ptr = &f_info[g_ptr->feat];
58         if (player_bold(target_ptr, ny, nx))
59         {
60                 turn_flags_ptr->do_move = TRUE;
61                 return TRUE;
62         }
63
64         if (g_ptr->m_idx > 0)
65         {
66                 turn_flags_ptr->do_move = TRUE;
67                 return TRUE;
68         }
69
70         if (((r_ptr->flags2 & RF2_KILL_WALL) != 0) &&
71                 (can_cross ? !have_flag(f_ptr->flags, FF_LOS) : !turn_flags_ptr->is_riding_mon) &&
72                 have_flag(f_ptr->flags, FF_HURT_DISI) && !have_flag(f_ptr->flags, FF_PERMANENT) &&
73                 check_hp_for_feat_destruction(f_ptr, m_ptr))
74         {
75                 turn_flags_ptr->do_move = TRUE;
76                 if (!can_cross) turn_flags_ptr->must_alter_to_move = TRUE;
77
78                 turn_flags_ptr->did_kill_wall = TRUE;
79                 return TRUE;
80         }
81
82         if (!can_cross) return FALSE;
83
84         turn_flags_ptr->do_move = TRUE;
85         if (((r_ptr->flags2 & RF2_PASS_WALL) != 0) && (!turn_flags_ptr->is_riding_mon || target_ptr->pass_wall) &&
86                 have_flag(f_ptr->flags, FF_CAN_PASS))
87         {
88                 turn_flags_ptr->did_pass_wall = TRUE;
89         }
90
91         return TRUE;
92 }
93
94
95 /*!
96  * @brief モンスターが普通のドアを開ける処理
97  * @param target_ptr プレーヤーへの参照ポインタ
98  * @param turn_flags_ptr ターン経過処理フラグへの参照ポインタ
99  * @param m_ptr モンスターへの参照ポインタ
100  * @param ny モンスターのY座標
101  * @param nx モンスターのX座標
102  * @return ここではドアを開けず、ガラスのドアを開ける可能性があるならTRUE
103  */
104 static bool bash_normal_door(player_type *target_ptr, turn_flags *turn_flags_ptr, monster_type *m_ptr, POSITION ny, POSITION nx)
105 {
106         monster_race *r_ptr = &r_info[m_ptr->r_idx];
107         grid_type *g_ptr;
108         g_ptr = &target_ptr->current_floor_ptr->grid_array[ny][nx];
109         feature_type *f_ptr;
110         f_ptr = &f_info[g_ptr->feat];
111         turn_flags_ptr->do_move = FALSE;
112         if (((r_ptr->flags2 & RF2_OPEN_DOOR) == 0) || !have_flag(f_ptr->flags, FF_OPEN) ||
113                 (is_pet(m_ptr) && ((target_ptr->pet_extra_flags & PF_OPEN_DOORS) == 0)))
114                 return TRUE;
115
116         if (f_ptr->power == 0)
117         {
118                 turn_flags_ptr->did_open_door = TRUE;
119                 turn_flags_ptr->do_turn = TRUE;
120                 return FALSE;
121         }
122
123         if (randint0(m_ptr->hp / 10) > f_ptr->power)
124         {
125                 cave_alter_feat(target_ptr, ny, nx, FF_DISARM);
126                 turn_flags_ptr->do_turn = TRUE;
127                 return FALSE;
128         }
129
130         return TRUE;
131 }
132
133
134 /*!
135  * @brief モンスターがガラスのドアを開ける処理
136  * @param target_ptr プレーヤーへの参照ポインタ
137  * @param turn_flags_ptr ターン経過処理フラグへの参照ポインタ
138  * @param m_ptr モンスターへの参照ポインタ
139  * @param g_ptr グリッドへの参照ポインタ
140  * @param f_ptr 地形への参照ポインタ
141  * @return なし
142  */
143 static void bash_glass_door(player_type *target_ptr, turn_flags *turn_flags_ptr, monster_type *m_ptr, feature_type *f_ptr, bool may_bash)
144 {
145         monster_race *r_ptr = &r_info[m_ptr->r_idx];
146         if (!may_bash || ((r_ptr->flags2 & RF2_BASH_DOOR) == 0) || !have_flag(f_ptr->flags, FF_BASH) ||
147                 (is_pet(m_ptr) && ((target_ptr->pet_extra_flags & PF_OPEN_DOORS) == 0)))
148                 return;
149
150         if (!check_hp_for_feat_destruction(f_ptr, m_ptr) || (randint0(m_ptr->hp / 10) <= f_ptr->power))
151                 return;
152
153         if (have_flag(f_ptr->flags, FF_GLASS))
154                 msg_print(_("ガラスが砕ける音がした!", "You hear glass breaking!"));
155         else
156                 msg_print(_("ドアを叩き開ける音がした!", "You hear a door burst open!"));
157
158         if (disturb_minor) disturb(target_ptr, FALSE, FALSE);
159
160         turn_flags_ptr->did_bash_door = TRUE;
161         turn_flags_ptr->do_move = TRUE;
162         turn_flags_ptr->must_alter_to_move = TRUE;
163 }
164
165
166 /*!
167  * @brief モンスターによるドアの開放・破壊を行う
168  * @param target_ptr プレーヤーへの参照ポインタ
169  * @param turn_flags_ptr ターン経過処理フラグへの参照ポインタ
170  * @param m_ptr モンスターへの参照ポインタ
171  * @param ny モンスターのY座標
172  * @param nx モンスターのX座標
173  * @return モンスターが死亡した場合のみFALSE
174  */
175 static bool process_door(player_type *target_ptr, turn_flags *turn_flags_ptr, monster_type *m_ptr, POSITION ny, POSITION nx)
176 {
177         monster_race *r_ptr = &r_info[m_ptr->r_idx];
178         grid_type *g_ptr;
179         g_ptr = &target_ptr->current_floor_ptr->grid_array[ny][nx];
180         if (!is_closed_door(target_ptr, g_ptr->feat)) return TRUE;
181
182         feature_type *f_ptr;
183         f_ptr = &f_info[g_ptr->feat];
184         bool may_bash = bash_normal_door(target_ptr, turn_flags_ptr, m_ptr, ny, nx);
185         bash_glass_door(target_ptr, turn_flags_ptr, m_ptr, f_ptr, may_bash);
186
187         if (!turn_flags_ptr->did_open_door && !turn_flags_ptr->did_bash_door) return TRUE;
188
189         if (turn_flags_ptr->did_bash_door &&
190                 ((randint0(100) < 50) || (feat_state(target_ptr, g_ptr->feat, FF_OPEN) == g_ptr->feat) || have_flag(f_ptr->flags, FF_GLASS)))
191         {
192                 cave_alter_feat(target_ptr, ny, nx, FF_BASH);
193                 if (!monster_is_valid(m_ptr))
194                 {
195                         target_ptr->update |= (PU_FLOW);
196                         target_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
197                         if (is_original_ap_and_seen(target_ptr, m_ptr)) r_ptr->r_flags2 |= (RF2_BASH_DOOR);
198
199                         return FALSE;
200                 }
201         }
202         else
203         {
204                 cave_alter_feat(target_ptr, ny, nx, FF_OPEN);
205         }
206
207         f_ptr = &f_info[g_ptr->feat];
208         turn_flags_ptr->do_view = TRUE;
209         return TRUE;
210 }
211
212
213 /*!
214  * @brief 守りのルーンによるモンスターの移動制限を処理する
215  * @param target_ptr プレーヤーへの参照ポインタ
216  * @param turn_flags_ptr ターン経過処理フラグへの参照ポインタ
217  * @param m_ptr モンスターへの参照ポインタ
218  * @param ny モンスターのY座標
219  * @param nx モンスターのX座標
220  * @return ルーンのある/なし
221  */
222 static bool process_protection_rune(player_type *target_ptr, turn_flags *turn_flags_ptr, monster_type *m_ptr, POSITION ny, POSITION nx)
223 {
224         grid_type *g_ptr;
225         g_ptr = &target_ptr->current_floor_ptr->grid_array[ny][nx];
226         monster_race *r_ptr = &r_info[m_ptr->r_idx];
227         if (!turn_flags_ptr->do_move || !is_glyph_grid(g_ptr) ||
228                 (((r_ptr->flags1 & RF1_NEVER_BLOW) != 0) && player_bold(target_ptr, ny, nx)))
229                 return FALSE;
230
231         turn_flags_ptr->do_move = FALSE;
232         if (is_pet(m_ptr) || (randint1(BREAK_GLYPH) >= r_ptr->level))
233                 return TRUE;
234
235         if (g_ptr->info & CAVE_MARK)
236         {
237                 msg_print(_("守りのルーンが壊れた!", "The rune of protection is broken!"));
238         }
239
240         g_ptr->info &= ~(CAVE_MARK);
241         g_ptr->info &= ~(CAVE_OBJECT);
242         g_ptr->mimic = 0;
243         turn_flags_ptr->do_move = TRUE;
244         note_spot(target_ptr, ny, nx);
245         return TRUE;
246 }
247
248
249 /*!
250  * @brief 爆発のルーンを処理する
251  * @param target_ptr プレーヤーへの参照ポインタ
252  * @param turn_flags_ptr ターン経過処理フラグへの参照ポインタ
253  * @param m_ptr モンスターへの参照ポインタ
254  * @param ny モンスターのY座標
255  * @param nx モンスターのX座標
256  * @return モンスターが死亡した場合のみFALSE
257  */
258 static bool process_explosive_rune(player_type *target_ptr, turn_flags *turn_flags_ptr, monster_type *m_ptr, POSITION ny, POSITION nx)
259 {
260         grid_type *g_ptr;
261         g_ptr = &target_ptr->current_floor_ptr->grid_array[ny][nx];
262         monster_race *r_ptr = &r_info[m_ptr->r_idx];
263         if (!turn_flags_ptr->do_move || !is_explosive_rune_grid(g_ptr) ||
264                 (((r_ptr->flags1 & RF1_NEVER_BLOW) != 0) && player_bold(target_ptr, ny, nx)))
265                 return TRUE;
266
267         turn_flags_ptr->do_move = FALSE;
268         if (is_pet(m_ptr)) return TRUE;
269
270         if (randint1(BREAK_MINOR_GLYPH) > r_ptr->level)
271         {
272                 if (g_ptr->info & CAVE_MARK)
273                 {
274                         msg_print(_("ルーンが爆発した!", "The rune explodes!"));
275                         BIT_FLAGS project_flags = PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL | PROJECT_JUMP | PROJECT_NO_HANGEKI;
276                         project(target_ptr, 0, 2, ny, nx, 2 * (target_ptr->lev + damroll(7, 7)), GF_MANA, project_flags, -1);
277                 }
278         }
279         else
280         {
281                 msg_print(_("爆発のルーンは解除された。", "An explosive rune was disarmed."));
282         }
283
284         g_ptr->info &= ~(CAVE_MARK);
285         g_ptr->info &= ~(CAVE_OBJECT);
286         g_ptr->mimic = 0;
287
288         note_spot(target_ptr, ny, nx);
289         lite_spot(target_ptr, ny, nx);
290
291         if (!monster_is_valid(m_ptr)) return FALSE;
292
293         turn_flags_ptr->do_move = TRUE;
294         return TRUE;
295 }
296
297
298 /*!
299  * @brief モンスターが壁を掘った後続処理を実行する
300  * @param target_ptr プレーヤーへの参照ポインタ
301  * @turn_flags_ptr ターン経過処理フラグへの参照ポインタ
302  * @param m_ptr モンスターへの参照ポインタ
303  * @param ny モンスターのY座標
304  * @param nx モンスターのX座標
305  * @return モンスターが死亡した場合のみFALSE
306  */
307 static bool process_post_dig_wall(player_type *target_ptr, turn_flags *turn_flags_ptr, monster_type *m_ptr, POSITION ny, POSITION nx)
308 {
309         monster_race *r_ptr = &r_info[m_ptr->r_idx];
310         grid_type *g_ptr;
311         g_ptr = &target_ptr->current_floor_ptr->grid_array[ny][nx];
312         feature_type *f_ptr;
313         f_ptr = &f_info[g_ptr->feat];
314         if (!turn_flags_ptr->did_kill_wall || !turn_flags_ptr->do_move) return TRUE;
315
316         if (one_in_(GRINDNOISE))
317         {
318                 if (have_flag(f_ptr->flags, FF_GLASS))
319                         msg_print(_("何かの砕ける音が聞こえる。", "There is a crashing sound."));
320                 else
321                         msg_print(_("ギシギシいう音が聞こえる。", "There is a grinding sound."));
322         }
323
324         cave_alter_feat(target_ptr, ny, nx, FF_HURT_DISI);
325
326         if (!monster_is_valid(m_ptr))
327         {
328                 target_ptr->update |= (PU_FLOW);
329                 target_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
330                 if (is_original_ap_and_seen(target_ptr, m_ptr)) r_ptr->r_flags2 |= (RF2_KILL_WALL);
331
332                 return FALSE;
333         }
334
335         f_ptr = &f_info[g_ptr->feat];
336         turn_flags_ptr->do_view = TRUE;
337         turn_flags_ptr->do_turn = TRUE;
338         return TRUE;
339 }
340
341
342 /*!
343  * todo 少し長いが、これといってブロックとしてまとまった部分もないので暫定でこのままとする
344  * @brief モンスターの移動に関するメインルーチン
345  * @param target_ptr プレーヤーへの参照ポインタ
346  * @param turn_flags_ptr ターン経過処理フラグへの参照ポインタ
347  * @param m_idx モンスターID
348  * @param mm モンスターの移動方向
349  * @param oy 移動前の、モンスターのY座標
350  * @param ox 移動前の、モンスターのX座標
351  * @param count 移動回数 (のはず todo)
352  * @return 移動が阻害される何か (ドア等)があったらFALSE
353  */
354 bool process_monster_movement(player_type *target_ptr, turn_flags *turn_flags_ptr, MONSTER_IDX m_idx, DIRECTION *mm, POSITION oy, POSITION ox, int *count)
355 {
356         for (int i = 0; mm[i]; i++)
357         {
358                 int d = mm[i];
359                 if (d == 5) d = ddd[randint0(8)];
360
361                 POSITION ny = oy + ddy[d];
362                 POSITION nx = ox + ddx[d];
363                 if (!in_bounds2(target_ptr->current_floor_ptr, ny, nx)) continue;
364
365                 grid_type *g_ptr;
366                 g_ptr = &target_ptr->current_floor_ptr->grid_array[ny][nx];
367                 monster_type *m_ptr = &target_ptr->current_floor_ptr->m_list[m_idx];
368                 monster_race *r_ptr = &r_info[m_ptr->r_idx];
369                 bool can_cross = monster_can_cross_terrain(target_ptr, g_ptr->feat, r_ptr, turn_flags_ptr->is_riding_mon ? CEM_RIDING : 0);
370
371                 if (!process_wall(target_ptr, turn_flags_ptr, m_ptr, ny, nx, can_cross))
372                 {
373                         if (!process_door(target_ptr, turn_flags_ptr, m_ptr, ny, nx))
374                                 return FALSE;
375                 }
376
377                 if (!process_protection_rune(target_ptr, turn_flags_ptr, m_ptr, ny, nx))
378                 {
379                         if (!process_explosive_rune(target_ptr, turn_flags_ptr, m_ptr, ny, nx))
380                                 return FALSE;
381                 }
382
383                 exe_monster_attack_to_player(target_ptr, turn_flags_ptr, m_idx, ny, nx);
384                 if (process_monster_attack_to_monster(target_ptr, turn_flags_ptr, m_idx, g_ptr, can_cross)) return FALSE;
385
386                 if (turn_flags_ptr->is_riding_mon)
387                 {
388                         if (!target_ptr->riding_ryoute && !monster_fear_remaining(&target_ptr->current_floor_ptr->m_list[target_ptr->riding])) turn_flags_ptr->do_move = FALSE;
389                 }
390
391                 if (!process_post_dig_wall(target_ptr, turn_flags_ptr, m_ptr, ny, nx)) return FALSE;
392
393                 if (turn_flags_ptr->must_alter_to_move && (r_ptr->flags7 & RF7_AQUATIC))
394                 {
395                         if (!monster_can_cross_terrain(target_ptr, g_ptr->feat, r_ptr, turn_flags_ptr->is_riding_mon ? CEM_RIDING : 0))
396                                 turn_flags_ptr->do_move = FALSE;
397                 }
398
399                 if (turn_flags_ptr->do_move && !can_cross && !turn_flags_ptr->did_kill_wall && !turn_flags_ptr->did_bash_door)
400                         turn_flags_ptr->do_move = FALSE;
401
402                 if (turn_flags_ptr->do_move && (r_ptr->flags1 & RF1_NEVER_MOVE))
403                 {
404                         if (is_original_ap_and_seen(target_ptr, m_ptr))
405                                 r_ptr->r_flags1 |= (RF1_NEVER_MOVE);
406
407                         turn_flags_ptr->do_move = FALSE;
408                 }
409
410                 if (!turn_flags_ptr->do_move)
411                 {
412                         if (turn_flags_ptr->do_turn) break;
413
414                         continue;
415                 }
416
417                 turn_flags_ptr->do_turn = TRUE;
418                 feature_type *f_ptr;
419                 f_ptr = &f_info[g_ptr->feat];
420                 if (have_flag(f_ptr->flags, FF_TREE))
421                 {
422                         if (!(r_ptr->flags7 & RF7_CAN_FLY) && !(r_ptr->flags8 & RF8_WILD_WOOD))
423                         {
424                                 m_ptr->energy_need += ENERGY_NEED();
425                         }
426                 }
427
428                 if (!update_riding_monster(target_ptr, turn_flags_ptr, m_idx, oy, ox, ny, nx)) break;
429
430                 monster_race *ap_r_ptr = &r_info[m_ptr->ap_r_idx];
431                 if (m_ptr->ml &&
432                         (disturb_move ||
433                         (disturb_near && (m_ptr->mflag & MFLAG_VIEW) && projectable(target_ptr, target_ptr->y, target_ptr->x, m_ptr->fy, m_ptr->fx)) ||
434                                 (disturb_high && ap_r_ptr->r_tkills && ap_r_ptr->level >= target_ptr->lev)))
435                 {
436                         if (is_hostile(m_ptr))
437                                 disturb(target_ptr, FALSE, TRUE);
438                 }
439
440                 bool is_takable_or_killable = g_ptr->o_idx > 0;
441                 is_takable_or_killable &= (r_ptr->flags2 & (RF2_TAKE_ITEM | RF2_KILL_ITEM)) != 0;
442
443                 bool is_pickup_items = (target_ptr->pet_extra_flags & PF_PICKUP_ITEMS) != 0;
444                 is_pickup_items &= (r_ptr->flags2 & RF2_TAKE_ITEM) != 0;
445
446                 is_takable_or_killable &= !is_pet(m_ptr) || is_pickup_items;
447                 if (!is_takable_or_killable)
448                 {
449                         if (turn_flags_ptr->do_turn) break;
450
451                         continue;
452                 }
453
454                 update_object_by_monster_movement(target_ptr, turn_flags_ptr, m_idx, ny, nx);
455                 if (turn_flags_ptr->do_turn) break;
456
457                 (*count)++;
458         }
459
460         return TRUE;
461 }
462
463
464 /*!
465  * @brief モンスターを喋らせたり足音を立てたりする
466  * @param target_ptr プレーヤーへの参照ポインタ
467  * @param m_idx モンスターID
468  * @param oy モンスターが元々いたY座標
469  * @param ox モンスターが元々いたX座標
470  * @param aware モンスターがプレーヤーに気付いているならばTRUE、超隠密状態ならばFALSE
471  * @return なし
472  */
473 void process_speak_sound(player_type *target_ptr, MONSTER_IDX m_idx, POSITION oy, POSITION ox, bool aware)
474 {
475         if (target_ptr->phase_out) return;
476
477         monster_type *m_ptr = &target_ptr->current_floor_ptr->m_list[m_idx];
478         monster_race *ap_r_ptr = &r_info[m_ptr->ap_r_idx];
479         if (m_ptr->ap_r_idx == MON_CYBER &&
480                 one_in_(CYBERNOISE) &&
481                 !m_ptr->ml && (m_ptr->cdis <= MAX_SIGHT))
482         {
483                 if (disturb_minor) disturb(target_ptr, FALSE, FALSE);
484                 msg_print(_("重厚な足音が聞こえた。", "You hear heavy steps."));
485         }
486
487         if (((ap_r_ptr->flags2 & RF2_CAN_SPEAK) == 0) || !aware ||
488                 !one_in_(SPEAK_CHANCE) ||
489                 !player_has_los_bold(target_ptr, oy, ox) ||
490                 !projectable(target_ptr, oy, ox, target_ptr->y, target_ptr->x))
491                 return;
492
493         GAME_TEXT m_name[MAX_NLEN];
494         char monmessage[1024];
495         concptr filename;
496
497         if (m_ptr->ml)
498                 monster_desc(target_ptr, m_name, m_ptr, 0);
499         else
500                 strcpy(m_name, _("それ", "It"));
501
502         if (monster_fear_remaining(m_ptr))
503                 filename = _("monfear_j.txt", "monfear.txt");
504         else if (is_pet(m_ptr))
505                 filename = _("monpet_j.txt", "monpet.txt");
506         else if (is_friendly(m_ptr))
507                 filename = _("monfrien_j.txt", "monfrien.txt");
508         else
509                 filename = _("monspeak_j.txt", "monspeak.txt");
510
511         if (get_rnd_line(filename, m_ptr->ap_r_idx, monmessage) == 0)
512         {
513                 msg_format(_("%^s%s", "%^s %s"), m_name, monmessage);
514         }
515 }
516
517 /*!
518  * @brief モンスターの目標地点をセットする / Set the target of counter attack
519  * @param m_ptr モンスターの参照ポインタ
520  * @param y 目標y座標
521  * @param x 目標x座標
522  * @return なし
523  */
524 void set_target(monster_type *m_ptr, POSITION y, POSITION x)
525 {
526     m_ptr->target_y = y;
527     m_ptr->target_x = x;
528 }
529
530 /*!
531  * @brief モンスターの目標地点をリセットする / Reset the target of counter attack
532  * @param m_ptr モンスターの参照ポインタ
533  * @return なし
534  */
535 void reset_target(monster_type *m_ptr) { set_target(m_ptr, 0, 0); }