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

elasota noreply at scummvm.org
Thu Sep 1 05:50:04 UTC 2022


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

Summary:
97bff6115e MTROPOLIS: Handle 8-bit mToon vertical displacement flag correctly
e082187093 MTROPOLIS: Add some handling for MTI data.


Commit: 97bff6115ead19f7c1657ad9392d933bb4c50222
    https://github.com/scummvm/scummvm/commit/97bff6115ead19f7c1657ad9392d933bb4c50222
Author: elasota (ejlasota at gmail.com)
Date: 2022-09-01T01:48:41-04:00

Commit Message:
MTROPOLIS: Handle 8-bit mToon vertical displacement flag correctly

Changed paths:
    engines/mtropolis/assets.cpp


diff --git a/engines/mtropolis/assets.cpp b/engines/mtropolis/assets.cpp
index dd5d1658b36..2ae84cc8417 100644
--- a/engines/mtropolis/assets.cpp
+++ b/engines/mtropolis/assets.cpp
@@ -304,7 +304,7 @@ void CachedMToon::decompressRLEFrameToImage(size_t frameIndex, Graphics::Surface
 	} else if (_rleOptimizedFormat.bytesPerPixel == 2) {
 		decompressedOK = decompressMToonRLE<uint16, 0x8000u, 0x8000u>(_rleData[frameIndex], _rleData[frameIndex].data16, surface, isBottomUp);
 	} else if (_rleOptimizedFormat.bytesPerPixel == 1) {
-		decompressedOK = decompressMToonRLE<uint8, 0x80u, 0u>(_rleData[frameIndex], _rleData[frameIndex].data8, surface, isBottomUp);
+		decompressedOK = decompressMToonRLE<uint8, 0x80u, 0x80u>(_rleData[frameIndex], _rleData[frameIndex].data8, surface, isBottomUp);
 	} else
 		error("Unknown mToon encoding");
 


Commit: e0821870931ad160b01e69eb7a435f1fd3bd012e
    https://github.com/scummvm/scummvm/commit/e0821870931ad160b01e69eb7a435f1fd3bd012e
Author: elasota (ejlasota at gmail.com)
Date: 2022-09-01T01:48:41-04:00

Commit Message:
MTROPOLIS: Add some handling for MTI data.

Changed paths:
    engines/mtropolis/boot.cpp
    engines/mtropolis/boot.h
    engines/mtropolis/data.cpp
    engines/mtropolis/data.h
    engines/mtropolis/mtropolis.cpp
    engines/mtropolis/plugin/standard_data.cpp
    engines/mtropolis/runtime.cpp


diff --git a/engines/mtropolis/boot.cpp b/engines/mtropolis/boot.cpp
index e92cf526049..cce214baa43 100644
--- a/engines/mtropolis/boot.cpp
+++ b/engines/mtropolis/boot.cpp
@@ -816,6 +816,7 @@ Common::SharedPtr<ProjectDescription> bootProject(const MTropolisGameDescription
 				case MKTAG('.', 'c', '9', '5'):
 				case MKTAG('.', 'e', '9', '5'):
 				case MKTAG('.', 'r', '9', '5'):
+				case MKTAG('.', 'x', '9', '5'):
 					winFile.category = MTFT_EXTENSION;
 					break;
 
@@ -943,4 +944,19 @@ Common::SharedPtr<ProjectDescription> bootProject(const MTropolisGameDescription
 	return desc;
 }
 
+void bootAddSearchPaths(const Common::FSNode &gameDataDir, const MTropolisGameDescription &gameDesc) {
+
+	if (gameDesc.gameID == GID_OBSIDIAN && gameDesc.desc.platform == Common::kPlatformWindows) {
+		SearchMan.addSubDirectoryMatching(gameDataDir, "Obsidian");
+		SearchMan.addSubDirectoryMatching(gameDataDir, "Obsidian/RESOURCE");
+		SearchMan.addSubDirectoryMatching(gameDataDir, "RESOURCE");
+	}
+
+	if (gameDesc.gameID == GID_MTI && gameDesc.desc.platform == Common::kPlatformWindows) {
+		SearchMan.addSubDirectoryMatching(gameDataDir, "MTPLAY32");
+		SearchMan.addSubDirectoryMatching(gameDataDir, "MTPLAY32/RESOURCE");
+		SearchMan.addSubDirectoryMatching(gameDataDir, "VIDEO");
+	}
+}
+
 } // End of namespace MTropolis
diff --git a/engines/mtropolis/boot.h b/engines/mtropolis/boot.h
index 6b664376dd1..5cb721a76ee 100644
--- a/engines/mtropolis/boot.h
+++ b/engines/mtropolis/boot.h
@@ -24,12 +24,19 @@
 
 #include "common/ptr.h"
 
+namespace Common {
+
+class FSNode;
+
+} // End of namespace Common
+
 namespace MTropolis {
 
 struct MTropolisGameDescription;
 class ProjectDescription;
 
 Common::SharedPtr<ProjectDescription> bootProject(const MTropolisGameDescription &gameDesc);
+void bootAddSearchPaths(const Common::FSNode &gameDataDir, const MTropolisGameDescription &gameDesc);
 
 } // End of namespace MTropolis
 
diff --git a/engines/mtropolis/data.cpp b/engines/mtropolis/data.cpp
index d79dd665a4a..869ab9d99b8 100644
--- a/engines/mtropolis/data.cpp
+++ b/engines/mtropolis/data.cpp
@@ -702,16 +702,21 @@ DataReadErrorCode PresentationSettings::load(DataReader &reader) {
 	return kDataReadErrorNone;
 }
 
-AssetCatalog::AssetInfo::AssetInfo() : flags1(0), nameLength(0), alwaysZero(0), unknown1(0), filePosition(0), assetType(0), flags2(0) {
+AssetCatalog::AssetInfoRev4Fields::AssetInfoRev4Fields() : assetType(0), flags2(0) {
 }
 
-AssetCatalog::AssetCatalog() : persistFlags(0), totalNameSizePlus22(0), unknown1{0, 0, 0, 0}, numAssets(0) {
+AssetCatalog::AssetInfo::AssetInfo() : flags1(0), nameLength(0), alwaysZero(0), unknown1(0), filePosition(0) {
+}
+
+AssetCatalog::AssetCatalog() : persistFlags(0), totalNameSizePlus22(0), unknown1{0, 0, 0, 0}, numAssets(0), haveRev4Fields(false) {
 }
 
 DataReadErrorCode AssetCatalog::load(DataReader& reader) {
-	if (_revision != 4)
+	if (_revision != 2 && _revision != 4)
 		return kDataReadErrorUnsupportedRevision;
 
+	haveRev4Fields = (_revision >= 4);
+
 	if (!reader.readU32(persistFlags) ||
 		!reader.readU32(totalNameSizePlus22) ||
 		!reader.readBytes(unknown1) ||
@@ -722,9 +727,14 @@ DataReadErrorCode AssetCatalog::load(DataReader& reader) {
 
 	for (size_t i = 0; i < numAssets; i++) {
 		AssetInfo &asset = assets[i];
-		if (!reader.readU32(asset.flags1) || !reader.readU16(asset.nameLength) || !reader.readU16(asset.alwaysZero) || !reader.readU32(asset.unknown1) || !reader.readU32(asset.filePosition) || !reader.readU32(asset.assetType) || !reader.readU32(asset.flags2))
+		if (!reader.readU32(asset.flags1) || !reader.readU16(asset.nameLength) || !reader.readU16(asset.alwaysZero) || !reader.readU32(asset.unknown1) || !reader.readU32(asset.filePosition))
 			return kDataReadErrorReadFailed;
 
+		if (_revision >= 4) {
+			if (!reader.readU32(asset.rev4Fields.assetType) || !reader.readU32(asset.rev4Fields.flags2))
+				return kDataReadErrorReadFailed;
+		}
+
 		if (!reader.readTerminatedStr(asset.name, asset.nameLength))
 			return kDataReadErrorReadFailed;
 	}
diff --git a/engines/mtropolis/data.h b/engines/mtropolis/data.h
index 4fa246b4095..e2ebc4848b9 100644
--- a/engines/mtropolis/data.h
+++ b/engines/mtropolis/data.h
@@ -467,6 +467,13 @@ struct AssetCatalog : public DataObject {
 		kFlag1LimitOnePerSegment = 2,
 	};
 
+	struct AssetInfoRev4Fields {
+		AssetInfoRev4Fields();
+
+		uint32 assetType;
+		uint32 flags2;
+	};
+
 	struct AssetInfo {
 		AssetInfo();
 
@@ -475,8 +482,9 @@ struct AssetCatalog : public DataObject {
 		uint16 alwaysZero;
 		uint32 unknown1;	 // Possibly scene ID
 		uint32 filePosition; // Contains a static value in Obsidian
-		uint32 assetType;
-		uint32 flags2;
+
+		AssetInfoRev4Fields rev4Fields;
+
 		Common::String name;
 	};
 
@@ -486,6 +494,8 @@ struct AssetCatalog : public DataObject {
 	uint32 totalNameSizePlus22;
 	uint8 unknown1[4];
 	uint32 numAssets;
+	bool haveRev4Fields;
+
 	Common::Array<AssetInfo> assets;
 
 protected:
diff --git a/engines/mtropolis/mtropolis.cpp b/engines/mtropolis/mtropolis.cpp
index 12042fdce41..b8a4544759a 100644
--- a/engines/mtropolis/mtropolis.cpp
+++ b/engines/mtropolis/mtropolis.cpp
@@ -54,11 +54,7 @@ MTropolisEngine::MTropolisEngine(OSystem *syst, const MTropolisGameDescription *
 	const Common::FSNode gameDataDir(ConfMan.get("path"));
 	SearchMan.addSubDirectoryMatching(gameDataDir, "Resource");
 
-	if (gameDesc->gameID == GID_OBSIDIAN && _gameDescription->desc.platform == Common::kPlatformWindows) {
-		SearchMan.addSubDirectoryMatching(gameDataDir, "Obsidian");
-		SearchMan.addSubDirectoryMatching(gameDataDir, "Obsidian/RESOURCE");
-		SearchMan.addSubDirectoryMatching(gameDataDir, "RESOURCE");
-	}
+	bootAddSearchPaths(gameDataDir, *gameDesc);
 }
 
 MTropolisEngine::~MTropolisEngine() {
diff --git a/engines/mtropolis/plugin/standard_data.cpp b/engines/mtropolis/plugin/standard_data.cpp
index 743e2f5e8a6..751aacd8f4a 100644
--- a/engines/mtropolis/plugin/standard_data.cpp
+++ b/engines/mtropolis/plugin/standard_data.cpp
@@ -74,17 +74,26 @@ DataReadErrorCode MediaCueMessengerModifier::load(PlugIn &plugIn, const PlugInMo
 }
 
 DataReadErrorCode ObjectReferenceVariableModifier::load(PlugIn &plugIn, const PlugInModifier &prefix, DataReader &reader) {
-	if (prefix.plugInRevision != 2)
+	if (prefix.plugInRevision != 0 && prefix.plugInRevision != 2)
 		return kDataReadErrorUnsupportedRevision;
 
-	if (!setToSourceParentWhen.load(reader) || !unknown1.load(reader))
+	if (!setToSourceParentWhen.load(reader))
 		return kDataReadErrorReadFailed;
 
-	bool hasNoPath = (unknown1.type == Data::PlugInTypeTaggedValue::kInteger && unknown1.value.asInt == 0);
-	if (hasNoPath)
-		objectPath.type = Data::PlugInTypeTaggedValue::kNull;
-	else if (!objectPath.load(reader))
-		return kDataReadErrorReadFailed;
+	if (prefix.plugInRevision == 0) {
+		unknown1.type = Data::PlugInTypeTaggedValue::kNull;
+		if (!objectPath.load(reader))
+			return kDataReadErrorReadFailed;
+	} else {
+		if (!unknown1.load(reader))
+			return kDataReadErrorReadFailed;
+
+		bool hasNoPath = (unknown1.type == Data::PlugInTypeTaggedValue::kInteger && unknown1.value.asInt == 0);
+		if (hasNoPath)
+			objectPath.type = Data::PlugInTypeTaggedValue::kNull;
+		else if (!objectPath.load(reader))
+			return kDataReadErrorReadFailed;
+	}
 
 	return kDataReadErrorNone;
 }
diff --git a/engines/mtropolis/runtime.cpp b/engines/mtropolis/runtime.cpp
index da32e8794c0..37ea9f3affd 100644
--- a/engines/mtropolis/runtime.cpp
+++ b/engines/mtropolis/runtime.cpp
@@ -6720,7 +6720,7 @@ const SubtitleTables &Project::getSubtitles() const {
 
 void Project::loadPresentationSettings(const Data::PresentationSettings &presentationSettings) {
 	_presentationSettings.bitsPerPixel = presentationSettings.bitsPerPixel;
-	if (_presentationSettings.bitsPerPixel != 16) {
+	if (_presentationSettings.bitsPerPixel != 8 && _presentationSettings.bitsPerPixel != 16) {
 		error("Unsupported bit depth");
 	}
 	_presentationSettings.width = presentationSettings.dimensions.x;
@@ -6754,7 +6754,11 @@ void Project::loadAssetCatalog(const Data::AssetCatalog &assetCatalog) {
 
 			assetDesc.id = i + 1;
 			assetDesc.name = assetInfo.name;
-			assetDesc.typeCode = assetInfo.assetType;
+
+			if (assetCatalog.haveRev4Fields)
+				assetDesc.typeCode = assetInfo.rev4Fields.assetType;
+			else
+				assetDesc.typeCode = 0;
 
 			_assetsByID[assetDesc.id] = &assetDesc;
 			if (!assetDesc.name.empty())




More information about the Scummvm-git-logs mailing list