[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