[Scummvm-git-logs] scummvm master -> b80fa3f1224901c22f8e9c085b26e3ab73020006

sev- noreply at scummvm.org
Mon Oct 17 10:29:22 UTC 2022


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

Summary:
b80fa3f122 DIRECTOR: Add support for multi-entry D3 EXEs


Commit: b80fa3f1224901c22f8e9c085b26e3ab73020006
    https://github.com/scummvm/scummvm/commit/b80fa3f1224901c22f8e9c085b26e3ab73020006
Author: eientei (einstein95 at users.noreply.github.com)
Date: 2022-10-17T12:29:16+02:00

Commit Message:
DIRECTOR: Add support for multi-entry D3 EXEs

Tested on Wrath of the Gods demo, only contains movie file path
information

Changed paths:
    engines/director/resource.cpp


diff --git a/engines/director/resource.cpp b/engines/director/resource.cpp
index c52a637f2fa..126cf206232 100644
--- a/engines/director/resource.cpp
+++ b/engines/director/resource.cpp
@@ -276,20 +276,41 @@ void Window::loadEXE(const Common::String movie) {
 }
 
 void Window::loadEXEv3(Common::SeekableReadStream *stream) {
+	uint32 mmmSize;
+	Common::String mmmFileName;
+	Common::String directoryName;
+
 	uint16 entryCount = stream->readUint16LE();
-	if (entryCount != 1)
-		error("Unhandled multiple entry v3 EXE");
 
 	stream->skip(5); // unknown
 
-	uint32 mmmSize = stream->readUint32LE(); // Main MMM size
+	for (int i = 0; i < entryCount; ++i) {
+		uint32 mmmSize_ = stream->readUint32LE(); // Main MMM size
 
-	Common::String mmmFileName = stream->readPascalString();
-	Common::String directoryName = stream->readPascalString();
+		Common::String mmmFileName_ = stream->readPascalString();
+		Common::String directoryName_ = stream->readPascalString();
 
-	debugC(1, kDebugLoading, "Main MMM: '%s'", mmmFileName.c_str());
-	debugC(1, kDebugLoading, "Directory Name: '%s'", directoryName.c_str());
-	debugC(1, kDebugLoading, "Main mmmSize: %d (0x%x)", mmmSize, mmmSize);
+		debugC(1, kDebugLoading, "MMM #%d: '%s'", i, mmmFileName_.c_str());
+		debugC(1, kDebugLoading, "Directory Name: '%s'", directoryName_.c_str());
+		debugC(1, kDebugLoading, "MMM size: %d (0x%x)", mmmSize_, mmmSize_);
+		if (i == 0) {
+			mmmSize = mmmSize_;
+			mmmFileName = mmmFileName_;
+			directoryName = directoryName_;
+		} else {
+			if (!SearchMan.hasFile(Common::Path(mmmFileName_, g_director->_dirSeparator)))
+				warning("Failed to find MMM '%s'", mmmFileName_.c_str());
+			else {
+				Common::SeekableReadStream *const mmmFile_ = SearchMan.createReadStreamForMember(Common::Path(mmmFileName_, g_director->_dirSeparator));
+				uint32 mmmFileSize_ = mmmFile_->size();
+				if (mmmSize_ != mmmFileSize_)
+					warning("File size for '%s' doesn't match. Got %d (0x%x), want %d (0x%x)", mmmFileName_.c_str(), mmmFileSize_, mmmFileSize_, mmmSize_, mmmSize_);
+				delete mmmFile_;
+			}
+		}
+		// Print a blank line to separate the entries, format a blank string to silence gcc warning
+		debugC(1, kDebugLoading, "%s", "");
+	}
 
 	if (mmmSize) {
 		uint32 riffOffset = stream->pos();




More information about the Scummvm-git-logs mailing list