OSDN Git Service

[Refactor] #3333 choose_random_trap() の引数をPlayerType からFloorType に差し替えた
authorHourier <66951241+Hourier@users.noreply.github.com>
Sat, 30 Sep 2023 10:49:55 +0000 (19:49 +0900)
committerHourier <66951241+Hourier@users.noreply.github.com>
Mon, 16 Oct 2023 13:01:59 +0000 (22:01 +0900)
src/effect/effect-feature.cpp
src/floor/fixed-map-generator.cpp
src/floor/object-allocator.cpp
src/grid/trap.cpp
src/grid/trap.h
src/load/old/load-v1-5-0.cpp
src/room/rooms-normal.cpp
src/room/rooms-vault.cpp
src/room/treasure-deployment.cpp
src/room/vault-builder.cpp
src/room/vault-builder.h

index e9ded01..6945a40 100644 (file)
@@ -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: {
index 6d5cb8e..0bb22bc 100644 (file)
@@ -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);
index eb9f3ed..f624c11 100644 (file)
@@ -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:
index ae45ef6..e4c9de7 100644 (file)
@@ -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);
 }
 
 /*!
index fda68eb..e300c3f 100644 (file)
@@ -55,9 +55,10 @@ enum class TrapType {
 
 extern const std::vector<EnumClassFlagGroup<ChestTrapType>> 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);
index 76810fe..d54f502 100644 (file)
@@ -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;
index 42a8bb7..db3bc95 100644 (file)
@@ -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;
index df41ec2..4ba3282 100644 (file)
@@ -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 */
index f2adcb2..8bbeb54 100644 (file)
@@ -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);
                 }
index d946d20..d95018d 100644 (file)
@@ -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);
     }
 }
index 8ccc3af..c08de47 100644 (file)
@@ -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);