Fixing Scenery::_statics, Game::_totTextData and Game::_totResourceTable

svn-id: r23078
This commit is contained in:
Sven Hesse 2006-06-13 08:10:54 +00:00
parent 486f181314
commit 243e6b2d27
10 changed files with 108 additions and 102 deletions

View file

@ -60,7 +60,7 @@ void Draw_v1::printText(void) {
_vm->_cdrom->playMultMusic();
dataPtr = (char *)_vm->_game->_totTextData + _vm->_game->_totTextData->items[index].offset;
dataPtr = _vm->_game->_totTextData->dataPtr + _vm->_game->_totTextData->items[index].offset;
ptr = dataPtr;
if (_renderFlags & RENDERFLAG_CAPTUREPUSH) {
@ -334,7 +334,7 @@ void Draw_v1::spriteOperation(int16 operation) {
offset = itemPtr->offset;
if (offset >= 0) {
dataBuf =
((char *)_vm->_game->_totResourceTable) +
_vm->_game->_totResourceTable->dataPtr +
szGame_TotResTable + szGame_TotResItem *
_vm->_game->_totResourceTable->itemsCount + offset;
} else {

View file

@ -124,10 +124,10 @@ void Draw_v2::printText(void) {
_vm->_cdrom->playMultMusic();
if (_vm->_game->_totTextData == 0)
if ((_vm->_game->_totTextData == 0) || (_vm->_game->_totTextData->dataPtr == 0))
return;
dataPtr = (char *)_vm->_game->_totTextData + _vm->_game->_totTextData->items[index].offset;
dataPtr = _vm->_game->_totTextData->dataPtr + _vm->_game->_totTextData->items[index].offset;
ptr = dataPtr;
if ((_renderFlags & 0x400) && (ptr[1] & 0x80))
@ -380,7 +380,7 @@ void Draw_v2::printText(void) {
case 10:
// loc_12C93
str[0] = (char)255;
WRITE_LE_UINT16((uint16*)(str+1), ptr - (char *)_vm->_game->_totTextData);
WRITE_LE_UINT16((uint16*)(str+1), ptr - _vm->_game->_totTextData->dataPtr);
str[3] = 0;
ptr++;
i = *ptr++;
@ -685,7 +685,7 @@ void Draw_v2::spriteOperation(int16 operation) {
offset = itemPtr->offset;
if (offset >= 0) {
dataBuf =
((char *)_vm->_game->_totResourceTable) +
_vm->_game->_totResourceTable->dataPtr +
szGame_TotResTable + szGame_TotResItem *
_vm->_game->_totResourceTable->itemsCount + offset;
} else {
@ -714,7 +714,7 @@ void Draw_v2::spriteOperation(int16 operation) {
if ((_fontIndex >= 4) || (_fontToSprite[_fontIndex].sprite == -1)) {
if (_fonts[_fontIndex]->extraData == 0) {
if (((signed) _textToPrint[0]) == -1) {
dataBuf = (char*)_vm->_game->_totTextData + _textToPrint[1] + 1;
dataBuf = _vm->_game->_totTextData->dataPtr + _textToPrint[1] + 1;
len = *dataBuf++;
for (i = 0; i < len; i++) {
_vm->_video->drawLetter(READ_LE_UINT16(dataBuf), _destSpriteX,

View file

@ -372,7 +372,7 @@ char *Game::loadTotResource(int16 id) {
itemPtr = &_totResourceTable->items[id];
offset = itemPtr->offset;
if (offset >= 0) {
return ((char *)_totResourceTable) + szGame_TotResTable +
return _totResourceTable->dataPtr + szGame_TotResTable +
szGame_TotResItem * _totResourceTable->itemsCount + offset;
} else {
return (char *)(_imFileData + (int32)READ_LE_UINT32(&((int32 *)_imFileData)[-offset - 1]));

View file

@ -58,7 +58,8 @@ public:
struct TotResTable {
int16 itemsCount;
byte unknown;
TotResItem items[1];
TotResItem *items;
char *dataPtr;
} GCC_PACK;
#define szGame_ExtItem (4 + 2 + 2 + 2)
@ -85,7 +86,8 @@ public:
#define szGame_TotTextTable (2)
struct TotTextTable {
int16 itemsCount;
TotTextItem items[1];
TotTextItem *items;
char *dataPtr;
} GCC_PACK;
struct InputDesc {

View file

@ -23,6 +23,7 @@
#include "common/stdafx.h"
#include "common/endian.h"
#include "common/stream.h"
#include "gob/gob.h"
#include "gob/global.h"
@ -53,9 +54,6 @@ void Game_v1::playTot(int16 skipPlay) {
int16 _captureCounter;
int16 breakFrom;
int16 nestLevel;
char needTextFree;
char needFreeResTable;
char *curPtr;
int32 variablesCount;
char *filePtr;
char *savedIP;
@ -105,9 +103,6 @@ void Game_v1::playTot(int16 skipPlay) {
_extTable = 0;
_extHandle = -1;
needFreeResTable = 1;
needTextFree = 1;
_totToLoad[0] = 0;
if (_curTotFile[0] == 0 && _totFileData == 0)
@ -133,40 +128,38 @@ void Game_v1::playTot(int16 skipPlay) {
filePtr = (char *)_totFileData + 0x30;
_totTextData = 0;
if (READ_LE_UINT32(filePtr) != (uint32)-1) {
curPtr = _totFileData;
_totTextData =
(TotTextTable *) (curPtr +
READ_LE_UINT32((char *)_totFileData + 0x30));
_totTextData = new TotTextTable;
_totTextData->dataPtr = (_totFileData + READ_LE_UINT32((char *)_totFileData + 0x30));
Common::MemoryReadStream totTextData((byte *) _totTextData->dataPtr, 4294967295U);
_totTextData->itemsCount = (int16)READ_LE_UINT16(&_totTextData->itemsCount);
_totTextData->itemsCount = totTextData.readSint16LE();
_totTextData->items = new TotTextItem[_totTextData->itemsCount];
for (i = 0; i < _totTextData->itemsCount; ++i) {
_totTextData->items[i].offset = (int16)READ_LE_UINT16(&_totTextData->items[i].offset);
_totTextData->items[i].size = (int16)READ_LE_UINT16(&_totTextData->items[i].size);
_totTextData->items[i].offset = totTextData.readSint16LE();
_totTextData->items[i].size = totTextData.readSint16LE();
}
needTextFree = 0;
}
filePtr = (char *)_totFileData + 0x34;
_totResourceTable = 0;
if (READ_LE_UINT32(filePtr) != (uint32)-1) {
curPtr = _totFileData;
_totResourceTable = new TotResTable;
_totResourceTable->dataPtr = _totFileData + READ_LE_UINT32((char *)_totFileData + 0x34);
Common::MemoryReadStream totResTable((byte *) _totResourceTable->dataPtr, 4294967295U);
_totResourceTable =
(TotResTable *)(curPtr +
READ_LE_UINT32((char *)_totFileData + 0x34));
_totResourceTable->itemsCount = (int16)READ_LE_UINT16(&_totResourceTable->itemsCount);
_totResourceTable->itemsCount = totResTable.readSint16LE();
_totResourceTable->unknown = totResTable.readByte();
_totResourceTable->items = new TotResItem[_totResourceTable->itemsCount];
for (i = 0; i < _totResourceTable->itemsCount; ++i) {
_totResourceTable->items[i].offset = (int32)READ_LE_UINT32(&_totResourceTable->items[i].offset);
_totResourceTable->items[i].size = (int16)READ_LE_UINT16(&_totResourceTable->items[i].size);
_totResourceTable->items[i].width = (int16)READ_LE_UINT16(&_totResourceTable->items[i].width);
_totResourceTable->items[i].height = (int16)READ_LE_UINT16(&_totResourceTable->items[i].height);
_totResourceTable->items[i].offset = totResTable.readSint32LE();
_totResourceTable->items[i].size = totResTable.readSint16LE();
_totResourceTable->items[i].width = totResTable.readSint16LE();
_totResourceTable->items[i].height = totResTable.readSint16LE();
}
needFreeResTable = 0;
}
loadImFile();
@ -200,12 +193,16 @@ void Game_v1::playTot(int16 skipPlay) {
delete[] _totFileData;
_totFileData = 0;
if (needTextFree)
delete[] _totTextData;
if (_totTextData) {
delete[] _totTextData->items;
delete _totTextData;
}
_totTextData = 0;
if (needFreeResTable)
delete[] _totResourceTable;
if (_totResourceTable) {
delete[] _totResourceTable->items;
delete _totResourceTable;
}
_totResourceTable = 0;
delete[] _imFileData;

View file

@ -53,9 +53,6 @@ void Game_v2::playTot(int16 skipPlay) {
int16 _captureCounter;
int16 breakFrom;
int16 nestLevel;
char needTextFree;
char needFreeResTable;
char *curPtr;
int32 variablesCount;
char *filePtr;
char *savedIP;
@ -105,9 +102,6 @@ void Game_v2::playTot(int16 skipPlay) {
_extTable = 0;
_extHandle = -1;
needFreeResTable = 1;
needTextFree = 1;
_totToLoad[0] = 0;
if (_curTotFile[0] == 0 && _totFileData == 0)
@ -133,45 +127,44 @@ void Game_v2::playTot(int16 skipPlay) {
filePtr = (char *)_totFileData + 0x30;
_totTextData = 0;
if (READ_LE_UINT32(filePtr) != (uint32)-1) {
curPtr = _totFileData;
_totTextData = new TotTextTable;
if (READ_LE_UINT32(filePtr) == 0)
_totTextData = (TotTextTable *) loadLocTexts();
_totTextData->dataPtr = loadLocTexts();
else
_totTextData =
(TotTextTable *) (curPtr +
READ_LE_UINT32((char *)_totFileData + 0x30));
_totTextData->dataPtr = (_totFileData + READ_LE_UINT32((char *)_totFileData + 0x30));
if (_totTextData != 0) {
_totTextData->itemsCount = (int16)READ_LE_UINT16(&_totTextData->itemsCount);
_totTextData->items = 0;
if (_totTextData->dataPtr != 0) {
Common::MemoryReadStream totTextData((byte *) _totTextData->dataPtr, 4294967295U);
_totTextData->itemsCount = totTextData.readSint16LE();
_totTextData->items = new TotTextItem[_totTextData->itemsCount];
for (i = 0; i < _totTextData->itemsCount; ++i) {
_totTextData->items[i].offset = (int16)READ_LE_UINT16(&_totTextData->items[i].offset);
_totTextData->items[i].size = (int16)READ_LE_UINT16(&_totTextData->items[i].size);
_totTextData->items[i].offset = totTextData.readSint16LE();
_totTextData->items[i].size = totTextData.readSint16LE();
}
}
needTextFree = 0;
}
filePtr = (char *)_totFileData + 0x34;
_totResourceTable = 0;
if (READ_LE_UINT32(filePtr) != (uint32)-1) {
curPtr = _totFileData;
_totResourceTable = new TotResTable;
_totResourceTable->dataPtr = _totFileData + READ_LE_UINT32((char *)_totFileData + 0x34);
Common::MemoryReadStream totResTable((byte *) _totResourceTable->dataPtr, 4294967295U);
_totResourceTable =
(TotResTable *)(curPtr +
READ_LE_UINT32((char *)_totFileData + 0x34));
_totResourceTable->itemsCount = (int16)READ_LE_UINT16(&_totResourceTable->itemsCount);
_totResourceTable->itemsCount = totResTable.readSint16LE();
_totResourceTable->unknown = totResTable.readByte();
_totResourceTable->items = new TotResItem[_totResourceTable->itemsCount];
for (i = 0; i < _totResourceTable->itemsCount; ++i) {
_totResourceTable->items[i].offset = (int32)READ_LE_UINT32(&_totResourceTable->items[i].offset);
_totResourceTable->items[i].size = (int16)READ_LE_UINT16(&_totResourceTable->items[i].size);
_totResourceTable->items[i].width = (int16)READ_LE_UINT16(&_totResourceTable->items[i].width);
_totResourceTable->items[i].height = (int16)READ_LE_UINT16(&_totResourceTable->items[i].height);
_totResourceTable->items[i].offset = totResTable.readSint32LE();
_totResourceTable->items[i].size = totResTable.readSint16LE();
_totResourceTable->items[i].width = totResTable.readSint16LE();
_totResourceTable->items[i].height = totResTable.readSint16LE();
}
needFreeResTable = 0;
}
loadImFile();
@ -204,12 +197,17 @@ void Game_v2::playTot(int16 skipPlay) {
delete[] _totFileData;
_totFileData = 0;
if (needTextFree)
delete[] _totTextData;
if (_totTextData) {
if (_totTextData->items)
delete[] _totTextData->items;
delete _totTextData;
}
_totTextData = 0;
if (needFreeResTable)
delete[] _totResourceTable;
if (_totResourceTable) {
delete[] _totResourceTable->items;
delete _totResourceTable;
}
_totResourceTable = 0;
delete[] _imFileData;

View file

@ -217,8 +217,15 @@ memBlocks = word ptr -2*/
delete[] _vm->_global->_inter_variables;
delete[] _vm->_game->_totFileData;
delete[] _vm->_game->_totTextData;
delete[] _vm->_game->_totResourceTable;
if (_vm->_game->_totTextData) {
if (_vm->_game->_totTextData->items)
delete[] _vm->_game->_totTextData->items;
delete _vm->_game->_totTextData;
}
if (_vm->_game->_totResourceTable) {
delete[] _vm->_game->_totResourceTable->items;
delete _vm->_game->_totResourceTable;
}
}
for (i = 0; i < 4; i++) {

View file

@ -1263,7 +1263,7 @@ bool Inter_v1::o1_loadCursor(char &cmdCount, int16 &counter, int16 &retFlag) {
if (offset >= 0) {
dataBuf =
((char *)_vm->_game->_totResourceTable) + szGame_TotResTable +
_vm->_game->_totResourceTable->dataPtr + szGame_TotResTable +
szGame_TotResItem * _vm->_game->_totResourceTable->itemsCount + offset;
} else {
dataBuf = _vm->_game->_imFileData + (int32)READ_LE_UINT32(&((int32 *)_vm->_game->_imFileData)[-offset - 1]);

View file

@ -51,7 +51,6 @@ Scenery::Scenery(GobEngine *vm) : _vm(vm) {
}
for (i = 0; i < 10; i++) {
_staticPictCount[i] = 0;
_staticFromExt[i] = 0;
_staticResId[i] = 0;
_animPictCount[i] = 0;
_animResId[i] = 0;
@ -78,6 +77,7 @@ int16 Scenery::loadStatic(char search) {
int16 resId;
int16 i;
int16 sceneryIndex;
char *extData;
char *dataPtr;
Static *ptr;
int16 offset;
@ -87,6 +87,7 @@ int16 Scenery::loadStatic(char search) {
int16 sprResId;
int16 sprIndex;
extData = 0;
_vm->_inter->evalExpr(&sceneryIndex);
tmp = _vm->_inter->load16();
backsPtr = (int16 *)_vm->_global->_inter_execPtr;
@ -109,35 +110,37 @@ int16 Scenery::loadStatic(char search) {
_staticResId[sceneryIndex] = resId;
if (resId >= 30000) {
_staticFromExt[sceneryIndex] = 1;
dataPtr = _vm->_game->loadExtData(resId, 0, 0);
} else {
_staticFromExt[sceneryIndex] = 0;
extData = _vm->_game->loadExtData(resId, 0, 0);
dataPtr = extData;
} else
dataPtr = _vm->_game->loadTotResource(resId);
}
ptr = &_statics[sceneryIndex];
ptr->dataPtr = dataPtr;
ptr->layersCount = (int16)READ_LE_UINT16(dataPtr);
dataPtr += 2;
ptr->layers = new StaticLayer*[ptr->layersCount];
ptr->layers = new StaticLayer[ptr->layersCount];
ptr->pieces = new PieceDesc*[picsCount];
ptr->piecesFromExt = new int8[picsCount];
for (i = 0; i < ptr->layersCount; i++) {
offset = (int16)READ_LE_UINT16(&((int16 *)dataPtr)[i]);
ptr->layers[i] = (StaticLayer *)(dataPtr + offset - 2);
Common::MemoryReadStream layerData((byte *) (dataPtr + offset), 4294967295U);
ptr->layers[i]->planeCount = (int16)READ_LE_UINT16(&ptr->layers[i]->planeCount);
ptr->layers[i].planeCount = layerData.readSint16LE();
for (int j = 0; j < ptr->layers[i]->planeCount; ++j) {
ptr->layers[i]->planes[j].destX = (int16)READ_LE_UINT16(&ptr->layers[i]->planes[j].destX);
ptr->layers[i]->planes[j].destY = (int16)READ_LE_UINT16(&ptr->layers[i]->planes[j].destY);
ptr->layers[i].planes = new StaticPlane[ptr->layers[i].planeCount];
for (int j = 0; j < ptr->layers[i].planeCount; ++j) {
ptr->layers[i].planes[j].pictIndex = layerData.readByte();
ptr->layers[i].planes[j].pieceIndex = layerData.readByte();
ptr->layers[i].planes[j].drawOrder = layerData.readByte();
ptr->layers[i].planes[j].destX = layerData.readSint16LE();
ptr->layers[i].planes[j].destY = layerData.readSint16LE();
ptr->layers[i].planes[j].transp = layerData.readByte();
}
ptr->layers[i]->backResId = (int16)READ_LE_UINT16(backsPtr);
ptr->layers[i].backResId = (int16)READ_LE_UINT16(backsPtr);
backsPtr++;
}
@ -187,6 +190,8 @@ int16 Scenery::loadStatic(char search) {
_vm->_draw->spriteOperation(DRAW_LOADSPRITE);
}
}
if (extData != 0)
delete[] extData;
return sceneryIndex + 100;
}
@ -213,13 +218,12 @@ void Scenery::freeStatic(int16 index) {
}
}
for (i = 0; i < _statics[index].layersCount; i++)
delete[] _statics[index].layers[i].planes;
delete[] _statics[index].layers;
delete[] _statics[index].pieces;
delete[] _statics[index].piecesFromExt;
if (_staticFromExt[index] == 1)
delete[] _statics[index].dataPtr;
_staticFromExt[index] = 0;
_staticPictCount[index] = -1;
}
@ -243,7 +247,7 @@ void Scenery::renderStatic(int16 scenery, int16 layer) {
if (layer >= ptr->layersCount)
return;
layerPtr = ptr->layers[layer];
layerPtr = &ptr->layers[layer];
_vm->_draw->_spriteLeft = layerPtr->backResId;
if (_vm->_draw->_spriteLeft != -1) {
@ -305,7 +309,7 @@ void Scenery::updateStatic(int16 orderFrom) {
if (_curStaticLayer >= _statics[_curStatic].layersCount)
return;
layerPtr = _statics[_curStatic].layers[_curStaticLayer];
layerPtr = &_statics[_curStatic].layers[_curStaticLayer];
pictPtr = _statics[_curStatic].pieces;
planeCount = layerPtr->planeCount;
@ -433,7 +437,7 @@ int16 Scenery::loadAnim(char search) {
for (i = 0; i < ptr->layersCount; i++) {
offset = (int16)READ_LE_UINT16(&((int16 *)dataPtr)[i]);
Common::MemoryReadStream layerData((byte *) (dataPtr + offset - 2), 65535);
Common::MemoryReadStream layerData((byte *) (dataPtr + offset - 2), 4294967295U);
ptr->layers[i].unknown0 = layerData.readSint16LE();
ptr->layers[i].posX = layerData.readSint16LE();

View file

@ -47,7 +47,7 @@ public:
struct StaticLayer {
int16 backResId;
int16 planeCount;
StaticPlane planes[1];
StaticPlane *planes;
} GCC_PACK;
// Animations
@ -74,12 +74,11 @@ public:
struct Static {
int16 layersCount;
StaticLayer **layers;
StaticLayer *layers;
PieceDesc **pieces;
int8 *piecesFromExt;
char *dataPtr;
Static() : layersCount(0), layers(0), pieces(0),
piecesFromExt(0), dataPtr(0) {}
piecesFromExt(0) {}
};
struct Animation {
@ -99,7 +98,6 @@ public:
char _staticPictToSprite[70];
int16 _staticPictCount[10];
Static _statics[10];
char _staticFromExt[10];
int16 _staticResId[10];
char _animPictToSprite[70];