Pure analysis over the ERODED render map: changes zero terrain, adds zero water.
Priority-flood (task-03 family, Barnes heap+pit, 8-connected) with a one-ulp
epsilon so every filled pit keeps a strictly descending routing path — the ~16.5k
erosion pits route through; depressions >= 2 m deep and >= 10k px survive as
terminal basins (70 on the working seed). D8 flow directions on that routing
surface (D8 as a COMPUTATION, not the reverted carving use), Kahn-propagated flow
accumulation, then promotion: TRUE-ocean outlets (WBID 1 only — two of the first
draft's three 'sea-reaching' trunks actually ended in enclosed lagoons, which is
exactly the overclaim the gate must not inherit) ranked by drainage area, top ~3
with outlet separation become trunks; max-accumulation stems; mountain-exit from
sustained along-stem grade; lean deduped tributaries; lean endorheic terminals
credited with per-basin TOTAL inflow (acc at the deepest cell undercounts flat
lagoon beds 10x — measured).
Output: console report + a JSON plan sidecar next to the source blueprint —
deliberately NOT a blueprint section, so the plan cannot masquerade as realized
water. The source .dat is never written (md5-verified). Headless tool, ~21 s
analysis on 8K; RIVERPLAN_* env dials.
Seed 1280587109 findings for the gate: 3 ocean trunks spread west/north/east
(436k/409k/325k px); the island's five LARGEST systems (1.1M-2.3M px) are all
endorheic — three end in big enclosed lagoons (classify lakes, 19-20 m basins),
two in dry pans; 62.9% of land does not drain to the open ocean, the drainage
restatement of task 18's 'erosion cannot cut the lowlands'. The 2.27M-px giant
terminates in the SE lagoon ~1.1k px from the southernmost town (filed south
report, not enforced).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
v2 tagged-section container (D-030): raw ISLA magic + u32 version gate,
[u32 tag][u64 length][payload] sections — params (resolved generation
inputs incl. impact centre), heights f32, biomes u8, towns with the
highway-node flag, four road tiers identified by tag not position.
- BlueprintFormat.cs: the single tag/constant registry.
- BlueprintWriter.WriteV2: blueprint-typed, callable outside a
generation run; generator and harness are both just callers.
- ExportMapData dual-writes: v2 under the primary seed name, legacy v1
beside it as _v1.dat (safety net; removal is a future task).
- MapDataParser: LoadMapDataFromPath entry point; v1 parse body
extracted intact as LoadV1 (v2 reader lands in the next commit).
- RoundTripHarness scene: load v1 -> write v2 -> load v2 -> semantic
equality, headless, seconds per cycle.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Every README was read first, checked against the code in its directory, then
rewritten to describe what the code actually does now.
Corrected throughout: map size is config-driven (8192 default) not a fixed
4096; chunks are 24x24x256 not 32x32; road carving is implemented for all four
tiers, not a 'next step'; Data/ and Resources/ are empty, not populated.
Also fixed MATH_MARCHING_CUBES.md, which documented the density sign convention
exactly backwards — it claimed positive was underground, where the code treats
positive as above the surface and counts a corner inside when density < iso.
Getting that backwards inverts every normal, a bug this project has hit before.
The root README now carries accurate run steps: F5 runs the map generator (not
the game), F6 on Scenes/Main.tscn runs the 3D world, and ChunkRadius is a load
radius that should be dropped to 4-8 while iterating.
Docs only. No code changed.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>