OSDN Git Service

[Refactor] #40577 Separated vault-builder.c/h from floor.c/h
authorHourier <hourier@users.sourceforge.jp>
Thu, 20 Aug 2020 09:15:53 +0000 (18:15 +0900)
committerHourier <hourier@users.sourceforge.jp>
Thu, 20 Aug 2020 09:15:53 +0000 (18:15 +0900)
Hengband/Hengband/Hengband.vcxproj
Hengband/Hengband/Hengband.vcxproj.filters
src/Makefile.am
src/floor/floor.c
src/floor/floor.h
src/room/rooms-normal.c
src/room/vault-builder.c [new file with mode: 0644]
src/room/vault-builder.h [new file with mode: 0644]

index 7b6cf75..a11b1f7 100644 (file)
     <ClCompile Include="..\..\src\object-activation\activation-resistance.c" />\r
     <ClCompile Include="..\..\src\object-activation\activation-teleport.c" />\r
     <ClCompile Include="..\..\src\object-activation\activation-util.c" />\r
+    <ClCompile Include="..\..\src\room\vault-builder.c" />\r
     <ClCompile Include="..\..\src\specific-object\blade-turner.c" />\r
     <ClCompile Include="..\..\src\specific-object\monster-ball.c" />\r
     <ClCompile Include="..\..\src\object-use\read-execution.c" />\r
     <ClInclude Include="..\..\src\object-activation\activation-resistance.h" />\r
     <ClInclude Include="..\..\src\object-activation\activation-teleport.h" />\r
     <ClInclude Include="..\..\src\object-activation\activation-util.h" />\r
+    <ClInclude Include="..\..\src\room\vault-builder.h" />\r
     <ClInclude Include="..\..\src\specific-object\blade-turner.h" />\r
     <ClInclude Include="..\..\src\specific-object\monster-ball.h" />\r
     <ClInclude Include="..\..\src\object-use\read-execution.h" />\r
index 0dc0c0b..f473b7e 100644 (file)
     <ClCompile Include="..\..\src\floor\line-of-sight.c">
       <Filter>floor</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\src\room\vault-builder.c">
+      <Filter>room</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\..\src\combat\shoot.h">
     <ClInclude Include="..\..\src\floor\line-of-sight.h">
       <Filter>floor</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\src\room\vault-builder.h">
+      <Filter>room</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <None Include="..\..\src\wall.bmp" />
index 9398e92..c4e6f3a 100644 (file)
@@ -671,6 +671,7 @@ hengband_SOURCES = \
        room/space-finder.c room/space-finder.h \
        room/pit-nest-kinds-table.c room/pit-nest-kinds-table.h \
        room/treasure-deployment.c room/treasure-deployment.h \
+       room/vault-builder.c room/vault-builder.h \
        \
        save/floor-writer.c save/floor-writer.h \
        save/info-writer.c save/info-writer.h \
index cfa2add..67bbc8a 100644 (file)
@@ -187,52 +187,6 @@ bool projectable(player_type *player_ptr, POSITION y1, POSITION x1, POSITION y2,
     return TRUE;
 }
 
-/*
- * Grid based version of "creature_bold()"
- */
-static bool player_grid(player_type *player_ptr, grid_type *g_ptr) { return g_ptr == &player_ptr->current_floor_ptr->grid_array[player_ptr->y][player_ptr->x]; }
-
-/*
- * Grid based version of "cave_empty_bold()"
- */
-static bool is_cave_empty_grid(player_type *player_ptr, grid_type *g_ptr)
-{
-    bool is_empty_grid = cave_have_flag_grid(g_ptr, FF_PLACE);
-    is_empty_grid &= g_ptr->m_idx == 0;
-    is_empty_grid &= !player_grid(player_ptr, g_ptr);
-    return is_empty_grid;
-}
-
-/*!
- * @brief 特殊な部屋地形向けにモンスターを配置する / Place some sleeping monsters near the given location
- * @param player_ptr プレーヤーへの参照ポインタ
- * @param y1 モンスターを配置したいマスの中心Y座標
- * @param x1 モンスターを配置したいマスの中心X座標
- * @param num 配置したいモンスターの数
- * @return なし
- * @details
- * Only really called by some of the "vault" routines.
- */
-void vault_monsters(player_type *player_ptr, POSITION y1, POSITION x1, int num)
-{
-    floor_type *floor_ptr = player_ptr->current_floor_ptr;
-    for (int k = 0; k < num; k++) {
-        for (int i = 0; i < 9; i++) {
-            int d = 1;
-            POSITION y, x;
-            scatter(player_ptr, &y, &x, y1, x1, d, 0);
-            grid_type *g_ptr;
-            g_ptr = &player_ptr->current_floor_ptr->grid_array[y][x];
-            if (!is_cave_empty_grid(player_ptr, g_ptr))
-                continue;
-
-            floor_ptr->monster_level = floor_ptr->base_level + 2;
-            (void)place_monster(player_ptr, y, x, (PM_ALLOW_SLEEP | PM_ALLOW_GROUP));
-            floor_ptr->monster_level = floor_ptr->base_level;
-        }
-    }
-}
-
 /*!
  * @brief 指定された座標が地震や階段生成の対象となるマスかを返す。 / Determine if a given location may be "destroyed"
  * @param player_ptr プレーヤーへの参照ポインタ
@@ -537,52 +491,6 @@ FEAT_IDX conv_dungeon_feat(floor_type *floor_ptr, FEAT_IDX newfeat)
 }
 
 /*!
- * @brief 特殊な部屋向けに各種アイテムを配置する / Create up to "num" objects near the given coordinates
- * @param player_ptr プレーヤーへの参照ポインタ
- * @param y 配置したい中心マスのY座標
- * @param x 配置したい中心マスのX座標
- * @param num 配置したい数
- * @return なし
- * @details
- * Only really called by some of the "vault" routines.
- */
-void vault_objects(player_type *player_ptr, POSITION y, POSITION x, int num)
-{
-    floor_type *floor_ptr = player_ptr->current_floor_ptr;
-    for (; num > 0; --num) {
-        int j = y, k = x;
-        int dummy = 0;
-        for (int i = 0; i < 11; ++i) {
-            while (dummy < SAFE_MAX_ATTEMPTS) {
-                j = rand_spread(y, 2);
-                k = rand_spread(x, 3);
-                dummy++;
-                if (!in_bounds(floor_ptr, j, k))
-                    continue;
-                break;
-            }
-
-            if (dummy >= SAFE_MAX_ATTEMPTS && cheat_room) {
-                msg_print(_("警告!地下室のアイテムを配置できません!", "Warning! Could not place vault object!"));
-            }
-
-            grid_type *g_ptr;
-            g_ptr = &floor_ptr->grid_array[j][k];
-            if (!is_floor_grid(g_ptr) || g_ptr->o_idx)
-                continue;
-
-            if (randint0(100) < 75) {
-                place_object(player_ptr, j, k, 0L);
-            } else {
-                place_gold(player_ptr, j, k);
-            }
-
-            break;
-        }
-    }
-}
-
-/*!
  * @brief 指定のマスを床地形に変える / Set a square to be floor.  (Includes range checking.)
  * @param player_ptr プレーヤーへの参照ポインタ
  * @param x 地形を変えたいマスのX座標
@@ -844,65 +752,6 @@ void compact_objects(player_type *player_ptr, int size)
     }
 }
 
-/*!
- * @brief 特殊な部屋向けに各種アイテムを配置する(vault_trapのサブセット) / Place a trap with a given displacement of point
- * @param y トラップを配置したいマスの中心Y座標
- * @param x トラップを配置したいマスの中心X座標
- * @param yd Y方向の配置分散マス数
- * @param xd X方向の配置分散マス数
- * @return なし
- * @details
- * Only really called by some of the "vault" routines.
- */
-static void vault_trap_aux(player_type *player_ptr, POSITION y, POSITION x, POSITION yd, POSITION xd)
-{
-    grid_type *g_ptr;
-    floor_type *floor_ptr = player_ptr->current_floor_ptr;
-    int y1 = y, x1 = x;
-    int dummy = 0;
-    for (int count = 0; count <= 5; count++) {
-        while (dummy < SAFE_MAX_ATTEMPTS) {
-            y1 = rand_spread(y, yd);
-            x1 = rand_spread(x, xd);
-            dummy++;
-            if (!in_bounds(floor_ptr, y1, x1))
-                continue;
-            break;
-        }
-
-        if (dummy >= SAFE_MAX_ATTEMPTS && cheat_room) {
-            msg_print(_("警告!地下室のトラップを配置できません!", "Warning! Could not place vault trap!"));
-        }
-
-        g_ptr = &floor_ptr->grid_array[y1][x1];
-        if (!is_floor_grid(g_ptr) || g_ptr->o_idx || g_ptr->m_idx)
-            continue;
-
-        place_trap(player_ptr, y1, x1);
-        break;
-    }
-}
-
-/*!
- * todo rooms-normal からしか呼ばれていない、要調整
- * @brief 特殊な部屋向けに各種アイテムを配置する(メインルーチン) / Place some traps with a given displacement of given location
- * @param player_ptr プレーヤーへの参照ポインタ
- * @param y トラップを配置したいマスの中心Y座標
- * @param x トラップを配置したいマスの中心X座標
- * @param yd Y方向の配置分散マス数
- * @param xd X方向の配置分散マス数
- * @param num 配置したいトラップの数
- * @return なし
- * @details
- * Only really called by some of the "vault" routines.
- */
-void vault_traps(player_type *player_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);
-    }
-}
-
 /*
  * Standard "find me a location" function
  *
index 8aaf38c..030f941 100644 (file)
@@ -21,7 +21,6 @@ void forget_flow(floor_type *floor_ptr);
 void place_random_stairs(player_type *player_ptr, POSITION y, POSITION x);
 int get_max_range(player_type *creature_ptr);
 bool projectable(player_type *player_ptr, POSITION y1, POSITION x1, POSITION y2, POSITION x2);
-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);
 void cave_set_feat(player_type *player_ptr, POSITION y, POSITION x, FEAT_IDX feat);
 void place_random_door(player_type *player_ptr, POSITION y, POSITION x, bool room);
@@ -29,11 +28,9 @@ void place_closed_door(player_type *player_ptr, POSITION y, POSITION x, int type
 void wipe_o_list(floor_type *floor_ptr);
 bool get_is_floor(floor_type *floor_ptr, POSITION x, POSITION y);
 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);
 void set_floor(player_type *player_ptr, POSITION x, POSITION y);
 void place_object(player_type *owner_ptr, POSITION y, POSITION x, BIT_FLAGS mode);
 void place_gold(player_type *player_ptr, POSITION y, POSITION x);
 void delete_monster(player_type *player_ptr, POSITION y, POSITION x);
 void compact_objects(player_type *owner_ptr, int size);
-void vault_traps(player_type *player_ptr, POSITION y, POSITION x, POSITION yd, POSITION xd, int num);
 void scatter(player_type *player_ptr, POSITION *yp, POSITION *xp, POSITION y, POSITION x, POSITION d, BIT_FLAGS mode);
index 6c7362c..c977533 100644 (file)
@@ -8,6 +8,7 @@
 #include "room/door-definition.h"
 #include "room/rooms-builder.h"
 #include "room/space-finder.h"
+#include "room/vault-builder.h"
 #include "system/floor-type-definition.h"
 
 /*!
diff --git a/src/room/vault-builder.c b/src/room/vault-builder.c
new file mode 100644 (file)
index 0000000..e1aa8f2
--- /dev/null
@@ -0,0 +1,162 @@
+#include "room/vault-builder.h"
+#include "floor/cave.h"
+#include "floor/floor-generator-util.h"
+#include "floor/floor.h"
+#include "game-option/cheat-options.h"
+#include "grid/feature-flag-types.h"
+#include "grid/grid.h"
+#include "grid/trap.h"
+#include "monster-floor/monster-generator.h"
+#include "monster-floor/place-monster-types.h"
+#include "system/floor-type-definition.h"
+#include "view/display-messages.h"
+
+/*
+ * Grid based version of "creature_bold()"
+ */
+static bool player_grid(player_type *player_ptr, grid_type *g_ptr) { return g_ptr == &player_ptr->current_floor_ptr->grid_array[player_ptr->y][player_ptr->x]; }
+
+/*
+ * Grid based version of "cave_empty_bold()"
+ */
+static bool is_cave_empty_grid(player_type *player_ptr, grid_type *g_ptr)
+{
+    bool is_empty_grid = cave_have_flag_grid(g_ptr, FF_PLACE);
+    is_empty_grid &= g_ptr->m_idx == 0;
+    is_empty_grid &= !player_grid(player_ptr, g_ptr);
+    return is_empty_grid;
+}
+
+/*!
+ * @brief \93Á\8eê\82È\95\94\89®\92n\8c`\8cü\82¯\82É\83\82\83\93\83X\83^\81[\82ð\94z\92u\82·\82é / Place some sleeping monsters near the given location
+ * @param player_ptr \83v\83\8c\81[\83\84\81[\82Ö\82Ì\8eQ\8fÆ\83|\83C\83\93\83^
+ * @param y1 \83\82\83\93\83X\83^\81[\82ð\94z\92u\82µ\82½\82¢\83}\83X\82Ì\92\86\90SY\8dÀ\95W
+ * @param x1 \83\82\83\93\83X\83^\81[\82ð\94z\92u\82µ\82½\82¢\83}\83X\82Ì\92\86\90SX\8dÀ\95W
+ * @param num \94z\92u\82µ\82½\82¢\83\82\83\93\83X\83^\81[\82Ì\90\94
+ * @return \82È\82µ
+ * @details
+ * Only really called by some of the "vault" routines.
+ */
+void vault_monsters(player_type *player_ptr, POSITION y1, POSITION x1, int num)
+{
+    floor_type *floor_ptr = player_ptr->current_floor_ptr;
+    for (int k = 0; k < num; k++) {
+        for (int i = 0; i < 9; i++) {
+            int d = 1;
+            POSITION y, x;
+            scatter(player_ptr, &y, &x, y1, x1, d, 0);
+            grid_type *g_ptr;
+            g_ptr = &player_ptr->current_floor_ptr->grid_array[y][x];
+            if (!is_cave_empty_grid(player_ptr, g_ptr))
+                continue;
+
+            floor_ptr->monster_level = floor_ptr->base_level + 2;
+            (void)place_monster(player_ptr, y, x, PM_ALLOW_SLEEP | PM_ALLOW_GROUP);
+            floor_ptr->monster_level = floor_ptr->base_level;
+        }
+    }
+}
+
+/*!
+ * @brief \93Á\8eê\82È\95\94\89®\8cü\82¯\82É\8ae\8eí\83A\83C\83e\83\80\82ð\94z\92u\82·\82é / Create up to "num" objects near the given coordinates
+ * @param player_ptr \83v\83\8c\81[\83\84\81[\82Ö\82Ì\8eQ\8fÆ\83|\83C\83\93\83^
+ * @param y \94z\92u\82µ\82½\82¢\92\86\90S\83}\83X\82ÌY\8dÀ\95W
+ * @param x \94z\92u\82µ\82½\82¢\92\86\90S\83}\83X\82ÌX\8dÀ\95W
+ * @param num \94z\92u\82µ\82½\82¢\90\94
+ * @return \82È\82µ
+ * @details
+ * Only really called by some of the "vault" routines.
+ */
+void vault_objects(player_type *player_ptr, POSITION y, POSITION x, int num)
+{
+    floor_type *floor_ptr = player_ptr->current_floor_ptr;
+    for (; num > 0; --num) {
+        int j = y, k = x;
+        int dummy = 0;
+        for (int i = 0; i < 11; ++i) {
+            while (dummy < SAFE_MAX_ATTEMPTS) {
+                j = rand_spread(y, 2);
+                k = rand_spread(x, 3);
+                dummy++;
+                if (!in_bounds(floor_ptr, j, k))
+                    continue;
+                break;
+            }
+
+            if (dummy >= SAFE_MAX_ATTEMPTS && cheat_room) {
+                msg_print(_("\8cx\8d\90\81I\92n\89º\8eº\82Ì\83A\83C\83e\83\80\82ð\94z\92u\82Å\82«\82Ü\82¹\82ñ\81I", "Warning! Could not place vault object!"));
+            }
+
+            grid_type *g_ptr;
+            g_ptr = &floor_ptr->grid_array[j][k];
+            if (!is_floor_grid(g_ptr) || g_ptr->o_idx)
+                continue;
+
+            if (randint0(100) < 75) {
+                place_object(player_ptr, j, k, 0L);
+            } else {
+                place_gold(player_ptr, j, k);
+            }
+
+            break;
+        }
+    }
+}
+
+/*!
+ * @brief \93Á\8eê\82È\95\94\89®\8cü\82¯\82É\8ae\8eí\83A\83C\83e\83\80\82ð\94z\92u\82·\82é(vault_trap\82Ì\83T\83u\83Z\83b\83g) / Place a trap with a given displacement of point
+ * @param y \83g\83\89\83b\83v\82ð\94z\92u\82µ\82½\82¢\83}\83X\82Ì\92\86\90SY\8dÀ\95W
+ * @param x \83g\83\89\83b\83v\82ð\94z\92u\82µ\82½\82¢\83}\83X\82Ì\92\86\90SX\8dÀ\95W
+ * @param yd Y\95û\8cü\82Ì\94z\92u\95ª\8eU\83}\83X\90\94
+ * @param xd X\95û\8cü\82Ì\94z\92u\95ª\8eU\83}\83X\90\94
+ * @return \82È\82µ
+ * @details
+ * Only really called by some of the "vault" routines.
+ */
+static void vault_trap_aux(player_type *player_ptr, POSITION y, POSITION x, POSITION yd, POSITION xd)
+{
+    grid_type *g_ptr;
+    floor_type *floor_ptr = player_ptr->current_floor_ptr;
+    int y1 = y, x1 = x;
+    int dummy = 0;
+    for (int count = 0; count <= 5; count++) {
+        while (dummy < SAFE_MAX_ATTEMPTS) {
+            y1 = rand_spread(y, yd);
+            x1 = rand_spread(x, xd);
+            dummy++;
+            if (!in_bounds(floor_ptr, y1, x1))
+                continue;
+            break;
+        }
+
+        if (dummy >= SAFE_MAX_ATTEMPTS && cheat_room) {
+            msg_print(_("\8cx\8d\90\81I\92n\89º\8eº\82Ì\83g\83\89\83b\83v\82ð\94z\92u\82Å\82«\82Ü\82¹\82ñ\81I", "Warning! Could not place vault trap!"));
+        }
+
+        g_ptr = &floor_ptr->grid_array[y1][x1];
+        if (!is_floor_grid(g_ptr) || g_ptr->o_idx || g_ptr->m_idx)
+            continue;
+
+        place_trap(player_ptr, y1, x1);
+        break;
+    }
+}
+
+/*!
+ * todo rooms-normal \82©\82ç\82µ\82©\8cÄ\82Î\82ê\82Ä\82¢\82È\82¢\81A\97v\92²\90®
+ * @brief \93Á\8eê\82È\95\94\89®\8cü\82¯\82É\8ae\8eí\83A\83C\83e\83\80\82ð\94z\92u\82·\82é(\83\81\83C\83\93\83\8b\81[\83`\83\93) / Place some traps with a given displacement of given location
+ * @param player_ptr \83v\83\8c\81[\83\84\81[\82Ö\82Ì\8eQ\8fÆ\83|\83C\83\93\83^
+ * @param y \83g\83\89\83b\83v\82ð\94z\92u\82µ\82½\82¢\83}\83X\82Ì\92\86\90SY\8dÀ\95W
+ * @param x \83g\83\89\83b\83v\82ð\94z\92u\82µ\82½\82¢\83}\83X\82Ì\92\86\90SX\8dÀ\95W
+ * @param yd Y\95û\8cü\82Ì\94z\92u\95ª\8eU\83}\83X\90\94
+ * @param xd X\95û\8cü\82Ì\94z\92u\95ª\8eU\83}\83X\90\94
+ * @param num \94z\92u\82µ\82½\82¢\83g\83\89\83b\83v\82Ì\90\94
+ * @return \82È\82µ
+ * @details
+ * Only really called by some of the "vault" routines.
+ */
+void vault_traps(player_type *player_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);
+}
diff --git a/src/room/vault-builder.h b/src/room/vault-builder.h
new file mode 100644 (file)
index 0000000..b489c33
--- /dev/null
@@ -0,0 +1,7 @@
+#pragma once
+
+#include "system/angband.h"
+
+void vault_monsters(player_type *player_ptr, POSITION y1, POSITION x1, int num);
+void vault_objects(player_type *player_ptr, POSITION y, POSITION x, int num);
+void vault_traps(player_type *player_ptr, POSITION y, POSITION x, POSITION yd, POSITION xd, int num);