Overload getStringAddress in subclasses; moved V6-V8 specific res stuff to resource.cpp

svn-id: r17489
This commit is contained in:
Max Horn 2005-04-09 20:22:31 +00:00
parent d271b58aa7
commit 81e34e9110
5 changed files with 159 additions and 150 deletions

View file

@ -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"
@ -705,16 +706,15 @@ 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.