diff options
| -rw-r--r-- | engines/draci/game.cpp | 64 | 
1 files changed, 38 insertions, 26 deletions
diff --git a/engines/draci/game.cpp b/engines/draci/game.cpp index 4f7f191f84..ea6e0aa9c6 100644 --- a/engines/draci/game.cpp +++ b/engines/draci/game.cpp @@ -232,6 +232,7 @@ void Game::init() {  	rememberRoomNumAsPrevious();  	scheduleEnteringRoomUsingGate(_info._startRoom, 0);  	_pushedNewRoom = _pushedNewGate = -1; +	_mouseChangeTick = -1;  }  void Game::handleOrdinaryLoop(int x, int y) { @@ -539,45 +540,56 @@ void Game::loop(LoopSubstatus substatus, bool shouldExit) {  }  void Game::handleStatusChangeByMouse() { +	const int mouseY = _vm->_mouse->getPosY();  	bool wantsChange = false;  	if (_loopStatus == kStatusOrdinary) { -		wantsChange = _vm->_mouse->getPosY() == 0; +		if (getRoomNum() == getMapRoom()) { +			wantsChange = mouseY >= kScreenHeight - 1; +		} else { +			wantsChange = mouseY == 0 || mouseY >= kScreenHeight - 1; +		}  	} else if (_loopStatus == kStatusInventory) { -		wantsChange = _animUnderCursor != _inventoryAnim && !_itemUnderCursor && _vm->_mouse->getPosY() != 0; +		wantsChange = _animUnderCursor != _inventoryAnim && !_itemUnderCursor && mouseY != 0;  	}  	if (!wantsChange) {  		// Disable the timer.  		_mouseChangeTick = -1; -	} else { -		if (_mouseChangeTick == -1) { -			// If the timer is currently disabled, this is the -			// first time when the mouse left the region.  Start -			// counting. -			_mouseChangeTick = _vm->_system->getMillis(); -		} else if (_mouseChangeTick == -2) { -			// Do nothing.  This exception is good when the -			// inventory visibility flag is flipped by the key 'I' -			// instead of by moving the mouse.  Even if the mouse -			// starts in the outside region, the timeout won't kick -			// in until it moves into the inside region for the -			// first time. -		} else if (_vm->_system->getMillis() - _mouseChangeTick >= kStatusChangeTimeout) { -			if (_loopStatus == kStatusOrdinary) { +	 +	// Otherwise the mouse signalizes that the mode should be changed. +	} else if (_mouseChangeTick == -1) { +		// If the timer is currently disabled, this is the first time +		// when the mouse left the region.  Start counting. +		_mouseChangeTick = _vm->_system->getMillis(); +	} else if (_mouseChangeTick == -2) { +		// Do nothing.  This exception is good when the status has just +		// changed.  Even if the mouse starts in the outside region +		// (e.g., due to flipping the change by a key or due to +		// flipping back being triggered by the same hot area), the +		// timeout won't kick in until it moves into the inside region +		// for the first time. +	} else if (_vm->_system->getMillis() - _mouseChangeTick >= kStatusChangeTimeout) { +		if (_loopStatus == kStatusOrdinary) { +			if (getRoomNum() == getMapRoom()) { +				scheduleEnteringRoomUsingGate(getPreviousRoomNum(), 0); +				_mouseChangeTick = -2; +			} else if (mouseY >= kScreenHeight - 1) { +				scheduleEnteringRoomUsingGate(getMapRoom(), 0); +				_mouseChangeTick = -2; +			} else if (mouseY == 0) {  				inventoryInit(); -			} else { -				inventoryDone();  			} +		} else { +			inventoryDone();  		}  	} -	// We don't implement the original game player's main -	// menu that pops up when the mouse gets to the bottom -	// of the screen.  It contains icons for displaying the map, -	// loading/saving the game, quiting the game, and displaying the -	// credits.  The essential options are implemented in ScummVM's main -	// menu, I don't wanna implement the credits, and for map we key the -	// key 'M'. +	// We don't implement the original game player's main menu that pops up +	// when the mouse gets to the bottom of the screen.  It contains icons +	// for displaying the map, loading/saving the game, quiting the game, +	// and displaying the credits.  The essential options are implemented +	// in ScummVM's main menu, I don't wanna implement the credits, and so +	// I allocate the whole bottom line for switching to/from the map.  }  void Game::updateOrdinaryCursor() {  | 
