From 462d4d648e3f37984ffdb0147a03ec92d74a7d51 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 7 Apr 2018 18:00:08 -0700 Subject: [PATCH] Replay: Handle long button presses correctly. --- Core/Replay.cpp | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/Core/Replay.cpp b/Core/Replay.cpp index e3402fb3d5..9da036574e 100644 --- a/Core/Replay.cpp +++ b/Core/Replay.cpp @@ -268,17 +268,20 @@ static void ReplaySaveCtrl(uint32_t &buttons, uint8_t analog[2][2], uint64_t t) } static void ReplayExecuteCtrl(uint32_t &buttons, uint8_t analog[2][2], uint64_t t) { + if (replayCtrlPos >= replayItems.size()) { + // Don't assert buttons, let the user input prevail. + return; + } + for (; replayCtrlPos < replayItems.size() && t >= replayItems[replayCtrlPos].info.timestamp; ++replayCtrlPos) { const auto &item = replayItems[replayCtrlPos]; switch (item.info.action) { case ReplayAction::BUTTONS: - buttons = item.info.buttons; lastButtons = item.info.buttons; break; case ReplayAction::ANALOG: - memcpy(analog, item.info.analog, sizeof(analog)); - memcpy(lastAnalog, item.info.analog, sizeof(analog)); + memcpy(lastAnalog, item.info.analog, sizeof(lastAnalog)); break; default: @@ -287,6 +290,10 @@ static void ReplayExecuteCtrl(uint32_t &buttons, uint8_t analog[2][2], uint64_t } } + // We have to always apply the latest state here, because otherwise real input is used between changes. + buttons = lastButtons; + memcpy(analog, lastAnalog, sizeof(analog)); + if (replayExecPos < replayCtrlPos) { replayExecPos = replayCtrlPos; }