diff options
Diffstat (limited to 'engines/mads/game.cpp')
-rw-r--r-- | engines/mads/game.cpp | 230 |
1 files changed, 227 insertions, 3 deletions
diff --git a/engines/mads/game.cpp b/engines/mads/game.cpp index 91f6cd5630..607b7a44a6 100644 --- a/engines/mads/game.cpp +++ b/engines/mads/game.cpp @@ -58,7 +58,7 @@ Game *Game::init(MADSEngine *vm) { Game::Game(MADSEngine *vm) : _vm(vm), _surface(nullptr), _objects(vm), _scene(vm), - _screenObjects(vm), _player(vm) { + _screenObjects(vm), _player(vm) { _sectionNumber = 1; _priorSectionNumber = 0; _loadGameSlot = -1; @@ -82,6 +82,7 @@ Game::Game(MADSEngine *vm) _winStatus = 0; _widepipeCtr = 0; _fx = kTransitionNone; + _panningSpeed = 1; // Medium speed // Load the inventory object list _objects.load(); @@ -218,6 +219,10 @@ void Game::sectionLoop() { } _scene.loadScene(_scene._nextSceneId, _aaName, 0); + camInitDefault(); + camSetSpeed(); + + _vm->_sound->pauseNewCommands(); if (!_player._spritesLoaded) { @@ -297,8 +302,10 @@ void Game::sectionLoop() { _vm->_events->waitCursor(); _kernelMode = KERNEL_ROOM_PRELOAD; - delete _scene._activeAnimation; - _scene._activeAnimation = nullptr; + for (int i = 0; i < 10; i++) { + delete _scene._animation[i]; + _scene._animation[i] = nullptr; + } _scene._reloadSceneFlag = false; @@ -597,4 +604,221 @@ void Game::createThumbnail() { ::createThumbnail(_saveThumb, _vm->_screen.getData(), MADS_SCREEN_WIDTH, MADS_SCREEN_HEIGHT, thumbPalette); } +void Game::syncTimers(SyncType slaveType, int slaveId, SyncType masterType, int masterId) { + uint32 syncTime = 0; + + switch (masterType) { + case SYNC_SEQ: + syncTime = _scene._sequences[masterId]._timeout; + break; + + case SYNC_ANIM: + syncTime = _scene._animation[masterId]->getNextFrameTimer(); + break; + + case SYNC_CLOCK: + syncTime = _scene._frameStartTime + masterId; + break; + + case SYNC_PLAYER: + syncTime = _player._priorTimer; + break; + } + + + switch (slaveType) { + case SYNC_SEQ: + _scene._sequences[slaveId]._timeout = syncTime; + break; + + case SYNC_PLAYER: + _player._priorTimer = syncTime; + break; + + case SYNC_ANIM: + _scene._animation[slaveId]->setNextFrameTimer(syncTime); + break; + + case SYNC_CLOCK: + error("syncTimer is trying to force _frameStartTime"); + } +} + +void Game::camPanTo(Camera *camera, int target) { + if (!camera) + return; + + if (camera->_panAllowedFl) { + camera->_activeFl = true; + camera->_manualFl = true; + camera->_target = target; + camera->_timer = _scene._frameStartTime; + } +} + +void Game::camInitDefault() { + _camX._activeFl = false; + _camY._activeFl = false; + + _camX._panAllowedFl = (_scene._sceneInfo->_width > MADS_SCREEN_WIDTH); + _camY._panAllowedFl = (_scene._sceneInfo->_height > MADS_SCENE_HEIGHT); + + if (_camX._panAllowedFl) { + _camX._manualFl = false; + _camX._rate = 4; + _camX._speed = 4; + _camX._target = 0; + _camX._distOffCenter = 80; + _camX._startTolerance = 80; + _camX._endTolerance = 4; + _camX._timer = _scene._frameStartTime; + } + + if (_camY._panAllowedFl) { + _camY._manualFl = true; + _camY._rate = 4; + _camY._speed = 2; + _camY._target = 0; + _camY._distOffCenter = 80; + _camY._startTolerance = 60; + _camY._endTolerance = 4; + _camY._timer = _scene._frameStartTime; + } +} + +void Game::camSetSpeed() { + switch (_panningSpeed) { + case 1: + _camX._speed = 8; + _camY._speed = 4; + break; + + case 2: + _camX._speed = 320; + _camY._speed = 160; + break; + + default: + _camX._speed = 4; + _camY._speed = 2; + break; + } +} + +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 |