mirror of
https://github.com/libretro/scummvm.git
synced 2025-03-01 15:55:45 +00:00
236 lines
7.8 KiB
C++
236 lines
7.8 KiB
C++
/* 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;
|
|
}
|
|
|
|
} // End of namespace Standard
|
|
|
|
} // End of namespace Data
|
|
|
|
} // End of namespace MTropolis
|