aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSven Hesse2006-11-20 13:03:30 +0000
committerSven Hesse2006-11-20 13:03:30 +0000
commitc22920484a23210c47a6786d86b0eeca7f5859f2 (patch)
treeda7b93920e38ed4ee07c1a1af939a948c9084317
parentd64d6bcb7e56404dc585c62edcf39861f102f05b (diff)
downloadscummvm-rg350-c22920484a23210c47a6786d86b0eeca7f5859f2.tar.gz
scummvm-rg350-c22920484a23210c47a6786d86b0eeca7f5859f2.tar.bz2
scummvm-rg350-c22920484a23210c47a6786d86b0eeca7f5859f2.zip
Changed the way sprites-freeing is handled, now the menu sprites and window decorations are drawn
svn-id: r24752
-rw-r--r--engines/gob/draw.cpp15
-rw-r--r--engines/gob/draw.h12
-rw-r--r--engines/gob/draw_v1.cpp7
-rw-r--r--engines/gob/draw_v2.cpp67
-rw-r--r--engines/gob/game.cpp73
-rw-r--r--engines/gob/game.h7
-rw-r--r--engines/gob/game_v1.cpp3
-rw-r--r--engines/gob/game_v2.cpp94
-rw-r--r--engines/gob/gob.cpp4
-rw-r--r--engines/gob/inter.cpp3
-rw-r--r--engines/gob/inter.h5
-rw-r--r--engines/gob/inter_v1.cpp10
-rw-r--r--engines/gob/inter_v2.cpp86
-rw-r--r--engines/gob/mult_v1.cpp12
-rw-r--r--engines/gob/mult_v2.cpp9
15 files changed, 250 insertions, 157 deletions
diff --git a/engines/gob/draw.cpp b/engines/gob/draw.cpp
index bc2547dd81..b48ec98e3c 100644
--- a/engines/gob/draw.cpp
+++ b/engines/gob/draw.cpp
@@ -135,8 +135,13 @@ Draw::Draw(GobEngine *vm) : _vm(vm) {
_cursorTimeKey = 0;
- warning("GOB2 Stub! _word_2E8E2");
+ warning("GOB2 Stub! _word_2E8E2, _word_2FC9C, _word_2FC9E, _word_2E51F, _off_2E51B, _off_2E517");
_word_2E8E2 = 2;
+ _word_2FC9C = 0;
+ _word_2FC9E = 0;
+ _word_2E51F = 0;
+ _off_2E51B = 0;
+ _off_2E517 = 0;
}
void Draw::invalidateRect(int16 left, int16 top, int16 right, int16 bottom) {
@@ -552,4 +557,12 @@ int32 Draw::getSpriteRectSize(int16 index) {
0, _vm->_global->_videoMode);
}
+void Draw::initSpriteSurf(int16 index, int16 vidMode, int16 width, int16 height, int16 flags) {
+ if (index != 22)
+ _vm->_video->freeSurfDesc(_spritesArray[index]);
+
+ _spritesArray[index] =
+ _vm->_video->initSurfDesc(vidMode, width, height, flags);
+}
+
} // End of namespace Gob
diff --git a/engines/gob/draw.h b/engines/gob/draw.h
index 24585cd106..e67e2981fd 100644
--- a/engines/gob/draw.h
+++ b/engines/gob/draw.h
@@ -115,6 +115,11 @@ public:
int16 _palLoadData2[4];
int16 _word_2E8E2;
+ int16 _word_2FC9C;
+ int16 _word_2FC9E;
+ int16 _word_2E51F;
+ Video::SurfaceDesc *_off_2E51B;
+ Video::SurfaceDesc *_off_2E517;
void invalidateRect(int16 left, int16 top, int16 right, int16 bottom);
void blitInvalidated(void);
@@ -136,12 +141,15 @@ public:
void printTextCentered(int16 arg_0, int16 left, int16 top, int16 right,
int16 bottom, char *str, int16 fontIndex, int16 color);
int32 getSpriteRectSize(int16 index);
+ void initSpriteSurf(int16 index, int16 vidMode, int16 width, int16 height, int16 flags);
virtual void initBigSprite(int16 index, int16 width, int16 height, int16 flags) = 0;
virtual void printText(void) = 0;
virtual void spriteOperation(int16 operation) = 0;
virtual void blitCursor(void) = 0;
virtual void animateCursor(int16 cursor) = 0;
+ virtual void initScreen(void) = 0;
+ virtual void closeScreen(void) = 0;
Draw(GobEngine *vm);
virtual ~Draw() {};
@@ -157,6 +165,8 @@ public:
virtual void spriteOperation(int16 operation);
virtual void blitCursor(void);
virtual void animateCursor(int16 cursor);
+ virtual void initScreen(void);
+ virtual void closeScreen(void);
Draw_v1(GobEngine *vm);
virtual ~Draw_v1() {};
@@ -169,6 +179,8 @@ public:
virtual void spriteOperation(int16 operation);
virtual void blitCursor(void);
virtual void animateCursor(int16 cursor);
+ virtual void initScreen(void);
+ virtual void closeScreen(void);
Draw_v2(GobEngine *vm);
virtual ~Draw_v2() {};
diff --git a/engines/gob/draw_v1.cpp b/engines/gob/draw_v1.cpp
index e06cd95467..5b799dff3f 100644
--- a/engines/gob/draw_v1.cpp
+++ b/engines/gob/draw_v1.cpp
@@ -608,4 +608,11 @@ void Draw_v1::animateCursor(int16 cursor) {
_cursorY = newY;
}
+void Draw_v1::initScreen(void) {
+ _backSurface = _vm->_video->initSurfDesc(_vm->_global->_videoMode, 320, 200, 0);
+}
+
+void Draw_v1::closeScreen(void) {
+}
+
} // End of namespace Gob
diff --git a/engines/gob/draw_v2.cpp b/engines/gob/draw_v2.cpp
index aa25237e09..6858e372d2 100644
--- a/engines/gob/draw_v2.cpp
+++ b/engines/gob/draw_v2.cpp
@@ -62,8 +62,7 @@ void Draw_v2::initBigSprite(int16 index, int16 width, int16 height, int16 flags)
}
partsheight = _spritesHeights[index];
- _spritesArray[index] =
- _vm->_video->initSurfDesc(_vm->_global->_videoMode, width, partsheight, flags);
+ initSpriteSurf(index, _vm->_global->_videoMode, width, partsheight, flags);
fragment = 0;
while (partsheight < height) {
remainheight = height - partsheight;
@@ -82,8 +81,7 @@ void Draw_v2::initBigSprite(int16 index, int16 width, int16 height, int16 flags)
fragment++;
}
} else
- _spritesArray[index] =
- _vm->_video->initSurfDesc(_vm->_global->_videoMode, width, height, flags);
+ initSpriteSurf(index, _vm->_global->_videoMode, width, height, flags);
_vm->_video->clearSurf(_spritesArray[index]);
// '------
@@ -533,7 +531,7 @@ void Draw_v2::spriteOperation(int16 operation) {
sourceSurface = _sourceSurface;
// warning("GOB2 Stub! _off_2E51B");
- if (_vm->_game->_off_2E51B != 0) {
+ if (_off_2E51B != 0) {
if ((_frontSurface->height <= _destSpriteY) &&
((_destSurface == 20) || (_destSurface == 21))) {
_destSpriteY -= _frontSurface->height;
@@ -544,7 +542,7 @@ void Draw_v2::spriteOperation(int16 operation) {
}
if (_destSurface == 21)
invalidateRect(0, _frontSurface->height, 319,
- _frontSurface->height + _vm->_game->_off_2E51B->height - 1);
+ _frontSurface->height + _off_2E51B->height - 1);
destSurface += 4;
}
if ((_frontSurface->height <= _spriteTop) && (operation == DRAW_BLITSURF)
@@ -1017,4 +1015,61 @@ void Draw_v2::animateCursor(int16 cursor) {
_cursorY = newY;
}
+void Draw_v2::initScreen(void) {
+ _word_2FC9C = 0;
+ _word_2FC9E = 0;
+
+ if (_word_2E51F != 0) {
+ _off_2E51B = new Video::SurfaceDesc;
+ memcpy(_off_2E51B, _frontSurface, sizeof(Video::SurfaceDesc));
+ _off_2E51B->height = _vm->_global->_primaryHeight - _word_2E51F;
+ _frontSurface->height -= _off_2E51B->height;
+ _frontSurface->vidPtr =
+ _off_2E51B->vidPtr + ((_off_2E51B->width * _off_2E51B->height) / 4);
+
+ _off_2E517 = new Video::SurfaceDesc;
+ memcpy(_off_2E517, _off_2E51B, sizeof(Video::SurfaceDesc));
+ _off_2E517->width = _vm->_global->_primaryWidth;
+ _off_2E517->vidPtr = _frontSurface->vidPtr +
+ ((_frontSurface->width * _frontSurface->height ) / 4);
+ }
+ initBigSprite(21, 320, 200, 0);
+ _backSurface = _spritesArray[21];
+ _vm->_video->clearSurf(_backSurface);
+
+ initBigSprite(23, 32, 16, 2);
+ _cursorSpritesBack = _spritesArray[23];
+ _cursorSprites = _cursorSpritesBack;
+ _scummvmCursor =
+ _vm->_video->initSurfDesc(_vm->_global->_videoMode, 16, 16, SCUMMVM_CURSOR);
+
+ _spritesArray[20] = _frontSurface;
+ _spritesArray[21] = _backSurface;
+
+/* if (_word_2E51F != 0) {
+ dword_2F92D = _off_2E51B;
+ dword_2F931 = _off_2E517;
+ }*/
+}
+
+void Draw_v2::closeScreen(void) {
+ freeSprite(23);
+ _cursorSprites = 0;
+ _cursorSpritesBack = 0;
+ _vm->_video->freeSurfDesc(_scummvmCursor);
+ _scummvmCursor = 0;
+ if (_off_2E51B != 0) {
+ memcpy(_frontSurface, _off_2E51B, sizeof(Video::SurfaceDesc));
+ _frontSurface->width = 320;
+ _frontSurface->height = 200;
+ delete _off_2E51B;
+ delete _off_2E517;
+ _off_2E51B = 0;
+ _off_2E517 = 0;
+ }
+ if (_frontSurface != _backSurface)
+ freeSprite(21);
+ _spritesArray[21] = 0;
+}
+
} // End of namespace Gob
diff --git a/engines/gob/game.cpp b/engines/gob/game.cpp
index 161fd39011..0807eb0094 100644
--- a/engines/gob/game.cpp
+++ b/engines/gob/game.cpp
@@ -123,13 +123,8 @@ Game::Game(GobEngine *vm) : _vm(vm) {
_byte_2FC83 = 0;
_word_2FC80 = 0;
- warning("GOB2 Stub! _byte_2FC9B, _word_2FC9C, _word_2FC9E, _word_2E51F, _off_2E51B, _off_2E517, _dword_2F2B6");
+ warning("GOB2 Stub! _byte_2FC9B, _dword_2F2B6");
_byte_2FC9B = 0;
- _word_2FC9C = 0;
- _word_2FC9E = 0;
- _word_2E51F = 0;
- _off_2E51B = 0;
- _off_2E517 = 0;
_dword_2F2B6 = 0;
}
@@ -304,6 +299,7 @@ void Game::capturePop(char doDraw) {
_vm->_draw->spriteOperation(0);
}
_vm->_video->freeSurfDesc(_vm->_draw->_spritesArray[30 + _captureCount]);
+ _vm->_draw->_spritesArray[30 + _captureCount] = 0;
}
char *Game::loadTotResource(int16 id) {
@@ -436,6 +432,8 @@ void Game::loadImFile(void) {
}
void Game::start(void) {
+ int i;
+
_collisionAreas = new Collision[250];
memset(_collisionAreas, 0, 250 * sizeof(Collision));
@@ -443,10 +441,14 @@ void Game::start(void) {
playTot(-2);
delete[] _collisionAreas;
+ _vm->_draw->closeScreen();
- _vm->_video->freeSurfDesc(_vm->_draw->_cursorSprites);
+ _vm->_draw->_spritesArray[20] = 0;
+ for (i = 0; i < 50; i++) {
+ _vm->_video->freeSurfDesc(_vm->_draw->_spritesArray[i]);
+ _vm->_draw->_spritesArray[i] = 0;
+ }
_vm->_video->freeSurfDesc(_vm->_draw->_scummvmCursor);
- _vm->_video->freeSurfDesc(_vm->_draw->_backSurface);
}
// flagbits: 0 = freeInterVariables, 1 = skipPlay
@@ -730,61 +732,6 @@ void Game::collAreaSub(int16 index, int8 enter) {
}
}
-// "DEVinitscreen"
-void Game::sub_ADD2(void) {
- _word_2FC9C = 0;
- _word_2FC9E = 0;
-
- if (_word_2E51F != 0) {
- _off_2E51B = new Video::SurfaceDesc;
- memcpy(_off_2E51B, _vm->_draw->_frontSurface, sizeof(Video::SurfaceDesc));
- _off_2E51B->height = _vm->_global->_primaryHeight - _word_2E51F;
- _vm->_draw->_frontSurface->height -= _off_2E51B->height;
- _vm->_draw->_frontSurface->vidPtr =
- _off_2E51B->vidPtr + ((_off_2E51B->width * _off_2E51B->height) / 4);
-
- _off_2E517 = new Video::SurfaceDesc;
- memcpy(_off_2E517, _off_2E51B, sizeof(Video::SurfaceDesc));
- _off_2E517->width = _vm->_global->_primaryWidth;
- _off_2E517->vidPtr = _vm->_draw->_frontSurface->vidPtr +
- ((_vm->_draw->_frontSurface->width * _vm->_draw->_frontSurface->height ) / 4);
- }
- _vm->_draw->initBigSprite(21, 320, 200, 0);
- _vm->_draw->_backSurface = _vm->_draw->_spritesArray[21];
- _vm->_video->clearSurf(_vm->_draw->_backSurface);
-
- _vm->_draw->initBigSprite(23, 32, 16, 2);
- _vm->_draw->_cursorSpritesBack = _vm->_draw->_spritesArray[23];
- _vm->_draw->_cursorSprites = _vm->_draw->_cursorSpritesBack;
- _vm->_draw->_scummvmCursor =
- _vm->_video->initSurfDesc(_vm->_global->_videoMode, 16, 16, SCUMMVM_CURSOR);
-
- _vm->_draw->_spritesArray[20] = _vm->_draw->_frontSurface;
- _vm->_draw->_spritesArray[21] = _vm->_draw->_backSurface;
-
-/* if (_word_2E51F != 0) {
- dword_2F92D = _off_2E51B;
- dword_2F931 = _off_2E517;
- }*/
-}
-
-// "DEVclosescreen"
-void Game::sub_BB28(void) {
- _vm->_draw->freeSprite(23);
- _vm->_video->freeSurfDesc(_vm->_draw->_scummvmCursor);
- if (_off_2E51B != 0) {
- memcpy(_vm->_draw->_frontSurface, _off_2E51B, sizeof(Video::SurfaceDesc));
- _vm->_draw->_frontSurface->width = 320;
- _vm->_draw->_frontSurface->height = 200;
- delete _off_2E51B;
- delete _off_2E517;
- _off_2E51B = 0;
- _off_2E517 = 0;
- }
- if (_vm->_draw->_frontSurface != _vm->_draw->_backSurface)
- _vm->_draw->freeSprite(21);
-}
-
Snd::SoundDesc *Game::loadSND(const char *path, int8 arg_4) {
Snd::SoundDesc *soundDesc;
int32 dsize;
diff --git a/engines/gob/game.h b/engines/gob/game.h
index 859b1bad6e..8097c577c9 100644
--- a/engines/gob/game.h
+++ b/engines/gob/game.h
@@ -234,14 +234,7 @@ public:
virtual void prepareStart(void) = 0;
int8 _byte_2FC9B;
- int16 _word_2FC9C;
- int16 _word_2FC9E;
- int16 _word_2E51F;
int32 _dword_2F2B6;
- Video::SurfaceDesc *_off_2E51B;
- Video::SurfaceDesc *_off_2E517;
- void sub_ADD2(void);
- void sub_BB28(void);
protected:
diff --git a/engines/gob/game_v1.cpp b/engines/gob/game_v1.cpp
index 8e1304849a..fe1404dba7 100644
--- a/engines/gob/game_v1.cpp
+++ b/engines/gob/game_v1.cpp
@@ -594,8 +594,7 @@ void Game_v1::prepareStart(void) {
_vm->_video->setFullPalette(_vm->_global->_pPaletteDesc);
- _vm->_draw->_backSurface = _vm->_video->initSurfDesc(_vm->_global->_videoMode, 320, 200, 0);
-
+ _vm->_draw->initScreen();
_vm->_video->fillRect(_vm->_draw->_backSurface, 0, 0, 319, 199, 1);
_vm->_draw->_frontSurface = _vm->_global->_pPrimarySurfDesc;
_vm->_video->fillRect(_vm->_draw->_frontSurface, 0, 0, 319, 199, 1);
diff --git a/engines/gob/game_v2.cpp b/engines/gob/game_v2.cpp
index bae1a6871b..696ecfa0d5 100644
--- a/engines/gob/game_v2.cpp
+++ b/engines/gob/game_v2.cpp
@@ -89,8 +89,8 @@ void Game_v2::playTot(int16 skipPlay) {
_vm->_mult->initAll();
_vm->_mult->zeroMultData();
- for (i = 0; i < 50; i++)
- _vm->_draw->_spritesArray[i] = 0;
+/* for (i = 0; i < 50; i++)
+ _vm->_draw->_spritesArray[i] = 0;*/
_vm->_draw->_spritesArray[20] = _vm->_draw->_frontSurface;
_vm->_draw->_spritesArray[21] = _vm->_draw->_backSurface;
@@ -241,11 +241,12 @@ void Game_v2::playTot(int16 skipPlay) {
if (skipPlay != -1) {
_vm->_goblin->freeObjects();
- for (i = 0; i < 20; i++) {
+/* for (i = 0; i < 50; i++) {
if (_vm->_draw->_spritesArray[i] != 0)
_vm->_video->freeSurfDesc(_vm->_draw->_spritesArray[i]);
_vm->_draw->_spritesArray[i] = 0;
- }
+ }*/
+
_vm->_snd->stopSound(0);
for (i = 0; i < 60; i++)
@@ -474,66 +475,69 @@ int16 Game_v2::checkCollisions(char handleMouse, int16 deltaTime, int16 *pResId,
width = _vm->_draw->_frontSurface->width;
height = _vm->_draw->_frontSurface->height;
if ((width > _vm->_global->_primaryWidth) || (height > _vm->_global->_primaryHeight)
- || ((_off_2E51B != 0) && (height > _off_2E51B->height))) {
+ || ((_vm->_draw->_off_2E51B != 0) && (height > _vm->_draw->_off_2E51B->height))) {
sWidth = _vm->_global->_primaryWidth;
sHeight = _vm->_global->_primaryHeight;
- if (_off_2E51B != 0)
- sHeight -= _off_2E51B->height;
- oldWord_2FC9E = _word_2FC9E;
- oldWord_2FC9C = _word_2FC9C;
- if ((width > sWidth) && (_vm->_global->_inter_mouseX >= _word_2FC9E)) {
+ if (_vm->_draw->_off_2E51B != 0)
+ sHeight -= _vm->_draw->_off_2E51B->height;
+ oldWord_2FC9E = _vm->_draw->_word_2FC9E;
+ oldWord_2FC9C = _vm->_draw->_word_2FC9C;
+ if ((width > sWidth) && (_vm->_global->_inter_mouseX >= _vm->_draw->_word_2FC9E)) {
cursorRight = _vm->_global->_inter_mouseX + _vm->_draw->_cursorWidth;
- if (cursorRight > (_word_2FC9E + sWidth))
- _word_2FC9E = MIN(cursorRight - sWidth, width - sWidth);
- } else if (_vm->_global->_inter_mouseX < _word_2FC9E)
- _word_2FC9E = _vm->_global->_inter_mouseX;
+ if (cursorRight > (_vm->_draw->_word_2FC9E + sWidth))
+ _vm->_draw->_word_2FC9E = MIN(cursorRight - sWidth, width - sWidth);
+ } else if (_vm->_global->_inter_mouseX < _vm->_draw->_word_2FC9E)
+ _vm->_draw->_word_2FC9E = _vm->_global->_inter_mouseX;
height = _vm->_draw->_frontSurface->height;
- if ((height > sHeight) && (_vm->_global->_inter_mouseY >= _word_2FC9C)) {
+ if ((height > sHeight) && (_vm->_global->_inter_mouseY >= _vm->_draw->_word_2FC9C)) {
cursorBottom = _vm->_global->_inter_mouseY + _vm->_draw->_cursorHeight;
- if (cursorBottom > (_word_2FC9C + sHeight))
- _word_2FC9C = MIN(cursorBottom - sHeight, height - sHeight);
- } else if (_vm->_global->_inter_mouseY < _word_2FC9C)
- _word_2FC9C = _vm->_global->_inter_mouseY;
- if ((oldWord_2FC9E != _word_2FC9E) || (oldWord_2FC9C != _word_2FC9C)) {
+ if (cursorBottom > (_vm->_draw->_word_2FC9C + sHeight))
+ _vm->_draw->_word_2FC9C = MIN(cursorBottom - sHeight, height - sHeight);
+ } else if (_vm->_global->_inter_mouseY < _vm->_draw->_word_2FC9C)
+ _vm->_draw->_word_2FC9C = _vm->_global->_inter_mouseY;
+ if ((oldWord_2FC9E != _vm->_draw->_word_2FC9E) ||
+ (oldWord_2FC9C != _vm->_draw->_word_2FC9C)) {
if (_byte_2FC9B == 0) {
- _word_2FC9E = oldWord_2FC9E;
- _word_2FC9C = oldWord_2FC9C;
+ _vm->_draw->_word_2FC9E = oldWord_2FC9E;
+ _vm->_draw->_word_2FC9C = oldWord_2FC9C;
if ((_vm->_draw->_frontSurface->width > sWidth) &&
(_vm->_global->_inter_mouseX >= oldWord_2FC9E)) {
if ((_vm->_global->_inter_mouseX + _vm->_draw->_cursorWidth) >
- (_word_2FC9E + sWidth))
- _vm->_global->_inter_mouseX = _word_2FC9E + sWidth - _vm->_draw->_cursorWidth;
+ (_vm->_draw->_word_2FC9E + sWidth))
+ _vm->_global->_inter_mouseX = _vm->_draw->_word_2FC9E +
+ sWidth - _vm->_draw->_cursorWidth;
} else if (_vm->_global->_inter_mouseX < oldWord_2FC9E)
_vm->_global->_inter_mouseX = oldWord_2FC9E;
if ((_vm->_draw->_frontSurface->height > sHeight) &&
- (_vm->_global->_inter_mouseY >= _word_2FC9C)) {
+ (_vm->_global->_inter_mouseY >= _vm->_draw->_word_2FC9C)) {
if ((_vm->_global->_inter_mouseY + _vm->_draw->_cursorHeight) >
- (_word_2FC9C + sHeight))
- _vm->_global->_inter_mouseY = _word_2FC9C + sHeight - _vm->_draw->_cursorHeight;
+ (_vm->_draw->_word_2FC9C + sHeight))
+ _vm->_global->_inter_mouseY = _vm->_draw->_word_2FC9C +
+ sHeight - _vm->_draw->_cursorHeight;
} else if (_vm->_global->_inter_mouseY < oldWord_2FC9E)
- _vm->_global->_inter_mouseY = _word_2FC9C;
+ _vm->_global->_inter_mouseY = _vm->_draw->_word_2FC9C;
} else {
- if (oldWord_2FC9E > _word_2FC9E) {
- _vm->_global->_inter_mouseX += (oldWord_2FC9E - _word_2FC9E) / 2;
- _word_2FC9E += (oldWord_2FC9E - _word_2FC9E) / 2;
+ if (oldWord_2FC9E > _vm->_draw->_word_2FC9E) {
+ _vm->_global->_inter_mouseX += (oldWord_2FC9E - _vm->_draw->_word_2FC9E) / 2;
+ _vm->_draw->_word_2FC9E += (oldWord_2FC9E - _vm->_draw->_word_2FC9E) / 2;
} else {
- _vm->_global->_inter_mouseX -= (_word_2FC9E - oldWord_2FC9E) / 2;
- _word_2FC9E -= (_word_2FC9E - oldWord_2FC9E) / 2;
+ _vm->_global->_inter_mouseX -= (_vm->_draw->_word_2FC9E - oldWord_2FC9E) / 2;
+ _vm->_draw->_word_2FC9E -= (_vm->_draw->_word_2FC9E - oldWord_2FC9E) / 2;
}
- if (oldWord_2FC9C > _word_2FC9C) {
- _vm->_global->_inter_mouseY += (oldWord_2FC9C - _word_2FC9C) / 2;
- _word_2FC9C += (oldWord_2FC9C - _word_2FC9C) / 2;
- if (_word_2FC9C < 2)
- _word_2FC9C = 0;
+ if (oldWord_2FC9C > _vm->_draw->_word_2FC9C) {
+ _vm->_global->_inter_mouseY += (oldWord_2FC9C - _vm->_draw->_word_2FC9C) / 2;
+ _vm->_draw->_word_2FC9C += (oldWord_2FC9C - _vm->_draw->_word_2FC9C) / 2;
+ if (_vm->_draw->_word_2FC9C < 2)
+ _vm->_draw->_word_2FC9C = 0;
} else {
- _vm->_global->_inter_mouseY -= (_word_2FC9C - oldWord_2FC9C) / 2;
- _word_2FC9C -= (_word_2FC9C - oldWord_2FC9C) / 2;
+ _vm->_global->_inter_mouseY -= (_vm->_draw->_word_2FC9C - oldWord_2FC9C) / 2;
+ _vm->_draw->_word_2FC9C -= (_vm->_draw->_word_2FC9C - oldWord_2FC9C) / 2;
}
- if (_off_2E51B == 0)
- warning("_vid_setPixelShift(_word_2FC9E, _word_2FC9C);");
+ if (_vm->_draw->_off_2E51B == 0)
+ warning("_vid_setPixelShift(_vm->_draw->_word_2FC9E, _vm->_draw->_word_2FC9C);");
else
- warning("_vid_setPixelShift(_word_2FC9E, _word_2FC9C + _off_2E51B->height);");
+ warning("_vid_setPixelShift(_vm->_draw->_word_2FC9E, _vm->_draw->_word_2FC9C + _vm->_draw->_off_2E51B->height);");
}
_vm->_util->setMousePos(_vm->_global->_inter_mouseX, _vm->_global->_inter_mouseY);
}
@@ -652,9 +656,7 @@ void Game_v2::prepareStart(void) {
_vm->_video->setFullPalette(_vm->_global->_pPaletteDesc);
- _vm->_draw->_backSurface = _vm->_video->initSurfDesc(_vm->_global->_videoMode, 320, 200, 0);
-
- sub_ADD2();
+ _vm->_draw->initScreen();
_vm->_video->fillRect(_vm->_draw->_frontSurface, 0, 0, 319, 199, 1);
_vm->_util->setMousePos(152, 92);
diff --git a/engines/gob/gob.cpp b/engines/gob/gob.cpp
index f6a8d2dca8..20b040ee93 100644
--- a/engines/gob/gob.cpp
+++ b/engines/gob/gob.cpp
@@ -189,9 +189,9 @@ GobEngine::GobEngine(OSystem * syst, uint32 features, Common::Language lang,
}
GobEngine::~GobEngine() {
+ delete _mult;
delete _game;
delete _snd;
- delete _video;
delete _global;
delete _draw;
delete _anim;
@@ -201,7 +201,6 @@ GobEngine::~GobEngine() {
delete _init;
delete _inter;
delete _map;
- delete _mult;
delete _pack;
delete _palanim;
delete _parse;
@@ -209,6 +208,7 @@ GobEngine::~GobEngine() {
delete _gtimer;
delete _util;
delete _music;
+ delete _video;
delete[] _startTot;
delete[] _startTot0;
diff --git a/engines/gob/inter.cpp b/engines/gob/inter.cpp
index 1f18c30d43..09f8900f30 100644
--- a/engines/gob/inter.cpp
+++ b/engines/gob/inter.cpp
@@ -56,6 +56,9 @@ Inter::Inter(GobEngine *vm) : _vm(vm) {
_soundStopVal = 0;
_breakFromLevel = 0;
_nestLevel = 0;
+
+ memset(_pasteBuf, 0, 300);
+ _pastePos = 0;
}
int16 Inter::load16(void) {
diff --git a/engines/gob/inter.h b/engines/gob/inter.h
index 17362f17b4..5ecb57e91c 100644
--- a/engines/gob/inter.h
+++ b/engines/gob/inter.h
@@ -51,6 +51,9 @@ public:
int16 peek16(char *ptr);
int32 peek32(char *ptr);
+ char _pasteBuf[300];
+ int16 _pastePos;
+
char evalExpr(int16 *pRes);
char evalBoolResult(void);
void funcBlock(int16 retFlag);
@@ -332,6 +335,8 @@ protected:
bool o2_loadTot(char &cmdCount, int16 &counter, int16 &retFlag);
bool o2_freeSprite(char &cmdCount, int16 &counter, int16 &retFlag);
bool o2_loadSound(char &cmdCount, int16 &counter, int16 &retFlag);
+ void o2_copyVars(void);
+ void o2_pasteVars(void);
void o2_loadFontToSprite(void);
void o2_renderStatic(void);
void o2_loadMapObjects(void);
diff --git a/engines/gob/inter_v1.cpp b/engines/gob/inter_v1.cpp
index 747df52ad2..09b708a306 100644
--- a/engines/gob/inter_v1.cpp
+++ b/engines/gob/inter_v1.cpp
@@ -804,7 +804,9 @@ void Inter_v1::o1_initCursor(void) {
_vm->_draw->_cursorSprites->width != width * count) {
_vm->_video->freeSurfDesc(_vm->_draw->_cursorSprites);
+ _vm->_draw->_spritesArray[23] = 0;
_vm->_video->freeSurfDesc(_vm->_draw->_scummvmCursor);
+ _vm->_draw->_scummvmCursor = 0;
_vm->_draw->_cursorWidth = width;
_vm->_draw->_cursorHeight = height;
@@ -1168,9 +1170,11 @@ bool Inter_v1::o1_createSprite(char &cmdCount, int16 &counter, int16 &retFlag) {
flag = load16();
if (flag == 1)
- _vm->_draw->_spritesArray[index] = _vm->_video->initSurfDesc(_vm->_global->_videoMode, width, height, 2);
+// _vm->_draw->_spritesArray[index] = _vm->_video->initSurfDesc(_vm->_global->_videoMode, width, height, 2);
+ _vm->_draw->initSpriteSurf(index, _vm->_global->_videoMode, width, height, 2);
else
- _vm->_draw->_spritesArray[index] = _vm->_video->initSurfDesc(_vm->_global->_videoMode, width, height, 0);
+// _vm->_draw->_spritesArray[index] = _vm->_video->initSurfDesc(_vm->_global->_videoMode, width, height, 0);
+ _vm->_draw->initSpriteSurf(index, _vm->_global->_videoMode, width, height, 0);
_vm->_video->clearSurf(_vm->_draw->_spritesArray[index]);
return false;
@@ -1558,12 +1562,12 @@ void Inter_v1::o1_initMult(void) {
|| oldAnimHeight != _vm->_anim->_areaHeight)) {
_vm->_video->freeSurfDesc(_vm->_anim->_animSurf);
_vm->_anim->_animSurf = 0;
+ _vm->_draw->_spritesArray[22] = 0;
}
if (_vm->_anim->_animSurf == 0) {
_vm->_anim->_animSurf = _vm->_video->initSurfDesc(_vm->_global->_videoMode,
_vm->_anim->_areaWidth, _vm->_anim->_areaHeight, 0);
-
_vm->_draw->_spritesArray[22] = _vm->_anim->_animSurf;
}
diff --git a/engines/gob/inter_v2.cpp b/engines/gob/inter_v2.cpp
index 774348081e..963dcaa27a 100644
--- a/engines/gob/inter_v2.cpp
+++ b/engines/gob/inter_v2.cpp
@@ -207,8 +207,8 @@ void Inter_v2::setupOpcodes(void) {
/* 40 */
OPCODE(o2_totSub),
OPCODE(o2_switchTotSub),
- OPCODE(o2_drawStub),
- OPCODE(o2_drawStub),
+ OPCODE(o2_copyVars),
+ OPCODE(o2_pasteVars),
/* 44 */
{NULL, ""},
{NULL, ""},
@@ -671,6 +671,7 @@ bool Inter_v2::executeFuncOpcode(byte i, byte j, char &cmdCount, int16 &counter,
warning("unimplemented opcodeFunc: %d.%d", i, j);
else
return (this->*op) (cmdCount, counter, retFlag);
+
return false;
}
@@ -833,7 +834,7 @@ void Inter_v2::o2_stub0x80(void) {
else
_vm->_video->_extraMode = false;
- _vm->_game->sub_BB28();
+ _vm->_draw->closeScreen();
_vm->_util->clearPalette();
memset(_vm->_global->_redPalette, 0, 256);
memset(_vm->_global->_greenPalette, 0, 256);
@@ -869,12 +870,12 @@ void Inter_v2::o2_stub0x80(void) {
_vm->_util->clearPalette();
if (start == 0)
- _vm->_game->_word_2E51F = 0;
+ _vm->_draw->_word_2E51F = 0;
else
- _vm->_game->_word_2E51F = _vm->_global->_primaryHeight - start;
- _vm->_game->sub_ADD2();
+ _vm->_draw->_word_2E51F = _vm->_global->_primaryHeight - start;
+ _vm->_draw->initScreen();
- if (_vm->_game->_off_2E51B != 0) {
+ if (_vm->_draw->_off_2E51B != 0) {
warning("GOB2 Stub! _vid_setSplit(_vm->_global->_primaryHeight - start);");
warning("GOB2 Stub! _vid_setPixelShift(0, start);");
}
@@ -889,16 +890,16 @@ void Inter_v2::o2_stub0x82(void) {
if (_vm->_game->_byte_2FC9B != 0)
_vm->_game->_byte_2FC9B = 1;
_vm->_parse->parseValExpr();
- WRITE_VAR(2, _vm->_game->_word_2FC9E);
- WRITE_VAR(3, _vm->_game->_word_2FC9C);
+ WRITE_VAR(2, _vm->_draw->_word_2FC9E);
+ WRITE_VAR(3, _vm->_draw->_word_2FC9C);
} else {
- _vm->_game->_word_2FC9E = expr;
- _vm->_game->_word_2FC9C = _vm->_parse->parseValExpr();
+ _vm->_draw->_word_2FC9E = expr;
+ _vm->_draw->_word_2FC9C = _vm->_parse->parseValExpr();
}
-/* if (_vm->_game->_off_2E51B != 0)
- warning("GOB2 Stub! _vid_setPixelShift(_vm->_game->_word_2FC9E, _vm->_game->_word_2FC9C + 200 - _vm->_game->_word_2E51F)");
+/* if (_vm->_draw->_off_2E51B != 0)
+ warning("GOB2 Stub! _vid_setPixelShift(_vm->_draw->_word_2FC9E, _vm->_draw->_word_2FC9C + 200 - _vm->_draw->_word_2E51F)");
else
- warning("GOB2 Stub! _vid_setPixelShift(_vm->_game->_word_2FC9E, _vm->_game->_word_2FC9C);");*/
+ warning("GOB2 Stub! _vid_setPixelShift(_vm->_draw->_word_2FC9E, _vm->_draw->_word_2FC9C);");*/
}
void Inter_v2::o2_stub0x85(void) {
@@ -1013,6 +1014,46 @@ int16 Inter_v2::loadSound(int16 search) {
return slot;
}
+void Inter_v2::o2_copyVars(void) {
+ byte count;
+ int16 varOff;
+ int i;
+
+ count = *_vm->_global->_inter_execPtr++;
+ for (i = 0; i < count; i++) {
+ if ((*_vm->_global->_inter_execPtr == 25) || (*_vm->_global->_inter_execPtr == 28)) {
+ varOff = _vm->_parse->parseVarIndex();
+ _vm->_global->_inter_execPtr++;
+ memcpy(_pasteBuf + _pastePos, _vm->_global->_inter_variables + varOff,
+ _vm->_global->_inter_animDataSize * 4);
+ _pastePos += _vm->_global->_inter_animDataSize * 4;
+ _pasteBuf[_pastePos] = _vm->_global->_inter_animDataSize * 4;
+ } else {
+ if (evalExpr(&varOff) == 20)
+ _vm->_global->_inter_resVal = 0;
+ memcpy(_pasteBuf + _pastePos, &_vm->_global->_inter_resVal, 4);
+ _pastePos += 4;
+ _pasteBuf[_pastePos] = 4;
+ }
+ _pastePos++;
+ }
+}
+
+void Inter_v2::o2_pasteVars(void) {
+ byte count;
+ int16 varOff;
+ int16 size;
+ int i;
+
+ count = *_vm->_global->_inter_execPtr++;
+ for (i = 0; i < count; i++) {
+ varOff = _vm->_parse->parseVarIndex();
+ size = _pasteBuf[--_pastePos];
+ _pastePos -= size;
+ memcpy(_vm->_global->_inter_variables + varOff, _pasteBuf + _pastePos, size);
+ }
+}
+
void Inter_v2::o2_loadFontToSprite(void) {
int16 i = load16();
@@ -1903,9 +1944,10 @@ void Inter_v2::o2_initMult(void) {
(oldAnimWidth != _vm->_anim->_areaWidth
|| oldAnimHeight != _vm->_anim->_areaHeight)) {
if (_vm->_anim->_animSurf->vidMode & 0x80)
- _vm->_draw->freeSprite(0x16);
+ _vm->_draw->freeSprite(22);
else
delete _vm->_anim->_animSurf;
+ _vm->_draw->_spritesArray[22] = 0;
}
_vm->_draw->adjustCoords(0, &_vm->_anim->_areaWidth, &_vm->_anim->_areaHeight);
@@ -1918,6 +1960,7 @@ void Inter_v2::o2_initMult(void) {
_vm->_anim->_animSurf->width -= (_vm->_anim->_areaLeft & 0x0FFF8) - 1;
_vm->_anim->_animSurf->height = _vm->_anim->_areaHeight;
_vm->_anim->_animSurf->vidPtr += 0x0C000;
+ _vm->_draw->_spritesArray[22] = _vm->_anim->_animSurf;
} else {
if (_vm->_global->_videoMode == 20) {
if (((_vm->_draw->_backSurface->width * _vm->_draw->_backSurface->height) / 2
@@ -1929,10 +1972,13 @@ void Inter_v2::o2_initMult(void) {
_vm->_anim->_animSurf->height = _vm->_anim->_areaHeight;
_vm->_anim->_animSurf->vidPtr = _vm->_draw->_backSurface->vidPtr +
_vm->_draw->_backSurface->width * _vm->_draw->_backSurface->height / 4;
+ _vm->_draw->_spritesArray[22] = _vm->_anim->_animSurf;
} else
- _vm->_draw->initBigSprite(0x16, _vm->_anim->_areaWidth, _vm->_anim->_areaHeight, 0);
+ _vm->_draw->initBigSprite(22, _vm->_anim->_areaWidth, _vm->_anim->_areaHeight, 0);
+ _vm->_anim->_animSurf = _vm->_draw->_spritesArray[22];
} else
- _vm->_draw->initBigSprite(0x16, _vm->_anim->_areaWidth, _vm->_anim->_areaHeight, 0);
+ _vm->_draw->initBigSprite(22, _vm->_anim->_areaWidth, _vm->_anim->_areaHeight, 0);
+ _vm->_anim->_animSurf = _vm->_draw->_spritesArray[22];
}
if (_terminate)
return;
@@ -2059,8 +2105,12 @@ void Inter_v2::o2_initCursor(void) {
if (width != _vm->_draw->_cursorWidth || height != _vm->_draw->_cursorHeight ||
_vm->_draw->_cursorSprites->width != width * count) {
- _vm->_video->freeSurfDesc(_vm->_draw->_cursorSprites);
+ _vm->_draw->freeSprite(23);
+ _vm->_draw->_cursorSprites = 0;
+ _vm->_draw->_cursorSpritesBack = 0;
+
_vm->_video->freeSurfDesc(_vm->_draw->_scummvmCursor);
+ _vm->_draw->_scummvmCursor = 0;
_vm->_draw->_cursorWidth = width;
_vm->_draw->_cursorHeight = height;
diff --git a/engines/gob/mult_v1.cpp b/engines/gob/mult_v1.cpp
index c1f4f68994..f1be776f40 100644
--- a/engines/gob/mult_v1.cpp
+++ b/engines/gob/mult_v1.cpp
@@ -319,9 +319,9 @@ void Mult_v1::playMult(int16 startFrame, int16 endFrame, char checkEscape,
delete[] _animArrayData;
_animArrayData = 0;
- if (_vm->_anim->_animSurf)
- _vm->_video->freeSurfDesc(_vm->_anim->_animSurf);
+ _vm->_video->freeSurfDesc(_vm->_anim->_animSurf);
_vm->_anim->_animSurf = 0;
+ _vm->_draw->_spritesArray[22] = 0;
_animDataAllocated = 0;
}
@@ -891,8 +891,7 @@ void Mult_v1::animate(void) {
}
void Mult_v1::freeMult(void) {
- if (_vm->_anim->_animSurf != 0)
- _vm->_video->freeSurfDesc(_vm->_anim->_animSurf);
+ _vm->_video->freeSurfDesc(_vm->_anim->_animSurf);
delete[] _objects;
delete[] _renderData;
@@ -902,6 +901,7 @@ void Mult_v1::freeMult(void) {
_renderData = 0;
_orderArray = 0;
_vm->_anim->_animSurf = 0;
+ _vm->_draw->_spritesArray[22] = 0;
}
void Mult_v1::playSound(Snd::SoundDesc * soundDesc, int16 repCount, int16 freq,
@@ -958,9 +958,9 @@ void Mult_v1::freeMultKeys(void) {
delete[] _animArrayData;
_animArrayData = 0;
- if (_vm->_anim->_animSurf)
- _vm->_video->freeSurfDesc(_vm->_anim->_animSurf);
+ _vm->_video->freeSurfDesc(_vm->_anim->_animSurf);
_vm->_anim->_animSurf = 0;
+ _vm->_draw->_spritesArray[22] = 0;
_animDataAllocated = 0;
}
diff --git a/engines/gob/mult_v2.cpp b/engines/gob/mult_v2.cpp
index 89fc627445..20b61626e8 100644
--- a/engines/gob/mult_v2.cpp
+++ b/engines/gob/mult_v2.cpp
@@ -483,8 +483,11 @@ void Mult_v2::playMult(int16 startFrame, int16 endFrame, char checkEscape,
_vm->_anim->_animSurf->height = _vm->_anim->_areaHeight;
_vm->_anim->_animSurf->vidPtr +=
(_vm->_draw->_backSurface->width * _vm->_draw->_backSurface->height) / 2;
- } else
+ _vm->_draw->_spritesArray[22] = _vm->_anim->_animSurf;
+ } else {
_vm->_draw->initBigSprite(22, _vm->_anim->_areaWidth, _vm->_anim->_areaHeight, 0);
+ _vm->_anim->_animSurf = _vm->_draw->_spritesArray[22];
+ }
_vm->_draw->adjustCoords(1, &_vm->_anim->_areaWidth, &_vm->_anim->_areaHeight);
_vm->_draw->_sourceSurface = 21;
@@ -569,9 +572,9 @@ void Mult_v2::playMult(int16 startFrame, int16 endFrame, char checkEscape,
delete[] _orderArray;
_orderArray = 0;
- if (_vm->_anim->_animSurf)
- _vm->_video->freeSurfDesc(_vm->_anim->_animSurf);
+ _vm->_video->freeSurfDesc(_vm->_anim->_animSurf);
_vm->_anim->_animSurf = 0;
+ _vm->_draw->_spritesArray[22] = 0;
_animDataAllocated = 0;
}