diff --git a/engines/mtropolis/runtime.cpp b/engines/mtropolis/runtime.cpp index 7f80d3cfef8..135d9cf4668 100644 --- a/engines/mtropolis/runtime.cpp +++ b/engines/mtropolis/runtime.cpp @@ -1712,6 +1712,17 @@ void DynamicValueWriteBoolHelper::create(bool *boolValue, DynamicValueWriteProxy DynamicValueWriteBoolHelper DynamicValueWriteBoolHelper::_instance; MiniscriptInstructionOutcome DynamicValueWriteObjectHelper::write(MiniscriptThread *thread, const DynamicValue &value, void *objectRef, uintptr ptrOrOffset) const { + RuntimeObject *obj = static_cast(objectRef); + if (obj->isModifier() && static_cast(obj)->isVariable()) { + VariableModifier *var = static_cast(obj); + if (var->varSetValue(thread, value)) + return kMiniscriptInstructionOutcomeContinue; + else { + thread->error("Failed to assign value to variable"); + return kMiniscriptInstructionOutcomeFailed; + } + } + thread->error("Can't write to read-only object value"); return kMiniscriptInstructionOutcomeFailed; } @@ -2667,6 +2678,22 @@ MiniscriptInstructionOutcome Structural::writeRefAttribute(MiniscriptThread *thr return kMiniscriptInstructionOutcomeContinue; } + // Attempt to resolve as a child object + // Modifiers are first, then structural + for (const Common::SharedPtr &modifier : _modifiers) { + if (caseInsensitiveEqual(modifier->getName(), attrib)) { + DynamicValueWriteObjectHelper::create(modifier.get(), result); + return kMiniscriptInstructionOutcomeContinue; + } + } + + for (const Common::SharedPtr &child : _children) { + if (caseInsensitiveEqual(child->getName(), attrib)) { + DynamicValueWriteObjectHelper::create(child.get(), result); + return kMiniscriptInstructionOutcomeContinue; + } + } + return RuntimeObject::writeRefAttribute(thread, result, attrib); }