[Scummvm-git-logs] scummvm master -> 2235c02d323423f542dc56782621d34572c4753b

sev- noreply at scummvm.org
Thu Sep 18 20:50:10 UTC 2025


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

Summary:
84b723ad1d DIRECTOR: Update detection entry for mckenzie
eccd5974a4 DIRECTOR: Exclude Windows 16-color palette slots from video palette
d15f6f4904 DIRECTOR: Don't process frozen scripts if movie is switching
31755aedff DIRECTOR: Fix setting the fileName on BitmapCastMember
c1ddd7b34a DIRECTOR: Cache video palettes in 32-bit graphics mode
b1b19f0c21 DIRECTOR: Fix dithering for 8-bit BitmapCastMembers in 32-bit mode
2235c02d32 DIRECTOR: Use background colour for buttons


Commit: 84b723ad1d8e944c00095cc8d7755b94623f09f3
    https://github.com/scummvm/scummvm/commit/84b723ad1d8e944c00095cc8d7755b94623f09f3
Author: Scott Percival (code at moral.net.au)
Date: 2025-09-18T22:50:04+02:00

Commit Message:
DIRECTOR: Update detection entry for mckenzie

Changed paths:
    engines/director/detection_tables.h


diff --git a/engines/director/detection_tables.h b/engines/director/detection_tables.h
index e175fd5b158..9260b8b1d1c 100644
--- a/engines/director/detection_tables.h
+++ b/engines/director/detection_tables.h
@@ -5146,7 +5146,7 @@ static const DirectorGameDescription gameDescriptions[] = {
 	WINGAME2("maxissampler", "", "SAMPLER.EXE", "t:5d0ee796571b99d402a06438ae2f3d56", 696815,
 								 "HOMECRE.DIR", "t:c01c5736dd1a49f52169c01e8d39a998", 1313276, 404),
 
-	WINGAME1("mckenzie", "", "MCKFRAME.EXE", "581608fa7224b0b62e11e397d2aa76c1", 3217950, 404),
+	WINGAME1f("mckenzie", "", "INTRO/MCKFRAME.EXE", "t:b249056048f105f5e33e541914958eb8", 3217950, 404, GF_32BPP),
 	WINDEMO1("mckenzie", "November 16 Demo", "MCKDEMO.EXE", "f2bc8c75f8df853780619583ba216beb", 8634631, 404),
 	WINDEMO1t("mckenzie", "30 Megs Demo", "MCKDEMO.EXE", "7f524fed018d3455c0a9358b34543123", 7212177, 404),
 


Commit: eccd5974a4d8f8c9fc4c187d9d8871d4740a250a
    https://github.com/scummvm/scummvm/commit/eccd5974a4d8f8c9fc4c187d9d8871d4740a250a
Author: Scott Percival (code at moral.net.au)
Date: 2025-09-18T22:50:04+02:00

Commit Message:
DIRECTOR: Exclude Windows 16-color palette slots from video palette

Fixes greyscale video output in McKenzie and Co with 8-bit video
switched on.

Changed paths:
    engines/director/castmember/digitalvideo.cpp
    engines/director/castmember/digitalvideo.h


diff --git a/engines/director/castmember/digitalvideo.cpp b/engines/director/castmember/digitalvideo.cpp
index 2a5605edbac..c3f178c3687 100644
--- a/engines/director/castmember/digitalvideo.cpp
+++ b/engines/director/castmember/digitalvideo.cpp
@@ -20,6 +20,7 @@
  */
 
 #include "audio/decoders/aiff.h"
+#include "common/platform.h"
 #include "common/stream.h"
 #include "common/macresman.h"
 
@@ -115,6 +116,8 @@ DigitalVideoCastMember::DigitalVideoCastMember(Cast *cast, uint16 castId, Common
 	_dirty = false;
 	_emptyFile = false;
 
+	memset(_ditheringPalette, 0, 256*3);
+
 	if (debugChannelSet(2, kDebugLoading))
 		_initialRect.debugPrint(2, "DigitalVideoCastMember(): rect:");
 
@@ -266,7 +269,24 @@ bool DigitalVideoCastMember::loadVideo(Common::String path) {
 	if (result && g_director->_pixelformat.bytesPerPixel == 1) {
 		// Director supports playing back RGB and paletted video in 256 colour mode.
 		// In both cases they are dithered to match the Director palette.
-		_video->setDitheringPalette(g_director->getPalette());
+		memcpy(_ditheringPalette, g_director->getPalette(), 256*3);
+		// In Windows, the first 8 and last 8 colors are reserved for the system palette.
+		// Generally you don't want these as part of the video, and Video for Windows
+		// seems to deliberately exclude them.
+		// Keep colour 0 and 255 as they are pure white and pure black, respectively.
+		if (g_director->getPlatform() == Common::kPlatformWindows) {
+			for (int i = 1; i < 8; i++) {
+				_ditheringPalette[i*3+0] = _ditheringPalette[0];
+				_ditheringPalette[i*3+1] = _ditheringPalette[1];
+				_ditheringPalette[i*3+2] = _ditheringPalette[2];
+			}
+			for (int i = 248; i < 255; i++) {
+				_ditheringPalette[i*3+0] = _ditheringPalette[0];
+				_ditheringPalette[i*3+1] = _ditheringPalette[1];
+				_ditheringPalette[i*3+2] = _ditheringPalette[2];
+			}
+		}
+		_video->setDitheringPalette(_ditheringPalette);
 	}
 
 	_duration = getMovieTotalTime();
@@ -393,7 +413,7 @@ Graphics::MacWidget *DigitalVideoCastMember::createWidget(Common::Rect &bbox, Ch
 		if (frame->getPixels()) {
 			if (g_director->_pixelformat.bytesPerPixel == 1) {
 				// Video should have the dithering palette set, decode using whatever palette we have now
-				_lastFrame = frame->convertTo(g_director->_pixelformat, g_director->getPalette());
+				_lastFrame = frame->convertTo(g_director->_pixelformat, _ditheringPalette);
 			} else {
 				// 32-bit mode, use the palette bundled with the movie
 				_lastFrame = frame->convertTo(g_director->_pixelformat, _video->getPalette());
diff --git a/engines/director/castmember/digitalvideo.h b/engines/director/castmember/digitalvideo.h
index a4592b1b741..45a57695d96 100644
--- a/engines/director/castmember/digitalvideo.h
+++ b/engines/director/castmember/digitalvideo.h
@@ -92,6 +92,8 @@ public:
 	FrameRateType _frameRateType;
 	DigitalVideoType _videoType;
 
+	byte _ditheringPalette[256*3];
+
 	uint16 _frameRate;
 	bool _getFirstFrame;
 	int _duration;


Commit: d15f6f4904f8524b7a64f92597ea6aa5b0f2cec0
    https://github.com/scummvm/scummvm/commit/d15f6f4904f8524b7a64f92597ea6aa5b0f2cec0
Author: Scott Percival (code at moral.net.au)
Date: 2025-09-18T22:50:04+02:00

Commit Message:
DIRECTOR: Don't process frozen scripts if movie is switching

Fixes certain disc switches in McKenzie and Co (e.g. using the wardrobe,
going to the mall).

Changed paths:
    engines/director/score.cpp
    engines/director/window.cpp


diff --git a/engines/director/score.cpp b/engines/director/score.cpp
index 343d8074b0a..b9a3eb41a4e 100644
--- a/engines/director/score.cpp
+++ b/engines/director/score.cpp
@@ -591,7 +591,7 @@ void Score::update() {
 
 			// Don't process frozen script if we use jump instructions
 			// like "go to frame", or open a new movie.
-			if (!_nextFrame) {
+			if (!_nextFrame && _window->_nextMovie.movie.empty()) {
 				processFrozenScripts();
 			}
 			return;
@@ -619,7 +619,7 @@ void Score::update() {
 
 		// Don't process frozen script if we use jump instructions
 		// like "go to frame", or open a new movie.
-		if (!_nextFrame || _nextFrame == _curFrameNumber) {
+		if ((!_nextFrame && _window->_nextMovie.movie.empty()) || _nextFrame == _curFrameNumber) {
 			processFrozenScripts();
 		}
 
@@ -737,7 +737,7 @@ void Score::update() {
 	// Attempt to thaw and continue any frozen execution after startMovie and enterFrame.
 	// If they don't complete (i.e. another freezing event like a "go to frame"),
 	// force another cycle of Score::update().
-	if (!_nextFrame && !processFrozenScripts())
+	if (!_nextFrame && _window->_nextMovie.movie.empty() && !processFrozenScripts())
 		return;
 
 	if (!_vm->_playbackPaused) {
diff --git a/engines/director/window.cpp b/engines/director/window.cpp
index d39d1428e56..280a894dacb 100644
--- a/engines/director/window.cpp
+++ b/engines/director/window.cpp
@@ -541,7 +541,9 @@ bool Window::step() {
 	// finish last movie
 	if (_currentMovie && _currentMovie->getScore()->_playState == kPlayStopped) {
 		// attempt to thaw the lingo play state, if required
-		_currentMovie->getScore()->processFrozenPlayScript();
+		// For movie switches, we want to run it in the context of the new movie.
+		if (_nextMovie.movie.empty())
+			_currentMovie->getScore()->processFrozenPlayScript();
 		debugC(5, kDebugEvents, "\n@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");
 		debugC(5, kDebugEvents, "@@@@   Finishing movie '%s' in '%s'", utf8ToPrintable(_currentMovie->getMacName()).c_str(), _currentPath.c_str());
 		debugC(5, kDebugEvents, "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n");


Commit: 31755aedffb9ea1797a8652d00c9e092edd3135f
    https://github.com/scummvm/scummvm/commit/31755aedffb9ea1797a8652d00c9e092edd3135f
Author: Scott Percival (code at moral.net.au)
Date: 2025-09-18T22:50:04+02:00

Commit Message:
DIRECTOR: Fix setting the fileName on BitmapCastMember

Fixes shopping sequence in McKenzie and Co.

Changed paths:
    engines/director/castmember/castmember.cpp
    engines/director/castmember/castmember.h
    engines/director/channel.cpp


diff --git a/engines/director/castmember/castmember.cpp b/engines/director/castmember/castmember.cpp
index ce593308e4f..747b4018b31 100644
--- a/engines/director/castmember/castmember.cpp
+++ b/engines/director/castmember/castmember.cpp
@@ -27,6 +27,7 @@
 #include "director/movie.h"
 #include "director/castmember/castmember.h"
 #include "director/lingo/lingo-the.h"
+#include "director/util.h"
 
 namespace Director {
 
@@ -273,9 +274,14 @@ void CastMember::setField(int field, const Datum &d) {
 		if (!castInfo) {
 			warning("CastMember::setField(): CastMember info for %d not found", _castId);
 			return;
+		} else {
+			Common::String rawPath = d.asString();
+			Common::String filename = getFileName(rawPath);
+			castInfo->fileName = filename;
+			castInfo->directory = rawPath.substr(0, MAX((uint)0, rawPath.size() - filename.size() - 1));
+			_needsReload = true;
+			_modified = true;
 		}
-		castInfo->fileName = d.asString();
-		_needsReload = true;
 		return;
 	case kTheForeColor:
 		_cast->getCastMember(_castId)->setForeColor(d.asInt());
diff --git a/engines/director/castmember/castmember.h b/engines/director/castmember/castmember.h
index 9ba2fce6cfd..ec958c27849 100644
--- a/engines/director/castmember/castmember.h
+++ b/engines/director/castmember/castmember.h
@@ -64,6 +64,7 @@ public:
 	virtual bool isEditable() { return false; }
 	virtual void setEditable(bool editable) {}
 	virtual bool isModified() { return _modified; }
+	virtual bool needsReload() { return _needsReload; }
 	void setModified(bool modified);
 	virtual Graphics::MacWidget *createWidget(Common::Rect &bbox, Channel *channel, SpriteType spriteType) { return nullptr; }
 	virtual void updateWidget(Graphics::MacWidget *widget, Channel *channel) {}
diff --git a/engines/director/channel.cpp b/engines/director/channel.cpp
index 6e6bd046ece..8153ba40009 100644
--- a/engines/director/channel.cpp
+++ b/engines/director/channel.cpp
@@ -661,6 +661,10 @@ void Channel::replaceWidget(CastMemberID previousCastId, bool force) {
 		// if the type don't match, then we will set it as transparent. i.e. don't create widget
 		if (!_sprite->checkSpriteType())
 			return;
+
+		if (_sprite->_cast->needsReload()) {
+			_sprite->_cast->load();
+		}
 		// always use the unstretched dims.
 		// because only the stretched sprite will have different channel size and sprite size
 		// we need the original image to scale the sprite.


Commit: c1ddd7b34ac4b0d4741f8b4adb3a9b5267ff9319
    https://github.com/scummvm/scummvm/commit/c1ddd7b34ac4b0d4741f8b4adb3a9b5267ff9319
Author: Scott Percival (code at moral.net.au)
Date: 2025-09-18T22:50:04+02:00

Commit Message:
DIRECTOR: Cache video palettes in 32-bit graphics mode

Fixes crash when using the power switch in AMBER: Journeys Beyond.

Changed paths:
    engines/director/castmember/digitalvideo.cpp


diff --git a/engines/director/castmember/digitalvideo.cpp b/engines/director/castmember/digitalvideo.cpp
index c3f178c3687..5d99eb48c3b 100644
--- a/engines/director/castmember/digitalvideo.cpp
+++ b/engines/director/castmember/digitalvideo.cpp
@@ -401,6 +401,15 @@ Graphics::MacWidget *DigitalVideoCastMember::createWidget(Common::Rect &bbox, Ch
 
 	const Graphics::Surface *frame = _video->decodeNextFrame();
 
+	// If the video gets stopped, for whatever reason, _video->getPalette() will not work.
+	// Cache it when possible.
+	if (g_director->_pixelformat.bytesPerPixel == 4) {
+		const byte *videoPalette = _video->getPalette();
+		if (videoPalette) {
+			memcpy(_ditheringPalette, videoPalette, 256*3);
+		}
+	}
+
 	debugC(1, kDebugImages, "Video time: %d  rate: %f frame: %p dims: %d x %d", _channel->_movieTime, _channel->_movieRate, (const void *)frame, bbox.width(), bbox.height());
 
 	if (frame) {
@@ -411,13 +420,8 @@ Graphics::MacWidget *DigitalVideoCastMember::createWidget(Common::Rect &bbox, Ch
 		}
 
 		if (frame->getPixels()) {
-			if (g_director->_pixelformat.bytesPerPixel == 1) {
-				// Video should have the dithering palette set, decode using whatever palette we have now
-				_lastFrame = frame->convertTo(g_director->_pixelformat, _ditheringPalette);
-			} else {
-				// 32-bit mode, use the palette bundled with the movie
-				_lastFrame = frame->convertTo(g_director->_pixelformat, _video->getPalette());
-			}
+			// Video should have the dithering palette set, decode using whatever palette we have now
+			_lastFrame = frame->convertTo(g_director->_pixelformat, _ditheringPalette);
 		} else {
 			warning("DigitalVideoCastMember::createWidget(): frame has no pixel data");
 		}


Commit: b1b19f0c21588744196da189f7d31499bdd2c238
    https://github.com/scummvm/scummvm/commit/b1b19f0c21588744196da189f7d31499bdd2c238
Author: Scott Percival (code at moral.net.au)
Date: 2025-09-18T22:50:04+02:00

Commit Message:
DIRECTOR: Fix dithering for 8-bit BitmapCastMembers in 32-bit mode

Fixes broken closet/shop background graphics in McKenzie and Co with
32-bit graphics output.

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


diff --git a/engines/director/castmember/bitmap.cpp b/engines/director/castmember/bitmap.cpp
index 22bc7dddce3..367b39ccd43 100644
--- a/engines/director/castmember/bitmap.cpp
+++ b/engines/director/castmember/bitmap.cpp
@@ -306,11 +306,13 @@ BitmapCastMember::~BitmapCastMember() {
 	if (_ditheredImg) {
 		_ditheredImg->free();
 		delete _ditheredImg;
+		_ditheredImg = nullptr;
 	}
 
 	if (_matte) {
 		_matte->free();
 		delete _matte;
+		_matte = nullptr;
 	}
 }
 
@@ -467,7 +469,7 @@ Graphics::Surface *BitmapCastMember::getDitherImg() {
 		// If we're in 32-bit mode, and not in puppet palette mode, then "redither" as well.
 		if (targetBpp == 4 && score->_puppetPalette && !_external)
 			break;
-		if (_external || (castPaletteId != currentPaletteId && !isColorCycling)) {
+		if (_external || (targetBpp == 4) || (castPaletteId != currentPaletteId && !isColorCycling)) {
 			const auto pals = g_director->getLoadedPalettes();
 			CastMemberID palIndex = pals.contains(castPaletteId) ? castPaletteId : CastMemberID(kClutSystemMac, -1);
 			const PaletteV4 &srcPal = pals.getVal(palIndex);
@@ -580,6 +582,7 @@ void BitmapCastMember::createMatte(const Common::Rect &bbox) {
 		if (_matte) {
 			_matte->free();
 			delete _matte;
+			_matte = nullptr;
 		}
 
 		Graphics::FloodFill matteFill(&tmp, whiteColor, 0, true);
@@ -654,6 +657,12 @@ void BitmapCastMember::load() {
 	if (_loaded && !_needsReload)
 		return;
 
+	if (_ditheredImg) {
+		_ditheredImg->free();
+		delete _ditheredImg;
+		_ditheredImg = nullptr;
+	}
+
 	_needsReload = false;
 
 	uint32 tag = _tag;
@@ -819,8 +828,11 @@ void BitmapCastMember::unload() {
 	delete _picture;
 	_picture = new Picture();
 
-	delete _ditheredImg;
-	_ditheredImg = nullptr;
+	if (_ditheredImg) {
+		_ditheredImg->free();
+		delete _ditheredImg;
+		_ditheredImg = nullptr;
+	}
 
 	_loaded = false;
 }
@@ -841,8 +853,11 @@ void BitmapCastMember::setPicture(PictureReference &picture) {
 	_picture = new Picture(*picture._picture);
 
 	// Force redither
-	delete _ditheredImg;
-	_ditheredImg = nullptr;
+	if (_ditheredImg) {
+		_ditheredImg->free();
+		delete _ditheredImg;
+		_ditheredImg = nullptr;
+	}
 
 	// Make sure we get redrawn
 	setModified(true);
diff --git a/engines/director/lingo/lingo-builtins.cpp b/engines/director/lingo/lingo-builtins.cpp
index da127bb4165..b8bf4094140 100644
--- a/engines/director/lingo/lingo-builtins.cpp
+++ b/engines/director/lingo/lingo-builtins.cpp
@@ -1530,14 +1530,16 @@ void LB::b_getNthFileNameInFolder(int nargs) {
 }
 
 void LB::b_open(int nargs) {
-	Datum d = g_lingo->pop();
+
+	Datum ex = g_lingo->pop();
+	Datum d;
 	if (nargs == 2)
-		g_lingo->pop();
-	warning("LB::b_open(): Unsupported command open encountered -> The movie tried to open %s", d.asString().c_str());
+		d = g_lingo->pop();
+	warning("LB::b_open(): Unsupported command open encountered -> The movie tried to open %s %s", ex.asString().c_str(), d.type != VOID ? d.asString().c_str() : "");
 
 	if (!debugChannelSet(-1, kDebugFewFramesOnly) &&
 		!(g_director->getGameGID() == GID_TEST || g_director->getGameGID() == GID_TESTALL)) {
-		Common::U32String message = Common::String::format("Unsupported command open encountered -> The movie tried to execute open %s!", d.asString().c_str());
+		Common::U32String message = Common::String::format("Unsupported command open encountered -> The movie tried to execute open %s %s!", ex.asString().c_str(), d.type != VOID ? d.asString().c_str() : "");
 		GUI::MessageDialog dialog(message, _("Ok"));
 		dialog.runModal();
 	}
diff --git a/engines/director/lingo/lingo-events.cpp b/engines/director/lingo/lingo-events.cpp
index 29d2e24cbb3..00b29c07979 100644
--- a/engines/director/lingo/lingo-events.cpp
+++ b/engines/director/lingo/lingo-events.cpp
@@ -251,7 +251,7 @@ void Movie::resolveScriptEvent(LingoEvent &event) {
 					if (event.behaviorIndex >= 0) {
 						scriptId = sprite->_behaviors[event.behaviorIndex].memberID;
 						initializerParams = sprite->_behaviors[event.behaviorIndex].initializerParams;
-						warning("ID: %s, initializerParams: '%s'", scriptId.asString().c_str(), initializerParams.c_str());
+						warning("event: %d, ID: %s, initializerParams: '%s'", event.event, scriptId.asString().c_str(), initializerParams.c_str());
 
 						// TODO: instantiate the behavior script as a child and set its properties
 						// according to the list in initializerParams


Commit: 2235c02d323423f542dc56782621d34572c4753b
    https://github.com/scummvm/scummvm/commit/2235c02d323423f542dc56782621d34572c4753b
Author: Scott Percival (code at moral.net.au)
Date: 2025-09-18T22:50:04+02:00

Commit Message:
DIRECTOR: Use background colour for buttons

Changed paths:
    engines/director/castmember/text.cpp


diff --git a/engines/director/castmember/text.cpp b/engines/director/castmember/text.cpp
index 2203e8b57ab..54c8978e13e 100644
--- a/engines/director/castmember/text.cpp
+++ b/engines/director/castmember/text.cpp
@@ -342,7 +342,7 @@ Graphics::MacWidget *TextCastMember::createWidget(Common::Rect &bbox, Channel *c
 	case kCastButton:
 		// note that we use _initialRect for the dimensions of the button;
 		// the values provided in the sprite bounding box are ignored
-		widget = new Graphics::MacButton(Graphics::MacButtonType(buttonType), getAlignment(), g_director->getCurrentWindow(), bbox.left, bbox.top, _initialRect.width(), _initialRect.height(), g_director->_wm, _ftext, macFont, getForeColor(), g_director->_wm->_colorWhite);
+		widget = new Graphics::MacButton(Graphics::MacButtonType(buttonType), getAlignment(), g_director->getCurrentWindow(), bbox.left, bbox.top, _initialRect.width(), _initialRect.height(), g_director->_wm, _ftext, macFont, getForeColor(), getBackColor());
 		widget->_focusable = true;
 
 		((Graphics::MacButton *)widget)->setHilite(_hilite);




More information about the Scummvm-git-logs mailing list