No description
Find a file
beezm ed16a7f668 tune: edge warp 5 m @12/island -> 12 m @20/island (terrain-water task 10)
Sized from measurement, not taste-first. |grad raw| at the K3/K4/K5
contours on seed 1375359975 is p50 0.00088 raw/px, so the first try (5 m,
12 undulations/island) displaced the shelf boundary a MEAN of 3.7 px with
a roughness ratio of 1.03 -- real, and invisible at map scale. At 12 m
and 20/island the boundary moves a mean 8.4 px (bench) / 9.1 px
(plateau), roughness ratio 1.09, and the outline grows the notches, coves
and peninsulas the sketch asked for.

Measured cost at 12 m (A off vs B, same seed): lowland and toe/red bands
bit-identical in both pixel count and slope -- the K2 pin holding exactly,
as designed. Foothill riser p50 0.681 -> 0.676 m/px, p90 1.445 -> 1.478,
max 3.09 -> 3.81. Bench p50 0.21 -> 0.232 (micro-relief included), still
buildable. Peaks max identical at 6.55.

Safety bound restated from "half the margin to a fixed knot" to 2/3 of
the smaller adjacent band, which is the constraint that actually matters:
the squeezed band never compresses below a third of its nominal width, so
its slope never more than triples. That puts the ceiling at 16.45 m for
the v5 knots and leaves the 12 m default real headroom if the gate says
"more".

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-08 20:52:08 -04:00
Client docs: bring all READMEs current with actual code (post-sweep-10 truth pass) 2026-08-05 05:23:58 -04:00
Core tune: edge warp 5 m @12/island -> 12 m @20/island (terrain-water task 10) 2026-08-08 20:52:08 -04:00
Data docs: bring all READMEs current with actual code (post-sweep-10 truth pass) 2026-08-05 05:23:58 -04:00
Resources docs: bring all READMEs current with actual code (post-sweep-10 truth pass) 2026-08-05 05:23:58 -04:00
Scenes docs: bring all READMEs current with actual code (post-sweep-10 truth pass) 2026-08-05 05:23:58 -04:00
Server docs: BLUEPRINT_FORMAT.md + README updates for the v2 container (terrain-water task 02) 2026-08-06 07:31:03 -04:00
Tools tune: edge warp 5 m @12/island -> 12 m @20/island (terrain-water task 10) 2026-08-08 20:52:08 -04:00
.gitignore baseline: working salvaged prototype on Godot 4.7.1 (pre-F1) 2026-08-05 01:45:41 -04:00
icon.svg baseline: working salvaged prototype on Godot 4.7.1 (pre-F1) 2026-08-05 01:45:41 -04:00
icon.svg.import baseline: working salvaged prototype on Godot 4.7.1 (pre-F1) 2026-08-05 01:45:41 -04:00
islaApocolypse.csproj baseline: working salvaged prototype on Godot 4.7.1 (pre-F1) 2026-08-05 01:45:41 -04:00
islaApocolypse.csproj.old baseline: working salvaged prototype on Godot 4.7.1 (pre-F1) 2026-08-05 01:45:41 -04:00
islaApocolypse.sln baseline: working salvaged prototype on Godot 4.7.1 (pre-F1) 2026-08-05 01:45:41 -04:00
project.godot baseline: working salvaged prototype on Godot 4.7.1 (pre-F1) 2026-08-05 01:45:41 -04:00
README.md docs: bring all READMEs current with actual code (post-sweep-10 truth pass) 2026-08-05 05:23:58 -04:00
ServerConfig.json feat: config-gated flat-scalar sea level (D-033, terrain-water task 04) 2026-08-07 06:20:48 -04:00

IslaApocalypse

Version: v0.0.1 — prototyping / salvage. Not a playable build. Engine: Godot 4.7.1 · C# / .NET 8 (Godot.NET.Sdk 4.7.1)

A procedurally generated, multiplayer-ready voxel survival game on a post-nuclear Caribbean island. Terrain is smooth (Marching Cubes), not blocky.

Design intent, decisions and rationale live in the design vault, not here. This README and the per-directory ones describe what the code does. For why, see the vault repo (islaApocalypse-vault-v0.1).


How the world gets built

Two phases, with a file in between.

  1. 2D blueprint (Tools/Scripts/MapGenerator.cs) — FastNoiseLite topography, dynamic sea level, an impact crater, biome zoning, tiered town placement, and an A* road network in four tiers (Highway, Branch, Rugged, Trail). Written to a binary .dat.
  2. 3D voxel world (Server/ + Core/) — the .dat is parsed into RAM, and chunks are built around the Capitol: a density field per chunk, meshed with Marching Cubes, vertex-coloured by biome and depth, with roads carved into the terrain.

Map size is config-driven, not fixed. The shipped ServerConfig.json selects the 8K profile → 8192 × 8192, where 1 pixel = 1 metre = 1 voxel footprint.


⚠️ How to actually run it

Pressing Play (F5) does NOT run the game. The project's main scene is the 2D map generator, so F5 regenerates the entire world (minutes — and it currently stalls in the A* road pass) and overwrites your .dat.

To view the 3D world:

  1. Open Scenes/Main.tscn.
  2. Press F6Run Current Scene.

It reads ServerConfig.json, loads the existing .dat, and builds the chunk grid.

To generate a new world (only when you actually want a new map): press F5, or open Tools/Scenes/MapPreview.tscn and press F6.

Before you run it — set ChunkRadius

ServerConfig.json, at the project root:

{ "WorldSeed": 1063685222, "MapProfile": "8K", "TownDensity": "Normal", "ChunkRadius": 32 }

ChunkRadius is a load radius in chunks, not a chunk size. The grid built at boot is (2 × radius)² chunks, all synchronously:

ChunkRadius Chunks built Cost
4 64 loads in seconds
8 256 still quick
32 (shipped) 4,096 ~3.6 GB, minutes

Use 48 while iterating. 32 is for looking at a lot of world at once.

MapProfile accepts 4K / 6K / 8K / 10K → 4096 / 6144 / 8192 / 10240.

Where the generated world lives

Outputs go to Godot's user://, not into this repo — on Linux, ~/.local/share/godot/app_userdata/islaApocolypse/:

  • MapData_Seed_<seed>.dat — the blueprint (~512 MB at 8K)
  • Map_Seed_<seed>.png — a visual snapshot of the map, for reviewing and picking seeds

WorldSeed must match an existing .dat, or the load fails with CRITICAL ERROR: Map file not found and you get an empty scene.


Directory layout

Path What's in it
Core/ Shared, stateless logic: the .dat parser, Marching Cubes, chunk data, block registry, biome palette, constants. Used by both the server and client paths.
Server/ Authoritative world building: loads the blueprint, builds chunks around the Capitol, computes densities, carves roads.
Client/ Rendering: turns finished chunk data into MeshInstance3D geometry with a vertex-coloured material.
Tools/ Offline developer tooling — the 2D map generator and its scenes. Never shipped.
Scenes/ Runtime scenes. Main.tscn is the 3D world.
Data/ Handoff folder for static world data. Currently documentation only.
Resources/ Intended home for Godot .tres asset definitions. Currently documentation only.

Current state

Working: 2D generation end to end at 8K · .dat write and read · chunk building · Marching Cubes meshing with analytical normals and seam-free integer vertex welding · road carving for all four tiers with per-tier width and grade · biome/depth vertex colouring with soft material fades.

Known issues:

  • A* road generation is slow enough to stall a full regeneration — a 67-million-node grid at 1 px granularity, with a same-sized setup loop. The dominant open problem.
  • Faint seam lines along chunk borders — a normals/shading difference between independently meshed chunks, not a gap in the geometry.
  • No player, no collision, no water, and no camera controller — there is no input handling in the codebase at all. Inspect the world with the editor camera.
  • The world is built once at boot: no chunk streaming or unloading yet.
  • Two road issues remain: roadbed elevation can jump where two separate stretches of road pass close together, and road materials are only a coarse asphalt/dirt split.