OSDN Git Service

8667231e9bc804f1665e6c2b6dff29a6c7a3139a
[hengband/hengband.git] / src / rooms-special.c
1 #include "angband.h"\r
2 #include "grid.h"\r
3 #include "generate.h"\r
4 #include "rooms.h"\r
5 #include "monsterrace-hook.h"\r
6 #include "objectkind-hook.h"\r
7 \r
8 \r
9 /*!\r
10 * @brief タイプ15の部屋…ガラス部屋の生成 / Type 15 -- glass rooms\r
11 * @return なし\r
12 */\r
13 bool build_type15(void)\r
14 {\r
15         POSITION y, x, y2, x2, yval, xval;\r
16         POSITION y1, x1, xsize, ysize;\r
17         bool light;\r
18 \r
19         cave_type *c_ptr;\r
20 \r
21         /* Pick a room size */\r
22         xsize = rand_range(9, 13);\r
23         ysize = rand_range(9, 13);\r
24 \r
25         /* Find and reserve some space in the dungeon.  Get center of room. */\r
26         if (!find_space(&yval, &xval, ysize + 2, xsize + 2)) return FALSE;\r
27 \r
28         /* Choose lite or dark */\r
29         light = ((dun_level <= randint1(25)) && !(d_info[dungeon_type].flags1 & DF1_DARKNESS));\r
30 \r
31         /* Get corner values */\r
32         y1 = yval - ysize / 2;\r
33         x1 = xval - xsize / 2;\r
34         y2 = yval + (ysize - 1) / 2;\r
35         x2 = xval + (xsize - 1) / 2;\r
36 \r
37         /* Place a full floor under the room */\r
38         for (y = y1 - 1; y <= y2 + 1; y++)\r
39         {\r
40                 for (x = x1 - 1; x <= x2 + 1; x++)\r
41                 {\r
42                         c_ptr = &cave[y][x];\r
43                         place_floor_grid(c_ptr);\r
44                         c_ptr->feat = feat_glass_floor;\r
45                         c_ptr->info |= (CAVE_ROOM);\r
46                         if (light) c_ptr->info |= (CAVE_GLOW);\r
47                 }\r
48         }\r
49 \r
50         /* Walls around the room */\r
51         for (y = y1 - 1; y <= y2 + 1; y++)\r
52         {\r
53                 c_ptr = &cave[y][x1 - 1];\r
54                 place_outer_grid(c_ptr);\r
55                 c_ptr->feat = feat_glass_wall;\r
56                 c_ptr = &cave[y][x2 + 1];\r
57                 place_outer_grid(c_ptr);\r
58                 c_ptr->feat = feat_glass_wall;\r
59         }\r
60         for (x = x1 - 1; x <= x2 + 1; x++)\r
61         {\r
62                 c_ptr = &cave[y1 - 1][x];\r
63                 place_outer_grid(c_ptr);\r
64                 c_ptr->feat = feat_glass_wall;\r
65                 c_ptr = &cave[y2 + 1][x];\r
66                 place_outer_grid(c_ptr);\r
67                 c_ptr->feat = feat_glass_wall;\r
68         }\r
69 \r
70         switch (randint1(3))\r
71         {\r
72         case 1: /* 4 lite breathers + potion */\r
73         {\r
74                 int dir1, dir2;\r
75                 get_mon_num_prep(vault_aux_lite, NULL);\r
76 \r
77                 /* Place fixed lite berathers */\r
78                 for (dir1 = 4; dir1 < 8; dir1++)\r
79                 {\r
80                         MONRACE_IDX r_idx = get_mon_num(dun_level);\r
81 \r
82                         y = yval + 2 * ddy_ddd[dir1];\r
83                         x = xval + 2 * ddx_ddd[dir1];\r
84                         if (r_idx) place_monster_aux(0, y, x, r_idx, PM_ALLOW_SLEEP);\r
85 \r
86                         /* Walls around the breather */\r
87                         for (dir2 = 0; dir2 < 8; dir2++)\r
88                         {\r
89                                 c_ptr = &cave[y + ddy_ddd[dir2]][x + ddx_ddd[dir2]];\r
90                                 place_inner_grid(c_ptr);\r
91                                 c_ptr->feat = feat_glass_wall;\r
92                         }\r
93                 }\r
94 \r
95                 /* Walls around the potion */\r
96                 for (dir1 = 0; dir1 < 4; dir1++)\r
97                 {\r
98                         y = yval + 2 * ddy_ddd[dir1];\r
99                         x = xval + 2 * ddx_ddd[dir1];\r
100                         c_ptr = &cave[y][x];\r
101                         place_inner_perm_grid(c_ptr);\r
102                         c_ptr->feat = feat_permanent_glass_wall;\r
103                         cave[yval + ddy_ddd[dir1]][xval + ddx_ddd[dir1]].info |= (CAVE_ICKY);\r
104                 }\r
105 \r
106                 /* Glass door */\r
107                 dir1 = randint0(4);\r
108                 y = yval + 2 * ddy_ddd[dir1];\r
109                 x = xval + 2 * ddx_ddd[dir1];\r
110                 place_secret_door(y, x, DOOR_GLASS_DOOR);\r
111                 c_ptr = &cave[y][x];\r
112                 if (is_closed_door(c_ptr->feat)) c_ptr->mimic = feat_glass_wall;\r
113 \r
114                 /* Place a potion */\r
115                 get_obj_num_hook = kind_is_potion;\r
116                 place_object(yval, xval, AM_NO_FIXED_ART);\r
117                 cave[yval][xval].info |= (CAVE_ICKY);\r
118         }\r
119         break;\r
120 \r
121         case 2: /* 1 lite breather + random object */\r
122         {\r
123                 MONRACE_IDX r_idx;\r
124                 DIRECTION dir1;\r
125 \r
126                 /* Pillars */\r
127                 c_ptr = &cave[y1 + 1][x1 + 1];\r
128                 place_inner_grid(c_ptr);\r
129                 c_ptr->feat = feat_glass_wall;\r
130 \r
131                 c_ptr = &cave[y1 + 1][x2 - 1];\r
132                 place_inner_grid(c_ptr);\r
133                 c_ptr->feat = feat_glass_wall;\r
134 \r
135                 c_ptr = &cave[y2 - 1][x1 + 1];\r
136                 place_inner_grid(c_ptr);\r
137                 c_ptr->feat = feat_glass_wall;\r
138 \r
139                 c_ptr = &cave[y2 - 1][x2 - 1];\r
140                 place_inner_grid(c_ptr);\r
141                 c_ptr->feat = feat_glass_wall;\r
142                 get_mon_num_prep(vault_aux_lite, NULL);\r
143 \r
144                 r_idx = get_mon_num(dun_level);\r
145                 if (r_idx) place_monster_aux(0, yval, xval, r_idx, 0L);\r
146 \r
147                 /* Walls around the breather */\r
148                 for (dir1 = 0; dir1 < 8; dir1++)\r
149                 {\r
150                         c_ptr = &cave[yval + ddy_ddd[dir1]][xval + ddx_ddd[dir1]];\r
151                         place_inner_grid(c_ptr);\r
152                         c_ptr->feat = feat_glass_wall;\r
153                 }\r
154 \r
155                 /* Curtains around the breather */\r
156                 for (y = yval - 1; y <= yval + 1; y++)\r
157                 {\r
158                         place_closed_door(y, xval - 2, DOOR_CURTAIN);\r
159                         place_closed_door(y, xval + 2, DOOR_CURTAIN);\r
160                 }\r
161                 for (x = xval - 1; x <= xval + 1; x++)\r
162                 {\r
163                         place_closed_door(yval - 2, x, DOOR_CURTAIN);\r
164                         place_closed_door(yval + 2, x, DOOR_CURTAIN);\r
165                 }\r
166 \r
167                 /* Place an object */\r
168                 place_object(yval, xval, AM_NO_FIXED_ART);\r
169                 cave[yval][xval].info |= (CAVE_ICKY);\r
170         }\r
171         break;\r
172 \r
173         case 3: /* 4 shards breathers + 2 potions */\r
174         {\r
175                 DIRECTION dir1;\r
176 \r
177                 /* Walls around the potion */\r
178                 for (y = yval - 2; y <= yval + 2; y++)\r
179                 {\r
180                         c_ptr = &cave[y][xval - 3];\r
181                         place_inner_grid(c_ptr);\r
182                         c_ptr->feat = feat_glass_wall;\r
183                         c_ptr = &cave[y][xval + 3];\r
184                         place_inner_grid(c_ptr);\r
185                         c_ptr->feat = feat_glass_wall;\r
186                 }\r
187                 for (x = xval - 2; x <= xval + 2; x++)\r
188                 {\r
189                         c_ptr = &cave[yval - 3][x];\r
190                         place_inner_grid(c_ptr);\r
191                         c_ptr->feat = feat_glass_wall;\r
192                         c_ptr = &cave[yval + 3][x];\r
193                         place_inner_grid(c_ptr);\r
194                         c_ptr->feat = feat_glass_wall;\r
195                 }\r
196                 for (dir1 = 4; dir1 < 8; dir1++)\r
197                 {\r
198                         c_ptr = &cave[yval + 2 * ddy_ddd[dir1]][xval + 2 * ddx_ddd[dir1]];\r
199                         place_inner_grid(c_ptr);\r
200                         c_ptr->feat = feat_glass_wall;\r
201                 }\r
202                 get_mon_num_prep(vault_aux_shards, NULL);\r
203 \r
204                 /* Place shard berathers */\r
205                 for (dir1 = 4; dir1 < 8; dir1++)\r
206                 {\r
207                         MONRACE_IDX r_idx = get_mon_num(dun_level);\r
208 \r
209                         y = yval + ddy_ddd[dir1];\r
210                         x = xval + ddx_ddd[dir1];\r
211                         if (r_idx) place_monster_aux(0, y, x, r_idx, 0L);\r
212                 }\r
213 \r
214                 /* Place two potions */\r
215                 if (one_in_(2))\r
216                 {\r
217                         get_obj_num_hook = kind_is_potion;\r
218                         place_object(yval, xval - 1, AM_NO_FIXED_ART);\r
219                         get_obj_num_hook = kind_is_potion;\r
220                         place_object(yval, xval + 1, AM_NO_FIXED_ART);\r
221                 }\r
222                 else\r
223                 {\r
224                         get_obj_num_hook = kind_is_potion;\r
225                         place_object(yval - 1, xval, AM_NO_FIXED_ART);\r
226                         get_obj_num_hook = kind_is_potion;\r
227                         place_object(yval + 1, xval, AM_NO_FIXED_ART);\r
228                 }\r
229 \r
230                 for (y = yval - 2; y <= yval + 2; y++)\r
231                         for (x = xval - 2; x <= xval + 2; x++)\r
232                                 cave[y][x].info |= (CAVE_ICKY);\r
233 \r
234         }\r
235         break;\r
236         }\r
237 \r
238         msg_print_wizard(CHEAT_DUNGEON, _("ガラスの部屋が生成されました。", "Glass room was generated."));\r
239 \r
240         return TRUE;\r
241 }\r