aboutsummaryrefslogtreecommitdiff
path: root/engines/agos/saveload.cpp
diff options
context:
space:
mode:
authorTravis Howell2008-03-22 09:46:25 +0000
committerTravis Howell2008-03-22 09:46:25 +0000
commit63b1de562801d93919a3241c3525466d2a24754f (patch)
treec653a65a6caebed82184a60f92d80e43c9b8f307 /engines/agos/saveload.cpp
parent07bb52b78e08c5ba66e58644b81f8186c1ef1e94 (diff)
downloadscummvm-rg350-63b1de562801d93919a3241c3525466d2a24754f.tar.gz
scummvm-rg350-63b1de562801d93919a3241c3525466d2a24754f.tar.bz2
scummvm-rg350-63b1de562801d93919a3241c3525466d2a24754f.zip
Add support for room states in Waxworks (DOS).
svn-id: r31218
Diffstat (limited to 'engines/agos/saveload.cpp')
-rw-r--r--engines/agos/saveload.cpp69
1 files changed, 63 insertions, 6 deletions
diff --git a/engines/agos/saveload.cpp b/engines/agos/saveload.cpp
index 65b35a426a..1957d6ec10 100644
--- a/engines/agos/saveload.cpp
+++ b/engines/agos/saveload.cpp
@@ -1196,11 +1196,43 @@ bool AGOSEngine_Elvira2::loadGame(const char *filename, bool restartMode) {
}
if (getGameType() == GType_WW && getPlatform() == Common::kPlatformPC) {
- // TODO Load room state data
- for (uint s = 0; s <= _numRoomStates; s++) {
- f->readUint16BE();
+ for (uint s = 0; s < _numRoomStates; s++) {
+ _roomStates[s].state = f->readUint16BE();
+ _roomStates[s].classFlags = f->readUint16BE();
+ _roomStates[s].roomExitStates = f->readUint16BE();
}
f->readUint16BE();
+
+ uint16 room = _currentRoom;
+ _currentRoom = f->readUint16BE();
+
+ if (_roomsListPtr) {
+ byte *p = _roomsListPtr;
+ for (;;) {
+ uint16 minNum = READ_BE_UINT16(p); p += 2;
+ if (minNum == 0)
+ break;
+
+ uint16 maxNum = READ_BE_UINT16(p); p += 2;
+
+ for (uint16 z = minNum; z <= maxNum; z++) {
+ uint16 itemNum = z + 2;
+ Item *item = derefItem(itemNum);
+ item->parent = 0;
+
+ num = (itemNum - _itemArrayInited);
+ item->state = _roomStates[num].state;
+ item->classFlags = _roomStates[num].classFlags;
+ SubRoom *subRoom = (SubRoom *)findChildOfType(item, kRoomType);
+ subRoom->roomExitStates = _roomStates[num].roomExitStates;
+ }
+ }
+ }
+
+ if (room != _currentRoom) {
+ _roomsListPtr = 0;
+ loadRoomItems(_currentRoom);
+ }
}
item_index = 1;
@@ -1354,10 +1386,35 @@ bool AGOSEngine_Elvira2::saveGame(uint slot, const char *caption) {
}
if (getGameType() == GType_WW && getPlatform() == Common::kPlatformPC) {
- // TODO Save room state data
- for (uint s = 0; s <= _numRoomStates; s++) {
- f->writeUint16BE(0);
+ if (_roomsListPtr) {
+ byte *p = _roomsListPtr;
+ for (;;) {
+ uint16 minNum = READ_BE_UINT16(p); p += 2;
+ if (minNum == 0)
+ break;
+
+ uint16 maxNum = READ_BE_UINT16(p); p += 2;
+
+ for (uint16 z = minNum; z <= maxNum; z++) {
+ uint16 itemNum = z + 2;
+ Item *item = derefItem(itemNum);
+ item->parent = 0;
+
+ uint16 num = (itemNum - _itemArrayInited);
+ _roomStates[num].state = item->state;
+ _roomStates[num].classFlags = item->classFlags;
+ SubRoom *subRoom = (SubRoom *)findChildOfType(item, kRoomType);
+ _roomStates[num].roomExitStates = subRoom->roomExitStates;
+ }
+ }
+ }
+
+ for (uint s = 0; s < _numRoomStates; s++) {
+ f->writeUint16BE(_roomStates[s].state);
+ f->writeUint16BE(_roomStates[s].classFlags);
+ f->writeUint16BE(_roomStates[s].roomExitStates);
}
+ f->writeUint16BE(0);
f->writeUint16BE(_currentRoom);
}