aboutsummaryrefslogtreecommitdiff
path: root/engines/pegasus
diff options
context:
space:
mode:
authorJohannes Schickel2012-09-21 02:18:54 +0200
committerJohannes Schickel2012-09-21 02:35:50 +0200
commit8aceef971106ba35ab234b165dbe6e19c842f336 (patch)
treedc1286a31068872960cd3d5925acba78a2b912a7 /engines/pegasus
parentb0079f4fa67099cec2c58e7907bf3fe09d0755cf (diff)
downloadscummvm-rg350-8aceef971106ba35ab234b165dbe6e19c842f336.tar.gz
scummvm-rg350-8aceef971106ba35ab234b165dbe6e19c842f336.tar.bz2
scummvm-rg350-8aceef971106ba35ab234b165dbe6e19c842f336.zip
PEGASUS: Replace FunctionPtr by our Functor code in Common.
This "fixes" a segmentation fault in our buildbot's toolchain for DC. The segmentation fault occured while compiling engines/pegasus/ai/ai_condition.cpp. Thanks to clone2727 for looking over this and testing it.
Diffstat (limited to 'engines/pegasus')
-rw-r--r--engines/pegasus/ai/ai_condition.cpp10
-rw-r--r--engines/pegasus/ai/ai_condition.h2
-rw-r--r--engines/pegasus/items/inventory/airmask.cpp4
-rw-r--r--engines/pegasus/items/inventory/airmask.h2
-rw-r--r--engines/pegasus/neighborhood/caldoria/caldoria.cpp16
-rw-r--r--engines/pegasus/neighborhood/caldoria/caldoria.h2
-rw-r--r--engines/pegasus/neighborhood/mars/mars.cpp40
-rw-r--r--engines/pegasus/neighborhood/mars/mars.h10
-rw-r--r--engines/pegasus/neighborhood/mars/robotship.cpp6
-rw-r--r--engines/pegasus/neighborhood/mars/robotship.h2
-rw-r--r--engines/pegasus/neighborhood/neighborhood.cpp6
-rw-r--r--engines/pegasus/neighborhood/neighborhood.h2
-rw-r--r--engines/pegasus/neighborhood/tsa/fulltsa.cpp6
-rw-r--r--engines/pegasus/neighborhood/tsa/fulltsa.h4
-rw-r--r--engines/pegasus/pegasus.cpp6
-rw-r--r--engines/pegasus/timers.h12
-rw-r--r--engines/pegasus/util.cpp18
-rw-r--r--engines/pegasus/util.h18
18 files changed, 45 insertions, 121 deletions
diff --git a/engines/pegasus/ai/ai_condition.cpp b/engines/pegasus/ai/ai_condition.cpp
index df6d3227e5..09ecbfe349 100644
--- a/engines/pegasus/ai/ai_condition.cpp
+++ b/engines/pegasus/ai/ai_condition.cpp
@@ -102,7 +102,7 @@ bool AIOrCondition::fireCondition() {
AITimerCondition::AITimerCondition(const TimeValue time, const TimeScale scale, const bool shouldStartTimer) {
_timerFuse.primeFuse(time, scale);
- _timerFuse.setFunctionPtr((tFunctionPtr)&AITimerFunction, (void *)this);
+ _timerFuse.setFunctor(new Common::Functor0Mem<void, AITimerCondition>(this, &AITimerCondition::fire));
_fired = false;
if (shouldStartTimer)
@@ -138,14 +138,14 @@ void AITimerCondition::readAICondition(Common::ReadStream *stream) {
_timerFuse.lightFuse();
}
-void AITimerCondition::AITimerFunction(FunctionPtr *, AITimerCondition *condition) {
- condition->_fired = true;
-}
-
bool AITimerCondition::fireCondition() {
return _fired;
}
+void AITimerCondition::fire() {
+ _fired = true;
+}
+
AILocationCondition::AILocationCondition(uint32 maxLocations) {
_numLocations = 0;
_maxLocations = maxLocations;
diff --git a/engines/pegasus/ai/ai_condition.h b/engines/pegasus/ai/ai_condition.h
index 2d93a52eab..f7fa1f33c8 100644
--- a/engines/pegasus/ai/ai_condition.h
+++ b/engines/pegasus/ai/ai_condition.h
@@ -136,7 +136,7 @@ public:
virtual void readAICondition(Common::ReadStream *);
protected:
- static void AITimerFunction(FunctionPtr *, AITimerCondition *);
+ void fire();
FuseFunction _timerFuse;
bool _fired;
diff --git a/engines/pegasus/items/inventory/airmask.cpp b/engines/pegasus/items/inventory/airmask.cpp
index 559410fc79..85d4449f9f 100644
--- a/engines/pegasus/items/inventory/airmask.cpp
+++ b/engines/pegasus/items/inventory/airmask.cpp
@@ -36,7 +36,7 @@ AirMask *g_airMask = 0;
// Based on full == 100, which is scale used by GetAirLeft().
static const TimeValue kOxygenLowThreshold = 25;
-void AirMask::airMaskTimerExpired(FunctionPtr *, void *) {
+void AirMask::airMaskTimerExpired() {
if (g_neighborhood)
g_neighborhood->checkAirMask();
}
@@ -49,7 +49,7 @@ AirMask::AirMask(const ItemID id, const NeighborhoodID neighborhood, const RoomI
g_allHotspots.push_back(&_toggleSpot);
setItemState(kAirMaskEmptyOff);
_oxygenTimer.primeFuse(0);
- _oxygenTimer.setFunctionPtr(&airMaskTimerExpired, 0);
+ _oxygenTimer.setFunctor(new Common::Functor0Mem<void, AirMask>(this, &AirMask::airMaskTimerExpired));
}
AirMask::~AirMask() {
diff --git a/engines/pegasus/items/inventory/airmask.h b/engines/pegasus/items/inventory/airmask.h
index f207f3b82b..6a2d708a6c 100644
--- a/engines/pegasus/items/inventory/airmask.h
+++ b/engines/pegasus/items/inventory/airmask.h
@@ -59,7 +59,7 @@ public:
void clickInAirMaskHotspot();
protected:
- static void airMaskTimerExpired(FunctionPtr *, void *);
+ void airMaskTimerExpired();
virtual void removedFromInventory();
virtual void addedToInventory();
diff --git a/engines/pegasus/neighborhood/caldoria/caldoria.cpp b/engines/pegasus/neighborhood/caldoria/caldoria.cpp
index 8c31debf1c..8d46300d9a 100644
--- a/engines/pegasus/neighborhood/caldoria/caldoria.cpp
+++ b/engines/pegasus/neighborhood/caldoria/caldoria.cpp
@@ -150,14 +150,6 @@ static const TimeValue k5To3Time = 41280;
const NotificationFlags kSinclairLoopDoneFlag = kLastNeighborhoodNotificationFlag << 1;
-void doorBombTimerExpiredFunction(FunctionPtr *, void *caldoria) {
- ((Caldoria *)caldoria)->doorBombTimerExpired();
-}
-
-void sinclairTimerExpiredFunction(FunctionPtr *, void *caldoria) {
- ((Caldoria *)caldoria)->sinclairTimerExpired();
-}
-
SinclairCallBack::SinclairCallBack(Caldoria *caldoria) {
_caldoria = caldoria;
}
@@ -941,7 +933,7 @@ void Caldoria::setUpRoofTop() {
} else if (GameState.getCaldoriaDoorBombed()) {
// Long enough for AI hints...?
_utilityFuse.primeFuse(kCardBombCountDownTime);
- _utilityFuse.setFunctionPtr(&doorBombTimerExpiredFunction, (void *)this);
+ _utilityFuse.setFunctor(new Common::Functor0Mem<void, Caldoria>(this, &Caldoria::doorBombTimerExpired));
_utilityFuse.lightFuse();
loopCroppedMovie("Images/Caldoria/A48 Bomb Loop", kCaldoria48CardBombLoopLeft, kCaldoria48CardBombLoopTop);
@@ -965,7 +957,7 @@ void Caldoria::setUpRoofTop() {
if (!GameState.getCaldoriaSinclairShot()) {
if (GameState.getCaldoriaSawVoiceAnalysis() && !_utilityFuse.isFuseLit()) {
_utilityFuse.primeFuse(GameState.getCaldoriaFuseTimeLimit());
- _utilityFuse.setFunctionPtr(&sinclairTimerExpiredFunction, (void *)this);
+ _utilityFuse.setFunctor(new Common::Functor0Mem<void, Caldoria>(this, &Caldoria::sinclairTimerExpired));
_utilityFuse.lightFuse();
}
} else {
@@ -1198,7 +1190,7 @@ void Caldoria::receiveNotification(Notification *notification, const Notificatio
break;
case kCa49NorthVoiceAnalysis:
_utilityFuse.primeFuse(kSinclairShootsTimeLimit);
- _utilityFuse.setFunctionPtr(&sinclairTimerExpiredFunction, (void*) this);
+ _utilityFuse.setFunctor(new Common::Functor0Mem<void, Caldoria>(this, &Caldoria::sinclairTimerExpired));
_utilityFuse.lightFuse();
GameState.setCaldoriaSawVoiceAnalysis(true);
break;
@@ -1614,7 +1606,7 @@ void Caldoria::dropItemIntoRoom(Item *item, Hotspot *dropSpot) {
Neighborhood::dropItemIntoRoom(item, dropSpot);
// Long enough for AI hints...?
_utilityFuse.primeFuse(kCardBombCountDownTime);
- _utilityFuse.setFunctionPtr(&doorBombTimerExpiredFunction, (void *)this);
+ _utilityFuse.setFunctor(new Common::Functor0Mem<void, Caldoria>(this, &Caldoria::doorBombTimerExpired));
_utilityFuse.lightFuse();
GameState.setCaldoriaFuseTimeLimit(kCardBombCountDownTime);
loopCroppedMovie("Images/Caldoria/A48 Bomb Loop", kCaldoria48CardBombLoopLeft, kCaldoria48CardBombLoopTop);
diff --git a/engines/pegasus/neighborhood/caldoria/caldoria.h b/engines/pegasus/neighborhood/caldoria/caldoria.h
index f02101ec3b..c9243e0576 100644
--- a/engines/pegasus/neighborhood/caldoria/caldoria.h
+++ b/engines/pegasus/neighborhood/caldoria/caldoria.h
@@ -401,8 +401,6 @@ protected:
class Caldoria : public Neighborhood {
friend class SinclairCallBack;
-friend void doorBombTimerExpiredFunction(FunctionPtr *, void *);
-friend void sinclairTimerExpiredFunction(FunctionPtr *, void *);
public:
Caldoria(InputHandler *, PegasusEngine *);
diff --git a/engines/pegasus/neighborhood/mars/mars.cpp b/engines/pegasus/neighborhood/mars/mars.cpp
index 9cc8ab63d4..e5a4b61a44 100644
--- a/engines/pegasus/neighborhood/mars/mars.cpp
+++ b/engines/pegasus/neighborhood/mars/mars.cpp
@@ -85,28 +85,8 @@ enum {
#define kShuttleTractorBounds Common::Rect(24, 103, 24 + 112, 103 + 30)
#define kShuttleTransportBounds Common::Rect(484, 353, 89 + 484, 79 + 353)
-void robotTimerExpiredFunction(FunctionPtr *, void *mars) {
- ((Mars *)mars)->robotTiredOfWaiting();
-}
-
-void lockThawTimerExpiredFunction(FunctionPtr *, void *mars) {
- ((Mars *)mars)->lockThawed();
-}
-
-void bombTimerExpiredFunction(FunctionPtr *, void *mars) {
- ((Mars *)mars)->didntFindBomb();
-}
-
-void bombTimerExpiredInGameFunction(FunctionPtr *, void *mars) {
- ((Mars *)mars)->bombExplodesInGame();
-}
-
-void airStageExpiredFunction(FunctionPtr *, void *mars) {
- ((Mars *)mars)->airStageExpired();
-}
-
-void marsTimerFunction(FunctionPtr *, void *event) {
- ((MarsTimerEvent *)event)->mars->marsTimerExpired(*(MarsTimerEvent *)event);
+void MarsTimerEvent::fire() {
+ mars->marsTimerExpired(*this);
}
Mars::Mars(InputHandler *nextHandler, PegasusEngine *owner) : Neighborhood(nextHandler, owner, "Mars", kMarsID),
@@ -120,7 +100,7 @@ Mars::Mars(InputHandler *nextHandler, PegasusEngine *owner) : Neighborhood(nextH
_planetMovie(kNoDisplayElement), _junk(kNoDisplayElement), _energyChoiceSpot(kShuttleEnergySpotID),
_gravitonChoiceSpot(kShuttleGravitonSpotID), _tractorChoiceSpot(kShuttleTractorSpotID),
_shuttleViewSpot(kShuttleViewSpotID), _shuttleTransportSpot(kShuttleTransportSpotID) {
- _noAirFuse.setFunctionPtr(&airStageExpiredFunction, this);
+ _noAirFuse.setFunctor(new Common::Functor0Mem<void, Mars>(this, &Mars::airStageExpired));
setIsItemTaken(kMarsCard);
setIsItemTaken(kAirMask);
setIsItemTaken(kCrowbar);
@@ -1341,7 +1321,7 @@ void Mars::arriveAt(const RoomID room, const DirectionConstant direction) {
loadLoopSound2("Sounds/Mars/Robot Loop.aiff", 0x100, 0, 0);
loopExtraSequence(kMars48RobotLoops);
_utilityFuse.primeFuse(kMarsRobotPatienceLimit);
- _utilityFuse.setFunctionPtr(&robotTimerExpiredFunction, (void *)this);
+ _utilityFuse.setFunctor(new Common::Functor0Mem<void, Mars>(this, &Mars::robotTiredOfWaiting));
_utilityFuse.lightFuse();
}
break;
@@ -1349,7 +1329,7 @@ void Mars::arriveAt(const RoomID room, const DirectionConstant direction) {
if (GameState.getMarsSeenRobotAtReactor() && !GameState.getMarsAvoidedReactorRobot()) {
loadLoopSound2("Sounds/Mars/Robot Loop.aiff", 0x100, 0, 0);
_utilityFuse.primeFuse(kMarsRobotPatienceLimit);
- _utilityFuse.setFunctionPtr(&robotTimerExpiredFunction, (void *)this);
+ _utilityFuse.setFunctor(new Common::Functor0Mem<void, Mars>(this, &Mars::robotTiredOfWaiting));
_utilityFuse.lightFuse();
}
break;
@@ -1402,7 +1382,7 @@ void Mars::arriveAt(const RoomID room, const DirectionConstant direction) {
setCurrentActivation(kActivateReactorReadyForCrowBar);
_privateFlags.setFlag(kMarsPrivatePlatformZoomedInFlag, true);
_utilityFuse.primeFuse(kLockFreezeTimeLmit);
- _utilityFuse.setFunctionPtr(&lockThawTimerExpiredFunction, (void *)this);
+ _utilityFuse.setFunctor(new Common::Functor0Mem<void, Mars>(this, &Mars::lockThawed));
_utilityFuse.lightFuse();
} else {
setCurrentActivation(kActivateReactorPlatformOut);
@@ -2184,7 +2164,7 @@ void Mars::receiveNotification(Notification *notification, const NotificationFla
GameState.setMarsSeenRobotAtReactor(true);
loopExtraSequence(kMars48RobotLoops);
_utilityFuse.primeFuse(kMarsRobotPatienceLimit);
- _utilityFuse.setFunctionPtr(&robotTimerExpiredFunction, (void *)this);
+ _utilityFuse.setFunctor(new Common::Functor0Mem<void, Mars>(this, &Mars::robotTiredOfWaiting));
_utilityFuse.lightFuse();
break;
case kMars48RobotDefends:
@@ -2267,7 +2247,7 @@ void Mars::receiveNotification(Notification *notification, const NotificationFla
GameState.setMarsLockFrozen(true);
showExtraView(kMars57LockFrozenView);
_utilityFuse.primeFuse(kLockFreezeTimeLmit);
- _utilityFuse.setFunctionPtr(&lockThawTimerExpiredFunction, (void *)this);
+ _utilityFuse.setFunctor(new Common::Functor0Mem<void, Mars>(this, &Mars::lockThawed));
_utilityFuse.lightFuse();
break;
case kMars57BreakLock:
@@ -2800,7 +2780,7 @@ void Mars::startMarsTimer(TimeValue time, TimeScale scale, MarsTimerCode code) {
_utilityFuse.primeFuse(time, scale);
_marsEvent.mars = this;
_marsEvent.event = code;
- _utilityFuse.setFunctionPtr(&marsTimerFunction, (void *)&_marsEvent);
+ _utilityFuse.setFunctor(new Common::Functor0Mem<void, MarsTimerEvent>(&_marsEvent, &MarsTimerEvent::fire));
_utilityFuse.lightFuse();
}
@@ -3398,7 +3378,7 @@ void Mars::setUpReactorLevel1() {
_choiceHighlight.initReactorChoiceHighlight();
setCurrentActivation(kActivateReactorInGame);
_bombFuse.primeFuse(kColorMatchingTimeLimit);
- _bombFuse.setFunctionPtr(&bombTimerExpiredInGameFunction, (void *)this);
+ _bombFuse.setFunctor(new Common::Functor0Mem<void, Mars>(this, &Mars::bombExplodesInGame));
_bombFuse.lightFuse();
}
diff --git a/engines/pegasus/neighborhood/mars/mars.h b/engines/pegasus/neighborhood/mars/mars.h
index 9aca10a703..3ddbf39515 100644
--- a/engines/pegasus/neighborhood/mars/mars.h
+++ b/engines/pegasus/neighborhood/mars/mars.h
@@ -52,6 +52,8 @@ enum MarsTimerCode {
struct MarsTimerEvent {
Mars *mars;
MarsTimerCode event;
+
+ void fire();
};
enum ShuttleWeaponSelection {
@@ -62,13 +64,7 @@ enum ShuttleWeaponSelection {
};
class Mars : public Neighborhood {
-friend void robotTimerExpiredFunction(FunctionPtr *, void *);
-friend void lockThawTimerExpiredFunction(FunctionPtr *, void *);
-friend void bombTimerExpiredFunction(FunctionPtr *, void *);
-friend void bombTimerExpiredInGameFunction(FunctionPtr *, void *);
-friend void airStageExpiredFunction(FunctionPtr *, void *);
-friend void marsTimerFunction(FunctionPtr *, void *);
-
+friend class MarsTimerEvent;
public:
Mars(InputHandler *, PegasusEngine *);
virtual ~Mars();
diff --git a/engines/pegasus/neighborhood/mars/robotship.cpp b/engines/pegasus/neighborhood/mars/robotship.cpp
index a0ff749910..43a7e558c3 100644
--- a/engines/pegasus/neighborhood/mars/robotship.cpp
+++ b/engines/pegasus/neighborhood/mars/robotship.cpp
@@ -55,10 +55,6 @@ static const CoordType kRovingHeight = kShuttleWindowMidV - kRovingTop;
RobotShip* g_robotShip = 0;
-void timeToDropJunkFunction(FunctionPtr *, void *robotShip) {
- ((RobotShip *)robotShip)->timeToDropJunk();
-}
-
RobotShip::RobotShip() : _spritesMovie(kNoDisplayElement) {
g_robotShip = this;
_shipRange = Common::Rect(kShuttleWindowLeft, kShuttleWindowTop, kShuttleWindowLeft + kShuttleWindowWidth,
@@ -67,7 +63,7 @@ RobotShip::RobotShip() : _spritesMovie(kNoDisplayElement) {
_currentLocation.x = 0;
_currentLocation.y = 0;
_snaring = false;
- _dropJunkFuse.setFunctionPtr(&timeToDropJunkFunction, (void *)this);
+ _dropJunkFuse.setFunctor(new Common::Functor0Mem<void, RobotShip>(this, &RobotShip::timeToDropJunk));
}
RobotShip::~RobotShip() {
diff --git a/engines/pegasus/neighborhood/mars/robotship.h b/engines/pegasus/neighborhood/mars/robotship.h
index b668e8f154..04be3ea56e 100644
--- a/engines/pegasus/neighborhood/mars/robotship.h
+++ b/engines/pegasus/neighborhood/mars/robotship.h
@@ -34,8 +34,6 @@ static const CoordType kShuttleMovieWidth = 114;
static const CoordType kShuttleMovieHeight = 42;
class RobotShip : IdlerTimeBase {
-friend void timeToDropJunkFunction(FunctionPtr *, void *);
-
public:
RobotShip();
virtual ~RobotShip();
diff --git a/engines/pegasus/neighborhood/neighborhood.cpp b/engines/pegasus/neighborhood/neighborhood.cpp
index bb2c6486cc..ae383a661b 100644
--- a/engines/pegasus/neighborhood/neighborhood.cpp
+++ b/engines/pegasus/neighborhood/neighborhood.cpp
@@ -1740,15 +1740,15 @@ void Neighborhood::useIdleTime() {
}
}
-void timerFunction(FunctionPtr *, void *neighborhood) {
- ((Neighborhood *)neighborhood)->timerExpired(((Neighborhood *)neighborhood)->getTimerEvent());
+void Neighborhood::timerFunction() {
+ timerExpired(getTimerEvent());
}
void Neighborhood::scheduleEvent(const TimeValue time, const TimeScale scale, const uint32 eventType) {
_eventTimer.stopFuse();
_eventTimer.primeFuse(time, scale);
_timerEvent = eventType;
- _eventTimer.setFunctionPtr(&timerFunction, this);
+ _eventTimer.setFunctor(new Common::Functor0Mem<void, Neighborhood>(this, &Neighborhood::timerFunction));
_eventTimer.lightFuse();
}
diff --git a/engines/pegasus/neighborhood/neighborhood.h b/engines/pegasus/neighborhood/neighborhood.h
index 8a38eb3389..1fef06657a 100644
--- a/engines/pegasus/neighborhood/neighborhood.h
+++ b/engines/pegasus/neighborhood/neighborhood.h
@@ -110,7 +110,6 @@ typedef Common::Queue<QueueRequest> NeighborhoodActionQueue;
class Neighborhood : public IDObject, public NotificationReceiver, public InputHandler, public Idler {
friend class StriderCallBack;
-friend void timerFunction(FunctionPtr *, void *);
public:
Neighborhood(InputHandler *nextHandler, PegasusEngine *vm, const Common::String &resName, NeighborhoodID id);
@@ -335,6 +334,7 @@ protected:
virtual void timerExpired(const uint32) {}
bool isEventTimerRunning() { return _eventTimer.isFuseLit(); }
uint32 getTimerEvent() { return _timerEvent; }
+ void timerFunction();
void pauseTimer();
void resumeTimer();
diff --git a/engines/pegasus/neighborhood/tsa/fulltsa.cpp b/engines/pegasus/neighborhood/tsa/fulltsa.cpp
index 2269ea7122..98c70aa09d 100644
--- a/engines/pegasus/neighborhood/tsa/fulltsa.cpp
+++ b/engines/pegasus/neighborhood/tsa/fulltsa.cpp
@@ -663,8 +663,8 @@ void FullTSA::init() {
entry->hotspotItem = kPegasusBiochip;
}
-void uncreatedInTSAFunction(FunctionPtr *, void *tsa) {
- ((FullTSA *)tsa)->die(kDeathUncreatedInTSA);
+void FullTSA::dieUncreatedInTSA() {
+ die(kDeathUncreatedInTSA);
}
void FullTSA::start() {
@@ -672,7 +672,7 @@ void FullTSA::start() {
if (!GameState.getScoringEnterTSA()) {
_utilityFuse.primeFuse(GameState.getTSAFuseTimeLimit());
- _utilityFuse.setFunctionPtr(&uncreatedInTSAFunction, (void *)this);
+ _utilityFuse.setFunctor(new Common::Functor0Mem<void, FullTSA>(this, &FullTSA::dieUncreatedInTSA));
_utilityFuse.lightFuse();
} else if (GameState.getTSAState() == kTSAPlayerDetectedRip || GameState.getTSAState() == kTSAPlayerNeedsHistoricalLog) {
_ripTimer.initImage();
diff --git a/engines/pegasus/neighborhood/tsa/fulltsa.h b/engines/pegasus/neighborhood/tsa/fulltsa.h
index 4260a83a78..7dd11a766c 100644
--- a/engines/pegasus/neighborhood/tsa/fulltsa.h
+++ b/engines/pegasus/neighborhood/tsa/fulltsa.h
@@ -54,8 +54,6 @@ static const RoomID kTSA22Red = 28;
static const RoomID kTSA37 = 42;
class FullTSA : public Neighborhood {
-friend void uncreatedInTSAFunction(FunctionPtr *, void *tsa);
-
public:
FullTSA(InputHandler *, PegasusEngine *);
virtual ~FullTSA() {}
@@ -152,6 +150,8 @@ protected:
Common::String getNavMovieName();
Common::String getSoundSpotsName();
+
+ void dieUncreatedInTSA();
};
} // End of namespace Pegasus
diff --git a/engines/pegasus/pegasus.cpp b/engines/pegasus/pegasus.cpp
index cbe2222c83..dbd9ec2a28 100644
--- a/engines/pegasus/pegasus.cpp
+++ b/engines/pegasus/pegasus.cpp
@@ -115,10 +115,6 @@ PegasusEngine::~PegasusEngine() {
delete _gfx;
}
-void introTimerExpiredFunction(FunctionPtr *, void *) {
- ((PegasusEngine *)g_engine)->introTimerExpired();
-}
-
Common::Error PegasusEngine::run() {
_console = new PegasusConsole(this);
_gfx = new GraphicsManager(this);
@@ -186,7 +182,7 @@ Common::Error PegasusEngine::run() {
if (!isDemo()) {
_introTimer = new FuseFunction();
- _introTimer->setFunctionPtr(&introTimerExpiredFunction, 0);
+ _introTimer->setFunctor(new Common::Functor0Mem<void, PegasusEngine>(this, &PegasusEngine::introTimerExpired));
}
while (!shouldQuit()) {
diff --git a/engines/pegasus/timers.h b/engines/pegasus/timers.h
index 1dd32de3c9..5a269c2830 100644
--- a/engines/pegasus/timers.h
+++ b/engines/pegasus/timers.h
@@ -28,6 +28,7 @@
#include "common/list.h"
#include "common/rational.h"
+#include "common/func.h"
#include "pegasus/constants.h"
#include "pegasus/notification.h"
@@ -242,13 +243,16 @@ protected:
Notification _fuseNotification;
};
-class FuseFunction : public Fuse, public FunctionPtr {
+class FuseFunction : public Fuse {
public:
- FuseFunction() {}
- virtual ~FuseFunction() {}
+ FuseFunction() : _functor(0) {}
+ virtual ~FuseFunction() { delete _functor; }
+ void setFunctor(Common::Functor0<void> *functor) { delete _functor; _functor = functor; }
protected:
- virtual void invokeAction() { callFunction(); }
+ virtual void invokeAction() { if (_functor && _functor->isValid()) (*_functor)(); }
+
+ Common::Functor0<void> *_functor;
};
} // End of namespace Pegasus
diff --git a/engines/pegasus/util.cpp b/engines/pegasus/util.cpp
index 03bc5729cc..59df610c33 100644
--- a/engines/pegasus/util.cpp
+++ b/engines/pegasus/util.cpp
@@ -50,24 +50,6 @@ int operator!=(const IDObject &arg1, const IDObject &arg2) {
return arg1.getObjectID() != arg2.getObjectID();
}
-FunctionPtr::FunctionPtr() {
- _function = 0;
- _functionArg = 0;
-}
-
-FunctionPtr::~FunctionPtr() {
-}
-
-void FunctionPtr::setFunctionPtr(tFunctionPtr function, void *functionArg) {
- _function = function;
- _functionArg = functionArg;
-}
-
-void FunctionPtr::callFunction() {
- if (_function != 0)
- (*_function)(this, _functionArg);
-}
-
int32 pegasusRound(const int32 a, const int32 b) {
if (b < 0)
if (a < 0)
diff --git a/engines/pegasus/util.h b/engines/pegasus/util.h
index 57839fca7b..16425343ca 100644
--- a/engines/pegasus/util.h
+++ b/engines/pegasus/util.h
@@ -47,24 +47,6 @@ private:
int32 _objectID;
};
-class FunctionPtr;
-
-typedef void (*tFunctionPtr)(FunctionPtr *theFunction, void *functionArg);
-
-class FunctionPtr {
-public:
- FunctionPtr();
- virtual ~FunctionPtr();
-
- void setFunctionPtr(tFunctionPtr function, void *functionArg);
-
-protected:
- void callFunction();
-
- tFunctionPtr _function;
- void *_functionArg;
-};
-
#define NUM_FLAGS (sizeof(Unit) * 8)
#define BIT_INDEX_SHIFT (sizeof(Unit) + 2 - (sizeof(Unit)) / 3)
#define BIT_INDEX_MASK (NUM_FLAGS - 1)