[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