[Scummvm-git-logs] scummvm master -> 08910c934b845335d2b20a043e6c47961500a8b0

alexbevi noreply at scummvm.org
Wed Sep 23 09:23:56 UTC 2026


This automated email contains information about 10 new commits which have been
pushed to the 'scummvm' repo located at https://api.github.com/repos/scummvm/scummvm .

Summary:
f3ae278f88 RECORDER: Preserve modal dialogs while event recording is suspended
3a44b5b471 RECORDER: disable unsupported game warning on playback
85e26d3fe1 RECORDER: Fix surface creation with SDL3
48d5625478 RECORDER: Preserve input poll boundaries during playback
83d8fe84d9 RECORDER: Return the same timestamps to the engine during recording and playback.
0bc69775ed RECORDER: Capture GMM input
9d112d1a9c RECORDER: Defer shutdown when playback reaches EOF
f0b0e9be29 RECORDER: Guard exhausted event buffers and queue EOF quit once
81497db6c2 RECORDER: Consume seed generation timing queries during playback
08910c934b RECORDER: revert changes to deinit checks


Commit: f3ae278f88a1a47d03062a0847b352c3590b270f
    https://github.com/scummvm/scummvm/commit/f3ae278f88a1a47d03062a0847b352c3590b270f
Author: Alex Bevilacqua (alex at alexbevi.com)
Date: 2026-09-23T05:23:46-04:00

Commit Message:
RECORDER: Preserve modal dialogs while event recording is suspended

The recorder overlay could overwrite the unsupported-game warning,
leaving startup waiting for input to an invisible dialog.

Assisted-by: Codex:gpt-6-astra

Changed paths:
    gui/EventRecorder.cpp


diff --git a/gui/EventRecorder.cpp b/gui/EventRecorder.cpp
index f8ec2dd38cd..375c241459a 100644
--- a/gui/EventRecorder.cpp
+++ b/gui/EventRecorder.cpp
@@ -739,6 +739,10 @@ void EventRecorder::preDrawOverlayGui() {
 	if (isImGuiRecorderEnabled())
 		return;
 
+	// GUI dialogs own the overlay while recording is suspended.
+	if (_acquireCount > 0)
+		return;
+
 	if ((_initialized) || (_needRedraw)) {
 		RecordMode oldMode = _recordMode;
 		_recordMode = kPassthrough;
@@ -759,6 +763,9 @@ void EventRecorder::postDrawOverlayGui() {
 	if (isImGuiRecorderEnabled())
 		return;
 
+	if (_acquireCount > 0)
+		return;
+
 	if ((_initialized) || (_needRedraw)) {
 		RecordMode oldMode = _recordMode;
 		_recordMode = kPassthrough;


Commit: 3a44b5b471fee399a5760329f8254ff13b35593c
    https://github.com/scummvm/scummvm/commit/3a44b5b471fee399a5760329f8254ff13b35593c
Author: Alex Bevilacqua (alex at alexbevi.com)
Date: 2026-09-23T05:23:46-04:00

Commit Message:
RECORDER: disable unsupported game warning on playback

Changed paths:
    gui/EventRecorder.cpp


diff --git a/gui/EventRecorder.cpp b/gui/EventRecorder.cpp
index 375c241459a..26dfeb56d91 100644
--- a/gui/EventRecorder.cpp
+++ b/gui/EventRecorder.cpp
@@ -559,6 +559,9 @@ void EventRecorder::applyPlaybackSettings() {
 	}
 	removeDifferentEntriesInDomain(ConfMan.getDomain(ConfMan.kApplicationDomain));
 	removeDifferentEntriesInDomain(ConfMan.getActiveDomain());
+
+	// Startup warning confirmations are not recorded, and playback blocks live input.
+	ConfMan.setBool("enable_unsupported_game_warning", false, ConfMan.kTransientDomain);
 }
 
 void EventRecorder::removeDifferentEntriesInDomain(Common::ConfigManager::Domain *domain) {


Commit: 85e26d3fe1b217dbc878d5305c8b7ae0f03ccf45
    https://github.com/scummvm/scummvm/commit/85e26d3fe1b217dbc878d5305c8b7ae0f03ccf45
Author: Alex Bevilacqua (alex at alexbevi.com)
Date: 2026-09-23T05:23:46-04:00

Commit Message:
RECORDER: Fix surface creation with SDL3

Changed paths:
    gui/EventRecorder.cpp


diff --git a/gui/EventRecorder.cpp b/gui/EventRecorder.cpp
index 26dfeb56d91..8ace26eafe7 100644
--- a/gui/EventRecorder.cpp
+++ b/gui/EventRecorder.cpp
@@ -811,7 +811,11 @@ void EventRecorder::setFileHeader() {
 
 SDL_Surface *EventRecorder::getSurface(int width, int height) {
 	// Create a RGB565 surface of the requested dimensions.
+#if SDL_VERSION_ATLEAST(3, 0, 0)
+	return SDL_CreateSurface(width, height, SDL_PIXELFORMAT_RGB565);
+#else
 	return SDL_CreateRGBSurface(SDL_SWSURFACE, width, height, 16, 0xF800, 0x07E0, 0x001F, 0x0000);
+#endif
 }
 
 bool EventRecorder::switchMode() {


Commit: 48d5625478d63e674fd28ca2c18db8fb49d6580f
    https://github.com/scummvm/scummvm/commit/48d5625478d63e674fd28ca2c18db8fb49d6580f
Author: Alex Bevilacqua (alex at alexbevi.com)
Date: 2026-09-23T05:23:46-04:00

Commit Message:
RECORDER: Preserve input poll boundaries during playback

Record empty input polls to prevent playback from delivering events
earlier than during recording, which can desynchronize screen updates
and stall timing loops.

Assisted-by: Codex:gpt-6-astra

Changed paths:
    common/recorderfile.cpp
    common/recorderfile.h
    gui/EventRecorder.cpp
    gui/EventRecorder.h


diff --git a/common/recorderfile.cpp b/common/recorderfile.cpp
index bad8f862fd9..393de5707e5 100644
--- a/common/recorderfile.cpp
+++ b/common/recorderfile.cpp
@@ -29,7 +29,7 @@
 #include "graphics/managed_surface.h"
 #include "graphics/scaler.h"
 
-#define RECORD_VERSION 1
+#define RECORD_VERSION 2
 
 namespace Common {
 
@@ -136,6 +136,7 @@ bool PlaybackFile::checkPlaybackFileVersion() {
 	_version = _readStream->readUint32BE();
 	switch (_version) {
 	case 1:
+	case 2:
 		break;
 	default:
 		warning("Unknown playback file version %d. Maximum supported version is %d.", _version, RECORD_VERSION);
@@ -379,6 +380,7 @@ void PlaybackFile::readEvent(RecorderEvent& event) {
 	event.recordedtype = (RecorderEventType)_tmpPlaybackFile.readByte();
 	switch (event.recordedtype) {
 	case kRecorderEventTypeTimer:
+	case kRecorderEventTypePoll:
 		event.time = _tmpPlaybackFile.readUint32BE();
 		break;
 	case kRecorderEventTypeTimeDate:
@@ -572,6 +574,7 @@ void PlaybackFile::writeEvent(const RecorderEvent &event) {
 	_tmpRecordFile.writeByte(event.recordedtype);
 	switch (event.recordedtype) {
 	case kRecorderEventTypeTimer:
+	case kRecorderEventTypePoll:
 		_tmpRecordFile.writeUint32BE(event.time);
 		break;
 	case kRecorderEventTypeTimeDate:
diff --git a/common/recorderfile.h b/common/recorderfile.h
index 73349194f3c..3ca0aa83aee 100644
--- a/common/recorderfile.h
+++ b/common/recorderfile.h
@@ -44,6 +44,7 @@ enum RecorderEventType {
 	kRecorderEventTypeTimer = 1,
 	kRecorderEventTypeTimeDate = 2,
 	kRecorderEventTypeScreenUpdate = 3,
+	kRecorderEventTypePoll = 4,
 };
 
 struct RecorderEvent : Event {
diff --git a/gui/EventRecorder.cpp b/gui/EventRecorder.cpp
index 8ace26eafe7..28682f53e9c 100644
--- a/gui/EventRecorder.cpp
+++ b/gui/EventRecorder.cpp
@@ -315,6 +315,7 @@ bool EventRecorder::pollEvent(Common::Event &ev) {
 	if (_nextEvent.recordedtype == Common::kRecorderEventTypeTimer
 	 || _nextEvent.recordedtype == Common::kRecorderEventTypeTimeDate
 	 || _nextEvent.recordedtype == Common::kRecorderEventTypeScreenUpdate
+	 || _nextEvent.recordedtype == Common::kRecorderEventTypePoll
 	 || _nextEvent.type == Common::EVENT_INVALID) {
 		return false;
 	}
@@ -366,7 +367,7 @@ void EventRecorder::togglePause() {
 }
 
 void EventRecorder::RegisterEventSource() {
-	g_system->getEventManager()->getEventDispatcher()->registerObserver(this, Common::EventManager::kEventRecorderPriority, false);
+	g_system->getEventManager()->getEventDispatcher()->registerObserver(this, Common::EventManager::kEventRecorderPriority, false, true);
 }
 
 uint32 EventRecorder::getRandomSeed(const Common::String &name) {
@@ -600,6 +601,25 @@ void EventRecorder::updateSubsystems() {
 	_recordMode = oldRecordMode;
 }
 
+void EventRecorder::notifyPoll() {
+	if (!_initialized)
+		return;
+
+	// Preserve empty polls as well: input received during an audio wait must not
+	// be replayed by an earlier poll before the engine enters that wait.
+	if ((_recordMode == kRecorderPlayback || _recordMode == kRecorderUpdate) &&
+			_nextEvent.recordedtype == Common::kRecorderEventTypePoll) {
+		_nextEvent = _playbackFile->getNextEvent();
+	}
+
+	if (_recordMode == kRecorderRecord || _recordMode == kRecorderUpdate) {
+		Common::RecorderEvent event;
+		event.recordedtype = Common::kRecorderEventTypePoll;
+		event.time = _fakeTimer;
+		_recordFile->writeEvent(event);
+	}
+}
+
 bool EventRecorder::notifyEvent(const Common::Event &ev) {
 	if (!_initialized && _recordMode != kRecorderPlaybackPause)
 		return false;
diff --git a/gui/EventRecorder.h b/gui/EventRecorder.h
index 28561bc5ce6..74c3b510f99 100644
--- a/gui/EventRecorder.h
+++ b/gui/EventRecorder.h
@@ -198,6 +198,7 @@ private:
 
 	bool pollEvent(Common::Event &ev) override;
 	bool notifyEvent(const Common::Event &event) override;
+	void notifyPoll() override;
 	bool _initialized;
 	volatile uint32 _fakeTimer;
 	TimeDate _lastTimeDate;


Commit: 83d8fe84d91ef766aaee034abca194276f874398
    https://github.com/scummvm/scummvm/commit/83d8fe84d91ef766aaee034abca194276f874398
Author: Alex Bevilacqua (alex at alexbevi.com)
Date: 2026-09-23T05:23:46-04:00

Commit Message:
RECORDER: Return the same timestamps to the engine during recording and playback.

Different clock origins can change animation tick rounding, desynchronize
screen updates, and stall playback.

Assisted-by: Codex:gpt-6-astra

Changed paths:
    gui/EventRecorder.cpp


diff --git a/gui/EventRecorder.cpp b/gui/EventRecorder.cpp
index 28682f53e9c..939608f9f86 100644
--- a/gui/EventRecorder.cpp
+++ b/gui/EventRecorder.cpp
@@ -194,6 +194,9 @@ void EventRecorder::processMillis(uint32 &millis, bool skipRecord) {
 	case kRecorderRecord:
 		updateSubsystems();
 		updateFakeTimer(millis);
+		// Engines that quantize absolute time need the same clock origin during
+		// recording and playback, not just the same elapsed intervals.
+		millis = _fakeTimer;
 		timerEvent.recordedtype = Common::kRecorderEventTypeTimer;
 		timerEvent.time = _fakeTimer;
 		_recordFile->writeEvent(timerEvent);


Commit: 0bc69775ed3639d8e96329cbffb7f0042d18a2ba
    https://github.com/scummvm/scummvm/commit/0bc69775ed3639d8e96329cbffb7f0042d18a2ba
Author: Alex Bevilacqua (alex at alexbevi.com)
Date: 2026-09-23T05:23:46-04:00

Commit Message:
RECORDER: Capture GMM input

Keep event recording active while the Global Main Menu is open so its
dismissal input is available during playback.

Clear recorder file pointers after cleanup and handle partially
initialized files to make repeated deinitialization safe.

Assisted-by: Codex:gpt-6-luna

Changed paths:
    engines/engine.cpp
    gui/EventRecorder.cpp
    gui/EventRecorder.h


diff --git a/engines/engine.cpp b/engines/engine.cpp
index cc7dbf5f0f0..6d1e75c069f 100644
--- a/engines/engine.cpp
+++ b/engines/engine.cpp
@@ -829,7 +829,13 @@ void Engine::openMainMenuDialog() {
 	if (hasVKeyb)
 		g_system->setFeatureState(OSystem::kFeatureVirtualKeyboard, false);
 
+#ifdef ENABLE_EVENTRECORDER
+	g_eventRec.setRecordModalDialog(true);
+#endif
 	runDialog(*_mainMenuDialog);
+#ifdef ENABLE_EVENTRECORDER
+	g_eventRec.setRecordModalDialog(false);
+#endif
 
 	if (hasVKeyb)
 		g_system->setFeatureState(OSystem::kFeatureVirtualKeyboard, true);
diff --git a/gui/EventRecorder.cpp b/gui/EventRecorder.cpp
index 939608f9f86..0b09ad91a5b 100644
--- a/gui/EventRecorder.cpp
+++ b/gui/EventRecorder.cpp
@@ -73,6 +73,7 @@ EventRecorder::EventRecorder() {
 	_fakeTimer = 0;
 	_savedState = false;
 	_acquireCount = 0;
+	_recordModalDialog = false;
 	_needcontinueGame = false;
 	_temporarySlot = 0;
 	_realSaveManager = nullptr;
@@ -90,7 +91,7 @@ EventRecorder::~EventRecorder() {
 }
 
 void EventRecorder::deinit() {
-	if (!_initialized) {
+	if (!_initialized && !_playbackFile && !_recordFile) {
 		return;
 	}
 	setFileHeader();
@@ -112,10 +113,12 @@ void EventRecorder::deinit() {
 	if (_playbackFile) {
 		_playbackFile->close();
 		delete _playbackFile;
+		_playbackFile = nullptr;
 	}
 	if (_recordFile) {
 		_recordFile->close();
 		delete _recordFile;
+		_recordFile = nullptr;
 	}
 	switchMixer();
 	switchTimerManagers();
@@ -1000,4 +1003,3 @@ void EventRecorder::showImGui() {
 } // End of namespace GUI
 
 #endif // ENABLE_EVENTRECORDER
-
diff --git a/gui/EventRecorder.h b/gui/EventRecorder.h
index 74c3b510f99..d89b852d7f8 100644
--- a/gui/EventRecorder.h
+++ b/gui/EventRecorder.h
@@ -144,6 +144,9 @@ public:
 	void setRedraw(bool redraw) {
 		_needRedraw = redraw;
 	}
+	void setRecordModalDialog(bool record) {
+		_recordModalDialog = record;
+	}
 
 	void registerMixerManager(MixerManager *mixerManager);
 	void registerTimerManager(DefaultTimerManager *timerManager);
@@ -158,7 +161,8 @@ public:
 		assert(_acquireCount >= 0);
 		if (_acquireCount == 0) {
 			_savedState = _initialized;
-			_initialized = false;
+			if (!_recordModalDialog)
+				_initialized = false;
 		}
 		_acquireCount += 1;
 	}
@@ -204,6 +208,7 @@ private:
 	TimeDate _lastTimeDate;
 	bool _savedState;
 	int _acquireCount;
+	bool _recordModalDialog;
 	bool _needcontinueGame;
 	int _temporarySlot;
 	Common::String _author;


Commit: 9d112d1a9c13b5844de4700d8aeb4ef7326b7d09
    https://github.com/scummvm/scummvm/commit/9d112d1a9c13b5844de4700d8aeb4ef7326b7d09
Author: Alex Bevilacqua (alex at alexbevi.com)
Date: 2026-09-23T05:23:46-04:00

Commit Message:
RECORDER: Defer shutdown when playback reaches EOF

Return an EVENT_QUIT from the playback stream instead of destroying the
OSystem from inside getNextEvent(). This lets the current screen update
finish before the  backend is torn down.

Assisted-by: Codex:gpt-6-luna

Changed paths:
    common/recorderfile.cpp
    gui/EventRecorder.cpp


diff --git a/common/recorderfile.cpp b/common/recorderfile.cpp
index 393de5707e5..78afa628e99 100644
--- a/common/recorderfile.cpp
+++ b/common/recorderfile.cpp
@@ -338,7 +338,9 @@ bool PlaybackFile::hasNextEvent() const {
 RecorderEvent PlaybackFile::getNextEvent() {
 	if (!hasNextEvent()) {
 		debug(3, "end of recorder file reached.");
-		g_system->quit();
+		RecorderEvent result;
+		result.type = EVENT_QUIT;
+		return result;
 	}
 
 	assert(_mode == kRead);
diff --git a/gui/EventRecorder.cpp b/gui/EventRecorder.cpp
index 0b09ad91a5b..86c8710c3c7 100644
--- a/gui/EventRecorder.cpp
+++ b/gui/EventRecorder.cpp
@@ -273,11 +273,15 @@ void EventRecorder::processScreenUpdate() {
 		break;
 	case kRecorderUpdate: // fallthrough
 	case kRecorderPlayback:
+		if (_nextEvent.type == Common::EVENT_QUIT)
+			return;
 		// if the next event isn't a screen update, fast forward until we find one.
 		if (_nextEvent.recordedtype != Common::kRecorderEventTypeScreenUpdate) {
 			int numSkipped = 0;
 			while (true) {
 				_nextEvent = _playbackFile->getNextEvent();
+				if (_nextEvent.type == Common::EVENT_QUIT)
+					return;
 				numSkipped += 1;
 				if (_nextEvent.recordedtype == Common::kRecorderEventTypeScreenUpdate) {
 					warning("Skipped %d events to get to the next screen update at %d", numSkipped, _nextEvent.time);


Commit: f0b0e9be295c3342701070375acb77d814e90409
    https://github.com/scummvm/scummvm/commit/f0b0e9be295c3342701070375acb77d814e90409
Author: Alex Bevilacqua (alex at alexbevi.com)
Date: 2026-09-23T05:23:46-04:00

Commit Message:
RECORDER: Guard exhausted event buffers and queue EOF quit once

An exhausted event chunk could fall through to readEvent(), decoding
stale buffer contents. Repeated EOF quit events could also keep event
dispatch from returning to the engine.

Assisted-by: Codex:gpt-6-astra

Changed paths:
    common/recorderfile.cpp
    gui/EventRecorder.cpp
    gui/EventRecorder.h


diff --git a/common/recorderfile.cpp b/common/recorderfile.cpp
index 78afa628e99..a87fffa3ff5 100644
--- a/common/recorderfile.cpp
+++ b/common/recorderfile.cpp
@@ -338,7 +338,7 @@ bool PlaybackFile::hasNextEvent() const {
 RecorderEvent PlaybackFile::getNextEvent() {
 	if (!hasNextEvent()) {
 		debug(3, "end of recorder file reached.");
-		RecorderEvent result;
+		RecorderEvent result = {};
 		result.type = EVENT_QUIT;
 		return result;
 	}
@@ -369,6 +369,12 @@ RecorderEvent PlaybackFile::getNextEvent() {
 			}
 		}
 	}
+	if (isEventsBufferEmpty()) {
+		debug(3, "end of recorder file reached.");
+		RecorderEvent result = {};
+		result.type = EVENT_QUIT;
+		return result;
+	}
 	RecorderEvent result;
 	readEvent(result);
 	return result;
diff --git a/gui/EventRecorder.cpp b/gui/EventRecorder.cpp
index 86c8710c3c7..dc7659b512a 100644
--- a/gui/EventRecorder.cpp
+++ b/gui/EventRecorder.cpp
@@ -84,6 +84,7 @@ EventRecorder::EventRecorder() {
 	_screenshotPeriod = 0;
 	_playbackFile = nullptr;
 	_recordFile = nullptr;
+	_playbackQuitPosted = false;
 }
 
 EventRecorder::~EventRecorder() {
@@ -138,6 +139,10 @@ void EventRecorder::processTimeAndDate(TimeDate &td, bool skipRecord) {
 	if (!_initialized) {
 		return;
 	}
+	if ((_recordMode == kRecorderPlayback || _recordMode == kRecorderUpdate) && _nextEvent.type == Common::EVENT_QUIT) {
+		postPlaybackQuit();
+		return;
+	}
 	if (skipRecord) {
 		td = _lastTimeDate;
 		return;
@@ -184,6 +189,10 @@ void EventRecorder::processMillis(uint32 &millis, bool skipRecord) {
 	if (!_initialized) {
 		return;
 	}
+	if ((_recordMode == kRecorderPlayback || _recordMode == kRecorderUpdate) && _nextEvent.type == Common::EVENT_QUIT) {
+		postPlaybackQuit();
+		return;
+	}
 	if (skipRecord || _processingMillis) {
 		millis = _fakeTimer;
 		return;
@@ -273,15 +282,19 @@ void EventRecorder::processScreenUpdate() {
 		break;
 	case kRecorderUpdate: // fallthrough
 	case kRecorderPlayback:
-		if (_nextEvent.type == Common::EVENT_QUIT)
+		if (_nextEvent.type == Common::EVENT_QUIT) {
+			postPlaybackQuit();
 			return;
+		}
 		// if the next event isn't a screen update, fast forward until we find one.
 		if (_nextEvent.recordedtype != Common::kRecorderEventTypeScreenUpdate) {
 			int numSkipped = 0;
 			while (true) {
 				_nextEvent = _playbackFile->getNextEvent();
-				if (_nextEvent.type == Common::EVENT_QUIT)
+				if (_nextEvent.type == Common::EVENT_QUIT) {
+					postPlaybackQuit();
 					return;
+				}
 				numSkipped += 1;
 				if (_nextEvent.recordedtype == Common::kRecorderEventTypeScreenUpdate) {
 					warning("Skipped %d events to get to the next screen update at %d", numSkipped, _nextEvent.time);
@@ -322,6 +335,10 @@ bool EventRecorder::pollEvent(Common::Event &ev) {
 		!_initialized)
 		return false;
 
+	if (_nextEvent.type == Common::EVENT_QUIT) {
+		postPlaybackQuit();
+		return false;
+	}
 	if (_nextEvent.recordedtype == Common::kRecorderEventTypeTimer
 	 || _nextEvent.recordedtype == Common::kRecorderEventTypeTimeDate
 	 || _nextEvent.recordedtype == Common::kRecorderEventTypeScreenUpdate
@@ -348,6 +365,18 @@ bool EventRecorder::pollEvent(Common::Event &ev) {
 	return true;
 }
 
+void EventRecorder::postPlaybackQuit() {
+	if (_playbackQuitPosted)
+		return;
+
+	Common::Event quitEvent;
+	quitEvent.type = Common::EVENT_QUIT;
+	g_system->getEventManager()->pushEvent(quitEvent);
+	_playbackQuitPosted = true;
+	_nextEvent.type = Common::EVENT_INVALID;
+	debugC(1, kDebugLevelEventRec, "playback:action=post-quit reason=EOF");
+}
+
 void EventRecorder::switchFastMode() {
 	if (_recordMode == kRecorderPlaybackPause) {
 		_fastPlayback = !_fastPlayback;
@@ -413,6 +442,7 @@ void EventRecorder::init(const Common::String &recordFileName, RecordMode mode)
 	_fakeMixerManager->init();
 	_fakeMixerManager->suspendAudio();
 	_fakeTimer = 0;
+	_playbackQuitPosted = false;
 	_lastMillis = g_system->getMillis();
 	_lastScreenshotTime = 0;
 	_recordMode = mode;
diff --git a/gui/EventRecorder.h b/gui/EventRecorder.h
index d89b852d7f8..939b6b06a5e 100644
--- a/gui/EventRecorder.h
+++ b/gui/EventRecorder.h
@@ -258,11 +258,13 @@ private:
 	void checkRecordedMD5();
 	void deleteTemporarySave();
 	void updateFakeTimer(uint32 millis);
+	void postPlaybackQuit();
 	volatile RecordMode _recordMode;
 	Common::String _recordFileName;
 	bool _fastPlayback;
 	bool _needRedraw;
 	bool _processingMillis;
+	bool _playbackQuitPosted;
 };
 
 } // End of namespace GUI


Commit: 81497db6c2452fe8764a5aaa7000613b95cc23d7
    https://github.com/scummvm/scummvm/commit/81497db6c2452fe8764a5aaa7000613b95cc23d7
Author: Alex Bevilacqua (alex at alexbevi.com)
Date: 2026-09-23T05:23:46-04:00

Commit Message:
RECORDER: Consume seed generation timing queries during playback

Assisted-by: Codex:gpt-6-astra

Changed paths:
    gui/EventRecorder.cpp


diff --git a/gui/EventRecorder.cpp b/gui/EventRecorder.cpp
index dc7659b512a..64b8817ffee 100644
--- a/gui/EventRecorder.cpp
+++ b/gui/EventRecorder.cpp
@@ -410,10 +410,12 @@ void EventRecorder::RegisterEventSource() {
 }
 
 uint32 EventRecorder::getRandomSeed(const Common::String &name) {
+	// Consume the same date and timer queries as recording before restoring
+	// the saved seed, otherwise they block subsequent playback events.
+	uint32 result = Common::RandomSource::generateNewSeed();
 	if (_recordMode == kRecorderPlayback) {
 		return _playbackFile->getHeader().randomSourceRecords[name];
 	}
-	uint32 result = Common::RandomSource::generateNewSeed();
 	if (_recordMode == kRecorderRecord) {
 		_recordFile->getHeader().randomSourceRecords[name] = result;
 	}


Commit: 08910c934b845335d2b20a043e6c47961500a8b0
    https://github.com/scummvm/scummvm/commit/08910c934b845335d2b20a043e6c47961500a8b0
Author: Alex Bevilacqua (alex at alexbevi.com)
Date: 2026-09-23T05:23:46-04:00

Commit Message:
RECORDER: revert changes to deinit checks

Changed paths:
    gui/EventRecorder.cpp


diff --git a/gui/EventRecorder.cpp b/gui/EventRecorder.cpp
index 64b8817ffee..7879e20a611 100644
--- a/gui/EventRecorder.cpp
+++ b/gui/EventRecorder.cpp
@@ -92,7 +92,7 @@ EventRecorder::~EventRecorder() {
 }
 
 void EventRecorder::deinit() {
-	if (!_initialized && !_playbackFile && !_recordFile) {
+	if (!_initialized) {
 		return;
 	}
 	setFileHeader();




More information about the Scummvm-git-logs mailing list