[Scummvm-cvs-logs] SF.net SVN: scummvm: [31218] scummvm/trunk/engines/agos

Kirben at users.sourceforge.net Kirben at users.sourceforge.net
Sat Mar 22 10:46:25 CET 2008


Revision: 31218
          http://scummvm.svn.sourceforge.net/scummvm/?rev=31218&view=rev
Author:   Kirben
Date:     2008-03-22 02:46:25 -0700 (Sat, 22 Mar 2008)

Log Message:
-----------
Add support for room states in Waxworks (DOS).

Modified Paths:
--------------
    scummvm/trunk/engines/agos/agos.cpp
    scummvm/trunk/engines/agos/agos.h
    scummvm/trunk/engines/agos/intern.h
    scummvm/trunk/engines/agos/res.cpp
    scummvm/trunk/engines/agos/res_snd.cpp
    scummvm/trunk/engines/agos/rooms.cpp
    scummvm/trunk/engines/agos/saveload.cpp

Modified: scummvm/trunk/engines/agos/agos.cpp
===================================================================
--- scummvm/trunk/engines/agos/agos.cpp	2008-03-22 00:33:05 UTC (rev 31217)
+++ scummvm/trunk/engines/agos/agos.cpp	2008-03-22 09:46:25 UTC (rev 31218)
@@ -146,11 +146,12 @@
 	_stringIdLocalMin = 0;
 	_stringIdLocalMax = 0;
 
-	_stateList = 0;
+	_roomStates = 0;
 	_numRoomStates = 0;
 
 	_menuBase = 0;
 	_roomsList = 0;
+	_roomsListPtr = 0;
 
 	_xtblList = 0;
 	_xtablesHeapPtrOrg = 0;

Modified: scummvm/trunk/engines/agos/agos.h
===================================================================
--- scummvm/trunk/engines/agos/agos.h	2008-03-22 00:33:05 UTC (rev 31217)
+++ scummvm/trunk/engines/agos/agos.h	2008-03-22 09:46:25 UTC (rev 31218)
@@ -240,11 +240,12 @@
 	byte **_localStringtable;
 	uint _stringIdLocalMin, _stringIdLocalMax;
 
-	byte *_stateList;
-	uint _numRoomStates;
+	RoomState *_roomStates;
+	uint16 _numRoomStates;
 
 	byte *_menuBase;
 	byte *_roomsList;
+	byte *_roomsListPtr;
 
 	byte *_xtblList;
 	byte *_xtablesHeapPtrOrg;

Modified: scummvm/trunk/engines/agos/intern.h
===================================================================
--- scummvm/trunk/engines/agos/intern.h	2008-03-22 00:33:05 UTC (rev 31217)
+++ scummvm/trunk/engines/agos/intern.h	2008-03-22 09:46:25 UTC (rev 31218)
@@ -115,6 +115,14 @@
 	SubObject_SIZE = sizeof(SubObject) - sizeof(int16)
 };
 
+struct RoomState {
+	uint16 state;
+	uint16 classFlags;
+	uint16 roomExitStates;
+
+	RoomState() { memset(this, 0, sizeof(*this)); }
+};
+
 struct Item {
 	uint16 parent;
 	uint16 child;

Modified: scummvm/trunk/engines/agos/res.cpp
===================================================================
--- scummvm/trunk/engines/agos/res.cpp	2008-03-22 00:33:05 UTC (rev 31217)
+++ scummvm/trunk/engines/agos/res.cpp	2008-03-22 09:46:25 UTC (rev 31218)
@@ -221,14 +221,17 @@
 
 		_numRoomStates = in.size() / 8;
 
-		_stateList = (byte *)malloc(_numRoomStates * 6);
-		if (_stateList == NULL)
+		_roomStates = (RoomState *)calloc(_numRoomStates, sizeof(RoomState));
+		if (_roomStates == NULL)
 			error("loadGamePcFile: Out of memory for room state list");
 
-		_numRoomStates *= 3;
+		for (uint s = 0; s < _numRoomStates; s++) {
+			uint16 num = in.readUint16BE() - (_itemArrayInited - 2);
 
-		// TODO Load room state resources
-
+			_roomStates[num].state = in.readUint16BE();
+			_roomStates[num].classFlags = in.readUint16BE();
+			_roomStates[num].roomExitStates = in.readUint16BE();
+		}
 		in.close();
 	}
 

Modified: scummvm/trunk/engines/agos/res_snd.cpp
===================================================================
--- scummvm/trunk/engines/agos/res_snd.cpp	2008-03-22 00:33:05 UTC (rev 31217)
+++ scummvm/trunk/engines/agos/res_snd.cpp	2008-03-22 09:46:25 UTC (rev 31218)
@@ -285,6 +285,10 @@
 void AGOSEngine::playMusic(uint16 music, uint16 track) {
 	stopMusic();
 
+	// FIXME: Music too unstable, when switching locations.
+	if (getPlatform() == Common::kPlatformPC && getGameType() == GType_WW)
+		return;
+
 	if (getPlatform() == Common::kPlatformAmiga) {
 		playModule(music);
 	} else if (getPlatform() == Common::kPlatformAtariST) {

Modified: scummvm/trunk/engines/agos/rooms.cpp
===================================================================
--- scummvm/trunk/engines/agos/rooms.cpp	2008-03-22 00:33:05 UTC (rev 31217)
+++ scummvm/trunk/engines/agos/rooms.cpp	2008-03-22 09:46:25 UTC (rev 31218)
@@ -351,19 +351,43 @@
 }
 
 // Waxworks specific
-bool AGOSEngine::loadRoomItems(uint16 item) {
+bool AGOSEngine::loadRoomItems(uint16 room) {
 	byte *p;
-	uint i, min_num, max_num;
+	uint i, minNum, maxNum;
 	char filename[30];
 	File in;
+	Item *item, *itemTmp;
 
-	p = _roomsList;
-	if (p == NULL)
+	if (_roomsList == NULL)
 		return 0;
 
-	_currentRoom = item;
-	item -= 2;
+	_currentRoom = room;
+	room -= 2;
 
+	if (_roomsListPtr) {
+		p = _roomsListPtr;
+		for (;;) {
+			minNum = READ_BE_UINT16(p); p += 2;
+			if (minNum == 0)
+				break;
+
+			maxNum = READ_BE_UINT16(p); p += 2;
+
+			 for (uint16 z = minNum; z <= maxNum; z++) {
+				uint16 itemNum = z + 2;
+				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;
+			}
+		}
+	}
+
+	p = _roomsList;
 	while (*p) {
 		for (i = 0; *p; p++, i++)
 			filename[i] = *p;
@@ -371,21 +395,57 @@
 		p++;
 
 		for (;;) {
-			min_num = READ_BE_UINT16(p); p += 2;
-			if (min_num == 0)
+			_roomsListPtr = p;
+
+			minNum = READ_BE_UINT16(p); p += 2;
+			if (minNum == 0)
 				break;
 
-			max_num = READ_BE_UINT16(p); p += 2;
+			maxNum = READ_BE_UINT16(p); p += 2;
 
-			if (item >= min_num && item <= max_num) {
+			if (room >= minNum && room <= maxNum) {
 				in.open(filename);
 				if (in.isOpen() == false) {
 					error("loadRoomItems: Can't load rooms file '%s'", filename);
 				}
 
 				while ((i = in.readUint16BE()) != 0) {
-					_itemArrayPtr[i + 2] = (Item *)allocateItem(sizeof(Item));
-					readItemFromGamePc(&in, _itemArrayPtr[i + 2]);
+					uint16 itemNum = i + 2;
+
+					_itemArrayPtr[itemNum] = (Item *)allocateItem(sizeof(Item));
+					readItemFromGamePc(&in, _itemArrayPtr[itemNum]);
+
+					item = derefItem(itemNum);
+					item->parent = 0;
+					item->child = 0;
+
+					 for (uint16 z = _itemArrayInited - 1; z; z--) {
+						itemTmp = _itemArrayPtr[z];
+
+						if (itemTmp->parent == 0)
+							continue;
+						if (itemTmp->parent != itemNum)
+							continue;
+						if (item->child == 0) {
+							item->child = z;
+							continue;
+						}
+						uint16 child = item->child;
+						while (itemTmp->next != 0) {
+							if (itemTmp->next == child) {
+								item->child = z;
+								break;
+							}
+
+							itemTmp = _itemArrayPtr[itemTmp->next];
+						}
+					}
+
+					uint16 num = (itemNum - _itemArrayInited);
+					item->state = _roomStates[num].state;
+					item->classFlags = _roomStates[num].classFlags;
+					SubRoom *subRoom = (SubRoom *)findChildOfType(item, kRoomType);
+					subRoom->roomExitStates = _roomStates[num].roomExitStates;
 				}
 				in.close();
 
@@ -394,7 +454,7 @@
 		}
 	}
 
-	debug(1,"loadRoomItems: didn't find %d", item);
+	debug(1,"loadRoomItems: didn't find %d", room);
 	return 0;
 }
 

Modified: scummvm/trunk/engines/agos/saveload.cpp
===================================================================
--- scummvm/trunk/engines/agos/saveload.cpp	2008-03-22 00:33:05 UTC (rev 31217)
+++ scummvm/trunk/engines/agos/saveload.cpp	2008-03-22 09:46:25 UTC (rev 31218)
@@ -1196,11 +1196,43 @@
 	}
 
 	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 @@
 	}
 
 	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);
 	}
 


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list