diff options
Diffstat (limited to 'engines/mads/camera.cpp')
-rw-r--r-- | engines/mads/camera.cpp | 192 |
1 files changed, 192 insertions, 0 deletions
diff --git a/engines/mads/camera.cpp b/engines/mads/camera.cpp new file mode 100644 index 0000000000..c9b2f1429e --- /dev/null +++ b/engines/mads/camera.cpp @@ -0,0 +1,192 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "mads/mads.h" +#include "mads/camera.h" + +namespace MADS { + +Camera::Camera(MADSEngine *vm) : _vm(vm) { + _panAllowedFl = false; + _activeFl = false; + _currentFrameFl = false; + _manualFl = false; + _speed = -1; + _rate = -1; + _target = -1; + _distOffCenter = -1; + _startTolerance = -1; + _endTolerance = -1; + _direction = -1; + _timer = 0; +} + +void Camera::setDefaultPanX() { + _activeFl = false; + Scene &scene = _vm->_game->_scene; + _panAllowedFl = (scene._sceneInfo->_width > MADS_SCREEN_WIDTH); + + if (_panAllowedFl) { + _manualFl = false; + _rate = 4; + _speed = 4; + _target = 0; + _distOffCenter = 80; + _startTolerance = 80; + _endTolerance = 4; + _timer = scene._frameStartTime; + } +} + +void Camera::setDefaultPanY() { + _activeFl = false; + Scene &scene = _vm->_game->_scene; + _panAllowedFl = (scene._sceneInfo->_height > MADS_SCENE_HEIGHT); + + if (_panAllowedFl) { + _manualFl = true; + _rate = 4; + _speed = 2; + _target = 0; + _distOffCenter = 80; + _startTolerance = 60; + _endTolerance = 4; + _timer = scene._frameStartTime; + } +} + +void Camera::camPanTo(int target) { + if (_panAllowedFl) { + _activeFl = true; + _manualFl = true; + _target = target; + _timer = _vm->_game->_scene._frameStartTime; + } +} + +bool Camera::camPan(int16 *picture_view, int16 *player_loc, int display_size, int picture_size) { + bool panningFl = false; + if (_panAllowedFl) { + Scene &scene = _vm->_game->_scene; + Player &player = _vm->_game->_player; + + _currentFrameFl = false; + + uint32 timer; + if ((abs((int32) (_timer - player._priorTimer)) < _rate) && (player._ticksAmount == _rate)) + timer = player._priorTimer; + else + timer = _timer; + + if (_activeFl && (scene._frameStartTime < timer)) + return (panningFl); + + _timer = scene._frameStartTime + _rate; + + if (_manualFl) { + if (_activeFl) { + int diff = _target - *picture_view; + int direction = 0; + if (diff < 0) + direction = -1; + else if (diff > 0) + direction = 1; + + int magnitude = MIN(abs(diff), _speed); + + if (magnitude == 0) + _activeFl = false; + else { + int panAmount; + if (direction < 0) + panAmount = -magnitude; + else + panAmount = magnitude; + + *picture_view += panAmount; + + panningFl = true; + _currentFrameFl = true; + } + } + } else { + if (!_activeFl) { + int lowEdge = *picture_view + _startTolerance; + int highEdge = *picture_view - _startTolerance + display_size - 1; + + if ((*player_loc < lowEdge) && (*picture_view > 0)) { + _activeFl = true; + _direction = -1; + } + + if ((*player_loc > highEdge) && (*picture_view < (picture_size - display_size))) { + _activeFl = true; + _direction = 1; + } + } + + int newTarget = *player_loc - (display_size >> 1); + + if (_direction < 0) + newTarget -= _distOffCenter; + else + newTarget += _distOffCenter; + + newTarget = MAX(0, newTarget); + newTarget = MIN(newTarget, (picture_size - display_size)); + + _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 (_activeFl && (magnitude <= _endTolerance)) + _activeFl = false; + + if (_activeFl) { + magnitude = MIN(magnitude, _speed); + + int panAmount; + if (direction < 0) + panAmount = -magnitude; + else + panAmount = magnitude; + + if (panAmount) { + *picture_view += panAmount; + panningFl = true; + _currentFrameFl = true; + } + } + } + } + + return (panningFl); +} + +} // End of namespace MADS |