Files
Project-M/Docs/Vault/06_Roadmap/Backlog.md
T
2026-06-04 13:45:46 -07:00

74 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
tags:
- roadmap
- backlog
updated: 2026-06-03
permalink: gamevault/06-roadmap/backlog
---
# Backlog
Unordered pool of candidate work. Promote to a [[Milestones|milestone]] when committed.
> **2026-06-04 Polish & backlog-clear pass** ([[2026-06-04_Polish_Backlog_Pass]], [[DR-016_Stage_G_Combat_Gameplay]]) — delivered + validated (EditMode 86→127): hygiene/reconcile; **+system tests for every M6 server system**; centralized `Tuning.cs` consts; replicated **wave number** on the HUD; procedural **ambient + combat juice** (camera punch / FOV hit-stop, kill-shot fanfare, respawn shimmer, reticle lock-on tether); **ghost-prop reskin** (Storage/Turret/Node distinct materials) + **SSAO/ACES post verified**; **timed/removable modifiers**, **enemy knockback**, **Husk attack telegraph**; and the **aim-drift fix** (movement-based camera look-ahead). Remaining from the selected Stage-G slice: ranged **Spitter**, **multi-prefab abilities**, + small fold-ins (storage proximity-gate, pickup auto-grant, standalone-debug RPC). Then Stages H (controls/UI) + I (multi-client harness + operator live runs).
- [x] Upgrade Unity 6.4 → 6.6 — done (now `6000.6.0a6`). Entities/Collections/Graphics → 6.5.0; **Netcode → 6.6.0 and Physics → 6.5.0 also renumbered into the editor line** (not independent 1.x as [[DR-001_Netcode_Test_Harness]] assumed). See [[2026-05-30_M1_Player_Slice]].
- [x] Define the core gameplay loop and the first predicted player ghost — delivered as M1 ([[2026-05-30_M1_Player_Slice]]).
- [x] **Re-validate the M1 play-tick on a stable Unity 6.x** — moot/subsumed 2026-06-04: M1M6 are all runtime-validated on the stable **6.4.7** line (the 6.6 alpha netcode bug never affected 6.4.7). The original "blocked on 6.6 alpha" framing ([[DR-002_Unity66_Alpha_Netcode_Transport]]) no longer applies.
- [x] Replace template `SampleScene` with a dedicated bootstrap scene + gameplay subscene — **done 2026-06-04** ([[DR-017_Persistent_Base_Player_Driven_Pacing]]): dedicated **`Game.unity`** (duplicated from SampleScene to preserve the SubScene `_SceneAsset`/`_SceneGUID` Hash128 MCP would drop) is now `EditorBuildSettings` index 0; a minimal **`DevSandbox.unity`** carries the dev overlay. SampleScene retained as a reference (retire later).
- [x] Optional template cleanup: remove `com.unity.visualscripting`, `Assets/TutorialInfo/`, `Assets/Readme.asset`**done 2026-06-03** (pre-M6 cleanup; see the "2026-06-03 Visual & Controls Polish" section below + [[2026-06-03_Pre_M6_Cleanup]]). Duplicate of the now-checked item there.
- [x] Decide **relay provider** before M4 — resolved: **Direct IP/LAN now, Unity Relay later** ([[DR-005_M4_Connection_Model_Direct_IP]], [[2026-06-01_M4_LAN_CoOp_And_Classification_Fix]]).
- [x] Decide home-base **grid 2D vs 3D** before M6 — resolved 2026-06-02: **planar single-level `int2` grid**, CellSize 1.0, 32×32 plot (full 3D/stacked deferred). Locked in `BaseGridMath` — [[DR-008_M5_HomeBase_BaseLayer_Storage]].
- [ ] Decide **production replication** (predicted vs server-only) before M7 (automation).
- [x] **M2 follow-up — Burst cache health** — confirmed clean 2026-06-03: warm focused play shows **no** "not a known Burst entry point" managed-fallback messages + fast (~3s) play-enter. The M2-era corruption is gone. [[2026-06-03_Pre_M6_Cleanup]] (orig [[2026-05-31_M2_Combat]] / [[DR-003_M2_Combat_Netcode_Architecture]]).
- [ ] **M2 follow-up — live interactive fire test** (focused Play Mode: press Space / LMB / RT → predicted projectile + dummy HP drop). The server combat loop + replication are validated; the input→`AbilityFireSystem`→predicted-spawn→classification path is only validated structurally.
- [x] **M2 follow-up — mouse-cursor aim for KBM** — done 2026-06-03: client-side camera ground-ray cursor aim rides the existing `PlayerInput.Aim` `[GhostField]` (no new netcode surface); device auto-switch (KBM/gamepad) replicated as a `byte`; strafe-while-aiming free. [[DR-012_Aim_Controls_Cursor_Gamepad]], [[2026-06-03_Aim_Controls_Cursor_Gamepad]].
- [x] **M2 follow-up — player death/respawn** — done in **M5.5**: derived `Dead` enableable gate (from replicated Health) + server `PlayerRespawnSystem` (full HP + reposition to base after a delay). [[DR-009_GameFeel_Identity_FirstBlood]]
- [ ] M2 polish — projectile/dummy visuals (primitive meshes/materials currently); optional predicted client-side auto-target if the soft server reconcile feels off.
- [ ] **M3 follow-up — UI/icon/description pipeline** for abilities (managed lookup keyed by `AbilityId`, off the blob). Deferred from M3 ([[2026-05-31_M3_Data_Driven_Abilities]]).
- [x] **M3 follow-up — timed / removable modifiers** — done 2026-06-04 ([[DR-016_Stage_G_Combat_Gameplay]]): a SEPARATE server-only `TimedModifier{SourceId,UntilTick}` buffer (keeps the replicated `StatModifier` layout byte-identical → no re-bake) + `TimedModifierExpirySystem` (expiry on `NetworkTick`) + `TimedModifierUtil.RemoveBySourceId` (clear-by-type). +4 EditMode tests.
- [ ] **M3 follow-up — multi-prefab abilities** (a per-ability *different* projectile ghost) needs `ProjectileClassificationSystem` generalized beyond the single shared prefab.
- [x] **M3 follow-up — standalone-server debug modifier path** via `IRpcCommand`**done 2026-06-04** ([[DR-017_Persistent_Base_Player_Driven_Pacing]]): the dev-tools `DebugCommandRequest` RPC (unconditional wire type; `#if UNITY_EDITOR` send/receive) drives modifiers/resources/state over a real connection, superseding the in-editor-only static-poke `DebugModifierInjectionSystem`. (Still editor-gated; flip the systems' guard to `DEVELOPMENT_BUILD` to ship in a dev player build.)
- [x] **M3 follow-up — rate-limited turning** — done 2026-06-03 (pre-M6 cleanup): `PlayerAimSystem` now rotates `PlayerFacing` toward the aim target at `EffectiveCharacterStats.TurnRateRadiansPerSec` (authored 720°/s) instead of snapping; deterministic in the predicted loop (fixed-step `dt`, replays on rollback). [[2026-06-03_Pre_M6_Cleanup]].
- [ ] **M3 polish — pickup visuals** (primitive sphere/default material currently); pickup auto-grant feel (continuous overlap).
- [ ] **M5 follow-up — base/expedition subscene split + streaming (Option C)****superseded 2026-06-03 by [[DR-013_M6_Aether_Cycle_Region_Split]]** (coordinate-region + per-connection `GhostRelevancy` delivered the split without `SceneSystem` streaming). Kept only as a note for a future larger-world milestone where true async streaming is wanted; do NOT build streaming now. Original framing: the persistent-space split the locked world design ultimately needs (`SceneSystem.LoadSceneAsync`/`UnloadScene`, per-world load on the listen-server, enter-expedition/return-to-base transition). Deferred to its own world-architecture milestone — M6/M7 only need the anchor + grid, now done ([[DR-008_M5_HomeBase_BaseLayer_Storage]]). The physics-in-prediction + base-layer slices of M5 are done ([[DR-006_M5_Physics_In_Prediction]], [[DR-008_M5_HomeBase_BaseLayer_Storage]]).
- [ ] **M5 follow-up — shared-storage disk persistence** (host-only): runtime structures don't exist until M6, so nothing to save yet; add a thin per-record serialization slice (replayed through M6's placement path) after M6. `BaseAnchor`/`StorageEntry` are already flat/serialization-friendly.
- [ ] **M5 follow-up — storage interaction polish**: proximity gate the deposit/withdraw (the container carries `HitRadius`); real item/UI model beyond the fixed test item; multi-writer ordering beyond first-come server apply.
- [ ] **M5 follow-up — multi-client shared storage**: validate two clients see identical shared-storage buffer state (pairs with the deferred M5b multi-client interpolation + M4 two-build tests).
- [ ] **M5 follow-up — home-base visuals**: only an editor plot-bounds gizmo + a placeholder primitive container today; real ground/walls/structures arrive with M6.
- [ ] ~~**M5 follow-up — same-tick movement**~~ — moot after M5b (the CC character runs in the predicted fixed-step group; M5's `PlayerMoveSystem` is deleted). See [[DR-007_M5b_Character_Controller_Package]].
- [ ] **M5b follow-up — multi-client CC interpolation validation**: live two-build / thin-client run to confirm remote-peer interpolation smoothness (predicted-only `CharacterInterpolation` variant is in; only single-client validated). Pairs with the deferred M4 real-LAN two-build test.
- [ ] **M5b follow-up — player-vs-player collision**: currently non-physical (`SimulateDynamicBody=false`); enable + handle masses if mutual push is wanted.
- [ ] **M5b follow-up — KinematicCharacterBody velocity ghost variant** (replicate RelativeVelocity/IsGrounded) if owner-prediction reconciliation looks jittery under latency.
- [ ] **M5b follow-up — gravity/verticality**: CC character is gravity-free + planar (no floor collider). Add gravity in the processor + a ground collider + reconsider `SnapToGround` if terrain/verticality is introduced.
- [ ] **M5b follow-up — CC package version**: 1.4.2 declares `entities/physics@1.3.x` (resolves via SemVer floor on our 6.4.0/1.4.6). Move to a CC build explicitly targeting Entities 6.x when published.
- [ ] **M5 follow-up — physics lag compensation** (`NetCodePhysicsConfig.EnableLagCompensation` + `PhysicsWorldHistorySingleton`) if/when physics-based hit detection replaces the swept-segment server check.
- [ ] **M5 follow-up — projectiles as physics bodies** (currently kinematic + swept hit); convert for projectile-vs-world collision.
- [ ] **M5 follow-up — hard rotation lock** (`PhysicsMass.InverseInertia=0`); `Rigidbody.FreezeRotation` is not honored by the DOTS baker, so rotation is held by per-tick angular-zero + aim write.
- [x] **Game identity defined** — sci-fi **frontier colony** fiction ([[Identity]]), layered over [[Pillars]] with no mechanical rework. Resolves the "mechanics without a fiction" gap. Delivered with M5.5 ([[DR-009_GameFeel_Identity_FirstBlood]]).
- [x] **M2 polish — projectile/dummy visuals** — addressed by the M5.5 emissive palette + URP post-processing (cyan crew, cyan projectiles, orange Husks, dark walls/ground). Real models/animation still deferred.
- [x] **M5.5 follow-up — auto-target on Husks** — done (deepening pass): `AbilityFireSystem` candidate query `.WithAny<TrainingDummyTag, EnemyTag>()`. [[2026-06-02_GameFeel_Deepening]]
- [x] **M5.5 follow-up — respawn safety** — done (deepening pass): replicated `RespawnInvuln` window (server-enforced damage immunity + HUD SHIELDED cue). [[2026-06-02_GameFeel_Deepening]]
- [x] **M5.5 follow-up — enemy variety + wave/threat director** — done (deepening pass): `WaveSystem` escalating waves (lull → spawn → clear → bigger) + 3 melee Husk variants (Grunt/Swarmer/Brute) round-robin from a baked pool. Ranged spitter + broodmaker/boss still open. [[2026-06-02_GameFeel_Deepening]]
- [ ] **Deepening follow-up — ranged Husk (Spitter)**: a server-spawned enemy-projectile subsystem for dodge depth (the next variety type; melee-only today).
- [ ] **Deepening follow-up — wave number on HUD**: needs a replicated game-state ghost (`WaveState` is server-only); the live "HUSKS N" count conveys threat for now.
- [ ] **Deepening follow-up — boss / per-wave composition weighting** (brutes later, swarms early) instead of flat round-robin; a "broodmaker" that spawns.
- [ ] **Deepening follow-up — server perf under wave load**: in-editor tick-batching (~1.251.75 ticks/frame) **investigated 2026-06-03** — Burst ruled out (confirmed healthy), so single-process multi-world cost (ServerWorld + ClientWorld + physics + Husk waves in one editor) is the likely factor; **validate in a real standalone build** remains open. [[2026-06-03_Pre_M6_Cleanup]].
- [ ] **M5.5 follow-up — real assets**: authored audio (replace procedural SFX), stylized hard-surface crew/structures + corrupted-biomech Husks (replace primitives), TextMeshPro HUD; add the URP **SSAO** renderer feature for more depth.
- [ ] **M5.5 follow-up — multi-client juice/HUD**: validate remote-player death VFX (interpolation-timeline `Health==0`) + per-client HUD under two clients (pairs with the deferred M4/M5b two-build tests).
- [ ] **M5.5 follow-up — difficulty balance**: Husks tuned for a real moving/shooting player (dmg 5, strike 48 ticks, speed 3, `MaxAlive` 6); revisit once movement/fire feel is tuned and enemy variety lands.
## 2026-06-03 Visual & Controls Polish follow-ups
Surfaced by the art/Synty/aim sessions ([[DR-010_Art_Import_URP_Conversion_Visual_Upgrade]], [[DR-011_Synty_World_VFX_Integration]], [[DR-012_Aim_Controls_Cursor_Gamepad]]).
- [x] **Cleanup — prune orphaned `Materials/Env/` materials** — done 2026-06-03 (pre-M6 cleanup): GUID-swept the retired BefourStudios decorative materials; zero-reference ones deleted, still-referenced kept. [[2026-06-03_Pre_M6_Cleanup]].
- [x] **Cleanup — remove Unity-template cruft** — done 2026-06-03 (pre-M6 cleanup): `com.unity.visualscripting` package, `Assets/TutorialInfo/`, `Assets/Readme.asset`. [[2026-06-03_Pre_M6_Cleanup]].
- [ ] **DR-010/011 follow-up — decor LOD → client-only/cosmetic subscene**: cosmetic prop LOD hierarchies currently bake into both worlds; move pure cosmetics off the server for tick budget.
- [ ] **DR-011 follow-up — character models / DOTS skeletal animation**: player + Husks remain primitives; swap for real rigged models when the character pack lands.
- [ ] **DR-011 follow-up — VFX-Graph hit/beam packs**: the GabrielAguiar VFX-Graph subset needs separate URP setup if wanted (Shuriken packs already wired).
- [ ] **DR-011 follow-up — ghost-prop Synty reskin**: Storage/UpgradePickup ghosts still use BefourStudios meshes; reskin to Synty-style or simple emissive.
- [ ] **DR-011 follow-up — mixed-theme danger zones**: BioHorror/Synty corrupted-zone art for high-threat areas (deferred from the scope gate).
- [ ] **DR-012 follow-up — auto-target tuning**: priority/feel refinement; optional controller soft-target reticle snap (V Rising/Diablo-style).
- [ ] **DR-012 follow-up — rebindable controls + multi-ability slots**.
- [ ] **Pre-M6 cleanup follow-up — higher material fidelity**: ORM channels don't map uniformly to URP; a per-channel repack or small ORM ShaderGraph + baked reflection probe would deepen the look.