#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"
/*!
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))
}
}
/* 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;
}
* 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? */
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(TRUE, TRUE);
{
msg_format(_("%^sはダメージを受けない。", "%^s is unharmed."), m_name);
}
-
return;
}
}
/* Hurt it */
- m_ptr->hp -= (s16b)dam;
+ m_ptr->hp -= dam;
/* It is dead now... or is it? */
if (m_ptr->hp < 0)
else
{
/* Make a sound */
- if (!monster_living(r_ptr))
+ if (!monster_living(m_ptr->r_idx))
{
sound(SOUND_N_KILL);
}
sound(SOUND_KILL);
}
+ *dead = TRUE;
+
if (known)
{
monster_desc(m_name, m_ptr, MD_TRUE_NAME);
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);
}
}
monster_gain_exp(who, m_ptr->r_idx);
-
- /* Generate treasure */
monster_death(m_idx, FALSE);
-
-
delete_monster_idx(m_idx);
/* Not afraid */
}
}
+ *dead = FALSE;
+
#ifdef ALLOW_FEAR
/* Mega-Hack -- Pain cancels fear */
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;
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;
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? */
{
int cost;
- /* Get the location */
y = y1 + ddy_ddd[i];
x = x1 + ddx_ddd[i];
/* 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.. */
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];
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;
/* 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;
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;
{
POSITION dis, s;
- /* Get the location */
y = fy + ddy_ddd[i];
x = fx + ddx_ddd[i];
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;
*/
-static sint d_off_y_0[] = { 0 };
-static sint d_off_x_0[] = { 0 };
+static POSITION d_off_y_0[] = { 0 };
+static POSITION 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_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_y_2[] = { -1, -1, -2, -2, -2, 0, 0, 1, 1, 2, 2, 2, 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 sint d_off_y_3[] = { -1, -1, -2, -2, -3, -3, -3, 0, 0, 1, 1, 2, 2, 3, 3, 3, 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 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_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 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_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
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++)
/* 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) */
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++)
* @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];
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 &&
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
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 */
}
/* 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;
ARMOUR_CLASS ac;
DEPTH rlev;
int pt;
- char m_name[80], t_name[80];
+ 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);
/* 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;
/* 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 */
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;
/* 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)
break;
case BLOW_EFFECT_TYPE_HEAL:
- if ((monster_living(tr_ptr)) && (damage > 2))
+ if ((monster_living(m_idx)) && (damage > 2))
{
bool did_heal = FALSE;
case RBM_ENGULF:
case RBM_CHARGE:
{
- /* Wake it up */
(void)set_monster_csleep(t_idx, 0);
/* Visible monsters */
/* 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;
}
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));
}
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;
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))
{
#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
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;
}
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_monster_idx(m_idx);
return;
{
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);
msg_format(_("%sは消え去った!", "%^s disappears!"), m_name);
/* Generate treasure, etc */
monster_death(m_idx, FALSE);
-
delete_monster_idx(m_idx);
-
if (sad)
{
msg_print(_("少しの間悲しい気分になった。", "You feel sad for a moment."));
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)
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)
/* 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);
}
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)))
{
{
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);
}
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++)
{
/* 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++;
}
}
}
}
-
if (r_ptr->a_ability_flags2 & RF6_SPECIAL)
{
/* Hack -- Ohmu scatters molds! */
{
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++;
}
}
}
-
if (!p_ptr->inside_battle)
{
/* Hack! "Cyber" monster makes noise... */
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)
/* 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;
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));
did_pass_wall = FALSE;
did_kill_wall = FALSE;
-
/* Take a zero-terminated array of "directions" */
for (i = 0; mm[i]; i++)
{
/* 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))
}
/* Possibly a monster to attack */
- else if (c_ptr->m_idx)
+ else if (g_ptr->m_idx)
{
do_move = TRUE;
}
}
/* 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;
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);
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;
}
/* 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 */
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;
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 */
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);
}
/* 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);
}
/* 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))
{
}
/* 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];
/* 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))
/* 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)
/* 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;
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);
/* Message */
}
return;
}
- f_ptr = &f_info[c_ptr->feat];
+ f_ptr = &f_info[g_ptr->feat];
/* Note changes to viewable region */
do_view = TRUE;
-
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;
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;
}
}
/* 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))))
{
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)
{
BIT_FLAGS flgs[TR_FLAG_SIZE], flg2 = 0L, flg3 = 0L, flgr = 0L;
- char m_name[80], o_name[MAX_NLEN];
-
- /* Acquire object */
+ GAME_TEXT m_name[MAX_NLEN], o_name[MAX_NLEN];
object_type *o_ptr = &o_list[this_o_idx];
/* Acquire next object */
/* 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 */
/* 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);
}
}
/* 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);
}
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;
/* 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);
}
}
/* Notice changes in view */
if (do_view)
{
- /* Update some things */
p_ptr->update |= (PU_FLOW);
-
p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
}
/* 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);
}
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;
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;