aboutsummaryrefslogtreecommitdiff
path: root/engines/bladerunner/scene.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/bladerunner/scene.cpp')
-rw-r--r--engines/bladerunner/scene.cpp116
1 files changed, 85 insertions, 31 deletions
diff --git a/engines/bladerunner/scene.cpp b/engines/bladerunner/scene.cpp
index a629b4263b..c29a6345cc 100644
--- a/engines/bladerunner/scene.cpp
+++ b/engines/bladerunner/scene.cpp
@@ -29,6 +29,7 @@
#include "bladerunner/chapters.h"
#include "bladerunner/gameinfo.h"
#include "bladerunner/items.h"
+#include "bladerunner/settings.h"
#include "bladerunner/scene_objects.h"
#include "bladerunner/script/script.h"
#include "bladerunner/slice_renderer.h"
@@ -56,8 +57,8 @@ bool Scene::open(int setId, int sceneId, bool isLoadingGame) {
// TODO: Clear regions
// TODO: Destroy all overlays
_defaultLoop = 0;
- _defaultLoopSet = 0;
- _field_20_loop_stuff = 0;
+ _defaultLoopSet = false;
+ _specialLoopAtEnd = false;
_specialLoopMode = -1;
_specialLoop = -1;
_frame = -1;
@@ -76,9 +77,6 @@ bool Scene::open(int setId, int sceneId, bool isLoadingGame) {
_vqaPlayer = new VQAPlayer(_vm);
- if (!_vqaPlayer->open(vqaName))
- return false;
-
Common::String sceneName = _vm->_gameInfo->getSceneName(sceneId);
if (!_vm->_script->open(sceneName))
return false;
@@ -99,8 +97,15 @@ bool Scene::open(int setId, int sceneId, bool isLoadingGame) {
return true;
}
- // TODO: set VQADecoder parameters
- //_vm->_scene->advanceFrame(0, 0);
+ if (!_vqaPlayer->open(vqaName))
+ return false;
+
+ if (_specialLoop == -1) {
+ _vqaPlayer->setLoop(_defaultLoop, -1, 2, nullptr, nullptr);
+ _defaultLoopSet = true;
+ _specialLoopAtEnd = false;
+ }
+ _vm->_scene->advanceFrame(_vm->_surface1, _vm->_zBuffer1);
_vm->_playerActor->setAtXYZ(_actorStartPosition, _actorStartFacing);
//_vm->_playerActor->setSetId(setId);
@@ -148,6 +153,7 @@ bool Scene::close(bool isLoadingGame) {
if (isLoadingGame) {
_vm->_script->PlayerWalkedOut();
}
+
// if (SceneScript_isLoaded() && !SceneScript_unload()) {
// result = false;
// }
@@ -171,18 +177,26 @@ int Scene::advanceFrame(Graphics::Surface &surface, uint16 *&zBuffer) {
_vqaPlayer->updateLights(_vm->_lights);
}
- if (frame < 0) {
- return frame;
+ if (_specialLoopMode && _specialLoopMode != 2 && _specialLoopMode != 3) {
+ if (_specialLoopMode == 1) {
+ if (frame == -3) { // TODO: when will this happen? bad data in/eof of vqa
+ _vm->_settings->setNewSetAndScene(_nextSetId, _nextSceneId);
+ _vm->playerGainsControl();
+ }
+ } else if (!_specialLoopAtEnd) {
+ _vqaPlayer->setLoop(_defaultLoop + 1, -1, 0, &Scene::loopEndedStatic, this);
+ _specialLoopAtEnd = true;
+ }
+ } else if (!this->_defaultLoopSet) {
+ _vqaPlayer->setLoop(_defaultLoop, -1, 1, &Scene::loopEndedStatic, this);
+ _defaultLoopSet = true;
+ if (_specialLoopMode == 0) {
+ _vm->playerLosesControl();
+ }
}
- _frame = frame;
- if (_specialLoopMode == 0 && frame == _vqaPlayer->getLoopEndFrame(_specialLoop)) {
- _playerWalkedIn = true;
- _specialLoopMode = -1;
- }
- if (_specialLoopMode == 0 && !_defaultLoopSet) {
- _vqaPlayer->setLoop(_defaultLoop + 1);
- _defaultLoopSet = true;
+ if (frame >= 0) {
+ _frame = frame;
}
return frame;
@@ -193,25 +207,32 @@ void Scene::setActorStart(Vector3 position, int facing) {
_actorStartFacing = facing;
}
-void Scene::loopSetDefault(int a) {
- // warning("\t\t\tScene::loopSetDefault(%d)", a);
- _defaultLoop = a;
+void Scene::loopSetDefault(int loopId) {
+ _defaultLoop = loopId;
}
-void Scene::loopStartSpecial(int a, int b, int c) {
- // warning("\t\t\tScene::loopStartSpecial(%d, %d, %d)", a, b, c);
- _specialLoopMode = a;
- _specialLoop = b;
+void Scene::loopStartSpecial(int specialLoopMode, int loopId, int flags) {
+ _specialLoopMode = specialLoopMode;
+ _specialLoop = loopId;
- if (_specialLoop == 1) {
- // a1->on_loop_end_switch_to_set_id = sub_42BE08_options_get_set_enter_arg_1(&unk_48E910_options);
- // a1->on_loop_end_switch_to_scene_id = sub_42BE00_options_get_set_enter_arg_2(&unk_48E910_options);
+ int unknown = -1;
+ if (_specialLoopMode == 1) {
+ unknown = 0;
}
- if (c) {
- // _field_20_loop_stuff = 1;
- // v6 = a1->_field_28_loop_special_loop_number;
- // sub_453434_scene_method_loop(a1);
+ int loopMode = 1;
+ if (flags) {
+ loopMode = 2;
+ }
+
+ _vqaPlayer->setLoop(_specialLoop, unknown, loopMode, &Scene::loopEndedStatic, this);
+ if (_specialLoopMode == 1) {
+ this->_nextSetId = _vm->_settings->getNewSet();
+ this->_nextSceneId = _vm->_settings->getNewScene();
+ }
+ if (flags) {
+ this->_specialLoopAtEnd = true;
+ loopEnded(0, _specialLoop);
}
}
@@ -265,4 +286,37 @@ const char *Scene::objectGetName(int objectId) {
return _set->objectGetName(objectId);
}
+void Scene::loopEnded(int frame, int loopId) {
+ if (_specialLoopMode && _specialLoopMode != 2 && _specialLoopMode != 3) {
+ if (_specialLoopMode == 1) {
+ _defaultLoopSet = true;
+ _specialLoopAtEnd = false;
+ _vm->playerLosesControl();
+ }
+ } else if (_specialLoopAtEnd) {
+ _vqaPlayer->setLoop(_defaultLoop, -1, 1, &Scene::loopEndedStatic, this);
+ _defaultLoopSet = true;
+ _specialLoopAtEnd = false;
+ if (_specialLoopMode == 0) {
+ _vm->playerLosesControl();
+ }
+ } else {
+ if (_specialLoopMode == 0) {
+ _vm->playerGainsControl();
+ _playerWalkedIn = true;
+ }
+ if (_specialLoopMode == 3) {
+ //TODO:
+ //spinner::open(Spinner);
+ }
+ _specialLoopMode = -1;
+ _specialLoop = -1;
+ _vqaPlayer->setLoop(_defaultLoop + 1, -1, 0, nullptr, nullptr);
+ _specialLoopAtEnd = true;
+ }
+}
+
+void Scene::loopEndedStatic(void *data, int frame, int loopId) {
+ ((Scene*)data)->loopEnded(frame, loopId);
+}
} // End of namespace BladeRunner