[Scummvm-git-logs] scummvm master -> 74b8b64f7f3ba5f1ad87c1bfd8f85115c51192fd
moralrecordings
noreply at scummvm.org
Sat Feb 28 13:35:04 UTC 2026
This automated email contains information about 2 new commits which have been
pushed to the 'scummvm' repo located at https://api.github.com/repos/scummvm/scummvm .
Summary:
b858517d63 DIRECTOR: Fall back to QuickTime decoder if magic ID fails
74b8b64f7f DIRECTOR: Add quirk to fix Virtual Nightclub in strict mode
Commit: b858517d637500c04188cbbaf6320c47d9c4f32d
https://github.com/scummvm/scummvm/commit/b858517d637500c04188cbbaf6320c47d9c4f32d
Author: Scott Percival (code at moral.net.au)
Date: 2026-02-28T21:34:18+08:00
Commit Message:
DIRECTOR: Fall back to QuickTime decoder if magic ID fails
Fixes playback of Egaeus' proposal to Berenice (dkydata/bn/bc/bnbcself.mov)
in The Dark Eye.
Thanks to gcp828, arrowgent and antoniou79 for the tipoff.
Changed paths:
engines/director/castmember/digitalvideo.cpp
diff --git a/engines/director/castmember/digitalvideo.cpp b/engines/director/castmember/digitalvideo.cpp
index 305526afc20..facd9065913 100644
--- a/engines/director/castmember/digitalvideo.cpp
+++ b/engines/director/castmember/digitalvideo.cpp
@@ -248,6 +248,7 @@ bool DigitalVideoCastMember::loadVideo(Common::String path) {
uint32 magic3 = copiedStream->readUint32BE();
delete copiedStream;
bool result = false;
+ bool tryQuickTime = false;
debugC(2, kDebugLoading, "Loading video %s -> %s", path.c_str(), location.toString(Common::Path::kNativeSeparator).c_str());
if (magic1 == MKTAG('F', 'O', 'R', 'M') &&
@@ -264,6 +265,27 @@ bool DigitalVideoCastMember::loadVideo(Common::String path) {
}
} else if (magic2 == MKTAG('m', 'o', 'o', 'v') || magic2 == MKTAG('m', 'd', 'a', 't')) {
+ tryQuickTime = true;
+ } else if (magic1 == MKTAG('R', 'I', 'F', 'F') && (magic3 == MKTAG('A', 'V', 'I', ' '))) {
+ _video = new Video::AVIDecoder();
+ result = _video->loadFile(location);
+ if (!result) {
+ warning("DigitalVideoCastMember::loadVideo(): format not supported, skipping video '%s'", path.c_str());
+ delete _video;
+ _video = nullptr;
+ return false;
+ } else {
+ _videoType = kDVVideoForWindows;
+ }
+ } else {
+ // early QuickTime videos are a nightmare for magic ID detection,
+ // but let's be honest it's probably going to be QuickTime with Cinepak,
+ // the little postage-stamp-sized video format that could
+ debugC(8, kDebugLevelGVideo, "DigitalVideoCastMember::loadVideo(): couldn't find magic ID, trying QuickTime");
+ tryQuickTime = true;
+ }
+
+ if (tryQuickTime) {
_video = new Video::QuickTimeDecoder();
result = _video->loadFile(location);
if (!result) {
@@ -283,18 +305,9 @@ bool DigitalVideoCastMember::loadVideo(Common::String path) {
} else {
_videoType = kDVQuickTime;
}
- } else if (magic1 == MKTAG('R', 'I', 'F', 'F') && (magic3 == MKTAG('A', 'V', 'I', ' '))) {
- _video = new Video::AVIDecoder();
- result = _video->loadFile(location);
- if (!result) {
- warning("DigitalVideoCastMember::loadVideo(): format not supported, skipping video '%s'", path.c_str());
- delete _video;
- _video = nullptr;
- return false;
- } else {
- _videoType = kDVVideoForWindows;
- }
- } else {
+ }
+
+ if (!result) {
warning("DigitalVideoCastMember::loadVideo: Unknown file format for video '%s', skipping", path.c_str());
}
Commit: 74b8b64f7f3ba5f1ad87c1bfd8f85115c51192fd
https://github.com/scummvm/scummvm/commit/74b8b64f7f3ba5f1ad87c1bfd8f85115c51192fd
Author: Scott Percival (code at moral.net.au)
Date: 2026-02-28T21:34:18+08:00
Commit Message:
DIRECTOR: Add quirk to fix Virtual Nightclub in strict mode
Changed paths:
engines/director/lingo/lingo-patcher.cpp
diff --git a/engines/director/lingo/lingo-patcher.cpp b/engines/director/lingo/lingo-patcher.cpp
index fa29e52b05c..00976ea4ed7 100644
--- a/engines/director/lingo/lingo-patcher.cpp
+++ b/engines/director/lingo/lingo-patcher.cpp
@@ -320,6 +320,29 @@ on checkkaiwa kaiwatrue, kaiwafalse \r\
end \r\
";
+/*
+ * The Virtual Nightclub codebase is a large mass of spaghetti.
+ * All VNC/VNC.EXE is meant to do is play the Thumb Candy logo,
+ * then kick over to VNC2/_VNC.DXR which boots the game.
+ *
+ * However, VNC/VNC.EXE contains an internal copy of the SHARED.DXR similar
+ * to the main game in VNC2/SHARED.DXR. The game handles pretty much
+ * everything with an event loop in "idle", which (amongst other things)
+ * assumes if certain stuff hasn't been initialised, the game has been
+ * restarted and it should try and init -some- things (but not call init(),
+ * which inits everything).
+ *
+ * This doesn't really work, as several of the subsystems don't have checks for
+ * e.g. "mmxobj", a global object used for controlling the custom movie player.
+ * As such, running the game in strict mode will crash on startup.
+ * Instead of divining the exact order of operations which narrowly avoids a crash,
+ * we can say "idle" isn't needed for the intro and nop it out.
+ */
+const char *const vncFixIntro = " \
+on idle \r\
+end \r\
+";
+
/*
* Virtual Nightclub will try and list all the files from all 26 drive letters
* to determine which has the CD. This works, but takes forever.
@@ -515,6 +538,7 @@ struct ScriptHandlerPatch {
{"kyoto", nullptr, kPlatformWindows, "ck_data\\rokudou\\shared.dxr", kMovieScript, 846, DEFAULT_CAST_LIB, &kyotoTextEntryFix},
{"vnc", nullptr, kPlatformWindows, "VNC\\VNC.EXE", kMovieScript, 57, DEFAULT_CAST_LIB, &vncSkipDetection},
{"vnc", nullptr, kPlatformWindows, "VNC2\\SHARED.DXR", kMovieScript, 1248, DEFAULT_CAST_LIB, &vncEnableCheats},
+ {"vnc", nullptr, kPlatformWindows, "VNC\\Shared.DXR", kMovieScript, 1562, DEFAULT_CAST_LIB, &vncFixIntro},
{"amber", nullptr, kPlatformWindows, "AMBER_F\\AMBER_JB.EXE", kMovieScript, 7, DEFAULT_CAST_LIB, &amberDriveDetectionFix},
{"frankenstein", nullptr, kPlatformWindows, "FRANKIE.EXE", kScoreScript, 21, DEFAULT_CAST_LIB, &frankensteinSwapFix},
{"gadgetpaf", nullptr, kPlatformWindows, "GADGET\\DISKCNG.DIR", kScoreScript, 2, DEFAULT_CAST_LIB, &gadgetPafDetectionFixAlert},
More information about the Scummvm-git-logs
mailing list