From 3f63d1699a27c407314729c5f77449952e2fad90 Mon Sep 17 00:00:00 2001 From: Hourier Date: Mon, 13 Jan 2020 13:10:22 +0900 Subject: [PATCH] =?utf8?q?[Refactor]=20#38997=20floor.c=20=E3=81=AE?= =?utf8?q?=E6=95=B4=E5=BD=A2=20/=20Reshaped=20floor.c?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- src/floor.c | 692 ++++++++++++++++++++++++++---------------------------------- 1 file changed, 295 insertions(+), 397 deletions(-) diff --git a/src/floor.c b/src/floor.c index 98cca1148..2b4527154 100644 --- a/src/floor.c +++ b/src/floor.c @@ -40,13 +40,12 @@ void place_locked_door(player_type *player_ptr, POSITION y, POSITION x) 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); } @@ -64,40 +63,39 @@ void place_secret_door(player_type *player_ptr, POSITION y, POSITION x, int type 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; @@ -120,9 +118,6 @@ 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] = { @@ -137,9 +132,9 @@ void update_smell(floor_type *floor_ptr, player_type *subject_ptr) 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; @@ -150,17 +145,16 @@ void update_smell(floor_type *floor_ptr, player_type *subject_ptr) 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; @@ -188,12 +182,10 @@ void update_smell(floor_type *floor_ptr, player_type *subject_ptr) */ 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; @@ -203,6 +195,7 @@ void forget_flow(floor_type *floor_ptr) } } + /* * 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. @@ -235,7 +228,6 @@ void add_door(player_type *player_ptr, POSITION x, POSITION y) place_solid_bold(floor_ptr, y, x + 1); } - /* look at: * x#x * .#. @@ -256,6 +248,7 @@ void add_door(player_type *player_ptr, POSITION x, POSITION y) } } + /*! * @brief 所定の位置に上り階段か下り階段を配置する / Place an up/down staircase at given location * @param player_ptr プレーヤーへの参照ポインタ @@ -290,6 +283,7 @@ void place_random_stairs(player_type *player_ptr, POSITION y, POSITION x) else if (down_stairs) set_cave_feat(floor_ptr, y, x, feat_down_stair); } + /*! * @brief LOS(Line Of Sight / 視線が通っているか)の判定を行う。 * @param player_ptr プレーヤーへの参照ポインタ @@ -335,47 +329,20 @@ void place_random_stairs(player_type *player_ptr, POSITION y, POSITION x) */ 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 */ @@ -425,11 +392,9 @@ bool los(player_type *player_ptr, POSITION y1, POSITION x1, POSITION y2, POSITIO 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) @@ -449,15 +414,15 @@ bool los(player_type *player_ptr, POSITION y1, POSITION x1, POSITION y2, POSITIO } } - /* 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 */ @@ -488,71 +453,71 @@ bool los(player_type *player_ptr, POSITION y1, POSITION x1, POSITION y2, POSITIO 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; } @@ -565,25 +530,20 @@ bool los(player_type *player_ptr, POSITION y1, POSITION x1, POSITION y2, POSITIO */ 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; } @@ -600,23 +560,21 @@ bool projectable(player_type *player_ptr, POSITION y1, POSITION x1, POSITION y2, */ 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; @@ -640,14 +598,13 @@ void vault_monsters(player_type *player_ptr, POSITION y1, POSITION x1, int num) */ 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]; @@ -657,10 +614,10 @@ bool cave_valid_bold(floor_type *floor_ptr, POSITION y, POSITION x) if (object_is_artifact(o_ptr)) return FALSE; } - /* Accept */ return TRUE; } + /* * Change the "feat" flag for a grid, and notice/redraw the grid */ @@ -669,8 +626,6 @@ void cave_set_feat(player_type *player_ptr, POSITION y, POSITION x, FEAT_IDX fea 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 */ @@ -697,8 +652,8 @@ void cave_set_feat(player_type *player_ptr, POSITION y, POSITION x, FEAT_IDX fea 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; @@ -739,34 +694,32 @@ void cave_set_feat(player_type *player_ptr, POSITION y, POSITION x, FEAT_IDX fea } /* 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); } } @@ -781,12 +734,8 @@ void cave_set_feat(player_type *player_ptr, POSITION y, POSITION x, FEAT_IDX fea */ 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) @@ -795,14 +744,15 @@ void place_random_door(player_type *player_ptr, POSITION y, POSITION x, bool roo 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 */ @@ -842,23 +792,25 @@ void place_random_door(player_type *player_ptr, POSITION y, POSITION x, bool roo /* 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 @@ -873,10 +825,8 @@ void place_random_door(player_type *player_ptr, POSITION y, POSITION x, bool roo */ 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]; @@ -900,30 +850,26 @@ void wipe_o_list(floor_type *floor_ptr) /* 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; } @@ -938,9 +884,6 @@ void wipe_o_list(floor_type *floor_ptr) */ 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) { @@ -949,9 +892,10 @@ void place_closed_door(player_type *player_ptr, POSITION y, POSITION x, int type } /* 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 */ @@ -972,19 +916,17 @@ void place_closed_door(player_type *player_ptr, POSITION y, POSITION x, int type 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座標 @@ -997,14 +939,13 @@ void place_closed_door(player_type *player_ptr, POSITION y, POSITION x, int type */ 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) @@ -1032,6 +973,7 @@ void vault_trap_aux(player_type *player_ptr, POSITION y, POSITION x, POSITION yd } } + /*! * @brief 指定のマスが床系地形であるかを返す / Function that sees if a square is a floor. (Includes range checking.) * @param x チェックするマスのX座標 @@ -1052,6 +994,7 @@ bool get_is_floor(floor_type *floor_ptr, POSITION x, POSITION y) return FALSE; } + /*! * @brief 隣接4マスに存在する通路の数を返す / Count the number of "corridor" grids adjacent to the given grid. * @param y1 基準となるマスのY座標 @@ -1065,16 +1008,13 @@ bool get_is_floor(floor_type *floor_ptr, POSITION x, POSITION 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 */ @@ -1092,7 +1032,7 @@ static int next_to_corr(floor_type *floor_ptr, POSITION y1, POSITION x1) } /* Return the number of corridors */ - return (k); + return k; } /*! @@ -1108,27 +1048,26 @@ static int next_to_corr(floor_type *floor_ptr, POSITION y1, POSITION x1) 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 プレーヤーへの参照ポインタ @@ -1159,7 +1098,6 @@ void try_door(player_type *player_ptr, POSITION y, POSITION x) 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) @@ -1198,17 +1136,15 @@ FEAT_IDX conv_dungeon_feat(floor_type *floor_ptr, FEAT_IDX newfeat) */ 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) @@ -1226,6 +1162,7 @@ void vault_objects(player_type *player_ptr, POSITION y, POSITION x, int num) } /* 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; @@ -1244,6 +1181,7 @@ void vault_objects(player_type *player_ptr, POSITION y, POSITION x, int num) } } + /*! * @brief 始点から終点への直線経路を返す / * Determine the path taken by a projection. @@ -1298,31 +1236,16 @@ void vault_objects(player_type *player_ptr, POSITION y, POSITION x, int num) */ 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); @@ -1346,15 +1269,16 @@ sint project_path(player_type *player_ptr, u16b *gp, POSITION range, POSITION y1 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) */ @@ -1440,10 +1364,12 @@ sint project_path(player_type *player_ptr, u16b *gp, POSITION range, POSITION y1 /* 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; @@ -1529,64 +1455,58 @@ sint project_path(player_type *player_ptr, u16b *gp, POSITION range, POSITION y1 /* 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; } @@ -1657,34 +1577,33 @@ void place_object(player_type *owner_ptr, POSITION y, POSITION x, BIT_FLAGS mode 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); +} /*! @@ -1699,15 +1618,9 @@ void place_object(player_type *owner_ptr, POSITION y, POSITION x, BIT_FLAGS mode */ 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; @@ -1717,32 +1630,33 @@ void place_gold(floor_type *floor_ptr, POSITION y, POSITION x) /* 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); } @@ -1765,7 +1679,6 @@ void delete_monster(floor_type *floor_ptr, POSITION y, POSITION x) } - /*! * @brief グローバルオブジェクト配列に対し指定範囲のオブジェクトを整理してIDの若い順に寄せる / * Move an object from index i1 to index i2 in the object list @@ -1775,15 +1688,12 @@ void delete_monster(floor_type *floor_ptr, POSITION y, POSITION x) */ 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]; @@ -1797,6 +1707,7 @@ static void compact_objects_aux(floor_type *floor_ptr, OBJECT_IDX i1, OBJECT_IDX o_ptr->next_o_idx = i2; } } + o_ptr = &floor_ptr->o_list[i1]; if (OBJECT_IS_HELD_MONSTER(o_ptr)) @@ -1822,6 +1733,7 @@ static void compact_objects_aux(floor_type *floor_ptr, OBJECT_IDX i1, OBJECT_IDX x = o_ptr->ix; /* Acquire grid */ + grid_type *g_ptr; g_ptr = &floor_ptr->grid_array[y][x]; /* Repair grid */ @@ -1832,13 +1744,11 @@ static void compact_objects_aux(floor_type *floor_ptr, OBJECT_IDX i1, OBJECT_IDX } } - /* 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. @@ -1858,10 +1768,6 @@ static void compact_objects_aux(floor_type *floor_ptr, OBJECT_IDX i1, OBJECT_IDX */ 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 */ @@ -1872,19 +1778,18 @@ void compact_objects(player_type *player_ptr, int size) 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]; @@ -1893,6 +1798,7 @@ void compact_objects(player_type *player_ptr, int size) /* 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; @@ -1916,7 +1822,7 @@ void compact_objects(player_type *player_ptr, int size) 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) && @@ -1926,15 +1832,12 @@ void compact_objects(player_type *player_ptr, int size) 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]; @@ -1949,6 +1852,7 @@ void compact_objects(player_type *player_ptr, int size) } } + /*! * @brief 特殊な部屋向けに各種アイテムを配置する(メインルーチン) / Place some traps with a given displacement of given location * @param player_ptr プレーヤーへの参照ポインタ @@ -1963,9 +1867,7 @@ void compact_objects(player_type *player_ptr, int size) */ 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); } @@ -1985,10 +1887,9 @@ void vault_traps(player_type *player_ptr, POSITION y, POSITION x, POSITION yd, P */ 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 */ @@ -2004,15 +1905,12 @@ void scatter(player_type *player_ptr, POSITION *yp, POSITION *xp, POSITION y, PO 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; } -- 2.11.0