+++ /dev/null
-#include "angband.h"\r
-#include "grid.h"\r
-#include "generate.h"\r
-#include "rooms.h"\r
-#include "monster-hook.h"\r
-\r
-/*\r
-* Helper function for "glass room"\r
-*/\r
-static bool vault_aux_lite(MONRACE_IDX r_idx)\r
-{\r
- monster_race *r_ptr = &r_info[r_idx];\r
-\r
- /* Validate the monster */\r
- if (!vault_monster_okay(r_idx)) return FALSE;\r
-\r
- /* Require lite attack */\r
- if (!(r_ptr->flags4 & RF4_BR_LITE) && !(r_ptr->a_ability_flags1 & RF5_BA_LITE)) return FALSE;\r
-\r
- /* No wall passing monsters */\r
- if (r_ptr->flags2 & (RF2_PASS_WALL | RF2_KILL_WALL)) return FALSE;\r
-\r
- /* No disintegrating monsters */\r
- if (r_ptr->flags4 & RF4_BR_DISI) return FALSE;\r
-\r
- return TRUE;\r
-}\r
-\r
-/*\r
-* Helper function for "glass room"\r
-*/\r
-static bool vault_aux_shards(MONRACE_IDX r_idx)\r
-{\r
- monster_race *r_ptr = &r_info[r_idx];\r
-\r
- /* Validate the monster */\r
- if (!vault_monster_okay(r_idx)) return FALSE;\r
-\r
- /* Require shards breath attack */\r
- if (!(r_ptr->flags4 & RF4_BR_SHAR)) return FALSE;\r
-\r
- return TRUE;\r
-}\r
-\r
-/*\r
-* Hack -- determine if a template is potion\r
-*/\r
-static bool kind_is_potion(KIND_OBJECT_IDX k_idx)\r
-{\r
- return k_info[k_idx].tval == TV_POTION;\r
-}\r
-\r
-/*!\r
-* @brief タイプ15の部屋…ガラス部屋の生成 / Type 15 -- glass rooms\r
-* @return なし\r
-*/\r
-bool build_type15(void)\r
-{\r
- POSITION y, x, y2, x2, yval, xval;\r
- POSITION y1, x1, xsize, ysize;\r
- bool light;\r
-\r
- cave_type *c_ptr;\r
-\r
- /* Pick a room size */\r
- xsize = rand_range(9, 13);\r
- ysize = rand_range(9, 13);\r
-\r
- /* Find and reserve some space in the dungeon. Get center of room. */\r
- if (!find_space(&yval, &xval, ysize + 2, xsize + 2)) return FALSE;\r
-\r
- /* Choose lite or dark */\r
- light = ((dun_level <= randint1(25)) && !(d_info[dungeon_type].flags1 & DF1_DARKNESS));\r
-\r
- /* Get corner values */\r
- y1 = yval - ysize / 2;\r
- x1 = xval - xsize / 2;\r
- y2 = yval + (ysize - 1) / 2;\r
- x2 = xval + (xsize - 1) / 2;\r
-\r
- /* Place a full floor under the room */\r
- for (y = y1 - 1; y <= y2 + 1; y++)\r
- {\r
- for (x = x1 - 1; x <= x2 + 1; x++)\r
- {\r
- c_ptr = &cave[y][x];\r
- place_floor_grid(c_ptr);\r
- c_ptr->feat = feat_glass_floor;\r
- c_ptr->info |= (CAVE_ROOM);\r
- if (light) c_ptr->info |= (CAVE_GLOW);\r
- }\r
- }\r
-\r
- /* Walls around the room */\r
- for (y = y1 - 1; y <= y2 + 1; y++)\r
- {\r
- c_ptr = &cave[y][x1 - 1];\r
- place_outer_grid(c_ptr);\r
- c_ptr->feat = feat_glass_wall;\r
- c_ptr = &cave[y][x2 + 1];\r
- place_outer_grid(c_ptr);\r
- c_ptr->feat = feat_glass_wall;\r
- }\r
- for (x = x1 - 1; x <= x2 + 1; x++)\r
- {\r
- c_ptr = &cave[y1 - 1][x];\r
- place_outer_grid(c_ptr);\r
- c_ptr->feat = feat_glass_wall;\r
- c_ptr = &cave[y2 + 1][x];\r
- place_outer_grid(c_ptr);\r
- c_ptr->feat = feat_glass_wall;\r
- }\r
-\r
- switch (randint1(3))\r
- {\r
- case 1: /* 4 lite breathers + potion */\r
- {\r
- int dir1, dir2;\r
-\r
- /* Prepare allocation table */\r
- get_mon_num_prep(vault_aux_lite, NULL);\r
-\r
- /* Place fixed lite berathers */\r
- for (dir1 = 4; dir1 < 8; dir1++)\r
- {\r
- MONRACE_IDX r_idx = get_mon_num(dun_level);\r
-\r
- y = yval + 2 * ddy_ddd[dir1];\r
- x = xval + 2 * ddx_ddd[dir1];\r
- if (r_idx) place_monster_aux(0, y, x, r_idx, PM_ALLOW_SLEEP);\r
-\r
- /* Walls around the breather */\r
- for (dir2 = 0; dir2 < 8; dir2++)\r
- {\r
- c_ptr = &cave[y + ddy_ddd[dir2]][x + ddx_ddd[dir2]];\r
- place_inner_grid(c_ptr);\r
- c_ptr->feat = feat_glass_wall;\r
- }\r
- }\r
-\r
- /* Walls around the potion */\r
- for (dir1 = 0; dir1 < 4; dir1++)\r
- {\r
- y = yval + 2 * ddy_ddd[dir1];\r
- x = xval + 2 * ddx_ddd[dir1];\r
- c_ptr = &cave[y][x];\r
- place_inner_perm_grid(c_ptr);\r
- c_ptr->feat = feat_permanent_glass_wall;\r
- cave[yval + ddy_ddd[dir1]][xval + ddx_ddd[dir1]].info |= (CAVE_ICKY);\r
- }\r
-\r
- /* Glass door */\r
- dir1 = randint0(4);\r
- y = yval + 2 * ddy_ddd[dir1];\r
- x = xval + 2 * ddx_ddd[dir1];\r
- place_secret_door(y, x, DOOR_GLASS_DOOR);\r
- c_ptr = &cave[y][x];\r
- if (is_closed_door(c_ptr->feat)) c_ptr->mimic = feat_glass_wall;\r
-\r
- /* Place a potion */\r
- get_obj_num_hook = kind_is_potion;\r
- place_object(yval, xval, AM_NO_FIXED_ART);\r
- cave[yval][xval].info |= (CAVE_ICKY);\r
- }\r
- break;\r
-\r
- case 2: /* 1 lite breather + random object */\r
- {\r
- MONRACE_IDX r_idx;\r
- DIRECTION dir1;\r
-\r
- /* Pillars */\r
- c_ptr = &cave[y1 + 1][x1 + 1];\r
- place_inner_grid(c_ptr);\r
- c_ptr->feat = feat_glass_wall;\r
-\r
- c_ptr = &cave[y1 + 1][x2 - 1];\r
- place_inner_grid(c_ptr);\r
- c_ptr->feat = feat_glass_wall;\r
-\r
- c_ptr = &cave[y2 - 1][x1 + 1];\r
- place_inner_grid(c_ptr);\r
- c_ptr->feat = feat_glass_wall;\r
-\r
- c_ptr = &cave[y2 - 1][x2 - 1];\r
- place_inner_grid(c_ptr);\r
- c_ptr->feat = feat_glass_wall;\r
-\r
- /* Prepare allocation table */\r
- get_mon_num_prep(vault_aux_lite, NULL);\r
-\r
- r_idx = get_mon_num(dun_level);\r
- if (r_idx) place_monster_aux(0, yval, xval, r_idx, 0L);\r
-\r
- /* Walls around the breather */\r
- for (dir1 = 0; dir1 < 8; dir1++)\r
- {\r
- c_ptr = &cave[yval + ddy_ddd[dir1]][xval + ddx_ddd[dir1]];\r
- place_inner_grid(c_ptr);\r
- c_ptr->feat = feat_glass_wall;\r
- }\r
-\r
- /* Curtains around the breather */\r
- for (y = yval - 1; y <= yval + 1; y++)\r
- {\r
- place_closed_door(y, xval - 2, DOOR_CURTAIN);\r
- place_closed_door(y, xval + 2, DOOR_CURTAIN);\r
- }\r
- for (x = xval - 1; x <= xval + 1; x++)\r
- {\r
- place_closed_door(yval - 2, x, DOOR_CURTAIN);\r
- place_closed_door(yval + 2, x, DOOR_CURTAIN);\r
- }\r
-\r
- /* Place an object */\r
- place_object(yval, xval, AM_NO_FIXED_ART);\r
- cave[yval][xval].info |= (CAVE_ICKY);\r
- }\r
- break;\r
-\r
- case 3: /* 4 shards breathers + 2 potions */\r
- {\r
- int dir1;\r
-\r
- /* Walls around the potion */\r
- for (y = yval - 2; y <= yval + 2; y++)\r
- {\r
- c_ptr = &cave[y][xval - 3];\r
- place_inner_grid(c_ptr);\r
- c_ptr->feat = feat_glass_wall;\r
- c_ptr = &cave[y][xval + 3];\r
- place_inner_grid(c_ptr);\r
- c_ptr->feat = feat_glass_wall;\r
- }\r
- for (x = xval - 2; x <= xval + 2; x++)\r
- {\r
- c_ptr = &cave[yval - 3][x];\r
- place_inner_grid(c_ptr);\r
- c_ptr->feat = feat_glass_wall;\r
- c_ptr = &cave[yval + 3][x];\r
- place_inner_grid(c_ptr);\r
- c_ptr->feat = feat_glass_wall;\r
- }\r
- for (dir1 = 4; dir1 < 8; dir1++)\r
- {\r
- c_ptr = &cave[yval + 2 * ddy_ddd[dir1]][xval + 2 * ddx_ddd[dir1]];\r
- place_inner_grid(c_ptr);\r
- c_ptr->feat = feat_glass_wall;\r
- }\r
-\r
- /* Prepare allocation table */\r
- get_mon_num_prep(vault_aux_shards, NULL);\r
-\r
- /* Place shard berathers */\r
- for (dir1 = 4; dir1 < 8; dir1++)\r
- {\r
- MONRACE_IDX r_idx = get_mon_num(dun_level);\r
-\r
- y = yval + ddy_ddd[dir1];\r
- x = xval + ddx_ddd[dir1];\r
- if (r_idx) place_monster_aux(0, y, x, r_idx, 0L);\r
- }\r
-\r
- /* Place two potions */\r
- if (one_in_(2))\r
- {\r
- get_obj_num_hook = kind_is_potion;\r
- place_object(yval, xval - 1, AM_NO_FIXED_ART);\r
- get_obj_num_hook = kind_is_potion;\r
- place_object(yval, xval + 1, AM_NO_FIXED_ART);\r
- }\r
- else\r
- {\r
- get_obj_num_hook = kind_is_potion;\r
- place_object(yval - 1, xval, AM_NO_FIXED_ART);\r
- get_obj_num_hook = kind_is_potion;\r
- place_object(yval + 1, xval, AM_NO_FIXED_ART);\r
- }\r
-\r
- for (y = yval - 2; y <= yval + 2; y++)\r
- for (x = xval - 2; x <= xval + 2; x++)\r
- cave[y][x].info |= (CAVE_ICKY);\r
-\r
- }\r
- break;\r
- }\r
-\r
- msg_print_wizard(CHEAT_DUNGEON, _("ガラスの部屋が生成されました。", "Glass room was generated."));\r
-\r
- return TRUE;\r
-}\r