[Scummvm-git-logs] scummvm master -> 606a1d0eb65a2540cd0c7d717a7921ed16bc2563

elasota noreply at scummvm.org
Wed Dec 28 13:25:42 UTC 2022


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:
606a1d0eb6 MTROPOLIS: Add support for setting mToon range to a label.  Fixes MTI Benbow moose head.


Commit: 606a1d0eb65a2540cd0c7d717a7921ed16bc2563
    https://github.com/scummvm/scummvm/commit/606a1d0eb65a2540cd0c7d717a7921ed16bc2563
Author: elasota (ejlasota at gmail.com)
Date: 2022-12-28T08:15:44-05:00

Commit Message:
MTROPOLIS: Add support for setting mToon range to a label.  Fixes MTI Benbow moose head.

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


diff --git a/engines/mtropolis/elements.cpp b/engines/mtropolis/elements.cpp
index fda3b109121..4c51d2741f8 100644
--- a/engines/mtropolis/elements.cpp
+++ b/engines/mtropolis/elements.cpp
@@ -1553,6 +1553,26 @@ MiniscriptInstructionOutcome MToonElement::scriptSetRange(MiniscriptThread *thre
 		return scriptSetRangeTyped(thread, value.getIntRange());
 	if (value.getType() == DynamicValueTypes::kPoint)
 		return scriptSetRangeTyped(thread, value.getPoint());
+	if (value.getType() == DynamicValueTypes::kLabel) {
+		const Common::String *nameStrPtr = thread->getRuntime()->getProject()->findNameOfLabel(value.getLabel());
+		if (!nameStrPtr) {
+			thread->error("mToon range label wasn't found");
+			return kMiniscriptInstructionOutcomeFailed;
+		}
+
+		if (!_metadata) {
+			thread->error("mToon range couldn't be resolved because the metadata wasn't loaded yet");
+			return kMiniscriptInstructionOutcomeFailed;
+		}
+
+		for (const MToonMetadata::FrameRangeDef &frameRange : _metadata->frameRanges) {
+			if (caseInsensitiveEqual(frameRange.name, *nameStrPtr))
+				return scriptSetRangeTyped(thread, IntRange(frameRange.startFrame, frameRange.endFrame));
+		}
+
+		thread->error("mToon range was assigned to a label but the label doesn't exist in the mToon data");
+		return kMiniscriptInstructionOutcomeFailed;
+	}
 
 	thread->error("Invalid type for mToon range");
 	return kMiniscriptInstructionOutcomeFailed;
diff --git a/engines/mtropolis/runtime.cpp b/engines/mtropolis/runtime.cpp
index 454e5f62fe0..cb1014cd734 100644
--- a/engines/mtropolis/runtime.cpp
+++ b/engines/mtropolis/runtime.cpp
@@ -7104,6 +7104,23 @@ Common::SeekableReadStream* Project::getStreamForSegment(int segmentIndex) {
 	return _segments[segmentIndex].weakStream;
 }
 
+const Common::String *Project::findNameOfLabel(const Label &label) const {
+	for (const LabelSuperGroup &superGroup : _labelSuperGroups) {
+		if (superGroup.superGroupID == label.superGroupID) {
+			size_t firstRootIndex = superGroup.firstRootNodeIndex;
+			size_t totalNodes = superGroup.numTotalNodes;
+
+			for (size_t i = 0; i < totalNodes; i++) {
+				const LabelTree &tree = _labelTree[i + firstRootIndex];
+				if (tree.id == label.id)
+					return &tree.name;
+			}
+		}
+	}
+
+	return nullptr;
+}
+
 Common::SharedPtr<SegmentUnloadSignaller> Project::notifyOnSegmentUnload(int segmentIndex, ISegmentUnloadSignalReceiver *receiver) {
 	Common::SharedPtr<SegmentUnloadSignaller> signaller = _segments[segmentIndex].unloadSignaller;
 	if (signaller)
@@ -7372,6 +7389,7 @@ void Project::loadLabelMap(const Data::ProjectLabelMap &projectLabelMap) {
 		sg.superGroupID = dataSG.id;
 
 		sg.firstRootNodeIndex = insertionOffset;
+		sg.numRootNodes = dataSG.numChildren;
 
 		for (size_t j = 0; j < dataSG.numChildren; j++)
 			treeQueue[insertionOffset++] = &dataSG.tree[j];
diff --git a/engines/mtropolis/runtime.h b/engines/mtropolis/runtime.h
index 4bd33306828..235108b8592 100644
--- a/engines/mtropolis/runtime.h
+++ b/engines/mtropolis/runtime.h
@@ -2385,6 +2385,8 @@ public:
 	void closeSegmentStream(int segmentIndex);
 	Common::SeekableReadStream *getStreamForSegment(int segmentIndex);
 
+	const Common::String *findNameOfLabel(const Label &label) const;
+
 	void onPostRender();
 	void onKeyboardEvent(Runtime *runtime, const Common::EventType evtType, bool repeat, const Common::KeyState &keyEvt);
 




More information about the Scummvm-git-logs mailing list