From 92c49a857161b1650ca197c71668ee189d667e48 Mon Sep 17 00:00:00 2001 From: Thomas Fach-Pedersen Date: Sun, 4 Mar 2018 12:35:30 +0100 Subject: BLADERUNNER: Add scene resume --- engines/bladerunner/scene.cpp | 60 +++++++++++++++++++++++++++++++++++++++---- 1 file changed, 55 insertions(+), 5 deletions(-) (limited to 'engines/bladerunner/scene.cpp') diff --git a/engines/bladerunner/scene.cpp b/engines/bladerunner/scene.cpp index 0a4877e45a..123134ed96 100644 --- a/engines/bladerunner/scene.cpp +++ b/engines/bladerunner/scene.cpp @@ -38,6 +38,7 @@ #include "bladerunner/script/scene_script.h" #include "bladerunner/ui/spinner.h" #include "bladerunner/vqa_player.h" +#include "bladerunner/zbuffer.h" #include "common/str.h" @@ -128,7 +129,7 @@ bool Scene::open(int setId, int sceneId, bool isLoadingGame) { _vm->_sliceRenderer->setView(_vm->_view); if (isLoadingGame) { - // TODO: Advance VQA frame + resume(true); if (sceneId == kScenePS10 || sceneId == kScenePS11 || sceneId == kScenePS12 || sceneId == kScenePS13) { // police maze? _vm->_sceneScript->sceneLoaded(); } @@ -140,11 +141,9 @@ bool Scene::open(int setId, int sceneId, bool isLoadingGame) { } if (_specialLoopMode == kSceneLoopModeNone) { - _vqaPlayer->setLoop(_defaultLoop, -1, kLoopSetModeImmediate, nullptr, nullptr); - _defaultLoopSet = true; - _defaultLoopPreloadedSet = false; + startDefaultLoop(); } - _vm->_scene->advanceFrame(); + advanceFrame(); _vm->_playerActor->setAtXYZ(_actorStartPosition, _actorStartFacing); _vm->_playerActor->setSetId(setId); @@ -244,6 +243,57 @@ int Scene::advanceFrame() { return frame; } +void Scene::resume(bool isLoadingGame) { + if (!_vqaPlayer) { + return; + } + + int targetFrame = _frame; + + if (!isLoadingGame) { + _vm->_zbuffer->disable(); + } + + if (_specialLoopMode == kSceneLoopModeNone) { + startDefaultLoop(); + } else { + if (_specialLoopMode == kSceneLoopModeChangeSet) { + _vm->_settings->setNewSetAndScene(_setId, _sceneId); + } + if (_defaultLoopPreloadedSet) { + _specialLoopMode = kSceneLoopModeNone; + startDefaultLoop(); + advanceFrame(); + loopStartSpecial(_specialLoopMode, _specialLoop, false); + } else { + _defaultLoopPreloadedSet = true; + loopStartSpecial(_specialLoopMode, _specialLoop, true); + if (_specialLoopMode == kSceneLoopModeLoseControl || _specialLoopMode == kSceneLoopModeChangeSet) { + _vm->playerGainsControl(); + + } + } + if (_specialLoopMode == kSceneLoopModeChangeSet) { + _vm->_settings->clearNewSetAndScene(); + } + } + + int frame; + do { + frame = advanceFrame(); + } while (frame >= 0 && frame != targetFrame); + + if (!isLoadingGame) { + _vm->_zbuffer->enable(); + } +} + +void Scene::startDefaultLoop() { + _vqaPlayer->setLoop(_defaultLoop, -1, kLoopSetModeImmediate, nullptr, nullptr); + _defaultLoopSet = true; + _defaultLoopPreloadedSet = false; +} + void Scene::setActorStart(Vector3 position, int facing) { _actorStartPosition = position; _actorStartFacing = facing; -- cgit v1.2.3