diff options
| author | Travis Howell | 2008-03-22 09:46:25 +0000 | 
|---|---|---|
| committer | Travis Howell | 2008-03-22 09:46:25 +0000 | 
| commit | 63b1de562801d93919a3241c3525466d2a24754f (patch) | |
| tree | c653a65a6caebed82184a60f92d80e43c9b8f307 /engines/agos/saveload.cpp | |
| parent | 07bb52b78e08c5ba66e58644b81f8186c1ef1e94 (diff) | |
| download | scummvm-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.cpp | 69 | 
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);  	}  | 
