diff options
Diffstat (limited to 'engines/mads/game.cpp')
-rw-r--r-- | engines/mads/game.cpp | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/engines/mads/game.cpp b/engines/mads/game.cpp index 5ffe3ec9e6..607b7a44a6 100644 --- a/engines/mads/game.cpp +++ b/engines/mads/game.cpp @@ -705,4 +705,120 @@ void Game::camSetSpeed() { } } +void Game::camUpdate() { + bool any_pan = camPan(&_camX, &_scene._posAdjust.x, &_player._playerPos.x, 320, _scene._sceneInfo->_width); + any_pan |= camPan(&_camY, &_scene._posAdjust.y, &_player._playerPos.y, 156, _scene._sceneInfo->_height); + + if (any_pan) { + _scene.setCamera(_scene._posAdjust); + _screenObjects._forceRescan = true; + } +} + +bool Game::camPan(Camera *camera, int16 *picture_view, int16 *player_loc, int display_size, int picture_size) { + if (!camera) + return false; + + bool panningFl = false; + if (camera->_panAllowedFl) { + camera->_currentFrameFl = false; + + uint32 timer; + if ((abs((int32) (camera->_timer - _player._priorTimer)) < camera->_rate) && (_player._ticksAmount == camera->_rate)) + timer = _player._priorTimer; + else + timer = camera->_timer; + + if (camera->_activeFl && (_scene._frameStartTime < timer)) + return (panningFl); + + camera->_timer = _scene._frameStartTime + camera->_rate; + + if (camera->_manualFl) { + if (camera->_activeFl) { + int diff = camera->_target - *picture_view; + int direction = 0; + if (diff < 0) + direction = -1; + else if (diff > 0) + direction = 1; + + int magnitude = MIN(abs(diff), camera->_speed); + + if (magnitude == 0) + camera->_activeFl = false; + else { + int panAmount; + if (direction < 0) + panAmount = -magnitude; + else + panAmount = magnitude; + + *picture_view += panAmount; + + panningFl = true; + camera->_currentFrameFl = true; + } + } + } else { + if (!camera->_activeFl) { + int lowEdge = *picture_view + camera->_startTolerance; + int highEdge = *picture_view - camera->_startTolerance + display_size - 1; + + if ((*player_loc < lowEdge) && (picture_view > 0)) { + camera->_activeFl = true; + camera->_direction = -1; + } + + if ((*player_loc > highEdge) && (*picture_view < (picture_size - display_size))) { + camera->_activeFl = true; + camera->_direction = 1; + } + } + + int newTarget = *player_loc - (display_size >> 1); + + if (camera->_direction < 0) + newTarget -= camera->_distOffCenter; + else + newTarget += camera->_distOffCenter; + + newTarget = MAX(0, newTarget); + newTarget = MIN(newTarget, (picture_size - display_size)); + + camera->_target = newTarget; + + int diff = newTarget - *picture_view; + int magnitude = abs(diff); + + int direction = 0; + if (diff < 0) + direction = -1; + else if (diff > 0) + direction = 1; + + if (camera->_activeFl && (magnitude <= camera->_endTolerance)) + camera->_activeFl = false; + + if (camera->_activeFl) { + magnitude = MIN(magnitude, camera->_speed); + + int panAmount; + if (direction < 0) + panAmount = -magnitude; + else + panAmount = magnitude; + + if (panAmount) { + *picture_view += panAmount; + panningFl = true; + camera->_currentFrameFl = true; + } + } + } + } + + return (panningFl); +} + } // End of namespace MADS |