--- deliantra/server/random_maps/treasure.C 2007/11/08 19:43:25 1.32 +++ deliantra/server/random_maps/treasure.C 2008/04/14 22:41:17 1.35 @@ -1,7 +1,7 @@ /* * This file is part of Deliantra, the Roguelike Realtime MMORPG. * - * Copyright (©) 2005,2006,2007 Marc Alexander Lehmann / Robin Redeker / the Deliantra team + * Copyright (©) 2005,2006,2007,2008 Marc Alexander Lehmann / Robin Redeker / the Deliantra team * Copyright (©) 2001,2007 Mark Wedel & Crossfire Development Team * Copyright (©) 1992,2007 Frank Tore Johansen * @@ -120,7 +120,6 @@ /* all the treasure at one spot in the map. */ if (treasureoptions & CONCENTRATED) { - /* map_layout_style global, and is previously set */ switch (RP->map_layout_style) { @@ -138,18 +137,20 @@ if (layout[i][j] == 'C' || layout[i][j] == '>') { int tdiv = RP->symmetry_used; - object **doorlist; object *chest; if (tdiv == 3) tdiv = 2; /* this symmetry uses a divisor of 2 */ + /* don't put a chest on an exit. */ chest = place_chest (treasureoptions, i, j, map, style_map, num_treasures / tdiv, RP); + if (!chest) continue; /* if no chest was placed NEXT */ + if (treasureoptions & (DOORED | HIDDEN)) { - doorlist = find_doors_in_room (map, i, j, RP); + object **doorlist = find_doors_in_room (map, i, j, RP); lock_and_hide_doors (doorlist, map, treasureoptions, RP); free (doorlist); } @@ -171,13 +172,18 @@ i = rndm (RP->Xsize - 2) + 1; j = rndm (RP->Ysize - 2) + 1; find_enclosed_spot (map, &i, &j, RP); + if (wall_blocked (map, i, j)) i = -1; + tries++; } + chest = place_chest (treasureoptions, i, j, map, style_map, num_treasures, RP); + if (!chest) return; + i = chest->x; j = chest->y; if (treasureoptions & (DOORED | HIDDEN)) @@ -205,7 +211,6 @@ /* put a chest into the map, near x and y, with the treasure style determined (may be null, or may be a treasure list from lib/treasures, if the global variable "treasurestyle" is set to that treasure list's name */ - object * place_chest (int treasureoptions, int x, int y, maptile *map, maptile *style_map, int n_treasures, random_map_params *RP) { @@ -503,18 +508,16 @@ { layout2[i] = (char *) calloc (sizeof (char), RP->Ysize); for (j = 0; j < RP->Ysize; j++) - { - if (wall_blocked (map, i, j)) - layout2[i][j] = '#'; - } + if (wall_blocked (map, i, j)) + layout2[i][j] = '#'; } + theMonsterToFind = find_monster_in_room_recursive (layout2, map, x, y, RP); /* deallocate the temp. layout */ for (i = 0; i < RP->Xsize; i++) - { - free (layout2[i]); - } + free (layout2[i]); + free (layout2); return theMonsterToFind; @@ -748,7 +751,6 @@ return NULL; } - /* the workhorse routine, which finds the doors in a room */ void find_doors_in_room_recursive (char **layout, maptile *map, int x, int y, object **doorlist, int *ndoors, random_map_params *RP) @@ -772,6 +774,7 @@ if (door) { doorlist[*ndoors] = door; + if (*ndoors > 1022) /* eek! out of memory */ { LOG (llevError, "find_doors_in_room_recursive:Too many doors for memory allocated!\n"); @@ -797,41 +800,27 @@ object ** find_doors_in_room (maptile *map, int x, int y, random_map_params *RP) { - char **layout2; - object **doorlist; int i, j; int ndoors = 0; - doorlist = (object **) calloc (sizeof (int), 1024); + object **doorlist = (object **)calloc (sizeof (int), 1024); + + MazeData layout2 (RP->Xsize, RP->Ysize); - layout2 = (char **) calloc (sizeof (char *), RP->Xsize); /* allocate and copy the layout, converting C to 0. */ for (i = 0; i < RP->Xsize; i++) - { - layout2[i] = (char *) calloc (sizeof (char), RP->Ysize); - for (j = 0; j < RP->Ysize; j++) - { - if (wall_blocked (map, i, j)) - layout2[i][j] = '#'; - } - } + for (j = 0; j < RP->Ysize; j++) + if (wall_blocked (map, i, j)) + layout2[i][j] = '#'; /* setup num_free_spots and room_free_spots */ find_doors_in_room_recursive (layout2, map, x, y, doorlist, &ndoors, RP); - /* deallocate the temp. layout */ - for (i = 0; i < RP->Xsize; i++) - free (layout2[i]); - - free (layout2); return doorlist; } - - /* locks and/or hides all the doors in doorlist, or does nothing if opts doesn't say to lock/hide doors. */ - void lock_and_hide_doors (object **doorlist, maptile *map, int opts, random_map_params *RP) {