192 lines
8.5 KiB
Markdown
192 lines
8.5 KiB
Markdown
# 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.
|