RioProfile gains a nullable AxisRouting section mapping each calibrated
axis (X/Y/Z/Rx/Ry/Rz) to a pad target (thumbs, triggers, or None) with a
Centered or UnipolarPositive conversion; the default reproduces the old
hardcoded routing exactly, so existing profiles are untouched. Routing
resolution lives in a pure, ViGEm-free AxisRouter for testability; the
sink neutralizes the pad on routing change so stale trigger state cannot
leak across profile switches.
Motivation: Descent reads the pad via SDL GameController, where the
triggers are its stock fire axis-buttons - the old fixed routing put
throttle on LeftTrigger (fires) and detent would have read as full
reverse. descent-d1x.json now routes Z->RightThumbY (UnipolarPositive,
detent = center) and Rz->RightThumbX, triggers untargeted; guarded by
tests that parse the shipped JSON through the real deserializer and
byte-compare the dxx-rebirth reference copy.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
First profile for a non-native game shipped in-repo (profiles/ is new -
profiles previously lived only inside config.json's Profiles array).
Matches d1x-rebirth; buttons map to synthesized DXX default keys with the
kiosk never-map list honored; ViGEm pad carries stick/throttle/pedals and
twitch actions. Worksheet + rationale: dxx-rebirth repo
docs/pod-input-map.md. Known work items before Phase-2 exit there: fixed
axis routing sends throttle/rudder to the trigger axes, and
AxisCalibrationConfig has no detent-to-center field yet.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>