feat(runtime): the composed world can BE the game world
Jahni: "can you not implement those settings? as in, have them be live in
game?" This is that. The composer stops being a lab tool.
THE ARCHITECTURAL LINE, which is the whole design (COMPOSER-NOTES §3.1):
COMPOSITION stays editor-only, EVALUATION becomes runtime. Rolling,
measuring, preview, selection, promotion, the corpus -- none of it reaches
a player's machine. What crosses into the runtime is exactly two things:
reading a season manifest, and materialising a recipe into an op stack.
UVoxelSeasonAsset a cookable UPrimaryDataAsset holding the manifest,
so a season ships in a packaged game. The JSON
stays the reviewable, git-diffable artefact.
UVoxelSettings::Season optional. Unset => behaviour is exactly as today.
GetEffective*() season seed / spine radius / world radius / season
number override the authored values when assigned.
The test deliberately sets DIFFERENT authored
values, so "the season is authoritative" is proved
rather than coincidental.
⭐ MULTIPLAYER DETERMINISM, PROVED: two independent runtime managers built
the same season and compared 393,216 density samples BIT-IDENTICALLY. This
is the property the whole multiplayer model rests on -- replicate seed +
layout + diff, never geometry.
⭐ AND A STALE SEASON IS DETECTABLE, NOT SILENT. Initialize() now returns
bool and an assigned-but-invalid season NEVER falls back to the authored
pool. Falling back would hand a client a world that looks fine and is not
the season -- silent divergence, the worst failure mode in a shared world.
GetCurrentSeasonContentHash() is exposed BlueprintPure to compare at join.
HasComposerRecipeOverride() is gone. It force-classified every custom recipe
as Mixed, which was correct while box verdicts were only proved for
hand-written stacks -- but 8e346a3 made EffectOverBox correct in ISOLATION,
proved on a stack no builder produces. Keeping the force would have cost
tile skipping on every composed world forever.
VF_RollStrateRegionCount moved behind WITH_EDITOR while the partition-seed
helpers stayed runtime: rolling out, evaluation in. Lateral regions remain
gated off.
⚠️ Sol hit its usage limit mid-task, so the edits arrived unvalidated. I
built and ran them myself rather than assume -- and they did not compile:
VoxelForgeComposerSeasonTest.cpp was missing UObject/Package.h, which every
other test picks up transitively through the shared fixture it does not use.
One include; every NewObject/GetTransientPackage in the file was failing.
Editor build clean. SHIPPING BUILD SUCCEEDS -- the invariant that proves no
composer roller is linked into a packaged game. 30 succeeded / 0 failed.
⚠️ UNVERIFIED: whether it looks right on screen. Nothing headless can tell
us that; it needs Jahni to assign a season asset and press play.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VJiTcTSDNkKBtnNdiBtdaU
This commit is contained in:
1 parent
088b40216d
commit
faa62d419e
21 files changed
+1268
-287
No files matched your search
+16
-4
@@ -83,7 +83,8 @@ thousand candidate strates, measure them all, keep the best, validate at any res
|
||||
a model over the candidates at zero runtime cost. **And Jahni reviews and vetoes the season before it
|
||||
publishes** — the system does the work, he keeps the veto.
|
||||
|
||||
**What ships is small:** the season's seed plus the chosen strates' parameter vectors. Clients generate
|
||||
**What ships is small:** the season's seed plus the chosen strates' parameter vectors and structure
|
||||
recipes. Clients generate
|
||||
terrain from those, deterministically, exactly as today. **No composition is shipped or run in the
|
||||
normal game path.** The editor-only PIE inspection button described below is a deliberate debugging
|
||||
exception: it overlays one already-built slot so the owner can walk a measured candidate; it is not
|
||||
@@ -98,20 +99,31 @@ recipe, complete native parameter-family vector, archetype, bounds, measured met
|
||||
Floating-point fields carry both a readable value and their exact IEEE-754 bit pattern, so a loader can
|
||||
rebuild the same stack and the season test can assert bit-identical density rather than assume it.
|
||||
|
||||
Publishing is explicit: keep the JSON as the reviewed/diffable source, create a
|
||||
`UVoxelSeasonAsset`, point `SourceManifestJson` at it, press `ImportSeasonManifestJson`, and assign the
|
||||
asset to `UVoxelSettings::Season`. The primary data asset is what cooks. Schema 2 embeds a canonical
|
||||
SHA-1 `content_hash`; runtime recomputes it and also compares the asset's separately imported metadata,
|
||||
so a stale or edited season fails closed instead of silently falling back to the authored pool.
|
||||
|
||||
The selected-only review page is a descent-ordered `VoxelStratePreview` contact sheet. Each card shows
|
||||
the depth, recipe, metrics, grounded/outlier/fixed selection reason, and boss-slot marker. Selection is
|
||||
deliberately provisional: the current readable policy reserves 75% grounded and 25% outlier slots,
|
||||
penalises near-identical neighbours, rewards new archetypes/recipes, and respects fixed absolute slots.
|
||||
Jahni's preview and veto remain the decision that turns this artifact into a published season. The
|
||||
composer and review writer are editor/build-box code only; no normal runtime generation path calls
|
||||
them, and `WorldRadiusVoxels` remains 0.
|
||||
composer, corpus, measurement, selection, promotion, and review writer are editor/build-box code only.
|
||||
Runtime contains only manifest parsing/verification and recipe evaluation, and `WorldRadiusVoxels`
|
||||
remains 0. Generated schema-2 slots have no passage/content/visual record: they therefore use
|
||||
deterministic empty/default wider content and zero auto-passages (the origin spine remains). Fixed slots
|
||||
may retain an authored definition path as that wider-content bag. Lateral regions remain unshippable at
|
||||
the measured 9/16 cross-seam law result.
|
||||
|
||||
An abbreviated manifest shape is:
|
||||
|
||||
```json
|
||||
{
|
||||
"format": "VoxelForgeSeasonManifest",
|
||||
"schema_version": 1,
|
||||
"schema_version": 2,
|
||||
"content_hash": "0123456789abcdef0123456789abcdef01234567",
|
||||
"season": 0,
|
||||
"seed": 9320,
|
||||
"candidate_count": 24,
|
||||
|
||||
Reference in new issue
Block a user