[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