# Optional alternative goalkeeper model — 2026-11-01

ROM SHA256:331a12164cd1102d4dbbaecea21d7ea12d7f710b79d9c6eaa971cb7d31bc1840; CRC32:C1A1B3B5.

## Start menu and scope

**Alt Goalies: Off/On**, default **Off**, is the21st main-menu choice (row40).
It implements an optional experiment from
[floating#217606](https://forum.nhl94.com/index.php?/topic/40511-2-guys-one-ai/#comment-217606).
Both clubs and rink ends share the model. Existing GoalieCtrl, Crit, blue-line
chance, difficulty, pass options and season settings stay independent. There
is no real-world probability, scoring-rate, human-difficulty or strength claim.

On gives ordinary goalkeeper contacts circular reach21 (squared441), retaining
the native height15 limit. The existing blue-line miss bypass runs first;
the special native radius12 override, whistles, shootouts and foreign modes
stay guarded. Passes can meet this optional envelope, but only proven actual
shot releases get the new catch/rebound classification. Native dive animation
can bypass the classifier and retain its original forced rebound.

One eligible save consumes the release record. The native threshold RNG draw
still happens; the model adds one native bounded100 draw and, for a rebound,
one native two-way direction draw. Off adds no RNG. Slow horizontal shots with
max component below2048 retain their native catch/rebound decision.

Experimental counts per100 rolls, before screening:

| Origin distance | Catch | Corner | Short rinkward | Long rinkward | Slow goalward | Fast goalward |
|---|---:|---:|---:|---:|---:|---:|
| Below160 |10|40|15|15|15|5|
|160or more|20|40|15|10|10|5|

A front-net active skater (either team, excluding shooter/keepers; absX<=24,
goal-line depth0..48, count capped3) transfers5catch and5corner points to slow
goalward outcomes. More than one screen currently has the same probability
change. These are explicit experimental parameters, not measured NHL rates.

Desired horizontal vectors (native units, signs reflected by keeper end):
corner(8192,2048goalward), short(2048,4096rinkward), long(5120,8192rinkward),
slow(256,3072goalward), fast(512,8192goalward). Left/right is a native draw.
Vectors are scaled down when needed so output absVX+absVY never exceeds the
incoming max(absVX,absVY), capped32766. Vertical velocity clears through the
native rebound path. Slow/fast goalward outcomes extend that keeper's native
contact recovery to at least64/24ticks, retaining longer/signed locks; other
outcomes keep native10. Native countdown arithmetic and skaters remain intact.

Native save sounds/animation, detachment, phase, possession timer, physical
movement, board/net contact and eventual scoring still execute. A deflection
is not a forced goal: traffic, native keeper movement and puck physics can
stop it. Tested goalward scenes physically cross the line on both clubs/ends.
Goal, scorer, keeper GA, SOG and SA are checked independently.

## Hooks and allocation

- Module221000..222000, ten four-byte exports: shot, reach, decision, velocity,
  load, put, reset, policy, filter_sog, accepted_pickup.
- C408 calls the original2FF300 first, preserving release distance/RNG/ABI,
  then records eligible provenance. 2FF354 dispatches reach after the existing
  blue-line bypass. 155FC chooses native15628catch or1555Arebound; 15580 replays
  both original byte stores before a pending optional vector.
- Accepted native ownership at15288 replays MOVE.W52(A2),D0 and MOVE.WD0,B7AA,
  retaining native CCR, then invalidates the pending shot only while On.
  Rejected/body contacts never reach this accepted-possession helper.
- Existing shootout.s normal-SOG dispatch calls221020; its shootout-active
  branch is unchanged. Only an actual goal, pending counted parry, valid original
  actor/last-touch/distance, same shooting club and same credited scorer can
  suppress a duplicate SOG. Native goal/assist/GA already ran. Invalid/new-pass/
  changed-scorer/other-club/special contexts retain full native SOG processing.
- Native2FF398 can clear F000 on body contact without anyone taking possession.
  A zero current F000 therefore remains valid for the pending counted parry;
  a nonzero different distance rejects it. Actual accepted possession explicitly
  invalidates the pending record. This distinction was found on the full grid.
- RAMF012..F01F: option, shot marker (4752armed/474Ccounted parry), actor,
  release distance, screen count or pending credited roster, event, packed even
  incoming cap plus low-bit direction. Slot load/restart clears transients.
  F020opponent cache and other allocated pass/simulation fields stay separate.
- Logical SRAM4D32..4D39: independent native/Full/Light/Mini tagged pairs,
  72/8DOff or73/8COn. Native physical209A65. Light shared-gap checksum maintained.
  Lock after first completed match survives cold boots and slot circles;
  confirmed restart resets only the selected season to Off.
- Menu label2E1340, value strings2E151E..2E154A. No per-frame gameplay hook.

## Evidence and limitations

All94 suites executed:93 pass. **Strict gateFAILED**, retaining only the
same numeric finisher_hold geometry failure as r11 in jdc's accepted38-win base.
No new failure or missing section is waived. The first full94matrix also failed
P3 pass-input coverage. An exact read-only repeat showed its only stable P3
possession lasted13frames, below the driver20frame wait; it never requested a
P3 owning pass. All six input windows extend16000to35000 with identical original
event/press/receipt prefixes and every original functional criterion intact.
The entire seven-section pass-mode suite is rerun; the other281source hashes
stay exact. The first full report/source/failure and qualification remain retained.
An additional184native keeper-shooter SOG guard contexts pass on the sameROM;
these are supplementary units, not additional matches or required suites.
Independent isolated rebuild,
exactr11 rollback, five matched AI controls, native-net control and original-base
IPS reconstruction pass. All40 current ordinary scenes are compared with fresh r11; 19 are raw-exact.
Every difference and all earlier control chains stay recorded.
Dispatch instructions may change native HV timing; no universal identical-game
claim and no Hard win-rate search.

The new suite executes all12required sections. It covers full native register/
SR/stack contracts, all100roll boundaries, both-team/ends real collision reach,
the entire native save/SOG/catch/rebound path, accepted-possession invalidation,
full guarded SOG accounting, observer ABI equivalence,256declared actual-C/native
physics scenes, six35000frame cold boots with real P1–P4 shots and requested
keeper outlets,1040record validation contexts/four whole64KBwrite comparisons,
and30native menu/render/slot/boot/restart/first-match-lock flows. These are
scripted native tests, not physical-controller or human-difficulty tests.

Prototype failures are retained privately: initial slow returns were recaught;
energy cap/recovery were corrected; the expanded grid exposed duplicate goal
SOG and a native body-contact distance clear; a private observer initially
assumed fixed5/11keeper actors, corrected to actual keeper roles0..11. All original
input cases were rerun. A first scene predicate incorrectly demanded goals in
every traffic geometry. Traffic may physically block a rebound; every scene
retains actual vector/RNG/stat checks, and actual goals cover both clubs/ends.
No traffic scoring-frequency claim is made.

Other menu regression fixtures retain their original criteria while navigating
the expanded menu. A native free-byte witness moves to unused logical4E1E;
completed-season restart permits only the selected new pair and Light checksum.
The prior pickup collision-byte guard now permits only the separately qualified
15288accepted-possession hook; every other protected collision byte stays exact.

See ALT_GOALIES_RESULT.json, QA_STATUS.json, public named hooks/hex exports and
complete source ZIP. Bodin delivery is reported separately from local delivery.
