Initial commit
This commit is contained in:
248
engines/mtropolis/plugin/standard_data.cpp
Normal file
248
engines/mtropolis/plugin/standard_data.cpp
Normal file
@@ -0,0 +1,248 @@
|
||||
/* ScummVM - Graphic Adventure Engine
|
||||
*
|
||||
* ScummVM is the legal property of its developers, whose names
|
||||
* are too numerous to list here. Please refer to the COPYRIGHT
|
||||
* file distributed with this source distribution.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "mtropolis/plugin/standard_data.h"
|
||||
#include "mtropolis/plugin/standard.h"
|
||||
|
||||
namespace MTropolis {
|
||||
|
||||
namespace Data {
|
||||
|
||||
namespace Standard {
|
||||
|
||||
CursorModifier::CursorModifier() : haveRemoveWhen(false) {
|
||||
}
|
||||
|
||||
DataReadErrorCode CursorModifier::load(PlugIn &plugIn, const PlugInModifier &prefix, DataReader &reader) {
|
||||
if (prefix.plugInRevision != 0 && prefix.plugInRevision != 1 && prefix.plugInRevision != 2)
|
||||
return kDataReadErrorUnsupportedRevision;
|
||||
|
||||
if (!applyWhen.load(reader))
|
||||
return kDataReadErrorReadFailed;
|
||||
|
||||
if (prefix.plugInRevision >= 1) {
|
||||
if (!removeWhen.load(reader))
|
||||
return kDataReadErrorReadFailed;
|
||||
haveRemoveWhen = true;
|
||||
} else {
|
||||
removeWhen.type = PlugInTypeTaggedValue::kNull;
|
||||
haveRemoveWhen = false;
|
||||
}
|
||||
|
||||
if (!cursorIDAsLabel.load(reader))
|
||||
return kDataReadErrorReadFailed;
|
||||
|
||||
return kDataReadErrorNone;
|
||||
}
|
||||
|
||||
DataReadErrorCode STransCtModifier::load(PlugIn &plugIn, const PlugInModifier &prefix, DataReader &reader) {
|
||||
if (prefix.plugInRevision != 0)
|
||||
return kDataReadErrorUnsupportedRevision;
|
||||
|
||||
if (!enableWhen.load(reader) || !disableWhen.load(reader) || !transitionType.load(reader) ||
|
||||
!transitionDirection.load(reader) || !unknown1.load(reader) || !steps.load(reader) ||
|
||||
!duration.load(reader) || !fullScreen.load(reader))
|
||||
return kDataReadErrorReadFailed;
|
||||
|
||||
return kDataReadErrorNone;
|
||||
}
|
||||
|
||||
MediaCueMessengerModifier::MediaCueMessengerModifier()
|
||||
: unknown1(0), destination(0), unknown2(0) {
|
||||
}
|
||||
|
||||
DataReadErrorCode MediaCueMessengerModifier::load(PlugIn &plugIn, const PlugInModifier &prefix, DataReader &reader) {
|
||||
if (prefix.plugInRevision != 1)
|
||||
return kDataReadErrorUnsupportedRevision;
|
||||
|
||||
if (!enableWhen.load(reader) || !disableWhen.load(reader) || !sendEvent.load(reader)
|
||||
|| !nonStandardMessageFlags.load(reader) || !reader.readU16(unknown1) || !reader.readU32(destination)
|
||||
|| !reader.readU32(unknown2) || !with.load(reader) || !executeAt.load(reader)
|
||||
|| !triggerTiming.load(reader))
|
||||
return kDataReadErrorReadFailed;
|
||||
|
||||
return kDataReadErrorNone;
|
||||
}
|
||||
|
||||
DataReadErrorCode ObjectReferenceVariableModifier::load(PlugIn &plugIn, const PlugInModifier &prefix, DataReader &reader) {
|
||||
if (prefix.plugInRevision != 0 && prefix.plugInRevision != 2)
|
||||
return kDataReadErrorUnsupportedRevision;
|
||||
|
||||
if (!setToSourceParentWhen.load(reader))
|
||||
return kDataReadErrorReadFailed;
|
||||
|
||||
if (prefix.plugInRevision == 0) {
|
||||
unknown1.type = Data::PlugInTypeTaggedValue::kNull;
|
||||
if (!objectPath.load(reader))
|
||||
return kDataReadErrorReadFailed;
|
||||
} else {
|
||||
if (!unknown1.load(reader))
|
||||
return kDataReadErrorReadFailed;
|
||||
|
||||
bool hasNoPath = (unknown1.type == Data::PlugInTypeTaggedValue::kInteger && unknown1.value.asInt == 0);
|
||||
if (hasNoPath)
|
||||
objectPath.type = Data::PlugInTypeTaggedValue::kNull;
|
||||
else if (!objectPath.load(reader))
|
||||
return kDataReadErrorReadFailed;
|
||||
}
|
||||
|
||||
return kDataReadErrorNone;
|
||||
}
|
||||
|
||||
ListVariableModifier::ListVariableModifier() : unknown1(0), contentsType(0), unknown2{0, 0, 0, 0},
|
||||
havePersistentData(false), numValues(0), values(nullptr), persistentValuesGarbled(false) {
|
||||
}
|
||||
|
||||
ListVariableModifier::~ListVariableModifier() {
|
||||
if (values)
|
||||
delete[] values;
|
||||
}
|
||||
|
||||
DataReadErrorCode ListVariableModifier::load(PlugIn &plugIn, const PlugInModifier &prefix, DataReader &reader) {
|
||||
if (prefix.plugInRevision < 1 || prefix.plugInRevision > 3)
|
||||
return kDataReadErrorUnsupportedRevision;
|
||||
|
||||
int64 privateDataPos = reader.tell();
|
||||
|
||||
if (!reader.readU16(unknown1) || !reader.readU32(contentsType) || !reader.readBytes(unknown2))
|
||||
return kDataReadErrorReadFailed;
|
||||
|
||||
persistentValuesGarbled = false;
|
||||
|
||||
if (prefix.plugInRevision == 1 || prefix.plugInRevision == 3) {
|
||||
if (prefix.plugInRevision == 1) {
|
||||
havePersistentData = true;
|
||||
} else if (prefix.plugInRevision == 3) {
|
||||
PlugInTypeTaggedValue persistentFlag;
|
||||
if (!persistentFlag.load(reader) || persistentFlag.type != PlugInTypeTaggedValue::kBoolean)
|
||||
return kDataReadErrorReadFailed;
|
||||
|
||||
havePersistentData = (persistentFlag.value.asBoolean != 0);
|
||||
}
|
||||
|
||||
if (havePersistentData) {
|
||||
PlugInTypeTaggedValue numValuesVar;
|
||||
if (!numValuesVar.load(reader) || numValuesVar.type != PlugInTypeTaggedValue::kInteger || numValuesVar.value.asInt < 0)
|
||||
return kDataReadErrorReadFailed;
|
||||
|
||||
numValues = static_cast<uint32>(numValuesVar.value.asInt);
|
||||
|
||||
values = new PlugInTypeTaggedValue[numValues];
|
||||
for (size_t i = 0; i < numValues; i++) {
|
||||
if (!values[i].load(reader)) {
|
||||
if (static_cast<const MTropolis::Standard::StandardPlugIn &>(plugIn).getHacks().allowGarbledListModData) {
|
||||
persistentValuesGarbled = true;
|
||||
if (!reader.seek(privateDataPos + prefix.subObjectSize))
|
||||
return kDataReadErrorReadFailed;
|
||||
break;
|
||||
} else {
|
||||
return kDataReadErrorReadFailed;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
numValues = 0;
|
||||
values = nullptr;
|
||||
}
|
||||
} else {
|
||||
havePersistentData = false;
|
||||
numValues = 0;
|
||||
values = nullptr;
|
||||
}
|
||||
|
||||
return kDataReadErrorNone;
|
||||
}
|
||||
|
||||
DataReadErrorCode PanningModifier::load(PlugIn &plugIn, const PlugInModifier &prefix, DataReader &reader) {
|
||||
if (prefix.plugInRevision != 3)
|
||||
return kDataReadErrorUnsupportedRevision;
|
||||
|
||||
if (!unknown1Event.load(reader) || !unknown2Event.load(reader) || !unknown3Int.load(reader) || !unknown4Int.load(reader) || !unknown5Int.load(reader))
|
||||
return kDataReadErrorReadFailed;
|
||||
|
||||
return kDataReadErrorNone;
|
||||
}
|
||||
|
||||
DataReadErrorCode SysInfoModifier::load(PlugIn &plugIn, const PlugInModifier &prefix, DataReader &reader) {
|
||||
if (prefix.plugInRevision != 0)
|
||||
return kDataReadErrorUnsupportedRevision;
|
||||
|
||||
return kDataReadErrorNone;
|
||||
}
|
||||
|
||||
DataReadErrorCode FadeModifier::load(PlugIn &plugIn, const PlugInModifier &prefix, DataReader &reader) {
|
||||
if (prefix.plugInRevision != 1)
|
||||
return kDataReadErrorUnsupportedRevision;
|
||||
|
||||
if (!unknown1Event.load(reader) || !unknown2Event.load(reader) || !unknown3Int.load(reader) || !unknown4Int.load(reader) || !unknown5Int.load(reader))
|
||||
return kDataReadErrorReadFailed;
|
||||
|
||||
return kDataReadErrorNone;
|
||||
}
|
||||
|
||||
DataReadErrorCode PrintModifier::load(PlugIn &plugIn, const PlugInModifier &prefix, DataReader &reader) {
|
||||
if (prefix.plugInRevision != 0)
|
||||
return kDataReadErrorUnsupportedRevision;
|
||||
|
||||
if (!executeWhen.load(reader) || !unknown1Bool.load(reader) || !unknown2Bool.load(reader) ||
|
||||
!unknown3Bool.load(reader) || !filePath.load(reader) || !unknown4Bool.load(reader))
|
||||
return kDataReadErrorReadFailed;
|
||||
|
||||
return kDataReadErrorNone;
|
||||
}
|
||||
|
||||
DataReadErrorCode NavigateModifier::load(PlugIn &plugIn, const PlugInModifier &prefix, DataReader &reader) {
|
||||
if (prefix.plugInRevision != 0)
|
||||
return kDataReadErrorUnsupportedRevision;
|
||||
|
||||
error("Data structure loading for the Navigate modifier is not implemented.");
|
||||
|
||||
return kDataReadErrorNone;
|
||||
}
|
||||
|
||||
DataReadErrorCode OpenTitleModifier::load(PlugIn &plugIn, const PlugInModifier &prefix, DataReader &reader) {
|
||||
if (prefix.plugInRevision != 0)
|
||||
return kDataReadErrorUnsupportedRevision;
|
||||
|
||||
if (!executeWhen.load(reader) || !pathOrUrl.load(reader) || !addToReturnList.load(reader))
|
||||
return kDataReadErrorReadFailed;
|
||||
|
||||
return kDataReadErrorNone;
|
||||
}
|
||||
|
||||
DataReadErrorCode OpenAppModifier::load(PlugIn &plugIn, const PlugInModifier &prefix, DataReader &reader) {
|
||||
if (prefix.plugInRevision != 0)
|
||||
return kDataReadErrorUnsupportedRevision;
|
||||
|
||||
if (!unknown1Null.load(reader) || !unknown2Null.load(reader) || !unknown3Event.load(reader) || !unknown4String.load(reader))
|
||||
return kDataReadErrorReadFailed;
|
||||
|
||||
if (!unknown5Integer.load(reader) || !unknown6Integer.load(reader) || !unknown7Bool.load(reader))
|
||||
return kDataReadErrorReadFailed;
|
||||
|
||||
return kDataReadErrorNone;
|
||||
}
|
||||
|
||||
} // End of namespace Standard
|
||||
|
||||
} // End of namespace Data
|
||||
|
||||
} // End of namespace MTropolis
|
||||
Reference in New Issue
Block a user