From edff41b1c35100595d25d151db88a0ed7686a022 Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Sat, 3 May 2008 20:08:46 +0000 Subject: Correct o2_initScreen() for Woodruff (screen positioning, clipping and cursor limiting) svn-id: r31846 --- engines/gob/draw_v2.cpp | 4 +-- engines/gob/global.cpp | 7 ++++-- engines/gob/global.h | 7 ++++-- engines/gob/gob.cpp | 13 ++++------ engines/gob/inter_v2.cpp | 63 +++++++++++++++++++++++++++++++++++++++--------- engines/gob/mult_v2.cpp | 2 +- engines/gob/util.cpp | 16 ++++++------ engines/gob/video.cpp | 43 ++++++++++++++++++++++++++------- engines/gob/video.h | 6 +++++ 9 files changed, 117 insertions(+), 44 deletions(-) (limited to 'engines') diff --git a/engines/gob/draw_v2.cpp b/engines/gob/draw_v2.cpp index a4417f7f1d..8f7d5b325b 100644 --- a/engines/gob/draw_v2.cpp +++ b/engines/gob/draw_v2.cpp @@ -246,11 +246,11 @@ void Draw_v2::printTotText(int16 id) { } if (_renderFlags & RENDERFLAG_FROMSPLIT) { - destY = _vm->_video->_splitHeight1; + destY = _vm->_video->_splitStart; spriteBottom = READ_LE_UINT16(ptr + 6) - READ_LE_UINT16(ptr + 2); if (_renderFlags & RENDERFLAG_DOUBLECOORDS) spriteBottom *= 3; - spriteBottom += _vm->_video->_splitHeight1; + spriteBottom += _vm->_video->_splitStart; if (_renderFlags & RENDERFLAG_DOUBLECOORDS) { spriteBottom += _backDeltaX; destY += _backDeltaX; diff --git a/engines/gob/global.cpp b/engines/gob/global.cpp index 0c9dfd6a5c..1445601017 100644 --- a/engines/gob/global.cpp +++ b/engines/gob/global.cpp @@ -53,8 +53,11 @@ Global::Global(GobEngine *vm) : _vm(vm) { _mousePresent = UNDEF; _mouseXShift = 3; _mouseYShift = 3; - _mouseMaxCol = 320; - _mouseMaxRow = 200; + + _mouseMinX = 0; + _mouseMinY = 0; + _mouseMaxX = 320; + _mouseMaxY = 200; _useJoystick = 1; diff --git a/engines/gob/global.h b/engines/gob/global.h index 6095183b33..45c179d277 100644 --- a/engines/gob/global.h +++ b/engines/gob/global.h @@ -90,8 +90,11 @@ public: int16 _mousePresent; int16 _mouseXShift; int16 _mouseYShift; - int16 _mouseMaxCol; - int16 _mouseMaxRow; + + int16 _mouseMinX; + int16 _mouseMinY; + int16 _mouseMaxX; + int16 _mouseMaxY; char _useJoystick; diff --git a/engines/gob/gob.cpp b/engines/gob/gob.cpp index a54d9241e0..863665357b 100644 --- a/engines/gob/gob.cpp +++ b/engines/gob/gob.cpp @@ -146,10 +146,7 @@ int GobEngine::init() { return -1; } - _system->beginGFXTransaction(); - _system->initSize(_width, _height); - initCommonGFX(is640()); - _system->endGFXTransaction(); + _video->setSize(is640()); // On some systems it's not safe to run CD audio games from the CD. if (isCD()) @@ -346,15 +343,15 @@ bool GobEngine::initGameParts() { if (is640()) { _video->_surfWidth = _width = 640; _video->_surfHeight = _video->_splitHeight1 = _height = 480; - _global->_mouseMaxCol = 640; - _global->_mouseMaxRow = 480; + _global->_mouseMaxX = 640; + _global->_mouseMaxY = 480; _mode = 0x18; _global->_primarySurfDesc = new SurfaceDesc(0x18, 640, 480); } else { _video->_surfWidth = _width = 320; _video->_surfHeight = _video->_splitHeight1 = _height = 200; - _global->_mouseMaxCol = 320; - _global->_mouseMaxRow = 200; + _global->_mouseMaxX = 320; + _global->_mouseMaxY = 200; _mode = 0x14; _global->_primarySurfDesc = new SurfaceDesc(0x14, 320, 200); } diff --git a/engines/gob/inter_v2.cpp b/engines/gob/inter_v2.cpp index c1efc42bb8..62b2f26c7b 100644 --- a/engines/gob/inter_v2.cpp +++ b/engines/gob/inter_v2.cpp @@ -1388,17 +1388,21 @@ void Inter_v2::o2_initScreen() { width = _vm->_parse->parseValExpr(); height = _vm->_parse->parseValExpr(); + _vm->_video->clearScreen(); + // Lost in Time switches to 640x400x16 when showing the title screen if (_vm->getGameType() == kGameTypeLostInTime) { + if (videoMode == 0x10) { + width = _vm->_width = 640; height = _vm->_height = 400; _vm->_global->_colorCount = 16; - _vm->_system->beginGFXTransaction(); - _vm->_system->initSize(_vm->_width, _vm->_height); - _vm->initCommonGFX(true); - _vm->_system->endGFXTransaction(); + + _vm->_video->setSize(true); + } else if (_vm->_global->_videoMode == 0x10) { + if (width == -1) width = 320; if (height == -1) @@ -1407,10 +1411,9 @@ void Inter_v2::o2_initScreen() { _vm->_width = 320; _vm->_height = 200; _vm->_global->_colorCount = 256; - _vm->_system->beginGFXTransaction(); - _vm->_system->initSize(_vm->_width, _vm->_height); - _vm->initCommonGFX(false); - _vm->_system->endGFXTransaction(); + + _vm->_video->setSize(false); + } } @@ -1428,10 +1431,46 @@ void Inter_v2::o2_initScreen() { if (height > 0) _vm->_video->_surfHeight = height; - _vm->_video->_splitHeight1 = - MIN(_vm->_height, _vm->_video->_surfHeight - offY); - _vm->_video->_splitHeight2 = offY; - _vm->_video->_splitStart = _vm->_video->_surfHeight - offY; + if (videoMode == 0x18) { + + 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->_surfHeight += offY; + + _vm->_video->_splitHeight1 = MIN(_vm->_height, screenHeight - offY); + _vm->_video->_splitHeight2 = offY; + _vm->_video->_splitStart = screenHeight; + + 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->_draw->closeScreen(); _vm->_util->clearPalette(); diff --git a/engines/gob/mult_v2.cpp b/engines/gob/mult_v2.cpp index 5acbf9e652..02211880ba 100644 --- a/engines/gob/mult_v2.cpp +++ b/engines/gob/mult_v2.cpp @@ -533,7 +533,7 @@ void Mult_v2::playMultInit() { _animArrayData = new Mult_AnimData[_objCount]; memset(_objects, 0, _objCount * sizeof(Mult_Object)); - memset(_orderArray, 0, _objCount * sizeof(int8)); + memset(_orderArray, 0, _objCount * sizeof(uint8)); memset(_renderObjs, 0, _objCount * sizeof(Mult_Object *)); memset(_animArrayX, 0, _objCount * sizeof(int32)); memset(_animArrayY, 0, _objCount * sizeof(int32)); diff --git a/engines/gob/util.cpp b/engines/gob/util.cpp index 7ed2fb044b..3b6a898a60 100644 --- a/engines/gob/util.cpp +++ b/engines/gob/util.cpp @@ -128,11 +128,11 @@ void Util::processInput(bool scroll) { } _vm->_global->_speedFactor = MIN(_fastMode + 1, 3); - if (scroll && hasMove) { - if (y >= (_vm->_height - _vm->_video->_splitHeight2)) { - y = _vm->_height - _vm->_video->_splitHeight2 - 1; - _vm->_util->setMousePos(x, y); - } + if (hasMove && scroll) { + x = CLIP(x, _vm->_global->_mouseMinX, _vm->_global->_mouseMaxX); + y = CLIP(y, _vm->_global->_mouseMinY, _vm->_global->_mouseMaxY); + + _vm->_util->setMousePos(x - _vm->_video->_screenDeltaX, y - _vm->_video->_screenDeltaY); _vm->_game->evaluateScroll(x, y); } } @@ -228,15 +228,15 @@ int16 Util::checkKey(void) { void Util::getMouseState(int16 *pX, int16 *pY, int16 *pButtons) { Common::Point mouse = g_system->getEventManager()->getMousePos(); - *pX = mouse.x + _vm->_video->_scrollOffsetX; - *pY = mouse.y + _vm->_video->_scrollOffsetY; + *pX = mouse.x + _vm->_video->_scrollOffsetX - _vm->_video->_screenDeltaX; + *pY = mouse.y + _vm->_video->_scrollOffsetY - _vm->_video->_screenDeltaY; if (pButtons != 0) *pButtons = _mouseButtons; } void Util::setMousePos(int16 x, int16 y) { - g_system->warpMouse(x, y); + g_system->warpMouse(x + _vm->_video->_screenDeltaX, y + _vm->_video->_screenDeltaY); } void Util::waitMouseUp(void) { diff --git a/engines/gob/video.cpp b/engines/gob/video.cpp index 5a27254890..9a004318b8 100644 --- a/engines/gob/video.cpp +++ b/engines/gob/video.cpp @@ -95,6 +95,9 @@ Video::Video(GobEngine *vm) : _vm(vm) { _splitHeight2 = 0; _splitStart = 0; + _screenDeltaX = 0; + _screenDeltaY = 0; + _curSparse = 0; _lastSparse = 0xFFFFFFFF; } @@ -142,9 +145,7 @@ SurfaceDesc *Video::initSurfDesc(int16 vidMode, int16 width, int16 height, if (flags & PRIMARY_SURFACE) { _vm->_global->_primaryWidth = width; - _vm->_global->_mouseMaxCol = width; _vm->_global->_primaryHeight = height; - _vm->_global->_mouseMaxRow = height; descPtr = _vm->_global->_primarySurfDesc; descPtr->resize(width, height); @@ -160,17 +161,41 @@ SurfaceDesc *Video::initSurfDesc(int16 vidMode, int16 width, int16 height, return descPtr; } +void Video::clearScreen() { + g_system->clearScreen(); +} + +void Video::setSize(bool defaultTo1XScaler) { + _vm->_system->beginGFXTransaction(); + _vm->_system->initSize(_vm->_width, _vm->_height); + _vm->initCommonGFX(defaultTo1XScaler); + _vm->_system->endGFXTransaction(); +} + void Video::retrace(bool mouse) { if (mouse) CursorMan.showMouse((_vm->_draw->_showCursor & 2) != 0); if (_vm->_global->_primarySurfDesc) { - g_system->copyRectToScreen(_vm->_global->_primarySurfDesc->getVidMem() + - _scrollOffsetY * _surfWidth + _scrollOffsetX, _surfWidth, - 0, 0, _vm->_width, _splitHeight1); - if (_splitHeight2 > 0) - g_system->copyRectToScreen(_vm->_global->_primarySurfDesc->getVidMem() + - _splitStart * _surfWidth, _surfWidth, 0, - _vm->_height - _splitHeight2, _vm->_width, _splitHeight2); + int screenOffset = _scrollOffsetY * _surfWidth + _scrollOffsetX; + int screenX = _screenDeltaX; + int screenY = _screenDeltaY; + int screenWidth = _vm->_width; + int screenHeight = _splitHeight1; + + g_system->copyRectToScreen(_vm->_global->_primarySurfDesc->getVidMem() + screenOffset, + _surfWidth, screenX, screenY, screenWidth, screenHeight); + + if (_splitHeight2 > 0) { + screenOffset = _splitStart * _surfWidth; + screenX = 0; + screenY = _vm->_height - _splitHeight2; + screenWidth = _vm->_width; + screenHeight = _splitHeight2; + + g_system->copyRectToScreen(_vm->_global->_primarySurfDesc->getVidMem() + screenOffset, + _surfWidth, screenX, screenY, screenWidth, screenHeight); + } + g_system->updateScreen(); } } diff --git a/engines/gob/video.h b/engines/gob/video.h index 16932d5046..4a585d8857 100644 --- a/engines/gob/video.h +++ b/engines/gob/video.h @@ -104,11 +104,17 @@ public: int16 _splitHeight1; int16 _splitHeight2; int16 _splitStart; + int16 _screenDeltaX; + int16 _screenDeltaY; void freeDriver(); void initPrimary(int16 mode); SurfaceDesc *initSurfDesc(int16 vidMode, int16 width, int16 height, int16 flags); + + void setSize(bool defaultTo1XScaler); + + void clearScreen(); void retrace(bool mouse = true); void waitRetrace(bool mouse = true); void sparseRetrace(int max); -- cgit v1.2.3