[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