[Scummvm-git-logs] scummvm master -> 42e2c4c2424282067c6218037f1d03b00d0b6243

elasota noreply at scummvm.org
Thu Jul 4 23:50:16 UTC 2024


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

Summary:
a19065c255 MTROPOLIS: Move Fade modifier to standard plug-in
bba278db34 MTROPOLIS: Instantiate aliases before putting them in the modifier inner scope
d22b49fb05 MTROPOLIS: Add more attribs to SysInfo
82a25bb271 MTROPOLIS: Remove errant debug code
35d89b254b MTROPOLIS: Permit list expansion
42e2c4c242 MTROPOLIS: Add nthelement and elementindex attribs


Commit: a19065c255dcdb647978228793b18c999868b069
    https://github.com/scummvm/scummvm/commit/a19065c255dcdb647978228793b18c999868b069
Author: elasota (1137273+elasota at users.noreply.github.com)
Date: 2024-07-04T17:46:11-04:00

Commit Message:
MTROPOLIS: Move Fade modifier to standard plug-in

Changed paths:
    engines/mtropolis/plugin/spqr.cpp
    engines/mtropolis/plugin/spqr.h
    engines/mtropolis/plugin/spqr_data.cpp
    engines/mtropolis/plugin/spqr_data.h
    engines/mtropolis/plugin/standard.cpp
    engines/mtropolis/plugin/standard.h
    engines/mtropolis/plugin/standard_data.cpp
    engines/mtropolis/plugin/standard_data.h


diff --git a/engines/mtropolis/plugin/spqr.cpp b/engines/mtropolis/plugin/spqr.cpp
index de2f17a6a44..cc98028445a 100644
--- a/engines/mtropolis/plugin/spqr.cpp
+++ b/engines/mtropolis/plugin/spqr.cpp
@@ -26,34 +26,10 @@ namespace MTropolis {
 
 namespace SPQR {
 
-FadeModifier::FadeModifier() {
-}
-
-FadeModifier::~FadeModifier() {
-}
-
-bool FadeModifier::load(const PlugInModifierLoaderContext &context, const Data::SPQR::FadeModifier &data) {
-	return true;
-}
-
-
-void FadeModifier::disable(Runtime *runtime) {
-}
-
-Common::SharedPtr<Modifier> FadeModifier::shallowClone() const {
-	return Common::SharedPtr<Modifier>(new FadeModifier(*this));
-}
-
-const char *FadeModifier::getDefaultName() const {
-	return "Fade Modifier"; // ???
-}
-
-SPQRPlugIn::SPQRPlugIn()
-	: _fadeModifierFactory(this) {
+SPQRPlugIn::SPQRPlugIn() {
 }
 
 void SPQRPlugIn::registerModifiers(IPlugInModifierRegistrar *registrar) const {
-	registrar->registerPlugInModifier("fade", &_fadeModifierFactory);
 }
 
 } // namespace SPQR
diff --git a/engines/mtropolis/plugin/spqr.h b/engines/mtropolis/plugin/spqr.h
index 0476cbc880e..54d9d0ded58 100644
--- a/engines/mtropolis/plugin/spqr.h
+++ b/engines/mtropolis/plugin/spqr.h
@@ -33,24 +33,6 @@ namespace SPQR {
 
 class SPQRPlugIn;
 
-class FadeModifier : public Modifier {
-public:
-	FadeModifier();
-	~FadeModifier();
-
-	bool load(const PlugInModifierLoaderContext &context, const Data::SPQR::FadeModifier &data);
-
-	void disable(Runtime *runtime) override;
-
-#ifdef MTROPOLIS_DEBUG_ENABLE
-	const char *debugGetTypeName() const override { return "Fade Modifier"; }
-#endif
-
-private:
-	Common::SharedPtr<Modifier> shallowClone() const override;
-	const char *getDefaultName() const override;
-};
-
 class SPQRPlugIn : public MTropolis::PlugIn {
 public:
 	SPQRPlugIn();
@@ -58,7 +40,6 @@ public:
 	void registerModifiers(IPlugInModifierRegistrar *registrar) const override;
 
 private:
-	PlugInModifierFactory<FadeModifier, Data::SPQR::FadeModifier> _fadeModifierFactory;
 };
 
 } // End of namespace SPQR
diff --git a/engines/mtropolis/plugin/spqr_data.cpp b/engines/mtropolis/plugin/spqr_data.cpp
index 675772f0a32..b3b04029009 100644
--- a/engines/mtropolis/plugin/spqr_data.cpp
+++ b/engines/mtropolis/plugin/spqr_data.cpp
@@ -27,16 +27,6 @@ namespace Data {
 
 namespace SPQR {
 
-DataReadErrorCode FadeModifier::load(PlugIn &plugIn, const PlugInModifier &prefix, DataReader &reader) {
-	if (prefix.plugInRevision != 1)
-		return kDataReadErrorUnsupportedRevision;
-
-	if (!unknown1Event.load(reader) || !unknown2Event.load(reader) || !unknown3Int.load(reader) || !unknown4Int.load(reader) || !unknown5Int.load(reader))
-		return kDataReadErrorReadFailed;
-
-	return kDataReadErrorNone;
-}
-
 } // End of namespace SPQR
 
 } // End of namespace Data
diff --git a/engines/mtropolis/plugin/spqr_data.h b/engines/mtropolis/plugin/spqr_data.h
index 6b9d6ac901c..76d67f99d9b 100644
--- a/engines/mtropolis/plugin/spqr_data.h
+++ b/engines/mtropolis/plugin/spqr_data.h
@@ -31,18 +31,6 @@ namespace Data {
 namespace SPQR {
 
 // Known SPQR - The Empire's Darkest Hour custom modifiers:
-// fade - ???
-
-struct FadeModifier : public PlugInModifierData {
-	PlugInTypeTaggedValue unknown1Event; // Probably "Enable When"
-	PlugInTypeTaggedValue unknown2Event; // Probably "Disable When"
-	PlugInTypeTaggedValue unknown3Int;   // Int
-	PlugInTypeTaggedValue unknown4Int;   // Int
-	PlugInTypeTaggedValue unknown5Int;   // Int
-
-protected:
-	DataReadErrorCode load(PlugIn &plugIn, const PlugInModifier &prefix, DataReader &reader) override;
-};
 
 } // End of namespace SPQR
 
diff --git a/engines/mtropolis/plugin/standard.cpp b/engines/mtropolis/plugin/standard.cpp
index 7dc6698b708..feb05b3d136 100644
--- a/engines/mtropolis/plugin/standard.cpp
+++ b/engines/mtropolis/plugin/standard.cpp
@@ -1451,6 +1451,27 @@ const char *PanningModifier::getDefaultName() const {
 	return "Panning Modifier"; // ???
 }
 
+FadeModifier::FadeModifier() {
+}
+
+FadeModifier::~FadeModifier() {
+}
+
+bool FadeModifier::load(const PlugInModifierLoaderContext &context, const Data::Standard::FadeModifier &data) {
+	return true;
+}
+
+void FadeModifier::disable(Runtime *runtime) {
+}
+
+Common::SharedPtr<Modifier> FadeModifier::shallowClone() const {
+	return Common::SharedPtr<Modifier>(new FadeModifier(*this));
+}
+
+const char *FadeModifier::getDefaultName() const {
+	return "Fade Modifier"; // ???
+}
+
 StandardPlugInHacks::StandardPlugInHacks() : allowGarbledListModData(false) {
 }
 
@@ -1461,7 +1482,8 @@ StandardPlugIn::StandardPlugIn()
 	, _objRefVarModifierFactory(this)
 	, _listVarModifierFactory(this)
 	, _sysInfoModifierFactory(this)
-	, _panningModifierFactory(this) {
+	, _panningModifierFactory(this)
+	, _fadeModifierFactory(this) {
 }
 
 StandardPlugIn::~StandardPlugIn() {
@@ -1476,6 +1498,7 @@ void StandardPlugIn::registerModifiers(IPlugInModifierRegistrar *registrar) cons
 	registrar->registerPlugInModifier("SysInfo", &_sysInfoModifierFactory);
 
 	registrar->registerPlugInModifier("panning", &_panningModifierFactory);
+	registrar->registerPlugInModifier("fade", &_fadeModifierFactory);
 }
 
 const StandardPlugInHacks &StandardPlugIn::getHacks() const {
diff --git a/engines/mtropolis/plugin/standard.h b/engines/mtropolis/plugin/standard.h
index e7b7bd4456b..ab45b6c3d55 100644
--- a/engines/mtropolis/plugin/standard.h
+++ b/engines/mtropolis/plugin/standard.h
@@ -348,6 +348,25 @@ private:
 	const char *getDefaultName() const override;
 };
 
+class FadeModifier : public Modifier {
+public:
+	FadeModifier();
+	~FadeModifier();
+
+	bool load(const PlugInModifierLoaderContext &context, const Data::Standard::FadeModifier &data);
+
+	void disable(Runtime *runtime) override;
+
+#ifdef MTROPOLIS_DEBUG_ENABLE
+	const char *debugGetTypeName() const override { return "Fade Modifier"; }
+#endif
+
+private:
+	Common::SharedPtr<Modifier> shallowClone() const override;
+	const char *getDefaultName() const override;
+};
+
+
 class StandardPlugIn : public MTropolis::PlugIn {
 public:
 	StandardPlugIn();
@@ -366,6 +385,7 @@ private:
 	PlugInModifierFactory<ListVariableModifier, Data::Standard::ListVariableModifier> _listVarModifierFactory;
 	PlugInModifierFactory<SysInfoModifier, Data::Standard::SysInfoModifier> _sysInfoModifierFactory;
 	PlugInModifierFactory<PanningModifier, Data::Standard::PanningModifier> _panningModifierFactory;
+	PlugInModifierFactory<FadeModifier, Data::Standard::FadeModifier> _fadeModifierFactory;
 
 	StandardPlugInHacks _hacks;
 };
diff --git a/engines/mtropolis/plugin/standard_data.cpp b/engines/mtropolis/plugin/standard_data.cpp
index 998059b89c6..9cd6c7c8680 100644
--- a/engines/mtropolis/plugin/standard_data.cpp
+++ b/engines/mtropolis/plugin/standard_data.cpp
@@ -188,6 +188,16 @@ DataReadErrorCode SysInfoModifier::load(PlugIn &plugIn, const PlugInModifier &pr
 	return kDataReadErrorNone;
 }
 
+DataReadErrorCode FadeModifier::load(PlugIn &plugIn, const PlugInModifier &prefix, DataReader &reader) {
+	if (prefix.plugInRevision != 1)
+		return kDataReadErrorUnsupportedRevision;
+
+	if (!unknown1Event.load(reader) || !unknown2Event.load(reader) || !unknown3Int.load(reader) || !unknown4Int.load(reader) || !unknown5Int.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 ab17f31816b..94e7adf14b4 100644
--- a/engines/mtropolis/plugin/standard_data.h
+++ b/engines/mtropolis/plugin/standard_data.h
@@ -141,6 +141,17 @@ protected:
 	DataReadErrorCode load(PlugIn &plugIn, const PlugInModifier &prefix, DataReader &reader) override;
 };
 
+struct FadeModifier : public PlugInModifierData {
+	PlugInTypeTaggedValue unknown1Event; // Probably "Enable When"
+	PlugInTypeTaggedValue unknown2Event; // Probably "Disable When"
+	PlugInTypeTaggedValue unknown3Int;   // Int
+	PlugInTypeTaggedValue unknown4Int;   // Int
+	PlugInTypeTaggedValue unknown5Int;   // Int
+
+protected:
+	DataReadErrorCode load(PlugIn &plugIn, const PlugInModifier &prefix, DataReader &reader) override;
+};
+
 } // End of namespace Standard
 
 } // End of namespace Data


Commit: bba278db34b51c3e223c3514400bed851ff522cc
    https://github.com/scummvm/scummvm/commit/bba278db34b51c3e223c3514400bed851ff522cc
Author: elasota (1137273+elasota at users.noreply.github.com)
Date: 2024-07-04T18:42:36-04:00

Commit Message:
MTROPOLIS: Instantiate aliases before putting them in the modifier inner scope

Changed paths:
    engines/mtropolis/runtime.cpp


diff --git a/engines/mtropolis/runtime.cpp b/engines/mtropolis/runtime.cpp
index 437a5fd5696..e81df4223a9 100644
--- a/engines/mtropolis/runtime.cpp
+++ b/engines/mtropolis/runtime.cpp
@@ -140,7 +140,7 @@ void MainWindow::onAction(MTropolis::Actions::Action action) {
 
 class ModifierInnerScopeBuilder : public IStructuralReferenceVisitor {
 public:
-	ModifierInnerScopeBuilder(ObjectLinkingScope *scope);
+	ModifierInnerScopeBuilder(Runtime *runtime, Modifier *modifier, ObjectLinkingScope *scope);
 
 	void visitChildStructuralRef(Common::SharedPtr<Structural> &structural) override;
 	void visitChildModifierRef(Common::SharedPtr<Modifier> &modifier) override;
@@ -149,9 +149,12 @@ public:
 
 private:
 	ObjectLinkingScope *_scope;
+	Modifier *_modifier;
+	Runtime *_runtime;
 };
 
-ModifierInnerScopeBuilder::ModifierInnerScopeBuilder(ObjectLinkingScope *scope) : _scope(scope) {
+ModifierInnerScopeBuilder::ModifierInnerScopeBuilder(Runtime *runtime, Modifier *modifier, ObjectLinkingScope *scope)
+	: _scope(scope), _modifier(modifier), _runtime(runtime) {
 }
 
 void ModifierInnerScopeBuilder::visitChildStructuralRef(Common::SharedPtr<Structural> &structural) {
@@ -159,7 +162,10 @@ void ModifierInnerScopeBuilder::visitChildStructuralRef(Common::SharedPtr<Struct
 }
 
 void ModifierInnerScopeBuilder::visitChildModifierRef(Common::SharedPtr<Modifier> &modifier) {
-	_scope->addObject(modifier->getStaticGUID(), modifier->getName(), modifier);
+	uint32 oldStaticGUID = modifier->getStaticGUID();
+
+	_runtime->instantiateIfAlias(modifier, _modifier->getSelfReference());
+	_scope->addObject(oldStaticGUID, modifier->getName(), modifier);
 }
 
 void ModifierInnerScopeBuilder::visitWeakStructuralRef(Common::WeakPtr<Structural> &structural) {
@@ -171,7 +177,7 @@ void ModifierInnerScopeBuilder::visitWeakModifierRef(Common::WeakPtr<Modifier> &
 
 class ModifierChildMaterializer : public IStructuralReferenceVisitor {
 public:
-	ModifierChildMaterializer(Runtime *runtime, Modifier *modifier, ObjectLinkingScope *outerScope);
+	ModifierChildMaterializer(Runtime *runtime, ObjectLinkingScope *outerScope);
 
 	void visitChildStructuralRef(Common::SharedPtr<Structural> &structural) override;
 	void visitChildModifierRef(Common::SharedPtr<Modifier> &modifier) override;
@@ -180,26 +186,11 @@ public:
 
 private:
 	Runtime *_runtime;
-	Modifier *_modifier;
 	ObjectLinkingScope *_outerScope;
 };
 
-class ModifierChildCloner : public IStructuralReferenceVisitor {
-public:
-	ModifierChildCloner(Runtime *runtime, const Common::WeakPtr<RuntimeObject> &relinkParent);
-
-	void visitChildStructuralRef(Common::SharedPtr<Structural> &structural) override;
-	void visitChildModifierRef(Common::SharedPtr<Modifier> &modifier) override;
-	void visitWeakStructuralRef(Common::WeakPtr<Structural> &structural) override;
-	void visitWeakModifierRef(Common::WeakPtr<Modifier> &modifier) override;
-
-private:
-	Runtime *_runtime;
-	Common::WeakPtr<RuntimeObject> _relinkParent;
-};
-
-ModifierChildMaterializer::ModifierChildMaterializer(Runtime *runtime, Modifier *modifier, ObjectLinkingScope *outerScope)
-	: _runtime(runtime), _modifier(modifier), _outerScope(outerScope) {
+ModifierChildMaterializer::ModifierChildMaterializer(Runtime *runtime, ObjectLinkingScope *outerScope)
+	: _runtime(runtime), _outerScope(outerScope) {
 }
 
 void ModifierChildMaterializer::visitChildStructuralRef(Common::SharedPtr<Structural> &structural) {
@@ -207,7 +198,6 @@ void ModifierChildMaterializer::visitChildStructuralRef(Common::SharedPtr<Struct
 }
 
 void ModifierChildMaterializer::visitChildModifierRef(Common::SharedPtr<Modifier> &modifier) {
-	_runtime->instantiateIfAlias(modifier, _modifier->getSelfReference());
 	modifier->materialize(_runtime, _outerScope);
 }
 
@@ -219,6 +209,20 @@ void ModifierChildMaterializer::visitWeakModifierRef(Common::WeakPtr<Modifier> &
 	// Do nothing
 }
 
+class ModifierChildCloner : public IStructuralReferenceVisitor {
+public:
+	ModifierChildCloner(Runtime *runtime, const Common::WeakPtr<RuntimeObject> &relinkParent);
+
+	void visitChildStructuralRef(Common::SharedPtr<Structural> &structural) override;
+	void visitChildModifierRef(Common::SharedPtr<Modifier> &modifier) override;
+	void visitWeakStructuralRef(Common::WeakPtr<Structural> &structural) override;
+	void visitWeakModifierRef(Common::WeakPtr<Modifier> &modifier) override;
+
+private:
+	Runtime *_runtime;
+	Common::WeakPtr<RuntimeObject> _relinkParent;
+};
+
 ModifierChildCloner::ModifierChildCloner(Runtime *runtime, const Common::WeakPtr<RuntimeObject> &relinkParent)
 	: _runtime(runtime), _relinkParent(relinkParent) {
 }
@@ -3449,6 +3453,11 @@ void Structural::materializeDescendents(Runtime *runtime, ObjectLinkingScope *ou
 
 	for (Common::Array<Common::SharedPtr<Modifier> >::const_iterator it = _modifiers.begin(), itEnd = _modifiers.end(); it != itEnd; ++it) {
 		Modifier *modifier = it->get();
+
+		if (modifier->getStaticGUID() == 0x00040c8d) {
+			int n = 0;
+		}
+
 		modifier->materialize(runtime, modifierScope);
 	}
 
@@ -9362,10 +9371,10 @@ void Modifier::materialize(Runtime *runtime, ObjectLinkingScope *outerScope) {
 	ObjectLinkingScope innerScope;
 	innerScope.setParent(outerScope);
 
-	ModifierInnerScopeBuilder innerScopeBuilder(&innerScope);
+	ModifierInnerScopeBuilder innerScopeBuilder(runtime, this, &innerScope);
 	this->visitInternalReferences(&innerScopeBuilder);
 
-	ModifierChildMaterializer childMaterializer(runtime, this, &innerScope);
+	ModifierChildMaterializer childMaterializer(runtime, &innerScope);
 	this->visitInternalReferences(&childMaterializer);
 
 	linkInternalReferences(outerScope);


Commit: d22b49fb05a008fbb315c00494af338efa9e1c31
    https://github.com/scummvm/scummvm/commit/d22b49fb05a008fbb315c00494af338efa9e1c31
Author: elasota (1137273+elasota at users.noreply.github.com)
Date: 2024-07-04T18:42:58-04:00

Commit Message:
MTROPOLIS: Add more attribs to SysInfo

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


diff --git a/engines/mtropolis/plugin/standard.cpp b/engines/mtropolis/plugin/standard.cpp
index feb05b3d136..f7140e999c7 100644
--- a/engines/mtropolis/plugin/standard.cpp
+++ b/engines/mtropolis/plugin/standard.cpp
@@ -1401,6 +1401,45 @@ bool SysInfoModifier::readAttribute(MiniscriptThread *thread, DynamicValue &resu
 		return true;
 	} else if (attrib == "currentram") {
 		result.setInt(256 * 1024 * 1024);
+		return true;
+	} else if (attrib == "architecture") {
+		ProjectPlatform platform = thread->getRuntime()->getProject()->getPlatform();
+
+		if (platform == kProjectPlatformWindows)
+			result.setString("80x86");
+		else if (platform == kProjectPlatformMacintosh)
+			result.setString("PowerPC"); // MC680x0 for 68k
+		else {
+			thread->error("Couldn't resolve architecture");
+			return false;
+		}
+
+		return true;
+	} else if (attrib == "sysversion") {
+		ProjectPlatform platform = thread->getRuntime()->getProject()->getPlatform();
+
+		if (platform == kProjectPlatformMacintosh)
+			result.setString("9.0.4");
+		else if (platform == kProjectPlatformWindows)
+			result.setString("4.0");	// Windows version?  MindGym checks for < 4
+		else {
+			thread->error("Couldn't resolve architecture");
+			return false;
+		}
+
+		return true;
+	} else if (attrib == "processor" || attrib == "nativecpu") {
+		ProjectPlatform platform = thread->getRuntime()->getProject()->getPlatform();
+
+		if (platform == kProjectPlatformMacintosh)
+			result.setString("604");		// PowerPC 604
+		else if (platform == kProjectPlatformWindows)
+			result.setString("Pentium");
+		else {
+			thread->error("Couldn't resolve architecture");
+			return false;
+		}
+
 		return true;
 	}
 


Commit: 82a25bb27113eae8262407dfbe639461495a5276
    https://github.com/scummvm/scummvm/commit/82a25bb27113eae8262407dfbe639461495a5276
Author: elasota (1137273+elasota at users.noreply.github.com)
Date: 2024-07-04T18:43:37-04:00

Commit Message:
MTROPOLIS: Remove errant debug code

Changed paths:
    engines/mtropolis/runtime.cpp


diff --git a/engines/mtropolis/runtime.cpp b/engines/mtropolis/runtime.cpp
index e81df4223a9..54b3dd5ceab 100644
--- a/engines/mtropolis/runtime.cpp
+++ b/engines/mtropolis/runtime.cpp
@@ -3453,11 +3453,6 @@ void Structural::materializeDescendents(Runtime *runtime, ObjectLinkingScope *ou
 
 	for (Common::Array<Common::SharedPtr<Modifier> >::const_iterator it = _modifiers.begin(), itEnd = _modifiers.end(); it != itEnd; ++it) {
 		Modifier *modifier = it->get();
-
-		if (modifier->getStaticGUID() == 0x00040c8d) {
-			int n = 0;
-		}
-
 		modifier->materialize(runtime, modifierScope);
 	}
 


Commit: 35d89b254b1cddd06967614b7f319432a2907fd8
    https://github.com/scummvm/scummvm/commit/35d89b254b1cddd06967614b7f319432a2907fd8
Author: elasota (1137273+elasota at users.noreply.github.com)
Date: 2024-07-04T19:34:40-04:00

Commit Message:
MTROPOLIS: Permit list expansion

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


diff --git a/engines/mtropolis/plugin/standard.cpp b/engines/mtropolis/plugin/standard.cpp
index f7140e999c7..5b4c620bb33 100644
--- a/engines/mtropolis/plugin/standard.cpp
+++ b/engines/mtropolis/plugin/standard.cpp
@@ -1172,11 +1172,6 @@ MiniscriptInstructionOutcome ListVariableModifier::scriptSetCount(MiniscriptThre
 
 	size_t newSize = asInteger;
 	if (newSize > storage->_list->getSize()) {
-		if (storage->_list->getSize() == 0) {
-			thread->error("Restoring an empty list by setting its count isn't implemented");
-			return kMiniscriptInstructionOutcomeFailed;
-		}
-
 		storage->_list->expandToMinimumSize(newSize);
 	} else if (newSize < storage->_list->getSize()) {
 		storage->_list->truncateToSize(newSize);


Commit: 42e2c4c2424282067c6218037f1d03b00d0b6243
    https://github.com/scummvm/scummvm/commit/42e2c4c2424282067c6218037f1d03b00d0b6243
Author: elasota (1137273+elasota at users.noreply.github.com)
Date: 2024-07-04T19:48:33-04:00

Commit Message:
MTROPOLIS: Add nthelement and elementindex attribs

Changed paths:
    engines/mtropolis/runtime.cpp
    engines/mtropolis/runtime.h


diff --git a/engines/mtropolis/runtime.cpp b/engines/mtropolis/runtime.cpp
index 54b3dd5ceab..159b58c60ae 100644
--- a/engines/mtropolis/runtime.cpp
+++ b/engines/mtropolis/runtime.cpp
@@ -3197,6 +3197,20 @@ bool Structural::readAttribute(MiniscriptThread *thread, DynamicValue &result, c
 	} else if (attrib == "element") {
 		result.setObject(getSelfReference());
 		return true;
+	} else if (attrib == "elementindex") {
+		int32 elementIndex = 0;
+
+		for (const Common::SharedPtr<Structural> &parentChild : _parent->getChildren()) {
+			if (parentChild.get() == this)
+				break;
+
+			elementIndex++;
+		}
+
+		assert(static_cast<uint>(elementIndex) < _parent->getChildren().size());
+
+		result.setInt(elementIndex + 1);
+		return true;
 	}
 
 	// Traverse children (modifiers must be first)
@@ -3292,6 +3306,29 @@ MiniscriptInstructionOutcome Structural::writeRefAttribute(MiniscriptThread *thr
 	return RuntimeObject::writeRefAttribute(thread, result, attrib);
 }
 
+bool Structural::readAttributeIndexed(MiniscriptThread *thread, DynamicValue &result, const Common::String &attrib, const DynamicValue &index) {
+	if (attrib == "nthelement") {
+		DynamicValue indexConverted;
+		if (!index.convertToType(DynamicValueTypes::kInteger, indexConverted)) {
+			thread->error("Invalid index for 'nthelement'");
+			return false;
+		}
+
+		int32 indexInt = indexConverted.getInt();
+
+		if (indexInt < 1 || static_cast<uint32>(indexInt) > _children.size()) {
+			thread->error("Index out of range for 'nthelement'");
+			return false;
+		}
+
+		result.setObject(_children[indexInt - 1]->getSelfReference());
+		return true;
+	}
+
+	return Structural::readAttributeIndexed(thread, result, attrib, index);
+}
+
+
 const Common::Array<Common::SharedPtr<Structural> > &Structural::getChildren() const {
 	return _children;
 }
diff --git a/engines/mtropolis/runtime.h b/engines/mtropolis/runtime.h
index 97f9022a5e3..5be43e14ee1 100644
--- a/engines/mtropolis/runtime.h
+++ b/engines/mtropolis/runtime.h
@@ -2165,6 +2165,7 @@ public:
 	bool isStructural() const override;
 
 	bool readAttribute(MiniscriptThread *thread, DynamicValue &result, const Common::String &attrib) override;
+	bool readAttributeIndexed(MiniscriptThread *thread, DynamicValue &result, const Common::String &attrib, const DynamicValue &index) override;
 	MiniscriptInstructionOutcome writeRefAttribute(MiniscriptThread *thread, DynamicValueWriteProxy &result, const Common::String &attrib) override;
 
 	const Common::Array<Common::SharedPtr<Structural> > &getChildren() const;




More information about the Scummvm-git-logs mailing list