Historical website snapshot before 2026-11-02-r2. Images and claims retain their original dated versions. Return to the current homepage using the navigation.

NHL 94 — 2026 Edition, patched

Current version Season - jdc - 2026-11-02 Download ROM 2026-11-02 IPS What's new

A set of fixes and changes for the Sega Genesis / Mega Drive hack NHL 2026 - 94 Edition v5.1W: three season lengths in the dated Season - jdc version: Full with 84 games and best-of-seven playoffs, Light with 31 games and Mini with 7 games (both with single-game playoffs), each saved separately, with standings by division, scoring leaders and every player's stats, saved in the game's battery memory; all 32 NHL rosters and lines as of October 21, 2026; better co-op passing, goalies that don't pass blind, a small chance to score from the blue line, a working Fighting On/Off setting and a corrected off-screen arrow. Current exact-build QA:112 of112 required suites pass. Dated release sections below retain historical results; use the current QA and final audit for present status.

84game full season
31game Light season
7game Mini season
508KB current patch
32rosters updated
0windows opened while testing

New in 2026-11-02: replay HUD, Quickgame CPU option and menu 78 — the original startup image stays. Behavior, every hook and exact tests.

New in 2026-11-01-r5: Momentum On/Off, lower-left shot meter and native receiver/defender positioning. Every requested point checked again.

New in 2026-11-01-r4: Faceoff Dots Off/On, default Off. Optional painted-dot alignment for native stoppage formations. Cause, behavior and tests.

New in 2026-11-01-r3: AI Shot Plan Off/On, default Off. Optional Hard CPU shot decisions, lateral approaches and native passing. Behavior and tests.

New in 2026-11-01-r2: OT SO Rules Off/On, default Off. Eligible native skaters before reuse and completed body-spin handling in overtime shootouts. Behavior and tests.

New in 2026-11-01: Alt Goalies Off/On, default Off. Optional reach21 and experimental catches/rebounds. Behavior and tests.

New in 2026-10-31-r11: Independent Pickup Delay: Off/On, default Off. On briefly delays skater contact after a human pass. Behavior and tests.

New in 2026-10-31-r10: Optional Pass Charge: Off/On, default Off. Hold the pass button for more power; release to pass. Stars: P1 blue, P2 red, P3 green, P4 yellow. The goal is red again, with original rink palettes preserved. Code and tests.

Download

For the latest New Full Season (84 games), Light (31) and Mini (7), use the dated Season - jdc downloads below. The earlier season ROM here keeps its 82-game full season and 31-game Light season; the plain patched ROM has no season mode. You can also apply the IPS patch to your own copy of NHL 2026 - 94 Edition v5.1W (any IPS patcher works, e.g. Floating IPS or RetroArch soft-patching: put the .ips next to the ROM with the same name).

Earlier builds and base ROM:

FileMD5
Base ROM, v5.1W (3 MB)8f863ecb108c1d213953bada9b98f4f2
Current season ROM59741cf4873325938e0c013e2ec7d53b

The patch gives the full version with the season mode. Or build it yourself with the tools: ./build.sh builds both the plain patched ROM (no season mode) and the season ROM. Each game change can be switched off with a flag (see Tech).

The patch replaces the hack's start-up screens (the centre-ice picture and the title screen with its credits) with an NHL shield picture. The hack itself, NHL 2026 - 94 Edition, is made by Jkline3 and Von Ozbourne (nhl94.com) — all credit for the game goes to them. To keep their screens, build with the flag nointro.

Human-versus-human Quickgame — R6

Exactly 1v1, 1v2, 1v3 and 2v2 human controllers. Select QUICKGAME in Play Mode and choose Players. Both sides are human; native AI teammates fill other skater positions. Three/four pads need a four-player adapter. All four pads retain B switching and Y keeper selection; tied-overtime shootouts rotate actual human pads by side.

Simulate Match, Abandon Season, season standings and scoring leaders are excluded from Quickgame menus. Existing season records survive Quick matches and returning to Full/Light/Mini. Installing any new ROM release still starts fresh progress under jdc's policy.

Thirty opened native screenshots, exact hashes and declared fixtures · All hooks, source, rollback and QA history · Ordered feature queue.

Known inherited issue: the compact Stars score after a shootout can retain the regulation tie; the final full result header shows the correct decider. Exact R5 comparison is included. Native EA Hockey Night presentation remains. Physical USB pads and play feel need manual testing. Quickgame was released in R6; see the newer Allstar R7 section. Transfers/overall-hot-cold restoration remain unfinished.

All103 mandatory suites pass on the exact R6 ROM. Independent rebuild, exact R5 rollback and original-base IPS reconstruction pass. Native screenshots and known/manual limits are linked above.

Replay HUD, CPU Quickgame and menu 78 — November 2

Automatic replay keeps the original coloured shot bar, both speed units and lower-left frame/clock, without speed text corrupting REPLAY. Native power-play text retains its area.

Select Quickgame, then the existing four human splits or 1 vs CPU. P1 is home against an entirely CPU away side; other pads stay inactive. Allstar retains its four human-only combinations and black/red uniforms.

The supplied dark ice texture is the menu background. The original NHL94/Season Edition startup image stays unchanged. P3 is neon green, visibly distinct from blue; small native crowd details sharing its green entry also brighten. Other stars, red goal and team uniforms retain their colours. All112 exact-image suites pass. Independent rebuild, exact R7 rollback and original-base IPS reconstruction pass.

Opened native screenshots and exact ROM hash · Code, hooks, tests and limits. Physical USB hardware/play feel require manual testing. Transfers and the original season overall/hot-cold presentation remain ordered work.

Native Allstar teams — R7

Select ALLSTAR MODE, then 1v1, 1v2, 1v3 or 2v2 human controllers. The best 52 unique players by actual native overall are split between Allstar A/B, with valid positions, eight lines and three keepers each. Real names, attributes, portraits and critical ratings follow their players; original 32 clubs remain intact.

Allstar A wears all-black uniforms and Allstar B all-red uniforms. Original rink/logo artwork remains. Actual team labels are Allstar A/B. Native AI teammates fill remaining positions; neither opposing side is entirely CPU-controlled. Physical USB hardware/play feel still need manual testing.

Opened, dated native screenshots · Ranking, actual rosters, every hook/hex change and exact tests · Ordered queue.

All 106 exact-image suites pass. Independent rebuild, exact R6 rollback and original-base IPS pass. Transfers and original overall/hot-cold presentation remain the next dependent work.

Forum requests, fixes & code

Find your name or suggestion from 2 guys one ai. Each item links to the original post, its status and the implementation.

Current source: 2026-11-02 · All engine hooks and ROM/RAM notes · Complete builder · Exact-build test report.

Hex tables show file offsets, checked builder-input bytes and current bytes. Relocated hooks need their accompanying code. The complete byte diff uses the unmodified v5.1W base and includes code, rosters and assets; its ROM hashes identify the exact build.

Season settings and penalty minutes

Fixed · 2026-10-28 / r3

77 · Forum post #217611

Saved match settings stay locked after the first game and survive restarts. Played games save each player’s PIM in league and playoffs.

Hooks, hex & source code

Settings: per-slot logical SRAM 1FF6–1FFD; pre-match settings capture and validation in experimental/seasonplayers.s and experimental/seasonplayers.s. Native game settings: D050 D052 D056 D058 D072 F004.

PIM: code at 2EE000; league SRAM 09A0 + 25×team, playoff SRAM 07C0 + 25×seed slot. experimental/pim.s · season/season.s · Tests and legacy-save limits. Simulated games have no penalty model.

Goalie lock, runaway speed, penalty shots and passing

5 fixes released · 2026-10-28-r2

Tickenest · Forum post #217601

Boxed receivers are skipped; stale human speed flags are cleared; penalty-shot puck state and attacking awareness are corrected; short passes use a minimum flight time.

The one-goal-deficit CPU goalie pull was already in v5.1W, credited to McMarkis.

Hooks, hex & source code
Hook / ROM offsetBuilder inputCurrent bytesCode
Goalie receiver scan
0x00BD02
67 006F 00experimental/forumfix.py
Cached goalie receiver scan
0x2FF1AC
67 006F 00experimental/forumfix.py
Human skating friction
0x00AC12
08 2B 00 00 00 62 67 00 00 04 74 094E B9 00 2E F0 00 4E 71 4E 71 4E 71experimental/forumfix.s
Penalty-shot award
0x00ED96
42 78 B7 72 42 78 B7 744E B9 00 2E F0 04 4E 71experimental/forumfix.s
Penalty-shot setup
0x00EF92
08 AB 00 01 00 624E B9 00 2E F0 08experimental/forumfix.s
Wing Offensive Awareness
0x00D0DE
17 6B 00 6B 00 4017 6B 00 6A 00 40experimental/forumfix.py
Center Offensive Awareness
0x00D2D6
17 6B 00 6B 00 4017 6B 00 6A 00 40experimental/forumfix.py
Short-pass flight time
0x00BF54
4E B9 00 2F F1 404E B9 00 2D E6 00experimental/forumfix.s

Guarded installer · 68000 routines · Native regression cases · Scope, tests and limitations.

Helpers at 2EF000 (friction), 2EF004 (penalty award), 2EF008 (setup), 2EF00C (pass timing). Jump bytes require the matching relocated code.

Time to pass after a diving save

Released · confirmed on the forum

Brodeur30 · Forum post #217608 · Brodeur30’s confirmation #217631

A diving catch gets the standing catch’s possession window. This timer edit is separate from the co-op goalkeeper controls.

Hooks, hex & source code
Hook / ROM offsetBuilder inputCurrent bytesCode
Diving catch possession timer
0x01531C
35 7C 00 05 00 4835 7C 00 B4 00 48experimental/build_test.py
ROM 0x01531C
35 7C 00 05 00 48  →  35 7C 00 B4 00 48
move.w #5,$48(a2)  →  move.w #180,$48(a2)

Guarded standalone patch script · Download script · Instructions and limits.

python3 patch_diving_recovery.py input.bin output.bin

Stronger native Hard AI

Completed · accepted 38-win base

floating · Forum post #217606

The current playtest is 2026-11-02. Its historical tactical base won 38 of 50 Edmonton Hard games against Chicago Normal, scoring 132–66, with 25 home games per club. The matched r3 control won 32; the immediate parent won 36.

Completed and accepted by jdc. The 38-win tactical base is accepted. Later maintenance includes native receiver positioning and a bounded containment-brake repair; the combined current version has no new win-rate qualification. Optional AI Shot Plan Off/On now implements jdc’s separate local request for covered-shot deferral and lateral native approaches; it makes no new strength claim. Optional attack policy, every hook and exact tests. The earlier stable 39/50 benchmark was not achieved and is archived; no further win-rate search is planned. A separate Penaltys100%/50%/Off row now complements the native Rules choice, preserving offside, icing and awarded penalty shots. Injury-only reports remain, and whole fighting incidents are gated before paired awards. Percentage menu, native hooks, RNG, storage and tests. Free CPU-teammate pickups now distribute control randomly among eligible friendly P1–P4 pads; existing human receivers and keeper requests retain their ownership. Pickup hook, native RNG, guards and physical-pad input tests. Pass Speed Normal/Slow now complements Pass Height Normal/Low, both default Normal, with independent per-season persistence/locking. Standalone preferences move out of Full goalie data to an excluded Light-bank gap. Speed, preserved lift, storage and tests. Lift code and native tests. Downed skaters are now rejected by both pass-target scans and the native stick-contact gate; body deflections and later recovered pickups remain. Downed receiver hooks, native input tests and timing limits. Shootout attempts now start automatically after a short countdown; pre-shot backward/stopped puck approaches end through the native miss event, while a legal unshot forward loose puck may be recovered. Native shot/retouch handling remains. Rules, tolerances, hooks and native tests. Goal nets now require50%more impact speed before the native release can trigger; a hard hit can still dislodge them. Net threshold code, reproduction and tests. A manually controlled, puck-holding keeper now uses the native pass instead of an early player switch. Manual keeper code, tests and limits. The fouled physical P1–P4 pad now controls its awarded penalty shot. Penalty-shot controller code/tests. Human buffered pass shots now wait for native stick contact and use the contact pose; a teammate cannot erase that request. Human contact code/tests. Mini now has seven games, one against each divisional rival, including simulated fixtures. Seven-game code and tests. Mini schedule code/tests. Overtime follows the selected5/7/10/20-minute period length, and post-whistle shots/checks cannot build or bank momentum. OT and momentum code/tests. The retained keeper fix returns a previously manual keeper to CPU control on a catch and sends requested outlets to the current P1–P4 skater. Fresh defaults follow jdc’s clarified choices: Hard, Replay Off, Crit Off and Icing On, with Auto lines and Edmonton. Icing On clarification. Catch control and defaults. The Icing On/Off menu row and Edmonton startup/new-season defaults remain. Icing code and tests. It also honors accepted keeper pass requests at the possession deadline. The r3 CPU keeper tracking/recovery correction remains; Crit locking, immediate B switching and the Stars panel repair from r2 remain. In 48 controlled approaches, goals fell from 10 to 4 and keeper catches rose from 15 to 22. This is not a new win-rate series.

Exact-build QA: 112 of 112 checks passed on 2026-11-02. Strict release gate: PASSED. All 112 required suites execute, including replay graphics ownership, CPU Quickgame controller/flow/shootout, menu78/startup preservation and exact neon-green palette scope. Independent rebuild, exact Nov1r7 rollback and original-base IPS reconstruction pass. 38 of 40 original AutoReplayOn 600-frame scenes are raw-exact to freshly replayed Nov1r7 controls; every partial native decoder sample and older comparison remain recorded. A separate 40 of40 declared AutoReplayOff pairs must be strictly raw-exact. Calibrated native PC/record/commit proofs replace coordinate tolerances. These are bounded regression tests. No Hard win-rate search resumes. Exact current matrix · Current changes, hooks and limits · Current native screenshots, fixtures and limits.

Hooks, hex & source code
Hook / ROM offsetBuilder inputCurrent bytesCode
Weak-side defensive winger
0x00D086
41 FA FF 10 34 38 B7 4A4E B9 00 2D 84 00 4E 71experimental/ai_defence.py
Defensive pair positioning
0x00CF8A
20 7C 00 00 E5 94 61 00 34 364E B9 00 2D C0 00 4E 71 4E 71experimental/ai_gap.py
Attack support, first caller
0x00D1DE
41 FA 13 B4 60 00 31 E44E F9 00 2D 88 00 4E 71experimental/ai_attack.py
Attack support, second caller
0x00D3BE
41 FA 11 D4 60 00 30 044E F9 00 2D 88 00 4E 71experimental/ai_attack.py
CPU pass receiver choice
0x00E45E
70 06 61 00 2C 244E B9 00 2D 88 04experimental/ai_attack.s
CPU shot/pass decision
0x00E292
61 D0 66 00 00 4E4E F9 00 2D D8 00experimental/ai_freecross.s
First forward unit personnel
0x01584C
43 EA 01 6A 30 2A 00 164E F9 00 2D D4 00 4E 71experimental/coach_lines.s
Matching native line energy
0x012EB8
43 EA 01 6A E7 404E F9 00 2D D4 04experimental/coach_lines.s
Real keeper selection
0x015AA4
08 AB 00 06 00 634E F9 00 2D C8 00experimental/coach_goalie.s
Deliberate native cross-pass decision
0x00E444
4A 78 BE E4 66 00 00 144E F9 00 2D D8 04 4E 71experimental/ai_freecross.s
Native target opening decision
0x00C30C
61 00 02 58 3F 3C 00 054E F9 00 2D F0 00 4E 71experimental/ai_smart_aim.s
Accepted-pass receiver plan
0x00BFB6
31 C1 B7 74 4E 754E F9 00 2D F8 00experimental/ai_pass_plan.s
Hard target refresh interval
0x0103D0
06 2B 00 0C 00 424E F9 00 2D 8D 40experimental/ai_steering.s
Native lateral keeper tracking
0x00DA58
32 02 48 A7 C0 004E F9 00 2D C2 80experimental/ai_keeper_pass.s
Keeper attacking goal accounting
0x014964
30 2A 00 18 10 C04E F9 00 2D F4 04experimental/goalie_offense.s
Keeper attacking shot accounting
0x01301C
42 40 10 2B 00 664E F9 00 2D F4 08experimental/goalie_offense.s

Related jdc maintenance hooks: current menu, controls, presentation and keeper corrections.

Hook / ROM offsetBuilder inputCurrent bytesCode
Crit Shots season-lock writer
0x2EB02C
FF FF FF FF60 00 07 E2experimental/seasonplayers.s
Immediate B input and goalie handoff
0x00B1B6
08 2B 00 03 00 63 66 00 08 CA4E F9 00 2E A6 00 4E 71 4E 71experimental/fourgoalie.s
Native Stars HUD cleanup
0x018514
08 F8 00 07 C2 EA4E B9 00 2D B6 00experimental/stars_hud.s
Actual carried-puck keeper target
0x00D8F8
E2 404E 71experimental/build_test.py
Taken keeper recovery branch
0x00D650
7E 1475 96experimental/build_test.py
Keeper recovery veneer in dead glass padding
0x014BE6
6D 00 00 44 0C 534E F9 00 2D B8 00experimental/goalie_anticipation.s
Ordinary accepted keeper request
0x2FDE80
FF FF FF FF FF FF4E B9 00 2D B4 00experimental/outlet.s
Adapter accepted keeper request
0x2EAACE
FF FF FF FF FF FF4E B9 00 2D B4 00experimental/fourgoalie.s
One-time keeper deadline reservation
0x2DB400
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF40 E7 2F 00 4A 68 00 34 66 52 08 28 00 03 00 62 66 4A 10 38 C2 EA 02 00 00 11 66 40 4A 78 D4 12 66 3A 08 38 00 00 C2 FA 66 32 08 38 00 02 C2 F2 66 2A 4A 78 F0 64 67 24 30 28 00 52 B0 78 B7 AA 66 1A B0 78 F0 66 66 14 4A 68 00 48 6B 0E 0C 68 00 04 00 48 6C 06 31 7C 00 04 00 48 20 1F 46 DF 4E 75experimental/outlet_deadline.s
Optional native touch-icing award
0x0101EE
30 3C 00 0C 61 00 1D 384E F9 00 2D BA 00 4E 71experimental/build_test.py
Icing On/Off award helper
0x2DBA00
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF0C 78 00 01 F0 EE 67 0A 30 3C 00 0C 4E B9 00 01 1F 2C 4E F9 00 01 01 F6experimental/icing.s
Edmonton startup default
0x017C92
00 1E00 0Aexperimental/build_test.py
Twenty-five-row menu cursor limit
0x0F777A
00 1200 32experimental/replaymenu.py
Icing menu label
0x2E12C0
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF00 10 49 63 69 6E 67 20 20 20 20 20 20 20 20 00experimental/replaymenu.py
Cooperative keeper catch handoff call
0x2FE46E
FF FF FF FF FF FF4E B9 00 2D BC 00experimental/goalie_ai.s
Native keeper-to-skater handoff helper
0x2DBC00
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF40 E7 48 E7 FF FE 00 7C 07 00 4A 6A 00 34 66 00 01 08 4A 78 D0 52 66 00 01 00 08 2A 00 03 00 62 67 00 00 F6 08 38 00 00 C2 FA 66 00 00 EC 4A 78 D4 12 66 00 00 E4 10 38 C2 EA 02 00 00 11 66 00 00 D8 3E 2A 00 52 BE 78 B7 AA 66 00 00 CC 78 01 0C 47 00 05 67 0A 78 02 0C 47 00 0B 66 00 00 BA 41 F8 C3 28 70 03 72 00 34 18 67 08 B4 44 66 00 00 A8 72 01 51 C8 FF F2 4A 41 67 00 00 9C 49 F8 C3 20 70 03 BE 5C 57 C8 FF FC 66 00 00 8C 41 F8 B0 4A 0C 44 00 01 67 04 D0 FC 03 00 7A FF 7C FF 76 05 4A 68 00 34 6F 34 08 28 00 03 00 62 66 2C 08 28 00 02 00 63 66 24 08 28 00 05 00 62 66 1C 30 10 90 52 C1 C0 32 28 00 14 92 6A 00 14 C3 C1 D0 81 B0 86 62 06 2C 00 3A 28 00 52 D0 FC 00 80 51 CB FF C0 1F 2A 00 63 08 AA 00 03 00 63 32 07 30 05 4E B9 00 00 C0 F8 15 5F 00 63 41 F8 C3 20 43 F8 C3 28 72 03 34 19 BE 50 66 06 B4 44 66 02 30 80 54 88 51 C9 FF F0 4C DF 7F FF 46 DF 4E 75experimental/goalie_catch_control.s
Current-skater keeper outlet request
0x2FDC0C
FF FF FF FF60 00 01 8Aexperimental/outlet.s
Requested Hard startup defaults
0x2E0008
FF FF FF FF60 00 01 86experimental/crowd.s
Requested Replay/Crit fallback defaults
0x2DE004
FF FF FF FF60 00 00 C6experimental/replaymenu.s
Fresh-format Icing On default
0x2AA360
FF FF FF FF FF FF61 00 01 52 4E B9season/slots.s
Boot Icing On default
0x2DE078
FF FF FF FF FF FF0C 47 00 20 66 06experimental/replaymenu.s
Empty-season Icing On fallback
0x2EB454
FF FF FF FF FF FF31 FC 00 00 F0 EEexperimental/seasonplayers.s
Overtime follows selected period length
0x2AC024
FF FF FF FF FF FF FF FF4E B8 78 4E 4E F8 78 2Eexperimental/shootout.s
Consume post-whistle momentum events
0x2E074A
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF10 38 C2 EA 02 00 00 51 66 00 FE 22 10 38 C2 EC 02 00 00 81 66 00 FE 16 08 38 00 02 C2 F2 66 00 FE 0C 30 39 00 FF F7 38 04 40 A5 02 0C 40 00 06 65 00 FD FAexperimental/crowd.s
Mini divisional opponent lookup
0x2DBE00
FF FF FF FF60 00 00 06season/minischedule.s
Mini divisional simulated fixtures
0x2DBE04
FF FF FF FF60 00 00 16season/minischedule.s
Human buffered contact/follow-through frame
0x2E1004
FF FF FF FF60 00 00 4Cexperimental/onetimer.s
Owned C keeps a buffered pass shot
0x00B810
4E B9 00 0F EE 604E F9 00 2E 10 0Cexperimental/onetimer.py
Native stick-contact gate
0x2E117C
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF2F 0B 4E B9 00 01 06 E0 D0 53 90 78 B7 4A 0C 40experimental/onetimer.s
Capture fouled physical penalty-shot pad
0x0121C2
31 C0 D4 06 22 7C FF FF B0 4A4E B9 00 2D A8 00 4E 71 4E 71experimental/build_test.py
Penalty-shot participant assignment
0x00F20C
61 00 0B 14 30 38 D4 084E B9 00 2D A8 04 4E 71experimental/build_test.py
Fouled pad ownership helper
0x2DA800
FF FF FF FF FF FF FF FF60 00 00 06 60 00 00 6Eexperimental/penalty_owner.s
Mini records seven regular games
0x2F814E
FF FF FF FF FF FF31 7C 00 07 00 0Aseason/season.s
Mini menu denominator seven
0x22A47C
FF FF74 07season/seasonmenu.s
Mini seven keeps single-game playoffs
0x2FC94C
FF FF FF FF FF FF FF FF FF FF0C 79 00 07 00 FF F4 0A 67 14season/playoffs.s
Owned manual keeper uses native pass
0x2DB0B6
FF FF FF FF67 00 01 4Cexperimental/switch.s
Adapter owned keeper uses native pass
0x2EA784
FF FF FF FF67 00 00 FCexperimental/fourgoalie.s
Goal net release positive X threshold
0x014B6C
20 0030 00experimental/build_test.py
Goal net release negative X threshold
0x014B74
E0 00D0 00experimental/build_test.py
Goal net release positive Y threshold
0x014B7C
20 0030 00experimental/build_test.py
Goal net release negative Y threshold
0x014B84
E0 00D0 00experimental/build_test.py
Automatic attempt initialization
0x00F280
31 FC 01 90 C3 1A4E B9 00 22 90 20experimental/build_test.py
Automatic CPU attempt countdown
0x00F298
00 6400 3Cexperimental/build_test.py
Pre-shot puck progress watcher
0x00F2F4
48 A7 80 00 30 38 B7 AA4E F9 00 2D AA 00 4E 71experimental/shootout_rules.s
Downed native B-pass recipient guard
0x00BD06
08 29 00 02 00 634E B9 00 2D AE 00experimental/downed_receiver.s
Downed keeper fallback recipient guard
0x2FF1B0
08 29 00 02 00 634E B9 00 2D AE 00experimental/downed_receiver.s
Downed actual stick-contact guard
0x0150F6
4E B9 00 2F F3 804E F9 00 2D AE 04experimental/downed_receiver.s
Optional targeted B-pass lift
0x00BF5E
11 C2 B7 76 B4 7C 00 0C 6D 00 00 08 11 FC 00 0C B7 764E F9 00 2D E4 00 4E 71 4E 71 4E 71 4E 71 4E 71 4E 71experimental/pass_height.s
Combined height/speed preference exports
0x2DE400
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF60 00 00 12 60 00 00 6A 60 00 00 6C 60 00 00 8E 60 00 00 80experimental/pass_height.s
Pass Height label
0x2E12D0
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF00 10 50 61 73 73 20 48 65 69 67 68 74 20 20 00experimental/replaymenu.py
Independent targeted B-pass speed
0x00BF54
4E B9 00 2F F1 404E B9 00 2D E6 00experimental/pass_speed.s
Pass speed timing/menu exports
0x2DE600
FF FF FF FF FF FF FF FF60 00 00 06 60 00 00 D6experimental/pass_speed.s
Pass Speed label
0x2E12E0
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF00 10 50 61 73 73 20 53 70 65 65 64 20 20 20 00experimental/replaymenu.py
Fair accepted co-op pickup control
0x01538A
B0 7C 00 06 5D C14E F9 00 2E FC 00experimental/fair_pickup.s
Ordinary human B mode dispatcher
0x00BC40
08 02 00 04 66 00 00 1E4E F9 00 2E 68 00 4E 71experimental/pass_mode.s
Human vector targeting cone
0x2FF034
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF4E F9 00 2E 68 04 4E 71 4E 71 4E 71 4E 71 4E 71experimental/pass_mode.s
Human keeper cone fallback
0x2FF1D8
08 29 00 03 00 62 67 00 00 04 74 004E F9 00 2E 68 18 4E 71 4E 71 4E 71experimental/pass_mode.s
Mode/cone module exports
0x2E6800
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF60 00 00 4C 60 00 00 BA 60 00 01 C0 60 00 03 D2 60 00 02 96 60 00 03 44 60 00 01 76 60 00 01 52experimental/pass_mode.s
Pass Mode menu label
0x2E12F0
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF00 10 50 61 73 73 20 4D 6F 64 65 20 20 20 20 00experimental/replaymenu.py
Target Cone menu label
0x2E1300
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF00 10 54 61 72 67 65 74 20 43 6F 6E 65 20 20 00experimental/replaymenu.py
Separate ordinary penalty admission
0x011F78
06 78 00 C8 B8 9C4E F9 00 2E C8 00experimental/penalty_rate.s
Whole-fight percentage commit
0x2004F0
28 4B 70 05 26 7C FF FF B0 4A4E F9 00 2E C8 04 4E 71 4E 71experimental/penalty_rate.s
Penalty rate helper exports
0x2EC800
FF FF FF FF FF FF FF FF60 00 00 06 60 00 00 ACexperimental/penalty_rate.s
Penaltys percentage menu label
0x2E1310
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF00 10 50 65 6E 61 6C 74 79 73 20 20 20 20 20 00experimental/replaymenu.py
Native combined rules label
0x2E1260
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF00 10 52 75 6C 65 73 20 20 20 20 20 20 20 20 00experimental/replaymenu.py
Protected human contact-to-release interval
0x2E1088
FF FF FF FF FF FF40 E7 00 7C 07 00experimental/onetimer.s
Human held-pass begin
0x00B760
4E B9 00 0F EE 604E B9 00 2E 82 00experimental/pass_charge.s
Held-pass module exports
0x2E8200
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF60 00 00 B6 60 00 00 E0 60 00 01 52 60 00 02 3E 60 00 02 90 60 00 02 D0 60 00 01 90 60 00 02 C8experimental/pass_charge.s
Human old gate / charged emitter exports
0x2E6820
FF FF FF FF FF FF FF FF60 00 00 32 60 00 00 50experimental/pass_mode.s
Pass Charge menu label
0x2E1320
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF00 10 50 61 73 73 20 43 68 61 72 67 65 20 20 00experimental/replaymenu.py
Actual human B pickup cooldown dispatch
0x2E6876
FF FF FF FF FF FF4E B9 00 22 00 00experimental/pass_mode.s
Pickup-delay human release and preference exports
0x220000
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF60 00 00 0E 60 00 00 D8 60 00 01 0A 60 00 01 4Aexperimental/pickup_delay.s
Pickup Delay menu label
0x2E1330
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF00 10 50 69 63 6B 75 70 20 44 65 6C 61 79 20 00experimental/replaymenu.py
Actual shot provenance after native release
0x00C408
4E B9 00 2F F3 00 4E 714E B9 00 22 10 00 4E 71experimental/alt_goalies.s
Optional native keeper reach envelope
0x2FF354
0C 78 00 0F B7 62 4E F9 00 01 50 3A4E F9 00 22 10 04 4E 71 4E 71 4E 71experimental/alt_goalies.s
Native first-save catch/rebound choice
0x0155FC
B0 78 B7 72 6D 00 FF 584E F9 00 22 10 08 4E 71experimental/alt_goalies.s
Bounded optional rebound velocity
0x015580
17 40 00 28 17 41 00 2A4E B9 00 22 10 0C 4E 71experimental/alt_goalies.s
Actual accepted possession invalidates shot provenance
0x015288
30 2A 00 52 31 C0 B7 AA4E B9 00 22 10 24 4E 71experimental/alt_goalies.s
Normal goal same-shot SOG filter dispatch
0x2AC2DA
FF FF FF FF FF FF4E F9 00 22 10 20experimental/alt_goalies.s
Alt Goalies ten fixed exports
0x221000
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF60 00 00 64 60 00 01 1A 60 00 01 CA 60 00 02 D8 60 00 03 E0 60 00 04 1E 60 00 04 5E 60 00 01 5A 60 00 04 7A 60 00 05 38experimental/alt_goalies.s
Alt Goalies menu label
0x2E1340
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF00 10 41 6C 74 20 47 6F 61 6C 69 65 73 20 20 00experimental/replaymenu.py
Optional OT shootout eight fixed exports
0x222000
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF60 00 01 48 60 00 02 76 60 00 02 DC 60 00 02 AC 60 00 03 AE 60 00 03 E4 60 00 04 24 60 00 01 D8experimental/strict_so.s
OT SO Rules menu label
0x2E1350
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF00 10 4F 54 20 53 4F 20 52 75 6C 65 73 20 20 00experimental/replaymenu.py
Capture actual eligible rosters before lineup reset
0x2AC0C6
FF FF FF FF FF FF4E B9 00 22 20 00experimental/shootout.s
Native setup with optional actual bench roster
0x2AC1C2
FF FF FF FF FF FF4E F9 00 22 20 04experimental/shootout.s
Optional full-body turn observer
0x2DAB5C
FF FF FF FF FF FF4E B9 00 22 20 08experimental/shootout_rules.s
Reset per-attempt full-angle history
0x2DAA60
FF FF FF FF FF FF4E B9 00 22 20 0Cexperimental/shootout_rules.s
Native ordinary shot commitment / optional Hard deferral
0x00E412
58 4F 30 38 B7 5E4E F9 00 22 30 00experimental/shot_plan.s
Native carrier target / optional lateral approach
0x00E10C
41 FA 00 1E 08 38 00 02 C2 F24E F9 00 22 30 04 4E 71 4E 71experimental/shot_plan.s
AI Shot Plan eight fixed exports
0x223000
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF60 00 01 EE 60 00 02 88 60 00 01 A6 60 00 00 D8 60 00 03 8A 60 00 03 C0 60 00 04 00 60 00 03 50experimental/shot_plan.s
AI Shot Plan menu label
0x2E1360
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF00 10 41 49 20 53 68 6F 74 20 50 6C 61 6E 20 00experimental/replaymenu.py
AI Shot Plan Off/On value strings
0x2E1576
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF00 16 4F 66 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 00 16 4F 6E 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20experimental/replaymenu.py
Load independent shot plan after mapped context
0x2E6B34
FF FF FF FF FF FF4E B9 00 22 30 10experimental/pass_mode.s
Save independent shot plan record
0x2E6BD6
FF FF FF FF FF FF4E B9 00 22 30 14experimental/pass_mode.s
Load shot plan after destination slot identity
0x2AA1F6
FF FF FF FF FF FF4E B9 00 22 30 10season/slots.s
Reset only confirmed selected shot plan season
0x2AA37A
FF FF FF FF FF FF4E B9 00 22 30 18season/slots.s
Optional painted-dot final stoppage point
0x01255A
61 00 00 22 42 78 C3 E64E B9 00 22 40 00 4E 71experimental/faceoff_dots.s
Faceoff Dots five fixed exports
0x224000
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF60 00 00 12 60 00 00 54 60 00 01 12 60 00 01 44 60 00 01 84experimental/faceoff_dots.s
Faceoff Dots menu label
0x2E1370
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF00 10 46 61 63 65 6F 66 66 20 44 6F 74 73 20 00experimental/replaymenu.py
Faceoff Dots Off/On values
0x2E15A2
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF00 16 4F 66 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 00 16 4F 6E 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20experimental/replaymenu.py
Load dot policy after mapped context
0x2E6B2E
FF FF FF FF FF FF4E B9 00 22 40 08experimental/pass_mode.s
Save independent dot policy record
0x2E6BD0
FF FF FF FF FF FF4E B9 00 22 40 0Cexperimental/pass_mode.s
Load dot policy after destination slot identity
0x2AA1F0
FF FF FF FF FF FF4E B9 00 22 40 08season/slots.s
Reset only confirmed selected dot-policy season
0x2AA374
FF FF FF FF FF FF4E B9 00 22 40 10season/slots.s
Native receiver far/near/geometry exports
0x225000
FF FF FF FF FF FF FF FF FF FF FF FF60 00 00 0A 60 00 01 B4 60 00 00 6Cexperimental/finisher_position.s
Independent Momentum record and percentage exports
0x226000
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF60 00 00 3A 60 00 00 6C 60 00 00 AC 60 00 00 C4 60 00 00 F8 60 00 01 04 60 00 01 10experimental/momentum.s
Lower-left panel ownership/layout exports
0x227000
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF60 00 01 78 60 00 00 0E 60 00 00 F2 60 00 01 2C 60 00 02 EAexperimental/shot_panel_left.s
Outward coast target and arrival-brake callback
0x228000
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF34 2B 00 2A 08 2B 00 07 00 62 66 02 44 42 4A 42 6F 1C 36 02 E0 43 C5 C2 48 42 02 82 00 00 FF FF C4 FC 00 11 84 FC 01 2C 94 43 6F 02 92 42 4E 75 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0C 40 00 09 67 06 4E F9 00 00 E5 94 4E 75experimental/defensive_brake.s
Native shot presentation exports
0x2ED000
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF60 00 00 40 60 00 05 04 60 00 05 E0 60 00 03 0A 60 00 03 88 60 00 01 CAexperimental/shotmeter.s
Compact dual-unit font first glyph; full bank in byte diff
0x260000
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 33 34 34 34 34 34 34 34 34 34 33 44 34 34 34 44 34 34 33 44 34 34 34 34 33 34 34 34 44 44 44 44 34 34 34 34 33 34 34 34 33 34 34 34 34 34 33 34 34 34 34 34 34 34 34 34 34 34 34 34 44 44 44 44experimental/shot_panel_left.py
Momentum menu label
0x2E1380
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF00 10 4D 6F 6D 65 6E 74 75 6D 20 20 20 20 20 00experimental/replaymenu.py
Momentum On/Off menu values
0x2E15CE
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF00 16 4F 6E 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 00 16 4F 66 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20experimental/replaymenu.py
Extended final value row
0x0F7B44
00 1400 30experimental/replaymenu.py
Far native pass receiver positioning
0x2DD2A2
FF FF FF FF FF FF4E B9 00 22 50 00experimental/ai_playbook.s
Near native receiver target refresh
0x2DD2B6
FF FF FF FF FF FF4E B9 00 22 50 04experimental/ai_playbook.s
Containment remaining outward coast
0x2DC15E
FF FF FF FF FF FF4E B9 00 22 80 00experimental/ai_gap.s
Containing-back arrival callback
0x2DC164
FF FF FF FF FF FF41 F9 00 22 80 40experimental/ai_gap.s
Disabled momentum consumes actual counters
0x2E0234
FF FF FF FF FF FF4E B9 00 22 60 0Cexperimental/crowd.s
Effective critical-roll percentage gate
0x2E004C
FF FF FF FF FF FF4E B9 00 22 60 10experimental/crowd.s
Effective roster/critical-show percentage gates 1
0x2E00D4
FF FF FF FF FF FF4E B9 00 22 60 14experimental/crowd.s
Effective roster/critical-show percentage gates 2
0x2E0138
FF FF FF FF FF FF4E B9 00 22 60 14experimental/crowd.s
Effective loaded-attribute percentage gate
0x2E06DA
FF FF FF FF FF FF4E B9 00 22 60 18experimental/crowd.s
Load Momentum after mapped preferences
0x2E6B28
FF FF FF FF FF FF4E B9 00 22 60 00experimental/pass_mode.s
Save separate Momentum preference
0x2E6BCA
FF FF FF FF FF FF4E B9 00 22 60 04experimental/pass_mode.s
Load Momentum after destination identity
0x2AA1EA
FF FF FF FF FF FF4E B9 00 22 60 00season/slots.s
Reset selected Momentum season only
0x2AA36E
FF FF FF FF FF FF4E B9 00 22 60 08season/slots.s
Quickgame ten fixed exports
0x229000
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF60 00 00 70 60 00 00 90 60 00 00 A2 60 00 00 EC 60 00 01 BA 60 00 01 C8 60 00 01 D2 60 00 01 E6 60 00 02 98 60 00 02 9Eexperimental/quickgame.s
Human-only native side commit
0x2EA412
FF FF FF FF FF FF4E B9 00 22 90 0Cexperimental/mtap.s
Quickgame match-end season isolation
0x007C2E
4E B9 00 0F F8 8E4E B9 00 22 90 10experimental/quickgame.s
Physical P3/P4 human demo-exit guard
0x007C68
4E B9 00 01 13 404E B9 00 22 90 24experimental/quickgame.s
Native Quickgame prelist dispatch
0x013134
41 FA 00 96 20 704E B9 00 22 90 18experimental/quickgame.s
Quickgame season-table suppression
0x017336
4A 78 D0 48 67 004E F9 00 22 90 14experimental/quickgame.s
Quickgame physical shootout-pool preparation
0x00F280
31 FC 01 90 C3 1A4E B9 00 22 90 20experimental/quickgame.s
Relocated season menu legacy entry bridges
0x2F9800
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF4E F9 00 22 A0 00 FF FF 4E F9 00 22 A0 08 FF FFseason/seasonmenu.s
Relocated menu entry and writer
0x22A000
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF61 00 00 D6 60 00 02 F6 4A 47 66 04 60 00 05 E4season/seasonmenu.s
Filtered Quickgame native list pointers
0x22B000
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF00 22 B0 28 00 22 B0 AC 00 22 B1 D8 00 22 B3 04 00 22 B4 30 00 22 B5 14 00 22 B5 B0 00 22 B6 DC 00 22 B8 08 00 22 B9 34experimental/build_test.py
Allstar fixed exports
0x22C000
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF60 00 00 4E 60 00 00 76 60 00 00 8C 60 00 00 B0 60 00 00 D4 60 00 00 F8 60 00 01 1C 60 00 01 40 60 00 01 64 60 00 01 B0 60 00 01 B4 60 00 01 B8 60 00 01 BC 60 00 01 C2 60 00 01 C8 60 00 01 CC 60 00 01 D2 60 00 01 68 60 00 01 D4 60 00 02 B6experimental/allstar.s
Allstar native dispatch F8A3E
0x0F8A3E
24 7C 00 00 03 0E4E B9 00 22 C0 10experimental/allstar.s
Allstar native dispatch F99F8
0x0F99F8
24 7C 00 00 03 0E4E B9 00 22 C0 10experimental/allstar.s
Allstar native dispatch F9A2C
0x0F9A2C
2A 7C 00 00 03 0E4E B9 00 22 C0 14experimental/allstar.s
Allstar native dispatch FA370
0x0FA370
24 7C 00 00 03 0E4E B9 00 22 C0 10experimental/allstar.s
Allstar native dispatch FA888
0x0FA888
20 7C 00 00 03 0E4E B9 00 22 C0 08experimental/allstar.s
Allstar native dispatch FA952
0x0FA952
20 7C 00 00 03 0E4E B9 00 22 C0 08experimental/allstar.s
Allstar native dispatch FAE56
0x0FAE56
20 7C 00 00 03 0E4E B9 00 22 C0 08experimental/allstar.s
Allstar native dispatch FB152
0x0FB152
22 7C 00 00 03 0E4E B9 00 22 C0 0Cexperimental/allstar.s
Allstar native dispatch FC58C
0x0FC58C
22 7C 00 00 03 0E4E B9 00 22 C0 0Cexperimental/allstar.s
Allstar native dispatch FC600
0x0FC600
22 7C 00 00 03 0E4E B9 00 22 C0 0Cexperimental/allstar.s
Allstar native dispatch FCC62
0x0FCC62
22 7C 00 00 03 0E4E B9 00 22 C0 0Cexperimental/allstar.s
Allstar native dispatch 8078
0x008078
48 E7 E0 C0 3F 38 BF 784E F9 00 22 C0 48 4E 71experimental/allstar.s
Allstar native dispatch 8250
0x008250
32 7C 03 0E E5 404E B9 00 22 C0 28experimental/allstar.s
Allstar native dispatch 1345E
0x01345E
32 7C 03 0E E5 404E B9 00 22 C0 28experimental/allstar.s
Allstar native dispatch 171C2
0x0171C2
30 7C 03 0E E5 404E B9 00 22 C0 24experimental/allstar.s
Allstar native dispatch F7C7C
0x0F7C7C
32 7C 03 0E E5 434E B9 00 22 C0 2Cexperimental/allstar.s
Allstar native dispatch 132E4
0x0132E4
32 7C 03 0E 22 71 00 004E B9 00 22 C0 30 4E 71experimental/allstar.s
Allstar native dispatch 1330A
0x01330A
32 7C 03 0E 22 71 10 004E B9 00 22 C0 34 4E 71experimental/allstar.s
Allstar native dispatch 17C1E
0x017C1E
30 7C 03 0E 30 124E B9 00 22 C0 38experimental/allstar.s
Allstar native dispatch F8948
0x0F8948
20 7C 00 00 03 8E4E B9 00 22 C0 18experimental/allstar.s
Allstar native dispatch FAE2A
0x0FAE2A
20 7C 00 00 03 8E4E B9 00 22 C0 18experimental/allstar.s
Allstar native dispatch 2FF422
0x2FF422
FF FF FF FF FF FF4E B9 00 22 C0 1Cexperimental/allstar.s
Allstar native dispatch 2FF4A0
0x2FF4A0
FF FF FF FF FF FF FF FF4E B9 00 22 C0 3C 4E 71experimental/allstar.s
Allstar native dispatch 2220D6
0x2220D6
FF FF FF FF FF FF FF FF4E B9 00 22 C0 40 4E 71experimental/allstar.s
Allstar native dispatch 2220E2
0x2220E2
FF FF FF FF FF FF4E B9 00 22 C0 20experimental/allstar.s
Allstar native dispatch 2D8CD6
0x2D8CD6
FF FF FF FF FF FF4E B9 00 22 C0 20experimental/allstar.s
Allstar native dispatch 2DF452
0x2DF452
FF FF FF FF FF FF4E B9 00 22 C0 44experimental/allstar.s
Allstar native displayed team overall
0x0FE172
48 E7 7F FE 30 2A 00 284E F9 00 22 C0 4C 4E 71experimental/allstar.s
Allstar A own home/away uniform palettes
0x22D00C
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF0E EA 06 66 00 00 00 00 00 00 02 22 06 8C 08 8C 00 00 00 00 02 22 00 00 02 22 00 00 04 44 0A A6 0E EA 06 66 00 00 00 00 00 00 02 22 06 8C 08 8C 00 00 00 00 02 22 00 00 02 22 00 00 04 44 0A A6experimental/allstar.py
Allstar B own home/away uniform palettes
0x22D80C
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF0E EA 06 66 00 00 00 0E 00 06 00 0A 06 8C 08 8C 00 0E 00 0E 00 0A 00 06 00 0E 00 06 00 0E 0A A6 0E EA 06 66 00 00 00 0E 00 06 00 0A 06 8C 08 8C 00 0E 00 0E 00 0A 00 06 00 0E 00 06 00 0E 0A A6experimental/allstar.py
Allstar selected-roster team-overall data
0x22CD68
FF FF FF FF00 52 00 52experimental/allstar.py
Automatic replay title/capture exports
0x2EC000
FF FF FF FF FF FF FF FF60 00 00 06 60 00 00 C0experimental/replaytitle.s
Automatic replay lifecycle
0x2E5000
FF FF FF FF FF FF FF FF FF FF FF FF60 00 00 0A 60 00 00 96 60 00 01 14experimental/replay.s
Compact/powerplay shot layout exports
0x227000
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF60 00 01 78 60 00 00 0E 60 00 00 F2 60 00 01 2C 60 00 02 EAexperimental/shot_panel_left.s
Quickgame CPU-capable exports
0x229000
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF60 00 00 70 60 00 00 90 60 00 00 A2 60 00 00 EC 60 00 01 BA 60 00 01 C8 60 00 01 D2 60 00 01 E6 60 00 02 98 60 00 02 9Eexperimental/quickgame.s
Separate menu background native code
0x2EA000
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF33 C4 00 FF D4 32 06 44 00 24 48 E7 FF F8 20 79 00 02 C7 08 43 F9 00 FF D3 D4 76 07 B1 D1 6F 10experimental/menubg.s
Requested P3 neon green fixed palette
0x05995A
00 2000 E0experimental/pad_colors.py
Supplied menu78 image header
0x240000
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF00 00 00 00 02 22 04 44 06 66 08 88 0A AA 0C CC 0E EE 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 28 00 1C 00 01experimental/build_test.py

Weak-side coverage · Defensive pair · Attack/pass decisions · Pressure and catch/release · Keeper selection · First forward unit.

All rejected ROMs, source and test results are retained. A private receiver correction won 39/50 once but only 31/50 in its independent confirmation. The final private central-pass/close-finish variant passed all 74 exact-source checks and seven independent build/rollback/IPS comparisons, but won only 33/50 (94–62); its matched Native control won 32 and r3 won 29. All 150 games completed, with 25 home games per club. All 100 new/control saves passed the statistics audit; four old r3 scorer errors remain recorded. No further confirmation or win-rate experiment is planned. Private QA successes do not approve the different released 38-win ROM. Full investigation history · Progress data.

Hard AI development: Codex GPT-6.1 Sol on High. A little over 20 hours were spent on Hard experiments and testing, according to jdc’s estimate; configuration and time are user-reported. Released maintenance: Crit Shots locking, immediate B player switching and the reported Stars of the Game graphics correction. The lateral-carry keeper correction is released. Independent AI Shot Plan Off/On, default Off, now covers jdc’s separate shot-zone/native-pass/lateral-approach request while preserving that keeper repair; it makes no new win-rate claim. Human playtests of saved AI variants come after the other work, one at a time. TODO list.

These maintenance hooks implement jdc’s playtest reports. They require their matching relocated modules.

Pass-only lift and speed controls

Targeted lift/speed released · r5

Brodeur30 · Forum post #217609

Pass Height Normal/Low and Pass Speed Normal/Slow are released, both default Normal, for targeted B passes on both teams. Slow reruns the native moving-target calculation at lower nominal power while preserving the chosen lift. Seasons save and lock both choices; standalone preferences use a separate safe record. Assisted/CPU blind passes retain their original path. Human Directional and vector cone choices are released r7; Pickup Delay Off/On is released, default Off; it adds a minimum six native updates of skater contact cooldown after an ordinary human B release.

Hooks, hex & source code
Hook / ROM offsetBuilder inputCurrent bytesCode
Optional targeted B-pass lift
0x00BF5E
11 C2 B7 76 B4 7C 00 0C 6D 00 00 08 11 FC 00 0C B7 764E F9 00 2D E4 00 4E 71 4E 71 4E 71 4E 71 4E 71 4E 71experimental/pass_height.s
Combined height/speed preference exports
0x2DE400
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF60 00 00 12 60 00 00 6A 60 00 00 6C 60 00 00 8E 60 00 00 80experimental/pass_height.s
Pass Height label
0x2E12D0
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF00 10 50 61 73 73 20 48 65 69 67 68 74 20 20 00experimental/replaymenu.py
Independent targeted B-pass speed
0x00BF54
4E B9 00 2F F1 404E B9 00 2D E6 00experimental/pass_speed.s
Pass speed timing/menu exports
0x2DE600
FF FF FF FF FF FF FF FF60 00 00 06 60 00 00 D6experimental/pass_speed.s
Pass Speed label
0x2E12E0
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF00 10 50 61 73 73 20 53 70 65 65 64 20 20 20 00experimental/replaymenu.py

Existing targeted-pass path BEBC–BFBA; flight/lift fields BF5E/BF6A. Existing pass code · Released short-pass correction · Research and isolation requirements. Lift hook and historical r4 details · Exact evidence. Released speed hook, combined records and storage regression. Directional/cone controls are released r7. Hold/release power is released as Pass Charge Off/On, default Off. Pickup Delay Off/On is released, default Off. During its short active cooldown skaters cannot take stick possession or deflect the puck with their body; goalkeepers retain native saves. Behavior, hooks, persistence and tests.

Directional passing and adjustable targeting cone

Mode/cone/charge released

Brodeur30 · Forum post #217634 · Original proposal #217609

Optional start-menu Pass Mode: Assisted/Directional, default Assisted, and Target Cone: Default/15/30/45 degrees, default Default, are released. Directional uses the actual eight-way aim without choosing a receiver; explicit cones use real vector half-angles for Assisted. Height/Speed remain independent, with per-season saving and first-match locks. CPU keeper requests keep their requested teammate. Pass Charge Off/On, default Off, now waits for human B release and scales native power25–100%. The choice saves separately for native play and every season, with the same first-match lock.

Hooks, hex & source code
Hook / ROM offsetBuilder inputCurrent bytesCode
Ordinary human B mode dispatcher
0x00BC40
08 02 00 04 66 00 00 1E4E F9 00 2E 68 00 4E 71experimental/pass_mode.s
Human vector targeting cone
0x2FF034
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF4E F9 00 2E 68 04 4E 71 4E 71 4E 71 4E 71 4E 71experimental/pass_mode.s
Human keeper cone fallback
0x2FF1D8
08 29 00 03 00 62 67 00 00 04 74 004E F9 00 2E 68 18 4E 71 4E 71 4E 71experimental/pass_mode.s
Mode/cone module exports
0x2E6800
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF60 00 00 4C 60 00 00 BA 60 00 01 C0 60 00 03 D2 60 00 02 96 60 00 03 44 60 00 01 76 60 00 01 52experimental/pass_mode.s
Pass Mode menu label
0x2E12F0
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF00 10 50 61 73 73 20 4D 6F 64 65 20 20 20 20 00experimental/replaymenu.py
Target Cone menu label
0x2E1300
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF00 10 54 61 72 67 65 74 20 43 6F 6E 65 20 20 00experimental/replaymenu.py
Hook / ROM offsetBuilder inputCurrent bytesCode
Human held-pass begin
0x00B760
4E B9 00 0F EE 604E B9 00 2E 82 00experimental/pass_charge.s
Held-pass module exports
0x2E8200
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF60 00 00 B6 60 00 00 E0 60 00 01 52 60 00 02 3E 60 00 02 90 60 00 02 D0 60 00 01 90 60 00 02 C8experimental/pass_charge.s
Human old gate / charged emitter exports
0x2E6820
FF FF FF FF FF FF FF FF60 00 00 32 60 00 00 50experimental/pass_mode.s
Pass Charge menu label
0x2E1320
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF00 10 50 61 73 73 20 43 68 61 72 67 65 20 20 00experimental/replaymenu.py
Hook / ROM offsetBuilder inputCurrent bytesCode
Actual human B pickup cooldown dispatch
0x2E6876
FF FF FF FF FF FF4E B9 00 22 00 00experimental/pass_mode.s
Pickup-delay human release and preference exports
0x220000
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF60 00 00 0E 60 00 00 D8 60 00 01 0A 60 00 01 4Aexperimental/pickup_delay.s
Pickup Delay menu label
0x2E1330
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF00 10 50 69 63 6B 75 70 20 44 65 6C 61 79 20 00experimental/replaymenu.py

CPU pass and scan instruction paths remain exact r6. The shared-path prototype was rejected after a native AI regression; the r7 human-only design restored all40 ordinary trajectories in its r7 comparison. The current ordinary-scene comparison is recorded against fresh exact Nov1r4 controls; the earlier r11 and prior comparisons remain independent. See the current exact-build QA report for counts and every retained difference. Behavior, persistence, rejected attempts and tests · Original feature evidence. Hold/release B power and independent Pickup Delay Off/On are released. Pickup Delay defaults Off; when On, an ordinary human B release applies six native updates of skater contact cooldown. Goalkeepers, existing longer locks and requested CPU keeper outlets retain their paths. Pickup delay code and exact tests. Charged input, storage, native physics and qualification · Charged-passing r10 evidence · Original feature evidence.

Alternative goalie reach and rebound model

Optional model released · default Off

floating · Forum post #217606

Alt Goalies: Off/On, default Off, is released. On adds reach21 and experimental catches, cornerward and short/long rinkward rebounds, plus occasional slow/fast goalward returns. Shot origin and screening change explicit experimental odds. Only a proven real shot gets the new classification; native movement, saves, outlets and eventual goals remain responsible for the outcome. Both clubs/ends and P1–P4 are covered. Each season saves and locks the choice after match one.

Hooks, hex & source code
Hook / ROM offsetBuilder inputCurrent bytesCode
Actual shot provenance after native release
0x00C408
4E B9 00 2F F3 00 4E 714E B9 00 22 10 00 4E 71experimental/alt_goalies.s
Optional native keeper reach envelope
0x2FF354
0C 78 00 0F B7 62 4E F9 00 01 50 3A4E F9 00 22 10 04 4E 71 4E 71 4E 71experimental/alt_goalies.s
Native first-save catch/rebound choice
0x0155FC
B0 78 B7 72 6D 00 FF 584E F9 00 22 10 08 4E 71experimental/alt_goalies.s
Bounded optional rebound velocity
0x015580
17 40 00 28 17 41 00 2A4E B9 00 22 10 0C 4E 71experimental/alt_goalies.s
Actual accepted possession invalidates shot provenance
0x015288
30 2A 00 52 31 C0 B7 AA4E B9 00 22 10 24 4E 71experimental/alt_goalies.s
Normal goal same-shot SOG filter dispatch
0x2AC2DA
FF FF FF FF FF FF4E F9 00 22 10 20experimental/alt_goalies.s
Alt Goalies ten fixed exports
0x221000
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF60 00 00 64 60 00 01 1A 60 00 01 CA 60 00 02 D8 60 00 03 E0 60 00 04 1E 60 00 04 5E 60 00 01 5A 60 00 04 7A 60 00 05 38experimental/alt_goalies.s
Alt Goalies menu label
0x2E1340
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF00 10 41 6C 74 20 47 6F 61 6C 69 65 73 20 20 00experimental/replaymenu.py

Native save chains, conservative rebound speed caps, accepted-possession provenance, scorer/keeper/SOG accounting, real advancing physics, cold boots and input tests are recorded. No human-difficulty or real-world probability claim. Off retains the established model; all passing options stay independent. Behavior, hooks, fields, exact tests and limitations · Original feature evidence.

Status is maintained here. A source link is an implementation reference, not a claim that an open proposal is finished.

Credits and sources

NHL 94 was created by EA Sports. This is a modification of NHL 2026 - 94 Edition v5.1W, by Jkline3 and von Ozbourne. Their original release and credits are the source for the inherited community work below.

Roster/headshot data: NHL; line references: DailyFaceoff. The critical-shot digital effect was adapted from Twin Cobra (Toaplan). Full provenance, scope and the original authors' remaining acknowledgements: Credits notes.

Credits card shown after the first startup image
The startup credits card stays until Start is pressed, then continues to the main menu.
2026-11-01-r5

Momentum switch, lower-left shot meter and native positioning

Momentum: On/Off, default On, controls the existing earned up-to-±10% boost. Off disables scaling and hides its bars. Easy skills and permanent full energy remain independent.

The shot meter replaces the lower-left NHL badge and keeps both KMH and MPH visible. Native clock and power-play text retain their space. Receiver tracking and defensive arrival braking are corrected.

100/100 required suites pass. The retained receiver-positioning failure now passes. Behavior, code, rebuild and limits · Additional point-by-point OK · Exact current QA.

Actual native shot display in the lower-left badge area,126KMH and78MPH
Hook / ROM offsetBuilder inputCurrent bytesCode
Native receiver far/near/geometry exports
0x225000
FF FF FF FF FF FF FF FF FF FF FF FF60 00 00 0A 60 00 01 B4 60 00 00 6Cexperimental/finisher_position.s
Independent Momentum record and percentage exports
0x226000
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF60 00 00 3A 60 00 00 6C 60 00 00 AC 60 00 00 C4 60 00 00 F8 60 00 01 04 60 00 01 10experimental/momentum.s
Lower-left panel ownership/layout exports
0x227000
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF60 00 01 78 60 00 00 0E 60 00 00 F2 60 00 01 2C 60 00 02 EAexperimental/shot_panel_left.s
Outward coast target and arrival-brake callback
0x228000
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF34 2B 00 2A 08 2B 00 07 00 62 66 02 44 42 4A 42 6F 1C 36 02 E0 43 C5 C2 48 42 02 82 00 00 FF FF C4 FC 00 11 84 FC 01 2C 94 43 6F 02 92 42 4E 75 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0C 40 00 09 67 06 4E F9 00 00 E5 94 4E 75experimental/defensive_brake.s
Native shot presentation exports
0x2ED000
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF60 00 00 40 60 00 05 04 60 00 05 E0 60 00 03 0A 60 00 03 88 60 00 01 CAexperimental/shotmeter.s
Compact dual-unit font first glyph; full bank in byte diff
0x260000
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 33 34 34 34 34 34 34 34 34 34 33 44 34 34 34 44 34 34 33 44 34 34 34 34 33 34 34 34 44 44 44 44 34 34 34 34 33 34 34 34 33 34 34 34 34 34 33 34 34 34 34 34 34 34 34 34 34 34 34 34 44 44 44 44experimental/shot_panel_left.py
Momentum menu label
0x2E1380
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF00 10 4D 6F 6D 65 6E 74 75 6D 20 20 20 20 20 00experimental/replaymenu.py
Momentum On/Off menu values
0x2E15CE
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF00 16 4F 6E 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 00 16 4F 66 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20experimental/replaymenu.py
Extended final value row
0x0F7B44
00 1400 30experimental/replaymenu.py
Far native pass receiver positioning
0x2DD2A2
FF FF FF FF FF FF4E B9 00 22 50 00experimental/ai_playbook.s
Near native receiver target refresh
0x2DD2B6
FF FF FF FF FF FF4E B9 00 22 50 04experimental/ai_playbook.s
Containment remaining outward coast
0x2DC15E
FF FF FF FF FF FF4E B9 00 22 80 00experimental/ai_gap.s
Containing-back arrival callback
0x2DC164
FF FF FF FF FF FF41 F9 00 22 80 40experimental/ai_gap.s
Disabled momentum consumes actual counters
0x2E0234
FF FF FF FF FF FF4E B9 00 22 60 0Cexperimental/crowd.s
Effective critical-roll percentage gate
0x2E004C
FF FF FF FF FF FF4E B9 00 22 60 10experimental/crowd.s
Effective roster/critical-show percentage gates 1
0x2E00D4
FF FF FF FF FF FF4E B9 00 22 60 14experimental/crowd.s
Effective roster/critical-show percentage gates 2
0x2E0138
FF FF FF FF FF FF4E B9 00 22 60 14experimental/crowd.s
Effective loaded-attribute percentage gate
0x2E06DA
FF FF FF FF FF FF4E B9 00 22 60 18experimental/crowd.s
Load Momentum after mapped preferences
0x2E6B28
FF FF FF FF FF FF4E B9 00 22 60 00experimental/pass_mode.s
Save separate Momentum preference
0x2E6BCA
FF FF FF FF FF FF4E B9 00 22 60 04experimental/pass_mode.s
Load Momentum after destination identity
0x2AA1EA
FF FF FF FF FF FF4E B9 00 22 60 00season/slots.s
Reset selected Momentum season only
0x2AA36E
FF FF FF FF FF FF4E B9 00 22 60 08season/slots.s
Quickgame ten fixed exports
0x229000
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF60 00 00 70 60 00 00 90 60 00 00 A2 60 00 00 EC 60 00 01 BA 60 00 01 C8 60 00 01 D2 60 00 01 E6 60 00 02 98 60 00 02 9Eexperimental/quickgame.s
Human-only native side commit
0x2EA412
FF FF FF FF FF FF4E B9 00 22 90 0Cexperimental/mtap.s
Quickgame match-end season isolation
0x007C2E
4E B9 00 0F F8 8E4E B9 00 22 90 10experimental/quickgame.s
Physical P3/P4 human demo-exit guard
0x007C68
4E B9 00 01 13 404E B9 00 22 90 24experimental/quickgame.s
Native Quickgame prelist dispatch
0x013134
41 FA 00 96 20 704E B9 00 22 90 18experimental/quickgame.s
Quickgame season-table suppression
0x017336
4A 78 D0 48 67 004E F9 00 22 90 14experimental/quickgame.s
Quickgame physical shootout-pool preparation
0x00F280
31 FC 01 90 C3 1A4E B9 00 22 90 20experimental/quickgame.s
Relocated season menu legacy entry bridges
0x2F9800
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF4E F9 00 22 A0 00 FF FF 4E F9 00 22 A0 08 FF FFseason/seasonmenu.s
Relocated menu entry and writer
0x22A000
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF61 00 00 D6 60 00 02 F6 4A 47 66 04 60 00 05 E4season/seasonmenu.s
Filtered Quickgame native list pointers
0x22B000
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF00 22 B0 28 00 22 B0 AC 00 22 B1 D8 00 22 B3 04 00 22 B4 30 00 22 B5 14 00 22 B5 B0 00 22 B6 DC 00 22 B8 08 00 22 B9 34experimental/build_test.py
Allstar fixed exports
0x22C000
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF60 00 00 4E 60 00 00 76 60 00 00 8C 60 00 00 B0 60 00 00 D4 60 00 00 F8 60 00 01 1C 60 00 01 40 60 00 01 64 60 00 01 B0 60 00 01 B4 60 00 01 B8 60 00 01 BC 60 00 01 C2 60 00 01 C8 60 00 01 CC 60 00 01 D2 60 00 01 68 60 00 01 D4 60 00 02 B6experimental/allstar.s
Allstar native dispatch F8A3E
0x0F8A3E
24 7C 00 00 03 0E4E B9 00 22 C0 10experimental/allstar.s
Allstar native dispatch F99F8
0x0F99F8
24 7C 00 00 03 0E4E B9 00 22 C0 10experimental/allstar.s
Allstar native dispatch F9A2C
0x0F9A2C
2A 7C 00 00 03 0E4E B9 00 22 C0 14experimental/allstar.s
Allstar native dispatch FA370
0x0FA370
24 7C 00 00 03 0E4E B9 00 22 C0 10experimental/allstar.s
Allstar native dispatch FA888
0x0FA888
20 7C 00 00 03 0E4E B9 00 22 C0 08experimental/allstar.s
Allstar native dispatch FA952
0x0FA952
20 7C 00 00 03 0E4E B9 00 22 C0 08experimental/allstar.s
Allstar native dispatch FAE56
0x0FAE56
20 7C 00 00 03 0E4E B9 00 22 C0 08experimental/allstar.s
Allstar native dispatch FB152
0x0FB152
22 7C 00 00 03 0E4E B9 00 22 C0 0Cexperimental/allstar.s
Allstar native dispatch FC58C
0x0FC58C
22 7C 00 00 03 0E4E B9 00 22 C0 0Cexperimental/allstar.s
Allstar native dispatch FC600
0x0FC600
22 7C 00 00 03 0E4E B9 00 22 C0 0Cexperimental/allstar.s
Allstar native dispatch FCC62
0x0FCC62
22 7C 00 00 03 0E4E B9 00 22 C0 0Cexperimental/allstar.s
Allstar native dispatch 8078
0x008078
48 E7 E0 C0 3F 38 BF 784E F9 00 22 C0 48 4E 71experimental/allstar.s
Allstar native dispatch 8250
0x008250
32 7C 03 0E E5 404E B9 00 22 C0 28experimental/allstar.s
Allstar native dispatch 1345E
0x01345E
32 7C 03 0E E5 404E B9 00 22 C0 28experimental/allstar.s
Allstar native dispatch 171C2
0x0171C2
30 7C 03 0E E5 404E B9 00 22 C0 24experimental/allstar.s
Allstar native dispatch F7C7C
0x0F7C7C
32 7C 03 0E E5 434E B9 00 22 C0 2Cexperimental/allstar.s
Allstar native dispatch 132E4
0x0132E4
32 7C 03 0E 22 71 00 004E B9 00 22 C0 30 4E 71experimental/allstar.s
Allstar native dispatch 1330A
0x01330A
32 7C 03 0E 22 71 10 004E B9 00 22 C0 34 4E 71experimental/allstar.s
Allstar native dispatch 17C1E
0x017C1E
30 7C 03 0E 30 124E B9 00 22 C0 38experimental/allstar.s
Allstar native dispatch F8948
0x0F8948
20 7C 00 00 03 8E4E B9 00 22 C0 18experimental/allstar.s
Allstar native dispatch FAE2A
0x0FAE2A
20 7C 00 00 03 8E4E B9 00 22 C0 18experimental/allstar.s
Allstar native dispatch 2FF422
0x2FF422
FF FF FF FF FF FF4E B9 00 22 C0 1Cexperimental/allstar.s
Allstar native dispatch 2FF4A0
0x2FF4A0
FF FF FF FF FF FF FF FF4E B9 00 22 C0 3C 4E 71experimental/allstar.s
Allstar native dispatch 2220D6
0x2220D6
FF FF FF FF FF FF FF FF4E B9 00 22 C0 40 4E 71experimental/allstar.s
Allstar native dispatch 2220E2
0x2220E2
FF FF FF FF FF FF4E B9 00 22 C0 20experimental/allstar.s
Allstar native dispatch 2D8CD6
0x2D8CD6
FF FF FF FF FF FF4E B9 00 22 C0 20experimental/allstar.s
Allstar native dispatch 2DF452
0x2DF452
FF FF FF FF FF FF4E B9 00 22 C0 44experimental/allstar.s
Allstar native displayed team overall
0x0FE172
48 E7 7F FE 30 2A 00 284E F9 00 22 C0 4C 4E 71experimental/allstar.s
Allstar A own home/away uniform palettes
0x22D00C
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF0E EA 06 66 00 00 00 00 00 00 02 22 06 8C 08 8C 00 00 00 00 02 22 00 00 02 22 00 00 04 44 0A A6 0E EA 06 66 00 00 00 00 00 00 02 22 06 8C 08 8C 00 00 00 00 02 22 00 00 02 22 00 00 04 44 0A A6experimental/allstar.py
Allstar B own home/away uniform palettes
0x22D80C
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF0E EA 06 66 00 00 00 0E 00 06 00 0A 06 8C 08 8C 00 0E 00 0E 00 0A 00 06 00 0E 00 06 00 0E 0A A6 0E EA 06 66 00 00 00 0E 00 06 00 0A 06 8C 08 8C 00 0E 00 0E 00 0A 00 06 00 0E 00 06 00 0E 0A A6experimental/allstar.py
Allstar selected-roster team-overall data
0x22CD68
FF FF FF FF00 52 00 52experimental/allstar.py
Automatic replay title/capture exports
0x2EC000
FF FF FF FF FF FF FF FF60 00 00 06 60 00 00 C0experimental/replaytitle.s
Automatic replay lifecycle
0x2E5000
FF FF FF FF FF FF FF FF FF FF FF FF60 00 00 0A 60 00 00 96 60 00 01 14experimental/replay.s
Compact/powerplay shot layout exports
0x227000
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF60 00 01 78 60 00 00 0E 60 00 00 F2 60 00 01 2C 60 00 02 EAexperimental/shot_panel_left.s
Quickgame CPU-capable exports
0x229000
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF60 00 00 70 60 00 00 90 60 00 00 A2 60 00 00 EC 60 00 01 BA 60 00 01 C8 60 00 01 D2 60 00 01 E6 60 00 02 98 60 00 02 9Eexperimental/quickgame.s
Separate menu background native code
0x2EA000
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF33 C4 00 FF D4 32 06 44 00 24 48 E7 FF F8 20 79 00 02 C7 08 43 F9 00 FF D3 D4 76 07 B1 D1 6F 10experimental/menubg.s
Requested P3 neon green fixed palette
0x05995A
00 2000 E0experimental/pad_colors.py
Supplied menu78 image header
0x240000
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF00 00 00 00 02 22 04 44 06 66 08 88 0A AA 0C CC 0E EE 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 28 00 1C 00 01experimental/build_test.py
2026-11-01-r4

Optional painted-dot faceoffs

Faceoff Dots Off/On, default Off. The reported whole-formation offset is reproduced as the inherited free neutral-zone faceoff point. On chooses the nearest painted point in the native region; the native formation, puck, camera and rendering follow normally. Native and Full/Light/Mini choices save separately and seasons lock after match one. Original incident history remains unauthenticated.

Hook / ROM offsetBuilder inputCurrent bytesCode
Optional painted-dot final stoppage point
0x01255A
61 00 00 22 42 78 C3 E64E B9 00 22 40 00 4E 71experimental/faceoff_dots.s
Faceoff Dots five fixed exports
0x224000
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF60 00 00 12 60 00 00 54 60 00 01 12 60 00 01 44 60 00 01 84experimental/faceoff_dots.s
Faceoff Dots menu label
0x2E1370
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF00 10 46 61 63 65 6F 66 66 20 44 6F 74 73 20 00experimental/replaymenu.py
Faceoff Dots Off/On values
0x2E15A2
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF00 16 4F 66 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 00 16 4F 6E 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20experimental/replaymenu.py
Load dot policy after mapped context
0x2E6B2E
FF FF FF FF FF FF4E B9 00 22 40 08experimental/pass_mode.s
Save independent dot policy record
0x2E6BD0
FF FF FF FF FF FF4E B9 00 22 40 0Cexperimental/pass_mode.s
Load dot policy after destination slot identity
0x2AA1F0
FF FF FF FF FF FF4E B9 00 22 40 08season/slots.s
Reset only confirmed selected dot-policy season
0x2AA374
FF FF FF FF FF FF4E B9 00 22 40 10season/slots.s

Native cause, every hook and tests · Exact evidence · Native test suite · Declared Off example · Declared On example.

2026-11-01-r3

Optional Hard AI shot plan

AI Shot Plan Off/On, default Off: Hard can defer a covered ordinary shot, pass through its existing logic or approach from the side. Actual keeper openings, close finishes and useful long shots stay native. Pressure and a bounded fallback keep native choices available. Separate saved season choices lock after match one.

Hook / ROM offsetBuilder inputCurrent bytesCode
Native ordinary shot commitment / optional Hard deferral
0x00E412
58 4F 30 38 B7 5E4E F9 00 22 30 00experimental/shot_plan.s
Native carrier target / optional lateral approach
0x00E10C
41 FA 00 1E 08 38 00 02 C2 F24E F9 00 22 30 04 4E 71 4E 71experimental/shot_plan.s
AI Shot Plan eight fixed exports
0x223000
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF60 00 01 EE 60 00 02 88 60 00 01 A6 60 00 00 D8 60 00 03 8A 60 00 03 C0 60 00 04 00 60 00 03 50experimental/shot_plan.s
AI Shot Plan menu label
0x2E1360
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF00 10 41 49 20 53 68 6F 74 20 50 6C 61 6E 20 00experimental/replaymenu.py
AI Shot Plan Off/On value strings
0x2E1576
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF00 16 4F 66 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 00 16 4F 6E 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20experimental/replaymenu.py
Load independent shot plan after mapped context
0x2E6B34
FF FF FF FF FF FF4E B9 00 22 30 10experimental/pass_mode.s
Save independent shot plan record
0x2E6BD6
FF FF FF FF FF FF4E B9 00 22 30 14experimental/pass_mode.s
Load shot plan after destination slot identity
0x2AA1F6
FF FF FF FF FF FF4E B9 00 22 30 10season/slots.s
Reset only confirmed selected shot plan season
0x2AA37A
FF FF FF FF FF FF4E B9 00 22 30 18season/slots.s

Behavior, hooks, tests and limits · Exact evidence · Retained variants and human trial queue · Faceoff cause and optional correction.

2026-11-01-r2

Optional overtime shootout rules

OT SO Rules Off/On, default Off: rotate eligible native skaters before reuse and end a completed pre-shot body spin. Native actor loading, attempt results and statistics remain in control. Applies to the tied-overtime extension. Seasons save and lock the choice after match one.

Hook / ROM offsetBuilder inputCurrent bytesCode
Optional OT shootout eight fixed exports
0x222000
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF60 00 01 48 60 00 02 76 60 00 02 DC 60 00 02 AC 60 00 03 AE 60 00 03 E4 60 00 04 24 60 00 01 D8experimental/strict_so.s
OT SO Rules menu label
0x2E1350
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF00 10 4F 54 20 53 4F 20 52 75 6C 65 73 20 20 00experimental/replaymenu.py
Capture actual eligible rosters before lineup reset
0x2AC0C6
FF FF FF FF FF FF4E B9 00 22 20 00experimental/shootout.s
Native setup with optional actual bench roster
0x2AC1C2
FF FF FF FF FF FF4E F9 00 22 20 04experimental/shootout.s
Optional full-body turn observer
0x2DAB5C
FF FF FF FF FF FF4E B9 00 22 20 08experimental/shootout_rules.s
Reset per-attempt full-angle history
0x2DAA60
FF FF FF FF FF FF4E B9 00 22 20 0Cexperimental/shootout_rules.s

Rules, hooks, native tests and limits · Exact evidence · Remaining work.

2026-11-01

Optional goalkeeper reach and rebounds

Alt Goalies Off/On, default Off, adds reach21 and experimental catches, corner/rinkward returns and occasional goalward deflections. Native physics and goal statistics remain responsible for the outcome. Separate season preferences lock after match one.

Suggestion: floating #217606. Behavior, hooks and qualification · Exact evidence · Remaining work.

2026-10-31-r11

Optional pickup delay after a pass

Pickup Delay: Off/On is a separate start-menu choice, default Off. On briefly prevents skaters from taking or body-deflecting the puck after an ordinary human pass. Keepers retain their native saves. Height, Speed, Mode, Cone and Charge remain independent; seasons save and lock the choice after match one.

Hooks, native fields, behavior and tests · Exact evidence · Remaining work. 92/93 checks pass; the inherited AI geometry failure remains failed.

2026-10-31-r10

Hold the pass, release to play

Choose Pass Charge: Off/On in the start menu. Off is the default. On lets you build pass power while holding the button and launch when you release. Assisted/Directional, lift, speed and cone settings remain independent. The choice saves separately for each season and locks after its first match.

Physical player stars: P1 blue, P2 red, P3 green, P4 yellow. The original red goal frame is restored. Green and yellow use the native dark-green/golden-yellow colors; no shared rink palette is recolored.

Hooks, hex, native fields and tests · Exact-build evidence · Remaining work.91/92 shared checks pass; the retained AI geometry failure stays failed.

2026-10-31-r9

Easy assistance and clear player colors

Historical r9 colors were superseded in 2026-10-31-r10: P1 blue, P2 red, P3 green, P4 yellow, original red goal. The reported shared-palette regression is documented above.

On Easy, your whole team gets100-equivalent skills and full energy each game frame. CPU teammates, keepers and the bench are included; CPU-only opponents get20-equivalent skills. Normal and Hard keep their rating rules.

Player markers: P2 green, P3 red, P4 yellow. P1 keeps its original color. Static artwork changes preserve the native rendering instructions.

Hooks, hex, native field mapping and tests · Exact-build evidence.90/91 shared checks pass; the retained AI geometry failure remains failed. No new Hard win-rate claim.

2026-10-31-r8

Choose penalty frequency separately

New final start-menu row: Penaltys: 100% / 50% / Off, default 100%. The original combined setting is now Rules, keeping Off / On / On, Except Off-sides. Icing retains its separate switch; native penalty-shot eligibility and P1–P4 shooter ownership stay intact. Buffered pass shots also keep contact and shot setup coherent across native sprite updates.

50% admits approximately half the eligible ordinary fouls. Off suppresses new ordinary penalties and new fights. Injury stoppages remain through the native injury-only report, and fighting penalties stay paired. All five percentage/pass choices save per season and lock after its first match.

Native start menu with the new Penaltys frequency row

Why the original setting also controlled offside · Behavior, hooks, hex, storage and tests · Exact-build evidence. 88/89 shared checks pass; only the retained AI geometry failure remains and the strict gate stays failed.

2026-10-31-r7

Choose directional passing and receiver cone

Two new start-menu rows: Pass Mode: Assisted / Directional and Target Cone: Default / 15 / 30 / 45 degrees. Defaults remain Assisted and Default. Directional follows your eight-way aim without choosing a teammate; explicit cones narrow Assisted target selection by the actual vector half-angle.

Height and Speed stay independent. Seasons save all four choices and lock them after the first match. P1–P4, manual keepers and requested CPU-keeper outlets are tested. Hold/release charging remains separate research.

Native start menu showing Directional and a 45-degree target cone

Brodeur30’s proposal, menus, hooks, hex and tests · Exact-build evidence. 87/88 checks pass; the inherited AI geometry failure remains and the strict gate stays failed. All 40 ordinary scenes match fresh r6 controls.

2026-10-31-r6

Share automatic puck pickups

When a free CPU teammate takes the puck, control now goes randomly to an eligible active pad on your team. P1 no longer has the native first choice every time. Already controlled pass receivers and requested keeper outlets keep their pad; other players keep their skaters.

Both ordinary two-player and three/four-player co-op are covered. Manual keepers, pending Y and locked players retain priority. No extra menu choice is needed for this correction.

Behavior, hook, native RNG and P1–P4 input tests · Exact-build evidence. 86/87 shared checks pass; the inherited AI geometry failure remains and the strict gate stays failed.

2026-10-31-r5

Choose pass speed separately

The last main-menu row now offers Pass Speed: Normal / Slow, default Normal. Slow recalculates the pass to a moving receiver with lower nominal power. The separate Normal/Low height choice keeps its original lift calculation. Native short-pass limits and fast-receiver guards can leave a pass unchanged.

Both choices save per season and lock after the first completed game. This also corrects r4’s standalone height storage, which could overlap Full-season goalie data; separate native preferences now survive slot changes and reboot.

Brodeur30’s proposal, hooks, storage correction and tests · Exact-build evidence. 85/86 shared checks pass; the inherited AI geometry failure remains and the strict gate stays failed.

Main menu showing separate Pass Height and Pass Speed choices
2026-10-31-r4

Choose lower pass height

The last main-menu row now offers Pass Height: Normal / Low. Normal is the default. Low reduces targeted B-pass lift for both teams, including keeper passes; short passes keep their existing lift. The horizontal intercept calculation is preserved.

Each season saves its own choice and locks it after the first completed game. Standalone play has a separate preference. Lower lift can change landing and interception; The separate speed control was added in r5 above.

Brodeur30’s proposal, hooks, records and tests · Exact-build evidence. 84/85 shared checks pass; the inherited AI geometry failure remains and the strict gate stays failed.

Main menu showing Pass Height Low
2026-10-31-r3

Pass to a teammate who can receive

Downed skaters are skipped when choosing a pass recipient. If a teammate falls after the pass leaves the stick, he cannot take possession while still down. The puck can still hit his body and bounce; he can receive again after recovering.

Standing shot animations and keeper saves retain their eligibility. Cause, hooks, tests and timing limits · Exact-build evidence. Pass-height experiments are documented separately; the released height stays unchanged.

83/84 shared checks pass; the inherited AI geometry failure remains and the strict gate stays failed.

2026-10-31-r2

Shootouts start automatically

No button shortcut is needed: the next attempt starts after a short countdown. Once you begin your approach, carrying the puck backward or stopping it ends the attempt. A temporarily loose, unshot puck can still be recovered while it moves toward goal.

The rule follows puck progress, so body direction alone does not cause a miss. The existing shot/rebound and native scoring paths remain. Official rules, game tolerances, source and tests · Exact-build evidence.

82/83 shared checks pass; the inherited AI positioning failure remains and the strict gate stays failed.

2026-10-31

Goal nets tolerate light contact

The goal nets now need a harder impact to come loose. The release threshold is50% higher at both ends, for skaters and keepers. Heavy hits can still dislodge the net and trigger the normal stoppage.

The reported behavior was reproduced in native CPU play. The corrected scene keeps the net in place, while ordinary skating and a real speed burst retain their exact input and movement behavior. Four-byte change, boundary tests and limits · Exact-build QA.

81/82 checks pass; the inherited AI positioning failure remains and the strict gate stays failed. Remaining requests.

2026-10-30-r13

Pass with your manually selected keeper

When you control the keeper and hold the puck, the pass button now executes the keeper's native pass. It no longer takes the immediate player-switch route first. Without the puck, the existing nearest-puck switch remains.

Both teams and P1–P4 are covered. Mini stays at seven games. Code, paired controller tests and limits · Exact-build QA.80/81 checks pass; the inherited AI geometry failure remains and the strict gate stays failed.

Next: downed pass receivers and the remaining requests.

2026-10-30-r12

Mini: seven rivals, seven games

Mini now plays seven regular-season games, one against every other club in your division. The menu starts at1/7, all 32teams finish with7games, and there is no eighth return fixture.

The season summary or qualification follows game7. Mini still uses one game per playoff pairing. Schedule, persistence, native tests and source · Exact-build QA.

Native start menu: New Season Mini, Edmonton, game1/7
The actual start menu now shows1/7.

The inherited AI geometry failure remains documented; the strict gate remains failed. Other requests and the queued controller colors.

2026-10-30-r11

Your player, your penalty shot

When your controlled breakaway attacker earns a penalty shot, the same P1, P2, P3 or P4 takes control of the shooter. Other teammates cannot claim the attempt first. Normal team controls resume afterwards.

Penalty-shot ownership, seven-game Mini and manual-keeper passing are released. Downed receivers, random pickup ownership, the Penaltys setting and controller colors remain queued. Follow the priority list.

Code, controller tests and limits · Exact-build QA.78/79 shared checks pass; the inherited AI positioning failure remains documented and the strict gate remains failed.

2026-10-30-r10

Buffered one-timers meet the stick

Human buffered pass shots now wait until the puck reaches the stick, then show the native contact/follow-through pose. The old route could fire while the puck was still approaching.

Repeated shoot presses keep the pending shot; a teammate's shoot press cannot cancel the receiver's request. Ordinary shooting and AI code retain their paths. Mini stays inside your division.

Contact measurements, code and tests · Exact-build QA. The inherited receiver-positioning failure remains documented; the strict gate remains failed.

2026-10-30-r9

Mini stays in your division

All eight Mini regular-season games now stay inside your club's division: seven divisional rivals plus one return game. Edmonton can no longer draw Detroit in Mini. The simulated games follow the same divisional schedule.

Full and Light keep their league-wide schedules. Mini keeps existing playoff rules, season locks, single-player home/away alternation and co-op home games.

Schedule, code and tests · Exact-build QA. The inherited receiver-positioning failure remains documented; the strict gate remains failed.

2026-10-30-r8

Matching overtime length and fair momentum

Overtime follows the selected period length: 5, 7, 10 or 20 minutes. Sudden death and the shootout after tied overtime remain.

Shots and checks after the whistle no longer charge team momentum or boost ratings. Earned momentum stays; stopped-play actions cannot be banked for the restart. The same guard covers pauses, faceoffs and replays.

Code, hooks and tests · Exact-build QA. All76 shared checks ran:75 pass. The inherited receiver-positioning test failure remains documented; the strict gate remains failed.

2026-10-30-r7

Icing starts On

Icing now defaults On, as clarified by jdc. Fresh starts, new Full/Light/Mini formats and season restarts use On. The toggle and saved-season locks remain.

Edmonton, Auto line changes, Fighting Off, Hard, Auto Replays Off and Crit Shots Off keep their r6 defaults. The CPU keeper catch handoff and P1–P4 current-skater pass requests are unchanged.

Native start menu with Icing On and the other requested r6 defaults

Only three default bytes change outside version/checksum. All 75 checks ran: 74 pass, with the inherited receiver-positioning failure still documented; the strict gate remains failed. Code and tests · Current QA.

2026-10-30-r6

The keeper returns to CPU control on a catch

A keeper selected before catching the puck now returns to the computer, with the native AI marker. Your control moves to a free skater. When P1, P2, P3 or P4 presses pass, the keeper sends the outlet to that controller's current skater.

Fresh defaults: Auto line changes, Fighting Off, Hard, Auto Replays Off, Crit Shots Off and Icing Off, following jdc's latest menu screenshot. Edmonton remains preselected. Valid saved choices and season locks are retained.

Native start menu with Auto lines, Fighting Off, Hard, Auto Replays Off, Crit Shots Off and Icing Off

The reported catch is reproduced from recorded inputs. All 75 shared checks ran: 74 pass, with the same inherited receiver-positioning failure; the strict gate remains failed. Code, tests and compatibility · Exact-build QA.

2026-10-30-r5

Icing On/Off and Edmonton by default

Icing is the last row in the start menu, with a visible On / Off switch. It starts On, is saved separately for Full, Light and Mini, and locks with the other match rules after the first completed game.

Edmonton is selected on fresh startup and in newly created or restarted seasons. You can choose another club before starting; ongoing saves keep their club.

Bottom of the native start menu showing Icing On below Crit Shots

34 native menu/persistence cases and 56 native rule fixtures pass. All 72 shared checks ran: 71 pass, with the same inherited receiver-positioning failure; the strict gate remains failed. Forty current default-On no-B scenes match fresh r4 controls exactly. Code, tests and compatibility · Current QA.

2026-10-30-r4

Keeper pass requests reach the outlet before timeout

A timely pass request could change the selected skater while the keeper's possession timer expired before he passed. The first accepted request now gets time to reach the native outlet. Requests after the native timeout or whistle retain the normal stoppage.

In paired timing tests, valid outlets rise from 1,776 to 1,792 out of 1,792; all 128 late/stopped requests stay blocked. These are replay branches, not independent matches. All 70 shared checks ran: 69 pass, with the same documented receiver-positioning failure; the strict gate remains failed. All 40 no-B AI scenes exactly match fresh r3 controls. Code, tests and limitations · Current QA.

2026-10-30-r3

Keepers recover from the lateral-carry fake

CPU keepers track the actual puck on the stick. When a carrier moves across an anticipating lateral save, the keeper can finish its stale hold sooner and reassess. Native movement, player ratings and shot physics remain. Manual keepers and ordinary loose-shot/catch saves keep their behavior.

In 48 paired native approaches, goals fell from 10 to 4 and keeper catches rose from 15 to 22. All 69 checks executed: 68 passed. The inherited receiver-hold positioning check still fails, so the strict release gate remains FAILED. This is the same documented AI limitation retained in the user-selected playtest. No new Hard-versus-Normal win-rate series is claimed. Code, tests and limits · Exact-build QA.

Keeper follows the same recorded lateral approach after recovering from an early save
The same scripted approach and elapsed frame. Previous keeper still committed to the old side.
2026-10-30-r2

Crit lock, immediate B switching and the complete Stars panel

The selected 38-win tactical base is retained. All 40 saved no-B AI situations match it frame-for-frame. All 67 checks ran: 66 passed; the inherited receiver-positioning limitation remains documented, so the strict gate is still failed. No new win-rate series is claimed. Changes, exact tests and rollback · Current QA.

Complete native Stars of the Game window after a pending shot-panel timeout
The full border and background are preserved. Original corrupted window.
Completed · accepted by jdc on 2026-10-31

Hard cross-ice passing and smarter shot openings

Hard plans native cross-ice passes, supports its receiver and checks the keeper opening at the catch. It can choose a more open native post and carry or pass instead of forcing a covered direct shot. Native player ratings, skating, shot accuracy and power stay intact.

38 wins in 50 Edmonton Hard games against Chicago Normal, goals 132–66, with 25 home games each. The matched previous release won 32/50. jdc accepts this released Hard base as complete. The earlier stable 39/50 benchmark remains historical and was not achieved; it is no longer an open task.

The original 2026-10-30 image passed 62 of 63 checks, including native catches, scorer/keeper accounting and existing controls/settings/presentation. One receiver-hold positioning test failed: average slot positioning worsened relative to native tracking. That known limitation remained in the later r2 maintenance release, which passed 66 of 67 checks. The strict release gate remains failed. AI changes, source and limitations · Original comparison results · Current QA

2026-10-29-r3

Crit Shots now shows On / Off

The Crit Shots value now appears on first selection and after a restart. Left/Right switches between On and Off, aligned with Auto Replays. Off still applies on Easy.

All40 shared release checks pass, including a native rendering regression reproducing the missing initial value in r2. This update corrects the menu display; Hard AI work continues separately.

Crit Shots On visible in the main menu
On on the initial draw. See Off.

Correction and tests · Exact-build QA

2026-10-29-r2

Crit Shots: On / Off

The main menu now has a saved Crit Shots choice. It starts On and stays shared across restarts, seasons and native modes. You can change it during a locked season.

Off also applies on Easy: no critical power bonus, red puck, flames or special shot sound. Auto Replays keeps its own independent setting. All 39 shared release checks pass; the separate Hard AI-strength work continues.

Main menu with Crit Shots Off and Auto Replays On
Crit Shots remains editable while the season's match settings are locked.

Changes and tests · Exact-build QA

2026-10-29

Hard CPU coaching and stability

Hard CPU teams choose a stronger available keeper and first forward unit from their real roster. Native ratings, physics and fatigue are retained; Normal/Easy AI decisions and human teams keep their behavior.

Also fixes native rewind/powerplay-display crashes and reserve-goalie season statistics. All38 exact-build checks pass. This playable test copy is released while the larger AI-strength investigation continues.

Changes and limits · Exact-build QA

2026-10-28-r9

Hard: press, pass and shoot

The nearest CPU skater presses an opposing puck carrier even when he stands still. Teammates keep covering their positions. CPU carriers consider more clear blue-line shots; point receivers can catch and relay to a better finishing position.

Free slot receivers can shoot immediately on the actual catch using the buffered native one-timer. Passes still travel through real defenders and can miss or be intercepted. Native ratings, skating speed, shot physics and human controls retain their rules.

Implementation, paired comparisons and limits · Exact-build QA receipt. Small staged tests establish the actions, not a win rate.

2026-10-28-r8

Hard defenders meet the puck carrier earlier

On Hard, the nearer available back closes the carrying lane from the goal side. His partner protects a dangerous slot receiver, or the weak post when no receiver is there. This builds on the existing Hard attack and weak-side winger work.

In 16 paired defensive situations, the goal-side pressure gap fell in 15, averaging 33 rink units closer. One case had a 4-unit larger gap with better slot coverage. Eight Normal/Easy controls retained native target decisions. In 24 scripted rush/shot situations, observed attacker releases fell from 11 to 7 and attacking-team goals from 7 to 6. These small controlled samples do not establish a win rate or guarantee fewer goals in every match.

Previous Hard defenders remain deeper as the puck carrier enters
r7: the defensive pair stays deeper.
Hard defender closes the puck carrier while his partner protects the slot
r8: earlier pressure with slot cover. Same setup and elapsed time.

Player controls, ratings, skating speed, shot physics and goalkeeper reach keep their established rules. Implementation and test limits · Exact-build test receipt.

2026-10-28-r7

Shot charge: white, orange, red

The charge meter starts white, turns orange as the slapshot builds, and stays solid red at full power. The fill remains visible at maximum charge. Release timing, shot power, critical chance and shot speed keep their established behavior.

Native shot meter at low white charge, middle orange charge and full solid red charge
Native game captures enlarged: low charge, charging, and maximum charge.

Source and test evidence · Exact-build test receipt.

2026-10-28-r6

Keep your team, choose automatic replays

Continue Season keeps your controller on your chosen club in away games. Reloading the locked settings could previously assign a solo player to the home opponent. Full, Light and Mini now preserve the correct side at match start.

Auto Replays: On / Off is the row above Crit Shots in the main start menu. The choice is saved across restarts and shared between leagues and native modes. It can be changed during a season; match settings remain locked. Manual Instant Replay remains available when automatic replays are Off.

Leaving Scoring Leaders before the third period now returns to a visible menu with one Start press. Automatic replay no longer leaves a stale redraw flag. Crowd meters also stop erasing the right edge of the EA Hockey Night score ticker during penalty scenes.

Main menu with Auto Replays set to Off
The replay preference can be changed while the season's match settings stay locked.

All 28 shared release checks pass for this build. New coverage includes 32 native match starts across two cold boots per scenario, pre-third statistics exits, a pixel comparison of the ticker, saved replay preferences and a real goal with automatic replays Off followed by manual Instant Replay. Fresh progress on each new release; controller mappings retained. Causes, source addresses and test details · Exact-build test receipt.

2026-10-28-r5

Hard: attacking support and better pass choices

AI forwards move with the puck: a far-side option toward the slot, a near-side return outlet and inside support from the center. A marked preferred spot makes the forward drop into another lane. CPU pass decisions evaluate free teammates in better positions. A poor-angle shot can wait when a better receiver is available.

Hard now has the same dynamic crowd momentum and rating effect as Normal. The permanent human −10% / CPU +10% handicap is removed. Hard keeps the new attack decisions and r4 defensive coverage. Both teams' AI teammates benefit. Easy keeps its existing bonuses; Normal and Easy retain native attacking decisions.

In eight paired staged native pass situations, passes toward the free receiver rose from 3/8 to 8/8, and actual receptions from 2/8 to 4/8. Eight additional support comparisons show the forward escaping a designated marker more often. These are controlled small samples, not match win-rate or guaranteed scoring claims. Native pass checks, reception and shot physics remain in use.

Previous Hard AI supporting forward near a marked target
r4 support in the staged comparison.
Updated Hard AI forward moves into a return passing lane
r5, same setup and elapsed frames.

Credits stay until Start. The automatic timeout is gone; A/B/C and directions do not dismiss the card.

All 24 shared release checks pass, including 76 native attack cases, 16 paired attack scenarios, 12 crowd profiles, Start-only credits and a complete Hard CPU match. Implementation, backup and test limits · Exact-build test receipt.

2026-10-28-r4

Hard AI covers the far-side threat

On Hard, when the opponent carries deep along the boards, the AI winger on the other side now drops into the low slot. He chooses a dangerous receiver, anticipates a short movement and covers from slightly inside and goal-side. Without a receiver he protects the weak post.

This applies to both teams and both ends, including your AI teammates. Easy and Normal keep native positioning. Human controls, player ratings, skating speed, shot chances and goalie reach keep their established behavior. Native steering and checking still run.

In 11 paired native Hard skating situations, the winger moved closer to the receiver in every comparison. Average coverage distance on Hard fell by 27 rink units over the measured frames. Eight Normal/Easy controls retain the baseline positioning. This measures positioning, not a guaranteed scoring or win-rate change. 44 target/guard cases and the full 20-check shared release gate also pass. Tests use scripted native input.

Baseline AI winger remains wide while a receiver waits near the slot
Before: the far-side winger stays wide.
Updated AI winger skates inward toward the far-side receiver
r4: the winger moves inward. Same controlled setup and elapsed time.

Implementation, exact comparison limits, rollback backup and research credits: AI coverage notes. Current test receipt: QA_STATUS.json.

2026-10-13

1Co-op passing to your teammate

In Players: Two – Teammates, player 1's passes rarely went to player 2. The pass routine picks the teammate with the lowest "cost" (distance² plus a penalty if he isn't in the stick direction, ±45°) and makes no difference between humans and the computer, so a closer CPU player almost always won. A CPU receiver also skates into the pass by itself, a human doesn't, so passes to player 2 looked worse too.

Bot test, 100 passesBeforeAfter
Pass target was player 255 %86 %
Player 2 actually got the puck30 %44 %

2026-10-22: reach 20 → 40

New bot test (player 2 standing still, ±35° aim error, about 80 passes per version). Faster passes between the humans were tried too and were worse: the puck was gone before it could be taken.

Reach of the human pass targetPlayer 2 got the puckThe other team got it
20 (before)48 %31 %
3255 %25 %
40 (now)59 %18 %
2026-10-19

2Goalie passes are never blind

How it works today (2026-10-26): when your goalie has the puck he waits until you ask for it. Press pass (Xbox A / Genesis B) and he passes to the player you control, in co-op to the player of the pad that pressed. A press you are still holding when he catches the puck counts too. While his pass is on its way, extra presses no longer switch your player, so you keep the receiver. Y takes control of the goalie himself (manual goalie) and gives you the normal controls. If nobody presses, the game's own hold timer and whistle apply as usual. The text below is the original fix from 19 October.

If no teammate was inside the stick cone, the goalie just fired the puck straight out, often onto an opponent's stick. Short passes could also fly up to twice as fast because the flight time is rounded down.

72 goalie passes (8 positions × 9 stick directions)BeforeAfter
Blind passes210
Picked up by an opponent2012
2026-10-20

3Shots from the blue line can score

A set goalie saves everything below height 15 within 12–15 pixels, and the crossbar is at height 13. So a goalie in position was practically unbeatable from distance: 0.3 % of blue-line shots went in.

  • The shot routine stores the distance to the net. From distance 160 or more (the green zone, starting about 20 pixels inside the blue line) the game's own random generator decides, once per shot, whether the goalie misses it: 15 % chance.
  • While that is active the goalie can't reach or pick up the puck. It still has to go under the bar and between the posts.
  • Long shots get 1/8 less lift so fewer of them sail over the bar.
  • Applies to both teams, CPU included. You don't have to stand exactly on the line, anywhere in the green works.
  • The zone started at distance 140 at first and was moved out to 160 to make it a bit harder.

Measured

288 bot shots from 12 blue-line spotsGoals
Original1 (0.3 %)
Only shrinking the goalie's reach2–5
25 % miss chance12 (4.2 %)
40 % miss chance21
Historical 15 % estimate (before crit/Easy)≈ 2.8 %

The table above records the original pre-crit experiment, not current Easy scoring odds. The r32 audit verifies the current 15% roll separately. In that older experiment, about 17 % of shots where the goalie misses actually go in, so 15 % × 17 % + 0.3 % ≈ 2.8 %, close to the real NHL's ~3 % from the point. With 25 %, ten CPU games with Edmonton gave 8.7 % from the green zone versus 7.8 % from closer in, which was too generous. Better shooters score more: with the same 288 shots and the 25 % chance, McDavid's ratings scored 7.3 %, Draisaitl's 5.9 %, an average player's 4.2 %.

Rink with green zone at distance 140 and more
Green = the goalie can miss. Yellow line = distance 160 from the net.
Green zone at distance 140 and 160
The zone was moved out from distance 140 to 160 on October 21 to make it a bit harder.

Shootouts

Shootouts (Play Mode → Shootout) are decided close to the net, so the change does not touch them. 810 bot attempts per ROM: original 20 goals, patched 19, none from long range in either. Almost every goal came from the same move: skate straight, cut left briefly, shoot about 38 pixels from the goal line. CPU vs CPU barely ever scores (0 in 85 attempts on the original).

Shootout
CPU shootout, 0–0 after 13 rounds.
2026-10-21

4Off-screen arrow points the right way

When the goalie is off screen an arrow at the top edge shows where he is. In shootouts with a manual goalie it said the goalie was to the left, but when the shooter got there he was in the middle of the net. The arrow code comes from the original NHL 94, whose screen was 256 pixels wide (centre 128). This hack runs at 320 pixels (centre 160), so every edge arrow was drawn 32 pixels too far left. One constant changed ($16590: +$100 → +$120). Measured: the arrow for a goalie at x = 0 now sits at screen x 159 instead of 127.

Arrow before
Before: goalie is centred, arrow is left of centre.
Arrow after
After: arrow over the goalie.
2026-10-21

5Fighting: just Off and On, and it sticks

How fights work in this hack

Fights are added by the hack (the original NHL 94 has none). A fight can only start from a body check, and then the game checks:

  1. Fighting is on and Penalties is not Off.
  2. Neither player is a goalie and play is live.
  3. Both players' fighting rating beats a threshold. The threshold drops as the game gets heated and when the players already have penalty minutes.
  4. Finally a 25 % random chance.

Most players have a fighting rating of 0–6 and rarely pass the threshold, enforcers around 14 do. So fights are rare by design.

The bug

The setting was stored in RAM $FFDF00, which lies inside an event log the hack writes during the game (14 bytes per entry from $FFDEF6). After the first entry the setting held player data such as $0D12, so the menu choice stopped meaning anything mid-game. Value 0, which disables fights in the code, was labelled "Also On" in the menu.

The fix

The setting moved to free RAM $FFF004 (6 code references and 3 menu references changed). The menu now has two choices, Off and On. When Penalties is Off, Fighting shows N/A (fights need penalties on anyway). Tested: Off stays 0 and On stays 1 for whole CPU games. With everyone's fighting rating forced to max, a real fight happened (Beauvillier vs Toews).

Fighting menu
The menu: Off / On.
Fight
Fight test, all fighting ratings maxed.
2026-10-21

6All 32 rosters, October 21, 2026

Every team was rebuilt from the NHL's official API (rosters and prospects) and the current DailyFaceoff line combinations. Each team keeps the hack's 26 slots and its number of goalies, forwards and defencemen. Players are chosen in this order: in tonight's lines, rest of the roster, injured, prospects with NHL games, other prospects. The lines keep DailyFaceoff's trios and pairs, turned so every player plays his official NHL position (centre in the middle, left and right wings on their sides). Click a team under Teams to see its lines and ratings.

Edmonton was done first, by hand: lineup from the 4–3 win over Minnesota on October 20, Max Jones (not playing) and Mattias Janmark (injured) left out.

LineLWCRW
Scoring 1HymanMcDavidPodkolzin
Scoring 2FormentonDraisaitlKapanen
CheckingHowardDachJoseph
PairsLDRD
Scoring 1EkholmBouchard
Scoring 2SheaMurphy
CheckingWalmanEmberson

Goalie: Levi (Jarry, Andersen). PP1 Hyman–McDavid–Draisaitl, Ekholm–Bouchard. PP2 Howard–Hallander–Kapanen, Walman–Murphy. PK1 Kapanen–McDavid, Shea–Bouchard. PK2 Formenton–Michaels, Ekholm–Murphy.

Line editor
In-game Line Editor after the patch.

Ratings for new players

EA's public NHL 27 ratings only list the top 300 players, and the 8 Oilers there are already in the ROM. So the new players got ratings from their NHL stats (points, goals, shots, ice time, hits, blocks, penalty minutes, weight): each one gets the average of the 12 ROM players with the most similar stats, which keeps them on the hack's own scale. Tested on the players already in the ROM, it usually lands within half a step of their real ratings. Players who were already somewhere in the ROM keep the hack's ratings. Players with fewer than 20 NHL games are pulled toward a depth-player template, players without NHL games get the template. New goalies get the average of the 8 ROM goalies with the closest save percentage. Example, Edmonton:

PlayerWgtAgiSpdOffDefPwrChkFightStkAccEndPasAggSimilar to
Formenton 266333333132332Dewar, Luostarinen, Evans
Michaels 435332322133332Östlund, Kerfoot, Yamamoto
Hallander 198232322122222Kotkaniemi, Eller, Pearson
Levi 27 (G)Same level as Demko, Tarasov, Ingram, Schmid (save % ≈ .893)

Scale 1–6, weight 1–14, fight 0–7. For comparison McDavid has 6 in speed, offence, stickhandling and passing. Tested: all 32 rosters read back exactly from the ROM, and full CPU games (WPG–EDM, BOS–CAR, CBJ–OTT, NSH–TOR, SEA–ANA) ran without errors.

Later fixes

2026-10-21

7A full season

Regular Season is now a season. In the dated Season - jdc version, pick your team, play an 84-game schedule, and follow the standings and the stats of every player. Everything is saved in the game's battery memory, so it works in any emulator (RetroArch saves it as a .srm file) and on real hardware with a flash cart.

The main menu

  • Play Mode shows Continue Season when a season is saved. Move right to New Full Season (84 games), then New Season Light (31) and New Season Mini (8). Left and Right cycle through the available modes and wrap around.
  • New Season Light: 31 games. Each of the 32 teams meets every other team once. After game 31, the 16 qualifying teams enter a single-elimination playoff: one game decides each pairing.
  • New Full Season: pick your team in the Team row. The first game you play starts the season with that team, and only then is the old season deleted (go back to Continue Season before playing to keep it).
  • Players supports One or Two - Teammates, plus Three/Four - Teammates with a4-Way Play adapter. Co-op season games stay at home. Season settings remain locked after the first completed game.
  • Game shows your next game: 5/84 vs CAR (home) or at CGY (away). The schedule has every opponent 2–3 times, home and away alternating.
  • After the first game nothing in the menu can be changed except Play Mode: the settings you started with apply all season. The other modes (playoffs, shootout) still work as single games.
Main menu
Continue Season: your team and the next game are locked in.

The season menu

Press Start in the main menu: you go straight to the pre-game menu (the Matchups screen is skipped in a season). There:

  • Start Game: play your next game.
  • Season Standings: one division per page (Atlantic, Metropolitan, Central, Pacific), sorted by points then goal difference; opens on your team's division. Left/Right = division, Up/Down = choose a team, C = that team's players.
  • Scoring Leaders: the league's top 32 by points (goals break ties), 16 per page.
  • Restart Season: asks first (A+C = yes, Start = back; on a pad with X/A/B the Genesis A is X and C is B), then deletes the season and takes you to the main menu.
  • Season Standings and Scoring Leaders are also in the pause menu and after each game (they replaced Other Scores and Record Holders).
Standings
Season Standings, Pacific Division.

The division table after every game

When a season game is over you get the standings drawn with the team banners from the game's own playoff tree (no cup), one division per screen: its 8 teams by points, with games played, points and the gap to the division leader (the leader shows his lead over number 2). It opens on your division, your team is marked with an arrow and blinks. Left/Right = the other divisions, Start goes on to the main menu. The font's shadow colour is darkened on this screen (the game's light shadow made the digits look blurry on dark blue).

Division table
After a game: your division (Edmonton 5th in the Pacific, 7 points behind).
Team players
C on a team: its skaters sorted by points; Right shows the rest and the goalies.
Scoring leaders
Scoring Leaders.
New season
Season restart confirmation (earlier build).

Season - jdc - 2026-10-31

Current version: 2026-11-02. Each new release replaces the preceding jdc download with a new version name; Full, Light and Mini are included in this one ROM. jdc and Bodin start each new version with fresh progress; controller mappings are retained.

Shared QA checklist: Claude and Codex now follow the same test and release plan, with results bound to the exact ROM version.

Settings remain locked (28 October, r3): Continue Full/Light/Mini keeps its match settings after reboot. The temporary legacy unlock is removed, and Auto line changes are saved correctly. Details and tests.

Forum fixes and boot credits (28 October, r2): five gameplay corrections, including penalty-shot collision recovery and boxed-player pass selection. Reports and results; credits and sources.

Season settings kept, penalty minutes saved (28 October, from the NHL94 forum): a season now remembers its own Period Length, Goalie Control, Penalties, Line Changes and Fighting. Before, after leaving the emulator these came back as the start-up defaults and were locked for the rest of the season. r3 correction: older started seasons also stay locked. Saved choices are validated and recovered; choices for a new season are captured before match setup so Auto line changes remain Auto. Penalty minutes per player are now saved for the league and the playoffs and shown as a PM column on the season's club statistics pages.

Restart a finished season from the main menu (27 October): for a finished Full/Light/Mini season the Play Mode row now has a second choice next to See Old Full Season: Restart Full Season (Right). Start on it asks for X + B, like the finished-season menu, and starts a fresh season in that slot only. Also: the shot-power bar has no see-through lines above and below any more, and the crowd-bar graphics moved out of the window-plane area a broken glass panel uses (garbled ice and boards in that corner).

Meters in front of the players, flames after menus (26 October, r37/r38): the crowd meters and the shot-power bar are now drawn into the scoreboard layer like the score box, so skaters pass behind them instead of over them. And crit flames no longer go missing: text from the season menus could leave the flame timer at a huge value, so the flame graphics were not loaded for minutes of play; it is now reset at every face-off of a new game.

Difficulty kept per season (26 October, r36): the Difficulty setting was only in memory, so after a restart a season played on Easy came back as Normal, and could not be changed because it locks after the first game. Each season now saves its own Difficulty when a game starts and gets it back on start-up or when you switch seasons.

Faster Scoring Leaders (26 October, r35): opening the list and every sort now ranks the 800 players in one quick pass instead of 32 slow ones (about 1.5 s with no input before, so a Start press got lost and you had to press twice). Same order as before.

Sortable Scoring Leaders between games (26 October, r34): the season's Scoring Leaders in the pre-game menu now sorts by points, goals or assists with C (Xbox B), the chosen column in red, like the browser after a finished season. Left/Right still pages, Start goes back.

Crit flames follow the puck (26 October, r33): a crit could have its red puck and bomb sound but almost no visible flame trail. When the camera followed the shot, the six circles overlapped. They now follow the puck's path across the ice while the camera scrolls. Reproduced and checked in Mini, Easy, 5-minute periods, Fighting Off, Edmonton–Chicago. Shot power and goal bonuses are unchanged. Source, tests and before/after pictures.

Crit circles overlap while the camera follows the puck
Before: the flame circles overlap.
Six separated flames follow the critical puck
After: a visible trail during the same camera movement.

Strong crits fixed and measured (26 October, r32): the very hardest crits could become slower and swerve the wrong way because the original velocity calculation overflowed. That is fixed. Tested Edmonton, Colorado and Toronto on Easy, Normal and Hard with 5, 7, 10 and 20-minute periods: 14,400 matched shots before/after. Bouchard #2 scored 32/100 full crit shots from the long-shot zone on Easy against an active goalie. The goalie-miss bonus activated 15.03% beyond distance 160 and never below it; Easy produced 2,400/2,400 actual crits. These are isolated goalie tests with other skaters out of the lane, not normal match scoring odds. Method, source and results · Full comparison CSV.

The strong Toronto crit before the fix: 102 km/h
Same Toronto shooter and shot: before, 102 km/h.
The same strong Toronto crit after the fix: 193 km/h
After the fix, 193 km/h with the correct direction.

Shot panel stays through the replay (26 October, r31): the speed box now sits directly above the team/score box and has the same width and height. The charge meter is inside. The recorded km/h and mph stay visible throughout the goal replay, then disappear when play returns (also when skipped). The full-charge display now follows the complete wind-up. Source and tests.

Charge and speed inside the box above the scores
The shot box after a native critical slapshot.
The same shot speed visible during the goal replay
The recorded speed stays visible through the replay.

No replay after the final horn (26 October, r30): the automatic goal replay could start after the game was over even though nobody had scored; fixed.

Shot speed in a score box (26 October, r29): the km/h and mph readout under the shot meter is now a real score-box panel, drawn with the game's own HUD frame and font exactly like the "COL 0 / WAS 0" box; it disappears after four seconds, at the next wind-up or when a replay starts.

Shot meter lower and steady; score-box skip hint (26 October, r28): the meter sits lower (the GOAL banner covered its text), the speed uses a narrow font on black plates in graphics memory nothing else touches (a broken glass used to scramble it), and the replay's "X+B SKIP" now looks like the score box (black plate, grey frame, blocky letters).

Shot meter and Easy difficulty (26 October, r27): a small meter top right fills while you wind up a slapshot; full = red and blinking in that release. Since 2026-10-28-r7 it starts white, turns orange and stays solid red at full charge. After the shot its speed shows under it in km/h and mph, measured honestly from the rink (centre line to goal line = 89 ft): the hardest normal slapshot is about 148-153 km/h (92-95 mph), a crit up to about 176-184 km/h (109-114 mph), above Zdeno Chara's NHL record of 108.8 mph (2012 All-Star Skills). Difficulty now has Easy too: your meters are always full (CPU empty), and every forehand slapshot of yours is a crit (backhands and quick wrists never crit).

Shot meter with 176 km/h / 109 mph
The shot meter after a crit slapshot.

More crits, better co-op passes (26 October, r26): every crit-eligible shot gets 3 percentage points more crit chance (rating 100: 13%, 50: 8%). A pass now finds your human teammate even when he stands up to 90° off the direction you aim (it was 45°, so a CPU skater straight ahead took the pass), and with three or four players the nearest human gets it.

Skip hint, no menu flash after the replay (26 October, r25): under REPLAY a smaller "X+B SKIP" shows how to skip it (Mega Drive A + C). When the replay ends or is skipped it now goes straight back to the game; the replay's Options / Reverse Angle box no longer flashes up.

Y takes the goalie with four players (26 October, r24): with 3-4 teammates Y now takes your goalie also while a teammate skater has the puck (it switched skaters instead). Y is still a pass when you carry the puck, and the outlet request while your own goalie holds it; B brings you back to a skater.

REPLAY title (26 October, r23): the automatic goal replay shows a big chrome "REPLAY" in the corner, in the style of the NHL'94 logo, instead of the grey A/B/C VCR box. The Instant Replay from the pause menu keeps its controls.

Automatic replay with the REPLAY title
The automatic goal replay.

Skater switching with four players; settings locked in a season (26 October, r22): with 3-4 teammates on 4-Way Play, B (pass) switches to the nearest free skater again, also from a goalie you took with Y. Fighting and Difficulty can be set before a season's first game and are then locked like every other row.

Three/Four in original playoffs (26 October, r21): original New Playoffs, New Playoffs /7 and Continue Playoffs now also offer Three/Four - Teammates. The player count is remembered separately from Full/Light/Mini, and Two - Head to Head remains available. Source and tests.

Choose and remember players in playoffs (26 October, r20): select Continue Full/Light/Mini PO, move down to Players and choose One, Two, Three or Four - Teammates. Each season now remembers its own player count when you switch series or close and reopen the game, in both league and playoffs. Your qualified team, results and playoff tree stay the same. Three/Four requires the 4-Way Play configuration below. Source and restart tests.

Goalie controls for all four teammates (26 October, r19): your goalie stays under AI control after catching the puck. Tap the pass button to request a pass to your own skater, including players 3 and 4; a tap during the catch or dive waits for his recovery. Y takes the goalie manually. Changing to a season showing One now starts one player, and players 3/4 are inactive during the two-player shootout rotation and restored after it.

Tested with three and four players: Full, Light and Mini matches, switching player counts, menus, pause/resume and repeated cold starts. Two complete Mini games produced 27 goalie passes and 17 receptions; automated checks also cover catches, diving recovery, short taps, all requesting controllers and all playoff formats. Source, tests and technical notes.

Menu no longer freezes with 4-Way Play (26 October, r18): switching Play Mode onto a season saved without the adapter made the game forget the adapter, and the menu stopped taking input. Fixed.

Three / Four - Teammates in a season (26 October, r17): the first season game with three or four players no longer breaks the season (it was saved without your team, and the main menu could hang afterwards).

Up to four players on one team (26 October, r16): with a 4-Way Play adapter the Players row offers One, Two - Teammates, Three - Teammates and Four - Teammates; three or four of you then control the same team, also in a season (every game at home, as co-op). In RetroArch: Quick Menu → Controls → Port 1 and Port 2 Controls → Device Type "MD Joypad 6 Button + 4-WayPlay" (Port 2 is the one the game detects), then Quick Menu → Restart. With the adapter on, ordinary skater switching uses the game’s native behavior; r19 adds the goalie hold/pass/Y controls for all teammates.

Grey menu picture for every team, menu music back (26 October, r15): the main menu picture no longer takes the away team's colours, and the menu music plays again (it had been silent since the Season Edition intro replaced the title screen).

Season Edition main menu (26 October, r14): the main menu now shows the same "NHL'94 Season Edition" picture as the start-up screen behind its panels, instead of the old sunset skyline.

Main menu with the Season Edition picture as background
The main menu with the start-up picture behind it.

Goalie outlet during the catch (26 October, r13): a quick B tap while your goalie is still catching the puck no longer switches skaters; it is kept, and the goalie passes to you as soon as he has the puck.

Top 100 scoring leaders (26 October, r12): the Scoring Leaders list now goes to place 100; Up/Down pages through it 18 at a time. Changing tab or sort there rewrites the list in place.

Scoring Leaders in the Season Complete menu (26 October, r11): a finished season's menu now has See Results, Scoring Leaders (that season's top scorers), Start New Season and Back to Main Menu. Start on a statistics page goes straight back to this menu.

Cleaner statistics screens (26 October, r10): the dark boxes behind every letter on the Season Complete menu and the statistics pages are gone; the text now sits on a slightly darker SPORTS background.

Fast team browsing (26 October, r9): switching club (Left/Right) or tab (A) on the statistics page now also rewrites the page in place, as fast as changing the sort.

Quiet, quicker statistics (26 October, r8): changing the sort (G / A / PTS) on the statistics pages rewrites the list in place instead of redrawing and fading the whole screen, and the menu music stops while you look at the statistics.

No freeze before the faceoff (26 October, r7): a match could stop on the "Resume Game" menu right after Start Game. The game's own intro uses almost the whole sprite list; the crowd meters, drawn first, pushed it into the game's pause flag. The meters are now drawn last, only while there is room, and the crit flames only after a real crit.

Season Complete menu first (26 October, r6): choosing See Old Full/Light/Mini Season now opens the Season Complete menu straight away (See Results / Start New Season / Back to Main Menu); the statistics open from See Results.

Faster Season Complete menu (26 October, r5): moving up and down in the menu after a finished season (See Results Again / Start New Season / Back to Main Menu) now only moves the marker; it no longer redraws and fades the whole screen on every step.

Goal replays play again (26 October, r4): the automatic replay after a goal now actually plays the goal; it only showed a still picture. A finished season's menu no longer shows your club against itself (for example Edmonton vs Edmonton).

No hang after viewing old season results (26 October, r3): after looking at a finished season's results and starting a new season in the same session, the first match could freeze on its start menu. Fixed.

Longer crit flames, crits in shootouts (26 October, r2): the crit tail is now six flames that follow the puck through the whole shot and burn out slowly afterwards, and it no longer disappears when many players are on screen. In shootouts a crit now also turns the puck red with flames (before, it only got the extra power and the effect stopped after one frame).

Crit puck with a six-flame tail
The longer flame tail (enlarged test capture).

Finished seasons show their saved results (26 October): completed slots say See Old Full Season / See Old Light Season / See Old Mini Season. Start opens the saved statistics instead of an extra match. After Scoring Leaders, choose to view again, start a new season in that slot, or return. Xbox X + B confirms a new season; Start cancels. Other seasons are kept. Code and native tests.

See Old Mini Season with Edmonton and Season finished
A completed series opens results, never a fictitious next fixture.
Winnipeg text and logo match after changing the team in a completed-season menu
New seasons allow club selection. Completed seasons retain their saved club.

Clear statistics selection (r29): the selected G, A or PTS column heading turns orange when you change sorting. Up on the first page and Down on the last page keep the display still. Column headings now align with their numbers, and a blank row separates the player list from the controls. Both pages show Sort: Xbox B / Mega Drive C so Xbox players can identify the button. Code and verification.

Goalie pass input across a catch (r26): a pass press still held when the keeper catches the puck now requests the outlet, even if that press had just switched skaters. It reaches the requesting player's controlled skater after recovery. With no pass input he still holds the puck.

Browse every club after the season (r26): Left/Right cycles all 32 teams. A switches Season + Playoffs / Regular Season / Playoffs, C sorts points/goals/assists, Up/Down shows page2 with goalies. Start opens league Scoring Leaders; B there returns to your selected club. Both controllers work. On the Xbox layout A/B/C mean X/A/B. Code and verification.

Dallas Season + Playoffs statistics with the selected PTS header orange
Selected sorting is highlighted in orange; Left/Right still browses every club.

Automatic goal replays (25 October, r25): about a second and a half after every goal, the game's own Instant Replay starts by itself and plays the goal, then the game continues to the faceoff. Hold X + B (Genesis A + C, the same as Abandon Season) to skip it. No replays in shootouts.

Flame trail on crits (25 October, r23, fixed in r24): a critical slapshot now leaves a red and orange flame tail behind the puck while it flashes. In r23 it was sometimes missing when many sprites were on screen; since r24 it always shows.

A crit puck with a flame tail behind it, enlarged
The flame tail behind a crit puck (enlarged test capture).

Mashing pass for the goalie outlet (25 October, r22): when your goalie holds the puck, the first pass press already makes him pass to you. Extra presses while the puck was travelling used to switch your player back and forth, so the cursor jumped around. Now the pass button does not switch players until the pass has arrived.

Season statistics with tabs and scoring leaders (25 October, r21): after the Season Summary you can browse all 32 teams' players and then the league's top18 Scoring Leaders. Both have three tabs, switched with A (also Left/Right on Scoring Leaders): Season + Playoffs, Regular Season and Playoffs; C changes the sorting between points, goals and assists; Up/Down shows page2 of the selected team with the goalies. Playoff statistics are now stored separately from the league. All the other playoff series get games and statistics too, and if you are knocked out the rest of the playoffs is simulated to the end in the background, so the playoff leaders are complete.

Your team's players, regular season tab sorted by goals
Your team, Regular Season tab, sorted by goals.
League scoring leaders
Scoring Leaders for the whole league.

Co-op game row (25 October, r20): with Players set to Two - Teammates every season game is played at home (the game's co-op mode controls the home team). The Game row now says so, e.g. 84/84 FLA (co-op), instead of switching from "at" to a misleading "vs".

End-of-season summary (25 October, r19): when your season ends, the game now wraps it up. If you win the Stanley Cup you first see the game's own Playoff Stats and Champions page with the cup; if you are knocked out, the playoff bracket; if you miss the playoffs, the league table after your last game. Press Start and a Season Summary follows (record, points, goals for and against, and how it ended), then Start again for every player's statistics for the whole run, regular season and playoffs together (goals, assists, points, shots; page 2 with the goalies: games, wins, goals against, shots against). Playoff games now count in the season's player and goalie statistics.

Season Summary screen
Season Summary after a Cup win (Mini season, test run).
Page 2 with the goalies
Page 2: remaining skaters and the goalies.

Season test run (25 October, r18): all three season lengths were run to the playoffs and through them (won to the end and lost in round one). One bug fixed: after a season in which your team missed the playoffs, extra games you started were still counted into that season. They no longer are.

One-timers without stopping (25 October, r17): when a teammate passes to you (for example P1 to P2 in co-op) and you press or hold shoot while the pass is on its way, you no longer stop and wind up early, which used to make the pass slide past. You keep skating, take the pass, and a full-power forehand one-timer goes off the moment the puck reaches you. It can crit like any full slapshot. The crowd meter now also raises or lowers Crit Chance, and Team Roster shows it.

Meter effect in Team Roster (25 October, r16): during a game, Team Roster (pause menu) shows Overall and the 0–99 ratings with the team's current meter bonus or penalty included. After every game the meter starts over from the middle, and Roster outside a game shows the normal values.

Team Roster Overall values before and after the meter penalty
Washington on Hard (human team, −10%): Overall in r15 (left, unchanged) and r16 (right, 76→69, 55→50, 70→63).

Historical difficulty behavior (25 October, r15; superseded by r5): Current Hard uses Normal-style momentum and improved AI. In r15, a new last row in the main menu. Normal is the momentum meter described below. Hard locks it for the whole game: human-controlled teams are always at the bottom (−10% ratings) and computer teams always full (+10%). It can be changed even during a season (the other settings stay locked) and starts as Normal after power-on.

Main menu with Difficulty: Hard as the last row
The Difficulty row in r15.

Team stats screen (25 October, r14): the season team stats page no longer shows the CRT column and its footnote, and the small black gap in the title frame (seen above "CH" in CHICAGO and other odd-length names) is gone.

Meter rows fixed (25 October, r13): in r12 the two bars were drawn next to the wrong team names (the bonus itself always went to the right team). Each bar now sits on its own team's row.

Crowd momentum meters (25 October, r12): two live bars beside the score box, one per team. Shots on goal and body checks pull the momentum toward your team (and away from the other); it slowly fades back toward the middle with every second on the game clock, so it works the same for 5, 10 or 20 minute periods. The bar's position is a rating modifier for everyone on the ice: full bar +10%, middle 0%, empty −10% (red when your team is below the middle). Players coming on the ice get the current modifier straight away. Before this, the native crowd meter only drove the crowd noise and the "Current/Peak Level" stats; it never changed ratings.

Two momentum bars beside the COL/WAS score box
Momentum bars in r13: Colorado (top, white, above the middle) and Washington (bottom, red, below), enlarged from a game capture.

Bright red crit puck (25 October, r11): a critical slapshot now turns the puck fully bright red instead of the dull pinkish rink-line colour. A few spectators' dark-green shirts in the crowd use the same colour slot and are now red.

Bright red puck on the ice, enlarged
The red crit puck in r11, enlarged from a game capture.

New start-up (25 October, r10): the EA Sports logo is gone; the game opens directly with the new NHL'94 Season Edition picture, then the main menu (any button skips it).

NHL'94 Season Edition start-up picture as shown by the game
The new start-up picture, captured from the game (320 x 224, 8 grey levels).

Standalone New Playoffs get their own save (25 October, r9): an original New Playoffs tournament is now saved separately from your Full, Light and Mini seasons. You can have a season in its playoffs and a standalone tournament at the same time; Continue Full/Light/Mini PO and Continue Playoffs each continue their own bracket, also after switching seasons or restarting. User profiles (User Records users) are now shared by all seasons instead of being copied into each one.

No duplicate Continue Playoffs (25 October, r8): while a Full, Light or Mini season is in its playoffs, the original Continue Playoffs entry no longer appears next to Continue Full/Light/Mini PO. It showed the same season playoff a second time, outside the season. A standalone New Playoffs tournament still shows Continue Playoffs after its first game.

Abandon Season during a game (25 October, r6): the in-game pause menu (also after a timeout and between periods) now ends with Abandon Season. A + C discards the current season and goes to the main menu to pick a new team; Start returns to the pause menu and the game can be resumed. Outside a season game (Shootout, standalone playoffs) the entry does nothing.

Xbox-style pads with RetroArch's six-button setting: pad A = Genesis B (pass / switch player), pad B = Genesis C (shoot), pad X = Genesis A (speed / check), pad Y = Genesis Y (goalie). "A + C" means pad X + B; the Abandon Season dialog now says A + C (Xbox X + B) (r7).

Abandon Season (25 October, r5): the pre-game entry formerly called Restart Season is renamed, so it is clear the current season is discarded. A + C confirms and returns to the main menu with a new season of the same format, where you pick a new team; Start cancels. Other seasons are kept.

Simulated games follow Per. Length (25 October, r4): the other clubs' games (and Simulate Match) now produce goals and shots matching the period length you play. Calibrated from 118 complete CPU-vs-CPU games in the emulator: per team, about 1.3 goals / 12 shots with 5-minute periods, 1.9 / 17 with 7, 2.8 / 25 with 10 and 5.7 / 50 with 20. Previously every simulated game scored like a 10-minute game (2.8 goals, ~30 shots). Team strength still decides who scores more.

Per. LengthPlayed CPU games: goals / shots per teamSimulated (8-round check): goals / shots
5 min1.32 / 11.71.50 / 11.5
7 min1.93 / 16.82.14 / 16.6
10 min2.82 / 24.82.80 / 24.1
20 min5.70 / 49.55.55 / 48.6

Played-game goals are regulation only; simulated totals include the one overtime goal of tied games.

Clean SOG column in team statistics (25 October, r3): after viewing the goalie page and returning, stray characters from the goalies' SV% (for example 141% or 1289) no longer appear after skaters' shots on goal. The saved statistics were always correct; only the display was affected.

Schedule locked after game 1 (25 October, r2): Left/Right on the Game row now only changes the opponent before the first game of a new Full, Light or Mini season. Once a game has been played or simulated, the next fixture follows the fixed schedule. Saves carry over unchanged.

Correct player-card portraits (25 October): faces now follow the player identity after roster changes, in both the main-menu slideshow and Player Cards. All 832 card associations are checked: 702 reuse existing portraits, 123 use newly converted official NHL photos and seven show a neutral silhouette where NHL has no usable headshot. Names, ratings, statistics and saved seasons carry over.

Before: Logan Thompson's name with Charlie Lindgren's old portrait
Before: the roster changed while the portrait link stayed.
After: Logan Thompson's name and correct portrait
After: the face matches the player.
Devon Levi's new NHL portrait in Edmonton's Player Cards
Devon Levi: a newly converted NHL portrait, using the game's original eight-colour palette.

Portrait sources, the seven neutral cards, build tools and verification.

Local test save: Dallas has completed the84-game Full season and won the Cup in16 playoff wins. The game is prepared at the all-team statistics browser; Mini's Edmonton championship is retained. This progress is local, separately from ROM downloads.

10-minute OT and shootouts (25 October): both league games and playoff games now use ten minutes of sudden-death overtime. Still tied? Play three shootout attempts per club, then one each until decided; an unreachable lead ends it early. In Two - Teammates, P1 and P2 take alternate attempts for your club, home or away.

The winner receives one deciding goal in the final score. Shootout attempts do not add player goals, assists, shots or goalie goals against. League points and playoff progress are saved normally; Full keeps best-of-seven series and Light/Mini keep single-game pairings. Existing saves carry over.

Native shootout after a tied playoff overtime, showing Minnesota versus Dallas in round two
A tied playoff game enters the native on-rink shootout. Its tally is separate from the match score until the winner is decided.

Sharp menu text when switching modes: original menu values now keep the correct small font when cycling between seasons, playoffs and Shootout.

Before: corrupt original text after switching to New Playoffs
Before: original menu values used the wrong font.
After: clear New Playoffs, Home, Away and settings text
After: sharp text throughout the menu.

Startup menu freeze fixed: cycling past Mini now skips Continue Playoffs when no playoff is saved. The menu keeps responding and can return to your season; all three saves stay intact.

Three separate season saves (25 October): keep a Full, Light and Mini season at the same time. On Play Mode, use Left/Right to resume each one's team, next fixture, standings, player statistics and playoffs. A saved slot shows Continue Full Season, Continue Light or Continue Mini; an empty slot shows New. Existing seasons carry over automatically.

Abandon Season (formerly Restart Season) resets only the selected series, with confirmation, including from its playoff pre-game menu. The other two seasons stay saved. Full keeps best-of-seven playoffs; Light and Mini keep single-game playoffs.

Continue Full Season with its own next game,2 of84
Full: its own team and next game.
Continue Light with its own next game,3 of31
Light: separate31-game progress.
Continue Mini with its own next game,2 of8
Mini: separate8-game progress.

Critical slapshots + Twin Cobra sound (25 October): only fully wound-up forehand slapshots can crit, including forehand one-timers. Quick wrist shots and backhands keep their ordinary power and sound. A critical slapshot flashes the puck red and plays the selected Twin Cobra digital explosion once. The Crit Chance rating and 25% bonus still apply to qualifying shots.


Listen/download: the crit sound captured from NHL · Source, hooks and verification

Correct team-selection logos: Full, Light and Mini now immediately show your club and its scheduled opponent when you change Team. This fixes both logos sometimes showing Edmonton even though the actual fixture was Edmonton–Detroit. Switching between One and Teammates also refreshes both sides correctly.

New Season Mini with Edmonton home and Detroit away, matching Game 1 of 8 vs DET
The two logos now match the scheduled clubs in all three season formats.

Critical shots: every skater now has a separate Crit Chance rating from 0 to 100. At 100, 13% of full forehand slapshots get 25% extra shot power; at 50, the chance is 8% (since r26: rating/10 + 3 percentage points; a rating of 0 never crits on Normal/Hard; with Crit Shots On, Easy human full forehand slapshots always crit). Better offensive players receive higher ratings. Find it with Left/Right in Team Roster, in the CRT column of season player statistics, and on this site's team pages.

Historical r16 crit experiment (25 October): This earlier setup produced about a quarter more goals; current Easy and strong-shot behavior is measured in the r32 audit above. 4,800 fully wound-up forehand slapshots were fired in a copy of the game where every such shot crits, and 4,800 in a copy where none do; everything else was identical. Shots came from 20 positions 60–180 pixels from the goal line, three aims, against the goalie alone.

No critCrit
Puck speed18,36422,912 (+25%)
Goal4.9%6.2%
Save76.4%67.6%
Over the bar1.0%1.7%
Wide or deflected away17.7%24.5%

+1.3 percentage points, about 27% more goals per shot (statistically clear, z = 2.8). The faster puck beats the goalie more often but also misses the net and goes over the bar more often. The biggest gain is at medium range (140 px: 2.0% → 7.1%); from the blue line the existing blue-line bonus dominates either way (13–14%). The test is simplified (empty ice, skater placed directly in position), so real games differ, but the direction should hold.

Red crit puck: a critical shot now makes the puck briefly blink red and normal. It returns to normal when someone takes possession, play is stopped or a new shot starts. The Crit Chance rating and 25% power bonus stay the same.

A natural critical shot with the puck alternating red and normal
Red puck flashes identify a critical shot. Captured from the game.
Team Roster showing each player's Crit Chance rating
Crit Chance is an additional attribute; all existing ratings remain available. See CRT in season player statistics.

New Full Season: 84 league games, then best-of-seven playoffs. Existing saved 82-game seasons finish at 82. New full seasons use 84, matching the NHL's 2026/27 game count.

Fixed an empty old Mini save making New Full Season show 1/8: it now correctly shows 1/84 without resetting any saved season.

New Full Season showing game 1 of 84
New Full Season — game 1/84.

New Season Mini: eight league games against different opponents, then the usual 16 qualifying teams enter the playoffs. One game decides each playoff pairing.

On the main menu's Game row, Left/Right selects a different first opponent before game 1 of a new season, for some variety. After the first game the schedule is locked. The choice survives power-off, and the rest of the league plays the matching round.

New Season Mini showing game 1 of 8
Private test: an eight-game league, followed by single-game playoffs.

The private test build adds Simulate Match directly below Start Game. Select it with C to get an instant result, including player and goalie statistics. Press Start on the result screen to continue to the next fixture.

Tested through complete 8-, 31- and 84-game league schedules, plus continued legacy 82-game saves, including the final-game transition to the correct playoff format. Use the dated test download below for these changes; the earlier release downloads above are preserved.

The private test also fixes an Address Error when opening a team's players from Season Standings. All 32 teams, both player pages and goalie statistics have been checked.

Additional single-player checks covered 192 statistics screen entries and pause/resume. An obsolete statistics exit path was removed; Bodin's exact one-off freeze has not been reproduced. The separate co-op input fix lets both pads browse custom statistics.

More breakable glass: hard, high puck impacts on the straight glass behind the far goal now have a 50% chance to shatter the hit pane. The original break sound, whistle and faceoff remain. Low or soft shots and the other boards keep their normal behavior.

Period warning only at 0:40: the three warning beeps no longer repeat when a penalty expires, including at 1:00. Penalty release and its normal final-five-second ticks still work.

Call for a goalie pass: your AI goalie holds the puck until you press B. In One, he passes to player 1; in Teammates, he passes to the skater controlled by whichever player pressed B. A tap during a diving save waits until he gets up. The first request wins; a prolonged hold still causes a faceoff. Y/manual controls remain as before.

Diving goalie recovery: a goalie who catches the puck while sprawling now gets the same possession window as a standing catch, allowing time to get up and play it. A prolonged hold still causes a faceoff.

Faster player switching: without the puck, B selects another available skater when pressed. It avoids taking your teammate's player. With the puck, B still passes; Y selects the goalie.

Season - jdc - 2026-10-31 ROM (3 MB) Season - jdc - 2026-10-31 IPS

The dated IPS requires the original unpatched v5.1W ROM listed above. This test version contains all features described in this section.

Complete change log, build instructions and test evidence · Experimental source code · everything in one zip (all tools, sources, tests and notes for the current version). These sources rebuild the exact tested ROM.

The same private copy also tests automatic goalie control with explicit Y selection, a three-beep warning at 0:40 each period, and 1-minute ordinary / 2-minute fighting or injury penalties with 5-minute periods.

Private test result screen: Washington 3, Colorado 2 in overtime
Private test: the simulated result is saved before returning to the main menu.

What is counted

ColumnMeaning
GP W LGames played, won and lost in regulation time
OTWGames won in overtime or a shootout
OTLOvertime or shootout losses; historical saved ties are retained
GF GAGoals for and against
PTS2 per win (regulation, overtime or shootout), 1 per overtime/shootout loss or historical tie
G A PTSA player's goals, assists (up to two per goal) and points
SOGA player's shots on goal
GP W (goalie)Games the goalie started and won (overtime wins included)
GAGoals against while he was in net
SV%Save percentage: (shots against − goals against) / shots against, shown as .912
Playoff tree
The season's 16 teams in the game's playoff tree (your team blinks).
Goalie stats
Page 2 of a team screen: the last skaters and the goalies.

Playoffs after the full season

After game 84 (82 for an older saved full season), Play Mode shows Continue to Playoffs. Press Start to open the playoff tree with your team and the season's qualified teams. The full season uses best-of-seven series, and the playoff tree is filled with the season's 16 best teams, NHL style: the top 3 of each division plus 2 wild cards per conference (the best of the rest). East (Atlantic + Metropolitan) is on the right, West (Central + Pacific) on the left. The better division winner meets the second wild card, the other winner the first, 2nd meets 3rd. From then on it is the game's own playoffs, including Continue Playoffs after a power-off. If your team didn't make it, the menu is just free after the season.

New Season Light: after game 31, select Continue to Playoffs and press Start to see the qualified teams in the playoff tree. Each pairing takes one game, including the final.

Continue to Playoffs in the main menu after game 31
After the last league game: Continue to Playoffs. Start opens the qualified teams' playoff tree.

The division table after each game shows who is in right now: green = top 3 of the division, dark teal = wild card. Season Standings marks the same teams with a light blue band.

2026-10-22

8Y takes your goalie

With a 6-button pad and Goalie Ctrl: Manual Control, press Y when your team doesn't have the puck (loose puck or the other team has it) and you take control of your own goalie straight away. When your team has the puck, Y works like B, as before (pass). Works for the home and the away team, for player 1 and player 2, in the season and in single games. With a 3-button pad nothing changes.

Teams

Click a team for its lines, roster and ratings as they are in the patched ROM.

Tools

Everything used to make and test the patch is in tools/ (or all of it at once: nhl94-tools.zip, rebuilt with every release), and further work is done from there. The current ROM is built with experimental/build_test.py to an explicit output. Canonical work and private test evidence stay in the project's HTTP-blocked .workspace/ directory. The older build.sh workflow below is for the plain historical patch.

ToolWhat it does
build.shBuilds the ROM from the base v5.1W with patch.py, backs up the previous one, installs it for RetroArch and rewrites the IPS
update_rosters.shFetches NHL rosters, prospects, stats and DailyFaceoff lines, regenerates rosters/*.json (hand-made teams are kept) and builds
patch.pyAll the changes, each with a flag to switch it off
gen.py, fetch.py, rosters/Roster and line generator, one JSON file per team
make_site_data.pyReads the installed ROM and writes teams.json for the team pages
run.sh, h.lua, lua/Headless MAME test rig and the bots/loggers used for every measurement
season/The season mode in 68000 assembly (season.s, standings.s, leaders.s, teamstats.s, seasonmenu.s, newseason.s), built onto the patched ROM by build_season.py; readsram.py prints and checks a save file; mknv.py makes test saves
experimental/All experimental glass, player-switching, goalie/Y, warning, penalty and match-simulation code, a complete explicit-output builder, headless two-pad test harness and example cases. Build and continuation guide.
gpgx.pyHeadless test runs in Genesis Plus GX (the core RetroArch uses) from Python: same command files as the MAME rig, battery RAM, savestates
intro.s, introimg.pyOwn intro picture (fix 12): converts a picture to Mega Drive tiles (8 greys, dithered) and shows it at start-up instead of the title screens
ygoalie.sY = take your goalie (fix 9), assembled by build.sh
m68kasm.shAssembles 68000 code at a fixed address with GNU as (SGDK Docker image)
model.py and friendsRating model (kNN on NHL stats), ROM reader, EA ratings reader, disassembler, IPS maker, rink image
cd tools
./build.sh                 # build the plain ROM + the season ROM, rewrite the IPS and the team pages
./update_rosters.sh        # refresh all rosters from the NHL, then build
python3 make_site_data.py  # refresh the team pages

Tech

The following table summarizes the historical plain patch. The current season ROM uses experimental/build_test.py and its relocated modules; the current hook exports cover every named change and the complete byte diff. Plain changes are made by patch.py from the unmodified v5.1W ROM. It checks the original bytes at every address and refuses to patch a different version. New code lives in free ROM ($20963E–$2FFFBF is empty in the original) and uses free RAM from $FFF000.

ChangeWhereFlag to skip
Pass target prefers the other humanhook $BD44 → $2FF000nosel
Receive radius for human pass targethook $14E84 → $2FF080norecv, r=N
Goalie passeshooks $BD5E, $BF54nogk, gadd=N, gmin=N
Blue-line shotshooks $C408, $15032, $150F6, $C51A; RAM $FFF000–3nobl, blp=N (15), bld=N (160), blz=N, blt=N
Off-screen arrow$16590noarrow
Fighting settingRAM $FFF004, menu at $2095xxnofight
Fighting N/A when Penalties is Offhook $F7BAA → $2FE000nofightna
Y takes your goalie (6-button pad)hooks $1FFC02 (pad reader), $B258 (input handler) → $2FE040 (ygoalie.s); RAM $FFF0E0–7noygoalie
Start-up defaults: 5 minute periods, Manual goalie, Auto line changestable $17C8E, hook $17C86 → $2FE200 ($D072)nodefaults
User Records removed from the main menumenu tables $20915A/$2091FE/$2095AE reordered, accessors → $2FE220, 9 rowsnouserrec
Own intro picture, no title screenhooks $771E, $172F4 → $2FE280; picture at $2A0000nointro
Season mode$2F8000–$2FBFFF; hooks $7C2E (game over), $F7BAA/$F7ABA/$F7C72/$F80BC (menu), $1732C (skip Matchups); battery RAM $1000 (table), $1220 (players)build without season/
Rosters (all 32)rosters/*.json → $2F0000, team table $30Enoroster

Testing

Everything was tested headless in MAME with Lua scripts: bots that press buttons from saved positions, breakpoints that log every shot and goal, and full CPU games as a stability check. Same position + same input = same result, so before/after comparisons are exact.

env -u DISPLAY -u WAYLAND_DISPLAY SDL_VIDEODRIVER=dummy \
  mame genesis -video none -cart rom.bin -nothrottle -autoboot_script h.lua

Useful addresses

AddressWhat
$C2F2Shot routine (aim table $C542, spread from distance and accuracy)
$14F78–$150C2Goalie reach (12–15 px, nothing above height 15)
$14620The net: crossbar at height 13
$164D6Off-screen arrows
$2001DEFight start check (hack code)
$11086Random number 0..d0−1
$FFB04A + i·$80Objects: 0–4 + 5 (G) team 1, 6–10 + 11 (G) team 2, 12–13 nets, 14 puck
$30E32 team pointers. Player = name, BCD jersey, 14 rating nibbles

The full notes are under Claude notes.