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.14 by pippijn, Sat Jan 6 14:42:30 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
49 * and doors but not monsters. 51 * and doors but not monsters.
50 * This function is not map tile aware. 52 * This function is not map tile aware.
51 */ 53 */
52 54
53int 55int
54wall_blocked (mapstruct *m, int x, int y) 56wall_blocked (maptile *m, int x, int y)
55{ 57{
56 int r; 58 int r;
57 59
58 if (OUT_OF_REAL_MAP (m, x, y)) 60 if (OUT_OF_REAL_MAP (m, x, y))
59 return 1; 61 return 1;
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 (mapstruct *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 mapstruct *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)
81 if (!strcmp (treasure_style, "none")) 83 if (!strcmp (treasure_style, "none"))
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, mapstruct *map, mapstruct *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" */
209 209
210 /* first, find a place to put the chest. */ 210 /* first, find a place to put the chest. */
211 i = find_first_free_spot (the_chest, map, x, y); 211 i = find_first_free_spot (the_chest, map, x, y);
212 if (i == -1) 212 if (i == -1)
213 { 213 {
214 free_object (the_chest); 214 the_chest->destroy ();
215 return NULL; 215 return NULL;
216 } 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;
432 430
433/* a recursive routine which will return a monster, eventually,if there is one. 431/* 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 */ 432 it does a check-off on the layout, converting 0's to 1's */
435 433
436object * 434object *
437find_monster_in_room_recursive (char **layout, mapstruct *map, int x, int y, RMParms * RP) 435find_monster_in_room_recursive (char **layout, maptile *map, int x, int y, random_map_params *RP)
438{ 436{
439 int i, j; 437 int i, j;
440 438
441 /* if we've found a monster already, leave */ 439 /* if we've found a monster already, leave */
442 if (theMonsterToFind != NULL) 440 if (theMonsterToFind != NULL)
453 /* check the current square for a monster. If there is one, 451 /* check the current square for a monster. If there is one,
454 set theMonsterToFind and return it. */ 452 set theMonsterToFind and return it. */
455 layout[x][y] = 1; 453 layout[x][y] = 1;
456 if (GET_MAP_FLAGS (map, x, y) & P_IS_ALIVE) 454 if (GET_MAP_FLAGS (map, x, y) & P_IS_ALIVE)
457 { 455 {
458 object *the_monster = get_map_ob (map, x, y); 456 object *the_monster = GET_MAP_OB (map, x, y);
459 457
460 /* check off this point */ 458 /* check off this point */
461 for (; the_monster != NULL && (!QUERY_FLAG (the_monster, FLAG_ALIVE)); the_monster = the_monster->above); 459 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)) 460 if (the_monster && QUERY_FLAG (the_monster, FLAG_ALIVE))
463 { 461 {
479 477
480/* sets up some data structures: the _recursive form does the 478/* sets up some data structures: the _recursive form does the
481 real work. */ 479 real work. */
482 480
483object * 481object *
484find_monster_in_room (mapstruct *map, int x, int y, RMParms * RP) 482find_monster_in_room (maptile *map, int x, int y, random_map_params *RP)
485{ 483{
486 char **layout2; 484 char **layout2;
487 int i, j; 485 int i, j;
488 486
489 theMonsterToFind = 0; 487 theMonsterToFind = 0;
521/* the workhorse routine, which finds the free spots in a room: 519/* the workhorse routine, which finds the free spots in a room:
522a datastructure of free points is set up, and a position chosen from 520a datastructure of free points is set up, and a position chosen from
523that datastructure. */ 521that datastructure. */
524 522
525void 523void
526find_spot_in_room_recursive (char **layout, int x, int y, RMParms * RP) 524find_spot_in_room_recursive (char **layout, int x, int y, random_map_params *RP)
527{ 525{
528 int i, j; 526 int i, j;
529 527
530 /* bounds check x and y */ 528 /* bounds check x and y */
531 if (!(x >= 0 && y >= 0 && x < RP->Xsize && y < RP->Ysize)) 529 if (!(x >= 0 && y >= 0 && x < RP->Xsize && y < RP->Ysize))
550 548
551} 549}
552 550
553/* find a random non-blocked spot in this room to drop a key. */ 551/* find a random non-blocked spot in this room to drop a key. */
554void 552void
555find_spot_in_room (mapstruct *map, int x, int y, int *kx, int *ky, RMParms * RP) 553find_spot_in_room (maptile *map, int x, int y, int *kx, int *ky, random_map_params *RP)
556{ 554{
557 char **layout2; 555 char **layout2;
558 int i, j; 556 int i, j;
559 557
560 number_of_free_spots_in_room = 0; 558 number_of_free_spots_in_room = 0;
597/* searches the map for a spot with walls around it. The more 595/* 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 596 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.*/ 597 it'll return 0 if no FREE spots are found.*/
600 598
601void 599void
602find_enclosed_spot (mapstruct *map, int *cx, int *cy, RMParms * RP) 600find_enclosed_spot (maptile *map, int *cx, int *cy, random_map_params *RP)
603{ 601{
604 int x, y; 602 int x, y;
605 int i; 603 int i;
606 604
607 x = *cx; 605 x = *cx;
669 *cx = *cy = -1; 667 *cx = *cy = -1;
670} 668}
671 669
672 670
673void 671void
674remove_monsters (int x, int y, mapstruct *map) 672remove_monsters (int x, int y, maptile *map)
675{ 673{
676 object *tmp; 674 object *tmp;
677 675
678 for (tmp = get_map_ob (map, x, y); tmp != NULL; tmp = tmp->above) 676 for (tmp = GET_MAP_OB (map, x, y); tmp != NULL; tmp = tmp->above)
679 if (QUERY_FLAG (tmp, FLAG_ALIVE)) 677 if (QUERY_FLAG (tmp, FLAG_ALIVE))
680 { 678 {
681 if (tmp->head) 679 if (tmp->head)
682 tmp = tmp->head; 680 tmp = tmp->head;
683 remove_ob (tmp); 681 tmp->remove ();
684 free_object (tmp); 682 tmp->destroy ();
685 tmp = get_map_ob (map, x, y); 683 tmp = GET_MAP_OB (map, x, y);
686 if (tmp == NULL) 684 if (tmp == NULL)
687 break; 685 break;
688 }; 686 };
689} 687}
690 688
692/* surrounds the point x,y by doors, so as to enclose something, like 690/* 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 691 a chest. It only goes as far as the 8 squares surrounding, and
694 it'll remove any monsters it finds.*/ 692 it'll remove any monsters it finds.*/
695 693
696object ** 694object **
697surround_by_doors (mapstruct *map, char **layout, int x, int y, int opts) 695surround_by_doors (maptile *map, char **layout, int x, int y, int opts)
698{ 696{
699 int i; 697 int i;
700 char *doors[2]; 698 char *doors[2];
701 object **doorlist; 699 object **doorlist;
702 int ndoors_made = 0; 700 int ndoors_made = 0;
735} 733}
736 734
737 735
738/* returns the first door in this square, or NULL if there isn't a door. */ 736/* returns the first door in this square, or NULL if there isn't a door. */
739object * 737object *
740door_in_square (mapstruct *map, int x, int y) 738door_in_square (maptile *map, int x, int y)
741{ 739{
742 object *tmp; 740 object *tmp;
743 741
744 for (tmp = get_map_ob (map, x, y); tmp != NULL; tmp = tmp->above) 742 for (tmp = GET_MAP_OB (map, x, y); tmp != NULL; tmp = tmp->above)
745 if (tmp->type == DOOR || tmp->type == LOCKED_DOOR) 743 if (tmp->type == DOOR || tmp->type == LOCKED_DOOR)
746 return tmp; 744 return tmp;
747 return NULL; 745 return NULL;
748} 746}
749 747
750 748
751/* the workhorse routine, which finds the doors in a room */ 749/* the workhorse routine, which finds the doors in a room */
752void 750void
753find_doors_in_room_recursive (char **layout, mapstruct *map, int x, int y, object **doorlist, int *ndoors, RMParms * RP) 751find_doors_in_room_recursive (char **layout, maptile *map, int x, int y, object **doorlist, int *ndoors, random_map_params *RP)
754{ 752{
755 int i, j; 753 int i, j;
756 object *door; 754 object *door;
757 755
758 /* bounds check x and y */ 756 /* bounds check x and y */
766 /* check off this point */ 764 /* check off this point */
767 if (layout[x][y] == '#') 765 if (layout[x][y] == '#')
768 { /* there could be a door here */ 766 { /* there could be a door here */
769 layout[x][y] = 1; 767 layout[x][y] = 1;
770 door = door_in_square (map, x, y); 768 door = door_in_square (map, x, y);
771 if (door != NULL) 769 if (door)
772 { 770 {
773 doorlist[*ndoors] = door; 771 doorlist[*ndoors] = door;
774 if (*ndoors > 254) /* eek! out of memory */ 772 if (*ndoors > 1022) /* eek! out of memory */
775 { 773 {
776 LOG (llevError, "find_doors_in_room_recursive:Too many doors for memory allocated!\n"); 774 LOG (llevError, "find_doors_in_room_recursive:Too many doors for memory allocated!\n");
777 return; 775 return;
778 } 776 }
777
779 *ndoors = *ndoors + 1; 778 *ndoors = *ndoors + 1;
780 } 779 }
781 } 780 }
782 else 781 else
783 { 782 {
784 layout[x][y] = 1; 783 layout[x][y] = 1;
785 /* now search all the 8 squares around recursively for free spots,in random order */ 784 /* 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++) 785 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); 786 find_doors_in_room_recursive (layout, map, x + freearr_x[i % 8 + 1], y + freearr_y[i % 8 + 1], doorlist, ndoors, RP);
789 }
790 } 787 }
791} 788}
792 789
793/* find a random non-blocked spot in this room to drop a key. */ 790/* find a random non-blocked spot in this room to drop a key. */
794object ** 791object **
795find_doors_in_room (mapstruct *map, int x, int y, RMParms * RP) 792find_doors_in_room (maptile *map, int x, int y, random_map_params *RP)
796{ 793{
797 char **layout2; 794 char **layout2;
798 object **doorlist; 795 object **doorlist;
799 int i, j; 796 int i, j;
800 int ndoors = 0; 797 int ndoors = 0;
801 798
802 doorlist = (object **) calloc (sizeof (int), 256); 799 doorlist = (object **) calloc (sizeof (int), 1024);
803
804 800
805 layout2 = (char **) calloc (sizeof (char *), RP->Xsize); 801 layout2 = (char **) calloc (sizeof (char *), RP->Xsize);
806 /* allocate and copy the layout, converting C to 0. */ 802 /* allocate and copy the layout, converting C to 0. */
807 for (i = 0; i < RP->Xsize; i++) 803 for (i = 0; i < RP->Xsize; i++)
808 { 804 {
817 /* setup num_free_spots and room_free_spots */ 813 /* setup num_free_spots and room_free_spots */
818 find_doors_in_room_recursive (layout2, map, x, y, doorlist, &ndoors, RP); 814 find_doors_in_room_recursive (layout2, map, x, y, doorlist, &ndoors, RP);
819 815
820 /* deallocate the temp. layout */ 816 /* deallocate the temp. layout */
821 for (i = 0; i < RP->Xsize; i++) 817 for (i = 0; i < RP->Xsize; i++)
822 {
823 free (layout2[i]); 818 free (layout2[i]);
824 } 819
825 free (layout2); 820 free (layout2);
826 return doorlist; 821 return doorlist;
827} 822}
828 823
829 824
830 825
831/* locks and/or hides all the doors in doorlist, or does nothing if 826/* locks and/or hides all the doors in doorlist, or does nothing if
832 opts doesn't say to lock/hide doors. */ 827 opts doesn't say to lock/hide doors. */
833 828
834void 829void
835lock_and_hide_doors (object **doorlist, mapstruct *map, int opts, RMParms * RP) 830lock_and_hide_doors (object **doorlist, maptile *map, int opts, random_map_params *RP)
836{ 831{
837 object *door; 832 object *door;
838 int i; 833 int i;
839 834
840 /* lock the doors and hide the keys. */ 835 /* lock the doors and hide the keys. */
842 if (opts & DOORED) 837 if (opts & DOORED)
843 { 838 {
844 for (i = 0, door = doorlist[0]; doorlist[i] != NULL; i++) 839 for (i = 0, door = doorlist[0]; doorlist[i] != NULL; i++)
845 { 840 {
846 object *new_door = get_archetype ("locked_door1"); 841 object *new_door = get_archetype ("locked_door1");
847 char keybuf[256]; 842 char keybuf[1024];
848 843
849 door = doorlist[i]; 844 door = doorlist[i];
850 new_door->face = door->face; 845 new_door->face = door->face;
851 new_door->x = door->x; 846 new_door->x = door->x;
852 new_door->y = door->y; 847 new_door->y = door->y;
853 remove_ob (door); 848 door->remove ();
854 free_object (door); 849 door->destroy ();
855 doorlist[i] = new_door; 850 doorlist[i] = new_door;
856 insert_ob_in_map (new_door, map, NULL, 0); 851 insert_ob_in_map (new_door, map, NULL, 0);
857 sprintf (keybuf, "%d", (int) RANDOM ()); 852 sprintf (keybuf, "%d", (int) RANDOM ());
858 new_door->slaying = keybuf; 853 new_door->slaying = keybuf;
859 keyplace (map, new_door->x, new_door->y, keybuf, NO_PASS_DOORS, 2, RP); 854 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); 870 retrofit_joined_wall (map, door->x + 1, door->y, 0, RP);
876 retrofit_joined_wall (map, door->x, door->y - 1, 0, RP); 871 retrofit_joined_wall (map, door->x, door->y - 1, 0, RP);
877 retrofit_joined_wall (map, door->x, door->y + 1, 0, RP); 872 retrofit_joined_wall (map, door->x, door->y + 1, 0, RP);
878 door->face = wallface->face; 873 door->face = wallface->face;
879 if (!QUERY_FLAG (wallface, FLAG_REMOVED)) 874 if (!QUERY_FLAG (wallface, FLAG_REMOVED))
880 remove_ob (wallface); 875 wallface->remove ();
881 free_object (wallface); 876 wallface->destroy ();
882 } 877 }
883 } 878 }
884 } 879 }
885} 880}

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines