aboutsummaryrefslogtreecommitdiff
path: root/engines/startrek/room.cpp
diff options
context:
space:
mode:
authorMatthew Stewart2018-06-24 02:28:18 -0400
committerEugene Sandulenko2018-08-09 08:37:30 +0200
commita5c7d6ae11c255647e2026ae447e76f0ae52c67f (patch)
tree2b86889757948ac43b8cf080101005683f9731a2 /engines/startrek/room.cpp
parentd8e255e9e7fcd1b91f85ea0a14596d679542fae6 (diff)
downloadscummvm-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.cpp24
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);
}
}