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.9 by root, Tue Dec 12 21:39:56 2006 UTC vs.
Revision 1.17 by root, Mon Jan 15 15:54:19 2007 UTC

1
1/* 2/*
2 CrossFire, A Multiplayer game for X-windows 3 CrossFire, A Multiplayer game for X-windows
3 4
5 Copyright (C) 2005, 2006, 2007 Marc Lehmann & Crossfire+ Development Team
4 Copyright (C) 2001 Mark Wedel & Crossfire Development Team 6 Copyright (C) 2001 Mark Wedel & Crossfire Development Team
5 Copyright (C) 1992 Frank Tore Johansen 7 Copyright (C) 1992 Frank Tore Johansen
6 8
7 This program is free software; you can redistribute it and/or modify 9 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 10 it under the terms of the GNU General Public License as published by
67treasure style (may be empty or NULL, or "none" to cause no treasure.) 69treasure style (may be empty or NULL, or "none" to cause no treasure.)
68treasureoptions (may be 0 for random choices or positive) 70treasureoptions (may be 0 for random choices or positive)
69*/ 71*/
70 72
71void 73void
72place_treasure (maptile *map, char **layout, char *treasure_style, int treasureoptions, RMParms * RP) 74place_treasure (maptile *map, char **layout, char *treasure_style, int treasureoptions, random_map_params *RP)
73{ 75{
74 char styledirname[256]; 76 char styledirname[1024];
75 char stylefilepath[256]; 77 char stylefilepath[1024];
76 maptile *style_map = 0; 78 maptile *style_map = 0;
77 int num_treasures; 79 int num_treasures;
78 80
79 /* bail out if treasure isn't wanted. */ 81 /* bail out if treasure isn't wanted. */
80 if (treasure_style) 82 if (treasure_style)
113 { 115 {
114 116
115 /* map_layout_style global, and is previously set */ 117 /* map_layout_style global, and is previously set */
116 switch (RP->map_layout_style) 118 switch (RP->map_layout_style)
117 { 119 {
118 case ONION_LAYOUT: 120 case LAYOUT_ONION:
119 case SPIRAL_LAYOUT: 121 case LAYOUT_SPIRAL:
120 case SQUARE_SPIRAL_LAYOUT: 122 case LAYOUT_SQUARE_SPIRAL:
121 { 123 {
122 int i, j; 124 int i, j;
123 125
124 /* search the onion for C's or '>', and put treasure there. */ 126 /* search the onion for C's or '>', and put treasure there. */
125 for (i = 0; i < RP->Xsize; i++) 127 for (i = 0; i < RP->Xsize; i++)
126 { 128 {
127 for (j = 0; j < RP->Ysize; j++) 129 for (j = 0; j < RP->Ysize; j++)
128 { 130 {
129 if (layout[i][j] == 'C' || layout[i][j] == '>') 131 if (layout[i][j] == 'C' || layout[i][j] == '>')
130 { 132 {
131 int tdiv = RP->symmetry_used; 133 int tdiv = RP->symmetry_used;
132 object **doorlist; 134 object **doorlist;
133 object *chest; 135 object *chest;
134 136
135 if (tdiv == 3) 137 if (tdiv == 3)
136 tdiv = 2; /* this symmetry uses a divisor of 2 */ 138 tdiv = 2; /* this symmetry uses a divisor of 2 */
137 /* don't put a chest on an exit. */ 139 /* don't put a chest on an exit. */
138 chest = place_chest (treasureoptions, i, j, map, style_map, num_treasures / tdiv, RP); 140 chest = place_chest (treasureoptions, i, j, map, style_map, num_treasures / tdiv, RP);
139 if (!chest) 141 if (!chest)
140 continue; /* if no chest was placed NEXT */ 142 continue; /* if no chest was placed NEXT */
141 if (treasureoptions & (DOORED | HIDDEN)) 143 if (treasureoptions & (DOORED | HIDDEN))
142 { 144 {
143 doorlist = find_doors_in_room (map, i, j, RP); 145 doorlist = find_doors_in_room (map, i, j, RP);
144 lock_and_hide_doors (doorlist, map, treasureoptions, RP); 146 lock_and_hide_doors (doorlist, map, treasureoptions, RP);
145 free (doorlist); 147 free (doorlist);
146 } 148 }
147 } 149 }
148 } 150 }
149 } 151 }
150 break; 152 break;
151 } 153 }
152 default: 154 default:
153 { 155 {
154 int i, j, tries; 156 int i, j, tries;
155 object *chest; 157 object *chest;
156 object **doorlist; 158 object **doorlist;
157 159
158 i = j = -1; 160 i = j = -1;
159 tries = 0; 161 tries = 0;
160 while (i == -1 && tries < 100) 162 while (i == -1 && tries < 100)
161 { 163 {
162 i = RANDOM () % (RP->Xsize - 2) + 1; 164 i = RANDOM () % (RP->Xsize - 2) + 1;
163 j = RANDOM () % (RP->Ysize - 2) + 1; 165 j = RANDOM () % (RP->Ysize - 2) + 1;
164 find_enclosed_spot (map, &i, &j, RP); 166 find_enclosed_spot (map, &i, &j, RP);
165 if (wall_blocked (map, i, j)) 167 if (wall_blocked (map, i, j))
166 i = -1; 168 i = -1;
167 tries++; 169 tries++;
168 } 170 }
169 chest = place_chest (treasureoptions, i, j, map, style_map, num_treasures, RP); 171 chest = place_chest (treasureoptions, i, j, map, style_map, num_treasures, RP);
170 if (!chest) 172 if (!chest)
171 return; 173 return;
172 i = chest->x; 174 i = chest->x;
173 j = chest->y; 175 j = chest->y;
174 if (treasureoptions & (DOORED | HIDDEN)) 176 if (treasureoptions & (DOORED | HIDDEN))
175 { 177 {
176 doorlist = surround_by_doors (map, layout, i, j, treasureoptions); 178 doorlist = surround_by_doors (map, layout, i, j, treasureoptions);
177 lock_and_hide_doors (doorlist, map, treasureoptions, RP); 179 lock_and_hide_doors (doorlist, map, treasureoptions, RP);
178 free (doorlist); 180 free (doorlist);
179 } 181 }
180 } 182 }
181 } 183 }
182 } 184 }
183 else 185 else
184 { /* DIFFUSE treasure layout */ 186 { /* DIFFUSE treasure layout */
185 int ti, i, j; 187 int ti, i, j;
191 place_chest (treasureoptions, i, j, map, style_map, 1, RP); 193 place_chest (treasureoptions, i, j, map, style_map, 1, RP);
192 } 194 }
193 } 195 }
194} 196}
195 197
196
197
198/* put a chest into the map, near x and y, with the treasure style 198/* 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, 199 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 */ 200 if the global variable "treasurestyle" is set to that treasure list's name */
201 201
202object * 202object *
203place_chest (int treasureoptions, int x, int y, maptile *map, maptile *style_map, int n_treasures, RMParms * RP) 203place_chest (int treasureoptions, int x, int y, maptile *map, maptile *style_map, int n_treasures, random_map_params *RP)
204{ 204{
205 object *the_chest; 205 object *the_chest;
206 int i, xl, yl; 206 int i, xl, yl;
207 207
208 the_chest = get_archetype ("chest"); /* was "chest_2" */ 208 the_chest = get_archetype ("chest"); /* was "chest_2" */
212 if (i == -1) 212 if (i == -1)
213 { 213 {
214 the_chest->destroy (); 214 the_chest->destroy ();
215 return NULL; 215 return NULL;
216 } 216 }
217
217 xl = x + freearr_x[i]; 218 xl = x + freearr_x[i];
218 yl = y + freearr_y[i]; 219 yl = y + freearr_y[i];
219 220
220 /* if the placement is blocked, return a fail. */ 221 /* if the placement is blocked, return a fail. */
221 if (wall_blocked (map, xl, yl)) 222 if (wall_blocked (map, xl, yl))
222 return 0; 223 return 0;
223
224 224
225 /* put the treasures in the chest. */ 225 /* put the treasures in the chest. */
226 /* if(style_map) { */ 226 /* if(style_map) { */
227#if 0 /* don't use treasure style maps for now! */ 227#if 0 /* don't use treasure style maps for now! */
228 int ti; 228 int ti;
241 { /* use the style map */ 241 { /* use the style map */
242 the_chest->randomitems = tlist; 242 the_chest->randomitems = tlist;
243 the_chest->stats.hp = n_treasures; 243 the_chest->stats.hp = n_treasures;
244 } 244 }
245#endif 245#endif
246 else
247 { /* neither style_map no treasure list given */ 246 { /* neither style_map no treasure list given */
248 treasurelist *tlist = find_treasurelist ("chest"); 247 treasurelist *tlist = find_treasurelist ("chest");
249 248
250 the_chest->randomitems = tlist; 249 the_chest->randomitems = tlist;
251 the_chest->stats.hp = n_treasures; 250 the_chest->stats.hp = n_treasures;
279 the lockcode. It's not worth bothering to lock the chest if 278 the lockcode. It's not worth bothering to lock the chest if
280 there's only 1 treasure.... */ 279 there's only 1 treasure.... */
281 280
282 if ((treasureoptions & KEYREQUIRED) && n_treasures > 1) 281 if ((treasureoptions & KEYREQUIRED) && n_treasures > 1)
283 { 282 {
284 char keybuf[256]; 283 char keybuf[1024];
285 284
286 sprintf (keybuf, "%d", (int) RANDOM ()); 285 sprintf (keybuf, "%d", (int) RANDOM ());
287 the_chest->slaying = keybuf; 286 the_chest->slaying = keybuf;
288 keyplace (map, x, y, keybuf, PASS_DOORS, 1, RP); 287 keyplace (map, x, y, keybuf, PASS_DOORS, 1, RP);
289 } 288 }
297 296
298 297
299/* finds the closest monster and returns him, regardless of doors 298/* finds the closest monster and returns him, regardless of doors
300 or walls */ 299 or walls */
301object * 300object *
302find_closest_monster (maptile *map, int x, int y, RMParms * RP) 301find_closest_monster (maptile *map, int x, int y, random_map_params *RP)
303{ 302{
304 int i; 303 int i;
305 304
306 for (i = 0; i < SIZEOFFREE; i++) 305 for (i = 0; i < SIZEOFFREE; i++)
307 { 306 {
312 /* boundscheck */ 311 /* boundscheck */
313 if (lx >= 0 && ly >= 0 && lx < RP->Xsize && ly < RP->Ysize) 312 if (lx >= 0 && ly >= 0 && lx < RP->Xsize && ly < RP->Ysize)
314 /* don't bother searching this square unless the map says life exists. */ 313 /* don't bother searching this square unless the map says life exists. */
315 if (GET_MAP_FLAGS (map, lx, ly) & P_IS_ALIVE) 314 if (GET_MAP_FLAGS (map, lx, ly) & P_IS_ALIVE)
316 { 315 {
317 object *the_monster = get_map_ob (map, lx, ly); 316 object *the_monster = GET_MAP_OB (map, lx, ly);
318 317
319 for (; the_monster != NULL && (!QUERY_FLAG (the_monster, FLAG_MONSTER)); the_monster = the_monster->above); 318 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)) 319 if (the_monster && QUERY_FLAG (the_monster, FLAG_MONSTER))
321 return the_monster; 320 return the_monster;
322 } 321 }
336 The idea is that you call keyplace on x,y where a door is, and it'll make 335 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. 336 sure a key is placed on both sides of the door.
338*/ 337*/
339 338
340int 339int
341keyplace (maptile *map, int x, int y, char *keycode, int door_flag, int n_keys, RMParms * RP) 340keyplace (maptile *map, int x, int y, char *keycode, int door_flag, int n_keys, random_map_params *RP)
342{ 341{
343 int i, j; 342 int i, j;
344 int kx, ky; 343 int kx, ky;
345 object *the_keymaster; /* the monster that gets the key. */ 344 object *the_keymaster; /* the monster that gets the key. */
346 object *the_key; 345 object *the_key;
369 freeindex = -1; 368 freeindex = -1;
370 for (tries = 0; tries < 15 && freeindex == -1; tries++) 369 for (tries = 0; tries < 15 && freeindex == -1; tries++)
371 { 370 {
372 kx = (RANDOM () % (RP->Xsize - 2)) + 1; 371 kx = (RANDOM () % (RP->Xsize - 2)) + 1;
373 ky = (RANDOM () % (RP->Ysize - 2)) + 1; 372 ky = (RANDOM () % (RP->Ysize - 2)) + 1;
374 freeindex = find_first_free_spot (the_key, map, kx, ky); 373 freeindex = find_free_spot (the_key, map, kx, ky, 1, SIZEOFFREE1 + 1);
375 } 374 }
375
376 if (freeindex != -1) 376 if (freeindex != -1)
377 { 377 {
378 kx += freearr_x[freeindex]; 378 kx += freearr_x[freeindex];
379 ky += freearr_y[freeindex]; 379 ky += freearr_y[freeindex];
380 } 380 }
386 NO_PASS_DOORS is set. */ 386 NO_PASS_DOORS is set. */
387 if (n_keys == 1) 387 if (n_keys == 1)
388 { 388 {
389 if (wall_blocked (map, x, y)) 389 if (wall_blocked (map, x, y))
390 return 0; 390 return 0;
391
391 the_keymaster = find_monster_in_room (map, x, y, RP); 392 the_keymaster = find_monster_in_room (map, x, y, RP);
392 if (the_keymaster == NULL) /* if fail, find a spot to drop the key. */ 393 if (the_keymaster == NULL) /* if fail, find a spot to drop the key. */
393 find_spot_in_room (map, x, y, &kx, &ky, RP); 394 find_spot_in_room (map, x, y, &kx, &ky, RP);
394 } 395 }
395 else 396 else
432 433
433/* a recursive routine which will return a monster, eventually,if there is one. 434/* 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 */ 435 it does a check-off on the layout, converting 0's to 1's */
435 436
436object * 437object *
437find_monster_in_room_recursive (char **layout, maptile *map, int x, int y, RMParms * RP) 438find_monster_in_room_recursive (char **layout, maptile *map, int x, int y, random_map_params *RP)
438{ 439{
439 int i, j; 440 int i, j;
440 441
441 /* if we've found a monster already, leave */ 442 /* if we've found a monster already, leave */
442 if (theMonsterToFind != NULL) 443 if (theMonsterToFind != NULL)
453 /* check the current square for a monster. If there is one, 454 /* check the current square for a monster. If there is one,
454 set theMonsterToFind and return it. */ 455 set theMonsterToFind and return it. */
455 layout[x][y] = 1; 456 layout[x][y] = 1;
456 if (GET_MAP_FLAGS (map, x, y) & P_IS_ALIVE) 457 if (GET_MAP_FLAGS (map, x, y) & P_IS_ALIVE)
457 { 458 {
458 object *the_monster = get_map_ob (map, x, y); 459 object *the_monster = GET_MAP_OB (map, x, y);
459 460
460 /* check off this point */ 461 /* check off this point */
461 for (; the_monster != NULL && (!QUERY_FLAG (the_monster, FLAG_ALIVE)); the_monster = the_monster->above); 462 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)) 463 if (the_monster && QUERY_FLAG (the_monster, FLAG_ALIVE))
463 { 464 {
479 480
480/* sets up some data structures: the _recursive form does the 481/* sets up some data structures: the _recursive form does the
481 real work. */ 482 real work. */
482 483
483object * 484object *
484find_monster_in_room (maptile *map, int x, int y, RMParms * RP) 485find_monster_in_room (maptile *map, int x, int y, random_map_params *RP)
485{ 486{
486 char **layout2; 487 char **layout2;
487 int i, j; 488 int i, j;
488 489
489 theMonsterToFind = 0; 490 theMonsterToFind = 0;
521/* the workhorse routine, which finds the free spots in a room: 522/* the workhorse routine, which finds the free spots in a room:
522a datastructure of free points is set up, and a position chosen from 523a datastructure of free points is set up, and a position chosen from
523that datastructure. */ 524that datastructure. */
524 525
525void 526void
526find_spot_in_room_recursive (char **layout, int x, int y, RMParms * RP) 527find_spot_in_room_recursive (char **layout, int x, int y, random_map_params *RP)
527{ 528{
528 int i, j; 529 int i, j;
529 530
530 /* bounds check x and y */ 531 /* bounds check x and y */
531 if (!(x >= 0 && y >= 0 && x < RP->Xsize && y < RP->Ysize)) 532 if (!(x >= 0 && y >= 0 && x < RP->Xsize && y < RP->Ysize))
550 551
551} 552}
552 553
553/* find a random non-blocked spot in this room to drop a key. */ 554/* find a random non-blocked spot in this room to drop a key. */
554void 555void
555find_spot_in_room (maptile *map, int x, int y, int *kx, int *ky, RMParms * RP) 556find_spot_in_room (maptile *map, int x, int y, int *kx, int *ky, random_map_params *RP)
556{ 557{
557 char **layout2; 558 char **layout2;
558 int i, j; 559 int i, j;
559 560
560 number_of_free_spots_in_room = 0; 561 number_of_free_spots_in_room = 0;
597/* searches the map for a spot with walls around it. The more 598/* 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 599 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.*/ 600 it'll return 0 if no FREE spots are found.*/
600 601
601void 602void
602find_enclosed_spot (maptile *map, int *cx, int *cy, RMParms * RP) 603find_enclosed_spot (maptile *map, int *cx, int *cy, random_map_params *RP)
603{ 604{
604 int x, y; 605 int x, y;
605 int i; 606 int i;
606 607
607 x = *cx; 608 x = *cx;
656 *cy = ly; 657 *cy = ly;
657 return; 658 return;
658 } 659 }
659 } 660 }
660 /* give up and return the closest free spot. */ 661 /* give up and return the closest free spot. */
661 i = find_first_free_spot (&archetype::find ("chest")->clone, map, x, y); 662 i = find_free_spot (&archetype::find ("chest")->clone, map, x, y, 1, SIZEOFFREE1 + 1);
662 if (i != -1 && i <= SIZEOFFREE1) 663
664 if (i != -1)
663 { 665 {
664 *cx = x + freearr_x[i]; 666 *cx = x + freearr_x[i];
665 *cy = y + freearr_y[i]; 667 *cy = y + freearr_y[i];
666 return; 668 }
669 else
667 } 670 {
668 /* indicate failure */ 671 /* indicate failure */
672 *cx = -1;
669 *cx = *cy = -1; 673 *cy = -1;
674 }
670} 675}
671 676
672 677
673void 678void
674remove_monsters (int x, int y, maptile *map) 679remove_monsters (int x, int y, maptile *map)
675{ 680{
676 object *tmp; 681 object *tmp;
677 682
678 for (tmp = get_map_ob (map, x, y); tmp != NULL; tmp = tmp->above) 683 for (tmp = GET_MAP_OB (map, x, y); tmp != NULL; tmp = tmp->above)
679 if (QUERY_FLAG (tmp, FLAG_ALIVE)) 684 if (QUERY_FLAG (tmp, FLAG_ALIVE))
680 { 685 {
681 if (tmp->head) 686 if (tmp->head)
682 tmp = tmp->head; 687 tmp = tmp->head;
683 tmp->remove (); 688 tmp->remove ();
684 tmp->destroy (); 689 tmp->destroy ();
685 tmp = get_map_ob (map, x, y); 690 tmp = GET_MAP_OB (map, x, y);
686 if (tmp == NULL) 691 if (tmp == NULL)
687 break; 692 break;
688 }; 693 };
689} 694}
690 695
739object * 744object *
740door_in_square (maptile *map, int x, int y) 745door_in_square (maptile *map, int x, int y)
741{ 746{
742 object *tmp; 747 object *tmp;
743 748
744 for (tmp = get_map_ob (map, x, y); tmp != NULL; tmp = tmp->above) 749 for (tmp = GET_MAP_OB (map, x, y); tmp != NULL; tmp = tmp->above)
745 if (tmp->type == DOOR || tmp->type == LOCKED_DOOR) 750 if (tmp->type == DOOR || tmp->type == LOCKED_DOOR)
746 return tmp; 751 return tmp;
747 return NULL; 752 return NULL;
748} 753}
749 754
750 755
751/* the workhorse routine, which finds the doors in a room */ 756/* the workhorse routine, which finds the doors in a room */
752void 757void
753find_doors_in_room_recursive (char **layout, maptile *map, int x, int y, object **doorlist, int *ndoors, RMParms * RP) 758find_doors_in_room_recursive (char **layout, maptile *map, int x, int y, object **doorlist, int *ndoors, random_map_params *RP)
754{ 759{
755 int i, j; 760 int i, j;
756 object *door; 761 object *door;
757 762
758 /* bounds check x and y */ 763 /* bounds check x and y */
766 /* check off this point */ 771 /* check off this point */
767 if (layout[x][y] == '#') 772 if (layout[x][y] == '#')
768 { /* there could be a door here */ 773 { /* there could be a door here */
769 layout[x][y] = 1; 774 layout[x][y] = 1;
770 door = door_in_square (map, x, y); 775 door = door_in_square (map, x, y);
771 if (door != NULL) 776 if (door)
772 { 777 {
773 doorlist[*ndoors] = door; 778 doorlist[*ndoors] = door;
774 if (*ndoors > 254) /* eek! out of memory */ 779 if (*ndoors > 1022) /* eek! out of memory */
775 { 780 {
776 LOG (llevError, "find_doors_in_room_recursive:Too many doors for memory allocated!\n"); 781 LOG (llevError, "find_doors_in_room_recursive:Too many doors for memory allocated!\n");
777 return; 782 return;
778 } 783 }
784
779 *ndoors = *ndoors + 1; 785 *ndoors = *ndoors + 1;
780 } 786 }
781 } 787 }
782 else 788 else
783 { 789 {
784 layout[x][y] = 1; 790 layout[x][y] = 1;
785 /* now search all the 8 squares around recursively for free spots,in random order */ 791 /* 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++) 792 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); 793 find_doors_in_room_recursive (layout, map, x + freearr_x[i % 8 + 1], y + freearr_y[i % 8 + 1], doorlist, ndoors, RP);
789 }
790 } 794 }
791} 795}
792 796
793/* find a random non-blocked spot in this room to drop a key. */ 797/* find a random non-blocked spot in this room to drop a key. */
794object ** 798object **
795find_doors_in_room (maptile *map, int x, int y, RMParms * RP) 799find_doors_in_room (maptile *map, int x, int y, random_map_params *RP)
796{ 800{
797 char **layout2; 801 char **layout2;
798 object **doorlist; 802 object **doorlist;
799 int i, j; 803 int i, j;
800 int ndoors = 0; 804 int ndoors = 0;
801 805
802 doorlist = (object **) calloc (sizeof (int), 256); 806 doorlist = (object **) calloc (sizeof (int), 1024);
803
804 807
805 layout2 = (char **) calloc (sizeof (char *), RP->Xsize); 808 layout2 = (char **) calloc (sizeof (char *), RP->Xsize);
806 /* allocate and copy the layout, converting C to 0. */ 809 /* allocate and copy the layout, converting C to 0. */
807 for (i = 0; i < RP->Xsize; i++) 810 for (i = 0; i < RP->Xsize; i++)
808 { 811 {
817 /* setup num_free_spots and room_free_spots */ 820 /* setup num_free_spots and room_free_spots */
818 find_doors_in_room_recursive (layout2, map, x, y, doorlist, &ndoors, RP); 821 find_doors_in_room_recursive (layout2, map, x, y, doorlist, &ndoors, RP);
819 822
820 /* deallocate the temp. layout */ 823 /* deallocate the temp. layout */
821 for (i = 0; i < RP->Xsize; i++) 824 for (i = 0; i < RP->Xsize; i++)
822 {
823 free (layout2[i]); 825 free (layout2[i]);
824 } 826
825 free (layout2); 827 free (layout2);
826 return doorlist; 828 return doorlist;
827} 829}
828 830
829 831
830 832
831/* locks and/or hides all the doors in doorlist, or does nothing if 833/* locks and/or hides all the doors in doorlist, or does nothing if
832 opts doesn't say to lock/hide doors. */ 834 opts doesn't say to lock/hide doors. */
833 835
834void 836void
835lock_and_hide_doors (object **doorlist, maptile *map, int opts, RMParms * RP) 837lock_and_hide_doors (object **doorlist, maptile *map, int opts, random_map_params *RP)
836{ 838{
837 object *door; 839 object *door;
838 int i; 840 int i;
839 841
840 /* lock the doors and hide the keys. */ 842 /* lock the doors and hide the keys. */
842 if (opts & DOORED) 844 if (opts & DOORED)
843 { 845 {
844 for (i = 0, door = doorlist[0]; doorlist[i] != NULL; i++) 846 for (i = 0, door = doorlist[0]; doorlist[i] != NULL; i++)
845 { 847 {
846 object *new_door = get_archetype ("locked_door1"); 848 object *new_door = get_archetype ("locked_door1");
847 char keybuf[256]; 849 char keybuf[1024];
848 850
849 door = doorlist[i]; 851 door = doorlist[i];
850 new_door->face = door->face; 852 new_door->face = door->face;
851 new_door->x = door->x; 853 new_door->x = door->x;
852 new_door->y = door->y; 854 new_door->y = door->y;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines