From f9495a484ced8088e1f8ca00f05bde2eecf9c347 Mon Sep 17 00:00:00 2001 From: Rachel Bryk Date: Sun, 2 Nov 2014 01:58:59 -0500 Subject: [PATCH] Allow hard resets to be recorded in movies. --- Source/Core/Core/Movie.cpp | 18 ++++++++++++------ Source/Core/Core/Movie.h | 8 ++++---- Source/Core/DolphinWX/FrameTools.cpp | 2 ++ 3 files changed, 18 insertions(+), 10 deletions(-) diff --git a/Source/Core/Core/Movie.cpp b/Source/Core/Core/Movie.cpp index cb667bdeac76..2efef5a9b5aa 100644 --- a/Source/Core/Core/Movie.cpp +++ b/Source/Core/Core/Movie.cpp @@ -21,6 +21,7 @@ #include "Core/DSP/DSPCore.h" #include "Core/HW/DVDInterface.h" #include "Core/HW/EXI_Device.h" +#include "Core/HW/ProcessorInterface.h" #include "Core/HW/SI.h" #include "Core/HW/Wiimote.h" #include "Core/HW/WiimoteEmu/WiimoteEmu.h" @@ -65,6 +66,7 @@ static std::string s_videoBackend = "unknown"; static int s_iCPUCore = 1; bool g_bClearSave = false; bool g_bDiscChange = false; +bool g_bReset = false; static std::string s_author = ""; std::string g_discChange = ""; u64 g_titleID = 0; @@ -576,6 +578,8 @@ static void SetInputDisplayString(ControllerState padState, int controllerID) s_InputDisplay[controllerID].append(" LEFT"); if (padState.DPadRight) s_InputDisplay[controllerID].append(" RIGHT"); + if (padState.reset) + s_InputDisplay[controllerID].append(" RESET"); s_InputDisplay[controllerID].append(Analog1DToString(padState.TriggerL, " L")); s_InputDisplay[controllerID].append(Analog1DToString(padState.TriggerR, " R")); @@ -726,6 +730,11 @@ void CheckPadStatus(GCPadStatus* PadStatus, int controllerID) s_padState.CStickX = PadStatus->substickX; s_padState.CStickY = PadStatus->substickY; + s_padState.disc = g_bDiscChange; + g_bDiscChange = false; + s_padState.reset = g_bReset; + g_bReset = false; + SetInputDisplayString(s_padState, controllerID); } @@ -736,12 +745,6 @@ void RecordInput(GCPadStatus* PadStatus, int controllerID) CheckPadStatus(PadStatus, controllerID); - if (g_bDiscChange) - { - s_padState.disc = g_bDiscChange; - g_bDiscChange = false; - } - EnsureTmpInputSize((size_t)(s_currentByte + 8)); memcpy(&(tmpInput[s_currentByte]), &s_padState, 8); s_currentByte += 8; @@ -1111,6 +1114,9 @@ void PlayController(GCPadStatus* PadStatus, int controllerID) } } + if (s_padState.reset) + ProcessorInterface::ResetButton_Tap(); + SetInputDisplayString(s_padState, controllerID); CheckInputEnd(); } diff --git a/Source/Core/Core/Movie.h b/Source/Core/Core/Movie.h index 314509bcee76..98660bc42d2d 100644 --- a/Source/Core/Core/Movie.h +++ b/Source/Core/Core/Movie.h @@ -39,18 +39,18 @@ struct ControllerState DPadLeft:1, DPadRight:1; bool L:1, R:1; // Binary triggers, 2 bits bool disc:1; // Checks for disc being changed - bool reserved:3; // Reserved bits used for padding, 4 bits + bool reset:1; // Console reset button + bool reserved:2; // Reserved bits used for padding, 2 bits u8 TriggerL, TriggerR; // Triggers, 16 bits u8 AnalogStickX, AnalogStickY; // Main Stick, 16 bits u8 CStickX, CStickY; // Sub-Stick, 16 bits - -}; // Total: 60 + 4 = 64 bits per frame +}; static_assert(sizeof(ControllerState) == 8, "ControllerState should be 8 bytes"); #pragma pack(pop) // Global declarations -extern bool g_bDiscChange, g_bClearSave; +extern bool g_bDiscChange, g_bClearSave, g_bReset; extern u64 g_titleID; extern u64 g_currentFrame, g_totalFrames; diff --git a/Source/Core/DolphinWX/FrameTools.cpp b/Source/Core/DolphinWX/FrameTools.cpp index 0c27b52308aa..82fa89cec4db 100644 --- a/Source/Core/DolphinWX/FrameTools.cpp +++ b/Source/Core/DolphinWX/FrameTools.cpp @@ -1307,6 +1307,8 @@ void CFrame::OnStop(wxCommandEvent& WXUNUSED (event)) void CFrame::OnReset(wxCommandEvent& WXUNUSED (event)) { + if (Movie::IsRecordingInput()) + Movie::g_bReset = true; ProcessorInterface::ResetButton_Tap(); }