aboutsummaryrefslogtreecommitdiff
path: root/engines/gob
diff options
context:
space:
mode:
authorSven Hesse2007-04-05 19:20:12 +0000
committerSven Hesse2007-04-05 19:20:12 +0000
commitce8bfbb46e75f2ebd04c3d6f7edf078fee89a103 (patch)
tree0505f7e2ed27e2e1e3a27714b0e4a860bca24101 /engines/gob
parent96c6ae041fdb14ad557abdb2d95fe2cd62f17a97 (diff)
downloadscummvm-rg350-ce8bfbb46e75f2ebd04c3d6f7edf078fee89a103.tar.gz
scummvm-rg350-ce8bfbb46e75f2ebd04c3d6f7edf078fee89a103.tar.bz2
scummvm-rg350-ce8bfbb46e75f2ebd04c3d6f7edf078fee89a103.zip
Implemented scrolling and split screen (for the text field, the bottom 40 lines) in Gob3
svn-id: r26387
Diffstat (limited to 'engines/gob')
-rw-r--r--engines/gob/game_v2.cpp40
-rw-r--r--engines/gob/inter_v1.cpp2
-rw-r--r--engines/gob/inter_v2.cpp4
-rw-r--r--engines/gob/video.cpp7
-rw-r--r--engines/gob/video.h1
5 files changed, 50 insertions, 4 deletions
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 &params) {
bool Inter_v1::o1_setMousePos(OpFuncParams &params) {
_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);