[Scummvm-cvs-logs] SF.net SVN: scummvm:[43147] scummvm/trunk/engines/gob

drmccoy at users.sourceforge.net drmccoy at users.sourceforge.net
Sat Aug 8 23:43:07 CEST 2009


Revision: 43147
          http://scummvm.svn.sourceforge.net/scummvm/?rev=43147&view=rev
Author:   drmccoy
Date:     2009-08-08 21:43:07 +0000 (Sat, 08 Aug 2009)

Log Message:
-----------
Changed the scroll-handling to be more like the original. This fixes bug #2832362 ("GOB3: Scrolling locked after cutscene")

Modified Paths:
--------------
    scummvm/trunk/engines/gob/draw_v2.cpp
    scummvm/trunk/engines/gob/game.cpp
    scummvm/trunk/engines/gob/game.h
    scummvm/trunk/engines/gob/hotspots.cpp
    scummvm/trunk/engines/gob/inter_v2.cpp
    scummvm/trunk/engines/gob/inter_v4.cpp
    scummvm/trunk/engines/gob/inter_v6.cpp
    scummvm/trunk/engines/gob/mult_v2.cpp
    scummvm/trunk/engines/gob/util.cpp

Modified: scummvm/trunk/engines/gob/draw_v2.cpp
===================================================================
--- scummvm/trunk/engines/gob/draw_v2.cpp	2009-08-08 20:49:54 UTC (rev 43146)
+++ scummvm/trunk/engines/gob/draw_v2.cpp	2009-08-08 21:43:07 UTC (rev 43147)
@@ -46,6 +46,8 @@
 }
 
 void Draw_v2::initScreen() {
+	_vm->_game->_preventScroll = false;
+
 	_scrollOffsetX = 0;
 	_scrollOffsetY = 0;
 

Modified: scummvm/trunk/engines/gob/game.cpp
===================================================================
--- scummvm/trunk/engines/gob/game.cpp	2009-08-08 20:49:54 UTC (rev 43146)
+++ scummvm/trunk/engines/gob/game.cpp	2009-08-08 21:43:07 UTC (rev 43147)
@@ -181,11 +181,13 @@
 
 	_handleMouse = 0;
 	_forceHandleMouse = 0;
-	_menuLevel = 0;
 	_noScroll = true;
 	_preventScroll = false;
-	_scrollHandleMouse = false;
 
+	_wantScroll  = false;
+	_wantScrollX = 0;
+	_wantScrollY = 0;
+
 	_tempStr[0] = 0;
 
 	_numEnvironments = 0;
@@ -360,9 +362,7 @@
 		_vm->_scenery->_pCaptureCounter = oldCaptureCounter;
 		_script->seek(_script->getFunctionOffset(skipPlay + 1));
 
-		_menuLevel++;
 		_vm->_inter->callSub(2);
-		_menuLevel--;
 
 		if (_vm->_inter->_terminate != 0)
 			_vm->_inter->_terminate = 2;
@@ -439,22 +439,27 @@
 	_vm->_sound->sampleFree(_vm->_sound->sampleGetBySlot(slot));
 }
 
-void Game::evaluateScroll(int16 x, int16 y) {
-	if (_preventScroll || !_scrollHandleMouse || (_menuLevel > 0))
+void Game::wantScroll(int16 x, int16 y) {
+	_wantScroll  = true;
+	_wantScrollX = x;
+	_wantScrollY = y;
+}
+
+void Game::evaluateScroll() {
+	if (_noScroll || _preventScroll || !_wantScroll)
 		return;
 
-	if (_noScroll ||
-	   ((_vm->_global->_videoMode != 0x14) && (_vm->_global->_videoMode != 0x18)))
+	if ((_vm->_global->_videoMode != 0x14) && (_vm->_global->_videoMode != 0x18))
 		return;
 
-	if ((x == 0) && (_vm->_draw->_scrollOffsetX > 0)) {
+	if ((_wantScrollX == 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->_video->dirtyRectsAll();
-	} else if ((y == 0) && (_vm->_draw->_scrollOffsetY > 0)) {
+	} else if ((_wantScrollY == 0) && (_vm->_draw->_scrollOffsetY > 0)) {
 		uint16 off;
 
 		off = MIN(_vm->_draw->_cursorHeight, _vm->_draw->_scrollOffsetY);
@@ -463,9 +468,9 @@
 		_vm->_video->dirtyRectsAll();
 	}
 
-	int16 cursorRight = x + _vm->_draw->_cursorWidth;
-	int16 screenRight = _vm->_draw->_scrollOffsetX + _vm->_width;
-	int16 cursorBottom = y + _vm->_draw->_cursorHeight;
+	int16 cursorRight  = _wantScrollX + _vm->_draw->_cursorWidth;
+	int16 screenRight  = _vm->_draw->_scrollOffsetX + _vm->_width;
+	int16 cursorBottom = _wantScrollY + _vm->_draw->_cursorHeight;
 	int16 screenBottom = _vm->_draw->_scrollOffsetY + _vm->_height;
 
 	if ((cursorRight >= _vm->_width) &&
@@ -479,7 +484,7 @@
 		_vm->_draw->_scrollOffsetX += off;
 		_vm->_video->dirtyRectsAll();
 
-		_vm->_util->setMousePos(_vm->_width - _vm->_draw->_cursorWidth, y);
+		_vm->_util->setMousePos(_vm->_width - _vm->_draw->_cursorWidth, _wantScrollY);
 	} else if ((cursorBottom >= (_vm->_height - _vm->_video->_splitHeight2)) &&
 			(screenBottom < _vm->_video->_surfHeight)) {
 		uint16 off;
@@ -491,11 +496,13 @@
 		_vm->_draw->_scrollOffsetY += off;
 		_vm->_video->dirtyRectsAll();
 
-		_vm->_util->setMousePos(x, _vm->_height - _vm->_video->_splitHeight2 -
-				_vm->_draw->_cursorHeight);
+		_vm->_util->setMousePos(_wantScrollX,
+				_vm->_height - _vm->_video->_splitHeight2 - _vm->_draw->_cursorHeight);
 	}
 
 	_vm->_util->setScrollOffset();
+
+	_wantScroll = false;
 }
 
 int16 Game::checkKeys(int16 *pMouseX, int16 *pMouseY,

Modified: scummvm/trunk/engines/gob/game.h
===================================================================
--- scummvm/trunk/engines/gob/game.h	2009-08-08 20:49:54 UTC (rev 43146)
+++ scummvm/trunk/engines/gob/game.h	2009-08-08 21:43:07 UTC (rev 43147)
@@ -82,8 +82,11 @@
 
 	bool _noScroll;
 	bool _preventScroll;
-	bool _scrollHandleMouse;
 
+	bool  _wantScroll;
+	int16 _wantScrollX;
+	int16 _wantScrollY;
+
 	byte _handleMouse;
 	char _forceHandleMouse;
 
@@ -99,7 +102,8 @@
 
 	void freeSoundSlot(int16 slot);
 
-	void evaluateScroll(int16 x, int16 y);
+	void wantScroll(int16 x, int16 y);
+	void evaluateScroll();
 
 	int16 checkKeys(int16 *pMousex = 0, int16 *pMouseY = 0,
 			MouseButtons *pButtons = 0, char handleMouse = 0);
@@ -109,8 +113,6 @@
 	void switchTotSub(int16 index, int16 skipPlay);
 
 protected:
-	uint32 _menuLevel;
-
 	char _tempStr[256];
 
 	// Capture

Modified: scummvm/trunk/engines/gob/hotspots.cpp
===================================================================
--- scummvm/trunk/engines/gob/hotspots.cpp	2009-08-08 20:49:54 UTC (rev 43146)
+++ scummvm/trunk/engines/gob/hotspots.cpp	2009-08-08 21:43:07 UTC (rev 43147)
@@ -628,8 +628,6 @@
 }
 
 uint16 Hotspots::check(uint8 handleMouse, int16 delay, uint16 &id, uint16 &index) {
-	_vm->_game->_scrollHandleMouse = handleMouse != 0;
-
 	if (delay >= -1) {
 		_currentKey   = 0;
 		_currentId    = 0;
@@ -679,6 +677,9 @@
 			_vm->_video->waitRetrace();
 		}
 
+		if (handleMouse)
+			_vm->_game->evaluateScroll();
+
 		// Update keyboard and mouse state
 		key = _vm->_game->checkKeys(&_vm->_global->_inter_mouseX,
 				&_vm->_global->_inter_mouseY, &_vm->_game->_mouseButtons, handleMouse);

Modified: scummvm/trunk/engines/gob/inter_v2.cpp
===================================================================
--- scummvm/trunk/engines/gob/inter_v2.cpp	2009-08-08 20:49:54 UTC (rev 43146)
+++ scummvm/trunk/engines/gob/inter_v2.cpp	2009-08-08 21:43:07 UTC (rev 43147)
@@ -935,6 +935,8 @@
 	offsetY = _vm->_game->_script->readValExpr();
 
 	if (offsetX == -1) {
+		_vm->_game->_preventScroll = !_vm->_game->_preventScroll;
+
 		WRITE_VAR(2, _vm->_draw->_scrollOffsetX);
 		WRITE_VAR(3, _vm->_draw->_scrollOffsetY);
 	} else {
@@ -996,11 +998,8 @@
 		close = false;
 	}
 
-	if (startFrame >= 0) {
-		_vm->_game->_preventScroll = true;
+	if (startFrame >= 0)
 		_vm->_vidPlayer->primaryPlay(startFrame, lastFrame, breakKey, palCmd, palStart, palEnd, 0);
-		_vm->_game->_preventScroll = false;
-	}
 
 	if (close)
 		_vm->_vidPlayer->primaryClose();

Modified: scummvm/trunk/engines/gob/inter_v4.cpp
===================================================================
--- scummvm/trunk/engines/gob/inter_v4.cpp	2009-08-08 20:49:54 UTC (rev 43146)
+++ scummvm/trunk/engines/gob/inter_v4.cpp	2009-08-08 21:43:07 UTC (rev 43147)
@@ -233,11 +233,8 @@
 		return;
 	}
 
-	if (startFrame >= 0) {
-		_vm->_game->_preventScroll = true;
+	if (startFrame >= 0)
 		_vm->_vidPlayer->primaryPlay(startFrame, lastFrame, breakKey, palCmd, palStart, palEnd, 0);
-		_vm->_game->_preventScroll = false;
-	}
 
 	if (close)
 		_vm->_vidPlayer->primaryClose();

Modified: scummvm/trunk/engines/gob/inter_v6.cpp
===================================================================
--- scummvm/trunk/engines/gob/inter_v6.cpp	2009-08-08 20:49:54 UTC (rev 43146)
+++ scummvm/trunk/engines/gob/inter_v6.cpp	2009-08-08 21:43:07 UTC (rev 43147)
@@ -164,12 +164,9 @@
 		return;
 	}
 
-	if (startFrame >= 0) {
-		_vm->_game->_preventScroll = true;
+	if (startFrame >= 0)
 		_vm->_vidPlayer->primaryPlay(startFrame, lastFrame, breakKey,
 				palCmd, palStart, palEnd, 0, -1, false, -1, true);
-		_vm->_game->_preventScroll = false;
-	}
 
 	if (close)
 		_vm->_vidPlayer->primaryClose();

Modified: scummvm/trunk/engines/gob/mult_v2.cpp
===================================================================
--- scummvm/trunk/engines/gob/mult_v2.cpp	2009-08-08 20:49:54 UTC (rev 43146)
+++ scummvm/trunk/engines/gob/mult_v2.cpp	2009-08-08 21:43:07 UTC (rev 43147)
@@ -1105,8 +1105,6 @@
 	int16 baseFrame, palFrame, lastFrame;
 	uint16 flags;
 
-	_vm->_game->_preventScroll = true;
-
 	if (_vm->_draw->_renderFlags & 0x100) {
 		x = VAR(55);
 		y = VAR(56);
@@ -1115,7 +1113,6 @@
 
 	if (key.imdFile == -1) {
 		_vm->_vidPlayer->primaryClose();
-		_vm->_game->_preventScroll = false;
 		return;
 	}
 
@@ -1131,15 +1128,12 @@
 	if ((palFrame != -1) && (lastFrame != -1))
 		if ((lastFrame - palFrame) < startFrame)
 			if (!(key.flags & 0x4000)) {
-				_vm->_game->_preventScroll = false;
 				_vm->_vidPlayer->primaryClose();
 				return;
 			}
 
-	if (!_vm->_vidPlayer->primaryOpen(imdFile, x, y, flags)) {
-		_vm->_game->_preventScroll = false;
+	if (!_vm->_vidPlayer->primaryOpen(imdFile, x, y, flags))
 		return;
-	}
 
 	if (palFrame == -1)
 		palFrame = 0;
@@ -1265,9 +1259,6 @@
 		}
 	}
 
-	if (!hasImds && (_vm->_draw->_showCursor == 3))
-		_vm->_game->_preventScroll = false;
-
 	doSoundAnim(stop, frame);
 	WRITE_VAR(22, frame);
 

Modified: scummvm/trunk/engines/gob/util.cpp
===================================================================
--- scummvm/trunk/engines/gob/util.cpp	2009-08-08 20:49:54 UTC (rev 43146)
+++ scummvm/trunk/engines/gob/util.cpp	2009-08-08 21:43:07 UTC (rev 43147)
@@ -141,7 +141,8 @@
 		y -= _vm->_video->_screenDeltaY;
 
 		_vm->_util->setMousePos(x, y);
-		_vm->_game->evaluateScroll(x, y);
+
+		_vm->_game->wantScroll(x, y);
 	}
 }
 


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list