From c0aa968809c8d8ef88048edd667b12b297a68602 Mon Sep 17 00:00:00 2001 From: Darshan Shaligram Date: Sat, 16 Jan 2010 22:50:34 +0530 Subject: Experimental level builder changes for Swamp. The Swamp now gets a border of trees and uses trees instead of walls. Swamp:5 vaults may need tweaking to fit in better. --- crawl-ref/source/dgn-swamp.cc | 108 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 crawl-ref/source/dgn-swamp.cc (limited to 'crawl-ref/source/dgn-swamp.cc') diff --git a/crawl-ref/source/dgn-swamp.cc b/crawl-ref/source/dgn-swamp.cc new file mode 100644 index 0000000000..b20627e2d3 --- /dev/null +++ b/crawl-ref/source/dgn-swamp.cc @@ -0,0 +1,108 @@ +#include "AppHdr.h" + +#include "coordit.h" +#include "dungeon.h" +#include "dgn-height.h" +#include "random.h" + +static void _swamp_slushy_patches(int depth_multiplier) +{ + const int margin = 6; + const int yinterval = 4; + const int xinterval = 4; + const int fuzz = 9; + const coord_def grdc(GXM / 2, GYM / 2); + for (int y = margin; y < GYM - margin - 1; y += yinterval) + { + for (int x = margin; x < GXM - margin - 1; x += xinterval) + { + const coord_def p(x, y); + const coord_def c(dgn_random_point_from(p, fuzz, margin)); + const coord_def center_delta(grdc - c); + const int depth = 1600 - center_delta.abs(); + const int depth_offset = depth * 10 / 1600; + dgn_island_centred_at(c, random_range(5, 25 - depth_multiplier / 2), + random_range(2, 6), + int_range(8 + depth_offset, + 17 + depth_offset), + margin); + } + } +} + +static dungeon_feature_type _swamp_feature_for_height(int height) +{ + return height >= 14? DNGN_DEEP_WATER : + height > 0? DNGN_SHALLOW_WATER : + height > -9 ? DNGN_FLOOR : + height > -13 ? DNGN_SHALLOW_WATER : + height > -17 && coinflip() ? DNGN_SHALLOW_WATER : + DNGN_TREES; +} + +static void _swamp_apply_features(int margin) +{ + for (rectangle_iterator ri(0); ri; ++ri) + { + const coord_def c(*ri); + if (unforbidden(c, MMT_VAULT)) + { + if (c.x < margin || c.y < margin || c.x >= GXM - margin + || c.y >= GYM - margin) + grd(c) = DNGN_TREES; + else + grd(c) = _swamp_feature_for_height(dgn_height_at(c)); + } + } +} + +void dgn_build_swamp_level(int level) +{ + const int swamp_depth = level_id::current().depth - 1; + dgn_initialise_heightmap(-17); + _swamp_slushy_patches(swamp_depth * 3); + dgn_smooth_heights(); + _swamp_apply_features(2); + + dgn_place_stone_stairs(); + process_disconnected_zones(0, 0, GXM - 1, GYM - 1, true, DNGN_TREES); +} + + +#if OLD_SWAMP_LAYOUT +void dgn_prepare_swamp() +{ + dgn_Build_Method += " swamp"; + dgn_Layout_Type = "swamp"; + + const int margin = 5; + + for (int i = margin; i < (GXM - margin); i++) + for (int j = margin; j < (GYM - margin); j++) + { + // Don't apply Swamp prep in vaults. + if (!unforbidden(coord_def(i, j), MMT_VAULT)) + continue; + + // doors -> floors {dlb} + if (grd[i][j] == DNGN_CLOSED_DOOR || grd[i][j] == DNGN_SECRET_DOOR) + grd[i][j] = DNGN_FLOOR; + + // floors -> shallow water 1 in 3 times {dlb} + if (grd[i][j] == DNGN_FLOOR && one_chance_in(3)) + grd[i][j] = DNGN_SHALLOW_WATER; + + // walls -> deep/shallow water or remain unchanged {dlb} + if (grd[i][j] == DNGN_ROCK_WALL) + { + const int temp_rand = random2(6); + + if (temp_rand > 0) // 17% chance unchanged {dlb} + { + grd[i][j] = ((temp_rand > 2) ? DNGN_SHALLOW_WATER // 50% + : DNGN_DEEP_WATER); // 33% + } + } + } +} +#endif -- cgit v1.2.3-54-g00ecf