diff options
Diffstat (limited to 'src/game/worldgen.cpp')
-rw-r--r-- | src/game/worldgen.cpp | 119 |
1 files changed, 90 insertions, 29 deletions
diff --git a/src/game/worldgen.cpp b/src/game/worldgen.cpp index f7d4757..8a6addf 100644 --- a/src/game/worldgen.cpp +++ b/src/game/worldgen.cpp @@ -4,9 +4,9 @@ namespace game { using namespace world; -static void add_entity(world_t *world, state_t *game, v2f_t x) +static void add_entity(uint8_t tile_type, world_t *world, state_t *game, v2f_t x) { - float noise; + float noise, noise_nest, noise_spider; deco_t *deco; deco_type_t type; v2f_t center, offset; @@ -14,33 +14,77 @@ static void add_entity(world_t *world, state_t *game, v2f_t x) noise = world->perlin.get(x, 0.53213f) + world->perlin.get(x, 0.12994f); noise = fabs(noise / 2); - if (noise < 0.16) - return; - offset[0] = world->perlin.get(x, 0.17331f); offset[1] = world->perlin.get(x, 0.19571f); center = x + v2f_t(0.5f, 0.5f) + offset.norm() * 0.1; - if (noise > 0.42) { + switch (tile_type) { + case TILE_DIRT: + noise_nest = 0.42f; + noise_spider = 0.39f; + break; + + case TILE_DIRT_RED: + noise_nest = 0.45f; + noise_spider = 0.41f; + break; + + case TILE_GRAVEL: + noise_nest = 0.36f; + noise_spider = 0.33f; + break; + + default: + goto just_decos; + } + + + if (noise > noise_nest) { unit_nest_t *nest = new unit_nest_t(game); nest->place(world, center); return; - } else if (noise > 0.39) { + } else if (noise > noise_spider) { unit_spider_t *spider = new unit_spider_t(game); spider->place(world, center); return; } - if (noise > 0.36) - type = DECO_EYETHING; - else if (noise > 0.33) - type = DECO_STONE; - else if (noise > 0.26) - type = DECO_SPIKE; - else if (noise > 0.20) - type = DECO_SPIKE_SMALL; - else - type = DECO_STONE_SMALL; +just_decos: + switch (tile_type) { + case TILE_DIRT_RED: + if (noise > 0.21) + type = DECO_EYETHING; + else if (noise > 0.08) + type = DECO_WART; + else + return; + break; + + case TILE_DIRT: + if (noise > 0.33) + type = DECO_STONE; + else if (noise > 0.26) + type = DECO_SPIKE; + else if (noise > 0.20) + type = DECO_SPIKE_SMALL; + else if (noise > 0.16) + type = DECO_STONE_SMALL; + else + return; + break; + + case TILE_GRAVEL: + if (noise > 0.30) + type = DECO_STONE; + else if (noise > 0.13) + type = DECO_STONE_SMALL; + else + return; + break; + + default: + return; + } deco = new deco_t(game, type); deco->phase_shift = offset[0] * 500.0; @@ -61,27 +105,46 @@ void worldgen(world_t *world, sector_index_t index, sector_t *sector, tile_index_t tile_index(index[0] * SECTOR_SIZE + lx, index[1] * SECTOR_SIZE + ly); v2f_t x; - float waterlevel, height; + float biome, waterlevel, height; x = v2f_t(index) * SECTOR_SIZE + v2f_t(lx, ly); waterlevel = world->perlin.get(x, 1000.0f) * 0.3f + world->perlin.get(x, 500.0f) * 0.1f; + biome = world->perlin.get(x - v2f_t(60, 20), 160.0f) * 0.4f + + world->perlin.get(x, 30.0f) * 0.2f + + world->perlin.get(x, 5.0f) * 0.03f; + + height = world->perlin.get(x, 40.0f) * 0.6f + world->perlin.get(x, 20.0f) * 0.25f + world->perlin.get(x, 10.0f) * 0.2f + world->perlin.get(x, 4.0f) * 0.1f + world->perlin.get(x, 1.0f) * 0.05f; - if (height < waterlevel) - tile->type = TILE_WATER; - else if (height < waterlevel + 0.1) - tile->type = TILE_DIRT; - else if (world->perlin.get(x, 3.0f) > 0.0f) - tile->type = TILE_STONE; - else - tile->type = TILE_DIRT; + if (biome < 0.0f) { + if (height < waterlevel) + tile->type = TILE_WATER; + else if (height < waterlevel + 0.1) + tile->type = TILE_DIRT; + else if (world->perlin.get(x, 3.0f) > 0.0f) + tile->type = TILE_STONE; + else + tile->type = TILE_DIRT; + } else if (biome < 0.1f) { + if (height < waterlevel - 0.07f) + tile->type = TILE_STONE; + else + tile->type = TILE_GRAVEL; + } else { + if (height < waterlevel) + tile->type = TILE_DIRT_RED; + else if (world->perlin.get(x, 3.0f) > 0.0f) + tile->type = TILE_STONE_RED; + else + tile->type = TILE_DIRT_RED; + } } decos: @@ -96,9 +159,7 @@ decos: v2f_t x; x = v2f_t(index) * SECTOR_SIZE + v2f_t(lx, ly); - - if (tile->type == TILE_DIRT) - add_entity(world, game, x); + add_entity(tile->type, world, game, x); } } |