aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/bladerunner/actor_clues.cpp6
-rw-r--r--engines/bladerunner/bladerunner.cpp9
-rw-r--r--engines/bladerunner/light.cpp11
-rw-r--r--engines/bladerunner/scene.cpp116
-rw-r--r--engines/bladerunner/scene.h12
-rw-r--r--engines/bladerunner/scene_objects.cpp3
-rw-r--r--engines/bladerunner/script/script.cpp31
-rw-r--r--engines/bladerunner/set_effects.cpp4
-rw-r--r--engines/bladerunner/vqa_player.cpp8
-rw-r--r--engines/bladerunner/vqa_player.h10
10 files changed, 148 insertions, 62 deletions
diff --git a/engines/bladerunner/actor_clues.cpp b/engines/bladerunner/actor_clues.cpp
index a84d54906b..f9a4389b71 100644
--- a/engines/bladerunner/actor_clues.cpp
+++ b/engines/bladerunner/actor_clues.cpp
@@ -67,9 +67,7 @@ ActorClues::ActorClues(BladeRunnerEngine *vm, int cluesType) {
}
ActorClues::~ActorClues() {
- if (_clues) {
- delete[] _clues;
- }
+ delete[] _clues;
_maxCount = 0;
_count = 0;
@@ -78,7 +76,7 @@ ActorClues::~ActorClues() {
void ActorClues::acquire(int clueId, char flag2, int fromActorId) {
int clueIndex = findClueIndex(clueId);
_clues[clueIndex]._flags |= 0x01;
- _clues[_count]._flags = (_clues[_count]._flags & ~0x02) | ((flag2 << 1) & 0x02);
+ _clues[clueIndex]._flags = (_clues[clueIndex]._flags & ~0x02) | ((flag2 << 1) & 0x02);
_clues[clueIndex]._fromActorId = fromActorId;
debug("Actor acquired clue: \"%s\" from %d", _vm->_crimesDatabase->getClueText(clueId), fromActorId);
diff --git a/engines/bladerunner/bladerunner.cpp b/engines/bladerunner/bladerunner.cpp
index 33110c07de..e60fe77d26 100644
--- a/engines/bladerunner/bladerunner.cpp
+++ b/engines/bladerunner/bladerunner.cpp
@@ -457,6 +457,8 @@ void BladeRunnerEngine::shutdown() {
// TODO: Delete sine and cosine lookup tables
// TODO: Unload AI dll
+ delete _aiScripts;
+ _aiScripts = nullptr;
delete[] _gameVars;
_gameVars = nullptr;
@@ -481,7 +483,12 @@ void BladeRunnerEngine::shutdown() {
// TODO: Delete datetime - not used
- // TODO: Delete actors
+ int actorCount = (int)_gameInfo->getActorCount();
+ for (int i = 0; i != actorCount; ++i) {
+ delete _actors[i];
+ _actors[i] = nullptr;
+ }
+ _playerActor = nullptr;
// TODO: Delete proper ZBuf class
delete[] _zBuffer1;
diff --git a/engines/bladerunner/light.cpp b/engines/bladerunner/light.cpp
index 08eb8ab5be..8be8d0112b 100644
--- a/engines/bladerunner/light.cpp
+++ b/engines/bladerunner/light.cpp
@@ -27,9 +27,13 @@
namespace BladeRunner {
Light::Light() {
+ _animationData = nullptr;
}
Light::~Light() {
+ if (_animationData != nullptr) {
+ delete[] _animationData;
+ }
}
void Light::read(Common::ReadStream *stream, int framesCount, int frame, int animated) {
@@ -43,6 +47,9 @@ void Light::read(Common::ReadStream *stream, int framesCount, int frame, int ani
_animatedParameters = stream->readUint32LE();
+ if (_animationData != nullptr) {
+ delete[] _animationData;
+ }
int floatsCount = size / 4;
_animationData = new float[floatsCount];
for (int i = 0; i < floatsCount; i++) {
@@ -80,6 +87,10 @@ void Light::readVqa(Common::ReadStream *stream, int framesCount, int frame, int
int size = stream->readUint32LE();
+ if(_animationData != nullptr) {
+ delete[] _animationData;
+ }
+
int floatsCount = size / 4;
_animationData = new float[floatsCount];
for (int i = 0; i < floatsCount; i++) {
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
diff --git a/engines/bladerunner/scene.h b/engines/bladerunner/scene.h
index 6a34fcd249..5bc25fc6fc 100644
--- a/engines/bladerunner/scene.h
+++ b/engines/bladerunner/scene.h
@@ -44,10 +44,10 @@ public:
VQAPlayer *_vqaPlayer;
int _defaultLoop;
- int _defaultLoopSet;
- int _field_20_loop_stuff;
+ bool _defaultLoopSet;
int _specialLoopMode;
int _specialLoop;
+ bool _specialLoopAtEnd;
int _introFinished;
int _nextSetId;
int _nextSceneId;
@@ -83,9 +83,7 @@ public:
delete _set;
delete _regions;
delete _exits;
- if (_vqaPlayer != nullptr) {
- delete _vqaPlayer;
- }
+ delete _vqaPlayer;
}
bool open(int setId, int sceneId, bool isLoadingGame);
@@ -109,6 +107,10 @@ public:
void objectSetIsObstacleAll(bool isObstacle, bool sceneLoaded);
void objectSetIsTarget(int objectId, bool isTarget, bool sceneLoaded);
const char *objectGetName(int objectId);
+
+private:
+ void loopEnded(int frame, int loopId);
+ static void loopEndedStatic(void* data, int frame, int loopId);
};
} // End of namespace BladeRunner
diff --git a/engines/bladerunner/scene_objects.cpp b/engines/bladerunner/scene_objects.cpp
index 6d10edd83f..c55097358d 100644
--- a/engines/bladerunner/scene_objects.cpp
+++ b/engines/bladerunner/scene_objects.cpp
@@ -65,6 +65,7 @@ void SceneObjects::clear() {
_sceneObjects[i]._isMoving = 0;
_sceneObjects[i]._isRetired = 0;
}
+ _count = 0;
}
bool SceneObjects::addActor(int sceneObjectId, BoundingBox *boundingBox, Common::Rect *screenRectangle, uint8 isClickable, uint8 isMoving, uint8 isTarget, uint8 isRetired) {
@@ -207,7 +208,7 @@ bool SceneObjects::addSceneObject(int sceneObjectId, SceneObjectType sceneObject
break;
}
}
- for (int j = _count - 1; j >= i; --j) {
+ for (int j = _count - 2; j >= i; --j) {
_sceneObjectsSortedByDistance[j + 1] = _sceneObjectsSortedByDistance[j];
}
diff --git a/engines/bladerunner/script/script.cpp b/engines/bladerunner/script/script.cpp
index b0bb638440..45b23120d5 100644
--- a/engines/bladerunner/script/script.cpp
+++ b/engines/bladerunner/script/script.cpp
@@ -55,14 +55,12 @@ namespace BladeRunner {
bool Script::open(const Common::String &name) {
delete _currentScript;
-
if (name == "RC01") { _currentScript = new ScriptRC01(_vm); return true; }
if (name == "RC02") { _currentScript = new ScriptRC02(_vm); return true; }
if (name == "RC03") { _currentScript = new ScriptRC03(_vm); return true; }
if (name == "RC04") { _currentScript = new ScriptRC04(_vm); return true; }
if (name == "RC51") { _currentScript = new ScriptRC51(_vm); return true; }
-
return false;
}
@@ -916,18 +914,18 @@ void ScriptBase::Overlay_Remove(const char *overlay) {
warning("Overlay_Remove(%s)", overlay);
}
-void ScriptBase::Scene_Loop_Set_Default(int a) {
- // debug("Scene_Loop_Set_Default(%d)", a);
-
- _vm->_scene->loopSetDefault(a);
- // _vm->_scene->_defaultLoop = a;
+void ScriptBase::Scene_Loop_Set_Default(int loopId) {
+ _vm->_scene->loopSetDefault(loopId);
}
-void ScriptBase::Scene_Loop_Start_Special(int a, int b, int c) {
- // debug("Scene_Loop_Start_Special(%d, %d, %d)", a, b, c);
-
- _vm->_scene->loopStartSpecial(a, b, c);
- // _vm->_scene->_field_24_loop_start_special_param_1 = a;
+void ScriptBase::Scene_Loop_Start_Special(int sceneLoopMode, int loopId, int c) {
+ if (sceneLoopMode == 1) {
+ c = 1;
+ }
+ _vm->_scene->loopStartSpecial(sceneLoopMode, loopId, c);
+ if (sceneLoopMode == 1) {
+ _vm->_settings->clearNewSetAndScene();
+ }
}
void ScriptBase::Outtake_Play(int id, int noLocalization, int container) {
@@ -1427,12 +1425,19 @@ void ScriptBase::VK_Play_Speech_Line(int actorIndex, int a2, float a3) {
AIScripts::AIScripts(BladeRunnerEngine *vm) : _vm(vm), _inScriptCounter(0) {
for (int i = 0; i != 100; ++i)
- _AIScripts[i] = 0;
+ _AIScripts[i] = nullptr;
_AIScripts[0] = new AIScript_McCoy(_vm);
_AIScripts[23] = new AIScript_Officer_Leroy(_vm);
}
+AIScripts::~AIScripts() {
+ for (int i = 0; i != 100; ++i) {
+ delete _AIScripts[i];
+ _AIScripts[i] = nullptr;
+ }
+}
+
void AIScripts::Initialize(int actor) {
if (_AIScripts[actor])
_AIScripts[actor]->Initialize();
diff --git a/engines/bladerunner/set_effects.cpp b/engines/bladerunner/set_effects.cpp
index 54894e2a1c..c4038f6726 100644
--- a/engines/bladerunner/set_effects.cpp
+++ b/engines/bladerunner/set_effects.cpp
@@ -38,7 +38,7 @@ SetEffects::SetEffects(BladeRunnerEngine *vm) {
_fadeDensity = 0.0f;
_fogsCount = 0;
- _fogs = NULL;
+ _fogs = nullptr;
}
SetEffects::~SetEffects() {
@@ -55,7 +55,7 @@ void SetEffects::read(Common::ReadStream *stream, int framesCount) {
int i;
for (i = 0; i < _fogsCount; i++) {
int type = stream->readUint32LE();
- Fog *fog = NULL;
+ Fog *fog = nullptr;
switch (type) {
case 0:
fog = new FogCone();
diff --git a/engines/bladerunner/vqa_player.cpp b/engines/bladerunner/vqa_player.cpp
index f875b84cce..4fb19cf561 100644
--- a/engines/bladerunner/vqa_player.cpp
+++ b/engines/bladerunner/vqa_player.cpp
@@ -121,7 +121,7 @@ void VQAPlayer::updateLights(Lights *lights) {
_decoder.decodeLights(lights);
}
-bool VQAPlayer::setLoop(int loop) {
+bool VQAPlayer::setLoop(int loop, int unknown, int loopMode, void(*callback)(void*, int, int), void *callbackData) {
int begin, end;
if (!_decoder.getLoopBeginAndEndFrame(loop, &begin, &end)) {
return false;
@@ -131,6 +131,9 @@ bool VQAPlayer::setLoop(int loop) {
_loopBegin = begin;
_loopEnd = end;
+ _callbackLoopEnded = callback;
+ _callbackData = callbackData;
+
// warning("\t\t\tActive Loop: %d - %d\n", begin, end);
return true;
@@ -158,6 +161,9 @@ int VQAPlayer::calcNextFrame(int frame) const {
if (_curLoop != -1 && frame >= _loopEnd) {
frame = _loopBegin;
+ if (_callbackLoopEnded != nullptr) {
+ _callbackLoopEnded(_callbackData, 0, _curLoop);
+ }
} else {
frame++;
}
diff --git a/engines/bladerunner/vqa_player.h b/engines/bladerunner/vqa_player.h
index f5769944cf..3a821a8323 100644
--- a/engines/bladerunner/vqa_player.h
+++ b/engines/bladerunner/vqa_player.h
@@ -55,6 +55,9 @@ class VQAPlayer {
bool _audioStarted;
Audio::SoundHandle _soundHandle;
+ void (*_callbackLoopEnded)(void*, int frame, int loopId);
+ void *_callbackData;
+
public:
VQAPlayer(BladeRunnerEngine *vm)
@@ -69,7 +72,8 @@ public:
_loopEnd(-1),
_nextFrameTime(0),
_hasAudio(false),
- _audioStarted(false) {
+ _audioStarted(false),
+ _callbackLoopEnded(nullptr) {
}
~VQAPlayer() {
@@ -85,9 +89,7 @@ public:
void updateView(View *view);
void updateLights(Lights *lights);
- bool setLoop(int loop);
- // void setLoopSpecial(int loop, bool wait);
- // void setLoopDefault(int loop);
+ bool setLoop(int loop, int unknown, int loopMode, void(*callback)(void*, int, int), void* callbackData);
int getLoopBeginFrame(int loop);
int getLoopEndFrame(int loop);