[Scummvm-git-logs] scummvm master -> 51221b846e6d83e8cb3706149f5f4deb238d957d
elasota
noreply at scummvm.org
Mon Sep 26 00:45:31 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:
51221b846e MTROPOLIS: Add more features required by MTI
Commit: 51221b846e6d83e8cb3706149f5f4deb238d957d
https://github.com/scummvm/scummvm/commit/51221b846e6d83e8cb3706149f5f4deb238d957d
Author: elasota (ejlasota at gmail.com)
Date: 2022-09-25T20:44:25-04:00
Commit Message:
MTROPOLIS: Add more features required by MTI
Changed paths:
engines/mtropolis/data.cpp
engines/mtropolis/data.h
engines/mtropolis/modifier_factory.cpp
engines/mtropolis/modifiers.cpp
engines/mtropolis/modifiers.h
engines/mtropolis/mtropolis.h
engines/mtropolis/saveload.cpp
engines/mtropolis/saveload.h
diff --git a/engines/mtropolis/data.cpp b/engines/mtropolis/data.cpp
index f1602980e29..b78d78be138 100644
--- a/engines/mtropolis/data.cpp
+++ b/engines/mtropolis/data.cpp
@@ -117,6 +117,7 @@ bool isModifier(DataObjectType type) {
case kCursorModifierV1:
case kGradientModifier:
case kColorTableModifier:
+ case kSoundFadeModifier:
case kSaveAndRestoreModifier:
case kCompoundVariableModifier:
case kBooleanVariableModifier:
@@ -126,8 +127,8 @@ bool isModifier(DataObjectType type) {
case kPointVariableModifier:
case kFloatingPointVariableModifier:
case kStringVariableModifier:
+ case kObjectReferenceVariableModifierV1:
case kPlugInModifier:
- case kSoundFadeModifier:
case kDebris:
return true;
default:
@@ -1267,11 +1268,12 @@ DataReadErrorCode SetModifier::load(DataReader &reader) {
}
AliasModifier::AliasModifier()
- : modifierFlags(0), sizeIncludingTag(0), aliasIndexPlusOne(0), unknown1(0), unknown2(0), lengthOfName(0), guid(0), editorLayoutPosition(Point::createDefault()) {
+ : modifierFlags(0), sizeIncludingTag(0), aliasIndexPlusOne(0), unknown1(0), unknown2(0)
+ , lengthOfName(0), guid(0), editorLayoutPosition(Point::createDefault()), haveGUID(false) {
}
DataReadErrorCode AliasModifier::load(DataReader& reader) {
- if (_revision != 2)
+ if (_revision > 2)
return kDataReadErrorUnsupportedRevision;
if (!reader.readU32(modifierFlags)
@@ -1280,9 +1282,19 @@ DataReadErrorCode AliasModifier::load(DataReader& reader) {
|| !reader.readU32(unknown1)
|| !reader.readU32(unknown2)
|| !reader.readU16(lengthOfName)
- || !editorLayoutPosition.load(reader)
- || !reader.readU32(guid)
- || !reader.readTerminatedStr(name, lengthOfName))
+ || !editorLayoutPosition.load(reader))
+ return kDataReadErrorReadFailed;
+
+ if (_revision >= 2) {
+ haveGUID = true;
+ if (!reader.readU32(guid))
+ return kDataReadErrorReadFailed;
+ } else {
+ haveGUID = false;
+ guid = 0;
+ }
+
+ if (!reader.readTerminatedStr(name, lengthOfName))
return kDataReadErrorReadFailed;
return kDataReadErrorNone;
@@ -1802,6 +1814,19 @@ DataReadErrorCode StringVariableModifier::load(DataReader &reader) {
return kDataReadErrorNone;
}
+ObjectReferenceVariableModifierV1::ObjectReferenceVariableModifierV1() : unknown1(0) {
+}
+
+DataReadErrorCode ObjectReferenceVariableModifierV1::load(DataReader &reader) {
+ if (_revision != 1000)
+ return kDataReadErrorUnsupportedRevision;
+
+ if (!modHeader.load(reader) || !reader.readU32(unknown1) || !setToSourcesParentWhen.load(reader))
+ return kDataReadErrorReadFailed;
+
+ return kDataReadErrorNone;
+}
+
PlugInModifierData::~PlugInModifierData() {
}
@@ -2401,6 +2426,9 @@ DataReadErrorCode loadDataObject(const PlugInModifierRegistry ®istry, DataRea
case DataObjectTypes::kStringVariableModifier:
dataObject = new StringVariableModifier();
break;
+ case DataObjectTypes::kObjectReferenceVariableModifierV1:
+ dataObject = new ObjectReferenceVariableModifierV1();
+ break;
case DataObjectTypes::kDebris:
dataObject = new Debris();
break;
diff --git a/engines/mtropolis/data.h b/engines/mtropolis/data.h
index 3c34a51dc24..ba65780a454 100644
--- a/engines/mtropolis/data.h
+++ b/engines/mtropolis/data.h
@@ -137,6 +137,7 @@ enum DataObjectType {
kPointVariableModifier = 0x326,
kFloatingPointVariableModifier = 0x328,
kStringVariableModifier = 0x329,
+ kObjectReferenceVariableModifierV1 = 0x33e,
kDebris = 0xfffffffe, // Deleted modifier in alias list
kPlugInModifier = 0xffffffff,
@@ -1058,6 +1059,8 @@ struct AliasModifier : public DataObject {
Common::String name;
+ bool haveGUID;
+
protected:
DataReadErrorCode load(DataReader &reader) override;
};
@@ -1670,6 +1673,17 @@ protected:
DataReadErrorCode load(DataReader &reader) override;
};
+struct ObjectReferenceVariableModifierV1 : public DataObject {
+ ObjectReferenceVariableModifierV1();
+
+ TypicalModifierHeader modHeader;
+ uint32 unknown1;
+ Event setToSourcesParentWhen;
+
+protected:
+ DataReadErrorCode load(DataReader &reader) override;
+};
+
struct PlugInModifierData {
virtual ~PlugInModifierData();
virtual DataReadErrorCode load(PlugIn &plugIn, const PlugInModifier &prefix, DataReader &reader) = 0;
diff --git a/engines/mtropolis/modifier_factory.cpp b/engines/mtropolis/modifier_factory.cpp
index a996e4cf571..434781b719d 100644
--- a/engines/mtropolis/modifier_factory.cpp
+++ b/engines/mtropolis/modifier_factory.cpp
@@ -134,6 +134,8 @@ SIModifierFactory *getModifierFactoryForDataObjectType(const Data::DataObjectTyp
return ModifierFactory<FloatingPointVariableModifier, Data::FloatingPointVariableModifier>::getInstance();
case Data::DataObjectTypes::kStringVariableModifier:
return ModifierFactory<StringVariableModifier, Data::StringVariableModifier>::getInstance();
+ case Data::DataObjectTypes::kObjectReferenceVariableModifierV1:
+ return ModifierFactory<ObjectReferenceVariableModifierV1, Data::ObjectReferenceVariableModifierV1>::getInstance();
default:
warning("No modifier factory for type %x", static_cast<int>(dataObjectType));
diff --git a/engines/mtropolis/modifiers.cpp b/engines/mtropolis/modifiers.cpp
index d218b5e7dd2..f808077fc18 100644
--- a/engines/mtropolis/modifiers.cpp
+++ b/engines/mtropolis/modifiers.cpp
@@ -365,16 +365,33 @@ VThreadState SaveAndRestoreModifier::consumeMessage(Runtime *runtime, const Comm
return kVThreadError;
}
+ // There doesn't appear to be any flag for this, it just uses the file path field
+ bool isPrompt = (_filePath == "Ask User");
+
if (_saveWhen.respondsTo(msg->getEvent())) {
CompoundVarSaver saver(obj);
- if (runtime->getSaveProvider()->promptSave(&saver, runtime->getSaveScreenshotOverride().get())) {
+
+ bool succeeded = false;
+ if (isPrompt)
+ succeeded = runtime->getSaveProvider()->promptSave(&saver, runtime->getSaveScreenshotOverride().get());
+ else
+ succeeded = runtime->getSaveProvider()->namedSave(&saver, runtime->getSaveScreenshotOverride().get(), _fileName);
+
+ if (succeeded) {
for (const Common::SharedPtr<SaveLoadHooks> &hooks : runtime->getHacks().saveLoadHooks)
hooks->onSave(runtime, this, static_cast<Modifier *>(obj));
}
return kVThreadReturn;
} else if (_restoreWhen.respondsTo(msg->getEvent())) {
CompoundVarLoader loader(obj);
- if (runtime->getLoadProvider()->promptLoad(&loader)) {
+
+ bool succeeded = false;
+ if (isPrompt)
+ runtime->getLoadProvider()->promptLoad(&loader);
+ else
+ runtime->getLoadProvider()->namedLoad(&loader, _fileName);
+
+ if (succeeded) {
for (const Common::SharedPtr<SaveLoadHooks> &hooks : runtime->getHacks().saveLoadHooks)
hooks->onLoad(runtime, this, static_cast<Modifier *>(obj));
}
@@ -2815,4 +2832,72 @@ bool StringVariableModifier::SaveLoad::loadInternal(Common::ReadStream *stream,
return true;
}
+
+
+bool ObjectReferenceVariableModifierV1::load(ModifierLoaderContext &context, const Data::ObjectReferenceVariableModifierV1 &data) {
+ if (!loadTypicalHeader(data.modHeader))
+ return false;
+
+ if (!_setToSourcesParentWhen.load(data.setToSourcesParentWhen))
+ return false;
+
+ return true;
+}
+
+bool ObjectReferenceVariableModifierV1::respondsToEvent(const Event &evt) const {
+ return _setToSourcesParentWhen.respondsTo(evt);
+}
+
+VThreadState ObjectReferenceVariableModifierV1::consumeMessage(Runtime *runtime, const Common::SharedPtr<MessageProperties> &msg) {
+ if (msg->getEvent().respondsTo(_setToSourcesParentWhen)) {
+ warning("Set to source's parent is not implemented");
+ }
+ return kVThreadError;
+}
+
+Common::SharedPtr<ModifierSaveLoad> ObjectReferenceVariableModifierV1::getSaveLoad() {
+ return Common::SharedPtr<ModifierSaveLoad>(new SaveLoad(this));
+}
+
+bool ObjectReferenceVariableModifierV1::varSetValue(MiniscriptThread *thread, const DynamicValue &value) {
+ if (value.getType() == DynamicValueTypes::kNull)
+ _value.reset();
+ else if (value.getType() == DynamicValueTypes::kObject)
+ _value = value.getObject().object;
+ else
+ return false;
+
+ return true;
+}
+
+void ObjectReferenceVariableModifierV1::varGetValue(MiniscriptThread *thread, DynamicValue &dest) const {
+ if (_value.expired())
+ dest.clear();
+ else
+ dest.setObject(_value);
+}
+
+Common::SharedPtr<Modifier> ObjectReferenceVariableModifierV1::shallowClone() const {
+ return Common::SharedPtr<Modifier>(new ObjectReferenceVariableModifierV1(*this));
+}
+
+const char *ObjectReferenceVariableModifierV1::getDefaultName() const {
+ return "Object Reference Variable";
+}
+
+ObjectReferenceVariableModifierV1::SaveLoad::SaveLoad(ObjectReferenceVariableModifierV1 *modifier) : _modifier(modifier) {
+}
+
+void ObjectReferenceVariableModifierV1::SaveLoad::commitLoad() const {
+ _modifier->_value = _value;
+}
+
+void ObjectReferenceVariableModifierV1::SaveLoad::saveInternal(Common::WriteStream *stream) const {
+ error("Saving version 1 object reference variables is not currently supported");
+}
+
+bool ObjectReferenceVariableModifierV1::SaveLoad::loadInternal(Common::ReadStream *stream, uint32 saveFileVersion) {
+ return true;
+}
+
} // End of namespace MTropolis
diff --git a/engines/mtropolis/modifiers.h b/engines/mtropolis/modifiers.h
index 3ea119e7cdd..b30ec28646b 100644
--- a/engines/mtropolis/modifiers.h
+++ b/engines/mtropolis/modifiers.h
@@ -1178,6 +1178,44 @@ private:
Common::String _value;
};
+class ObjectReferenceVariableModifierV1 : public VariableModifier {
+public:
+ bool load(ModifierLoaderContext &context, const Data::ObjectReferenceVariableModifierV1 &data);
+
+ bool respondsToEvent(const Event &evt) const override;
+ VThreadState consumeMessage(Runtime *runtime, const Common::SharedPtr<MessageProperties> &msg) override;
+
+ Common::SharedPtr<ModifierSaveLoad> getSaveLoad() override;
+
+ bool varSetValue(MiniscriptThread *thread, const DynamicValue &value) override;
+ void varGetValue(MiniscriptThread *thread, DynamicValue &dest) const override;
+
+#ifdef MTROPOLIS_DEBUG_ENABLE
+ const char *debugGetTypeName() const override { return "Object Reference Variable Modifier V1"; }
+ SupportStatus debugGetSupportStatus() const override { return kSupportStatusNone; }
+#endif
+
+private:
+ class SaveLoad : public ModifierSaveLoad {
+ public:
+ explicit SaveLoad(ObjectReferenceVariableModifierV1 *modifier);
+
+ private:
+ void commitLoad() const override;
+ void saveInternal(Common::WriteStream *stream) const override;
+ bool loadInternal(Common::ReadStream *stream, uint32 saveFileVersion) override;
+
+ ObjectReferenceVariableModifierV1 *_modifier;
+ Common::WeakPtr<RuntimeObject> _value;
+ };
+
+ Common::SharedPtr<Modifier> shallowClone() const override;
+ const char *getDefaultName() const override;
+
+ Common::WeakPtr<RuntimeObject> _value;
+ Event _setToSourcesParentWhen;
+};
+
} // End of namespace MTropolis
#endif
diff --git a/engines/mtropolis/mtropolis.h b/engines/mtropolis/mtropolis.h
index 0623ebe6bcd..c43c88a8773 100644
--- a/engines/mtropolis/mtropolis.h
+++ b/engines/mtropolis/mtropolis.h
@@ -59,8 +59,10 @@ public:
Common::Platform getPlatform() const;
bool promptSave(ISaveWriter *writer, const Graphics::Surface *screenshotOverride) override;
+ bool namedSave(ISaveWriter *writer, const Graphics::Surface *screenshotOverride, const Common::String &fileName) override;
bool autoSave(ISaveWriter *writer) override;
bool promptLoad(ISaveReader *reader) override;
+ bool namedLoad(ISaveReader *reader, const Common::String &fileName) override;
const Graphics::Surface *getSavegameScreenshot() const;
@@ -75,6 +77,11 @@ protected:
void pauseEngineIntern(bool pause) override;
private:
+ bool save(ISaveWriter *writer, const Graphics::Surface *screenshotOverride, const Common::String &fileName, const Common::String &desc);
+ bool load(ISaveReader *reader, const Common::String &fileName);
+
+ Common::String getUnpromptedSaveFileName(const Common::String &fileName);
+
static const uint kCurrentSaveFileVersion = 1;
static const uint kSavegameSignature = 0x6d545356; // mTSV
diff --git a/engines/mtropolis/saveload.cpp b/engines/mtropolis/saveload.cpp
index 75d458e9c9c..1f865aa49da 100644
--- a/engines/mtropolis/saveload.cpp
+++ b/engines/mtropolis/saveload.cpp
@@ -87,6 +87,12 @@ bool MTropolisEngine::promptSave(ISaveWriter *writer, const Graphics::Surface *s
return true;
Common::String saveFileName = getSaveStateName(slot);
+
+ return save(writer, screenshotOverride, saveFileName, desc);
+}
+
+bool MTropolisEngine::save(ISaveWriter *writer, const Graphics::Surface *screenshotOverride, const Common::String &saveFileName, const Common::String &desc) {
+
Common::SharedPtr<Common::OutSaveFile> out(_saveFileMan->openForSaving(saveFileName, false));
ISaveWriter *oldWriter = _saveWriter;
@@ -102,6 +108,10 @@ bool MTropolisEngine::promptSave(ISaveWriter *writer, const Graphics::Surface *s
return true;
}
+bool MTropolisEngine::namedSave(ISaveWriter *writer, const Graphics::Surface *screenshotOverride, const Common::String &fileName) {
+ return save(writer, screenshotOverride, getUnpromptedSaveFileName(fileName), fileName);
+}
+
bool MTropolisEngine::promptLoad(ISaveReader *reader) {
Common::String desc;
int slot;
@@ -115,7 +125,16 @@ bool MTropolisEngine::promptLoad(ISaveReader *reader) {
return true;
Common::String saveFileName = getSaveStateName(slot);
+
+ return load(reader, saveFileName);
+}
+
+bool MTropolisEngine::load(ISaveReader *reader, const Common::String &saveFileName) {
Common::SharedPtr<Common::InSaveFile> in(_saveFileMan->openForLoading(saveFileName));
+ if (!in) {
+ warning("An error occurred while attempting to open save file '%s'", saveFileName.c_str());
+ return false;
+ }
uint32 signature = in->readUint32BE();
uint32 saveFileVersion = in->readUint32BE();
@@ -154,6 +173,14 @@ bool MTropolisEngine::promptLoad(ISaveReader *reader) {
return true;
}
+Common::String MTropolisEngine::getUnpromptedSaveFileName(const Common::String &fileName) {
+ return _targetName + "." + toCaseInsensitive(fileName);
+}
+
+bool MTropolisEngine::namedLoad(ISaveReader *reader, const Common::String &fileName) {
+ return load(reader, getUnpromptedSaveFileName(fileName));
+}
+
bool MTropolisEngine::autoSave(ISaveWriter *writer) {
ISaveWriter *oldWriter = _saveWriter;
bool oldIsTriggeredAutosave = _isTriggeredAutosave;
diff --git a/engines/mtropolis/saveload.h b/engines/mtropolis/saveload.h
index bc94ead80d4..f060a1eb768 100644
--- a/engines/mtropolis/saveload.h
+++ b/engines/mtropolis/saveload.h
@@ -53,10 +53,12 @@ struct ISaveReader : public IInterfaceBase {
struct ISaveUIProvider : public IInterfaceBase {
virtual bool promptSave(ISaveWriter *writer, const Graphics::Surface *screenshotOverride) = 0;
+ virtual bool namedSave(ISaveWriter *writer, const Graphics::Surface *screenshotOverride, const Common::String &fileName) = 0;
};
struct ILoadUIProvider : public IInterfaceBase {
virtual bool promptLoad(ISaveReader *reader) = 0;
+ virtual bool namedLoad(ISaveReader *reader, const Common::String &fileName) = 0;
};
struct IAutoSaveProvider : public IInterfaceBase {
More information about the Scummvm-git-logs
mailing list