From d2789a152f56120812b7f7c228eb35884ec817aa Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Sun, 2 Oct 2011 23:31:01 -0400 Subject: PEGASUS: Fix idlers freeing themselves Our idler handling is more like the original now --- engines/pegasus/pegasus.cpp | 20 ++++++++++++++++---- engines/pegasus/pegasus.h | 2 +- engines/pegasus/timers.cpp | 2 ++ engines/pegasus/timers.h | 1 + 4 files changed, 20 insertions(+), 5 deletions(-) (limited to 'engines/pegasus') 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::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 _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 { -- cgit v1.2.3