diff options
author | Matthew Hoops | 2011-10-02 23:31:01 -0400 |
---|---|---|
committer | Matthew Hoops | 2011-10-02 23:31:01 -0400 |
commit | d2789a152f56120812b7f7c228eb35884ec817aa (patch) | |
tree | 627e59b0d3672721278002e0e93f598caa84f8a7 | |
parent | 0756f72c202295dd8566753cd24f6d3db18d2d88 (diff) | |
download | scummvm-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.cpp | 20 | ||||
-rw-r--r-- | engines/pegasus/pegasus.h | 2 | ||||
-rwxr-xr-x | engines/pegasus/timers.cpp | 2 | ||||
-rwxr-xr-x | engines/pegasus/timers.h | 1 |
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 { |