diff options
Diffstat (limited to 'src/game')
-rw-r--r-- | src/game/assets.cpp | 2 | ||||
-rw-r--r-- | src/game/decos.cpp | 10 | ||||
-rw-r--r-- | src/game/game.hpp | 8 | ||||
-rw-r--r-- | src/game/worldgen.cpp | 41 |
4 files changed, 50 insertions, 11 deletions
diff --git a/src/game/assets.cpp b/src/game/assets.cpp index 6751435..e4d6475 100644 --- a/src/game/assets.cpp +++ b/src/game/assets.cpp @@ -29,6 +29,8 @@ void load(void) deco.stone.load("assets/deco/stone_", 1); deco.eyething.load("assets/deco/eyething_", 2); + deco.spike.load("assets/deco/spike_", 1); + deco.spike_small.load("assets/deco/spike_small_", 1); world::register_tile(TILE_DIRT, 0); render::register_tile(TILE_DIRT, "assets/tiles/dirt.png"); diff --git a/src/game/decos.cpp b/src/game/decos.cpp index 07e6b10..9027ee0 100644 --- a/src/game/decos.cpp +++ b/src/game/decos.cpp @@ -23,6 +23,16 @@ static const struct { &assets::deco.eyething, {-0.4f, +0.1f}, {+0.4f, +0.4f}, CF_SOLID, {-0.4f, -1.2f}, {+0.4f, +0.4f}, 0.3 + }, + { + &assets::deco.spike, + {-0.4f, +0.1f}, {+0.4f, +0.4f}, CF_SOLID, + {-0.4f, -1.2f}, {+0.4f, +0.4f}, 0.0 + }, + { + &assets::deco.spike_small, + {-0.2f, +0.1f}, {+0.2f, +0.2f}, 0, + {-0.2f, -0.6f}, {+0.2f, +0.2f}, 0.0 } }; diff --git a/src/game/game.hpp b/src/game/game.hpp index 7b0674c..d055aa5 100644 --- a/src/game/game.hpp +++ b/src/game/game.hpp @@ -24,7 +24,8 @@ namespace game { extern size_t selection_cookie; - void worldgen(world::world_t *world, world::sector_index_t index, world::sector_t *sector, void *data); + void worldgen(world::world_t *world, world::sector_index_t index, world::sector_t *sector, + bool gen_tiles, bool gen_decos, void *data); namespace assets { typedef struct { @@ -49,6 +50,7 @@ namespace game { typedef struct { render::animated_texture_t stone, eyething; + render::animated_texture_t spike, spike_small; } deco_assets_t; extern soldier_assets_t soldier; @@ -250,7 +252,9 @@ namespace game { typedef enum { DECO_STONE, DECO_STONE_SMALL, - DECO_EYETHING + DECO_EYETHING, + DECO_SPIKE, + DECO_SPIKE_SMALL } deco_type_t; class deco_t : public game::entity_t { diff --git a/src/game/worldgen.cpp b/src/game/worldgen.cpp index 18a98b5..6ade1a6 100644 --- a/src/game/worldgen.cpp +++ b/src/game/worldgen.cpp @@ -4,29 +4,37 @@ namespace game { using namespace world; -void add_decoration(world_t *world, state_t *game, v2f_t x, float noise) +void add_decoration(world_t *world, state_t *game, v2f_t x) { + float noise; deco_t *deco; deco_type_t type; v2f_t center, offset; - if (noise < 0.3) + 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.5) { + if (noise > 0.39) { unit_nest_t *nest = new unit_nest_t(game); nest->place(world, center); return; } - if (noise > 0.40) + if (noise > 0.36) type = DECO_EYETHING; - else if (noise > 0.35) + 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; @@ -35,10 +43,14 @@ void add_decoration(world_t *world, state_t *game, v2f_t x, float noise) deco->place(world, x); } -void worldgen(world_t *world, sector_index_t index, sector_t *sector, void *data) +void worldgen(world_t *world, sector_index_t index, sector_t *sector, + bool gen_tiles, bool gen_decos, void *data) { state_t *game = (game::state_t*)data; + if (!gen_tiles) + goto decos; + for (coord_t ly = 0; ly < SECTOR_SIZE; ly++) for (coord_t lx = 0; lx < SECTOR_SIZE; lx++) { tile_t *tile = sector->tiles + ly * SECTOR_SIZE + lx; @@ -46,7 +58,6 @@ void worldgen(world_t *world, sector_index_t index, sector_t *sector, void *data index[1] * SECTOR_SIZE + ly); v2f_t x; float waterlevel, height; - float deco_noise; x = v2f_t(index) * SECTOR_SIZE + v2f_t(lx, ly); @@ -67,11 +78,23 @@ void worldgen(world_t *world, sector_index_t index, sector_t *sector, void *data tile->type = TILE_STONE; else tile->type = TILE_DIRT; + } - deco_noise = world->perlin.get(x, 0.125559f); +decos: + if (!gen_decos) + return; + + for (coord_t ly = 0; ly < SECTOR_SIZE; ly++) + for (coord_t lx = 0; lx < SECTOR_SIZE; lx++) { + tile_t *tile = sector->tiles + ly * SECTOR_SIZE + lx; + tile_index_t tile_index(index[0] * SECTOR_SIZE + lx, + index[1] * SECTOR_SIZE + ly); + v2f_t x; + + x = v2f_t(index) * SECTOR_SIZE + v2f_t(lx, ly); if (tile->type == TILE_DIRT) - add_decoration(world, game, x, deco_noise); + add_decoration(world, game, x); } } |