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

sev- sev at scummvm.org
Tue Jul 28 18:45:08 UTC 2020


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:
d543293ca0 DIRECTOR: Always run projector detector for the main movie


Commit: d543293ca0c3094f17bd984a4bf66fd5e0a6d6b1
    https://github.com/scummvm/scummvm/commit/d543293ca0c3094f17bd984a4bf66fd5e0a6d6b1
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2020-07-28T20:44:49+02:00

Commit Message:
DIRECTOR: Always run projector detector for the main movie

Changed paths:
    engines/director/resource.cpp
    engines/director/stage.h


diff --git a/engines/director/resource.cpp b/engines/director/resource.cpp
index 5970d3a405..48ac3e72e1 100644
--- a/engines/director/resource.cpp
+++ b/engines/director/resource.cpp
@@ -57,6 +57,8 @@ Common::Error Stage::loadInitialMovie() {
 	debug(0, "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n");
 	Common::String movie = (_vm->getGameGID() == GID_TESTALL) ? getNextMovieFromQueue().movie : _vm->getEXEName();
 
+	probeProjector(movie);
+
 	if (g_director->getPlatform() == Common::kPlatformWindows)
 		loadEXE(movie);
 	else
@@ -71,15 +73,33 @@ Common::Error Stage::loadInitialMovie() {
 	_currentPath = getPath(movie, _currentPath);
 	_currentMovie->loadSharedCastsFrom(_currentPath + g_director->_sharedCastFile);
 
+	if (_currentMovie)
+		_currentMovie->setArchive(_mainArchive);
+
+	return Common::kNoError;
+}
+
+void Stage::probeProjector(const Common::String &movie) {
+	if (g_director->getPlatform() == Common::kPlatformWindows)
+		return;
+
+	Director::MacArchive *archive = new MacArchive();
+
+	if (!archive->openFile(movie)) {
+		delete archive;
+
+		return;
+	}
+
 	// Let's check if it is a projector file
 	// So far tested with Spaceship Warlock, D2
-	if (_mainArchive->hasResource(MKTAG('B', 'N', 'D', 'L'), "Projector")) {
+	if (archive->hasResource(MKTAG('B', 'N', 'D', 'L'), "Projector")) {
 		warning("Detected Projector file");
 
-		if (_mainArchive->hasResource(MKTAG('v', 'e', 'r', 's'), -1)) {
-			Common::Array<uint16> vers = _mainArchive->getResourceIDList(MKTAG('v', 'e', 'r', 's'));
+		if (archive->hasResource(MKTAG('v', 'e', 'r', 's'), -1)) {
+			Common::Array<uint16> vers = archive->getResourceIDList(MKTAG('v', 'e', 'r', 's'));
 			for (Common::Array<uint16>::iterator iterator = vers.begin(); iterator != vers.end(); ++iterator) {
-				Common::SeekableSubReadStreamEndian *vvers = _mainArchive->getResource(MKTAG('v', 'e', 'r', 's'), *iterator);
+				Common::SeekableSubReadStreamEndian *vvers = archive->getResource(MKTAG('v', 'e', 'r', 's'), *iterator);
 				Common::MacResManager::MacVers *v = Common::MacResManager::parseVers(vvers);
 
 				debug(0, "Detected vers %d.%d %s.%d region %d '%s' '%s'", v->majorVer, v->minorVer, v->devStr.c_str(),
@@ -89,19 +109,20 @@ Common::Error Stage::loadInitialMovie() {
 			}
 		}
 
-		if (_mainArchive->hasResource(MKTAG('X', 'C', 'O', 'D'), -1)) {
-			Common::Array<uint16> xcod = _mainArchive->getResourceIDList(MKTAG('X', 'C', 'O', 'D'));
+		if (archive->hasResource(MKTAG('X', 'C', 'O', 'D'), -1)) {
+			Common::Array<uint16> xcod = archive->getResourceIDList(MKTAG('X', 'C', 'O', 'D'));
 			for (Common::Array<uint16>::iterator iterator = xcod.begin(); iterator != xcod.end(); ++iterator) {
-				Resource res = _mainArchive->getResourceDetail(MKTAG('X', 'C', 'O', 'D'), *iterator);
+				Resource res = archive->getResourceDetail(MKTAG('X', 'C', 'O', 'D'), *iterator);
 				debug(0, "Detected XObject '%s'", res.name.c_str());
 				g_lingo->openXLib(res.name, kXObj);
 			}
 		}
 
-		if (_mainArchive->hasResource(MKTAG('S', 'T', 'R', '#'), 0)) {
-			_currentMovie->setArchive(_mainArchive);
+		if (archive->hasResource(MKTAG('S', 'T', 'R', '#'), 0)) {
+			if (_currentMovie)
+				_currentMovie->setArchive(archive);
 
-			Common::SeekableSubReadStreamEndian *name = _mainArchive->getResource(MKTAG('S', 'T', 'R', '#'), 0);
+			Common::SeekableSubReadStreamEndian *name = archive->getResource(MKTAG('S', 'T', 'R', '#'), 0);
 			int num = name->readUint16();
 			if (num != 1) {
 				warning("Incorrect number of strings in Projector file");
@@ -122,10 +143,7 @@ Common::Error Stage::loadInitialMovie() {
 		}
 	}
 
-	if (_currentMovie)
-		_currentMovie->setArchive(_mainArchive);
-
-	return Common::kNoError;
+	delete archive;
 }
 
 Archive *Stage::openMainArchive(const Common::String movie) {
diff --git a/engines/director/stage.h b/engines/director/stage.h
index 3b02326eca..5e42c3afec 100644
--- a/engines/director/stage.h
+++ b/engines/director/stage.h
@@ -134,6 +134,7 @@ class Stage : public Graphics::MacWindow, public Object<Stage> {
 
 	// resource.cpp
 	Common::Error loadInitialMovie();
+	void probeProjector(const Common::String &movie);
 	Archive *openMainArchive(const Common::String movie);
 	void loadEXE(const Common::String movie);
 	void loadEXEv3(Common::SeekableReadStream *stream);




More information about the Scummvm-git-logs mailing list