[Scummvm-git-logs] scummvm master -> 32bcf7e3601361ab734fdf1229ca245598140da4

sev- noreply at scummvm.org
Sat Sep 20 23:15:48 UTC 2025


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

Summary:
b4ce78f9db DIRECTOR: LINGO: Resovle scriptInstance for behavior
32bcf7e360 DIRECTOR: LINGO: Execute behavior script instance


Commit: b4ce78f9db6f404de8a18720a00f6f44c0edfa57
    https://github.com/scummvm/scummvm/commit/b4ce78f9db6f404de8a18720a00f6f44c0edfa57
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2025-09-21T01:15:13+02:00

Commit Message:
DIRECTOR: LINGO: Resovle scriptInstance for behavior

Changed paths:
    engines/director/lingo/lingo-events.cpp
    engines/director/lingo/lingo.h


diff --git a/engines/director/lingo/lingo-events.cpp b/engines/director/lingo/lingo-events.cpp
index 00b29c07979..2b5e57078ba 100644
--- a/engines/director/lingo/lingo-events.cpp
+++ b/engines/director/lingo/lingo-events.cpp
@@ -275,6 +275,10 @@ void Movie::resolveScriptEvent(LingoEvent &event) {
 					// D4-style event handler
 					event.scriptType = kScoreScript;
 					event.scriptId = scriptId;
+
+					if (_vm->getVersion() >= 600)
+						event.scriptInstance = _score->_channels[event.channelId]->_scriptInstanceList[event.behaviorIndex];
+
 				} else if (script->_eventHandlers.contains(kEventGeneric)) {
 					// D3-style sprite script, not contained in a handler
 					// If sprite is immediate, its script is run on mouseDown, otherwise on mouseUp
diff --git a/engines/director/lingo/lingo.h b/engines/director/lingo/lingo.h
index 20c9e0d8c6e..ad60f0b5d1c 100644
--- a/engines/director/lingo/lingo.h
+++ b/engines/director/lingo/lingo.h
@@ -271,7 +271,8 @@ struct LingoEvent {
 	uint16 channelId;
 	CastMemberID scriptId;
 	Common::Point mousePos;
-	int behaviorIndex = -1;
+	int behaviorIndex;
+	AbstractObject *scriptInstance;
 
 	LingoEvent(LEvent e, int ei, ScriptType st, bool pass, CastMemberID si = CastMemberID(), Common::Point mp = Common::Point(-1, -1), int bi = -1) {
 		event = e;
@@ -283,6 +284,7 @@ struct LingoEvent {
 		scriptId = si;
 		mousePos = mp;
 		behaviorIndex = bi;
+		scriptInstance = nullptr;
 	}
 
 	LingoEvent(LEvent e, int ei, EventHandlerSourceType ehst, bool pass, Common::Point mp = Common::Point(-1, -1), uint16 ci = 0, int bi = -1) {
@@ -295,6 +297,7 @@ struct LingoEvent {
 		scriptId = CastMemberID();
 		mousePos = mp;
 		behaviorIndex = bi;
+		scriptInstance = nullptr;
 	}
 };
 


Commit: 32bcf7e3601361ab734fdf1229ca245598140da4
    https://github.com/scummvm/scummvm/commit/32bcf7e3601361ab734fdf1229ca245598140da4
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2025-09-21T01:15:30+02:00

Commit Message:
DIRECTOR: LINGO: Execute behavior script instance

At this moment it still does not work seemingly because of
aggressive instance deallocation

Changed paths:
    engines/director/lingo/lingo-events.cpp
    engines/director/lingo/lingo.h


diff --git a/engines/director/lingo/lingo-events.cpp b/engines/director/lingo/lingo-events.cpp
index 2b5e57078ba..5c52aef83fe 100644
--- a/engines/director/lingo/lingo-events.cpp
+++ b/engines/director/lingo/lingo-events.cpp
@@ -268,6 +268,13 @@ void Movie::resolveScriptEvent(LingoEvent &event) {
 				immediate = sprite->_immediate;
 			}
 
+			if (_vm->getVersion() >= 600) {
+				event.scriptType = kScoreScript;
+				event.scriptId = scriptId;
+				event.scriptInstance = _score->_channels[event.channelId]->_scriptInstanceList[event.behaviorIndex];
+				return;
+			}
+
 			// Sprite (score) script
 			ScriptContext *script = getScriptContext(kScoreScript, scriptId);
 			if (script) {
@@ -275,10 +282,6 @@ void Movie::resolveScriptEvent(LingoEvent &event) {
 					// D4-style event handler
 					event.scriptType = kScoreScript;
 					event.scriptId = scriptId;
-
-					if (_vm->getVersion() >= 600)
-						event.scriptInstance = _score->_channels[event.channelId]->_scriptInstanceList[event.behaviorIndex];
-
 				} else if (script->_eventHandlers.contains(kEventGeneric)) {
 					// D3-style sprite script, not contained in a handler
 					// If sprite is immediate, its script is run on mouseDown, otherwise on mouseUp
@@ -609,7 +612,7 @@ void Lingo::processEvents(Common::Queue<LingoEvent> &queue, bool isInputEvent) {
 		debugC(5, kDebugEvents, "Lingo::processEvents: starting event script (%s, %s, %s, %d)",
 			_eventHandlerTypes[el.event], scriptType2str(el.scriptType), el.scriptId.asString().c_str(), el.channelId
 		);
-		bool completed = processEvent(el.event, el.scriptType, el.scriptId, el.channelId);
+		bool completed = processEvent(el.event, el.scriptType, el.scriptId, el.channelId, el.scriptInstance);
 		movie->_lastEventId[el.event] = el.eventId;
 
 		if (isInputEvent && !completed) {
@@ -624,12 +627,19 @@ void Lingo::processEvents(Common::Queue<LingoEvent> &queue, bool isInputEvent) {
 	}
 }
 
-bool Lingo::processEvent(LEvent event, ScriptType st, CastMemberID scriptId, int channelId) {
+bool Lingo::processEvent(LEvent event, ScriptType st, CastMemberID scriptId, int channelId, AbstractObject *obj) {
 	_currentChannelId = channelId;
 
 	if (!_eventHandlerTypes.contains(event))
 		error("processEvent: Unknown event %d", event);
 
+
+	if (g_director->getVersion() >= 600 && st == kScoreScript && obj) {
+		push(Datum(obj));
+		LC::call(_eventHandlerTypes[event], 1, true);
+		return execute();
+	}
+
 	ScriptContext *script = g_director->getCurrentMovie()->getScriptContext(st, scriptId);
 	int nargs = 0;
 
diff --git a/engines/director/lingo/lingo.h b/engines/director/lingo/lingo.h
index ad60f0b5d1c..815eda30e53 100644
--- a/engines/director/lingo/lingo.h
+++ b/engines/director/lingo/lingo.h
@@ -405,7 +405,7 @@ public:
 	// lingo-events.cpp
 private:
 	void initEventHandlerTypes();
-	bool processEvent(LEvent event, ScriptType st, CastMemberID scriptId, int channelId = -1);
+	bool processEvent(LEvent event, ScriptType st, CastMemberID scriptId, int channelId = -1, AbstractObject *obj = nullptr);
 
 public:
 	ScriptType event2script(LEvent ev);




More information about the Scummvm-git-logs mailing list