[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