--- 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