[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