[Scummvm-git-logs] scummvm master -> 1b40c5bf55c24a090632765335d871c198004120

peterkohaut peterkohaut at users.noreply.github.com
Fri Oct 28 22:34:33 CEST 2016


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
1b40c5bf55 BLADERUNNER: fixed memory leaks & overflows


Commit: 1b40c5bf55c24a090632765335d871c198004120
    https://github.com/scummvm/scummvm/commit/1b40c5bf55c24a090632765335d871c198004120
Author: Peter Kohaut (peter.kohaut at gmail.com)
Date: 2016-10-28T22:34:04+02:00

Commit Message:
BLADERUNNER: fixed memory leaks & overflows

fixed few memory leaks
fixed overflows
prepared more logic for looping but its not yet working correctly - still figuring out original code for vqadecoder

Changed paths:
    engines/bladerunner/actor_clues.cpp
    engines/bladerunner/bladerunner.cpp
    engines/bladerunner/light.cpp
    engines/bladerunner/scene.cpp
    engines/bladerunner/scene.h
    engines/bladerunner/scene_objects.cpp
    engines/bladerunner/script/script.cpp
    engines/bladerunner/set_effects.cpp
    engines/bladerunner/vqa_player.cpp
    engines/bladerunner/vqa_player.h



diff --git a/engines/bladerunner/actor_clues.cpp b/engines/bladerunner/actor_clues.cpp
index a84d549..f9a4389 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 33110c0..e60fe77 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 08eb8ab..8be8d01 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 a629b42..c29a634 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 6a34fcd..5bc25fc 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 6d10edd..c550973 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 b0bb638..45b2312 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 54894e2..c4038f6 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 f875b84..4fb19cf 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 f576994..3a821a8 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);





More information about the Scummvm-git-logs mailing list