[Scummvm-git-logs] scummvm master -> 16208dc58952e985d36b80561ea7908aeb3d76b4

moralrecordings noreply at scummvm.org
Sat Jun 22 07:10:30 UTC 2024


This automated email contains information about 8 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
adc423c9b3 DIRECTOR: Update Mac entry for fishwish
8c20d10e0b DIRECTOR: Fix check for factory methods when calling
63b885e915 DIRECTOR: LINGO: Fix string conversion of floats
576cdfc180 DIRECTOR: Fix double-use-after-free in b_move
554b9a9987 DIRECTOR: Validate all palette cast member IDs before use
413c0aed2a COMMON: Add QuickTime IMA ADPCM decoder for AIFF
3853c3c6f9 DIRECTOR: Add timing debug messages to transition code
16208dc589 DIRECTOR: LINGO: Fix b_puppetTransition


Commit: adc423c9b36e51ac6dfe1e971ed91a33c1b9b311
    https://github.com/scummvm/scummvm/commit/adc423c9b36e51ac6dfe1e971ed91a33c1b9b311
Author: Scott Percival (code at moral.net.au)
Date: 2024-06-22T15:03:36+08:00

Commit Message:
DIRECTOR: Update Mac entry for fishwish

Changed paths:
    engines/director/detection_tables.h


diff --git a/engines/director/detection_tables.h b/engines/director/detection_tables.h
index fe02b421df5..7b99da15f8d 100644
--- a/engines/director/detection_tables.h
+++ b/engines/director/detection_tables.h
@@ -4065,7 +4065,8 @@ static const DirectorGameDescription gameDescriptions[] = {
 	// Tivola edition is dual language De/En
 	// De vis die kon wensen localized by Bombilla, Amsterdam
 	// Published in English by Oxford University Press (1995)
-	MACGAME1_l("fishwish", "", "Willy, der Zauberfisch", "ab2bda961c62f9deb2c1ba297d0a1ea9", 501559, Common::DE_DEU, 404),
+	MACGAME2_l("fishwish", "", "Willy, der Zauberfisch", "tr:9468b9c1e345d60113e6446bbdcf1bfc", 501559,
+								"eData/BUMPER.Dir", "t:8576a2bab07feb9f7055bfd5ceb3b2c4", 307048, Common::DE_DEU, 404),
 	WINGAME2_l("fishwish", "",	 "WILLY.EXE",	 	 "t:8b96b5ebd1e11d431e08971a2e3b6053", 2503499,
 								 "EDATA/BUMPER.DIR", "t:8576a2bab07feb9f7055bfd5ceb3b2c4", 307048, Common::DE_DEU, 404),
 	WINGAME1_l("fishwish", "",	 "WENSVIS.EXE",	 "t:00f0a44e802160a22a28ef855942b91c", 696993, Common::NL_NLD, 404),


Commit: 8c20d10e0b7670808c7591c69aaf473136f7a376
    https://github.com/scummvm/scummvm/commit/8c20d10e0b7670808c7591c69aaf473136f7a376
Author: Scott Percival (code at moral.net.au)
Date: 2024-06-22T15:03:36+08:00

Commit Message:
DIRECTOR: Fix check for factory methods when calling

Fixes the horse screen in The Fish Who Could Wish.

Changed paths:
    engines/director/lingo/lingo-code.cpp


diff --git a/engines/director/lingo/lingo-code.cpp b/engines/director/lingo/lingo-code.cpp
index a63ab5d7546..470f4789c7f 100644
--- a/engines/director/lingo/lingo-code.cpp
+++ b/engines/director/lingo/lingo-code.cpp
@@ -1586,7 +1586,7 @@ void LC::call(const Common::String &name, int nargs, bool allowRetVal) {
 	if (g_lingo->_state->me.type == OBJECT) {
 		AbstractObject *target = g_lingo->_state->me.u.obj;
 		funcSym = target->getMethod(name);
-		if (name.hasPrefixIgnoreCase("m") && funcSym.type != VOIDSYM) {
+		if (funcSym.type != VOIDSYM) {
 			if (nargs == 0) {
 				debugC(3, kDebugLingoExec, "Factory method call detected with missing first arg");
 				g_lingo->_stack.push_back(Datum());


Commit: 63b885e9153a500a27c666cebe967ffe340ed866
    https://github.com/scummvm/scummvm/commit/63b885e9153a500a27c666cebe967ffe340ed866
Author: Scott Percival (code at moral.net.au)
Date: 2024-06-22T15:03:36+08:00

Commit Message:
DIRECTOR: LINGO: Fix string conversion of floats

Fixes save games in AMBER: Journeys Beyond.

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


diff --git a/engines/director/lingo/lingo.cpp b/engines/director/lingo/lingo.cpp
index dbbf69d24fd..77be64bd11d 100644
--- a/engines/director/lingo/lingo.cpp
+++ b/engines/director/lingo/lingo.cpp
@@ -1120,8 +1120,6 @@ Common::String Datum::asString(bool printonly) const {
 		break;
 	case FLOAT:
 		s = Common::String::format(g_lingo->_floatPrecisionFormat.c_str(), u.f);
-		if (printonly)
-			s += "f";		// 0.0f
 		break;
 	case STRING:
 		if (!printonly) {


Commit: 576cdfc1809c640f89c4b301eaf307a6f2d4e33d
    https://github.com/scummvm/scummvm/commit/576cdfc1809c640f89c4b301eaf307a6f2d4e33d
Author: Scott Percival (code at moral.net.au)
Date: 2024-06-22T15:03:36+08:00

Commit Message:
DIRECTOR: Fix double-use-after-free in b_move

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


diff --git a/engines/director/lingo/lingo-builtins.cpp b/engines/director/lingo/lingo-builtins.cpp
index 5b9c62a9ad0..2dc331e2467 100644
--- a/engines/director/lingo/lingo-builtins.cpp
+++ b/engines/director/lingo/lingo-builtins.cpp
@@ -2508,10 +2508,9 @@ void LB::b_move(int nargs) {
 	score->renderFrame(frame, kRenderForceUpdate);
 
 	movie->eraseCastMember(dest.asMemberID());
-
 	CastMember *toReplace = new CastMember(toMove->getCast(), src.asMemberID().member);
-	movie->createOrReplaceCastMember(dest.asMemberID(), toMove);
-	movie->createOrReplaceCastMember(src.asMemberID(), toReplace);
+	movie->createOrReplaceCastMember(dest.asMemberID(), toReplace);
+	movie->eraseCastMember(src.asMemberID());
 
 	score->refreshPointersForCastMemberID(dest.asMemberID());
 


Commit: 554b9a9987ed394b600d641841835fa23953de24
    https://github.com/scummvm/scummvm/commit/554b9a9987ed394b600d641841835fa23953de24
Author: Scott Percival (code at moral.net.au)
Date: 2024-06-22T15:07:37+08:00

Commit Message:
DIRECTOR: Validate all palette cast member IDs before use

Fixes the avalanche of error messages when entering the mirror
in AMBER: Journeys Beyond.

Changed paths:
    engines/director/castmember/bitmap.cpp
    engines/director/debugger.cpp
    engines/director/debugger/dt-score.cpp
    engines/director/graphics.cpp
    engines/director/movie.cpp
    engines/director/movie.h
    engines/director/score.cpp


diff --git a/engines/director/castmember/bitmap.cpp b/engines/director/castmember/bitmap.cpp
index 5045ac5bc8c..47b418c4fa2 100644
--- a/engines/director/castmember/bitmap.cpp
+++ b/engines/director/castmember/bitmap.cpp
@@ -313,14 +313,13 @@ Graphics::Surface *BitmapCastMember::getDitherImg() {
 
 	// Convert indexed image to indexed palette
 	Movie *movie = g_director->getCurrentMovie();
-	Cast *cast = movie->getCast();
 	Score *score = movie->getScore();
 	int targetBpp = g_director->_wm->_pixelformat.bytesPerPixel;
 
 	// Get the current score palette. Note that this is the ID of the palette in the list, not the cast member!
 	CastMemberID currentPaletteId = score->getCurrentPalette();
 	if (currentPaletteId.isNull())
-		currentPaletteId = cast->_defaultPalette;
+		currentPaletteId = movie->_defaultPalette;
 	PaletteV4 *currentPalette = g_director->getPalette(currentPaletteId);
 	if (!currentPalette) {
 		currentPaletteId = CastMemberID(kClutSystemMac, -1);
@@ -423,11 +422,10 @@ bool BitmapCastMember::isModified() {
 	// to be recreated.
 	if (!_clut.isNull()) {
 		Movie *movie = g_director->getCurrentMovie();
-		Cast *cast = movie->getCast();
 		Score *score = movie->getScore();
 		CastMemberID currentPaletteId = score->getCurrentPalette();
 		if (currentPaletteId.isNull())
-			currentPaletteId = cast->_defaultPalette;
+			currentPaletteId = movie->_defaultPalette;
 		PaletteV4 *currentPalette = g_director->getPalette(currentPaletteId);
 		if (!currentPalette) {
 			currentPaletteId = CastMemberID(kClutSystemMac, -1);
@@ -435,7 +433,7 @@ bool BitmapCastMember::isModified() {
 		}
 		CastMemberID castPaletteId = _clut;
 		if (castPaletteId.isNull())
-			castPaletteId = cast->_defaultPalette;
+			castPaletteId = movie->_defaultPalette;
 
 		return !_ditheredTargetClut.isNull() && _ditheredTargetClut != currentPaletteId;
 	}
diff --git a/engines/director/debugger.cpp b/engines/director/debugger.cpp
index 35e85c4984a..26da79edc1a 100644
--- a/engines/director/debugger.cpp
+++ b/engines/director/debugger.cpp
@@ -274,7 +274,7 @@ bool Debugger::cmdInfo(int argc, const char **argv) {
 	debugPrintf("Modified by: %s\n", movie->_changedBy.c_str());
 	debugPrintf("Original directory: %s\n", movie->_origDirectory.c_str());
 	debugPrintf("Stage size: %dx%d\n", movie->_movieRect.width(), movie->_movieRect.height());
-	debugPrintf("Default palette ID: %s\n", cast->_defaultPalette.asString().c_str());
+	debugPrintf("Default palette ID: %s\n", movie->_defaultPalette.asString().c_str());
 	debugPrintf("Default stage color: %d\n", cast->_stageColor);
 	debugPrintf("Copy protected: %d\n", cast->_isProtected);
 	debugPrintf("Remap palettes when needed flag: %d\n", movie->_remapPalettesWhenNeeded);
diff --git a/engines/director/debugger/dt-score.cpp b/engines/director/debugger/dt-score.cpp
index 255136c05bf..1d3701d6478 100644
--- a/engines/director/debugger/dt-score.cpp
+++ b/engines/director/debugger/dt-score.cpp
@@ -526,7 +526,7 @@ void showChannels() {
 		Score *score = g_director->getCurrentMovie()->getScore();
 		Frame &frame = *score->_currentFrame;
 
-		CastMemberID defaultPalette = g_director->getCurrentMovie()->getCast()->_defaultPalette;
+		CastMemberID defaultPalette = g_director->getCurrentMovie()->_defaultPalette;
 		ImGui::Text("TMPO:   tempo: %d, skipFrameFlag: %d, blend: %d, currentFPS: %d",
 			frame._mainChannels.tempo, frame._mainChannels.skipFrameFlag, frame._mainChannels.blend, score->_currentFrameRate);
 		if (!frame._mainChannels.palette.paletteId.isNull()) {
diff --git a/engines/director/graphics.cpp b/engines/director/graphics.cpp
index 6393661cf42..420833c548f 100644
--- a/engines/director/graphics.cpp
+++ b/engines/director/graphics.cpp
@@ -133,6 +133,9 @@ void DirectorEngine::loadDefaultPalettes() {
 }
 
 PaletteV4 *DirectorEngine::getPalette(const CastMemberID &id) {
+	if (id.isNull())
+		return nullptr;
+
 	if (!_loadedPalettes.contains(id)) {
 		warning("DirectorEngine::getPalette(): Palette %s not found, hash %x", id.asString().c_str(), id.hash());
 		return nullptr;
diff --git a/engines/director/movie.cpp b/engines/director/movie.cpp
index 7d16b72f052..58995fc429d 100644
--- a/engines/director/movie.cpp
+++ b/engines/director/movie.cpp
@@ -131,7 +131,6 @@ void Movie::setArchive(Archive *archive) {
 		// D4 or lower, only 1 cast
 		_cast->setArchive(archive);
 	}
-
 	// Frame Labels
 	if ((r = archive->getMovieResourceIfPresent(MKTAG('V', 'W', 'L', 'B')))) {
 		_score->loadLabels(*r);
@@ -216,6 +215,13 @@ bool Movie::loadArchive() {
 		it._value->loadCast();
 	}
 	_stageColor = _vm->transformColor(_cast->_stageColor);
+	// Need to check if the default palette is valid; if not, assume it's the Mac one.
+	if (isValidCastMember(_cast->_defaultPalette, kCastPalette)) {
+		_defaultPalette = _cast->_defaultPalette;
+	} else {
+		_defaultPalette = CastMemberID(kClutSystemMac, -1);
+	}
+	g_director->_lastPalette = CastMemberID();
 
 	bool recenter = false;
 	// If the stage dimensions are different, delete it and start again.
@@ -571,6 +577,11 @@ CastMemberInfo *Movie::getCastMemberInfo(CastMemberID memberID) {
 	return result;
 }
 
+bool Movie::isValidCastMember(CastMemberID memberID, CastType type) {
+	CastMember *test = getCastMember(memberID);
+	return test && ((test->_type == type) || (type == kCastTypeAny));
+}
+
 const Stxt *Movie::getStxt(CastMemberID memberID) {
 	const Stxt *result = nullptr;
 	if (_casts.contains(memberID.castLib)) {
diff --git a/engines/director/movie.h b/engines/director/movie.h
index 9067d92fb8b..9de05a99af7 100644
--- a/engines/director/movie.h
+++ b/engines/director/movie.h
@@ -118,6 +118,7 @@ public:
 	CastMemberID getCastMemberIDByName(const Common::String &name);
 	CastMemberID getCastMemberIDByNameAndType(const Common::String &name, int castLib, CastType type);
 	CastMemberInfo *getCastMemberInfo(CastMemberID memberID);
+	bool isValidCastMember(CastMemberID memberID, CastType type);
 	const Stxt *getStxt(CastMemberID memberID);
 
 	LingoArchive *getMainLingoArch();
@@ -163,6 +164,7 @@ public:
 	Common::String _createdBy;
 	Common::String _changedBy;
 	Common::String _origDirectory;
+	CastMemberID _defaultPalette;
 
 	bool _videoPlayback;
 
diff --git a/engines/director/score.cpp b/engines/director/score.cpp
index 50712f51ab1..fd0f343ed23 100644
--- a/engines/director/score.cpp
+++ b/engines/director/score.cpp
@@ -949,15 +949,22 @@ void Score::setLastPalette() {
 
 	bool isCachedPalette = false;
 	CastMemberID currentPalette = _currentFrame->_mainChannels.palette.paletteId;
+	// Director allows you to use palette IDs for cast members
+	// that have long since been erased. Check all of them.
+	if (!_movie->isValidCastMember(currentPalette, kCastPalette))
+		currentPalette = CastMemberID();
 	// Palette not specified in the frame
 	if (currentPalette.isNull()) {
 		// Use the score cached palette ID
 		isCachedPalette = true;
 		currentPalette = _currentFrame->_mainChannels.scoreCachedPaletteId;
+		if (!_movie->isValidCastMember(currentPalette, kCastPalette))
+			currentPalette = CastMemberID();
 		// The cached ID is created before the cast gets loaded; if it's zero,
 		// this corresponds to the movie default palette.
-		if (currentPalette.isNull())
-			currentPalette = g_director->getCurrentMovie()->getCast()->_defaultPalette;
+		if (currentPalette.isNull()) {
+			currentPalette = g_director->getCurrentMovie()->_defaultPalette;
+		}
 		// If for whatever reason this doesn't resolve, abort.
 		if (currentPalette.isNull())
 			return;
@@ -1883,7 +1890,7 @@ void Score::loadActions(Common::SeekableReadStreamEndian &stream) {
 Common::String Score::formatChannelInfo() {
 	Frame &frame = *_currentFrame;
 	Common::String result;
-	CastMemberID defaultPalette = g_director->getCurrentMovie()->getCast()->_defaultPalette;
+	CastMemberID defaultPalette = g_director->getCurrentMovie()->_defaultPalette;
 	result += Common::String::format("TMPO:   tempo: %d, skipFrameFlag: %d, blend: %d, currentFPS: %d\n",
 		frame._mainChannels.tempo, frame._mainChannels.skipFrameFlag, frame._mainChannels.blend, _currentFrameRate);
 	if (!frame._mainChannels.palette.paletteId.isNull()) {


Commit: 413c0aed2afbf18a36d6b35a183ab18733626243
    https://github.com/scummvm/scummvm/commit/413c0aed2afbf18a36d6b35a183ab18733626243
Author: Scott Percival (code at moral.net.au)
Date: 2024-06-22T15:07:41+08:00

Commit Message:
COMMON: Add QuickTime IMA ADPCM decoder for AIFF

Fixes numerous sound files in AMBER: Journeys Beyond.

Changed paths:
    audio/decoders/aiff.cpp


diff --git a/audio/decoders/aiff.cpp b/audio/decoders/aiff.cpp
index fe92d6acf99..821e9d0ccc3 100644
--- a/audio/decoders/aiff.cpp
+++ b/audio/decoders/aiff.cpp
@@ -34,6 +34,7 @@
 
 #include "audio/audiostream.h"
 #include "audio/decoders/aiff.h"
+#include "audio/decoders/adpcm.h"
 #include "audio/decoders/raw.h"
 #include "audio/decoders/3do.h"
 
@@ -214,9 +215,8 @@ RewindableAudioStream *AIFFHeader::makeAIFFStream(Common::SeekableReadStream *st
 		return makeRawStream(_dataStream, _rate, rawFlags, disposeAfterUse);
 	}
 	case MKTAG('i', 'm', 'a', '4'):
-		// TODO: Use QT IMA ADPCM
-		warning("Unhandled AIFF-C QT IMA ADPCM compression");
-		break;
+		// Apple QuickTime IMA ADPCM
+		return makeADPCMStream(_dataStream, disposeAfterUse, 0, kADPCMApple, _rate, _channels, 34);
 	case MKTAG('Q', 'D', 'M', '2'):
 		// TODO: Need to figure out how to integrate this
 		// (But hopefully never needed)


Commit: 3853c3c6f9476ba99c63a60ef9d94f7c127421aa
    https://github.com/scummvm/scummvm/commit/3853c3c6f9476ba99c63a60ef9d94f7c127421aa
Author: Scott Percival (code at moral.net.au)
Date: 2024-06-22T15:07:41+08:00

Commit Message:
DIRECTOR: Add timing debug messages to transition code

Changed paths:
    engines/director/transitions.cpp


diff --git a/engines/director/transitions.cpp b/engines/director/transitions.cpp
index 230cb049345..b866e1b8a64 100644
--- a/engines/director/transitions.cpp
+++ b/engines/director/transitions.cpp
@@ -167,6 +167,8 @@ void Window::playTransition(uint frame, RenderMode mode, uint16 transDuration, u
 	t.chunkSize = MAX<uint>(1, transChunkSize);
 	t.area = MAX<uint>(0, transArea);
 
+	debugC(2, kDebugImages, "Window::playTransition(): Playing transition %d", t.type);
+
 	// If we requested fast transitions, speed everything up
 	if (debugChannelSet(-1, kDebugFast))
 		t.duration = 250;
@@ -231,14 +233,13 @@ void Window::playTransition(uint frame, RenderMode mode, uint16 transDuration, u
 
 	Common::Rect rfrom, rto;
 
-	uint32 transStartTime = g_system->getMillis();
-	debugC(2, kDebugImages, "Window::playTransition(): Playing transition %d", t.type);
-
 	initTransParams(t, clipRect);
 
 	Graphics::ManagedSurface *blitFrom;
 	bool fullredraw = false;
 
+	uint32 transStartTime = g_system->getMillis();
+
 	debugC(2, kDebugImages, "Window::playTransition(): type: %d, duration: %d, area: %d, chunkSize: %d, steps: %d, stepDuration: %d, xpos: %d, ypos: %d, xStepSize: %d, yStepSize: %d, stripSize: %d, clipRect: %d %d %d %d", t.type, t.duration, t.area, t.chunkSize, t.steps, t.stepDuration, t.xpos, t.ypos, t.xStepSize, t.yStepSize, t.stripSize, clipRect.left, clipRect.top, clipRect.right, clipRect.bottom);
 
 	switch (transProps[t.type].algo) {
@@ -574,8 +575,9 @@ void Window::playTransition(uint frame, RenderMode mode, uint16 transDuration, u
 		}
 
 		uint32 endTime = g_system->getMillis();
-		int diff = (int)t.stepDuration - (int)(endTime - startTime);
-		g_director->delayMillis(MAX(0, diff));
+		int diff = MAX(0, (int)t.stepDuration - (int)(endTime - startTime));
+		debugC(6, kDebugImages, "Window::playTransition(): delaying for %d", diff);
+		g_director->delayMillis(diff);
 
 		g_lingo->executePerFrameHook(t.frame, i);
 	}
@@ -778,8 +780,9 @@ void Window::dissolveTrans(TransParams &t, Common::Rect &clipRect, Graphics::Man
 		}
 
 		uint32 endTime = g_system->getMillis();
-		int diff = (int)t.stepDuration - (int)(endTime - startTime);
-		g_director->delayMillis(MAX(0, diff));
+		int diff = MAX(0, (int)t.stepDuration - (int)(endTime - startTime));
+		debugC(6, kDebugImages, "Window::dissolveTrans(): delaying for %d", diff);
+		g_director->delayMillis(diff);
 	}
 }
 
@@ -902,8 +905,9 @@ void Window::dissolvePatternsTrans(TransParams &t, Common::Rect &clipRect, Graph
 		}
 
 		uint32 endTime = g_system->getMillis();
-		int diff = (int)t.stepDuration - (int)(endTime - startTime);
-		g_director->delayMillis(MAX(0, diff));
+		int diff = MAX(0, (int)t.stepDuration - (int)(endTime - startTime));
+		debugC(6, kDebugImages, "Window::dissolvePatternsTrans(): delaying for %d", diff);
+		g_director->delayMillis(diff);
 	}
 }
 
@@ -1075,8 +1079,9 @@ void Window::transMultiPass(TransParams &t, Common::Rect &clipRect, Graphics::Ma
 		g_lingo->executePerFrameHook(t.frame, i);
 
 		uint32 endTime = g_system->getMillis();
-		int diff = (int)t.stepDuration - (int)(endTime - startTime);
-		g_director->delayMillis(MAX(0, diff));
+		int diff = MAX(0, (int)t.stepDuration - (int)(endTime - startTime));
+		debugC(6, kDebugImages, "Window::transMultiPass(): delaying for %d", diff);
+		g_director->delayMillis(diff);
 
 		if (_vm->processEvents(true)) {
 			exitTransition(t, nextFrame, clipRect);
@@ -1137,8 +1142,9 @@ void Window::transZoom(TransParams &t, Common::Rect &clipRect, Graphics::Managed
 		stepTransition(t, i);
 
 		uint32 endTime = g_system->getMillis();
-		int diff = (int)t.stepDuration - (int)(endTime - startTime);
-		g_director->delayMillis(MAX(0, diff));
+		int diff = MAX(0, (int)t.stepDuration - (int)(endTime - startTime));
+		debugC(6, kDebugImages, "Window::transZoom(): delaying for %d", diff);
+		g_director->delayMillis(diff);
 
 		g_lingo->executePerFrameHook(t.frame, i);
 	}


Commit: 16208dc58952e985d36b80561ea7908aeb3d76b4
    https://github.com/scummvm/scummvm/commit/16208dc58952e985d36b80561ea7908aeb3d76b4
Author: Scott Percival (code at moral.net.au)
Date: 2024-06-22T15:07:41+08:00

Commit Message:
DIRECTOR: LINGO: Fix b_puppetTransition

Transitions should be played when updateStage is called for whatever
sprite changes have been made by the code.

Fixes the movement transitions in AMBER: Journeys Beyond.

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


diff --git a/engines/director/lingo/lingo-builtins.cpp b/engines/director/lingo/lingo-builtins.cpp
index 2dc331e2467..ce25efed225 100644
--- a/engines/director/lingo/lingo-builtins.cpp
+++ b/engines/director/lingo/lingo-builtins.cpp
@@ -2781,7 +2781,8 @@ void LB::b_puppetTransition(int nargs) {
 		chunkSize = g_lingo->pop().asInt();
 		// fall through
 	case 2:
-		duration = g_lingo->pop().asInt();
+		// units are quarter-seconds
+		duration = g_lingo->pop().asInt() * 250;
 		// fall through
 	case 1:
 		type = ((TransitionType)(g_lingo->pop().asInt()));
@@ -2796,6 +2797,7 @@ void LB::b_puppetTransition(int nargs) {
 		warning("b_puppetTransition: Transition already queued");
 		return;
 	}
+	debugC(3, kDebugImages, "b_puppetTransition(): type: %d, duration: %d, chunkSize: %d, area: %d", type, duration, chunkSize, area);
 
 	stage->_puppetTransition = new TransParams(duration, area, chunkSize, ((TransitionType)type));
 }
@@ -2960,9 +2962,16 @@ void LB::b_updateStage(int nargs) {
 	}
 
 	Score *score = movie->getScore();
+	Window *window = movie->getWindow();
 
 	score->updateWidgets(movie->_videoPlayback);
-	movie->getWindow()->render();
+	if (window->_puppetTransition) {
+		window->playTransition(score->getCurrentFrameNum(), kRenderModeNormal, window->_puppetTransition->duration, window->_puppetTransition->area, window->_puppetTransition->chunkSize, window->_puppetTransition->type, score->_currentFrame->_mainChannels.scoreCachedPaletteId);
+		delete window->_puppetTransition;
+		window->_puppetTransition = nullptr;
+	} else {
+		movie->getWindow()->render();
+	}
 
 	// play any puppet sounds that have been queued
 	score->playSoundChannel(true);




More information about the Scummvm-git-logs mailing list