From 4e785a9e73f6dd8b637474c4983abf2f5cfe5318 Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Sat, 17 May 2008 23:55:04 +0000 Subject: Changing the split stuff again, fixing several scrolling and hotspot-text related issues svn-id: r32161 --- engines/gob/draw_v2.cpp | 28 ++++++++--------- engines/gob/inter.h | 1 + engines/gob/inter_v2.cpp | 50 ++++++----------------------- engines/gob/inter_v4.cpp | 82 +++++++++++++++++++++++++++++++++++++++++++++++- engines/gob/video.cpp | 19 ++++++++++- 5 files changed, 122 insertions(+), 58 deletions(-) (limited to 'engines') diff --git a/engines/gob/draw_v2.cpp b/engines/gob/draw_v2.cpp index 1195e35e93..8c12079b83 100644 --- a/engines/gob/draw_v2.cpp +++ b/engines/gob/draw_v2.cpp @@ -247,10 +247,7 @@ void Draw_v2::printTotText(int16 id) { if (_renderFlags & RENDERFLAG_FROMSPLIT) { int16 start; - if (_vm->_video->_splitHeight1 < _vm->_height) - start = _vm->_video->_splitHeight1; - else - start = _vm->_video->_splitStart; + start = _vm->_video->_splitStart; destY = start; spriteBottom = READ_LE_UINT16(ptr + 6) - READ_LE_UINT16(ptr + 2); @@ -654,22 +651,23 @@ void Draw_v2::spriteOperation(int16 operation) { int16 destSurface = _destSurface; int16 sourceSurface = _sourceSurface; - if ((_destSpriteY >= _vm->_video->_splitHeight1) && - ((_destSurface == 20) || (_destSurface == 21))) { - - if (_vm->_video->_splitHeight1 < _vm->_height) { - _destSpriteY = (_destSpriteY - _vm->_video->_splitHeight1) + _vm->_video->_splitStart; + if (_vm->_video->_splitSurf && ((_destSurface == 20) || (_destSurface == 21))) { + if ((_destSpriteY >= _vm->_video->_splitStart)) { + _destSpriteY -= _vm->_video->_splitStart; if ((operation == DRAW_DRAWLINE) || ((operation >= DRAW_DRAWBAR) && (operation <= DRAW_FILLRECTABS))) - _spriteBottom = (_spriteBottom - _vm->_video->_splitHeight1) + _vm->_video->_splitStart; + _spriteBottom -= _vm->_video->_splitStart; + + _destSurface += 4; } - } + if ((_spriteTop >= _vm->_video->_splitStart) && (operation == DRAW_BLITSURF)) { + _spriteTop -= _vm->_video->_splitStart; + if (_destSurface < 24) + _destSurface += 4; + } - if ((_spriteTop >= _vm->_video->_splitHeight1) && (operation == DRAW_BLITSURF) && - ((_destSurface == 20) || (_destSurface == 21))) - if (_vm->_video->_splitHeight1 < _vm->_height) - _spriteTop = (_spriteTop - _vm->_video->_splitHeight1) + _vm->_video->_splitStart; + } adjustCoords(0, &_destSpriteX, &_destSpriteY); if ((operation != DRAW_LOADSPRITE) && (_needAdjust != 2)) { diff --git a/engines/gob/inter.h b/engines/gob/inter.h index 582e57a2d4..e43cb4e891 100644 --- a/engines/gob/inter.h +++ b/engines/gob/inter.h @@ -519,6 +519,7 @@ protected: virtual const char *getOpcodeFuncDesc(byte i, byte j); virtual const char *getOpcodeGoblinDesc(int i); + void o4_initScreen(); void o4_playVmdOrMusic(); }; diff --git a/engines/gob/inter_v2.cpp b/engines/gob/inter_v2.cpp index 0e2a6c607e..6b7607791e 100644 --- a/engines/gob/inter_v2.cpp +++ b/engines/gob/inter_v2.cpp @@ -1433,49 +1433,17 @@ void Inter_v2::o2_initScreen() { if (height > 0) _vm->_video->_surfHeight = height; - if (videoMode == 0x18) { + _vm->_video->_splitHeight1 = MIN(_vm->_height, _vm->_video->_surfHeight - offY); + _vm->_video->_splitHeight2 = offY; + _vm->_video->_splitStart = _vm->_video->_surfHeight - offY; - if (_vm->_video->_surfWidth < _vm->_width) - _vm->_video->_screenDeltaX = (_vm->_width - _vm->_video->_surfWidth) / 2; - else - _vm->_video->_screenDeltaX = 0; - - _vm->_global->_mouseMinX = _vm->_video->_screenDeltaX; - _vm->_global->_mouseMaxX = _vm->_video->_screenDeltaX + _vm->_video->_surfWidth - 1; - - - int16 screenHeight = _vm->_video->_surfHeight; + _vm->_video->_screenDeltaX = 0; + _vm->_video->_screenDeltaY = 0; - if (screenHeight < _vm->_height) { - _vm->_video->_surfHeight += offY; - _vm->_video->_splitStart = screenHeight; - } else - _vm->_video->_splitStart = screenHeight - offY; - - _vm->_video->_splitHeight1 = MIN(_vm->_height, screenHeight - offY); - _vm->_video->_splitHeight2 = offY; - - if ((_vm->_video->_surfHeight + offY) < _vm->_height) - _vm->_video->_screenDeltaY = (_vm->_height - (screenHeight + offY)) / 2; - else - _vm->_video->_screenDeltaY = 0; - - _vm->_global->_mouseMaxY = (screenHeight + _vm->_video->_screenDeltaY) - offY - 1; - _vm->_global->_mouseMinY = _vm->_video->_screenDeltaY; - - } else { - _vm->_video->_splitHeight1 = MIN(_vm->_height, _vm->_video->_surfHeight - offY); - _vm->_video->_splitHeight2 = offY; - _vm->_video->_splitStart = _vm->_video->_surfHeight - offY; - - _vm->_video->_screenDeltaX = 0; - _vm->_video->_screenDeltaY = 0; - - _vm->_global->_mouseMinX = 0; - _vm->_global->_mouseMinY = 0; - _vm->_global->_mouseMaxX = _vm->_width; - _vm->_global->_mouseMaxY = _vm->_height - _vm->_video->_splitHeight2 - 1; - } + _vm->_global->_mouseMinX = 0; + _vm->_global->_mouseMinY = 0; + _vm->_global->_mouseMaxX = _vm->_width; + _vm->_global->_mouseMaxY = _vm->_height - _vm->_video->_splitHeight2 - 1; _vm->_draw->closeScreen(); _vm->_util->clearPalette(); diff --git a/engines/gob/inter_v4.cpp b/engines/gob/inter_v4.cpp index 920ca59f43..bc92fbf2b0 100644 --- a/engines/gob/inter_v4.cpp +++ b/engines/gob/inter_v4.cpp @@ -29,6 +29,7 @@ #include "gob/gob.h" #include "gob/inter.h" #include "gob/global.h" +#include "gob/draw.h" #include "gob/game.h" #include "gob/parse.h" #include "gob/videoplayer.h" @@ -279,7 +280,7 @@ void Inter_v4::setupOpcodes() { {NULL, ""}, {NULL, ""}, /* 80 */ - OPCODE(o2_initScreen), + OPCODE(o4_initScreen), OPCODE(o2_scroll), OPCODE(o2_setScrollOffset), OPCODE(o4_playVmdOrMusic), @@ -716,6 +717,85 @@ const char *Inter_v4::getOpcodeGoblinDesc(int i) { return ""; } +void Inter_v4::o4_initScreen() { + int16 offY; + int16 videoMode; + int16 width, height; + + offY = load16(); + + videoMode = offY & 0xFF; + offY = (offY >> 8) & 0xFF; + + width = _vm->_parse->parseValExpr(); + height = _vm->_parse->parseValExpr(); + + _vm->_video->clearScreen(); + + _vm->_global->_fakeVideoMode = videoMode; + + // Some versions require this + if (videoMode == 0xD) + videoMode = _vm->_mode; + + if ((videoMode == _vm->_global->_videoMode) && (width == -1)) + return; + + if (width > 0) + _vm->_video->_surfWidth = width; + if (height > 0) + _vm->_video->_surfHeight = height; + + _vm->_video->_screenDeltaX = 0; + if (_vm->_video->_surfWidth < _vm->_width) + _vm->_video->_screenDeltaX = (_vm->_width - _vm->_video->_surfWidth) / 2; + + _vm->_global->_mouseMinX = _vm->_video->_screenDeltaX; + _vm->_global->_mouseMaxX = _vm->_video->_screenDeltaX + _vm->_video->_surfWidth - 1; + + _vm->_video->_splitStart = _vm->_video->_surfHeight - offY; + + _vm->_video->_splitHeight1 = MIN(_vm->_height, _vm->_video->_surfHeight); + _vm->_video->_splitHeight2 = offY; + + if ((_vm->_video->_surfHeight + offY) < _vm->_height) + _vm->_video->_screenDeltaY = (_vm->_height - (_vm->_video->_surfHeight + offY)) / 2; + else + _vm->_video->_screenDeltaY = 0; + + _vm->_global->_mouseMaxY = (_vm->_video->_surfHeight + _vm->_video->_screenDeltaY) - offY - 1; + _vm->_global->_mouseMinY = _vm->_video->_screenDeltaY; + + _vm->_draw->closeScreen(); + _vm->_util->clearPalette(); + memset(_vm->_global->_redPalette, 0, 256); + memset(_vm->_global->_greenPalette, 0, 256); + memset(_vm->_global->_bluePalette, 0, 256); + + _vm->_global->_videoMode = videoMode; + _vm->_video->initPrimary(videoMode); + WRITE_VAR(15, _vm->_global->_fakeVideoMode); + + _vm->_global->_setAllPalette = true; + + _vm->_util->setMousePos(_vm->_global->_inter_mouseX, + _vm->_global->_inter_mouseY); + _vm->_util->clearPalette(); + + _vm->_draw->initScreen(); + + _vm->_util->setScrollOffset(); + + _vm->_video->_splitSurf = 0; + _vm->_draw->_spritesArray[24] = 0; + _vm->_draw->_spritesArray[25] = 0; + if (offY > 0) { + _vm->_draw->_spritesArray[24] = new SurfaceDesc(videoMode, _vm->_width, offY); + _vm->_draw->_spritesArray[25] = new SurfaceDesc(videoMode, _vm->_width, offY); + _vm->_video->_splitSurf = _vm->_draw->_spritesArray[25]; + } +} + void Inter_v4::o4_playVmdOrMusic() { char fileName[128]; int16 x, y; diff --git a/engines/gob/video.cpp b/engines/gob/video.cpp index 3034a38079..d2fe979754 100644 --- a/engines/gob/video.cpp +++ b/engines/gob/video.cpp @@ -86,10 +86,14 @@ void SurfaceDesc::swap(SurfaceDesc &surf) { Video::Video(GobEngine *vm) : _vm(vm) { _doRangeClamp = false; _videoDriver = 0; + _surfWidth = 320; _surfHeight = 200; + _scrollOffsetX = 0; _scrollOffsetY = 0; + + _splitSurf = 0; _splitHeight1 = 200; _splitHeight2 = 0; _splitStart = 0; @@ -184,7 +188,19 @@ void Video::retrace(bool mouse) { g_system->copyRectToScreen(_vm->_global->_primarySurfDesc->getVidMem() + screenOffset, _surfWidth, screenX, screenY, screenWidth, screenHeight); - if (_splitHeight2 > 0) { + if (_splitSurf) { + + screenOffset = 0; + screenX = 0; + screenY = _vm->_height - _splitSurf->getHeight(); + screenWidth = MIN(_vm->_width, _splitSurf->getWidth()); + screenHeight = _splitSurf->getHeight(); + + g_system->copyRectToScreen(_splitSurf->getVidMem() + screenOffset, + _splitSurf->getWidth(), screenX, screenY, screenWidth, screenHeight); + + } else if (_splitHeight2 > 0) { + screenOffset = _splitStart * _surfWidth; screenX = 0; screenY = _vm->_height - _splitHeight2; @@ -193,6 +209,7 @@ void Video::retrace(bool mouse) { g_system->copyRectToScreen(_vm->_global->_primarySurfDesc->getVidMem() + screenOffset, _surfWidth, screenX, screenY, screenWidth, screenHeight); + } g_system->updateScreen(); -- cgit v1.2.3