RimWorld's technique 4, the reference this ticket names, works by CONTRAST: the
Rockies and Appalachians carry dense hatching and the Great Plains carry none.
Ferrath's Global carried an even wash of dots over every landmass instead —
texture present, information absent.
The cause was a constant measured on the wrong rung. RUGGEDNESS_FULL_SCALE_Q = 4
comes from Region ("d4 2.38"), but the elev_q path it gates only ever RUNS at the
orbital rungs, where relief_q is flat and the stipple falls back to it. Ferrath
Global measures a mean 1-cell elev_q gradient of 0.99, so a coherent 4-cell
baseline reaches ~4 and saturates the constant exactly: every land cell read as
fully rugged.
It now normalizes against the canvas's own measured gradient — the same
self-calibrating shape T-1240 gave the hillshade, and for the same reason: one
constant cannot serve rungs whose sample spacing differs by four orders of
magnitude. A contrast curve rides on top, because even unsaturated the linear
reading puts ordinary ground mid-range and paints grain everywhere.
Measured on Global, before -> after: 1,679 -> 1,900 distinct colours, 145.90 ->
147.39 lum spread, and the pale uplands now stipple visibly denser than the
lowlands beside them.
Recorded because it cost two wrong turns: I first guessed saturation, then
talked myself out of it after measuring a 1-CELL gradient (0.99) against a full
scale meant for the 4-CELL baseline, and shipped a contrast curve alone — which
measurably did nothing (1,679 -> 1,698), because a curve cannot separate values
already clamped to 1.0. The gamma is kept; it does its job now that there is a
range to curve. The elev_q gradient joins relief_q's in the capture readout, so
the next person tuning this can read the number instead of guessing at it.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
114 lines
6.6 KiB
YAML
114 lines
6.6 KiB
YAML
name: The Settled Reach
|
|
# Version scheme: 0.{phase}.{n} — phase = active Development Cascade phase (D-166).
|
|
# Phase 4 (deterministic world generation) is active.
|
|
# 0.4.1-tagged step canvases carried lake_margin_q's flat absolute-ceiling
|
|
# semantics (pre-per-basin-normalization) and were written to real disk
|
|
# caches during T-1188 eyeball runs — 0.4.2 forces those entries to miss.
|
|
# 0.4.2-tagged Global/Region-rung step canvases sampled the coastline
|
|
# position raw (no coast_warp_px) — T-1160 applies the warp at orbital
|
|
# sampling, changing orbital-rung canvas bytes (elev_q/temperature_dc/
|
|
# moisture_q shift near coasts) — 0.4.3 forces those cached entries to miss.
|
|
# 0.4.3-tagged canvases predate the D-255 extent inversion (a rung now fixes
|
|
# the canvas EXTENT and the gridunit spacing falls out, rather than the
|
|
# reverse). District/Quarter/Block/Chunk kept the same 960x540 cell counts
|
|
# through that change, so their cache keys are byte-identical while a District
|
|
# canvas now covers 3.6 km of ground instead of 1,966 km — a warm cache would
|
|
# silently serve pre-inversion canvases. 0.4.4 forces those entries to miss.
|
|
# 0.4.4-tagged GLOBAL canvases are all 2x1 — `serve_step_canvas_request` was
|
|
# still zeroing Global's wire extent (a pre-extent-inversion sentinel), so
|
|
# every Global request resolved to a two-cell canvas regardless of viewport.
|
|
# Those entries were also cached under a key that ignored extent, so they
|
|
# answered every later request forever. 0.4.5 forces them to miss.
|
|
# 0.4.5-tagged canvases carry pre-T-1237 river courses: one course per D8 HOP
|
|
# rather than one per river (build_paths walks whole headwater->mouth rivers
|
|
# now). The hop-shaped entries survived that fix because it changed only server
|
|
# and client code, never this version — so Ferrath Global replayed 375 fragments
|
|
# with a 106 km longest run, all of them below D-261's read-as-a-line floor, and
|
|
# drew NOTHING, while a cold cache on the same build produced 73 whole rivers
|
|
# with a 1,644 km trunk and drew 18. Diagnosed as T-1239. 0.4.6 forces them to
|
|
# miss.
|
|
#
|
|
# THE PATTERN, now four bumps deep: a change to how a canvas is GENERATED is
|
|
# only half the change — the other half is this line. Nothing enforces the
|
|
# pairing, so a canvas-generation commit that leaves this version alone ships a
|
|
# silent regression that reproduces only on machines with a warm cache. The
|
|
# capture harness no longer hides it (tests/run-visual isolates user:// per run,
|
|
# T-1239), but a real player's cache is still governed by this number alone.
|
|
# 0.4.7 carries NO canvas-generation change — it is the gate that enforces the
|
|
# pairing described above, arriving (T-1242). tooling/canvas_sources.py lists the
|
|
# paths, tooling/check-canvas-version rejects a push that touches them without
|
|
# moving this line, and the registry includes ITSELF so that narrowing it and
|
|
# changing a canvas file in one push still demands a bump. That self-inclusion is
|
|
# why this bump exists: adding the registry trips its own rule. The version is
|
|
# spent rather than special-cased, because "this change is obviously harmless" is
|
|
# the reasoning that produced all five regressions above.
|
|
# 0.4.8 also carries NO canvas-generation change: a test-only edit to
|
|
# composition.rs (its conservation assertion was a tautology) tripped the T-1242
|
|
# gate, because that gate is path-based and cannot tell test code from generator
|
|
# code. Second no-op bump in two days — the false-positive rate is real, and is
|
|
# the price of the ruling that a false negative costs a week. Revisit if it
|
|
# becomes noise; do NOT add an override to dodge it.
|
|
# 0.4.9 is a REQUIRED bump, not a gate formality (T-1213). The disk cache stores
|
|
# the DECODED canvas, and the decode was silently dropping the `relief_q` plane —
|
|
# so every 0.4.8-and-earlier entry physically lacks the field, and would keep
|
|
# rendering the deep rungs as a flat wash even against a build that reads it.
|
|
# This is the first bump in the series where a warm cache is wrong about CONTENT
|
|
# rather than merely stale.
|
|
# 0.4.10 changes how a canvas is PAINTED, not how it is derived, so cached
|
|
# entries are still valid content — but the client step_canvas cluster is in the
|
|
# T-1242 registry and the rule is bump-when-touched, so it moves. Cheap: one
|
|
# round of misses against a map that now reads as terrain.
|
|
# 0.4.11 — per-class cover marks (copse, thicket, rocky outcrop). Paint again,
|
|
# not derivation; bumped because the client step_canvas cluster is in the T-1242
|
|
# registry.
|
|
# 0.4.12 changes DERIVED BYTES, not paint (T-1240): Region canvases now truncate
|
|
# every octave the rung cannot reconstruct, so a 0.4.11 Region entry holds a
|
|
# relief field this build would never produce. Warm caches are genuinely wrong
|
|
# here, not merely stale.
|
|
# 0.4.13 — stipple contrast (T-1194). Paint only; bumped because the client
|
|
# step_canvas cluster is in the T-1242 registry.
|
|
version: 0.4.13
|
|
repository: settled-reach
|
|
|
|
|
|
description: >
|
|
Top-down life-sim set in an original science fiction universe. Asymmetric
|
|
information and occlusion-based perception from a single-character
|
|
perspective, with a Rimworld-style storyteller. Systems interactions like
|
|
The Sims, combat and visuals like single-character Rimworld, world
|
|
generation inheriting from Dwarf Fortress and NMS, economy inspired by
|
|
X4/EVE. Every system is interactable but ignorable — the world is alive
|
|
for any given run.
|
|
|
|
setting: >
|
|
The Settled Reach — a network of star systems connected by Founder Gates.
|
|
Neural lattice technology enables soft immortality, forking, and
|
|
re-embodiment.
|
|
|
|
development: >
|
|
Built outside-in along the six-phase Development Cascade (D-166): wiki
|
|
content and star map, economics layer, planetary maps and atlas,
|
|
deterministic world generation (active), player control and in-world
|
|
rendering, room-level detail.
|
|
|
|
architecture:
|
|
client: Godot 4 (GDScript)
|
|
server: Rust with bevy_ecs (simulation server)
|
|
transport: subprocess/IPC via TCP with MessagePack serialization
|
|
protocol: length-prefixed MessagePack frames (4-byte big-endian)
|
|
determinism: ChaCha20 seeded RNG, deterministic tick processing
|
|
|
|
simulation:
|
|
tick_rate: 10 ticks per game-minute
|
|
time_model: 4 day phases (Morning, Afternoon, Evening, Night)
|
|
grid: dual-scale (0.5m simulation tiles, 1m visual tiles)
|
|
visibility: symmetric shadowcasting + forward/peripheral/blind vision cone
|
|
knowledge: per-entity knowledge graphs with confidence decay
|
|
|
|
content:
|
|
format: YAML with JSON Schema validation
|
|
structure: campaigns/systems/stations/districts hierarchy
|
|
npcs: 10-axis model (7 essential + 3 supporting) with CombatCapability
|
|
dialogue: tagged line pools with 4-layer relational filtering
|
|
population: 30% flat / 50% mundane triangles / 20% intrigue-entangled
|