[Scummvm-git-logs] scummvm master -> 79057b732077377d6f7eb67190d6ab3b4666f58d

elasota noreply at scummvm.org
Fri Jul 22 21:33:35 UTC 2022


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

Summary:
67803eeae3 MTROPOLIS: Fix incorrect single-note volume scale, fix uninit fields
bb609b7048 MTROPOLIS: Convert Miniscript factories to static interfaces to quiet global dtor warnings
79057b7320 MTROPOLIS: Uninit fields cleanup


Commit: 67803eeae3e01d3a35636485704e75f290ec2537
    https://github.com/scummvm/scummvm/commit/67803eeae3e01d3a35636485704e75f290ec2537
Author: elasota (ejlasota at gmail.com)
Date: 2022-07-22T17:31:05-04:00

Commit Message:
MTROPOLIS: Fix incorrect single-note volume scale, fix uninit fields

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


diff --git a/engines/mtropolis/plugin/standard.cpp b/engines/mtropolis/plugin/standard.cpp
index a82cc5f4bf3..31518078438 100644
--- a/engines/mtropolis/plugin/standard.cpp
+++ b/engines/mtropolis/plugin/standard.cpp
@@ -301,7 +301,7 @@ void MidiFilePlayerImpl::onTimer() {
 }
 
 MidiNotePlayerImpl::MidiNotePlayerImpl(const Common::SharedPtr<MidiCombinerSource> &outputDriver, uint32 timerRate)
-	: _timerRate(timerRate), _durationRemaining(0), _outputDriver(outputDriver), _channel(0), _note(0), _program(0), _initialized(false) {
+	: _timerRate(timerRate), _durationRemaining(0), _outputDriver(outputDriver), _channel(0), _note(0), _program(0), _initialized(false), _volume(100) {
 }
 
 MidiNotePlayerImpl::~MidiNotePlayerImpl() {
@@ -332,7 +332,13 @@ void MidiNotePlayerImpl::play(uint8 volume, uint8 channel, uint8 program, uint8
 	_note = note;
 	_volume = volume;
 
-	const uint16 hpVolume = volume * 0x3fff / 100;
+	// GM volume scale to linear is x^4 so we need the 4th root of the volume, and need to rescale it from 0-100 to 0-0x3f80
+	// = 0x3f80 / sqrt(sqrt(100))
+	const double volumeMultiplier = 5140.5985643697174420974013458299;
+
+	if (volume > 100)
+		volume = 100;
+	uint16 hpVolume = static_cast<uint16>(floor(sqrt(sqrt(volume)) * volumeMultiplier));
 
 	_outputDriver->send(MidiDriver_BASE::MIDI_COMMAND_PROGRAM_CHANGE | _channel, program, 0);
 	_outputDriver->send(MidiDriver_BASE::MIDI_COMMAND_CONTROL_CHANGE | _channel, MidiDriver_BASE::MIDI_CONTROLLER_EXPRESSION, 127);
@@ -1555,7 +1561,7 @@ void MultiMidiPlayer::send(uint32 b) {
 	_driver->send(b);
 }
 
-CursorModifier::CursorModifier() {
+CursorModifier::CursorModifier() : _applyWhen(Event::create()), _removeWhen(Event::create()), _cursorID(0) {
 }
 
 bool CursorModifier::respondsToEvent(const Event &evt) const {
@@ -1590,6 +1596,10 @@ const char *CursorModifier::getDefaultName() const {
 	return "Cursor Modifier";
 }
 
+STransCtModifier::STransCtModifier() : _enableWhen(Event::create()), _disableWhen(Event::create()),
+	_transitionType(0), _transitionDirection(0), _steps(0), _duration(0), _fullScreen(false) {
+}
+
 bool STransCtModifier::load(const PlugInModifierLoaderContext &context, const Data::Standard::STransCtModifier &data) {
 	if (data.enableWhen.type != Data::PlugInTypeTaggedValue::kEvent ||
 		data.disableWhen.type != Data::PlugInTypeTaggedValue::kEvent ||
@@ -1712,7 +1722,7 @@ MiniscriptInstructionOutcome STransCtModifier::scriptSetSteps(MiniscriptThread *
 	return kMiniscriptInstructionOutcomeContinue;
 }
 
-MediaCueMessengerModifier::MediaCueMessengerModifier() : _isActive(false) {
+MediaCueMessengerModifier::MediaCueMessengerModifier() : _isActive(false), _cueSourceType(kCueSourceInteger) {
 	_mediaCue.sourceModifier = this;
 }
 
@@ -2253,8 +2263,10 @@ bool ObjectReferenceVariableModifier::SaveLoad::loadInternal(Common::ReadStream
 	return true;
 }
 
-MidiModifier::MidiModifier() : _plugIn(nullptr), _filePlayer(nullptr), _notePlayer(nullptr), _mutedTracks(0),
-	_singleNoteChannel(0), _singleNoteNote(0), _runtime(nullptr), _volume(100) {
+
+MidiModifier::MidiModifier() : _executeWhen(Event::create()), _terminateWhen(Event::create()),
+	_mode(kModeFile), _volume(100), _mutedTracks(0), _singleNoteChannel(0), _singleNoteNote(0),
+	_plugIn(nullptr), _filePlayer(nullptr), _notePlayer(nullptr), _runtime(nullptr) {
 }
 
 MidiModifier::~MidiModifier() {
@@ -2405,7 +2417,7 @@ MiniscriptInstructionOutcome MidiModifier::writeRefAttributeIndexed(MiniscriptTh
 		}
 
 		result.pod.objectRef = this;
-		result.pod.ptrOrOffset = asInteger - 1;
+		result.pod.ptrOrOffset = static_cast<uintptr>(asInteger) - 1;
 		result.pod.ifc = DynamicValueWriteInterfaceGlue<MuteTrackProxyInterface>::getInstance();
 
 		return kMiniscriptInstructionOutcomeContinue;
@@ -2786,7 +2798,7 @@ void ListVariableModifier::debugInspect(IDebugInspectionReport *report) const {
 }
 #endif
 
-ListVariableModifier::ListVariableModifier(const ListVariableModifier &other) {
+ListVariableModifier::ListVariableModifier(const ListVariableModifier &other) : _preferredContentType(DynamicValueTypes::kNull) {
 	if (other._list)
 		_list = other._list->clone();
 }
diff --git a/engines/mtropolis/plugin/standard.h b/engines/mtropolis/plugin/standard.h
index c5481eaae3e..9fd9407cb19 100644
--- a/engines/mtropolis/plugin/standard.h
+++ b/engines/mtropolis/plugin/standard.h
@@ -71,6 +71,8 @@ class STransCtModifier : public Modifier {
 public:
 	static const int32 kMaxDuration = 600000;
 
+	STransCtModifier();
+
 	bool load(const PlugInModifierLoaderContext &context, const Data::Standard::STransCtModifier &data);
 
 	bool respondsToEvent(const Event &evt) const override;


Commit: bb609b7048abc655af1e95041fd0fc0dc19503ed
    https://github.com/scummvm/scummvm/commit/bb609b7048abc655af1e95041fd0fc0dc19503ed
Author: elasota (ejlasota at gmail.com)
Date: 2022-07-22T17:32:16-04:00

Commit Message:
MTROPOLIS: Convert Miniscript factories to static interfaces to quiet global dtor warnings

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


diff --git a/engines/mtropolis/miniscript.cpp b/engines/mtropolis/miniscript.cpp
index 492d5cbd5d0..482bddada5a 100644
--- a/engines/mtropolis/miniscript.cpp
+++ b/engines/mtropolis/miniscript.cpp
@@ -241,25 +241,25 @@ bool MiniscriptInstructionLoader<MiniscriptInstructions::PushString>::loadInstru
 	return true;
 }
 
-struct IMiniscriptInstructionFactory : public IInterfaceBase {
-	virtual bool create(void *dest, uint32 instrFlags, Data::DataReader &instrDataReader, MiniscriptInstruction *&outMiniscriptInstructionPtr) const = 0;
-	virtual void getSizeAndAlignment(size_t &outSize, size_t &outAlignment) const = 0;
+struct SIMiniscriptInstructionFactory {
+	bool (*create)(void *dest, uint32 instrFlags, Data::DataReader &instrDataReader, MiniscriptInstruction *&outMiniscriptInstructionPtr);
+	void (*getSizeAndAlignment)(size_t &outSize, size_t &outAlignment);
 };
 
 template<class T>
-class MiniscriptInstructionFactory : public IMiniscriptInstructionFactory {
+class MiniscriptInstructionFactory {
 public:
-	bool create(void *dest, uint32 instrFlags, Data::DataReader &instrDataReader, MiniscriptInstruction *&outMiniscriptInstructionPtr) const override;
-	void getSizeAndAlignment(size_t &outSize, size_t &outAlignment) const override;
+	static bool create(void *dest, uint32 instrFlags, Data::DataReader &instrDataReader, MiniscriptInstruction *&outMiniscriptInstructionPtr);
+	static void getSizeAndAlignment(size_t &outSize, size_t &outAlignment);
 
-	static IMiniscriptInstructionFactory *getInstance();
+	static SIMiniscriptInstructionFactory *getInstance();
 
 private:
-	static MiniscriptInstructionFactory<T> _instance;
+	static SIMiniscriptInstructionFactory _instance;
 };
 
 template<class T>
-bool MiniscriptInstructionFactory<T>::create(void *dest, uint32 instrFlags, Data::DataReader &instrDataReader, MiniscriptInstruction *&outMiniscriptInstructionPtr) const {
+bool MiniscriptInstructionFactory<T>::create(void *dest, uint32 instrFlags, Data::DataReader &instrDataReader, MiniscriptInstruction *&outMiniscriptInstructionPtr) {
 	if (!MiniscriptInstructionLoader<T>::loadInstruction(dest, instrFlags, instrDataReader))
 		return false;
 
@@ -268,18 +268,21 @@ bool MiniscriptInstructionFactory<T>::create(void *dest, uint32 instrFlags, Data
 }
 
 template<class T>
-void MiniscriptInstructionFactory<T>::getSizeAndAlignment(size_t &outSize, size_t &outAlignment) const {
+void MiniscriptInstructionFactory<T>::getSizeAndAlignment(size_t &outSize, size_t &outAlignment) {
 	outSize = sizeof(T);
 	outAlignment = alignof(T);
 }
 
 template<class T>
-inline IMiniscriptInstructionFactory *MiniscriptInstructionFactory<T>::getInstance() {
+inline SIMiniscriptInstructionFactory *MiniscriptInstructionFactory<T>::getInstance() {
 	return &_instance;
 }
 
 template<class T>
-MiniscriptInstructionFactory<T> MiniscriptInstructionFactory<T>::_instance;
+SIMiniscriptInstructionFactory MiniscriptInstructionFactory<T>::_instance = {
+	MiniscriptInstructionFactory<T>::create,
+	MiniscriptInstructionFactory<T>::getSizeAndAlignment
+};
 
 bool MiniscriptParser::parse(const Data::MiniscriptProgram &program, Common::SharedPtr<MiniscriptProgram> &outProgram, Common::SharedPtr<MiniscriptReferences> &outReferences) {
 	Common::Array<MiniscriptReferences::LocalRef> localRefs;
@@ -312,7 +315,7 @@ bool MiniscriptParser::parse(const Data::MiniscriptProgram &program, Common::Sha
 		uint16 opcode;
 		uint16 flags;
 		size_t pdPosition;
-		IMiniscriptInstructionFactory *instrFactory;
+		SIMiniscriptInstructionFactory *instrFactory;
 		Common::Array<uint8> contents;
 	};
 
@@ -344,7 +347,7 @@ bool MiniscriptParser::parse(const Data::MiniscriptProgram &program, Common::Sha
 	for (size_t i = 0; i < program.numOfInstructions; i++) {
 		InstructionData &rawInstruction = rawInstructions[i];
 
-		IMiniscriptInstructionFactory *factory = resolveOpcode(rawInstruction.opcode);
+		SIMiniscriptInstructionFactory *factory = resolveOpcode(rawInstruction.opcode);
 		rawInstruction.instrFactory = factory;
 
 		if (!factory)
@@ -401,7 +404,7 @@ bool MiniscriptParser::parse(const Data::MiniscriptProgram &program, Common::Sha
 	return true;
 }
 
-IMiniscriptInstructionFactory *MiniscriptParser::resolveOpcode(uint16 opcode) {
+SIMiniscriptInstructionFactory *MiniscriptParser::resolveOpcode(uint16 opcode) {
 	switch (opcode) {
 	case 0x834:
 		return MiniscriptInstructionFactory<MiniscriptInstructions::Set>::getInstance();
diff --git a/engines/mtropolis/miniscript.h b/engines/mtropolis/miniscript.h
index 92898f67853..8e05bf1749c 100644
--- a/engines/mtropolis/miniscript.h
+++ b/engines/mtropolis/miniscript.h
@@ -29,7 +29,7 @@ namespace MTropolis {
 
 class MiniscriptThread;
 struct MiniscriptStackValue;
-struct IMiniscriptInstructionFactory;
+struct SIMiniscriptInstructionFactory;
 
 bool miniscriptEvaluateTruth(const DynamicValue &value);
 
@@ -83,7 +83,7 @@ class MiniscriptParser {
 public:
 	static bool parse(const Data::MiniscriptProgram &programData, Common::SharedPtr<MiniscriptProgram> &outProgram, Common::SharedPtr<MiniscriptReferences> &outReferences);
 
-	static IMiniscriptInstructionFactory *resolveOpcode(uint16 opcode);
+	static SIMiniscriptInstructionFactory *resolveOpcode(uint16 opcode);
 };
 
 namespace MiniscriptInstructions {


Commit: 79057b732077377d6f7eb67190d6ab3b4666f58d
    https://github.com/scummvm/scummvm/commit/79057b732077377d6f7eb67190d6ab3b4666f58d
Author: elasota (ejlasota at gmail.com)
Date: 2022-07-22T17:32:58-04:00

Commit Message:
MTROPOLIS: Uninit fields cleanup

Changed paths:
    engines/mtropolis/assets.cpp
    engines/mtropolis/assets.h
    engines/mtropolis/data.cpp
    engines/mtropolis/data.h
    engines/mtropolis/element_factory.cpp
    engines/mtropolis/element_factory.h
    engines/mtropolis/plugin/obsidian.cpp
    engines/mtropolis/plugin/obsidian.h
    engines/mtropolis/plugin/standard_data.cpp
    engines/mtropolis/plugin/standard_data.h
    engines/mtropolis/render.cpp
    engines/mtropolis/render.h
    engines/mtropolis/runtime.cpp
    engines/mtropolis/runtime.h


diff --git a/engines/mtropolis/assets.cpp b/engines/mtropolis/assets.cpp
index 102f1553f2f..38f10a3b5dd 100644
--- a/engines/mtropolis/assets.cpp
+++ b/engines/mtropolis/assets.cpp
@@ -116,6 +116,30 @@ size_t CachedAudio::getNumSamples(const AudioMetadata &metadata) const {
 	}
 }
 
+MToonMetadata::FrameDef::FrameDef() : dataOffset(0), compressedSize(0), decompressedSize(0), decompressedBytesPerRow(0), isKeyFrame(false) {
+}
+
+bool MToonMetadata::FrameDef::load(AssetLoaderContext &context, const Data::MToonAsset::FrameDef &data) {
+	compressedSize = data.compressedSize;
+	dataOffset = data.dataOffset;
+	decompressedBytesPerRow = data.decompressedBytesPerRow;
+	decompressedSize = data.decompressedSize;
+	isKeyFrame = (data.keyframeFlag != 0);
+	if (!data.rect1.toScummVMRect(rect))
+		return false;
+
+	return true;
+}
+
+MToonMetadata::FrameRangeDef::FrameRangeDef() : startFrame(0), endFrame(0) {
+}
+
+MToonMetadata::MToonMetadata() : imageFormat(kImageFormatWindows), bitsPerPixel(0), codecID(0), encodingFlags(0) {
+}
+
+CachedMToon::RleFrame::RleFrame() : version(0), width(0), height(0), isKeyframe(0) {
+}
+
 CachedMToon::CachedMToon() : _isRLETemporalCompressed(false) {
 }
 
@@ -334,7 +358,7 @@ void CachedMToon::loadRLEFrames(const Common::Array<uint8> &data) {
 				// so we need to ignore it and derive size from the frameDef instead.
 				uint32 numDWords = (frameDef.compressedSize - 20) / 2;
 				rleFrame.data16.resize(numDWords);
-				memcpy(&rleFrame.data16[0], &data[baseOffset + 20], numDWords * 2);
+				memcpy(&rleFrame.data16[0], &data[baseOffset + 20], static_cast<size_t>(numDWords) * 2u);
 
 				uint16 *i16 = &rleFrame.data16[0];
 				if (_metadata->imageFormat == MToonMetadata::kImageFormatWindows) {
@@ -630,6 +654,12 @@ const Common::SharedPtr<MToonMetadata>& CachedMToon::getMetadata() const {
 	return _metadata;
 }
 
+
+
+AudioMetadata::AudioMetadata() : encoding(kEncodingUncompressed), durationMSec(0),
+	sampleRate(0), channels(0), bitsPerSample(0), isBigEndian(false) {
+}
+
 bool AudioAsset::load(AssetLoaderContext &context, const Data::AudioAsset &data) {
 	_assetID = data.assetID;
 
@@ -799,7 +829,7 @@ const Common::SharedPtr<Graphics::Surface> &CachedImage::optimize(Runtime *runti
 	return _optimizedSurface;
 }
 
-ImageAsset::ImageAsset() {
+ImageAsset::ImageAsset() : _colorDepth(kColorDepthMode8Bit), _filePosition(0), _size(0), _streamIndex(0), _imageFormat(kImageFormatWindows) {
 }
 
 ImageAsset::~ImageAsset() {
@@ -1096,18 +1126,6 @@ const Common::SharedPtr<CachedMToon> &MToonAsset::loadAndCacheMToon(Runtime *run
 	return _cachedMToon;
 }
 
-bool MToonMetadata::FrameDef::load(AssetLoaderContext &context, const Data::MToonAsset::FrameDef &data) {
-	compressedSize = data.compressedSize;
-	dataOffset = data.dataOffset;
-	decompressedBytesPerRow = data.decompressedBytesPerRow;
-	decompressedSize = data.decompressedSize;
-	isKeyFrame = (data.keyframeFlag != 0);
-	if (!data.rect1.toScummVMRect(rect))
-		return false;
-
-	return true;
-}
-
 bool MToonMetadata::FrameRangeDef::load(AssetLoaderContext &context, const Data::MToonAsset::FrameRangeDef &data) {
 	name = data.name;
 	startFrame = data.startFrame;
diff --git a/engines/mtropolis/assets.h b/engines/mtropolis/assets.h
index c1824a19243..cf1836c3bae 100644
--- a/engines/mtropolis/assets.h
+++ b/engines/mtropolis/assets.h
@@ -71,6 +71,7 @@ struct MToonMetadata {
 		uint16 decompressedBytesPerRow;
 		bool isKeyFrame;
 
+		FrameDef();
 		bool load(AssetLoaderContext &context, const Data::MToonAsset::FrameDef &data);
 	};
 
@@ -80,9 +81,12 @@ struct MToonMetadata {
 
 		Common::String name;
 
+		FrameRangeDef();
 		bool load(AssetLoaderContext &context, const Data::MToonAsset::FrameRangeDef &data);
 	};
 
+	MToonMetadata();
+
 	ImageFormat imageFormat;
 
 	Common::Rect rect;
@@ -111,6 +115,8 @@ private:
 	void optimizeRLE(const Graphics::PixelFormat &targetFormat);
 
 	struct RleFrame {
+		RleFrame();
+
 		uint32 version;
 		uint32 width;
 		uint32 height;
@@ -161,6 +167,8 @@ struct AudioMetadata {
 		kEncodingMace6,
 	};
 
+	AudioMetadata();
+
 	Encoding encoding;
 	uint32 durationMSec;
 	uint16 sampleRate;
diff --git a/engines/mtropolis/data.cpp b/engines/mtropolis/data.cpp
index f648c0c5f3f..c043b19a750 100644
--- a/engines/mtropolis/data.cpp
+++ b/engines/mtropolis/data.cpp
@@ -452,6 +452,12 @@ bool InternalTypeTaggedValue::load(DataReader &reader) {
 	return true;
 }
 
+
+
+PlugInTypeTaggedValue::PlugInTypeTaggedValue() : type(kNull) {
+	memset(&this->value, 0, sizeof(this->value));
+}
+
 bool PlugInTypeTaggedValue::load(DataReader &reader) {
 	if (!reader.readU16(type))
 		return false;
@@ -566,7 +572,7 @@ DataReadErrorCode ProjectLabelMap::load(DataReader &reader) {
 	return kDataReadErrorNone;
 }
 
-ProjectLabelMap::LabelTree::LabelTree() : children(nullptr) {
+ProjectLabelMap::LabelTree::LabelTree() : nameLength(0), isGroup(0), id(0), unknown1(0), flags(0), numChildren(0), children(nullptr) {
 }
 
 ProjectLabelMap::LabelTree::~LabelTree() {
@@ -623,6 +629,9 @@ DataReadErrorCode ProjectLabelMap::loadLabelTree(LabelTree &lt, DataReader &read
 	return kDataReadErrorNone;
 }
 
+ProjectHeader::ProjectHeader() : persistFlags(0), sizeIncludingTag(0), unknown1(0), catalogFilePosition(0) {
+}
+
 DataReadErrorCode ProjectHeader::load(DataReader &reader) {
 	if (_revision != 0) {
 		return kDataReadErrorUnsupportedRevision;
@@ -847,6 +856,11 @@ DataReadErrorCode GlobalObjectInfo::load(DataReader &reader) {
 	return kDataReadErrorNone;
 }
 
+
+
+ProjectCatalog::ProjectCatalog() : persistFlags(0), sizeOfStreamAndSegmentDescs(0), unknown1(0), unknown2(0), unknown3(0) {
+}
+
 DataReadErrorCode ProjectCatalog::load(DataReader &reader) {
 	if (_revision != 2 && _revision != 3) {
 		return kDataReadErrorUnsupportedRevision;
@@ -905,6 +919,15 @@ DataReadErrorCode ProjectCatalog::load(DataReader &reader) {
 	return kDataReadErrorNone;
 }
 
+StreamHeader::StreamHeader() : marker(0), sizeIncludingTag(0), unknown2(0) {
+	for (char &v : this->name)
+		v = 0;
+	for (uint8 &v : this->projectID)
+		v = 0;
+	for (uint8 &v : this->unknown1)
+		v = 0;
+}
+
 DataReadErrorCode StreamHeader::load(DataReader& reader) {
 	if (_revision != 0)
 		return kDataReadErrorUnsupportedRevision;
diff --git a/engines/mtropolis/data.h b/engines/mtropolis/data.h
index cee24b6e5b8..cf0f9a6760d 100644
--- a/engines/mtropolis/data.h
+++ b/engines/mtropolis/data.h
@@ -347,6 +347,8 @@ struct PlugInTypeTaggedValue : public Common::NonCopyable {
 		uint32 asVarRefGUID;
 	};
 
+	PlugInTypeTaggedValue();
+
 	uint16 type;
 	ValueUnion value;
 
@@ -374,6 +376,8 @@ protected:
 };
 
 struct ProjectHeader : public DataObject {
+	ProjectHeader();
+
 	uint32 persistFlags;
 	uint32 sizeIncludingTag;
 	uint16 unknown1;
@@ -753,6 +757,8 @@ public:
 		Common::String exportedPath;
 	};
 
+	ProjectCatalog();
+
 	uint32 persistFlags;
 	uint32 sizeOfStreamAndSegmentDescs;
 	uint16 unknown1;
@@ -767,6 +773,7 @@ protected:
 };
 
 struct StreamHeader : public DataObject {
+	StreamHeader();
 
 	uint32 marker;
 	uint32 sizeIncludingTag;
diff --git a/engines/mtropolis/element_factory.cpp b/engines/mtropolis/element_factory.cpp
index e9ba3334f9f..5692ca60f0e 100644
--- a/engines/mtropolis/element_factory.cpp
+++ b/engines/mtropolis/element_factory.cpp
@@ -29,17 +29,17 @@ ElementLoaderContext::ElementLoaderContext(Runtime *elc_runtime, size_t elc_stre
 }
 
 template<typename TElement, typename TElementData>
-class ElementFactory : public IElementFactory {
+class ElementFactory {
 public:
-	Common::SharedPtr<Element> createElement(ElementLoaderContext &context, const Data::DataObject &dataObject) const override;
-	static IElementFactory *getInstance();
+	static Common::SharedPtr<Element> createElement(ElementLoaderContext &context, const Data::DataObject &dataObject);
+	static SIElementFactory *getInstance();
 
 private:
-	static ElementFactory<TElement, TElementData> _instance;
+	static SIElementFactory _instance;
 };
 
 template<typename TElement, typename TElementData>
-Common::SharedPtr<Element> ElementFactory<TElement, TElementData>::createElement(ElementLoaderContext &context, const Data::DataObject &dataObject) const {
+Common::SharedPtr<Element> ElementFactory<TElement, TElementData>::createElement(ElementLoaderContext &context, const Data::DataObject &dataObject) {
 	Common::SharedPtr<TElement> element(new TElement());
 
 	if (!element->load(context, static_cast<const TElementData &>(dataObject)))
@@ -51,14 +51,16 @@ Common::SharedPtr<Element> ElementFactory<TElement, TElementData>::createElement
 }
 
 template<typename TElement, typename TElementData>
-IElementFactory *ElementFactory<TElement, TElementData>::getInstance() {
+SIElementFactory *ElementFactory<TElement, TElementData>::getInstance() {
 	return &_instance;
 }
 
 template<typename TElement, typename TElementData>
-ElementFactory<TElement, TElementData> ElementFactory<TElement, TElementData>::_instance;
+SIElementFactory ElementFactory<TElement, TElementData>::_instance = {
+	ElementFactory<TElement, TElementData>::createElement
+};
 
-IElementFactory *getElementFactoryForDataObjectType(const Data::DataObjectTypes::DataObjectType dataObjectType) {
+SIElementFactory *getElementFactoryForDataObjectType(const Data::DataObjectTypes::DataObjectType dataObjectType) {
 	switch (dataObjectType) {
 	case Data::DataObjectTypes::kGraphicElement:
 		return ElementFactory<GraphicElement, Data::GraphicElement>::getInstance();
diff --git a/engines/mtropolis/element_factory.h b/engines/mtropolis/element_factory.h
index a98349429ac..20be6800aab 100644
--- a/engines/mtropolis/element_factory.h
+++ b/engines/mtropolis/element_factory.h
@@ -34,11 +34,11 @@ struct ElementLoaderContext {
 	size_t streamIndex;
 };
 
-struct IElementFactory : public IInterfaceBase {
-	virtual Common::SharedPtr<Element> createElement(ElementLoaderContext &context, const Data::DataObject &dataObject) const = 0;
+struct SIElementFactory {
+	Common::SharedPtr<Element> (*createElement)(ElementLoaderContext &context, const Data::DataObject &dataObject);
 };
 
-IElementFactory *getElementFactoryForDataObjectType(Data::DataObjectTypes::DataObjectType dataObjectType);
+SIElementFactory *getElementFactoryForDataObjectType(Data::DataObjectTypes::DataObjectType dataObjectType);
 
 } // End of namespace MTropolis
 
diff --git a/engines/mtropolis/plugin/obsidian.cpp b/engines/mtropolis/plugin/obsidian.cpp
index a5b4b76f330..31e644cd7e4 100644
--- a/engines/mtropolis/plugin/obsidian.cpp
+++ b/engines/mtropolis/plugin/obsidian.cpp
@@ -30,7 +30,8 @@ namespace MTropolis {
 
 namespace Obsidian {
 
-MovementModifier::MovementModifier() : _runtime(nullptr) {
+MovementModifier::MovementModifier() : _enableWhen(Event::create()), _disableWhen(Event::create()), _triggerEvent(Event::create()),
+	_moveStartTime(0), _runtime(nullptr) {
 }
 
 MovementModifier::~MovementModifier() {
@@ -472,7 +473,7 @@ MiniscriptInstructionOutcome TextWorkModifier::scriptSetLastWord(MiniscriptThrea
 	return kMiniscriptInstructionOutcomeFailed;
 }
 
-DictionaryModifier::DictionaryModifier() : _plugIn(nullptr) {
+DictionaryModifier::DictionaryModifier() : _plugIn(nullptr), _isIndexResolved(false), _index(0) {
 }
 
 bool DictionaryModifier::load(const PlugInModifierLoaderContext &context, const Data::Obsidian::DictionaryModifier &data) {
@@ -534,14 +535,14 @@ void DictionaryModifier::resolveStringIndex() {
 	const WordGameData::WordBucket &bucket = wordBuckets[strLength];
 
 	size_t lowOffsetInclusive = 0;
-	size_t highOffsetExclusive = bucket.wordIndexes.size();
+	size_t highOffsetExclusive = bucket._wordIndexes.size();
 
 	const char *strChars = _str.c_str();
 
 	// Binary search
 	while (lowOffsetInclusive != highOffsetExclusive) {
 		const size_t midOffset = (lowOffsetInclusive + highOffsetExclusive) / 2;
-		const char *chars = &bucket.chars[bucket.spacing * midOffset];
+		const char *chars = &bucket._chars[bucket._spacing * midOffset];
 
 		bool isMidGreater = false;
 		bool isMidLess = false;
@@ -560,7 +561,7 @@ void DictionaryModifier::resolveStringIndex() {
 		else if (isMidGreater)
 			highOffsetExclusive = midOffset;
 		else {
-			_index = bucket.wordIndexes[midOffset] + 1;
+			_index = bucket._wordIndexes[midOffset] + 1;
 			break;
 		}
 	}
@@ -591,12 +592,12 @@ MiniscriptInstructionOutcome DictionaryModifier::scriptSetIndex(MiniscriptThread
 	if (_index < 1)
 		_str.clear();
 	else {
-		const size_t indexAdjusted = _index - 1;
+		const size_t indexAdjusted = static_cast<size_t>(_index) - 1;
 		const Common::Array<WordGameData::SortedWord> &sortedWords = _plugIn->getWordGameData()->getSortedWords();
 		if (indexAdjusted >= sortedWords.size())
 			_str.clear();
 		else
-			_str = Common::String(sortedWords[indexAdjusted].chars, sortedWords[indexAdjusted].length);
+			_str = Common::String(sortedWords[indexAdjusted]._chars, sortedWords[indexAdjusted]._length);
 	}
 
 	_isIndexResolved = true;
@@ -612,7 +613,7 @@ const char *DictionaryModifier::getDefaultName() const {
 	return "Dictionary";
 }
 
-WordMixerModifier::WordMixerModifier() : _matches(0), _result(0) {
+WordMixerModifier::WordMixerModifier() : _matches(0), _result(0), _plugIn(nullptr) {
 }
 
 bool WordMixerModifier::load(const PlugInModifierLoaderContext &context, const Data::Obsidian::WordMixerModifier &data) {
@@ -679,10 +680,10 @@ MiniscriptInstructionOutcome WordMixerModifier::scriptSetInput(MiniscriptThread
 
 		const WordGameData::WordBucket &bucket = wordBuckets[wordLength];
 
-		size_t numWords = bucket.wordIndexes.size();
+		size_t numWords = bucket._wordIndexes.size();
 
 		for (size_t wi = 0; wi < numWords; wi++) {
-			const char *wordChars = &bucket.chars[bucket.spacing * wi];
+			const char *wordChars = &bucket._chars[bucket._spacing * wi];
 
 			for (bool &b : charIsUsed)
 				b = false;
@@ -739,8 +740,8 @@ MiniscriptInstructionOutcome WordMixerModifier::scriptSetSearch(MiniscriptThread
 	if (searchLength < buckets.size()) {
 		const WordGameData::WordBucket &bucket = buckets[searchLength];
 
-		for (size_t wi = 0; wi < bucket.wordIndexes.size(); wi++) {
-			const char *wordChars = &bucket.chars[wi * bucket.spacing];
+		for (size_t wi = 0; wi < bucket._wordIndexes.size(); wi++) {
+			const char *wordChars = &bucket._chars[wi * bucket._spacing];
 
 			bool isMatch = true;
 			for (size_t ci = 0; ci < searchLength; ci++) {
@@ -768,7 +769,7 @@ const char *WordMixerModifier::getDefaultName() const {
 	return "WordMixer";
 }
 
-XorModModifier::XorModModifier() {
+XorModModifier::XorModModifier() : _enableWhen(Event::create()), _disableWhen(Event::create()), _shapeID(0) {
 }
 
 bool XorModModifier::load(const PlugInModifierLoaderContext &context, const Data::Obsidian::XorModModifier &data) {
@@ -1030,6 +1031,13 @@ const Common::SharedPtr<WordGameData>& ObsidianPlugIn::getWordGameData() const {
 	return _wgData;
 }
 
+
+WordGameData::WordBucket::WordBucket() : _spacing(0) {
+}
+
+WordGameData::SortedWord::SortedWord() : _chars(nullptr), _length(0) {
+}
+
 bool WordGameData::load(Common::SeekableReadStream *stream, const WordGameLoadBucket *buckets, uint numBuckets, uint alignment, bool backwards) {
 	_buckets.resize(numBuckets);
 
@@ -1042,24 +1050,24 @@ bool WordGameData::load(Common::SeekableReadStream *stream, const WordGameLoadBu
 		uint wordLength = i;
 		uint spacing = (wordLength + alignment) - (wordLength % alignment);
 
-		outBucket.spacing = spacing;
-		outBucket.chars.resize(sizeBytes);
+		outBucket._spacing = spacing;
+		outBucket._chars.resize(sizeBytes);
 
 		assert(sizeBytes % alignment == 0);
 
 		if (sizeBytes > 0) {
 			if (!stream->seek(inBucket.startAddress, SEEK_SET))
 				return false;
-			stream->read(&outBucket.chars[0], sizeBytes);
+			stream->read(&outBucket._chars[0], sizeBytes);
 		}
 
 		uint numWords = sizeBytes / spacing;
-		outBucket.wordIndexes.resize(numWords);
+		outBucket._wordIndexes.resize(numWords);
 
 		if (backwards) {
 			for (size_t wordIndex = 0; wordIndex < numWords / 2; wordIndex++) {
-				char *swapA = &outBucket.chars[wordIndex * spacing];
-				char *swapB = &outBucket.chars[(numWords - 1 - wordIndex) * spacing];
+				char *swapA = &outBucket._chars[wordIndex * spacing];
+				char *swapB = &outBucket._chars[(numWords - 1 - wordIndex) * spacing];
 
 				for (size_t chIndex = 0; chIndex < wordLength; chIndex++) {
 					char temp = swapA[chIndex];
@@ -1084,9 +1092,9 @@ bool WordGameData::load(Common::SeekableReadStream *stream, const WordGameLoadBu
 		size_t bestBucket = numBuckets;
 		const char *bestChars = nullptr;
 		for (size_t bucketIndex = 0; bucketIndex < numBuckets; bucketIndex++) {
-			size_t wordOffset = currentWordIndexes[bucketIndex] * _buckets[bucketIndex].spacing;
-			if (wordOffset < _buckets[bucketIndex].chars.size()) {
-				const char *candidate = &_buckets[bucketIndex].chars[wordOffset];
+			size_t wordOffset = currentWordIndexes[bucketIndex] * _buckets[bucketIndex]._spacing;
+			if (wordOffset < _buckets[bucketIndex]._chars.size()) {
+				const char *candidate = &_buckets[bucketIndex]._chars[wordOffset];
 				bool isWorse = true;
 				if (bestChars == nullptr)
 					isWorse = false;
@@ -1112,11 +1120,11 @@ bool WordGameData::load(Common::SeekableReadStream *stream, const WordGameLoadBu
 		assert(bestChars != nullptr);
 
 		const size_t bucketWordIndex = currentWordIndexes[bestBucket];
-		_buckets[bestBucket].wordIndexes[bucketWordIndex] = wordIndex;
+		_buckets[bestBucket]._wordIndexes[bucketWordIndex] = wordIndex;
 		currentWordIndexes[bestBucket]++;
 
-		_sortedWords[wordIndex].chars = bestChars;
-		_sortedWords[wordIndex].length = bestBucket;
+		_sortedWords[wordIndex]._chars = bestChars;
+		_sortedWords[wordIndex]._length = bestBucket;
 	}
 
 	return !stream->err();
diff --git a/engines/mtropolis/plugin/obsidian.h b/engines/mtropolis/plugin/obsidian.h
index e966fbc9615..6e261cf0eb1 100644
--- a/engines/mtropolis/plugin/obsidian.h
+++ b/engines/mtropolis/plugin/obsidian.h
@@ -272,14 +272,18 @@ struct WordGameLoadBucket {
 class WordGameData {
 public:
 	struct WordBucket {
-		Common::Array<char> chars;
-		Common::Array<uint16> wordIndexes;
-		uint32 spacing;
+		WordBucket();
+
+		Common::Array<char> _chars;
+		Common::Array<uint16> _wordIndexes;
+		uint32 _spacing;
 	};
 
 	struct SortedWord {
-		const char *chars;
-		uint length;
+		SortedWord();
+
+		const char *_chars;
+		uint _length;
 	};
 
 	bool load(Common::SeekableReadStream *stream, const WordGameLoadBucket *buckets, uint numBuckets, uint alignment, bool backwards);
diff --git a/engines/mtropolis/plugin/standard_data.cpp b/engines/mtropolis/plugin/standard_data.cpp
index b9c5852f890..5f18d9f2f4d 100644
--- a/engines/mtropolis/plugin/standard_data.cpp
+++ b/engines/mtropolis/plugin/standard_data.cpp
@@ -80,6 +80,9 @@ DataReadErrorCode ObjectReferenceVariableModifier::load(PlugIn &plugIn, const Pl
 	return kDataReadErrorNone;
 }
 
+MidiModifier::MidiModifier() : embeddedFlag(0) {
+}
+
 DataReadErrorCode MidiModifier::load(PlugIn &plugIn, const PlugInModifier &prefix, DataReader &reader) {
 	if (prefix.plugInRevision != 1 && prefix.plugInRevision != 2)
 		return kDataReadErrorUnsupportedRevision;
@@ -117,7 +120,10 @@ DataReadErrorCode MidiModifier::load(PlugIn &plugIn, const PlugInModifier &prefi
 	return kDataReadErrorNone;
 }
 
-ListVariableModifier::ListVariableModifier() : values(nullptr) {
+ListVariableModifier::ListVariableModifier() : unknown1(0), contentsType(0),
+	havePersistentData(false), numValues(0), values(nullptr), persistentValuesGarbled(false) {
+	for (uint8 &v : unknown2)
+		v = 0;
 }
 
 ListVariableModifier::~ListVariableModifier() {
diff --git a/engines/mtropolis/plugin/standard_data.h b/engines/mtropolis/plugin/standard_data.h
index 259ba5339b6..bf250848f6c 100644
--- a/engines/mtropolis/plugin/standard_data.h
+++ b/engines/mtropolis/plugin/standard_data.h
@@ -118,6 +118,8 @@ struct MidiModifier : public PlugInModifierData {
 		SingleNotePart singleNote;
 	};
 
+	MidiModifier();
+
 	PlugInTypeTaggedValue executeWhen;
 	PlugInTypeTaggedValue terminateWhen;
 
diff --git a/engines/mtropolis/render.cpp b/engines/mtropolis/render.cpp
index c96001aa083..083265167a2 100644
--- a/engines/mtropolis/render.cpp
+++ b/engines/mtropolis/render.cpp
@@ -99,6 +99,9 @@ MacFontFormatting::MacFontFormatting() : fontID(0), fontFlags(0), size(12) {
 MacFontFormatting::MacFontFormatting(uint16 mff_fontID, uint8 mff_fontFlags, uint16 mff_size) : fontID(mff_fontID), fontFlags(mff_fontFlags), size(mff_size) {
 }
 
+MacFormattingSpan::MacFormattingSpan() : spanStart(0) {
+}
+
 WindowParameters::WindowParameters(Runtime *wp_runtime, int32 wp_x, int32 wp_y, int16 wp_width, int16 wp_height, const Graphics::PixelFormat &wp_format)
 	: runtime(wp_runtime), x(wp_x), y(wp_y), width(wp_width), height(wp_height), format(wp_format) {
 }
diff --git a/engines/mtropolis/render.h b/engines/mtropolis/render.h
index 953ab150562..1d3ba7b7a7d 100644
--- a/engines/mtropolis/render.h
+++ b/engines/mtropolis/render.h
@@ -71,6 +71,8 @@ struct MacFontFormatting {
 };
 
 struct MacFormattingSpan {
+	MacFormattingSpan();
+
 	uint16 spanStart;
 	MacFontFormatting formatting;
 };
diff --git a/engines/mtropolis/runtime.cpp b/engines/mtropolis/runtime.cpp
index a9ad04109e5..69d7c796fad 100644
--- a/engines/mtropolis/runtime.cpp
+++ b/engines/mtropolis/runtime.cpp
@@ -3731,6 +3731,19 @@ const Common::KeyState &KeyboardInputEvent::getKeyState() const {
 Runtime::SceneStackEntry::SceneStackEntry() {
 }
 
+Runtime::Teardown::Teardown() : onlyRemoveChildren(false) {
+}
+
+
+Runtime::ConsumeMessageTaskData::ConsumeMessageTaskData() : consumer(nullptr) {
+}
+
+Runtime::ConsumeCommandTaskData::ConsumeCommandTaskData() : structural(nullptr) {
+}
+
+Runtime::UpdateMouseStateTaskData::UpdateMouseStateTaskData() : mouseDown(false) {
+}
+
 SceneTransitionHooks::~SceneTransitionHooks() {
 }
 
@@ -6108,6 +6121,9 @@ void KeyboardEventSignaller::removeReceiver(IKeyboardEventReceiver *receiver) {
 	}
 }
 
+MediaCueState::MediaCueState() : minTime(0), maxTime(0), sourceModifier(nullptr), triggerTiming(kTriggerTimingStart) {
+}
+
 void MediaCueState::checkTimestampChange(Runtime *runtime, uint32 oldTS, uint32 newTS, bool continuousTimestamps, bool canTriggerDuring) {
 	bool entersRange = (static_cast<int32>(oldTS) < minTime && static_cast<int32>(newTS) >= minTime);
 	bool exitsRange = (static_cast<int32>(oldTS) <= maxTime && static_cast<int32>(newTS) > maxTime);
@@ -6133,6 +6149,13 @@ void MediaCueState::checkTimestampChange(Runtime *runtime, uint32 oldTS, uint32
 		send.sendFromMessenger(runtime, sourceModifier, incomingData, nullptr);
 }
 
+
+Project::LabelSuperGroup::LabelSuperGroup() : firstRootNodeIndex(0), numRootNodes(0), numTotalNodes(0), superGroupID(0) {
+}
+
+Project::LabelTree::LabelTree() : firstChildIndex(0), numChildren(0), id(0) {
+}
+
 Project::Segment::Segment() : weakStream(nullptr) {
 }
 
@@ -6876,7 +6899,7 @@ void Project::loadContextualObject(size_t streamIndex, ChildLoaderStack &stack,
 			if (topContext.containerUnion.filteredElements.filterFunc(dataObjectType)) {
 				const Data::StructuralDef &structuralDef = static_cast<const Data::StructuralDef &>(dataObject);
 
-				IElementFactory *elementFactory = getElementFactoryForDataObjectType(dataObjectType);
+				SIElementFactory *elementFactory = getElementFactoryForDataObjectType(dataObjectType);
 				if (!elementFactory) {
 					error("No element factory defined for structural object");
 				}
diff --git a/engines/mtropolis/runtime.h b/engines/mtropolis/runtime.h
index 0920532a01a..4703efc4735 100644
--- a/engines/mtropolis/runtime.h
+++ b/engines/mtropolis/runtime.h
@@ -1029,14 +1029,8 @@ struct DynamicValueWriteFuncHelper {
 		proxy.pod.objectRef = obj;
 		proxy.pod.ifc = DynamicValueWriteInterfaceGlue<DynamicValueWriteFuncHelper<TClass, TWriteMethod> >::getInstance();
 	}
-
-private:
-	static DynamicValueWriteFuncHelper _instance;
 };
 
-template<class TClass, MiniscriptInstructionOutcome (TClass::*TWriteMethod)(MiniscriptThread *thread, const DynamicValue &dest)>
-DynamicValueWriteFuncHelper<TClass, TWriteMethod> DynamicValueWriteFuncHelper<TClass, TWriteMethod>::_instance;
-
 struct DynamicValueWriteObjectHelper {
 	static MiniscriptInstructionOutcome write(MiniscriptThread *thread, const DynamicValue &value, void *objectRef, uintptr ptrOrOffset);
 	static MiniscriptInstructionOutcome refAttrib(MiniscriptThread *thread, DynamicValueWriteProxy &proxy, void *objectRef, uintptr ptrOrOffset, const Common::String &attrib);
@@ -1085,13 +1079,6 @@ private:
 	static bool isElementFilter(Structural *section);
 };
 
-struct Message {
-	Message();
-
-	Event evt;
-	DynamicValue data;
-};
-
 enum MessageDestination {
 	kMessageDestNone = 0,
 
@@ -1626,6 +1613,8 @@ private:
 	};
 
 	struct Teardown {
+		Teardown();
+
 		Common::WeakPtr<Structural> structural;
 		bool onlyRemoveChildren;
 	};
@@ -1644,20 +1633,29 @@ private:
 	};
 
 	struct ConsumeMessageTaskData {
+		ConsumeMessageTaskData();
+
 		IMessageConsumer *consumer;
 		Common::SharedPtr<MessageProperties> message;
 	};
 
 	struct ConsumeCommandTaskData {
+		ConsumeCommandTaskData();
+
 		Structural *structural;
 		Common::SharedPtr<MessageProperties> message;
 	};
 
 	struct UpdateMouseStateTaskData {
+		UpdateMouseStateTaskData();
+
 		bool mouseDown;
 	};
 
 	struct UpdateMousePositionTaskData {
+		UpdateMousePositionTaskData() : x(0), y(0) {
+		}
+
 		int32 x;
 		int32 y;
 	};
@@ -2195,6 +2193,7 @@ struct MediaCueState {
 	MessengerSendSpec send;
 	DynamicValue incomingData;
 
+	MediaCueState();
 	void checkTimestampChange(Runtime *runtime, uint32 oldTS, uint32 newTS, bool continuousTimestamps, bool canTriggerDuring);
 };
 
@@ -2239,6 +2238,8 @@ public:
 
 private:
 	struct LabelSuperGroup {
+		LabelSuperGroup();
+
 		size_t firstRootNodeIndex;
 		size_t numRootNodes;
 		size_t numTotalNodes;
@@ -2248,6 +2249,8 @@ private:
 	};
 
 	struct LabelTree {
+		LabelTree();
+
 		size_t firstChildIndex;
 		size_t numChildren;
 




More information about the Scummvm-git-logs mailing list