Theres nothing to see here...

- Start of CMI support

svn-id: r4459
This commit is contained in:
James Brown 2002-07-04 15:48:17 +00:00
parent e8d21d7b57
commit e346e6c28c
6 changed files with 136 additions and 69 deletions

View file

@ -263,14 +263,24 @@ void Scumm::readIndexFile()
break;
case MKID('DOBJ'):
num = fileReadWordLE();
if (_features & GF_AFTER_V8)
num = fileReadDwordLE();
else
num = fileReadWordLE();
assert(num == _numGlobalObjects);
if (_features & GF_AFTER_V7) {
if (_features & GF_AFTER_V8) { /* FIXME: Not sure.. */
for (i=0; i<num; i++) {
fileSeek(_fileHandle, 40, SEEK_CUR);
_objectStateTable[i] = fileReadByte();
_objectRoomTable[i] = fileReadByte();
_classData[i] = fileReadDwordLE();
}
memset(_objectOwnerTable, 0xFF, num);
} else if (_features & GF_AFTER_V7) {
fileRead(_fileHandle, _objectStateTable, num);
fileRead(_fileHandle, _objectRoomTable, num);
memset(_objectOwnerTable, 0xFF, num);
} else {
fileRead(_fileHandle, _objectOwnerTable, num);
for (i = 0; i < num; i++) {
@ -278,15 +288,16 @@ void Scumm::readIndexFile()
_objectOwnerTable[i] &= OF_OWNER_MASK;
}
}
fileRead(_fileHandle, _classData, num * sizeof(uint32));
/* This code should be here. Otherwise the flags will be swapped for big endian computers.
* If it doesn't work with this code, something else is wrong */
if (!(_features & GF_AFTER_V8)) {
fileRead(_fileHandle, _classData, num * sizeof(uint32));
// Swap flag endian where applicable
#if defined(SCUMM_BIG_ENDIAN)
for (i = 0; i != num; i++) {
_classData[i] = FROM_LE_32(_classData[i]);
}
for (i = 0; i != num; i++)
_classData[i] = FROM_LE_32(_classData[i]);
#endif
}
break;
case MKID('RNAM'):
@ -298,6 +309,10 @@ void Scumm::readIndexFile()
readResTypeList(rtRoom, MKID('ROOM'), "room");
break;
case MKID('DRSC'): // FIXME: Verify
readResTypeList(rtRoomScripts,MKID('RMSC'), "room script");
break;
case MKID('DSCR'):
readResTypeList(rtScript, MKID('SCRP'), "script");
break;
@ -354,7 +369,10 @@ void Scumm::readResTypeList(int id, uint32 tag, const char *name)
debug(9, "readResTypeList(%s,%x,%s)", resTypeFromId(id), FROM_LE_32(tag), name);
num = fileReadWordLE();
if (_features & GF_AFTER_V8)
num = fileReadDwordLE();
else
num = fileReadWordLE();
if (1 || _features & GF_AFTER_V6) {
if (num != res.num[id]) {
@ -1152,7 +1170,31 @@ void Scumm::unkHeapProc2(int a, int b)
void Scumm::readMAXS()
{
if (_features & GF_AFTER_V7) {
if (_features & GF_AFTER_V8) {
fileSeek(_fileHandle, 50+50, SEEK_CUR);
_numVariables = fileReadDwordLE(); /* ? 1500 */
_numBitVariables = fileReadDwordLE(); /* ? 2048 */
fileReadDwordLE(); /* 40 */
_numScripts = fileReadDwordLE();
_numSounds = fileReadDwordLE();
_numCharsets = fileReadDwordLE();
_numCostumes = fileReadDwordLE();
_numRooms = fileReadDwordLE();
_numInventory = fileReadDwordLE();
_numGlobalObjects = fileReadDwordLE();
_numFlObject = fileReadDwordLE();
_numLocalObjects = fileReadDwordLE();
_numVerbs = fileReadDwordLE();
_numNewNames = fileReadDwordLE();
fileReadDwordLE();
fileReadDwordLE();
_numArray = fileReadDwordLE();
_objectRoomTable = (byte*)calloc(_numGlobalObjects, 1);
_numGlobalScripts = 2000;
_shadowPaletteSize = NUM_SHADOW_PALETTE * 256;
} else if (_features & GF_AFTER_V7) {
fileSeek(_fileHandle, 50 + 50, SEEK_CUR);
_numVariables = fileReadWordLE();
_numBitVariables = fileReadWordLE();
@ -1247,6 +1289,7 @@ void Scumm::allocateArrays()
MKID('COST'), _numCostumes, "costume", 1);
allocResTypeData(rtRoom, MKID('ROOM'), _numRooms, "room", 1);
allocResTypeData(rtRoomScripts, MKID('RMSC'), _numRooms, "room script", 1);
allocResTypeData(rtSound, MKID('SOUN'), _numSounds, "sound", 1);
allocResTypeData(rtScript, MKID('SCRP'), _numScripts, "script", 1);
allocResTypeData(rtCharset, MKID('CHAR'), _numCharsets, "charset", 1);