ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/random_maps/treasure.C
(Generate patch)

Comparing deliantra/server/random_maps/treasure.C (file contents):
Revision 1.6 by root, Thu Sep 14 22:34:03 2006 UTC vs.
Revision 1.18 by pippijn, Mon Jan 15 21:06:19 2007 UTC

1/* 1/*
2 CrossFire, A Multiplayer game for X-windows 2 * CrossFire, A Multiplayer game for X-windows
3 3 *
4 * Copyright (C) 2005, 2006, 2007 Marc Lehmann & Crossfire+ Development Team
4 Copyright (C) 2001 Mark Wedel & Crossfire Development Team 5 * Copyright (C) 2001 Mark Wedel & Crossfire Development Team
5 Copyright (C) 1992 Frank Tore Johansen 6 * Copyright (C) 1992 Frank Tore Johansen
6 7 *
7 This program is free software; you can redistribute it and/or modify 8 * This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by 9 * it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or 10 * the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version. 11 * (at your option) any later version.
11 12 *
12 This program is distributed in the hope that it will be useful, 13 * This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details. 16 * GNU General Public License for more details.
16 17 *
17 You should have received a copy of the GNU General Public License 18 * You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software 19 * along with this program; if not, write to the Free Software
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 20 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 21 *
21 The authors can be reached via e-mail at <crossfire@schmorp.de> 22 * The authors can be reached via e-mail at <crossfire@schmorp.de>
22*/ 23 */
23 24
24/* placing treasure in maps, where appropriate. */ 25/* placing treasure in maps, where appropriate. */
25 26
26 27
27 28
49 * and doors but not monsters. 50 * and doors but not monsters.
50 * This function is not map tile aware. 51 * This function is not map tile aware.
51 */ 52 */
52 53
53int 54int
54wall_blocked (mapstruct *m, int x, int y) 55wall_blocked (maptile *m, int x, int y)
55{ 56{
56 int r; 57 int r;
57 58
58 if (OUT_OF_REAL_MAP (m, x, y)) 59 if (OUT_OF_REAL_MAP (m, x, y))
59 return 1; 60 return 1;
67treasure style (may be empty or NULL, or "none" to cause no treasure.) 68treasure style (may be empty or NULL, or "none" to cause no treasure.)
68treasureoptions (may be 0 for random choices or positive) 69treasureoptions (may be 0 for random choices or positive)
69*/ 70*/
70 71
71void 72void
72place_treasure (mapstruct *map, char **layout, char *treasure_style, int treasureoptions, RMParms * RP) 73place_treasure (maptile *map, char **layout, char *treasure_style, int treasureoptions, random_map_params *RP)
73{ 74{
74 char styledirname[256]; 75 char styledirname[1024];
75 char stylefilepath[256]; 76 char stylefilepath[1024];
76 mapstruct *style_map = 0; 77 maptile *style_map = 0;
77 int num_treasures; 78 int num_treasures;
78 79
79 /* bail out if treasure isn't wanted. */ 80 /* bail out if treasure isn't wanted. */
80 if (treasure_style) 81 if (treasure_style)
81 if (!strcmp (treasure_style, "none")) 82 if (!strcmp (treasure_style, "none"))
113 { 114 {
114 115
115 /* map_layout_style global, and is previously set */ 116 /* map_layout_style global, and is previously set */
116 switch (RP->map_layout_style) 117 switch (RP->map_layout_style)
117 { 118 {
118 case ONION_LAYOUT: 119 case LAYOUT_ONION:
119 case SPIRAL_LAYOUT: 120 case LAYOUT_SPIRAL:
120 case SQUARE_SPIRAL_LAYOUT: 121 case LAYOUT_SQUARE_SPIRAL:
121 { 122 {
122 int i, j; 123 int i, j;
123 124
124 /* search the onion for C's or '>', and put treasure there. */ 125 /* search the onion for C's or '>', and put treasure there. */
125 for (i = 0; i < RP->Xsize; i++) 126 for (i = 0; i < RP->Xsize; i++)
126 { 127 {
127 for (j = 0; j < RP->Ysize; j++) 128 for (j = 0; j < RP->Ysize; j++)
128 { 129 {
129 if (layout[i][j] == 'C' || layout[i][j] == '>') 130 if (layout[i][j] == 'C' || layout[i][j] == '>')
130 { 131 {
131 int tdiv = RP->symmetry_used; 132 int tdiv = RP->symmetry_used;
132 object **doorlist; 133 object **doorlist;
133 object *chest; 134 object *chest;
134 135
135 if (tdiv == 3) 136 if (tdiv == 3)
136 tdiv = 2; /* this symmetry uses a divisor of 2 */ 137 tdiv = 2; /* this symmetry uses a divisor of 2 */
137 /* don't put a chest on an exit. */ 138 /* don't put a chest on an exit. */
138 chest = place_chest (treasureoptions, i, j, map, style_map, num_treasures / tdiv, RP); 139 chest = place_chest (treasureoptions, i, j, map, style_map, num_treasures / tdiv, RP);
139 if (!chest) 140 if (!chest)
140 continue; /* if no chest was placed NEXT */ 141 continue; /* if no chest was placed NEXT */
141 if (treasureoptions & (DOORED | HIDDEN)) 142 if (treasureoptions & (DOORED | HIDDEN))
142 { 143 {
143 doorlist = find_doors_in_room (map, i, j, RP); 144 doorlist = find_doors_in_room (map, i, j, RP);
144 lock_and_hide_doors (doorlist, map, treasureoptions, RP); 145 lock_and_hide_doors (doorlist, map, treasureoptions, RP);
145 free (doorlist); 146 free (doorlist);
146 } 147 }
147 } 148 }
148 } 149 }
149 } 150 }
150 break; 151 break;
151 } 152 }
152 default: 153 default:
153 { 154 {
154 int i, j, tries; 155 int i, j, tries;
155 object *chest; 156 object *chest;
156 object **doorlist; 157 object **doorlist;
157 158
158 i = j = -1; 159 i = j = -1;
159 tries = 0; 160 tries = 0;
160 while (i == -1 && tries < 100) 161 while (i == -1 && tries < 100)
161 { 162 {
162 i = RANDOM () % (RP->Xsize - 2) + 1; 163 i = RANDOM () % (RP->Xsize - 2) + 1;
163 j = RANDOM () % (RP->Ysize - 2) + 1; 164 j = RANDOM () % (RP->Ysize - 2) + 1;
164 find_enclosed_spot (map, &i, &j, RP); 165 find_enclosed_spot (map, &i, &j, RP);
165 if (wall_blocked (map, i, j)) 166 if (wall_blocked (map, i, j))
166 i = -1; 167 i = -1;
167 tries++; 168 tries++;
168 } 169 }
169 chest = place_chest (treasureoptions, i, j, map, style_map, num_treasures, RP); 170 chest = place_chest (treasureoptions, i, j, map, style_map, num_treasures, RP);
170 if (!chest) 171 if (!chest)
171 return; 172 return;
172 i = chest->x; 173 i = chest->x;
173 j = chest->y; 174 j = chest->y;
174 if (treasureoptions & (DOORED | HIDDEN)) 175 if (treasureoptions & (DOORED | HIDDEN))
175 { 176 {
176 doorlist = surround_by_doors (map, layout, i, j, treasureoptions); 177 doorlist = surround_by_doors (map, layout, i, j, treasureoptions);
177 lock_and_hide_doors (doorlist, map, treasureoptions, RP); 178 lock_and_hide_doors (doorlist, map, treasureoptions, RP);
178 free (doorlist); 179 free (doorlist);
179 } 180 }
180 } 181 }
181 } 182 }
182 } 183 }
183 else 184 else
184 { /* DIFFUSE treasure layout */ 185 { /* DIFFUSE treasure layout */
185 int ti, i, j; 186 int ti, i, j;
191 place_chest (treasureoptions, i, j, map, style_map, 1, RP); 192 place_chest (treasureoptions, i, j, map, style_map, 1, RP);
192 } 193 }
193 } 194 }
194} 195}
195 196
196
197
198/* put a chest into the map, near x and y, with the treasure style 197/* put a chest into the map, near x and y, with the treasure style
199 determined (may be null, or may be a treasure list from lib/treasures, 198 determined (may be null, or may be a treasure list from lib/treasures,
200 if the global variable "treasurestyle" is set to that treasure list's name */ 199 if the global variable "treasurestyle" is set to that treasure list's name */
201 200
202object * 201object *
203place_chest (int treasureoptions, int x, int y, mapstruct *map, mapstruct *style_map, int n_treasures, RMParms * RP) 202place_chest (int treasureoptions, int x, int y, maptile *map, maptile *style_map, int n_treasures, random_map_params *RP)
204{ 203{
205 object *the_chest; 204 object *the_chest;
206 int i, xl, yl; 205 int i, xl, yl;
207 206
208 the_chest = get_archetype ("chest"); /* was "chest_2" */ 207 the_chest = get_archetype ("chest"); /* was "chest_2" */
209 208
210 /* first, find a place to put the chest. */ 209 /* first, find a place to put the chest. */
211 i = find_first_free_spot (the_chest, map, x, y); 210 i = find_first_free_spot (the_chest, map, x, y);
212 if (i == -1) 211 if (i == -1)
213 { 212 {
214 free_object (the_chest); 213 the_chest->destroy ();
215 return NULL; 214 return NULL;
216 } 215 }
216
217 xl = x + freearr_x[i]; 217 xl = x + freearr_x[i];
218 yl = y + freearr_y[i]; 218 yl = y + freearr_y[i];
219 219
220 /* if the placement is blocked, return a fail. */ 220 /* if the placement is blocked, return a fail. */
221 if (wall_blocked (map, xl, yl)) 221 if (wall_blocked (map, xl, yl))
222 return 0; 222 return 0;
223
224 223
225 /* put the treasures in the chest. */ 224 /* put the treasures in the chest. */
226 /* if(style_map) { */ 225 /* if(style_map) { */
227#if 0 /* don't use treasure style maps for now! */ 226#if 0 /* don't use treasure style maps for now! */
228 int ti; 227 int ti;
241 { /* use the style map */ 240 { /* use the style map */
242 the_chest->randomitems = tlist; 241 the_chest->randomitems = tlist;
243 the_chest->stats.hp = n_treasures; 242 the_chest->stats.hp = n_treasures;
244 } 243 }
245#endif 244#endif
246 else
247 { /* neither style_map no treasure list given */ 245 { /* neither style_map no treasure list given */
248 treasurelist *tlist = find_treasurelist ("chest"); 246 treasurelist *tlist = find_treasurelist ("chest");
249 247
250 the_chest->randomitems = tlist; 248 the_chest->randomitems = tlist;
251 the_chest->stats.hp = n_treasures; 249 the_chest->stats.hp = n_treasures;
252 } 250 }
253 251
254 /* stick a trap in the chest if required */ 252 /* stick a trap in the chest if required */
255 if (treasureoptions & TRAPPED) 253 if (treasureoptions & TRAPPED)
256 { 254 {
257 mapstruct *trap_map = find_style ("/styles/trapstyles", "traps", -1); 255 maptile *trap_map = find_style ("/styles/trapstyles", "traps", -1);
258 object *the_trap; 256 object *the_trap;
259 257
260 if (trap_map) 258 if (trap_map)
261 { 259 {
262 the_trap = pick_random_object (trap_map); 260 the_trap = pick_random_object (trap_map);
265 if (the_trap) 263 if (the_trap)
266 { 264 {
267 object *new_trap; 265 object *new_trap;
268 266
269 new_trap = arch_to_object (the_trap->arch); 267 new_trap = arch_to_object (the_trap->arch);
270 copy_object (new_trap, the_trap); 268 new_trap->copy_to (the_trap);
271 new_trap->x = x; 269 new_trap->x = x;
272 new_trap->y = y; 270 new_trap->y = y;
273 insert_ob_in_ob (new_trap, the_chest); 271 insert_ob_in_ob (new_trap, the_chest);
274 } 272 }
275 } 273 }
279 the lockcode. It's not worth bothering to lock the chest if 277 the lockcode. It's not worth bothering to lock the chest if
280 there's only 1 treasure.... */ 278 there's only 1 treasure.... */
281 279
282 if ((treasureoptions & KEYREQUIRED) && n_treasures > 1) 280 if ((treasureoptions & KEYREQUIRED) && n_treasures > 1)
283 { 281 {
284 char keybuf[256]; 282 char keybuf[1024];
285 283
286 sprintf (keybuf, "%d", (int) RANDOM ()); 284 sprintf (keybuf, "%d", (int) RANDOM ());
287 the_chest->slaying = keybuf; 285 the_chest->slaying = keybuf;
288 keyplace (map, x, y, keybuf, PASS_DOORS, 1, RP); 286 keyplace (map, x, y, keybuf, PASS_DOORS, 1, RP);
289 } 287 }
297 295
298 296
299/* finds the closest monster and returns him, regardless of doors 297/* finds the closest monster and returns him, regardless of doors
300 or walls */ 298 or walls */
301object * 299object *
302find_closest_monster (mapstruct *map, int x, int y, RMParms * RP) 300find_closest_monster (maptile *map, int x, int y, random_map_params *RP)
303{ 301{
304 int i; 302 int i;
305 303
306 for (i = 0; i < SIZEOFFREE; i++) 304 for (i = 0; i < SIZEOFFREE; i++)
307 { 305 {
312 /* boundscheck */ 310 /* boundscheck */
313 if (lx >= 0 && ly >= 0 && lx < RP->Xsize && ly < RP->Ysize) 311 if (lx >= 0 && ly >= 0 && lx < RP->Xsize && ly < RP->Ysize)
314 /* don't bother searching this square unless the map says life exists. */ 312 /* don't bother searching this square unless the map says life exists. */
315 if (GET_MAP_FLAGS (map, lx, ly) & P_IS_ALIVE) 313 if (GET_MAP_FLAGS (map, lx, ly) & P_IS_ALIVE)
316 { 314 {
317 object *the_monster = get_map_ob (map, lx, ly); 315 object *the_monster = GET_MAP_OB (map, lx, ly);
318 316
319 for (; the_monster != NULL && (!QUERY_FLAG (the_monster, FLAG_MONSTER)); the_monster = the_monster->above); 317 for (; the_monster != NULL && (!QUERY_FLAG (the_monster, FLAG_MONSTER)); the_monster = the_monster->above);
320 if (the_monster && QUERY_FLAG (the_monster, FLAG_MONSTER)) 318 if (the_monster && QUERY_FLAG (the_monster, FLAG_MONSTER))
321 return the_monster; 319 return the_monster;
322 } 320 }
336 The idea is that you call keyplace on x,y where a door is, and it'll make 334 The idea is that you call keyplace on x,y where a door is, and it'll make
337 sure a key is placed on both sides of the door. 335 sure a key is placed on both sides of the door.
338*/ 336*/
339 337
340int 338int
341keyplace (mapstruct *map, int x, int y, char *keycode, int door_flag, int n_keys, RMParms * RP) 339keyplace (maptile *map, int x, int y, char *keycode, int door_flag, int n_keys, random_map_params *RP)
342{ 340{
343 int i, j; 341 int i, j;
344 int kx, ky; 342 int kx, ky;
345 object *the_keymaster; /* the monster that gets the key. */ 343 object *the_keymaster; /* the monster that gets the key. */
346 object *the_key; 344 object *the_key;
369 freeindex = -1; 367 freeindex = -1;
370 for (tries = 0; tries < 15 && freeindex == -1; tries++) 368 for (tries = 0; tries < 15 && freeindex == -1; tries++)
371 { 369 {
372 kx = (RANDOM () % (RP->Xsize - 2)) + 1; 370 kx = (RANDOM () % (RP->Xsize - 2)) + 1;
373 ky = (RANDOM () % (RP->Ysize - 2)) + 1; 371 ky = (RANDOM () % (RP->Ysize - 2)) + 1;
374 freeindex = find_first_free_spot (the_key, map, kx, ky); 372 freeindex = find_free_spot (the_key, map, kx, ky, 1, SIZEOFFREE1 + 1);
375 } 373 }
374
376 if (freeindex != -1) 375 if (freeindex != -1)
377 { 376 {
378 kx += freearr_x[freeindex]; 377 kx += freearr_x[freeindex];
379 ky += freearr_y[freeindex]; 378 ky += freearr_y[freeindex];
380 } 379 }
386 NO_PASS_DOORS is set. */ 385 NO_PASS_DOORS is set. */
387 if (n_keys == 1) 386 if (n_keys == 1)
388 { 387 {
389 if (wall_blocked (map, x, y)) 388 if (wall_blocked (map, x, y))
390 return 0; 389 return 0;
390
391 the_keymaster = find_monster_in_room (map, x, y, RP); 391 the_keymaster = find_monster_in_room (map, x, y, RP);
392 if (the_keymaster == NULL) /* if fail, find a spot to drop the key. */ 392 if (the_keymaster == NULL) /* if fail, find a spot to drop the key. */
393 find_spot_in_room (map, x, y, &kx, &ky, RP); 393 find_spot_in_room (map, x, y, &kx, &ky, RP);
394 } 394 }
395 else 395 else
432 432
433/* a recursive routine which will return a monster, eventually,if there is one. 433/* a recursive routine which will return a monster, eventually,if there is one.
434 it does a check-off on the layout, converting 0's to 1's */ 434 it does a check-off on the layout, converting 0's to 1's */
435 435
436object * 436object *
437find_monster_in_room_recursive (char **layout, mapstruct *map, int x, int y, RMParms * RP) 437find_monster_in_room_recursive (char **layout, maptile *map, int x, int y, random_map_params *RP)
438{ 438{
439 int i, j; 439 int i, j;
440 440
441 /* if we've found a monster already, leave */ 441 /* if we've found a monster already, leave */
442 if (theMonsterToFind != NULL) 442 if (theMonsterToFind != NULL)
453 /* check the current square for a monster. If there is one, 453 /* check the current square for a monster. If there is one,
454 set theMonsterToFind and return it. */ 454 set theMonsterToFind and return it. */
455 layout[x][y] = 1; 455 layout[x][y] = 1;
456 if (GET_MAP_FLAGS (map, x, y) & P_IS_ALIVE) 456 if (GET_MAP_FLAGS (map, x, y) & P_IS_ALIVE)
457 { 457 {
458 object *the_monster = get_map_ob (map, x, y); 458 object *the_monster = GET_MAP_OB (map, x, y);
459 459
460 /* check off this point */ 460 /* check off this point */
461 for (; the_monster != NULL && (!QUERY_FLAG (the_monster, FLAG_ALIVE)); the_monster = the_monster->above); 461 for (; the_monster != NULL && (!QUERY_FLAG (the_monster, FLAG_ALIVE)); the_monster = the_monster->above);
462 if (the_monster && QUERY_FLAG (the_monster, FLAG_ALIVE)) 462 if (the_monster && QUERY_FLAG (the_monster, FLAG_ALIVE))
463 { 463 {
479 479
480/* sets up some data structures: the _recursive form does the 480/* sets up some data structures: the _recursive form does the
481 real work. */ 481 real work. */
482 482
483object * 483object *
484find_monster_in_room (mapstruct *map, int x, int y, RMParms * RP) 484find_monster_in_room (maptile *map, int x, int y, random_map_params *RP)
485{ 485{
486 char **layout2; 486 char **layout2;
487 int i, j; 487 int i, j;
488 488
489 theMonsterToFind = 0; 489 theMonsterToFind = 0;
521/* the workhorse routine, which finds the free spots in a room: 521/* the workhorse routine, which finds the free spots in a room:
522a datastructure of free points is set up, and a position chosen from 522a datastructure of free points is set up, and a position chosen from
523that datastructure. */ 523that datastructure. */
524 524
525void 525void
526find_spot_in_room_recursive (char **layout, int x, int y, RMParms * RP) 526find_spot_in_room_recursive (char **layout, int x, int y, random_map_params *RP)
527{ 527{
528 int i, j; 528 int i, j;
529 529
530 /* bounds check x and y */ 530 /* bounds check x and y */
531 if (!(x >= 0 && y >= 0 && x < RP->Xsize && y < RP->Ysize)) 531 if (!(x >= 0 && y >= 0 && x < RP->Xsize && y < RP->Ysize))
550 550
551} 551}
552 552
553/* find a random non-blocked spot in this room to drop a key. */ 553/* find a random non-blocked spot in this room to drop a key. */
554void 554void
555find_spot_in_room (mapstruct *map, int x, int y, int *kx, int *ky, RMParms * RP) 555find_spot_in_room (maptile *map, int x, int y, int *kx, int *ky, random_map_params *RP)
556{ 556{
557 char **layout2; 557 char **layout2;
558 int i, j; 558 int i, j;
559 559
560 number_of_free_spots_in_room = 0; 560 number_of_free_spots_in_room = 0;
597/* searches the map for a spot with walls around it. The more 597/* searches the map for a spot with walls around it. The more
598 walls the better, but it'll settle for 1 wall, or even 0, but 598 walls the better, but it'll settle for 1 wall, or even 0, but
599 it'll return 0 if no FREE spots are found.*/ 599 it'll return 0 if no FREE spots are found.*/
600 600
601void 601void
602find_enclosed_spot (mapstruct *map, int *cx, int *cy, RMParms * RP) 602find_enclosed_spot (maptile *map, int *cx, int *cy, random_map_params *RP)
603{ 603{
604 int x, y; 604 int x, y;
605 int i; 605 int i;
606 606
607 x = *cx; 607 x = *cx;
656 *cy = ly; 656 *cy = ly;
657 return; 657 return;
658 } 658 }
659 } 659 }
660 /* give up and return the closest free spot. */ 660 /* give up and return the closest free spot. */
661 i = find_first_free_spot (&archetype::find ("chest")->clone, map, x, y); 661 i = find_free_spot (&archetype::find ("chest")->clone, map, x, y, 1, SIZEOFFREE1 + 1);
662 if (i != -1 && i <= SIZEOFFREE1) 662
663 if (i != -1)
663 { 664 {
664 *cx = x + freearr_x[i]; 665 *cx = x + freearr_x[i];
665 *cy = y + freearr_y[i]; 666 *cy = y + freearr_y[i];
666 return; 667 }
668 else
667 } 669 {
668 /* indicate failure */ 670 /* indicate failure */
671 *cx = -1;
669 *cx = *cy = -1; 672 *cy = -1;
673 }
670} 674}
671 675
672 676
673void 677void
674remove_monsters (int x, int y, mapstruct *map) 678remove_monsters (int x, int y, maptile *map)
675{ 679{
676 object *tmp; 680 object *tmp;
677 681
678 for (tmp = get_map_ob (map, x, y); tmp != NULL; tmp = tmp->above) 682 for (tmp = GET_MAP_OB (map, x, y); tmp != NULL; tmp = tmp->above)
679 if (QUERY_FLAG (tmp, FLAG_ALIVE)) 683 if (QUERY_FLAG (tmp, FLAG_ALIVE))
680 { 684 {
681 if (tmp->head) 685 if (tmp->head)
682 tmp = tmp->head; 686 tmp = tmp->head;
683 remove_ob (tmp); 687 tmp->remove ();
684 free_object (tmp); 688 tmp->destroy ();
685 tmp = get_map_ob (map, x, y); 689 tmp = GET_MAP_OB (map, x, y);
686 if (tmp == NULL) 690 if (tmp == NULL)
687 break; 691 break;
688 }; 692 };
689} 693}
690 694
692/* surrounds the point x,y by doors, so as to enclose something, like 696/* surrounds the point x,y by doors, so as to enclose something, like
693 a chest. It only goes as far as the 8 squares surrounding, and 697 a chest. It only goes as far as the 8 squares surrounding, and
694 it'll remove any monsters it finds.*/ 698 it'll remove any monsters it finds.*/
695 699
696object ** 700object **
697surround_by_doors (mapstruct *map, char **layout, int x, int y, int opts) 701surround_by_doors (maptile *map, char **layout, int x, int y, int opts)
698{ 702{
699 int i; 703 int i;
700 char *doors[2]; 704 char *doors[2];
701 object **doorlist; 705 object **doorlist;
702 int ndoors_made = 0; 706 int ndoors_made = 0;
735} 739}
736 740
737 741
738/* returns the first door in this square, or NULL if there isn't a door. */ 742/* returns the first door in this square, or NULL if there isn't a door. */
739object * 743object *
740door_in_square (mapstruct *map, int x, int y) 744door_in_square (maptile *map, int x, int y)
741{ 745{
742 object *tmp; 746 object *tmp;
743 747
744 for (tmp = get_map_ob (map, x, y); tmp != NULL; tmp = tmp->above) 748 for (tmp = GET_MAP_OB (map, x, y); tmp != NULL; tmp = tmp->above)
745 if (tmp->type == DOOR || tmp->type == LOCKED_DOOR) 749 if (tmp->type == DOOR || tmp->type == LOCKED_DOOR)
746 return tmp; 750 return tmp;
747 return NULL; 751 return NULL;
748} 752}
749 753
750 754
751/* the workhorse routine, which finds the doors in a room */ 755/* the workhorse routine, which finds the doors in a room */
752void 756void
753find_doors_in_room_recursive (char **layout, mapstruct *map, int x, int y, object **doorlist, int *ndoors, RMParms * RP) 757find_doors_in_room_recursive (char **layout, maptile *map, int x, int y, object **doorlist, int *ndoors, random_map_params *RP)
754{ 758{
755 int i, j; 759 int i, j;
756 object *door; 760 object *door;
757 761
758 /* bounds check x and y */ 762 /* bounds check x and y */
766 /* check off this point */ 770 /* check off this point */
767 if (layout[x][y] == '#') 771 if (layout[x][y] == '#')
768 { /* there could be a door here */ 772 { /* there could be a door here */
769 layout[x][y] = 1; 773 layout[x][y] = 1;
770 door = door_in_square (map, x, y); 774 door = door_in_square (map, x, y);
771 if (door != NULL) 775 if (door)
772 { 776 {
773 doorlist[*ndoors] = door; 777 doorlist[*ndoors] = door;
774 if (*ndoors > 254) /* eek! out of memory */ 778 if (*ndoors > 1022) /* eek! out of memory */
775 { 779 {
776 LOG (llevError, "find_doors_in_room_recursive:Too many doors for memory allocated!\n"); 780 LOG (llevError, "find_doors_in_room_recursive:Too many doors for memory allocated!\n");
777 return; 781 return;
778 } 782 }
783
779 *ndoors = *ndoors + 1; 784 *ndoors = *ndoors + 1;
780 } 785 }
781 } 786 }
782 else 787 else
783 { 788 {
784 layout[x][y] = 1; 789 layout[x][y] = 1;
785 /* now search all the 8 squares around recursively for free spots,in random order */ 790 /* now search all the 8 squares around recursively for free spots,in random order */
786 for (i = RANDOM () % 8, j = 0; j < 8 && theMonsterToFind == NULL; i++, j++) 791 for (i = RANDOM () % 8, j = 0; j < 8 && theMonsterToFind == NULL; i++, j++)
787 {
788 find_doors_in_room_recursive (layout, map, x + freearr_x[i % 8 + 1], y + freearr_y[i % 8 + 1], doorlist, ndoors, RP); 792 find_doors_in_room_recursive (layout, map, x + freearr_x[i % 8 + 1], y + freearr_y[i % 8 + 1], doorlist, ndoors, RP);
789 }
790 } 793 }
791} 794}
792 795
793/* find a random non-blocked spot in this room to drop a key. */ 796/* find a random non-blocked spot in this room to drop a key. */
794object ** 797object **
795find_doors_in_room (mapstruct *map, int x, int y, RMParms * RP) 798find_doors_in_room (maptile *map, int x, int y, random_map_params *RP)
796{ 799{
797 char **layout2; 800 char **layout2;
798 object **doorlist; 801 object **doorlist;
799 int i, j; 802 int i, j;
800 int ndoors = 0; 803 int ndoors = 0;
801 804
802 doorlist = (object **) calloc (sizeof (int), 256); 805 doorlist = (object **) calloc (sizeof (int), 1024);
803
804 806
805 layout2 = (char **) calloc (sizeof (char *), RP->Xsize); 807 layout2 = (char **) calloc (sizeof (char *), RP->Xsize);
806 /* allocate and copy the layout, converting C to 0. */ 808 /* allocate and copy the layout, converting C to 0. */
807 for (i = 0; i < RP->Xsize; i++) 809 for (i = 0; i < RP->Xsize; i++)
808 { 810 {
817 /* setup num_free_spots and room_free_spots */ 819 /* setup num_free_spots and room_free_spots */
818 find_doors_in_room_recursive (layout2, map, x, y, doorlist, &ndoors, RP); 820 find_doors_in_room_recursive (layout2, map, x, y, doorlist, &ndoors, RP);
819 821
820 /* deallocate the temp. layout */ 822 /* deallocate the temp. layout */
821 for (i = 0; i < RP->Xsize; i++) 823 for (i = 0; i < RP->Xsize; i++)
822 {
823 free (layout2[i]); 824 free (layout2[i]);
824 } 825
825 free (layout2); 826 free (layout2);
826 return doorlist; 827 return doorlist;
827} 828}
828 829
829 830
830 831
831/* locks and/or hides all the doors in doorlist, or does nothing if 832/* locks and/or hides all the doors in doorlist, or does nothing if
832 opts doesn't say to lock/hide doors. */ 833 opts doesn't say to lock/hide doors. */
833 834
834void 835void
835lock_and_hide_doors (object **doorlist, mapstruct *map, int opts, RMParms * RP) 836lock_and_hide_doors (object **doorlist, maptile *map, int opts, random_map_params *RP)
836{ 837{
837 object *door; 838 object *door;
838 int i; 839 int i;
839 840
840 /* lock the doors and hide the keys. */ 841 /* lock the doors and hide the keys. */
842 if (opts & DOORED) 843 if (opts & DOORED)
843 { 844 {
844 for (i = 0, door = doorlist[0]; doorlist[i] != NULL; i++) 845 for (i = 0, door = doorlist[0]; doorlist[i] != NULL; i++)
845 { 846 {
846 object *new_door = get_archetype ("locked_door1"); 847 object *new_door = get_archetype ("locked_door1");
847 char keybuf[256]; 848 char keybuf[1024];
848 849
849 door = doorlist[i]; 850 door = doorlist[i];
850 new_door->face = door->face; 851 new_door->face = door->face;
851 new_door->x = door->x; 852 new_door->x = door->x;
852 new_door->y = door->y; 853 new_door->y = door->y;
853 remove_ob (door); 854 door->remove ();
854 free_object (door); 855 door->destroy ();
855 doorlist[i] = new_door; 856 doorlist[i] = new_door;
856 insert_ob_in_map (new_door, map, NULL, 0); 857 insert_ob_in_map (new_door, map, NULL, 0);
857 sprintf (keybuf, "%d", (int) RANDOM ()); 858 sprintf (keybuf, "%d", (int) RANDOM ());
858 new_door->slaying = keybuf; 859 new_door->slaying = keybuf;
859 keyplace (map, new_door->x, new_door->y, keybuf, NO_PASS_DOORS, 2, RP); 860 keyplace (map, new_door->x, new_door->y, keybuf, NO_PASS_DOORS, 2, RP);
875 retrofit_joined_wall (map, door->x + 1, door->y, 0, RP); 876 retrofit_joined_wall (map, door->x + 1, door->y, 0, RP);
876 retrofit_joined_wall (map, door->x, door->y - 1, 0, RP); 877 retrofit_joined_wall (map, door->x, door->y - 1, 0, RP);
877 retrofit_joined_wall (map, door->x, door->y + 1, 0, RP); 878 retrofit_joined_wall (map, door->x, door->y + 1, 0, RP);
878 door->face = wallface->face; 879 door->face = wallface->face;
879 if (!QUERY_FLAG (wallface, FLAG_REMOVED)) 880 if (!QUERY_FLAG (wallface, FLAG_REMOVED))
880 remove_ob (wallface); 881 wallface->remove ();
881 free_object (wallface); 882 wallface->destroy ();
882 } 883 }
883 } 884 }
884 } 885 }
885} 886}

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines