# Roadmap Where tilt is, and what parity with NHL 26 would actually take. Worth stating the scale honestly up front: NHL 26 is ~30 years of iteration by a studio of hundreds, plus licensing. Full parity isn't a backlog, it's a company. This document is the real shape of the gap, ordered by difficulty, with notes on where the current architecture helps and where it will fight us. --- ## Built - **Skating** — carve/glide momentum model. Blade line, edge grip, stride, hockey stop. 7.4 m/s flat out. - **Rink** — NHL dimensions, boards as static bodies, markings, corner arcs. - **Bodies** — 23-bone skeleton, procedural lofted meshes, distance-field skinning, 18-capsule / 17-joint ragdoll, dynamic proxy capsule per skater. - **Hits** — limb-level resolution from the posed ragdolls (shoulder / hip / body / arm / leg), graded bump → stagger → knockdown, skeleton impulses, knockdown and a seamless get-up. - **Puck** — regulation cylinder, continuous collision, boards and corners hold at 55 m/s. - **Stick** — socketed to the hand, aimed per stance, kinematic blade collider. - **Possession** — magnetism dial (runtime tunable), capture, carry, shot, pass, poke check, contact knocking the puck loose. - **Controls** — Xbox pad with Skill Stick (pull back / push to shoot), analog triggers, rumble; keyboard fallback. - **AI** — puck chasing, designated chaser per side, support positioning, bots that shoot and pass. - **Shootout** — nets, goalie, alternating attempts, goal detection, scoreboard. **1171 headless checks.** `npm test`, `npm run capture`. --- ## Tier 1 — the genuinely hard ones ### Goalies (beyond the shootout MVP) The shootout goalie plays the angle with a reaction lag and stops pucks with kinematic colliders. That is enough for a shootout and nowhere near enough for a game. A real goalie is a separate locomotion model (shuffles, t-pushes, butterfly, RVH, post integration), a separate animation set (glove, blocker, pad stacks, desperation saves), save *selection* that has to feel fair rather than optimal, and rebound control that decides on its own whether the game is fun. **Have:** angle positioning, lag, physics saves. **Why hard:** the system EA still gets criticised for annually. ### Animation volume and quality The largest body of work in the project by an order of magnitude. NHL runs thousands of mocap clips through motion matching. We run procedural poses, which got further than expected — the stride, the carve lean, the limb-level hits all read correctly — but it has a ceiling and broadcast hockey is above it. Parity means mocap plus a clip/motion-matching system, or a hybrid where procedural drives locomotion and clips drive everything contextual. **Have:** pose-buffer + crossfade + IK + override-layer architecture a clip system can plug into. **Why hard:** content volume. Cannot be engineered around. ### AI that plays hockey Forechecking systems, D-zone coverage, breakouts, cycling, gap control, reading the play, line changes. Genuine multi-agent planning under adversarial pressure. **Have:** four states (carry / chase / support / defend) off one nearest-to-puck test, and a clean intent seam anything smarter writes into. ### Netcode 12 skaters, 2 goalies, a puck, sticks, plus lag compensation for hits and shots. **Have:** better odds than most — `shared/` is pure, deterministic and three.js-free by design, and `applyIntent` is a clamped entry point that never trusts input. **Why hard:** Box3D and the ragdoll layer are *not* obviously deterministic across machines. **Prove that before anything else** — it gates netcode and replays, and finding out late would be very expensive. ### Possession feel The `magnetism` dial is at 0.72, which is a guess. Not analytically solvable — only iteration with real players answers it. It is what NHL retunes every year and still gets complaints about. ### Full-fidelity interaction at scale Stick-on-stick, stick lifts, puck off skates and shin pads and glass, board battles with three bodies pinned to the wall, all stable at 60 Hz. **Have:** one blade collider and skater proxies. The 0.53 m proxy-equilibrium noted in the README gets worse with pile-ups. ### Presentation Broadcast camera direction, replays, commentary, crowd, arena atmosphere, celebrations, likenesses. Nearly all production, not engineering. ### Modes: Franchise, Be A Pro, HUT, World of Chel By content volume, arguably most of an NHL release. Contracts, scouting, drafts, trades, progression, card economy, matchmaking, live service. ### Licensing NHL/NHLPA teams, players, arenas, logos, music. Not engineering, but parity is impossible without it. --- ## Tier 2 — medium | | Notes | |---|---| | Full game mode | Periods, clock, faceoffs after whistles, line changes. | | Rules: offside, icing | Detection is straightforward; edge cases are the work. | | Penalties | Hits already carry `headshot`, `blindside`, delivering part and struck region — boarding/charging/elbowing have the data. | | Faceoffs | Mechanic + animation. The lineup spawn already exists. | | Line changes / bench | Roster is already a parameter. | | Full 5-on-5 | Runs today at 0.38 ms/frame; needs positional AI to mean anything. | | Shot variety | Wrist, snap, slap, backhand, one-timers, deflections, tips. | | Dekes, dangles, toe drags | Skill Stick gesture layer exists; these are new gestures + poses. | | Board play / puck battles | Likely needs possession *reworked*, not extended. | | Stick-on-stick, stick lifts | New collider pairs and filter work. | | **Fighting** | Self-contained minigame — and **Ludus already has a full one**. Highest value-per-effort item on this list. | | Injuries / fatigue / momentum | Ragdoll and hit severity already feed it. | | Puck physics polish | Deflections, glass, puck on edge, knuckling. | | Camera systems | Several presets; we have two. | | Audio | Skate cuts, puck-on-stick, boards, crowd, goal horn. Currently **silent**. | | Replays | Cheap given a deterministic sim — record inputs, re-simulate. | | Difficulty sliders | Needs AI worth tuning first. | | Menus, profiles, settings, save | Conventional. | --- ## Tier 3 — small Hours to days each. ### Owed / immediate - **Pad parity.** `P` (take shooter), `R` (restart) and `C` (camera) are keyboard-only, so you cannot play a shootout with a controller alone. `LB` (switch), `Y` (dump) and `START` are read and discarded. ~20 lines. - **Goalie animation depth.** Goalie is now a skinned skeleton with pads, trapper, blocker, mask and paddle, plus ready / shuffle / butterfly / reach stances. Still owed: RVH, post-integration, glove *saves* as events, and rebound control that is more than the pad restitution. - **Goal feedback.** A goal is a line of HUD text. No horn, no camera cut, no celebration. Cheap, disproportionate effect. - **Tune the shootout conversion rate.** 15-in-29 (~52%) against a real ~33%. Dials: `GOALIE.depth`, `GOALIE.lag`, `GOALIE.speed`, `SHOT_RANGE` and shot spread. Needs hands on a pad, not test output. ### Controls / possession - `LT` puck protection when carrying — LT is now **backskating**; protection can layer on top of the analog later without stealing the backskate feel. - `RB` deke modifier. - Bot stickhandling (`possession.handling` is human-only; bots leave it at 0). - Forehand / backhand blade roll. - Contested capture instead of nearest-index-wins. ### Polish - Ice spray, skate trails, snow. - Jersey numbers and names. - Scoreboard, clock, period structure. - Basic stat tracking. --- ## Known soft spots - **Lower hand does not quite reach the shaft** (~0.25 m short). The left arm is 0.55 m and the natural grip point is ~1 m from the left shoulder on this skeleton, so the IK grips the nearest reachable point. Pose work, not architecture. - **Staggers are visually unverified.** Knockdowns were tested hard; the stagger path is only asserted to *enter* the right state, and it is far more common in play. - **Proxy interpenetration** under sustained pressure — two skaters at full sprint settle 0.53 m apart against 0.72 m of capsule. Documented in the README; gets worse in pile-ups. - **Shootout conversion is untuned** at ~52%. --- ## Suggested order 1. **Play the shootout and tune the conversion rate.** Cannot be done from here. 2. Pad parity — small, owed, and it is what makes the MVP couch-playable. 3. Goalie animation and goal feedback — biggest read-improvement per hour. 4. **Prove Box3D determinism.** Cheap now, gates netcode and replays, expensive to discover late. 5. Port the Ludus fighting system — highest value-per-effort in Tier 2, and the code already exists.