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

elasota noreply at scummvm.org
Tue Jun 13 04:44:49 UTC 2023


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:
b683bf7b7a MTROPOLIS: Add hack to fix failed integrity check when disembarking the Hispaniola


Commit: b683bf7b7aeafed06966924e153a7da4b62ae7b0
    https://github.com/scummvm/scummvm/commit/b683bf7b7aeafed06966924e153a7da4b62ae7b0
Author: elasota (ejlasota at gmail.com)
Date: 2023-06-13T00:44:23-04:00

Commit Message:
MTROPOLIS: Add hack to fix failed integrity check when disembarking the Hispaniola

Changed paths:
    engines/mtropolis/assets.h
    engines/mtropolis/data.cpp
    engines/mtropolis/data.h
    engines/mtropolis/elements.cpp
    engines/mtropolis/hacks.cpp
    engines/mtropolis/hacks.h
    engines/mtropolis/modifiers.cpp
    engines/mtropolis/runtime.cpp


diff --git a/engines/mtropolis/assets.h b/engines/mtropolis/assets.h
index 85e17331eb3..a18b0f0f27d 100644
--- a/engines/mtropolis/assets.h
+++ b/engines/mtropolis/assets.h
@@ -59,14 +59,6 @@ private:
 	Common::Array<uint8> _data;
 };
 
-namespace MToonHackFlags {
-
-enum MToonHackFlag {
-	kMTIHispaniolaMPZHack = 1,
-};
-
-} // End of namespace MToonHackFlags
-
 struct MToonMetadata {
 	enum ImageFormat {
 		kImageFormatMac,
diff --git a/engines/mtropolis/data.cpp b/engines/mtropolis/data.cpp
index aebe8d02650..64bf22ccda5 100644
--- a/engines/mtropolis/data.cpp
+++ b/engines/mtropolis/data.cpp
@@ -154,7 +154,7 @@ bool isAsset(DataObjectType type) {
 } // End of namespace DataObjectTypes
 
 DataReader::DataReader(int64 globalPosition, Common::SeekableReadStreamEndian &stream, ProjectFormat projectFormat)
-	: _globalPosition(globalPosition), _stream(stream), _projectFormat(projectFormat) {
+	: _globalPosition(globalPosition), _stream(stream), _projectFormat(projectFormat), _permitDamagedStrings(false) {
 }
 
 bool DataReader::readU8(uint8 &value) {
@@ -249,7 +249,10 @@ bool DataReader::readTerminatedStr(Common::String& value, size_t size) {
 			return false;
 		}
 		if (strChars[size - 1] != 0) {
-			return false;
+			if (_permitDamagedStrings)
+				strChars[size - 1] = 0;
+			else
+				return false;
 		}
 		value = Common::String(&strChars[0], size - 1);
 	} else {
@@ -300,6 +303,10 @@ bool DataReader::isBigEndian() const {
 	return _stream.isBE();
 }
 
+void DataReader::setPermitDamagedStrings(bool permit) {
+	_permitDamagedStrings = permit;
+}
+
 bool DataReader::checkErrorAndReset() {
 	const bool isFault = _stream.err() || _stream.eos();
 	if (isFault) {
diff --git a/engines/mtropolis/data.h b/engines/mtropolis/data.h
index e6e6303e1b7..05a0431607b 100644
--- a/engines/mtropolis/data.h
+++ b/engines/mtropolis/data.h
@@ -208,12 +208,16 @@ public:
 	ProjectFormat getProjectFormat() const;
 	bool isBigEndian() const;
 
+	void setPermitDamagedStrings(bool permit);
+
 private:
 	bool checkErrorAndReset();
 
 	Common::SeekableReadStreamEndian &_stream;
 	ProjectFormat _projectFormat;
 	int64 _globalPosition;
+
+	bool _permitDamagedStrings;
 };
 
 struct Rect {
diff --git a/engines/mtropolis/elements.cpp b/engines/mtropolis/elements.cpp
index 7a3a477ddc3..8a8be4ffa9b 100644
--- a/engines/mtropolis/elements.cpp
+++ b/engines/mtropolis/elements.cpp
@@ -1347,9 +1347,6 @@ void MToonElement::activate() {
 	}
 
 	uint hackFlags = 0;
-	if (getRuntime()->getHacks().mtiHispaniolaMToonHack && project->getAssetNameByID(_assetID) == "G00_HispaniolaMPZ.TUN") {
-		hackFlags |= MToonHackFlags::kMTIHispaniolaMPZHack;
-	}
 
 	_cachedMToon = static_cast<MToonAsset *>(asset.get())->loadAndCacheMToon(getRuntime(), hackFlags);
 	_metadata = _cachedMToon->getMetadata();
diff --git a/engines/mtropolis/hacks.cpp b/engines/mtropolis/hacks.cpp
index 751d484934f..ef7609d1a3a 100644
--- a/engines/mtropolis/hacks.cpp
+++ b/engines/mtropolis/hacks.cpp
@@ -44,7 +44,7 @@ Hacks::Hacks() {
 	allowAssetsFromOtherScenes = false;
 	mtiVariableReferencesHack = false;
 	mtiSceneReturnHack = false;
-	mtiHispaniolaMToonHack = false;
+	mtiHispaniolaDamagedStringHack = false;
 }
 
 Hacks::~Hacks() {
@@ -1056,9 +1056,9 @@ void addMTIQuirks(const MTropolisGameDescription &desc, Hacks &hacks) {
 	// This doesn't work because the modifier is gone when the scene is unloaded.
 	hacks.mtiSceneReturnHack = true;
 
-	// Weird rendering bug in the MTZ-1000 Hispaniola mToon, it has a skip code that would normally skip 127 rows but
-	// doing that causes a big hole in the image.
-	hacks.mtiHispaniolaMToonHack = true;
+	// Modifier "Scene Started => helmSteered? => Play Character, else Play Char" has a non-null-terminated name,
+	// which causes an integrity check failure when disembarking the Hispaniola.
+	hacks.mtiHispaniolaDamagedStringHack = true;
 }
 
 } // End of namespace HackSuites
diff --git a/engines/mtropolis/hacks.h b/engines/mtropolis/hacks.h
index 743c0a32f7d..025889f8b20 100644
--- a/engines/mtropolis/hacks.h
+++ b/engines/mtropolis/hacks.h
@@ -54,7 +54,7 @@ struct Hacks {
 	bool allowAssetsFromOtherScenes;
 	bool mtiVariableReferencesHack;
 	bool mtiSceneReturnHack;
-	bool mtiHispaniolaMToonHack;
+	bool mtiHispaniolaDamagedStringHack;
 
 	uint midiVolumeScale;	// 256 = 1.0
 
diff --git a/engines/mtropolis/modifiers.cpp b/engines/mtropolis/modifiers.cpp
index cc92919274e..bf156a209ea 100644
--- a/engines/mtropolis/modifiers.cpp
+++ b/engines/mtropolis/modifiers.cpp
@@ -2824,7 +2824,6 @@ CompoundVariableModifier::SaveLoad::SaveLoad(Runtime *runtime, CompoundVariableM
 				break;
 			}
 		}
-
 	}
 
 	for (const Common::SharedPtr<Modifier> &child : modifier->_children) {
diff --git a/engines/mtropolis/runtime.cpp b/engines/mtropolis/runtime.cpp
index 4c4fb84a85f..67187f91e39 100644
--- a/engines/mtropolis/runtime.cpp
+++ b/engines/mtropolis/runtime.cpp
@@ -7046,6 +7046,9 @@ void Project::loadSceneFromStream(const Common::SharedPtr<Structural> &scene, ui
 	Common::SeekableSubReadStreamEndian stream(_segments[segmentIndex].weakStream, streamDesc.pos, streamDesc.pos + streamDesc.size, _isBigEndian);
 	Data::DataReader reader(streamDesc.pos, stream, _projectFormat);
 
+	if (getRuntime()->getHacks().mtiHispaniolaDamagedStringHack && scene->getName() == "C01b : Main Deck Helm Kidnap")
+		reader.setPermitDamagedStrings(true);
+
 	const Data::PlugInModifierRegistry &plugInDataLoaderRegistry = _plugInRegistry.getDataLoaderRegistry();
 
 	{




More information about the Scummvm-git-logs mailing list