[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