Merge op8-keyboard: Campaign OP slice OP8 — Configure Keyboard

Brings b4edee97 (slice), b1968ce9 (M1/M2/M3 rework), f1d50207 (round-2
residuals). Review chain: REJECT -> rework -> REOPEN-narrow -> coordinator
third round; findings docs 2026-08-11-op8-review.md / -op8-rereview.md.
The merge lands OP8's six ListBoxes on top of 057d8cd7's #372 viewport
fix, which auto-heals the blank-pages hazard the re-review flagged — the
OP8 connected gate was contracted to run post-merge for exactly this.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Erik 2026-08-11 12:37:56 +02:00
commit 1c5cd969b4
23 changed files with 36178 additions and 12 deletions

View file

@ -89,7 +89,11 @@ public sealed class OptionsPanelController : IRetainedPanelController
Action ExitGame,
Action UseMouseTurningSettings,
Action<string> DisplaySystemMessage,
Action? AfterApply = null)
Action? AfterApply = null,
// Campaign OP slice OP8: opens the Configure Keyboard screen — retires
// OP3's INERT contract for this button (0x10000204). Null leaves the
// button inert (e.g. a test harness with no keyboard screen wired).
Action? OpenConfigureKeyboard = null)
{
/// <summary>Urgent Assistance's own byte-verified retail failure text.</summary>
public string UrgentAssistanceMessage { get; init; } =
@ -190,9 +194,9 @@ public sealed class OptionsPanelController : IRetainedPanelController
+ "not found in the built layout — its handler was not wired.");
BindButton(layout, ExitToCharacterSelectionId, callbacks.RequestExitToCharacterSelection);
// ConfigureKeyboardId: INERT this slice — authored, clickable, no
// handler. OP8 wires the real Configure Keyboard screen; the campaign
// cannot close with this button still inert (plan §4 OP3).
// ConfigureKeyboardId: Campaign OP slice OP8 wires the real Configure
// Keyboard screen — the OP3 INERT contract is retired.
BindButton(layout, ConfigureKeyboardId, callbacks.OpenConfigureKeyboard);
// InGameHelpFilesId: INERT — retail's own KeyStone::OpenHelp fails
// without the missing plugins\ACHelpPlugin.dll (D5, register row).
BindButton(layout, UseMouseTurningSettingsId, callbacks.UseMouseTurningSettings);