diff options
author | Matthew Stewart | 2018-06-24 02:28:18 -0400 |
---|---|---|
committer | Eugene Sandulenko | 2018-08-09 08:37:30 +0200 |
commit | a5c7d6ae11c255647e2026ae447e76f0ae52c67f (patch) | |
tree | 2b86889757948ac43b8cf080101005683f9731a2 /engines/startrek/room.cpp | |
parent | d8e255e9e7fcd1b91f85ea0a14596d679542fae6 (diff) | |
download | scummvm-rg350-a5c7d6ae11c255647e2026ae447e76f0ae52c67f.tar.gz scummvm-rg350-a5c7d6ae11c255647e2026ae447e76f0ae52c67f.tar.bz2 scummvm-rg350-a5c7d6ae11c255647e2026ae447e76f0ae52c67f.zip |
STARTREK: Revamp of action callbacks.
Old system of putting a callback in an action wouldn't work since it
wasn't serializable. Now it seaches for an index corresponding to the
function pointer before constructing an action.
Diffstat (limited to 'engines/startrek/room.cpp')
-rw-r--r-- | engines/startrek/room.cpp | 24 |
1 files changed, 19 insertions, 5 deletions
diff --git a/engines/startrek/room.cpp b/engines/startrek/room.cpp index 62949bedf0..ae5523fd3c 100644 --- a/engines/startrek/room.cpp +++ b/engines/startrek/room.cpp @@ -172,6 +172,23 @@ Common::Point Room::getBeamInPosition(int crewmanIndex) { } +// For actions of type ACTION_FINISHED_ANIMATION or ACTION_FINISHED_WALKING, this takes +// a function pointer and returns the index corresponding to that callback. +// Creates a fatal error on failure. +int Room::findFunctionPointer(int action, void (Room::*funcPtr)()) { + assert(action == ACTION_FINISHED_ANIMATION || action == ACTION_FINISHED_WALKING); + + for (int i = 0; i < _numRoomActions; i++) { + if (_roomActionList[i].action.type == action && _roomActionList[i].funcPtr == funcPtr) + return _roomActionList[i].action.b1; + } + + if (action == ACTION_FINISHED_ANIMATION) + error("Couldn't find FINISHED_ANIMATION function pointer"); + else + error("Couldn't find FINISHED_WALKING function pointer"); +} + // Interface for room-specific code void Room::loadActorAnim(int actorIndex, Common::String anim, int16 x, int16 y, uint16 finishedAnimActionParam) { @@ -190,7 +207,6 @@ void Room::loadActorAnim(int actorIndex, Common::String anim, int16 x, int16 y, if (finishedAnimActionParam != 0) { actor->triggerActionWhenAnimFinished = true; actor->finishedAnimActionParam = finishedAnimActionParam; - actor->finishedAnimCallback = nullptr; } } @@ -211,8 +227,7 @@ void Room::loadActorAnimC(int actorIndex, Common::String anim, int16 x, int16 y, if (funcPtr != nullptr) { actor->triggerActionWhenAnimFinished = true; - actor->finishedAnimActionParam = 0; - actor->finishedAnimCallback = funcPtr; + actor->finishedAnimActionParam = findFunctionPointer(ACTION_FINISHED_ANIMATION, funcPtr); } } @@ -330,7 +345,6 @@ void Room::walkCrewman(int actorIndex, int16 destX, int16 destY, uint16 finished if (success && finishedAnimActionParam != 0) { actor->triggerActionWhenAnimFinished = true; actor->finishedAnimActionParam = finishedAnimActionParam; - actor->finishedAnimCallback = nullptr; } } @@ -347,7 +361,7 @@ void Room::walkCrewmanC(int actorIndex, int16 destX, int16 destY, void (Room::*f if (success && funcPtr != nullptr) { actor->triggerActionWhenAnimFinished = true; actor->finishedAnimActionParam = 0; - actor->finishedAnimCallback = funcPtr; + actor->finishedAnimActionParam = findFunctionPointer(ACTION_FINISHED_WALKING, funcPtr); } } |