diff --git a/worldgen-c/bin/worldgen b/worldgen-c/bin/worldgen index 1f59528..d74e9c9 100755 Binary files a/worldgen-c/bin/worldgen and b/worldgen-c/bin/worldgen differ diff --git a/worldgen-c/src/worldgen.c b/worldgen-c/src/worldgen.c index 82598ef..8416b3d 100644 --- a/worldgen-c/src/worldgen.c +++ b/worldgen-c/src/worldgen.c @@ -1598,6 +1598,33 @@ static void build_redwood_titan(worldgen_ctx *ctx, int x, int y, int z, int heig {1, 0}, {-1, 0}, {0, 1}, {0, -1}, {1, 1}, {1, -1}, {-1, 1}, {-1, -1} }; + if (rng_next_f64(rng) < 0.10) { + int snag_height = core_height - rng_range_inclusive(rng, 4, 10); + if (snag_height < 22) snag_height = 22; + int taper_start = snag_height - 5; + for (int dy = 0; dy < snag_height; ++dy) { + int radius = (dy >= taper_start) ? 0 : 1; + for (int dx = -radius; dx <= radius; ++dx) { + for (int dz = -radius; dz <= radius; ++dz) { + if (radius == 1 && abs(dx) == 1 && abs(dz) == 1 && dy > 10 && (dy % 3) == 0) continue; + block_list_push(out, x + dx, y + dy, z + dz, (uint16_t)arch->log_block); + } + } + if (dy > 8 && dy < snag_height - 4 && (dy % 7) == 0) { + int dir = (dy / 7 + rng_range_inclusive(rng, 0, 3)) & 7; + int branch_log = redwood_axis_log(arch->log_block, dirs8[dir][0], dirs8[dir][1]); + int len = 2 + rng_range_inclusive(rng, 0, 2); + for (int step = 2; step <= len + 1; ++step) { + block_list_push(out, x + dirs8[dir][0] * step, y + dy, z + dirs8[dir][1] * step, (uint16_t)branch_log); + } + } + } + for (int i = 0; i < 6; ++i) { + int root_len = 3 + rng_range_inclusive(rng, 0, 2); + place_redwood_root(ctx, x, y, z, dirs8[i][0], dirs8[i][1], root_len, arch->log_block, rng, out); + } + return; + } int spire = 3 + rng_range_inclusive(rng, 0, 2); int crown_start = y + core_height / 2 + rng_range_inclusive(rng, 0, 2); @@ -3709,7 +3736,7 @@ static void generate_chunk_border_wall(worldgen_ctx *ctx, int chunk_x, int chunk int center_x = world_x; int center_z = world_z; - int base_along = (floor_div_int(along, tower_spacing) * tower_spacing) + tower_spacing / 2; + int base_along = floor_div_int(along + tower_spacing / 2, tower_spacing) * tower_spacing; switch (side) { case 0: center_x = ctx->wall_min_x + wall_center;