OSDN Git Service

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