2 * @brief モンスターの移動に関する処理
7 #include "monster/monster-move.h"
10 * @brief 守りのルーンによるモンスターの移動制限を処理する
11 * @param target_ptr プレーヤーへの参照ポインタ
12 * @param turn_flags_ptr ターン経過処理フラグへの参照ポインタ
13 * @param m_ptr モンスターへの参照ポインタ
18 bool process_protection_rune(player_type *target_ptr, turn_flags *turn_flags_ptr, monster_type *m_ptr, POSITION ny, POSITION nx)
21 g_ptr = &target_ptr->current_floor_ptr->grid_array[ny][nx];
22 monster_race *r_ptr = &r_info[m_ptr->r_idx];
23 if (!turn_flags_ptr->do_move || !is_glyph_grid(g_ptr) ||
24 (((r_ptr->flags1 & RF1_NEVER_BLOW) != 0) && player_bold(target_ptr, ny, nx)))
27 turn_flags_ptr->do_move = FALSE;
28 if (is_pet(m_ptr) || (randint1(BREAK_GLYPH) >= r_ptr->level))
31 if (g_ptr->info & CAVE_MARK)
33 msg_print(_("守りのルーンが壊れた!", "The rune of protection is broken!"));
36 g_ptr->info &= ~(CAVE_MARK);
37 g_ptr->info &= ~(CAVE_OBJECT);
39 turn_flags_ptr->do_move = TRUE;
40 note_spot(target_ptr, ny, nx);
47 * @param target_ptr プレーヤーへの参照ポインタ
48 * @param turn_flags_ptr ターン経過処理フラグへの参照ポインタ
49 * @param m_ptr モンスターへの参照ポインタ
52 * @return モンスターが死亡した場合のみFALSE
54 bool process_explosive_rune(player_type *target_ptr, turn_flags *turn_flags_ptr, monster_type *m_ptr, POSITION ny, POSITION nx)
57 g_ptr = &target_ptr->current_floor_ptr->grid_array[ny][nx];
58 monster_race *r_ptr = &r_info[m_ptr->r_idx];
59 if (!turn_flags_ptr->do_move || !is_explosive_rune_grid(g_ptr) ||
60 (((r_ptr->flags1 & RF1_NEVER_BLOW) != 0) && player_bold(target_ptr, ny, nx)))
63 turn_flags_ptr->do_move = FALSE;
64 if (is_pet(m_ptr)) return TRUE;
66 if (randint1(BREAK_MINOR_GLYPH) > r_ptr->level)
68 if (g_ptr->info & CAVE_MARK)
70 msg_print(_("ルーンが爆発した!", "The rune explodes!"));
71 BIT_FLAGS project_flags = PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL | PROJECT_JUMP | PROJECT_NO_HANGEKI;
72 project(target_ptr, 0, 2, ny, nx, 2 * (target_ptr->lev + damroll(7, 7)), GF_MANA, project_flags, -1);
77 msg_print(_("爆発のルーンは解除された。", "An explosive rune was disarmed."));
80 g_ptr->info &= ~(CAVE_MARK);
81 g_ptr->info &= ~(CAVE_OBJECT);
84 note_spot(target_ptr, ny, nx);
85 lite_spot(target_ptr, ny, nx);
87 if (!monster_is_valid(m_ptr)) return FALSE;
89 turn_flags_ptr->do_move = TRUE;