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.8 by root, Tue Dec 12 20:53: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
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" */
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 the_chest->destroy (0); 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;
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 (maptile *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 (maptile *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, maptile *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 (maptile *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 (maptile *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 (maptile *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;
673void 671void
674remove_monsters (int x, int y, maptile *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 tmp->remove (); 681 tmp->remove ();
684 tmp->destroy (0); 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
739object * 737object *
740door_in_square (maptile *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, maptile *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 (maptile *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, maptile *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 door->remove (); 848 door->remove ();
854 door->destroy (0); 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);
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 wallface->remove (); 875 wallface->remove ();
881 wallface->destroy (0); 876 wallface->destroy ();
882 } 877 }
883 } 878 }
884 } 879 }
885} 880}

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines