OSDN Git Service

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