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

djsrv noreply at scummvm.org
Tue Aug 9 21:18:21 UTC 2022


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

Summary:
766d74f8f6 DIRECTOR: Read KEY* resource before reading CAS* resource
8f9da662cc DIRECTOR: Implement _movieChunk to store indices of chunks having 1024 as parent
dbe1ae48d5 DIRECTOR: Use KEY* mappings instead of taking the first resource to load chunks


Commit: 766d74f8f6083639c6a3319ba14d242ccc66fbeb
    https://github.com/scummvm/scummvm/commit/766d74f8f6083639c6a3319ba14d242ccc66fbeb
Author: Pragyansh Chaturvedi (pragyanshchaturvedi18 at gmail.com)
Date: 2022-08-09T16:18:15-05:00

Commit Message:
DIRECTOR: Read KEY* resource before reading CAS* resource

Changed paths:
    engines/director/archive.cpp


diff --git a/engines/director/archive.cpp b/engines/director/archive.cpp
index fca32efa2bd..5c6be56e0d7 100644
--- a/engines/director/archive.cpp
+++ b/engines/director/archive.cpp
@@ -582,6 +582,16 @@ bool RIFXArchive::openStream(Common::SeekableReadStream *stream, uint32 startOff
 		}
 	}
 
+	// A KEY* must be present
+	if (!hasResource(MKTAG('K', 'E', 'Y', '*'), -1)) {
+		warning("No 'KEY*' resource present");
+	} else {
+		// Parse the KEY*
+		Common::SeekableReadStreamEndian *keyStream = getFirstResource(MKTAG('K', 'E', 'Y', '*'), true);
+		readKeyTable(*keyStream);
+		delete keyStream;
+	}
+
 	// Parse the CAS*, if present
 	if (hasResource(MKTAG('C', 'A', 'S', '*'), -1)) {
 		Common::SeekableReadStreamEndian *casStream = getFirstResource(MKTAG('C', 'A', 'S', '*'));
@@ -589,16 +599,6 @@ bool RIFXArchive::openStream(Common::SeekableReadStream *stream, uint32 startOff
 		delete casStream;
 	}
 
-	// A KEY* must be present
-	if (!hasResource(MKTAG('K', 'E', 'Y', '*'), -1)) {
-		warning("No 'KEY*' resource present");
-		return false;
-	}
-	// Parse the KEY*
-	Common::SeekableReadStreamEndian *keyStream = getFirstResource(MKTAG('K', 'E', 'Y', '*'), true);
-	readKeyTable(*keyStream);
-	delete keyStream;
-
 	return true;
 }
 


Commit: 8f9da662ccceb77dfc979ec32f5ab2ac9e15c6b1
    https://github.com/scummvm/scummvm/commit/8f9da662ccceb77dfc979ec32f5ab2ac9e15c6b1
Author: Pragyansh Chaturvedi (pragyanshchaturvedi18 at gmail.com)
Date: 2022-08-09T16:18:15-05:00

Commit Message:
DIRECTOR: Implement _movieChunk to store indices of chunks having 1024 as parent

Changed paths:
    engines/director/archive.cpp
    engines/director/archive.h


diff --git a/engines/director/archive.cpp b/engines/director/archive.cpp
index 5c6be56e0d7..0a4c61b8e19 100644
--- a/engines/director/archive.cpp
+++ b/engines/director/archive.cpp
@@ -594,7 +594,11 @@ bool RIFXArchive::openStream(Common::SeekableReadStream *stream, uint32 startOff
 
 	// Parse the CAS*, if present
 	if (hasResource(MKTAG('C', 'A', 'S', '*'), -1)) {
-		Common::SeekableReadStreamEndian *casStream = getFirstResource(MKTAG('C', 'A', 'S', '*'));
+		Common::SeekableReadStreamEndian *casStream = nullptr;
+		if (_movieChunks.contains(MKTAG('C', 'A', 'S', '*')))
+			casStream = getResource(MKTAG('C', 'A', 'S', '*'), _movieChunks[MKTAG('C', 'A', 'S', '*')]);
+		else
+			casStream = getFirstResource(MKTAG('C', 'A', 'S', '*'));
 		readCast(*casStream);
 		delete casStream;
 	}
@@ -855,6 +859,8 @@ void RIFXArchive::readKeyTable(Common::SeekableReadStreamEndian &keyStream) {
 			castResMap[parentIndex].children.push_back(_types[childTag][childIndex]);
 		} else if (castResMap.contains(childIndex)) { // sometimes parent and child index are reversed...
 			castResMap[childIndex].children.push_back(_types[childTag][parentIndex]);
+		} else if (parentIndex == 1024) {
+			_movieChunks.setVal(childTag, childIndex);
 		}
 	}
 }
diff --git a/engines/director/archive.h b/engines/director/archive.h
index c77fa0c5b26..272c8488b1f 100644
--- a/engines/director/archive.h
+++ b/engines/director/archive.h
@@ -80,7 +80,9 @@ protected:
 	Common::SeekableReadStream *_stream;
 	typedef Common::HashMap<uint16, Resource> ResourceMap;
 	typedef Common::HashMap<uint32, ResourceMap> TypeMap;
+	typedef Common::HashMap<uint32, uint32> MovieMap;
 	TypeMap _types;
+	MovieMap _movieChunks;
 
 	Common::String _pathName;
 };


Commit: dbe1ae48d56f27ece1e0a6475aa39185afc6cef9
    https://github.com/scummvm/scummvm/commit/dbe1ae48d56f27ece1e0a6475aa39185afc6cef9
Author: Pragyansh Chaturvedi (pragyanshchaturvedi18 at gmail.com)
Date: 2022-08-09T16:18:15-05:00

Commit Message:
DIRECTOR: Use KEY* mappings instead of taking the first resource to load chunks

Changed paths:
    engines/director/archive.cpp
    engines/director/archive.h
    engines/director/cast.cpp
    engines/director/movie.cpp


diff --git a/engines/director/archive.cpp b/engines/director/archive.cpp
index 0a4c61b8e19..40db6ffd854 100644
--- a/engines/director/archive.cpp
+++ b/engines/director/archive.cpp
@@ -171,6 +171,18 @@ Common::String Archive::getName(uint32 tag, uint16 id) const {
 	return resMap[id].name;
 }
 
+Common::SeekableReadStreamEndian *Archive::getMovieResourceIfPresent(uint32 tag) {
+	if (g_director->getVersion() >= 400 && (_movieChunks.contains(tag) && hasResource(tag, _movieChunks[tag])))
+		return getResource(tag, _movieChunks[tag]);
+
+	if (hasResource(tag, -1)) {
+		warning("Archive::getMovieResourceIfPresent(): KEY* to reference tag %d not found, returning first occurence of this resource", tag);
+		return getFirstResource(tag);
+	}
+
+	return nullptr;
+}
+
 Common::Array<uint32> Archive::getResourceTypeList() const {
 	Common::Array<uint32> typeList;
 
@@ -593,12 +605,7 @@ bool RIFXArchive::openStream(Common::SeekableReadStream *stream, uint32 startOff
 	}
 
 	// Parse the CAS*, if present
-	if (hasResource(MKTAG('C', 'A', 'S', '*'), -1)) {
-		Common::SeekableReadStreamEndian *casStream = nullptr;
-		if (_movieChunks.contains(MKTAG('C', 'A', 'S', '*')))
-			casStream = getResource(MKTAG('C', 'A', 'S', '*'), _movieChunks[MKTAG('C', 'A', 'S', '*')]);
-		else
-			casStream = getFirstResource(MKTAG('C', 'A', 'S', '*'));
+	if (Common::SeekableReadStreamEndian *casStream = getMovieResourceIfPresent(MKTAG('C', 'A', 'S', '*'))) {
 		readCast(*casStream);
 		delete casStream;
 	}
diff --git a/engines/director/archive.h b/engines/director/archive.h
index 272c8488b1f..464dab1069c 100644
--- a/engines/director/archive.h
+++ b/engines/director/archive.h
@@ -69,6 +69,7 @@ public:
 	uint32 getOffset(uint32 tag, uint16 id) const;
 	uint16 findResourceID(uint32 tag, const Common::String &resName, bool ignoreCase = false) const;
 	Common::String getName(uint32 tag, uint16 id) const;
+	Common::SeekableReadStreamEndian *getMovieResourceIfPresent(uint32 tag);
 
 	Common::Array<uint32> getResourceTypeList() const;
 	Common::Array<uint16> getResourceIDList(uint32 type) const;
@@ -80,9 +81,9 @@ protected:
 	Common::SeekableReadStream *_stream;
 	typedef Common::HashMap<uint16, Resource> ResourceMap;
 	typedef Common::HashMap<uint32, ResourceMap> TypeMap;
-	typedef Common::HashMap<uint32, uint32> MovieMap;
+	typedef Common::HashMap<uint32, uint32> MovieChunkMap;
 	TypeMap _types;
-	MovieMap _movieChunks;
+	MovieChunkMap _movieChunks;
 
 	Common::String _pathName;
 };
diff --git a/engines/director/cast.cpp b/engines/director/cast.cpp
index 4dcea4aed3b..9f80f59e848 100644
--- a/engines/director/cast.cpp
+++ b/engines/director/cast.cpp
@@ -238,7 +238,9 @@ bool Cast::loadConfig() {
 		return false;
 	}
 
-	Common::SeekableReadStreamEndian *stream = _castArchive->getFirstResource(MKTAG('V', 'W', 'C', 'F'));
+	Common::SeekableReadStreamEndian *stream = nullptr;
+
+	stream = _castArchive->getMovieResourceIfPresent(MKTAG('V', 'W', 'C', 'F'));
 
 	debugC(1, kDebugLoading, "****** Loading Config VWCF");
 
@@ -489,26 +491,26 @@ void Cast::loadCast() {
 	}
 
 	// Font Mapping
-	if (_castArchive->hasResource(MKTAG('V', 'W', 'F', 'M'), -1)) {
-		loadFontMap(*(r = _castArchive->getFirstResource(MKTAG('V', 'W', 'F', 'M'))));
+	if (r = _castArchive->getMovieResourceIfPresent(MKTAG('V', 'W', 'F', 'M'))) {
+		loadFontMap(*r);
 		delete r;
 	}
 
 	// Cross-Platform Font Mapping
-	if (_castArchive->hasResource(MKTAG('F', 'X', 'm', 'p'), -1)) {
-		loadFXmp(*(r = _castArchive->getFirstResource(MKTAG('F', 'X', 'm', 'p'))));
+	if (r = _castArchive->getMovieResourceIfPresent(MKTAG('F', 'X', 'm', 'p'))) {
+		loadFXmp(*r);
 		delete r;
 	}
 
 	// Font Mapping V4
-	if (_castArchive->hasResource(MKTAG('F', 'm', 'a', 'p'), -1)) {
-		loadFontMapV4(*(r = _castArchive->getFirstResource(MKTAG('F', 'm', 'a', 'p'))));
+	if (r = _castArchive->getMovieResourceIfPresent(MKTAG('F', 'm', 'a', 'p'))) {
+		loadFontMapV4(*r);
 		delete r;
 	}
 
 	// Pattern Tiles
-	if (_castArchive->hasResource(MKTAG('V', 'W', 'T', 'L'), -1)) {
-		loadVWTL(*(r = _castArchive->getFirstResource(MKTAG('V', 'W', 'T', 'L'))));
+	if (r = _castArchive->getMovieResourceIfPresent(MKTAG('V', 'W', 'T', 'L'))) {
+		loadVWTL(*r);
 		delete r;
 	}
 
@@ -525,8 +527,8 @@ void Cast::loadCast() {
 	}
 
 	// External sound files
-	if (_castArchive->hasResource(MKTAG('S', 'T', 'R', ' '), -1)) {
-		loadExternalSound(*(r = _castArchive->getFirstResource(MKTAG('S', 'T', 'R', ' '))));
+	if (r = _castArchive->getMovieResourceIfPresent(MKTAG('S', 'T', 'R', ' '))) {
+		loadExternalSound(*r);
 		delete r;
 	}
 
@@ -558,14 +560,9 @@ void Cast::loadCast() {
 	// For D4+ we may request to force Lingo scripts and skip precompiled bytecode
 	if (_version >= kFileVer400 && !debugChannelSet(-1, kDebugNoBytecode)) {
 		// Try to load script context
-		Common::Array<uint16> lctx =  _castArchive->getResourceIDList(MKTAG('L','c','t','x'));
-		if (lctx.size() > 0) {
-			debugC(2, kDebugLoading, "****** Loading %d Lctx resources", lctx.size());
-
-			for (Common::Array<uint16>::iterator iterator = lctx.begin(); iterator != lctx.end(); ++iterator) {
-				loadLingoContext(*(r = _castArchive->getResource(MKTAG('L','c','t','x'), *iterator)));
-				delete r;
-			}
+		if (r = _castArchive->getMovieResourceIfPresent(MKTAG('L', 'c', 't', 'x'))) {
+			loadLingoContext(*r);
+			delete r;
 		}
 	}
 
@@ -580,8 +577,8 @@ void Cast::loadCast() {
 	}
 
 	// Score Order List resources
-	if (_castArchive->hasResource(MKTAG('S', 'o', 'r', 'd'), -1)) {
-		loadSord(*(r = _castArchive->getFirstResource(MKTAG('S', 'o', 'r', 'd'))));
+	if (r = _castArchive->getMovieResourceIfPresent(MKTAG('S', 'o', 'r', 'd'))) {
+		loadSord(*r);
 		delete r;
 	}
 
diff --git a/engines/director/movie.cpp b/engines/director/movie.cpp
index 5f5d36b05da..240d7ebf490 100644
--- a/engines/director/movie.cpp
+++ b/engines/director/movie.cpp
@@ -111,9 +111,8 @@ void Movie::setArchive(Archive *archive) {
 	_cast->setArchive(archive);
 
 	// Frame Labels
-	if (archive->hasResource(MKTAG('V', 'W', 'L', 'B'), -1)) {
-		Common::SeekableReadStreamEndian *r;
-		_score->loadLabels(*(r = archive->getFirstResource(MKTAG('V', 'W', 'L', 'B'))));
+	if (Common::SeekableReadStreamEndian *r = archive->getMovieResourceIfPresent(MKTAG('V', 'W', 'L', 'B'))) {
+		_score->loadLabels(*r);
 		delete r;
 	}
 }
@@ -131,8 +130,8 @@ bool Movie::loadArchive() {
 	// Wait to handle _stageColor until palette is loaded in loadCast...
 
 	// File Info
-	if (_movieArchive->hasResource(MKTAG('V', 'W', 'F', 'I'), -1)) {
-		loadFileInfo(*(r = _movieArchive->getFirstResource(MKTAG('V', 'W', 'F', 'I'))));
+	if (r = _movieArchive->getMovieResourceIfPresent(MKTAG('V', 'W', 'F', 'I'))) {
+		loadFileInfo(*r);
 		delete r;
 	}
 
@@ -166,16 +165,17 @@ bool Movie::loadArchive() {
 	_window->setStageColor(_stageColor, true);
 
 	// Score
-	if (!_movieArchive->hasResource(MKTAG('V', 'W', 'S', 'C'), -1)) {
+	if (!(r = _movieArchive->getMovieResourceIfPresent(MKTAG('V', 'W', 'S', 'C')))) {
 		warning("Movie::loadArchive(): Wrong movie format. VWSC resource missing");
 		return false;
 	}
-	_score->loadFrames(*(r = _movieArchive->getFirstResource(MKTAG('V', 'W', 'S', 'C'))), _version);
+
+	_score->loadFrames(*r, _version);
 	delete r;
 
 	// Action list
-	if (_movieArchive->hasResource(MKTAG('V', 'W', 'A', 'C'), -1)) {
-		_score->loadActions(*(r = _movieArchive->getFirstResource(MKTAG('V', 'W', 'A', 'C'))));
+	if (r = _movieArchive->getMovieResourceIfPresent(MKTAG('V', 'W', 'A', 'C'))) {
+		_score->loadActions(*r);
 		delete r;
 	}
 




More information about the Scummvm-git-logs mailing list