OSDN Git Service

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