--- deliantra/server/random_maps/treasure.C 2008/04/11 21:09:53 1.33 +++ deliantra/server/random_maps/treasure.C 2008/05/02 21:01:53 1.37 @@ -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) { @@ -142,6 +141,7 @@ 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); @@ -159,6 +159,7 @@ } break; } + default: { int i, j, tries; @@ -172,13 +173,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)) @@ -206,7 +212,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) { @@ -262,19 +267,18 @@ if (treasureoptions & TRAPPED) { maptile *trap_map = find_style ("/styles/trapstyles", "traps", -1); - object *the_trap; if (trap_map) { - the_trap = trap_map->pick_random_object (); + object *the_trap = trap_map->pick_random_object (); + the_trap->stats.Cha = 10 + RP->difficulty; the_trap->level = bc_random ((3 * RP->difficulty) / 2); + if (the_trap) { - object *new_trap; + object *new_trap = the_trap->arch->instance ();//TODO: why not clone? - new_trap = arch_to_object (the_trap->arch); - new_trap->copy_to (the_trap); new_trap->x = x; new_trap->y = y; insert_ob_in_ob (new_trap, the_chest); @@ -484,37 +488,29 @@ if (theMonsterToFind != NULL) return theMonsterToFind; } + return theMonsterToFind; } - /* sets up some data structures: the _recursive form does the real work. */ - object * find_monster_in_room (maptile *map, int x, int y, random_map_params *RP) { - char **layout2; - int i, j; + Layout layout2 (RP); + + layout2->clear (); - theMonsterToFind = 0; - 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 (int i = 0; i < layout2->w; i++) + for (int j = 0; j < layout2->h; j++) + if (wall_blocked (map, i, j)) + layout2[i][j] = '#'; + theMonsterToFind = 0; 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); + layout2.free (); return theMonsterToFind; } @@ -799,15 +795,15 @@ int i, j; int ndoors = 0; - object **doorlist = (object **) calloc (sizeof (int), 1024); + object **doorlist = (object **)calloc (sizeof (int), 1024); - MazeData layout2 (RP->Xsize, RP->Ysize); + LayoutData layout2 (RP->Xsize, RP->Ysize); + layout2.clear (); /* allocate and copy the layout, converting C to 0. */ for (i = 0; i < RP->Xsize; i++) for (j = 0; j < RP->Ysize; j++) - if (wall_blocked (map, i, j)) - layout2[i][j] = '#'; + layout2[i][j] = wall_blocked (map, i, j) ? '#' : 0; /* setup num_free_spots and room_free_spots */ find_doors_in_room_recursive (layout2, map, x, y, doorlist, &ndoors, RP); @@ -861,9 +857,12 @@ retrofit_joined_wall (map, door->x + 1, door->y, 0, RP); retrofit_joined_wall (map, door->x, door->y - 1, 0, RP); retrofit_joined_wall (map, door->x, door->y + 1, 0, RP); + door->face = wallface->face; + if (!QUERY_FLAG (wallface, FLAG_REMOVED)) wallface->remove (); + wallface->destroy (); } }