From 0eb8e404ade43c9be8cfbc1a1777f5eaa81ebd01 Mon Sep 17 00:00:00 2001 From: Hourier Date: Sun, 16 Feb 2020 23:03:53 +0900 Subject: [PATCH] =?utf8?q?[Refactor]=20#40030=20process=5Fmonster()=20?= =?utf8?q?=E3=81=8B=E3=82=89process=5Fmonster=5Fmovement()=20=E3=82=92?= =?utf8?q?=E5=88=86=E9=9B=A2=20/=20Separated=20process=5Fmonster=5Fmovemen?= =?utf8?q?t()=20from=20process=5Fmonster()?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- src/monster-process.c | 230 +++++++++++++++++++++++++++----------------------- 1 file changed, 126 insertions(+), 104 deletions(-) diff --git a/src/monster-process.c b/src/monster-process.c index 5733dd2eb..4fbf55319 100644 --- a/src/monster-process.c +++ b/src/monster-process.c @@ -82,6 +82,7 @@ void exe_monster_attack_to_player(player_type *target_ptr, turn_flags *turn_flag bool process_monster_attack_to_monster(player_type *target_ptr, turn_flags *turn_flags_ptr, MONSTER_IDX m_idx, grid_type *g_ptr, bool can_cross); bool exe_monster_attack_to_monster(player_type *target_ptr, MONSTER_IDX m_idx, grid_type *g_ptr); +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); bool process_post_dig_wall(player_type *target_ptr, turn_flags *turn_flags_ptr, monster_type *m_ptr, POSITION ny, POSITION nx); bool update_riding_monster(player_type *target_ptr, turn_flags *turn_flags_ptr, MONSTER_IDX m_idx, POSITION oy, POSITION ox, POSITION ny, POSITION nx); @@ -1091,7 +1092,6 @@ void process_monster(player_type *target_ptr, MONSTER_IDX m_idx) { monster_type *m_ptr = &target_ptr->current_floor_ptr->m_list[m_idx]; monster_race *r_ptr = &r_info[m_ptr->r_idx]; - monster_race *ap_r_ptr = &r_info[m_ptr->ap_r_idx]; DIRECTION mm[8]; turn_flags tmp_flags; @@ -1168,107 +1168,7 @@ void process_monster(player_type *target_ptr, MONSTER_IDX m_idx) if (!decide_monster_movement_direction(target_ptr, mm, m_idx, aware)) return; int count = 0; - for (int i = 0; mm[i]; i++) - { - int d = mm[i]; - if (d == 5) d = ddd[randint0(8)]; - - POSITION ny = oy + ddy[d]; - POSITION nx = ox + ddx[d]; - if (!in_bounds2(target_ptr->current_floor_ptr, ny, nx)) continue; - - grid_type *g_ptr; - g_ptr = &target_ptr->current_floor_ptr->grid_array[ny][nx]; - bool can_cross = monster_can_cross_terrain(target_ptr, g_ptr->feat, r_ptr, turn_flags_ptr->is_riding_mon ? CEM_RIDING : 0); - - if (!process_wall(target_ptr, turn_flags_ptr, m_ptr, ny, nx, can_cross)) - { - if (!process_door(target_ptr, turn_flags_ptr, m_ptr, ny, nx)) - return; - } - - if (!process_protection_rune(target_ptr, turn_flags_ptr, m_ptr, ny, nx)) - { - if (!process_explosive_rune(target_ptr, turn_flags_ptr, m_ptr, ny, nx)) - return; - } - - exe_monster_attack_to_player(target_ptr, turn_flags_ptr, m_idx, ny, nx); - if (process_monster_attack_to_monster(target_ptr, turn_flags_ptr, m_idx, g_ptr, can_cross)) return; - - if (turn_flags_ptr->is_riding_mon) - { - if (!target_ptr->riding_ryoute && !MON_MONFEAR(&target_ptr->current_floor_ptr->m_list[target_ptr->riding])) turn_flags_ptr->do_move = FALSE; - } - - if (!process_post_dig_wall(target_ptr, turn_flags_ptr, m_ptr, ny, nx)) return; - - if (turn_flags_ptr->must_alter_to_move && (r_ptr->flags7 & RF7_AQUATIC)) - { - if (!monster_can_cross_terrain(target_ptr, g_ptr->feat, r_ptr, turn_flags_ptr->is_riding_mon ? CEM_RIDING : 0)) - turn_flags_ptr->do_move = FALSE; - } - - if (turn_flags_ptr->do_move && !can_cross && !turn_flags_ptr->did_kill_wall && !turn_flags_ptr->did_bash_door) - turn_flags_ptr->do_move = FALSE; - - if (turn_flags_ptr->do_move && (r_ptr->flags1 & RF1_NEVER_MOVE)) - { - if (is_original_ap_and_seen(target_ptr, m_ptr)) - r_ptr->r_flags1 |= (RF1_NEVER_MOVE); - - turn_flags_ptr->do_move = FALSE; - } - - if (!turn_flags_ptr->do_move) - { - if (turn_flags_ptr->do_turn) break; - - continue; - } - - turn_flags_ptr->do_turn = TRUE; - feature_type *f_ptr; - f_ptr = &f_info[g_ptr->feat]; - if (have_flag(f_ptr->flags, FF_TREE)) - { - if (!(r_ptr->flags7 & RF7_CAN_FLY) && !(r_ptr->flags8 & RF8_WILD_WOOD)) - { - m_ptr->energy_need += ENERGY_NEED(); - } - } - - if (!update_riding_monster(target_ptr, turn_flags_ptr, m_idx, oy, ox, ny, nx)) break; - - if (m_ptr->ml && - (disturb_move || - (disturb_near && (m_ptr->mflag & MFLAG_VIEW) && projectable(target_ptr, target_ptr->y, target_ptr->x, m_ptr->fy, m_ptr->fx)) || - (disturb_high && ap_r_ptr->r_tkills && ap_r_ptr->level >= target_ptr->lev))) - { - if (is_hostile(m_ptr)) - disturb(target_ptr, FALSE, TRUE); - } - - bool is_takable_or_killable = g_ptr->o_idx > 0; - is_takable_or_killable &= (r_ptr->flags2 & (RF2_TAKE_ITEM | RF2_KILL_ITEM)) != 0; - - bool is_pickup_items = (target_ptr->pet_extra_flags & PF_PICKUP_ITEMS) != 0; - is_pickup_items &= (r_ptr->flags2 & RF2_TAKE_ITEM) != 0; - - is_takable_or_killable &= !is_pet(m_ptr) || is_pickup_items; - if (!is_takable_or_killable) - { - if (turn_flags_ptr->do_turn) break; - - continue; - } - - update_object_by_monster_movement(target_ptr, turn_flags_ptr, m_idx, ny, nx); - - if (turn_flags_ptr->do_turn) break; - - count++; - } + if(!process_monster_movement(target_ptr, turn_flags_ptr, m_idx, mm, oy, ox, &count)) return; /* * Forward movements failed, but now received LOS attack! @@ -1864,6 +1764,128 @@ bool cast_spell(player_type *target_ptr, MONSTER_IDX m_idx, bool aware) /*! + * @brief モンスターの移動に関するメインルーチン + * @param target_ptr プレーヤーへの参照ポインタ + * @param turn_flags_ptr ターン経過処理フラグへの参照ポインタ + * @param m_idx モンスターID + * @param mm モンスターの移動方向 + * @param oy 移動前の、モンスターのY座標 + * @param ox 移動前の、モンスターのX座標 + * @param count 移動回数 (のはず todo) + * @return 移動が阻害される何か (ドア等)があったらFALSE + */ +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) +{ + for (int i = 0; mm[i]; i++) + { + int d = mm[i]; + if (d == 5) d = ddd[randint0(8)]; + + POSITION ny = oy + ddy[d]; + POSITION nx = ox + ddx[d]; + if (!in_bounds2(target_ptr->current_floor_ptr, ny, nx)) continue; + + grid_type *g_ptr; + g_ptr = &target_ptr->current_floor_ptr->grid_array[ny][nx]; + monster_type *m_ptr = &target_ptr->current_floor_ptr->m_list[m_idx]; + monster_race *r_ptr = &r_info[m_ptr->r_idx]; + bool can_cross = monster_can_cross_terrain(target_ptr, g_ptr->feat, r_ptr, turn_flags_ptr->is_riding_mon ? CEM_RIDING : 0); + + if (!process_wall(target_ptr, turn_flags_ptr, m_ptr, ny, nx, can_cross)) + { + if (!process_door(target_ptr, turn_flags_ptr, m_ptr, ny, nx)) + return FALSE; + } + + if (!process_protection_rune(target_ptr, turn_flags_ptr, m_ptr, ny, nx)) + { + if (!process_explosive_rune(target_ptr, turn_flags_ptr, m_ptr, ny, nx)) + return FALSE; + } + + exe_monster_attack_to_player(target_ptr, turn_flags_ptr, m_idx, ny, nx); + if (process_monster_attack_to_monster(target_ptr, turn_flags_ptr, m_idx, g_ptr, can_cross)) return FALSE; + + if (turn_flags_ptr->is_riding_mon) + { + if (!target_ptr->riding_ryoute && !MON_MONFEAR(&target_ptr->current_floor_ptr->m_list[target_ptr->riding])) turn_flags_ptr->do_move = FALSE; + } + + if (!process_post_dig_wall(target_ptr, turn_flags_ptr, m_ptr, ny, nx)) return FALSE; + + if (turn_flags_ptr->must_alter_to_move && (r_ptr->flags7 & RF7_AQUATIC)) + { + if (!monster_can_cross_terrain(target_ptr, g_ptr->feat, r_ptr, turn_flags_ptr->is_riding_mon ? CEM_RIDING : 0)) + turn_flags_ptr->do_move = FALSE; + } + + if (turn_flags_ptr->do_move && !can_cross && !turn_flags_ptr->did_kill_wall && !turn_flags_ptr->did_bash_door) + turn_flags_ptr->do_move = FALSE; + + if (turn_flags_ptr->do_move && (r_ptr->flags1 & RF1_NEVER_MOVE)) + { + if (is_original_ap_and_seen(target_ptr, m_ptr)) + r_ptr->r_flags1 |= (RF1_NEVER_MOVE); + + turn_flags_ptr->do_move = FALSE; + } + + if (!turn_flags_ptr->do_move) + { + if (turn_flags_ptr->do_turn) break; + + continue; + } + + turn_flags_ptr->do_turn = TRUE; + feature_type *f_ptr; + f_ptr = &f_info[g_ptr->feat]; + if (have_flag(f_ptr->flags, FF_TREE)) + { + if (!(r_ptr->flags7 & RF7_CAN_FLY) && !(r_ptr->flags8 & RF8_WILD_WOOD)) + { + m_ptr->energy_need += ENERGY_NEED(); + } + } + + if (!update_riding_monster(target_ptr, turn_flags_ptr, m_idx, oy, ox, ny, nx)) break; + + monster_race *ap_r_ptr = &r_info[m_ptr->ap_r_idx]; + if (m_ptr->ml && + (disturb_move || + (disturb_near && (m_ptr->mflag & MFLAG_VIEW) && projectable(target_ptr, target_ptr->y, target_ptr->x, m_ptr->fy, m_ptr->fx)) || + (disturb_high && ap_r_ptr->r_tkills && ap_r_ptr->level >= target_ptr->lev))) + { + if (is_hostile(m_ptr)) + disturb(target_ptr, FALSE, TRUE); + } + + bool is_takable_or_killable = g_ptr->o_idx > 0; + is_takable_or_killable &= (r_ptr->flags2 & (RF2_TAKE_ITEM | RF2_KILL_ITEM)) != 0; + + bool is_pickup_items = (target_ptr->pet_extra_flags & PF_PICKUP_ITEMS) != 0; + is_pickup_items &= (r_ptr->flags2 & RF2_TAKE_ITEM) != 0; + + is_takable_or_killable &= !is_pet(m_ptr) || is_pickup_items; + if (!is_takable_or_killable) + { + if (turn_flags_ptr->do_turn) break; + + continue; + } + + update_object_by_monster_movement(target_ptr, turn_flags_ptr, m_idx, ny, nx); + + if (turn_flags_ptr->do_turn) break; + + *count++; + } + + return TRUE; +} + + +/*! * @brief モンスターによる壁の透過・破壊を行う * @param target_ptr プレーヤーへの参照ポインタ * @param m_ptr モンスターへの参照ポインタ @@ -2124,8 +2146,8 @@ bool process_explosive_rune(player_type *target_ptr, turn_flags *turn_flags_ptr, * @param target_ptr プレーヤーへの参照ポインタ * @param turn_flags_ptr ターン経過処理フラグへの参照ポインタ * @param m_idx モンスターID - * @param ny モンスターのY座標 - * @param nx モンスターのX座標 + * @param ny 移動後の、モンスターのY座標 + * @param nx 移動後の、モンスターのX座標 * @return なし * @details * 反攻撃の洞窟など、直接攻撃ができない場所では処理をスキップする -- 2.11.0