--- deliantra/server/random_maps/treasure.C 2007/07/01 05:00:19 1.30
+++ deliantra/server/random_maps/treasure.C 2008/04/14 22:41:17 1.35
@@ -1,11 +1,11 @@
/*
- * This file is part of Crossfire TRT, the Roguelike Realtime MORPG.
+ * This file is part of Deliantra, the Roguelike Realtime MMORPG.
*
- * Copyright (©) 2005,2006,2007 Marc Alexander Lehmann / Robin Redeker / the Crossfire TRT 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
*
- * Crossfire TRT is free software: you can redistribute it and/or modify
+ * Deliantra is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
@@ -18,7 +18,7 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*
- * The authors can be reached via e-mail to
+ * The authors can be reached via e-mail to
*/
/* placing treasure in maps, where appropriate. */
@@ -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)
{
@@ -430,7 +435,7 @@
return 1;
}
- insert_ob_in_ob (the_key, the_keymaster);
+ insert_ob_in_ob (the_key, the_keymaster->head_ ());
return 1;
}
@@ -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)
{