No description
Find a file
beezm 8e55326a84 Phase 2a: continuous grade — smooth the upper staircase, preserve the lowlands
rev 3 of the curve redesign. The developer's verdict on the 01 baseline was that the
LOWLANDS ARE GOOD; the fault is the terracing above them. So this adds a second curve
mode that preserves the low plain bit-for-bit and replaces everything above the flood
line with one smooth monotone climb.

Core/ContinuousCurve — piecewise, and the pieces have different loyalties:
- at/below sea: identity, as ever.
- above sea to K2: DELEGATES to HeightCurve's own toe+red branches. Not "equivalent" —
  the same code path, so the same floats. Oracle (d) holds it to that.
- above the ceiling: a Fritsch-Carlson (PCHIP) monotone spline to the 420 m cap,
  C1-joined to the red band's exit slope. Monotone by construction for any ordered
  control points, which retires the 24-corner sweep; a 10k strict-increase sample runs
  per seed anyway, because "cannot fail" is worth a millisecond.
- Build() REFUSES rather than degrades: a ceiling near the old bench, a drama that folds
  the summit under its own onset, control-point secants that are not strictly increasing
  (the no-magnet rule, enforced rather than hoped for).

Only BENCH_*/PLATEAU_* are dropped. SEA/ORANGE_CEIL/RED_CEIL survive because they are
the storm-ladder FLOOD TIERS and they live inside the preserved lowland; PEAK_CAP and
the per-seed spikeMax normalization survive as the summit.

Shelf detail is forced off in continuous mode: the flat benches it de-slabbed no longer
exist, and painting noise on the climb now would pre-judge what erosion should carve.

Oracle, all hard checks passing:
- (a1) curve off is bit-identical to Phase 1's dump.
- (a2) staircase mode is bit-identical to TASK 01's dump — the control is provably the
  control, not a re-derivation. (CurveBaselineTool is pinned to Staircase so the config
  default moving to Continuous cannot drift it.)
- (d) lowlands bit-identical to the staircase over 3.6M cells, every continuous variant,
  both seeds. The lifted_WRONG bookend fails it on 1.6M cells, as intended.
- (f) sea identity per CELL, not per count, including 67M cells at 8192.

The finding, measured and recorded in the batch scratch: the massif SHRANK. Land above
100 m goes 14.9% -> 4.8%, above 220 m 4.5% -> 0.6%. A feather sweep to the practical
floor recovers ~1.3 points, so this is structural, not a tuning miss: the staircase's
highland area was an artifact of the bench and plateau acting as magnets, and a curve
with no magnets preserves the raw distribution's bottom-heavy shape. "No terraces" and
"the same land up high" are not both available from curve work alone.

Exploration batch, not convergence. A tuning pass follows once a direction is picked.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DCWNaDZPfTiAy3meGNGgqt
2026-08-20 03:41:27 -04:00
Client Phase 0: clean project skeleton for the v2 rewrite 2026-08-19 20:21:12 -04:00
Core Phase 2a: continuous grade — smooth the upper staircase, preserve the lowlands 2026-08-20 03:41:27 -04:00
Server Phase 0: clean project skeleton for the v2 rewrite 2026-08-19 20:21:12 -04:00
Tools Phase 2a: continuous grade — smooth the upper staircase, preserve the lowlands 2026-08-20 03:41:27 -04:00
.gitattributes Phase 0: clean project skeleton for the v2 rewrite 2026-08-19 20:21:12 -04:00
.gitignore Phase 0: clean project skeleton for the v2 rewrite 2026-08-19 20:21:12 -04:00
islaApocalypse-v2.csproj Phase 0: clean project skeleton for the v2 rewrite 2026-08-19 20:21:12 -04:00
islaApocalypse-v2.sln Phase 0: clean project skeleton for the v2 rewrite 2026-08-19 20:21:12 -04:00
project.godot Move the user:// isolation warning out of project.godot 2026-08-19 21:31:12 -04:00
README.md Phase 2a: the faithful redistribution curve, re-measured against v2's own output 2026-08-20 01:38:10 -04:00

Isla Apocalypse — v2

The rewrite (D-049). A post-apocalyptic survival voxel game: one island, generated once offline, loaded by everyone.

Status: Phase 2 — shaping. Phase 0 laid the contracts and the tooling rails; Phase 1 ported the crown-jewel noise and pass 1 (the island's raw shape); chat2/01 added pass 2a — the height redistribution curve and shelf detail, re-calibrated against this repo's own output, with the two-height-field split and an automatic oracle.

Still no erosion, rivers, water bodies, crater carve, coast shelf, offshore islets, biomes, roads or mesher.


⚠ Two repos. Never one.

Repo Role
~/celerNexus/islaApocalypse-v2/ (this) The rewrite. Every line of new code is written here.
~/celerNexus/islaApocalypse/ READ-ONLY. The pre-rewrite prototype, archived at ab78883, tag pre-rewrite-reference. Ported FROM; never written to.
~/celerNexus/islaApocalypse-vault-v0.1/ The design vault — the source of truth for WHAT and WHY. The vault leads.

The old codebase is a spent quarry (D-050): mined, never tracked, never synced, never canon'd. Writing rewrite code into it would corrupt the very thing being ported from.

⚠ Runtime data isolation — do not weaken

This project pins its user:// directory away from the old prototype's, which holds the preserved reference seeds, blueprints and batches:

user:// → ~/.local/share/islaApocalypse-v2/          ← this project
          ~/.local/share/godot/app_userdata/islaApocalypse/   ← ⛔ the OLD prototype. Never touch.

Pinned two ways in project.godot — a distinct application/config/name and use_custom_user_dir + custom_user_dir_name. Both must stay.

⚠ Do not document this with a comment in project.godot — it will not survive.

Godot rewrites project.godot on import and STRIPS ALL COMMENTS, replacing the header with its own boilerplate. (Measured: a warning block written there was gone after the next --import. The settings survived; only the explanation was deleted.) So the warning lives here, and the guarantee is enforced by the probe below — which exits non-zero on a clash and therefore works in a pre-flight check, not just by eye.

After any change to the [application] block, re-run the probe:

Godot_v4.7.2-stable_mono_linux.x86_64 --headless \
  --path ~/celerNexus/islaApocalypse-v2 res://Tools/Scenes/UserDirProbe.tscn

Layout

Core/     math + data only, ENGINE-FREE   — depends on nothing above it
Server/   authoritative logic             — may use Core          (empty: not yet its phase)
Client/   rendering                       — may use Core          (empty: not yet its phase)
Tools/    the offline generator           — ⚠ may NOT use Client

Each layer has a README.md stating its role and its boundary. Read the one for the layer you are about to write in — they carry the reasons, not just the rules.

The contracts this phase establishes

  • ★★ The column model (D-053) — the world as a 2D grid of columns, each a stack of (material, thickness) runs. Air is the top run; there is no air-vs-solid height branch.Core/Scripts/Column.cs
  • The material schemas (D-054) — terrain and building, two schemas bridged by a transformation seam that is deliberately empty. Identity is a registry key, never an ordinal. Mesh style is per-origin, never a material property. → Core/Scripts/MaterialRegistry.cs
  • The scaling discipline — nothing uses a raw pixel number. → Core/Scripts/GenerationScale.cs
  • The vertical yardstick — ONE metres-per-raw-unit number, not three constants and twenty literals as the prototype had. → Core/Scripts/WorldScale.cs
  • The elevation profile — the 7-band redistribution curve, identity at and below sea, its knots measured rather than chosen. → Core/Scripts/HeightCurve.cs
  • The two-height-field split (D-046) — heightClassify is raw and is the oracle; height is curved and is what gets drawn. → Tools/Scripts/Pass2Result.cs
  • Tooling safety — every path env-overridable, deletion refused by code. → Core/Scripts/ToolingPaths.cs, Core/Scripts/FileSafety.cs

Build

dotnet build
Godot_v4.7.2-stable_mono_linux.x86_64 --headless --import --path .

Godot 4.7.2 (mono) · .NET 8 (net8.0) · Godot.NET.Sdk/4.7.2

The reference repo is Godot 4.7.1. This repo deliberately targets 4.7.2 — clean rewrite, current tooling. 4.7.1 is the port source, not a constraint on new code.

<RollForward>Major</RollForward> in the .csproj is load-bearing.

The target is net8.0 but this machine carries only a .NET 10 runtime. Without that property the generated runtimeconfig.json rolls forward by MINOR only and every run fails with "You must install .NET 8". This bites at run time, not build time — the build succeeds either way — so re-check the emitted runtimeconfig.json after any .csproj change.

What this phase is NOT

No mesher, no stratigraphy, no biomes, no water, no rivers, no erosion. The pipeline is 2D-maps-first (D-056): stages 15 are flat maps, gotten completely right before a single 3D vertex exists. Building the mesher before the data is right is the specific trap this rewrite exists to undo.

And the curve is a BASELINE, not a verdict. It is ported faithfully and calibrated honestly so that later reshaping has a control to be judged against. Whether this elevation profile — 60 % of land in the bottom 14 m, 4 % above the plateau — is the one the world wants is an open question the histograms exist to inform, not one this port has answered.