Added functionality to allow saving/loading the game state

svn-id: r24070
This commit is contained in:
Paul Gilbert 2006-10-02 12:48:56 +00:00
parent e8623fa477
commit 1a96e26bf6
13 changed files with 581 additions and 13 deletions

View file

@ -313,6 +313,108 @@ HotspotData::HotspotData(HotspotResource *rec) {
actionHotspotId = 0;
}
void HotspotData::saveToStream(WriteStream *stream) {
// Write out the basic fields
stream->writeUint16LE(descId);
stream->writeUint16LE(descId2);
stream->writeUint32LE(actions);
stream->writeByte(flags);
stream->writeByte(flags2);
stream->writeByte(headerFlags);
stream->writeSint16LE(startX);
stream->writeSint16LE(startY);
stream->writeUint16LE(roomNumber);
stream->writeUint16LE(width);
stream->writeUint16LE(height);
stream->writeUint16LE(widthCopy);
stream->writeUint16LE(heightCopy);
stream->writeUint16LE(yCorrection);
stream->writeUint16LE(sequenceOffset);
stream->writeUint16LE(tickProcOffset);
stream->writeUint16LE(tickTimeout);
stream->writeUint16LE(tickSequenceOffset);
stream->writeUint16LE(characterMode);
stream->writeUint16LE(delayCtr);
// Write out the runtime fields
stream->writeUint16LE(actionCtr);
stream->writeUint16LE(blockedState);
stream->writeByte(coveredFlag);
stream->writeUint16LE(talkMessageId);
stream->writeUint16LE(talkDestCharacterId);
stream->writeUint16LE(talkCountdown);
stream->writeUint16LE(pauseCtr);
stream->writeUint16LE(useHotspotId);
stream->writeUint16LE(use2HotspotId);
stream->writeUint16LE(v2b);
stream->writeUint16LE(actionHotspotId);
}
void HotspotData::loadFromStream(ReadStream *stream) {
// Read in the basic fields
descId = stream->readUint16LE();
descId2 = stream->readUint16LE();
actions = stream->readUint32LE();
flags = stream->readByte();
flags2 = stream->readByte();
headerFlags = stream->readByte();
startX = stream->readSint16LE();
startY = stream->readSint16LE();
roomNumber = stream->readUint16LE();
width = stream->readUint16LE();
height = stream->readUint16LE();
widthCopy = stream->readUint16LE();
heightCopy = stream->readUint16LE();
yCorrection = stream->readUint16LE();
sequenceOffset = stream->readUint16LE();
tickProcOffset = stream->readUint16LE();
tickTimeout = stream->readUint16LE();
tickSequenceOffset = stream->readUint16LE();
characterMode = (CharacterMode) stream->readUint16LE();
delayCtr = stream->readUint16LE();
// Read in the runtime fields
actionCtr = stream->readUint16LE();
blockedState = (BlockedState)stream->readUint16LE();
coveredFlag = stream->readByte() != 0;
talkMessageId = stream->readUint16LE();
talkDestCharacterId = stream->readUint16LE();
talkCountdown = stream->readUint16LE();
pauseCtr = stream->readUint16LE();
useHotspotId = stream->readUint16LE();
use2HotspotId = stream->readUint16LE();
v2b = stream->readUint16LE();
actionHotspotId = stream->readUint16LE();
}
// Hotspot data list
void HotspotDataList::saveToStream(WriteStream *stream) {
iterator i;
for (i = begin(); i != end(); ++i)
{
HotspotData *hotspot = *i;
stream->writeUint16LE(hotspot->hotspotId);
hotspot->saveToStream(stream);
}
stream->writeUint16LE(0);
}
void HotspotDataList::loadFromStream(ReadStream *stream) {
Resources &res = Resources::getReference();
iterator i;
uint16 hotspotId = stream->readUint16LE();
while (hotspotId != 0)
{
HotspotData *hotspot = res.getHotspot(hotspotId);
assert(hotspot);
hotspot->loadFromStream(stream);
hotspotId = stream->readUint16LE();
}
}
// Hotspot override data
HotspotOverrideData::HotspotOverrideData(HotspotOverrideResource *rec) {
@ -876,4 +978,40 @@ void ValueTableData::setField(FieldName fieldName, uint16 value) {
setField((uint16) fieldName, value);
}
void ValueTableData::saveToStream(Common::WriteStream *stream)
{
// Write out the special fields
stream->writeUint16LE(_numGroats);
stream->writeSint16LE(_playerNewPos.position.x);
stream->writeSint16LE(_playerNewPos.position.y);
stream->writeUint16LE(_playerNewPos.roomNumber);
stream->writeByte(_playerPendingPos.isSet);
stream->writeSint16LE(_playerPendingPos.pos.x);
stream->writeSint16LE(_playerPendingPos.pos.y);
stream->writeByte(_flags);
stream->writeByte(_hdrFlagMask);
// Write out the special fields
for (int index = 0; index < NUM_VALUE_FIELDS; ++index)
stream->writeUint16LE(_fieldList[index]);
}
void ValueTableData::loadFromStream(Common::ReadStream *stream)
{
// Load special fields
_numGroats = stream->readUint16LE();
_playerNewPos.position.x = stream->readSint16LE();
_playerNewPos.position.y = stream->readSint16LE();
_playerNewPos.roomNumber = stream->readUint16LE();
_playerPendingPos.isSet = stream->readByte() != 0;
_playerPendingPos.pos.x = stream->readSint16LE();
_playerPendingPos.pos.y = stream->readSint16LE();
_flags = stream->readByte();
_hdrFlagMask = stream->readByte();
// Read in the field list
for (int index = 0; index < NUM_VALUE_FIELDS; ++index)
_fieldList[index] = stream->readUint16LE();
}
} // end of namespace Lure