[Scummvm-git-logs] scummvm master -> bfd9e8bf29a8d47e835e84a05856398742c6ebad

sev- noreply at scummvm.org
Sat Aug 23 21:28:38 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:
6aca9d0ac9 DIRECTOR: Remove D3 32-bit image filesize bodge
fd92b5f1d8 DIRECTOR: Zero out channel timing fields when setting the cast member
89f9a11beb DIRECTOR: LINGO: Add TransitionCastMember support for b_puppetTransition
bfd9e8bf29 DIRECTOR: LINGO: Don't run actorList stepFrame hooks in transitions


Commit: 6aca9d0ac9e48996bd7677a596d1d0987c57d672
    https://github.com/scummvm/scummvm/commit/6aca9d0ac9e48996bd7677a596d1d0987c57d672
Author: Scott Percival (code at moral.net.au)
Date: 2025-08-23T23:28:34+02:00

Commit Message:
DIRECTOR: Remove D3 32-bit image filesize bodge

It is unclear if this was to work around an issue with a previous
version of the image decoder; the L-Zone examples cited appear
to be working fine.

Fixes rendering of 32-bit images in the cheese age of Mylk.

Changed paths:
    engines/director/images.cpp


diff --git a/engines/director/images.cpp b/engines/director/images.cpp
index 804d02ed2b2..beebc03bf97 100644
--- a/engines/director/images.cpp
+++ b/engines/director/images.cpp
@@ -193,11 +193,6 @@ bool BITDDecoder::loadStream(Common::SeekableReadStream &stream) {
 			skipCompression = stream.size() >= bytesNeed;
 		} else if (_version < kFileVer400) {
 			bytesNeed = _surface->w * _surface->h * _bitsPerPixel / 8;
-			// for D3, looks like it will round up the _surface->w to align 2
-			// not sure whether D2 will have the same logic.
-			// check lzone-mac data/r-c/tank.a-1 and lzone-mac data/r-a/station-b.01.
-			if (_surface->w & 1)
-				bytesNeed += _surface->h * _bitsPerPixel / 8;
 			skipCompression = stream.size() == bytesNeed;
 		}
 	}


Commit: fd92b5f1d80776afc3f26ff86f7a11188824c6c0
    https://github.com/scummvm/scummvm/commit/fd92b5f1d80776afc3f26ff86f7a11188824c6c0
Author: Scott Percival (code at moral.net.au)
Date: 2025-08-23T23:28:34+02:00

Commit Message:
DIRECTOR: Zero out channel timing fields when setting the cast member

Fixes video playback in Gothos.

Changed paths:
    engines/director/channel.cpp


diff --git a/engines/director/channel.cpp b/engines/director/channel.cpp
index 4c4f6f3fd0b..7dd15e0268e 100644
--- a/engines/director/channel.cpp
+++ b/engines/director/channel.cpp
@@ -391,6 +391,7 @@ void Channel::setCast(CastMemberID memberID) {
 	if (_sprite->_cast)
 		_sprite->_cast->releaseWidget();
 
+	bool hasChanged = _sprite->_castId != memberID;
 	// Replace the cast member in the sprite.
 	// Only change the dimensions if the "stretch" flag is set,
 	// indicating that the sprite has already been warped away from cast
@@ -398,6 +399,24 @@ void Channel::setCast(CastMemberID memberID) {
 	// dimensions of the sprite, -then- change the cast ID, and expect
 	// those custom dimensions to stick around.
 	_sprite->setCast(memberID, !_sprite->_stretch);
+
+	// Duplicate of the special cases in setClean.
+	// Maybe it makes sense to force setClean to use setCast instead?
+	if (hasChanged && _sprite->_cast) {
+		if (_sprite->_cast->_type == kCastDigitalVideo) {
+			DigitalVideoCastMember *dv = (DigitalVideoCastMember *)_sprite->_cast;
+			if (dv->loadVideoFromCast()) {
+				_movieTime = 0;
+				dv->setChannel(this);
+				dv->startVideo();
+			}
+		} else if (_sprite->_cast->_type == kCastFilmLoop ||
+					_sprite->_cast->_type == kCastMovie) {
+			// brand new film loop, reset the frame counter.
+			_filmLoopFrame = 1;
+		}
+	}
+
 	replaceWidget();
 
 	// Based on Director in a Nutshell, page 15


Commit: 89f9a11bebe1cd96c692b3cc2734f9f167e8df2d
    https://github.com/scummvm/scummvm/commit/89f9a11bebe1cd96c692b3cc2734f9f167e8df2d
Author: Scott Percival (code at moral.net.au)
Date: 2025-08-23T23:28:34+02:00

Commit Message:
DIRECTOR: LINGO: Add TransitionCastMember support for b_puppetTransition

Fixes most scene transitions in Gothos.

Changed paths:
    engines/director/castmember/transition.cpp
    engines/director/lingo/lingo-builtins.cpp


diff --git a/engines/director/castmember/transition.cpp b/engines/director/castmember/transition.cpp
index 63965eb01dc..38d18e92092 100644
--- a/engines/director/castmember/transition.cpp
+++ b/engines/director/castmember/transition.cpp
@@ -19,7 +19,6 @@
  *
  */
 
-#include "common/memstream.h"
 #include "director/director.h"
 #include "director/cast.h"
 #include "director/movie.h"
diff --git a/engines/director/lingo/lingo-builtins.cpp b/engines/director/lingo/lingo-builtins.cpp
index 959a1218b7b..125978144ba 100644
--- a/engines/director/lingo/lingo-builtins.cpp
+++ b/engines/director/lingo/lingo-builtins.cpp
@@ -43,6 +43,7 @@
 #include "director/castmember/bitmap.h"
 #include "director/castmember/palette.h"
 #include "director/castmember/text.h"
+#include "director/castmember/transition.h"
 #include "director/lingo/lingo-builtins.h"
 #include "director/lingo/lingo-code.h"
 #include "director/lingo/lingo-codegen.h"
@@ -2988,6 +2989,8 @@ void LB::b_puppetTransition(int nargs) {
 	Window *stage = g_director->getCurrentWindow();
 	uint16 duration = 250, area = 1, chunkSize = 1, type = 0;
 
+	TransitionCastMember *tcast = nullptr;
+
 	switch (nargs) {
 	case 4:
 		area = g_lingo->pop().asInt();
@@ -3000,7 +3003,21 @@ void LB::b_puppetTransition(int nargs) {
 		duration = g_lingo->pop().asInt() * 250;
 		// fall through
 	case 1:
-		type = ((TransitionType)(g_lingo->pop().asInt()));
+		{
+			Datum d = g_lingo->pop();
+			if (d.type == CASTREF) {
+				CastMemberID castId = d.asMemberID();
+				CastMember *cast = stage->getCurrentMovie()->getCastMember(castId);
+				if (cast->_type == kCastTransition) {
+					tcast = (TransitionCastMember *)cast;
+				} else {
+					warning("b_puppetTransition: expected transition cast member");
+					return;
+				}
+			} else {
+				type = ((TransitionType)(d.asInt()));
+			}
+		}
 		break;
 	default:
 		ARGNUMCHECK(1);
@@ -3010,11 +3027,17 @@ void LB::b_puppetTransition(int nargs) {
 
 	if (stage->_puppetTransition) {
 		warning("b_puppetTransition: Transition already queued");
-		return;
+		delete stage->_puppetTransition;
+		stage->_puppetTransition = nullptr;
+	}
+	if (tcast) {
+		stage->_puppetTransition = new TransParams(tcast->_durationMillis, tcast->_area, tcast->_chunkSize, tcast->_transType);
+	} else {
+		stage->_puppetTransition = new TransParams(duration, area, chunkSize, ((TransitionType)type));
 	}
-	debugC(3, kDebugImages, "b_puppetTransition(): type: %d, duration: %d, chunkSize: %d, area: %d", type, duration, chunkSize, area);
+	debugC(3, kDebugImages, "b_puppetTransition(): type: %d, duration: %d, chunkSize: %d, area: %d",
+			stage->_puppetTransition->type, stage->_puppetTransition->duration, stage->_puppetTransition->chunkSize, stage->_puppetTransition->area);
 
-	stage->_puppetTransition = new TransParams(duration, area, chunkSize, ((TransitionType)type));
 }
 
 void LB::b_ramNeeded(int nargs) {


Commit: bfd9e8bf29a8d47e835e84a05856398742c6ebad
    https://github.com/scummvm/scummvm/commit/bfd9e8bf29a8d47e835e84a05856398742c6ebad
Author: Scott Percival (code at moral.net.au)
Date: 2025-08-23T23:28:34+02:00

Commit Message:
DIRECTOR: LINGO: Don't run actorList stepFrame hooks in transitions

Fixes flying intro sequence in Gothos.

Changed paths:
    engines/director/lingo/lingo.cpp
    engines/director/lingo/lingo.h
    engines/director/transitions.cpp


diff --git a/engines/director/lingo/lingo.cpp b/engines/director/lingo/lingo.cpp
index 292080dd1f0..a6984f7b2a7 100644
--- a/engines/director/lingo/lingo.cpp
+++ b/engines/director/lingo/lingo.cpp
@@ -1593,7 +1593,7 @@ void Lingo::executeImmediateScripts(Frame *frame) {
 	}
 }
 
-void Lingo::executePerFrameHook(int frame, int subframe) {
+void Lingo::executePerFrameHook(int frame, int subframe, bool stepFrame) {
 	// Execute perFrameHook and actorList stepFrame, if any is available
 	// Starting D4, stepFrame of each objects in actorList is executed
 	// however the support for legacy mAtFrame is still there. (in future versions)
@@ -1609,18 +1609,16 @@ void Lingo::executePerFrameHook(int frame, int subframe) {
 		}
 	}
 
-	if (_vm->getVersion() >= 400) {
-		if (_actorList.u.farr->arr.size() > 0 && _vm->getVersion() >= 400) {
-			for (uint i = 0; i < _actorList.u.farr->arr.size(); i++) {
-				Datum actor = _actorList.u.farr->arr[i];
-				Symbol method = actor.u.obj->getMethod("stepFrame");
-				if (method.type != VOIDSYM) {
-					debugC(1, kDebugLingoExec, "Executing perFrameHook : <%s>, frame %d, subframe %d", actor.asString(true).c_str(), frame, subframe);
-					if (method.nargs == 1)
-						push(actor);
-					LC::call(method, method.nargs, false);
-					execute();
-				}
+	if (stepFrame && _actorList.u.farr->arr.size() > 0 && _vm->getVersion() >= 400) {
+		for (uint i = 0; i < _actorList.u.farr->arr.size(); i++) {
+			Datum actor = _actorList.u.farr->arr[i];
+			Symbol method = actor.u.obj->getMethod("stepFrame");
+			if (method.type != VOIDSYM) {
+				debugC(1, kDebugLingoExec, "Executing perFrameHook : <%s>, frame %d, subframe %d", actor.asString(true).c_str(), frame, subframe);
+				if (method.nargs == 1)
+					push(actor);
+				LC::call(method, method.nargs, false);
+				execute();
 			}
 		}
 	}
diff --git a/engines/director/lingo/lingo.h b/engines/director/lingo/lingo.h
index e8126861000..387f6bb4308 100644
--- a/engines/director/lingo/lingo.h
+++ b/engines/director/lingo/lingo.h
@@ -573,7 +573,7 @@ public:
 
 public:
 	void executeImmediateScripts(Frame *frame);
-	void executePerFrameHook(int frame, int subframe);
+	void executePerFrameHook(int frame, int subframe, bool stepFrame = true);
 
 	// lingo-utils.cpp
 private:
diff --git a/engines/director/transitions.cpp b/engines/director/transitions.cpp
index db3948fbe49..7fac342853c 100644
--- a/engines/director/transitions.cpp
+++ b/engines/director/transitions.cpp
@@ -587,7 +587,7 @@ void Window::playTransition(uint frame, RenderMode mode, uint16 transDuration, u
 		debugC(6, kDebugImages, "Window::playTransition(): delaying for %d", diff);
 		g_director->delayMillis(diff);
 
-		g_lingo->executePerFrameHook(t.frame, i);
+		g_lingo->executePerFrameHook(t.frame, i, false);
 	}
 
 	debugC(2, kDebugImages, "Window::playTransition(): Transition %d finished in %d ms", t.type, g_system->getMillis() - transStartTime);
@@ -781,7 +781,7 @@ void Window::dissolveTrans(TransParams &t, Common::Rect &clipRect, Graphics::Man
 		}
 		stepTransition(t, i);
 
-		g_lingo->executePerFrameHook(t.frame, i + 1);
+		g_lingo->executePerFrameHook(t.frame, i + 1, false);
 
 		if (_vm->processEvents(true)) {
 			exitTransition(t, nextFrame, clipRect);
@@ -906,7 +906,7 @@ void Window::dissolvePatternsTrans(TransParams &t, Common::Rect &clipRect, Graph
 
 		stepTransition(t, i);
 
-		g_lingo->executePerFrameHook(t.frame, i + 1);
+		g_lingo->executePerFrameHook(t.frame, i + 1, false);
 
 		if (_vm->processEvents(true)) {
 			exitTransition(t, nextFrame, clipRect);
@@ -1085,7 +1085,7 @@ void Window::transMultiPass(TransParams &t, Common::Rect &clipRect, Graphics::Ma
 		stepTransition(t, i);
 		rects.clear();
 
-		g_lingo->executePerFrameHook(t.frame, i);
+		g_lingo->executePerFrameHook(t.frame, i, false);
 
 		uint32 endTime = g_system->getMillis();
 		int diff = MAX(0, (int)t.stepDuration - (int)(endTime - startTime));
@@ -1157,7 +1157,7 @@ void Window::transZoom(TransParams &t, Common::Rect &clipRect, Graphics::Managed
 		debugC(6, kDebugImages, "Window::transZoom(): delaying for %d", diff);
 		g_director->delayMillis(diff);
 
-		g_lingo->executePerFrameHook(t.frame, i);
+		g_lingo->executePerFrameHook(t.frame, i, false);
 	}
 
 	render(true, _composeSurface);




More information about the Scummvm-git-logs mailing list