fix action player wait actions to properly delay playback finish

Wait actions now extend the minimum finish time based on their
timestamp + duration, ensuring timers and other async operations
have time to complete before playback ends and screenshot is taken.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-01-19 10:35:44 +01:00
parent 8432bbb986
commit a583ef64a1
2 changed files with 20 additions and 10 deletions

View File

@@ -35,6 +35,7 @@ void ActionPlayer::Start() {
m_start_time = std::chrono::steady_clock::now();
m_paused_duration_ms = 0;
m_min_finish_time_ms = 0;
m_current_index = 0;
m_playing = true;
m_paused = false;
@@ -74,17 +75,21 @@ float ActionPlayer::GetProgress() const {
void ActionPlayer::Update() {
if (!m_playing || m_paused || m_finished) return;
if (m_current_index >= m_sequence.actions.size()) {
m_finished = true;
m_playing = false;
std::cout << "ActionPlayer: Finished playback" << std::endl;
return;
}
auto now = std::chrono::steady_clock::now();
int64_t elapsed_ms = std::chrono::duration_cast<std::chrono::milliseconds>(now - m_start_time).count();
elapsed_ms -= m_paused_duration_ms;
// Check if all actions done AND minimum finish time reached
if (m_current_index >= m_sequence.actions.size()) {
if (elapsed_ms >= m_min_finish_time_ms) {
m_finished = true;
m_playing = false;
std::cout << "ActionPlayer: Finished playback" << std::endl;
}
return;
}
// Execute all actions whose timestamp has passed
while (m_current_index < m_sequence.actions.size()) {
const auto& action = m_sequence.actions[m_current_index];
@@ -118,7 +123,11 @@ void ActionPlayer::ExecuteAction(const Action& action) {
SimulateButton(arg.button);
} else if constexpr (std::is_same_v<T, WaitAction>) {
std::cout << "ActionPlayer: Wait " << arg.duration_ms << "ms" << std::endl;
// Wait is implicit - timing handled by timestamp
// Extend the minimum finish time to allow the wait duration to elapse
int64_t wait_end_time = arg.timestamp_ms + arg.duration_ms;
if (wait_end_time > this->m_min_finish_time_ms) {
this->m_min_finish_time_ms = wait_end_time;
}
} else if constexpr (std::is_same_v<T, KeyAction>) {
std::cout << "ActionPlayer: Key " << arg.key_code << " " << (arg.pressed ? "down" : "up") << std::endl;
if (arg.pressed) {

View File

@@ -59,6 +59,7 @@ private:
std::chrono::steady_clock::time_point m_start_time;
std::chrono::steady_clock::time_point m_pause_time;
int64_t m_paused_duration_ms = 0;
int64_t m_min_finish_time_ms = 0; // Extended by wait actions
ScreenshotCallback m_screenshot_cb;
NavigateCallback m_navigate_cb;