2 #include "server/biomes.h"
3 #include "server/mapgen.h"
4 #include "server/server_map.h"
8 static s32 height_mountain(v3s32 pos, f64 factor, s32 height)
10 return pow((height + 96) * pow(((smooth2d(U32(pos.x) / 48.0, U32(pos.z) / 48.0, 0, seed + SO_MOUNTAIN_HEIGHT) + 1.0) * 256.0 + 128.0), factor), 1.0 / (factor + 1.0)) - 96;
13 static Node generate_mountain(unused v3s32 pos, s32 diff, unused f64 wetness, unused f64 temperature, unused f64 factor, unused MapBlock *block, unused List *changed_blocks)
15 return diff <= 0 ? NODE_STONE : NODE_AIR;
27 static f64 ocean_level_start[OL_COUNT] = {
34 static OceanLevel get_ocean_level(f64 factor)
36 if (factor >= ocean_level_start[OL_DEEP_OCEAN])
38 else if (factor >= ocean_level_start[OL_OCEAN])
40 else if (factor >= ocean_level_start[OL_BEACH])
46 static s32 mix(s32 a, s32 b, f64 f)
48 return (a * (1.0 - f) + b * f);
51 static f64 get_ocean_level_factor(f64 factor, OceanLevel level)
54 start = ocean_level_start[level];
55 end = ++level == OL_COUNT ? 1.0 : ocean_level_start[level];
57 return (factor - start) / (end - start);
60 static s32 height_ocean(unused v3s32 pos, f64 factor, s32 height)
62 switch (get_ocean_level(factor)) {
64 return mix(height + 1, 0, get_ocean_level_factor(factor, OL_BEACH_EDGE));
70 return mix(0, -10, get_ocean_level_factor(factor, OL_OCEAN));
73 return mix(-10, -50, get_ocean_level_factor(factor, OL_DEEP_OCEAN));
82 static Node generate_ocean(unused v3s32 pos, s32 diff, unused f64 wetness, unused f64 temperature, unused f64 factor, unused MapBlock *block, unused List *changed_blocks)
94 static s32 height_hills(unused v3s32 pos, unused f64 factor, s32 height)
99 static Node generate_hills(v3s32 pos, s32 diff, unused f64 wetness, unused f64 temperature, unused f64 factor, unused MapBlock *block, List *changed_blocks)
101 if (diff == 2 && smooth2d(U32(pos.x), U32(pos.z), 0, seed + SO_BOULDER_CENTER) > 0.999) {
102 for (s8 bx = -1; bx <= 1; bx++) {
103 for (s8 by = -1; by <= 1; by++) {
104 for (s8 bz = -1; bz <= 1; bz++) {
105 v3s32 bpos = {pos.x + bx, pos.y + by, pos.z + bz};
106 if (smooth3d(bpos.x, bpos.y, bpos.z, 0, seed + SO_BOULDER) > 0.0)
107 mapgen_set_node(bpos, map_node_create(NODE_STONE), MGS_BOULDERS, changed_blocks);
123 static BiomeDef biomes[NUM_BIOMES] = {
126 .offset = SO_MOUNTAIN,
127 .height = &height_mountain,
128 .generate = &generate_mountain,
133 .height = &height_ocean,
134 .generate = &generate_ocean,
139 .height = &height_hills,
140 .generate = &generate_hills,
144 BiomeDef *get_biome(v3s32 pos, f64 *factor)
146 for (int i = 0; i < NUM_BIOMES; i++) {
147 BiomeDef *def = &biomes[i];
148 f64 f = (smooth2d(U32(pos.x) / 1024.0, U32(pos.z) / 1024.0, 0, seed + def->offset) * 0.5 - 0.5 + def->probability) / def->probability;