[Scummvm-git-logs] scummvm master -> 15d0e2473536439635dddcef5969e4320cd68506

mgerhardy noreply at scummvm.org
Sat Oct 17 19:20:45 UTC 2026


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

Summary:
15d0e24735 MACS2: fixed issue in runInventoryPanelScriptIfPending


Commit: 15d0e2473536439635dddcef5969e4320cd68506
    https://github.com/scummvm/scummvm/commit/15d0e2473536439635dddcef5969e4320cd68506
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2026-10-17T21:18:13+02:00

Commit Message:
MACS2: fixed issue in runInventoryPanelScriptIfPending

should fix issue #17335

Changed paths:
    engines/macs2/scriptexecutor.cpp


diff --git a/engines/macs2/scriptexecutor.cpp b/engines/macs2/scriptexecutor.cpp
index 3cf99667445..9be723fd23e 100644
--- a/engines/macs2/scriptexecutor.cpp
+++ b/engines/macs2/scriptexecutor.cpp
@@ -666,14 +666,15 @@ void ScriptExecutor::step() {
 		}
 		}
 	}
-	// Rewind and reset to the scene script after we are done executing
+	// Rewind and reset to the scene script after we are done executing.
+	// End position 0 keeps g_wScriptIsExecuting false (pos < end) while Idle so
+	// prepareScriptStateForSave does not persist a fake mid-script state.
 	_scriptIsExecuting = false;
 	_executingObjectIndex = Scenes::instance()._currentSceneIndex;
 	setScript(Scenes::instance()._currentSceneScript);
-	if (_stream && _stream->size() > 0) {
+	if (_stream && _stream->size() > 0)
 		_stream->seek(0, SEEK_SET);
-		_scriptEndPosition = _stream->size();
-	}
+	_scriptEndPosition = 0;
 	_scriptExecutionState = ScriptExecutionState::ExecutingSceneScript;
 	_state = ExecutorState::Idle;
 	g_engine->_scriptExecutor->_isRepeatRun = false;
@@ -1913,7 +1914,7 @@ void Script::ScriptExecutor::seedMotionState(GameObject *object, Character *c, u
 void Script::ScriptExecutor::saveOpenInventoryScriptContext() {
 	// scriptOpenInventory (1008:c3e6): g_wSavedScriptPosition / End / ExecutingObjectId.
 	_savedOpenInventoryScriptPos = _stream ? _stream->pos() : 0;
-	_savedOpenInventoryScriptEndPos = _stream ? _stream->size() : 0;
+	_savedOpenInventoryScriptEndPos = _scriptEndPosition ? _scriptEndPosition : (_stream ? (uint32)_stream->size() : 0);
 	_savedOpenInventoryExecutingObjectId = _executingScriptObjectId;
 	_secondaryInventoryLocation = _savedOpenInventoryScriptPos;
 }
@@ -1940,14 +1941,19 @@ void Script::ScriptExecutor::restoreOpenInventoryScriptContext() {
 		_scriptExecutionState = ScriptExecutionState::ExecutingSceneScript;
 	}
 	if (_stream) {
-		_stream->seek(_savedOpenInventoryScriptPos, SEEK_SET);
+		_scriptEndPosition = _savedOpenInventoryScriptEndPos ? _savedOpenInventoryScriptEndPos : (uint32)_stream->size();
+		clampScriptEndToStream();
+		const uint32 seekPos = MIN(_savedOpenInventoryScriptPos, effectiveScriptEnd());
+		_stream->seek(seekPos, SEEK_SET);
 	}
-	_expectedEndLocation = _savedOpenInventoryScriptEndPos;
+	_expectedEndLocation = _savedOpenInventoryScriptPos;
 	_scriptClickFlag = _savedScriptClickFlag;
 	_scriptClickX = _savedScriptClickX;
 	_scriptClickY = _savedScriptClickY;
 	_scriptClickResult = _savedScriptClickResult;
-	_state = ExecutorState::Executing;
+	_scriptIsExecuting = true;
+	syncScriptIsExecutingFlag();
+	_state = ExecutorState::WaitingForCallback;
 }
 
 OpcodeResult Script::ScriptExecutor::scriptSetYOffset() {
@@ -2627,12 +2633,13 @@ OpcodeResult Script::ScriptExecutor::scriptDismissAllPanels() {
 }
 
 OpcodeResult Script::ScriptExecutor::scriptResetToSceneScript() {
-	// scriptResetToSceneScript (1008:ad3e). Resets script execution
-	// context back to the current scene script at position 0.
+	// scriptResetToSceneScript (1008:ad3e). Point the VM at the scene script at
+	// position 0 and keep executing. Do not switch _scriptExecutionState back to
+	// ExecutingSceneScript or rewrite _executingObjectIndex: during an object-walk
+	// that would make loadNextScript() restart from object 1 after the scene
+	// finishes, rematching the same interaction forever (#17335 pouch+cage).
 	debugC(kDebugScript, "SCRIPT::resetToSceneScript()");
 	_executingScriptObjectId = 0;
-	_executingObjectIndex = Scenes::instance()._currentSceneIndex;
-	_scriptExecutionState = ScriptExecutionState::ExecutingSceneScript;
 	setCurrentSceneScriptAt(0);
 	_expectedEndLocation = 0;
 	return OpcodeResult::Continue;
@@ -4343,9 +4350,10 @@ void ScriptExecutor::releaseObjectStream() {
 void ScriptExecutor::setCurrentSceneScriptAt(uint32 offset) {
 	setScript(Scenes::instance()._currentSceneScript);
 	if (_stream) {
-		if (_scriptEndPosition == 0)
-			_scriptEndPosition = _stream->size();
-		clampScriptEndToStream();
+		// Always adopt the scene script's end. Leaving a previous object-script end
+		// in place truncates the scene (effectiveScriptEnd clamps to MIN) so opcode
+		// 0x37 barely runs the scene then returns to the object walk (#17335).
+		_scriptEndPosition = _stream->size();
 		const uint32 seekPos = MIN(offset, effectiveScriptEnd());
 		_stream->seek(seekPos, SEEK_SET);
 	}
@@ -4355,6 +4363,14 @@ void ScriptExecutor::prepareScriptStateForSave() {
 	if (!_stream)
 		return;
 
+	// Idle is never mid-script; keep end at 0 so we do not save g_wScriptIsExecuting=1
+	// from a bare pos < size check after step() rewound the scene stream to 0.
+	if (_state == ExecutorState::Idle) {
+		_scriptIsExecuting = false;
+		_scriptEndPosition = 0;
+		return;
+	}
+
 	Common::MemoryReadStream *sceneScript = Scenes::instance()._currentSceneScript;
 	const uint32 streamPos = (uint32)_stream->pos();
 




More information about the Scummvm-git-logs mailing list