aboutsummaryrefslogtreecommitdiff
path: root/engines/gob/draw_v2.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/gob/draw_v2.cpp')
-rw-r--r--engines/gob/draw_v2.cpp76
1 files changed, 31 insertions, 45 deletions
diff --git a/engines/gob/draw_v2.cpp b/engines/gob/draw_v2.cpp
index 4bb8120e3a..2843456f42 100644
--- a/engines/gob/draw_v2.cpp
+++ b/engines/gob/draw_v2.cpp
@@ -32,6 +32,8 @@
#include "gob/global.h"
#include "gob/util.h"
#include "gob/game.h"
+#include "gob/script.h"
+#include "gob/resources.h"
#include "gob/scenery.h"
#include "gob/inter.h"
#include "gob/video.h"
@@ -205,12 +207,6 @@ void Draw_v2::printTotText(int16 id) {
id &= 0xFFF;
- if (!_vm->_game->_totTextData || !_vm->_game->_totTextData->dataPtr ||
- (id >= _vm->_game->_totTextData->itemsCount) ||
- (_vm->_game->_totTextData->items[id].offset == -1) ||
- (_vm->_game->_totTextData->items[id].size == 0))
- return;
-
_vm->validateLanguage();
// WORKAROUND: In the scripts of some Gobliins 2 versions, the dialog text IDs
@@ -234,13 +230,18 @@ void Draw_v2::printTotText(int16 id) {
}
- size = _vm->_game->_totTextData->items[id].size;
- dataPtr = _vm->_game->_totTextData->dataPtr +
- _vm->_game->_totTextData->items[id].offset;
- ptr = dataPtr;
+ TextItem *textItem = _vm->_game->_resources->getTextItem(id);
+ if (!textItem)
+ return;
- if ((_renderFlags & RENDERFLAG_SKIPOPTIONALTEXT) && (ptr[1] & 0x80))
+ size = textItem->getSize();
+ dataPtr = textItem->getData();
+ ptr = dataPtr;
+
+ if ((_renderFlags & RENDERFLAG_SKIPOPTIONALTEXT) && (ptr[1] & 0x80)) {
+ delete textItem;
return;
+ }
if (_renderFlags & RENDERFLAG_DOUBLECOORDS) {
destX = (READ_LE_UINT16(ptr) & 0x7FFF) * 2;
@@ -328,7 +329,7 @@ void Draw_v2::printTotText(int16 id) {
ptrEnd = ptr;
while (((ptrEnd - dataPtr) < size) && (*ptrEnd != 1)) {
// Converting to unknown commands/characters to spaces
- if ((_vm->_game->_totFileData[0x29] < 0x32) && (*ptrEnd > 3) && (*ptrEnd < 32))
+ if ((_vm->_game->_script->getVersionMinor() < 2) && (*ptrEnd > 3) && (*ptrEnd < 32))
*ptrEnd = 32;
switch (*ptrEnd) {
@@ -524,7 +525,7 @@ void Draw_v2::printTotText(int16 id) {
case 10:
str[0] = (char) 255;
WRITE_LE_UINT16((uint16 *) (str + 1),
- ptr - _vm->_game->_totTextData->dataPtr);
+ ptr - _vm->_game->_resources->getTexts());
str[3] = 0;
ptr++;
for (int i = *ptr++; i > 0; i--) {
@@ -597,7 +598,9 @@ void Draw_v2::printTotText(int16 id) {
}
}
+ delete textItem;
_renderFlags = savedFlags;
+
if (!(_renderFlags & RENDERFLAG_COLLISIONS))
return;
@@ -610,14 +613,13 @@ void Draw_v2::printTotText(int16 id) {
}
void Draw_v2::spriteOperation(int16 operation) {
- uint16 id;
- byte *dataBuf;
int16 len;
int16 x, y;
SurfaceDescPtr sourceSurf, destSurf;
bool deltaVeto;
int16 left;
int16 ratio;
+ Resource *resource;
// Always assigned to -1 in Game::loadTotFile()
int16 someHandle = -1;
@@ -705,6 +707,11 @@ void Draw_v2::spriteOperation(int16 operation) {
sourceSurf = _spritesArray[_sourceSurface];
destSurf = _spritesArray[_destSurface];
+ if (!destSurf) {
+ warning("Can't do operation %d on surface %d: nonexistent", operation, _destSurface);
+ return;
+ }
+
switch (operation) {
case DRAW_BLITSURF:
case DRAW_DRAWLETTER:
@@ -755,41 +762,20 @@ void Draw_v2::spriteOperation(int16 operation) {
break;
case DRAW_LOADSPRITE:
- id = _spriteLeft;
-
- if ((id >= 30000) || (_vm->_game->_lomHandle >= 0)) {
- dataBuf = 0;
+ resource = _vm->_game->_resources->getResource((uint16) _spriteLeft,
+ &_spriteRight, &_spriteBottom);
- if (_vm->_game->_lomHandle >= 0)
- warning("Urban Stub: LOADSPRITE %d, LOM", id);
- else
- dataBuf = _vm->_game->loadExtData(id, &_spriteRight, &_spriteBottom);
-
- if (!dataBuf)
- break;
-
- _vm->_video->drawPackedSprite(dataBuf,
- _spriteRight, _spriteBottom, _destSpriteX, _destSpriteY,
- _transparency, *_spritesArray[_destSurface]);
-
- dirtiedRect(_destSurface, _destSpriteX, _destSpriteY,
- _destSpriteX + _spriteRight - 1, _destSpriteY + _spriteBottom - 1);
-
- delete[] dataBuf;
+ if (!resource)
break;
- }
- // Load from .TOT resources
- if (!(dataBuf = _vm->_game->loadTotResource(id, 0, &_spriteRight, &_spriteBottom)))
- break;
-
- _vm->_video->drawPackedSprite(dataBuf,
- _spriteRight, _spriteBottom,
- _destSpriteX, _destSpriteY,
- _transparency, *_spritesArray[_destSurface]);
+ _vm->_video->drawPackedSprite(resource->getData(),
+ _spriteRight, _spriteBottom, _destSpriteX, _destSpriteY,
+ _transparency, *_spritesArray[_destSurface]);
dirtiedRect(_destSurface, _destSpriteX, _destSpriteY,
_destSpriteX + _spriteRight - 1, _destSpriteY + _spriteBottom - 1);
+
+ delete resource;
break;
case DRAW_PRINTTEXT:
@@ -802,7 +788,7 @@ void Draw_v2::spriteOperation(int16 operation) {
if (((int8) _textToPrint[0]) == -1) {
_vm->validateLanguage();
- dataBuf = _vm->_game->_totTextData->dataPtr + _textToPrint[1] + 1;
+ byte *dataBuf = _vm->_game->_resources->getTexts() + _textToPrint[1] + 1;
len = *dataBuf++;
for (int i = 0; i < len; i++, dataBuf += 2) {
_vm->_video->drawLetter(READ_LE_UINT16(dataBuf), _destSpriteX,