From 5bb1e05acfdcf07332d6b2572c34d81d7663384c Mon Sep 17 00:00:00 2001 From: chelsea Date: Fri, 5 Dec 2025 00:33:59 -0600 Subject: [PATCH] Add redwood biome and trail updates --- .gitignore | 4 +- worldgen-c/bin/worldgen | Bin 140064 -> 148496 bytes worldgen-c/src/worldgen.c | 521 ++++++++++++++++++++++++++++++++++---- 3 files changed, 470 insertions(+), 55 deletions(-) diff --git a/.gitignore b/.gitignore index 1a90dd6..d7b740f 100644 --- a/.gitignore +++ b/.gitignore @@ -2,17 +2,15 @@ __pycache__/ *.pyc -# Build artifacts +# Build artifacts we don't want in repo *.o *.obj -*.bin *.mca *.zip *.tar *.tar.gz # Project-specific output -worldgen-c/bin/ worldgen-c/test_out/ mc.zip lakeland-update-*/ diff --git a/worldgen-c/bin/worldgen b/worldgen-c/bin/worldgen index 0c78795e2cbc3b9d19e8c79b2cce6ada4ba6c9fc..4730b1daf5e116a2d301bf2b2189bc2916edfb1a 100755 GIT binary patch literal 148496 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 delta 65413 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 diff --git a/worldgen-c/src/worldgen.c b/worldgen-c/src/worldgen.c index 5192402..206fbe0 100644 --- a/worldgen-c/src/worldgen.c +++ b/worldgen-c/src/worldgen.c @@ -8,7 +8,7 @@ #include #include -#define TRAIL_NODE_SPACING 1200.0 +#define TRAIL_NODE_SPACING 1600.0 #define TRAIL_CELL_SIZE 16.0 #define TRAIL_MARGIN 96.0 #define TRAIL_WIDTH 5 @@ -16,7 +16,8 @@ typedef enum { BIOME_WEST_KY_COALFIELDS = 0, BIOME_EAST_KY_RIDGEBREAKS = 1, - BIOME_OLD_GROWTH_PLAINS = 2 + BIOME_OLD_GROWTH_PLAINS = 2, + BIOME_REDWOOD_FOREST = 3 } biome_id; typedef struct { @@ -127,21 +128,32 @@ static inline int clamp_int(int v, int min_v, int max_v) { static int ground_slope(worldgen_ctx *ctx, int x, int 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, + column_data columns[CHUNK_SIZE][CHUNK_SIZE], chunk_data *chunk); static void generate_chunk_grass(worldgen_ctx *ctx, int chunk_x, int chunk_z, column_data columns[CHUNK_SIZE][CHUNK_SIZE], chunk_data *out); static void generate_chunk_flowers(worldgen_ctx *ctx, int chunk_x, int chunk_z, column_data columns[CHUNK_SIZE][CHUNK_SIZE], chunk_data *out); static void generate_chunk_cabins(worldgen_ctx *ctx, int chunk_x, int chunk_z, column_data columns[CHUNK_SIZE][CHUNK_SIZE], chunk_data *out); static void ensure_trail_prepass(worldgen_ctx *ctx, int chunk_x, int chunk_z); static void append_trail_segment(worldgen_ctx *ctx, int ax, int az, int bx, int bz, int *points, int count); +static int *smooth_trail_polyline(worldgen_ctx *ctx, int *points, int count, int *out_count); +static int choose_trail_width(worldgen_ctx *ctx, int x0, int z0, int x1, int z1); +static double point_segment_distance2(double px, double pz, double ax, double az, double bx, double bz); +static int segment_parallel_and_close(int ax, int az, int bx, int bz, int cx, int cz, int dx, int dz, double min_dist); +static double nearest_trail_distance2(worldgen_ctx *ctx, int x, int z, double fallback); +static int chunk_contains_trail(worldgen_ctx *ctx, int chunk_x, int chunk_z); static void trail_node_position(worldgen_ctx *ctx, int node_x, int node_z, double spacing, double *out_x, double *out_z); static void carve_trail_pad(worldgen_ctx *ctx, int chunk_x, int chunk_z, chunk_data *out, column_data columns[CHUNK_SIZE][CHUNK_SIZE], int center_x, int center_z, int radius, int target_height); static void carve_trail_span(worldgen_ctx *ctx, int chunk_x, int chunk_z, chunk_data *out, column_data columns[CHUNK_SIZE][CHUNK_SIZE], int x0, int z0, int x1, int z1, int width); static int build_trail_path(worldgen_ctx *ctx, double ax, double az, double bx, double bz, int **out_points, int *out_count); static double old_growth_plains_mask(worldgen_ctx *ctx, int x, int z); static double old_growth_grove_mask(worldgen_ctx *ctx, int x, int z); +static double rainfall_field(worldgen_ctx *ctx, int x, int z); +static double redwood_biome_mask(worldgen_ctx *ctx, int x, int z, int column_height, int local_slope); static uint16_t generate_normal_ores(worldgen_ctx *ctx, int x, int y, int z, const column_data *col); static void connect_cabin_to_trail(worldgen_ctx *ctx, int chunk_x, int chunk_z, column_data columns[CHUNK_SIZE][CHUNK_SIZE], chunk_data *chunk, int door_x, int door_z, int door_side, int path_width); +static int column_has_manmade_surface(chunk_data *chunk, int chunk_x, int chunk_z, int world_x, int world_z); static column_data get_column_data(worldgen_ctx *ctx, int x, int z); static int generate_coal(worldgen_ctx *ctx, int x, int y, int z, int column_height, biome_id biome); @@ -172,6 +184,7 @@ static double land_value(worldgen_ctx *ctx, int x, int z) { value += ore_bonus; if (col.biome == BIOME_OLD_GROWTH_PLAINS) value += 0.2; if (col.biome == BIOME_WEST_KY_COALFIELDS) value += 0.1; + if (col.biome == BIOME_REDWOOD_FOREST) value += 0.18; if (col.has_water && col.height >= col.water_surface - 2 && col.height <= col.water_surface + 2) { value += 0.12; } @@ -183,6 +196,26 @@ static double land_value(worldgen_ctx *ctx, int x, int z) { } static void append_trail_segment(worldgen_ctx *ctx, int ax, int az, int bx, int bz, int *points, int count) { + /* Drop near-parallel segments that hug existing roads to keep the network from bunching up. */ + const double min_parallel_distance = 72.0; + for (size_t i = 0; i < ctx->trail_segment_count; ++i) { + trail_segment *existing = &ctx->trail_segments[i]; + if (!existing) continue; + int ex_ax = existing->ax; + int ex_az = existing->az; + int ex_bx = existing->bx; + int ex_bz = existing->bz; + if (existing->points && existing->count >= 2) { + ex_ax = existing->points[0]; + ex_az = existing->points[1]; + ex_bx = existing->points[(existing->count - 1) * 2]; + ex_bz = existing->points[(existing->count - 1) * 2 + 1]; + } + if (segment_parallel_and_close(ax, az, bx, bz, ex_ax, ex_az, ex_bx, ex_bz, min_parallel_distance)) { + free(points); + return; + } + } if (ctx->trail_segment_count >= ctx->trail_segment_cap) { size_t new_cap = ctx->trail_segment_cap ? ctx->trail_segment_cap * 2 : 32; trail_segment *resized = (trail_segment *)realloc(ctx->trail_segments, new_cap * sizeof(trail_segment)); @@ -217,9 +250,9 @@ void worldgen_prepass(worldgen_ctx *ctx, int min_x, int max_x, int min_z, int ma ctx->trail_segment_count = 0; ctx->trail_segment_cap = 0; - const int step = 64; - const int max_points = 96; - const double min_spacing = 96.0; + const int step = 96; + const int max_points = 64; + const double min_spacing = 144.0; int cap = max_points; int count = 0; int *px = (int *)malloc((size_t)cap * sizeof(int)); @@ -232,7 +265,7 @@ void worldgen_prepass(worldgen_ctx *ctx, int min_x, int max_x, int min_z, int ma for (int z = min_z; z <= max_z; z += step) { for (int x = min_x; x <= max_x; x += step) { double val = land_value(ctx, x, z); - if (val < -0.05) continue; + if (val < 0.02) continue; int spaced = 1; for (int i = 0; i < count; ++i) { double dx = (double)(x - px[i]); @@ -436,6 +469,39 @@ static double old_growth_plains_mask(worldgen_ctx *ctx, int x, int z) { return clamp01(mask); } +static double rainfall_field(worldgen_ctx *ctx, int x, int z) { + /* Bias rainfall along pseudo-coastal ridges to mimic PNW storm tracks. */ + double pacific_front = worley_distance(x - 48000, z + 52000, 0.00042, 0xA138B651u); + double coast_push = clamp01(1.18 - pacific_front * 1.25); + double storm_bands = simplex_noise2(&ctx->noise, (x + 26000) * 0.00055, (z - 26000) * 0.00055) * 0.5 + 0.5; + double drizzle = simplex_noise2(&ctx->noise, x * 0.00018, z * 0.00018) * 0.5 + 0.5; + double rain = coast_push * 0.45 + storm_bands * 0.35 + drizzle * 0.2; + return clamp01(rain); +} + +static double redwood_biome_mask(worldgen_ctx *ctx, int x, int z, int column_height, int local_slope) { + double rain = rainfall_field(ctx, x, z); + double elevation = clamp01((double)(column_height - (ctx->sea_level + 4)) / 48.0); + if (column_height < ctx->sea_level - 2) return 0.0; + double ridge_noise = worley_distance(x + 32000, z - 36000, 0.0005, 0x5A8F7E21u); + double ridge_bias = clamp01(1.15 - ridge_noise * 1.2); + double slope_factor = clamp01((double)local_slope / 14.0); + double basin_relief = clamp01((double)(column_height - ctx->sea_level - 20) / 65.0); + double mask = rain * 0.5 + elevation * 0.25 + ridge_bias * 0.25; + mask *= (0.65 + slope_factor * 0.35); + mask *= (0.5 + basin_relief * 0.5); + return clamp01(mask); +} + +static double redwood_tree_presence(worldgen_ctx *ctx, int x, int z) { + double cell = worley_distance(x - 54000, z + 54000, 0.022, 0xC7E4B129u); + double cluster = clamp01(1.25 - cell * 1.45); + double detail = simplex_noise2(&ctx->noise, (x + 18000) * 0.005, (z - 18000) * 0.005) * 0.5 + 0.5; + double ridge = simplex_noise2(&ctx->noise, (x - 42000) * 0.0016, (z + 42000) * 0.0016) * 0.5 + 0.5; + double presence = cluster * (0.65 + detail * 0.25 + ridge * 0.1); + return clamp01(presence); +} + static double region_blend(worldgen_ctx *ctx, int x, int z) { (void)ctx; @@ -467,6 +533,10 @@ static biome_id classify_biome(worldgen_ctx *ctx, int x, int z, int column_heigh } double blend = region_blend(ctx, x, z); int slope = local_relief(ctx, x, z, column_height); + double redwood = redwood_biome_mask(ctx, x, z, column_height, slope); + if (redwood > 0.62) { + return BIOME_REDWOOD_FOREST; + } double slope_score = clamp01((double)slope / 10.0); double relief = clamp01((double)(column_height - ctx->sea_level) / 45.0); double jitter = simplex_noise2(&ctx->noise, (x - 17000) * 0.001, (z + 17000) * 0.001) * 0.1; @@ -632,6 +702,10 @@ static coal_zone classify_coal_zone(worldgen_ctx *ctx, int column_height, biome_ if (relief > 24) return COAL_ZONE_FOOTHILL; return COAL_ZONE_WEST; } + if (biome == BIOME_REDWOOD_FOREST) { + if (relief > 28) return COAL_ZONE_EAST; + return COAL_ZONE_FOOTHILL; + } if (relief > 36) return COAL_ZONE_EAST; return COAL_ZONE_FOOTHILL; } @@ -806,6 +880,15 @@ 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 (data->biome == BIOME_REDWOOD_FOREST) { + int slope = ground_slope(ctx, world_x, world_z); + if (slope >= 5) return BLOCK_STONE; + if (slope >= 3) return BLOCK_GRAVEL; + double rain = rainfall_field(ctx, world_x, world_z); + double litter = simplex_noise2(&ctx->noise, (world_x + 14000) * 0.015, (world_z - 14000) * 0.015) * 0.5 + 0.5; + double mulch = clamp01(rain * 0.6 + (1.0 - litter) * 0.4); + if (mulch > 0.35) return BLOCK_DIRT; + } return BLOCK_GRASS; } @@ -1331,6 +1414,60 @@ static void build_maple_ancient(worldgen_ctx *ctx, int x, int y, int z, int heig place_leaf_circle(x, canopy_top + 1, z, 3, arch->leaf_block, rng, 0.1, out); } +static void build_redwood_titan(worldgen_ctx *ctx, int x, int y, int z, int height, rng_state *rng, block_list *out, const tree_archetype *arch) { + (void)ctx; + int extra = rng_range_inclusive(rng, 20, 32); + int core_height = height + extra; + if (core_height < 60) core_height = 60; + if (y + core_height + 16 >= CHUNK_HEIGHT) { + core_height = CHUNK_HEIGHT - y - 16; + if (core_height < 40) core_height = 40; + } + int taper_start = core_height - 12; + for (int dy = 0; dy < core_height; ++dy) { + int radius = 3; + if (dy > taper_start) radius = 2; + if (dy > taper_start + 6) radius = 1; + for (int dx = -radius; dx <= radius; ++dx) { + for (int dz = -radius; dz <= radius; ++dz) { + if (radius >= 3 && abs(dx) == radius && abs(dz) == radius && dy > 4) continue; + if (radius == 2 && abs(dx) == 2 && abs(dz) == 2 && dy > taper_start) continue; + block_list_push(out, x + dx, y + dy, z + dz, (uint16_t)arch->log_block); + } + } + } + int spire = 6 + rng_range_inclusive(rng, 0, 3); + place_log_column(x, y + core_height, z, spire, arch->log_block, out); + int canopy_base = y + core_height - 6; + for (int ring = 0; ring < 5; ++ring) { + int radius = 6 - ring; + if (radius < 2) radius = 2; + place_leaf_circle(x, canopy_base + ring, z, radius, arch->leaf_block, rng, 0.1, out); + place_leaf_circle(x, canopy_base + ring + 1, z, radius - 1, arch->leaf_block, rng, 0.18, out); + } + place_leaf_circle(x, canopy_base + 6, z, 2, arch->leaf_block, rng, 0.0, out); + place_leaf_circle(x, canopy_base + 7, z, 1, arch->leaf_block, rng, 0.0, out); + const int dirs[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}}; + for (int i = 0; i < 4; ++i) { + int buttress_height = 4 + rng_range_inclusive(rng, 0, 3); + for (int step = 0; step < 4; ++step) { + int px = x + dirs[i][0] * (2 + step); + int pz = z + dirs[i][1] * (2 + step); + int stack = buttress_height - step; + if (stack < 1) stack = 1; + for (int s = 0; s < stack; ++s) { + block_list_push(out, px, y + s, pz, (uint16_t)arch->log_block); + } + } + } + for (int i = 0; i < 4; ++i) { + int branch_y = canopy_base - 3 - rng_range_inclusive(rng, 0, 3); + int branch_len = 5 + rng_range_inclusive(rng, 0, 3); + place_branch_span(x, branch_y, z, dirs[i][0], dirs[i][1], branch_len, 3, arch->log_block, arch->leaf_block, rng, out); + } + place_leaf_blob(x, canopy_base - 2, z, 5, 4, arch->leaf_block, rng, out); +} + typedef enum { TREE_OAK_ROUND = 0, TREE_OAK_SPRAWL, @@ -1352,6 +1489,7 @@ static void build_maple_ancient(worldgen_ctx *ctx, int x, int y, int z, int heig TREE_OAK_ANCIENT, TREE_SPRUCE_ANCIENT, TREE_MAPLE_ANCIENT, + TREE_REDWOOD_TITAN, TREE_COUNT } tree_kind; @@ -1372,10 +1510,11 @@ static void build_maple_ancient(worldgen_ctx *ctx, int x, int y, int z, int heig [TREE_CYPRESS_COLUMN] = {"cypress_column", TREE_SPECIES_CYPRESS, BLOCK_BIRCH_LOG, BLOCK_BIRCH_LEAVES, 8, 12, 2, 6, build_cypress_column}, [TREE_CYPRESS_FAN] = {"cypress_fan", TREE_SPECIES_CYPRESS, BLOCK_BIRCH_LOG, BLOCK_BIRCH_LEAVES, 8, 12, 3, 6, build_cypress_fan}, [TREE_MAPLE_TANGLE] = {"maple_tangle", TREE_SPECIES_MAPLE, BLOCK_OAK_LOG, BLOCK_OAK_LEAVES, 7, 10, 4, 5, build_maple_tangle}, - [TREE_MAPLE_SPREAD] = {"maple_spread", TREE_SPECIES_MAPLE, BLOCK_OAK_LOG, BLOCK_OAK_LEAVES, 7, 10, 4, 5, build_maple_spread}, - [TREE_OAK_ANCIENT] = {"oak_ancient", TREE_SPECIES_OAK, BLOCK_OAK_LOG, BLOCK_OAK_LEAVES, 12, 16, 6, 7, build_oak_ancient}, - [TREE_SPRUCE_ANCIENT] = {"spruce_ancient", TREE_SPECIES_SPRUCE, BLOCK_OAK_LOG, BLOCK_OAK_LEAVES, 12, 16, 5, 7, build_spruce_ancient}, - [TREE_MAPLE_ANCIENT] = {"maple_ancient", TREE_SPECIES_MAPLE, BLOCK_OAK_LOG, BLOCK_OAK_LEAVES, 11, 15, 6, 6, build_maple_ancient}, + [TREE_MAPLE_SPREAD] = {"maple_spread", TREE_SPECIES_MAPLE, BLOCK_OAK_LOG, BLOCK_OAK_LEAVES, 7, 10, 4, 5, build_maple_spread}, + [TREE_OAK_ANCIENT] = {"oak_ancient", TREE_SPECIES_OAK, BLOCK_OAK_LOG, BLOCK_OAK_LEAVES, 12, 16, 6, 7, build_oak_ancient}, + [TREE_SPRUCE_ANCIENT] = {"spruce_ancient", TREE_SPECIES_SPRUCE, BLOCK_OAK_LOG, BLOCK_OAK_LEAVES, 12, 16, 5, 7, build_spruce_ancient}, + [TREE_MAPLE_ANCIENT] = {"maple_ancient", TREE_SPECIES_MAPLE, BLOCK_OAK_LOG, BLOCK_OAK_LEAVES, 11, 15, 6, 6, build_maple_ancient}, + [TREE_REDWOOD_TITAN] = {"redwood_titan", TREE_SPECIES_PINE, BLOCK_OAK_LOG, BLOCK_OAK_LEAVES, 70, 86, 7, 24, build_redwood_titan}, }; static const int TREE_VARIANTS_OAK[] = {TREE_OAK_ROUND, TREE_OAK_SPRAWL, TREE_OAK_COLUMNAR, TREE_OAK_ANCIENT}; @@ -1440,7 +1579,7 @@ static const int TREE_POOL_OLD_GROWTH[] = { TREE_SPRUCE_TIERS, TREE_PINE_CROWN }; -static const tree_archetype *choose_tree_archetype(worldgen_ctx *ctx, const column_data *data, rng_state *rng) { +static const tree_archetype *choose_tree_archetype(worldgen_ctx *ctx, const column_data *data, int world_x, int world_z, rng_state *rng) { int altitude = data->height - ctx->sea_level; const tree_archetype *fallback = &TREE_TYPES[TREE_OAK_ROUND]; int snow_line = ctx->snow_line; @@ -1448,6 +1587,14 @@ static const tree_archetype *choose_tree_archetype(worldgen_ctx *ctx, const colu const tree_archetype *snow_pick = choose_species_variant(TREE_SPECIES_SPRUCE, rng); if (snow_pick && rng_next_f64(rng) < 0.9) return snow_pick; } + if (data->biome == BIOME_REDWOOD_FOREST) { + double stand = redwood_tree_presence(ctx, world_x, world_z); + if (stand > 0.35 || rng_next_f64(rng) < 0.8) { + return &TREE_TYPES[TREE_REDWOOD_TITAN]; + } + const tree_archetype *spruce = choose_species_variant(TREE_SPECIES_SPRUCE, rng); + if (spruce) return spruce; + } if (data->biome == BIOME_OLD_GROWTH_PLAINS) { size_t pool_size = sizeof(TREE_POOL_OLD_GROWTH) / sizeof(TREE_POOL_OLD_GROWTH[0]); size_t idx = (size_t)rng_range_inclusive(rng, 0, (int)pool_size - 1); @@ -1476,12 +1623,77 @@ static void generate_tree(worldgen_ctx *ctx, const tree_archetype *arch, int x, arch->builder(ctx, x, y, z, height, rng, out, arch); } +static int try_place_redwood_fallen_log(worldgen_ctx *ctx, int chunk_x, int chunk_z, chunk_data *chunk, + column_data columns[CHUNK_SIZE][CHUNK_SIZE], int start_dx, int start_dz, rng_state *rng) { + (void)ctx; + (void)chunk_x; + (void)chunk_z; + const int dirs[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}}; + int dir_idx = rng_range_inclusive(rng, 0, 3); + int dir_x = dirs[dir_idx][0]; + int dir_z = dirs[dir_idx][1]; + int len = 3 + rng_range_inclusive(rng, 0, 3); + column_data origin = columns[start_dx][start_dz]; + if (origin.biome != BIOME_REDWOOD_FOREST) return 0; + if (origin.height <= 0 || origin.height >= CHUNK_HEIGHT - 2) return 0; + int base_height = origin.height; + for (int step = 0; step < len; ++step) { + int lx = start_dx + dir_x * step; + int lz = start_dz + dir_z * step; + if (lx < 0 || lx >= CHUNK_SIZE || lz < 0 || lz >= CHUNK_SIZE) return 0; + column_data col = columns[lx][lz]; + if (col.biome != BIOME_REDWOOD_FOREST) return 0; + if (col.height <= 0 || col.height >= CHUNK_HEIGHT - 2) return 0; + if (abs(col.height - base_height) > 1) return 0; + uint16_t above = chunk->blocks[col.height + 1][lx][lz]; + if (above != BLOCK_AIR && above != BLOCK_TALL_GRASS) return 0; + } + uint16_t log_block = (dir_z != 0) ? BLOCK_OAK_LOG_Z : BLOCK_OAK_LOG_X; + for (int step = 0; step < len; ++step) { + int lx = start_dx + dir_x * step; + int lz = start_dz + dir_z * step; + column_data col = columns[lx][lz]; + chunk->blocks[col.height + 1][lx][lz] = log_block; + } + return 1; +} + +static void generate_chunk_redwood_floor(worldgen_ctx *ctx, int chunk_x, int chunk_z, + column_data columns[CHUNK_SIZE][CHUNK_SIZE], chunk_data *chunk) { + int world_chunk_seed = hash_coords(chunk_x, chunk_z, (uint32_t)(ctx->world_seed ^ 0x6D23F1A7u)); + rng_state rng; + rng_seed(&rng, (uint64_t)world_chunk_seed << 1); + for (int dx = 0; dx < CHUNK_SIZE; ++dx) { + for (int dz = 0; dz < CHUNK_SIZE; ++dz) { + column_data cd = columns[dx][dz]; + if (cd.biome != BIOME_REDWOOD_FOREST) continue; + if (cd.height <= 0 || cd.height >= CHUNK_HEIGHT - 2) continue; + int wx = chunk_x * CHUNK_SIZE + dx; + int wz = chunk_z * CHUNK_SIZE + dz; + uint16_t ground = chunk->blocks[cd.height][dx][dz]; + if (ground == BLOCK_GRASS) { + chunk->blocks[cd.height][dx][dz] = BLOCK_DIRT; + } + double rain = rainfall_field(ctx, wx, wz); + double litter = simplex_noise2(&ctx->noise, (wx + 8000) * 0.03, (wz - 8000) * 0.03) * 0.5 + 0.5; + double fern_chance = clamp01(0.25 + rain * 0.5 + (1.0 - litter) * 0.25); + if (chunk->blocks[cd.height + 1][dx][dz] == BLOCK_AIR && rng_next_f64(&rng) < fern_chance) { + chunk->blocks[cd.height + 1][dx][dz] = BLOCK_TALL_GRASS; + } + if (rng_next_f64(&rng) < 0.0035) { + try_place_redwood_fallen_log(ctx, chunk_x, chunk_z, chunk, columns, dx, dz, &rng); + } + } + } +} + static void generate_chunk_grass(worldgen_ctx *ctx, int chunk_x, int chunk_z, column_data columns[CHUNK_SIZE][CHUNK_SIZE], chunk_data *out) { for (int dx = 0; dx < CHUNK_SIZE; ++dx) { for (int dz = 0; dz < CHUNK_SIZE; ++dz) { column_data cd = columns[dx][dz]; if (cd.height <= 0 || cd.height >= CHUNK_HEIGHT - 1) continue; if (cd.height >= ctx->snow_line - 1) continue; + if (cd.biome == BIOME_REDWOOD_FOREST) continue; int world_x = chunk_x * CHUNK_SIZE + dx; int world_z = chunk_z * CHUNK_SIZE + dz; if (out->blocks[cd.height][dx][dz] != BLOCK_GRASS) continue; @@ -1490,7 +1702,8 @@ static void generate_chunk_grass(worldgen_ctx *ctx, int chunk_x, int chunk_z, co double density = tree_density_mask(ctx, world_x, world_z); double meadow = simplex_noise2(&ctx->noise, (world_x + 1200) * 0.02, (world_z - 1200) * 0.02) * 0.5 + 0.5; double humidity = simplex_noise2(&ctx->noise, (world_x - 9000) * 0.01, (world_z + 9000) * 0.01) * 0.5 + 0.5; - double chance = 0.15 + meadow * 0.25 + humidity * 0.2 + (1.0 - density) * 0.2; + double rain = rainfall_field(ctx, world_x, world_z); + double chance = 0.15 + meadow * 0.25 + humidity * 0.2 + (1.0 - density) * 0.2 + (rain - 0.5) * 0.2; if (cd.height < ctx->sea_level) chance *= 0.7; chance = clamp01(chance); uint32_t h = hash_coords(world_x, world_z, (uint32_t)(ctx->world_seed ^ 0x5F3759DFu)); @@ -1519,6 +1732,7 @@ static void generate_chunk_flowers(worldgen_ctx *ctx, int chunk_x, int chunk_z, for (int dz = 0; dz < CHUNK_SIZE; ++dz) { column_data cd = columns[dx][dz]; if (cd.height <= 0 || cd.height >= CHUNK_HEIGHT - 2) continue; + if (cd.biome == BIOME_REDWOOD_FOREST) continue; int world_x = chunk_x * CHUNK_SIZE + dx; int world_z = chunk_z * CHUNK_SIZE + dz; if (out->blocks[cd.height][dx][dz] != BLOCK_GRASS) continue; @@ -2041,6 +2255,7 @@ static int try_place_cabin(worldgen_ctx *ctx, int chunk_x, int chunk_z, chunk_da int lz = wz - chunk_origin_z; column_data col = columns[lx][lz]; if (col.has_water && col.height < col.water_surface) return 0; + if (column_has_manmade_surface(chunk, chunk_x, chunk_z, wx, wz)) return 0; if (col.height < min_h) min_h = col.height; if (col.height > max_h) max_h = col.height; } @@ -2102,6 +2317,9 @@ static void generate_chunk_cabins(worldgen_ctx *ctx, int chunk_x, int chunk_z, c rng_seed(&rng, seed ^ 0xCAB1A5u); double noise = simplex_noise2(&ctx->noise, (chunk_x * CHUNK_SIZE + 5000) * 0.0006, (chunk_z * CHUNK_SIZE - 5000) * 0.0006) * 0.5 + 0.5; double spawn_chance = 0.015 + noise * 0.02; + if (ctx->enable_trails && !chunk_contains_trail(ctx, chunk_x, chunk_z)) { + return; /* only spawn cabins where a road crosses the chunk, so the spur can hook in */ + } if (rng_next_f64(&rng) > spawn_chance) return; size_t blueprint_count = sizeof(CABIN_BLUEPRINTS) / sizeof(CABIN_BLUEPRINTS[0]); unsigned char occupancy[CHUNK_SIZE][CHUNK_SIZE]; @@ -2125,10 +2343,34 @@ static void generate_chunk_cabins(worldgen_ctx *ctx, int chunk_x, int chunk_z, c if (req_max_z < max_local_z) max_local_z = req_max_z; } if (min_local_x >= max_local_x - 1 || min_local_z >= max_local_z - 1) continue; - int local_cx = rng_range_inclusive(&rng, min_local_x, max_local_x); - int local_cz = rng_range_inclusive(&rng, min_local_z, max_local_z); - int world_cx = chunk_x * CHUNK_SIZE + local_cx; - int world_cz = chunk_z * CHUNK_SIZE + local_cz; + int best_local_x = min_local_x; + int best_local_z = min_local_z; + double best_score = -1e9; + const int samples = 12; + for (int s = 0; s < samples; ++s) { + int local_cx = rng_range_inclusive(&rng, min_local_x, max_local_x); + int local_cz = rng_range_inclusive(&rng, min_local_z, max_local_z); + int world_cx = chunk_x * CHUNK_SIZE + local_cx; + int world_cz = chunk_z * CHUNK_SIZE + local_cz; + double score = land_value(ctx, world_cx, world_cz); + if (ctx->enable_trails) { + double dist2 = nearest_trail_distance2(ctx, world_cx, world_cz, 1.0e12); + double bonus = 0.0; + double dist = sqrt(dist2); + if (dist < 640.0) { + double t = clamp01(1.0 - dist / 640.0); + bonus += 0.45 * t; + } + score += bonus; + } + if (score > best_score) { + best_score = score; + best_local_x = local_cx; + best_local_z = local_cz; + } + } + int world_cx = chunk_x * CHUNK_SIZE + best_local_x; + int world_cz = chunk_z * CHUNK_SIZE + best_local_z; if (try_place_cabin(ctx, chunk_x, chunk_z, out, columns, occupancy, world_cx, world_cz, bp, &rng)) { break; } @@ -2202,16 +2444,18 @@ static void connect_cabin_to_trail(worldgen_ctx *ctx, int chunk_x, int chunk_z, if (path_width < 2) path_width = 2; carve_cabin_path(ctx, chunk_x, chunk_z, chunk, columns, start_x, start_z, step_x, step_z, spur_len, path_width); int target_x = 0, target_z = 0; - int found = 0; - if (ctx && ctx->enable_trails) { - found = find_nearest_trail_point_from_segments(ctx, start_x, start_z, &target_x, &target_z); + int found_seg = find_nearest_trail_point_from_segments(ctx, start_x, start_z, &target_x, &target_z); + int found = found_seg; + if (!found) { + found = find_nearest_trail_block(columns, chunk, chunk_x, chunk_z, start_x, start_z, 512, &target_x, &target_z); + } + if (!found && found_seg) { + /* We know a segment exists; just aim for it even if no gravel in this chunk. */ + found = 1; } if (!found) { - found = find_nearest_trail_block(columns, chunk, chunk_x, chunk_z, start_x, start_z, 192, &target_x, &target_z); - } - if (!found) { - int fallback_x = start_x + step_x * 120; - int fallback_z = start_z + step_z * 120; + int fallback_x = start_x + step_x * 240; + int fallback_z = start_z + step_z * 240; carve_trail_span(ctx, chunk_x, chunk_z, chunk, columns, start_x, start_z, fallback_x, fallback_z, path_width); return; } @@ -2292,9 +2536,9 @@ static uint16_t generate_normal_ores(worldgen_ctx *ctx, int x, int y, int z, con weight = ore_depth_weight(y, 68, -4); if (weight > 0.0) { cluster = ore_cluster_field(ctx, x, y, z, 0.018, 6000.0); - if (cluster > 0.58) { - double biome_bonus = (col->biome == BIOME_EAST_KY_RIDGEBREAKS) ? 0.05 : 0.0; - chance = 0.04 + weight * 0.25 + biome_bonus; + if (cluster > 0.60) { + double biome_bonus = (col->biome == BIOME_EAST_KY_RIDGEBREAKS) ? 0.01 : 0.0; + chance = 0.008 + weight * 0.08 + biome_bonus; h = hash_coords3(x, y, z, seed ^ 0x1B0EFACEu); if ((h & 0xFFFF) <= (uint32_t)(chance * 65535.0)) { return BLOCK_IRON_ORE; @@ -2377,13 +2621,21 @@ static void generate_chunk_trees(worldgen_ctx *ctx, int chunk_x, int chunk_z, ch column_data data = get_column_data(ctx, candidate_x, candidate_z); if (data.has_water && data.height < data.water_surface) continue; if (data.height < min_tree_alt || data.height > tree_line) continue; - if (ground_slope(ctx, candidate_x, candidate_z) > max_slope) continue; + int slope = ground_slope(ctx, candidate_x, candidate_z); + int slope_limit = (data.biome == BIOME_REDWOOD_FOREST) ? 4 : max_slope; + if (slope > slope_limit) continue; int is_old_growth = (data.biome == BIOME_OLD_GROWTH_PLAINS); + int is_redwood = (data.biome == BIOME_REDWOOD_FOREST); + double stand_density = is_redwood ? redwood_tree_presence(ctx, candidate_x, candidate_z) : 0.0; double grove_mask = is_old_growth ? old_growth_grove_mask(ctx, candidate_x, candidate_z) : 0.0; if (is_old_growth && grove_mask < 0.35) { double skip_chance = 0.7 - grove_mask * 0.5; if (rng_next_f64(&rng) < skip_chance) continue; } + if (is_redwood && stand_density < 0.2) { + double thinning = clamp01(0.8 - stand_density * 0.6); + if (rng_next_f64(&rng) < thinning) continue; + } double altitude_factor = 1.0; if (data.height < low_fade_top) { @@ -2397,21 +2649,30 @@ static void generate_chunk_trees(worldgen_ctx *ctx, int chunk_x, int chunk_z, ch if (is_old_growth) { altitude_factor *= 0.85 + 0.15 * grove_mask; } + if (is_redwood) { + altitude_factor *= clamp01(0.7 + stand_density * 0.4); + } if (altitude_factor <= 0.0) continue; - double density = tree_density_mask(ctx, candidate_x, candidate_z); - if (is_old_growth) { - density = clamp01(0.25 + grove_mask * 0.75); - } - double spawn_prob = 0.7 * (0.55 + 0.45 * density) * altitude_factor; - if (is_old_growth) { - spawn_prob = clamp01(0.25 + grove_mask * 0.7) * altitude_factor; + double spawn_prob; + if (is_redwood) { + double rain = rainfall_field(ctx, candidate_x, candidate_z); + spawn_prob = clamp01(0.25 + stand_density * 0.65 + (rain - 0.5) * 0.2) * altitude_factor; + } else { + double density = tree_density_mask(ctx, candidate_x, candidate_z); + if (is_old_growth) { + density = clamp01(0.25 + grove_mask * 0.75); + } + spawn_prob = 0.7 * (0.55 + 0.45 * density) * altitude_factor; + if (is_old_growth) { + spawn_prob = clamp01(0.25 + grove_mask * 0.7) * altitude_factor; + } } if (rng_next_f64(&rng) > spawn_prob) continue; block_list tmp; block_list_init(&tmp); - const tree_archetype *arch = choose_tree_archetype(ctx, &data, &rng); + const tree_archetype *arch = choose_tree_archetype(ctx, &data, candidate_x, candidate_z, &rng); int base_y = data.height + 1; uint16_t surface = select_surface_block(ctx, &data, candidate_x, candidate_z); if (surface == BLOCK_SNOW) { @@ -2461,11 +2722,7 @@ static const trail_neighbor_offset TRAIL_NEIGHBOR_OFFSETS[] = { { 1, 0 }, { 0, 1 }, { 1, 1 }, - { 1, -1 }, - { 2, 0 }, - { 0, 2 }, - { 2, 1 }, - { 1, 2 } + { 1, -1 } }; static uint32_t trail_segment_hash(int ax, int az, int bx, int bz, uint32_t seed) { @@ -2516,13 +2773,13 @@ static int should_connect_trail_nodes(worldgen_ctx *ctx, int node_x0, int node_z double dx = fabs((double)(node_x1 - node_x0)); double dz = fabs((double)(node_z1 - node_z0)); double grid_len = sqrt(dx * dx + dz * dz); - double base = 0.12; + double base = 0.08; if (grid_len <= 1.05) { - base += 0.2; + base += 0.18; } else if (grid_len <= 2.2) { - base += 0.12; + base += 0.1; } else { - base += 0.05; + base += 0.02; } int axis_edge = (dx == 0.0 || dz == 0.0); if (axis_edge) { @@ -2549,6 +2806,141 @@ static int should_connect_trail_nodes(worldgen_ctx *ctx, int node_x0, int node_z return r < base; } +static int *smooth_trail_polyline(worldgen_ctx *ctx, int *points, int count, int *out_count) { + /* Keep endpoints fixed, gently relax interior vertices and add a tiny perpendicular wiggle so paths stop looking grid-aligned. */ + if (count < 3 || !points) { + *out_count = count; + return points; + } + int *smoothed = (int *)malloc((size_t)count * 2 * sizeof(int)); + if (!smoothed) { + *out_count = count; + return points; + } + /* Preserve endpoints exactly */ + smoothed[0] = points[0]; + smoothed[1] = points[1]; + smoothed[(count - 1) * 2] = points[(count - 1) * 2]; + smoothed[(count - 1) * 2 + 1] = points[(count - 1) * 2 + 1]; + for (int i = 1; i < count - 1; ++i) { + double ax = (double)points[(i - 1) * 2]; + double az = (double)points[(i - 1) * 2 + 1]; + double bx = (double)points[i * 2]; + double bz = (double)points[i * 2 + 1]; + double cx = (double)points[(i + 1) * 2]; + double cz = (double)points[(i + 1) * 2 + 1]; + /* Weighted average pulls vertices off the stair-step grid */ + double mx = (ax + 4.0 * bx + cx) / 6.0; + double mz = (az + 4.0 * bz + cz) / 6.0; + double dx = cx - ax; + double dz = cz - az; + double len = sqrt(dx * dx + dz * dz); + double px = 0.0, pz = 0.0; + if (len > 0.001) { + px = -dz / len; + pz = dx / len; + } + /* Tiny perpendicular wiggle breaks perfectly straight segments */ + double wiggle = simplex_noise2(&ctx->noise, bx * 0.0025, bz * 0.0025) * 0.5; /* -0.5..0.5 */ + double wiggle_mag = 2.0 + (simplex_noise2(&ctx->noise, (bx + 12000.0) * 0.0018, (bz - 12000.0) * 0.0018) * 0.5 + 0.5) * 2.5; + mx += px * wiggle * wiggle_mag; + mz += pz * wiggle * wiggle_mag; + smoothed[i * 2] = (int)llround(mx); + smoothed[i * 2 + 1] = (int)llround(mz); + } + free(points); + *out_count = count; + return smoothed; +} + +static int choose_trail_width(worldgen_ctx *ctx, int x0, int z0, int x1, int z1) { + uint32_t h = hash_coords((x0 + x1) / 2, (z0 + z1) / 2, (uint32_t)ctx->world_seed ^ 0xC0FFEEu); + int delta = (int)(h % 3) - 1; /* -1, 0, or +1 */ + int w = TRAIL_WIDTH + delta; + if (w < 3) w = 3; + if (w > 7) w = 7; + return w; +} + +static double point_segment_distance2(double px, double pz, double ax, double az, double bx, double bz) { + double vx = bx - ax; + double vz = bz - az; + double len2 = vx * vx + vz * vz; + double t = 0.0; + if (len2 > 0.0001) { + t = ((px - ax) * vx + (pz - az) * vz) / len2; + if (t < 0.0) t = 0.0; + if (t > 1.0) t = 1.0; + } + double cx = ax + vx * t; + double cz = az + vz * t; + double dx = px - cx; + double dz = pz - cz; + return dx * dx + dz * dz; +} + +static int segment_parallel_and_close(int ax, int az, int bx, int bz, int cx, int cz, int dx, int dz, double min_dist) { + double ux = (double)bx - (double)ax; + double uz = (double)bz - (double)az; + double vx = (double)dx - (double)cx; + double vz = (double)dz - (double)cz; + double ulen = sqrt(ux * ux + uz * uz); + double vlen = sqrt(vx * vx + vz * vz); + if (ulen < 0.0001 || vlen < 0.0001) return 0; + ux /= ulen; uz /= ulen; + vx /= vlen; vz /= vlen; + double alignment = fabs(ux * vx + uz * vz); + if (alignment < 0.92) return 0; /* not parallel enough */ + + double min_d2 = point_segment_distance2((double)ax, (double)az, (double)cx, (double)cz, (double)dx, (double)dz); + double d2 = point_segment_distance2((double)bx, (double)bz, (double)cx, (double)cz, (double)dx, (double)dz); + if (d2 < min_d2) min_d2 = d2; + d2 = point_segment_distance2((double)cx, (double)cz, (double)ax, (double)az, (double)bx, (double)bz); + if (d2 < min_d2) min_d2 = d2; + d2 = point_segment_distance2((double)dx, (double)dz, (double)ax, (double)az, (double)bx, (double)bz); + if (d2 < min_d2) min_d2 = d2; + + return min_d2 < min_dist * min_dist; +} + +static double nearest_trail_distance2(worldgen_ctx *ctx, int x, int z, double fallback) { + if (!ctx || ctx->trail_segment_count == 0) return fallback; + double best = fallback; + for (size_t i = 0; i < ctx->trail_segment_count; ++i) { + trail_segment *seg = &ctx->trail_segments[i]; + if (!seg || seg->count < 1 || !seg->points) continue; + for (int p = 0; p < seg->count; ++p) { + int tx = seg->points[p * 2]; + int tz = seg->points[p * 2 + 1]; + double dx = (double)(tx - x); + double dz = (double)(tz - z); + double d2 = dx * dx + dz * dz; + if (d2 < best) best = d2; + } + } + return best; +} + +static int chunk_contains_trail(worldgen_ctx *ctx, int chunk_x, int chunk_z) { + if (!ctx || ctx->trail_segment_count == 0) return 0; + int min_x = chunk_x * CHUNK_SIZE; + int max_x = min_x + CHUNK_SIZE - 1; + int min_z = chunk_z * CHUNK_SIZE; + int max_z = min_z + CHUNK_SIZE - 1; + for (size_t i = 0; i < ctx->trail_segment_count; ++i) { + trail_segment *seg = &ctx->trail_segments[i]; + if (!seg || seg->count < 1 || !seg->points) continue; + for (int p = 0; p < seg->count; ++p) { + int tx = seg->points[p * 2]; + int tz = seg->points[p * 2 + 1]; + if (tx >= min_x && tx <= max_x && tz >= min_z && tz <= max_z) { + return 1; + } + } + } + return 0; +} + static int build_trail_path(worldgen_ctx *ctx, double ax, double az, double bx, double bz, int **out_points, int *out_count) { double min_x = fmin(ax, bx) - TRAIL_MARGIN; double max_x = fmax(ax, bx) + TRAIL_MARGIN; @@ -2621,18 +3013,20 @@ static int build_trail_path(worldgen_ctx *ctx, double ax, double az, double bx, double next_height = heights[ni]; double slope = fabs(next_height - current_height); if (slope > 3.0) continue; - int water = 0; int wx = (int)llround(min_x + nx * TRAIL_CELL_SIZE); int wz = (int)llround(min_z + nz * TRAIL_CELL_SIZE); column_data cd = get_column_data(ctx, wx, wz); if (cd.has_water && next_height <= cd.water_surface) { - water = 1; + continue; /* trails should never be routed through water */ + } + double tree_penalty = 0.0; + if (cd.biome == BIOME_REDWOOD_FOREST) { + double stand = redwood_tree_presence(ctx, wx, wz); + if (stand > 0.78) continue; /* treat massive trunks as hard obstacles */ + tree_penalty = stand; } double base_cost = (neighbors[n][0] == 0 || neighbors[n][1] == 0) ? 1.0 : 1.41421356237; - double cost = base_cost * (1.0 + slope * 6.0); - if (water) { - cost += 10.0; - } + double cost = base_cost * (1.0 + slope * 6.0 + tree_penalty * 4.5) + tree_penalty * 6.5; if (dist[current] + cost < dist[ni]) { dist[ni] = dist[current] + cost; prev[ni] = current; @@ -2672,6 +3066,8 @@ static int build_trail_path(worldgen_ctx *ctx, double ax, double az, double bx, break; } } + /* Post-process to soften grid artifacts */ + points = smooth_trail_polyline(ctx, points, path_len, &path_len); *out_points = points; *out_count = path_len; free(heights); @@ -2712,6 +3108,25 @@ static trail_segment *get_trail_segment(worldgen_ctx *ctx, int node_x0, int node double ax, az, bx, bz; trail_node_position(ctx, node_x0, node_z0, TRAIL_NODE_SPACING, &ax, &az); trail_node_position(ctx, node_x1, node_z1, TRAIL_NODE_SPACING, &bx, &bz); + const double min_parallel_distance = 72.0; + for (size_t i = 0; i < ctx->trail_segment_count; ++i) { + trail_segment *existing = &ctx->trail_segments[i]; + if (!existing) continue; + int ex_ax = existing->ax; + int ex_az = existing->az; + int ex_bx = existing->bx; + int ex_bz = existing->bz; + if (existing->points && existing->count >= 2) { + ex_ax = existing->points[0]; + ex_az = existing->points[1]; + ex_bx = existing->points[(existing->count - 1) * 2]; + ex_bz = existing->points[(existing->count - 1) * 2 + 1]; + } + if (segment_parallel_and_close((int)llround(ax), (int)llround(az), (int)llround(bx), (int)llround(bz), + ex_ax, ex_az, ex_bx, ex_bz, min_parallel_distance)) { + return NULL; + } + } int *points = NULL; int count = 0; if (!build_trail_path(ctx, ax, az, bx, bz, &points, &count)) { @@ -2843,7 +3258,6 @@ static void generate_chunk_trails(worldgen_ctx *ctx, int chunk_x, int chunk_z, c int chunk_max_x = chunk_min_x + CHUNK_SIZE - 1; int chunk_min_z = chunk_z * CHUNK_SIZE; int chunk_max_z = chunk_min_z + CHUNK_SIZE - 1; - int width = TRAIL_WIDTH; if (ctx->trail_segment_count > 0) { for (size_t s = 0; s < ctx->trail_segment_count; ++s) { @@ -2860,6 +3274,7 @@ static void generate_chunk_trails(worldgen_ctx *ctx, int chunk_x, int chunk_z, c int span_max_z = (z0 > z1) ? z0 : z1; if (span_max_x < chunk_min_x - 4 || span_min_x > chunk_max_x + 4) continue; if (span_max_z < chunk_min_z - 4 || span_min_z > chunk_max_z + 4) continue; + int width = choose_trail_width(ctx, x0, z0, x1, z1); carve_trail_span(ctx, chunk_x, chunk_z, out, columns, x0, z0, x1, z1, width); } } @@ -2891,6 +3306,7 @@ static void generate_chunk_trails(worldgen_ctx *ctx, int chunk_x, int chunk_z, c int span_max_z = (z0 > z1) ? z0 : z1; if (span_max_x < chunk_min_x - 4 || span_min_x > chunk_max_x + 4) continue; if (span_max_z < chunk_min_z - 4 || span_min_z > chunk_max_z + 4) continue; + int width = choose_trail_width(ctx, x0, z0, x1, z1); carve_trail_span(ctx, chunk_x, chunk_z, out, columns, x0, z0, x1, z1, width); } } @@ -2968,6 +3384,7 @@ void worldgen_generate_chunk(worldgen_ctx *ctx, int chunk_x, int chunk_z, chunk_ } generate_chunk_cabins(ctx, chunk_x, chunk_z, columns, out); + generate_chunk_redwood_floor(ctx, chunk_x, chunk_z, columns, out); generate_chunk_grass(ctx, chunk_x, chunk_z, columns, out); generate_chunk_flowers(ctx, chunk_x, chunk_z, columns, out);