From 8253b26370967417b2d3dd6e9b03d1efc54f4694 Mon Sep 17 00:00:00 2001 From: Hourier <66951241+Hourier@users.noreply.github.com> Date: Sat, 30 Sep 2023 19:49:55 +0900 Subject: [PATCH 1/1] =?utf8?q?[Refactor]=20#3333=20choose=5Frandom=5Ftrap(?= =?utf8?q?)=20=E3=81=AE=E5=BC=95=E6=95=B0=E3=82=92PlayerType=20=E3=81=8B?= =?utf8?q?=E3=82=89FloorType=20=E3=81=AB=E5=B7=AE=E3=81=97=E6=9B=BF?= =?utf8?q?=E3=81=88=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- src/effect/effect-feature.cpp | 2 +- src/floor/fixed-map-generator.cpp | 4 ++-- src/floor/object-allocator.cpp | 2 +- src/grid/trap.cpp | 41 +++++++++++++-------------------------- src/grid/trap.h | 5 +++-- src/load/old/load-v1-5-0.cpp | 2 +- src/room/rooms-normal.cpp | 10 +++++----- src/room/rooms-vault.cpp | 4 ++-- src/room/treasure-deployment.cpp | 8 ++++---- src/room/vault-builder.cpp | 9 ++++----- src/room/vault-builder.h | 3 ++- 11 files changed, 38 insertions(+), 52 deletions(-) diff --git a/src/effect/effect-feature.cpp b/src/effect/effect-feature.cpp index e9ded014f..6945a4086 100644 --- a/src/effect/effect-feature.cpp +++ b/src/effect/effect-feature.cpp @@ -272,7 +272,7 @@ bool affect_feature(PlayerType *player_ptr, MONSTER_IDX who, POSITION r, POSITIO break; } case AttributeType::MAKE_TRAP: { - place_trap(player_ptr, y, x); + place_trap(floor_ptr, y, x); break; } case AttributeType::MAKE_TREE: { diff --git a/src/floor/fixed-map-generator.cpp b/src/floor/fixed-map-generator.cpp index 6d5cb8e11..0bb22bcd9 100644 --- a/src/floor/fixed-map-generator.cpp +++ b/src/floor/fixed-map-generator.cpp @@ -160,7 +160,7 @@ static void parse_qtw_D(PlayerType *player_ptr, qtwg_type *qtwg_ptr, char *s) if (randint0(100) < 75) { place_object(player_ptr, *qtwg_ptr->y, *qtwg_ptr->x, 0L); } else { - place_trap(player_ptr, *qtwg_ptr->y, *qtwg_ptr->x); + place_trap(floor_ptr, *qtwg_ptr->y, *qtwg_ptr->x); } floor_ptr->object_level = floor_ptr->base_level; @@ -176,7 +176,7 @@ static void parse_qtw_D(PlayerType *player_ptr, qtwg_type *qtwg_ptr, char *s) floor_ptr->object_level = floor_ptr->base_level; } else if (random & RANDOM_TRAP) { - place_trap(player_ptr, *qtwg_ptr->y, *qtwg_ptr->x); + place_trap(floor_ptr, *qtwg_ptr->y, *qtwg_ptr->x); } else if (letter[idx].trap) { g_ptr->mimic = g_ptr->feat; g_ptr->feat = conv_dungeon_feat(floor_ptr, letter[idx].trap); diff --git a/src/floor/object-allocator.cpp b/src/floor/object-allocator.cpp index eb9f3ed47..f624c1164 100644 --- a/src/floor/object-allocator.cpp +++ b/src/floor/object-allocator.cpp @@ -222,7 +222,7 @@ void alloc_object(PlayerType *player_ptr, dap_type set, dungeon_allocation_type floor_ptr->grid_array[y][x].info &= ~(CAVE_FLOOR); break; case ALLOC_TYP_TRAP: - place_trap(player_ptr, y, x); + place_trap(floor_ptr, y, x); floor_ptr->grid_array[y][x].info &= ~(CAVE_FLOOR); break; case ALLOC_TYP_GOLD: diff --git a/src/grid/trap.cpp b/src/grid/trap.cpp index ae45ef63e..e4c9de733 100644 --- a/src/grid/trap.cpp +++ b/src/grid/trap.cpp @@ -153,45 +153,31 @@ void init_normal_traps(void) } /*! - * @brief 基本トラップをランダムに選択する / - * Get random trap + * @brief 基本トラップをランダムに選択する + * @param floor_ptr 現在フロアへの参照ポインタ * @return 選択したトラップのID - * @details - * This routine should be redone to reflect trap "level".\n - * That is, it does not make sense to have spiked pits at 50 feet.\n - * Actually, it is not this routine, but the "trap instantiation"\n - * code, which should also check for "trap doors" on quest levels.\n - * @todo 引数はFloorType に差し替え可能 + * @details トラップドアでないならばそのID. + * トラップドアは、アリーナ・クエスト・ダンジョンの最下層には設置しない. */ -FEAT_IDX choose_random_trap(PlayerType *player_ptr) +short choose_random_trap(FloorType *floor_ptr) { - FEAT_IDX feat; - - /* Pick a trap */ const auto &terrains = TerrainList::get_instance(); - const auto &floor = *player_ptr->current_floor_ptr; while (true) { - feat = rand_choice(normal_traps); - - /* Accept non-trapdoors */ - if (terrains[feat].flags.has_not(TerrainCharacteristics::MORE)) { - break; + const auto terrain_id = rand_choice(normal_traps); + if (terrains[terrain_id].flags.has_not(TerrainCharacteristics::MORE)) { + return terrain_id; } - /* Hack -- no trap doors on special levels */ - if (floor.inside_arena || inside_quest(floor.get_quest_id())) { + if (floor_ptr->inside_arena || inside_quest(floor_ptr->get_quest_id())) { continue; } - /* Hack -- no trap doors on the deepest level */ - if (floor.dun_level >= floor.get_dungeon_definition().maxdepth) { + if (floor_ptr->dun_level >= floor_ptr->get_dungeon_definition().maxdepth) { continue; } - break; + return terrain_id; } - - return feat; } /*! @@ -227,9 +213,8 @@ void disclose_grid(PlayerType *player_ptr, POSITION y, POSITION x) * when they are "discovered" (by detecting them or setting them off),\n * the trap is "instantiated" as a visible, "typed", trap.\n */ -void place_trap(PlayerType *player_ptr, POSITION y, POSITION x) +void place_trap(FloorType *floor_ptr, POSITION y, POSITION x) { - auto *floor_ptr = player_ptr->current_floor_ptr; auto *g_ptr = &floor_ptr->grid_array[y][x]; /* Paranoia -- verify location */ @@ -244,7 +229,7 @@ void place_trap(PlayerType *player_ptr, POSITION y, POSITION x) /* Place an invisible trap */ g_ptr->mimic = g_ptr->feat; - g_ptr->feat = choose_random_trap(player_ptr); + g_ptr->feat = choose_random_trap(floor_ptr); } /*! diff --git a/src/grid/trap.h b/src/grid/trap.h index fda68eb8a..e300c3f4c 100644 --- a/src/grid/trap.h +++ b/src/grid/trap.h @@ -55,9 +55,10 @@ enum class TrapType { extern const std::vector> chest_traps; +class FloorType; class PlayerType; void init_normal_traps(void); -FEAT_IDX choose_random_trap(PlayerType *player_ptr); +short choose_random_trap(FloorType *floor_ptr); void disclose_grid(PlayerType *player_ptr, POSITION y, POSITION x); -void place_trap(PlayerType *player_ptr, POSITION y, POSITION x); +void place_trap(FloorType *floor_ptr, POSITION y, POSITION x); void hit_trap(PlayerType *player_ptr, bool break_trap); diff --git a/src/load/old/load-v1-5-0.cpp b/src/load/old/load-v1-5-0.cpp index 76810fe72..d54f502cb 100644 --- a/src/load/old/load-v1-5-0.cpp +++ b/src/load/old/load-v1-5-0.cpp @@ -695,7 +695,7 @@ errr rd_dungeon_old(PlayerType *player_ptr) } else if (g_ptr->info & CAVE_TRAP) { g_ptr->info &= ~CAVE_TRAP; g_ptr->mimic = g_ptr->feat; - g_ptr->feat = choose_random_trap(player_ptr); + g_ptr->feat = choose_random_trap(floor_ptr); } else if (g_ptr->feat == OLD_FEAT_INVIS) { g_ptr->mimic = feat_floor; g_ptr->feat = feat_trap_open; diff --git a/src/room/rooms-normal.cpp b/src/room/rooms-normal.cpp index 42a8bb760..db3bc9554 100644 --- a/src/room/rooms-normal.cpp +++ b/src/room/rooms-normal.cpp @@ -471,7 +471,7 @@ bool build_type3(PlayerType *player_ptr, dun_data_type *dd_ptr) vault_monsters(player_ptr, yval, xval, randint0(2) + 3); /* Traps naturally */ - vault_traps(player_ptr, yval, xval, 4, 4, randint0(3) + 2); + vault_traps(floor_ptr, yval, xval, 4, 4, randint0(3) + 2); break; } @@ -707,7 +707,7 @@ bool build_type4(PlayerType *player_ptr, dun_data_type *dd_ptr) } /* Traps to protect the treasure */ - vault_traps(player_ptr, yval, xval, 4, 10, 2 + randint1(3)); + vault_traps(floor_ptr, yval, xval, 4, 10, 2 + randint1(3)); break; } @@ -826,8 +826,8 @@ bool build_type4(PlayerType *player_ptr, dun_data_type *dd_ptr) vault_monsters(player_ptr, yval, xval + 5, randint1(3)); /* Traps make them entertaining. */ - vault_traps(player_ptr, yval, xval - 3, 2, 8, randint1(3)); - vault_traps(player_ptr, yval, xval + 3, 2, 8, randint1(3)); + vault_traps(floor_ptr, yval, xval - 3, 2, 8, randint1(3)); + vault_traps(floor_ptr, yval, xval + 3, 2, 8, randint1(3)); /* Mazes should have some treasure too. */ vault_objects(player_ptr, yval, xval, 3); @@ -1010,7 +1010,7 @@ bool build_type12(PlayerType *player_ptr, dun_data_type *dd_ptr) vault_monsters(player_ptr, y0, x0, randint0(2) + 3); /* Traps naturally */ - vault_traps(player_ptr, y0, x0, 4, 4, randint0(3) + 2); + vault_traps(floor_ptr, y0, x0, 4, 4, randint0(3) + 2); } return true; diff --git a/src/room/rooms-vault.cpp b/src/room/rooms-vault.cpp index df41ec2dd..4ba3282c5 100644 --- a/src/room/rooms-vault.cpp +++ b/src/room/rooms-vault.cpp @@ -391,7 +391,7 @@ static void build_vault( if (randint0(100) < 75) { place_object(player_ptr, y, x, 0L); } else { - place_trap(player_ptr, y, x); + place_trap(floor_ptr, y, x); } break; @@ -425,7 +425,7 @@ static void build_vault( /* Trap */ case '^': - place_trap(player_ptr, y, x); + place_trap(floor_ptr, y, x); break; /* Black market in a dungeon */ diff --git a/src/room/treasure-deployment.cpp b/src/room/treasure-deployment.cpp index f2adcb203..8bbeb548b 100644 --- a/src/room/treasure-deployment.cpp +++ b/src/room/treasure-deployment.cpp @@ -60,13 +60,13 @@ void fill_treasure(PlayerType *player_ptr, POSITION x1, POSITION x2, POSITION y1 if (randint0(100) < 25) { place_object(player_ptr, y, x, 0L); } else { - place_trap(player_ptr, y, x); + place_trap(floor_ptr, y, x); } } else if (value < 30) { floor_ptr->monster_level = floor_ptr->base_level + 5; place_random_monster(player_ptr, y, x, PM_ALLOW_SLEEP | PM_ALLOW_GROUP); floor_ptr->monster_level = floor_ptr->base_level; - place_trap(player_ptr, y, x); + place_trap(floor_ptr, y, x); } else if (value < 40) { if (randint0(100) < 50) { floor_ptr->monster_level = floor_ptr->base_level + 3; @@ -80,12 +80,12 @@ void fill_treasure(PlayerType *player_ptr, POSITION x1, POSITION x2, POSITION y1 floor_ptr->object_level = floor_ptr->base_level; } } else if (value < 50) { - place_trap(player_ptr, y, x); + place_trap(floor_ptr, y, x); } else { if (randint0(100) < 20) { place_random_monster(player_ptr, y, x, PM_ALLOW_SLEEP | PM_ALLOW_GROUP); } else if (randint0(100) < 50) { - place_trap(player_ptr, y, x); + place_trap(floor_ptr, y, x); } else if (randint0(100) < 50) { place_object(player_ptr, y, x, 0L); } diff --git a/src/room/vault-builder.cpp b/src/room/vault-builder.cpp index d946d209c..d95018d2b 100644 --- a/src/room/vault-builder.cpp +++ b/src/room/vault-builder.cpp @@ -118,10 +118,9 @@ void vault_objects(PlayerType *player_ptr, POSITION y, POSITION x, int num) * @details * Only really called by some of the "vault" routines. */ -static void vault_trap_aux(PlayerType *player_ptr, POSITION y, POSITION x, POSITION yd, POSITION xd) +static void vault_trap_aux(FloorType *floor_ptr, POSITION y, POSITION x, POSITION yd, POSITION xd) { grid_type *g_ptr; - auto *floor_ptr = player_ptr->current_floor_ptr; int y1 = y, x1 = x; int dummy = 0; for (int count = 0; count <= 5; count++) { @@ -144,7 +143,7 @@ static void vault_trap_aux(PlayerType *player_ptr, POSITION y, POSITION x, POSIT continue; } - place_trap(player_ptr, y1, x1); + place_trap(floor_ptr, y1, x1); break; } } @@ -161,9 +160,9 @@ static void vault_trap_aux(PlayerType *player_ptr, POSITION y, POSITION x, POSIT * Only really called by some of the "vault" routines. * @todo rooms-normal からしか呼ばれていない、要調整 */ -void vault_traps(PlayerType *player_ptr, POSITION y, POSITION x, POSITION yd, POSITION xd, int num) +void vault_traps(FloorType *floor_ptr, POSITION y, POSITION x, POSITION yd, POSITION xd, int num) { for (int i = 0; i < num; i++) { - vault_trap_aux(player_ptr, y, x, yd, xd); + vault_trap_aux(floor_ptr, y, x, yd, xd); } } diff --git a/src/room/vault-builder.h b/src/room/vault-builder.h index 8ccc3afd4..c08de477b 100644 --- a/src/room/vault-builder.h +++ b/src/room/vault-builder.h @@ -2,7 +2,8 @@ #include "system/angband.h" +class FloorType; class PlayerType; void vault_monsters(PlayerType *player_ptr, POSITION y1, POSITION x1, int num); void vault_objects(PlayerType *player_ptr, POSITION y, POSITION x, int num); -void vault_traps(PlayerType *player_ptr, POSITION y, POSITION x, POSITION yd, POSITION xd, int num); +void vault_traps(FloorType *floor_ptr, POSITION y, POSITION x, POSITION yd, POSITION xd, int num); -- 2.11.0