OSDN Git Service

[Refactor] #37353 型の置換(C_MAKE)。 / Type replacement(C_MAKE).
[hengband/hengband.git] / src / rooms-vault.c
1 #include "angband.h"\r
2 #include "generate.h"\r
3 #include "grid.h"\r
4 #include "rooms.h"\r
5 #include "store.h"\r
6 #include "trap.h"\r
7 \r
8 /*\r
9 * This function creates a random vault that looks like a collection of bubbles.\r
10 * It works by getting a set of coordinates that represent the center of each\r
11 * bubble.  The entire room is made by seeing which bubble center is closest. If\r
12 * two centers are equidistant then the square is a wall, otherwise it is a floor.\r
13 * The only exception is for squares really near a center, these are always floor.\r
14 * (It looks better than without this check.)\r
15 *\r
16 * Note: If two centers are on the same point then this algorithm will create a\r
17 *       blank bubble filled with walls. - This is prevented from happening.\r
18 */\r
19 static void build_bubble_vault(POSITION x0, POSITION y0, POSITION xsize, POSITION ysize)\r
20 {\r
21 #define BUBBLENUM 10            /* number of bubbles */\r
22 \r
23         /* array of center points of bubbles */\r
24         coord center[BUBBLENUM];\r
25 \r
26         int i, j;\r
27         POSITION x = 0, y = 0;\r
28         u16b min1, min2, temp;\r
29         bool done;\r
30 \r
31         /* Offset from center to top left hand corner */\r
32         POSITION xhsize = xsize / 2;\r
33         POSITION yhsize = ysize / 2;\r
34 \r
35         msg_print_wizard(CHEAT_DUNGEON, _("泡型ランダムVaultを生成しました。", "Room Vault."));\r
36 \r
37         /* Allocate center of bubbles */\r
38         center[0].x = (byte)randint1(xsize - 3) + 1;\r
39         center[0].y = (byte)randint1(ysize - 3) + 1;\r
40 \r
41         for (i = 1; i < BUBBLENUM; i++)\r
42         {\r
43                 done = FALSE;\r
44 \r
45                 /* get center and check to see if it is unique */\r
46                 while (!done)\r
47                 {\r
48                         done = TRUE;\r
49 \r
50                         x = randint1(xsize - 3) + 1;\r
51                         y = randint1(ysize - 3) + 1;\r
52 \r
53                         for (j = 0; j < i; j++)\r
54                         {\r
55                                 /* rough test to see if there is an overlap */\r
56                                 if ((x == center[j].x) && (y == center[j].y)) done = FALSE;\r
57                         }\r
58                 }\r
59 \r
60                 center[i].x = x;\r
61                 center[i].y = y;\r
62         }\r
63 \r
64 \r
65         /* Top and bottom boundaries */\r
66         for (i = 0; i < xsize; i++)\r
67         {\r
68                 int side_x = x0 - xhsize + i;\r
69 \r
70                 place_outer_noperm_bold(y0 - yhsize + 0, side_x);\r
71                 cave[y0 - yhsize + 0][side_x].info |= (CAVE_ROOM | CAVE_ICKY);\r
72                 place_outer_noperm_bold(y0 - yhsize + ysize - 1, side_x);\r
73                 cave[y0 - yhsize + ysize - 1][side_x].info |= (CAVE_ROOM | CAVE_ICKY);\r
74         }\r
75 \r
76         /* Left and right boundaries */\r
77         for (i = 1; i < ysize - 1; i++)\r
78         {\r
79                 int side_y = y0 - yhsize + i;\r
80 \r
81                 place_outer_noperm_bold(side_y, x0 - xhsize + 0);\r
82                 cave[side_y][x0 - xhsize + 0].info |= (CAVE_ROOM | CAVE_ICKY);\r
83                 place_outer_noperm_bold(side_y, x0 - xhsize + xsize - 1);\r
84                 cave[side_y][x0 - xhsize + xsize - 1].info |= (CAVE_ROOM | CAVE_ICKY);\r
85         }\r
86 \r
87         /* Fill in middle with bubbles */\r
88         for (x = 1; x < xsize - 1; x++)\r
89         {\r
90                 for (y = 1; y < ysize - 1; y++)\r
91                 {\r
92                         /* Get distances to two closest centers */\r
93 \r
94                         min1 = (u16b)distance(x, y, center[0].x, center[0].y);\r
95                         min2 = (u16b)distance(x, y, center[1].x, center[1].y);\r
96 \r
97                         if (min1 > min2)\r
98                         {\r
99                                 /* swap if in wrong order */\r
100                                 temp = min1;\r
101                                 min1 = min2;\r
102                                 min2 = temp;\r
103                         }\r
104 \r
105                         /* Scan the rest */\r
106                         for (i = 2; i < BUBBLENUM; i++)\r
107                         {\r
108                                 temp = (u16b)distance(x, y, center[i].x, center[i].y);\r
109 \r
110                                 if (temp < min1)\r
111                                 {\r
112                                         /* smallest */\r
113                                         min2 = min1;\r
114                                         min1 = temp;\r
115                                 }\r
116                                 else if (temp < min2)\r
117                                 {\r
118                                         /* second smallest */\r
119                                         min2 = temp;\r
120                                 }\r
121                         }\r
122                         if (((min2 - min1) <= 2) && (!(min1 < 3)))\r
123                         {\r
124                                 /* Boundary at midpoint+ not at inner region of bubble */\r
125                                 place_outer_noperm_bold(y0 - yhsize + y, x0 - xhsize + x);\r
126                         }\r
127                         else\r
128                         {\r
129                                 /* middle of a bubble */\r
130                                 place_floor_bold(y0 - yhsize + y, x0 - xhsize + x);\r
131                         }\r
132 \r
133                         /* clean up rest of flags */\r
134                         cave[y0 - yhsize + y][x0 - xhsize + x].info |= (CAVE_ROOM | CAVE_ICKY);\r
135                 }\r
136         }\r
137 \r
138         /* Try to add some random doors */\r
139         for (i = 0; i < 500; i++)\r
140         {\r
141                 x = randint1(xsize - 3) - xhsize + x0 + 1;\r
142                 y = randint1(ysize - 3) - yhsize + y0 + 1;\r
143                 add_door(x, y);\r
144         }\r
145 \r
146         /* Fill with monsters and treasure, low difficulty */\r
147         fill_treasure(x0 - xhsize + 1, x0 - xhsize + xsize - 2, y0 - yhsize + 1, y0 - yhsize + ysize - 2, randint1(5));\r
148 }\r
149 \r
150 /* Create a random vault that looks like a collection of overlapping rooms */\r
151 static void build_room_vault(POSITION x0, POSITION y0, POSITION xsize, POSITION ysize)\r
152 {\r
153         POSITION x1, x2, y1, y2, xhsize, yhsize;\r
154         int i;\r
155 \r
156         /* get offset from center */\r
157         xhsize = xsize / 2;\r
158         yhsize = ysize / 2;\r
159 \r
160         msg_print_wizard(CHEAT_DUNGEON, _("部屋型ランダムVaultを生成しました。", "Room Vault."));\r
161 \r
162         /* fill area so don't get problems with arena levels */\r
163         for (x1 = 0; x1 < xsize; x1++)\r
164         {\r
165                 POSITION x = x0 - xhsize + x1;\r
166 \r
167                 for (y1 = 0; y1 < ysize; y1++)\r
168                 {\r
169                         POSITION y = y0 - yhsize + y1;\r
170 \r
171                         place_extra_bold(y, x);\r
172                         cave[y][x].info &= (~CAVE_ICKY);\r
173                 }\r
174         }\r
175 \r
176         /* add ten random rooms */\r
177         for (i = 0; i < 10; i++)\r
178         {\r
179                 x1 = randint1(xhsize) * 2 + x0 - xhsize;\r
180                 x2 = randint1(xhsize) * 2 + x0 - xhsize;\r
181                 y1 = randint1(yhsize) * 2 + y0 - yhsize;\r
182                 y2 = randint1(yhsize) * 2 + y0 - yhsize;\r
183                 build_room(x1, x2, y1, y2);\r
184         }\r
185 \r
186         /* Add some random doors */\r
187         for (i = 0; i < 500; i++)\r
188         {\r
189                 x1 = randint1(xsize - 3) - xhsize + x0 + 1;\r
190                 y1 = randint1(ysize - 3) - yhsize + y0 + 1;\r
191                 add_door(x1, y1);\r
192         }\r
193 \r
194         /* Fill with monsters and treasure, high difficulty */\r
195         fill_treasure(x0 - xhsize + 1, x0 - xhsize + xsize - 2, y0 - yhsize + 1, y0 - yhsize + ysize - 2, randint1(5) + 5);\r
196 }\r
197 \r
198 \r
199 /* Create a random vault out of a fractal cave */\r
200 static void build_cave_vault(POSITION x0, POSITION y0, POSITION xsiz, POSITION ysiz)\r
201 {\r
202         int grd, roug, cutoff;\r
203         bool done, light, room;\r
204         POSITION xhsize, yhsize, xsize, ysize, x, y;\r
205 \r
206         /* round to make sizes even */\r
207         xhsize = xsiz / 2;\r
208         yhsize = ysiz / 2;\r
209         xsize = xhsize * 2;\r
210         ysize = yhsize * 2;\r
211 \r
212         msg_print_wizard(CHEAT_DUNGEON, _("洞穴ランダムVaultを生成しました。", "Cave Vault."));\r
213 \r
214         light = done = FALSE;\r
215         room = TRUE;\r
216 \r
217         while (!done)\r
218         {\r
219                 /* testing values for these parameters feel free to adjust */\r
220                 grd = 1 << randint0(4);\r
221 \r
222                 /* want average of about 16 */\r
223                 roug = randint1(8) * randint1(4);\r
224 \r
225                 /* about size/2 */\r
226                 cutoff = randint1(xsize / 4) + randint1(ysize / 4) +\r
227                         randint1(xsize / 4) + randint1(ysize / 4);\r
228 \r
229                 /* make it */\r
230                 generate_hmap(y0, x0, xsize, ysize, grd, roug, cutoff);\r
231 \r
232                 /* Convert to normal format+ clean up */\r
233                 done = generate_fracave(y0, x0, xsize, ysize, cutoff, light, room);\r
234         }\r
235 \r
236         /* Set icky flag because is a vault */\r
237         for (x = 0; x <= xsize; x++)\r
238         {\r
239                 for (y = 0; y <= ysize; y++)\r
240                 {\r
241                         cave[y0 - yhsize + y][x0 - xhsize + x].info |= CAVE_ICKY;\r
242                 }\r
243         }\r
244 \r
245         /* Fill with monsters and treasure, low difficulty */\r
246         fill_treasure(x0 - xhsize + 1, x0 - xhsize + xsize - 1, y0 - yhsize + 1, y0 - yhsize + ysize - 1, randint1(5));\r
247 }\r
248 \r
249 \r
250 \r
251 /*!\r
252 * @brief Vault地形を回転、上下左右反転するための座標変換を返す / coordinate translation code\r
253 * @param x 変換したい点のX座標参照ポインタ\r
254 * @param y 変換したい点のY座標参照ポインタ\r
255 * @param xoffset Vault生成時の基準X座標\r
256 * @param yoffset Vault生成時の基準Y座標\r
257 * @param transno 処理ID\r
258 * @return なし\r
259 */\r
260 static void coord_trans(POSITION *x, POSITION *y, POSITION xoffset, POSITION yoffset, int transno)\r
261 {\r
262         int i;\r
263         int temp;\r
264 \r
265         /*\r
266         * transno specifies what transformation is required. (0-7)\r
267         * The lower two bits indicate by how much the vault is rotated,\r
268         * and the upper bit indicates a reflection.\r
269         * This is done by using rotation matrices... however since\r
270         * these are mostly zeros for rotations by 90 degrees this can\r
271         * be expressed simply in terms of swapping and inverting the\r
272         * x and y coordinates.\r
273         */\r
274         for (i = 0; i < transno % 4; i++)\r
275         {\r
276                 /* rotate by 90 degrees */\r
277                 temp = *x;\r
278                 *x = -(*y);\r
279                 *y = temp;\r
280         }\r
281 \r
282         if (transno / 4)\r
283         {\r
284                 /* Reflect depending on status of 3rd bit. */\r
285                 *x = -(*x);\r
286         }\r
287 \r
288         /* Add offsets so vault stays in the first quadrant */\r
289         *x += xoffset;\r
290         *y += yoffset;\r
291 }\r
292 \r
293 \r
294 /*!\r
295 * @brief Vaultをフロアに配置する / Hack -- fill in "vault" rooms\r
296 * @param yval 生成基準Y座標\r
297 * @param xval 生成基準X座標\r
298 * @param ymax VaultのYサイズ\r
299 * @param xmax VaultのXサイズ\r
300 * @param data Vaultのデータ文字列\r
301 * @param xoffset 変換基準X座標\r
302 * @param yoffset 変換基準Y座標\r
303 * @param transno 変換ID\r
304 * @return なし\r
305 */\r
306 static void build_vault(POSITION yval, POSITION xval, POSITION ymax, POSITION xmax, concptr data,\r
307         POSITION xoffset, POSITION yoffset, int transno)\r
308 {\r
309         POSITION dx, dy, x, y, i, j;\r
310         concptr t;\r
311         cave_type *c_ptr;\r
312 \r
313         /* Place dungeon features and objects */\r
314         for (t = data, dy = 0; dy < ymax; dy++)\r
315         {\r
316                 for (dx = 0; dx < xmax; dx++, t++)\r
317                 {\r
318                         /* prevent loop counter from being overwritten */\r
319                         i = dx;\r
320                         j = dy;\r
321 \r
322                         /* Flip / rotate */\r
323                         coord_trans(&i, &j, xoffset, yoffset, transno);\r
324 \r
325                         /* Extract the location */\r
326                         if (transno % 2 == 0)\r
327                         {\r
328                                 /* no swap of x/y */\r
329                                 x = xval - (xmax / 2) + i;\r
330                                 y = yval - (ymax / 2) + j;\r
331                         }\r
332                         else\r
333                         {\r
334                                 /* swap of x/y */\r
335                                 x = xval - (ymax / 2) + i;\r
336                                 y = yval - (xmax / 2) + j;\r
337                         }\r
338 \r
339                         /* Hack -- skip "non-grids" */\r
340                         if (*t == ' ') continue;\r
341                         c_ptr = &cave[y][x];\r
342 \r
343                         /* Lay down a floor */\r
344                         place_floor_grid(c_ptr);\r
345 \r
346                         /* Remove any mimic */\r
347                         c_ptr->mimic = 0;\r
348 \r
349                         /* Part of a vault */\r
350                         c_ptr->info |= (CAVE_ROOM | CAVE_ICKY);\r
351 \r
352                         /* Analyze the grid */\r
353                         switch (*t)\r
354                         {\r
355                                 /* Granite wall (outer) */\r
356                         case '%':\r
357                                 place_outer_noperm_grid(c_ptr);\r
358                                 break;\r
359 \r
360                                 /* Granite wall (inner) */\r
361                         case '#':\r
362                                 place_inner_grid(c_ptr);\r
363                                 break;\r
364 \r
365                                 /* Glass wall (inner) */\r
366                         case '$':\r
367                                 place_inner_grid(c_ptr);\r
368                                 c_ptr->feat = feat_glass_wall;\r
369                                 break;\r
370 \r
371                                 /* Permanent wall (inner) */\r
372                         case 'X':\r
373                                 place_inner_perm_grid(c_ptr);\r
374                                 break;\r
375 \r
376                                 /* Permanent glass wall (inner) */\r
377                         case 'Y':\r
378                                 place_inner_perm_grid(c_ptr);\r
379                                 c_ptr->feat = feat_permanent_glass_wall;\r
380                                 break;\r
381 \r
382                                 /* Treasure/trap */\r
383                         case '*':\r
384                                 if (randint0(100) < 75)\r
385                                 {\r
386                                         place_object(y, x, 0L);\r
387                                 }\r
388                                 else\r
389                                 {\r
390                                         place_trap(y, x);\r
391                                 }\r
392                                 break;\r
393 \r
394                                 /* Treasure */\r
395                         case '[':\r
396                                 place_object(y, x, 0L);\r
397                                 break;\r
398 \r
399                                 /* Tree */\r
400                         case ':':\r
401                                 c_ptr->feat = feat_tree;\r
402                                 break;\r
403 \r
404                                 /* Secret doors */\r
405                         case '+':\r
406                                 place_secret_door(y, x, DOOR_DEFAULT);\r
407                                 break;\r
408 \r
409                                 /* Secret glass doors */\r
410                         case '-':\r
411                                 place_secret_door(y, x, DOOR_GLASS_DOOR);\r
412                                 if (is_closed_door(c_ptr->feat)) c_ptr->mimic = feat_glass_wall;\r
413                                 break;\r
414 \r
415                                 /* Curtains */\r
416                         case '\'':\r
417                                 place_secret_door(y, x, DOOR_CURTAIN);\r
418                                 break;\r
419 \r
420                                 /* Trap */\r
421                         case '^':\r
422                                 place_trap(y, x);\r
423                                 break;\r
424 \r
425                                 /* Black market in a dungeon */\r
426                         case 'S':\r
427                                 set_cave_feat(y, x, feat_black_market);\r
428                                 store_init(NO_TOWN, STORE_BLACK);\r
429                                 break;\r
430 \r
431                                 /* The Pattern */\r
432                         case 'p':\r
433                                 set_cave_feat(y, x, feat_pattern_start);\r
434                                 break;\r
435 \r
436                         case 'a':\r
437                                 set_cave_feat(y, x, feat_pattern_1);\r
438                                 break;\r
439 \r
440                         case 'b':\r
441                                 set_cave_feat(y, x, feat_pattern_2);\r
442                                 break;\r
443 \r
444                         case 'c':\r
445                                 set_cave_feat(y, x, feat_pattern_3);\r
446                                 break;\r
447 \r
448                         case 'd':\r
449                                 set_cave_feat(y, x, feat_pattern_4);\r
450                                 break;\r
451 \r
452                         case 'P':\r
453                                 set_cave_feat(y, x, feat_pattern_end);\r
454                                 break;\r
455 \r
456                         case 'B':\r
457                                 set_cave_feat(y, x, feat_pattern_exit);\r
458                                 break;\r
459 \r
460                         case 'A':\r
461                                 /* Reward for Pattern walk */\r
462                                 object_level = base_level + 12;\r
463                                 place_object(y, x, AM_GOOD | AM_GREAT);\r
464                                 object_level = base_level;\r
465                                 break;\r
466 \r
467                         case '~':\r
468                                 set_cave_feat(y, x, feat_shallow_water);\r
469                                 break;\r
470 \r
471                         case '=':\r
472                                 set_cave_feat(y, x, feat_deep_water);\r
473                                 break;\r
474 \r
475                         case 'v':\r
476                                 set_cave_feat(y, x, feat_shallow_lava);\r
477                                 break;\r
478 \r
479                         case 'w':\r
480                                 set_cave_feat(y, x, feat_deep_lava);\r
481                                 break;\r
482 \r
483                         case 'f':\r
484                                 set_cave_feat(y, x, feat_shallow_acid_puddle);\r
485                                 break;\r
486 \r
487                         case 'F':\r
488                                 set_cave_feat(y, x, feat_deep_acid_puddle);\r
489                                 break;\r
490 \r
491                         case 'g':\r
492                                 set_cave_feat(y, x, feat_shallow_poisonous_puddle);\r
493                                 break;\r
494 \r
495                         case 'G':\r
496                                 set_cave_feat(y, x, feat_deep_poisonous_puddle);\r
497                                 break;\r
498 \r
499                         case 'h':\r
500                                 set_cave_feat(y, x, feat_cold_zone);\r
501                                 break;\r
502 \r
503                         case 'H':\r
504                                 set_cave_feat(y, x, feat_heavy_cold_zone);\r
505                                 break;\r
506 \r
507                         case 'i':\r
508                                 set_cave_feat(y, x, feat_electrical_zone);\r
509                                 break;\r
510 \r
511                         case 'I':\r
512                                 set_cave_feat(y, x, feat_heavy_electrical_zone);\r
513                                 break;\r
514 \r
515                         }\r
516                 }\r
517         }\r
518 \r
519 \r
520         /* Place dungeon monsters and objects */\r
521         for (t = data, dy = 0; dy < ymax; dy++)\r
522         {\r
523                 for (dx = 0; dx < xmax; dx++, t++)\r
524                 {\r
525                         /* prevent loop counter from being overwritten */\r
526                         i = dx;\r
527                         j = dy;\r
528 \r
529                         /* Flip / rotate */\r
530                         coord_trans(&i, &j, xoffset, yoffset, transno);\r
531 \r
532                         /* Extract the location */\r
533                         if (transno % 2 == 0)\r
534                         {\r
535                                 /* no swap of x/y */\r
536                                 x = xval - (xmax / 2) + i;\r
537                                 y = yval - (ymax / 2) + j;\r
538                         }\r
539                         else\r
540                         {\r
541                                 /* swap of x/y */\r
542                                 x = xval - (ymax / 2) + i;\r
543                                 y = yval - (xmax / 2) + j;\r
544                         }\r
545 \r
546                         /* Hack -- skip "non-grids" */\r
547                         if (*t == ' ') continue;\r
548 \r
549                         /* Analyze the symbol */\r
550                         switch (*t)\r
551                         {\r
552                                 /* Monster */\r
553                         case '&':\r
554                         {\r
555                                 monster_level = base_level + 5;\r
556                                 place_monster(y, x, (PM_ALLOW_SLEEP | PM_ALLOW_GROUP));\r
557                                 monster_level = base_level;\r
558                                 break;\r
559                         }\r
560 \r
561                         /* Meaner monster */\r
562                         case '@':\r
563                         {\r
564                                 monster_level = base_level + 11;\r
565                                 place_monster(y, x, (PM_ALLOW_SLEEP | PM_ALLOW_GROUP));\r
566                                 monster_level = base_level;\r
567                                 break;\r
568                         }\r
569 \r
570                         /* Meaner monster, plus treasure */\r
571                         case '9':\r
572                         {\r
573                                 monster_level = base_level + 9;\r
574                                 place_monster(y, x, PM_ALLOW_SLEEP);\r
575                                 monster_level = base_level;\r
576                                 object_level = base_level + 7;\r
577                                 place_object(y, x, AM_GOOD);\r
578                                 object_level = base_level;\r
579                                 break;\r
580                         }\r
581 \r
582                         /* Nasty monster and treasure */\r
583                         case '8':\r
584                         {\r
585                                 monster_level = base_level + 40;\r
586                                 place_monster(y, x, PM_ALLOW_SLEEP);\r
587                                 monster_level = base_level;\r
588                                 object_level = base_level + 20;\r
589                                 place_object(y, x, AM_GOOD | AM_GREAT);\r
590                                 object_level = base_level;\r
591                                 break;\r
592                         }\r
593 \r
594                         /* Monster and/or object */\r
595                         case ',':\r
596                         {\r
597                                 if (randint0(100) < 50)\r
598                                 {\r
599                                         monster_level = base_level + 3;\r
600                                         place_monster(y, x, (PM_ALLOW_SLEEP | PM_ALLOW_GROUP));\r
601                                         monster_level = base_level;\r
602                                 }\r
603                                 if (randint0(100) < 50)\r
604                                 {\r
605                                         object_level = base_level + 7;\r
606                                         place_object(y, x, 0L);\r
607                                         object_level = base_level;\r
608                                 }\r
609                                 break;\r
610                         }\r
611 \r
612                         }\r
613                 }\r
614         }\r
615 }\r
616 \r
617 \r
618 \r
619 /*!\r
620 * @brief タイプ7の部屋…v_info.txtより小型vaultを生成する / Type 7 -- simple vaults (see "v_info.txt")\r
621 * @return なし\r
622 */\r
623 bool build_type7(void)\r
624 {\r
625         vault_type *v_ptr = NULL;\r
626         int dummy;\r
627         POSITION x, y;\r
628         POSITION xval, yval;\r
629         POSITION xoffset, yoffset;\r
630         int transno;\r
631 \r
632         /* Pick a lesser vault */\r
633         for (dummy = 0; dummy < SAFE_MAX_ATTEMPTS; dummy++)\r
634         {\r
635                 /* Access a random vault record */\r
636                 v_ptr = &v_info[randint0(max_v_idx)];\r
637 \r
638                 /* Accept the first lesser vault */\r
639                 if (v_ptr->typ == 7) break;\r
640         }\r
641 \r
642         /* No lesser vault found */\r
643         if (dummy >= SAFE_MAX_ATTEMPTS)\r
644         {\r
645                 msg_print_wizard(CHEAT_DUNGEON, _("小型固定Vaultを配置できませんでした。", "Could not place lesser vault."));\r
646                 return FALSE;\r
647         }\r
648 \r
649         /* pick type of transformation (0-7) */\r
650         transno = randint0(8);\r
651 \r
652         /* calculate offsets */\r
653         x = v_ptr->wid;\r
654         y = v_ptr->hgt;\r
655 \r
656         /* Some huge vault cannot be ratated to fit in the dungeon */\r
657         if (x + 2 > cur_hgt - 2)\r
658         {\r
659                 /* Forbid 90 or 270 degree ratation */\r
660                 transno &= ~1;\r
661         }\r
662 \r
663         coord_trans(&x, &y, 0, 0, transno);\r
664 \r
665         if (x < 0)\r
666         {\r
667                 xoffset = -x - 1;\r
668         }\r
669         else\r
670         {\r
671                 xoffset = 0;\r
672         }\r
673 \r
674         if (y < 0)\r
675         {\r
676                 yoffset = -y - 1;\r
677         }\r
678         else\r
679         {\r
680                 yoffset = 0;\r
681         }\r
682 \r
683         /* Find and reserve some space in the dungeon.  Get center of room. */\r
684         if (!find_space(&yval, &xval, abs(y), abs(x))) return FALSE;\r
685 \r
686 #ifdef FORCE_V_IDX\r
687         v_ptr = &v_info[2];\r
688 #endif\r
689 \r
690         msg_format_wizard(CHEAT_DUNGEON, _("小型Vault(%s)を生成しました。", "Lesser vault (%s)."), v_name + v_ptr->name);\r
691 \r
692         /* Hack -- Build the vault */\r
693         build_vault(yval, xval, v_ptr->hgt, v_ptr->wid,\r
694                 v_text + v_ptr->text, xoffset, yoffset, transno);\r
695 \r
696         return TRUE;\r
697 }\r
698 \r
699 /*!\r
700 * @brief タイプ8の部屋…v_info.txtより大型vaultを生成する / Type 8 -- greater vaults (see "v_info.txt")\r
701 * @return なし\r
702 */\r
703 bool build_type8(void)\r
704 {\r
705         vault_type *v_ptr;\r
706         int dummy;\r
707         POSITION xval, yval;\r
708         POSITION x, y;\r
709         int transno;\r
710         POSITION xoffset, yoffset;\r
711 \r
712         /* Pick a greater vault */\r
713         for (dummy = 0; dummy < SAFE_MAX_ATTEMPTS; dummy++)\r
714         {\r
715                 /* Access a random vault record */\r
716                 v_ptr = &v_info[randint0(max_v_idx)];\r
717 \r
718                 /* Accept the first greater vault */\r
719                 if (v_ptr->typ == 8) break;\r
720         }\r
721 \r
722         /* No greater vault found */\r
723         if (dummy >= SAFE_MAX_ATTEMPTS)\r
724         {\r
725                 msg_print_wizard(CHEAT_DUNGEON, _("大型固定Vaultを配置できませんでした。", "Could not place greater vault."));\r
726                 return FALSE;\r
727         }\r
728 \r
729         /* pick type of transformation (0-7) */\r
730         transno = randint0(8);\r
731 \r
732         /* calculate offsets */\r
733         x = v_ptr->wid;\r
734         y = v_ptr->hgt;\r
735 \r
736         /* Some huge vault cannot be ratated to fit in the dungeon */\r
737         if (x + 2 > cur_hgt - 2)\r
738         {\r
739                 /* Forbid 90 or 270 degree ratation */\r
740                 transno &= ~1;\r
741         }\r
742 \r
743         coord_trans(&x, &y, 0, 0, transno);\r
744 \r
745         if (x < 0)\r
746         {\r
747                 xoffset = -x - 1;\r
748         }\r
749         else\r
750         {\r
751                 xoffset = 0;\r
752         }\r
753 \r
754         if (y < 0)\r
755         {\r
756                 yoffset = -y - 1;\r
757         }\r
758         else\r
759         {\r
760                 yoffset = 0;\r
761         }\r
762 \r
763         /*\r
764         * Try to allocate space for room.  If fails, exit\r
765         *\r
766         * Hack -- Prepare a bit larger space (+2, +2) to\r
767         * prevent generation of vaults with no-entrance.\r
768         */\r
769         /* Find and reserve some space in the dungeon.  Get center of room. */\r
770         if (!find_space(&yval, &xval, (POSITION)(abs(y) + 2), (POSITION)(abs(x) + 2))) return FALSE;\r
771 \r
772 #ifdef FORCE_V_IDX\r
773         v_ptr = &v_info[76 + randint1(3)];\r
774 #endif\r
775 \r
776         msg_format_wizard(CHEAT_DUNGEON, _("大型固定Vault(%s)を生成しました。", "Greater vault (%s)."), v_name + v_ptr->name);\r
777 \r
778         /* Hack -- Build the vault */\r
779         build_vault(yval, xval, v_ptr->hgt, v_ptr->wid,\r
780                 v_text + v_ptr->text, xoffset, yoffset, transno);\r
781 \r
782         return TRUE;\r
783 }\r
784 \r
785 \r
786 /*\r
787 * Build target vault.\r
788 * This is made by two concentric "crypts" with perpendicular\r
789 * walls creating the cross-hairs.\r
790 */\r
791 static void build_target_vault(POSITION x0, POSITION y0, POSITION xsize, POSITION ysize)\r
792 {\r
793         POSITION rad, x, y;\r
794 \r
795         /* Make a random metric */\r
796         POSITION h1, h2, h3, h4;\r
797         h1 = randint1(32) - 16;\r
798         h2 = randint1(16);\r
799         h3 = randint1(32);\r
800         h4 = randint1(32) - 16;\r
801 \r
802         msg_print_wizard(CHEAT_DUNGEON, _("対称形ランダムVaultを生成しました。", "Elemental Vault"));\r
803 \r
804         /* work out outer radius */\r
805         if (xsize > ysize)\r
806         {\r
807                 rad = ysize / 2;\r
808         }\r
809         else\r
810         {\r
811                 rad = xsize / 2;\r
812         }\r
813 \r
814         /* Make floor */\r
815         for (x = x0 - rad; x <= x0 + rad; x++)\r
816         {\r
817                 for (y = y0 - rad; y <= y0 + rad; y++)\r
818                 {\r
819                         /* clear room flag */\r
820                         cave[y][x].info &= ~(CAVE_ROOM);\r
821 \r
822                         /* Vault - so is "icky" */\r
823                         cave[y][x].info |= CAVE_ICKY;\r
824 \r
825                         if (dist2(y0, x0, y, x, h1, h2, h3, h4) <= rad - 1)\r
826                         {\r
827                                 /* inside- so is floor */\r
828                                 place_floor_bold(y, x);\r
829                         }\r
830                         else\r
831                         {\r
832                                 /* make granite outside so arena works */\r
833                                 place_extra_bold(y, x);\r
834                         }\r
835 \r
836                         /* proper boundary for arena */\r
837                         if (((y + rad) == y0) || ((y - rad) == y0) ||\r
838                                 ((x + rad) == x0) || ((x - rad) == x0))\r
839                         {\r
840                                 place_extra_bold(y, x);\r
841                         }\r
842                 }\r
843         }\r
844 \r
845         /* Find visible outer walls and set to be FEAT_OUTER */\r
846         add_outer_wall(x0, y0, FALSE, x0 - rad - 1, y0 - rad - 1,\r
847                 x0 + rad + 1, y0 + rad + 1);\r
848 \r
849         /* Add inner wall */\r
850         for (x = x0 - rad / 2; x <= x0 + rad / 2; x++)\r
851         {\r
852                 for (y = y0 - rad / 2; y <= y0 + rad / 2; y++)\r
853                 {\r
854                         if (dist2(y0, x0, y, x, h1, h2, h3, h4) == rad / 2)\r
855                         {\r
856                                 /* Make an internal wall */\r
857                                 place_inner_bold(y, x);\r
858                         }\r
859                 }\r
860         }\r
861 \r
862         /* Add perpendicular walls */\r
863         for (x = x0 - rad; x <= x0 + rad; x++)\r
864         {\r
865                 place_inner_bold(y0, x);\r
866         }\r
867 \r
868         for (y = y0 - rad; y <= y0 + rad; y++)\r
869         {\r
870                 place_inner_bold(y, x0);\r
871         }\r
872 \r
873         /* Make inner vault */\r
874         for (y = y0 - 1; y <= y0 + 1; y++)\r
875         {\r
876                 place_inner_bold(y, x0 - 1);\r
877                 place_inner_bold(y, x0 + 1);\r
878         }\r
879         for (x = x0 - 1; x <= x0 + 1; x++)\r
880         {\r
881                 place_inner_bold(y0 - 1, x);\r
882                 place_inner_bold(y0 + 1, x);\r
883         }\r
884 \r
885         place_floor_bold(y0, x0);\r
886 \r
887 \r
888         /* Add doors to vault */\r
889         /* get two distances so can place doors relative to centre */\r
890         x = (rad - 2) / 4 + 1;\r
891         y = rad / 2 + x;\r
892 \r
893         add_door(x0 + x, y0);\r
894         add_door(x0 + y, y0);\r
895         add_door(x0 - x, y0);\r
896         add_door(x0 - y, y0);\r
897         add_door(x0, y0 + x);\r
898         add_door(x0, y0 + y);\r
899         add_door(x0, y0 - x);\r
900         add_door(x0, y0 - y);\r
901 \r
902         /* Fill with stuff - medium difficulty */\r
903         fill_treasure(x0 - rad, x0 + rad, y0 - rad, y0 + rad, randint1(3) + 3);\r
904 }\r
905 \r
906 \r
907 #ifdef ALLOW_CAVERNS_AND_LAKES\r
908 /*\r
909 * This routine uses a modified version of the lake code to make a\r
910 * distribution of some terrain type over the vault.  This type\r
911 * depends on the dungeon depth.\r
912 *\r
913 * Miniture rooms are then scattered across the vault.\r
914 */\r
915 static void build_elemental_vault(POSITION x0, POSITION y0, POSITION xsiz, POSITION ysiz)\r
916 {\r
917         int grd, roug;\r
918         int c1, c2, c3;\r
919         bool done = FALSE;\r
920         POSITION xsize, ysize, xhsize, yhsize, x, y;\r
921         int i;\r
922         int type;\r
923 \r
924         msg_print_wizard(CHEAT_DUNGEON, _("精霊界ランダムVaultを生成しました。", "Elemental Vault"));\r
925 \r
926         /* round to make sizes even */\r
927         xhsize = xsiz / 2;\r
928         yhsize = ysiz / 2;\r
929         xsize = xhsize * 2;\r
930         ysize = yhsize * 2;\r
931 \r
932         if (dun_level < 25)\r
933         {\r
934                 /* Earth vault  (Rubble) */\r
935                 type = LAKE_T_EARTH_VAULT;\r
936         }\r
937         else if (dun_level < 50)\r
938         {\r
939                 /* Air vault (Trees) */\r
940                 type = LAKE_T_AIR_VAULT;\r
941         }\r
942         else if (dun_level < 75)\r
943         {\r
944                 /* Water vault (shallow water) */\r
945                 type = LAKE_T_WATER_VAULT;\r
946         }\r
947         else\r
948         {\r
949                 /* Fire vault (shallow lava) */\r
950                 type = LAKE_T_FIRE_VAULT;\r
951         }\r
952 \r
953         while (!done)\r
954         {\r
955                 /* testing values for these parameters: feel free to adjust */\r
956                 grd = 1 << (randint0(3));\r
957 \r
958                 /* want average of about 16 */\r
959                 roug = randint1(8) * randint1(4);\r
960 \r
961                 /* Make up size of various componants */\r
962                 /* Floor */\r
963                 c3 = 2 * xsize / 3;\r
964 \r
965                 /* Deep water/lava */\r
966                 c1 = randint0(c3 / 2) + randint0(c3 / 2) - 5;\r
967 \r
968                 /* Shallow boundary */\r
969                 c2 = (c1 + c3) / 2;\r
970 \r
971                 /* make it */\r
972                 generate_hmap(y0, x0, xsize, ysize, grd, roug, c3);\r
973 \r
974                 /* Convert to normal format+ clean up */\r
975                 done = generate_lake(y0, x0, xsize, ysize, c1, c2, c3, type);\r
976         }\r
977 \r
978         /* Set icky flag because is a vault */\r
979         for (x = 0; x <= xsize; x++)\r
980         {\r
981                 for (y = 0; y <= ysize; y++)\r
982                 {\r
983                         cave[y0 - yhsize + y][x0 - xhsize + x].info |= CAVE_ICKY;\r
984                 }\r
985         }\r
986 \r
987         /* make a few rooms in the vault */\r
988         for (i = 1; i <= (xsize * ysize) / 50; i++)\r
989         {\r
990                 build_small_room(x0 + randint0(xsize - 4) - xsize / 2 + 2,\r
991                         y0 + randint0(ysize - 4) - ysize / 2 + 2);\r
992         }\r
993 \r
994         /* Fill with monsters and treasure, low difficulty */\r
995         fill_treasure(x0 - xhsize + 1, x0 - xhsize + xsize - 1,\r
996                 y0 - yhsize + 1, y0 - yhsize + ysize - 1, randint1(5));\r
997 }\r
998 #endif /* ALLOW_CAVERNS_AND_LAKES */\r
999 \r
1000 \r
1001 /* Build a "mini" checkerboard vault\r
1002 *\r
1003 * This is done by making a permanent wall maze and setting\r
1004 * the diagonal sqaures of the checker board to be granite.\r
1005 * The vault has two entrances on opposite sides to guarantee\r
1006 * a way to get in even if the vault abuts a side of the dungeon.\r
1007 */\r
1008 static void build_mini_c_vault(POSITION x0, POSITION y0, POSITION xsize, POSITION ysize)\r
1009 {\r
1010         POSITION dy, dx;\r
1011         POSITION y1, x1, y2, x2, y, x, total;\r
1012         int m, n, num_vertices;\r
1013         int *visited;\r
1014 \r
1015         msg_print_wizard(CHEAT_DUNGEON, _("小型チェッカーランダムVaultを生成しました。", "Mini Checker Board Vault."));\r
1016 \r
1017         /* Pick a random room size */\r
1018         dy = ysize / 2 - 1;\r
1019         dx = xsize / 2 - 1;\r
1020 \r
1021         y1 = y0 - dy;\r
1022         x1 = x0 - dx;\r
1023         y2 = y0 + dy;\r
1024         x2 = x0 + dx;\r
1025 \r
1026 \r
1027         /* generate the room */\r
1028         for (x = x1 - 2; x <= x2 + 2; x++)\r
1029         {\r
1030                 if (!in_bounds(y1 - 2, x)) break;\r
1031 \r
1032                 cave[y1 - 2][x].info |= (CAVE_ROOM | CAVE_ICKY);\r
1033 \r
1034                 place_outer_noperm_bold(y1 - 2, x);\r
1035         }\r
1036 \r
1037         for (x = x1 - 2; x <= x2 + 2; x++)\r
1038         {\r
1039                 if (!in_bounds(y2 + 2, x)) break;\r
1040 \r
1041                 cave[y2 + 2][x].info |= (CAVE_ROOM | CAVE_ICKY);\r
1042 \r
1043                 place_outer_noperm_bold(y2 + 2, x);\r
1044         }\r
1045 \r
1046         for (y = y1 - 2; y <= y2 + 2; y++)\r
1047         {\r
1048                 if (!in_bounds(y, x1 - 2)) break;\r
1049 \r
1050                 cave[y][x1 - 2].info |= (CAVE_ROOM | CAVE_ICKY);\r
1051 \r
1052                 place_outer_noperm_bold(y, x1 - 2);\r
1053         }\r
1054 \r
1055         for (y = y1 - 2; y <= y2 + 2; y++)\r
1056         {\r
1057                 if (!in_bounds(y, x2 + 2)) break;\r
1058 \r
1059                 cave[y][x2 + 2].info |= (CAVE_ROOM | CAVE_ICKY);\r
1060 \r
1061                 place_outer_noperm_bold(y, x2 + 2);\r
1062         }\r
1063 \r
1064         for (y = y1 - 1; y <= y2 + 1; y++)\r
1065         {\r
1066                 for (x = x1 - 1; x <= x2 + 1; x++)\r
1067                 {\r
1068                         cave_type *c_ptr = &cave[y][x];\r
1069 \r
1070                         c_ptr->info |= (CAVE_ROOM | CAVE_ICKY);\r
1071 \r
1072                         /* Permanent walls */\r
1073                         place_inner_perm_grid(c_ptr);\r
1074                 }\r
1075         }\r
1076 \r
1077 \r
1078         /* dimensions of vertex array */\r
1079         m = dx + 1;\r
1080         n = dy + 1;\r
1081         num_vertices = m * n;\r
1082 \r
1083         /* initialize array of visited vertices */\r
1084         C_MAKE(visited, num_vertices, int);\r
1085 \r
1086         /* traverse the graph to create a spannng tree, pick a random root */\r
1087         r_visit(y1, x1, y2, x2, randint0(num_vertices), 0, visited);\r
1088 \r
1089         /* Make it look like a checker board vault */\r
1090         for (x = x1; x <= x2; x++)\r
1091         {\r
1092                 for (y = y1; y <= y2; y++)\r
1093                 {\r
1094                         total = x - x1 + y - y1;\r
1095                         /* If total is odd- and is a floor then make a wall */\r
1096                         if ((total % 2 == 1) && is_floor_bold(y, x))\r
1097                         {\r
1098                                 place_inner_bold(y, x);\r
1099                         }\r
1100                 }\r
1101         }\r
1102 \r
1103         /* Make a couple of entrances */\r
1104         if (one_in_(2))\r
1105         {\r
1106                 /* left and right */\r
1107                 y = randint1(dy) + dy / 2;\r
1108                 place_inner_bold(y1 + y, x1 - 1);\r
1109                 place_inner_bold(y1 + y, x2 + 1);\r
1110         }\r
1111         else\r
1112         {\r
1113                 /* top and bottom */\r
1114                 x = randint1(dx) + dx / 2;\r
1115                 place_inner_bold(y1 - 1, x1 + x);\r
1116                 place_inner_bold(y2 + 1, x1 + x);\r
1117         }\r
1118 \r
1119         /* Fill with monsters and treasure, highest difficulty */\r
1120         fill_treasure(x1, x2, y1, y2, 10);\r
1121 \r
1122         C_KILL(visited, num_vertices, int);\r
1123 }\r
1124 \r
1125 /* Build a castle */\r
1126 /* Driver routine: clear the region and call the recursive\r
1127 * room routine.\r
1128 *\r
1129 *This makes a vault that looks like a castle/ city in the dungeon.\r
1130 */\r
1131 static void build_castle_vault(POSITION x0, POSITION y0, POSITION xsize, POSITION ysize)\r
1132 {\r
1133         POSITION dy, dx;\r
1134         POSITION y1, x1, y2, x2;\r
1135         POSITION y, x;\r
1136 \r
1137         /* Pick a random room size */\r
1138         dy = ysize / 2 - 1;\r
1139         dx = xsize / 2 - 1;\r
1140 \r
1141         y1 = y0 - dy;\r
1142         x1 = x0 - dx;\r
1143         y2 = y0 + dy;\r
1144         x2 = x0 + dx;\r
1145 \r
1146         msg_print_wizard(CHEAT_DUNGEON, _("城型ランダムVaultを生成しました。", "Castle Vault"));\r
1147 \r
1148         /* generate the room */\r
1149         for (y = y1 - 1; y <= y2 + 1; y++)\r
1150         {\r
1151                 for (x = x1 - 1; x <= x2 + 1; x++)\r
1152                 {\r
1153                         cave[y][x].info |= (CAVE_ROOM | CAVE_ICKY);\r
1154                         /* Make everything a floor */\r
1155                         place_floor_bold(y, x);\r
1156                 }\r
1157         }\r
1158 \r
1159         /* Make the castle */\r
1160         build_recursive_room(x1, y1, x2, y2, randint1(5));\r
1161 \r
1162         /* Fill with monsters and treasure, low difficulty */\r
1163         fill_treasure(x1, x2, y1, y2, randint1(3));\r
1164 }\r
1165 \r
1166 \r
1167 \r
1168 /*!\r
1169 * @brief タイプ10の部屋…ランダム生成vault / Type 10 -- Random vaults\r
1170 * @return なし\r
1171 */\r
1172 bool build_type10(void)\r
1173 {\r
1174         POSITION y0, x0, xsize, ysize, vtype;\r
1175 \r
1176         /* big enough to look good, small enough to be fairly common. */\r
1177         xsize = randint1(22) + 22;\r
1178         ysize = randint1(11) + 11;\r
1179 \r
1180         /* Find and reserve some space in the dungeon.  Get center of room. */\r
1181         if (!find_space(&y0, &x0, ysize + 1, xsize + 1)) return FALSE;\r
1182 \r
1183         /* Select type of vault */\r
1184 #ifdef ALLOW_CAVERNS_AND_LAKES\r
1185         do\r
1186         {\r
1187                 vtype = randint1(15);\r
1188         } while ((d_info[dungeon_type].flags1 & DF1_NO_CAVE) &&\r
1189                 ((vtype == 1) || (vtype == 3) || (vtype == 8) || (vtype == 9) || (vtype == 11)));\r
1190 #else /* ALLOW_CAVERNS_AND_LAKES */\r
1191         do\r
1192         {\r
1193                 vtype = randint1(7);\r
1194         } while ((d_info[dungeon_type].flags1 & DF1_NO_CAVE) &&\r
1195                 ((vtype == 1) || (vtype == 3)));\r
1196 #endif /* ALLOW_CAVERNS_AND_LAKES */\r
1197 \r
1198         switch (vtype)\r
1199         {\r
1200                 /* Build an appropriate room */\r
1201         case 1: case  9: build_bubble_vault(x0, y0, xsize, ysize); break;\r
1202         case 2: case 10: build_room_vault(x0, y0, xsize, ysize); break;\r
1203         case 3: case 11: build_cave_vault(x0, y0, xsize, ysize); break;\r
1204         case 4: case 12: build_maze_vault(x0, y0, xsize, ysize, TRUE); break;\r
1205         case 5: case 13: build_mini_c_vault(x0, y0, xsize, ysize); break;\r
1206         case 6: case 14: build_castle_vault(x0, y0, xsize, ysize); break;\r
1207         case 7: case 15: build_target_vault(x0, y0, xsize, ysize); break;\r
1208 #ifdef ALLOW_CAVERNS_AND_LAKES\r
1209         case 8: build_elemental_vault(x0, y0, xsize, ysize); break;\r
1210 #endif /* ALLOW_CAVERNS_AND_LAKES */\r
1211                 /* I know how to add a few more... give me some time. */\r
1212 \r
1213                 /* Paranoia */\r
1214         default: return FALSE;\r
1215         }\r
1216 \r
1217         return TRUE;\r
1218 }\r
1219 \r
1220 \r
1221 /*!\r
1222 * @brief タイプ17の部屋…v_info.txtより固定特殊部屋を生成する / Type 17 -- fixed special room (see "v_info.txt")\r
1223 * @return なし\r
1224 */\r
1225 bool build_type17(void)\r
1226 {\r
1227         vault_type *v_ptr = NULL;\r
1228         int dummy;\r
1229         POSITION x, y;\r
1230         POSITION xval, yval;\r
1231         POSITION xoffset, yoffset;\r
1232         int transno;\r
1233 \r
1234         /* Pick a lesser vault */\r
1235         for (dummy = 0; dummy < SAFE_MAX_ATTEMPTS; dummy++)\r
1236         {\r
1237                 /* Access a random vault record */\r
1238                 v_ptr = &v_info[randint0(max_v_idx)];\r
1239 \r
1240                 /* Accept the special fix room. */\r
1241                 if (v_ptr->typ == 17) break;\r
1242         }\r
1243 \r
1244         /* No lesser vault found */\r
1245         if (dummy >= SAFE_MAX_ATTEMPTS)\r
1246         {\r
1247                 msg_print_wizard(CHEAT_DUNGEON, _("固定特殊部屋を配置できませんでした。", "Could not place fixed special room."));\r
1248                 return FALSE;\r
1249         }\r
1250 \r
1251         /* pick type of transformation (0-7) */\r
1252         transno = randint0(8);\r
1253 \r
1254         /* calculate offsets */\r
1255         x = v_ptr->wid;\r
1256         y = v_ptr->hgt;\r
1257 \r
1258         /* Some huge vault cannot be ratated to fit in the dungeon */\r
1259         if (x + 2 > cur_hgt - 2)\r
1260         {\r
1261                 /* Forbid 90 or 270 degree ratation */\r
1262                 transno &= ~1;\r
1263         }\r
1264 \r
1265         coord_trans(&x, &y, 0, 0, transno);\r
1266 \r
1267         if (x < 0)\r
1268         {\r
1269                 xoffset = -x - 1;\r
1270         }\r
1271         else\r
1272         {\r
1273                 xoffset = 0;\r
1274         }\r
1275 \r
1276         if (y < 0)\r
1277         {\r
1278                 yoffset = -y - 1;\r
1279         }\r
1280         else\r
1281         {\r
1282                 yoffset = 0;\r
1283         }\r
1284 \r
1285         /* Find and reserve some space in the dungeon.  Get center of room. */\r
1286         if (!find_space(&yval, &xval, abs(y), abs(x))) return FALSE;\r
1287 \r
1288 #ifdef FORCE_V_IDX\r
1289         v_ptr = &v_info[2];\r
1290 #endif\r
1291 \r
1292         msg_format_wizard(CHEAT_DUNGEON, _("特殊固定部屋(%s)を生成しました。", "Special Fix room (%s)."), v_name + v_ptr->name);\r
1293 \r
1294         /* Hack -- Build the vault */\r
1295         build_vault(yval, xval, v_ptr->hgt, v_ptr->wid,\r
1296                 v_text + v_ptr->text, xoffset, yoffset, transno);\r
1297 \r
1298         return TRUE;\r
1299 }\r
1300 \r