Files
Project-M/Docs/Vault/06_Roadmap/Roadmap_Lantern_Slice.md
T
kronic ec0e3ce5dc Docs: roadmap — Emissive-Gloam shader + skinned Drowner bind (art progress)
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>
2026-07-14 22:02:28 -07:00

23 KiB
Raw Blame History

title, date, tags, permalink
title date tags permalink
LANTERN Vertical Slice — high-level implementation roadmap 2026-07-13
roadmap
lantern
vertical-slice
direction
art-pipeline
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 (07) 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, 24 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

  1. 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.
  2. 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).
  3. 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.
  4. 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 passedWorld_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-dev skill + 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.

  1. Bathynaut (anchor-and-crash melee) + Harpooner (line-and-iron skillshots incl. reel/drag) as suit-frames — chassis verbs, movement feel, dash.
  2. Skillshot kit plumbing: 4 socket slots per frame; cooldown/telegraph/aim grammar to the SoD bar (manual aim, real windups, readable hitboxes).
  3. First 45 Sparks as socketables (decoy-wisp, hook/pull, vortex, blink, one zone) — enough to prove kit variety.
  4. 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.
  5. 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

  1. Twilight shelf as a pocket-graph: 35 generated dark pockets per descent on a graph; seed-fresh re-knot per descent; pocket transitions.
  2. Descent lifecycle: muster at the Lamp → Bell down → pockets → Bell recall or lit-road walk home; ~3040 min hard session cap.
  3. Enemy roster v1: Drowners (melee swarm), Grindylow packs (leapers), Wreckers (gloam-casters with counterfeit beacons + scan counter), Wisp-Choir as first named encounter.
  4. Brighter-is-louder: party Loudness sum drives spawn/aggro pressure; per-Wick Loudness pips on HUD.
  5. 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

  1. 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.
  2. Session-only burn: fuel drains only while a session runs; guttering telegraphs long and loud before the dark un-pins a pocket.
  3. Banked light: deposit at any lit lantern = home; the Lamp meter brightens the station visibly.
  4. 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

  1. Culture library: first organ home = permanently cultured; grafts regrow cheaply from culture (death-proof knowledge floor).
  2. Wild mutations: Sparks drink Gloam; 2 paced thresholds per descent offering 23 warps, at pocket-clear beats only; mutations evaporate at homecoming.
  3. Tallow fixing: 1 fix slot per Spark; the scripted first-evaporation beat (Keeper names the rule, gifts one Tallow).
  4. Raw-socketing: wield a fresh organ wild (over-tuned, temporary) vs. bag it for culturing.
  5. Fill the Spark catalog to 810.

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

  1. The split: flame returns (rack-spare respawn, cheap regrow); cargo + fixed mutations + raw organs strand with the suit at its death site.
  2. 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.
  3. Guttering + flame-share revive (giver pays flame).
  4. Selkie tariff (menu-level for the slice).
  5. 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

  1. Shelf-boss (Twilight's warden): a real multi-phase skillshot fight; drops the slice's signature Spark + a schematic beat.
  2. One scripted Serpent-tide as the slice climax: forecast by the Siren, targeting the party's planted lantern — defend it or lose the pin.
  3. Difficulty/co-op scaling pass (14 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 46 where possible.

  1. The Last Lantern hub: Lamp (meter + radius), rack, graft-bench, culture library, Bell — each a physical place.
  2. The Keeper (text-first, subtitle lines): tutorializes the loop, the split, the evaporation gift; evasive-warm register per the tone bible.
  3. The Siren: descent forecast at the Bell + hydrophone bleed mid-descent + the tide forecast.
  4. Lamp-morse: ping wheel, revive plea, greeting — procedural chirp audio.
  5. 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)

  1. 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.
  2. 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.
  3. Reference board: RoR2 (shape language), Dredge (water mood), Hollow Knight (value control in dark), Below (the cautionary legibility case).
  4. 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-dev cookbook).
  • Master shaders — all 3 now present: Lit-Palette (the Lit URP graph) + Skinned-Palette (AnimatedLitShader, Rukhanka-deformation) already existed; Emissive-Gloam authored this pass as a hand-written URP shader (ProjectM/EmissiveGloam, Assets/_Project/Shaders/) with the flicker-cadence as a material param (_FlickerAmount 0=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)

  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-Palette material → prefab. Every step scripted or checklisted via blendermcp where possible.
  2. 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: 45 clips per family (idle/move/windup/attack/death) + per-creature attack accents only where identity demands.
  3. 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.
  4. 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-dev cookbook. Skinned recipe — now proven for a LANTERN creature: EnemyRigTools.BuildDrowner (new menu, extends the DR-023 table-driven tool) produces EnemyDrowner.prefab — a game-ready ownerless-interpolated skinned enemy (SciFiSpace Crew_Male body, gloam M_Enemy_Drowner_Animated on the Skinned-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 into WaveDirector.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 found Characters.fbx imported 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 + its CharactersAvatar via 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 the EnemyRigTools.BuildDrowner path + its EG-only-render caveat.

A2 — The creature factory (runs alongside Phases 26)

  1. "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.
  2. 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.
  3. 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.
  4. 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).
  5. 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 67)

  1. 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.
  2. The world dressing pass: geometry-node garden/coral/wreck families dressed through the pocket generator; station interior set.
  3. 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.
  4. 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.