NotifyOfDisplayModeChange override (vtbl+0x4C @4d1ae4) + wire desktop 'N'
The secondary screen's schematic selector was mislabeled: @004d1ae4 (the
bits-18..20 ModeSecondary* mask swap) was reconstructed as a non-virtual
"SetControlMode" that nothing called, so the desktop stayed pinned on the
Damage view. The binary's L4 vtable @0051e440 pins the truth:
+0x48 = @004d1acc <- CycleControlModeMessageHandler (FUN_004afbe0):
forwards to the base RET no-op @004b048c. A BAS/MID/ADV
control-mode change never touches the secondary view
(empirically confirmed: BT_MODECYCLE_TEST cycles the CONTROL
MODE lamp, mask bits 18-20 unchanged, schematic stays ARMOR).
+0x4C = @004d1ae4 <- CycleDisplayModeMessageHandler (FUN_004afcac):
THE Damage/Critical/Heat selector, indexed by displayMode
(table @0051dbe4 = ModeSecondaryDamage/Critical/Heat).
Authentic pod inputs (streamed type-6 .CTL EventMappings, dumped via the
new BT_CTRLMAP_LOG EVENT records): secondary-panel button 0x15 -> msg
0x15 CycleDisplayMode (manual p13, the "'Mech status Info center" bottom
left of the secondary screen), button 0x18 -> msg 0x14 CycleControlMode
(manual p6, top right), 0x10/0x11 -> ZoomIn/Out. The DOS keyboard
fallbacks (Keypress 0x13d/0x13e = extended F3/F4) are dead under the
WinTesla VK map, hence the desktop pin.
Port wiring (the M/ModeCycle pattern): key N / pad RightThumb -> action
DisplayCycle -> gBTDisplayCycle -> CycleDisplayModeNow() -- the same body
the pod console button message drives. Both .MAP profiles + the
compiled-in default updated.
Verified live (docked gauges + BT_SHOT, BT_VIEWCYCLE_TEST): the sec
panel cycles ARMOR DAMAGE silhouette -> CRITICAL DAMAGE subsystem list
-> HEAT DAMAGE colored list, mask 0x450421 -> 0x490421 -> 0x510421; M
control-mode cycling un-regressed (BAS/MID/ADV lamp cycles, view pinned).
Diags: BT_MODE_LOG, BT_VIEWCYCLE_TEST=<frame>, BT_MODECYCLE_TEST=<frame>,
BT_CTRLMAP_LOG now dumps EVENT records. KB: gauges-hud secondary-view
section rewritten, CLASSMAP +0x48/+0x4C slots, decomp-reference env
gates, GAUGE_COMPOSITE phase-4 entry resolved.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
74 lines
3.3 KiB
C++
74 lines
3.3 KiB
C++
//#############################################################################
|
|
// btinput.hpp -- the desktop input binding engine (CONTROLS.MAP + XInput).
|
|
//
|
|
// The pod's controls are a fixed physical device set (stick, throttle lever,
|
|
// pedals, ~44 lamp buttons, keypads) reaching the game through the
|
|
// LBE4ControlsManager push model. On a desktop there is no RIO, so this
|
|
// engine maps PC keys and an XInput gamepad onto the SAME channels:
|
|
//
|
|
// axes -> the virtual-controls integrators in mech4.cpp (lever / turn
|
|
// stick / torso twist), exactly where the BT_KEY_BRIDGE writes
|
|
// the analog values the RIO would have produced
|
|
// buttons -> real buttonGroup[addr] ForceUpdates (aux banks, hotbox,
|
|
// panic, throttle-head...) so the AUTHENTIC handlers fire;
|
|
// the four joystick fire buttons (0x40/45/46/47) drive the
|
|
// bring-up fire channels instead (see btinput.cpp note)
|
|
// keypads -> keyboardGroup[KeyboardPilot/KeyboardExternal] key values
|
|
// pckey -> keyboardGroup[KeyboardPC] (any authentic '+'-style hotkey)
|
|
// actions -> the port-side dev controls (view toggle, all-stop, ...)
|
|
//
|
|
// Bindings load from content/CONTROLS.MAP at first poll; if the file is
|
|
// absent the compiled-in WASD-classic profile (identical text) applies.
|
|
// Keys claimed by a binding are SUPPRESSED from the legacy WM_CHAR/-KEYUP
|
|
// keyboard feed (BTInputSuppressKey), ending the historic double-dispatch
|
|
// (W = drive AND pilot-select, F5 keyup aliasing to 't' = pilot 3, ...).
|
|
//#############################################################################
|
|
#ifndef BTINPUT_HPP
|
|
#define BTINPUT_HPP
|
|
|
|
struct BTInputState
|
|
{
|
|
// analog demands (consumed by the mech4 virtual-controls block)
|
|
float leverRate; // throttle lever sweep, per second (+fwd/-back)
|
|
float turnTarget; // turn-stick deflection target [-1,1]
|
|
int turnActive; // any turn input held (else spring-center)
|
|
float twistTarget; // torso-twist deflection target [-1,1]
|
|
int twistActive;
|
|
float elevTarget; // torso-elevation (pitch) target [-1,1]
|
|
int elevActive;
|
|
int turnAbsolute; // pad stick overrides the integrator outright
|
|
int twistAbsolute;
|
|
int elevAbsolute;
|
|
|
|
// the four pod joystick fire buttons (levels)
|
|
int fireTrigger; // 0x40 Main
|
|
int firePinky; // 0x45
|
|
int fireThumbLow; // 0x46 Middle
|
|
int fireThumbHigh; // 0x47 Upper
|
|
|
|
// port-side actions (levels; consumers keep their own edge detectors)
|
|
int viewToggle;
|
|
int lookBehind;
|
|
int allStop;
|
|
int modeCycle;
|
|
int displayCycle; // Gitea #6: secondary schematic cycle (Damage/Critical/Heat)
|
|
int valve;
|
|
int flush; // Gitea #7: coolant flush HELD (InjectCoolant)
|
|
int configHold;
|
|
int genSel; // 0 = none, 4..7 = Generator A..D, 8 = reconnect
|
|
};
|
|
|
|
extern BTInputState gBTInput;
|
|
|
|
// Poll everything (keys + pad), evaluate the binding table, fire button /
|
|
// keypad edges into the controls manager. Call ONCE per sim frame from the
|
|
// player drive block. Handles the foreground-focus guard (BT_KEY_NOFOCUS)
|
|
// internally.
|
|
void BTInputPoll(float dt);
|
|
|
|
// The legacy keyboard feed asks before dispatching a typed character /
|
|
// key-up value: nonzero = this key is claimed by a binding, swallow it.
|
|
extern "C" int BTInputSuppressKey(unsigned int key_value, int is_char);
|
|
|
|
#endif // BTINPUT_HPP
|