From cb82d8c1d0022710f348f61683aa07472e671809 Mon Sep 17 00:00:00 2001 From: arcattack Date: Sat, 18 Jul 2026 17:20:19 -0500 Subject: [PATCH] Turn/twist/free-aim sign family: negate ONCE at the key bridge (user-verified) User live-tested: 'if i push the left arrow the mech turns right' -- correct, and it invalidated my earlier screenshot-forensics 'D=right verified' claim (the yaw telemetry actually agreed with the user all along: D gave POSITIVE yaw = CCW = LEFT; the sim uses math convention, positive = counter-clockwise, for turn AND twist). On the pod the RIO Ranger owned the hardware sign; the desktop bridge now negates in ONE place per channel family: - key_turn = -gBTDrive.turn (forced/BT_GOTO harness demands stay sim-frame, un-negated) - stickPosition.x = -gBTTwistAxis (Standard/Veteran torso stick) - SetFreeAimSlew call-site negations REMOVED (the bridge negation now flows through; double-flip removed) Matches the manual (p8): 'pulling your joystick to the right torso twists your Mech to the right.' User verified live: arrows steer correctly (Blackhawk, basic mode) and MadCat torso twist is correct in middle mode. LESSON (recorded): large-rotation screenshot comparisons are AMBIGUOUS (both directions put 'new scenery at an edge'); trust tracked landmarks, numeric telemetry with an established convention, or the user's live observation. Co-Authored-By: Claude Fable 5 --- game/reconstructed/mechmppr.cpp | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/game/reconstructed/mechmppr.cpp b/game/reconstructed/mechmppr.cpp index 3b82771..0ce5acc 100644 --- a/game/reconstructed/mechmppr.cpp +++ b/game/reconstructed/mechmppr.cpp @@ -600,7 +600,13 @@ void { float key_throttle = gBTDrive.forced ? gBTDrive.forcedThrottle : gBTDrive.throttle; - float key_turn = gBTDrive.forced ? 0.0f : gBTDrive.turn; + // PORT SIGN (user live-verified 2026-07-18: left arrow turned the + // mech RIGHT): the sim's positive turnDemand is CCW (LEFT) -- math + // convention, same as the torso twist. On the pod the RIO Ranger + // owned the hardware sign; the desktop bridge must negate so that + // input-right (positive) = turn RIGHT. Forced/BT_GOTO harness + // demands are sim-frame already and stay un-negated. + float key_turn = gBTDrive.forced ? 0.0f : -gBTDrive.turn; // Headless harness (forced mode only): BT_FORCE_TURN holds a steering // demand; BT_FORCE_SECONDS releases the forced throttle after n // sim-seconds while KEEPING the turn (the turn-in-place repro). @@ -734,7 +740,14 @@ void } else { - stickPosition.x = gBTTwistAxis; // the torso axis + // PORT SIGN: positive twist is CCW (left) like the turn; + // negate so stick/E-key right = torso right (manual p8: + // "pulling your joystick to the right torso twists your + // 'Mech to the right"). The earlier "MadCat twist was + // correct" call was based on the same misread screenshot + // forensics as the turn -- the user's live left-arrow + // test invalidated both. + stickPosition.x = -gBTTwistAxis; // the torso axis pedalsPosition = key_turn; // A/D = the pedals // 'X' recenter pulse (2026-07-13): one-frame centerCommand // -> the sim arms recenterActive and Recenter (@004b6918) @@ -867,12 +880,9 @@ void // if (torso == 0 || !torso->GetHorizontalEnabled()) // raw torso+0x250 == 0 { - // PORT SIGN (field report 2026-07-18, 'left/right reversed' on - // FIXED-TORSO mechs): the free-aim slew consumer pans the view - // opposite the torso-twist convention (E/right panned LEFT on - // the Blackhawk; the MadCat's real twist was CORRECT). Negate - // only this channel so stick-right = aim-right on both. - if (cockpit) cockpit->SetFreeAimSlew(-stick_x); // raw cockpit+0x28c + // (sign handled ONCE at the key bridge: positive sim twist/slew + // = CCW/left; the bridge negates so input-right = right) + if (cockpit) cockpit->SetFreeAimSlew(stick_x); // raw cockpit+0x28c } else { @@ -907,7 +917,7 @@ void // if (torso == 0 || !torso->GetHorizontalEnabled()) { - if (cockpit) cockpit->SetFreeAimSlew(-stick_x); // PORT SIGN (see Standard) + if (cockpit) cockpit->SetFreeAimSlew(stick_x); // (sign at the bridge) } else {