COAST. The task's premise -- "the island edge is the steepest part" -- is
right, and the diagnostic locates it precisely: it is the SEABED, not the
land. HeightCurve.Apply returns early at and below sea level, so tasks
05-09 reshaped the land and never touched the water. Measured on the same
seed, distance-from-shore vs height:
land reaches 10 m seabed reaches 10 m gradient
curve OFF 31 px 31 px 0.254/0.258
curve ON (ships) 186 px 31 px 0.038/0.258
So the landward side is ALREADY the broad shallow shelf terrain_design.md
asks for -- 54% of the island sits under 14 m -- and flattening it further
would only make it mushy. What is left is a shoreline that shelves gently
on land and then drops 6.7x steeper the moment it goes under.
CoastShelf fixes that side: depth' = depth * (1 - 0.775*exp(-depth/100 m)).
The seabed leaves the waterline at 22.5% of its former gradient and
recovers smoothly, so deep water and the Trench keep their shape. Measured
after: 5 m depth at 43 px (was 15), 10 m at 75 (was 31), 30 m at 150 (was
94) -- a 2.4-2.9x wider shallows.
It is strictly positive for positive depth, so it CANNOT move the waterline
by one pixel. Biomes and water bodies come out bit-identical, which is why
the coast is separable from elongation in the batch rather than tangled
with it -- contrary to the task's expectation that all coast work moves
biomes.
ELONGATION. IslandAxisX/Y replace the 1.15/0.90 literals (the spine shares
AxisX, as it always shared the literal). Sized by replaying candidate
falloffs against real terrain rather than guessing -- the replay reproduces
the shipped extents exactly, bbox and land count.
That replay says the task's suggested 1.30/0.85 buys +2.0% aspect, because
THE ISLAND IS ALREADY TRENCH-CLAMPED IN X: it spans 90.5% of the map width,
and 1.15 -> 1.40 moves the west coast only 393 -> ~360 px. Aspect responds
almost entirely to AxisY, which costs land:
1.30/0.85 +2.0% aspect +2.9% land 1.30/0.80 +4.9% -2.2%
1.30/0.82 +3.7% aspect -0.1% land 1.30/0.75 +11.5% -7.3%
Default 1.30/0.78 -- a visible step (+~8% aspect, measured 1.137 -> 1.200)
at ~4% land. The developer's eye tunes it from the batch; the table above
is the price list.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
||
|---|---|---|
| Client | ||
| Core | ||
| Data | ||
| Resources | ||
| Scenes | ||
| Server | ||
| Tools | ||
| .gitignore | ||
| icon.svg | ||
| icon.svg.import | ||
| islaApocolypse.csproj | ||
| islaApocolypse.csproj.old | ||
| islaApocolypse.sln | ||
| project.godot | ||
| README.md | ||
| ServerConfig.json | ||
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.
- 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. - 3D voxel world (
Server/+Core/) — the.datis 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:
- Open
Scenes/Main.tscn. - Press F6 — Run 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 4–8 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.