#include "game.hpp" namespace game { using namespace world; 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; 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.39) { unit_nest_t *nest = new unit_nest_t(game); nest->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; deco = new deco_t(game, type); deco->phase_shift = offset[0] * 500.0; deco->place(world, center); } 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; tile_index_t tile_index(index[0] * SECTOR_SIZE + lx, index[1] * SECTOR_SIZE + ly); v2f_t x; float 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; 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; } 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); } } }