diff options
-rw-r--r-- | scumm/intern.h | 12 | ||||
-rw-r--r-- | scumm/resource.cpp | 151 | ||||
-rw-r--r-- | scumm/resource_v4.cpp | 137 | ||||
-rw-r--r-- | scumm/resource_v7he.cpp | 7 | ||||
-rw-r--r-- | scumm/scumm.h | 2 |
5 files changed, 159 insertions, 150 deletions
diff --git a/scumm/intern.h b/scumm/intern.h index bb64222bd0..2bf3110fd5 100644 --- a/scumm/intern.h +++ b/scumm/intern.h @@ -412,6 +412,7 @@ protected: virtual void decodeParseString(int a, int b); virtual void readArrayFromIndexFile(); + virtual byte *getStringAddress(int i); virtual void readMAXS(int blockSize); virtual void palManipulateInit(int resID, int start, int end, int time); @@ -754,15 +755,16 @@ public: ScummEngine_v72he(GameDetector *detector, OSystem *syst, const ScummGameSettings &gs, uint8 md5sum[16]) : ScummEngine_v70he(detector, syst, gs, md5sum) {} protected: - virtual void readMAXS(int blockSize); - virtual void setupOpcodes(); virtual void executeOpcode(byte i); virtual const char *getOpcodeDesc(byte i); virtual void setupScummVars(); virtual void readArrayFromIndexFile(); - + + virtual byte *getStringAddress(int i); + virtual void readMAXS(int blockSize); + virtual void redrawBGAreas(); ArrayHeader *defineArray(int array, int type, int dim2start, int dim2end, int dim1start, int dim1end); @@ -924,13 +926,13 @@ public: virtual void scummInit(); protected: - virtual void readMAXS(int blockSize); - virtual void allocateArrays(); virtual void setupOpcodes(); virtual void executeOpcode(byte i); virtual const char *getOpcodeDesc(byte i); + virtual void readMAXS(int blockSize); + void createWizEmptyImage(const WizParameters *params); void fillWizRect(const WizParameters *params); void processWizImage(const WizParameters *params); diff --git a/scumm/resource.cpp b/scumm/resource.cpp index 4a054319e1..5c3be0c0d6 100644 --- a/scumm/resource.cpp +++ b/scumm/resource.cpp @@ -25,6 +25,7 @@ #include "scumm/dialogs.h" #include "scumm/imuse.h" #include "scumm/imuse_digi/dimuse.h" +#include "scumm/intern.h" #include "scumm/object.h" #include "scumm/resource.h" #include "scumm/scumm.h" @@ -706,15 +707,14 @@ byte *ScummEngine::getResourceAddress(int type, int idx) { byte *ScummEngine::getStringAddress(int i) { byte *addr = getResourceAddress(rtString, i); + return addr; +} + +byte *ScummEngine_v6::getStringAddress(int i) { + byte *addr = getResourceAddress(rtString, i); if (addr == NULL) return NULL; - - if (_heversion >= 72) - return (addr + 0x14); // ArrayHeader->data - - if (_version >= 6) - return (addr + 0x6); // ArrayHeader->data - return addr; + return ((ScummEngine_v6::ArrayHeader *)addr)->data; } byte *ScummEngine::getStringAddressVar(int i) { @@ -994,6 +994,107 @@ void ScummEngine::readMAXS(int blockSize) { _dynamicRoomOffsets = true; } +void ScummEngine_v8::readMAXS(int blockSize) { + debug(9, "readMAXS: MAXS has blocksize %d", blockSize); + + _fileHandle->seek(50 + 50, SEEK_CUR); // 176 - 8 + _numVariables = _fileHandle->readUint32LE(); // 1500 + _numBitVariables = _fileHandle->readUint32LE(); // 2048 + _fileHandle->readUint32LE(); // 40 + _numScripts = _fileHandle->readUint32LE(); // 458 + _numSounds = _fileHandle->readUint32LE(); // 789 + _numCharsets = _fileHandle->readUint32LE(); // 1 + _numCostumes = _fileHandle->readUint32LE(); // 446 + _numRooms = _fileHandle->readUint32LE(); // 95 + _fileHandle->readUint32LE(); // 80 + _numGlobalObjects = _fileHandle->readUint32LE(); // 1401 + _fileHandle->readUint32LE(); // 60 + _numLocalObjects = _fileHandle->readUint32LE(); // 200 + _numNewNames = _fileHandle->readUint32LE(); // 100 + _numFlObject = _fileHandle->readUint32LE(); // 128 + _numInventory = _fileHandle->readUint32LE(); // 80 + _numArray = _fileHandle->readUint32LE(); // 200 + _numVerbs = _fileHandle->readUint32LE(); // 50 + + _objectRoomTable = (byte *)calloc(_numGlobalObjects, 1); + _numGlobalScripts = 2000; + + _shadowPaletteSize = NUM_SHADOW_PALETTE * 256; + _shadowPalette = (byte *)calloc(_shadowPaletteSize, 1); + + allocateArrays(); + _dynamicRoomOffsets = true; +} + +void ScummEngine_v7::readMAXS(int blockSize) { + debug(9, "readMAXS: MAXS has blocksize %d", blockSize); + + _fileHandle->seek(50 + 50, SEEK_CUR); + _numVariables = _fileHandle->readUint16LE(); + _numBitVariables = _fileHandle->readUint16LE(); + _fileHandle->readUint16LE(); + _numGlobalObjects = _fileHandle->readUint16LE(); + _numLocalObjects = _fileHandle->readUint16LE(); + _numNewNames = _fileHandle->readUint16LE(); + _numVerbs = _fileHandle->readUint16LE(); + _numFlObject = _fileHandle->readUint16LE(); + _numInventory = _fileHandle->readUint16LE(); + _numArray = _fileHandle->readUint16LE(); + _numRooms = _fileHandle->readUint16LE(); + _numScripts = _fileHandle->readUint16LE(); + _numSounds = _fileHandle->readUint16LE(); + _numCharsets = _fileHandle->readUint16LE(); + _numCostumes = _fileHandle->readUint16LE(); + + _objectRoomTable = (byte *)calloc(_numGlobalObjects, 1); + + if ((_gameId == GID_FT) && (_features & GF_DEMO) && + (_features & GF_PC)) + _numGlobalScripts = 300; + else + _numGlobalScripts = 2000; + + _shadowPaletteSize = NUM_SHADOW_PALETTE * 256; + _shadowPalette = (byte *)calloc(_shadowPaletteSize, 1); + + allocateArrays(); + _dynamicRoomOffsets = true; +} + +void ScummEngine_v6::readMAXS(int blockSize) { + debug(9, "readMAXS: MAXS has blocksize %d", blockSize); + + _numVariables = _fileHandle->readUint16LE(); + _fileHandle->readUint16LE(); + _numBitVariables = _fileHandle->readUint16LE(); + _numLocalObjects = _fileHandle->readUint16LE(); + _numArray = _fileHandle->readUint16LE(); + _fileHandle->readUint16LE(); + _numVerbs = _fileHandle->readUint16LE(); + _numFlObject = _fileHandle->readUint16LE(); + _numInventory = _fileHandle->readUint16LE(); + _numRooms = _fileHandle->readUint16LE(); + _numScripts = _fileHandle->readUint16LE(); + _numSounds = _fileHandle->readUint16LE(); + _numCharsets = _fileHandle->readUint16LE(); + _numCostumes = _fileHandle->readUint16LE(); + _numGlobalObjects = _fileHandle->readUint16LE(); + _numNewNames = 50; + + _objectRoomTable = NULL; + _numGlobalScripts = 200; + + if (_heversion >= 70) { + _objectRoomTable = (byte *)calloc(_numGlobalObjects, 1); + } + + _shadowPaletteSize = 256; + _shadowPalette = (byte *)calloc(_shadowPaletteSize, 1); + + allocateArrays(); + _dynamicRoomOffsets = true; +} + void ScummEngine::readGlobalObjects() { int i; int num = _fileHandle->readUint16LE(); @@ -1014,6 +1115,42 @@ void ScummEngine::readGlobalObjects() { #endif } +void ScummEngine_v8::readGlobalObjects() { + int i; + int num = _fileHandle->readUint32LE(); + assert(num == _numGlobalObjects); + + char buffer[40]; + for (i = 0; i < num; i++) { + _fileHandle->read(buffer, 40); + if (buffer[0]) { + // Add to object name-to-id map + _objectIDMap[buffer] = i; + } + _objectStateTable[i] = _fileHandle->readByte(); + _objectRoomTable[i] = _fileHandle->readByte(); + _classData[i] = _fileHandle->readUint32LE(); + } + memset(_objectOwnerTable, 0xFF, num); +} + +void ScummEngine_v7::readGlobalObjects() { + int num = _fileHandle->readUint16LE(); + assert(num == _numGlobalObjects); + + _fileHandle->read(_objectStateTable, num); + _fileHandle->read(_objectRoomTable, num); + memset(_objectOwnerTable, 0xFF, num); + + _fileHandle->read(_classData, num * sizeof(uint32)); + +#if defined(SCUMM_BIG_ENDIAN) + // Correct the endianess if necessary + for (int i = 0; i != num; i++) + _classData[i] = FROM_LE_32(_classData[i]); +#endif +} + void ScummEngine::allocateArrays() { // Note: Buffers are now allocated in scummMain to allow for // early GUI init. diff --git a/scumm/resource_v4.cpp b/scumm/resource_v4.cpp index 579820e467..f7cc007d2a 100644 --- a/scumm/resource_v4.cpp +++ b/scumm/resource_v4.cpp @@ -184,141 +184,4 @@ void ScummEngine_v4::readGlobalObjects() { } -void ScummEngine_v8::readGlobalObjects() { - int i; - int num = _fileHandle->readUint32LE(); - assert(num == _numGlobalObjects); - - char buffer[40]; - for (i = 0; i < num; i++) { - _fileHandle->read(buffer, 40); - if (buffer[0]) { - // Add to object name-to-id map - _objectIDMap[buffer] = i; - } - _objectStateTable[i] = _fileHandle->readByte(); - _objectRoomTable[i] = _fileHandle->readByte(); - _classData[i] = _fileHandle->readUint32LE(); - } - memset(_objectOwnerTable, 0xFF, num); -} - -void ScummEngine_v7::readGlobalObjects() { - int num = _fileHandle->readUint16LE(); - assert(num == _numGlobalObjects); - - _fileHandle->read(_objectStateTable, num); - _fileHandle->read(_objectRoomTable, num); - memset(_objectOwnerTable, 0xFF, num); - - _fileHandle->read(_classData, num * sizeof(uint32)); - -#if defined(SCUMM_BIG_ENDIAN) - // Correct the endianess if necessary - for (int i = 0; i != num; i++) - _classData[i] = FROM_LE_32(_classData[i]); -#endif -} - -void ScummEngine_v8::readMAXS(int blockSize) { - debug(9, "readMAXS: MAXS has blocksize %d", blockSize); - - _fileHandle->seek(50 + 50, SEEK_CUR); // 176 - 8 - _numVariables = _fileHandle->readUint32LE(); // 1500 - _numBitVariables = _fileHandle->readUint32LE(); // 2048 - _fileHandle->readUint32LE(); // 40 - _numScripts = _fileHandle->readUint32LE(); // 458 - _numSounds = _fileHandle->readUint32LE(); // 789 - _numCharsets = _fileHandle->readUint32LE(); // 1 - _numCostumes = _fileHandle->readUint32LE(); // 446 - _numRooms = _fileHandle->readUint32LE(); // 95 - _fileHandle->readUint32LE(); // 80 - _numGlobalObjects = _fileHandle->readUint32LE(); // 1401 - _fileHandle->readUint32LE(); // 60 - _numLocalObjects = _fileHandle->readUint32LE(); // 200 - _numNewNames = _fileHandle->readUint32LE(); // 100 - _numFlObject = _fileHandle->readUint32LE(); // 128 - _numInventory = _fileHandle->readUint32LE(); // 80 - _numArray = _fileHandle->readUint32LE(); // 200 - _numVerbs = _fileHandle->readUint32LE(); // 50 - - _objectRoomTable = (byte *)calloc(_numGlobalObjects, 1); - _numGlobalScripts = 2000; - - _shadowPaletteSize = NUM_SHADOW_PALETTE * 256; - _shadowPalette = (byte *)calloc(_shadowPaletteSize, 1); - - allocateArrays(); - _dynamicRoomOffsets = true; -} - -void ScummEngine_v7::readMAXS(int blockSize) { - debug(9, "readMAXS: MAXS has blocksize %d", blockSize); - - _fileHandle->seek(50 + 50, SEEK_CUR); - _numVariables = _fileHandle->readUint16LE(); - _numBitVariables = _fileHandle->readUint16LE(); - _fileHandle->readUint16LE(); - _numGlobalObjects = _fileHandle->readUint16LE(); - _numLocalObjects = _fileHandle->readUint16LE(); - _numNewNames = _fileHandle->readUint16LE(); - _numVerbs = _fileHandle->readUint16LE(); - _numFlObject = _fileHandle->readUint16LE(); - _numInventory = _fileHandle->readUint16LE(); - _numArray = _fileHandle->readUint16LE(); - _numRooms = _fileHandle->readUint16LE(); - _numScripts = _fileHandle->readUint16LE(); - _numSounds = _fileHandle->readUint16LE(); - _numCharsets = _fileHandle->readUint16LE(); - _numCostumes = _fileHandle->readUint16LE(); - - _objectRoomTable = (byte *)calloc(_numGlobalObjects, 1); - - if ((_gameId == GID_FT) && (_features & GF_DEMO) && - (_features & GF_PC)) - _numGlobalScripts = 300; - else - _numGlobalScripts = 2000; - - _shadowPaletteSize = NUM_SHADOW_PALETTE * 256; - _shadowPalette = (byte *)calloc(_shadowPaletteSize, 1); - - allocateArrays(); - _dynamicRoomOffsets = true; -} - -void ScummEngine_v6::readMAXS(int blockSize) { - debug(9, "readMAXS: MAXS has blocksize %d", blockSize); - - _numVariables = _fileHandle->readUint16LE(); - _fileHandle->readUint16LE(); - _numBitVariables = _fileHandle->readUint16LE(); - _numLocalObjects = _fileHandle->readUint16LE(); - _numArray = _fileHandle->readUint16LE(); - _fileHandle->readUint16LE(); - _numVerbs = _fileHandle->readUint16LE(); - _numFlObject = _fileHandle->readUint16LE(); - _numInventory = _fileHandle->readUint16LE(); - _numRooms = _fileHandle->readUint16LE(); - _numScripts = _fileHandle->readUint16LE(); - _numSounds = _fileHandle->readUint16LE(); - _numCharsets = _fileHandle->readUint16LE(); - _numCostumes = _fileHandle->readUint16LE(); - _numGlobalObjects = _fileHandle->readUint16LE(); - _numNewNames = 50; - - _objectRoomTable = NULL; - _numGlobalScripts = 200; - - if (_heversion >= 70) { - _objectRoomTable = (byte *)calloc(_numGlobalObjects, 1); - } - - _shadowPaletteSize = 256; - _shadowPalette = (byte *)calloc(_shadowPaletteSize, 1); - - allocateArrays(); - _dynamicRoomOffsets = true; -} - } // End of namespace Scumm diff --git a/scumm/resource_v7he.cpp b/scumm/resource_v7he.cpp index 8580920dba..ced6b0758a 100644 --- a/scumm/resource_v7he.cpp +++ b/scumm/resource_v7he.cpp @@ -1753,4 +1753,11 @@ void ScummEngine_v72he::readMAXS(int blockSize) { _dynamicRoomOffsets = true; } +byte *ScummEngine_v72he::getStringAddress(int i) { + byte *addr = getResourceAddress(rtString, i); + if (addr == NULL) + return NULL; + return ((ScummEngine_v72he::ArrayHeader *)addr)->data; +} + } // End of namespace Scumm diff --git a/scumm/scumm.h b/scumm/scumm.h index c8fb44477b..3bd6fd9412 100644 --- a/scumm/scumm.h +++ b/scumm/scumm.h @@ -709,7 +709,7 @@ protected: public: byte *getResourceAddress(int type, int i); - byte *getStringAddress(int i); + virtual byte *getStringAddress(int i); byte *getStringAddressVar(int i); void ensureResourceLoaded(int type, int i); int getResourceRoomNr(int type, int index); |