[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