# Retained flight shortcuts and keyboard bindings

The reference is **TFX 2.05**, September 1994. Executing the [flight key initialiser](code/index.html#839d0) recovers **67 non-null scan-code callbacks**, retained in [keyboard-checks.json](keyboard-checks.json). Held-key paths are separate: for example, [Y/U HUD intensity](configuration.md#hud-intensity-hudcol) has its own per-frame handler.

These are the confirmed extra shortcuts absent from the scanned printed manual’s flight-key descriptions, except where explicitly noted:

| Key | Effect | Native handler |
| --- | --- | --- |
| **Ctrl+Enter**, confirming the callsign during enrolment | Creates a qualified pilot without completing training. Ctrl during either earlier name field does not count. | [0xa1ee0](code/index.html#a1ee0), rank assignment at [0xa2234](code/index.html#a2234) |
| **4** on the number row | Saves the screen as the next available `GRAB_00.LBM`, `GRAB_01.LBM`, etc. | [0x841ec](code/index.html#841ec), calling [0xd0c24](code/index.html#d0c24) |
| **5** on the number row | Toggles **auto stick pressure**, with an on/off message. Its compiled default is on. **Documented in the supplied README**, but omitted from the printed manual’s flight-key list. | [0x85e54](code/index.html#85e54) |
| **6** on the number row | Restores the autopilot’s aircraft-specific cruise-speed preset. | [0x85e3c](code/index.html#85e3c) |
| Hold **Right Shift**, type **PLOP** | Toggles the native cheat flag, with `CHEAT ACTIVE` / `CHEAT DISENGAGED` messages. | [0x838dc](code/index.html#838dc) |
| **Shift+D** | Restores the aircraft’s default weapons loadout and resets chaff/flares to 15 each. The cheat flag is not required. | [0x85c78](code/index.html#85c78) |
| **Ctrl+D**, with cheat active | Enters the original arming workflow during flight, then reloads view artwork and projectile-model bindings. | [0x85c78](code/index.html#85c78) |
| **O** | Alias of Backspace: select/cycle air-to-ground weapons. | [0x84a78](code/index.html#84a78) |
| **F** | Alias of the Ctrl handler: cannon/navigation selection. | [0x846e8](code/index.html#846e8) |
| **Backslash** | Alias of I: toggle the instrument landing system. | [0x847ec](code/index.html#847ec); the I callback is a wrapper at `0x84908` |

Key names here refer to **QWERTY physical scan-code positions**. The number-row shortcuts are distinct from their keypad counterparts. ISO scan code `0x56`, the extra key beside Left Shift whose engraving varies by layout, is also bound directly to [designator entry](code/index.html#859fc). It enters that view rather than taking Z’s view-sensitive lock/selection branch.

## Cheat recognition and effects

The sequence is stored as scan codes `19 26 18 19 00`: **P L O P**, followed by a terminator. The recogniser specifically requires the **right** Shift key (`0x36`); left Shift does not activate it. Matching letters are consumed before ordinary key dispatch, so the first P does not pause the flight. A mismatched letter resets sequence progress. Repeating the sequence toggles the flag off.

The cheat word is data-object offset `0x13250`. Its consumers bypass normal player collision/damage handling at [0x7d270](code/index.html#7d270), [0x8f460](code/index.html#8f460) and [0xa3504](code/index.html#a3504), and unlock the Ctrl+D arming path. This establishes invulnerability-related behaviour; it does **not** establish unlimited ammunition or fuel, mission completion, or restoration of damage already sustained.

The identically named [`plop` model](model-format.md#plop-the-water-crash-effect) is the water-crash animation. The cheat recogniser does not invoke it; the shared name does not establish a functional connection.

Plain D’s flight-information toggle is documented in the printed manual. The Shift/Ctrl branches are additional behaviours in that same handler. Shift+D restores weapon assignments and countermeasure counts; it must not be described as a general aircraft repair/refuel shortcut. Ctrl+D’s arming workflow also reloads assets and resets targeting state. These are retained native paths, not features added by the inspection tools.

## Training qualification

The [CU Amiga tips](https://www.cu-amiga.co.uk/features/tfxtips.html) describe confirming the third name entry with Ctrl+Enter to bypass training. This is also present in DOS 2.05: the [name-entry routine](code/index.html#a1ee0) returns whether Ctrl is held at confirmation, and [enrolment](code/index.html#a2234) stores the last entry's result in the parser's `rank` variable. Ordinary enrolment sets rank 0; Ctrl on callsign confirmation sets rank 1. Holding Ctrl only during first-name or surname entry has no effect on qualification. Both `todselct` and `soap_sel` in [the decoded graph](presentations/programs.json) send rank-0 pilots to the `nocando` training-required message.

There is also a persistent training-completion marker, **`WAYTXT/A`** relative to the game's working directory. After the ten training hops, the `fws` graph calls `strain`; the [launch dispatcher](code/index.html#72588) routes that command to [the marker writer](code/index.html#a24bc). It attempts to create the file and writes two bytes, **`36 17`**, the little-endian word `0x1736`. Future enrolment reads this marker and gives a new pilot rank 1 even without Ctrl. An absent marker or a different word does not qualify the pilot. Manually supplying this two-byte marker therefore produces the same qualification override; it does not enable invulnerability or unlock every individual campaign mission. This is a normal graduation persistence mechanism, not a second keyboard cheat.

[check_enrolment.py](../tools/check_enrolment.py) executes native name entry, parser-variable lookup/reset, rank assignment and marker writing in isolation. [Eight captures](enrolment-checks.json) cover Ctrl during each entry, missing/incorrect/correct markers, byte order and the writer's exact output. Graphics and filesystem calls are intercepted; parser arrays are populated from the decoded graph. No retail installation or save files are changed, and no complete campaign is run.

## Speed preset and stick pressure

The 6 handler calculates:

```text
autopilot target speed = aircraft preset Mach × local speed of sound
```

Its input fields are `0x14698` and `0x14790`; the result is stored at `0x8d40`, used by the autopilot. The [native aircraft preset capture](entities/player-presets.csv) supplies **Mach 0.7** for the Eurofighter, **0.85** for the F-117, and **1.2** for the F-22. This restores the authored preset rather than capturing the aircraft’s current speed. The local sound-speed field is calculated from temperature at `0x99401` and used as the divisor when forming Mach at `0x99192`.

The 5 key toggles data byte `0x8f32`. It is consumed by several flight-model calculation paths, including `0x9a049`, `0x9bd31` and `0x9f932`; it is a flight-control aid rather than a graphical toggle. The retail [README](../literature/cd_1994_09/TFX/README.TXT) explicitly documents this key. Its complete aerodynamic effect remains to be characterised alongside the flight model.

## Verification and coverage

[check_keyboard.py](../tools/check_keyboard.py) executes the original initialiser and selected handlers in Unicorn. It captures all callback pointers, verifies numbered screenshot filename selection, checks right-versus-left Shift cheat activation and its toggle messages, runs both stick-pressure states and three speed presets, and checks the plain/Shift/Ctrl D branches and countermeasure counts. Message delivery, file writing, arming screens and resource reloads are intercepted: no retail files are changed and no full mission is executed. The [report](keyboard-checks.json) records that scope.

Documentation comparison uses the [108-page scanned English manual](../literature/TFX%20Tactical%20Fighter%20Experiment%20Manual%20(Ocean)(1994)_text.pdf), the installation README and the unofficial [keyboard summary](../literature/floppy_bundle/tfxkeys.txt). Presence in native code is established separately from presence in any particular manual or key list. This is a confirmed shortcut inventory, not a claim that every menu/editor command and modifier-dependent held-key path has been fully mapped.
