diff options
Diffstat (limited to 'scumm/resource_v4.cpp')
-rw-r--r-- | scumm/resource_v4.cpp | 133 |
1 files changed, 133 insertions, 0 deletions
diff --git a/scumm/resource_v4.cpp b/scumm/resource_v4.cpp index be05f9c2d8..d40b2e87ca 100644 --- a/scumm/resource_v4.cpp +++ b/scumm/resource_v4.cpp @@ -23,9 +23,106 @@ #include "stdafx.h" #include "scumm/scumm.h" #include "scumm/intern.h" +#include "scumm/resource.h" namespace Scumm { +void ScummEngine_v4::readIndexFile() { + uint16 blocktype; + uint32 itemsize; + int numblock = 0; + + debug(9, "readIndexFile()"); + + closeRoom(); + openRoom(0); + + while (!_fileHandle->eof()) { + itemsize = _fileHandle->readUint32LE(); + blocktype = _fileHandle->readUint16LE(); + if (_fileHandle->ioFailed()) + break; + + switch (blocktype) { + case 0x4E52: // 'NR' + _fileHandle->readUint16LE(); + break; + case 0x5230: // 'R0' + _numRooms = _fileHandle->readUint16LE(); + break; + case 0x5330: // 'S0' + _numScripts = _fileHandle->readUint16LE(); + break; + case 0x4E30: // 'N0' + _numSounds = _fileHandle->readUint16LE(); + break; + case 0x4330: // 'C0' + _numCostumes = _fileHandle->readUint16LE(); + break; + case 0x4F30: // 'O0' + _numGlobalObjects = _fileHandle->readUint16LE(); + break; + } + _fileHandle->seek(itemsize - 8, SEEK_CUR); + } + + _fileHandle->clearIOFailed(); + _fileHandle->seek(0, SEEK_SET); + + readMAXS(); + + // Jamieson630: palManipulate variable initialization + _palManipCounter = 0; + _palManipPalette = 0; // Will allocate when needed + _palManipIntermediatePal = 0; // Will allocate when needed + + while (1) { + itemsize = _fileHandle->readUint32LE(); + + if (_fileHandle->ioFailed()) + break; + + blocktype = _fileHandle->readUint16LE(); + + numblock++; + + switch (blocktype) { + + case 0x4E52: // 'NR' + _fileHandle->seek(itemsize - 6, SEEK_CUR); + break; + + case 0x5230: // 'R0' + readResTypeList(rtRoom, MKID('ROOM'), "room"); + break; + + case 0x5330: // 'S0' + readResTypeList(rtScript, MKID('SCRP'), "script"); + break; + + case 0x4E30: // 'N0' + readResTypeList(rtSound, MKID('SOUN'), "sound"); + break; + + case 0x4330: // 'C0' + readResTypeList(rtCostume, MKID('COST'), "costume"); + break; + + case 0x4F30: // 'O0' + readGlobalObjects(); + break; + + default: + // FIXME: this is a little hack because Indy3 FM-TOWNS has + // 32 extra bytes of unknown meaning appended to 00.LFL + if (!(_gameId == GID_INDY3 && _features & GF_FMTOWNS)) + error("Bad ID %c%c found in directory!", blocktype & 0xFF, blocktype >> 8); + return; + } + } + closeRoom(); +} + void ScummEngine_v4::loadCharset(int no) { uint32 size; memset(_charsetData, 0, sizeof(_charsetData)); @@ -41,4 +138,40 @@ void ScummEngine_v4::loadCharset(int no) { closeRoom(); } +void ScummEngine_v4::readMAXS() { + // FIXME - I'm not sure for those values yet, they will have to be rechecked + + _numVariables = 800; // 800 + _numBitVariables = 4096; // 2048 + _numLocalObjects = 200; // 200 + _numArray = 50; + _numVerbs = 100; + _numNewNames = 50; + _objectRoomTable = NULL; + _numCharsets = 9; // 9 + _numInventory = 80; // 80 + _numGlobalScripts = 200; + _numFlObject = 50; + + _shadowPaletteSize = 256; + + _shadowPalette = (byte *) calloc(_shadowPaletteSize, 1); // FIXME - needs to be removed later + allocateArrays(); +} + +void ScummEngine_v4::readGlobalObjects() { + int num = _fileHandle->readUint16LE(); + assert(num == _numGlobalObjects); + for (int i = 0; i != num; i++) { + uint32 bits = _fileHandle->readByte(); + byte tmp; + bits |= _fileHandle->readByte() << 8; + bits |= _fileHandle->readByte() << 16; + _classData[i] = bits; + tmp = _fileHandle->readByte(); + _objectOwnerTable[i] = tmp & OF_OWNER_MASK; + _objectStateTable[i] = tmp >> OF_STATE_SHL; + } +} + } // End of namespace Scumm |