OSDN Git Service

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