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

elasota noreply at scummvm.org
Thu Apr 17 03:18:13 UTC 2025


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

Summary:
7fa59cdd9a MTROPOLIS: add three titles to detection, add required modifiers
ecab733886 JANITORIAL: MTROPOLIS: correct namespace end comment


Commit: 7fa59cdd9a9b8458fe836ddd100e68cbfc2e3aaf
    https://github.com/scummvm/scummvm/commit/7fa59cdd9a9b8458fe836ddd100e68cbfc2e3aaf
Author: Michael (michael_kuerbis at web.de)
Date: 2025-04-16T23:18:08-04:00

Commit Message:
MTROPOLIS: add three titles to detection, add required modifiers

New titles:
An Odyssey Of Discovery: Living Science
The Facts about Genes & our Food: A Compendium
Unlock the Secrets: Shadow Warrior

Plugin Modifiers:
Thereware: HotText, KeyScroll
Standard (Extras): openApp
Pierian: WasteMod, SaveFileMod, FlattenMod

Changed paths:
  A engines/mtropolis/plugin/pierian.cpp
  A engines/mtropolis/plugin/pierian.h
  A engines/mtropolis/plugin/pierian_data.cpp
  A engines/mtropolis/plugin/pierian_data.h
    engines/mtropolis/boot.cpp
    engines/mtropolis/detection.cpp
    engines/mtropolis/detection.h
    engines/mtropolis/detection_tables.h
    engines/mtropolis/module.mk
    engines/mtropolis/plugin/standard.cpp
    engines/mtropolis/plugin/standard.h
    engines/mtropolis/plugin/standard_data.cpp
    engines/mtropolis/plugin/standard_data.h
    engines/mtropolis/plugin/thereware.cpp
    engines/mtropolis/plugin/thereware.h
    engines/mtropolis/plugin/thereware_data.cpp
    engines/mtropolis/plugin/thereware_data.h
    engines/mtropolis/plugins.h


diff --git a/engines/mtropolis/boot.cpp b/engines/mtropolis/boot.cpp
index 41fd3e959da..5979d4c8ec2 100644
--- a/engines/mtropolis/boot.cpp
+++ b/engines/mtropolis/boot.cpp
@@ -1089,6 +1089,7 @@ public:
 		kPlugInHoologic,
 		kPlugInMLine,
 		kPlugInThereware,
+		kPlugInPierian,
 	};
 
 	enum BitDepth {
@@ -1152,6 +1153,8 @@ public:
 	void bootHerculesWin();
 	void bootMindGymWin();
 	void bootStarTrekWin();
+	void bootODLivingWin();
+	void bootOTSSWWin();
 
 
 	void bootGeneric();
@@ -1656,6 +1659,19 @@ void BootScriptContext::bootStarTrekWin() {
 	setRuntimeVersion(RuntimeVersion::kRuntimeVersion112);
 }
 
+void BootScriptContext::bootODLivingWin() {
+	addPlugIn(kPlugInStandard);
+	addPlugIn(kPlugInPierian);
+	// Force V112 mode for PlugInModifier::load
+	// Autodetected V100 causes error there
+	setRuntimeVersion(RuntimeVersion::kRuntimeVersion112);
+}
+
+void BootScriptContext::bootOTSSWWin() {
+	addPlugIn(kPlugInStandard);
+	addPlugIn(kPlugInThereware);
+}
+
 void BootScriptContext::bootGeneric() {
 	addPlugIn(kPlugInStandard);
 }
@@ -1721,7 +1737,8 @@ void BootScriptContext::executeFunction(const Common::String &functionName, cons
 									  ENUM_BINDING(kPlugInAxLogic),
 									  ENUM_BINDING(kPlugInHoologic),
 									  ENUM_BINDING(kPlugInMLine),
-									  ENUM_BINDING(kPlugInThereware),};
+									  ENUM_BINDING(kPlugInThereware),
+									  ENUM_BINDING(kPlugInPierian),};
 
 	const EnumBinding bitDepthEnum[] = {ENUM_BINDING(kBitDepthAuto),
 										ENUM_BINDING(kBitDepth8),
@@ -2345,6 +2362,21 @@ const Game games[] = {
 		MTBOOT_BYZANTINE_DEMO_WIN_EN,
 		&BootScriptContext::bootGeneric
 	},
+	// An Odyssey Of Discovery: Living Science - Windows - English
+	{
+		MTBOOT_OD_LIVING_WIN_EN,
+	 &BootScriptContext::bootODLivingWin
+	},
+	// The Facts about Genes & our Food: A Compendium - Windows - English
+	{
+		MTBOOT_FOODGENES_WIN_EN,
+	 &BootScriptContext::bootGeneric
+	},
+	// Unlock the Secrets: Shadow Warrior - Windows - English
+	{
+		MTBOOT_UTS_SHADOW_WARRIOR_WIN_EN,
+	 &BootScriptContext::bootOTSSWWin
+	},
 };
 
 } // End of namespace Games
@@ -2408,6 +2440,11 @@ Common::SharedPtr<MTropolis::PlugIn> loadTherewarePlugIn(const MTropolisGameDesc
 	return twPlugIn;
 }
 
+Common::SharedPtr<MTropolis::PlugIn> loadPierianPlugIn(const MTropolisGameDescription &gameDesc) {
+	Common::SharedPtr<MTropolis::PlugIn> pPlugIn(PlugIns::createPierian());
+	return pPlugIn;
+}
+
 enum PlayerType {
 	kPlayerTypeNone,
 
@@ -3302,6 +3339,9 @@ BootConfiguration bootProject(const MTropolisGameDescription &gameDesc) {
 		case Boot::BootScriptContext::kPlugInThereware:
 			plugIns.push_back(Boot::loadTherewarePlugIn(gameDesc));
 			break;
+		case Boot::BootScriptContext::kPlugInPierian:
+			plugIns.push_back(Boot::loadPierianPlugIn(gameDesc));
+			break;
 		default:
 			error("Unknown plug-in ID");
 		}
diff --git a/engines/mtropolis/detection.cpp b/engines/mtropolis/detection.cpp
index d566383eac7..cb8bc88c250 100644
--- a/engines/mtropolis/detection.cpp
+++ b/engines/mtropolis/detection.cpp
@@ -81,6 +81,9 @@ static const PlainGameDescriptor mTropolisGames[] = {
 	{"c9sampler", "Cloud 9 CD Sampler Volume 2"},
 	{"adobe24", "Adobe 24 Hours Tools Sampler"},
 	{"byzantine", "Byzantine: The Betrayal"},
+	{"od_living_science", "An Odyssey of Discovery: Living Science"},
+	{"food_genes_compendium", "The Facts about Genes and our Food - A Compendium"},
+	{"uts_shadow_warrior", "Unlock the Secrets: Shadow Warrior"},
 
 
 	{"mtropolis", "mTropolis Title"},
diff --git a/engines/mtropolis/detection.h b/engines/mtropolis/detection.h
index 8bf32f05e38..4cba61805c3 100644
--- a/engines/mtropolis/detection.h
+++ b/engines/mtropolis/detection.h
@@ -84,6 +84,9 @@ enum MTropolisGameID {
 	GID_C9SAMPLER			= 51,
 	GID_ADOBE24				= 52,
 	GID_BYZANTINE			= 53,
+	GID_OD_LIVINGSCIENCE	= 54,
+	GID_FOOD_GENES_COMPENDIUM = 55,
+	GID_UTS_SHADOWWARRIOR	= 56,
 
 	GID_GENERIC				= 99,
 };
@@ -192,6 +195,9 @@ enum MTropolisGameBootID {
 	MTBOOT_C9SAMPLER_WIN_EN,
 	MTBOOT_ADOBE24_WIN_EN,
 	MTBOOT_BYZANTINE_DEMO_WIN_EN,
+	MTBOOT_OD_LIVING_WIN_EN,
+	MTBOOT_FOODGENES_WIN_EN,
+	MTBOOT_UTS_SHADOW_WARRIOR_WIN_EN,
 };
 
 enum MTGameFlag {
diff --git a/engines/mtropolis/detection_tables.h b/engines/mtropolis/detection_tables.h
index 9002d527069..fefb2b148b5 100644
--- a/engines/mtropolis/detection_tables.h
+++ b/engines/mtropolis/detection_tables.h
@@ -2163,6 +2163,66 @@ static const MTropolisGameDescription gameDescriptions[] = {
 		MTBOOT_BYZANTINE_DEMO_WIN_EN,
 	},
 
+	{ // An Odyssey Of Discovery: Living Science (English, Windows)
+	  // Published by Pierian Spring Software, 19981997
+		{
+			"od_living_science",
+			MetaEngineDetection::GAME_NOT_IMPLEMENTED,
+			{
+				{ "LS95.EXE", 0, "0e513dac9d2a0d7cfcdc670cab2a9bda", 757760 },
+				{ "DATA.MPL", 0, "e097668f2befa4b249968f125e3c19b3", 27787067 },
+				AD_LISTEND
+			},
+			Common::EN_ANY,
+			Common::kPlatformWindows,
+			ADGF_UNSUPPORTED,
+			GUIO0()
+		},
+		GID_OD_LIVINGSCIENCE,
+		0,
+		MTBOOT_OD_LIVING_WIN_EN,
+	},
+
+	{ // The Facts about Genes & our Food: A Compendium (English, Windows)
+	  // Published by GENIUS Biotechnology GmbH, 1999
+		{
+			"food_genes_compendium",
+			MetaEngineDetection::GAME_NOT_IMPLEMENTED,
+			{
+				{ "Compendium.EXE", 0, "ed776bfe63d17a7d57d9625c3efe5a0a", 1085952 },
+				{ "st.mfw", 0, "66a26a2cf461b32a670114e293818ff3", 2287085 },
+				AD_LISTEND
+			},
+			Common::EN_ANY,
+			Common::kPlatformWindows,
+			ADGF_UNSTABLE,
+			GUIO0()
+		},
+		GID_FOOD_GENES_COMPENDIUM,
+		0,
+		MTBOOT_FOODGENES_WIN_EN,
+	},
+
+	{ // Unlock the Secrets: Shadow Warrior (English, Windows)
+	  // Published by  WizardWorks Group Inc., 1997
+		{
+			"uts_shadow_warrior",
+			MetaEngineDetection::GAME_NOT_IMPLEMENTED,
+			{
+				{ "GWPLAY95.EXE", 0, "0e513dac9d2a0d7cfcdc670cab2a9bda", 757760 },
+				{ "GW_SW.MPL", 0, "9064c6271d0b83a408cdffadbb0602ec", 38120214 },
+				AD_LISTEND
+			},
+			Common::EN_ANY,
+			Common::kPlatformWindows,
+			ADGF_UNSUPPORTED,
+			GUIO0()
+		},
+		GID_UTS_SHADOWWARRIOR,
+		0,
+		MTBOOT_UTS_SHADOW_WARRIOR_WIN_EN,
+	},
+
 	{ AD_TABLE_END_MARKER, 0, 0, MTBOOT_INVALID }
 };
 
diff --git a/engines/mtropolis/module.mk b/engines/mtropolis/module.mk
index 279cda7c227..32bf8ddf1b8 100644
--- a/engines/mtropolis/module.mk
+++ b/engines/mtropolis/module.mk
@@ -35,6 +35,8 @@ MODULE_OBJS = \
 	plugin/mti_data.o \
 	plugin/obsidian.o \
 	plugin/obsidian_data.o \
+	plugin/pierian.o \
+	plugin/pierian_data.o \
 	plugin/rwc.o \
 	plugin/rwc_data.o \
 	plugin/standard.o \
diff --git a/engines/mtropolis/plugin/pierian.cpp b/engines/mtropolis/plugin/pierian.cpp
new file mode 100644
index 00000000000..3a6ba3a2f1d
--- /dev/null
+++ b/engines/mtropolis/plugin/pierian.cpp
@@ -0,0 +1,159 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "mtropolis/plugin/pierian.h"
+#include "mtropolis/plugins.h"
+
+namespace MTropolis {
+
+namespace Pierian {
+
+FlattenModifier::FlattenModifier() {
+}
+
+FlattenModifier::~FlattenModifier() {
+}
+
+bool FlattenModifier::load(const PlugInModifierLoaderContext &context, const Data::Pierian::FlattenModifier &data) {
+	return true;
+}
+
+bool FlattenModifier::respondsToEvent(const Event &evt) const {
+	return false;
+}
+
+VThreadState FlattenModifier::consumeMessage(Runtime *runtime, const Common::SharedPtr<MessageProperties> &msg) {
+	return kVThreadReturn;
+}
+
+void FlattenModifier::disable(Runtime *runtime) {
+}
+
+#ifdef MTROPOLIS_DEBUG_ENABLE
+void FlattenModifier::debugInspect(IDebugInspectionReport *report) const {
+	Modifier::debugInspect(report);
+}
+#endif
+
+Common::SharedPtr<Modifier> FlattenModifier::shallowClone() const {
+	return Common::SharedPtr<Modifier>(new FlattenModifier(*this));
+}
+
+const char *FlattenModifier::getDefaultName() const {
+	return "Flatten Modifier"; // ???
+}
+
+SaveFileModifier::SaveFileModifier() {
+}
+
+SaveFileModifier::~SaveFileModifier() {
+}
+
+bool SaveFileModifier::load(const PlugInModifierLoaderContext &context, const Data::Pierian::SaveFileModifier &data) {
+	return true;
+}
+
+bool SaveFileModifier::respondsToEvent(const Event &evt) const {
+	return false;
+}
+
+VThreadState SaveFileModifier::consumeMessage(Runtime *runtime, const Common::SharedPtr<MessageProperties> &msg) {
+	return kVThreadReturn;
+}
+
+void SaveFileModifier::disable(Runtime *runtime) {
+}
+
+#ifdef MTROPOLIS_DEBUG_ENABLE
+void SaveFileModifier::debugInspect(IDebugInspectionReport *report) const {
+	Modifier::debugInspect(report);
+}
+#endif
+
+Common::SharedPtr<Modifier> SaveFileModifier::shallowClone() const {
+	return Common::SharedPtr<Modifier>(new SaveFileModifier(*this));
+}
+
+const char *SaveFileModifier::getDefaultName() const {
+	return "mLine Launcher Modifier"; // ???
+}
+
+WasteModifier::WasteModifier() {
+}
+
+WasteModifier::~WasteModifier() {
+}
+
+bool WasteModifier::load(const PlugInModifierLoaderContext &context, const Data::Pierian::WasteModifier &data) {
+	return true;
+}
+
+bool WasteModifier::respondsToEvent(const Event &evt) const {
+	return false;
+}
+
+VThreadState WasteModifier::consumeMessage(Runtime *runtime, const Common::SharedPtr<MessageProperties> &msg) {
+	return kVThreadReturn;
+}
+
+void WasteModifier::disable(Runtime *runtime) {
+}
+
+#ifdef MTROPOLIS_DEBUG_ENABLE
+void WasteModifier::debugInspect(IDebugInspectionReport *report) const {
+	Modifier::debugInspect(report);
+}
+#endif
+
+Common::SharedPtr<Modifier> WasteModifier::shallowClone() const {
+	return Common::SharedPtr<Modifier>(new WasteModifier(*this));
+}
+
+const char *WasteModifier::getDefaultName() const {
+	return "mLine Launcher Modifier"; // ???
+}
+
+PierianPlugIn::PierianPlugIn()
+	: _flattenModifierFactory(this)
+	, _saveFileModifierFactory(this)
+	, _wasteModifierFactory(this) {
+}
+
+PierianPlugIn::~PierianPlugIn() {
+}
+
+void PierianPlugIn::registerModifiers(IPlugInModifierRegistrar *registrar) const {
+	registrar->registerPlugInModifier("FlattenMod", &_flattenModifierFactory);
+	registrar->registerPlugInModifier("SaveFileMod", &_saveFileModifierFactory);
+	registrar->registerPlugInModifier("WasteMod", &_wasteModifierFactory);
+}
+
+} // End of namespace MLine
+
+namespace PlugIns {
+
+Common::SharedPtr<PlugIn> createPierian() {
+	return Common::SharedPtr<PlugIn>(new Pierian::PierianPlugIn());
+}
+
+} // End of namespace PlugIns
+
+} // End of namespace MTropolis
diff --git a/engines/mtropolis/plugin/pierian.h b/engines/mtropolis/plugin/pierian.h
new file mode 100644
index 00000000000..5980736740b
--- /dev/null
+++ b/engines/mtropolis/plugin/pierian.h
@@ -0,0 +1,117 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#ifndef MTROPOLIS_PLUGIN_PIERIAN_H
+#define MTROPOLIS_PLUGIN_PIERIAN_H
+
+#include "mtropolis/modifiers.h"
+#include "mtropolis/modifier_factory.h"
+#include "mtropolis/runtime.h"
+#include "mtropolis/plugin/pierian_data.h"
+
+namespace MTropolis {
+
+namespace Pierian {
+
+class FlattenModifier : public Modifier {
+public:
+	FlattenModifier();
+	~FlattenModifier();
+
+	bool load(const PlugInModifierLoaderContext &context, const Data::Pierian::FlattenModifier &data);
+
+	bool respondsToEvent(const Event &evt) const override;
+	VThreadState consumeMessage(Runtime *runtime, const Common::SharedPtr<MessageProperties> &msg) override;
+
+	void disable(Runtime *runtime) override;
+
+#ifdef MTROPOLIS_DEBUG_ENABLE
+	const char *debugGetTypeName() const override { return "Flatten Modifier"; }
+	void debugInspect(IDebugInspectionReport *report) const override;
+#endif
+
+private:
+	Common::SharedPtr<Modifier> shallowClone() const override;
+	const char *getDefaultName() const override;
+};
+
+class SaveFileModifier : public Modifier {
+public:
+	SaveFileModifier();
+	~SaveFileModifier();
+
+	bool load(const PlugInModifierLoaderContext &context, const Data::Pierian::SaveFileModifier &data);
+
+	bool respondsToEvent(const Event &evt) const override;
+	VThreadState consumeMessage(Runtime *runtime, const Common::SharedPtr<MessageProperties> &msg) override;
+
+	void disable(Runtime *runtime) override;
+
+#ifdef MTROPOLIS_DEBUG_ENABLE
+	const char *debugGetTypeName() const override { return "SaveFile Modifier"; }
+	void debugInspect(IDebugInspectionReport *report) const override;
+#endif
+
+private:
+	Common::SharedPtr<Modifier> shallowClone() const override;
+	const char *getDefaultName() const override;
+};
+
+class WasteModifier : public Modifier {
+public:
+	WasteModifier();
+	~WasteModifier();
+
+	bool load(const PlugInModifierLoaderContext &context, const Data::Pierian::WasteModifier &data);
+
+	bool respondsToEvent(const Event &evt) const override;
+	VThreadState consumeMessage(Runtime *runtime, const Common::SharedPtr<MessageProperties> &msg) override;
+
+	void disable(Runtime *runtime) override;
+
+#ifdef MTROPOLIS_DEBUG_ENABLE
+	const char *debugGetTypeName() const override { return "Waste Modifier"; }
+	void debugInspect(IDebugInspectionReport *report) const override;
+#endif
+
+private:
+	Common::SharedPtr<Modifier> shallowClone() const override;
+	const char *getDefaultName() const override;
+};
+
+class PierianPlugIn : public MTropolis::PlugIn {
+public:
+	PierianPlugIn();
+	~PierianPlugIn();
+
+	void registerModifiers(IPlugInModifierRegistrar *registrar) const override;
+
+private:
+	PlugInModifierFactory<FlattenModifier, Data::Pierian::FlattenModifier> _flattenModifierFactory;
+	PlugInModifierFactory<SaveFileModifier, Data::Pierian::SaveFileModifier> _saveFileModifierFactory;
+	PlugInModifierFactory<WasteModifier, Data::Pierian::WasteModifier> _wasteModifierFactory;
+};
+
+} // End of namespace Pierian
+
+} // End of namespace MTropolis
+
+#endif
diff --git a/engines/mtropolis/plugin/pierian_data.cpp b/engines/mtropolis/plugin/pierian_data.cpp
new file mode 100644
index 00000000000..48f2cd841e7
--- /dev/null
+++ b/engines/mtropolis/plugin/pierian_data.cpp
@@ -0,0 +1,61 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "mtropolis/plugin/pierian_data.h"
+
+namespace MTropolis {
+
+namespace Data {
+
+namespace Pierian {
+
+DataReadErrorCode FlattenModifier::load(PlugIn &plugIn, const PlugInModifier &prefix, DataReader &reader) {
+	if (prefix.plugInRevision != 0)
+		return kDataReadErrorUnsupportedRevision;
+
+	error("Data structure loading for the Flatten modifier is not implemented.");
+
+	return kDataReadErrorNone;
+}
+
+DataReadErrorCode SaveFileModifier::load(PlugIn &plugIn, const PlugInModifier &prefix, DataReader &reader) {
+	if (prefix.plugInRevision != 0)
+		return kDataReadErrorUnsupportedRevision;
+
+	error("Data structure loading for the SaveFile modifier is not implemented.");
+
+	return kDataReadErrorNone;
+}
+
+DataReadErrorCode WasteModifier::load(PlugIn &plugIn, const PlugInModifier &prefix, DataReader &reader) {
+	if (prefix.plugInRevision != 0)
+		return kDataReadErrorUnsupportedRevision;
+
+	error("Data structure loading for the Waste modifier is not implemented.");
+
+	return kDataReadErrorNone;
+}
+
+} // End of namespace Pierian
+
+} // End of namespace Data
+
+} // End of namespace MTropolis
diff --git a/engines/mtropolis/plugin/pierian_data.h b/engines/mtropolis/plugin/pierian_data.h
new file mode 100644
index 00000000000..e8194ef62c3
--- /dev/null
+++ b/engines/mtropolis/plugin/pierian_data.h
@@ -0,0 +1,65 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#ifndef MTROPOLIS_PLUGIN_PIERIAN_DATA_H
+#define MTROPOLIS_PLUGIN_PIERIAN_DATA_H
+
+#include "mtropolis/data.h"
+
+namespace MTropolis {
+
+namespace Data {
+
+namespace Pierian {
+
+// Known Pierian Spring custom modifiers:
+// * FlattenMod
+// * SaveFileMod
+// * WasteMod: A wrapper around the "TE Edit Control" text editor widget
+//
+
+
+struct WasteModifier : public PlugInModifierData {
+
+protected:
+	DataReadErrorCode load(PlugIn &plugIn, const PlugInModifier &prefix, DataReader &reader) override;
+};
+
+struct SaveFileModifier : public PlugInModifierData {
+
+protected:
+	DataReadErrorCode load(PlugIn &plugIn, const PlugInModifier &prefix, DataReader &reader) override;
+};
+
+struct FlattenModifier : public PlugInModifierData {
+
+protected:
+	DataReadErrorCode load(PlugIn &plugIn, const PlugInModifier &prefix, DataReader &reader) override;
+};
+
+
+} // End of namespace Pierian
+
+} // End of namespace Data
+
+} // End of namespace MTropolis
+
+#endif
diff --git a/engines/mtropolis/plugin/standard.cpp b/engines/mtropolis/plugin/standard.cpp
index 5fcdd8c4a21..bf4e0472e62 100644
--- a/engines/mtropolis/plugin/standard.cpp
+++ b/engines/mtropolis/plugin/standard.cpp
@@ -1803,6 +1803,41 @@ const char *OpenTitleModifier::getDefaultName() const {
 	return "Open Title Modifier"; // ???
 }
 
+OpenAppModifier::OpenAppModifier() {
+}
+
+OpenAppModifier::~OpenAppModifier() {
+}
+
+bool OpenAppModifier::load(const PlugInModifierLoaderContext &context, const Data::Standard::OpenAppModifier &data) {
+	return true;
+}
+
+bool OpenAppModifier::respondsToEvent(const Event &evt) const {
+	return false;
+}
+
+VThreadState OpenAppModifier::consumeMessage(Runtime *runtime, const Common::SharedPtr<MessageProperties> &msg) {
+	return kVThreadReturn;
+}
+
+void OpenAppModifier::disable(Runtime *runtime) {
+}
+
+#ifdef MTROPOLIS_DEBUG_ENABLE
+void OpenAppModifier::debugInspect(IDebugInspectionReport *report) const {
+	Modifier::debugInspect(report);
+}
+#endif
+
+Common::SharedPtr<Modifier> OpenAppModifier::shallowClone() const {
+	return Common::SharedPtr<Modifier>(new OpenAppModifier(*this));
+}
+
+const char *OpenAppModifier::getDefaultName() const {
+	return "Open App Modifier"; // ???
+}
+
 StandardPlugInHacks::StandardPlugInHacks() : allowGarbledListModData(false) {
 }
 
@@ -1817,7 +1852,8 @@ StandardPlugIn::StandardPlugIn()
 	, _fadeModifierFactory(this)
 	, _printModifierFactory(this)
 	, _navigateModifierFactory(this)
-	, _openTitleModifierFactory(this) {
+	, _openTitleModifierFactory(this)
+	, _openAppModifierFactory(this) {
 }
 
 StandardPlugIn::~StandardPlugIn() {
@@ -1836,6 +1872,7 @@ void StandardPlugIn::registerModifiers(IPlugInModifierRegistrar *registrar) cons
 	registrar->registerPlugInModifier("fade", &_fadeModifierFactory);
 	registrar->registerPlugInModifier("Navigate", &_navigateModifierFactory);
 	registrar->registerPlugInModifier("OpenTitle", &_openTitleModifierFactory);
+	registrar->registerPlugInModifier("openApp", &_openAppModifierFactory);
 }
 
 const StandardPlugInHacks &StandardPlugIn::getHacks() const {
diff --git a/engines/mtropolis/plugin/standard.h b/engines/mtropolis/plugin/standard.h
index 61945ce8fb9..b2913727c0b 100644
--- a/engines/mtropolis/plugin/standard.h
+++ b/engines/mtropolis/plugin/standard.h
@@ -442,6 +442,32 @@ private:
 	bool _addToReturnList;
 };
 
+class OpenAppModifier : public Modifier {
+public:
+	OpenAppModifier();
+	~OpenAppModifier();
+
+	bool load(const PlugInModifierLoaderContext &context, const Data::Standard::OpenAppModifier &data);
+
+	bool respondsToEvent(const Event &evt) const override;
+	VThreadState consumeMessage(Runtime *runtime, const Common::SharedPtr<MessageProperties> &msg) override;
+
+	void disable(Runtime *runtime) override;
+
+#ifdef MTROPOLIS_DEBUG_ENABLE
+	const char *debugGetTypeName() const override { return "Open App Modifier"; }
+	void debugInspect(IDebugInspectionReport *report) const override;
+#endif
+
+private:
+	Common::SharedPtr<Modifier> shallowClone() const override;
+	const char *getDefaultName() const override;
+
+	Event _executeWhen;
+	Common::String _pathOrUrl;
+	bool _addToReturnList;
+};
+
 class StandardPlugIn : public MTropolis::PlugIn {
 public:
 	StandardPlugIn();
@@ -464,6 +490,7 @@ private:
 	PlugInModifierFactory<PrintModifier, Data::Standard::PrintModifier> _printModifierFactory;
 	PlugInModifierFactory<NavigateModifier, Data::Standard::NavigateModifier> _navigateModifierFactory;
 	PlugInModifierFactory<OpenTitleModifier, Data::Standard::OpenTitleModifier> _openTitleModifierFactory;
+	PlugInModifierFactory<OpenAppModifier, Data::Standard::OpenAppModifier> _openAppModifierFactory;
 
 	StandardPlugInHacks _hacks;
 };
diff --git a/engines/mtropolis/plugin/standard_data.cpp b/engines/mtropolis/plugin/standard_data.cpp
index 80b9424a414..1bb6897b443 100644
--- a/engines/mtropolis/plugin/standard_data.cpp
+++ b/engines/mtropolis/plugin/standard_data.cpp
@@ -228,6 +228,19 @@ DataReadErrorCode OpenTitleModifier::load(PlugIn &plugIn, const PlugInModifier &
 	return kDataReadErrorNone;
 }
 
+DataReadErrorCode OpenAppModifier::load(PlugIn &plugIn, const PlugInModifier &prefix, DataReader &reader) {
+	if (prefix.plugInRevision != 0)
+		return kDataReadErrorUnsupportedRevision;
+
+	if (!unknown1Null.load(reader) || !unknown2Null.load(reader) || !unknown3Event.load(reader) || !unknown4String.load(reader))
+		return kDataReadErrorReadFailed;
+
+	if (!unknown5Integer.load(reader) || !unknown6Integer.load(reader) || !unknown7Bool.load(reader))
+		return kDataReadErrorReadFailed;
+
+	return kDataReadErrorNone;
+}
+
 } // End of namespace Standard
 
 } // End of namespace Data
diff --git a/engines/mtropolis/plugin/standard_data.h b/engines/mtropolis/plugin/standard_data.h
index fa87e3cc2dd..1fecb211141 100644
--- a/engines/mtropolis/plugin/standard_data.h
+++ b/engines/mtropolis/plugin/standard_data.h
@@ -178,6 +178,19 @@ protected:
 	DataReadErrorCode load(PlugIn &plugIn, const PlugInModifier &prefix, DataReader &reader) override;
 };
 
+struct OpenAppModifier : public PlugInModifierData {
+	PlugInTypeTaggedValue unknown1Null;
+	PlugInTypeTaggedValue unknown2Null;
+	PlugInTypeTaggedValue unknown3Event;
+	PlugInTypeTaggedValue unknown4String;
+	PlugInTypeTaggedValue unknown5Integer;
+	PlugInTypeTaggedValue unknown6Integer;
+	PlugInTypeTaggedValue unknown7Bool;
+
+protected:
+	DataReadErrorCode load(PlugIn &plugIn, const PlugInModifier &prefix, DataReader &reader) override;
+};
+
 } // End of namespace Standard
 
 } // End of namespace Data
diff --git a/engines/mtropolis/plugin/thereware.cpp b/engines/mtropolis/plugin/thereware.cpp
index 8012c52b3b9..4a186f02b8f 100644
--- a/engines/mtropolis/plugin/thereware.cpp
+++ b/engines/mtropolis/plugin/thereware.cpp
@@ -411,6 +411,76 @@ const char *AlphaMaticModifier::getDefaultName() const {
 	return "AlphaMatic Modifier"; // ???
 }
 
+HotTextModifier::HotTextModifier() {
+}
+
+HotTextModifier::~HotTextModifier() {
+}
+
+bool HotTextModifier::load(const PlugInModifierLoaderContext &context, const Data::Thereware::HotTextModifier &data) {
+	return true;
+}
+
+bool HotTextModifier::respondsToEvent(const Event &evt) const {
+	return false;
+}
+
+VThreadState HotTextModifier::consumeMessage(Runtime *runtime, const Common::SharedPtr<MessageProperties> &msg) {
+	return kVThreadReturn;
+}
+
+void HotTextModifier::disable(Runtime *runtime) {
+}
+
+#ifdef MTROPOLIS_DEBUG_ENABLE
+void HotTextModifier::debugInspect(IDebugInspectionReport *report) const {
+	Modifier::debugInspect(report);
+}
+#endif
+
+Common::SharedPtr<Modifier> HotTextModifier::shallowClone() const {
+	return Common::SharedPtr<Modifier>(new HotTextModifier(*this));
+}
+
+const char *HotTextModifier::getDefaultName() const {
+	return "HotText Modifier"; // ???
+}
+
+KeyScrollModifier::KeyScrollModifier() {
+}
+
+KeyScrollModifier::~KeyScrollModifier() {
+}
+
+bool KeyScrollModifier::load(const PlugInModifierLoaderContext &context, const Data::Thereware::KeyScrollModifier &data) {
+	return true;
+}
+
+bool KeyScrollModifier::respondsToEvent(const Event &evt) const {
+	return false;
+}
+
+VThreadState KeyScrollModifier::consumeMessage(Runtime *runtime, const Common::SharedPtr<MessageProperties> &msg) {
+	return kVThreadReturn;
+}
+
+void KeyScrollModifier::disable(Runtime *runtime) {
+}
+
+#ifdef MTROPOLIS_DEBUG_ENABLE
+void KeyScrollModifier::debugInspect(IDebugInspectionReport *report) const {
+	Modifier::debugInspect(report);
+}
+#endif
+
+Common::SharedPtr<Modifier> KeyScrollModifier::shallowClone() const {
+	return Common::SharedPtr<Modifier>(new KeyScrollModifier(*this));
+}
+
+const char *KeyScrollModifier::getDefaultName() const {
+	return "KeyScroll Modifier"; // ???
+}
+
 TherewarePlugIn::TherewarePlugIn()
 	: _conductorModifierFactory(this)
 	, _alphaMaticModifierFactory(this)
@@ -422,7 +492,9 @@ TherewarePlugIn::TherewarePlugIn()
 	, _easyScrollerModifierFactory(this)
 	, _goThereModifierFactory(this)
 	, _randomizerModifierFactory(this)
-	, _timeLoopModifierFactory(this) {
+	, _timeLoopModifierFactory(this)
+	, _hotTextModifierFactory(this)
+	, _keyScrollModifierFactory(this) {
 }
 
 TherewarePlugIn::~TherewarePlugIn() {
@@ -451,6 +523,10 @@ void TherewarePlugIn::registerModifiers(IPlugInModifierRegistrar *registrar) con
 	//Quick Kit
 	registrar->registerPlugInModifier("Randomizer", &_randomizerModifierFactory);
 	registrar->registerPlugInModifier("Conductor", &_conductorModifierFactory);
+
+	//HotText Kit
+	registrar->registerPlugInModifier("HotText", &_hotTextModifierFactory);
+	registrar->registerPlugInModifier("KeyScroll", &_keyScrollModifierFactory);
 }
 
 } // End of namespace Thereware
diff --git a/engines/mtropolis/plugin/thereware.h b/engines/mtropolis/plugin/thereware.h
index 9b5b650eb02..3039a9b0df0 100644
--- a/engines/mtropolis/plugin/thereware.h
+++ b/engines/mtropolis/plugin/thereware.h
@@ -273,6 +273,50 @@ private:
 	const char *getDefaultName() const override;
 };
 
+class HotTextModifier : public Modifier {
+public:
+	HotTextModifier();
+	~HotTextModifier();
+
+	bool load(const PlugInModifierLoaderContext &context, const Data::Thereware::HotTextModifier &data);
+
+	bool respondsToEvent(const Event &evt) const override;
+	VThreadState consumeMessage(Runtime *runtime, const Common::SharedPtr<MessageProperties> &msg) override;
+
+	void disable(Runtime *runtime) override;
+
+#ifdef MTROPOLIS_DEBUG_ENABLE
+	const char *debugGetTypeName() const override { return "HotText Modifier"; }
+	void debugInspect(IDebugInspectionReport *report) const override;
+#endif
+
+private:
+	Common::SharedPtr<Modifier> shallowClone() const override;
+	const char *getDefaultName() const override;
+};
+
+class KeyScrollModifier : public Modifier {
+public:
+	KeyScrollModifier();
+	~KeyScrollModifier();
+
+	bool load(const PlugInModifierLoaderContext &context, const Data::Thereware::KeyScrollModifier &data);
+
+	bool respondsToEvent(const Event &evt) const override;
+	VThreadState consumeMessage(Runtime *runtime, const Common::SharedPtr<MessageProperties> &msg) override;
+
+	void disable(Runtime *runtime) override;
+
+#ifdef MTROPOLIS_DEBUG_ENABLE
+	const char *debugGetTypeName() const override { return "KeyScroll Modifier"; }
+	void debugInspect(IDebugInspectionReport *report) const override;
+#endif
+
+private:
+	Common::SharedPtr<Modifier> shallowClone() const override;
+	const char *getDefaultName() const override;
+};
+
 
 class TherewarePlugIn : public MTropolis::PlugIn {
 public:
@@ -293,6 +337,8 @@ private:
 	PlugInModifierFactory<GoThereModifier, Data::Thereware::GoThereModifier> _goThereModifierFactory;
 	PlugInModifierFactory<RandomizerModifier, Data::Thereware::RandomizerModifier> _randomizerModifierFactory;
 	PlugInModifierFactory<TimeLoopModifier, Data::Thereware::TimeLoopModifier> _timeLoopModifierFactory;
+	PlugInModifierFactory<HotTextModifier, Data::Thereware::HotTextModifier> _hotTextModifierFactory;
+	PlugInModifierFactory<KeyScrollModifier, Data::Thereware::KeyScrollModifier> _keyScrollModifierFactory;
 };
 
 } // End of namespace Thereware
diff --git a/engines/mtropolis/plugin/thereware_data.cpp b/engines/mtropolis/plugin/thereware_data.cpp
index a2f8558b4fe..ffcc88c07b1 100644
--- a/engines/mtropolis/plugin/thereware_data.cpp
+++ b/engines/mtropolis/plugin/thereware_data.cpp
@@ -176,6 +176,24 @@ DataReadErrorCode AlphaMaticModifier::load(PlugIn &plugIn, const PlugInModifier
 }
 
 
+DataReadErrorCode HotTextModifier::load(PlugIn &plugIn, const PlugInModifier &prefix, DataReader &reader) {
+	if (prefix.plugInRevision != 2)
+		return kDataReadErrorUnsupportedRevision;
+
+	error("Data structure loading for the HotText modifier is not implemented.");
+
+	return kDataReadErrorNone;
+}
+
+DataReadErrorCode KeyScrollModifier::load(PlugIn &plugIn, const PlugInModifier &prefix, DataReader &reader) {
+	if (prefix.plugInRevision != 2)
+		return kDataReadErrorUnsupportedRevision;
+
+	error("Data structure loading for the KeyScroll modifier is not implemented.");
+
+	return kDataReadErrorNone;
+}
+
 } // End of namespace Thereware
 
 } // End of namespace Data
diff --git a/engines/mtropolis/plugin/thereware_data.h b/engines/mtropolis/plugin/thereware_data.h
index 43b8e523a22..3f3fb0e8959 100644
--- a/engines/mtropolis/plugin/thereware_data.h
+++ b/engines/mtropolis/plugin/thereware_data.h
@@ -228,6 +228,18 @@ protected:
 	DataReadErrorCode load(PlugIn &plugIn, const PlugInModifier &prefix, DataReader &reader) override;
 };
 
+struct HotTextModifier : public PlugInModifierData {
+
+protected:
+	DataReadErrorCode load(PlugIn &plugIn, const PlugInModifier &prefix, DataReader &reader) override;
+};
+
+struct KeyScrollModifier : public PlugInModifierData {
+
+protected:
+	DataReadErrorCode load(PlugIn &plugIn, const PlugInModifier &prefix, DataReader &reader) override;
+};
+
 } // End of namespace Thereware
 
 } // End of namespace Data
diff --git a/engines/mtropolis/plugins.h b/engines/mtropolis/plugins.h
index 20a5b490a34..87249200705 100644
--- a/engines/mtropolis/plugins.h
+++ b/engines/mtropolis/plugins.h
@@ -51,6 +51,7 @@ Common::SharedPtr<PlugIn> createAXLogic();
 Common::SharedPtr<PlugIn> createHoologic();
 Common::SharedPtr<PlugIn> createMLine();
 Common::SharedPtr<PlugIn> createThereware();
+Common::SharedPtr<PlugIn> createPierian();
 
 } // End of namespace PlugIns
 


Commit: ecab7338869829e77ce9e9f66ad77ddbde162923
    https://github.com/scummvm/scummvm/commit/ecab7338869829e77ce9e9f66ad77ddbde162923
Author: Michael (michael_kuerbis at web.de)
Date: 2025-04-16T23:18:08-04:00

Commit Message:
JANITORIAL: MTROPOLIS: correct namespace end comment

Changed paths:
    engines/mtropolis/plugin/pierian.cpp


diff --git a/engines/mtropolis/plugin/pierian.cpp b/engines/mtropolis/plugin/pierian.cpp
index 3a6ba3a2f1d..a6d3b994953 100644
--- a/engines/mtropolis/plugin/pierian.cpp
+++ b/engines/mtropolis/plugin/pierian.cpp
@@ -146,7 +146,7 @@ void PierianPlugIn::registerModifiers(IPlugInModifierRegistrar *registrar) const
 	registrar->registerPlugInModifier("WasteMod", &_wasteModifierFactory);
 }
 
-} // End of namespace MLine
+} // End of namespace Pierian
 
 namespace PlugIns {
 




More information about the Scummvm-git-logs mailing list