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

elasota noreply at scummvm.org
Fri Sep 30 02:02:41 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:
c29a2bbff9 MTROPOLIS: Refactor data types to use unrestricted unions


Commit: c29a2bbff93ed554f2060c0a9b8f7fce9e58ce12
    https://github.com/scummvm/scummvm/commit/c29a2bbff93ed554f2060c0a9b8f7fce9e58ce12
Author: elasota (ejlasota at gmail.com)
Date: 2022-09-29T22:01:52-04:00

Commit Message:
MTROPOLIS: Refactor data types to use unrestricted unions

Changed paths:
    engines/mtropolis/data.cpp
    engines/mtropolis/data.h
    engines/mtropolis/plugin/mti.cpp
    engines/mtropolis/plugin/obsidian.cpp
    engines/mtropolis/plugin/standard.cpp
    engines/mtropolis/runtime.cpp


diff --git a/engines/mtropolis/data.cpp b/engines/mtropolis/data.cpp
index b78d78be138..b81dcd8829a 100644
--- a/engines/mtropolis/data.cpp
+++ b/engines/mtropolis/data.cpp
@@ -319,13 +319,7 @@ bool Rect::load(DataReader &reader) {
 		return false;
 }
 
-Rect Rect::createDefault() {
-	Rect rect;
-	rect.top = 0;
-	rect.bottom = 0;
-	rect.left = 0;
-	rect.right = 0;
-	return rect;
+Rect::Rect() : top(0), left(0), bottom(0), right(0) {
 }
 
 bool Rect::toScummVMRect(Common::Rect &outRect) const {
@@ -343,11 +337,7 @@ bool Rect::toScummVMRectUnchecked(Common::Rect &outRect) const {
 	return true;
 }
 
-Point Point::createDefault() {
-	Point pt;
-	pt.x = 0;
-	pt.y = 0;
-	return pt;
+Point::Point() : x(0), y(0) {
 }
 
 bool Point::load(DataReader &reader) {
@@ -364,11 +354,7 @@ bool Point::toScummVMPoint(Common::Point &outPoint) const {
 	return true;
 }
 
-Event Event::createDefault() {
-	Event evt;
-	evt.eventID = 0;
-	evt.eventInfo = 0;
-	return evt;
+Event::Event() : eventID(0), eventInfo(0) {
 }
 
 bool Event::load(DataReader& reader) {
@@ -400,11 +386,7 @@ bool IntRange::load(DataReader& reader) {
 	return reader.readS32(min) && reader.readS32(max);
 }
 
-IntRange IntRange::createDefault() {
-	IntRange intRange;
-	intRange.min = 0;
-	intRange.max = 0;
-	return intRange;
+IntRange::IntRange() : min(0), max(0) {
 }
 
 bool XPFloatVector::load(DataReader& reader) {
@@ -432,7 +414,9 @@ bool Label::load(DataReader &reader) {
 }
 
 InternalTypeTaggedValue::InternalTypeTaggedValue() : type(0) {
-	memset(&this->value, 0, sizeof(this->value));
+}
+
+InternalTypeTaggedValue::~InternalTypeTaggedValue() {
 }
 
 bool InternalTypeTaggedValue::load(DataReader &reader) {
@@ -455,30 +439,37 @@ bool InternalTypeTaggedValue::load(DataReader &reader) {
 	case kString:	// Not a bug - string data is external!
 		break;
 	case kInteger:
+		value.constructField(&ValueUnion::asInteger);
 		if (!valueReader.readS32(value.asInteger))
 			return false;
 		break;
 	case kPoint:
+		value.constructField(&ValueUnion::asPoint);
 		if (!value.asPoint.load(valueReader))
 			return false;
 		break;
 	case kIntegerRange:
+		value.constructField(&ValueUnion::asIntegerRange);
 		if (!value.asIntegerRange.load(valueReader))
 			return false;
 		break;
 	case kFloat:
+		value.constructField(&ValueUnion::asFloat);
 		if (!value.asFloat.load(valueReader))
 			return false;
 		break;
 	case kBool:
+		value.constructField(&ValueUnion::asBool);
 		if (!valueReader.readU8(value.asBool))
 			return false;
 		break;
 	case kVariableReference:
+		value.constructField(&ValueUnion::asVariableReference);
 		if (!valueReader.readU32(value.asVariableReference.unknown) || !valueReader.readU32(value.asVariableReference.guid))
 			return false;
 		break;
 	case kLabel:
+		value.constructField(&ValueUnion::asLabel);
 		if (!value.asLabel.load(valueReader))
 			return false;
 		break;
@@ -490,10 +481,25 @@ bool InternalTypeTaggedValue::load(DataReader &reader) {
 	return true;
 }
 
+InternalTypeTaggedValue::ValueUnion::ValueUnion() {
+}
 
+template<class T>
+void InternalTypeTaggedValue::ValueUnion::constructField(T InternalTypeTaggedValue::ValueUnion:: *fieldPtr) {
+	new (&(this->*fieldPtr)) T();
+}
 
 PlugInTypeTaggedValue::PlugInTypeTaggedValue() : type(kNull) {
-	memset(&this->value, 0, sizeof(this->value));
+}
+
+PlugInTypeTaggedValue::~PlugInTypeTaggedValue() {
+	switch (type) {
+	case kString:
+		value.destructField(&ValueUnion::asString);
+		break;
+	default:
+		break;
+	}
 }
 
 bool PlugInTypeTaggedValue::load(DataReader &reader) {
@@ -505,44 +511,54 @@ bool PlugInTypeTaggedValue::load(DataReader &reader) {
 	case kIncomingData:
 		break;
 	case kPoint:
+		value.constructField(&ValueUnion::asPoint);
 		if (!value.asPoint.load(reader))
 			return false;
 		break;
 	case kInteger:
+		value.constructField(&ValueUnion::asInt);
 		if (!reader.readS32(value.asInt))
 			return false;
 		break;
 	case kIntegerRange:
+		value.constructField(&ValueUnion::asIntRange);
 		if (!value.asIntRange.load(reader))
 			return false;
 		break;
 	case kFloat:
+		value.constructField(&ValueUnion::asFloat);
 		if (!value.asFloat.load(reader))
 			return false;
 		break;
 	case kBoolean:
+		value.constructField(&ValueUnion::asBoolean);
 		if (!reader.readU16(value.asBoolean))
 			return false;
 		break;
 	case kEvent:
+		value.constructField(&ValueUnion::asEvent);
 		if (!value.asEvent.load(reader))
 			return false;
 		break;
 	case kLabel:
+		value.constructField(&ValueUnion::asLabel);
 		// This is the opposite of internal vars...
 		if (!reader.readU32(value.asLabel.labelID) || !reader.readU32(value.asLabel.superGroupID))
 			return false;
 		break;
 	case kString: {
+			value.constructField(&ValueUnion::asString);
+
 			uint32 length1;
 			uint32 length2;
 			if (!reader.readU32(length1) || !reader.readU32(length2))
 				return false;
 			// Usually length1 == length2 but sometimes not?
-			if (!reader.readTerminatedStr(this->str, length2))
+			if (!reader.readTerminatedStr(value.asString, length2))
 				return false;
 		} break;
 	case kVariableReference: {
+			value.constructField(&ValueUnion::asVarRefGUID);
 			uint32 extraDataSize;
 			if (!reader.readU32(value.asVarRefGUID) || !reader.readU32(extraDataSize))
 				return false;
@@ -561,6 +577,22 @@ bool PlugInTypeTaggedValue::load(DataReader &reader) {
 	return true;
 }
 
+PlugInTypeTaggedValue::ValueUnion::ValueUnion() {
+}
+
+PlugInTypeTaggedValue::ValueUnion::~ValueUnion() {
+}
+
+template<class T>
+void PlugInTypeTaggedValue::ValueUnion::constructField(T PlugInTypeTaggedValue::ValueUnion::*fieldPtr) {
+	new (&(this->*fieldPtr)) T();
+}
+
+template<class T>
+void PlugInTypeTaggedValue::ValueUnion::destructField(T PlugInTypeTaggedValue::ValueUnion::*fieldPtr) {
+	(this->*fieldPtr).~T();
+}
+
 DataObject::DataObject() : _type(DataObjectTypes::kUnknown), _revision(0) {
 }
 
@@ -683,7 +715,7 @@ DataReadErrorCode ProjectHeader::load(DataReader &reader) {
 }
 
 PresentationSettings::PresentationSettings()
-	: persistFlags(0), dimensions(Point::createDefault()), sizeIncludingTag(0), unknown1{0, 0}, bitsPerPixel(0), unknown4(0) {
+	: persistFlags(0), sizeIncludingTag(0), unknown1{0, 0}, bitsPerPixel(0), unknown4(0) {
 }
 
 DataReadErrorCode PresentationSettings::load(DataReader &reader) {
@@ -808,7 +840,7 @@ DataReadErrorCode SubsectionStructuralDef::load(DataReader &reader) {
 
 GraphicElement::GraphicElement()
 	: sizeIncludingTag(0), guid(0), lengthOfName(0), elementFlags(0), layer(0), sectionID(0),
-	  rect1(Rect::createDefault()), rect2(Rect::createDefault()), streamLocator(0), unknown11{0, 0, 0, 0} {
+	  streamLocator(0), unknown11{0, 0, 0, 0} {
 }
 
 DataReadErrorCode GraphicElement::load(DataReader& reader) {
@@ -826,7 +858,7 @@ DataReadErrorCode GraphicElement::load(DataReader& reader) {
 
 ImageElement::ImageElement()
 	: sizeIncludingTag(0), guid(0), lengthOfName(0), elementFlags(0), layer(0), sectionID(0),
-	  rect1(Rect::createDefault()), rect2(Rect::createDefault()), imageAssetID(0), streamLocator(0), unknown7{0, 0, 0, 0} {
+	  imageAssetID(0), streamLocator(0), unknown7{0, 0, 0, 0} {
 }
 
 DataReadErrorCode ImageElement::load(DataReader &reader) {
@@ -845,7 +877,7 @@ DataReadErrorCode ImageElement::load(DataReader &reader) {
 
 TextLabelElement::TextLabelElement()
 	: sizeIncludingTag(0), guid(0), lengthOfName(0), elementFlags(0), layer(0), sectionID(0),
-	  rect1(Rect::createDefault()), rect2(Rect::createDefault()), assetID(0), haveMacPart(false), haveWinPart(false) {
+	  assetID(0), haveMacPart(false), haveWinPart(false) {
 	memset(&this->platform, 0, sizeof(this->platform));
 }
 
@@ -913,7 +945,7 @@ DataReadErrorCode SoundElement::load(DataReader& reader) {
 MovieElement::MovieElement()
 	: sizeIncludingTag(0), guid(0), lengthOfName(0), elementFlags(0), layer(0),
 	  unknown3{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-	  sectionID(0), unknown5{0, 0}, rect1(Rect::createDefault()), rect2(Rect::createDefault()), assetID(0), unknown7(0), volume(0), animationFlags(0),
+	  sectionID(0), unknown5{0, 0}, assetID(0), unknown7(0), volume(0), animationFlags(0),
 	  unknown10{0, 0, 0, 0}, unknown11{0, 0, 0, 0}, streamLocator(0), unknown13{0, 0, 0, 0} {
 }
 
@@ -935,7 +967,7 @@ DataReadErrorCode MovieElement::load(DataReader &reader) {
 
 MToonElement::MToonElement()
 	: sizeIncludingTag(0), guid(0), lengthOfName(0), elementFlags(0), layer(0), animationFlags(0), unknown4{ 0, 0, 0, 0 },
-	  sectionID(0), rect1(Rect::createDefault()), rect2(Rect::createDefault()), assetID(0), rateTimes100000(0), streamLocator(0), unknown6(0) {
+	  sectionID(0), assetID(0), rateTimes100000(0), streamLocator(0), unknown6(0) {
 }
 
 DataReadErrorCode MToonElement::load(DataReader &reader) {
@@ -1064,8 +1096,7 @@ DataReadErrorCode StreamHeader::load(DataReader& reader) {
 
 BehaviorModifier::BehaviorModifier()
 	: modifierFlags(0), sizeIncludingTag(0), unknown2{0, 0}, guid(0), unknown4(0), unknown5(0), unknown6(0),
-	  editorLayoutPosition(Point::createDefault()), lengthOfName(0), numChildren(0), behaviorFlags(0),
-	  enableWhen(Event::createDefault()), disableWhen(Event::createDefault()), unknown7{0, 0} {
+	  lengthOfName(0), numChildren(0), behaviorFlags(0), unknown7{0, 0} {
 }
 
 DataReadErrorCode BehaviorModifier::load(DataReader& reader) {
@@ -1143,7 +1174,7 @@ bool MiniscriptProgram::load(DataReader &reader) {
 }
 
 TypicalModifierHeader::TypicalModifierHeader()
-	: modifierFlags(0), sizeIncludingTag(0), guid(0), unknown3{0, 0, 0, 0, 0, 0}, unknown4(0), editorLayoutPosition(Point::createDefault()), lengthOfName(0) {
+	: modifierFlags(0), sizeIncludingTag(0), guid(0), unknown3{0, 0, 0, 0, 0, 0}, unknown4(0), lengthOfName(0) {
 }
 
 bool TypicalModifierHeader::load(DataReader& reader) {
@@ -1159,7 +1190,7 @@ bool TypicalModifierHeader::load(DataReader& reader) {
 }
 
 MiniscriptModifier::MiniscriptModifier()
-	: enableWhen(Event::createDefault()), unknown6{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, unknown7(0) {
+	: unknown6{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, unknown7(0) {
 }
 
 DataReadErrorCode MiniscriptModifier::load(DataReader &reader) {
@@ -1172,7 +1203,7 @@ DataReadErrorCode MiniscriptModifier::load(DataReader &reader) {
 	return kDataReadErrorNone;
 }
 
-ColorTableModifier::ColorTableModifier() : applyWhen(Event::createDefault()), unknown1(0), unknown2{0, 0, 0, 0}, assetID(0) {
+ColorTableModifier::ColorTableModifier() : unknown1(0), unknown2{0, 0, 0, 0}, assetID(0) {
 }
 
 DataReadErrorCode ColorTableModifier::load(DataReader &reader) {
@@ -1205,8 +1236,7 @@ DataReadErrorCode SoundFadeModifier::load(DataReader &reader) {
 }
 
 SaveAndRestoreModifier::SaveAndRestoreModifier()
-	: unknown1{0, 0, 0, 0}, saveWhen(Event::createDefault()), restoreWhen(Event::createDefault()),
-	  unknown5{0, 0, 0, 0, 0, 0, 0, 0}, lengthOfFilePath(0), lengthOfFileName(0), lengthOfVariableName(0), lengthOfVariableString(0) {
+	: unknown1{0, 0, 0, 0}, unknown5{0, 0, 0, 0, 0, 0, 0, 0}, lengthOfFilePath(0), lengthOfFileName(0), lengthOfVariableName(0), lengthOfVariableString(0) {
 }
 
 DataReadErrorCode SaveAndRestoreModifier::load(DataReader &reader) {
@@ -1224,7 +1254,7 @@ DataReadErrorCode SaveAndRestoreModifier::load(DataReader &reader) {
 }
 
 MessengerModifier::MessengerModifier()
-	: messageFlags(0), send(Event::createDefault()), when(Event::createDefault()), unknown14(0), destination(0),
+	: messageFlags(0), unknown14(0), destination(0),
 	  unknown11{0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, withSourceLength(0), withStringLength(0) {
 }
 
@@ -1247,8 +1277,8 @@ DataReadErrorCode MessengerModifier::load(DataReader &reader) {
 }
 
 SetModifier::SetModifier()
-	: unknown1{0, 0, 0, 0}, executeWhen(Event::createDefault()), unknown3(0),
-	  sourceNameLength(0), targetNameLength(0), sourceStringLength(0), targetStringLength(0), unknown4(0) {
+	: unknown1{0, 0, 0, 0}, unknown3(0), sourceNameLength(0), targetNameLength(0),
+	  sourceStringLength(0), targetStringLength(0), unknown4(0) {
 }
 
 DataReadErrorCode SetModifier::load(DataReader &reader) {
@@ -1269,7 +1299,7 @@ DataReadErrorCode SetModifier::load(DataReader &reader) {
 
 AliasModifier::AliasModifier()
 	: modifierFlags(0), sizeIncludingTag(0), aliasIndexPlusOne(0), unknown1(0), unknown2(0)
-	, lengthOfName(0), guid(0), editorLayoutPosition(Point::createDefault()), haveGUID(false) {
+	, lengthOfName(0), guid(0), haveGUID(false) {
 }
 
 DataReadErrorCode AliasModifier::load(DataReader& reader) {
@@ -1301,7 +1331,7 @@ DataReadErrorCode AliasModifier::load(DataReader& reader) {
 }
 
 ChangeSceneModifier::ChangeSceneModifier()
-	: executeWhen(Event::createDefault()), changeSceneFlags(0), targetSectionGUID(0), targetSubsectionGUID(0), targetSceneGUID(0) {
+	: changeSceneFlags(0), targetSectionGUID(0), targetSubsectionGUID(0), targetSceneGUID(0) {
 }
 
 DataReadErrorCode ChangeSceneModifier::load(DataReader &reader) {
@@ -1316,8 +1346,7 @@ DataReadErrorCode ChangeSceneModifier::load(DataReader &reader) {
 }
 
 SoundEffectModifier::SoundEffectModifier()
-	: unknown1{0, 0, 0, 0}, executeWhen(Event::createDefault()), terminateWhen(Event::createDefault()),
-	  unknown2(0), unknown3{0, 0, 0, 0}, assetID(0), unknown5{0, 0, 0, 0} {
+	: unknown1{0, 0, 0, 0}, unknown2(0), unknown3{0, 0, 0, 0}, assetID(0), unknown5{0, 0, 0, 0} {
 }
 
 DataReadErrorCode SoundEffectModifier::load(DataReader &reader) {
@@ -1332,7 +1361,7 @@ DataReadErrorCode SoundEffectModifier::load(DataReader &reader) {
 	return kDataReadErrorNone;
 }
 
-PathMotionModifier::PointDefMessageSpec::PointDefMessageSpec() : messageFlags(0), send(Event::createDefault()), unknown11(0),
+PathMotionModifier::PointDefMessageSpec::PointDefMessageSpec() : messageFlags(0), unknown11(0),
 	  destination(0), unknown13{0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, withSourceLength(0), withStringLength(0) {
 }
 
@@ -1364,11 +1393,11 @@ bool PathMotionModifier::PointDef::load(DataReader &reader, bool haveMessageSpec
 
 
 PathMotionModifier::PointDef::PointDef()
-	: point(Point::createDefault()), frame(0), frameFlags(0) {
+	: frame(0), frameFlags(0) {
 }
 
 PathMotionModifier::PathMotionModifier(uint version)
-	: flags(0), executeWhen(Event::createDefault()), terminateWhen(Event::createDefault()), unknown2{0, 0}, numPoints(0), unknown3{0, 0, 0, 0},
+	: flags(0), unknown2{0, 0}, numPoints(0), unknown3{0, 0, 0, 0},
 	  frameDurationTimes10Million(0), unknown5{0, 0, 0, 0}, unknown6(0), havePointDefMessageSpecs(version >= 2) {
 }
 
@@ -1399,8 +1428,7 @@ DataReadErrorCode PathMotionModifier::load(DataReader &reader) {
 }
 
 DragMotionModifier::DragMotionModifier()
-	: enableWhen(Event::createDefault()), disableWhen(Event::createDefault()), haveMacPart(false), haveWinPart(false),
-	  constraintMargin(Rect::createDefault()), unknown1(0) {
+	: haveMacPart(false), haveWinPart(false), unknown1(0) {
 	memset(&this->platform, 0, sizeof(this->platform));
 }
 
@@ -1438,7 +1466,7 @@ DataReadErrorCode DragMotionModifier::load(DataReader &reader) {
 }
 
 VectorMotionModifier::VectorMotionModifier()
-	: enableWhen(Event::createDefault()), disableWhen(Event::createDefault()), unknown1(0), vecSourceLength(0), vecStringLength(0) {
+	: unknown1(0), vecSourceLength(0), vecStringLength(0) {
 }
 
 DataReadErrorCode VectorMotionModifier::load(DataReader &reader) {
@@ -1458,8 +1486,7 @@ DataReadErrorCode VectorMotionModifier::load(DataReader &reader) {
 }
 
 SceneTransitionModifier::SceneTransitionModifier()
-	: enableWhen(Event::createDefault()), disableWhen(Event::createDefault()), transitionType(0), direction(0),
-	  unknown3(0), steps(0), duration(0), unknown5{0, 0} {
+	: transitionType(0), direction(0), unknown3(0), steps(0), duration(0), unknown5{0, 0} {
 }
 
 DataReadErrorCode SceneTransitionModifier::load(DataReader &reader) {
@@ -1478,7 +1505,7 @@ DataReadErrorCode SceneTransitionModifier::load(DataReader &reader) {
 }
 
 ElementTransitionModifier::ElementTransitionModifier()
-	: enableWhen(Event::createDefault()), disableWhen(Event::createDefault()), revealType(0), transitionType(0),
+	: revealType(0), transitionType(0),
 	  unknown3(0), unknown4(0), steps(0), rate(0) {
 }
 
@@ -1498,7 +1525,7 @@ DataReadErrorCode ElementTransitionModifier::load(DataReader &reader) {
 }
 
 SharedSceneModifier::SharedSceneModifier()
-	: executeWhen(Event::createDefault()), unknown1{0, 0, 0, 0}, sectionGUID(0), subsectionGUID(0), sceneGUID(0) {
+	: unknown1{0, 0, 0, 0}, sectionGUID(0), subsectionGUID(0), sceneGUID(0) {
 }
 
 DataReadErrorCode SharedSceneModifier::load(DataReader &reader) {
@@ -1514,7 +1541,7 @@ DataReadErrorCode SharedSceneModifier::load(DataReader &reader) {
 }
 
 IfMessengerModifier::IfMessengerModifier()
-	: messageFlags(0), send(Event::createDefault()), when(Event::createDefault()), unknown6(0), destination(0),
+	: messageFlags(0), unknown6(0), destination(0),
 	  unknown7{0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, unknown9{0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, withSourceLength(0), withStringLength(0) {
 }
 
@@ -1537,9 +1564,8 @@ DataReadErrorCode IfMessengerModifier::load(DataReader &reader) {
 }
 
 TimerMessengerModifier::TimerMessengerModifier()
-	: messageAndTimerFlags(0), executeWhen(Event::createDefault()), send(Event::createDefault()), terminateWhen(Event::createDefault()),
-	  unknown2(0), destination(0), unknown4{0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, unknown5(0), minutes(0), seconds(0), hundredthsOfSeconds(0),
-	  unknown6(0), unknown7(0), unknown8{0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, withSourceLength(0), withStringLength(0) {
+	: messageAndTimerFlags(0), unknown2(0), destination(0), unknown4{0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, unknown5(0),
+	  minutes(0), seconds(0), hundredthsOfSeconds(0), unknown6(0), unknown7(0), unknown8{0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, withSourceLength(0), withStringLength(0) {
 }
 
 DataReadErrorCode TimerMessengerModifier::load(DataReader &reader) {
@@ -1562,8 +1588,7 @@ DataReadErrorCode TimerMessengerModifier::load(DataReader &reader) {
 }
 
 BoundaryDetectionMessengerModifier::BoundaryDetectionMessengerModifier()
-	: messageFlagsHigh(0), enableWhen(Event::createDefault()), disableWhen(Event::createDefault()), send(Event::createDefault()),
-	  unknown2(0), destination(0), unknown3{0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, withSourceLength(0), withStringLength(0) {
+	: messageFlagsHigh(0), unknown2(0), destination(0), unknown3{0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, withSourceLength(0), withStringLength(0) {
 }
 
 DataReadErrorCode BoundaryDetectionMessengerModifier::load(DataReader &reader) {
@@ -1583,8 +1608,8 @@ DataReadErrorCode BoundaryDetectionMessengerModifier::load(DataReader &reader) {
 }
 
 CollisionDetectionMessengerModifier::CollisionDetectionMessengerModifier()
-	: messageAndModifierFlags(0), enableWhen(Event::createDefault()), disableWhen(Event::createDefault()), send(Event::createDefault()),
-	  unknown2(0), destination(0), unknown3{0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, withSourceLength(0), withStringLength(0) {
+	: messageAndModifierFlags(0), unknown2(0), destination(0),
+	  unknown3{0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, withSourceLength(0), withStringLength(0) {
 }
 
 DataReadErrorCode CollisionDetectionMessengerModifier::load(DataReader &reader) {
@@ -1605,7 +1630,7 @@ DataReadErrorCode CollisionDetectionMessengerModifier::load(DataReader &reader)
 
 KeyboardMessengerModifier::KeyboardMessengerModifier()
 	: messageFlagsAndKeyStates(0), unknown2(0), keyModifiers(0), keycode(0), unknown4{0, 0, 0, 0},
-	  message(Event::createDefault()), unknown7(0), destination(0), unknown9{0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+	  unknown7(0), destination(0), unknown9{0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
 	  withSourceLength(0), withStringLength(0) {
 }
 
@@ -1627,8 +1652,7 @@ DataReadErrorCode KeyboardMessengerModifier::load(DataReader &reader) {
 }
 
 TextStyleModifier::TextStyleModifier()
-	: unknown1{0, 0, 0, 0}, macFontID(0), flags(0), unknown2(0), size(0), alignment(0), unknown3(0),
-	  applyWhen(Event::createDefault()), removeWhen(Event::createDefault()), lengthOfFontFamilyName(0) {
+	: unknown1{0, 0, 0, 0}, macFontID(0), flags(0), unknown2(0), size(0), alignment(0), unknown3(0), lengthOfFontFamilyName(0) {
 }
 
 DataReadErrorCode TextStyleModifier::load(DataReader &reader) {
@@ -1646,7 +1670,7 @@ DataReadErrorCode TextStyleModifier::load(DataReader &reader) {
 }
 
 GraphicModifier::GraphicModifier()
-	: unknown1(0), applyWhen(Event::createDefault()), removeWhen(Event::createDefault()), unknown2{0, 0}, inkMode(0), shape(0),
+	: unknown1(0), unknown2{0, 0}, inkMode(0), shape(0),
 	  haveMacPart(false), haveWinPart(false), borderSize(0), shadowSize(0), numPolygonPoints(0), unknown6{0, 0, 0, 0, 0, 0, 0, 0} {
 	memset(&this->platform, 0, sizeof(this->platform));
 }
@@ -1707,7 +1731,7 @@ DataReadErrorCode ImageEffectModifier::load(DataReader &reader) {
 
 CompoundVariableModifier::CompoundVariableModifier()
 	: modifierFlags(0), sizeIncludingTag(0), unknown1{0, 0}, guid(0), unknown4{0, 0, 0, 0, 0, 0}, unknown5(0),
-	  editorLayoutPosition(Point::createDefault()), lengthOfName(0), numChildren(0), unknown7{0, 0, 0, 0} {
+	  lengthOfName(0), numChildren(0), unknown7{0, 0, 0, 0} {
 }
 
 DataReadErrorCode CompoundVariableModifier::load(DataReader &reader) {
@@ -1749,7 +1773,7 @@ DataReadErrorCode IntegerVariableModifier::load(DataReader &reader) {
 	return kDataReadErrorNone;
 }
 
-IntegerRangeVariableModifier::IntegerRangeVariableModifier() : unknown1{0, 0, 0, 0}, range(IntRange::createDefault()) {
+IntegerRangeVariableModifier::IntegerRangeVariableModifier() : unknown1{0, 0, 0, 0} {
 }
 
 DataReadErrorCode IntegerRangeVariableModifier::load(DataReader &reader) {
@@ -1775,7 +1799,7 @@ DataReadErrorCode VectorVariableModifier::load(DataReader &reader) {
 	return kDataReadErrorNone;
 }
 
-PointVariableModifier::PointVariableModifier() : unknown5{0, 0, 0, 0}, value(Point::createDefault()) {
+PointVariableModifier::PointVariableModifier() : unknown5{0, 0, 0, 0} {
 }
 
 DataReadErrorCode PointVariableModifier::load(DataReader &reader) {
@@ -1832,7 +1856,7 @@ PlugInModifierData::~PlugInModifierData() {
 
 PlugInModifier::PlugInModifier()
 	: modifierFlags(0), codedSize(0), modifierName{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-	  guid(0), unknown2{0, 0, 0, 0, 0, 0}, plugInRevision(0), unknown4(0), editorLayoutPosition(Point::createDefault()),
+	  guid(0), unknown2{0, 0, 0, 0, 0, 0}, plugInRevision(0), unknown4(0),
 	  lengthOfName(0), subObjectSize(0) {
 }
 
@@ -2047,9 +2071,9 @@ DataReadErrorCode AudioAsset::load(DataReader &reader) {
 }
 
 ImageAsset::ImageAsset()
-	: persistFlags(0), unknown1(0), unknown2{0, 0, 0, 0}, assetID(0), unknown3(0), rect1(Rect::createDefault()),
+	: persistFlags(0), unknown1(0), unknown2{0, 0, 0, 0}, assetID(0), unknown3(0),
 	  hdpiFixed(0), vdpiFixed(0), bitsPerPixel(0), unknown4{0, 0}, unknown5{0, 0, 0, 0}, unknown6{0, 0, 0, 0, 0, 0, 0, 0},
-	  rect2(Rect::createDefault()), filePosition(0), size(0), haveMacPart(false), haveWinPart(false) {
+	  filePosition(0), size(0), haveMacPart(false), haveWinPart(false) {
 	memset(&this->platform, 0, sizeof(this->platform));
 }
 
@@ -2084,8 +2108,8 @@ DataReadErrorCode ImageAsset::load(DataReader &reader) {
 }
 
 MToonAsset::FrameDef::FrameDef()
-	: unknown12{0, 0, 0, 0}, rect1(Rect::createDefault()), dataOffset(0), unknown13{0, 0}, compressedSize(0), unknown14(0),
-	  keyframeFlag(0), platformBit(0), unknown15(0), rect2(Rect::createDefault()), hdpiFixed(0), vdpiFixed(0), bitsPerPixel(0),
+	: unknown12{0, 0, 0, 0}, dataOffset(0), unknown13{0, 0}, compressedSize(0), unknown14(0),
+	  keyframeFlag(0), platformBit(0), unknown15(0), hdpiFixed(0), vdpiFixed(0), bitsPerPixel(0),
 	  unknown16(0), decompressedBytesPerRow(0), decompressedSize(0) {
 	memset(&this->platform, 0, sizeof(this->platform));
 }
@@ -2099,7 +2123,7 @@ MToonAsset::FrameRangePart::FrameRangePart() : tag(0), sizeIncludingTag(0), numF
 
 MToonAsset::MToonAsset()
 	: marker(0), unknown1{0, 0, 0, 0, 0, 0, 0, 0}, assetID(0), haveMacPart(false), haveWinPart(false), frameDataPosition(0), sizeOfFrameData(0),
-	  mtoonHeader{0, 0}, version(0), unknown2{0, 0, 0, 0}, encodingFlags(0), rect(Rect::createDefault()), numFrames(0),
+	  mtoonHeader{0, 0}, version(0), unknown2{0, 0, 0, 0}, encodingFlags(0), numFrames(0),
 	  unknown3{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, bitsPerPixel(0), codecID(0), unknown4_1{0, 0, 0, 0, 0, 0, 0, 0},
 	  codecDataSize(0), unknown4_2{0, 0, 0, 0} {
 	memset(&this->platform, 0, sizeof(this->platform));
@@ -2195,7 +2219,7 @@ DataReadErrorCode MToonAsset::load(DataReader &reader) {
 }
 
 TextAsset::TextAsset()
-	: persistFlags(0), sizeIncludingTag(0), unknown1(0), assetID(0), unknown2(0), bitmapRect(Rect::createDefault()),
+	: persistFlags(0), sizeIncludingTag(0), unknown1(0), assetID(0), unknown2(0),
 	  hdpi(0), vdpi(0), unknown5(0), pitchBigEndian{0, 0}, unknown6(0), bitmapSize(0),
 	  unknown7{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, textSize(0),
 	  unknown8{0, 0, 0, 0, 0, 0, 0, 0}, alignment(0), isBitmap(0), haveMacPart(false), haveWinPart(false), isBottomUp(false) {
diff --git a/engines/mtropolis/data.h b/engines/mtropolis/data.h
index ba65780a454..a263adc4e28 100644
--- a/engines/mtropolis/data.h
+++ b/engines/mtropolis/data.h
@@ -216,8 +216,9 @@ private:
 };
 
 struct Rect {
+	Rect();
+
 	bool load(DataReader &reader);
-	static Rect createDefault();
 
 	bool toScummVMRect(Common::Rect &outRect) const;
 	bool toScummVMRectUnchecked(Common::Rect &outRect) const;
@@ -229,18 +230,19 @@ struct Rect {
 };
 
 struct Point {
+	Point();
+
 	bool load(DataReader &reader);
 	bool toScummVMPoint(Common::Point &outPoint) const;
 
-	static Point createDefault();
-
 	int16 x;
 	int16 y;
 };
 
 struct Event {
+	Event();
+
 	bool load(DataReader &reader);
-	static Event createDefault();
 
 	uint32 eventID;
 	uint32 eventInfo;
@@ -257,8 +259,9 @@ struct ColorRGB16 {
 };
 
 struct IntRange {
+	IntRange();
+
 	bool load(DataReader &reader);
-	static IntRange createDefault();
 
 	int32 min;
 	int32 max;
@@ -315,6 +318,8 @@ struct InternalTypeTaggedValue {
 	};
 
 	union ValueUnion {
+		ValueUnion();
+
 		uint8 asBool;
 		XPFloatPOD asFloat;
 		int32 asInteger;
@@ -322,9 +327,13 @@ struct InternalTypeTaggedValue {
 		VariableReference asVariableReference;
 		Label asLabel;
 		Point asPoint;
+
+		template<class T>
+		void constructField(T ValueUnion::*fieldPtr);
 	};
 
 	InternalTypeTaggedValue();
+	~InternalTypeTaggedValue();
 
 	uint16 type;
 	ValueUnion value;
@@ -348,6 +357,9 @@ struct PlugInTypeTaggedValue : public Common::NonCopyable {
 	};
 
 	union ValueUnion {
+		ValueUnion();
+		~ValueUnion();
+
 		int32 asInt;
 		Point asPoint;
 		IntRange asIntRange;
@@ -356,14 +368,21 @@ struct PlugInTypeTaggedValue : public Common::NonCopyable {
 		Event asEvent;
 		Label asLabel;
 		uint32 asVarRefGUID;
+		Common::String asString;
+
+		template<class T>
+		void constructField(T ValueUnion::*fieldPtr);
+
+		template<class T>
+		void destructField(T ValueUnion::*fieldPtr);
 	};
 
 	PlugInTypeTaggedValue();
+	~PlugInTypeTaggedValue();
 
 	uint16 type;
 	ValueUnion value;
 
-	Common::String str;
 	Common::Array<uint8> extraData;
 
 	bool load(DataReader &reader);
diff --git a/engines/mtropolis/plugin/mti.cpp b/engines/mtropolis/plugin/mti.cpp
index 056b16d7411..fd4fef515db 100644
--- a/engines/mtropolis/plugin/mti.cpp
+++ b/engines/mtropolis/plugin/mti.cpp
@@ -124,7 +124,8 @@ bool PrintModifier::load(const PlugInModifierLoaderContext &context, const Data:
 	if (data.filePath.type != Data::PlugInTypeTaggedValue::kString)
 		return false;
 
-	_filePath = data.executeWhen.str;
+	_filePath = data.filePath.value.asString;
+
 	if (!_executeWhen.load(data.executeWhen.value.asEvent))
 		return false;
 
diff --git a/engines/mtropolis/plugin/obsidian.cpp b/engines/mtropolis/plugin/obsidian.cpp
index b0158c679d0..99a411d3358 100644
--- a/engines/mtropolis/plugin/obsidian.cpp
+++ b/engines/mtropolis/plugin/obsidian.cpp
@@ -490,7 +490,7 @@ bool DictionaryModifier::load(const PlugInModifierLoaderContext &context, const
 	if (data.str.type != Data::PlugInTypeTaggedValue::kString)
 		return false;
 
-	_str = data.str.str;
+	_str = data.str.value.asString;
 
 	if (data.index.type != Data::PlugInTypeTaggedValue::kInteger)
 		return false;
diff --git a/engines/mtropolis/plugin/standard.cpp b/engines/mtropolis/plugin/standard.cpp
index 3a439976d6d..6cbf584ed83 100644
--- a/engines/mtropolis/plugin/standard.cpp
+++ b/engines/mtropolis/plugin/standard.cpp
@@ -1963,7 +1963,7 @@ bool ObjectReferenceVariableModifier::load(const PlugInModifierLoaderContext &co
 		return false;
 
 	if (data.objectPath.type == Data::PlugInTypeTaggedValue::kString)
-		_objectPath = data.objectPath.str;
+		_objectPath = data.objectPath.value.asString;
 	else if (data.objectPath.type != Data::PlugInTypeTaggedValue::kNull)
 		return false;
 
diff --git a/engines/mtropolis/runtime.cpp b/engines/mtropolis/runtime.cpp
index c34a5dd4586..3f627ae735d 100644
--- a/engines/mtropolis/runtime.cpp
+++ b/engines/mtropolis/runtime.cpp
@@ -1268,7 +1268,7 @@ bool DynamicValue::load(const Data::PlugInTypeTaggedValue &data) {
 		break;
 	case Data::PlugInTypeTaggedValue::kString:
 		_type = DynamicValueTypes::kString;
-		_value.construct<Common::String, &ValueUnion::asString>(data.str);
+		_value.construct<Common::String, &ValueUnion::asString>(data.value.asString);
 		break;
 	case Data::PlugInTypeTaggedValue::kVariableReference:
 		_type = DynamicValueTypes::kVariableReference;




More information about the Scummvm-git-logs mailing list