diff options
-rw-r--r-- | engines/bladerunner/actor_clues.cpp | 6 | ||||
-rw-r--r-- | engines/bladerunner/bladerunner.cpp | 9 | ||||
-rw-r--r-- | engines/bladerunner/light.cpp | 11 | ||||
-rw-r--r-- | engines/bladerunner/scene.cpp | 116 | ||||
-rw-r--r-- | engines/bladerunner/scene.h | 12 | ||||
-rw-r--r-- | engines/bladerunner/scene_objects.cpp | 3 | ||||
-rw-r--r-- | engines/bladerunner/script/script.cpp | 31 | ||||
-rw-r--r-- | engines/bladerunner/set_effects.cpp | 4 | ||||
-rw-r--r-- | engines/bladerunner/vqa_player.cpp | 8 | ||||
-rw-r--r-- | engines/bladerunner/vqa_player.h | 10 |
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); |