[Scummvm-git-logs] scummvm master -> 8c49944839dfe5958bf402a0436f62ee26dc4715
sev-
noreply at scummvm.org
Thu Sep 25 23:28:41 UTC 2025
This automated email contains information about 4 new commits which have been
pushed to the 'scummvm' repo located at https://api.github.com/repos/scummvm/scummvm .
Summary:
e9c64f99f4 DIRECTOR: Invoke 'on prepareMovie' handler for D6+
79eca5e868 DIRECTOR: LINGO: Disable go, play and updateStage in prepareMovie handler
36b506d472 DIRECTOR: LINGO: Added beginSprite/endSprite events to D6+
8c49944839 DIRECTOR: LINGO: Implemented prepareFrame event
Commit: e9c64f99f497ac5502840047b53590a5b1b39831
https://github.com/scummvm/scummvm/commit/e9c64f99f497ac5502840047b53590a5b1b39831
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2025-09-26T01:28:04+02:00
Commit Message:
DIRECTOR: Invoke 'on prepareMovie' handler for D6+
Changed paths:
engines/director/lingo/lingo-events.cpp
engines/director/window.cpp
diff --git a/engines/director/lingo/lingo-events.cpp b/engines/director/lingo/lingo-events.cpp
index 3b0db000c95..e27adc753dd 100644
--- a/engines/director/lingo/lingo-events.cpp
+++ b/engines/director/lingo/lingo-events.cpp
@@ -559,7 +559,7 @@ void Movie::queueEvent(Common::Queue<LingoEvent> &queue, LEvent event, int targe
case kEventStartMovie:
case kEventStepMovie:
case kEventStopMovie:
- case kEventPrepareMovie:
+ case kEventPrepareMovie: // D6+
queue.push(LingoEvent(event, eventId, kMovieHandler, false, pos, channelId));
break;
diff --git a/engines/director/window.cpp b/engines/director/window.cpp
index 280a894dacb..b0dcf9e8acb 100644
--- a/engines/director/window.cpp
+++ b/engines/director/window.cpp
@@ -615,6 +615,13 @@ bool Window::step() {
case kPlayLoaded:
if (!debugChannelSet(-1, kDebugCompileOnly)) {
debugC(1, kDebugEvents, "Starting playback of movie '%s'", _currentMovie->getMacName().c_str());
+
+ if (_vm->getVersion() >= 600) {
+ // We need to call this before behavior scripts are instantiated
+ // or cast loaded
+ _currentMovie->processEvent(kEventPrepareMovie);
+ }
+
_currentMovie->getScore()->startPlay();
if (_startFrame != -1) {
_currentMovie->getScore()->setCurrentFrame(_startFrame);
Commit: 79eca5e8685e8ca31fa1793cd2070ddbdbd6ee5d
https://github.com/scummvm/scummvm/commit/79eca5e8685e8ca31fa1793cd2070ddbdbd6ee5d
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2025-09-26T01:28:04+02:00
Commit Message:
DIRECTOR: LINGO: Disable go, play and updateStage in prepareMovie handler
This prevents recursion as per documentation
Changed paths:
engines/director/lingo/lingo-builtins.cpp
engines/director/lingo/lingo-funcs.cpp
engines/director/score.cpp
engines/director/score.h
engines/director/window.cpp
diff --git a/engines/director/lingo/lingo-builtins.cpp b/engines/director/lingo/lingo-builtins.cpp
index 2728e7d3abd..141460e5922 100644
--- a/engines/director/lingo/lingo-builtins.cpp
+++ b/engines/director/lingo/lingo-builtins.cpp
@@ -3220,6 +3220,11 @@ void LB::b_updateStage(int nargs) {
Score *score = movie->getScore();
Window *window = movie->getWindow();
+ if (score->_disableGoPlayUpdateStage) {
+ warning("Lingo::b_updateStage(): ignoring updateStage due to disableGoPlayUpdateStage flag");
+ return;
+ }
+
score->updateWidgets(movie->_videoPlayback);
if (window->_puppetTransition) {
window->playTransition(score->getCurrentFrameNum(), kRenderModeNormal, window->_puppetTransition->duration, window->_puppetTransition->area, window->_puppetTransition->chunkSize, window->_puppetTransition->type, score->_currentFrame->_mainChannels.scoreCachedPaletteId);
diff --git a/engines/director/lingo/lingo-funcs.cpp b/engines/director/lingo/lingo-funcs.cpp
index d63970ef3a4..7ef6238f822 100644
--- a/engines/director/lingo/lingo-funcs.cpp
+++ b/engines/director/lingo/lingo-funcs.cpp
@@ -51,6 +51,11 @@ void Lingo::func_goto(Datum &frame, Datum &movie, bool calledfromgo) {
Window *stage = _vm->getCurrentWindow();
Score *score = stage->getCurrentMovie()->getScore();
+ if (score->_disableGoPlayUpdateStage) {
+ warning("Lingo::func_goto(): ignoring goto due to disableGoPlayUpdateStage flag");
+ return;
+ }
+
stage->_skipFrameAdvance = true;
// If there isn't already frozen Lingo (e.g. from a previous func_goto we haven't yet unfrozen),
@@ -151,6 +156,10 @@ void Lingo::func_play(Datum &frame, Datum &movie) {
MovieReference ref;
Window *stage = _vm->getCurrentWindow();
+ if (stage->getCurrentMovie()->getScore()->_disableGoPlayUpdateStage) {
+ warning("Lingo::func_play(): ignoring play due to disableGoPlayUpdateStage flag");
+ return;
+ }
// play #done
if (frame.type == SYMBOL) {
diff --git a/engines/director/score.cpp b/engines/director/score.cpp
index 8b4c3e07400..2883dacd545 100644
--- a/engines/director/score.cpp
+++ b/engines/director/score.cpp
@@ -91,6 +91,8 @@ Score::Score(Movie *movie) {
_curFrameNumber = 1;
_framesStream = nullptr;
_currentFrame = nullptr;
+
+ _disableGoPlayUpdateStage = false;
}
Score::~Score() {
diff --git a/engines/director/score.h b/engines/director/score.h
index fc6facae37e..5a4eda987c2 100644
--- a/engines/director/score.h
+++ b/engines/director/score.h
@@ -233,6 +233,8 @@ public:
Common::Array<uint32> _spriteDetailOffsets;
Common::Array<bool> _spriteDetailAccessed;
+ bool _disableGoPlayUpdateStage;
+
private:
DirectorEngine *_vm;
Lingo *_lingo;
diff --git a/engines/director/window.cpp b/engines/director/window.cpp
index b0dcf9e8acb..7c23adba14c 100644
--- a/engines/director/window.cpp
+++ b/engines/director/window.cpp
@@ -619,7 +619,9 @@ bool Window::step() {
if (_vm->getVersion() >= 600) {
// We need to call this before behavior scripts are instantiated
// or cast loaded
+ _currentMovie->getScore()->_disableGoPlayUpdateStage = true;
_currentMovie->processEvent(kEventPrepareMovie);
+ _currentMovie->getScore()->_disableGoPlayUpdateStage = false;
}
_currentMovie->getScore()->startPlay();
Commit: 36b506d47236abe5d7fe62d42af20f81a7571994
https://github.com/scummvm/scummvm/commit/36b506d47236abe5d7fe62d42af20f81a7571994
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2025-09-26T01:28:04+02:00
Commit Message:
DIRECTOR: LINGO: Added beginSprite/endSprite events to D6+
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 e27adc753dd..8b084342489 100644
--- a/engines/director/lingo/lingo-events.cpp
+++ b/engines/director/lingo/lingo-events.cpp
@@ -525,6 +525,7 @@ void Movie::queueEvent(Common::Queue<LingoEvent> &queue, LEvent event, int targe
case kEventRightMouseUp:
case kEventRightMouseDown:
case kEventBeginSprite:
+ case kEventEndSprite:
case kEventMouseEnter:
case kEventMouseLeave:
if (_vm->getVersion() >= 600) {
@@ -539,6 +540,11 @@ void Movie::queueEvent(Common::Queue<LingoEvent> &queue, LEvent event, int targe
queue.push(LingoEvent(event, eventId, kSpriteHandler, passThrough, pos, channelId, i));
}
}
+
+ if (event == kEventBeginSprite || event == kEventEndSprite) {
+ // beginSprite and endSprite do not go any further than the sprite behaviors
+ break;
+ }
} else {
// We have no sprite under the mouse, no SpriteHandler to queue.
}
@@ -711,6 +717,11 @@ void Score::killScriptInstances(int frameNum) {
continue;
if (frameNum < channel->_startFrame || frameNum > channel->_endFrame) {
+ bool prevDis = _disableGoPlayUpdateStage;
+ _disableGoPlayUpdateStage = true;
+ _movie->processEvent(kEventEndSprite, i);
+ _disableGoPlayUpdateStage = prevDis;
+
channel->_scriptInstanceList.clear();
channel->_sprite->_behaviors.clear();
debugC(1, kDebugLingoExec, "Score::killScriptInstances(): Killed script instances for channel %d. frame %d [%d-%d]",
@@ -821,6 +832,11 @@ void Score::createScriptInstances(int frameNum) {
channel->_scriptInstanceList.push_back(inst);
}
+
+ bool prevDis = _disableGoPlayUpdateStage;
+ _disableGoPlayUpdateStage = true;
+ _movie->processEvent(kEventBeginSprite, i);
+ _disableGoPlayUpdateStage = prevDis;
}
}
Commit: 8c49944839dfe5958bf402a0436f62ee26dc4715
https://github.com/scummvm/scummvm/commit/8c49944839dfe5958bf402a0436f62ee26dc4715
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2025-09-26T01:28:04+02:00
Commit Message:
DIRECTOR: LINGO: Implemented prepareFrame event
Still seems to be not getting properly triggered
Changed paths:
engines/director/lingo/lingo-events.cpp
engines/director/movie.h
engines/director/score.cpp
diff --git a/engines/director/lingo/lingo-events.cpp b/engines/director/lingo/lingo-events.cpp
index 8b084342489..b361227230a 100644
--- a/engines/director/lingo/lingo-events.cpp
+++ b/engines/director/lingo/lingo-events.cpp
@@ -528,6 +528,7 @@ void Movie::queueEvent(Common::Queue<LingoEvent> &queue, LEvent event, int targe
case kEventEndSprite:
case kEventMouseEnter:
case kEventMouseLeave:
+ case kEventPrepareFrame: // D6+
if (_vm->getVersion() >= 600) {
if (pointedSpriteId != 0) {
Sprite *sprite = _score->getSpriteById(pointedSpriteId);
@@ -590,6 +591,18 @@ void Movie::processEvent(LEvent event, int targetId) {
_lingo->processEvents(queue, false);
}
+void Movie::broadcastEvent(LEvent event) {
+ Common::Queue<LingoEvent> queue;
+
+ for (int i = 1; i < _score->_channels.size(); i++) {
+ if (_score->_channels[i] && _score->_channels[i]->_sprite && _score->_channels[i]->_sprite->_behaviors.size()) {
+ queueEvent(queue, event, i);
+ }
+ }
+ _vm->setCurrentWindow(this->getWindow());
+ _lingo->processEvents(queue, false);
+}
+
void Lingo::processEvents(Common::Queue<LingoEvent> &queue, bool isInputEvent) {
if (isInputEvent && _currentInputEvent.type != VOIDSYM) {
// only one input event should be in flight at a time.
diff --git a/engines/director/movie.h b/engines/director/movie.h
index 9cf1ae144e1..c0ca1e98055 100644
--- a/engines/director/movie.h
+++ b/engines/director/movie.h
@@ -134,8 +134,9 @@ public:
ScriptContext *getScriptContext(ScriptType type, CastMemberID id);
Symbol getHandler(const Common::String &name, uint16 castLibHint = 0);
- // events.cpp
+ // lingo/lingo-events.cpp
bool processEvent(Common::Event &event);
+ void broadcastEvent(LEvent event);
// lingo/lingo-events.cpp
void setPrimaryEventHandler(LEvent event, const Common::String &code);
diff --git a/engines/director/score.cpp b/engines/director/score.cpp
index 2883dacd545..47e4509425e 100644
--- a/engines/director/score.cpp
+++ b/engines/director/score.cpp
@@ -696,10 +696,12 @@ void Score::update() {
}
if (_version >= kFileVer600) {
- // _movie->processEvent(kEventBeginSprite);
- // TODO: Director 6 step: send beginSprite event to any sprites whose span begin in the upcoming frame
- // _movie->processEvent(kEventPrepareFrame);
- // TODO: Director 6 step: send prepareFrame event to all sprites and the script channel in upcoming frame
+ bool prevDis = _disableGoPlayUpdateStage;
+ _disableGoPlayUpdateStage = true;
+
+ _movie->broadcastEvent(kEventPrepareFrame);
+
+ _disableGoPlayUpdateStage = prevDis;
}
// Window is drawn between the prepareFrame and enterFrame events (Lingo in a Nutshell, p.100)
More information about the Scummvm-git-logs
mailing list