feat(strate): passages aim at open space -- for half the archetypes, measurably
Tier 1. GeneratePassages placed every passage at a random angle, distance and reach, never consulting the destination strate. The carved tube is air by construction, so nothing looked wrong -- but whether the lower mouth joined the destination's connected cave space was luck. A player could descend and arrive in a sealed pocket. The primordial law was a hope. VF_SuggestOpenPointZ is a pure free function of (archetype, params, seed, XY): no operator stack, no StrateManager, no cache. That is deliberate. This runs inside Initialize, where the layout is half-built and LayoutVersion is in flight, so anything holding a manager pointer there is a re-entrancy trap. Coverage is four archetypes of eight, and the number is the deliverable: 7 passages, 3 aimed at generator-confirmed open space with 48/48 ring samples air, 4 falling back. The hole is not closed. It is measured, where this morning it was invisible. Two corrections from Codex, both mine and both would have shipped confident nonsense: room placement is seeded by MakeStrateSeed, not the passage salt, so my version would have queried a cave graph that does not exist; and slabs need the world seed because that is what GetSlabDensity uses. And one of mine caught in review: the first test sampled GetDensityAt at the mouth and asserted air, which is true by construction because the passage carve is a structural-post invariant. It could not fail. Replaced with a 16-point ring outside the carve radius requiring 8/16 air -- a proxy for connectivity, not a proof. The proof is a flood fill, which is Tier 2. Logging: my first spec asked for a per-passage warning on fallback. It fired 572 times and turned 14 clean tests yellow, which is precisely the anti-pattern OPSTACK-HANDOFF.md warns about -- a warning that always means "this is fine" teaches people to ignore warnings. Now one sorted Log line per layout build. Built clean, suite green: 17 succeeded, 0 with warnings, 0 failed. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DPUuCtn5zTLui6WybLbkNb
This commit is contained in:
1 parent
10a8bbc677
commit
1ab8c0cae4
7 files changed
+806
-4
No files matched your search
@@ -290,6 +290,16 @@ is a simple straight tube. Placement, reach, and shape draws for inter-strate pa
|
||||
connection count cannot shift any later passage. Global passage settings were removed from
|
||||
`VoxelSettings`.
|
||||
|
||||
After a passage's XY is selected, `GeneratePassages` asks the **destination** strate for a lower-mouth
|
||||
height through the pure free function `VF_SuggestOpenPointZ` (`VoxelCaveMorphology`). TunnelNetwork and
|
||||
Underwater use the nearest hash-placed room centre, with `MakeStrateSeed(world-seed, strate-index)`
|
||||
matching the room graph's existing identity; FlatPlain and CrystalChamber recompute their slab void
|
||||
band and reject column-overlap points. Maze, SurfaceWorld, VerticalShafts, and FloatingIslands remain
|
||||
explicitly unanswerable for this tier: they keep the historical random reach and emit a warning. This
|
||||
query is source-level only — it does not construct an operator stack, touch a cache, or call back into
|
||||
`UVoxelStrateManager` while `Initialize` is building the layout. The resulting lower endpoint is
|
||||
clamped to the destination's seal-free interior.
|
||||
|
||||
### 8.9 Carving — brush shapes + editor controls
|
||||
`FVoxelModification` has `EVoxelBrushShape {Sphere,Box,Capsule}` + `BoxExtent`/`CapsuleEnd`/
|
||||
`Falloff` + `GetWorldBounds`. `UVoxelDiffLayer::GetDensityOffset` switches per shape; chunk
|
||||
|
||||
Reference in new issue
Block a user