#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; if (noise < 0.3) return; if (noise > 0.5) type = DECO_NEST; else if (noise > 0.40) type = DECO_EYETHING; else if (noise > 0.35) type = DECO_STONE; else type = DECO_STONE_SMALL; 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; deco = new deco_t(game, type); deco->phase_shift = offset[0] * 500.0; deco->place(world, x); } void worldgen(world_t *world, sector_index_t index, sector_t *sector, void *data) { state_t *game = (game::state_t*)data; 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; float deco_noise; 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; deco_noise = world->perlin.get(x, 0.125559f); if (tile->type == TILE_DIRT) add_decoration(world, game, x, deco_noise); } } }