if (d_info[floor_ptr->dungeon_idx].flags1 & DF1_NO_DOORS)
{
place_floor_bold(floor_ptr, y, x);
+ return;
}
- else
- {
- set_cave_feat(floor_ptr, y, x, feat_locked_door_random((d_info[player_ptr->dungeon_idx].flags1 & DF1_GLASS_DOOR) ? DOOR_GLASS_DOOR : DOOR_DOOR));
- floor_ptr->grid_array[y][x].info &= ~(CAVE_FLOOR);
- delete_monster(floor_ptr, y, x);
- }
+
+ set_cave_feat(floor_ptr, y, x, feat_locked_door_random((d_info[player_ptr->dungeon_idx].flags1 & DF1_GLASS_DOOR) ? DOOR_GLASS_DOOR : DOOR_DOOR));
+ floor_ptr->grid_array[y][x].info &= ~(CAVE_FLOOR);
+ delete_monster(floor_ptr, y, x);
}
if (d_info[floor_ptr->dungeon_idx].flags1 & DF1_NO_DOORS)
{
place_floor_bold(floor_ptr, y, x);
+ return;
}
- else
+
+ if (type == DOOR_DEFAULT)
{
- grid_type *g_ptr = &floor_ptr->grid_array[y][x];
+ type = ((d_info[floor_ptr->dungeon_idx].flags1 & DF1_CURTAIN) &&
+ one_in_((d_info[floor_ptr->dungeon_idx].flags1 & DF1_NO_CAVE) ? 16 : 256)) ? DOOR_CURTAIN :
+ ((d_info[floor_ptr->dungeon_idx].flags1 & DF1_GLASS_DOOR) ? DOOR_GLASS_DOOR : DOOR_DOOR);
+ }
- if (type == DOOR_DEFAULT)
- {
- type = ((d_info[floor_ptr->dungeon_idx].flags1 & DF1_CURTAIN) &&
- one_in_((d_info[floor_ptr->dungeon_idx].flags1 & DF1_NO_CAVE) ? 16 : 256)) ? DOOR_CURTAIN :
- ((d_info[floor_ptr->dungeon_idx].flags1 & DF1_GLASS_DOOR) ? DOOR_GLASS_DOOR : DOOR_DOOR);
- }
+ /* Create secret door */
+ place_closed_door(player_ptr, y, x, type);
- /* Create secret door */
- place_closed_door(player_ptr, y, x, type);
+ grid_type *g_ptr = &floor_ptr->grid_array[y][x];
+ if (type != DOOR_CURTAIN)
+ {
+ /* Hide by inner wall because this is used in rooms only */
+ g_ptr->mimic = feat_wall_inner;
- if (type != DOOR_CURTAIN)
+ /* Floor type terrain cannot hide a door */
+ if (feat_supports_los(g_ptr->mimic) && !feat_supports_los(g_ptr->feat))
{
- /* Hide by inner wall because this is used in rooms only */
- g_ptr->mimic = feat_wall_inner;
-
- /* Floor type terrain cannot hide a door */
- if (feat_supports_los(g_ptr->mimic) && !feat_supports_los(g_ptr->feat))
+ if (have_flag(f_info[g_ptr->mimic].flags, FF_MOVE) || have_flag(f_info[g_ptr->mimic].flags, FF_CAN_FLY))
{
- if (have_flag(f_info[g_ptr->mimic].flags, FF_MOVE) || have_flag(f_info[g_ptr->mimic].flags, FF_CAN_FLY))
- {
- g_ptr->feat = one_in_(2) ? g_ptr->mimic : feat_ground_type[randint0(100)];
- }
- g_ptr->mimic = 0;
+ g_ptr->feat = one_in_(2) ? g_ptr->mimic : feat_ground_type[randint0(100)];
}
- }
- g_ptr->info &= ~(CAVE_FLOOR);
- delete_monster(floor_ptr, y, x);
+ g_ptr->mimic = 0;
+ }
}
+
+ g_ptr->info &= ~(CAVE_FLOOR);
+ delete_monster(floor_ptr, y, x);
}
static int scent_when = 0;
*/
void update_smell(floor_type *floor_ptr, player_type *subject_ptr)
{
- POSITION i, j;
- POSITION y, x;
-
/* Create a table that controls the spread of scent */
const int scent_adjust[5][5] =
{
if (++scent_when == 254)
{
/* Scan the entire dungeon */
- for (y = 0; y < floor_ptr->height; y++)
+ for (POSITION y = 0; y < floor_ptr->height; y++)
{
- for (x = 0; x < floor_ptr->width; x++)
+ for (POSITION x = 0; x < floor_ptr->width; x++)
{
int w = floor_ptr->grid_array[y][x].when;
floor_ptr->grid_array[y][x].when = (w > 128) ? (w - 128) : 0;
scent_when = 126;
}
-
/* Lay down new scent */
- for (i = 0; i < 5; i++)
+ for (POSITION i = 0; i < 5; i++)
{
- for (j = 0; j < 5; j++)
+ for (POSITION j = 0; j < 5; j++)
{
grid_type *g_ptr;
/* Translate table to map grids */
- y = i + subject_ptr->y - 2;
- x = j + subject_ptr->x - 2;
+ POSITION y = i + subject_ptr->y - 2;
+ POSITION x = j + subject_ptr->x - 2;
/* Check Bounds */
if (!in_bounds(floor_ptr, y, x)) continue;
*/
void forget_flow(floor_type *floor_ptr)
{
- POSITION x, y;
-
/* Check the entire dungeon */
- for (y = 0; y < floor_ptr->height; y++)
+ for (POSITION y = 0; y < floor_ptr->height; y++)
{
- for (x = 0; x < floor_ptr->width; x++)
+ for (POSITION x = 0; x < floor_ptr->width; x++)
{
/* Forget the old data */
floor_ptr->grid_array[y][x].dist = 0;
}
}
+
/*
* Routine used by the random vault creators to add a door to a location
* Note that range checking has to be done in the calling routine.
place_solid_bold(floor_ptr, y, x + 1);
}
-
/* look at:
* x#x
* .#.
}
}
+
/*!
* @brief 所定の位置に上り階段か下り階段を配置する / Place an up/down staircase at given location
* @param player_ptr プレーヤーへの参照ポインタ
else if (down_stairs) set_cave_feat(floor_ptr, y, x, feat_down_stair);
}
+
/*!
* @brief LOS(Line Of Sight / 視線が通っているか)の判定を行う。
* @param player_ptr プレーヤーへの参照ポインタ
*/
bool los(player_type *player_ptr, POSITION y1, POSITION x1, POSITION y2, POSITION x2)
{
- /* Delta */
- POSITION dx, dy;
-
- /* Absolute */
- POSITION ax, ay;
-
- /* Signs */
- POSITION sx, sy;
-
- /* Fractions */
- POSITION qx, qy;
-
- /* Scanners */
- POSITION tx, ty;
-
- /* Scale factors */
- POSITION f1, f2;
-
- /* Slope, or 1/Slope, of LOS */
- POSITION m;
-
-
/* Extract the offset */
- dy = y2 - y1;
- dx = x2 - x1;
+ POSITION dy = y2 - y1;
+ POSITION dx = x2 - x1;
/* Extract the absolute offset */
- ay = ABS(dy);
- ax = ABS(dx);
-
+ POSITION ay = ABS(dy);
+ POSITION ax = ABS(dx);
/* Handle adjacent (or identical) grids */
if ((ax < 2) && (ay < 2)) return TRUE;
-
- /* Paranoia -- require "safe" origin */
- /* if (!in_bounds(floor_ptr, y1, x1)) return FALSE; */
- /* if (!in_bounds(floor_ptr, y2, x2)) return FALSE; */
-
- floor_type *floor_ptr = player_ptr->current_floor_ptr;
/* Directly South/North */
+ floor_type *floor_ptr = player_ptr->current_floor_ptr;
+ POSITION tx, ty;
if (!dx)
{
/* South -- check for walls */
return TRUE;
}
-
/* Extract some signs */
- sx = (dx < 0) ? -1 : 1;
- sy = (dy < 0) ? -1 : 1;
-
+ POSITION sx = (dx < 0) ? -1 : 1;
+ POSITION sy = (dy < 0) ? -1 : 1;
/* Vertical "knights" */
if (ax == 1)
}
}
-
/* Calculate scale factor div 2 */
- f2 = (ax * ay);
+ POSITION f2 = (ax * ay);
/* Calculate scale factor */
- f1 = f2 << 1;
-
+ POSITION f1 = f2 << 1;
/* Travel horizontally */
+ POSITION qy;
+ POSITION m;
if (ax >= ay)
{
/* Let m = dy / dx * 2 * (dy * dx) = 2 * dy * dy */
if (qy < f2)
{
tx += sx;
+ continue;
}
- else if (qy > f2)
+
+ if (qy > f2)
{
ty += sy;
if (!cave_los_bold(floor_ptr, ty, tx)) return FALSE;
qy -= f1;
tx += sx;
+ continue;
}
- else
- {
- ty += sy;
- qy -= f1;
- tx += sx;
- }
+
+ ty += sy;
+ qy -= f1;
+ tx += sx;
}
+
+ return TRUE;
}
/* Travel vertically */
+ /* Let m = dx / dy * 2 * (dx * dy) = 2 * dx * dx */
+ POSITION qx = ax * ax;
+ m = qx << 1;
+
+ ty = y1 + sy;
+
+ if (qx == f2)
+ {
+ tx = x1 + sx;
+ qx -= f1;
+ }
else
{
- /* Let m = dx / dy * 2 * (dx * dy) = 2 * dx * dx */
- qx = ax * ax;
- m = qx << 1;
+ tx = x1;
+ }
+
+ /* Note (below) the case (qx == f2), where */
+ /* the LOS exactly meets the corner of a tile. */
+ while (y2 - ty)
+ {
+ if (!cave_los_bold(floor_ptr, ty, tx)) return FALSE;
- ty = y1 + sy;
+ qx += m;
- if (qx == f2)
- {
- tx = x1 + sx;
- qx -= f1;
- }
- else
+ if (qx < f2)
{
- tx = x1;
+ ty += sy;
+ continue;
}
- /* Note (below) the case (qx == f2), where */
- /* the LOS exactly meets the corner of a tile. */
- while (y2 - ty)
+ if (qx > f2)
{
+ tx += sx;
if (!cave_los_bold(floor_ptr, ty, tx)) return FALSE;
-
- qx += m;
-
- if (qx < f2)
- {
- ty += sy;
- }
- else if (qx > f2)
- {
- tx += sx;
- if (!cave_los_bold(floor_ptr, ty, tx)) return FALSE;
- qx -= f1;
- ty += sy;
- }
- else
- {
- tx += sx;
- qx -= f1;
- ty += sy;
- }
+ qx -= f1;
+ ty += sy;
+ continue;
}
+
+ tx += sx;
+ qx -= f1;
+ ty += sy;
}
- /* Assume los */
return TRUE;
}
*/
bool projectable(player_type *player_ptr, POSITION y1, POSITION x1, POSITION y2, POSITION x2)
{
- POSITION y, x;
-
- int grid_n = 0;
- u16b grid_g[512];
-
/* Check the projection path */
- grid_n = project_path(player_ptr, grid_g, (project_length ? project_length : MAX_RANGE), y1, x1, y2, x2, 0);
+ u16b grid_g[512];
+ int grid_n = project_path(player_ptr, grid_g, (project_length ? project_length : MAX_RANGE), y1, x1, y2, x2, 0);
/* Identical grid */
if (!grid_n) return TRUE;
/* Final grid */
- y = GRID_Y(grid_g[grid_n - 1]);
- x = GRID_X(grid_g[grid_n - 1]);
+ POSITION y = GRID_Y(grid_g[grid_n - 1]);
+ POSITION x = GRID_X(grid_g[grid_n - 1]);
/* May not end in an unrequested grid */
if ((y != y2) || (x != x2)) return FALSE;
- /* Assume okay */
return TRUE;
}
*/
void vault_monsters(player_type *player_ptr, POSITION y1, POSITION x1, int num)
{
- int k, i;
- POSITION y, x;
- grid_type *g_ptr;
-
/* Try to summon "num" monsters "near" the given location */
floor_type *floor_ptr = player_ptr->current_floor_ptr;
- for (k = 0; k < num; k++)
+ for (int k = 0; k < num; k++)
{
/* Try nine locations */
- for (i = 0; i < 9; i++)
+ for (int i = 0; i < 9; i++)
{
int d = 1;
/* Pick a nearby location */
+ POSITION y, x;
scatter(player_ptr, &y, &x, y1, x1, d, 0);
/* Require "empty" floor grids */
+ grid_type *g_ptr;
g_ptr = &player_ptr->current_floor_ptr->grid_array[y][x];
if (!cave_empty_grid(g_ptr)) continue;
*/
bool cave_valid_bold(floor_type *floor_ptr, POSITION y, POSITION x)
{
- grid_type *g_ptr = &floor_ptr->grid_array[y][x];
- OBJECT_IDX this_o_idx, next_o_idx = 0;
-
/* Forbid perma-grids */
+ grid_type *g_ptr = &floor_ptr->grid_array[y][x];
if (cave_perma_grid(g_ptr)) return FALSE;
/* Check objects */
- for (this_o_idx = g_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
+ OBJECT_IDX next_o_idx = 0;
+ for (OBJECT_IDX this_o_idx = g_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
{
object_type *o_ptr;
o_ptr = &floor_ptr->o_list[this_o_idx];
if (object_is_artifact(o_ptr)) return FALSE;
}
- /* Accept */
return TRUE;
}
+
/*
* Change the "feat" flag for a grid, and notice/redraw the grid
*/
floor_type *floor_ptr = player_ptr->current_floor_ptr;
grid_type *g_ptr = &floor_ptr->grid_array[y][x];
feature_type *f_ptr = &f_info[feat];
- bool old_los, old_mirror;
-
if (!current_world_ptr->character_dungeon)
{
/* Clear mimic type */
return;
}
- old_los = cave_have_flag_bold(floor_ptr, y, x, FF_LOS);
- old_mirror = is_mirror_grid(g_ptr);
+ bool old_los = cave_have_flag_bold(floor_ptr, y, x, FF_LOS);
+ bool old_mirror = is_mirror_grid(g_ptr);
/* Clear mimic type */
g_ptr->mimic = 0;
}
/* Hack -- glow the GLOW terrain */
- if (have_flag(f_ptr->flags, FF_GLOW) && !(d_info[player_ptr->dungeon_idx].flags1 & DF1_DARKNESS))
+ if (!have_flag(f_ptr->flags, FF_GLOW) || (d_info[player_ptr->dungeon_idx].flags1 & DF1_DARKNESS))
+ return;
+
+ for (DIRECTION i = 0; i < 9; i++)
{
- DIRECTION i;
- POSITION yy, xx;
+ POSITION yy = y + ddy_ddd[i];
+ POSITION xx = x + ddx_ddd[i];
+ if (!in_bounds2(floor_ptr, yy, xx)) continue;
+
grid_type *cc_ptr;
+ cc_ptr = &floor_ptr->grid_array[yy][xx];
+ cc_ptr->info |= CAVE_GLOW;
- for (i = 0; i < 9; i++)
+ if (player_has_los_grid(cc_ptr))
{
- yy = y + ddy_ddd[i];
- xx = x + ddx_ddd[i];
- if (!in_bounds2(floor_ptr, yy, xx)) continue;
- cc_ptr = &floor_ptr->grid_array[yy][xx];
- cc_ptr->info |= CAVE_GLOW;
-
- if (player_has_los_grid(cc_ptr))
- {
- if (cc_ptr->m_idx) update_monster(player_ptr, cc_ptr->m_idx, FALSE);
- note_spot(yy, xx);
- lite_spot(yy, xx);
- }
-
- update_local_illumination(player_ptr, yy, xx);
+ if (cc_ptr->m_idx) update_monster(player_ptr, cc_ptr->m_idx, FALSE);
+ note_spot(yy, xx);
+ lite_spot(yy, xx);
}
- if (player_ptr->special_defense & NINJA_S_STEALTH)
- {
- if (floor_ptr->grid_array[player_ptr->y][player_ptr->x].info & CAVE_GLOW) set_superstealth(player_ptr, FALSE);
- }
+ update_local_illumination(player_ptr, yy, xx);
+ }
+
+ if (player_ptr->special_defense & NINJA_S_STEALTH)
+ {
+ if (floor_ptr->grid_array[player_ptr->y][player_ptr->x].info & CAVE_GLOW) set_superstealth(player_ptr, FALSE);
}
}
*/
void place_random_door(player_type *player_ptr, POSITION y, POSITION x, bool room)
{
- int tmp, type;
- FEAT_IDX feat = feat_none;
floor_type *floor_ptr = player_ptr->current_floor_ptr;
grid_type *g_ptr = &floor_ptr->grid_array[y][x];
-
- /* Initialize mimic info */
g_ptr->mimic = 0;
if (d_info[floor_ptr->dungeon_idx].flags1 & DF1_NO_DOORS)
return;
}
- type = ((d_info[floor_ptr->dungeon_idx].flags1 & DF1_CURTAIN) &&
+ int type = ((d_info[floor_ptr->dungeon_idx].flags1 & DF1_CURTAIN) &&
one_in_((d_info[floor_ptr->dungeon_idx].flags1 & DF1_NO_CAVE) ? 16 : 256)) ? DOOR_CURTAIN :
((d_info[floor_ptr->dungeon_idx].flags1 & DF1_GLASS_DOOR) ? DOOR_GLASS_DOOR : DOOR_DOOR);
/* Choose an object */
- tmp = randint0(1000);
+ int tmp = randint0(1000);
/* Open doors (300/1000) */
+ FEAT_IDX feat = feat_none;
if (tmp < 300)
{
/* Create open door */
/* Closed, locked, or stuck doors (400/1000) */
else place_closed_door(player_ptr, y, x, type);
- if (tmp < 400)
+ if (tmp >= 400)
{
- if (feat != feat_none)
- {
- set_cave_feat(floor_ptr, y, x, feat);
- }
- else
- {
- place_floor_bold(floor_ptr, y, x);
- }
+ delete_monster(floor_ptr, y, x);
+ return;
+ }
+
+ if (feat != feat_none)
+ {
+ set_cave_feat(floor_ptr, y, x, feat);
+ }
+ else
+ {
+ place_floor_bold(floor_ptr, y, x);
}
delete_monster(floor_ptr, y, x);
}
-
/*!
* @brief グローバルオブジェクト配列を初期化する /
* Delete all the items when player leaves the level
*/
void wipe_o_list(floor_type *floor_ptr)
{
- int i;
-
/* Delete the existing objects */
- for (i = 1; i < floor_ptr->o_max; i++)
+ for (int i = 1; i < floor_ptr->o_max; i++)
{
object_type *o_ptr = &floor_ptr->o_list[i];
/* Hack -- see above */
m_ptr->hold_o_idx = 0;
+ object_wipe(o_ptr);
+ continue;
}
/* Dungeon */
- else
- {
- grid_type *g_ptr;
+ grid_type *g_ptr;
- /* Access location */
- POSITION y = o_ptr->iy;
- POSITION x = o_ptr->ix;
+ /* Access location */
+ POSITION y = o_ptr->iy;
+ POSITION x = o_ptr->ix;
- /* Access grid */
- g_ptr = &floor_ptr->grid_array[y][x];
+ /* Access grid */
+ g_ptr = &floor_ptr->grid_array[y][x];
- /* Hack -- see above */
- g_ptr->o_idx = 0;
- }
+ /* Hack -- see above */
+ g_ptr->o_idx = 0;
object_wipe(o_ptr);
}
- /* Reset "floor_ptr->o_max" */
floor_ptr->o_max = 1;
-
- /* Reset "floor_ptr->o_cnt" */
floor_ptr->o_cnt = 0;
}
*/
void place_closed_door(player_type *player_ptr, POSITION y, POSITION x, int type)
{
- int tmp;
- FEAT_IDX feat = feat_none;
-
floor_type *floor_ptr = player_ptr->current_floor_ptr;
if (d_info[floor_ptr->dungeon_idx].flags1 & DF1_NO_DOORS)
{
}
/* Choose an object */
- tmp = randint0(400);
+ int tmp = randint0(400);
/* Closed doors (300/400) */
+ FEAT_IDX feat = feat_none;
if (tmp < 300)
{
/* Create closed door */
feat = feat_jammed_door_random(type);
}
- if (feat != feat_none)
- {
- cave_set_feat(player_ptr, y, x, feat);
-
- /* Now it is not floor */
- floor_ptr->grid_array[y][x].info &= ~(CAVE_MASK);
- }
- else
+ if (feat == feat_none)
{
place_floor_bold(floor_ptr, y, x);
+ return;
}
+
+ cave_set_feat(player_ptr, y, x, feat);
+ floor_ptr->grid_array[y][x].info &= ~(CAVE_MASK);
}
+
/*!
* @brief 特殊な部屋向けに各種アイテムを配置する(vault_trapのサブセット) / Place a trap with a given displacement of point
* @param y トラップを配置したいマスの中心Y座標
*/
void vault_trap_aux(player_type *player_ptr, POSITION y, POSITION x, POSITION yd, POSITION xd)
{
- int count = 0, y1 = y, x1 = x;
- int dummy = 0;
-
grid_type *g_ptr;
/* Place traps */
floor_type *floor_ptr = player_ptr->current_floor_ptr;
- for (count = 0; count <= 5; count++)
+ int y1 = y, x1 = x;
+ int dummy = 0;
+ for (int count = 0; count <= 5; count++)
{
/* Get a location */
while (dummy < SAFE_MAX_ATTEMPTS)
}
}
+
/*!
* @brief 指定のマスが床系地形であるかを返す / Function that sees if a square is a floor. (Includes range checking.)
* @param x チェックするマスのX座標
return FALSE;
}
+
/*!
* @brief 隣接4マスに存在する通路の数を返す / Count the number of "corridor" grids adjacent to the given grid.
* @param y1 基準となるマスのY座標
*/
static int next_to_corr(floor_type *floor_ptr, POSITION y1, POSITION x1)
{
- int i, k = 0;
- POSITION y, x;
-
- grid_type *g_ptr;
-
/* Scan adjacent grids */
- for (i = 0; i < 4; i++)
+ int k = 0;
+ for (int i = 0; i < 4; i++)
{
- y = y1 + ddy_ddd[i];
- x = x1 + ddx_ddd[i];
+ POSITION y = y1 + ddy_ddd[i];
+ POSITION x = x1 + ddx_ddd[i];
+ grid_type *g_ptr;
g_ptr = &floor_ptr->grid_array[y][x];
/* Skip non floors */
}
/* Return the number of corridors */
- return (k);
+ return k;
}
/*!
static bool possible_doorway(floor_type *floor_ptr, POSITION y, POSITION x)
{
/* Count the adjacent corridors */
- if (next_to_corr(floor_ptr, y, x) >= 2)
+ if (next_to_corr(floor_ptr, y, x) < 2) return FALSE;
+
+ /* Check Vertical */
+ if (cave_have_flag_bold(floor_ptr, y - 1, x, FF_WALL) &&
+ cave_have_flag_bold(floor_ptr, y + 1, x, FF_WALL))
{
- /* Check Vertical */
- if (cave_have_flag_bold(floor_ptr, y - 1, x, FF_WALL) &&
- cave_have_flag_bold(floor_ptr, y + 1, x, FF_WALL))
- {
- return TRUE;
- }
+ return TRUE;
+ }
- /* Check Horizontal */
- if (cave_have_flag_bold(floor_ptr, y, x - 1, FF_WALL) &&
- cave_have_flag_bold(floor_ptr, y, x + 1, FF_WALL))
- {
- return TRUE;
- }
+ /* Check Horizontal */
+ if (cave_have_flag_bold(floor_ptr, y, x - 1, FF_WALL) &&
+ cave_have_flag_bold(floor_ptr, y, x + 1, FF_WALL))
+ {
+ return TRUE;
}
- /* No doorway */
return FALSE;
}
+
/*!
* @brief ドアの設置を試みる / Places door at y, x position if at least 2 walls found
* @param player_ptr プレーヤーへの参照ポインタ
FEAT_IDX conv_dungeon_feat(floor_type *floor_ptr, FEAT_IDX newfeat)
{
feature_type *f_ptr = &f_info[newfeat];
-
if (have_flag(f_ptr->flags, FF_CONVERT))
{
switch (f_ptr->subtype)
*/
void vault_objects(player_type *player_ptr, POSITION y, POSITION x, int num)
{
- int dummy = 0;
- int i = 0, j = y, k = x;
-
- grid_type *g_ptr;
floor_type *floor_ptr = player_ptr->current_floor_ptr;
/* Attempt to place 'num' objects */
for (; num > 0; --num)
{
/* Try up to 11 spots looking for empty space */
- for (i = 0; i < 11; ++i)
+ int j = y, k = x;
+ int dummy = 0;
+ for (int i = 0; i < 11; ++i)
{
/* Pick a random location */
while (dummy < SAFE_MAX_ATTEMPTS)
}
/* Require "clean" floor space */
+ grid_type *g_ptr;
g_ptr = &floor_ptr->grid_array[j][k];
if (!is_floor_grid(g_ptr) || g_ptr->o_idx) continue;
}
}
+
/*!
* @brief 始点から終点への直線経路を返す /
* Determine the path taken by a projection.
*/
sint project_path(player_type *player_ptr, u16b *gp, POSITION range, POSITION y1, POSITION x1, POSITION y2, POSITION x2, BIT_FLAGS flg)
{
- POSITION y, x;
-
- int n = 0;
- int k = 0;
+ /* No path necessary (or allowed) */
+ if ((x1 == x2) && (y1 == y2)) return 0;
- /* Absolute */
+ /* Analyze "dy" */
+ POSITION y, x;
POSITION ay, ax;
-
- /* Offsets */
POSITION sy, sx;
-
- /* Fractions */
int frac;
-
- /* Scale factors */
- int full, half;
-
- /* Slope */
int m;
- /* No path necessary (or allowed) */
- if ((x1 == x2) && (y1 == y2)) return (0);
-
-
- /* Analyze "dy" */
if (y2 < y1)
{
ay = (y1 - y2);
sx = 1;
}
-
/* Number of "units" in one "half" grid */
- half = (ay * ax);
+ int half = (ay * ax);
/* Number of "units" in one "full" grid */
- full = half << 1;
+ int full = half << 1;
/* Vertical */
floor_type *floor_ptr = player_ptr->current_floor_ptr;
+ int n = 0;
+ int k = 0;
if (ay > ax)
{
/* Let m = ((dx/dy) * full) = (dx * dx * 2) */
/* Advance (Y) */
y += sy;
}
+
+ return n;
}
/* Horizontal */
- else if (ax > ay)
+ if (ax > ay)
{
/* Let m = ((dy/dx) * full) = (dy * dy * 2) */
m = ay * ay * 2;
/* Advance (X) */
x += sx;
}
+
+ return n;
}
/* Diagonal */
- else
- {
- /* Start */
- y = y1 + sy;
- x = x1 + sx;
-
- /* Create the projection path */
- while (TRUE)
- {
- /* Save grid */
- gp[n++] = GRID(y, x);
+ y = y1 + sy;
+ x = x1 + sx;
- /* Hack -- Check maximum range */
- if ((n + (n >> 1)) >= range) break;
+ /* Create the projection path */
+ while (TRUE)
+ {
+ /* Save grid */
+ gp[n++] = GRID(y, x);
- /* Sometimes stop at destination grid */
- if (!(flg & (PROJECT_THRU)))
- {
- if ((x == x2) && (y == y2)) break;
- }
+ /* Hack -- Check maximum range */
+ if ((n + (n >> 1)) >= range) break;
- if (flg & (PROJECT_DISI))
- {
- if ((n > 0) && cave_stop_disintegration(floor_ptr, y, x)) break;
- }
- else if (flg & (PROJECT_LOS))
- {
- if ((n > 0) && !cave_los_bold(floor_ptr, y, x)) break;
- }
- else if (!(flg & (PROJECT_PATH)))
- {
- /* Always stop at non-initial wall grids */
- if ((n > 0) && !cave_have_flag_bold(floor_ptr, y, x, FF_PROJECT)) break;
- }
+ /* Sometimes stop at destination grid */
+ if (!(flg & (PROJECT_THRU)))
+ {
+ if ((x == x2) && (y == y2)) break;
+ }
- /* Sometimes stop at non-initial monsters/players */
- if (flg & (PROJECT_STOP))
- {
- if ((n > 0) &&
- (player_bold(player_ptr, y, x) || floor_ptr->grid_array[y][x].m_idx != 0))
- break;
- }
+ if (flg & (PROJECT_DISI))
+ {
+ if ((n > 0) && cave_stop_disintegration(floor_ptr, y, x)) break;
+ }
+ else if (flg & (PROJECT_LOS))
+ {
+ if ((n > 0) && !cave_los_bold(floor_ptr, y, x)) break;
+ }
+ else if (!(flg & (PROJECT_PATH)))
+ {
+ /* Always stop at non-initial wall grids */
+ if ((n > 0) && !cave_have_flag_bold(floor_ptr, y, x, FF_PROJECT)) break;
+ }
- if (!in_bounds(floor_ptr, y, x)) break;
+ /* Sometimes stop at non-initial monsters/players */
+ if (flg & (PROJECT_STOP))
+ {
+ if ((n > 0) &&
+ (player_bold(player_ptr, y, x) || floor_ptr->grid_array[y][x].m_idx != 0))
+ break;
+ }
- /* Advance (Y) */
- y += sy;
+ if (!in_bounds(floor_ptr, y, x)) break;
- /* Advance (X) */
- x += sx;
- }
+ y += sy;
+ x += sx;
}
- /* Length */
- return (n);
+ return n;
}
OBJECT_IDX o_idx = o_pop(floor_ptr);
/* Success */
- if (o_idx)
- {
- object_type *o_ptr;
- o_ptr = &floor_ptr->o_list[o_idx];
-
- /* Structure Copy */
- object_copy(o_ptr, q_ptr);
-
- o_ptr->iy = y;
- o_ptr->ix = x;
-
- /* Build a stack */
- o_ptr->next_o_idx = g_ptr->o_idx;
-
- g_ptr->o_idx = o_idx;
- note_spot(y, x);
- lite_spot(y, x);
- }
- else
+ if (o_idx == 0)
{
/* Hack -- Preserve artifacts */
if (object_is_fixed_artifact(q_ptr))
{
a_info[q_ptr->name1].cur_num = 0;
}
+
+ return;
}
-}
+ object_type *o_ptr;
+ o_ptr = &floor_ptr->o_list[o_idx];
+
+ /* Structure Copy */
+ object_copy(o_ptr, q_ptr);
+
+ o_ptr->iy = y;
+ o_ptr->ix = x;
+
+ /* Build a stack */
+ o_ptr->next_o_idx = g_ptr->o_idx;
+
+ g_ptr->o_idx = o_idx;
+ note_spot(y, x);
+ lite_spot(y, x);
+}
/*!
*/
void place_gold(floor_type *floor_ptr, POSITION y, POSITION x)
{
- OBJECT_IDX o_idx;
-
/* Acquire grid */
grid_type *g_ptr = &floor_ptr->grid_array[y][x];
- object_type forge;
- object_type *q_ptr;
-
-
/* Paranoia -- check bounds */
if (!in_bounds(floor_ptr, y, x)) return;
/* Avoid stacking on other objects */
if (g_ptr->o_idx) return;
+ object_type forge;
+ object_type *q_ptr;
q_ptr = &forge;
object_wipe(q_ptr);
/* Make some gold */
if (!make_gold(floor_ptr, q_ptr)) return;
- o_idx = o_pop(floor_ptr);
+ OBJECT_IDX o_idx = o_pop(floor_ptr);
/* Success */
- if (o_idx)
- {
- object_type *o_ptr;
- o_ptr = &floor_ptr->o_list[o_idx];
- object_copy(o_ptr, q_ptr);
+ if (o_idx == 0) return;
+
+ object_type *o_ptr;
+ o_ptr = &floor_ptr->o_list[o_idx];
+ object_copy(o_ptr, q_ptr);
- /* Save location */
- o_ptr->iy = y;
- o_ptr->ix = x;
+ /* Save location */
+ o_ptr->iy = y;
+ o_ptr->ix = x;
- /* Build a stack */
- o_ptr->next_o_idx = g_ptr->o_idx;
+ /* Build a stack */
+ o_ptr->next_o_idx = g_ptr->o_idx;
- g_ptr->o_idx = o_idx;
- note_spot(y, x);
- lite_spot(y, x);
- }
+ g_ptr->o_idx = o_idx;
+ note_spot(y, x);
+ lite_spot(y, x);
}
}
-
/*!
* @brief グローバルオブジェクト配列に対し指定範囲のオブジェクトを整理してIDの若い順に寄せる /
* Move an object from index i1 to index i2 in the object list
*/
static void compact_objects_aux(floor_type *floor_ptr, OBJECT_IDX i1, OBJECT_IDX i2)
{
- OBJECT_IDX i;
- grid_type *g_ptr;
- object_type *o_ptr;
-
/* Do nothing */
if (i1 == i2) return;
/* Repair objects */
- for (i = 1; i < floor_ptr->o_max; i++)
+ object_type *o_ptr;
+ for (OBJECT_IDX i = 1; i < floor_ptr->o_max; i++)
{
o_ptr = &floor_ptr->o_list[i];
o_ptr->next_o_idx = i2;
}
}
+
o_ptr = &floor_ptr->o_list[i1];
if (OBJECT_IS_HELD_MONSTER(o_ptr))
x = o_ptr->ix;
/* Acquire grid */
+ grid_type *g_ptr;
g_ptr = &floor_ptr->grid_array[y][x];
/* Repair grid */
}
}
- /* Structure copy */
floor_ptr->o_list[i2] = floor_ptr->o_list[i1];
-
- /* Wipe the hole */
object_wipe(o_ptr);
}
+
/*!
* @brief グローバルオブジェクト配列から優先度の低いものを削除し、データを圧縮する。 /
* Compact and Reorder the object list.
*/
void compact_objects(player_type *player_ptr, int size)
{
- OBJECT_IDX i;
- POSITION y, x;
- int num, cnt;
- int cur_lev, cur_dis, chance;
object_type *o_ptr;
/* Compact */
player_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
}
-
/* Compact at least 'size' objects */
floor_type *floor_ptr = player_ptr->current_floor_ptr;
- for (num = 0, cnt = 1; num < size; cnt++)
+ for (int num = 0, cnt = 1; num < size; cnt++)
{
/* Get more vicious each iteration */
- cur_lev = 5 * cnt;
+ int cur_lev = 5 * cnt;
/* Get closer each iteration */
- cur_dis = 5 * (20 - cnt);
+ int cur_dis = 5 * (20 - cnt);
/* Examine the objects */
- for (i = 1; i < floor_ptr->o_max; i++)
+ for (OBJECT_IDX i = 1; i < floor_ptr->o_max; i++)
{
o_ptr = &floor_ptr->o_list[i];
/* Hack -- High level objects start out "immune" */
if (k_info[o_ptr->k_idx].level > cur_lev) continue;
+ POSITION y, x;
if (OBJECT_IS_HELD_MONSTER(o_ptr))
{
monster_type *m_ptr;
if ((cur_dis > 0) && (distance(player_ptr->y, player_ptr->x, y, x) < cur_dis)) continue;
/* Saving throw */
- chance = 90;
+ int chance = 90;
/* Hack -- only compact artifacts in emergencies */
if ((object_is_fixed_artifact(o_ptr) || o_ptr->art_name) &&
if (randint0(100) < chance) continue;
delete_object_idx(floor_ptr, i);
-
- /* Count it */
num++;
}
}
-
/* Excise dead objects (backwards!) */
- for (i = floor_ptr->o_max - 1; i >= 1; i--)
+ for (OBJECT_IDX i = floor_ptr->o_max - 1; i >= 1; i--)
{
o_ptr = &floor_ptr->o_list[i];
}
}
+
/*!
* @brief 特殊な部屋向けに各種アイテムを配置する(メインルーチン) / Place some traps with a given displacement of given location
* @param player_ptr プレーヤーへの参照ポインタ
*/
void vault_traps(player_type *player_ptr, POSITION y, POSITION x, POSITION yd, POSITION xd, int num)
{
- int i;
-
- for (i = 0; i < num; i++)
+ for (int i = 0; i < num; i++)
{
vault_trap_aux(player_ptr, y, x, yd, xd);
}
*/
void scatter(player_type *player_ptr, POSITION *yp, POSITION *xp, POSITION y, POSITION x, POSITION d, BIT_FLAGS mode)
{
- POSITION nx, ny;
-
/* Pick a location */
floor_type *floor_ptr = player_ptr->current_floor_ptr;
+ POSITION nx, ny;
while (TRUE)
{
/* Pick a new location */
if (mode & PROJECT_LOS)
{
if (los(player_ptr, y, x, ny, nx)) break;
- }
- else
- {
- if (projectable(player_ptr, y, x, ny, nx)) break;
+ continue;
}
+ if (projectable(player_ptr, y, x, ny, nx)) break;
}
- /* Save the location */
- (*yp) = ny;
- (*xp) = nx;
+ *yp = ny;
+ *xp = nx;
}