No description
Find a file
beezm d296ef30c4 feat: shared water predicates + water-bodies stage + priority-flood diagnostics (terrain-water task 03)
IsWaterPixel/IsOceanPixel/IsLakePixel are the single per-pixel water
truth; AssignBiomesAndDraw's water branch now calls them (verbatim
rules — behavior-preserving, proven by the bit-identical-biomes oracle
at acceptance). New IdentifyWaterBodies stage between the masks and
biomes: ocean = body 1, lakes labeled 2..N with CalculateTrueOcean's
4-connectivity in deterministic scan order; one transitional surface
level per body (GetSeaLevel at the body centroid; ocean at map
centre). 0_water snapshot painted from the stage's own outputs.

Priority-flood pit-fill (heap + pit-queue variant) runs as validated
diagnostics only — serializes nothing, asserts filled>=original and
full-map non-ascending drainage (reverse BFS, no sampling), reports
closed-basin statistics.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-07 01:29:51 -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 feat: shared water predicates + water-bodies stage + priority-flood diagnostics (terrain-water task 03) 2026-08-07 01:29:51 -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 feat: shared water predicates + water-bodies stage + priority-flood diagnostics (terrain-water task 03) 2026-08-07 01:29:51 -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: blueprint v2 reader dispatch + validation + params cross-check (terrain-water task 02) 2026-08-06 07:27:42 -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.