From ce8bfbb46e75f2ebd04c3d6f7edf078fee89a103 Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Thu, 5 Apr 2007 19:20:12 +0000 Subject: Implemented scrolling and split screen (for the text field, the bottom 40 lines) in Gob3 svn-id: r26387 --- engines/gob/game_v2.cpp | 40 ++++++++++++++++++++++++++++++++++++++++ engines/gob/inter_v1.cpp | 2 ++ engines/gob/inter_v2.cpp | 4 +--- engines/gob/video.cpp | 7 ++++++- engines/gob/video.h | 1 + 5 files changed, 50 insertions(+), 4 deletions(-) (limited to 'engines/gob') diff --git a/engines/gob/game_v2.cpp b/engines/gob/game_v2.cpp index c978906910..1cd15cc00f 100644 --- a/engines/gob/game_v2.cpp +++ b/engines/gob/game_v2.cpp @@ -444,6 +444,46 @@ int16 Game_v2::checkCollisions(byte handleMouse, int16 deltaTime, int16 *pResId, key = checkKeys(&_vm->_global->_inter_mouseX, &_vm->_global->_inter_mouseY, &_mouseButtons, handleMouse); + if ((_vm->_global->_videoMode == 0x14) && (handleMouse != 0)) { + int16 cursorRight; + int16 screenRight; + + if ((_vm->_global->_inter_mouseX == 0) && + (_vm->_draw->_scrollOffsetX > 0)) { + uint16 off; + + off = MIN(_vm->_draw->_cursorWidth, _vm->_draw->_scrollOffsetX); + off = MAX(off / 2, 1); + _vm->_draw->_scrollOffsetX -= off; + _vm->_global->_inter_mouseX -= off; + _vm->_global->_inter_mouseX = + MAX(_vm->_global->_inter_mouseX, (int16) 1); + } + + _vm->_global->_inter_mouseX += _vm->_draw->_scrollOffsetX; + cursorRight = _vm->_global->_inter_mouseX + _vm->_draw->_cursorWidth; + screenRight = _vm->_draw->_scrollOffsetX + 320; + + if ((cursorRight >= screenRight) && + (screenRight < _vm->_video->_surfWidth)) { + uint16 off; + int16 max; + + off = MIN(_vm->_draw->_cursorWidth, + (int16) (_vm->_video->_surfWidth - screenRight)); + off = MAX(off / 2, 1); + max = _vm->_video->_surfWidth - _vm->_draw->_cursorWidth; + + _vm->_draw->_scrollOffsetX += off; + _vm->_global->_inter_mouseX += off - 1; + _vm->_global->_inter_mouseX = MIN(_vm->_global->_inter_mouseX, max); + } + + _vm->_util->setScrollOffset(); + _vm->_util->setMousePos(MAX(0, _vm->_global->_inter_mouseX - + _vm->_draw->_scrollOffsetX), _vm->_global->_inter_mouseY); + } + if ((handleMouse == 0) && (_mouseButtons != 0)) { _vm->_util->waitMouseRelease(0); key = 3; diff --git a/engines/gob/inter_v1.cpp b/engines/gob/inter_v1.cpp index ebeaec481b..4cc039b6de 100644 --- a/engines/gob/inter_v1.cpp +++ b/engines/gob/inter_v1.cpp @@ -2152,6 +2152,8 @@ bool Inter_v1::o1_istrlen(OpFuncParams ¶ms) { bool Inter_v1::o1_setMousePos(OpFuncParams ¶ms) { _vm->_global->_inter_mouseX = _vm->_parse->parseValExpr(); _vm->_global->_inter_mouseY = _vm->_parse->parseValExpr(); + _vm->_global->_inter_mouseX -= _vm->_draw->_scrollOffsetX; + _vm->_global->_inter_mouseY -= _vm->_draw->_scrollOffsetY; if (_vm->_global->_useMouse != 0) _vm->_util->setMousePos(_vm->_global->_inter_mouseX, _vm->_global->_inter_mouseY); diff --git a/engines/gob/inter_v2.cpp b/engines/gob/inter_v2.cpp index 5ac41a5007..688f52a155 100644 --- a/engines/gob/inter_v2.cpp +++ b/engines/gob/inter_v2.cpp @@ -1375,9 +1375,7 @@ void Inter_v2::o2_initScreen() { if (height > 0) _vm->_video->_surfHeight = height; - if (offY != 0) - warning("Inter_v2::o2_initScreen(): Stub: Horizontal split (%d/%d)", - _vm->_video->_surfHeight - offY, offY); + _vm->_video->_splitHeight = _vm->_video->_surfHeight - offY; _vm->_draw->closeScreen(); _vm->_util->clearPalette(); diff --git a/engines/gob/video.cpp b/engines/gob/video.cpp index 16edc7e5bc..b428a5ed5d 100644 --- a/engines/gob/video.cpp +++ b/engines/gob/video.cpp @@ -89,6 +89,7 @@ Video::Video(GobEngine *vm) : _vm(vm) { _surfHeight = 200; _scrollOffsetX = 0; _scrollOffsetY = 0; + _splitHeight = 200; } char Video::initDriver(int16 vidMode) { @@ -158,7 +159,11 @@ void Video::retrace(bool mouse) { if (_vm->_global->_primarySurfDesc) { g_system->copyRectToScreen(_vm->_global->_primarySurfDesc->getVidMem() + _scrollOffsetY * _surfWidth + _scrollOffsetX, _surfWidth, - 0, 0, 320, 200); + 0, 0, 320, _splitHeight); + if (_splitHeight < _surfHeight) + g_system->copyRectToScreen(_vm->_global->_primarySurfDesc->getVidMem() + + _splitHeight * _surfWidth, _surfWidth, 0, _splitHeight, 320, + _surfHeight - _splitHeight); g_system->updateScreen(); } } diff --git a/engines/gob/video.h b/engines/gob/video.h index d967ede5fc..066f411f29 100644 --- a/engines/gob/video.h +++ b/engines/gob/video.h @@ -99,6 +99,7 @@ public: int16 _surfHeight; int16 _scrollOffsetX; int16 _scrollOffsetY; + int16 _splitHeight; void freeDriver(); void initPrimary(int16 mode); -- cgit v1.2.3