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> |
||
|---|---|---|
| .. | ||
| Scenes | ||
| Scripts | ||
| README.md | ||
/Tools
Offline developer utilities. Nothing here ships. These generate the source data that /Server
and /Client later consume, which keeps world-generation logic out of the shipped client.
The 2D world generator
Script: Tools/Scripts/MapGenerator.cs · Scenes: Tools/Scenes/MapPreview.tscn and
Scenes/MapCaptureTool.tscn
Builds the topographical and logistical foundation of the island before any 3D exists.
- Resolution is config-driven, from
ServerConfig.json'sMapProfile:4K/6K/8K/10K→ 4096 / 6144 / 8192 / 10240. Shipped default is 8K. 1 pixel = 1 in-game metre = 1 voxel footprint. (TheMapSizefield initialiser in the script says 4096, but it is overwritten from config before use.) - Topography: FastNoiseLite plus distance-falloff maths for a guaranteed mainland island, a mountain spine, dynamic temperature-driven sea level, and an impact crater pushed into the northern coast (carved at 80 % of its radius so a landbridge always survives).
- Water bodies: the classified water promoted into explicit blueprint data (ocean + labeled
lakes with transitional per-body levels —
WBID/WBTB/WSRFsections), plus priority-flood basin diagnostics. TheSkipRoadsconfig toggle turns a full ~26-min generation into a ~80 s road-less iteration cycle. - Logistics:
AStarGrid2Dpathfinding producing a looping continental highway, a branch to the mountain hub, and county roads daisy-chained outward with Prim's algorithm. Paths are decimated (Ramer–Douglas–Peucker) then smoothed (4 Chaikin passes). - Zoning: biome mapping and tiered town/POI placement by slope, temperature and proximity.
⚠️ A* is the known bottleneck
The grid is one node per pixel — 67 million nodes at 8K — and the weight-setup pass walks every
one of them. A full generation can stall long enough that runs get abandoned. await yields are
sprinkled through the road stage, but they cannot interrupt a single engine-side GetPointPath call,
so they only help between paths. Expect a regeneration to take minutes, or to need abandoning.
Outputs — written to user://, not into the project
| File | What it is |
|---|---|
MapData_Seed_<seed>.dat |
The binary blueprint the server reads — v2 tagged container (~336 MB at 8K; contract in Core/Scripts/BLUEPRINT_FORMAT.md) |
MapData_Seed_<seed>_v1.dat |
The same content in the legacy v1 format (~512 MB), dual-written as a safety net until a future removal task |
Map_Seed_<seed>.png |
Visual snapshot of the map, for reviewing and picking seeds |
On Linux: ~/.local/share/godot/app_userdata/islaApocolypse/.
Running it
Open Tools/Scenes/MapPreview.tscn and press F6. It is also the project's main scene, so
pressing F5 anywhere runs this — which is why F5 regenerates your world instead of starting the
game. Use Scenes/MapCaptureTool.tscn when you specifically want the full-resolution PNG.
Rules
- No client dependencies. Nothing here may reference UI, player controllers or shaders in
/Client. - Data out, nothing in. Tools emit
.dat/.png/.json; they never write to a live server save. - No magic numbers. Distances and radii scale off
MapSizeor the derivedscaleFactor, so the generator behaves the same at every profile.