# Optional directional passing and vector targeting cone — 2026-10-31-r7

## Menu and behavior

Brodeur30 proposed an eight-direction pass independent of receiver selection and
an adjustable targeting cone. jdc requested optional start-menu controls:

| Choice | Values | Fresh default |
|---|---|---|
| Pass Mode | Assisted / Directional | Assisted |
| Target Cone | Default / 15 degrees / 30 degrees / 45 degrees | Default |
| Pass Height | Normal / Low | Normal |
| Pass Speed | Normal / Slow | Normal |

The existing Height and Speed rows keep their logical positions. Mode and Cone
are the final two rows. All four choices save independently for Full/Light/Mini
and lock after the first completed match, including reboot and slot changes.
Native exhibition/playoff preferences are separate. A confirmed season restart
resets that season's four choices only. Missing/corrupt records use defaults
without unlocking a played season. No existing controller remap is changed.

Directional ordinary human B passes use the actual D-pad aim in eight directions,
with the established facing fallback when no direction is supplied. It does not
select a teammate, inherit carrier momentum or hand control to a guessed receiver
at release. Native loose-puck possession and the existing B-switch policy apply
subsequently. This includes manually selected keepers and P1–P4, at both ends.
Automatic CPU-keeper outlet requests still pass to the requesting pad's current
skater; they remain targeted. CPU passes, forced/special native passes, awarded
penalty shots and shootouts retain their original paths. A flips and C shots
retain their established code. Assisted remains the fresh default.

Explicit Cone 15/30/45 limits Assisted target selection by the **half-angle** from
the aim direction:15 means a 30-degree full opening. Dot/cross vector geometry
uses actual target displacement before octant quantization; it is not merely a
native octant threshold edit. Integer tangent constants 1097/2364/4096 use scale 4096.
Forward targets inside the chosen cone can retain human teammate preference.
A manually controlled keeper with no in-cone receiver makes a blind native pass
rather than choosing a fallback outside that cone. Default retains the previous
quantized45-degree normal /90-degree human-teammate policy. Cone is saved in
Directional mode but is used when Assisted selects a target.

Directional power follows native skater/keeper pass power and the native eight-way
vector table. Slow truncates both components to 80% after this calculation. Normal
lift is 0x600; Low is 0x300 in native vertical velocity units. These are free B passes,
not the targeted intercept solver's 12/6 cap. Targeted Assisted and CPU passes keep
the released native intercept, arrival and independent Height/Speed behavior.
No pass-completion improvement, literal physical-unit claim, pickup immunity,
hold/release charging or alternative rebound model is implied. Conditional
hold/release distance from the proposal remains a separate future experiment.

[Forum post #217634](https://forum.nhl94.com/index.php?/topic/40511-2-guys-one-ai/#comment-217634)
and [original #217609](https://forum.nhl94.com/index.php?/topic/40511-2-guys-one-ai/#comment-217609).

## Hooks, memory and persistence

| ROM site | Change |
|---|---|
|BC40–BC47|080200046600001E → 4EF9002E68004E71, human pending-B input dispatch|
|2FF034–2FF043|Existing human cone branch → JMP2E6804 plus padding|
|2FF1D8–2FF1E3|Existing human keeper-fallback branch → JMP2E6818 plus padding|
|2E6800–2E6FFF|Bounded module; eight 4-byte branch exports|
|2E1200 /2E1400|Seventeen row labels / new mode and cone strings|
|F777A /F7B44|Cursor limit0x22 / last logical redraw row0x20|

Module exports: input+0, cone+4, free human pass+8, writer+12, mapped load+16,
record put+20, human keeper fallback+24, exact legacy cone predicate+28.
Native CPU callers enter BC64 directly. BC64–BE25, the entire outlet module,
CPU cone prefix/tail and CPU fallback prefix/suffix remain byte-exact to r6.
The original BD3A/BD5E/BDA6 hooks and blind RNG code are unchanged. This avoids
adding instructions to the hot CPU scan path. Directional rejoins native final
pose/sound code at BDD8; native CPU/Assisted behavior remains in the original body.
The observer probes in tests are private and are not included in the ROM.

RAM F0FC/F0FE stores mode/cone words, directly after OTF state and before menu row
scratch F100. There is no additional battery-save allocation. The existing two-byte
complemented height/speed record is extended: per-season logical1EEE–1EEF and
standalone4D20–4D21 in Light's excluded shared-profile gap. Existing 50–53 tags load
Height/Speed and default Mode/Cone. New 80–9F tags encode height bit 0, speed bit 1,
mode bit 2 and conebits 3–4, followed by the one's complement. Returning both new
choices to defaults writes the exact legacy tag form. Mapper/IRQ/register
contracts and bank checksums are preserved. Full goalie bytes and adjacent season
snapshot bytes are tested against accidental aliasing.

Build with `--version 2026-10-31-r7`. `--legacy-directional --version
2026-10-31-r6` reconstructs the exact released r6 ROM. Exact site bytes and source
anchors are exported on the forum section of the project website.

## Test evidence and rejected attempts

`verify_pass_mode.py` requires all seven sections for a complete result:

- 144 paired actual BC40 gate/dispatch contexts compare full registers/SR/SP,
 aim and target. Release/held gating, CPU, inactive actor, manual keeper,
 shootout, awarded penalty shot and forced/special pass guards are covered.
 Endpoint stubs observe routing only; the full pass tests execute actual physics.
- 384 actual continuous-angle boundary contexts and112 paired Default/CPU/guard
 full ABI cases, across all eight aims and three explicit cones.
- 512 full pass contexts:384 unchanged Assisted/CPU complete native ABI results
 and128 human Directional vectors, including both teams, all eight aims,
 skaters/manual keepers and every Height/Speed combination. Only final
 animation/audio is skipped after physical outputs; RNG/control/target are checked.
- 192 native receiver scans:120 unchanged CPU/Default and72 explicit cone cases,
 including human preference, missing receivers and manual-keeper fallback.
- 84 combined-record load/legacy/corrupt/full-register-ABI contexts and32 actual
 four-setting writer/companion/season-lock cases.
- 30 cold native menu/lifecycle cases: both controller configurations, real value
 rendering, all slot circles, legacy/corrupt data, separate native preferences,
 Full goalie storage, reboot, restart, and a real native final goal/save/lock.
 The final-goal clock/puck fixture is declared; no completed season is fabricated.
- Six cold-boot games driven by emulator controller input exercise every configured
 physical pad, all eight aims, actual Assisted geometry, Directional vectors and
 subsequent native possession. Keeper outlet requests retain their receiver.
 Only an observer counter is initialized after boot; game geometry, owner, RNG,
 pass results and scores are not injected. Private preserving entry/exit and
 controller-bank probes may affect HV timing. These are automated inputs, not
 recordings from a person or a physical-controller playtest. Final counts are
 bound to this ROM in PASS_MODE_RESULT.json.

The first shared-path implementation passed feature tests but failed the native
AI playbook check: finish releases fell from the r6 value 2 to 0 (control 1).
That ROM, all 251 source files, proof builds and the 86/88 report remain archived.
It is not released. The final human-only design restores all 40 full gameplay
trajectories byte-for-byte to r6, including the 2 native finish releases. Earlier
failed assembler/record-dispatch prototypes and host-fixture failures remain
recorded too. Tests were not weakened and no AI seeds or favorable games were
substituted to accept the earlier regression.

All 88 shared exact-source suites execute on the final ROM. 87 pass; the existing
finisher_hold receiver-position geometry check remains failed in jdc's accepted
38-win tactical base. The strict gate remains FAILED; it is not described as a
clean pass or a 39/50 qualification. All 40 ordinary 600-frame scenes match fresh
exact r6 controls, whose complete earlier strict audit chain remains retained.
These bounded scenes do not prove universal gameplay equality. Independent
rebuild, exact r6 rollback, matched AI ablations and original-base IPS reconstruction
pass. No new Hard win-rate experiments are run.

## Delivery

The new dated r7 replaces the current Downloads, canonical and website ROM/IPS.
Every new release uses fresh progress, per jdc's standing policy. Config/remap/
history hashes are preserved; a running RetroArch is left open, with progress
cleanup deferred until normal exit. Bodin's existing playlist item receives the
same ROM when reachable. A queued offline sync is recorded as pending, never as
completed. PASS_MODE_RESULT.json and QA_STATUS.json contain the actual status.
No forum message is posted.
