[Scummvm-cvs-logs] SF.net SVN: scummvm:[41860] scummvm/trunk/engines/gob

drmccoy at users.sourceforge.net drmccoy at users.sourceforge.net
Thu Jun 25 12:55:01 CEST 2009


Revision: 41860
          http://scummvm.svn.sourceforge.net/scummvm/?rev=41860&view=rev
Author:   drmccoy
Date:     2009-06-25 10:55:01 +0000 (Thu, 25 Jun 2009)

Log Message:
-----------
Giving the "backup" arrays their own class, Environments, and really plugging all related leaks

Modified Paths:
--------------
    scummvm/trunk/engines/gob/game.cpp
    scummvm/trunk/engines/gob/game.h
    scummvm/trunk/engines/gob/game_v6.cpp

Modified: scummvm/trunk/engines/gob/game.cpp
===================================================================
--- scummvm/trunk/engines/gob/game.cpp	2009-06-25 10:54:35 UTC (rev 41859)
+++ scummvm/trunk/engines/gob/game.cpp	2009-06-25 10:55:01 UTC (rev 41860)
@@ -31,6 +31,7 @@
 #include "gob/global.h"
 #include "gob/util.h"
 #include "gob/dataio.h"
+#include "gob/variables.h"
 #include "gob/script.h"
 #include "gob/resources.h"
 #include "gob/inter.h"
@@ -41,6 +42,47 @@
 
 namespace Gob {
 
+Game::Environment::Environment(GobEngine *vm) : _vm(vm) {
+	_cursorHotspotX = 0;
+	_cursorHotspotY = 0;
+	_variables      = 0;
+	_script         = 0;
+	_resources      = 0;
+	_curTotFile[0]  = '\0';
+}
+
+Game::Environment::~Environment() {
+	if (_script    != _vm->_game->_script)
+		delete _script;
+	if (_resources != _vm->_game->_resources)
+		delete _resources;
+	if (_variables != _vm->_inter->_variables)
+		delete _variables;
+}
+
+void Game::Environment::set() {
+	_cursorHotspotX = _vm->_draw->_cursorHotspotXVar;
+	_cursorHotspotY = _vm->_draw->_cursorHotspotYVar;
+	_script         = _vm->_game->_script;
+	_resources      = _vm->_game->_resources;
+	_variables      = _vm->_inter->_variables;
+	strncpy(_curTotFile, _vm->_game->_curTotFile, 14);
+}
+
+void Game::Environment::get() {
+	_vm->_draw->_cursorHotspotXVar = _cursorHotspotX;
+	_vm->_draw->_cursorHotspotYVar = _cursorHotspotY;
+	_vm->_game->_script            = _script;
+	_vm->_game->_resources         = _resources;
+	_vm->_inter->_variables        = _variables;
+	strncpy(_vm->_game->_curTotFile, _curTotFile, 14);
+}
+
+const char *Game::Environment::getTotFile() const {
+	return _curTotFile;
+}
+
+
 Game::Game(GobEngine *vm) : _vm(vm) {
 	_collisionAreas = 0;
 	_shouldPushColls = 0;
@@ -78,34 +120,19 @@
 	_tempStr[0] = 0;
 	_collStr[0] = 0;
 
-	_backupedCount = 0;
-	_curBackupPos = 0;
+	_numEnvironments = 0;
+	_curEnvironment = 0;
 
-	for (int i = 0; i < 5; i++) {
-		_cursorHotspotXArray[i] = 0;
-		_cursorHotspotYArray[i] = 0;
-		_variablesArray[i] = 0;
-		_curTotFileArray[i][0] = 0;
-		_scriptArray[i] = 0;
-		_resourcesArray[i] = 0;
-	}
+	for (int i = 0; i < kMaxEnvironments; i++)
+		_environments[i] = new Environment(_vm);
 
 	_script = new Script(_vm);
 	_resources = new Resources(_vm);
 }
 
 Game::~Game() {
-	for (int i = 0; i < 5; i++) {
-		warning("%d", i);
-		if (_scriptArray[i] != _script) {
-			warning("DELETE (%d)", _scriptArray[i] != 0);
-			delete _scriptArray[i];
-		}
-		if (_resourcesArray[i] != _resources) {
-			warning("DELETE (%d)", _resourcesArray[i] != 0);
-			delete _resourcesArray[i];
-		}
-	}
+	for (int i = 0; i < kMaxEnvironments; i++)
+		delete _environments[i];
 
 	delete _script;
 	delete _resources;
@@ -297,19 +324,14 @@
 void Game::totSub(int8 flags, const char *newTotFile) {
 	int8 curBackupPos;
 
-	if (_backupedCount >= 5)
+	if (_numEnvironments >= kMaxEnvironments)
 		return;
 
-	_cursorHotspotXArray[_backupedCount] = _vm->_draw->_cursorHotspotXVar;
-	_cursorHotspotYArray[_backupedCount] = _vm->_draw->_cursorHotspotYVar;
-	_scriptArray[_backupedCount] = _script;
-	_resourcesArray[_backupedCount] = _resources;
-	_variablesArray[_backupedCount] = _vm->_inter->_variables;
-	strcpy(_curTotFileArray[_backupedCount], _curTotFile);
+	_environments[_numEnvironments]->set();
 
-	curBackupPos = _curBackupPos;
-	_backupedCount++;
-	_curBackupPos = _backupedCount;
+	curBackupPos = _curEnvironment;
+	_numEnvironments++;
+	_curEnvironment = _numEnvironments;
 
 	_script = new Script(_vm);
 	_resources = new Resources(_vm);
@@ -341,52 +363,40 @@
 		_vm->_inter->delocateVars();
 	}
 
-	_backupedCount--;
-	_curBackupPos = curBackupPos;
+	_numEnvironments--;
+	_curEnvironment = curBackupPos;
 
-	_vm->_draw->_cursorHotspotXVar = _cursorHotspotXArray[_backupedCount];
-	_vm->_draw->_cursorHotspotYVar = _cursorHotspotYArray[_backupedCount];
-	_script = _scriptArray[_backupedCount];
-	_resources = _resourcesArray[_backupedCount];
-	_vm->_inter->_variables = _variablesArray[_backupedCount];
-	strcpy(_curTotFile, _curTotFileArray[_backupedCount]);
+	_environments[_numEnvironments]->get();
 }
 
 void Game::switchTotSub(int16 index, int16 skipPlay) {
 	int16 backupedCount;
 	int16 curBackupPos;
 
-	if ((_backupedCount - index) < 1)
+	if ((_numEnvironments - index) < 1)
 		return;
 
-	int16 newPos = _curBackupPos - index - ((index >= 0) ? 1 : 0);
+	int16 newPos = _curEnvironment - index - ((index >= 0) ? 1 : 0);
+	if (newPos >= kMaxEnvironments)
+		return;
+
 	// WORKAROUND: Some versions don't make the MOVEMENT menu item unselectable
 	// in the dreamland screen, resulting in a crash when it's clicked.
 	if ((_vm->getGameType() == kGameTypeGob2) && (index == -1) && (skipPlay == 7) &&
-	    !scumm_stricmp(_curTotFileArray[newPos], "gob06.tot"))
+	    !scumm_stricmp(_environments[newPos]->getTotFile(), "gob06.tot"))
 		return;
 
-	curBackupPos = _curBackupPos;
-	backupedCount = _backupedCount;
-	if (_curBackupPos == _backupedCount) {
-		_cursorHotspotXArray[_backupedCount] = _vm->_draw->_cursorHotspotXVar;
-		_cursorHotspotYArray[_backupedCount] = _vm->_draw->_cursorHotspotYVar;
-		_scriptArray[_backupedCount] = _script;
-		_resourcesArray[_backupedCount] = _resources;
-		_variablesArray[_backupedCount] = _vm->_inter->_variables;
-		strcpy(_curTotFileArray[_backupedCount], _curTotFile);
-		_backupedCount++;
+	curBackupPos = _curEnvironment;
+	backupedCount = _numEnvironments;
+	if (_curEnvironment == _numEnvironments) {
+		_environments[_numEnvironments]->set();
+		_numEnvironments++;
 	}
-	_curBackupPos -= index;
+	_curEnvironment -= index;
 	if (index >= 0)
-		_curBackupPos--;
+		_curEnvironment--;
 
-	_vm->_draw->_cursorHotspotXVar = _cursorHotspotXArray[_curBackupPos];
-	_vm->_draw->_cursorHotspotYVar = _cursorHotspotYArray[_curBackupPos];
-	_script = _scriptArray[_curBackupPos];
-	_resources = _resourcesArray[_curBackupPos];
-	_vm->_inter->_variables = _variablesArray[_curBackupPos];
-	strcpy(_curTotFile, _curTotFileArray[_curBackupPos]);
+	_environments[_curEnvironment]->get();
 
 	if (_vm->_inter->_terminate != 0)
 		return;
@@ -399,14 +409,9 @@
 
 	popCollisions();
 
-	_curBackupPos = curBackupPos;
-	_backupedCount = backupedCount;
-	_vm->_draw->_cursorHotspotXVar = _cursorHotspotXArray[_curBackupPos];
-	_vm->_draw->_cursorHotspotYVar = _cursorHotspotYArray[_curBackupPos];
-	_script = _scriptArray[_curBackupPos];
-	_resources = _resourcesArray[_curBackupPos];
-	_vm->_inter->_variables = _variablesArray[_curBackupPos];
-	strcpy(_curTotFile, _curTotFileArray[_curBackupPos]);
+	_curEnvironment = curBackupPos;
+	_numEnvironments = backupedCount;
+	_environments[_curEnvironment]->get();
 }
 
 void Game::setCollisions(byte arg_0) {

Modified: scummvm/trunk/engines/gob/game.h
===================================================================
--- scummvm/trunk/engines/gob/game.h	2009-06-25 10:54:35 UTC (rev 41859)
+++ scummvm/trunk/engines/gob/game.h	2009-06-25 10:55:01 UTC (rev 41860)
@@ -26,12 +26,11 @@
 #ifndef GOB_GAME_H
 #define GOB_GAME_H
 
-#include "gob/variables.h"
-
 namespace Gob {
 
 class Script;
 class Resources;
+class Variables;
 
 class Game {
 public:
@@ -121,6 +120,29 @@
 	virtual void popCollisions(void) = 0;
 
 protected:
+	static const int kMaxEnvironments = 5;
+
+	class Environment {
+	public:
+		Environment(GobEngine *vm);
+		~Environment();
+
+		void set();
+		void get();
+
+		const char *getTotFile() const;
+
+	private:
+		GobEngine *_vm;
+
+		int16      _cursorHotspotX;
+		int16      _cursorHotspotY;
+		char       _curTotFile[14];
+		Variables *_variables;
+		Script    *_script;
+		Resources *_resources;
+	};
+
 	int16 _lastCollKey;
 	int16 _lastCollAreaIndex;
 	int16 _lastCollId;
@@ -145,14 +167,9 @@
 	char _collStr[256];
 
 	// For totSub()
-	int8 _backupedCount;
-	int8 _curBackupPos;
-	int16 _cursorHotspotXArray[5];
-	int16 _cursorHotspotYArray[5];
-	Variables *_variablesArray[5];
-	char _curTotFileArray[5][14];
-	Script *_scriptArray[5];
-	Resources *_resourcesArray[5];
+	int8 _curEnvironment;
+	int8 _numEnvironments;
+	Environment *_environments[kMaxEnvironments];
 
 	GobEngine *_vm;
 

Modified: scummvm/trunk/engines/gob/game_v6.cpp
===================================================================
--- scummvm/trunk/engines/gob/game_v6.cpp	2009-06-25 10:54:35 UTC (rev 41859)
+++ scummvm/trunk/engines/gob/game_v6.cpp	2009-06-25 10:55:01 UTC (rev 41860)
@@ -49,19 +49,14 @@
 	if ((flags == 16) || (flags == 17))
 		warning("Urban Stub: Game_v6::totSub(), flags == %d", flags);
 
-	if (_backupedCount >= 5)
+	if (_numEnvironments >= kMaxEnvironments)
 		return;
 
-	_cursorHotspotXArray[_backupedCount] = _vm->_draw->_cursorHotspotXVar;
-	_cursorHotspotYArray[_backupedCount] = _vm->_draw->_cursorHotspotYVar;
-	_scriptArray[_backupedCount] = _script;
-	_resourcesArray[_backupedCount] = _resources;
-	_variablesArray[_backupedCount] = _vm->_inter->_variables;
-	strcpy(_curTotFileArray[_backupedCount], _curTotFile);
+	_environments[_numEnvironments]->set();
 
-	curBackupPos = _curBackupPos;
-	_backupedCount++;
-	_curBackupPos = _backupedCount;
+	curBackupPos = _curEnvironment;
+	_numEnvironments++;
+	_curEnvironment = _numEnvironments;
 
 	_script = new Script(_vm);
 	_resources = new Resources(_vm);
@@ -95,15 +90,10 @@
 		_vm->_inter->delocateVars();
 	}
 
-	_backupedCount--;
-	_curBackupPos = curBackupPos;
+	_numEnvironments--;
+	_curEnvironment = curBackupPos;
 
-	_vm->_draw->_cursorHotspotXVar = _cursorHotspotXArray[_backupedCount];
-	_vm->_draw->_cursorHotspotYVar = _cursorHotspotYArray[_backupedCount];
-	_script = _scriptArray[_backupedCount];
-	_resources = _resourcesArray[_backupedCount];
-	_vm->_inter->_variables = _variablesArray[_backupedCount];
-	strcpy(_curTotFile, _curTotFileArray[_backupedCount]);
+	_environments[_numEnvironments]->get();
 }
 
 int16 Game_v6::addNewCollision(int16 id, uint16 left, uint16 top,


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list