X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=src%2Fmonster-process.c;h=f623d6d0b97f9d9a529085dc837618e3ef9b96aa;hb=73cc25b91b1598b5f2a7ba0279bba383333ab81d;hp=64b87def7d1481c229105e77221ea686af09aca9;hpb=9b6c431ee8cfd7a4902dc5fc2873a9a6a3c034c8;p=hengband%2Fhengband.git diff --git a/src/monster-process.c b/src/monster-process.c index 64b87def7..f623d6d0b 100644 --- a/src/monster-process.c +++ b/src/monster-process.c @@ -15,6 +15,16 @@ #include "angband.h" #include "cmd-pet.h" +#include "monsterrace-hook.h" +#include "melee.h" +#include "projection.h" +#include "spells-summon.h" +#include "quest.h" +#include "avatar.h" +#include "realm-hex.h" +#include "object-hook.h" +#include "feature.h" +#include "grid.h" /*! @@ -27,14 +37,13 @@ static bool get_enemy_dir(MONSTER_IDX m_idx, int *mm) { int i; - int x = 0, y = 0; + POSITION x = 0, y = 0; IDX t_idx; int start; int plus = 1; monster_type *m_ptr = &m_list[m_idx]; monster_race *r_ptr = &r_info[m_ptr->r_idx]; - monster_type *t_ptr; if (riding_t_m_idx && player_bold(m_ptr->fy, m_ptr->fx)) @@ -84,8 +93,7 @@ static bool get_enemy_dir(MONSTER_IDX m_idx, int *mm) } } /* Hack -- no fighting away from player */ - else if ((m_ptr->cdis < t_ptr->cdis) && - (t_ptr->cdis > p_ptr->pet_follow_distance)) + else if ((m_ptr->cdis < t_ptr->cdis) && (t_ptr->cdis > p_ptr->pet_follow_distance)) { continue; } @@ -187,16 +195,17 @@ static bool get_enemy_dir(MONSTER_IDX m_idx, int *mm) * Hack, based on mon_take_hit... perhaps all monster attacks on other monsters should use this? * @param m_idx 目標となるモンスターの参照ID * @param dam ダメージ量 - * @param fear 目標となるモンスターの恐慌状態を返す参照ポインタ + * @param dead 目標となったモンスターの死亡状態を返す参照ポインタ + * @param fear 目標となったモンスターの恐慌状態を返す参照ポインタ * @param note 目標モンスターが死亡した場合の特別メッセージ(NULLならば標準表示を行う) * @param who 打撃を行ったモンスターの参照ID * @return なし */ -void mon_take_hit_mon(MONSTER_IDX m_idx, HIT_POINT dam, bool *fear, cptr note, IDX who) +void mon_take_hit_mon(MONSTER_IDX m_idx, HIT_POINT dam, bool *dead, bool *fear, concptr note, IDX who) { monster_type *m_ptr = &m_list[m_idx]; monster_race *r_ptr = &r_info[m_ptr->r_idx]; - char m_name[160]; + GAME_TEXT m_name[160]; bool seen = is_seen(m_ptr); /* Can the player be aware of this attack? */ @@ -212,10 +221,9 @@ void mon_take_hit_mon(MONSTER_IDX m_idx, HIT_POINT dam, bool *fear, cptr note, I if (p_ptr->riding == m_idx) p_ptr->redraw |= (PR_UHEALTH); } - /* Wake it up */ (void)set_monster_csleep(m_idx, 0); - if (p_ptr->riding && (m_idx == p_ptr->riding)) disturb(1, 1); + if (p_ptr->riding && (m_idx == p_ptr->riding)) disturb(TRUE, TRUE); if (MON_INVULNER(m_ptr) && randint0(PENETRATE_INVULNERABILITY)) { @@ -223,7 +231,6 @@ void mon_take_hit_mon(MONSTER_IDX m_idx, HIT_POINT dam, bool *fear, cptr note, I { msg_format(_("%^sはダメージを受けない。", "%^s is unharmed."), m_name); } - return; } @@ -245,7 +252,7 @@ void mon_take_hit_mon(MONSTER_IDX m_idx, HIT_POINT dam, bool *fear, cptr note, I } /* Hurt it */ - m_ptr->hp -= (s16b)dam; + m_ptr->hp -= dam; /* It is dead now... or is it? */ if (m_ptr->hp < 0) @@ -259,7 +266,7 @@ void mon_take_hit_mon(MONSTER_IDX m_idx, HIT_POINT dam, bool *fear, cptr note, I else { /* Make a sound */ - if (!monster_living(r_ptr)) + if (!monster_living(m_ptr->r_idx)) { sound(SOUND_N_KILL); } @@ -268,6 +275,8 @@ void mon_take_hit_mon(MONSTER_IDX m_idx, HIT_POINT dam, bool *fear, cptr note, I sound(SOUND_KILL); } + *dead = TRUE; + if (known) { monster_desc(m_name, m_ptr, MD_TRUE_NAME); @@ -282,7 +291,7 @@ void mon_take_hit_mon(MONSTER_IDX m_idx, HIT_POINT dam, bool *fear, cptr note, I msg_format(_("%^s%s", "%^s%s"), m_name, note); } /* Death by normal attack -- nonliving monster */ - else if (!monster_living(r_ptr)) + else if (!monster_living(m_ptr->r_idx)) { msg_format(_("%^sは破壊された。", "%^s is destroyed."), m_name); } @@ -294,11 +303,7 @@ void mon_take_hit_mon(MONSTER_IDX m_idx, HIT_POINT dam, bool *fear, cptr note, I } monster_gain_exp(who, m_ptr->r_idx); - - /* Generate treasure */ monster_death(m_idx, FALSE); - - /* Delete the monster */ delete_monster_idx(m_idx); /* Not afraid */ @@ -309,6 +314,8 @@ void mon_take_hit_mon(MONSTER_IDX m_idx, HIT_POINT dam, bool *fear, cptr note, I } } + *dead = FALSE; + #ifdef ALLOW_FEAR /* Mega-Hack -- Pain cancels fear */ @@ -338,7 +345,7 @@ void mon_take_hit_mon(MONSTER_IDX m_idx, HIT_POINT dam, bool *fear, cptr note, I /* Hack -- note fear */ (*fear) = TRUE; - /* XXX XXX XXX Hack -- Add some timed fear */ + /* Hack -- Add some timed fear */ (void)set_monster_monfear(m_idx, (randint1(10) + (((dam >= m_ptr->hp) && (percentage > 7)) ? 20 : ((11 - percentage) * 5)))); @@ -396,7 +403,8 @@ static bool mon_will_run(MONSTER_IDX m_idx) monster_race *r_ptr = &r_info[m_ptr->r_idx]; - u16b p_lev, m_lev; + PLAYER_LEVEL p_lev; + DEPTH m_lev; HIT_POINT p_chp, p_mhp; HIT_POINT m_chp, m_mhp; u32b p_val, m_val; @@ -467,7 +475,7 @@ static bool get_moves_aux2(MONSTER_IDX m_idx, POSITION *yp, POSITION *xp) int i, best = 999; POSITION y, x, y1, x1; - cave_type *c_ptr; + grid_type *g_ptr; bool can_open_door = FALSE; int now_cost; @@ -482,7 +490,7 @@ static bool get_moves_aux2(MONSTER_IDX m_idx, POSITION *yp, POSITION *xp) if (projectable(y1, x1, p_ptr->y, p_ptr->x)) return (FALSE); /* Set current grid cost */ - now_cost = cave[y1][x1].cost; + now_cost = current_floor_ptr->grid_array[y1][x1].cost; if (now_cost == 0) now_cost = 999; /* Can monster bash or open doors? */ @@ -496,7 +504,6 @@ static bool get_moves_aux2(MONSTER_IDX m_idx, POSITION *yp, POSITION *xp) { int cost; - /* Get the location */ y = y1 + ddy_ddd[i]; x = x1 + ddx_ddd[i]; @@ -506,15 +513,15 @@ static bool get_moves_aux2(MONSTER_IDX m_idx, POSITION *yp, POSITION *xp) /* Simply move to player */ if (player_bold(y, x)) return (FALSE); - c_ptr = &cave[y][x]; + g_ptr = ¤t_floor_ptr->grid_array[y][x]; - cost = c_ptr->cost; + cost = g_ptr->cost; /* Monster cannot kill or pass walls */ if (!(((r_ptr->flags2 & RF2_PASS_WALL) && ((m_idx != p_ptr->riding) || p_ptr->pass_wall)) || ((r_ptr->flags2 & RF2_KILL_WALL) && (m_idx != p_ptr->riding)))) { if (cost == 0) continue; - if (!can_open_door && is_closed_door(c_ptr->feat)) continue; + if (!can_open_door && is_closed_door(g_ptr->feat)) continue; } /* Hack -- for kill or pass wall monster.. */ @@ -573,7 +580,7 @@ static bool get_moves_aux(MONSTER_IDX m_idx, POSITION *yp, POSITION *xp, bool no int i, best; POSITION y, x, y1, x1; - cave_type *c_ptr; + grid_type *g_ptr; bool use_scent = FALSE; monster_type *m_ptr = &m_list[m_idx]; @@ -603,19 +610,19 @@ static bool get_moves_aux(MONSTER_IDX m_idx, POSITION *yp, POSITION *xp, bool no if (player_has_los_bold(y1, x1) && projectable(p_ptr->y, p_ptr->x, y1, x1)) return (FALSE); /* Monster grid */ - c_ptr = &cave[y1][x1]; + g_ptr = ¤t_floor_ptr->grid_array[y1][x1]; /* If we can hear noises, advance towards them */ - if (c_ptr->cost) + if (g_ptr->cost) { best = 999; } /* Otherwise, try to follow a scent trail */ - else if (c_ptr->when) + else if (g_ptr->when) { /* Too old smell */ - if (cave[p_ptr->y][p_ptr->x].when - c_ptr->when > 127) return (FALSE); + if (current_floor_ptr->grid_array[p_ptr->y][p_ptr->x].when - g_ptr->when > 127) return (FALSE); use_scent = TRUE; best = 0; @@ -630,19 +637,18 @@ static bool get_moves_aux(MONSTER_IDX m_idx, POSITION *yp, POSITION *xp, bool no /* Check nearby grids, diagonals first */ for (i = 7; i >= 0; i--) { - /* Get the location */ y = y1 + ddy_ddd[i]; x = x1 + ddx_ddd[i]; /* Ignore locations off of edge */ if (!in_bounds2(y, x)) continue; - c_ptr = &cave[y][x]; + g_ptr = ¤t_floor_ptr->grid_array[y][x]; /* We're following a scent trail */ if (use_scent) { - int when = c_ptr->when; + int when = g_ptr->when; /* Accept younger scent */ if (best > when) continue; @@ -655,8 +661,8 @@ static bool get_moves_aux(MONSTER_IDX m_idx, POSITION *yp, POSITION *xp, bool no int cost; if (r_ptr->flags2 & (RF2_BASH_DOOR | RF2_OPEN_DOOR)) - cost = c_ptr->dist; - else cost = c_ptr->cost; + cost = g_ptr->dist; + else cost = g_ptr->cost; /* Accept louder sounds */ if ((cost == 0) || (best < cost)) continue; @@ -707,9 +713,8 @@ static bool get_fear_moves_aux(MONSTER_IDX m_idx, POSITION *yp, POSITION *xp) /* Check nearby grids, diagonals first */ for (i = 7; i >= 0; i--) { - int dis, s; + POSITION dis, s; - /* Get the location */ y = fy + ddy_ddd[i]; x = fx + ddx_ddd[i]; @@ -717,13 +722,13 @@ static bool get_fear_moves_aux(MONSTER_IDX m_idx, POSITION *yp, POSITION *xp) if (!in_bounds2(y, x)) continue; /* Don't move toward player */ - /* if (cave[y][x].dist < 3) continue; */ /* Hmm.. Need it? */ + /* if (current_floor_ptr->grid_array[y][x].dist < 3) continue; */ /* Hmm.. Need it? */ /* Calculate distance of this grid from our destination */ dis = distance(y, x, y1, x1); /* Score this grid */ - s = 5000 / (dis + 3) - 500 / (cave[y][x].dist + 1); + s = 5000 / (dis + 3) - 500 / (current_floor_ptr->grid_array[y][x].dist + 1); /* No negative scores */ if (s < 0) s = 0; @@ -764,122 +769,99 @@ static bool get_fear_moves_aux(MONSTER_IDX m_idx, POSITION *yp, POSITION *xp) * It is probably better to replace these arrays with code to compute * the relevant arrays, even if the storage is pre-allocated in hard * coded sizes. At the very least, code should be included which is - * able to generate and dump these arrays (ala "los()"). XXX XXX XXX + * able to generate and dump these arrays (ala "los()"). * - * Also, the storage needs could be halved by using bytes. XXX XXX XXX + * Also, the storage needs could be halved by using bytes. * * These arrays could be combined into two big arrays, using sub-arrays * to hold the offsets and lengths of each portion of the sub-arrays, and - * this could perhaps also be used somehow in the "look" code. XXX XXX XXX + * this could perhaps also be used somehow in the "look" code. */ -static sint d_off_y_0[] = -{ 0 }; - -static sint d_off_x_0[] = -{ 0 }; - - -static sint d_off_y_1[] = -{ -1, -1, -1, 0, 0, 1, 1, 1, 0 }; - -static sint d_off_x_1[] = -{ -1, 0, 1, -1, 1, -1, 0, 1, 0 }; - +static POSITION d_off_y_0[] = { 0 }; +static POSITION d_off_x_0[] = { 0 }; -static sint d_off_y_2[] = -{ -1, -1, -2, -2, -2, 0, 0, 1, 1, 2, 2, 2, 0 }; +static POSITION d_off_y_1[] = { -1, -1, -1, 0, 0, 1, 1, 1, 0 }; +static POSITION d_off_x_1[] = { -1, 0, 1, -1, 1, -1, 0, 1, 0 }; -static sint d_off_x_2[] = -{ -2, 2, -1, 0, 1, -2, 2, -2, 2, -1, 0, 1, 0 }; +static POSITION d_off_y_2[] = { -1, -1, -2, -2, -2, 0, 0, 1, 1, 2, 2, 2, 0 }; +static POSITION d_off_x_2[] = { -2, 2, -1, 0, 1, -2, 2, -2, 2, -1, 0, 1, 0 }; +static POSITION d_off_y_3[] = { -1, -1, -2, -2, -3, -3, -3, 0, 0, 1, 1, 2, 2, 3, 3, 3, 0 }; +static POSITION d_off_x_3[] = { -3, 3, -2, 2, -1, 0, 1, -3, 3, -3, 3, -2, 2, -1, 0, 1, 0 }; -static sint d_off_y_3[] = -{ -1, -1, -2, -2, -3, -3, -3, 0, 0, 1, 1, 2, 2, - 3, 3, 3, 0 }; +static POSITION d_off_y_4[] = { -1, -1, -2, -2, -3, -3, -3, -3, -4, -4, -4, 0, 0, 1, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 0 }; +static POSITION d_off_x_4[] = { -4, 4, -3, 3, -2, -3, 2, 3, -1, 0, 1, -4, 4, -4, 4, -3, 3, -2, -3, 2, 3, -1, 0, 1, 0 }; -static sint d_off_x_3[] = -{ -3, 3, -2, 2, -1, 0, 1, -3, 3, -3, 3, -2, 2, - -1, 0, 1, 0 }; - -static sint d_off_y_4[] = -{ -1, -1, -2, -2, -3, -3, -3, -3, -4, -4, -4, 0, - 0, 1, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 0 }; - -static sint d_off_x_4[] = -{ -4, 4, -3, 3, -2, -3, 2, 3, -1, 0, 1, -4, 4, - -4, 4, -3, 3, -2, -3, 2, 3, -1, 0, 1, 0 }; - - -static sint d_off_y_5[] = +static POSITION d_off_y_5[] = { -1, -1, -2, -2, -3, -3, -4, -4, -4, -4, -5, -5, -5, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 4, 5, 5, 5, 0 }; -static sint d_off_x_5[] = +static POSITION d_off_x_5[] = { -5, 5, -4, 4, -4, 4, -2, -3, 2, 3, -1, 0, 1, -5, 5, -5, 5, -4, 4, -4, 4, -2, -3, 2, 3, -1, 0, 1, 0 }; -static sint d_off_y_6[] = +static POSITION d_off_y_6[] = { -1, -1, -2, -2, -3, -3, -4, -4, -5, -5, -5, -5, -6, -6, -6, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 5, 5, 6, 6, 6, 0 }; -static sint d_off_x_6[] = +static POSITION d_off_x_6[] = { -6, 6, -5, 5, -5, 5, -4, 4, -2, -3, 2, 3, -1, 0, 1, -6, 6, -6, 6, -5, 5, -5, 5, -4, 4, -2, -3, 2, 3, -1, 0, 1, 0 }; -static sint d_off_y_7[] = +static POSITION d_off_y_7[] = { -1, -1, -2, -2, -3, -3, -4, -4, -5, -5, -5, -5, -6, -6, -6, -6, -7, -7, -7, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 0 }; -static sint d_off_x_7[] = +static POSITION d_off_x_7[] = { -7, 7, -6, 6, -6, 6, -5, 5, -4, -5, 4, 5, -2, -3, 2, 3, -1, 0, 1, -7, 7, -7, 7, -6, 6, -6, 6, -5, 5, -4, -5, 4, 5, -2, -3, 2, 3, -1, 0, 1, 0 }; -static sint d_off_y_8[] = +static POSITION d_off_y_8[] = { -1, -1, -2, -2, -3, -3, -4, -4, -5, -5, -6, -6, -6, -6, -7, -7, -7, -7, -8, -8, -8, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 0 }; -static sint d_off_x_8[] = +static POSITION d_off_x_8[] = { -8, 8, -7, 7, -7, 7, -6, 6, -6, 6, -4, -5, 4, 5, -2, -3, 2, 3, -1, 0, 1, -8, 8, -8, 8, -7, 7, -7, 7, -6, 6, -6, 6, -4, -5, 4, 5, -2, -3, 2, 3, -1, 0, 1, 0 }; -static sint d_off_y_9[] = +static POSITION d_off_y_9[] = { -1, -1, -2, -2, -3, -3, -4, -4, -5, -5, -6, -6, -7, -7, -7, -7, -8, -8, -8, -8, -9, -9, -9, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 0 }; -static sint d_off_x_9[] = +static POSITION d_off_x_9[] = { -9, 9, -8, 8, -8, 8, -7, 7, -7, 7, -6, 6, -4, -5, 4, 5, -2, -3, 2, 3, -1, 0, 1, -9, 9, -9, 9, -8, 8, -8, 8, -7, 7, -7, 7, -6, 6, -4, -5, 4, 5, -2, -3, 2, 3, -1, 0, 1, 0 }; -static sint *dist_offsets_y[10] = +static POSITION *dist_offsets_y[10] = { d_off_y_0, d_off_y_1, d_off_y_2, d_off_y_3, d_off_y_4, d_off_y_5, d_off_y_6, d_off_y_7, d_off_y_8, d_off_y_9 }; -static sint *dist_offsets_x[10] = +static POSITION *dist_offsets_x[10] = { d_off_x_0, d_off_x_1, d_off_x_2, d_off_x_3, d_off_x_4, d_off_x_5, d_off_x_6, d_off_x_7, d_off_x_8, d_off_x_9 @@ -913,10 +895,10 @@ static bool find_safety(MONSTER_IDX m_idx, POSITION *yp, POSITION *xp) POSITION y, x, dy, dx, d, dis, i; POSITION gy = 0, gx = 0, gdis = 0; - sint *y_offsets; - sint *x_offsets; + POSITION *y_offsets; + POSITION *x_offsets; - cave_type *c_ptr; + grid_type *g_ptr; /* Start with adjacent locations, spread further */ for (d = 1; d < 10; d++) @@ -936,19 +918,19 @@ static bool find_safety(MONSTER_IDX m_idx, POSITION *yp, POSITION *xp) /* Skip illegal locations */ if (!in_bounds(y, x)) continue; - c_ptr = &cave[y][x]; + g_ptr = ¤t_floor_ptr->grid_array[y][x]; /* Skip locations in a wall */ - if (!monster_can_cross_terrain(c_ptr->feat, &r_info[m_ptr->r_idx], (m_idx == p_ptr->riding) ? CEM_RIDING : 0)) continue; + if (!monster_can_cross_terrain(g_ptr->feat, &r_info[m_ptr->r_idx], (m_idx == p_ptr->riding) ? CEM_RIDING : 0)) continue; /* Check for "availability" (if monsters can flow) */ if (!(m_ptr->mflag2 & MFLAG2_NOFLOW)) { /* Ignore grids very far from the player */ - if (c_ptr->dist == 0) continue; + if (g_ptr->dist == 0) continue; /* Ignore too-distant grids */ - if (c_ptr->dist > cave[fy][fx].dist + 2 * d) continue; + if (g_ptr->dist > current_floor_ptr->grid_array[fy][fx].dist + 2 * d) continue; } /* Check for absence of shot (more or less) */ @@ -1008,7 +990,7 @@ static bool find_hiding(MONSTER_IDX m_idx, POSITION *yp, POSITION *xp) POSITION y, x, dy, dx, d, dis, i; POSITION gy = 0, gx = 0, gdis = 999; - sint *y_offsets, *x_offsets; + POSITION *y_offsets, *x_offsets; /* Start with adjacent locations, spread further */ for (d = 1; d < 10; d++) @@ -1071,7 +1053,7 @@ static bool find_hiding(MONSTER_IDX m_idx, POSITION *yp, POSITION *xp) * @param mm 移動方向を返す方向IDの参照ポインタ * @return 有効方向があった場合TRUEを返す */ -static bool get_moves(MONSTER_IDX m_idx, int *mm) +static bool get_moves(MONSTER_IDX m_idx, DIRECTION *mm) { monster_type *m_ptr = &m_list[m_idx]; monster_race *r_ptr = &r_info[m_ptr->r_idx]; @@ -1081,14 +1063,14 @@ static bool get_moves(MONSTER_IDX m_idx, int *mm) POSITION x2 = p_ptr->x; bool done = FALSE; bool will_run = mon_will_run(m_idx); - cave_type *c_ptr; - bool no_flow = ((m_ptr->mflag2 & MFLAG2_NOFLOW) && (cave[m_ptr->fy][m_ptr->fx].cost > 2)); + grid_type *g_ptr; + bool no_flow = ((m_ptr->mflag2 & MFLAG2_NOFLOW) && (current_floor_ptr->grid_array[m_ptr->fy][m_ptr->fx].cost > 2)); bool can_pass_wall = ((r_ptr->flags2 & RF2_PASS_WALL) && ((m_idx != p_ptr->riding) || p_ptr->pass_wall)); /* Counter attack to an enemy monster */ if (!will_run && m_ptr->target_y) { - int t_m_idx = cave[m_ptr->target_y][m_ptr->target_x].m_idx; + int t_m_idx = current_floor_ptr->grid_array[m_ptr->target_y][m_ptr->target_x].m_idx; /* The monster must be an enemy, and in LOS */ if (t_m_idx && @@ -1106,7 +1088,7 @@ static bool get_moves(MONSTER_IDX m_idx, int *mm) if (!done && !will_run && is_hostile(m_ptr) && (r_ptr->flags1 & RF1_FRIENDS) && ((los(m_ptr->fy, m_ptr->fx, p_ptr->y, p_ptr->x) && projectable(m_ptr->fy, m_ptr->fx, p_ptr->y, p_ptr->x)) || - (cave[m_ptr->fy][m_ptr->fx].dist < MAX_SIGHT / 2))) + (current_floor_ptr->grid_array[m_ptr->fy][m_ptr->fx].dist < MAX_SIGHT / 2))) { /* * Animal packs try to get the player out of corridors @@ -1125,16 +1107,16 @@ static bool get_moves(MONSTER_IDX m_idx, int *mm) if (!in_bounds2(yy, xx)) continue; - c_ptr = &cave[yy][xx]; + g_ptr = ¤t_floor_ptr->grid_array[yy][xx]; /* Check grid */ - if (monster_can_cross_terrain(c_ptr->feat, r_ptr, 0)) + if (monster_can_cross_terrain(g_ptr->feat, r_ptr, 0)) { /* One more room grid */ room++; } } - if (cave[p_ptr->y][p_ptr->x].info & CAVE_ROOM) room -= 2; + if (current_floor_ptr->grid_array[p_ptr->y][p_ptr->x].info & CAVE_ROOM) room -= 2; if (!r_ptr->flags4 && !r_ptr->a_ability_flags1 && !r_ptr->a_ability_flags2) room -= 2; /* Not in a room and strong player */ @@ -1147,7 +1129,7 @@ static bool get_moves(MONSTER_IDX m_idx, int *mm) } /* Monster groups try to surround the player */ - if (!done && (cave[m_ptr->fy][m_ptr->fx].dist < 3)) + if (!done && (current_floor_ptr->grid_array[m_ptr->fy][m_ptr->fx].dist < 3)) { int i; @@ -1181,7 +1163,6 @@ static bool get_moves(MONSTER_IDX m_idx, int *mm) y = m_ptr->fy - y2; x = m_ptr->fx - x2; - /* Done */ done = TRUE; } } @@ -1406,7 +1387,7 @@ static bool get_moves(MONSTER_IDX m_idx, int *mm) * @param stun 攻撃側モンスターが朦朧状態ならTRUEを返す * @return 命中ならばTRUEを返す */ -static int check_hit2(int power, int level, int ac, int stun) +static int check_hit2(int power, DEPTH level, ARMOUR_CLASS ac, int stun) { int i, k; @@ -1441,7 +1422,7 @@ static int check_hit2(int power, int level, int ac, int stun) * @param t_idx 目標側モンスターの参照ID * @return 実際に打撃処理が行われた場合TRUEを返す */ -static bool monst_attack_monst(MONSTER_IDX m_idx, IDX t_idx) +static bool monst_attack_monst(MONSTER_IDX m_idx, MONSTER_IDX t_idx) { monster_type *m_ptr = &m_list[m_idx]; monster_type *t_ptr = &m_list[t_idx]; @@ -1449,14 +1430,16 @@ static bool monst_attack_monst(MONSTER_IDX m_idx, IDX t_idx) monster_race *r_ptr = &r_info[m_ptr->r_idx]; monster_race *tr_ptr = &r_info[t_ptr->r_idx]; - int ap_cnt; - int ac, rlev, pt; - char m_name[80], t_name[80]; + ARMOUR_CLASS ap_cnt; + ARMOUR_CLASS ac; + DEPTH rlev; + int pt; + GAME_TEXT m_name[MAX_NLEN], t_name[MAX_NLEN]; char temp[MAX_NLEN]; bool blinked; - bool explode = FALSE, touched = FALSE, fear = FALSE; - int y_saver = t_ptr->fy; - int x_saver = t_ptr->fx; + bool explode = FALSE, touched = FALSE, fear = FALSE, dead = FALSE; + POSITION y_saver = t_ptr->fy; + POSITION x_saver = t_ptr->fx; int effect_type; bool see_m = is_seen(m_ptr); @@ -1473,7 +1456,7 @@ static bool monst_attack_monst(MONSTER_IDX m_idx, IDX t_idx) /* Not allowed to attack */ if (r_ptr->flags1 & RF1_NEVER_BLOW) return FALSE; - if (d_info[dungeon_type].flags1 & DF1_NO_MELEE) return (FALSE); + if (d_info[p_ptr->dungeon_idx].flags1 & DF1_NO_MELEE) return (FALSE); /* Total armor */ ac = tr_ptr->ac; @@ -1481,10 +1464,7 @@ static bool monst_attack_monst(MONSTER_IDX m_idx, IDX t_idx) /* Extract the effective monster level */ rlev = ((r_ptr->level >= 1) ? r_ptr->level : 1); - /* Get the monster name (or "it") */ monster_desc(m_name, m_ptr, 0); - - /* Get the monster name (or "it") */ monster_desc(t_name, t_ptr, 0); /* Assume no blink */ @@ -1495,7 +1475,7 @@ static bool monst_attack_monst(MONSTER_IDX m_idx, IDX t_idx) mon_fight = TRUE; } - if (p_ptr->riding && (m_idx == p_ptr->riding)) disturb(1, 1); + if (p_ptr->riding && (m_idx == p_ptr->riding)) disturb(TRUE, TRUE); /* Scan through all four blows */ for (ap_cnt = 0; ap_cnt < 4; ap_cnt++) @@ -1505,7 +1485,7 @@ static bool monst_attack_monst(MONSTER_IDX m_idx, IDX t_idx) HIT_POINT power = 0; HIT_POINT damage = 0; - cptr act = NULL; + concptr act = NULL; /* Extract the attack infomation */ int effect = r_ptr->blow[ap_cnt].effect; @@ -1530,7 +1510,6 @@ static bool monst_attack_monst(MONSTER_IDX m_idx, IDX t_idx) /* Monster hits */ if (!effect || check_hit2(power, rlev, ac, MON_STUNNED(m_ptr))) { - /* Wake it up */ (void)set_monster_csleep(t_idx, 0); if (t_ptr->ml) @@ -1649,7 +1628,7 @@ static bool monst_attack_monst(MONSTER_IDX m_idx, IDX t_idx) case RBM_EXPLODE: { - if (see_either) disturb(1, 1); + if (see_either) disturb(TRUE, TRUE); act = _("爆発した。", "explodes."); explode = TRUE; touched = FALSE; @@ -1713,7 +1692,6 @@ static bool monst_attack_monst(MONSTER_IDX m_idx, IDX t_idx) } } - /* Message */ if (act && see_either) { #ifdef JP @@ -1875,7 +1853,7 @@ static bool monst_attack_monst(MONSTER_IDX m_idx, IDX t_idx) break; case BLOW_EFFECT_TYPE_HEAL: - if ((monster_living(tr_ptr)) && (damage > 2)) + if ((monster_living(m_idx)) && (damage > 2)) { bool did_heal = FALSE; @@ -1985,15 +1963,13 @@ static bool monst_attack_monst(MONSTER_IDX m_idx, IDX t_idx) case RBM_ENGULF: case RBM_CHARGE: { - /* Wake it up */ (void)set_monster_csleep(t_idx, 0); /* Visible monsters */ if (see_m) { - /* Message */ #ifdef JP - msg_format("%sは%^sの攻撃をかわした。", t_name,m_name); + msg_format("%sは%^sの攻撃をかわした。", t_name, m_name); #else msg_format("%^s misses %s.", m_name, t_name); #endif @@ -2026,7 +2002,7 @@ static bool monst_attack_monst(MONSTER_IDX m_idx, IDX t_idx) /* Cancel Invulnerability */ (void)set_monster_invulner(m_idx, 0, FALSE); - mon_take_hit_mon(m_idx, m_ptr->hp + 1, &fear, _("は爆発して粉々になった。", " explodes into tiny shreds."), m_idx); + mon_take_hit_mon(m_idx, m_ptr->hp + 1, &dead, &fear, _("は爆発して粉々になった。", " explodes into tiny shreds."), m_idx); blinked = FALSE; } @@ -2066,8 +2042,8 @@ static bool monst_attack_monst(MONSTER_IDX m_idx, IDX t_idx) static bool check_hp_for_feat_destruction(feature_type *f_ptr, monster_type *m_ptr) { return !have_flag(f_ptr->flags, FF_GLASS) || - (r_info[m_ptr->r_idx].flags2 & RF2_STUPID) || - (m_ptr->hp >= MAX(m_ptr->maxhp / 3, 200)); + (r_info[m_ptr->r_idx].flags2 & RF2_STUPID) || + (m_ptr->hp >= MAX(m_ptr->maxhp / 3, 200)); } @@ -2092,7 +2068,7 @@ static bool check_hp_for_feat_destruction(feature_type *f_ptr, monster_type *m_p * fixate on opening a door even if they cannot open it. Actually,\n * the same thing happens to normal monsters when they hit a door\n *\n - * XXX XXX XXX In addition, monsters which *cannot* open or bash\n + * In addition, monsters which *cannot* open or bash\n * down a door will still stand there trying to open it...\n *\n * XXX Technically, need to check for monster in the way\n @@ -2106,12 +2082,12 @@ void process_monster(MONSTER_IDX m_idx) monster_race *r_ptr = &r_info[m_ptr->r_idx]; monster_race *ap_r_ptr = &r_info[m_ptr->ap_r_idx]; - int i, d; - POSITION oy, ox, ny, nx; + int i, d; + POSITION oy, ox, ny, nx; - int mm[8]; + DIRECTION mm[8]; - cave_type *c_ptr; + grid_type *g_ptr; feature_type *f_ptr; monster_type *y_ptr; @@ -2132,11 +2108,9 @@ void process_monster(MONSTER_IDX m_idx) bool can_cross; bool aware = TRUE; - bool fear; - - bool is_riding_mon = (m_idx == p_ptr->riding); - - bool see_m = is_seen(m_ptr); + bool fear, dead; + bool is_riding_mon = (m_idx == p_ptr->riding); + bool see_m = is_seen(m_ptr); if (is_riding_mon && !(r_ptr->flags7 & RF7_RIDING)) { @@ -2145,7 +2119,7 @@ void process_monster(MONSTER_IDX m_idx) #ifdef JP msg_print("地面に落とされた。"); #else - char m_name[80]; + GAME_TEXT m_name[MAX_NLEN]; monster_desc(m_name, &m_list[p_ptr->riding], 0); msg_format("You have fallen from %s.", m_name); #endif @@ -2164,7 +2138,7 @@ void process_monster(MONSTER_IDX m_idx) int tmp = p_ptr->lev*6+(p_ptr->skill_stl+10)*4; if (p_ptr->monlite) tmp /= 3; if (p_ptr->cursed & TRC_AGGRAVATE) tmp /= 2; - if (r_ptr->level > (p_ptr->lev*p_ptr->lev/20+10)) tmp /= 3; + if (r_ptr->level > (p_ptr->lev * p_ptr->lev / 20 + 10)) tmp /= 3; /* Low-level monsters will find it difficult to locate the player. */ if (randint0(tmp) > (r_ptr->level+20)) aware = FALSE; } @@ -2176,22 +2150,18 @@ void process_monster(MONSTER_IDX m_idx) if (see_m) { - char m_name[80]; - - /* Acquire the monster name */ + GAME_TEXT m_name[MAX_NLEN]; monster_desc(m_name, m_ptr, 0); msg_format(_("%sは消え去った!", "%^s disappears!"), m_name); } if (record_named_pet && is_pet(m_ptr) && m_ptr->nickname) { - char m_name[80]; - + GAME_TEXT m_name[MAX_NLEN]; monster_desc(m_name, m_ptr, MD_INDEF_VISIBLE); do_cmd_write_nikki(NIKKI_NAMED_PET, RECORD_NAMED_PET_LOSE_PARENT, m_name); } - /* Delete the monster */ delete_monster_idx(m_idx); return; @@ -2208,26 +2178,20 @@ void process_monster(MONSTER_IDX m_idx) { bool sad = FALSE; - if (is_pet(m_ptr) && !(m_ptr->ml)) - sad = TRUE; + if (is_pet(m_ptr) && !(m_ptr->ml)) sad = TRUE; if (see_m) { - char m_name[80]; - - /* Acquire the monster name */ + GAME_TEXT m_name[MAX_NLEN]; monster_desc(m_name, m_ptr, 0); - /* Oops */ msg_format(_("%sは消え去った!", "%^s disappears!"), m_name); } /* Generate treasure, etc */ monster_death(m_idx, FALSE); - /* Delete the monster */ delete_monster_idx(m_idx); - if (sad) { msg_print(_("少しの間悲しい気分になった。", "You feel sad for a moment.")); @@ -2239,7 +2203,8 @@ void process_monster(MONSTER_IDX m_idx) if (m_ptr->r_idx == MON_SHURYUUDAN) { - mon_take_hit_mon(m_idx, 1, &fear, _("は爆発して粉々になった。", " explodes into tiny shreds."), m_idx); + mon_take_hit_mon(m_idx, 1, &dead, &fear, _("は爆発して粉々になった。", " explodes into tiny shreds."), m_idx); + if(dead) return; } if ((is_pet(m_ptr) || is_friendly(m_ptr)) && ((r_ptr->flags1 & RF1_UNIQUE) || (r_ptr->flags7 & RF7_NAZGUL)) && !p_ptr->inside_battle) @@ -2248,7 +2213,7 @@ void process_monster(MONSTER_IDX m_idx) if (m_ptr->hp < m_ptr->maxhp/3) { - char m_name[80]; + GAME_TEXT m_name[MAX_NLEN]; monster_desc(m_name, m_ptr, 0); if (is_riding_mon && riding_pinch < 2) @@ -2256,7 +2221,7 @@ void process_monster(MONSTER_IDX m_idx) msg_format(_("%sは傷の痛さの余りあなたの束縛から逃れようとしている。", "%^s seems to be in so much pain, and trying to escape from your restriction."), m_name); riding_pinch++; - disturb(1, 1); + disturb(TRUE, TRUE); } else { @@ -2306,20 +2271,14 @@ void process_monster(MONSTER_IDX m_idx) /* Handle non-aggravation - Still sleeping */ if (!(p_ptr->cursed & TRC_AGGRAVATE)) return; - /* Handle aggravation */ - /* Reset sleep counter */ (void)set_monster_csleep(m_idx, 0); /* Notice the "waking up" */ if (m_ptr->ml) { - char m_name[80]; - - /* Acquire the monster name */ + GAME_TEXT m_name[MAX_NLEN]; monster_desc(m_name, m_ptr, 0); - - /* Dump a message */ msg_format(_("%^sが目を覚ました。", "%^s wakes up."), m_name); } @@ -2347,8 +2306,7 @@ void process_monster(MONSTER_IDX m_idx) gets_angry = TRUE; /* Paranoia... no pet uniques outside wizard mode -- TY */ - if (is_pet(m_ptr) && - ((((r_ptr->flags1 & RF1_UNIQUE) || (r_ptr->flags7 & RF7_NAZGUL)) && + if (is_pet(m_ptr) && ((((r_ptr->flags1 & RF1_UNIQUE) || (r_ptr->flags7 & RF7_NAZGUL)) && monster_has_hostile_align(NULL, 10, -10, r_ptr)) || (r_ptr->flagsr & RFR_RES_ALL))) { @@ -2361,7 +2319,7 @@ void process_monster(MONSTER_IDX m_idx) { if (is_pet(m_ptr) || see_m) { - char m_name[80]; + GAME_TEXT m_name[MAX_NLEN]; monster_desc(m_name, m_ptr, is_pet(m_ptr) ? MD_ASSUME_VISIBLE : 0); msg_format(_("%^sは突然敵にまわった!", "%^s suddenly becomes hostile!"), m_name); } @@ -2373,11 +2331,11 @@ void process_monster(MONSTER_IDX m_idx) oy = m_ptr->fy; ox = m_ptr->fx; - /* Attempt to "multiply" if able and allowed */ if ((r_ptr->flags2 & RF2_MULTIPLY) && (num_repro < MAX_REPRO)) { - int k, y, x; + int k; + POSITION y, x; /* Count the adjacent monsters */ for (k = 0, y = oy - 1; y <= oy + 1; y++) @@ -2386,8 +2344,7 @@ void process_monster(MONSTER_IDX m_idx) { /* Ignore locations off of edge */ if (!in_bounds2(y, x)) continue; - - if (cave[y][x].m_idx) k++; + if (current_floor_ptr->grid_array[y][x].m_idx) k++; } } @@ -2412,7 +2369,6 @@ void process_monster(MONSTER_IDX m_idx) } } - if (r_ptr->a_ability_flags2 & RF6_SPECIAL) { /* Hack -- Ohmu scatters molds! */ @@ -2422,13 +2378,13 @@ void process_monster(MONSTER_IDX m_idx) { if (r_ptr->freq_spell && (randint1(100) <= r_ptr->freq_spell)) { - int k, count = 0; - int rlev = ((r_ptr->level >= 1) ? r_ptr->level : 1); - u32b p_mode = is_pet(m_ptr) ? PM_FORCE_PET : 0L; + int k, count = 0; + DEPTH rlev = ((r_ptr->level >= 1) ? r_ptr->level : 1); + BIT_FLAGS p_mode = is_pet(m_ptr) ? PM_FORCE_PET : 0L; - for (k = 0; k < 6; k++) + for (k = 0; k < A_MAX; k++) { - if (summon_specific(m_idx, m_ptr->fy, m_ptr->fx, rlev, SUMMON_MOLD, (PM_ALLOW_GROUP | p_mode))) + if (summon_specific(m_idx, m_ptr->fy, m_ptr->fx, rlev, SUMMON_MOLD, (PM_ALLOW_GROUP | p_mode), '\0')) { if (m_list[hack_m_idx_ii].ml) count++; } @@ -2440,7 +2396,6 @@ void process_monster(MONSTER_IDX m_idx) } } - if (!p_ptr->inside_battle) { /* Hack! "Cyber" monster makes noise... */ @@ -2458,9 +2413,9 @@ void process_monster(MONSTER_IDX m_idx) player_has_los_bold(oy, ox) && projectable(oy, ox, p_ptr->y, p_ptr->x)) { - char m_name[80]; + GAME_TEXT m_name[MAX_NLEN]; char monmessage[1024]; - cptr filename; + concptr filename; /* Acquire the monster name/poss */ if (m_ptr->ml) @@ -2494,11 +2449,10 @@ void process_monster(MONSTER_IDX m_idx) /* Give priority to counter attack? */ if (m_ptr->target_y) { - int t_m_idx = cave[m_ptr->target_y][m_ptr->target_x].m_idx; + MONSTER_IDX t_m_idx = current_floor_ptr->grid_array[m_ptr->target_y][m_ptr->target_x].m_idx; /* The monster must be an enemy, and projectable */ - if (t_m_idx && - are_enemies(m_ptr, &m_list[t_m_idx]) && + if (t_m_idx && are_enemies(m_ptr, &m_list[t_m_idx]) && projectable(m_ptr->fy, m_ptr->fx, m_ptr->target_y, m_ptr->target_x)) { counterattack = TRUE; @@ -2586,8 +2540,7 @@ void process_monster(MONSTER_IDX m_idx) else if (is_pet(m_ptr)) { /* Are we trying to avoid the player? */ - bool avoid = ((p_ptr->pet_follow_distance < 0) && - (m_ptr->cdis <= (0 - p_ptr->pet_follow_distance))); + bool avoid = ((p_ptr->pet_follow_distance < 0) && (m_ptr->cdis <= (0 - p_ptr->pet_follow_distance))); /* Do we want to find the player? */ bool lonely = (!avoid && (m_ptr->cdis > p_ptr->pet_follow_distance)); @@ -2605,7 +2558,7 @@ void process_monster(MONSTER_IDX m_idx) if (avoid || lonely || distant) { /* Remember the leash length */ - int dis = p_ptr->pet_follow_distance; + POSITION dis = p_ptr->pet_follow_distance; /* Hack -- adjust follow distance temporarily */ if (p_ptr->pet_follow_distance > PET_SEEK_DIST) @@ -2653,7 +2606,6 @@ void process_monster(MONSTER_IDX m_idx) did_pass_wall = FALSE; did_kill_wall = FALSE; - /* Take a zero-terminated array of "directions" */ for (i = 0; mm[i]; i++) { @@ -2670,13 +2622,13 @@ void process_monster(MONSTER_IDX m_idx) /* Ignore locations off of edge */ if (!in_bounds2(ny, nx)) continue; - /* Access that cave grid */ - c_ptr = &cave[ny][nx]; - f_ptr = &f_info[c_ptr->feat]; - can_cross = monster_can_cross_terrain(c_ptr->feat, r_ptr, is_riding_mon ? CEM_RIDING : 0); + /* Access that grid */ + g_ptr = ¤t_floor_ptr->grid_array[ny][nx]; + f_ptr = &f_info[g_ptr->feat]; + can_cross = monster_can_cross_terrain(g_ptr->feat, r_ptr, is_riding_mon ? CEM_RIDING : 0); - /* Access that cave grid's contents */ - y_ptr = &m_list[c_ptr->m_idx]; + /* Access that grid's contents */ + y_ptr = &m_list[g_ptr->m_idx]; /* Hack -- player 'in' wall */ if (player_bold(ny, nx)) @@ -2685,7 +2637,7 @@ void process_monster(MONSTER_IDX m_idx) } /* Possibly a monster to attack */ - else if (c_ptr->m_idx) + else if (g_ptr->m_idx) { do_move = TRUE; } @@ -2720,7 +2672,7 @@ void process_monster(MONSTER_IDX m_idx) } /* Handle doors and secret doors */ - else if (is_closed_door(c_ptr->feat)) + else if (is_closed_door(g_ptr->feat)) { bool may_bash = TRUE; @@ -2740,14 +2692,13 @@ void process_monster(MONSTER_IDX m_idx) /* Do not bash the door */ may_bash = FALSE; - /* Take a turn */ do_turn = TRUE; } /* Locked doors (not jammed) */ else { - /* Try to unlock it XXX XXX XXX */ + /* Try to unlock it */ if (randint0(m_ptr->hp / 10) > f_ptr->power) { /* Unlock the door */ @@ -2756,7 +2707,6 @@ void process_monster(MONSTER_IDX m_idx) /* Do not bash the door */ may_bash = FALSE; - /* Take a turn */ do_turn = TRUE; } } @@ -2766,17 +2716,16 @@ void process_monster(MONSTER_IDX m_idx) if (may_bash && (r_ptr->flags2 & RF2_BASH_DOOR) && have_flag(f_ptr->flags, FF_BASH) && (!is_pet(m_ptr) || (p_ptr->pet_extra_flags & PF_OPEN_DOORS))) { - /* Attempt to Bash XXX XXX XXX */ + /* Attempt to Bash */ if (check_hp_for_feat_destruction(f_ptr, m_ptr) && (randint0(m_ptr->hp / 10) > f_ptr->power)) { - /* Message */ if (have_flag(f_ptr->flags, FF_GLASS)) msg_print(_("ガラスが砕ける音がした!", "You hear a glass was crashed!")); else msg_print(_("ドアを叩き開ける音がした!", "You hear a door burst open!")); /* Disturb (sometimes) */ - if (disturb_minor) disturb(0, 0); + if (disturb_minor) disturb(FALSE, FALSE); /* The door was bashed open */ did_bash_door = TRUE; @@ -2792,7 +2741,7 @@ void process_monster(MONSTER_IDX m_idx) if (did_open_door || did_bash_door) { /* Break down the door */ - if (did_bash_door && ((randint0(100) < 50) || (feat_state(c_ptr->feat, FF_OPEN) == c_ptr->feat) || have_flag(f_ptr->flags, FF_GLASS))) + if (did_bash_door && ((randint0(100) < 50) || (feat_state(g_ptr->feat, FF_OPEN) == g_ptr->feat) || have_flag(f_ptr->flags, FF_GLASS))) { cave_alter_feat(ny, nx, FF_BASH); @@ -2813,7 +2762,7 @@ void process_monster(MONSTER_IDX m_idx) cave_alter_feat(ny, nx, FF_OPEN); } - f_ptr = &f_info[c_ptr->feat]; + f_ptr = &f_info[g_ptr->feat]; /* Handle viewable doors */ do_view = TRUE; @@ -2821,7 +2770,7 @@ void process_monster(MONSTER_IDX m_idx) } /* Hack -- check for Glyph of Warding */ - if (do_move && is_glyph_grid(c_ptr) && + if (do_move && is_glyph_grid(g_ptr) && !((r_ptr->flags1 & RF1_NEVER_BLOW) && player_bold(ny, nx))) { /* Assume no move allowed */ @@ -2831,26 +2780,25 @@ void process_monster(MONSTER_IDX m_idx) if (!is_pet(m_ptr) && (randint1(BREAK_GLYPH) < r_ptr->level)) { /* Describe observable breakage */ - if (c_ptr->info & CAVE_MARK) + if (g_ptr->info & CAVE_MARK) { msg_print(_("守りのルーンが壊れた!", "The rune of protection is broken!")); } /* Forget the rune */ - c_ptr->info &= ~(CAVE_MARK); + g_ptr->info &= ~(CAVE_MARK); /* Break the rune */ - c_ptr->info &= ~(CAVE_OBJECT); - c_ptr->mimic = 0; + g_ptr->info &= ~(CAVE_OBJECT); + g_ptr->mimic = 0; /* Allow movement */ do_move = TRUE; - /* Notice */ note_spot(ny, nx); } } - else if (do_move && is_explosive_rune_grid(c_ptr) && + else if (do_move && is_explosive_rune_grid(g_ptr) && !((r_ptr->flags1 & RF1_NEVER_BLOW) && player_bold(ny, nx))) { /* Assume no move allowed */ @@ -2863,7 +2811,7 @@ void process_monster(MONSTER_IDX m_idx) if (randint1(BREAK_MINOR_GLYPH) > r_ptr->level) { /* Describe observable breakage */ - if (c_ptr->info & CAVE_MARK) + if (g_ptr->info & CAVE_MARK) { msg_print(_("ルーンが爆発した!", "The rune explodes!")); project(0, 2, ny, nx, 2 * (p_ptr->lev + damroll(7, 7)), GF_MANA, (PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL | PROJECT_JUMP | PROJECT_NO_HANGEKI), -1); @@ -2875,11 +2823,11 @@ void process_monster(MONSTER_IDX m_idx) } /* Forget the rune */ - c_ptr->info &= ~(CAVE_MARK); + g_ptr->info &= ~(CAVE_MARK); /* Break the rune */ - c_ptr->info &= ~(CAVE_OBJECT); - c_ptr->mimic = 0; + g_ptr->info &= ~(CAVE_OBJECT); + g_ptr->mimic = 0; note_spot(ny, nx); lite_spot(ny, nx); @@ -2904,7 +2852,7 @@ void process_monster(MONSTER_IDX m_idx) } /* In anti-melee dungeon, stupid or confused monster takes useless turn */ - if (do_move && (d_info[dungeon_type].flags1 & DF1_NO_MELEE)) + if (do_move && (d_info[p_ptr->dungeon_idx].flags1 & DF1_NO_MELEE)) { if (!MON_CONFUSED(m_ptr)) { @@ -2934,7 +2882,7 @@ void process_monster(MONSTER_IDX m_idx) } /* A monster is in the way */ - if (do_move && c_ptr->m_idx) + if (do_move && g_ptr->m_idx) { monster_race *z_ptr = &r_info[y_ptr->r_idx]; @@ -2944,7 +2892,7 @@ void process_monster(MONSTER_IDX m_idx) /* Attack 'enemies' */ if (((r_ptr->flags2 & RF2_KILL_BODY) && !(r_ptr->flags1 & RF1_NEVER_BLOW) && (r_ptr->mexp * r_ptr->level > z_ptr->mexp * z_ptr->level) && - can_cross && (c_ptr->m_idx != p_ptr->riding)) || + can_cross && (g_ptr->m_idx != p_ptr->riding)) || are_enemies(m_ptr, y_ptr) || MON_CONFUSED(m_ptr)) { if (!(r_ptr->flags1 & RF1_NEVER_BLOW)) @@ -2957,10 +2905,10 @@ void process_monster(MONSTER_IDX m_idx) /* attack */ if (y_ptr->r_idx && (y_ptr->hp >= 0)) { - if (monst_attack_monst(m_idx, c_ptr->m_idx)) return; + if (monst_attack_monst(m_idx, g_ptr->m_idx)) return; /* In anti-melee dungeon, stupid or confused monster takes useless turn */ - else if (d_info[dungeon_type].flags1 & DF1_NO_MELEE) + else if (d_info[p_ptr->dungeon_idx].flags1 & DF1_NO_MELEE) { if (MON_CONFUSED(m_ptr)) return; else if (r_ptr->flags2 & RF2_STUPID) @@ -2976,8 +2924,8 @@ void process_monster(MONSTER_IDX m_idx) /* Push past weaker monsters (unless leaving a wall) */ else if ((r_ptr->flags2 & RF2_MOVE_BODY) && !(r_ptr->flags1 & RF1_NEVER_MOVE) && (r_ptr->mexp > z_ptr->mexp) && - can_cross && (c_ptr->m_idx != p_ptr->riding) && - monster_can_cross_terrain(cave[m_ptr->fy][m_ptr->fx].feat, z_ptr, 0)) + can_cross && (g_ptr->m_idx != p_ptr->riding) && + monster_can_cross_terrain(current_floor_ptr->grid_array[m_ptr->fy][m_ptr->fx].feat, z_ptr, 0)) { /* Allow movement */ do_move = TRUE; @@ -2986,9 +2934,9 @@ void process_monster(MONSTER_IDX m_idx) did_move_body = TRUE; /* Wake up the moved monster */ - (void)set_monster_csleep(c_ptr->m_idx, 0); + (void)set_monster_csleep(g_ptr->m_idx, 0); - /* XXX XXX XXX Message */ + /* Message */ } } @@ -3019,18 +2967,16 @@ void process_monster(MONSTER_IDX m_idx) return; } - f_ptr = &f_info[c_ptr->feat]; + f_ptr = &f_info[g_ptr->feat]; /* Note changes to viewable region */ do_view = TRUE; - - /* Take a turn */ do_turn = TRUE; } if (must_alter_to_move && (r_ptr->flags7 & RF7_AQUATIC)) { - if (!monster_can_cross_terrain(c_ptr->feat, r_ptr, is_riding_mon ? CEM_RIDING : 0)) + if (!monster_can_cross_terrain(g_ptr->feat, r_ptr, is_riding_mon ? CEM_RIDING : 0)) { /* Assume no move allowed */ do_move = FALSE; @@ -3062,7 +3008,6 @@ void process_monster(MONSTER_IDX m_idx) /* Creature has been allowed move */ if (do_move) { - /* Take a turn */ do_turn = TRUE; if (have_flag(f_ptr->flags, FF_TREE)) @@ -3076,40 +3021,33 @@ void process_monster(MONSTER_IDX m_idx) if (!is_riding_mon) { /* Hack -- Update the old location */ - cave[oy][ox].m_idx = c_ptr->m_idx; + current_floor_ptr->grid_array[oy][ox].m_idx = g_ptr->m_idx; /* Mega-Hack -- move the old monster, if any */ - if (c_ptr->m_idx) + if (g_ptr->m_idx) { /* Move the old monster */ y_ptr->fy = oy; y_ptr->fx = ox; /* Update the old monster */ - update_mon(c_ptr->m_idx, TRUE); + update_monster(g_ptr->m_idx, TRUE); } /* Hack -- Update the new location */ - c_ptr->m_idx = (s16b)m_idx; + g_ptr->m_idx = m_idx; /* Move the monster */ m_ptr->fy = ny; m_ptr->fx = nx; + update_monster(m_idx, TRUE); - /* Update the monster */ - update_mon(m_idx, TRUE); - - /* Redraw the old grid */ lite_spot(oy, ox); - - /* Redraw the new grid */ lite_spot(ny, nx); } else { /* sound(SOUND_WALK); */ - - /* Move the player */ if (!move_player_effect(ny, nx, MPE_DONT_PICKUP)) break; } @@ -3119,25 +3057,22 @@ void process_monster(MONSTER_IDX m_idx) (disturb_near && (m_ptr->mflag & MFLAG_VIEW) && projectable(p_ptr->y, p_ptr->x, m_ptr->fy, m_ptr->fx)) || (disturb_high && ap_r_ptr->r_tkills && ap_r_ptr->level >= p_ptr->lev))) { - /* Disturb */ if (is_hostile(m_ptr)) - disturb(0, 1); + disturb(FALSE, TRUE); } /* Take or Kill objects on the floor */ - if (c_ptr->o_idx && (r_ptr->flags2 & (RF2_TAKE_ITEM | RF2_KILL_ITEM)) && + if (g_ptr->o_idx && (r_ptr->flags2 & (RF2_TAKE_ITEM | RF2_KILL_ITEM)) && (!is_pet(m_ptr) || ((p_ptr->pet_extra_flags & PF_PICKUP_ITEMS) && (r_ptr->flags2 & RF2_TAKE_ITEM)))) { - s16b this_o_idx, next_o_idx; + OBJECT_IDX this_o_idx, next_o_idx; bool do_take = (r_ptr->flags2 & RF2_TAKE_ITEM) ? TRUE : FALSE; /* Scan all objects in the grid */ - for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx) + for (this_o_idx = g_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx) { - u32b flgs[TR_FLAG_SIZE], flg2 = 0L, flg3 = 0L, flgr = 0L; - char m_name[80], o_name[MAX_NLEN]; - - /* Acquire object */ + BIT_FLAGS flgs[TR_FLAG_SIZE], flg2 = 0L, flg3 = 0L, flgr = 0L; + GAME_TEXT m_name[MAX_NLEN], o_name[MAX_NLEN]; object_type *o_ptr = &o_list[this_o_idx]; /* Acquire next object */ @@ -3162,8 +3097,6 @@ void process_monster(MONSTER_IDX m_idx) /* Acquire the object name */ object_desc(o_name, o_ptr, 0); - - /* Acquire the monster name */ monster_desc(m_name, m_ptr, MD_INDEF_HIDDEN); /* React to objects that hurt the monster */ @@ -3198,13 +3131,11 @@ void process_monster(MONSTER_IDX m_idx) /* Only give a message for "take_item" */ if (do_take && (r_ptr->flags2 & RF2_STUPID)) { - /* Take note */ did_take_item = TRUE; /* Describe observable situations */ if (m_ptr->ml && player_can_see_bold(ny, nx)) { - /* Dump a message */ msg_format(_("%^sは%sを拾おうとしたが、だめだった。", "%^s tries to pick up %s, but fails."), m_name, o_name); } } @@ -3213,13 +3144,11 @@ void process_monster(MONSTER_IDX m_idx) /* Pick up the item */ else if (do_take) { - /* Take note */ did_take_item = TRUE; /* Describe observable situations */ if (player_can_see_bold(ny, nx)) { - /* Dump a message */ msg_format(_("%^sが%sを拾った。", "%^s picks up %s."), m_name, o_name); } @@ -3233,7 +3162,7 @@ void process_monster(MONSTER_IDX m_idx) o_ptr->iy = o_ptr->ix = 0; /* Memorize monster */ - o_ptr->held_m_idx = (s16b)m_idx; + o_ptr->held_m_idx = m_idx; /* Build a stack */ o_ptr->next_o_idx = m_ptr->hold_o_idx; @@ -3245,17 +3174,14 @@ void process_monster(MONSTER_IDX m_idx) /* Destroy the item if not a pet */ else if (!is_pet(m_ptr)) { - /* Take note */ did_kill_item = TRUE; /* Describe observable situations */ if (player_has_los_bold(ny, nx)) { - /* Dump a message */ msg_format(_("%^sが%sを破壊した。", "%^s destroys %s."), m_name, o_name); } - /* Delete the object */ delete_object_idx(this_o_idx); } } @@ -3287,10 +3213,7 @@ void process_monster(MONSTER_IDX m_idx) /* Notice changes in view */ if (do_view) { - /* Update some things */ p_ptr->update |= (PU_FLOW); - - /* Window stuff */ p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON); } @@ -3337,18 +3260,14 @@ void process_monster(MONSTER_IDX m_idx) /* Message if seen */ if (see_m) { - char m_name[80]; - - /* Acquire the monster name */ + GAME_TEXT m_name[MAX_NLEN]; monster_desc(m_name, m_ptr, 0); - - /* Dump a message */ msg_format(_("%^sは戦いを決意した!", "%^s turns to fight!"), m_name); } if (m_ptr->ml) chg_virtue(V_COMPASSION, -1); - /* XXX XXX XXX Actually do something now (?) */ + /* Actually do something now (?) */ } } @@ -3396,24 +3315,24 @@ void process_monsters(void) monster_type *m_ptr; monster_race *r_ptr; - int old_monster_race_idx; + MONRACE_IDX old_monster_race_idx; - u32b old_r_flags1 = 0L; - u32b old_r_flags2 = 0L; - u32b old_r_flags3 = 0L; - u32b old_r_flags4 = 0L; - u32b old_r_flags5 = 0L; - u32b old_r_flags6 = 0L; - u32b old_r_flagsr = 0L; + BIT_FLAGS old_r_flags1 = 0L; + BIT_FLAGS old_r_flags2 = 0L; + BIT_FLAGS old_r_flags3 = 0L; + BIT_FLAGS old_r_flags4 = 0L; + BIT_FLAGS old_r_flags5 = 0L; + BIT_FLAGS old_r_flags6 = 0L; + BIT_FLAGS old_r_flagsr = 0L; - byte old_r_blows0 = 0; - byte old_r_blows1 = 0; - byte old_r_blows2 = 0; - byte old_r_blows3 = 0; + byte old_r_blows0 = 0; + byte old_r_blows1 = 0; + byte old_r_blows2 = 0; + byte old_r_blows3 = 0; - byte old_r_cast_spell = 0; + byte old_r_cast_spell = 0; - int speed; + SPEED speed; /* Clear monster fighting indicator */ mon_fight = FALSE; @@ -3505,14 +3424,14 @@ void process_monsters(void) test = TRUE; } -#if 0 /* (cave[p_ptr->y][p_ptr->x].when == cave[fy][fx].when) is always FALSE... */ +#if 0 /* (current_floor_ptr->grid_array[p_ptr->y][p_ptr->x].when == current_floor_ptr->grid_array[fy][fx].when) is always FALSE... */ /* Hack -- Monsters can "smell" the player from far away */ /* Note that most monsters have "aaf" of "20" or so */ else if (!(m_ptr->mflag2 & MFLAG2_NOFLOW) && cave_have_flag_bold(p_ptr->y, p_ptr->x, FF_MOVE) && - (cave[p_ptr->y][p_ptr->x].when == cave[fy][fx].when) && - (cave[fy][fx].dist < MONSTER_FLOW_DEPTH) && - (cave[fy][fx].dist < r_ptr->aaf)) + (current_floor_ptr->grid_array[p_ptr->y][p_ptr->x].when == current_floor_ptr->grid_array[fy][fx].when) && + (current_floor_ptr->grid_array[fy][fx].dist < MONSTER_FLOW_DEPTH) && + (current_floor_ptr->grid_array[fy][fx].dist < r_ptr->aaf)) { /* We can "smell" the player */ test = TRUE; @@ -3590,7 +3509,6 @@ void process_monsters(void) (old_r_blows3 != r_ptr->r_blows[3]) || (old_r_cast_spell != r_ptr->r_cast_spell)) { - /* Window stuff */ p_ptr->window |= (PW_MONSTER); } }