aboutsummaryrefslogtreecommitdiff
path: root/engines/bladerunner/scene.cpp
diff options
context:
space:
mode:
authorThomas Fach-Pedersen2018-03-04 12:35:30 +0100
committerThomas Fach-Pedersen2018-03-04 13:30:26 +0100
commit92c49a857161b1650ca197c71668ee189d667e48 (patch)
tree956abc0c31439f6b577bcccff2324a39828193d1 /engines/bladerunner/scene.cpp
parentb32e9116da8c149f1fc228f779b73a2170e05210 (diff)
downloadscummvm-rg350-92c49a857161b1650ca197c71668ee189d667e48.tar.gz
scummvm-rg350-92c49a857161b1650ca197c71668ee189d667e48.tar.bz2
scummvm-rg350-92c49a857161b1650ca197c71668ee189d667e48.zip
BLADERUNNER: Add scene resume
Diffstat (limited to 'engines/bladerunner/scene.cpp')
-rw-r--r--engines/bladerunner/scene.cpp60
1 files changed, 55 insertions, 5 deletions
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;