From 49b9a5113820016928bd9c7845ab19f9ac3cdf2c Mon Sep 17 00:00:00 2001 From: Hourier <66951241+Hourier@users.noreply.github.com> Date: Mon, 4 Nov 2024 20:17:46 +0900 Subject: [PATCH] =?UTF-8?q?[Refactor]=20#4604=20FloorType::check=5Fterrain?= =?UTF-8?q?()=20=E3=82=92=E5=AE=9F=E8=A3=85=E3=81=97=E3=81=A6count=5Fdt()?= =?UTF-8?q?=20=E3=82=92=E8=BB=BD=E9=87=8F=E5=8C=96=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ダンジョン dungeon_type とグリッド Grid の両方に依存できる適切なクラスはここ --- src/grid/grid.cpp | 24 ++---------------------- src/system/dungeon-info.cpp | 3 +-- src/system/floor-type-definition.cpp | 21 +++++++++++++++++++++ src/system/floor-type-definition.h | 3 ++- 4 files changed, 26 insertions(+), 25 deletions(-) diff --git a/src/grid/grid.cpp b/src/grid/grid.cpp index 40039b323a..39ba78bb4b 100644 --- a/src/grid/grid.cpp +++ b/src/grid/grid.cpp @@ -1054,7 +1054,6 @@ std::pair count_dt(PlayerType *player_ptr, GridCountKind gck, bool u auto count = 0; Pos2D pos(0, 0); const auto &floor = *player_ptr->current_floor_ptr; - const auto &dungeon = floor.get_dungeon_definition(); for (auto d = 0; d < 9; d++) { if ((d == 8) && !under) { continue; @@ -1066,27 +1065,8 @@ std::pair count_dt(PlayerType *player_ptr, GridCountKind gck, bool u continue; } - switch (gck) { - case GridCountKind::OPEN: - if (!dungeon.is_open(grid.get_feat_mimic())) { - continue; - } - - break; - case GridCountKind::CLOSED_DOOR: - if (!grid.get_terrain_mimic().is_closed_door()) { - continue; - } - - break; - case GridCountKind::TRAP: - if (!grid.get_terrain_mimic().is_trap()) { - continue; - } - - break; - default: - THROW_EXCEPTION(std::logic_error, format("Invalid GridCountKind is Specified! %d", enum2i(gck))); + if (!floor.check_terrain_state(pos_neighbor, gck)) { + continue; } ++count; diff --git a/src/system/dungeon-info.cpp b/src/system/dungeon-info.cpp index 3f735538ad..a1ed6e0447 100644 --- a/src/system/dungeon-info.cpp +++ b/src/system/dungeon-info.cpp @@ -113,6 +113,5 @@ short dungeon_type::convert_terrain_id(short terrain_id) const */ bool dungeon_type::is_open(short terrain_id) const { - const auto is_open = TerrainList::get_instance().get_terrain(terrain_id).is_open(); - return is_open && (terrain_id != this->convert_terrain_id(terrain_id, TerrainCharacteristics::CLOSE)); + return terrain_id != this->convert_terrain_id(terrain_id, TerrainCharacteristics::CLOSE); } diff --git a/src/system/floor-type-definition.cpp b/src/system/floor-type-definition.cpp index 1442ad555a..1a0d505200 100644 --- a/src/system/floor-type-definition.cpp +++ b/src/system/floor-type-definition.cpp @@ -5,9 +5,12 @@ #include "system/angband-system.h" #include "system/artifact-type-definition.h" #include "system/dungeon-info.h" +#include "system/enums/grid-count-kind.h" +#include "system/gamevalue.h" #include "system/grid-type-definition.h" #include "system/item-entity.h" #include "system/monster-entity.h" +#include "system/terrain-type-definition.h" #include "util/bit-flags-calculator.h" #include "util/enum-range.h" @@ -152,6 +155,24 @@ bool FloorType::can_teleport_level(bool to_player) const return this->is_special() || is_invalid_floor; } +bool FloorType::check_terrain_state(const Pos2D &pos, GridCountKind gck) const +{ + const auto &grid = this->get_grid(pos); + switch (gck) { + case GridCountKind::OPEN: { + const auto is_open_grid = grid.get_terrain_mimic().is_open(); + const auto is_open_dungeon = this->get_dungeon_definition().is_open(grid.get_feat_mimic()); + return is_open_grid && is_open_dungeon; + } + case GridCountKind::CLOSED_DOOR: + return grid.get_terrain_mimic().is_closed_door(); + case GridCountKind::TRAP: + return grid.get_terrain_mimic().is_trap(); + default: + THROW_EXCEPTION(std::logic_error, format("Invalid GridCountKind is Specified! %d", enum2i(gck))); + } +} + /*! * @brief 魔法の笛でペットを呼び寄せる順番を決める * @param index1 フロア内のモンスターインデックス1 diff --git a/src/system/floor-type-definition.h b/src/system/floor-type-definition.h index 17db15ea4e..ea00f248ed 100644 --- a/src/system/floor-type-definition.h +++ b/src/system/floor-type-definition.h @@ -37,6 +37,7 @@ constexpr auto VIEW_MAX = 1536; */ constexpr auto REDRAW_MAX = 2298; +enum class GridCountKind; enum class MonsterTimedEffect : int; enum class QuestId : short; struct dungeon_type; @@ -112,7 +113,7 @@ class FloorType { bool has_los(const Pos2D pos) const; bool is_special() const; bool can_teleport_level(bool to_player = false) const; - + bool check_terrain_state(const Pos2D &pos, GridCountKind gck) const; bool order_pet_whistle(short index1, short index2) const; bool order_pet_dismission(short index1, short index2, short riding_index) const;