Resolves Q-101 — how a coarse Layer-1 cell + seed becomes coherent ~1m voxel geometry across the scale jumps. The tile-derivation-contract workshop output: - three-carrier refinement chain RegionProfile -> ChunkContext -> VoxelColumn, pure deterministic, no authoring at the derivation layers - district-temperature climate primitive (2x2 km, C, nullable) + separate moisture; everything climatic derives from temperature(+moisture) - scattered, transient freeze/snow model (freshwater +5..-10, sea ice own band, snow moisture-gated; forms cold phase / melts warm phase) - stateless f64-to-voxel domain warp (anti-squaring) - 8 morphology families over a frozen 17-zone vocabulary, gated decision tree - seams prevented at source (gate ordering + build-time matrix); valid geomorphic seams kept sharp + warped Includes workshop brief, round-1 positions, and workshop-outcomes.md. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
596 lines
29 KiB
Markdown
596 lines
29 KiB
Markdown
---
|
||
title: "Gestalt Round 1 — Morphology Algorithm Family + Game-Feel Constraints"
|
||
workshop: tile-derivation-contract
|
||
participant: Gestalt
|
||
round: 1
|
||
date: 2026-06-07
|
||
---
|
||
|
||
# Gestalt Round 1: The Morphology Family and What Terrain Must Do
|
||
|
||
Let me break down what this actually means mechanically. We have two distinct
|
||
problems that must be solved simultaneously: (1) the classification logic that
|
||
selects which algorithm runs for a given region, and (2) the game-feel contract
|
||
that algorithm must satisfy. These are not separable — an algorithm that is
|
||
geologically plausible but produces flat, featureless terrain at the 64 m chunk
|
||
scale is a failed algorithm regardless of its realism score.
|
||
|
||
---
|
||
|
||
## Framing: What the Morphology Algorithm Actually Produces
|
||
|
||
Tyre's API contract gives each morphology family a clean interface:
|
||
|
||
- **Receives:** `ChunkContext` (RegionProfile + warped position + elevation grid +
|
||
flow data)
|
||
- **Produces:** `ElevationDelta: i16` per voxel column (signed integer metres,
|
||
delta from base heightmap)
|
||
|
||
That `ElevationDelta` output is then consumed by the material/vegetation/water
|
||
derivation steps. So the morphology family's job is: given a region's coarse
|
||
character, produce the fine-grain elevation variation within each chunk that (a)
|
||
reads as physically coherent and (b) produces tactically interesting geometry.
|
||
|
||
The D-228 axis for "shape / geometry" is explicitly `f(elevation-step × material)` —
|
||
sand slumps, rock faces go vertical. The morphology algorithm drives `elevation`;
|
||
material drives how that elevation is expressed as renderable geometry. These two
|
||
together produce cover, line-of-sight, and chokepoints.
|
||
|
||
---
|
||
|
||
## Part 1: The Six Morphology Families
|
||
|
||
I am enumerating eight families, not six — six is the minimum; eight is what the
|
||
world actually needs. The selector logic is why this makes sense: some of these
|
||
are statistically rare (fjord, lava field) but their game-feel is so distinct
|
||
that collapsing them into a broader family would produce detectable sameness.
|
||
|
||
### Selection Logic Overview
|
||
|
||
The selector is a decision tree over integer inputs. All inputs are available in
|
||
`RegionProfile` as Tyre has sketched it. I will specify what each input node
|
||
needs to be, and flag one addition.
|
||
|
||
**Inputs required (all integer or enum — D-010 compliant):**
|
||
|
||
| Input | Type | Source |
|
||
|-------|------|--------|
|
||
| `slope_class` | `Flat / Gentle / Steep / Cliff` | 3×3 elevation kernel, already in RegionProfile |
|
||
| `drainage_class` | `None / Ephemeral / Perennial / Major` | D8 flow accumulation |
|
||
| `sea_level_margin` | `i32` metres | elevation − sea_level |
|
||
| `lithology` | enum | body params + elevation strata |
|
||
| `glaciation` | `u8` grade 0–4 | body params (temperature + tectonic age) |
|
||
| `tectonic_class` | `Passive / Active / Volcanic` | body params (new — see below) |
|
||
| `sub_biome` | enum | D-210 |
|
||
|
||
**One addition to RegionProfile I need:** `tectonic_class: TectonicClass` (Passive /
|
||
Active / Volcanic). This is a body-level parameter (like `hydrosphere` and
|
||
`tectonic_activity`) that modulates which high-energy families are eligible. A
|
||
geologically dead body cannot produce lava fields or fault scarps. This keeps the
|
||
classification honest and prevents algorithm outputs that contradict the body's
|
||
established character.
|
||
|
||
---
|
||
|
||
### Family 1: Meander Reach
|
||
|
||
**Selection context:**
|
||
- `slope_class` = Flat or Gentle
|
||
- `drainage_class` = Perennial or Major
|
||
- `sea_level_margin` > +20 m (above tidal influence)
|
||
- `glaciation` <= 1 (not glaciated)
|
||
- `lithology` = Alluvial or Sedimentary
|
||
|
||
**What the algorithm produces:**
|
||
|
||
A sinuous channel with a defined thalweg (deepest flow line), pointbar deposits
|
||
on the inside of bends, and a cutbank face on the outside. The active floodplain
|
||
is 3–12 m below the surrounding terrace. Oxbow lakes appear where prior meanders
|
||
were cut off — these are ponds of still water on the floodplain, 4–20 m across.
|
||
|
||
The meander geometry is driven by a parametric sine-distortion of the D8 flow
|
||
direction at chunk scale, with the amplitude controlled by `meander_intensity`
|
||
(already in `RegionProfile`). The sinuosity parameter (ratio of channel length
|
||
to valley length) ranges 1.3–2.8 depending on `meander_intensity`.
|
||
|
||
**ElevationDelta range:** −8 to +4 m (channel is below floodplain; terrace is
|
||
above; total relief within a 64 m chunk is modest).
|
||
|
||
**Tactical character:** Long sight lines broken by river banks and terrace edges.
|
||
The pointbar is open ground with poor cover; the cutbank is a steep earthen wall
|
||
(1–3 m, provides hard cover). Oxbow lakes are impassable unless frozen or bridged.
|
||
River crossing is a chokepoint — the channel itself, 3–15 m wide, forces engagement
|
||
on the banks. Meander bends create natural flanking ambush positions where the bank
|
||
curves away from a pursuer's sightline.
|
||
|
||
---
|
||
|
||
### Family 2: Incised Gorge / Badland
|
||
|
||
**Selection context:**
|
||
- `slope_class` = Steep or Cliff
|
||
- `drainage_class` = Perennial or Major
|
||
- `sea_level_margin` > +50 m (high above sea level)
|
||
- `tectonic_class` = Active (or high uplift rate from body params)
|
||
- `lithology` = Sedimentary or Metamorphic
|
||
|
||
**What the algorithm produces:**
|
||
|
||
A V-shaped or slot canyon geometry. The channel is narrow (2–8 m wide at floor)
|
||
and deeply incised (15–80 m below the surrounding plateau). Canyon walls are
|
||
vertical or near-vertical rock faces. At the top, the plateau surface continues
|
||
at the base heightmap elevation. Talus slopes appear at the base of cliff faces
|
||
(coarser scree — Gravel lithology — where the cliff transitions to channel floor).
|
||
|
||
Within a 64 m chunk, a gorge manifests as: the plateau surface at base elevation
|
||
(flat or gently rolling), a cliff edge dropping sharply, the canyon floor, and
|
||
the far cliff rising again. Not every chunk contains the full cross-section —
|
||
chunks on the plateau see only the cliff edge; chunks on the floor see only walls.
|
||
|
||
**ElevationDelta range:** −80 to 0 m (plateau stays at base; gorge cuts downward).
|
||
|
||
**Tactical character:** Extreme vertical asymmetry — the dominant tactical variable.
|
||
A character on the plateau rim has total LOS advantage over the floor, can fire
|
||
down, cannot be flanked from below. But cliff faces are un-climbable without gear
|
||
(a mechanical constraint the tile data supports: Cliff shape on Rock material =
|
||
impassable). Gorge floors are extremely exposed if the rim is held. Gorge passages
|
||
are decisive chokepoints — a party controlling a narrow canyon floor controls the
|
||
route. The slot geometry creates situations where the player cannot retreat without
|
||
crossing the enemy's field of fire.
|
||
|
||
---
|
||
|
||
### Family 3: Braided Delta / Distributary Fan
|
||
|
||
**Selection context:**
|
||
- `slope_class` = Flat or Gentle
|
||
- `drainage_class` = Major
|
||
- `sea_level_margin` between −5 and +15 m (near sea level)
|
||
- `lithology` = Alluvial
|
||
- NOT `glaciation` >= 3
|
||
|
||
**What the algorithm produces:**
|
||
|
||
Multiple shallow, anastomosing channels (2–6 m wide, 0.3–1.5 m deep) dividing
|
||
and rejoining across a nearly-flat fan surface. Islands of slightly higher ground
|
||
(natural levees and splays) sit between channels. The whole surface is within 2–4 m
|
||
of sea level; many tiles are waterlogged or tidal-flat state at high water.
|
||
|
||
Channel positions are driven by a multi-seed Voronoi partition of the chunk area
|
||
with D8 flow direction as an attractor — each Voronoi center generates a channel
|
||
branch. The `meander_intensity` parameter controls how much the branches deviate
|
||
from a straight downslope path.
|
||
|
||
**ElevationDelta range:** −2 to +3 m (almost flat; channels are slight incisions;
|
||
levees are slight rises).
|
||
|
||
**Tactical character:** Mobility is the dominant constraint. The network of small
|
||
channels fragments the surface into irregular islands — movement requires knowing
|
||
which crossings are wadeable (Shallow Water at low tide) vs blocked (Deep Water
|
||
at high tide). The Q-105 tidal/seasonal water model makes the same terrain
|
||
tactically different at different times of day. Cover is minimal (low, flat
|
||
vegetation, no high ground) but concealment is high (dense reed beds, tall grass,
|
||
poor LOS in all directions). Ambushes are set in reed cover; pursuit is slow;
|
||
routing is non-obvious.
|
||
|
||
---
|
||
|
||
### Family 4: Dune Strand / Aeolian Plain
|
||
|
||
**Selection context:**
|
||
- `sea_level_margin` between −2 and +30 m
|
||
- `lithology` = Sand
|
||
- `sub_biome` = Arid or Coastal
|
||
- `drainage_class` = None or Ephemeral
|
||
- `slope_class` = Flat or Gentle
|
||
|
||
**What the algorithm produces:**
|
||
|
||
Transverse or barchan dune forms, oriented perpendicular to `dune_orientation`
|
||
(compass octant in RegionProfile — prevailing wind). Dune height 2–12 m;
|
||
inter-dune corridors are flat sand at base elevation. The slip face (steep lee
|
||
side, ~32° angle of repose) is the sharp edge; the windward stoss side is gentle.
|
||
|
||
Within a 64 m chunk: typically 1–3 dune crests visible, with inter-dune troughs.
|
||
The pattern repeats with seed-driven wavelength variation (0.7–1.4× nominal spacing)
|
||
to prevent visible periodicity.
|
||
|
||
**ElevationDelta range:** −3 to +12 m (troughs below base; crests above).
|
||
|
||
**Tactical character:** Dune crests are the key terrain feature — short-range cover
|
||
on the stoss side (the gentle approach), sudden exposure on the slip face (the sharp
|
||
drop). Crest control is inherently ephemeral in the sense that the geometry forces
|
||
skyline exposure — you are visible from anywhere on the stoss side the moment you
|
||
crest. The inter-dune corridors are covered routes but lead into bowls with no
|
||
exit cover. Movement slows on loose sand (a material-driven movement penalty).
|
||
LOS is extremely range-dependent: from a dune top you see far; in a trough you see
|
||
perhaps 20 m.
|
||
|
||
---
|
||
|
||
### Family 5: Cliff Coast / Sea Stack
|
||
|
||
**Selection context:**
|
||
- `sea_level_margin` between −20 and +10 m
|
||
- `slope_class` = Steep or Cliff
|
||
- `lithology` = Rock or Metamorphic (NOT Sand — that is Dune Strand)
|
||
- `glaciation` <= 1
|
||
|
||
**What the algorithm produces:**
|
||
|
||
A wave-cut platform at or just below sea level, then a cliff face rising 10–80 m
|
||
to a clifftop plateau. The cliff face is sheer rock (Cliff shape, Rock material,
|
||
impassable). Sea stacks are isolated rock pillars standing in shallow water
|
||
offshore — generated as local elevation spikes in the sub-sea zone where a noise
|
||
field exceeds a lithology-dependent threshold (hard rock produces stacks; soft rock
|
||
produces a smooth platform).
|
||
|
||
The clifftop is the base heightmap elevation; the platform and stack geometry are
|
||
ElevationDelta downward from there (platform −10 to −30 m relative to clifftop,
|
||
meaning near sea level; stacks are +0 to +20 m above sea level but below the main
|
||
cliff top).
|
||
|
||
**ElevationDelta range:** −30 to 0 m (cliff is a step-down to the coast; no upward
|
||
delta from clifftop).
|
||
|
||
**Tactical character:** Unambiguous dominance of the high ground. Cliff-edge
|
||
positions are impregnable from below (cliff face is impassable) and exposed from
|
||
above. Clifftop defenders have infinite LOS over the ocean approach. Attackers from
|
||
the sea face a wall. The wave-cut platform, when exposed at low tide, is a
|
||
short-duration tactical route — accessible only during specific water states (the
|
||
Q-105 tidal model), creating timed-window scenarios. Sea stacks provide intermediate
|
||
cover in an otherwise featureless marine approach — the only interrupt of a long
|
||
open crossing.
|
||
|
||
---
|
||
|
||
### Family 6: Fjord Wall / Glaciated Inlet
|
||
|
||
**Selection context:**
|
||
- `sea_level_margin` between −50 and +200 m
|
||
- `slope_class` = Cliff (required)
|
||
- `glaciation` >= 2
|
||
- `lithology` = Rock or Metamorphic
|
||
|
||
**What the algorithm produces:**
|
||
|
||
Near-vertical rock walls rising from deep water. The U-shaped cross-section
|
||
(glacial, not V-shaped fluvial) means the wall base is at or below sea level and
|
||
the wall face continues upward to the fjord rim hundreds of meters above. Hanging
|
||
valleys produce waterfalls (a narrow shelf partway up the wall where a tributary
|
||
glacier once entered). The water within the fjord is deep (ElevationDelta far
|
||
below sea level on the water side).
|
||
|
||
At the 64 m chunk scale: most fjord wall chunks are almost entirely cliff face.
|
||
The only variation is whether the chunk is at the waterline (bottom of cliff meets
|
||
water), mid-wall (continuous cliff face), or near the rim (cliff top with overhanging
|
||
vegetation at the edge). Hanging valley shelves appear occasionally as a narrow
|
||
flat ledge at a consistent elevation band across the wall.
|
||
|
||
**ElevationDelta range:** −200 to +50 m (deep water below; wall can rise significantly
|
||
above base heightmap where the hanging valley creates a ledge).
|
||
|
||
**Tactical character:** Maximum verticality. The fjord is effectively a sealed
|
||
corridor — the wall faces are impassable; movement is restricted to the narrow
|
||
strip at the water's edge (when it exists) or to the fjord rim. The hanging valley
|
||
shelves are the critical feature: a narrow ledge 40–80 m above the waterline that
|
||
provides fire positions looking down the full length of the fjord. Controlling a
|
||
hanging valley shelf means controlling the entire fjord below. Approach by water is
|
||
extremely exposed — no cover, walls on both sides, no retreat options.
|
||
|
||
---
|
||
|
||
### Family 7: Alluvial Plain / Floodplain Terrace
|
||
|
||
**Selection context:**
|
||
- `slope_class` = Flat
|
||
- `drainage_class` = None or Ephemeral (no active major channel in this region)
|
||
- `sea_level_margin` > +5 m
|
||
- `lithology` = Alluvial or Sedimentary
|
||
- `glaciation` <= 1
|
||
|
||
**What the algorithm produces:**
|
||
|
||
The default "open country" family. Low-relief terrain with gentle undulation from
|
||
a filtered noise field. Occasional low terrace edges (1–3 m) mark former floodplain
|
||
levels. Isolated stone outcrops (lithology-dependent) provide local relief. The
|
||
dominant feature is the long sight line — this is the family where LOS extends to
|
||
the full render distance.
|
||
|
||
**ElevationDelta range:** −3 to +5 m (mild undulation, terrace edges).
|
||
|
||
**Tactical character:** This is the exposed terrain family, and it is here by design.
|
||
The game needs open ground — not every biome should be a maze of cover. Alluvial
|
||
plains force movement decisions about crossing open ground, using dead ground
|
||
(slight hollows where elevation puts you below the local crestline), and timing
|
||
movement to reach scattered cover (the occasional outcrop or terrace edge). The
|
||
terrace edges are the key tactical micro-feature: a 2 m earthen drop that provides
|
||
hard cover from one direction but exposes you from the other.
|
||
|
||
---
|
||
|
||
### Family 8: Lava Field / Volcanic Surface
|
||
|
||
**Selection context:**
|
||
- `tectonic_class` = Volcanic
|
||
- `lithology` = Lava (basalt)
|
||
- `sub_biome` = Volcanic or Barren
|
||
|
||
**What the algorithm produces:**
|
||
|
||
Two sub-types depending on lava flow age (body parameter):
|
||
- **Pahoehoe (fresh/smooth):** Gently rolling surface with occasional lava tubes
|
||
(collapsed tunnels — impassable gaps, 2–8 m across, 5–20 m deep). Glassy,
|
||
uneven surface with no vegetation.
|
||
- **A'a (older/rough):** Sharply irregular surface with scoria ridges 1–4 m high.
|
||
Near-impassable except along flow channels where the surface smoothed.
|
||
|
||
**ElevationDelta range:** −20 to +8 m (lava tubes cut down; scoria ridges add height).
|
||
|
||
**Tactical character:** Irregular terrain with extreme movement costs on A'a surface
|
||
(material: Lava, movement penalty severe). Lava tubes are natural ambush corridors —
|
||
narrow, enclosed, high-concealment, but with no exit options once committed. The
|
||
pahoehoe surface, while traversable, produces a distinctive movement sound profile
|
||
(glassy clicks vs soft dirt) that may affect stealth mechanics.
|
||
|
||
---
|
||
|
||
## Part 2: The Selection Decision Tree
|
||
|
||
This is the classifier that produces `MorphologyFamily` from `RegionProfile`. It
|
||
is a deterministic decision tree, not a probability distribution — each input
|
||
combination maps to exactly one primary family (with a secondary family for
|
||
boundary blending, as Tyre's API already anticipates).
|
||
|
||
```
|
||
if tectonic_class == Volcanic AND lithology == Lava:
|
||
→ LavaField
|
||
|
||
else if sea_level_margin IN [-200, +10] AND slope_class IN [Steep, Cliff]:
|
||
if glaciation >= 2:
|
||
→ FjordWall
|
||
else:
|
||
→ CliffCoast
|
||
|
||
else if sea_level_margin IN [-5, +15] AND drainage_class == Major AND lithology == Alluvial:
|
||
→ BraidedDelta
|
||
|
||
else if lithology == Sand AND drainage_class IN [None, Ephemeral]:
|
||
→ DuneStrand
|
||
|
||
else if drainage_class IN [Perennial, Major] AND slope_class IN [Steep, Cliff]
|
||
AND sea_level_margin > +50:
|
||
→ IncisedGorge
|
||
|
||
else if drainage_class IN [Perennial, Major] AND slope_class IN [Flat, Gentle]
|
||
AND sea_level_margin > +20:
|
||
→ MeanderReach
|
||
|
||
else:
|
||
→ AlluvialPlain ← the default / open-country family
|
||
```
|
||
|
||
**Why AlluvialPlain is the fallback:** It is the correct geological answer for
|
||
"didn't meet any special conditions." It is also the most tactically important
|
||
family to have abundant — players need open ground. If everything is a special
|
||
terrain family, every encounter becomes a cave-fight.
|
||
|
||
**Secondary family for blending:** When a chunk sits on a region boundary, the
|
||
secondary family is the result of running this tree on the adjacent `RegionProfile`.
|
||
The families that blend gracefully (MeanderReach + AlluvialPlain) are common and
|
||
well-behaved. The families that do NOT blend gracefully (FjordWall + DuneStrand)
|
||
should never be adjacent — and if the world generates that adjacency, it indicates
|
||
a body parameter inconsistency that the body-params validator should flag.
|
||
|
||
---
|
||
|
||
## Part 3: Family Transition Boundaries — Where the Families Actually Meet
|
||
|
||
These are the terrain edges that players will encounter most often. They are
|
||
not smooth transitions — they are geomorphological discontinuities, and that is
|
||
correct. The domain warp (Tyre's mechanism) prevents the discontinuity from
|
||
aligning with a chunk grid line, but the discontinuity itself should be sharp.
|
||
|
||
**Meander Reach → Alluvial Plain:**
|
||
The river floodplain (Meander) transitions to the surrounding upland (Alluvial)
|
||
at the terrace edge. This is the most common transition in lowland terrain.
|
||
Tactically: crossing from open plain to the floodplain means descending the terrace
|
||
edge — a 1–3 m earthen step that provides cover in one direction.
|
||
|
||
**Incised Gorge → Alluvial Plain:**
|
||
The plateau continues as AlluvialPlain; the gorge cuts into it. From the surface,
|
||
this appears as a sudden cliff edge. The transition is the most dramatic visible
|
||
boundary in the game — you walk across open ground and the terrain simply drops
|
||
away. Tactically: the cliff edge is a LOS boundary — you cannot see into the gorge
|
||
until you are at the rim.
|
||
|
||
**Braided Delta → Meander Reach:**
|
||
Moving upstream, the multi-channel delta collapses into a single meandering channel.
|
||
The transition is gradual — channels reduce in number, ground height increases
|
||
slightly. Tactically: the covered, fragmented delta gives way to the more open
|
||
meander terrain.
|
||
|
||
**Cliff Coast → Alluvial Plain:**
|
||
Clifftop terrain is AlluvialPlain at the heightmap elevation; below is CliffCoast.
|
||
The transition is the cliff edge — same character as Gorge → Plain but coastal.
|
||
|
||
**Fjord Wall → AlluvialPlain (at the fjord head):**
|
||
At the landward end of a fjord, the walls close off and the valley floor becomes
|
||
accessible. This narrow valley floor is AlluvialPlain — a classic settlement site.
|
||
Tactically: the fjord head is the one location where the wall-dominated fjord opens
|
||
into traversable terrain. It is always a strategic point.
|
||
|
||
---
|
||
|
||
## Part 4: Game-Feel Constraints the Contract Must Satisfy
|
||
|
||
This is the section I am most insistent on. The morphology algorithm family must
|
||
satisfy these constraints, or it fails as a design — regardless of geological
|
||
fidelity. These are not aesthetic preferences; they are mechanical requirements
|
||
that flow from D-008 (action design) and the five pillars.
|
||
|
||
### Constraint 1: Every chunk must contain at least one tactical decision point
|
||
|
||
A "tactical decision point" is any terrain feature that creates a meaningful
|
||
choice about movement, positioning, or engagement: a crest, a bank, a chokepoint,
|
||
a crossing, a blind corner, a piece of cover.
|
||
|
||
Alluvial plain is the hardest family to satisfy this constraint — flat terrain
|
||
with no features is not interesting. The solution: the terrace edges (1–3 m
|
||
earthen drops, never absent from AlluvialPlain chunks) and the isolated outcrops
|
||
(seed-driven, present in ~60% of chunks) always provide at least one feature.
|
||
The constraint is violated if an algorithm produces a perfectly flat, featureless
|
||
64×64 m surface. This must be checked during family implementation.
|
||
|
||
### Constraint 2: Cover and concealment must be distinct
|
||
|
||
D-228's composite tile schema gives us the tools: `TerrainMaterial` (hard cover
|
||
— does a rock stop a projectile), `Vegetation` (soft cover / concealment — does
|
||
a reed bed block LOS), and `elevation` / shape (geometric cover — am I below
|
||
the crestline). These are orthogonal axes, and a well-designed morphology family
|
||
exploits the distinction.
|
||
|
||
- Meander pointbar: low elevation (no geometric cover) + dense Vegetation
|
||
(concealment) + Alluvial soil (no hard cover) → concealment without protection
|
||
- Gorge cliff face: Cliff shape (un-crossable) + Rock material (hard cover) + no
|
||
Vegetation → hard cover with no concealment
|
||
- Dune crest: geometric cover only (elevation blocks LOS from below) + no hard cover
|
||
(sand stops nothing) + no concealment (bare sand, no vegetation)
|
||
- Reed delta: Vegetation concealment + no geometric cover + no hard cover → the
|
||
ambush terrain
|
||
|
||
The morphology algorithm must place these in combination, not uniformly. A family
|
||
that produces uniform concealment throughout is not interesting. The good terrain
|
||
is the one where the player has to read the ground to understand which tiles give
|
||
which kind of protection.
|
||
|
||
### Constraint 3: Verticality must create asymmetric engagement conditions
|
||
|
||
D-008 explicitly calls for Z-levels and vertical asymmetry. The terrain derivation
|
||
is the source of that asymmetry at the world level (buildings create it at the
|
||
settlement level). The constraints:
|
||
|
||
- **The high ground must be visibly identifiable** from the approach. Players should
|
||
be able to see that the gorge rim dominates the floor, that the dune crest exposes
|
||
them, that the fjord shelf controls the inlet. The rendered geometry must make this
|
||
legible — and that geometry comes from the ElevationDelta values the morphology
|
||
algorithm produces.
|
||
|
||
- **The high ground must not be universally dominant.** If every elevated position
|
||
is trivially superior, the game collapses to "whoever controls the high ground
|
||
wins." The counter: (a) the high ground is often exposed from range (silhouette),
|
||
(b) close terrain (gorge wall, dense reed bed) negates ranged advantages, (c) the
|
||
cliff face is impassable from below but also from above (you cannot exploit the
|
||
position you cannot reach). The morpology algorithm must produce terrain where
|
||
the high ground advantage is real but contestable.
|
||
|
||
- **Chokepoints must be narrow enough to matter.** A river ford that is 50 m wide
|
||
is not a chokepoint. The meander algorithm must produce crossings narrow enough
|
||
(3–15 m) that controlling one bank can meaningfully contest passage. The gorge
|
||
floor must be narrow enough (2–8 m at the cliff base) that it cannot be flanked.
|
||
|
||
### Constraint 4: The derivation must be legible at the Atlas layer
|
||
|
||
The Atlas (Phase 3–4 deliverable) must show morphology zone boundaries as visible
|
||
map features — players planning movement at the region scale need to read the terrain.
|
||
This means:
|
||
|
||
- `RegionProfile.morphology_zone` must map cleanly to a distinct Atlas color / icon
|
||
— Tyre's API already provides this; I am confirming the family vocabulary supports
|
||
this legibility.
|
||
- The transition between families must be visible at Atlas resolution (the 1 km
|
||
region scale) even though the texture of that transition is driven by chunk-scale
|
||
geometry. A "MeanderReach region" on the Atlas should look like a floodplain, not
|
||
just a flat-colored zone.
|
||
|
||
### Constraint 5: Seasonal and dynamic state must change tactical character, not just appearance
|
||
|
||
Q-105 ties the tidal and seasonal water model to derived tile states. The morphology
|
||
families that depend on this model are BraidedDelta and MeanderReach — both produce
|
||
floodplain terrain where the Q-105 water-height determines which tiles are passable.
|
||
|
||
The contract: the morphology algorithm must produce ElevationDelta values that, when
|
||
combined with the regional water-height model, create a genuine tactical difference
|
||
between high-water and low-water states. "The delta floods at high tide" must mean
|
||
"you cannot cross the delta at high tide, period" — not "the color of the water
|
||
tiles changes." This requires the delta channel elevations to be genuinely below
|
||
the Q-105 high-water threshold, and the island levees to be genuinely above it.
|
||
|
||
This is an explicit coupling between the morphology algorithm's ElevationDelta
|
||
output and the Q-105 model's water-height range. The contract must pin this:
|
||
BraidedDelta and MeanderReach algorithms must produce elevations relative to
|
||
sea_level such that:
|
||
- `channel_floor_elevation ≈ sea_level − 0.5 to sea_level + 0.5 m`
|
||
- `levee_elevation ≈ sea_level + 1 to sea_level + 3 m`
|
||
- `high_water_height ≈ sea_level + 1 to sea_level + 1.5 m` (Q-105 tidal term)
|
||
|
||
This puts channels under water at high tide and levees dry at low tide — a real
|
||
tactical difference.
|
||
|
||
---
|
||
|
||
## Part 5: What I Need From Other Participants
|
||
|
||
**From Tyre:**
|
||
- Confirmation that `tectonic_class` can be added to `RegionProfile` without
|
||
touching the D8 / Layer-1 pipeline. My expectation: it derives from body params
|
||
(already available at the region classification stage), so it is a free addition.
|
||
- The morphology algorithm's contract for its per-chunk warp offset interaction.
|
||
Specifically: does the warp apply before or after the algorithm sees the
|
||
ElevationDelta? My position: warp applies to the spatial query position, not to
|
||
the ElevationDelta output. The algorithm produces a delta for the warped position;
|
||
material derivation then runs on that delta. This keeps the algorithm implementations
|
||
simple.
|
||
- Clarification on the secondary family blending: when `blend_weight < 255`,
|
||
does the caller blend two ElevationDelta values (one per family), or does each
|
||
family produce its own full `TileAxes` and the caller blends those? I prefer
|
||
blending ElevationDelta only — material/vegetation derivation from a blended
|
||
elevation is cleaner than blending two independent material sets.
|
||
|
||
**From Miri:**
|
||
- Which families need sub-region variation that cannot be expressed by the algorithm
|
||
alone? My expectation: MeanderReach needs oxbow lake positions (a secondary zone
|
||
within a meander region chunk). I propose this is handled by the algorithm
|
||
internally — oxbow lake detection runs a simple cutoff test on meander radius
|
||
vs wavelength, producing a local sub-feature without requiring a second region
|
||
classification. Miri should confirm this matches how real oxbow lakes form
|
||
(spoiler: it does — they form when meander radius exceeds a threshold relative
|
||
to channel width, exactly the kind of threshold test the algorithm can implement).
|
||
- Confirmation that the 8 families cover the morphology diversity the worldbuilder
|
||
expects. I anticipate Miri will want to add a Mountain Pass family (which I have
|
||
omitted as a deliberate choice — see note below).
|
||
|
||
**Note on Mountain Pass:** D-234 references "mountain-pass → ribbon only (streets
|
||
linear along the terrain axis)" as a morphology zone affecting settlement. I have
|
||
not included MountainPass as a distinct morphology FAMILY because a mountain pass
|
||
is not a terrain-generating algorithm — it is an Incised Gorge at high elevation
|
||
with specific access semantics. The RegionProfile's `morphology_zone` can carry
|
||
MountainPass as a zone classification (distinct from IncisedGorge in semantics and
|
||
Atlas display) while using the IncisedGorge algorithm for geometry. This keeps the
|
||
algorithm count lean without losing the semantic distinction D-234 requires.
|
||
|
||
**From Troblum:**
|
||
- Performance validation on the algorithm implementations. The families I am most
|
||
concerned about are BraidedDelta (multi-seed Voronoi is potentially expensive)
|
||
and FjordWall (the hanging valley shelf detection may require neighbor lookups).
|
||
Both should be implementable in ~1–2 ms/chunk; Troblum should stress-test.
|
||
|
||
---
|
||
|
||
## Summary Table
|
||
|
||
| Family | Primary Selector | ElevationDelta | Key Tactical Feature |
|
||
|--------|-----------------|----------------|---------------------|
|
||
| MeanderReach | Flat + Perennial/Major + above tide | −8 to +4 m | River crossing chokepoints; bank cover |
|
||
| IncisedGorge | Steep/Cliff + Perennial + high elevation + Active | −80 to 0 m | Extreme vertical asymmetry; floor exposed |
|
||
| BraidedDelta | Flat + Major + near sea level + Alluvial | −2 to +3 m | Tidal-cycle movement changes; concealment |
|
||
| DuneStrand | Sand + arid/coastal + no drainage | −3 to +12 m | Crest exposure; dead-ground corridors |
|
||
| CliffCoast | Near sea level + Steep/Cliff + non-glaciated + Rock | −30 to 0 m | Timed access via wave-cut platform |
|
||
| FjordWall | Cliff + glaciated >= 2 + Rock | −200 to +50 m | Hanging valley fire positions; sealed corridor |
|
||
| AlluvialPlain | Fallback (no special conditions) | −3 to +5 m | Open ground; terrace edges; long LOS |
|
||
| LavaField | Volcanic + Lava lithology | −20 to +8 m | Movement cost; tube ambush corridors |
|
||
|
||
The algorithm-family vocabulary doubles as the `MorphologyZone` vocabulary for D-228
|
||
region-level semantics, with MountainPass added as a zone classification (not a
|
||
distinct algorithm) for D-234 compatibility.
|