A0: all 3 master shaders now present (Emissive-Gloam authored as HLSL w/ in-shader flicker). A1: skinned recipe proven for a LANTERN creature (EnemyRigTools.BuildDrowner -> EnemyDrowner.prefab); in-game animated run + custom-kit reattach + suit/2nd-creature still open. Flags the Generic-vs- Humanoid rig-type discrepancy vs CLAUDE.md to reconcile. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
23 KiB
title, date, tags, permalink
| title | date | tags | permalink | |||||
|---|---|---|---|---|---|---|---|---|
| LANTERN Vertical Slice — high-level implementation roadmap | 2026-07-13 |
|
gamevault/06-roadmap/roadmap-lantern-slice |
LANTERN Vertical Slice — Implementation Roadmap (high level)
Implements the slice tier of Identity_Lantern (final draft, review-hardened). High-level by design — a second pass will deepen each phase technically (per-phase design reviews, DOTS/netcode verification) as it comes up. No time estimates (operator directive). Supersedes Iteration_2026-07_CoopHades as the operative direction once the adoption DR lands.
The slice's falsifiable test (the only gate that matters): does pinning a pocket feel like winning something, and does a stranded suit feel worth a second descent?
Two tracks run in parallel: the system phases (0–7) and Workstream A (art, modeling & visual direction) — a first-class track with its own gates, because this direction lives or dies on custom creatures/characters made by one person. Each system phase names its asset needs; Workstream A names how they get made.
Standing constraints
- Stack unchanged: Unity DOTS + Netcode for Entities, server-authoritative, input-only clients, client prediction, 2–4 co-op (Pillars #4 holds).
- Existing code is quarry, not foundation: strip/reuse freely (combat feel layer, ability plumbing, hub/run lifecycle, save system are all candidate salvage), but no design decision bends to preserve code.
- Netcode-heavy slices get an adversarial design review BEFORE coding (the standing project ritual). Flagged ★ per phase.
- Every phase ends with a play-gate, not a test count.
- Placeholder-first, art-pass-second: every system phase may ship its gate on kitbash/greybox placeholders; Workstream A replaces them on its own cadence. Systems never wait on art; art never blocks a gate.
Phase 0 — Adoption & groundwork
- Adoption DR — LANTERN supersedes the Awakening Engine identity + the Co-op Hades iteration; old fiction/lexicon archived, not deleted. Update Pillars pointers; CLAUDE.md game-state note.
- Strip/mothball pass — inventory current systems into keep / rework / mothball against the slice list (combat feel layer + telegraphs: keep; boon pipeline: rework into mutations; regions/relevancy, save system, hub lifecycle: rework; sieges/economy leftovers: mothball).
- World-model design spike ★review-first — the pocket-graph + seed-pinning contract: pocket generation as a pure function of (seed, pocket-id); pinning = persist seed + structure deltas; pocket streaming/replication as runtime ghosts; muster/Bell transit contract. The slice's hardest netcode problem — design before any world code.
- Art direction lock = Workstream A0 (below) — runs inside this phase; its style-proof gate is part of this phase's exit.
Gate: DR merged; world-model design review passed; A0 style-proof scene approved.
Phase 0 status (updated 2026-07-14): ✅ 0.1 adoption (DR-048_Lantern_Adoption_Full_Pivot) · ✅ 0.2 strip/ mothball (Lantern_Strip_Mothball_Inventory) · ✅ 0.3 world-model design review passed → World_Model_Build_Spec + DR-049_Lantern_World_Model_Design · ◑ 0.4 A0 — material spec + recipes written (Art_Direction_Lantern + Lantern_Art_Pipeline_Recipes) AND the in-engine style-proof scene is BUILT (
Assets/Scenes/ArtStaging.unity): the prop + creature + suit triad (crate · Wisp-flora · Drowner · Bathynaut) baked in under murk + "light is territory" pool lighting + caustics/marine-snow/seabed, judged full-size / 200px / grayscale from the game camera. Remaining for the gate: operator sign-off (+ the 3 master ShaderGraphs, still stand-ins). Driven by the new/art-devskill + the hybrid nudge-and-bake workflow. Phase-1 design is ready (Lantern_Phase1_Combat_Gym_Build_Spec); operator decisions parked in Lantern_Operator_Questions.
Phase 1 — Combat core: two frames that feel like Shape of Dreams
The primary verb first. No world, no lanterns — a gym.
- Bathynaut (anchor-and-crash melee) + Harpooner (line-and-iron skillshots incl. reel/drag) as suit-frames — chassis verbs, movement feel, dash.
- Skillshot kit plumbing: 4 socket slots per frame; cooldown/telegraph/aim grammar to the SoD bar (manual aim, real windups, readable hitboxes).
- First 4–5 Sparks as socketables (decoy-wisp, hook/pull, vortex, blink, one zone) — enough to prove kit variety.
- Light-as-information prototype ★review-first: per-player lamp radius drives netcode relevancy (entities outside your light aren't replicated); dim/bright as the quiet/blind trade.
- Underwater feel pass: buoyant knockbacks, slow debris, murk fog, hydrophone audio sketch.
Asset needs: 2 suit-frames (first-pass: humanoid-pipeline kitbash), Spark VFX set (procedural + palette), gym props. Pipeline dependency: A1 runs alongside this phase.
Gate: the gym is fun with two players for 15 minutes on kit alone; relevancy-light verified server-side (gamma test: nothing to see).
Phase 2 — The dark & the pocket-graph
- Twilight shelf as a pocket-graph: 3–5 generated dark pockets per descent on a graph; seed-fresh re-knot per descent; pocket transitions.
- Descent lifecycle: muster at the Lamp → Bell down → pockets → Bell recall or lit-road walk home; ~30–40 min hard session cap.
- Enemy roster v1: Drowners (melee swarm), Grindylow packs (leapers), Wreckers (gloam-casters with counterfeit beacons + scan counter), Wisp-Choir as first named encounter.
- Brighter-is-louder: party Loudness sum drives spawn/aggro pressure; per-Wick Loudness pips on HUD.
- Harvest: Lumen nodes, organ drops, carried-vs-banked cargo distinction.
Asset needs: 4 creatures (Drowner, Grindylow, Wrecker, Wisp-Choir — the A2 creature-factory proving ground), Lumen node family, pocket dressing set (rocks, wrecks, glow-flora), Bell.
Gate: two consecutive descents feel different (re-knot working); the Wrecker fake-beacon moment lands on a first-time player.
Phase 3 — The tide-line: lanterns, pinning, permanence
- Plantable, hand-fed waypoint-lanterns: planting pins the pocket (seed + deltas persisted); lit pockets persist across descents and sessions; muster moves to the deepest lit waypoint.
- Session-only burn: fuel drains only while a session runs; guttering telegraphs long and loud before the dark un-pins a pocket.
- Banked light: deposit at any lit lantern = home; the Lamp meter brightens the station visibly.
- Building v1 (minimal): a small buildable set inside lit pockets — enough to make a pinned pocket feel owned (the slice test hinges here).
Asset needs: the waypoint-lantern family (unlit/lit/guttering states — a hero prop; light states do the acting), small buildable set, fuel/feeding VFX.
Gate: ★ pinning a pocket feels like winning something — playtest-judged, the first half of the slice test.
Phase 4 — Sparks, mutations & the homecoming economy
- Culture library: first organ home = permanently cultured; grafts regrow cheaply from culture (death-proof knowledge floor).
- Wild mutations: Sparks drink Gloam; 2 paced thresholds per descent offering 2–3 warps, at pocket-clear beats only; mutations evaporate at homecoming.
- Tallow fixing: 1 fix slot per Spark; the scripted first-evaporation beat (Keeper names the rule, gifts one Tallow).
- Raw-socketing: wield a fresh organ wild (over-tuned, temporary) vs. bag it for culturing.
- Fill the Spark catalog to 8–10.
Asset needs: organ/pickup mesh family (blobby, emissive — early Blender wins), graft-socket UI, mutation VFX variants (palette/param variants on Spark VFX, not new effects).
Gate: two consecutive descents produce visibly different builds from the same kit; the evaporation beat reads as a gift, not a theft.
Phase 5 — Death, recovery & the solo valve
- The split: flame returns (rack-spare respawn, cheap regrow); cargo + fixed mutations + raw organs strand with the suit at its death site.
- Recovery: stranded suits persist across descents (deterministic server relocation, never RNG); ally body-carry; carried suits stay loud; one-suit debt cap; party wipe drifts suits one pocket shallower.
- Guttering + flame-share revive (giver pays flame).
- Selkie tariff (menu-level for the slice).
- Solo Tender dive-companion: drags guttering suits toward light, hauls cargo, holds a lantern's feed.
Asset needs: stranded-suit prop states (dark/claimed/carried), the Tender companion (small, characterful — a hero-adjacent model worth real time), carry/revive VFX.
Gate: ★ a stranded suit feels worth a second descent — the second half of the slice test; solo death is a story, not a rage-quit.
Phase 6 — The finale: shelf-boss + the scripted tide
- Shelf-boss (Twilight's warden): a real multi-phase skillshot fight; drops the slice's signature Spark + a schematic beat.
- One scripted Serpent-tide as the slice climax: forecast by the Siren, targeting the party's planted lantern — defend it or lose the pin.
- Difficulty/co-op scaling pass (1–4 players; Loudness carries most of it).
Asset needs: the shelf-boss (the slice's hero creature — silhouette-first, budgeted real modeling time), tide VFX language (the dark moving as weather).
Gate: the tide finale generates the clip — a party defending their own light and telling the story afterward.
Phase 7 — The station & the voices
Runs parallel with 4–6 where possible.
- The Last Lantern hub: Lamp (meter + radius), rack, graft-bench, culture library, Bell — each a physical place.
- The Keeper (text-first, subtitle lines): tutorializes the loop, the split, the evaporation gift; evasive-warm register per the tone bible.
- The Siren: descent forecast at the Bell + hydrophone bleed mid-descent + the tide forecast.
- Lamp-morse: ping wheel, revive plea, greeting — procedural chirp audio.
- Tone bible (one page, register bounds per character) before any bark generation.
Asset needs: station set (Mother-Lamp as the hero set-piece whose brightness IS the campaign readout, Bell, rack, benches), the Siren's bell-tank vignette.
Gate: a new player completes first descent → death → recovery → pin with no external explanation; the hub reads as a home, not a menu.
Workstream A — Art, Modeling & Visual Direction (first-class track)
One developer, learning Blender (blendermcp + tooling), shipping custom models, characters, and enemies. The workstream's product is not just assets — it is a repeatable factory such that creature N+1 is a routine sitting, not a research project. Gates are real; the deeper technical pass will spec each stage.
A0 — Art direction lock (runs inside Phase 0)
- Style bible (one page, binding): stylized low-poly, RoR2-lineage. Silhouette-first; faceted geometry; flat/near-flat shading; mood carried by dynamic light in murk. Poly budgets: props ≤ ~800 tris · creatures ≤ ~3k · hero/boss/suits ≤ ~6k. The Identity_Lantern#Art, audio & the readability law (value-first, flicker-cadence, 200px rule) applies to every asset from day one.
- The material decision (the solo-dev keystone): no per-asset texturing, ever. One shared palette/gradient atlas (Imphenzia-style: a single small texture of color bands; UVs are placed, not unwrapped) + vertex-color accents, under three master shaders:
Lit-Palette(statics),Emissive-Gloam(parameterized warm/cold/lure emissive — one shader is the whole palette rule),Skinned-Palette(deformation-aware for creatures/suits). Every asset in the game shares ~3 materials: coherence, batching, and zero texture-painting skill required. - Reference board: RoR2 (shape language), Dredge (water mood), Hollow Knight (value control in dark), Below (the cautionary legibility case).
- Style-proof scene (the gate): one prop + one creature + one suit, in-engine, under murk + dynamic lights, on the capture grade — judged full-size AND at 200 px AND in grayscale. Locked before any mass production.
A0 progress (2026-07-14) — style-proof scene BUILT, awaiting operator sign-off. Palette atlas + 3 shared materials shipped earlier; this session added the full triad + the in-engine staging scene:
- Assets (Blender,
ArtSource/Blender/):Prop_CargoCrate(92 tris, statics/palette proof) ·Prop_GlowFlora(380, cold-teal emissive clutter) ·Creature_WispMote(110, Drifter gloam-wisp) ·Creature_Drowner(2.7k, Synty-crew Strider kitbash — gloam-tinted, hunched, glowing eyes) ·Suit_Bathynaut_Kitbash(~9k ⚠ over the ≤6k hero budget — decimate + pick body-or-armour for game-ready). Palette-atlas single-material + emissive throughout; Synty kitbashes (licensed). Suit/creatures are posed silhouette concepts, not yet rig-bound for animation.- In-engine (
Assets/Scenes/ArtStaging.unity): prop+creature+suit baked in (glTFast posed statics) under the A0 conditions — undulating seabed (no platform edge), caustics cookie, marine-snow particles, teal depth fog, ACES+bloom+vignette capture grade, and the "light is territory" pool lighting (warm beacon = ours, cold bioluminescent flora pools = the deep, deep dark between) + a Play-mode ambiance animator (StagingAmbiance). Passes the three-way judge: full-size, 200px, and grayscale (warm/cold separated by value + flicker-cadence, not hue alone — the colorblind-safe read). ⚠ Vertical god-rays don't read down a top-down camera — ground pools do (recorded in the Lantern_Art_Pipeline_Recipes //art-devcookbook).- Master shaders — all 3 now present:
Lit-Palette(theLit URPgraph) +Skinned-Palette(AnimatedLitShader, Rukhanka-deformation) already existed;Emissive-Gloamauthored this pass as a hand-written URP shader (ProjectM/EmissiveGloam,Assets/_Project/Shaders/) with the flicker-cadence as a material param (_FlickerAmount0=steady/true, >0=gutter/false) — in-shader, no script. (ShaderGraph can't be authored via the MCP; HLSL is the better home for the flicker anyway.) The staging warm/cold read now separates by value + flicker-cadence, not hue alone (passes the grayscale/colorblind check).
A1 — Pipeline proof (runs alongside Phase 1)
- Two written recipes, checklist-grade (this project runs on distilled gotchas; the art pipeline gets the same treatment):
- Statics: Blender → export (units/scale settings) → collider policy → entity baking → palette material. Target: minutes per prop.
- Skinned: Blender rig → per-action clips (Key All Bones, bake to pose) → FBX → animation-system ingest →
Skinned-Palettematerial → prefab. Every step scripted or checklisted via blendermcp where possible.
- The three rig families (the amortization decision): every slice creature maps onto one shared armature family, so clips are made per family, not per creature:
- Drifter — spine-chain swimmer (Wisp-Choir motes, lure-fish, later serpents/rays): swim-idle, dart, attack, death-sink.
- Crawler — legged/scuttling floor unit (Grindylow, later kappa-kin/Tenders): skitter, leap, attack, death.
- Strider — biped-ish (Drowner, Wrecker, and the suit-frames themselves): walk, windup, attack, death.
- Clip budget: 4–5 clips per family (idle/move/windup/attack/death) + per-creature attack accents only where identity demands.
- Suit-frames, pragmatic path: first pass = kitbash on the existing humanoid pipeline (helmet/tank/plate swaps over a proven rig); custom Wick silhouette sculpt is an A3 upgrade, not a Phase-1 blocker.
- Procedural assists: geometry nodes for glow-gardens/coral/tube-worm sets (parametric families, not hand-modeled instances); blendermcp scripts for the repetitive export/import steps.
Gate: one creature goes cube → rigged → animated → fighting in-game in a single documented sitting — twice (repeatability is the gate, not beauty).
A1 progress (2026-07-14) — partial (ran early during A0). The statics recipe is validated end-to-end in-engine (Blender → glb → glTFast import → shared
M_Lit_Palette→ renders correct in URP at the game angle; the crate + flora are baked into ArtStaging). Both recipes are written checklist-grade (Lantern_Art_Pipeline_Recipes) + the/art-devcookbook. Skinned recipe — now proven for a LANTERN creature:EnemyRigTools.BuildDrowner(new menu, extends the DR-023 table-driven tool) producesEnemyDrowner.prefab— a game-ready ownerless-interpolated skinned enemy (SciFiSpace Crew_Male body, gloamM_Enemy_Drowner_Animatedon theSkinned-Palette/AnimatedLitShader,AC_EnemyTopDown
RigDefinitionAuthoring), structurally identical to the shipping werewolf/charger → animates in-game via the same EG/Rukhanka path (renders only in the baked ECS world, not a plain scene). Still open: the authoritative in-game animated run (wire intoWaveDirector.EnemyPrefabs[]+ a Server/Client play-run — a gameplay-roster change), the custom kit re-attach (glowing eyes/kelp as bone-parented children), and the Bathynaut suit + 2nd creature — so the "cube→rigged→animated→fighting, twice" gate is close but not signed off. ⚠ Open discrepancy to reconcile: the grounding read foundCharacters.fbximported as Generic (animationType: 3), which conflicts with CLAUDE.md's "HUMANOID" note — verify before relying on either. Safe regardless: reuse the existing rigged Synty prefab + itsCharactersAvatarvia the tool; do NOT reimport the FBX (a rig-type flip would break the clip binding). Reusable gotchas banked: Blender-5.1 Synty-FBX import workaround, bounds-normalize scattered Synty rocks, posed-static hero bake (apply-armature + visual-transform), the Unity URP render-harness (layer sign-bit,SubmitRenderRequest), and theEnemyRigTools.BuildDrownerpath + its EG-only-render caveat.
A2 — The creature factory (runs alongside Phases 2–6)
- "CreatureKit" workflow/tooling: one editor tool or hard checklist that takes a Blender export and yields a play-ready enemy — prefab with rig + ghost/network authoring + colliders + a tuning-table entry + spawn-table and bestiary hooks. The measure: adding enemy N+1 touches zero undocumented steps.
- Variant policy (cheapest content first): palette-shift / gloam-tint / scale / part-swap variants of existing meshes BEFORE any new mesh. One Drowner mesh should yield 3 visual tiers; the Emissive-Gloam shader's parameters (hue, flicker-cadence, intensity) are a free variant axis that is also gameplay information.
- VFX-first identity rule: emissive accents + a dynamic light + silhouette + animation carry a creature's identity in this game's darkness; mesh detail is the last 20%. Budget accordingly — a readable blob with a great light beats a detailed model nobody can see.
- Delivery order (matched to system phases): Drowner (Strider, simplest) → Grindylow (Crawler) → Wrecker (Strider variant + beacon prop) → Wisp-Choir (Drifter motes + VFX — barely a "model" at all, a good early win) → organs/pickups (Phase 4) → Tender companion (Phase 5, characterful) → shelf-boss (Phase 6 — the hero build: silhouette explorations first, kitbash from family parts where possible, real time budgeted).
- Throughput rules (solo sanity): timebox per asset class (a prop is a morning, a creature is days not weeks, the boss is the exception); the done-bar is "reads at gameplay zoom, under murk, in motion" — never render-portfolio quality; when stuck, ship the placeholder and log the upgrade.
Gate (mid-slice checkpoint at Phase 2's gate): all four Phase-2 creatures in-game through the CreatureKit path; a written retro on the factory's friction points feeds the deeper technical pass.
A3 — Hero assets & the visual polish pass (runs alongside Phases 6–7)
- The hero set: the Mother-Lamp (the station's centerpiece whose brightness is the campaign readout — the single most important model in the slice), the waypoint-lantern family (unlit/lit/guttering — light states act, the mesh holds still), the shelf-boss, the custom Wick silhouette upgrade (replacing the A1 kitbash), the Bell.
- The world dressing pass: geometry-node garden/coral/wreck families dressed through the pocket generator; station interior set.
- Capture-grade validation: the readability law audited on real gameplay footage — compressed-bitrate test (does Midnight-adjacent murk survive streaming?), grayscale test, colorblind-sim pass on the warm/cold/lure triad.
- Screenshot discipline check: the slice's store-facing shots pass the 200px + warm-focal-light + legible-silhouette rule.
Gate: the slice's finale clip (Phase 6's gate footage) looks like this game and no other game — style bible held under real play, not staged shots.
Cross-cutting workstreams (woven through all phases)
- Audio: hydrophone bed, lamp-morse chirps, Bell toll, Siren verses (placeholder → authored), silence-with-texture.
- Dev tooling: pocket-graph visualizer, seed-pin inspector, Loudness/threat readout, descent-state overlay, screenshot rig on the capture grade, CreatureKit (owned by A2 but serves everyone).
- Validation culture (unchanged): EditMode tests for math/economy invariants (pinning determinism, mutation thresholds, Loudness sums, strand/regrow rules); Play-mode server==client checks for every replicated surface; adversarial design reviews for ★ phases; every gate is a playtest.
Sequence at a glance
| System track | 0 (adoption + world spike ★) | 1 (combat ★) | 2 (dark) | 3 (tide-line) | 4 (mutations) | 5 (death) | 6 (finale) | 7 (hub, parallel) |
|---|---|---|---|---|---|---|---|---|
| Art track | A0 style lock | A1 pipeline proof | A2 factory (4 creatures) | A2 (lantern family) | A2 (organs) | A2 (Tender) | A3 (boss + hero set) | A3 (station + polish) |
The deeper technical pass (next sessions) takes each phase in turn: context7-verified API grounding, the ★ design reviews, salvage mapping against the existing codebase, per-phase build specs — and for Workstream A, the concrete recipe documents (export settings, rig conventions, CreatureKit spec) validated against the project's existing animation-pipeline knowledge.
Related
- Identity_Lantern — the design this implements (scope ladder = this roadmap's contract; readability law = A-track law)
- Phase 0 artifacts: DR-048_Lantern_Adoption_Full_Pivot · Lantern_Strip_Mothball_Inventory · World_Model_Build_Spec + DR-049_Lantern_World_Model_Design (+ Lantern_World_Model_Spike / Lantern_World_Model_Design_Proposal) · Art_Direction_Lantern + Lantern_Art_Pipeline_Recipes
- Phase design specs (all phases covered): Phase1_Combat_Gym_Build_Spec (review-hardened, DR-050_Lantern_Phase1_Combat_Design) · Lantern_Phase4_Mutations_Design · Lantern_Phase5_Death_Recovery_Design · Lantern_Phase6_7_Finale_Station_Design · Lantern_Currency_ReMean · Lantern_Tone_Bible (Phase 7)
- Running: Lantern_Operator_Questions — decisions parked for the operator
- Theme_Direction_Candidates — research underneath the direction
- Synty_Asset_Inventory — placeholder quarry during the transition
- Iteration_2026-07_CoopHades — superseded on adoption
- Pillars — unchanged constraints