[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