Separate generation vault rooms from rooms.c to rooms-vault.c/h.
<ClCompile Include="..\..\src\readdib.c" />\r
<ClCompile Include="..\..\src\report.c" />\r
<ClCompile Include="..\..\src\rooms-normal.c" />\r
- <ClCompile Include="..\..\src\rooms-pitnest.cpp" />\r
+ <ClCompile Include="..\..\src\rooms-pitnest.c" />\r
+ <ClCompile Include="..\..\src\rooms-vault.c" />\r
<ClCompile Include="..\..\src\rooms.c" />\r
<ClCompile Include="..\..\src\save.c" />\r
<ClCompile Include="..\..\src\scores.c" />\r
<ClInclude Include="..\..\src\readdib.h" />\r
<ClInclude Include="..\..\src\rooms-normal.h" />\r
<ClInclude Include="..\..\src\rooms-pitnest.h" />\r
+ <ClInclude Include="..\..\src\rooms-vault.h" />\r
<ClInclude Include="..\..\src\rooms.h" />\r
<ClInclude Include="..\..\src\selfinfo.h" />\r
<ClInclude Include="..\..\src\spells-summon.h" />\r
<ClCompile Include="..\..\src\rooms-normal.c">\r
<Filter>Source</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\src\rooms-pitnest.cpp">\r
+ <ClCompile Include="..\..\src\rooms-pitnest.c">\r
+ <Filter>Source</Filter>\r
+ </ClCompile>\r
+ <ClCompile Include="..\..\src\rooms-vault.c">\r
<Filter>Source</Filter>\r
</ClCompile>\r
</ItemGroup>\r
<ClInclude Include="..\..\src\rooms-pitnest.h">\r
<Filter>Header</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\src\rooms-vault.h">\r
+ <Filter>Header</Filter>\r
+ </ClInclude>\r
</ItemGroup>\r
<ItemGroup>\r
<ResourceCompile Include="..\..\src\angband.rc" />\r
#include "angband.h"\r
#include "grid.h"\r
+#include "generate.h"\r
#include "rooms.h"\r
#include "rooms-pitnest.h"\r
\r
--- /dev/null
+#include "angband.h"\r
+#include "grid.h"\r
+#include "rooms.h"\r
+#include "generate.h"\r
+\r
+\r
+\r
+/*!\r
+* @brief Vault\92n\8c`\82ð\89ñ\93]\81A\8fã\89º\8d¶\89E\94½\93]\82·\82é\82½\82ß\82Ì\8dÀ\95W\95Ï\8a·\82ð\95Ô\82· / coordinate translation code\r
+* @param x \95Ï\8a·\82µ\82½\82¢\93_\82ÌX\8dÀ\95W\8eQ\8fÆ\83|\83C\83\93\83^\r
+* @param y \95Ï\8a·\82µ\82½\82¢\93_\82ÌY\8dÀ\95W\8eQ\8fÆ\83|\83C\83\93\83^\r
+* @param xoffset Vault\90¶\90¬\8e\9e\82Ì\8aî\8f\80X\8dÀ\95W\r
+* @param yoffset Vault\90¶\90¬\8e\9e\82Ì\8aî\8f\80Y\8dÀ\95W\r
+* @param transno \8f\88\97\9dID\r
+* @return \82È\82µ\r
+*/\r
+static void coord_trans(POSITION *x, POSITION *y, POSITION xoffset, POSITION yoffset, int transno)\r
+{\r
+ int i;\r
+ int temp;\r
+\r
+ /*\r
+ * transno specifies what transformation is required. (0-7)\r
+ * The lower two bits indicate by how much the vault is rotated,\r
+ * and the upper bit indicates a reflection.\r
+ * This is done by using rotation matrices... however since\r
+ * these are mostly zeros for rotations by 90 degrees this can\r
+ * be expressed simply in terms of swapping and inverting the\r
+ * x and y coordinates.\r
+ */\r
+ for (i = 0; i < transno % 4; i++)\r
+ {\r
+ /* rotate by 90 degrees */\r
+ temp = *x;\r
+ *x = -(*y);\r
+ *y = temp;\r
+ }\r
+\r
+ if (transno / 4)\r
+ {\r
+ /* Reflect depending on status of 3rd bit. */\r
+ *x = -(*x);\r
+ }\r
+\r
+ /* Add offsets so vault stays in the first quadrant */\r
+ *x += xoffset;\r
+ *y += yoffset;\r
+}\r
+\r
+\r
+/*!\r
+* @brief Vault\82ð\83t\83\8d\83A\82É\94z\92u\82·\82é / Hack -- fill in "vault" rooms\r
+* @param yval \90¶\90¬\8aî\8f\80Y\8dÀ\95W\r
+* @param xval \90¶\90¬\8aî\8f\80X\8dÀ\95W\r
+* @param ymax Vault\82ÌY\83T\83C\83Y\r
+* @param xmax Vault\82ÌX\83T\83C\83Y\r
+* @param data Vault\82Ì\83f\81[\83^\95¶\8e\9a\97ñ\r
+* @param xoffset \95Ï\8a·\8aî\8f\80X\8dÀ\95W\r
+* @param yoffset \95Ï\8a·\8aî\8f\80Y\8dÀ\95W\r
+* @param transno \95Ï\8a·ID\r
+* @return \82È\82µ\r
+*/\r
+static void build_vault(POSITION yval, POSITION xval, POSITION ymax, POSITION xmax, cptr data,\r
+ POSITION xoffset, POSITION yoffset, int transno)\r
+{\r
+ POSITION dx, dy, x, y, i, j;\r
+ cptr t;\r
+ cave_type *c_ptr;\r
+\r
+ /* Place dungeon features and objects */\r
+ for (t = data, dy = 0; dy < ymax; dy++)\r
+ {\r
+ for (dx = 0; dx < xmax; dx++, t++)\r
+ {\r
+ /* prevent loop counter from being overwritten */\r
+ i = dx;\r
+ j = dy;\r
+\r
+ /* Flip / rotate */\r
+ coord_trans(&i, &j, xoffset, yoffset, transno);\r
+\r
+ /* Extract the location */\r
+ if (transno % 2 == 0)\r
+ {\r
+ /* no swap of x/y */\r
+ x = xval - (xmax / 2) + i;\r
+ y = yval - (ymax / 2) + j;\r
+ }\r
+ else\r
+ {\r
+ /* swap of x/y */\r
+ x = xval - (ymax / 2) + i;\r
+ y = yval - (xmax / 2) + j;\r
+ }\r
+\r
+ /* Hack -- skip "non-grids" */\r
+ if (*t == ' ') continue;\r
+\r
+ /* Access the grid */\r
+ c_ptr = &cave[y][x];\r
+\r
+ /* Lay down a floor */\r
+ place_floor_grid(c_ptr);\r
+\r
+ /* Remove any mimic */\r
+ c_ptr->mimic = 0;\r
+\r
+ /* Part of a vault */\r
+ c_ptr->info |= (CAVE_ROOM | CAVE_ICKY);\r
+\r
+ /* Analyze the grid */\r
+ switch (*t)\r
+ {\r
+ /* Granite wall (outer) */\r
+ case '%':\r
+ place_outer_noperm_grid(c_ptr);\r
+ break;\r
+\r
+ /* Granite wall (inner) */\r
+ case '#':\r
+ place_inner_grid(c_ptr);\r
+ break;\r
+\r
+ /* Glass wall (inner) */\r
+ case '$':\r
+ place_inner_grid(c_ptr);\r
+ c_ptr->feat = feat_glass_wall;\r
+ break;\r
+\r
+ /* Permanent wall (inner) */\r
+ case 'X':\r
+ place_inner_perm_grid(c_ptr);\r
+ break;\r
+\r
+ /* Permanent glass wall (inner) */\r
+ case 'Y':\r
+ place_inner_perm_grid(c_ptr);\r
+ c_ptr->feat = feat_permanent_glass_wall;\r
+ break;\r
+\r
+ /* Treasure/trap */\r
+ case '*':\r
+ if (randint0(100) < 75)\r
+ {\r
+ place_object(y, x, 0L);\r
+ }\r
+ else\r
+ {\r
+ place_trap(y, x);\r
+ }\r
+ break;\r
+\r
+ /* Secret doors */\r
+ case '+':\r
+ place_secret_door(y, x, DOOR_DEFAULT);\r
+ break;\r
+\r
+ /* Secret glass doors */\r
+ case '-':\r
+ place_secret_door(y, x, DOOR_GLASS_DOOR);\r
+ if (is_closed_door(c_ptr->feat)) c_ptr->mimic = feat_glass_wall;\r
+ break;\r
+\r
+ /* Curtains */\r
+ case '\'':\r
+ place_secret_door(y, x, DOOR_CURTAIN);\r
+ break;\r
+\r
+ /* Trap */\r
+ case '^':\r
+ place_trap(y, x);\r
+ break;\r
+\r
+ /* Black market in a dungeon */\r
+ case 'S':\r
+ set_cave_feat(y, x, feat_black_market);\r
+ store_init(NO_TOWN, STORE_BLACK);\r
+ break;\r
+\r
+ /* The Pattern */\r
+ case 'p':\r
+ set_cave_feat(y, x, feat_pattern_start);\r
+ break;\r
+\r
+ case 'a':\r
+ set_cave_feat(y, x, feat_pattern_1);\r
+ break;\r
+\r
+ case 'b':\r
+ set_cave_feat(y, x, feat_pattern_2);\r
+ break;\r
+\r
+ case 'c':\r
+ set_cave_feat(y, x, feat_pattern_3);\r
+ break;\r
+\r
+ case 'd':\r
+ set_cave_feat(y, x, feat_pattern_4);\r
+ break;\r
+\r
+ case 'P':\r
+ set_cave_feat(y, x, feat_pattern_end);\r
+ break;\r
+\r
+ case 'B':\r
+ set_cave_feat(y, x, feat_pattern_exit);\r
+ break;\r
+\r
+ case 'A':\r
+ /* Reward for Pattern walk */\r
+ object_level = base_level + 12;\r
+ place_object(y, x, AM_GOOD | AM_GREAT);\r
+ object_level = base_level;\r
+ break;\r
+ }\r
+ }\r
+ }\r
+\r
+\r
+ /* Place dungeon monsters and objects */\r
+ for (t = data, dy = 0; dy < ymax; dy++)\r
+ {\r
+ for (dx = 0; dx < xmax; dx++, t++)\r
+ {\r
+ /* prevent loop counter from being overwritten */\r
+ i = dx;\r
+ j = dy;\r
+\r
+ /* Flip / rotate */\r
+ coord_trans(&i, &j, xoffset, yoffset, transno);\r
+\r
+ /* Extract the location */\r
+ if (transno % 2 == 0)\r
+ {\r
+ /* no swap of x/y */\r
+ x = xval - (xmax / 2) + i;\r
+ y = yval - (ymax / 2) + j;\r
+ }\r
+ else\r
+ {\r
+ /* swap of x/y */\r
+ x = xval - (ymax / 2) + i;\r
+ y = yval - (xmax / 2) + j;\r
+ }\r
+\r
+ /* Hack -- skip "non-grids" */\r
+ if (*t == ' ') continue;\r
+\r
+ /* Analyze the symbol */\r
+ switch (*t)\r
+ {\r
+ /* Monster */\r
+ case '&':\r
+ {\r
+ monster_level = base_level + 5;\r
+ place_monster(y, x, (PM_ALLOW_SLEEP | PM_ALLOW_GROUP));\r
+ monster_level = base_level;\r
+ break;\r
+ }\r
+\r
+ /* Meaner monster */\r
+ case '@':\r
+ {\r
+ monster_level = base_level + 11;\r
+ place_monster(y, x, (PM_ALLOW_SLEEP | PM_ALLOW_GROUP));\r
+ monster_level = base_level;\r
+ break;\r
+ }\r
+\r
+ /* Meaner monster, plus treasure */\r
+ case '9':\r
+ {\r
+ monster_level = base_level + 9;\r
+ place_monster(y, x, PM_ALLOW_SLEEP);\r
+ monster_level = base_level;\r
+ object_level = base_level + 7;\r
+ place_object(y, x, AM_GOOD);\r
+ object_level = base_level;\r
+ break;\r
+ }\r
+\r
+ /* Nasty monster and treasure */\r
+ case '8':\r
+ {\r
+ monster_level = base_level + 40;\r
+ place_monster(y, x, PM_ALLOW_SLEEP);\r
+ monster_level = base_level;\r
+ object_level = base_level + 20;\r
+ place_object(y, x, AM_GOOD | AM_GREAT);\r
+ object_level = base_level;\r
+ break;\r
+ }\r
+\r
+ /* Monster and/or object */\r
+ case ',':\r
+ {\r
+ if (randint0(100) < 50)\r
+ {\r
+ monster_level = base_level + 3;\r
+ place_monster(y, x, (PM_ALLOW_SLEEP | PM_ALLOW_GROUP));\r
+ monster_level = base_level;\r
+ }\r
+ if (randint0(100) < 50)\r
+ {\r
+ object_level = base_level + 7;\r
+ place_object(y, x, 0L);\r
+ object_level = base_level;\r
+ }\r
+ break;\r
+ }\r
+\r
+ }\r
+ }\r
+ }\r
+}\r
+\r
+\r
+\r
+/*!\r
+* @brief \83^\83C\83v7\82Ì\95\94\89®\81cv_info.txt\82æ\82è\8f¬\8c^vault\82ð\90¶\90¬\82·\82é / Type 7 -- simple vaults (see "v_info.txt")\r
+* @return \82È\82µ\r
+*/\r
+bool build_type7(void)\r
+{\r
+ vault_type *v_ptr = NULL;\r
+ int dummy;\r
+ POSITION x, y;\r
+ POSITION xval, yval;\r
+ POSITION xoffset, yoffset;\r
+ int transno;\r
+\r
+ /* Pick a lesser vault */\r
+ for (dummy = 0; dummy < SAFE_MAX_ATTEMPTS; dummy++)\r
+ {\r
+ /* Access a random vault record */\r
+ v_ptr = &v_info[randint0(max_v_idx)];\r
+\r
+ /* Accept the first lesser vault */\r
+ if (v_ptr->typ == 7) break;\r
+ }\r
+\r
+ /* No lesser vault found */\r
+ if (dummy >= SAFE_MAX_ATTEMPTS)\r
+ {\r
+ msg_print_wizard(CHEAT_DUNGEON, _("\8f¬\8c^\8cÅ\92èVault\82ð\94z\92u\82Å\82«\82Ü\82¹\82ñ\82Å\82µ\82½\81B", "Could not place lesser vault."));\r
+ return FALSE;\r
+ }\r
+\r
+ /* pick type of transformation (0-7) */\r
+ transno = randint0(8);\r
+\r
+ /* calculate offsets */\r
+ x = v_ptr->wid;\r
+ y = v_ptr->hgt;\r
+\r
+ /* Some huge vault cannot be ratated to fit in the dungeon */\r
+ if (x + 2 > cur_hgt - 2)\r
+ {\r
+ /* Forbid 90 or 270 degree ratation */\r
+ transno &= ~1;\r
+ }\r
+\r
+ coord_trans(&x, &y, 0, 0, transno);\r
+\r
+ if (x < 0)\r
+ {\r
+ xoffset = -x - 1;\r
+ }\r
+ else\r
+ {\r
+ xoffset = 0;\r
+ }\r
+\r
+ if (y < 0)\r
+ {\r
+ yoffset = -y - 1;\r
+ }\r
+ else\r
+ {\r
+ yoffset = 0;\r
+ }\r
+\r
+ /* Find and reserve some space in the dungeon. Get center of room. */\r
+ if (!find_space(&yval, &xval, abs(y), abs(x))) return FALSE;\r
+\r
+#ifdef FORCE_V_IDX\r
+ v_ptr = &v_info[2];\r
+#endif\r
+\r
+ /* Message */\r
+ msg_format_wizard(CHEAT_DUNGEON, _("\8f¬\8c^Vault(%s)\82ð\90¶\90¬\82µ\82Ü\82µ\82½\81B", "Lesser vault (%s)."), v_name + v_ptr->name);\r
+\r
+ /* Hack -- Build the vault */\r
+ build_vault(yval, xval, v_ptr->hgt, v_ptr->wid,\r
+ v_text + v_ptr->text, xoffset, yoffset, transno);\r
+\r
+ return TRUE;\r
+}\r
+\r
+/*!\r
+* @brief \83^\83C\83v8\82Ì\95\94\89®\81cv_info.txt\82æ\82è\91å\8c^vault\82ð\90¶\90¬\82·\82é / Type 8 -- greater vaults (see "v_info.txt")\r
+* @return \82È\82µ\r
+*/\r
+bool build_type8(void)\r
+{\r
+ vault_type *v_ptr;\r
+ int dummy;\r
+ POSITION xval, yval;\r
+ POSITION x, y;\r
+ int transno;\r
+ int xoffset, yoffset;\r
+\r
+ /* Pick a greater vault */\r
+ for (dummy = 0; dummy < SAFE_MAX_ATTEMPTS; dummy++)\r
+ {\r
+ /* Access a random vault record */\r
+ v_ptr = &v_info[randint0(max_v_idx)];\r
+\r
+ /* Accept the first greater vault */\r
+ if (v_ptr->typ == 8) break;\r
+ }\r
+\r
+ /* No greater vault found */\r
+ if (dummy >= SAFE_MAX_ATTEMPTS)\r
+ {\r
+ msg_print_wizard(CHEAT_DUNGEON, _("\91å\8c^\8cÅ\92èVault\82ð\94z\92u\82Å\82«\82Ü\82¹\82ñ\82Å\82µ\82½\81B", "Could not place greater vault."));\r
+ return FALSE;\r
+ }\r
+\r
+ /* pick type of transformation (0-7) */\r
+ transno = randint0(8);\r
+\r
+ /* calculate offsets */\r
+ x = v_ptr->wid;\r
+ y = v_ptr->hgt;\r
+\r
+ /* Some huge vault cannot be ratated to fit in the dungeon */\r
+ if (x + 2 > cur_hgt - 2)\r
+ {\r
+ /* Forbid 90 or 270 degree ratation */\r
+ transno &= ~1;\r
+ }\r
+\r
+ coord_trans(&x, &y, 0, 0, transno);\r
+\r
+ if (x < 0)\r
+ {\r
+ xoffset = -x - 1;\r
+ }\r
+ else\r
+ {\r
+ xoffset = 0;\r
+ }\r
+\r
+ if (y < 0)\r
+ {\r
+ yoffset = -y - 1;\r
+ }\r
+ else\r
+ {\r
+ yoffset = 0;\r
+ }\r
+\r
+ /*\r
+ * Try to allocate space for room. If fails, exit\r
+ *\r
+ * Hack -- Prepare a bit larger space (+2, +2) to\r
+ * prevent generation of vaults with no-entrance.\r
+ */\r
+ /* Find and reserve some space in the dungeon. Get center of room. */\r
+ if (!find_space(&yval, &xval, (POSITION)(abs(y) + 2), (POSITION)(abs(x) + 2))) return FALSE;\r
+\r
+#ifdef FORCE_V_IDX\r
+ v_ptr = &v_info[76 + randint1(3)];\r
+#endif\r
+\r
+ msg_format_wizard(CHEAT_DUNGEON, _("\91å\8c^\8cÅ\92èVault(%s)\82ð\90¶\90¬\82µ\82Ü\82µ\82½\81B", "Greater vault (%s)."), v_name + v_ptr->name);\r
+\r
+ /* Hack -- Build the vault */\r
+ build_vault(yval, xval, v_ptr->hgt, v_ptr->wid,\r
+ v_text + v_ptr->text, xoffset, yoffset, transno);\r
+\r
+ return TRUE;\r
+}\r
--- /dev/null
+extern bool build_type7(void);\r
+extern bool build_type8(void);\r
+\r
#include "rooms-normal.h"
#include "rooms-pitnest.h"
+#include "rooms-vault.h"
/*!
-/*!
- * @brief Vault地形を回転、上下左右反転するための座標変換を返す / coordinate translation code
- * @param x 変換したい点のX座標参照ポインタ
- * @param y 変換したい点のY座標参照ポインタ
- * @param xoffset Vault生成時の基準X座標
- * @param yoffset Vault生成時の基準Y座標
- * @param transno 処理ID
- * @return なし
- */
-static void coord_trans(POSITION *x, POSITION *y, POSITION xoffset, POSITION yoffset, int transno)
-{
- int i;
- int temp;
-
- /*
- * transno specifies what transformation is required. (0-7)
- * The lower two bits indicate by how much the vault is rotated,
- * and the upper bit indicates a reflection.
- * This is done by using rotation matrices... however since
- * these are mostly zeros for rotations by 90 degrees this can
- * be expressed simply in terms of swapping and inverting the
- * x and y coordinates.
- */
- for (i = 0; i < transno % 4; i++)
- {
- /* rotate by 90 degrees */
- temp = *x;
- *x = -(*y);
- *y = temp;
- }
-
- if (transno / 4)
- {
- /* Reflect depending on status of 3rd bit. */
- *x = -(*x);
- }
-
- /* Add offsets so vault stays in the first quadrant */
- *x += xoffset;
- *y += yoffset;
-}
-
-/*!
- * @brief Vaultをフロアに配置する / Hack -- fill in "vault" rooms
- * @param yval 生成基準Y座標
- * @param xval 生成基準X座標
- * @param ymax VaultのYサイズ
- * @param xmax VaultのXサイズ
- * @param data Vaultのデータ文字列
- * @param xoffset 変換基準X座標
- * @param yoffset 変換基準Y座標
- * @param transno 変換ID
- * @return なし
- */
-static void build_vault(POSITION yval, POSITION xval, POSITION ymax, POSITION xmax, cptr data,
- POSITION xoffset, POSITION yoffset, int transno)
-{
- POSITION dx, dy, x, y, i, j;
- cptr t;
- cave_type *c_ptr;
-
- /* Place dungeon features and objects */
- for (t = data, dy = 0; dy < ymax; dy++)
- {
- for (dx = 0; dx < xmax; dx++, t++)
- {
- /* prevent loop counter from being overwritten */
- i = dx;
- j = dy;
-
- /* Flip / rotate */
- coord_trans(&i, &j, xoffset, yoffset, transno);
-
- /* Extract the location */
- if (transno % 2 == 0)
- {
- /* no swap of x/y */
- x = xval - (xmax / 2) + i;
- y = yval - (ymax / 2) + j;
- }
- else
- {
- /* swap of x/y */
- x = xval - (ymax / 2) + i;
- y = yval - (xmax / 2) + j;
- }
-
- /* Hack -- skip "non-grids" */
- if (*t == ' ') continue;
-
- /* Access the grid */
- c_ptr = &cave[y][x];
-
- /* Lay down a floor */
- place_floor_grid(c_ptr);
-
- /* Remove any mimic */
- c_ptr->mimic = 0;
-
- /* Part of a vault */
- c_ptr->info |= (CAVE_ROOM | CAVE_ICKY);
-
- /* Analyze the grid */
- switch (*t)
- {
- /* Granite wall (outer) */
- case '%':
- place_outer_noperm_grid(c_ptr);
- break;
-
- /* Granite wall (inner) */
- case '#':
- place_inner_grid(c_ptr);
- break;
-
- /* Glass wall (inner) */
- case '$':
- place_inner_grid(c_ptr);
- c_ptr->feat = feat_glass_wall;
- break;
-
- /* Permanent wall (inner) */
- case 'X':
- place_inner_perm_grid(c_ptr);
- break;
-
- /* Permanent glass wall (inner) */
- case 'Y':
- place_inner_perm_grid(c_ptr);
- c_ptr->feat = feat_permanent_glass_wall;
- break;
-
- /* Treasure/trap */
- case '*':
- if (randint0(100) < 75)
- {
- place_object(y, x, 0L);
- }
- else
- {
- place_trap(y, x);
- }
- break;
-
- /* Secret doors */
- case '+':
- place_secret_door(y, x, DOOR_DEFAULT);
- break;
-
- /* Secret glass doors */
- case '-':
- place_secret_door(y, x, DOOR_GLASS_DOOR);
- if (is_closed_door(c_ptr->feat)) c_ptr->mimic = feat_glass_wall;
- break;
-
- /* Curtains */
- case '\'':
- place_secret_door(y, x, DOOR_CURTAIN);
- break;
-
- /* Trap */
- case '^':
- place_trap(y, x);
- break;
-
- /* Black market in a dungeon */
- case 'S':
- set_cave_feat(y, x, feat_black_market);
- store_init(NO_TOWN, STORE_BLACK);
- break;
-
- /* The Pattern */
- case 'p':
- set_cave_feat(y, x, feat_pattern_start);
- break;
-
- case 'a':
- set_cave_feat(y, x, feat_pattern_1);
- break;
-
- case 'b':
- set_cave_feat(y, x, feat_pattern_2);
- break;
-
- case 'c':
- set_cave_feat(y, x, feat_pattern_3);
- break;
-
- case 'd':
- set_cave_feat(y, x, feat_pattern_4);
- break;
-
- case 'P':
- set_cave_feat(y, x, feat_pattern_end);
- break;
-
- case 'B':
- set_cave_feat(y, x, feat_pattern_exit);
- break;
-
- case 'A':
- /* Reward for Pattern walk */
- object_level = base_level + 12;
- place_object(y, x, AM_GOOD | AM_GREAT);
- object_level = base_level;
- break;
- }
- }
- }
-
-
- /* Place dungeon monsters and objects */
- for (t = data, dy = 0; dy < ymax; dy++)
- {
- for (dx = 0; dx < xmax; dx++, t++)
- {
- /* prevent loop counter from being overwritten */
- i = dx;
- j = dy;
-
- /* Flip / rotate */
- coord_trans(&i, &j, xoffset, yoffset, transno);
-
- /* Extract the location */
- if (transno % 2 == 0)
- {
- /* no swap of x/y */
- x = xval - (xmax / 2) + i;
- y = yval - (ymax / 2) + j;
- }
- else
- {
- /* swap of x/y */
- x = xval - (ymax / 2) + i;
- y = yval - (xmax / 2) + j;
- }
-
- /* Hack -- skip "non-grids" */
- if (*t == ' ') continue;
-
- /* Analyze the symbol */
- switch (*t)
- {
- /* Monster */
- case '&':
- {
- monster_level = base_level + 5;
- place_monster(y, x, (PM_ALLOW_SLEEP | PM_ALLOW_GROUP));
- monster_level = base_level;
- break;
- }
-
- /* Meaner monster */
- case '@':
- {
- monster_level = base_level + 11;
- place_monster(y, x, (PM_ALLOW_SLEEP | PM_ALLOW_GROUP));
- monster_level = base_level;
- break;
- }
-
- /* Meaner monster, plus treasure */
- case '9':
- {
- monster_level = base_level + 9;
- place_monster(y, x, PM_ALLOW_SLEEP);
- monster_level = base_level;
- object_level = base_level + 7;
- place_object(y, x, AM_GOOD);
- object_level = base_level;
- break;
- }
-
- /* Nasty monster and treasure */
- case '8':
- {
- monster_level = base_level + 40;
- place_monster(y, x, PM_ALLOW_SLEEP);
- monster_level = base_level;
- object_level = base_level + 20;
- place_object(y, x, AM_GOOD | AM_GREAT);
- object_level = base_level;
- break;
- }
-
- /* Monster and/or object */
- case ',':
- {
- if (randint0(100) < 50)
- {
- monster_level = base_level + 3;
- place_monster(y, x, (PM_ALLOW_SLEEP | PM_ALLOW_GROUP));
- monster_level = base_level;
- }
- if (randint0(100) < 50)
- {
- object_level = base_level + 7;
- place_object(y, x, 0L);
- object_level = base_level;
- }
- break;
- }
-
- }
- }
- }
-}
-
-
-/*!
- * @brief タイプ7の部屋…v_info.txtより小型vaultを生成する / Type 7 -- simple vaults (see "v_info.txt")
- * @return なし
- */
-static bool build_type7(void)
-{
- vault_type *v_ptr = NULL;
- int dummy;
- POSITION x, y;
- POSITION xval, yval;
- POSITION xoffset, yoffset;
- int transno;
-
- /* Pick a lesser vault */
- for (dummy = 0; dummy < SAFE_MAX_ATTEMPTS; dummy++)
- {
- /* Access a random vault record */
- v_ptr = &v_info[randint0(max_v_idx)];
-
- /* Accept the first lesser vault */
- if (v_ptr->typ == 7) break;
- }
-
- /* No lesser vault found */
- if (dummy >= SAFE_MAX_ATTEMPTS)
- {
- msg_print_wizard(CHEAT_DUNGEON, _("小型固定Vaultを配置できませんでした。", "Could not place lesser vault."));
- return FALSE;
- }
-
- /* pick type of transformation (0-7) */
- transno = randint0(8);
-
- /* calculate offsets */
- x = v_ptr->wid;
- y = v_ptr->hgt;
-
- /* Some huge vault cannot be ratated to fit in the dungeon */
- if (x+2 > cur_hgt-2)
- {
- /* Forbid 90 or 270 degree ratation */
- transno &= ~1;
- }
-
- coord_trans(&x, &y, 0, 0, transno);
-
- if (x < 0)
- {
- xoffset = -x - 1;
- }
- else
- {
- xoffset = 0;
- }
-
- if (y < 0)
- {
- yoffset = -y - 1;
- }
- else
- {
- yoffset = 0;
- }
-
- /* Find and reserve some space in the dungeon. Get center of room. */
- if (!find_space(&yval, &xval, abs(y), abs(x))) return FALSE;
-
-#ifdef FORCE_V_IDX
- v_ptr = &v_info[2];
-#endif
-
- /* Message */
- msg_format_wizard(CHEAT_DUNGEON, _("小型Vault(%s)を生成しました。", "Lesser vault (%s)."), v_name + v_ptr->name);
-
- /* Hack -- Build the vault */
- build_vault(yval, xval, v_ptr->hgt, v_ptr->wid,
- v_text + v_ptr->text, xoffset, yoffset, transno);
-
- return TRUE;
-}
-
-/*!
- * @brief タイプ8の部屋…v_info.txtより大型vaultを生成する / Type 8 -- greater vaults (see "v_info.txt")
- * @return なし
- */
-static bool build_type8(void)
-{
- vault_type *v_ptr;
- int dummy;
- POSITION xval, yval;
- POSITION x, y;
- int transno;
- int xoffset, yoffset;
-
- /* Pick a greater vault */
- for (dummy = 0; dummy < SAFE_MAX_ATTEMPTS; dummy++)
- {
- /* Access a random vault record */
- v_ptr = &v_info[randint0(max_v_idx)];
-
- /* Accept the first greater vault */
- if (v_ptr->typ == 8) break;
- }
-
- /* No greater vault found */
- if (dummy >= SAFE_MAX_ATTEMPTS)
- {
- msg_print_wizard(CHEAT_DUNGEON, _("大型固定Vaultを配置できませんでした。", "Could not place greater vault."));
- return FALSE;
- }
-
- /* pick type of transformation (0-7) */
- transno = randint0(8);
-
- /* calculate offsets */
- x = v_ptr->wid;
- y = v_ptr->hgt;
-
- /* Some huge vault cannot be ratated to fit in the dungeon */
- if (x+2 > cur_hgt-2)
- {
- /* Forbid 90 or 270 degree ratation */
- transno &= ~1;
- }
-
- coord_trans(&x, &y, 0, 0, transno);
-
- if (x < 0)
- {
- xoffset = - x - 1;
- }
- else
- {
- xoffset = 0;
- }
-
- if (y < 0)
- {
- yoffset = - y - 1;
- }
- else
- {
- yoffset = 0;
- }
-
- /*
- * Try to allocate space for room. If fails, exit
- *
- * Hack -- Prepare a bit larger space (+2, +2) to
- * prevent generation of vaults with no-entrance.
- */
- /* Find and reserve some space in the dungeon. Get center of room. */
- if (!find_space(&yval, &xval, (POSITION)(abs(y) + 2), (POSITION)(abs(x) + 2))) return FALSE;
-
-#ifdef FORCE_V_IDX
- v_ptr = &v_info[76 + randint1(3)];
-#endif
-
- msg_format_wizard(CHEAT_DUNGEON, _("大型固定Vault(%s)を生成しました。", "Greater vault (%s)."), v_name + v_ptr->name);
-
- /* Hack -- Build the vault */
- build_vault(yval, xval, v_ptr->hgt, v_ptr->wid,
- v_text + v_ptr->text, xoffset, yoffset, transno);
-
- return TRUE;
-}
/*
* Structure to hold all "fill" data