# Goalie catch/pass input and32-team statistics browser —2026-10-25-r26

## Saved player counts, including Continue Playoffs (2026-10-26-r20)

Players is now reachable and editable in a season's Continue Playoffs menu.
Choose One/Two/Three/Four - Teammates; each Full/Light/Mini slot remembers its
own count across slot changes and cold boots, in both league and playoffs.
The optional PC/count/complement record at logical SRAM1EF0..1EF3 follows
existing snapshots/checksums; old saves remain compatible. Without an adapter,
a saved Three/Four runs as Two and returns when the adapter is restored.

New seasonplayers.s at2EB000 (622bytes), cursor hookF7782, seasonmenu2002 and
slots1556. Only Players is unlocked; club/results/tree/statistics stay intact.
PASS24 native player-choice cases/48 cold match starts, mixed Full4/Light2/
Mini3 roundtrip and reboot,18 played playoff OT/shootout result/save cases,
goalie88+41,slots20,navigation14/266,finished9/108,club labels18/240,font14
cases/3124 calls/zero wrong fonts. Exact rebuild, guarded3579-byte diff,
original-base IPS230941 bytes verified. See [SEASON_PLAYERS.md](SEASON_PLAYERS.md)
for source, RAM, storage and reproduction. Replaces r19 everywhere with matching
save/state/remap contents preserved.
SHA256a67ecaffe77beb7c13071caee9f507767a4efb7471af3c9ff9487d3b3fb9ae3e;
CRC086E5C8E.

## Four-pad goalie hold, B request and Y control (2026-10-26-r19)

The goalie patch now handles all four physical pads in cooperative 4-Way Play:
AI holds on pickup, B requests a pass to the requester, Y explicitly takes the
keeper. Native P3/P4 reuse D4=0/2 with temporary control banks; requests now
retain physical IDs 0/2/4/6. Short hardware B taps survive the catch/recovery;
first valid request wins, and pause/replay input cannot queue an outlet.
Also fixed: switching from Four into a One-player season could still start
four humans (stale TM), and shootouts left pads 3/4 active with only two actors.
Ordinary two-pad switch/Y code is byte-identical. No SRAM format change.

PASS 88 adapter goalie +41 ordinary goalie cases; 7 two-match lifecycles
(14 games, 14 cold boots, P3/P4 movement, pause/resume, menu circles); a complete
natural two-game Mini run produced 27 keeper passes/17 receptions. PASS 50
OT/shootout cases across ordinary/three/four pads and all playoff formats;
slots20, adapter navigation14/266, completed-season9/108, club labels18/240,
menu font. Exact rebuild, guarded2870-byte diff, original-base IPS verified.
Full source/RAM/test details and the known RAM-only playoff player-count
limitation: [FOUR_PAD_GOALIE.md](FOUR_PAD_GOALIE.md).
User-requested private r18 ZIP backup and hash manifest verified. r19 replaces
r18 locally/site/Bodin's same playlist item, carrying save/state/remap hashes.
SHA2567262f8e4a39d6970b660e24803f1d7212b29aed26a933202296b788aed8d9ec6;
CRC D82B8F78.

## Player behavior

r13 (2026-10-26): a B tap while the puck is still loose within 24 px of your goalie (the catch) is queued as the outlet request (outlet.s incoming) and kept through his pickup (goalie_ai.s); it no longer switches skaters.


A B press still held when an AI goalie catches the puck can now request the
outlet immediately. It also works if a preceding skater switch still has its
B-consumption latch set. One serves P1; Teammates serves the requesting pad's
controlled skater. Catch/dive recovery, the first requester winning, explicit
Y/manual control, CPU-only goalies and prolonged-hold whistle remain. With no
B input there is still no automatic human-team outlet. The r22 protection
against switching while the goalie's pass is travelling remains.

After the Season Summary, Left/Right on the dpad cycles all32 teams (with wrap)
and resets the displayed page to1. This is a viewer: it never changes the team
you actually played or the saved season. A cycles the three existing tabs:
Season + Playoffs, Regular Season, Playoffs. C sorts by points/goals/assists;
Up/Down select page1/2 (remaining skaters and goalies). Start opens the league's
Scoring Leaders; there Left/Right or A changes tab, C sorts, B returns to the
selected club, Start exits. Either pad can navigate. On the configured Xbox
layout, Genesis A is Xbox X, B is Xbox A and C is Xbox B. Every team's own
roster, skater records, goalie records and banner follow the selected club.
Teams that did not qualify show zero playoff totals. The other playoff games
and simulated remainder use the existing r21 statistics; no simulator change.

## Cause and input fix

Native pressure/catch capture, a real B input at frame100: ownership is still
loose FF07 while the human skater is4 (P2 skater1). The native switch selects0,
then the goalie catches by frame101. switch.s's HELD latch used to consume the
rest of that B input before outlet.request could see it. request itself required
D1's new-press bit; a held press could not request anything. Result: only a
skater change, goalie5 holds, no pass in single/P1/P2. This reproduces the reported
symptom around the ownership transition; it does not prove every possible
report has the same cause. Existing38 ordinary hold/request fixtures all passed
before the fix, and120 repeated-B sweeps starting after possession passed too.

Move the guarded outlet.request before HELD consumption (explicit Y still
wins). Treat the preserved D1 | D3 bit4 as the request input, so held B across
the catch can become a request once possession/side/goalie checks pass. Queue,
recovery and native pass-vector selection stay unchanged. A skater switch can
still occur before the keeper actually owns the puck; once he owns it the
pending press is served to that pad's current skater instead of being lost.
Do not move the request outside the ordinary-play/human/2-pad guards.

switch.s remains510 bytes at2FD900..2FDAFD; outlet.s750 at2FDC00..2FDEED (+2).
No new RAM or SRAM. Successful B requests consume the hold/release as before;
release without another press does not cause an accidental second pass.

## Statistics implementation

experimental/seasonend.s3618 bytes at2E3000..2E3E21, below the trail at2E4000.
New BTEAM wordFFE6FC and SCREEN wordFFE6FE are within the existing end-screen
scratch area. TEAM atFFE532 remains the original user's club. loadteam takes
BTEAM; NTEAM drives player names and roster selection. Banner takes an explicit
team in D1: summary passes TEAM, browser passes BTEAM. Circular teamkeys is
separate from tabsort; A is a new tab key. Leaders retain their old Left/Right
shortcut and B resumes the browser without losing selected team/tab/sort.
RAM pages and render/footer strings update together. League/player/goalie/playoff
storage and all season/gameplay code apart from input hooks are unchanged.

## Evidence and reproducible tests

verify_goalie_request.py now has41 native cases:38 existing plus three real
B-before-catch regressions. Updated goalie_request_hook.py adds PRECAPTURE,
checking receiver ownership/selection from the first actual catch onward.
Old r25 fails the three new cases with no pass; r26 passes all41. In the pressure
capture all three new cases pass at104 to skater0 (the pad's selected player
when the puck was caught), and six crossing-catch pressure/dive checks pass.
Dive taps wait for recovery and serve4/4/1 at146/146/146 in the final build.

verify_season_browser.py takes an explicit private save/state and creates only
private native-entry probes.341 real-input checks cover32 clubs,3 tabs, goalie
pages, wrap/reverse, sorting, both pads, Scoring Leaders/back and normal exit.
Live100-byte skater rows and15-byte goalie rows are compared to source SRAM;
sort order and displayed name club are checked, TEAM stays unchanged, and every
SRAM byte is unchanged.341 more pass with distinctive synthetic playoff rows
for all16 seed slots (to catch wrong-team mapping rather than only zero rows).
Snapshots decode the core's negotiated pixel format, including RGB565.
A clean full CPU Mini0–1 completes with valid team/player/keeper totals/checksum.
14 navigation cases/266 circle/reverse checkpoints pass. Exact source rebuild,
guarded3313-byte diff (switch/outlet/seasonend, title/checksum only), no private
probes in production, and original-base IPS reconstruction all pass.

    python3 tools/experimental/verify_goalie_request.py /private/test.bin \
      /private/request-results --fixtures-root /private/work
    python3 tools/experimental/verify_season_browser.py /private/test.bin \
      /private/browser-results --save /private/finished-season.srm \
      --state /private/initialized-game.state

Final r26 SHA2564b42e4b6fa9079bb3bdb40376ff473bed4a0ef6116d9df98f5fef123d1047c8a,
CRC4ACB9735. Private evidence:work/goalie-pass-team-stats-20261025-210908/.
Release26 replaces25 in canonical/Downloads/site ROM+IPS/Bodin's same entry.
Remaps must migrate. The local user's last running game was r23, whose save
was written at21:07 after it closed; carry that latest valid save to r26 rather
than creating empty r26 progress or using an older test file. No extra backups.
