Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| f53553581b | |||
| 89dd155f85 |
@@ -56,6 +56,11 @@ DOES propagate into parented children's `LocalToWorld` (verified live on 6.5.0).
|
||||
|
||||
## Headless expedition-run driving (flaky — know the failure modes)
|
||||
|
||||
> The specific nouns below (`PlayerReady`, expedition launch, respawn-reset) are **co-op-Hades-era** and become
|
||||
> salvage under the LANTERN pivot ([[DR-048_Lantern_Adoption_Full_Pivot]]) — they will be re-meaned to the
|
||||
> **descent lifecycle** (muster → Bell → pockets) when that lands. The *harness patterns* (server-inject, the
|
||||
> `EditorApplication.update` guardian, capture-in-the-same-call) are direction-agnostic and stay valid.
|
||||
|
||||
- Launch by setting server `PlayerReady=1` from clean Staging. **Post-abort re-launch is intermittent** — a clean
|
||||
Play restart launches reliably on the first ready; re-readying after an abort may not.
|
||||
- **An AFK player dies to the swarm in ~15 s** and `Health` resets to the class value on respawn — a
|
||||
|
||||
@@ -9,7 +9,7 @@ Multiplayer game on **Unity DOTS (Entities) + Netcode for Entities** — server-
|
||||
- **Size check** — bash: `wc -c CLAUDE.md` · PowerShell: `(Get-Item CLAUDE.md).Length`. Must be `< 40960`.
|
||||
- **Archive, don't delete.** When trimming, append the verbose / least-hot detail to the obsidian reference note `Docs/Vault/_Meta/CLAUDE_Build_Gotchas_Archive.md` under a **new dated heading** (never overwrite an older snapshot), and leave a one-line pointer + the relevant `[[DR-###]]` link here.
|
||||
- **Net-zero rule:** every addition is paid for by a condensation elsewhere. Keep only the hottest, highest-recurrence operational rules inline (flag them **★**); depth lives in the archive + DRs.
|
||||
- Condensation history (detail → archive dated headings): 06-17 · 07-04 · 07-04b · 07-04c · 07-06 · 07-07b (pays the attribute-swallow gotcha) · 07-07c (game-state narrative → invariants+DR pointers; ~3 KB freed, operator-ordered).
|
||||
- Condensation history (detail → archive dated headings): 06-17 · 07-04 · 07-04b · 07-04c · 07-06 · 07-07b (pays the attribute-swallow gotcha) · 07-07c (game-state narrative → invariants+DR pointers; ~3 KB freed, operator-ordered) · 07-13 (co-op-Hades core-loop bullet → LANTERN direction pointer; [[DR-048_Lantern_Adoption_Full_Pivot]]).
|
||||
|
||||
## Stack — Unity 6.5.1 (`6000.5.1f1`, stable) as of 2026-06-27
|
||||
|
||||
@@ -138,7 +138,7 @@ Full rationale: [[DR-022_Animation_Pipeline_Rukhanka_Synty]] · [[DR-023_Enemy_A
|
||||
|
||||
- `ProjectM.Simulation.GameBootstrap : ClientServerBootstrap` overrides `Initialize` with `AutoConnectPort = 0` (M4 — listen/connect is explicit via the `ConnectionConfig` singleton + per-world ConnectionControlSystems). **Editor default = instant-into-game + MPPM** (creates `ServerWorld` (`WorldFlags.GameServer`) + `ClientWorld` (`WorldFlags.GameClient`)); the `ProjectM/Boot Into Menu (Editor)` EditorPref flips the MAIN editor to the frontend path. **Player builds boot the UITK frontend menu** (`return false` → one menu world, no netcode worlds until a menu choice). See [[DR-019_Frontend_Menu_Settings_Saves_Build]].
|
||||
- **Scenes:** `Assets/Scenes/MainMenu.unity` (build index 0) boots the UITK frontend (menu world only); `Assets/Scenes/Game.unity` (index 1) holds gameplay with `Assets/_Project/Subscenes/Gameplay.unity` wired in as the baked subscene (GameObject `GameplaySubScene`). `SampleScene`/`DevSandbox` are kept as reference/dev scenes. The on-demand lifecycle (`WorldLauncher`/`SessionRunner`/`MainMenuController`) creates the right worlds per menu choice (Single/Host/Join), THEN `LoadScene(Game)` (subscene-streaming rule above).
|
||||
- **Core loop = ready-check multi-room RUNS ★ (DR-044/045/046):** base = pure SPEND hub. `RunDirectorSystem` = sole `RunInfo` writer (`[UpdateBefore(CyclePhaseSystem)]`; nothing else in the room chain touches CyclePhase); banks Charge+retaliation once-per-`RunEpoch` on boss-clear ONLY; strips the boon band + `BoonOffer`s on exit; teleports ONLY launch-stamped `RunParticipant`s (released on Returning). Rooms spawn per `RoomEpoch`, `RoomTag`-torn-down, gate on a PORTAL (`RunLifecycle.RoomExplore=6` loot window; `PortalInteractRequest`→server `PortalCommand`). Class + per-run PREP spent at base (Staging-gated RPCs via shared `ClassSwapUtil`; prep `StatModifier` band stripped on Returning). `Health.Max` is a `[GhostField]`. Boss = server-only `BossState`/`BossAISystem` (sole boss mover). ★ **a serialized prefab bool ignores the C# initializer — flip the value in the prefab.** Feel/tuning detail → [[DR-044_Expedition_Redesign_Shipped_Demo_Polish]] · [[DR-045_Combat_Demo_Feel_Boss_Fight]] · [[DR-046_Base_Expedition_Ties_Portal_Class_Prep]].
|
||||
- **Direction = LANTERN ★ — pivot LOCKED 2026-07-13 ([[DR-048_Lantern_Adoption_Full_Pivot]]).** Co-op action-RPG, *light is territory* (seed-pinned pocket-graph; SoD manual-aim skillshots; suit-frames + Sparks + wild mutations). Supersedes the Awakening-Engine fiction + the Co-op Hades iteration. Operative roadmap [[Roadmap_Lantern_Slice]]; **existing code (combat feel, ability/boon plumbing, run/hub lifecycle, save, regions/relevancy) is QUARRY, not foundation** — keep/rework/mothball per [[Lantern_Strip_Mothball_Inventory]]. **No world code until the ★review-first world-model spike ([[Lantern_World_Model_Spike]]) passes its design review.** The prior co-op-Hades core-loop (ready-check multi-room RUNS; `RunDirectorSystem`/`BossState`; DR-044/045/046) is salvage — invariants archived 07-13 in the gotchas archive. ★ **general gotcha kept: a serialized prefab bool ignores the C# initializer — flip the value in the prefab.**
|
||||
|
||||
## DOTS / ECS conventions (authoritative summary)
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
tags:
|
||||
- moc
|
||||
- home
|
||||
updated: 2026-06-24
|
||||
updated: 2026-07-13
|
||||
permalink: gamevault/00-home/home
|
||||
---
|
||||
|
||||
@@ -10,16 +10,21 @@ permalink: gamevault/00-home/home
|
||||
|
||||
Multiplayer game on **Unity DOTS** (Entities) + **Netcode for Entities** (server-authoritative, client prediction). This vault is the canonical, cross-machine, human-facing record. Code lives in `Assets/_Project/`; engine/API truth comes from **context7**, not this vault.
|
||||
|
||||
> **Current direction: LANTERN** (locked 2026-07-13, [[DR-048_Lantern_Adoption_Full_Pivot]]) — a co-op
|
||||
> action-RPG where **your territory is light**: what you light stays, what stays dark rerolls. SoD-grade
|
||||
> skillshot combat + modular Spark kits + a seed-pinned pocket-graph world. Design: [[Identity_Lantern]];
|
||||
> roadmap: [[Roadmap_Lantern_Slice]]. Prior directions (Awakening Engine, Co-op Hades) are kept as history.
|
||||
|
||||
## Map of Content
|
||||
|
||||
- **Vision** → [[Pillars]] — design pillars & locked decisions · [[Identity]] — the fiction (sci-fi frontier colony)
|
||||
- **Vision** → [[Pillars]] — design pillars & locked decisions · [[Identity_Lantern]] — the fiction (light-as-territory abyssal co-op) · [[Art_Direction_Lantern]] — style bible & material decision · [[Theme_Direction_Candidates]] — the exploration behind the pivot
|
||||
- **Game Design** → [[Systems_Index]] — per-system design docs
|
||||
- **Roadmap** → **[[Path_to_Fun]]** (north star) · [[Backlog]] (committed list) · [[Milestones]] (history). **Current direction:** a co-op roguelite-ARPG, **expedition-driven loop** ([[DR-037_Procedural_Expedition_Spine_Two_Classes_Persistent_Meta]] → loop re-shape [[DR-042_Loop_Reshape_Expedition_Driven]]).
|
||||
- **Sessions** → `07_Sessions/2026/` — dated work logs (latest: [[2026-06-24_Slice_Combat_Depth_Enemy_Variety_Impact_Build]] · [[2026-06-21_Slice3_Expedition_Combat_Spine_Build]] · [[2026-06-17_Design_Redirect_Coop_Roguelite]])
|
||||
- **Decisions** → `07_Sessions/_Decisions/` — decision records DR-001 … DR-042 · [[DR-001_Netcode_Test_Harness]] · latest [[DR-042_Loop_Reshape_Expedition_Driven]] (loop re-shape: expedition-driven win)
|
||||
- **Roadmap** → **[[Roadmap_Lantern_Slice]]** (operative) · [[Lantern_Strip_Mothball_Inventory]] (salvage map) · [[Lantern_World_Model_Spike]] (★review-first) · [[Backlog]] / [[Path_to_Fun]] / [[Milestones]] / [[Iteration_2026-07_CoopHades]] (history).
|
||||
- **Sessions** → `07_Sessions/2026/` — dated work logs (latest: [[2026-07-13_Lantern_Phase0_Adoption_Pivot]] · [[2026-07-12_Phase17_Boon_Overhaul]])
|
||||
- **Decisions** → `07_Sessions/_Decisions/` — decision records DR-001 … DR-048 · [[DR-001_Netcode_Test_Harness]] · latest [[DR-048_Lantern_Adoption_Full_Pivot]] (the LANTERN pivot)
|
||||
- **Meta** → [[Documentation_Protocol]] · [[Tags]]
|
||||
- **Templates** → [[Session_Log_Template]] · [[Decision_Record_Template]]
|
||||
|
||||
## How knowledge is organized
|
||||
|
||||
See [[Documentation_Protocol]]. In short: design / decisions / sessions live here (committed to git); **basic-memory** recalls over these notes; **serena** navigates C# symbols; native Claude memory holds machine-local facts; **context7** is the source of truth for DOTS / Netcode APIs.
|
||||
See [[Documentation_Protocol]]. In short: design / decisions / sessions live here (committed to git); **basic-memory** recalls over these notes; C# symbols are navigated with **Glob/Grep** (serena removed 2026-07-07 — unused + flaky on Unity); native Claude memory holds machine-local facts; **context7** is the source of truth for DOTS / Netcode APIs.
|
||||
@@ -0,0 +1,98 @@
|
||||
---
|
||||
tags: [vision, art-direction, lantern, style-bible, workstream-a]
|
||||
status: draft-binding
|
||||
updated: 2026-07-13
|
||||
permalink: gamevault/01-vision/art-direction-lantern
|
||||
---
|
||||
|
||||
# LANTERN — Art Direction Lock (Workstream A0)
|
||||
|
||||
> The binding one-page style bible for [[Roadmap_Lantern_Slice]]'s art track (Workstream A0, runs inside
|
||||
> Phase 0). Adopted under [[DR-048_Lantern_Adoption_Full_Pivot]]. This is the **written** half of A0; the
|
||||
> gate is the **in-engine style-proof scene** (below), which is **not yet built** — Phase 0 does not exit
|
||||
> until it is approved. The readability law is lifted verbatim from [[Identity_Lantern#Art, audio & the
|
||||
> readability law|the identity]] and applies to every asset from day one.
|
||||
>
|
||||
> **Why this matters more than usual:** one developer, learning Blender, shipping custom creatures. This
|
||||
> direction lives or dies on a **repeatable factory**, not on any single beautiful asset. Every rule here is
|
||||
> chosen so that creature N+1 is a routine sitting, not a research project.
|
||||
|
||||
## Style bible (binding)
|
||||
|
||||
- **Stylized low-poly, RoR2-lineage.** Silhouette-first; faceted geometry; flat / near-flat shading. Mood is
|
||||
carried by **dynamic light in murk**, never by texture detail. A readable blob with a great light beats a
|
||||
detailed model nobody can see in the dark.
|
||||
- **Poly budgets (hard):** props **≤ ~800 tris** · creatures **≤ ~3k** · hero / boss / suit-frames **≤ ~6k**.
|
||||
- **The palette is the ontology** (the fiction rule made visible): **warm gold/amber = light (ours, true) ·
|
||||
cold corpse-green/blue = gloam (the deep's counterfeit) · lure-red = bait · white-hot = conversion.**
|
||||
- **The readability law (binding, from the three reviews):**
|
||||
1. **Value first, hue second.** Every warm/cold distinction is *also* carried by luminance value, shape
|
||||
language, and **flicker-cadence** (steady = true, flicker = false — the load-bearing channel; hue is the
|
||||
garnish). This is the colorblind answer (gold-vs-green is a worst-case red-green pair).
|
||||
2. **Design the dark floor for the video encoder, not the OLED.** Bioluminescent ground-clutter density is
|
||||
the streamability dial; dark scenes must survive 6–8 Mbps without macroblocking. A separate **capture /
|
||||
photo grade** (lifted, saturated profile) ships for clips and screenshots.
|
||||
3. **Screenshot discipline.** Every promotional frame reads at **200 px** with a warm focal light AND a
|
||||
legible silhouette.
|
||||
|
||||
## The material decision (the solo-dev keystone)
|
||||
|
||||
**No per-asset texturing, ever.** This is the single most important production rule in the project.
|
||||
|
||||
- **One shared palette / gradient atlas** — Imphenzia-style: a single small texture of colour bands. UVs are
|
||||
*placed onto bands*, not unwrapped. Zero texture-painting skill required; perfect style coherence; batches
|
||||
hard.
|
||||
- **Vertex-colour accents** for per-asset variation on top of the atlas.
|
||||
- **Three master shaders — the whole rendering surface of the game:**
|
||||
1. **`Lit-Palette`** — statics (props, dressing, environment, station).
|
||||
2. **`Emissive-Gloam`** — parameterized warm/cold/lure emissive. **One shader is the entire palette rule:**
|
||||
its parameters (hue, **flicker-cadence**, intensity) are *both* the look *and* gameplay information
|
||||
(true-vs-false light). Every glow in the game is this shader.
|
||||
3. **`Skinned-Palette`** — deformation-aware (the Rukhanka-skinned creatures/suits). Replaces the current
|
||||
`AnimatedLitShader` role as the palette-atlas creature material.
|
||||
|
||||
**Every asset in the game shares ~3 materials.** Coherence, batching, and no per-asset UV/texture work — that
|
||||
is the amortization that makes a one-person creature factory possible.
|
||||
|
||||
> ⚠ **Carry-over gotcha ([[material-property-body-flash-rukhanka]]):** a per-instance `URPMaterialPropertyBaseColor`
|
||||
> tint only renders if the shader declares `_BaseColor` **Hybrid-Per-Instance** (ShaderGraph
|
||||
> `overrideHLSLDeclaration:true` + `hlslDeclarationOverride:2`). The three master shaders must be authored
|
||||
> Hybrid-Per-Instance if we want per-instance gloam-tint variants (a free variant axis — see A2 variant policy).
|
||||
|
||||
## Reference board
|
||||
|
||||
- **RoR2** — shape language, faceted low-poly, dynamic-light-first in dark ambient.
|
||||
- **Dredge** — water mood, dread, the sea-as-atmosphere.
|
||||
- **Hollow Knight** — value control in darkness (how to stay legible with almost no light).
|
||||
- **Below** — the **cautionary** case: solo dread + screenshot-illegible darkness killed it. The readability
|
||||
law exists specifically against this failure.
|
||||
|
||||
## The style-proof scene — THE GATE (not yet built)
|
||||
|
||||
**One prop + one creature + one suit**, in-engine, under murk + dynamic lights, on the capture grade. Judged
|
||||
three ways, all of which must pass:
|
||||
|
||||
1. **Full-size** — reads as *this game and no other*.
|
||||
2. **At 200 px** — silhouette + warm focal light legible (screenshot-discipline rule).
|
||||
3. **In grayscale** — value-first / flicker-cadence carries the true-vs-false read with hue removed.
|
||||
|
||||
**Locked before any mass production.** This gate + [[DR-048_Lantern_Adoption_Full_Pivot]] + the world-model
|
||||
review ([[Lantern_World_Model_Spike]]) together are Phase 0's exit. Until this scene is approved, Workstream A
|
||||
stays in A0 (no A1 pipeline proof, no A2 factory).
|
||||
|
||||
## Handoff to the deeper pass (A1 recipes)
|
||||
|
||||
The concrete recipe documents are **A1 work** (Phase 1), not A0: the **statics recipe** (Blender → export
|
||||
units/scale → collider policy → entity baking → palette material) and the **skinned recipe** (rig → per-action
|
||||
clips, Key All Bones, bake-to-pose → FBX → Rukhanka ingest → `Skinned-Palette` → prefab). Both build on the
|
||||
project's proven animation pipeline ([[DR-022_Animation_Pipeline_Rukhanka_Synty]] / [[DR-023_Enemy_Animation_MonsterMash]]
|
||||
+ the machine-local Blender recipe) and the **three rig families** (Drifter / Crawler / Strider). This doc is
|
||||
the constitution; the recipes are the operating manuals.
|
||||
|
||||
## Related
|
||||
|
||||
- [[Identity_Lantern]] — the fiction the palette encodes (the readability law lives there too)
|
||||
- [[Roadmap_Lantern_Slice]] — Workstream A (A0 → A1 → A2 → A3) gates
|
||||
- [[DR-048_Lantern_Adoption_Full_Pivot]] — the adoption
|
||||
- [[Synty_Asset_Inventory]] — placeholder quarry until custom assets land
|
||||
- [[DR-022_Animation_Pipeline_Rukhanka_Synty]] — the skinned-material lineage `Skinned-Palette` inherits
|
||||
@@ -9,6 +9,11 @@ permalink: gamevault/01-vision/identity
|
||||
|
||||
# Game Identity — The Awakening Engine (Aether-colony sci-fi)
|
||||
|
||||
> [!warning] SUPERSEDED as the operative fiction (2026-07-13, [[DR-048_Lantern_Adoption_Full_Pivot]]).
|
||||
> The game pivoted to **LANTERN** — see [[Identity_Lantern]]. This Awakening-Engine fiction is **kept as
|
||||
> history and as salvage quarry** (the code it skins is now inventoried in [[Lantern_Strip_Mothball_Inventory]]).
|
||||
> Nothing here is deleted; it is no longer the target.
|
||||
|
||||
> The fiction that turns the [[Pillars|mechanical pillars]] into a *place*. Originally the "frontier colony" skin (2026-06-02, [[DR-009_GameFeel_Identity_FirstBlood]]); **evolved 2026-06-03** to absorb the magic + sci-fi premise (amnesiac Sleeper, a guiding voice, a goal called THEM) into one coherent world — recorded in [[DR-014_M6_Build_Structures_Automation_Foundation|the M6 build slice]] and the fiction-adoption decision. It remains a **skin over the locked pillars — no mechanical rework**: every M1–M6 system keeps its code and gains a fictional role. The frontier colony is *recontextualised, not replaced*.
|
||||
|
||||
## One-sentence pitch
|
||||
|
||||
@@ -11,6 +11,14 @@ permalink: gamevault/01-vision/pillars
|
||||
|
||||
> The few non-negotiables every system must serve. Keep this short; promote only decisions that are truly locked.
|
||||
|
||||
> [!info] Direction: **LANTERN** (locked 2026-07-13, [[DR-048_Lantern_Adoption_Full_Pivot]]).
|
||||
> The **mechanical pillars below still hold** (Unity DOTS + Netcode, server-authoritative, 2–4 co-op,
|
||||
> skill-expression combat, persistent base, automation-as-progression). What changed is the **fiction + three
|
||||
> subsystems**: the fiction is now [[Identity_Lantern]] (not the Awakening Engine); combat sharpens to
|
||||
> **SoD-grade manual-aim skillshots** (the soft auto-target era ends); the world becomes a seed-pinned
|
||||
> **pocket-graph** where **light is territory**; the build layer becomes suit-frames + cultured Sparks + wild
|
||||
> mutations. See the LANTERN locked decisions at the bottom.
|
||||
|
||||
## Pillars
|
||||
|
||||
> **Combat is the primary verb; base + automation braid around it** (locked 2026-06-08, [[DR-028_Combat_Primary_Verb_Depth_First]]). The fusion of all three is the identity — but as ONE braided loop with a single primary verb, never three co-equal, independently-deep modes. Roadmap: [[Path_to_Fun]].
|
||||
@@ -30,7 +38,27 @@ permalink: gamevault/01-vision/pillars
|
||||
- **Combat-primary + depth-before-breadth (locked 2026-06-08):** combat is the primary braided verb; **no new system until one braided loop is genuinely fun**, and every milestone ends with a play/fun-gate (not just green tests). [[DR-028_Combat_Primary_Verb_Depth_First]] · roadmap [[Path_to_Fun]].
|
||||
- **Classes + persistent meta (locked 2026-06-17, [[DR-037_Procedural_Expedition_Spine_Two_Classes_Persistent_Meta]]):** **two classes** — **Warrior** (melee anchor) + **Ranger** (ranged, manually aimed — *not* auto-fire, which would break skill-expression). Class identity = the **primary-attack archetype**; run-acquired **meta-buffs ride the existing `StatModifier`/`TimedModifier` pipeline**. A **persistent meta-progression layer** (SaveData v6) funds permanent growth at the hub; run combat-buffs are run-scoped. **Reverses [[DR-031_Base_Mining_Loop_Cohesion]]'s expedition pause** (a real playtest — [[Scratch Notes 6152026]] — showed the single arena goes stale).
|
||||
|
||||
## LANTERN direction — locked decisions (2026-07-13, [[DR-048_Lantern_Adoption_Full_Pivot]])
|
||||
|
||||
These sit *on top of* the mechanical pillars above (which are unchanged). Full design: [[Identity_Lantern]];
|
||||
roadmap: [[Roadmap_Lantern_Slice]].
|
||||
|
||||
- **The one rule:** *what the light holds, stays; what the dark holds, changes.* Applied to the world =
|
||||
persistence; to the body = death; to the kit = builds; to the story = stakes.
|
||||
- **World = seed-pinned pocket-graph** (light is territory). Permanence is spendable: lit pockets persist,
|
||||
dark pockets re-knot. The hardest netcode problem — [[Lantern_World_Model_Spike]] (★review-first).
|
||||
- **Combat feel = SoD-grade manual-aim skillshots** (telegraphs, dashes, cooldown kits; **soft auto-target
|
||||
cut**). Suit-frames = chassis/class; **Sparks** (abilities-as-organs, cultured) graft into sockets; **wild
|
||||
mutations** are the augment layer (paced thresholds, evaporate at homecoming, Tallow fix-slots).
|
||||
- **Death = the split:** flame returns cheap (kit works within minutes); cargo + fixed mutations + raw organs
|
||||
strand with the suit — recovery runs are optional value-runs, never mandatory kit-repair.
|
||||
- **Session-only burn** (the Lamp burns only while a session runs — no offline punishment). **Hosting = Wicks
|
||||
travel; worlds are saves** (Valheim contract). **Loss ceiling = pockets, never a shelf.**
|
||||
- **The slice's falsifiable test:** *does pinning a pocket feel like winning, and does a stranded suit feel
|
||||
worth a second descent?* — the only gate that matters.
|
||||
|
||||
## Related
|
||||
|
||||
- [[Identity]] — the **fiction** that skins these pillars: **The Awakening Engine** (Aether-colony sci-fi), evolved 2026-06-03 ([[DR-015_The_Awakening_Engine_Fiction_Adoption]]) from the original frontier-colony skin ([[DR-009_GameFeel_Identity_FirstBlood]], 2026-06-02). Skin-only — no mechanical rework; **Aether** is the one substance unifying magic + tech (cyan = ordered / orange = wild Blight), with an amnesiac-**Sleeper** / **Echo** (the guiding voice) / **THEM** spine.
|
||||
- [[Identity_Lantern]] — the **operative fiction** these pillars now skin (co-op action-RPG; light-as-territory).
|
||||
- [[Identity]] — the **prior** fiction (The Awakening Engine, Aether-colony sci-fi) — **superseded** as operative by [[DR-048_Lantern_Adoption_Full_Pivot]], kept as history/quarry. Skinned via [[DR-015_The_Awakening_Engine_Fiction_Adoption]] / [[DR-009_GameFeel_Identity_FirstBlood]] (amnesiac Sleeper / Echo / THEM · Aether cyan=ordered / orange=wild Blight).
|
||||
- Decision records: `07_Sessions/_Decisions/`
|
||||
@@ -8,6 +8,12 @@ permalink: gamevault/02-game-design/systems-index
|
||||
|
||||
# Systems Design — Index
|
||||
|
||||
> [!info] LANTERN pivot (2026-07-13, [[DR-048_Lantern_Adoption_Full_Pivot]]).
|
||||
> The systems catalogued below are the **Awakening-Engine / Co-op-Hades-era spine**. They are **not deleted** —
|
||||
> under LANTERN they are **quarry**: each has a keep / rework / mothball verdict in
|
||||
> [[Lantern_Strip_Mothball_Inventory]]. This index stays the accurate map of *what exists in code today*; the
|
||||
> inventory is the map of *what happens to it*. New LANTERN systems get sections here as they land.
|
||||
|
||||
One design doc per gameplay system, linked here. Each should state: purpose, components (`IComponentData`), systems (`ISystem`), netcode shape (ghost? predicted vs interpolated? inputs / RPCs), and open questions.
|
||||
|
||||
## Systems
|
||||
|
||||
@@ -7,8 +7,9 @@ updated: 2026-06-13
|
||||
permalink: gamevault/06-roadmap/backlog
|
||||
---
|
||||
|
||||
> [!warning] SUPERSEDED as the operative plan (2026-07-06 Co-op Hades conversion, banner added 2026-07-07).
|
||||
> Current direction + phases: [[Iteration_2026-07_CoopHades]]. This doc is kept as history.
|
||||
> [!warning] SUPERSEDED as the operative plan. Now **LANTERN** (2026-07-13, [[DR-048_Lantern_Adoption_Full_Pivot]]).
|
||||
> Current direction: [[Roadmap_Lantern_Slice]]. (Intermediate history: the 2026-07-06 Co-op Hades conversion,
|
||||
> [[Iteration_2026-07_CoopHades]].) This doc is kept as history.
|
||||
|
||||
# Backlog
|
||||
|
||||
|
||||
@@ -12,8 +12,9 @@ updated: 2026-06-17
|
||||
permalink: gamevault/06-roadmap/end-of-month-game-jam-slice
|
||||
---
|
||||
|
||||
> [!warning] SUPERSEDED as the operative plan (2026-07-06 Co-op Hades conversion, banner added 2026-07-07).
|
||||
> Current direction + phases: [[Iteration_2026-07_CoopHades]]. This doc is kept as history.
|
||||
> [!warning] SUPERSEDED as the operative plan. Now **LANTERN** (2026-07-13, [[DR-048_Lantern_Adoption_Full_Pivot]]).
|
||||
> Current direction: [[Roadmap_Lantern_Slice]]. (Intermediate history: the 2026-07-06 Co-op Hades conversion,
|
||||
> [[Iteration_2026-07_CoopHades]].) This doc is kept as history.
|
||||
|
||||
# End-of-Month Game Jam Slice
|
||||
|
||||
|
||||
@@ -7,6 +7,12 @@ permalink: gamevault/06-roadmap/iteration-2026-07-coophades
|
||||
|
||||
# Iteration 2026-07 — Co-op Hades Conversion
|
||||
|
||||
> [!warning] SUPERSEDED as the operative direction (2026-07-13, [[DR-048_Lantern_Adoption_Full_Pivot]]).
|
||||
> The project pivoted to **LANTERN** — operative roadmap [[Roadmap_Lantern_Slice]], design [[Identity_Lantern]].
|
||||
> Everything below shipped and is **kept as history + salvage quarry** (see [[Lantern_Strip_Mothball_Inventory]]
|
||||
> for the keep/rework/mothball calls on this iteration's systems — the combat feel layer, boon pipeline,
|
||||
> world-alive presentation, and run/hub lifecycle are all salvage). Nothing here is deleted.
|
||||
|
||||
**Operator decision (2026-07-06, dev-loop iteration session):** commit the *Fix-the-Fight-in-Place trunk* PLUS the full
|
||||
*Co-op Hades* direction — cut/mothball the tower-defense layer, base becomes a Hades-house hub, boons become
|
||||
mechanic-changers, kit gains a second ability, real node types, second boss, co-op revive. **Depth folds in now** (not
|
||||
|
||||
@@ -0,0 +1,61 @@
|
||||
---
|
||||
title: LANTERN — Operator Questions (autonomous-run parking lot)
|
||||
date: 2026-07-13
|
||||
tags: [roadmap, lantern, operator-questions, forks]
|
||||
status: awaiting-operator
|
||||
permalink: gamevault/06-roadmap/lantern-operator-questions
|
||||
---
|
||||
|
||||
# LANTERN — Operator Questions
|
||||
|
||||
> Parking lot for decisions I couldn't make autonomously during the 2026-07-13 autonomous build run (operator
|
||||
> stepped away: "build everything you can, don't stop, create a doc of operator questions as needed"). Each
|
||||
> item has my **recommendation** so you can answer in one pass. Nothing here blocked me from continuing — I
|
||||
> took the recommended default in the design docs and flagged it, so answering may just confirm or redirect.
|
||||
>
|
||||
> **Convention:** ✅ = I proceeded on the recommendation (design assumes it; easy to change). ⛔ = I did NOT
|
||||
> proceed; genuinely blocked pending your call.
|
||||
|
||||
## Process / authorization
|
||||
|
||||
1. **⛔ New netcode CODE implementation.** All LANTERN slice code is greenfield and netcode-touching (new
|
||||
ghosts / prediction / relevancy / RPCs), so it needs (a) plan-approval per the /dots-dev gate and (b) a
|
||||
**focused** Unity editor (an unfocused editor throttles MCP + breaks Burst — you're away). I did **not**
|
||||
write any Unity code this run. **Recommendation:** on return, focus Unity, then greenlight implementation
|
||||
phase-by-phase from the build specs I wrote. *All design/build-spec scaffolding is ready so code can move
|
||||
fast.*
|
||||
2. **⛔ Additional multi-agent design-review Workflows.** You explicitly greenlit the world-model review. Each
|
||||
remaining ★review-first slice (Phase 1's light-relevancy prototype; Phase 2 world code; hazards; etc.) also
|
||||
wants one before coding. I did **not** fire more heavy Workflows unprompted. **Recommendation:** greenlight
|
||||
"run the ★ review before each netcode slice" as a standing autonomous authorization, or I run them one-by-one
|
||||
on your go.
|
||||
3. **✅/⛔ Blender A0 art execution.** Blender MCP is live. I wrote the art-pipeline recipes + the A0 material
|
||||
spec (docs). Whether I should *autonomously attempt* the in-engine style-proof scene (needs your eyes to
|
||||
judge — screenshots hide material bugs) vs. wait: I lean **wait for your eyes** on the gate judgment, but I
|
||||
can build the palette atlas + a first placeholder asset as a starting point. **Recommendation:** let me
|
||||
stage the palette atlas + one placeholder prop/creature/suit for the scene, but you judge the gate.
|
||||
|
||||
## Phase 1 — combat gym (design forks in [[Lantern_Phase1_Combat_Gym_Build_Spec]])
|
||||
|
||||
4. **✅ Suit-frame kit specifics.** I specced the **Bathynaut** (anchor-and-crash melee) and **Harpooner**
|
||||
(line-and-iron skillshots) chassis verbs + a 4-socket kit. The exact Spark list (first 4–5) and per-frame
|
||||
movement feel are recommendations — see the build spec's fork table. Confirm or swap.
|
||||
5. **✅ Manual-aim vs the current soft auto-target.** Design cuts soft auto-target for SoD-grade manual aim
|
||||
(per Identity). Confirm you want the auto-target fully gone in the gym (I kept the reticle plumbing).
|
||||
|
||||
## Economy / naming
|
||||
|
||||
6. **✅ Currency re-mean mapping.** Ore/Aether/Biomass/Charge → Flame/Lumen/Gloam/Loudness/Salvage/Chum/Tallow.
|
||||
Proposed mapping in the currency spec. Confirm the byte-id assignments before any save-schema work.
|
||||
7. **(deferred) Shipping title.** "LANTERN" is the internal codename; a marketing naming pass is deferred
|
||||
(per [[Identity_Lantern]]). No action needed now.
|
||||
|
||||
## Answered this session (for the record)
|
||||
|
||||
- Co-op pocket occupancy → **co-located, one active pocket** (2026-07-13).
|
||||
- Light-as-information scope → **party light-union, Wicks always visible** (2026-07-13).
|
||||
- Run the world-model adversarial review → **yes, full review** (2026-07-13).
|
||||
|
||||
## Related
|
||||
|
||||
- [[Roadmap_Lantern_Slice]] · [[Lantern_World_Model_Design_Proposal]] · [[DR-048_Lantern_Adoption_Full_Pivot]]
|
||||
@@ -0,0 +1,144 @@
|
||||
---
|
||||
title: LANTERN — Phase 1 Combat Gym (design/build spec, pre-review)
|
||||
date: 2026-07-13
|
||||
tags: [roadmap, lantern, combat, phase-1, build-spec, netcode]
|
||||
status: design-pre-review
|
||||
permalink: gamevault/06-roadmap/lantern-phase1-combat-gym-build-spec
|
||||
---
|
||||
|
||||
# LANTERN — Phase 1: Combat Gym (design/build spec)
|
||||
|
||||
> Phase 1 of [[Roadmap_Lantern_Slice]]: *the primary verb first — two frames that feel like Shape of Dreams.
|
||||
> No world, no lanterns — a gym.* This is a **design spec written from ground-truth code** (a combat/ability/
|
||||
> boon salvage pass), NOT a build contract: the 4-socket kit and light-relevancy prototype are **netcode-
|
||||
> touching** (new ghost fields / input surface) so they need the ★ design review + plan-approval + a focused
|
||||
> editor before any code. Phase 1 has **no world** and is **not** blocked by the Phase-0.3 world-model review.
|
||||
>
|
||||
> **Gate:** the gym is fun with two players for 15 minutes on kit alone; the relevancy-light prototype verifies
|
||||
> server-side (gamma test: nothing to see outside your light).
|
||||
|
||||
## Salvage verdict (what Phase 1 stands on)
|
||||
|
||||
The combat substrate is the project's strongest asset and it ports almost whole:
|
||||
|
||||
- **KEEP as-is:** the client-only feel layer — `CombatFeedbackSystem` (edge-detects replicated `Health`/tick
|
||||
fields, never touches sim), `EnemyDangerTelegraphSystem` (per-kind colour/voice/shape/light), `AimReticleSystem`,
|
||||
`DynamicLightSystem`. The dash — `DashSystem` (deterministic re-sim from the replicated `PlayerInput.Dash`
|
||||
InputEvent; i-frame window + sharpness-override blink) is exactly the SoD dash.
|
||||
- **KEEP the pipeline, REWORK the grammar:** `AbilityFireSystem` (predicted-spawn, `IsFirstTimeFullyPredictingTick`
|
||||
gate, SpawnId classification, `AutoTarget` server/gamepad branch), the ability blob (`AbilityDatabase` /
|
||||
`AbilityDefBlob` / `AbilityArchetype`), `StatModifier`→`StatRecomputeSystem`→`EffectiveAbilityStats` (every-
|
||||
tick fold), `MeleeComboSystem` (predicted absolute-write `Step`).
|
||||
- **REWORK into the socket kit:** the single `AbilityRef{[GhostField] byte Id}` → a **4-wide socket buffer**
|
||||
(model on `EquipmentSlot`: `[InternalBufferCapacity(4)]`, index-is-slot, `SendToOwnerType.All`, server-sole-
|
||||
writer). One `AbilityCooldown` → a 4-wide cooldown. One `PlayerInput.Fire` → **4 socket inputs**.
|
||||
- **CUT (as the target):** soft auto-target as the default — SoD is manual aim. Keep the plumbing; disable
|
||||
per-socket via `AutoTargetRange = 0` in the ability def (a clean existing off-switch), leaving a small
|
||||
optional in-arc assist only where a specific Spark wants it.
|
||||
|
||||
## The two suit-frames (chassis = class = silhouette = verb)
|
||||
|
||||
Frames extend the proven class chassis (`ClassTraits` seeds 4 permanent trait `StatModifier`s per class; the
|
||||
`AbilityFor(classId)` mapping). Two frames ship:
|
||||
|
||||
### Bathynaut — anchor-and-crash melee (Warrior lineage)
|
||||
- **Chassis verb:** a weighted tide-breaker. Reuses `MeleeComboSystem` (combo `Step`, finisher scaling,
|
||||
server-only cone cleave) as the always-available primary. Movement feel: high mass, short committed lunges,
|
||||
a hard **anchor** (a planted stance that trades mobility for a crash payoff). Slow turn, high poise.
|
||||
- **Salvage:** Warrior seeds (`+MaxHealth`, `-MoveSpeed`, `+MeleeDamage`, `+MeleeRange`) reskin directly.
|
||||
|
||||
### Harpooner — line-and-iron skillshots incl. reel/drag (Ranger lineage)
|
||||
- **Chassis verb:** manual-aim line weapons. Reuses the predicted projectile path. The signature verb is
|
||||
**reel/drag**: a fired iron that, on hit, **pulls** (the existing `KnockToPull` / `ProjectileEffectState`
|
||||
pull hook, promoted from a mutation to a native Harpooner mechanic) — either pulling the target to you or
|
||||
you to the target (design fork, see questions doc). Movement feel: light, kite-friendly, real windups.
|
||||
- **Salvage:** Ranger seeds (`+MoveSpeed`, `-MaxHealth`, `+Range`, `+AutoTargetRange`) reskin; the reel reuses
|
||||
the pull flag + the chain/retarget machinery in `ProjectileDamageSystem`.
|
||||
|
||||
## The 4-socket skillshot kit (the netcode core — ★ review before code)
|
||||
|
||||
The single-ability model becomes a **4-socket kit** (4 active + the movement/dash). Design:
|
||||
|
||||
- **`AbilitySocket` buffer** on the player: `[GhostComponent(SendToOwnerType.All)] [InternalBufferCapacity(4)]`,
|
||||
one row per socket = `byte SparkId` (0 = empty). Server is the sole writer (socketing happens in the
|
||||
gym/hub, not predicted). Mirrors `EquipmentSlot` exactly — a proven pattern.
|
||||
- **`SocketCooldown` buffer** (4-wide, `[GhostField]` `NextFireTick` per socket, `SendToOwner`). Replaces the
|
||||
single `AbilityCooldown`. Each routed through `TickUtil.NonZero`.
|
||||
- **Input:** add **4 socket InputEvents** to `PlayerInput` (`Socket0..3`) — OR a single `Fire` + a `byte
|
||||
SocketIndex` (cheaper wire, one event). **Recommendation:** a single `InputEvent Fire` + `byte ActiveSocket`
|
||||
(the player "readies" a socket; one fire verb) keeps the input surface small and the 7-type query cap
|
||||
manageable; but 4 discrete buttons feel better for a MOBA bar. *Parked as a fork.*
|
||||
- **The 7-type query cap is already hit** in `AbilityFireSystem` — the socket rework must move to a
|
||||
`ComponentLookup`-fed restructure or an `IJobEntity` (per the CLAUDE.md 7-arg rule; hit twice already in the
|
||||
boon work). This is the single biggest code-restructure of Phase 1.
|
||||
- **Per-socket archetype dispatch:** the ability blob already dispatches on `AbilityArchetype`
|
||||
(Projectile/Cone implemented; **Hitscan/Aoe declared-but-unhandled** — Phase 1 implements them for the zone/
|
||||
vortex Sparks). Each Spark is an `AbilityDefBlob` row; socketing writes its id into `AbilitySocket`.
|
||||
- **Manual-aim grammar:** every socket fires along raw `PlayerInput.Aim` (manual). Real windups: add a
|
||||
`WindupTicks` to the ability def so player abilities telegraph like enemy attacks (reuse the telegraph
|
||||
vocabulary client-side). Readable hitboxes = the swept-projectile + cone math already in place.
|
||||
|
||||
## First Sparks (4–5 socketables — prove kit variety)
|
||||
|
||||
Each Spark = an `AbilityDefBlob` row + (if projectile/zone) a ghost prefab + an optional `ProjectileEffectState`/
|
||||
`BoonEffects`-style hook. Roadmap set: **decoy-wisp, hook/pull, vortex, blink, one zone.**
|
||||
|
||||
| Spark | Archetype | Salvage hook |
|
||||
|---|---|---|
|
||||
| **Decoy-wisp** | Aoe/spawn | spawns a server ghost that draws aggro (reuse the enemy target-selection + a new decoy tag; a Wisp-Choir mote asset in A2) |
|
||||
| **Hook / pull** | Projectile + pull | the `ProjectileEffectState` pull flag + chain retarget — a skillshot grab |
|
||||
| **Vortex** | Aoe (zone) | implements the declared-but-unhandled `Aoe` archetype: a timed area that pulls/slows (reuse geyser/hazard AoE chassis) |
|
||||
| **Blink** | movement | a second `DashSystem`-style deterministic teleport (re-sim from an InputEvent; no ghost) |
|
||||
| **Zone (one)** | Aoe (zone) | a persistent light/damage zone — the `HazardExplosionSystem`/geyser periodic-AoE chassis, player-owned |
|
||||
|
||||
Sparks are **not** mutations — mutations (Phase 4) *warp* Sparks via the `BoonEffects` substrate (3 count bytes
|
||||
+ flag bits, `SendToOwner`, server-only `ProjectileEffectState` hooks). Phase 1 only needs the sockets + the
|
||||
Spark defs; the mutation layer bolts on later without re-baking (its hooks already exist).
|
||||
|
||||
## Light-as-information prototype (★ review-first — see [[Lantern_World_Model_Spike]])
|
||||
|
||||
The gym's version of the slice's hardest idea, proven small: **per-player lamp radius drives netcode relevancy;
|
||||
entities outside the light aren't replicated.** Per the world-model design ([[Lantern_World_Model_Design_Proposal]]),
|
||||
this is **hard `GhostRelevancy` (`SetIsIrrelevant`)**, party-light-union, Wicks always visible. In the gym
|
||||
(no pockets) it degenerates to: a single arena + a per-player/party light-union relevancy pass over the
|
||||
training dummies/enemies. **This shares the world-model review** — do not code it until that Build Spec lands
|
||||
(the relevancy thrash/hysteresis + cost questions are the same). The gym is the natural first validation venue
|
||||
for the relevancy-light (the roadmap's gamma test: "nothing to see").
|
||||
|
||||
## Underwater feel pass (client-only, zero netcode)
|
||||
|
||||
Reuse the ambient stack (`AmbientMotionSystem` / `AmbientLifeSystem` / `WorldAtmosphereSystem`): buoyant
|
||||
knockbacks (tune the existing `KnockbackUtil` decay to a slow float), slow-tumbling debris (ambient drift),
|
||||
murk fog (the per-biome dark palette + fog density knob), hydrophone audio sketch (procedural `AudioClip.Create`
|
||||
bed, the proven presentation pattern). No sim change — pure feel.
|
||||
|
||||
## Build order (when greenlit; each step ends "compile + read_console clean")
|
||||
|
||||
1. **Socket data model** (no behaviour): `AbilitySocket` + `SocketCooldown` buffers, baked 4-wide; keep the old
|
||||
`AbilityRef` path working in parallel. *Wire/bake: new player ghost fields → one player-ghost re-bake.*
|
||||
2. **`AbilityFireSystem` socket restructure** (the 7-type-cap fix via ComponentLookup/IJobEntity); route the
|
||||
active-socket fire through the blob dispatch + per-socket cooldown. Cone + Projectile first.
|
||||
3. **Implement the `Aoe`/`Hitscan` archetypes** (vortex/zone Sparks).
|
||||
4. **The 5 Spark defs** + prefabs (kitbash/greybox; A1 assets replace later) + the Blink second-dash.
|
||||
5. **Two frames** = the class chassis reskin + per-frame socket defaults + movement-feel tuning knobs.
|
||||
6. **Manual-aim grammar:** windup telegraphs on player abilities; auto-target off by default (per-socket knob).
|
||||
7. **Underwater feel pass** (client-only).
|
||||
8. **Light-relevancy prototype** — ONLY after the world-model Build Spec; validated by the gamma test.
|
||||
|
||||
**Wire/bake churn:** steps 1–2 re-bake the player ghost (socket + cooldown fields); the input-surface change
|
||||
(socket events / active-socket byte) touches the command struct — re-mean bytes where possible, and the RPC/
|
||||
command collection hash must match across peers. Everything else is additive config + client-only.
|
||||
|
||||
## Open forks (parked in [[Lantern_Operator_Questions]])
|
||||
|
||||
- Socket input model: 4 discrete buttons vs one fire + a readied `ActiveSocket` byte.
|
||||
- Harpooner reel: pull the target to you, or you to the target (or a per-Spark mix).
|
||||
- The exact 5 Sparks (confirm the roadmap set or swap).
|
||||
- Auto-target fully gone vs a small optional in-arc assist per Spark.
|
||||
|
||||
## Related
|
||||
|
||||
- [[Roadmap_Lantern_Slice]] — Phase 1 · [[Lantern_Strip_Mothball_Inventory]] — the salvage verdicts
|
||||
- [[Lantern_World_Model_Design_Proposal]] / [[Lantern_World_Model_Spike]] — shares the light-relevancy review
|
||||
- [[DR-047_Phase17_Boon_Overhaul_Mechanic_Changers]] — the `BoonEffects` substrate the mutation layer reuses
|
||||
- [[Identity_Lantern]] — the combat feel target (SoD-grade skillshots)
|
||||
@@ -0,0 +1,88 @@
|
||||
---
|
||||
title: LANTERN — Strip / Rework / Mothball Inventory (Phase 0.2)
|
||||
date: 2026-07-13
|
||||
tags: [roadmap, lantern, salvage, inventory, phase-0]
|
||||
permalink: gamevault/06-roadmap/lantern-strip-mothball-inventory
|
||||
---
|
||||
|
||||
# LANTERN — Strip / Rework / Mothball Inventory
|
||||
|
||||
> Phase 0.2 of [[Roadmap_Lantern_Slice]], adopted under [[DR-048_Lantern_Adoption_Full_Pivot]]. Inventories
|
||||
> every current subsystem against the LANTERN vertical slice. **Existing code is quarry, not foundation** —
|
||||
> this table records the salvage call, not a migration contract. The per-phase build specs (deeper technical
|
||||
> pass) own the actual rework; this is the map.
|
||||
>
|
||||
> **Legend:** **KEEP** = ports ~as-is (re-theme only). **REWORK** = the chassis/plumbing survives, the design
|
||||
> on top changes. **MOTHBALL** = retire from the flow via baked toggles (`ScheduleEnabled` pattern), code +
|
||||
> tests keep compiling for reversibility — do not delete. **CUT** = the design is gone from the slice (code
|
||||
> may still be mothballed).
|
||||
>
|
||||
> Headline calls (roadmap standing constraints): combat feel layer + telegraphs → **KEEP**; boon pipeline →
|
||||
> **REWORK into mutations**; regions/relevancy, save, hub lifecycle → **REWORK**; sieges/economy leftovers →
|
||||
> **MOTHBALL**.
|
||||
|
||||
## Combat & player (the primary verb — strongest salvage)
|
||||
|
||||
| Subsystem (current) | Verdict | LANTERN target / note |
|
||||
|---|---|---|
|
||||
| **Combat feel layer** — `CombatFeedbackSystem` (+ split siblings), per-kind telegraph colours/voices/lights, hit-stop (camera punch), dash juice, damage numbers | **KEEP** | The single strongest asset. Roadmap: "combat feel layer + telegraphs: keep." Re-palette to warm/cold/lure; feed the SoD skillshot bar. |
|
||||
| **Player mover** — CharacterController kinematic (collide-and-slide), `PlayerControlSystem`, `CharacterProcessor`, planar Y-lock, predicted-physics infra | **KEEP** | Suit-frames are weighted seafloor infantry (no swimming) — the top-down CC config is exactly right. |
|
||||
| **Camera** — `PrototypeCameraRig` (ARPG follow, look-ahead, zoom, shake/`Hold`) | **KEEP** | Unchanged; the warm-cone-in-dark framing is a camera+light job. |
|
||||
| **Projectile/melee plumbing** — predicted `AbilityFireSystem`, `ProjectileMoveSystem`/`ClassificationSystem`, **swept** `ProjectileDamageSystem`, `HealthApplyDamageSystem`, MC-4 combo `Step` | **REWORK** | Keep the predicted-spawn + swept-hit + server-damage spine. Rebuild the ability grammar as **4-socket skillshot kits** with real windups/telegraphs/aim. |
|
||||
| **Aim** — `PlayerAimSystem` (client-derived), `AimReticleSystem`, scheme byte, **soft auto-target** | **REWORK** (auto-target **CUT**) | SoD-grade **manual aim** is the feel target — the in-arc soft auto-target ends. Reticle + client-derived aim plumbing reused. |
|
||||
| **Ability data model** — `AbilityDatabase` blob, `AbilityRef`, `StatModifier`/`EffectiveAbilityStats`, `StatRecomputeSystem` (every-tick fold, rollback-correct) | **KEEP / REWORK** | The substrate for **Sparks** (abilities-as-organs) + **mutations** — `StatModifier→EffectiveAbilityStats` is exactly what buffs/tiers/mutations ride ([[Identity_Lantern]]). |
|
||||
| **Boon pipeline** — `BoonEffects` (SendToOwner Pierce/Fork/Chain/Flags), `BoonOffer`, offer dedup / dominated-protection / `Family` bias, `KillRewardSystem`, `ProjectileEffectState` | **REWORK → wild mutations** | The mechanic-changer architecture IS the **wild-mutation warp** substrate. Layer on: paced thresholds (pocket-clear beats), evaporate-at-homecoming, Tallow **fix slots** (1/Spark), culture library, raw-socketing. [[DR-047_Phase17_Boon_Overhaul_Mechanic_Changers]] is the salvage seed. |
|
||||
| **Enemy AI + directors** — server-only `EnemyAISystem` (no-pathfinding collide-and-slide + `Depenetrate`/tangent-slide/`EnemyNavState` nudge backstop), `RoomEnemyDirectorSystem`, kind-indexed roster, `Dying` window, separation pass, poise byte | **REWORK** | Chassis kept (sole-position-writer, cover-aware nudge). Re-theme the roster to the bestiary: **Drowners** (Strider), **Grindylow** (Crawler leapers), **Wreckers** (Strider + fake-beacon/scan), **Wisp-Choir** (Drifter motes). Formalize spawn/rig path into **CreatureKit** (Workstream A2). |
|
||||
| **Boss** — server-only `BossState`/`BossAISystem` (sole mover, telegraphed radial SLAM, phase-2 speed + summon), `Health.Max` `[GhostField]`, party-HP scale | **REWORK** | Reused for the **shelf-boss** (Phase 6) — a real multi-phase skillshot fight. |
|
||||
|
||||
## World, netcode & lifecycle (the ★review-first zone)
|
||||
|
||||
| Subsystem (current) | Verdict | LANTERN target / note |
|
||||
|---|---|---|
|
||||
| **Regions / relevancy** — `RegionTag{byte}` (server-only), `GhostRelevancy` (`SetIsIrrelevant`), `RegionRelevancySystem`, untagged-global-ghost rule | **REWORK** | The seed for LANTERN's hardest idea: **light-as-information** relevancy (entities outside your lamp radius aren't replicated) + **pocket streaming**. Coordinate-region split → **pocket-graph**. Owned by the ★review-first [[Lantern_World_Model_Spike]] — no world code until that review passes. |
|
||||
| **Run / room lifecycle** — `RunDirectorSystem` (sole `RunInfo` writer), `RunLifecycle`/`RoomExplore`, `RoomEpoch`/`RoomTag` teardown, `PortalCommand`/`PortalInteractRequest`, ready-check, `ClassSwapUtil`, `PrepCatalog`/`PrepPurchaseRequest` | **REWORK** | Maps onto the **descent lifecycle**: muster at deepest lit waypoint → **Bell** down → pockets → Bell recall / lit-road walk home; ~30–40 min cap. Rooms→**pockets** (seed-fresh re-knot); portal→Bell/waypoint transit; class-at-base→**suit-frame** pick; per-run prep kept. State machine is salvage; the pocket-graph replaces the linear route map. |
|
||||
| **Save system** — `SaveData` (single-slot atomic JSON, versioned/additive, `[MinLoadableVersion,Current]`), `SaveService`, born-correct `CycleDirectorSpawnSystem` staging, `BaseRestoreSystem` (charge-free replay + remaining-tick cooldowns + HP) | **REWORK** | Persistence = **seed-pinning**: persist pinned-pocket **seed + structure deltas** + banked light + culture library. The versioned-additive JSON + **born-correct load** pattern is exactly what pinning needs — keep the HOW, change the WHAT. Hosting = "**Wicks travel; worlds are saves**" (Valheim contract). |
|
||||
| **Frontend / on-demand worlds** — `GameBootstrap`, `WorldLauncher`/`SessionRunner`/`MainMenuController`, UITK menu (Single/Host/Join), `CreateClientWorld`/`CreateServerWorld` | **KEEP** | The Valheim hosting model needs exactly this on-demand world lifecycle + menu flow. Re-skin the menu to the station. |
|
||||
| **Build / structures / grid** — `BaseGridMath` (locked coord space), `StructureCatalog`, co-op-atomic `BuildPlaceSystem`, `PlacedStructure`, EB-1 `Health`/`Destructible` structure loss-state | **REWORK** | **Building v1** inside lit pockets (Phase 3) — the grid + atomic-placement RPC + catalog reused; structure-death (EB-1) reused for **tide defense** (severable fuel lines, garrisoned junctions). |
|
||||
|
||||
## Economy, resources & harvest
|
||||
|
||||
| Subsystem (current) | Verdict | LANTERN target / note |
|
||||
|---|---|---|
|
||||
| **Ledger + harvest** — global `StorageEntry` ledger (`ResourceLedger` tag), personal `InventorySlot` bag (`OwnerSendType.All`), unified **swept** `ResourceHarvestSystem` (nodes + clutter, immortal-sink guard), `G`-deposit RPC | **REWORK** | Re-mean the currencies: **Flame / Lumen / Gloam / Loudness / Salvage / Chum / Tallow** ([[Identity_Lantern]]). Ledger + personal bag + swept harvest plumbing kept; **carried-vs-banked cargo** distinction is new; harvest = **Lumen nodes + organ drops**. |
|
||||
| **Resource ids** — Ore / Aether / Biomass / Charge (`ResourceId` bytes) | **REWORK** | Re-meaned to the LANTERN currency set (bytes, not enums — Burst rule holds). |
|
||||
| **Inventory / equipment** — `EquipmentSlot`→`AbilityRef` swap, `ItemDatabase` blob, `EquipSystem` (atomic bag↔slot) | **REWORK / PARTIAL** | Already PAUSED. The slot→ability swap is the **graft-into-socket** substrate for Sparks; **culture library** (permanent per-station collection) is new. |
|
||||
| **Automation** — `Harvester`/`Conveyor`/`Fabricator` chain, `ProductionMath`/`ConveyorMath`, deterministic offline catch-up, server-only I/O buffers | **MOTHBALL** | LANTERN **cuts spatial production machinery** ([[Identity_Lantern]] scope ladder). v1.0 automation is **assignment-based** (Tenders under the Klabautermann), not conveyors. Mothball the chain; keep the deterministic-catch-up math as reference for assignment production. |
|
||||
|
||||
## Sieges / win-condition (tower-defense layer — mothball-bound)
|
||||
|
||||
| Subsystem (current) | Verdict | LANTERN target / note |
|
||||
|---|---|---|
|
||||
| **Base-siege win** — END-2 final siege + latching Victory/Loss, `GoalReachedSystem`, `RunOutcome` (`[GhostField]` server-only) | **MOTHBALL / REWORK-meter** | No base-siege win in LANTERN. `GoalProgress`/`RunOutcome` **win-meter** reworks into the **Lamp brightness = campaign meter**. The **Dawn** (final carry) is the v1.0 win, not the slice. |
|
||||
| **Losable Core** — END-1 `CoreIntegrity`, `CoreDamageSystem`/`CoreRestoreSystem`, Core as AI fallback target | **MOTHBALL** | Already mothball-bound (Phase 2). No Core in LANTERN; the station is never destroyed — **loss ceiling = frontier pockets, never a shelf**. |
|
||||
| **Turret defense** — EB-2 turret-ammo `Charge`, `TurretFireSystem` soft-fail spend, ledger-fed Fabricator mint | **MOTHBALL** | No turret auto-defense in the slice. **Tide defense** (defend a planted lantern / fuel line) is a different, later beat (Phase 6 scripted tide). |
|
||||
| **Cycle/phase director** — `CyclePhaseSystem` (sole Phase writer), scheduled-siege / retaliation | **MOTHBALL / REWORK** | The auto-cycle retires. The **forecast** model (Siren sings tide windows in advance) replaces sprung sieges — a planned event, not an interrupt. |
|
||||
|
||||
## Presentation, world-feel & art (the LANTERN look is already here)
|
||||
|
||||
| Subsystem (current) | Verdict | LANTERN target / note |
|
||||
|---|---|---|
|
||||
| **Rendering identity** — dark-ambient + dynamic-light-first (clean dark-Synty), `DynamicLightSystem` (projectile/portal/node/impact lights), per-biome dark palettes, ACES/HDR grade | **KEEP** | *This is LANTERN.* The rendering pipeline stops being a style and becomes the fiction (light carves playable space). Add the **capture/photo grade** (lifted profile for clips) + the **readability law** (value-first, flicker-cadence, 200px). |
|
||||
| **Atmosphere / ambient** — `WorldAtmosphereSystem` (fog/ambient cross-fade), `AmbientMotionSystem` (drift/sway/rustle), `AmbientLifeSystem` (critters + cloud shadows + weather beats) | **KEEP / REWORK** | Ports as **water-column atmosphere** (murk, silt-outs, plankton blooms, currents, whale-falls). Critters → light's-edge fauna; weather beats → the dark-as-weather language. |
|
||||
| **Hazards / breakables / decals / cover** — `HazardExplosionSystem` (barrels), `GeyserEruptSystem` (periodic AoE, born-correct tick), `BlightClutter` breakables, destructible cover (env-collider ghost), `ScorchDecalSystem`/`CoverDamageSystem` | **KEEP / REWORK** | The both-sides-telegraphed AoE chassis (barrels/geyser) ports to **vent fields**; breakables/cover → wreck/coral dressing; decals reused. `BlightClutter` → **pocket clutter** (glow-flora/wrecks). |
|
||||
| **HUD / UI** — `HudSystem` (UITK, split siblings), `MenuUi` palette/`PanelSettings`/`EventSystem`, build palette, `PauseMenuController`, `HudTheme` SO | **REWORK** | UITK chassis + build palette kept; re-mean to **Flame / Lumen / Gloam / Loudness pips** + **lamp-morse** ping wheel. Station panels (Lamp meter, rack, graft-bench) are Phase 7. |
|
||||
| **Animation** — Rukhanka 2.9 client-derived (`PlayerAnimationDriveSystem`, `EnemyAnimationDriveSystem`, `ServerStripAnimationSystem`), `AnimatedLitShader`, `EnemyRigTools`, humanoid muscle-clip pipeline | **KEEP / REWORK** | Client-derived pipeline kept wholesale (netcode replication OFF). Formalize into the **3 rig families** (Drifter/Crawler/Strider, Workstream A1); `AnimatedLitShader` → the deformation-aware **`Skinned-Palette`** master shader (palette-atlas material decision). |
|
||||
| **World art assets** — Synty biomes (`BaseBiome` Meadow / `ExpeditionBiome` Arid), `ColliderFitTools`, `EnvArtTools` (HDRP→URP) | **REWORK / QUARRY** | Synty = **placeholder quarry** during transition ([[Synty_Asset_Inventory]]). LANTERN's abyssal look is custom Blender + the 3 master shaders + one palette atlas (Workstream A0). `ColliderFitTools` reused for pocket collider fitting. |
|
||||
| **Dev tooling** — `DebugOverlay`/`TuningConfig`, `DebugCommandSendSystem`, class-switch, screenshot rig, validation-harness | **KEEP / REWORK** | Retooled per roadmap cross-cutting: **pocket-graph visualizer, seed-pin inspector, Loudness/threat readout, descent-state overlay**. The server-inject validation harness pattern stays. |
|
||||
|
||||
## What this leaves for Phase 1
|
||||
|
||||
The **combat gym** (Phase 1) can be built almost entirely from KEEP + light REWORK: player mover + camera + combat feel + projectile/melee spine + ability data model + telegraphs, with two suit-frames on the existing humanoid pipeline and 4–5 Sparks on the reworked boon substrate. The ★review-first items (relevancy → light-as-information, pocket streaming) are quarantined behind [[Lantern_World_Model_Spike]] and do not block the gym.
|
||||
|
||||
## Related
|
||||
|
||||
- [[DR-048_Lantern_Adoption_Full_Pivot]] — the adoption this delivers 0.2 for
|
||||
- [[Roadmap_Lantern_Slice]] — the phase roadmap each verdict feeds
|
||||
- [[Lantern_World_Model_Spike]] — owns the REWORK of relevancy/lifecycle/save (★review-first)
|
||||
- [[Systems_Index]] — the per-system design docs being inventoried
|
||||
- [[Synty_Asset_Inventory]] — the placeholder quarry
|
||||
@@ -0,0 +1,161 @@
|
||||
---
|
||||
title: LANTERN — World-Model Design Proposal (pre-review, Phase 0.3)
|
||||
date: 2026-07-13
|
||||
tags: [roadmap, lantern, netcode, world-model, design-proposal, phase-0]
|
||||
status: proposal-pre-review
|
||||
permalink: gamevault/06-roadmap/lantern-world-model-design-proposal
|
||||
---
|
||||
|
||||
# LANTERN World-Model — Design Proposal (pre-review)
|
||||
|
||||
> Phase 0.3 of [[Roadmap_Lantern_Slice]]. This is the **plan** produced from the [[Lantern_World_Model_Spike]]
|
||||
> brief, grounded in the actual code (three read-only ground-truth passes + ctx7 on the Netcode relevancy/
|
||||
> importance APIs). **It is the INPUT to the ★ adversarial design review, not a build contract** — the review
|
||||
> hardens it into `World_Model_Build_Spec.md`. No world code until that review passes.
|
||||
>
|
||||
> **Operator forks locked this session:** (1) **co-located party — one active pocket at a time**; (2) **party
|
||||
> light-union relevancy — Wicks always visible to each other, world/enemies outside the party's combined light
|
||||
> are never sent.** Everything else below is a recommendation for the review to stress-test.
|
||||
|
||||
## The key netcode finding (grounds the whole design)
|
||||
|
||||
- **`GhostRelevancy` (`SetIsIrrelevant`)** is a *hard* cull — an entity outside the set is **never serialized**
|
||||
to that connection. This is the ONLY mechanism that satisfies the vision's promise: *"gamma-cranking cannot
|
||||
reveal what was never sent."* So **light-as-information = hard relevancy**, not importance.
|
||||
- **`GhostImportance`/`GhostDistanceImportance`** is a *soft* dial (far ghosts sent less often, still eventually
|
||||
sent) with a per-connection focal point (`GhostConnectionPosition`). It composes with relevancy
|
||||
(`BatchScaleWithRelevancyFunctionPointer`). Use it, if needed, only for **bandwidth within the lit set** —
|
||||
never as the privacy boundary.
|
||||
- The current `RegionRelevancySystem` is a brute-force `O(ghosts × connections)` rebuild every tick keyed on a
|
||||
discrete `RegionTag{byte}` (Base=0 / Expedition=1), `SetIsIrrelevant` mode, no dirty-flag. The
|
||||
`GhostRelevancy` singleton + `RelevantGhostForConnection{Connection,Ghost}` key + the "shared global state
|
||||
rides one **untagged** always-relevant ghost" convention are the directly reusable primitives.
|
||||
|
||||
## Model overview (slice scope)
|
||||
|
||||
Because the party is **co-located in one active pocket**, the world model is *architecturally the current
|
||||
single-active-room + ping-pong two-slot arena*, re-keyed from a 2-value region to a per-pocket key, plus two
|
||||
new things: **seed-pinning** (persistence) and **light-union relevancy** (the second, finer relevancy layer).
|
||||
|
||||
### 1. The seed model — pinning = freeze the salt + save deltas
|
||||
|
||||
The load-bearing insight from the save ground-truth: **generation is a pure function re-derived from seed;
|
||||
only player mutation is stored as deltas.** The tide-line drops out of this cleanly:
|
||||
|
||||
- **`WorldSeed`** (persistent, per save) — the shelf's identity.
|
||||
- **`DescentSalt`** (server-only, monotonic per descent — the `RunEpoch`/`HostSalt` lineage) — salts every
|
||||
**dark** pocket so unlit geography **re-knots** each descent.
|
||||
- **`PocketId`** (stable graph-node id — today's `CurrentNodeId`).
|
||||
- A **dark** pocket's content = `Hash(WorldSeed, PocketId, DescentSalt, subStream)` → re-knots each descent
|
||||
because `DescentSalt` changes (exactly today's `Hash(RunSeed, CurrentNodeId, constSub)` seeding).
|
||||
- **Pinning a pocket = FREEZE its salt.** Planting a waypoint-lantern stores `PinnedSalt = current
|
||||
Hash(WorldSeed, PocketId, DescentSalt)` to the save; thereafter the pocket regenerates **identically** every
|
||||
descent from the frozen salt, **plus** its structure/harvest **deltas** replayed born-correct.
|
||||
- "The dark re-knots, the light holds" is therefore: *unpinned → new salt each descent; pinned → frozen salt +
|
||||
deltas.* Nearly free, and it reuses the exact deterministic-hash + born-correct-delta-replay patterns proven
|
||||
in `RoomFieldSystem` + `BaseRestoreSystem`.
|
||||
|
||||
### 2. The pocket-graph & muster
|
||||
|
||||
- Reuse `RunMapMath` (pure integer-hash DAG, client-regenerable) as the pocket-graph generator. Rename
|
||||
run→**descent**, room→**pocket**. The graph per descent is generated from the descent identity.
|
||||
- **Muster at the deepest lit waypoint:** instead of always entering at node 0, the descent's entry = the
|
||||
**deepest pinned pocket** (the lit frontier). The pinned prefix is persistent; the dark frontier past it is
|
||||
fresh. Slice target (roadmap): 3–5 dark pockets per descent past the frontier.
|
||||
|
||||
### 3. Relevancy — two hard-cull layers, both `SetIsIrrelevant`
|
||||
|
||||
- **Layer A — pocket-occupancy scope (coarse):** `PocketTag{ int PocketKey }` replaces `RegionTag` (server-
|
||||
only, NOT a `[GhostField]`). Party co-located ⇒ exactly one active pocket's ghosts are live; everything
|
||||
tagged with a non-active pocket key is irrelevant to all. This is *today's region swap*, and the ping-pong
|
||||
two-slot arena (`RegionMath`, 1000u offset + 500u stride) still gives the clean spawn-next / tear-down-prev
|
||||
handoff. The **station** is the permanent "home pocket" (today's Base region).
|
||||
- **Layer B — light-union relevancy (fine, party-union):** within the active pocket, an enemy/world/hazard
|
||||
ghost is relevant **iff it lies within ANY party member's lamp radius** (the union). Because vision is a
|
||||
party union, set-membership is **connection-independent** (relevant-to-any ⇒ relevant-to-all party conns) —
|
||||
compute it once per pocket per tick over party positions, then apply to all party connections. **Wicks
|
||||
(players) are always relevant to each other** (added to no irrelevant set). Cost: `O(ghosts × partySize)`
|
||||
with capped ghost counts (~≤40) — trivial; `GhostImportance` held in reserve for bandwidth only.
|
||||
- **Server interaction guard preserved:** relevancy is *client-visibility only* — server AI/damage still act
|
||||
on ghosts in the dark (things loom out of the dark; intended). Keep an equivalent server-side pocket guard
|
||||
(today's cross-region damage re-check) so cross-pocket interaction can't leak in the shared world.
|
||||
|
||||
### 4. The descent lifecycle (rename + extend `RunDirectorSystem`)
|
||||
|
||||
`RunDirectorSystem` stays the **sole FSM writer** (its single-writer discipline + receiver-sets-command idiom
|
||||
are load-bearing). State map (append-only byte consts, ghost-stable):
|
||||
|
||||
| Today | LANTERN | Note |
|
||||
|---|---|---|
|
||||
| Staging | **AtStation** | muster/prep/ready at the hub |
|
||||
| Launching | **Descending** | Bell-down telegraph; pick descent identity |
|
||||
| InRoom | **InPocket** | active pocket populated |
|
||||
| RoomReward | **PocketClear** | **mutation thresholds fire here** (pocket-clear beats, never mid-combat) |
|
||||
| RoomExplore | **PocketExplore** | loot + **plant-a-lantern** window |
|
||||
| RouteSelect | **ChooseNext** | pick the next pocket edge |
|
||||
| Returning | **Ascending** | Bell recall (teleport) or lit-road walk home; bank; → AtStation |
|
||||
|
||||
- **Bell transit = teleport** (the proven portal→EnterRoom teleport). Lit-road walk-home through pinned pockets
|
||||
is a stretch goal, not a slice blocker.
|
||||
- **~30–40 min hard session cap** = a server descent timer that forces the Bell recall (new).
|
||||
- Participant conscription/teleport/release (`RunParticipant`) reused verbatim; late-join/dead-respawn rejoin
|
||||
the co-located pocket via the existing conscription path.
|
||||
|
||||
### 5. Pinning, burn & the Lamp meter
|
||||
|
||||
- **Plant a lantern** in PocketExplore = a placement RPC (the `BuildPlaceSystem` co-op-atomic pattern) that
|
||||
freezes the salt + marks `PocketId` pinned + persists (new additive `PinnedPocketSave[]`, SaveData **v7**,
|
||||
own staging carrier + born-correct one-shot replay, mirroring `PendingStructure`/`BaseRestoreSystem`).
|
||||
- **Session-only burn:** fuel is a **runtime** server countdown per lit lantern (never persisted — loads full,
|
||||
drains only while the session runs). Guttering telegraphs long/loud; full gutter **un-pins** the pocket
|
||||
(dark reclaims it) — **only during play**, honoring "no offline punishment." Loss ceiling = frontier pockets
|
||||
only, never the pinned prefix's deepest reach in a way that soft-locks.
|
||||
- **Banked light** deposited at a lit lantern feeds the **Lamp meter** (the `GoalProgress`-equivalent campaign
|
||||
readout on the global untagged director ghost).
|
||||
|
||||
### 6. Wire contract (replicated vs server-only)
|
||||
|
||||
- **Global untagged director ghost** (`DescentInfo` ≈ `RunInfo`, all `[GhostField]`): lifecycle byte, active
|
||||
`PocketId`, descent seed (client regenerates graph + cosmetic dressing), **pinned-pocket set** (for map +
|
||||
muster point), **Lamp meter**, **party Loudness sum**.
|
||||
- **Server-only:** `DescentSalt`, per-pocket `PinnedSalt`, `PocketTag`, `RunParticipant`, lamp fuel timers,
|
||||
pocket teardown tags.
|
||||
- **Player ghost:** ready flag + **lamp radius** as `[GhostField] OwnerSendType.All` (clients render their own
|
||||
+ teammates' light cones; the server computes relevancy) + **Loudness pip**.
|
||||
|
||||
### 7. Salvage map (what each new piece reworks)
|
||||
|
||||
`RunMapMath`→pocket-graph gen · `RunDirectorSystem`→descent FSM · `RegionRelevancySystem`→two-layer pocket +
|
||||
light-union relevancy · `RoomTag`/`RoomTeardown`→`PocketTag`/teardown · `RoomFieldSystem` `Hash(seed,id,sub)`→
|
||||
pocket content (frozen-salt for pinned) · ping-pong two-slot arena→pocket transit · `SaveData` additive + born-
|
||||
correct staging/replay→seed-pin persistence (v7) · `BuildPlaceSystem`→lantern planting · `GoalProgress`→Lamp
|
||||
meter · global untagged `CycleDirector` ghost→descent/lamp global state.
|
||||
|
||||
## Open questions & hazards the review MUST attack
|
||||
|
||||
1. **Light-relevancy thrash/hysteresis.** A ghost pops in/out as the lamp sweeps → snapshot churn + the known
|
||||
relevancy-re-entry false-edge client hazard. Proposal: **once-lit-stays-relevant until pocket exit** (or a
|
||||
grace window). Review the correctness + the fiction ("does re-hiding a seen enemy feel wrong?").
|
||||
2. **Relevancy rebuild cost & structure.** Confirm the per-pocket connection-independent computation; bound it;
|
||||
decide if `GhostImportance` is needed at all for the slice.
|
||||
3. **Determinism of the frozen salt.** `PinnedSalt` must be frozen deterministically + saved; the re-knot
|
||||
`DescentSalt` must never collide with a live `PinnedSalt`. No wall-clock; `TickUtil.NonZero` for any tick.
|
||||
4. **Muster-at-deepest-pin + born-correct load.** How the FSM picks the entry pocket; how load restores the
|
||||
pinned prefix born-correct (the `PendingSave`/`BaseRestoreSystem` handshake extended).
|
||||
5. **Session-only burn vs persistence.** Pinning persists (seed+deltas+lit); fuel is session-runtime only.
|
||||
Confirm the un-pin path can't soft-lock the save (loss ceiling) and can't fire offline.
|
||||
6. **Server interaction guard.** Relevancy hides only from clients; enemies act in the dark server-side.
|
||||
Confirm no exploit (e.g. a player damaged by something they were never sent) and that it reads as fiction,
|
||||
not a bug.
|
||||
7. **Prediction/teleport.** Pocket gen + relevancy are server-authored (not predicted). The transit teleport is
|
||||
server-authoritative (today's EnterRoom). Confirm no rollback issue and that predicted CC movement between
|
||||
pockets is clean.
|
||||
8. **Reuse vs rewrite scope.** Is renaming region→pocket the right salvage, or does the light-union layer
|
||||
justify a fresh relevancy system? (The review's reuse/scope lens.)
|
||||
|
||||
## Related
|
||||
|
||||
- [[Lantern_World_Model_Spike]] — the brief this answers · [[Roadmap_Lantern_Slice]] Phase 0.3 & Phase 2
|
||||
- [[Lantern_Strip_Mothball_Inventory]] — the salvage verdicts this design executes
|
||||
- [[DR-048_Lantern_Adoption_Full_Pivot]] · [[Identity_Lantern]] — the direction & the tide-line
|
||||
- [[DR-013_M6_Aether_Cycle_Region_Split]] — the region/relevancy machinery being re-keyed
|
||||
@@ -0,0 +1,91 @@
|
||||
---
|
||||
title: LANTERN — World-Model Design Spike (Phase 0.3, ★review-first)
|
||||
date: 2026-07-13
|
||||
tags: [roadmap, lantern, netcode, world-model, design-spike, phase-0, review-first]
|
||||
status: brief-review-pending
|
||||
permalink: gamevault/06-roadmap/lantern-world-model-spike
|
||||
---
|
||||
|
||||
# LANTERN — World-Model Design Spike (pocket-graph + seed-pinning)
|
||||
|
||||
> **★ REVIEW-FIRST — this is a BRIEF, not a design.** Phase 0.3 of [[Roadmap_Lantern_Slice]], adopted under
|
||||
> [[DR-048_Lantern_Adoption_Full_Pivot]]. This frames the slice's **hardest netcode problem** and its open
|
||||
> questions so the adversarial design review has a target. **No world code is written until that review
|
||||
> passes** (the standing project ritual — [[validate-netcode-design-before-coding]]). This doc feeds the
|
||||
> review; the review produces the durable Build Spec that feeds the eventual DR.
|
||||
>
|
||||
> **This gate is one of Phase 0's three exit conditions** (with the adoption DR and the A0 style-proof scene).
|
||||
> It is currently **OPEN** — the review has not been run.
|
||||
|
||||
## The problem in one sentence
|
||||
|
||||
Permanence is **territory made of light**: what a lamp holds is fixed and saved; what is dark **re-knots**
|
||||
every descent — and this must hold across 2–4 co-op clients under server authority, client prediction, and a
|
||||
per-player light-based information radius, without shipping a determinism nightmare.
|
||||
|
||||
## The design commitments to honour (from [[Identity_Lantern]])
|
||||
|
||||
- **The world is a pocket-graph** — discrete generated pockets on a graph, **not open stitched terrain**.
|
||||
- **Permanence = seed-pinning.** Dark pockets generate from a per-descent seed; **lighting one pins its seed
|
||||
and saves structure deltas.** "The dark re-knots" is a seed change, nearly free.
|
||||
- **Light is information, server-enforced.** A client is not sent entities outside its lamp radius — relevancy,
|
||||
not gamma. Dimming is a true trade (quiet for blind).
|
||||
- **Session shape:** muster at the deepest lit waypoint → Bell down → pockets → Bell recall or lit-road walk
|
||||
home; **~30–40 min hard cap**. Lighting a lantern is a save point.
|
||||
- **Loss ceiling:** the dark takes frontier *pockets*, never a whole shelf.
|
||||
|
||||
## The contract to design (the review's agenda)
|
||||
|
||||
1. **Pocket generation as a pure function of `(worldSeed, pocketId, descentSalt)`.** Deterministic, server-
|
||||
authored. The seed never needs replicating cross-client (the DR-037 feasibility insight holds: **the server
|
||||
spawns procedural content as runtime ghosts and clients just receive them** — no cross-client determinism
|
||||
problem). Question: what is `pocketId` (graph node id) and how is the graph itself generated/pinned?
|
||||
2. **Pinning = persist `seed + structure deltas`.** Lighting a waypoint-lantern writes the pocket's seed +
|
||||
its building/harvest deltas to the save. Re-entry regenerates from seed then replays deltas (the
|
||||
**born-correct** load pattern already proven in [[Lantern_Strip_Mothball_Inventory|the save rework]]).
|
||||
Question: delta granularity (full structure list vs diff), and how banked-light/Lamp state composes.
|
||||
3. **Pocket streaming / replication as runtime ghosts.** Only the current + adjacent pockets are live; a
|
||||
pocket's entities spawn as server ghosts when the party enters and despawn on exit. Reuses the
|
||||
`GhostRelevancy` (`SetIsIrrelevant`) machinery from the region split — but keyed on **pocket occupancy +
|
||||
lamp radius**, not a coordinate region. Question: the transit/handoff moment (Bell down, walk between
|
||||
pockets) and how relevancy composes with light radius without a per-tick cost blowup.
|
||||
4. **Muster / Bell transit contract.** Muster relocates to the deepest lit waypoint; the Bell is the
|
||||
depth-lock transit. Reuses the run/room lifecycle state machine ([[Lantern_Strip_Mothball_Inventory]]).
|
||||
Question: co-op semantics (does the whole party transit together? partial-party descents?).
|
||||
5. **Light-as-information relevancy.** Per-player lamp radius drives what is replicated to that client. This
|
||||
is the Phase-1 "relevancy-light prototype" — the ★review-first item flagged there too. Question: is this
|
||||
the SAME mechanism as pocket streaming or a second layer on top, and how do they interact.
|
||||
|
||||
## Known hazards the review must attack (from CLAUDE.md + prior DRs)
|
||||
|
||||
- **Relevancy cull re-audit:** a 2nd concept sharing an existing tag has repeatedly wiped/blocked cross-region
|
||||
state (DR-031, DR-040). Any pocket/light relevancy scheme must re-audit every query/cull over the tag.
|
||||
- **Shared GLOBAL state rides an UNTAGGED ghost** (never a relevancy-tagged one) — the Lamp meter, campaign
|
||||
readout, party Loudness must stay relevant everywhere.
|
||||
- **Prediction determinism:** no wall-clock / `Time.deltaTime` / `System.Random` in predicted sim; pocket gen
|
||||
is server-authored (not predicted). Tick sentinels through `TickUtil.NonZero`.
|
||||
- **Per-tick relevancy cost:** the region relevancy system already needs cosmetic props to be non-ghost;
|
||||
light-radius relevancy recomputed per player per tick is a cost the review must bound.
|
||||
- **Save additivity:** seed-pin schema must be additive/versioned (`[MinLoadableVersion, Current]`) so old
|
||||
saves load.
|
||||
|
||||
## Explicit non-goals for the spike
|
||||
|
||||
Not designing: the full v1.0 severable fuel-net, the doppelganger relocation AI, shelf-regression, or open
|
||||
terrain (cut). The spike designs **the slice's** pocket-graph + pinning + streaming + transit only.
|
||||
|
||||
## Status & next action
|
||||
|
||||
**OPEN.** Next action (not doc work): run the **adversarial design-review Workflow** (lenses:
|
||||
netcode/relevancy · determinism/prediction · reuse/scope → adversarial critics → synthesis) over this brief +
|
||||
the ground-truth relevancy/lifecycle/save code, producing `World_Model_Build_Spec.md`. Only then does any
|
||||
world code begin (Phase 2 in the roadmap; Phase 1's combat gym has **no world** and is not blocked by this).
|
||||
|
||||
## Related
|
||||
|
||||
- [[Roadmap_Lantern_Slice]] — Phase 0.3 (this) and Phase 2 (the dark & the pocket-graph, which this gates)
|
||||
- [[DR-048_Lantern_Adoption_Full_Pivot]] — the adoption
|
||||
- [[Lantern_Strip_Mothball_Inventory]] — the relevancy/lifecycle/save salvage this reworks
|
||||
- [[Identity_Lantern]] — the world-model commitments (the tide-line)
|
||||
- [[DR-013_M6_Aether_Cycle_Region_Split]] — the region/relevancy machinery being reworked
|
||||
- [[validate-netcode-design-before-coding]] — the ritual this doc sets up
|
||||
@@ -6,8 +6,9 @@ updated: 2026-06-13
|
||||
permalink: gamevault/06-roadmap/milestones
|
||||
---
|
||||
|
||||
> [!warning] SUPERSEDED as the operative plan (2026-07-06 Co-op Hades conversion, banner added 2026-07-07).
|
||||
> Current direction + phases: [[Iteration_2026-07_CoopHades]]. This doc is kept as history.
|
||||
> [!warning] SUPERSEDED as the operative plan. Now **LANTERN** (2026-07-13, [[DR-048_Lantern_Adoption_Full_Pivot]]).
|
||||
> Current direction: [[Roadmap_Lantern_Slice]]. (Intermediate history: the 2026-07-06 Co-op Hades conversion,
|
||||
> [[Iteration_2026-07_CoopHades]].) This doc is kept as history.
|
||||
|
||||
# Milestones
|
||||
|
||||
|
||||
@@ -6,13 +6,14 @@ tags:
|
||||
- economy
|
||||
- endgame
|
||||
- north-star
|
||||
status: active
|
||||
updated: 2026-06-24
|
||||
status: superseded
|
||||
updated: 2026-07-13
|
||||
permalink: gamevault/06-roadmap/path-to-fun
|
||||
---
|
||||
|
||||
> [!warning] SUPERSEDED as the operative plan (2026-07-06 Co-op Hades conversion, banner added 2026-07-07).
|
||||
> Current direction + phases: [[Iteration_2026-07_CoopHades]]. This doc is kept as history.
|
||||
> [!warning] SUPERSEDED (2026-07-13, [[DR-048_Lantern_Adoption_Full_Pivot]]).
|
||||
> The project pivoted to **LANTERN** — operative roadmap [[Roadmap_Lantern_Slice]], design [[Identity_Lantern]].
|
||||
> This north-star doc (and the Co-op Hades plan that first superseded it, 2026-07-06) are **kept as history**.
|
||||
|
||||
# Path to Fun — the north-star roadmap
|
||||
|
||||
|
||||
@@ -0,0 +1,77 @@
|
||||
---
|
||||
date: 2026-07-13
|
||||
type: session
|
||||
tags: [session, lantern, pivot, phase-0, docs]
|
||||
permalink: gamevault/07-sessions/2026/2026-07-13-lantern-phase0-adoption-pivot
|
||||
---
|
||||
|
||||
# Session 2026-07-13 — LANTERN Phase 0: adoption & the full docs/skills pivot
|
||||
|
||||
## Goal
|
||||
|
||||
Start Phase 0 of the LANTERN roadmap ([[Roadmap_Lantern_Slice]]): **make the full pivot** — adopt LANTERN as
|
||||
the operative direction and update **all docs & skills** to reflect it, plus deliver the Phase-0 items that are
|
||||
documentation work. No code this session (the pivot is a direction adoption; implementation starts at Phase 1).
|
||||
|
||||
## Done
|
||||
|
||||
**Phase 0 checklist items (doc portions):**
|
||||
- **0.1 Adoption** — wrote [[DR-048_Lantern_Adoption_Full_Pivot]] (LANTERN supersedes the Awakening-Engine
|
||||
fiction + the Co-op Hades iteration; archive-not-delete; existing code = quarry; mechanical pillars hold).
|
||||
- **0.2 Strip/mothball** — wrote [[Lantern_Strip_Mothball_Inventory]]: system-by-system keep / rework /
|
||||
mothball / cut, grounded in [[Systems_Index]] + the co-op-Hades systems. Headlines: combat feel + telegraphs
|
||||
= keep; boon pipeline → mutations; regions-relevancy / lifecycle / save → rework; automation +
|
||||
sieges/Core/turret = mothball.
|
||||
- **0.3 World-model spike** — wrote [[Lantern_World_Model_Spike]] as a **★review-first BRIEF** (pocket-graph +
|
||||
seed-pinning + light-as-information relevancy + Bell transit contract, with the open questions + known
|
||||
hazards for the review). Marked review-PENDING; no world code until the adversarial review passes.
|
||||
- **0.4 Art A0** — wrote [[Art_Direction_Lantern]]: the binding style bible, **the material decision** (one
|
||||
palette atlas + vertex colours under three master shaders `Lit-Palette`/`Emissive-Gloam`/`Skinned-Palette`),
|
||||
the reference board, and the style-proof-scene gate definition. The in-engine scene itself = pending.
|
||||
|
||||
**"Update all docs & skills" sweep:**
|
||||
- [[Pillars]] — LANTERN direction banner up top + a LANTERN locked-decisions block; Related repointed to
|
||||
[[Identity_Lantern]] (prior [[Identity]] marked superseded/quarry).
|
||||
- Superseded banners → [[Identity]], [[Iteration_2026-07_CoopHades]], [[Path_to_Fun]] (redirected straight to
|
||||
LANTERN; `status: active`→`superseded`). Kept as history; nothing deleted.
|
||||
- [[Home]] MoC — current-direction callout = LANTERN; vision/roadmap/session/decision pointers refreshed; the
|
||||
stale "serena navigates C# symbols" line fixed to Glob/Grep (serena removed 07-07).
|
||||
- [[Systems_Index]] — era note: the catalogued systems are the pre-pivot spine = quarry, verdicts in the
|
||||
inventory.
|
||||
- `CLAUDE.md` — the "Core loop" bootstrap bullet replaced with a **LANTERN direction pointer** (net-neutral:
|
||||
39,684→39,681 B, under the 40 KB budget); the verbose DR-044/045/046 core-loop invariants archived verbatim
|
||||
to `_Meta/CLAUDE_Build_Gotchas_Archive.md` under a new 2026-07-13 heading (the general "serialized prefab
|
||||
bool ignores the C# initializer" gotcha kept inline). Condensation-history line ticked.
|
||||
- `dots-dev` skill — `references/validation-harness.md`: noted the "expedition-run" driving recipe's nouns are
|
||||
co-op-Hades-era (re-meaned to the descent lifecycle later); the harness *patterns* stay direction-agnostic.
|
||||
The rest of the skill is process-only and needed no pivot.
|
||||
- Native memory — new [[lantern-direction-pivot]] operative-direction note + `MEMORY.md` index; the prior
|
||||
direction memory kept with a supersession pointer.
|
||||
|
||||
## Decisions
|
||||
|
||||
- [[DR-048_Lantern_Adoption_Full_Pivot]] — LANTERN is the operative direction (Phase 0.1 gate closed).
|
||||
|
||||
## Open / deferred (explicitly flagged — NOT silently deferred)
|
||||
|
||||
Two Phase-0 items are **not** doc work and remain OPEN gate conditions:
|
||||
1. **0.3 world-model design review** — the ★review-first adversarial Workflow over [[Lantern_World_Model_Spike]]
|
||||
+ ground-truth relevancy/lifecycle/save code, producing `World_Model_Build_Spec.md`. This is the slice's
|
||||
hardest netcode problem; no world code until it passes.
|
||||
2. **0.4 A0 style-proof scene** — one prop + one creature + one suit in-engine under murk, judged full-size +
|
||||
200 px + grayscale. Requires Blender + engine work (Workstream A0 gate).
|
||||
|
||||
Phase 0 does not fully exit until both land. Phase 1 (the combat gym) has **no world** and is not blocked by
|
||||
0.3 — it can start on the KEEP/rework salvage once the operator chooses.
|
||||
|
||||
## Next
|
||||
|
||||
Operator fork: (a) run the **0.3 world-model design-review Workflow** now, or (b) start the **0.4 style-proof
|
||||
scene** (Blender on-ramp), or (c) begin **Phase 1 combat gym** planning from the salvage inventory. Recommend
|
||||
(a) since it unblocks all world-touching work and is the standing review-first ritual, with (b) proceeding in
|
||||
parallel on the art track.
|
||||
|
||||
## Related
|
||||
|
||||
- [[Roadmap_Lantern_Slice]] · [[Identity_Lantern]] · [[Lantern_Strip_Mothball_Inventory]] ·
|
||||
[[Lantern_World_Model_Spike]] · [[Art_Direction_Lantern]] · [[DR-048_Lantern_Adoption_Full_Pivot]]
|
||||
@@ -0,0 +1,94 @@
|
||||
---
|
||||
id: DR-048
|
||||
title: LANTERN adoption — the full pivot (supersedes Awakening Engine + Co-op Hades)
|
||||
status: accepted
|
||||
date: 2026-07-13
|
||||
tags: [decision, direction, lantern, pivot, adoption]
|
||||
permalink: gamevault/07-sessions/decisions/dr-048-lantern-adoption-full-pivot
|
||||
---
|
||||
|
||||
# DR-048 — LANTERN adoption: the full pivot
|
||||
|
||||
## Context
|
||||
|
||||
The 2026-07-13 vision refresh ([[Theme_Direction_Candidates]]) explored four load-bearing-theme
|
||||
directions against the operator brief (**V Rising + Shape of Dreams** core; SoD-grade skillshot combat +
|
||||
modular ability kits braided with a persistent base; 2–4 co-op; solo dev learning Blender, RoR2-lineage
|
||||
low-poly). The operator selected **Direction A — LANTERN** and put a full identity draft through **three
|
||||
independent adversarial reviews** (theme/narrative · systems/game-loop · player-experience/market). All
|
||||
findings were operator-accepted and folded into the review-hardened final draft [[Identity_Lantern]] (v3),
|
||||
with the vertical-slice roadmap [[Roadmap_Lantern_Slice]].
|
||||
|
||||
This forces a direction decision: the codebase and vault were built under **The Awakening Engine**
|
||||
(Aether-colony sci-fi fiction, [[Identity]] / [[DR-015_The_Awakening_Engine_Fiction_Adoption]]) and most
|
||||
recently steered by the **Co-op Hades conversion** iteration ([[Iteration_2026-07_CoopHades]], which
|
||||
itself superseded the DR-037 → DR-042 expedition-driven line and the DR-035 end-of-month jam slice). LANTERN
|
||||
keeps every locked **mechanical** pillar ([[Pillars]] #1–4 hold) but replaces the **fiction, the world
|
||||
model, the death rules, the build/mutation system, and the combat feel target**. It is not a reskin — under
|
||||
LANTERN's own load-bearing test, reskinning "light" would break persistence, death, relevancy, the economy,
|
||||
and the treadmill at once. This is a genuine change of direction, so it is recorded as one.
|
||||
|
||||
## Decision
|
||||
|
||||
**LANTERN is the operative direction.** [[Identity_Lantern]] is the authoritative design; [[Roadmap_Lantern_Slice]]
|
||||
is the operative roadmap. This DR is the **adoption gate** (Phase 0.1 of that roadmap).
|
||||
|
||||
1. **Supersession (archive, never delete).** LANTERN supersedes, as the *operative target*:
|
||||
- the Awakening-Engine fiction — [[Identity]] / [[DR-015_The_Awakening_Engine_Fiction_Adoption]];
|
||||
- the Co-op Hades iteration — [[Iteration_2026-07_CoopHades]];
|
||||
- and by transitivity the direction line it carried (DR-037 expedition spine → DR-042 expedition-driven
|
||||
win → DR-044/045/046 demo passes → DR-047 boon overhaul).
|
||||
All of it is **kept as history and as salvage quarry** — banners point forward, nothing is removed. Prior
|
||||
DRs stay valid as records of what was built and why.
|
||||
|
||||
2. **Existing code is quarry, not foundation.** Strip and reuse freely; no design decision bends to preserve
|
||||
code. The system-by-system keep / rework / mothball calls live in [[Lantern_Strip_Mothball_Inventory]]
|
||||
(Phase 0.2). Headline calls, from the roadmap's standing constraints: **combat feel layer + telegraphs =
|
||||
keep**; **boon pipeline = rework into wild mutations**; **regions/relevancy, save system, hub lifecycle =
|
||||
rework**; **sieges / Core / turret-ammo economy leftovers = mothball**.
|
||||
|
||||
3. **The mechanical pillars hold; the fiction and three subsystems change.** Unchanged: Unity DOTS +
|
||||
Netcode for Entities, server-authoritative, input-only clients, client prediction, 2–4 co-op
|
||||
([[Pillars]]). Changed by LANTERN: (a) **world model** → seed-pinned **pocket-graph** with light-as-
|
||||
permanence (the tide-line); (b) **combat feel** → SoD-grade **manual-aim skillshots** (the soft
|
||||
auto-target era ends as the target — see the pillars note); (c) **build system** → suit-frames + cultured
|
||||
**Sparks** + wild **mutations** (the augment layer), replacing flat-stat boons.
|
||||
|
||||
4. **The slice's falsifiable test is the only gate that matters:** *does pinning a pocket feel like winning
|
||||
something, and does a stranded suit feel worth a second descent?* Every deferred system is justified only
|
||||
by these two.
|
||||
|
||||
5. **Phase 0 exit is NOT this DR alone.** The roadmap gates Phase 0 on **three** things: this DR merged **+**
|
||||
the world-model design review passed ([[Lantern_World_Model_Spike]], ★review-first — not yet run) **+**
|
||||
the A0 style-proof scene approved in-engine ([[Art_Direction_Lantern]], gate pending). This DR closes only
|
||||
0.1; 0.2 (inventory) is delivered; **0.3 and 0.4's in-engine gates remain open.**
|
||||
|
||||
## Consequences
|
||||
|
||||
- **Naming.** Working title "LANTERN" has poor Steam-search uniqueness; a shipping-title pass is deferred to
|
||||
a marketing milestone (per [[Identity_Lantern]]). "LANTERN" is the internal codename until then.
|
||||
- **Vault surface updated this session (Phase 0 pivot):** [[Pillars]] (pointer + LANTERN locked decisions),
|
||||
[[Identity]] + [[Iteration_2026-07_CoopHades]] + [[Path_to_Fun]] (superseded banners), [[Home]] (MoC +
|
||||
current direction), [[Systems_Index]] (era note), `CLAUDE.md` (game-state/core-loop line → LANTERN pivot
|
||||
pointer; verbose co-op-Hades invariants archived to `_Meta/CLAUDE_Build_Gotchas_Archive.md`). Prior DRs and
|
||||
session logs are **not** rewritten — they are the record.
|
||||
- **basic-memory** reindexes this DR and the new roadmap/vision docs on next index; native `memory/`
|
||||
gets the [[lantern-direction-pivot]] operative-direction note. The old direction memory is kept as history.
|
||||
- **What does NOT change yet:** no world code, no fiction rename in code, no ghost/RPC churn. The pivot is a
|
||||
documentation + direction adoption; implementation begins at Phase 1 (combat gym) and only after the Phase 0
|
||||
world-model review passes for anything world-touching.
|
||||
- **Revisit when:** the slice test fails on either half (pinning doesn't feel like winning, or a stranded suit
|
||||
doesn't pull a second descent) — that invalidates the direction, not a subsystem, and triggers a fresh
|
||||
fork-locking ritual. Also revisit the "crews present-but-unlit vs gone" and shipping-title open forks at the
|
||||
narrative/marketing milestones.
|
||||
|
||||
## Related
|
||||
|
||||
- [[Identity_Lantern]] — the design this adopts (authoritative)
|
||||
- [[Roadmap_Lantern_Slice]] — the operative roadmap (this is its Phase 0.1)
|
||||
- [[Lantern_Strip_Mothball_Inventory]] — Phase 0.2, the salvage map
|
||||
- [[Lantern_World_Model_Spike]] — Phase 0.3, ★review-first (gate open)
|
||||
- [[Art_Direction_Lantern]] — Phase 0.4 / Workstream A0 (in-engine gate open)
|
||||
- [[Theme_Direction_Candidates]] — the exploration that produced the fork
|
||||
- [[Identity]] · [[Iteration_2026-07_CoopHades]] · [[DR-047_Phase17_Boon_Overhaul_Mechanic_Changers]] — superseded as operative, kept as quarry
|
||||
- [[Pillars]] — the mechanical constraints LANTERN was shaped inside (unchanged)
|
||||
@@ -463,3 +463,11 @@ CLAUDE.md was chronically saturated (39.9–40.2 KB for a week; every gotcha add
|
||||
- **Core loop = ready-check multi-room RUNS ★ (DR-044; DR-031/042 base-mining text archived 07-04):** base = pure SPEND hub (no base nodes; `Tuning.StartingOre` grubstake). `RunDirectorSystem` = sole `RunInfo` writer (`[UpdateBefore(CyclePhaseSystem)]`; NOTHING else in the room chain touches CyclePhase); banks Charge+retaliation once-per-`RunEpoch` on boss-clear ONLY; strips the boon band + every `BoonOffer` on exit; teleports ONLY launch-stamped **`RunParticipant`s** (released on Returning — dead-respawned re-conscript, late joiners stay home). Rooms spawn per `RoomEpoch` at ping-pong sub-slots, `RoomTag`-torn-down; first slot waits `Tuning.RoomEntryGraceTicks`. ★ a serialized prefab bool ignores the C# initializer — flip `CycleDirector.prefab`. **Demo (DR-045/046): `GoalProgress.Target`=2; `Health.Max` now `[GhostField]` (boss + enemy HP bars). Boss = scaled Charger + server-only `BossState` kit (sole `BossAISystem` mover: SLAM/phase-2 summon/knockback-immune). Grunt windup commits ~last 30%; Charger stagger + Spitter cornered-hold. Rooms gate on a PORTAL (`RunLifecycle.RoomExplore=6` loot window; `PortalInteractRequest`→server `PortalCommand`; empty expedition advances now); class picked + per-run PREP buffs spent at base each run (Staging-gated RPCs via the shared `ClassSwapUtil`; disjoint prep `StatModifier` band stripped on Returning).** See [[DR-044_Expedition_Redesign_Shipped_Demo_Polish]] · [[DR-045_Combat_Demo_Feel_Boss_Fight]] · [[DR-046_Base_Expedition_Ties_Portal_Class_Prep]].
|
||||
|
||||
Also this pass (earlier, same session): four stale netcode "1.13.2" stamps corrected to 6.5.0 (CreateLocalWorld is now PUBLIC — reflect-verified; NetCodeTestWorld still effectively unavailable), the dead `~/.claude/skills` path fixed to the in-repo skill, and the ctx7 netcode pin re-annotated (no 6.x docs set exists as of 07-07).
|
||||
|
||||
## 2026-07-13 — LANTERN pivot: co-op-Hades core-loop bullet archived (pays the direction pointer)
|
||||
|
||||
The project pivoted to **LANTERN** ([[DR-048_Lantern_Adoption_Full_Pivot]]; design [[Identity_Lantern]], roadmap [[Roadmap_Lantern_Slice]]). The co-op-Hades run-loop code is now **salvage quarry** ([[Lantern_Strip_Mothball_Inventory]]), not the operative direction, so its verbose CLAUDE.md core-loop bullet was condensed to a one-line direction pointer. The DR-044/045/046 invariants stay TRUE of the live code while it exists as quarry — preserved here verbatim (the pre-pivot CLAUDE.md "Core loop" bullet):
|
||||
|
||||
- **Core loop = ready-check multi-room RUNS ★ (DR-044/045/046):** base = pure SPEND hub. `RunDirectorSystem` = sole `RunInfo` writer (`[UpdateBefore(CyclePhaseSystem)]`; nothing else in the room chain touches CyclePhase); banks Charge+retaliation once-per-`RunEpoch` on boss-clear ONLY; strips the boon band + `BoonOffer`s on exit; teleports ONLY launch-stamped `RunParticipant`s (released on Returning). Rooms spawn per `RoomEpoch`, `RoomTag`-torn-down, gate on a PORTAL (`RunLifecycle.RoomExplore=6` loot window; `PortalInteractRequest`→server `PortalCommand`). Class + per-run PREP spent at base (Staging-gated RPCs via shared `ClassSwapUtil`; prep `StatModifier` band stripped on Returning). `Health.Max` is a `[GhostField]`. Boss = server-only `BossState`/`BossAISystem` (sole boss mover). ★ **a serialized prefab bool ignores the C# initializer — flip the value in the prefab.** Feel/tuning detail → [[DR-044_Expedition_Redesign_Shipped_Demo_Polish]] · [[DR-045_Combat_Demo_Feel_Boss_Fight]] · [[DR-046_Base_Expedition_Ties_Portal_Class_Prep]].
|
||||
|
||||
The general gotcha "a serialized prefab bool ignores the C# initializer — flip the value in the prefab" is kept inline in CLAUDE.md (broadly applicable beyond this loop).
|
||||
|
||||
Reference in New Issue
Block a user