aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthew Hoops2011-10-02 23:31:01 -0400
committerMatthew Hoops2011-10-02 23:31:01 -0400
commitd2789a152f56120812b7f7c228eb35884ec817aa (patch)
tree627e59b0d3672721278002e0e93f598caa84f8a7
parent0756f72c202295dd8566753cd24f6d3db18d2d88 (diff)
downloadscummvm-rg350-d2789a152f56120812b7f7c228eb35884ec817aa.tar.gz
scummvm-rg350-d2789a152f56120812b7f7c228eb35884ec817aa.tar.bz2
scummvm-rg350-d2789a152f56120812b7f7c228eb35884ec817aa.zip
PEGASUS: Fix idlers freeing themselves
Our idler handling is more like the original now
-rw-r--r--engines/pegasus/pegasus.cpp20
-rw-r--r--engines/pegasus/pegasus.h2
-rwxr-xr-xengines/pegasus/timers.cpp2
-rwxr-xr-xengines/pegasus/timers.h1
4 files changed, 20 insertions, 5 deletions
diff --git a/engines/pegasus/pegasus.cpp b/engines/pegasus/pegasus.cpp
index 7dac148f61..4200147e2d 100644
--- a/engines/pegasus/pegasus.cpp
+++ b/engines/pegasus/pegasus.cpp
@@ -78,6 +78,7 @@ PegasusEngine::PegasusEngine(OSystem *syst, const PegasusGameDescription *gamede
_switchModesSync = false;
_draggingItem = 0;
_dragType = kDragNoDrag;
+ _idlerHead = 0;
}
PegasusEngine::~PegasusEngine() {
@@ -311,16 +312,27 @@ GUI::Debugger *PegasusEngine::getDebugger() {
}
void PegasusEngine::addIdler(Idler *idler) {
- _idlers.push_back(idler);
+ idler->_nextIdler = _idlerHead;
+ if (_idlerHead)
+ _idlerHead->_prevIdler = idler;
+ idler->_prevIdler = 0;
+ _idlerHead = idler;
}
void PegasusEngine::removeIdler(Idler *idler) {
- _idlers.remove(idler);
+ if (idler->_prevIdler)
+ idler->_prevIdler->_nextIdler = idler->_nextIdler;
+ if (idler->_nextIdler)
+ idler->_nextIdler->_prevIdler = idler->_prevIdler;
+ if (idler == _idlerHead)
+ _idlerHead = idler->_nextIdler;
+ idler->_nextIdler = 0;
+ idler->_prevIdler = 0;
}
void PegasusEngine::giveIdleTime() {
- for (Common::List<Idler *>::iterator it = _idlers.begin(); it != _idlers.end(); it++)
- (*it)->useIdleTime();
+ for (Idler *idler = _idlerHead; idler != 0; idler = idler->_nextIdler)
+ idler->useIdleTime();
}
void PegasusEngine::addTimeBase(TimeBase *timeBase) {
diff --git a/engines/pegasus/pegasus.h b/engines/pegasus/pegasus.h
index 0dd0a2abe3..a09a9231b2 100644
--- a/engines/pegasus/pegasus.h
+++ b/engines/pegasus/pegasus.h
@@ -211,7 +211,7 @@ private:
Common::String _introDirectory;
// Idlers
- Common::List<Idler *> _idlers;
+ Idler *_idlerHead;
void giveIdleTime();
// Items
diff --git a/engines/pegasus/timers.cpp b/engines/pegasus/timers.cpp
index 0b052b525d..8ca7de98bf 100755
--- a/engines/pegasus/timers.cpp
+++ b/engines/pegasus/timers.cpp
@@ -31,6 +31,8 @@ namespace Pegasus {
Idler::Idler() {
_isIdling = false;
+ _nextIdler = 0;
+ _prevIdler = 0;
}
Idler::~Idler() {
diff --git a/engines/pegasus/timers.h b/engines/pegasus/timers.h
index 4ad2df0587..65e7d21372 100755
--- a/engines/pegasus/timers.h
+++ b/engines/pegasus/timers.h
@@ -50,6 +50,7 @@ protected:
virtual void useIdleTime() {}
bool _isIdling;
+ Idler *_nextIdler, *_prevIdler;
};
enum {