From acd5eaa52f1201cc433bc6752b5a1d35c0cd6e29 Mon Sep 17 00:00:00 2001 From: chelsea Date: Sun, 3 May 2026 11:53:07 -0500 Subject: [PATCH] Add dry sand patches near beaches --- worldgen-c/bin/worldgen | Bin 169768 -> 169768 bytes worldgen-c/src/worldgen.c | 44 +++++++++++++++++++++++++++++++++++++- 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/worldgen-c/bin/worldgen b/worldgen-c/bin/worldgen index e2a4ac70a5c0d86a79a67ba412bf1d994e7e9326..8adb09c34eb9a7ac5027a07ddb79c301f7f2b566 100755 GIT binary patch delta 26161 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 E0Du`^`v3p{ diff --git a/worldgen-c/src/worldgen.c b/worldgen-c/src/worldgen.c index e3288a0..f69c0a6 100644 --- a/worldgen-c/src/worldgen.c +++ b/worldgen-c/src/worldgen.c @@ -131,6 +131,7 @@ static inline double smoothstep01(double v) { } static int ground_slope(worldgen_ctx *ctx, int x, int z); +static int is_dry_beach_sand_patch(worldgen_ctx *ctx, const column_data *data, int world_x, int world_z); static uint16_t select_surface_block(worldgen_ctx *ctx, const column_data *data, int world_x, int world_z); static void generate_chunk_trails(worldgen_ctx *ctx, int chunk_x, int chunk_z, column_data columns[CHUNK_SIZE][CHUNK_SIZE], chunk_data *out); static void generate_chunk_redwood_floor(worldgen_ctx *ctx, int chunk_x, int chunk_z, @@ -937,6 +938,36 @@ static int generate_coal(worldgen_ctx *ctx, int x, int y, int z, int column_heig // --------------------------------------------------------------------------- // Terrain block generation // --------------------------------------------------------------------------- +static int is_dry_beach_sand_patch(worldgen_ctx *ctx, const column_data *data, int world_x, int world_z) { + if (data->has_water && data->water_surface >= data->height) return 0; + if (ground_slope(ctx, world_x, world_z) > 2) return 0; + + int nearest_water_dist2 = 9999; + int shore_level = ctx->sea_level; + for (int dx = -7; dx <= 7; ++dx) { + for (int dz = -7; dz <= 7; ++dz) { + int dist2 = dx * dx + dz * dz; + if (dist2 == 0 || dist2 > 49) continue; + column_data neighbor = get_column_data(ctx, world_x + dx, world_z + dz); + if (!neighbor.has_water || neighbor.water_surface < neighbor.height) continue; + if (data->height < neighbor.water_surface - 1 || data->height > neighbor.water_surface + 4) continue; + if (dist2 < nearest_water_dist2) { + nearest_water_dist2 = dist2; + shore_level = neighbor.water_surface; + } + } + } + if (nearest_water_dist2 == 9999) return 0; + if (data->height > shore_level + 4) return 0; + + double broad = simplex_noise2(&ctx->noise, (world_x + 72000) * 0.045, (world_z - 72000) * 0.045) * 0.5 + 0.5; + double ragged = simplex_noise2(&ctx->noise, (world_x - 81000) * 0.16, (world_z + 81000) * 0.16) * 0.5 + 0.5; + double patch = broad * 0.7 + ragged * 0.3; + double near_bonus = clamp01((18.0 - (double)nearest_water_dist2) / 18.0) * 0.18; + double height_penalty = clamp01((double)(data->height - shore_level) / 4.0) * 0.16; + return patch + near_bonus - height_penalty > 0.56; +} + static uint16_t select_surface_block(worldgen_ctx *ctx, const column_data *data, int world_x, int world_z) { if (data->has_water && data->water_surface >= data->height) { int slope = ground_slope(ctx, world_x, world_z); @@ -964,6 +995,9 @@ static uint16_t select_surface_block(worldgen_ctx *ctx, const column_data *data, double noise = simplex_noise2(&ctx->noise, world_x * 0.02, world_z * 0.02) * 0.5 + 0.5; if (noise < t) return BLOCK_SNOW; } + if (is_dry_beach_sand_patch(ctx, data, world_x, world_z)) { + return BLOCK_SAND; + } if (data->biome == BIOME_REDWOOD_FOREST) { int slope = ground_slope(ctx, world_x, world_z); if (slope >= 5) return BLOCK_STONE; @@ -3973,7 +4007,15 @@ void worldgen_generate_chunk(worldgen_ctx *ctx, int chunk_x, int chunk_z, chunk_ out->blocks[y][dx][dz] = BLOCK_DIRT; } if (cd.height >= 0 && cd.height < CHUNK_HEIGHT) { - out->blocks[cd.height][dx][dz] = select_surface_block(ctx, &cd, world_x, world_z); + uint16_t surface = select_surface_block(ctx, &cd, world_x, world_z); + if (surface == BLOCK_SAND) { + int sand_bottom = cd.height - 2; + if (sand_bottom < dirt_start) sand_bottom = dirt_start; + for (int y = sand_bottom; y < cd.height; ++y) { + if (y > 0 && y < CHUNK_HEIGHT) out->blocks[y][dx][dz] = BLOCK_SAND; + } + } + out->blocks[cd.height][dx][dz] = surface; } if (cd.has_water) { int water_top = cd.water_surface;