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

drmccoy at users.sourceforge.net drmccoy at users.sourceforge.net
Thu Jun 25 17:29:19 CEST 2009


Revision: 41868
          http://scummvm.svn.sourceforge.net/scummvm/?rev=41868&view=rev
Author:   drmccoy
Date:     2009-06-25 15:29:19 +0000 (Thu, 25 Jun 2009)

Log Message:
-----------
Oops, used git commit --amend wrong, apparently. /This/ is the real Environments change I wanted to push

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 15:22:08 UTC (rev 41867)
+++ scummvm/trunk/engines/gob/game.cpp	2009-06-25 15:29:19 UTC (rev 41868)
@@ -42,47 +42,133 @@
 
 namespace Gob {
 
-Game::Environment::Environment(GobEngine *vm) : _vm(vm) {
-	_cursorHotspotX = 0;
-	_cursorHotspotY = 0;
-	_variables      = 0;
-	_script         = 0;
-	_resources      = 0;
-	_curTotFile[0]  = '\0';
+Environments::Environments(GobEngine *vm) : _vm(vm) {
+	_environments = new Environment[kEnvironmentCount];
+
+	for (uint i = 0; i < kEnvironmentCount; i++) {
+		Environment &e = _environments[i];
+
+		e.cursorHotspotX = 0;
+		e.cursorHotspotY = 0;
+		e.variables      = 0;
+		e.script         = 0;
+		e.resources      = 0;
+		e.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;
+Environments::~Environments() {
+	clear();
+
+	delete[] _environments;
 }
 
-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 Environments::clear() {
+	// Deleting unique variables, script and resources
+
+	for (uint i = 0; i < kEnvironmentCount; i++) {
+		if (_environments[i].variables == _vm->_inter->_variables)
+			continue;
+
+		if (!has(_environments[i].variables, i + 1))
+			delete _environments[i].variables;
+	}
+
+	for (uint i = 0; i < kEnvironmentCount; i++) {
+		if (_environments[i].script == _vm->_game->_script)
+			continue;
+
+		if (!has(_environments[i].script, i + 1))
+			delete _environments[i].script;
+	}
+
+	for (uint i = 0; i < kEnvironmentCount; i++) {
+		if (_environments[i].resources == _vm->_game->_resources)
+			continue;
+
+		if (!has(_environments[i].resources, i + 1))
+			delete _environments[i].resources;
+	}
 }
 
-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);
+void Environments::set(uint8 env) {
+	if (env >= kEnvironmentCount)
+		return;
+
+	Environment &e = _environments[env];
+
+	// If it already has a unique script or resource assigned, delete them
+	if ((e.script != _vm->_game->_script) && !has(e.script, 0, env))
+		delete e.script;
+	if ((e.resources != _vm->_game->_resources) && !has(e.resources, 0, env))
+		delete e.resources;
+
+	e.cursorHotspotX = _vm->_draw->_cursorHotspotXVar;
+	e.cursorHotspotY = _vm->_draw->_cursorHotspotYVar;
+	e.script         = _vm->_game->_script;
+	e.resources      = _vm->_game->_resources;
+	e.variables      = _vm->_inter->_variables;
+	strncpy(e.curTotFile, _vm->_game->_curTotFile, 14);
 }
 
-const char *Game::Environment::getTotFile() const {
-	return _curTotFile;
+void Environments::get(uint8 env) const {
+	if (env >= kEnvironmentCount)
+		return;
+
+	const Environment &e = _environments[env];
+
+	_vm->_draw->_cursorHotspotXVar = e.cursorHotspotX;
+	_vm->_draw->_cursorHotspotYVar = e.cursorHotspotY;
+	_vm->_game->_script            = e.script;
+	_vm->_game->_resources         = e.resources;
+	_vm->_inter->_variables        = e.variables;
+	strncpy(_vm->_game->_curTotFile, e.curTotFile, 14);
 }
 
+const char *Environments::getTotFile(uint8 env) const {
+	if (env >= kEnvironmentCount)
+		return "";
 
+	return _environments[env].curTotFile;
+}
+
+bool Environments::has(Variables *variables, uint8 startEnv, int16 except) const {
+	for (uint i = startEnv; i < kEnvironmentCount; i++) {
+		if ((except >= 0) && (((uint16) except) == i))
+			continue;
+
+		if (_environments[i].variables == variables)
+			return true;
+	}
+
+	return false;
+}
+
+bool Environments::has(Script *script, uint8 startEnv, int16 except) const {
+	for (uint i = startEnv; i < kEnvironmentCount; i++) {
+		if ((except >= 0) && (((uint16) except) == i))
+			continue;
+
+		if (_environments[i].script == script)
+			return true;
+	}
+
+	return false;
+}
+
+bool Environments::has(Resources *resources, uint8 startEnv, int16 except) const {
+	for (uint i = startEnv; i < kEnvironmentCount; i++) {
+		if ((except >= 0) && (((uint16) except) == i))
+			continue;
+
+		if (_environments[i].resources == resources)
+			return true;
+	}
+
+	return false;
+}
+
+
 Game::Game(GobEngine *vm) : _vm(vm) {
 	_collisionAreas = 0;
 	_shouldPushColls = 0;
@@ -123,17 +209,13 @@
 	_numEnvironments = 0;
 	_curEnvironment = 0;
 
-	for (int i = 0; i < kMaxEnvironments; i++)
-		_environments[i] = new Environment(_vm);
-
-	_script = new Script(_vm);
-	_resources = new Resources(_vm);
+	_environments = new Environments(_vm);
+	_script       = new Script(_vm);
+	_resources    = new Resources(_vm);
 }
 
 Game::~Game() {
-	for (int i = 0; i < kMaxEnvironments; i++)
-		delete _environments[i];
-
+	delete _environments;
 	delete _script;
 	delete _resources;
 }
@@ -324,10 +406,10 @@
 void Game::totSub(int8 flags, const char *newTotFile) {
 	int8 curBackupPos;
 
-	if (_numEnvironments >= kMaxEnvironments)
+	if (_numEnvironments >= Environments::kEnvironmentCount)
 		return;
 
-	_environments[_numEnvironments]->set();
+	_environments->set(_numEnvironments);
 
 	curBackupPos = _curEnvironment;
 	_numEnvironments++;
@@ -344,8 +426,10 @@
 //	else
 	strcat(_curTotFile, ".TOT");
 
-	if (_vm->_inter->_terminate != 0)
+	if (_vm->_inter->_terminate != 0) {
+		clearUnusedEnvironment();
 		return;
+	}
 
 	pushCollisions(0);
 
@@ -363,10 +447,11 @@
 		_vm->_inter->delocateVars();
 	}
 
+	clearUnusedEnvironment();
+
 	_numEnvironments--;
 	_curEnvironment = curBackupPos;
-
-	_environments[_numEnvironments]->get();
+	_environments->get(_numEnvironments);
 }
 
 void Game::switchTotSub(int16 index, int16 skipPlay) {
@@ -377,29 +462,32 @@
 		return;
 
 	int16 newPos = _curEnvironment - index - ((index >= 0) ? 1 : 0);
-	if (newPos >= kMaxEnvironments)
+	if (newPos >= Environments::kEnvironmentCount)
 		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(_environments[newPos]->getTotFile(), "gob06.tot"))
+	    !scumm_stricmp(_environments->getTotFile(newPos), "gob06.tot"))
 		return;
 
 	curBackupPos = _curEnvironment;
 	backupedCount = _numEnvironments;
-	if (_curEnvironment == _numEnvironments) {
-		_environments[_numEnvironments]->set();
-		_numEnvironments++;
-	}
+	if (_curEnvironment == _numEnvironments)
+		_environments->set(_numEnvironments++);
+
 	_curEnvironment -= index;
 	if (index >= 0)
 		_curEnvironment--;
 
-	_environments[_curEnvironment]->get();
+	clearUnusedEnvironment();
 
-	if (_vm->_inter->_terminate != 0)
+	_environments->get(_curEnvironment);
+
+	if (_vm->_inter->_terminate != 0) {
+		clearUnusedEnvironment();
 		return;
+	}
 
 	pushCollisions(0);
 	playTot(skipPlay);
@@ -409,9 +497,11 @@
 
 	popCollisions();
 
+	clearUnusedEnvironment();
+
 	_curEnvironment = curBackupPos;
 	_numEnvironments = backupedCount;
-	_environments[_curEnvironment]->get();
+	_environments->get(_curEnvironment);
 }
 
 void Game::setCollisions(byte arg_0) {
@@ -495,4 +585,16 @@
 	}
 }
 
+void Game::clearUnusedEnvironment() {
+	if (!_environments->has(_script)) {
+		delete _script;
+		_script = 0;
+	}
+	if (!_environments->has(_resources)) {
+		delete _resources;
+		_resources = 0;
+	}
+
+}
+
 } // End of namespace Gob

Modified: scummvm/trunk/engines/gob/game.h
===================================================================
--- scummvm/trunk/engines/gob/game.h	2009-06-25 15:22:08 UTC (rev 41867)
+++ scummvm/trunk/engines/gob/game.h	2009-06-25 15:29:19 UTC (rev 41868)
@@ -32,6 +32,39 @@
 class Resources;
 class Variables;
 
+class Environments {
+public:
+	static const uint8 kEnvironmentCount = 5;
+
+	Environments(GobEngine *vm);
+	~Environments();
+
+	void set(uint8 env);
+	void get(uint8 env) const;
+
+	const char *getTotFile(uint8 env) const;
+
+	bool has(Variables *variables, uint8 startEnv = 0, int16 except = -1) const;
+	bool has(Script *script      , uint8 startEnv = 0, int16 except = -1) const;
+	bool has(Resources *resources, uint8 startEnv = 0, int16 except = -1) const;
+
+	void clear();
+
+private:
+	struct Environment {
+		int16      cursorHotspotX;
+		int16      cursorHotspotY;
+		char       curTotFile[14];
+		Variables *variables;
+		Script    *script;
+		Resources *resources;
+	};
+
+	GobEngine *_vm;
+
+	Environment *_environments;
+};
+
 class Game {
 public:
 
@@ -120,29 +153,6 @@
 	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;
@@ -169,7 +179,7 @@
 	// For totSub()
 	int8 _curEnvironment;
 	int8 _numEnvironments;
-	Environment *_environments[kMaxEnvironments];
+	Environments *_environments;
 
 	GobEngine *_vm;
 
@@ -181,6 +191,8 @@
 	virtual void collSub(uint16 offset);
 
 	virtual int16 checkMousePoint(int16 all, int16 *resId, int16 *resIndex) = 0;
+
+	void clearUnusedEnvironment();
 };
 
 class Game_v1 : public Game {

Modified: scummvm/trunk/engines/gob/game_v6.cpp
===================================================================
--- scummvm/trunk/engines/gob/game_v6.cpp	2009-06-25 15:22:08 UTC (rev 41867)
+++ scummvm/trunk/engines/gob/game_v6.cpp	2009-06-25 15:29:19 UTC (rev 41868)
@@ -49,10 +49,10 @@
 	if ((flags == 16) || (flags == 17))
 		warning("Urban Stub: Game_v6::totSub(), flags == %d", flags);
 
-	if (_numEnvironments >= kMaxEnvironments)
+	if (_numEnvironments >= Environments::kEnvironmentCount)
 		return;
 
-	_environments[_numEnvironments]->set();
+	_environments->set(_numEnvironments);
 
 	curBackupPos = _curEnvironment;
 	_numEnvironments++;
@@ -70,8 +70,10 @@
 	strncpy0(_curTotFile, newTotFile, 9);
 	strcat(_curTotFile, ".TOT");
 
-	if (_vm->_inter->_terminate != 0)
+	if (_vm->_inter->_terminate != 0) {
+		clearUnusedEnvironment();
 		return;
+	}
 
 	pushCollisions(0);
 
@@ -90,10 +92,11 @@
 		_vm->_inter->delocateVars();
 	}
 
+	clearUnusedEnvironment();
+
 	_numEnvironments--;
 	_curEnvironment = curBackupPos;
-
-	_environments[_numEnvironments]->get();
+	_environments->get(_numEnvironments);
 }
 
 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