diff options
-rw-r--r-- | scumm/intern.h | 4 | ||||
-rw-r--r-- | scumm/resource.cpp | 257 | ||||
-rw-r--r-- | scumm/scumm.cpp | 14 | ||||
-rw-r--r-- | scumm/scumm.h | 2 |
4 files changed, 147 insertions, 130 deletions
diff --git a/scumm/intern.h b/scumm/intern.h index f482116312..53944e7430 100644 --- a/scumm/intern.h +++ b/scumm/intern.h @@ -679,10 +679,13 @@ protected: Win32ResExtractor *_win32ResExtractor; MacResExtractor *_macResExtractor; + byte *_heV7RoomOffsets; + int _heSndSoundFreq, _heSndOffset, _heSndChannel, _heSndSoundId, _heSndFlags, _heSBNGId; public: ScummEngine_v70he(GameDetector *detector, OSystem *syst, const ScummGameSettings &gs, uint8 md5sum[16]); + ~ScummEngine_v70he(); Wiz _wiz; @@ -693,6 +696,7 @@ protected: virtual void readRoomsOffsets(); virtual void readGlobalObjects(); + virtual void readIndexBlock(uint32 blocktype, uint32 itemsize); virtual void redrawBGAreas(); diff --git a/scumm/resource.cpp b/scumm/resource.cpp index a9cacdf877..9010fb6549 100644 --- a/scumm/resource.cpp +++ b/scumm/resource.cpp @@ -280,8 +280,6 @@ void ScummEngine::askForDisk(const char *filename, int disknum) { void ScummEngine::readIndexFile() { uint32 blocktype, itemsize; int numblock = 0; - int i; - bool stop = false; debugC(DEBUG_GENERAL, "readIndexFile()"); @@ -326,141 +324,152 @@ void ScummEngine::readIndexFile() { _fileHandle->seek(0, SEEK_SET); } - while (!stop) { + while (true) { blocktype = fileReadDword(); + itemsize = _fileHandle->readUint32BE(); if (_fileHandle->ioFailed()) break; - itemsize = _fileHandle->readUint32BE(); numblock++; + readIndexBlock(blocktype, itemsize); + } - switch (blocktype) { - case MKID('DCHR'): - case MKID('DIRF'): - readResTypeList(rtCharset, MKID('CHAR'), "charset"); - break; - - case MKID('DOBJ'): - debug(9, "found DOBJ block, reading object table"); - readGlobalObjects(); - break; - - case MKID('RNAM'): - // Names of rooms. Maybe we should put them into a table, for use by the debugger? - if (_heversion >= 80) { - for (int room; (room = _fileHandle->readUint16LE()); ) { - char buf[20]; - i = 0; - for (byte s; (s = _fileHandle->readByte()); ) { - buf[i++] = s; - } - buf[i] = 0; - debug(5, "Room %d: '%s'", room, buf); - } - } else { - for (int room; (room = _fileHandle->readByte()); ) { - char buf[10]; - _fileHandle->read(buf, 9); - buf[9] = 0; - for (i = 0; i < 9; i++) - buf[i] ^= 0xFF; - debug(5, "Room %d: '%s'", room, buf); - } - } - break; - - case MKID('DLFL'): - i = _fileHandle->readUint16LE(); - _fileHandle->seek(-2, SEEK_CUR); - _heV7RoomOffsets = (byte *)calloc(2 + (i * 4), 1); - _fileHandle->read(_heV7RoomOffsets, (2 + (i * 4)) ); - break; - - case MKID('DIRM'): - readResTypeList(rtImage, MKID('AWIZ'), "images"); - break; - - case MKID('DIRT'): - readResTypeList(rtTalkie, MKID('TLKE'), "talkie"); - break; - - case MKID('SVER'): - _fileHandle->seek(itemsize - 8, SEEK_CUR); - warning("SVER index block not yet handled, skipping"); - break; - - case MKID('DISK'): - i = _fileHandle->readUint16LE(); - _heV7DiskOffsets = (byte *)calloc(i, 1); - _fileHandle->read(_heV7DiskOffsets, i); - break; - - case MKID('INIB'): - _fileHandle->seek(itemsize - 8, SEEK_CUR); - debug(2, "INIB index block not yet handled, skipping"); - break; - - case MKID('DIRI'): - readResTypeList(rtRoomImage, MKID('RMIM'), "room image"); - break; - - case MKID('ANAM'): // Used by: The Dig, FT - debug(9, "found ANAM block, reading audio names"); - _numAudioNames = _fileHandle->readUint16LE(); - _audioNames = (char*)malloc(_numAudioNames * 9); - _fileHandle->read(_audioNames, _numAudioNames * 9); - break; - - case MKID('DIRR'): - case MKID('DROO'): - readResTypeList(rtRoom, MKID('ROOM'), "room"); - break; - - case MKID('DRSC'): - readResTypeList(rtRoomScripts, MKID('RMSC'), "room script"); - break; - - case MKID('DSCR'): - case MKID('DIRS'): - readResTypeList(rtScript, MKID('SCRP'), "script"); - break; - - case MKID('DCOS'): - case MKID('DIRC'): - readResTypeList(rtCostume, MKID('COST'), "costume"); - break; - - case MKID('MAXS'): - readMAXS(itemsize); - allocateArrays(); - break; - - case MKID('DIRN'): - case MKID('DSOU'): - readResTypeList(rtSound, MKID('SOUN'), "sound"); - break; +// if (numblock!=9) +// error("Not enough blocks read from directory"); - case MKID('AARY'): - readArrayFromIndexFile(); - break; + closeRoom(); +} - case MKID('LECF'): - _fileHandle->seek(itemsize - 8, SEEK_CUR); - debug(2, "LECF index block not yet handled, skipping"); - break; +void ScummEngine_v70he::readIndexBlock(uint32 blocktype, uint32 itemsize) { + int i; + switch (blocktype) { + case MKID('DLFL'): + i = _fileHandle->readUint16LE(); + _fileHandle->seek(-2, SEEK_CUR); + _heV7RoomOffsets = (byte *)calloc(2 + (i * 4), 1); + _fileHandle->read(_heV7RoomOffsets, (2 + (i * 4)) ); + break; + + case MKID('DISK'): + i = _fileHandle->readUint16LE(); + _heV7DiskOffsets = (byte *)calloc(i, 1); + _fileHandle->read(_heV7DiskOffsets, i); + break; - default: - error("Bad ID %04X('%s') found in index file directory!", blocktype, - tag2str(blocktype)); - return; - } + default: + ScummEngine::readIndexBlock(blocktype, itemsize); } +} -// if (numblock!=9) -// error("Not enough blocks read from directory"); +void ScummEngine::readIndexBlock(uint32 blocktype, uint32 itemsize) { + int i; + switch (blocktype) { + case MKID('DCHR'): + case MKID('DIRF'): + readResTypeList(rtCharset, MKID('CHAR'), "charset"); + break; + + case MKID('DOBJ'): + debug(9, "found DOBJ block, reading object table"); + readGlobalObjects(); + break; + + case MKID('RNAM'): + // Names of rooms. Maybe we should put them into a table, for use by the debugger? + if (_heversion >= 80) { + for (int room; (room = _fileHandle->readUint16LE()); ) { + char buf[20]; + i = 0; + for (byte s; (s = _fileHandle->readByte()); ) { + buf[i++] = s; + } + buf[i] = 0; + debug(5, "Room %d: '%s'", room, buf); + } + } else { + for (int room; (room = _fileHandle->readByte()); ) { + char buf[10]; + _fileHandle->read(buf, 9); + buf[9] = 0; + for (i = 0; i < 9; i++) + buf[i] ^= 0xFF; + debug(5, "Room %d: '%s'", room, buf); + } + } + break; + + case MKID('DIRM'): + readResTypeList(rtImage, MKID('AWIZ'), "images"); + break; + + case MKID('DIRT'): + readResTypeList(rtTalkie, MKID('TLKE'), "talkie"); + break; + + case MKID('SVER'): + _fileHandle->seek(itemsize - 8, SEEK_CUR); + warning("SVER index block not yet handled, skipping"); + break; + + case MKID('INIB'): + _fileHandle->seek(itemsize - 8, SEEK_CUR); + debug(2, "INIB index block not yet handled, skipping"); + break; + + case MKID('DIRI'): + readResTypeList(rtRoomImage, MKID('RMIM'), "room image"); + break; + + case MKID('ANAM'): // Used by: The Dig, FT + debug(9, "found ANAM block, reading audio names"); + _numAudioNames = _fileHandle->readUint16LE(); + _audioNames = (char*)malloc(_numAudioNames * 9); + _fileHandle->read(_audioNames, _numAudioNames * 9); + break; + + case MKID('DIRR'): + case MKID('DROO'): + readResTypeList(rtRoom, MKID('ROOM'), "room"); + break; + + case MKID('DRSC'): + readResTypeList(rtRoomScripts, MKID('RMSC'), "room script"); + break; + + case MKID('DSCR'): + case MKID('DIRS'): + readResTypeList(rtScript, MKID('SCRP'), "script"); + break; + + case MKID('DCOS'): + case MKID('DIRC'): + readResTypeList(rtCostume, MKID('COST'), "costume"); + break; + + case MKID('MAXS'): + readMAXS(itemsize); + allocateArrays(); + break; + + case MKID('DIRN'): + case MKID('DSOU'): + readResTypeList(rtSound, MKID('SOUN'), "sound"); + break; + + case MKID('AARY'): + readArrayFromIndexFile(); + break; + + case MKID('LECF'): + _fileHandle->seek(itemsize - 8, SEEK_CUR); + debug(2, "LECF index block not yet handled, skipping"); + break; - closeRoom(); + default: + error("Bad ID %04X('%s') found in index file directory!", blocktype, + tag2str(blocktype)); + } } void ScummEngine::readArrayFromIndexFile() { diff --git a/scumm/scumm.cpp b/scumm/scumm.cpp index d99595d392..1a54fa1c82 100644 --- a/scumm/scumm.cpp +++ b/scumm/scumm.cpp @@ -768,7 +768,7 @@ ScummEngine::ScummEngine(GameDetector *detector, OSystem *syst, const ScummGameS _dumpScripts = false; _debugMode = 0; _heV7DiskOffsets = NULL; - _heV7RoomOffsets = NULL; + _heV7RoomIntOffsets = NULL; _objectOwnerTable = NULL; _objectRoomTable = NULL; _objectStateTable = NULL; @@ -1194,10 +1194,6 @@ ScummEngine::~ScummEngine() { free(_palManipIntermediatePal); res.freeResources(); - if (_heversion >= 70) { - free(_heV7RoomIntOffsets); - free(_heV7RoomOffsets); - } free(_objectStateTable); free(_objectRoomTable); @@ -1259,6 +1255,8 @@ ScummEngine_v70he::ScummEngine_v70he(GameDetector *detector, OSystem *syst, cons _win32ResExtractor = new Win32ResExtractor(this); _macResExtractor = new MacResExtractor(this); + _heV7RoomOffsets = NULL; + _heSndSoundId = 0; _heSndOffset = 0; _heSndChannel = 0; @@ -1267,6 +1265,12 @@ ScummEngine_v70he::ScummEngine_v70he(GameDetector *detector, OSystem *syst, cons _heSBNGId = 0; } +ScummEngine_v70he::~ScummEngine_v70he() { + free(_heV7DiskOffsets); + free(_heV7RoomIntOffsets); + free(_heV7RoomOffsets); +} + #pragma mark - #pragma mark --- Initialization --- #pragma mark - diff --git a/scumm/scumm.h b/scumm/scumm.h index 80ee075b0d..35da5caa02 100644 --- a/scumm/scumm.h +++ b/scumm/scumm.h @@ -682,7 +682,6 @@ protected: Common::String _targetName; // This is the game the user calls it, so use for saving byte _resourceMapper[128]; byte *_heV7DiskOffsets; - byte *_heV7RoomOffsets; uint32 *_heV7RoomIntOffsets; const byte *_resourceLastSearchBuf; // FIXME: need to put it to savefile? uint32 _resourceLastSearchSize; // FIXME: need to put it to savefile? @@ -725,6 +724,7 @@ protected: virtual void readMAXS(int blockSize) = 0; virtual void readGlobalObjects(); virtual void readIndexFile(); + virtual void readIndexBlock(uint32 block, uint32 itemsize); virtual void loadCharset(int i); void nukeCharset(int i); |