From 5f3bf405d4d4a26f9bf0ecb1c65d24f98b1bbbe1 Mon Sep 17 00:00:00 2001 From: Techjar Date: Mon, 3 Jun 2019 20:34:06 -0400 Subject: [PATCH] Core/Movie: Store PAD_GET_ORIGIN bit in ControllerState This fixes the desync on playback of start-from-boot input recordings made while using the GC adapter, as well as other desyncs that could potentially occur in other circumstances where this bit is used. I used a previously reserved bit in the ControllerState to store the new data, so this shouldn't significantly break backwards compatibility. However, tools that aren't aware of this new bit may set it to 0, which will break input recordings that contain it. --- Source/Core/Core/Movie.cpp | 6 ++++++ Source/Core/Core/Movie.h | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/Source/Core/Core/Movie.cpp b/Source/Core/Core/Movie.cpp index 6af7681eb7..ea6aa486d1 100644 --- a/Source/Core/Core/Movie.cpp +++ b/Source/Core/Core/Movie.cpp @@ -803,6 +803,8 @@ void CheckPadStatus(const GCPadStatus* PadStatus, int controllerID) s_padState.is_connected = PadStatus->isConnected; + s_padState.get_origin = (PadStatus->button & PAD_GET_ORIGIN) != 0; + s_padState.disc = s_bDiscChange; s_bDiscChange = false; s_padState.reset = s_bReset; @@ -1182,6 +1184,10 @@ void PlayController(GCPadStatus* PadStatus, int controllerID) PadStatus->button |= PAD_TRIGGER_L; if (s_padState.R) PadStatus->button |= PAD_TRIGGER_R; + + if (s_padState.get_origin) + PadStatus->button |= PAD_GET_ORIGIN; + if (s_padState.disc) { Core::RunAsCPUThread([] { diff --git a/Source/Core/Core/Movie.h b/Source/Core/Core/Movie.h index 02acfa6661..dc788804f9 100644 --- a/Source/Core/Core/Movie.h +++ b/Source/Core/Core/Movie.h @@ -49,7 +49,7 @@ struct ControllerState bool disc : 1; // Checks for disc being changed bool reset : 1; // Console reset button bool is_connected : 1; // Should controller be treated as connected - bool reserved : 1; // Reserved bits used for padding, 1 bit + bool get_origin : 1; // Special bit to indicate analog origin reset u8 TriggerL, TriggerR; // Triggers, 16 bits u8 AnalogStickX, AnalogStickY; // Main Stick, 16 bits