# Penalty frequency and the native combined rules choice — discovery, 2026-10-31

The separate percentage menu is now released as 2026-10-31-r8. See [behavior, code and tests](https://dela.jdc.se/nhl94/notes.html#PENALTYS_R8.md). The initial research below is retained as history.

## What the existing menu actually does

The native **Penalties** setting combines two decisions. Its three values are
**Off**, **On**, and **On, Except Off-sides**. It is not a frequency percentage.
The engine stores this setting at RAM `$D056`:0=Off,1=On,2=On except offside.
The season settings code saves and validates that original0–2 enum.

Native ordinary foul checks and penalty-shot eligibility both consult `$D056`.
The offside exclusion is separately captured from that value during game setup.
Icing has its own released On/Off control and its native event is handled
separately. Simply relabelling the original three choices100%/50%/Off would
therefore change several rules instead of halving ordinary calls.

## Planned separate control — not released

jdc's requested **Penaltys:100% /50% /Off**, default100%, will be a separate
frequency control. The original combined choice remains available as **Rules**,
with its original values and saved-season behavior. Thus100% means the existing
native frequency under the selected rules; it does not mean every check is a foul.
The new percentage control must retain the existing icing switch, offside choice,
penalty-shot eligibility, season locks and P1–P4 awarded-shooter ownership.
A native Rules Off setting still disables the native calls it already controlled.

The event table also distinguishes ordinary fouls, injury-related elbowing,
paired fighting/instigator penalties, and negative-duration penalty-shot variants.
The implementation must handle these explicitly: suppressing one event from a
paired fight could leave inconsistent penalties; dropping an injury event could
lose its required stoppage. These paths are under investigation, not completed.
Hold/release pass charging and alternative rebounds remain separate research.

## Source and native evidence

- Native option text comes from the current r7 value table, group at ROM
  `$2DEBCC`, selected by logical menu row12. The original value enum is stored
  separately from the new Directional/Cone preference record.
- `$7772` compares the original rule value during game setup; ordinary event
  admission begins at `$11F2C/$11F62`; penalty-shot lookup checks `$D056` at
  `$12178`. The current investigation uses native disassembly and paired tests.
- [`experimental/seasonplayers.s`](https://dela.jdc.se/nhl94/tools/source.php?file=experimental/seasonplayers.s)
  contains `loadsettings`, `settingsvalid` and the existing season-lock writer.
- [`experimental/icing.s`](https://dela.jdc.se/nhl94/tools/source.php?file=experimental/icing.s) shows the
  separate released icing award path into native `AddPenalty`.
- [TODO](TODO.md) records the requested percentage control and priorities.

At the time of this discovery the playable ROM was **2026-10-31-r7**, SHA256
`8172a7e4b3d55754076d4f31de2def263d423bad832b2057538fa3b5c1ca86c7`.
This documentation update changes no ROM, controller mapping or game progress.
