summaryrefslogtreecommitdiff
path: root/src/game/worldgen.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/game/worldgen.cpp')
-rw-r--r--src/game/worldgen.cpp119
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);
}
}