[Scummvm-git-logs] scummvm master -> 8940690eb780fcf8537562c9eda7cdd4ea3c7a27

sev- noreply at scummvm.org
Mon Sep 22 22:33:03 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:
a7f06deec0 DIRECTOR: Moved behavior-related methods from score.cpp to lingo-events.cpp
8940690eb7 DIRECTOR: LINGO: Initial code for evaluation behavior init params


Commit: a7f06deec0e14b46c9500a8f5645ea7525af95c7
    https://github.com/scummvm/scummvm/commit/a7f06deec0e14b46c9500a8f5645ea7525af95c7
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2025-09-22T23:52:31+02:00

Commit Message:
DIRECTOR: Moved behavior-related methods from score.cpp to lingo-events.cpp

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


diff --git a/engines/director/lingo/lingo-events.cpp b/engines/director/lingo/lingo-events.cpp
index 8220691ca9c..7967513dfee 100644
--- a/engines/director/lingo/lingo-events.cpp
+++ b/engines/director/lingo/lingo-events.cpp
@@ -679,4 +679,60 @@ bool Lingo::processEvent(LEvent event, ScriptType st, CastMemberID scriptId, int
 	return true;
 }
 
+void Score::killScriptInstances(int frameNum) {
+	if (_version < kFileVer600) // No-op for early Directors
+		return;
+
+	for (int i = 0; i < (int)_channels.size(); i++) {
+		Channel *channel = _channels[i];
+
+		if (channel->_scriptInstanceList.size() == 0)
+			continue;
+
+		if (frameNum < channel->_startFrame || frameNum > channel->_endFrame) {
+			channel->_scriptInstanceList.clear();
+			channel->_startFrame = channel->_endFrame = -1;
+
+			debugC(1, kDebugLingoExec, "Score::killScriptInstances(): Killed script instances for channel %d", i + 1);
+		}
+	}
+}
+
+void Score::createScriptInstances(int frameNum) {
+	if (_version < kFileVer600) // No-op for early Directors
+		return;
+
+	for (int i = 0; i < (int)_channels.size(); i++) {
+		Channel *channel = _channels[i];
+		Sprite *sprite = channel->_sprite;
+
+		if (frameNum >= channel->_startFrame && frameNum <= channel->_endFrame) {
+			// We create scriptInstance only for new sprites
+			if (channel->_scriptInstanceList.size() == 0) {
+				if (sprite->_behaviors.size() > 0) {
+					for (uint j = 0; j < sprite->_behaviors.size(); j++) {
+
+						// Instantiate the behavior
+						// TODO: Initialize property list
+						g_lingo->push(_movie->getScriptContext(kScoreScript, sprite->_behaviors[j].memberID));
+						LC::call("new", 1, true);
+						Datum result = g_lingo->pop();
+
+						if (result.type != OBJECT) {
+							warning("Score::createScriptInstances(): Could not instantiate behavior %s for channel %d",
+								sprite->_behaviors[j].toString().c_str(), i + 1);
+							continue;
+						}
+
+						channel->_scriptInstanceList.push_back(result);
+
+						debugC(1, kDebugLingoExec, "Score::createScriptInstances(): Instantiating behavior %s for channel %d",
+							sprite->_behaviors[j].toString().c_str(), i + 1);
+					}
+				}
+			}
+		}
+	}
+}
+
 } // End of namespace Director
diff --git a/engines/director/score.cpp b/engines/director/score.cpp
index 3fb40d55ee5..3beda1846f3 100644
--- a/engines/director/score.cpp
+++ b/engines/director/score.cpp
@@ -49,7 +49,6 @@
 #include "director/castmember/castmember.h"
 #include "director/castmember/filmloop.h"
 #include "director/castmember/transition.h"
-#include "director/lingo/lingo-code.h"
 
 namespace Director {
 
@@ -2443,60 +2442,4 @@ Common::MemoryReadStreamEndian *Score::getSpriteDetailsStream(int spriteIdx) {
 	return stream;
 }
 
-void Score::killScriptInstances(int frameNum) {
-	if (_version < kFileVer600) // No-op for early Directors
-		return;
-
-	for (int i = 0; i < (int)_channels.size(); i++) {
-		Channel *channel = _channels[i];
-
-		if (channel->_scriptInstanceList.size() == 0)
-			continue;
-
-		if (frameNum < channel->_startFrame || frameNum > channel->_endFrame) {
-			channel->_scriptInstanceList.clear();
-			channel->_startFrame = channel->_endFrame = -1;
-
-			debugC(1, kDebugLingoExec, "Score::killScriptInstances(): Killed script instances for channel %d", i + 1);
-		}
-	}
-}
-
-void Score::createScriptInstances(int frameNum) {
-	if (_version < kFileVer600) // No-op for early Directors
-		return;
-
-	for (int i = 0; i < (int)_channels.size(); i++) {
-		Channel *channel = _channels[i];
-		Sprite *sprite = channel->_sprite;
-
-		if (frameNum >= channel->_startFrame && frameNum <= channel->_endFrame) {
-			// We create scriptInstance only for new sprites
-			if (channel->_scriptInstanceList.size() == 0) {
-				if (sprite->_behaviors.size() > 0) {
-					for (uint j = 0; j < sprite->_behaviors.size(); j++) {
-
-						// Instantiate the behavior
-						// TODO: Initialize property list
-						g_lingo->push(_movie->getScriptContext(kScoreScript, sprite->_behaviors[j].memberID));
-						LC::call("new", 1, true);
-						Datum result = g_lingo->pop();
-
-						if (result.type != OBJECT) {
-							warning("Score::createScriptInstances(): Could not instantiate behavior %s for channel %d",
-								sprite->_behaviors[j].toString().c_str(), i + 1);
-							continue;
-						}
-
-						channel->_scriptInstanceList.push_back(result);
-
-						debugC(1, kDebugLingoExec, "Score::createScriptInstances(): Instantiating behavior %s for channel %d",
-							sprite->_behaviors[j].toString().c_str(), i + 1);
-					}
-				}
-			}
-		}
-	}
-}
-
 } // End of namespace Director
diff --git a/engines/director/score.h b/engines/director/score.h
index 02b77b868f9..72ccaae1b5d 100644
--- a/engines/director/score.h
+++ b/engines/director/score.h
@@ -146,6 +146,7 @@ public:
 
 	Common::MemoryReadStreamEndian *getSpriteDetailsStream(int spriteIdx);
 
+	// They live in lingo/lingo-events.cpp
 	void killScriptInstances(int frameNum);
 	void createScriptInstances(int frameNum);
 


Commit: 8940690eb780fcf8537562c9eda7cdd4ea3c7a27
    https://github.com/scummvm/scummvm/commit/8940690eb780fcf8537562c9eda7cdd4ea3c7a27
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2025-09-23T00:31:50+02:00

Commit Message:
DIRECTOR: LINGO: Initial code for evaluation behavior init params

For whatever reason, b_value returns no value

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


diff --git a/engines/director/lingo/lingo-events.cpp b/engines/director/lingo/lingo-events.cpp
index 7967513dfee..b86909600c9 100644
--- a/engines/director/lingo/lingo-events.cpp
+++ b/engines/director/lingo/lingo-events.cpp
@@ -22,6 +22,7 @@
 #include "director/director.h"
 #include "director/debugger.h"
 #include "director/lingo/lingo.h"
+#include "director/lingo/lingo-builtins.h"
 #include "director/lingo/lingo-code.h"
 #include "director/lingo/lingo-object.h"
 #include "director/cast.h"
@@ -713,21 +714,47 @@ void Score::createScriptInstances(int frameNum) {
 					for (uint j = 0; j < sprite->_behaviors.size(); j++) {
 
 						// Instantiate the behavior
-						// TODO: Initialize property list
 						g_lingo->push(_movie->getScriptContext(kScoreScript, sprite->_behaviors[j].memberID));
 						LC::call("new", 1, true);
-						Datum result = g_lingo->pop();
+						Datum inst = g_lingo->pop();
 
-						if (result.type != OBJECT) {
+						if (inst.type != OBJECT) {
 							warning("Score::createScriptInstances(): Could not instantiate behavior %s for channel %d",
 								sprite->_behaviors[j].toString().c_str(), i + 1);
 							continue;
 						}
 
-						channel->_scriptInstanceList.push_back(result);
+						channel->_scriptInstanceList.push_back(inst);
 
-						debugC(1, kDebugLingoExec, "Score::createScriptInstances(): Instantiating behavior %s for channel %d",
+						debugC(1, kDebugLingoExec, "Score::createScriptInstances(): Instantiated behavior %s for channel %d",
 							sprite->_behaviors[j].toString().c_str(), i + 1);
+
+						if (sprite->_behaviors[j].initializerIndex) {
+							// Evaluate the params
+							g_lingo->push(sprite->_behaviors[j].initializerParams);
+							if (debugChannelSet(2, kDebugLingoExec)) {
+								g_lingo->printStack("Stack before:", 0);
+							}
+							LB::b_value(1);
+
+							if (debugChannelSet(2, kDebugLingoExec)) {
+								g_lingo->printStack("Stack after", 0);
+							}
+
+							if (g_lingo->_state->stack.size() == 0) {
+								warning("Score::createScriptInstances(): Could not evaluate initializer params '%s' for behavior %s for channel %d",
+									sprite->_behaviors[j].initializerParams.c_str(), sprite->_behaviors[j].toString().c_str(), i + 1);
+								continue;
+							}
+
+							Datum proplist = _lingo->pop();
+
+							if (proplist.type != PARRAY) {
+								warning("Score::createScriptInstances(): Could not evaluate initializer params '%s' for behavior %s for channel %d",
+									sprite->_behaviors[j].initializerParams.c_str(), sprite->_behaviors[j].toString().c_str(), i + 1);
+								continue;
+							}
+						}
 					}
 				}
 			}




More information about the Scummvm-git-logs mailing list