diff --git a/src/server/terrain/biomes.zig b/src/server/terrain/biomes.zig index 96dbdd58..9f50876f 100644 --- a/src/server/terrain/biomes.zig +++ b/src/server/terrain/biomes.zig @@ -326,6 +326,7 @@ pub const Biome = struct { // MARK: Biome .chance = src.get(f32, "chance", 1), .propertyMask = GenerationProperties.fromZon(src.getChild("properties"), false), .width = src.get(u8, "width", 2), + .keepOriginalTerrain = src.get(f32, "keepOriginalTerrain", 0), }; // Fill all unspecified property groups: var properties: u12 = @bitCast(dst.propertyMask); @@ -587,12 +588,14 @@ const UnfinishedTransitionBiomeData = struct { chance: f32, propertyMask: Biome.GenerationProperties, width: u8, + keepOriginalTerrain: f32, }; const TransitionBiome = struct { biome: *const Biome, chance: f32, propertyMask: Biome.GenerationProperties, width: u8, + keepOriginalTerrain: f32, }; var unfinishedTransitionBiomes: std.StringHashMapUnmanaged([]UnfinishedTransitionBiomeData) = .{}; @@ -695,12 +698,14 @@ pub fn finishLoading() void { .chance = 0, .propertyMask = .{}, .width = 0, + .keepOriginalTerrain = 0, }; continue; }, .chance = src.chance, .propertyMask = src.propertyMask, .width = src.width, + .keepOriginalTerrain = src.keepOriginalTerrain, }; } main.globalAllocator.free(transitionBiomes); diff --git a/src/server/terrain/climategen/NoiseBasedVoronoi.zig b/src/server/terrain/climategen/NoiseBasedVoronoi.zig index 0105e950..a6aba38c 100644 --- a/src/server/terrain/climategen/NoiseBasedVoronoi.zig +++ b/src/server/terrain/climategen/NoiseBasedVoronoi.zig @@ -358,12 +358,13 @@ const GenerationStructure = struct { result = (result | result >> 1 | result >> 2); if(result & mask == mask) { if(random.nextFloat(&seed) < transitionBiome.chance) { + const newHeight = @as(f32, @floatFromInt(transitionBiome.biome.minHeight)) + @as(f32, @floatFromInt(transitionBiome.biome.maxHeight - transitionBiome.biome.minHeight))*random.nextFloat(&seed); map[x][y] = .{ .biome = transitionBiome.biome, - .roughness = transitionBiome.biome.roughness, - .hills = transitionBiome.biome.hills, - .mountains = transitionBiome.biome.mountains, - .height = @as(f32, @floatFromInt(transitionBiome.biome.minHeight)) + @as(f32, @floatFromInt(transitionBiome.biome.maxHeight - transitionBiome.biome.minHeight))*random.nextFloat(&seed), + .roughness = std.math.lerp(transitionBiome.biome.roughness, map[x][y].roughness, transitionBiome.keepOriginalTerrain), + .hills = std.math.lerp(transitionBiome.biome.hills, map[x][y].hills, transitionBiome.keepOriginalTerrain), + .mountains = std.math.lerp(transitionBiome.biome.mountains, map[x][y].mountains, transitionBiome.keepOriginalTerrain), + .height = std.math.lerp(newHeight, map[x][y].height, transitionBiome.keepOriginalTerrain), .seed = map[x][y].seed, }; break;