From 7bd65b5dcc228e0860e3cb8f4e7a3ef4b23f47c0 Mon Sep 17 00:00:00 2001 From: Hourier <66951241+Hourier@users.noreply.github.com> Date: Wed, 1 Nov 2023 21:02:48 +0900 Subject: [PATCH] =?utf8?q?[Refactor]=20#3681=20terrains=5Finfo[]=20?= =?utf8?q?=E3=81=B8=E3=82=A2=E3=82=AF=E3=82=BB=E3=82=B9=E3=81=97=E3=81=A6?= =?utf8?q?=E3=81=84=E3=82=8B=E5=91=A8=E8=BE=BA=E3=81=AE=E3=82=B3=E3=83=BC?= =?utf8?q?=E3=83=89=E3=82=92=E5=8F=82=E7=85=A7=E3=82=92=E4=BD=BF=E3=81=86?= =?utf8?q?=E5=BD=A2=E3=81=AB=E3=81=BE=E3=81=A8=E3=82=81=E3=81=9F=20?= =?utf8?q?=E3=81=9D=E3=81=AE3?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- src/cmd-action/cmd-move.cpp | 64 +++++++++++----------- src/cmd-action/cmd-open-close.cpp | 110 ++++++++++++++++---------------------- src/cmd-action/cmd-others.cpp | 35 ++++++------ 3 files changed, 95 insertions(+), 114 deletions(-) diff --git a/src/cmd-action/cmd-move.cpp b/src/cmd-action/cmd-move.cpp index 936b661b2..b280f4f20 100644 --- a/src/cmd-action/cmd-move.cpp +++ b/src/cmd-action/cmd-move.cpp @@ -77,19 +77,17 @@ static bool confirm_leave_level(PlayerType *player_ptr, bool down_stair) void do_cmd_go_up(PlayerType *player_ptr) { auto &quest_list = QuestList::get_instance(); - bool go_up = false; - auto *g_ptr = &player_ptr->current_floor_ptr->grid_array[player_ptr->y][player_ptr->x]; - auto *f_ptr = &terrains_info[g_ptr->feat]; - int up_num = 0; + auto &floor = *player_ptr->current_floor_ptr; + const auto &grid = floor.get_grid({ player_ptr->y, player_ptr->x }); + const auto &terrain = terrains_info[grid.feat]; PlayerClass(player_ptr).break_samurai_stance({ SamuraiStanceType::MUSOU }); - if (f_ptr->flags.has_not(TerrainCharacteristics::LESS)) { + if (terrain.flags.has_not(TerrainCharacteristics::LESS)) { msg_print(_("ここには上り階段が見当たらない。", "I see no up staircase here.")); return; } - const auto &floor_ptr = player_ptr->current_floor_ptr; - if (f_ptr->flags.has(TerrainCharacteristics::QUEST)) { + if (terrain.flags.has(TerrainCharacteristics::QUEST)) { if (!confirm_leave_level(player_ptr, false)) { return; } @@ -103,8 +101,8 @@ void do_cmd_go_up(PlayerType *player_ptr) sound(SOUND_STAIRWAY); leave_quest_check(player_ptr); - floor_ptr->quest_number = i2enum(g_ptr->special); - const auto quest_number = floor_ptr->quest_number; + floor.quest_number = i2enum(grid.special); + const auto quest_number = floor.quest_number; auto &quest = quest_list[quest_number]; if (quest.status == QuestStatusType::UNTAKEN) { if (quest.type != QuestKindType::RANDOM) { @@ -116,7 +114,7 @@ void do_cmd_go_up(PlayerType *player_ptr) } if (!inside_quest(quest_number)) { - floor_ptr->dun_level = 0; + floor.dun_level = 0; player_ptr->word_recall = 0; } @@ -127,7 +125,8 @@ void do_cmd_go_up(PlayerType *player_ptr) return; } - if (!floor_ptr->is_in_dungeon()) { + auto go_up = false; + if (!floor.is_in_dungeon()) { go_up = true; } else { go_up = confirm_leave_level(player_ptr, false); @@ -151,13 +150,14 @@ void do_cmd_go_up(PlayerType *player_ptr) player_ptr->current_floor_ptr->quest_number = QuestId::NONE; } + auto up_num = 0; if (inside_quest(quest_number) && quest.type != QuestKindType::RANDOM) { leave_quest_check(player_ptr); - player_ptr->current_floor_ptr->quest_number = i2enum(g_ptr->special); + player_ptr->current_floor_ptr->quest_number = i2enum(grid.special); player_ptr->current_floor_ptr->dun_level = 0; up_num = 0; } else { - if (f_ptr->flags.has(TerrainCharacteristics::SHAFT)) { + if (terrain.flags.has(TerrainCharacteristics::SHAFT)) { prepare_change_floor_mode(player_ptr, CFM_SAVE_FLOORS | CFM_UP | CFM_SHAFT); up_num = 2; } else { @@ -165,7 +165,7 @@ void do_cmd_go_up(PlayerType *player_ptr) up_num = 1; } - if (player_ptr->current_floor_ptr->dun_level - up_num < floor_ptr->get_dungeon_definition().mindepth) { + if (player_ptr->current_floor_ptr->dun_level - up_num < floor.get_dungeon_definition().mindepth) { up_num = player_ptr->current_floor_ptr->dun_level; } } @@ -204,24 +204,24 @@ void do_cmd_go_down(PlayerType *player_ptr) int down_num = 0; PlayerClass(player_ptr).break_samurai_stance({ SamuraiStanceType::MUSOU }); - auto *floor_ptr = player_ptr->current_floor_ptr; - auto *g_ptr = &floor_ptr->grid_array[player_ptr->y][player_ptr->x]; - auto *f_ptr = &terrains_info[g_ptr->feat]; - if (f_ptr->flags.has_not(TerrainCharacteristics::MORE)) { + auto &floor = *player_ptr->current_floor_ptr; + auto &grid = floor.grid_array[player_ptr->y][player_ptr->x]; + auto &terrain = terrains_info[grid.feat]; + if (terrain.flags.has_not(TerrainCharacteristics::MORE)) { msg_print(_("ここには下り階段が見当たらない。", "I see no down staircase here.")); return; } - if (f_ptr->flags.has(TerrainCharacteristics::TRAP)) { + if (terrain.flags.has(TerrainCharacteristics::TRAP)) { fall_trap = true; } - if (f_ptr->flags.has(TerrainCharacteristics::QUEST_ENTER)) { + if (terrain.flags.has(TerrainCharacteristics::QUEST_ENTER)) { do_cmd_quest(player_ptr); return; } - if (f_ptr->flags.has(TerrainCharacteristics::QUEST)) { + if (terrain.flags.has(TerrainCharacteristics::QUEST)) { auto &quest_list = QuestList::get_instance(); if (!confirm_leave_level(player_ptr, true)) { return; @@ -237,9 +237,9 @@ void do_cmd_go_down(PlayerType *player_ptr) leave_quest_check(player_ptr); leave_tower_check(player_ptr); - floor_ptr->quest_number = i2enum(g_ptr->special); + floor.quest_number = i2enum(grid.special); - auto ¤t_quest = quest_list[floor_ptr->quest_number]; + auto ¤t_quest = quest_list[floor.quest_number]; if (current_quest.status == QuestStatusType::UNTAKEN) { if (current_quest.type != QuestKindType::RANDOM) { init_flags = INIT_ASSIGN; @@ -249,8 +249,8 @@ void do_cmd_go_down(PlayerType *player_ptr) current_quest.status = QuestStatusType::TAKEN; } - if (!floor_ptr->is_in_quest()) { - floor_ptr->dun_level = 0; + if (!floor.is_in_quest()) { + floor.dun_level = 0; player_ptr->word_recall = 0; } @@ -262,8 +262,8 @@ void do_cmd_go_down(PlayerType *player_ptr) } short target_dungeon = 0; - if (!floor_ptr->is_in_dungeon()) { - target_dungeon = f_ptr->flags.has(TerrainCharacteristics::ENTRANCE) ? g_ptr->special : DUNGEON_ANGBAND; + if (!floor.is_in_dungeon()) { + target_dungeon = terrain.flags.has(TerrainCharacteristics::ENTRANCE) ? grid.special : DUNGEON_ANGBAND; if (ironman_downward && (target_dungeon != DUNGEON_ANGBAND)) { msg_print(_("ダンジョンの入口は塞がれている!", "The entrance of this dungeon is closed!")); return; @@ -280,7 +280,7 @@ void do_cmd_go_down(PlayerType *player_ptr) player_ptr->oldpx = player_ptr->x; player_ptr->oldpy = player_ptr->y; - floor_ptr->set_dungeon_index(target_dungeon); + floor.set_dungeon_index(target_dungeon); prepare_change_floor_mode(player_ptr, CFM_FIRST_FLOOR); } @@ -289,14 +289,14 @@ void do_cmd_go_down(PlayerType *player_ptr) do_cmd_save_game(player_ptr, true); } - if (f_ptr->flags.has(TerrainCharacteristics::SHAFT)) { + if (terrain.flags.has(TerrainCharacteristics::SHAFT)) { down_num += 2; } else { down_num += 1; } - const auto &dungeon = floor_ptr->get_dungeon_definition(); - if (!floor_ptr->is_in_dungeon()) { + const auto &dungeon = floor.get_dungeon_definition(); + if (!floor.is_in_dungeon()) { player_ptr->enter_dungeon = true; down_num = dungeon.mindepth; } @@ -332,7 +332,7 @@ void do_cmd_go_down(PlayerType *player_ptr) return; } - if (f_ptr->flags.has(TerrainCharacteristics::SHAFT)) { + if (terrain.flags.has(TerrainCharacteristics::SHAFT)) { prepare_change_floor_mode(player_ptr, CFM_SAVE_FLOORS | CFM_DOWN | CFM_SHAFT); } else { prepare_change_floor_mode(player_ptr, CFM_SAVE_FLOORS | CFM_DOWN); diff --git a/src/cmd-action/cmd-open-close.cpp b/src/cmd-action/cmd-open-close.cpp index 5012a0d0a..6a39f0867 100644 --- a/src/cmd-action/cmd-open-close.cpp +++ b/src/cmd-action/cmd-open-close.cpp @@ -99,16 +99,14 @@ static bool exe_open_chest(PlayerType *player_ptr, POSITION y, POSITION x, OBJEC */ void do_cmd_open(PlayerType *player_ptr) { - POSITION y, x; - DIRECTION dir; - OBJECT_IDX o_idx; - bool more = false; + auto more = false; if (player_ptr->wild_mode) { return; } PlayerClass(player_ptr).break_samurai_stance({ SamuraiStanceType::MUSOU }); - + int y; + int x; if (easy_open) { int num_doors = count_dt(player_ptr, &y, &x, is_closed_door, false); int num_chests = count_chests(player_ptr, &y, &x, false); @@ -126,17 +124,16 @@ void do_cmd_open(PlayerType *player_ptr) command_arg = 0; } + int dir; if (get_rep_dir(player_ptr, &dir, true)) { - FEAT_IDX feat; - Grid *g_ptr; y = player_ptr->y + ddy[dir]; x = player_ptr->x + ddx[dir]; - g_ptr = &player_ptr->current_floor_ptr->grid_array[y][x]; - feat = g_ptr->get_feat_mimic(); - o_idx = chest_check(player_ptr->current_floor_ptr, y, x, false); + const auto &grid = player_ptr->current_floor_ptr->grid_array[y][x]; + auto feat = grid.get_feat_mimic(); + const auto o_idx = chest_check(player_ptr->current_floor_ptr, y, x, false); if (terrains_info[feat].flags.has_not(TerrainCharacteristics::OPEN) && !o_idx) { msg_print(_("そこには開けるものが見当たらない。", "You see nothing there to open.")); - } else if (g_ptr->m_idx && player_ptr->riding != g_ptr->m_idx) { + } else if (grid.m_idx && player_ptr->riding != grid.m_idx) { PlayerEnergy(player_ptr).set_player_turn_energy(100); msg_print(_("モンスターが立ちふさがっている!", "There is a monster in the way!")); do_cmd_attack(player_ptr, y, x, HISSATSU_NONE); @@ -160,15 +157,13 @@ void do_cmd_open(PlayerType *player_ptr) */ void do_cmd_close(PlayerType *player_ptr) { - POSITION y, x; - DIRECTION dir; - bool more = false; if (player_ptr->wild_mode) { return; } PlayerClass(player_ptr).break_samurai_stance({ SamuraiStanceType::MUSOU }); - + int y; + int x; if (easy_open && (count_dt(player_ptr, &y, &x, is_open, false) == 1)) { command_dir = coords_to_dir(player_ptr, y, x); } @@ -179,21 +174,20 @@ void do_cmd_close(PlayerType *player_ptr) command_arg = 0; } + auto more = false; + int dir; if (get_rep_dir(player_ptr, &dir)) { - Grid *g_ptr; - FEAT_IDX feat; - y = player_ptr->y + ddy[dir]; - x = player_ptr->x + ddx[dir]; - g_ptr = &player_ptr->current_floor_ptr->grid_array[y][x]; - feat = g_ptr->get_feat_mimic(); + const Pos2D pos(player_ptr->y + ddy[dir], player_ptr->x + ddx[dir]); + const auto &grid = player_ptr->current_floor_ptr->get_grid(pos); + auto feat = grid.get_feat_mimic(); if (terrains_info[feat].flags.has_not(TerrainCharacteristics::CLOSE)) { msg_print(_("そこには閉じるものが見当たらない。", "You see nothing there to close.")); - } else if (g_ptr->m_idx) { + } else if (grid.m_idx) { PlayerEnergy(player_ptr).set_player_turn_energy(100); msg_print(_("モンスターが立ちふさがっている!", "There is a monster in the way!")); - do_cmd_attack(player_ptr, y, x, HISSATSU_NONE); + do_cmd_attack(player_ptr, pos.y, pos.x, HISSATSU_NONE); } else { - more = exe_close(player_ptr, y, x); + more = exe_close(player_ptr, pos.y, pos.x); } } @@ -208,21 +202,18 @@ void do_cmd_close(PlayerType *player_ptr) */ void do_cmd_disarm(PlayerType *player_ptr) { - POSITION y, x; - DIRECTION dir; - OBJECT_IDX o_idx; - bool more = false; if (player_ptr->wild_mode) { return; } PlayerClass(player_ptr).break_samurai_stance({ SamuraiStanceType::MUSOU }); - if (easy_disarm) { - int num_traps = count_dt(player_ptr, &y, &x, is_trap, true); - int num_chests = count_chests(player_ptr, &y, &x, true); + int y; + int x; + auto num_traps = count_dt(player_ptr, &y, &x, is_trap, true); + auto num_chests = count_chests(player_ptr, &y, &x, true); if (num_traps || num_chests) { - bool too_many = (num_traps && num_chests) || (num_traps > 1) || (num_chests > 1); + auto too_many = (num_traps && num_chests) || (num_traps > 1) || (num_chests > 1); if (!too_many) { command_dir = coords_to_dir(player_ptr, y, x); } @@ -235,23 +226,22 @@ void do_cmd_disarm(PlayerType *player_ptr) command_arg = 0; } + int dir; + auto more = false; if (get_rep_dir(player_ptr, &dir, true)) { - Grid *g_ptr; - FEAT_IDX feat; - y = player_ptr->y + ddy[dir]; - x = player_ptr->x + ddx[dir]; - g_ptr = &player_ptr->current_floor_ptr->grid_array[y][x]; - feat = g_ptr->get_feat_mimic(); - o_idx = chest_check(player_ptr->current_floor_ptr, y, x, true); + const Pos2D pos(player_ptr->y + ddy[dir], player_ptr->x + ddx[dir]); + const auto &grid = player_ptr->current_floor_ptr->get_grid(pos); + const auto feat = grid.get_feat_mimic(); + const auto o_idx = chest_check(player_ptr->current_floor_ptr, pos.y, pos.x, true); if (!is_trap(player_ptr, feat) && !o_idx) { msg_print(_("そこには解除するものが見当たらない。", "You see nothing there to disarm.")); - } else if (g_ptr->m_idx && player_ptr->riding != g_ptr->m_idx) { + } else if (grid.m_idx && player_ptr->riding != grid.m_idx) { msg_print(_("モンスターが立ちふさがっている!", "There is a monster in the way!")); - do_cmd_attack(player_ptr, y, x, HISSATSU_NONE); + do_cmd_attack(player_ptr, pos.y, pos.x, HISSATSU_NONE); } else if (o_idx) { - more = exe_disarm_chest(player_ptr, y, x, o_idx); + more = exe_disarm_chest(player_ptr, pos.y, pos.x, o_idx); } else { - more = exe_disarm(player_ptr, y, x, dir); + more = exe_disarm(player_ptr, pos.y, pos.x, dir); } } @@ -279,10 +269,7 @@ void do_cmd_disarm(PlayerType *player_ptr) */ void do_cmd_bash(PlayerType *player_ptr) { - POSITION y, x; - DIRECTION dir; - Grid *g_ptr; - bool more = false; + auto more = false; if (player_ptr->wild_mode) { return; } @@ -295,20 +282,19 @@ void do_cmd_bash(PlayerType *player_ptr) command_arg = 0; } + int dir; if (get_rep_dir(player_ptr, &dir)) { - FEAT_IDX feat; - y = player_ptr->y + ddy[dir]; - x = player_ptr->x + ddx[dir]; - g_ptr = &player_ptr->current_floor_ptr->grid_array[y][x]; - feat = g_ptr->get_feat_mimic(); + const Pos2D pos(player_ptr->y + ddy[dir], player_ptr->x + ddx[dir]); + const Grid &grid = player_ptr->current_floor_ptr->get_grid(pos); + const auto feat = grid.get_feat_mimic(); if (terrains_info[feat].flags.has_not(TerrainCharacteristics::BASH)) { msg_print(_("そこには体当たりするものが見当たらない。", "You see nothing there to bash.")); - } else if (g_ptr->m_idx) { + } else if (grid.m_idx) { PlayerEnergy(player_ptr).set_player_turn_energy(100); msg_print(_("モンスターが立ちふさがっている!", "There is a monster in the way!")); - do_cmd_attack(player_ptr, y, x, HISSATSU_NONE); + do_cmd_attack(player_ptr, pos.y, pos.x, HISSATSU_NONE); } else { - more = exe_bash(player_ptr, y, x, dir); + more = exe_bash(player_ptr, pos.y, pos.x, dir); } } @@ -366,24 +352,22 @@ void do_cmd_spike(PlayerType *player_ptr) return; } - POSITION y = player_ptr->y + ddy[dir]; - POSITION x = player_ptr->x + ddx[dir]; - Grid *g_ptr; - g_ptr = &player_ptr->current_floor_ptr->grid_array[y][x]; - FEAT_IDX feat = g_ptr->get_feat_mimic(); + const Pos2D pos(player_ptr->y + ddy[dir], player_ptr->x + ddx[dir]); + const auto &grid = player_ptr->current_floor_ptr->get_grid(pos); + const auto feat = grid.get_feat_mimic(); INVENTORY_IDX i_idx; if (terrains_info[feat].flags.has_not(TerrainCharacteristics::SPIKE)) { msg_print(_("そこにはくさびを打てるものが見当たらない。", "You see nothing there to spike.")); } else if (!get_spike(player_ptr, &i_idx)) { msg_print(_("くさびを持っていない!", "You have no spikes!")); - } else if (g_ptr->m_idx) { + } else if (grid.m_idx) { PlayerEnergy(player_ptr).set_player_turn_energy(100); msg_print(_("モンスターが立ちふさがっている!", "There is a monster in the way!")); - do_cmd_attack(player_ptr, y, x, HISSATSU_NONE); + do_cmd_attack(player_ptr, pos.y, pos.x, HISSATSU_NONE); } else { PlayerEnergy(player_ptr).set_player_turn_energy(100); msg_format(_("%sにくさびを打ち込んだ。", "You jam the %s with a spike."), terrains_info[feat].name.data()); - cave_alter_feat(player_ptr, y, x, TerrainCharacteristics::SPIKE); + cave_alter_feat(player_ptr, pos.y, pos.x, TerrainCharacteristics::SPIKE); vary_item(player_ptr, i_idx, -1); } } diff --git a/src/cmd-action/cmd-others.cpp b/src/cmd-action/cmd-others.cpp index f9c8d7f11..70bfe289d 100644 --- a/src/cmd-action/cmd-others.cpp +++ b/src/cmd-action/cmd-others.cpp @@ -67,37 +67,34 @@ static bool exe_alter(PlayerType *player_ptr) return false; } - POSITION y = player_ptr->y + ddy[dir]; - POSITION x = player_ptr->x + ddx[dir]; - Grid *g_ptr; - g_ptr = &player_ptr->current_floor_ptr->grid_array[y][x]; - FEAT_IDX feat = g_ptr->get_feat_mimic(); - TerrainType *f_ptr; - f_ptr = &terrains_info[feat]; + const Pos2D pos(player_ptr->y + ddy[dir], player_ptr->x + ddx[dir]); + const auto &grid = player_ptr->current_floor_ptr->get_grid(pos); + auto feat = grid.get_feat_mimic(); + const auto &terrain = terrains_info[feat]; PlayerEnergy(player_ptr).set_player_turn_energy(100); - if (g_ptr->m_idx) { - do_cmd_attack(player_ptr, y, x, HISSATSU_NONE); + if (grid.m_idx) { + do_cmd_attack(player_ptr, pos.y, pos.x, HISSATSU_NONE); return false; } - if (f_ptr->flags.has(TerrainCharacteristics::OPEN)) { - return exe_open(player_ptr, y, x); + if (terrain.flags.has(TerrainCharacteristics::OPEN)) { + return exe_open(player_ptr, pos.y, pos.x); } - if (f_ptr->flags.has(TerrainCharacteristics::BASH)) { - return exe_bash(player_ptr, y, x, dir); + if (terrain.flags.has(TerrainCharacteristics::BASH)) { + return exe_bash(player_ptr, pos.y, pos.x, dir); } - if (f_ptr->flags.has(TerrainCharacteristics::TUNNEL)) { - return exe_tunnel(player_ptr, y, x); + if (terrain.flags.has(TerrainCharacteristics::TUNNEL)) { + return exe_tunnel(player_ptr, pos.y, pos.x); } - if (f_ptr->flags.has(TerrainCharacteristics::CLOSE)) { - return exe_close(player_ptr, y, x); + if (terrain.flags.has(TerrainCharacteristics::CLOSE)) { + return exe_close(player_ptr, pos.y, pos.x); } - if (f_ptr->flags.has(TerrainCharacteristics::DISARM)) { - return exe_disarm(player_ptr, y, x, dir); + if (terrain.flags.has(TerrainCharacteristics::DISARM)) { + return exe_disarm(player_ptr, pos.y, pos.x, dir); } msg_print(_("何もない空中を攻撃した。", "You attack the empty air.")); -- 2.11.0