Overload getStringAddress in subclasses; moved V6-V8 specific res stuff to resource.cpp
svn-id: r17489
This commit is contained in:
parent
d271b58aa7
commit
81e34e9110
5 changed files with 159 additions and 150 deletions
|
@ -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.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue