aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthew Stewart2018-06-24 02:28:18 -0400
committerEugene Sandulenko2018-08-09 08:37:30 +0200
commita5c7d6ae11c255647e2026ae447e76f0ae52c67f (patch)
tree2b86889757948ac43b8cf080101005683f9731a2
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.
-rw-r--r--engines/startrek/action.h12
-rw-r--r--engines/startrek/awaymission.cpp6
-rw-r--r--engines/startrek/object.h4
-rw-r--r--engines/startrek/room.cpp24
-rw-r--r--engines/startrek/room.h2
-rw-r--r--engines/startrek/rooms/function_map.h53
-rw-r--r--engines/startrek/startrek.cpp14
7 files changed, 77 insertions, 38 deletions
diff --git a/engines/startrek/action.h b/engines/startrek/action.h
index 6774000771..55a08da738 100644
--- a/engines/startrek/action.h
+++ b/engines/startrek/action.h
@@ -43,9 +43,7 @@ enum Acton {
ACTION_TIMER_EXPIRED = 8,
ACTION_FINISHED_ANIMATION = 10,
ACTION_FINISHED_WALKING = 12,
- ACTION_OPTIONS = 13, // Not really an action, but selectable from action menu
-
- ACTION_CALLBACK = 255 // Custom action in ScummVM; calls a function in the Room class
+ ACTION_OPTIONS = 13 // Not really an action, but selectable from action menu
};
struct Action : Common::Serializable {
@@ -54,10 +52,6 @@ struct Action : Common::Serializable {
byte b2;
byte b3;
- // Only used with ACTION_CALLBACK.
- // TODO: Fix serialization. Can this even be serialized?
- void (Room::*roomFuncPtr)();
-
Action() {}
Action(int _type, int _b1, int _b2, int _b3)
: type((byte)_type),
@@ -65,10 +59,6 @@ struct Action : Common::Serializable {
b2((byte)_b2),
b3((byte)_b3) {}
- Action(int _type, void (Room::*funcPtr)())
- : type((byte)_type),
- roomFuncPtr(funcPtr) {}
-
// ACTION_USE, ACTION_GET, ACTION_LOOK, ACTION_TALK
byte activeObject() { return b1; }
diff --git a/engines/startrek/awaymission.cpp b/engines/startrek/awaymission.cpp
index 4c2e8a1343..944e0a2959 100644
--- a/engines/startrek/awaymission.cpp
+++ b/engines/startrek/awaymission.cpp
@@ -571,12 +571,6 @@ void StarTrekEngine::handleAwayMissionAction() {
initAwayCrewPositions(warpIndex ^ 1);
}
break;
-
- case ACTION_CALLBACK:
- // Custom action for ScummVM; calls a function in the Room class. Useful for
- // simplifying chains of calls.
- (_room.get()->*(action.roomFuncPtr))();
- break;
}
}
diff --git a/engines/startrek/object.h b/engines/startrek/object.h
index 6736ca5d7d..3a2dc335ef 100644
--- a/engines/startrek/object.h
+++ b/engines/startrek/object.h
@@ -93,11 +93,8 @@ struct Actor {
// "triggerActionWhenAnimFinished" is true, it will create an action of type
// "ACTION_FINISHED_WALKING" or "ACTION_FINISHED_ANIMATION", with the integer value
// "finishedAnimActionParam".
- // To make things simpler, it can also use a callback to a function in the Room class,
- // if "finishedAnimCallback" is non-null.
bool triggerActionWhenAnimFinished;
uint16 finishedAnimActionParam;
- void (Room::*finishedAnimCallback)();
char animationString2[8];
uint16 field70;
@@ -150,7 +147,6 @@ public:
field62(),
triggerActionWhenAnimFinished(),
finishedAnimActionParam(),
- finishedAnimCallback(),
//animationString2[8](),
field70(),
field72(),
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);
}
}
diff --git a/engines/startrek/room.h b/engines/startrek/room.h
index f6bfe4254a..74a191f7ca 100644
--- a/engines/startrek/room.h
+++ b/engines/startrek/room.h
@@ -96,6 +96,8 @@ private:
int _numRoomActions;
+ int findFunctionPointer(int action, void (Room::*funcPtr)());
+
// Interface for room-specific code
void loadActorAnim(int actorIndex, Common::String anim, int16 x, int16 y, uint16 field66 = 0); // Cmd 0x00
void loadActorAnimC(int actorIndex, Common::String anim, int16 x, int16 y, void (Room::*funcPtr)());// Cmd 0x00
diff --git a/engines/startrek/rooms/function_map.h b/engines/startrek/rooms/function_map.h
index a28b5b3768..7eafd5b8cf 100644
--- a/engines/startrek/rooms/function_map.h
+++ b/engines/startrek/rooms/function_map.h
@@ -1113,6 +1113,8 @@ RoomAction love3ActionList[] = {
{ Action(ACTION_USE, OBJECT_IWRENCH, 0x21, 0), &Room::love3UseWrenchOnMonitor },
{ Action(ACTION_USE, OBJECT_IH2O, 0x21, 0), &Room::love3UseWaterOnMonitor },
+ { Action(ACTION_FINISHED_WALKING, 14, 0, 0), &Room::love3ReachedMonitorToUseWater },
+ { Action(ACTION_FINISHED_ANIMATION, 6, 0, 0), &Room::love3PouredWaterOnMonitor },
{ Action(ACTION_USE, OBJECT_KIRK, 0x20, 0), &Room::love3UseCrewmanOnEngineeringPanelOrGrate },
{ Action(ACTION_USE, OBJECT_SPOCK, 0x20, 0), &Room::love3UseCrewmanOnEngineeringPanelOrGrate },
@@ -1124,28 +1126,59 @@ RoomAction love3ActionList[] = {
{ Action(ACTION_USE, OBJECT_REDSHIRT, 11, 0), &Room::love3UseCrewmanOnEngineeringPanelOrGrate },
{ Action(ACTION_USE, OBJECT_IWRENCH, 11, 0), &Room::love3UseWrenchOnGrate },
+ { Action(ACTION_FINISHED_WALKING, 4, 0, 0), &Room::love3ReachedGateWithWrench },
+ { Action(ACTION_FINISHED_ANIMATION, 7, 0, 0), &Room::love3OpenedOrClosedGrate },
+
{ Action(ACTION_USE, OBJECT_KIRK, 0x22, 0), &Room::love3UseCrewmanOnShaft },
{ Action(ACTION_USE, OBJECT_SPOCK, 0x22, 0), &Room::love3UseCrewmanOnShaft },
{ Action(ACTION_USE, OBJECT_MCCOY, 0x22, 0), &Room::love3UseCrewmanOnShaft },
{ Action(ACTION_USE, OBJECT_REDSHIRT, 0x22, 0), &Room::love3UseCrewmanOnShaft },
+
{ Action(ACTION_USE, OBJECT_IH2O, 0x22, 0), &Room::love3UseWaterOnShaft },
+ { Action(ACTION_FINISHED_WALKING, 5, 0, 0), &Room::love3ReachedShaftUsingWater },
+ { Action(ACTION_FINISHED_ANIMATION, 8, 0, 0), &Room::love3PouredWaterDownShaft },
+
{ Action(ACTION_USE, OBJECT_IN2O, 0x22, 0), &Room::love3UseNitrousOxideOnShaft },
+ { Action(ACTION_FINISHED_WALKING, 6, 0, 0), &Room::love3ReachedShaftUsingNitrousOxide },
+ { Action(ACTION_FINISHED_ANIMATION, 9, 0, 0), &Room::love3PouredNitrousOxideDownShaft },
+
{ Action(ACTION_USE, OBJECT_INH3, 0x22, 0), &Room::love3UseAmmoniaOnShaft },
+ { Action(ACTION_FINISHED_WALKING, 7, 0, 0), &Room::love3ReachedShaftUsingAmmonia },
+ { Action(ACTION_FINISHED_ANIMATION, 10, 0, 0), &Room::love3PouredAmmoniaDownShaft },
+
{ Action(ACTION_USE, OBJECT_IRLG, 0x22, 0), &Room::love3UseRomulanLaughingGasOnShaft },
+ { Action(ACTION_FINISHED_WALKING, 8, 0, 0), &Room::love3ReachedShaftUsingRomulanLaughingGas },
+ { Action(ACTION_FINISHED_ANIMATION, 11, 0, 0), &Room::love3PouredRomulanLaughingGasDownShaft },
+
{ Action(ACTION_GET, 10, 0, 0), &Room::love3GetWrench },
+ { Action(ACTION_FINISHED_WALKING, 9, 0, 0), &Room::love3ReachedWrenchToGet },
+ { Action(ACTION_FINISHED_ANIMATION, 12, 0, 0), &Room::love3PickedUpWrench },
+
{ Action(ACTION_GET, 12, 0, 0), &Room::love3GetGasTank },
+ { Action(ACTION_FINISHED_WALKING, 10, 0, 0), &Room::love3ReachedGasTankToGet },
+
{ Action(ACTION_USE, OBJECT_IANTIGRA, 12, 0), &Room::love3UseAntigravOnGasTank },
+ { Action(ACTION_FINISHED_WALKING, 11, 0, 0), &Room::love3ReachedGasTankUsingAntigrav },
+ { Action(ACTION_FINISHED_ANIMATION, 13, 0, 0), &Room::love3PickedUpGasTank },
+
{ Action(ACTION_GET, 9, 0, 0), &Room::love3GetInsulation },
+ { Action(ACTION_FINISHED_WALKING, 12, 0, 0), &Room::love3ReachedInsulationToGet },
+ { Action(ACTION_FINISHED_ANIMATION, 14, 0, 0), &Room::love3PickedUpInsulation },
// TODO: common code
};
RoomAction love4ActionList[] = {
{ Action(ACTION_TICK, 1, 0, 0), &Room::love4Tick1 },
{ Action(ACTION_TICK, 10, 0, 0), &Room::love4Tick10 },
+
{ Action(ACTION_WALK, 8, 0, 0), &Room::love4WalkToDoor },
{ Action(ACTION_WALK, 0x20, 0, 0), &Room::love4WalkToDoor },
{ Action(ACTION_TOUCHED_HOTSPOT, 0, 0, 0), &Room::love4TouchedHotspot0 },
+ { Action(ACTION_FINISHED_WALKING, 1, 0, 0), &Room::love4DoorOpenedOrReached },
+ { Action(ACTION_FINISHED_ANIMATION, 1, 0, 0), &Room::love4DoorOpenedOrReached },
+
{ Action(ACTION_USE, OBJECT_KIRK, 0x21, 0), &Room::love4UseKirkOnLadder },
+ { Action(ACTION_FINISHED_WALKING, 2, 0, 0), &Room::love4ReachedLadder },
{ Action(ACTION_USE, OBJECT_IPHASERS, 9, 0), &Room::love4UseStunPhaserOnRomulan },
{ Action(ACTION_USE, OBJECT_IPHASERS, 10, 0), &Room::love4UseStunPhaserOnRomulan },
{ Action(ACTION_USE, OBJECT_IPHASERS, 11, 0), &Room::love4UseStunPhaserOnRomulan },
@@ -1176,10 +1209,20 @@ RoomAction love4ActionList[] = {
{ Action(ACTION_USE, OBJECT_IMTRICOR, 12, 0), &Room::love4UseMTricorderOnRomulan },
{ Action(ACTION_USE, OBJECT_IMTRICOR, -1, 0), &Room::love4UseMTricorderAnywhere },
{ Action(ACTION_USE, OBJECT_ISTRICOR, -1, 0), &Room::love4UseSTricorderAnywhere },
+
{ Action(ACTION_USE, OBJECT_ICURE, 9, 0), &Room::love4UseCureOnRomulan },
{ Action(ACTION_USE, OBJECT_ICURE, 10, 0), &Room::love4UseCureOnRomulan },
{ Action(ACTION_USE, OBJECT_ICURE, 11, 0), &Room::love4UseCureOnRomulan },
{ Action(ACTION_USE, OBJECT_ICURE, 12, 0), &Room::love4UseCureOnRomulan },
+ { Action(ACTION_FINISHED_WALKING, 3, 0, 0), &Room::love4MccoyReachedRomulan4 },
+ { Action(ACTION_FINISHED_ANIMATION, 2, 0, 0), &Room::love4MccoyCuredRomulan4 },
+ { Action(ACTION_FINISHED_WALKING, 4, 0, 0), &Room::love4MccoyReachedRomulan3 },
+ { Action(ACTION_FINISHED_ANIMATION, 3, 0, 0), &Room::love4MccoyCuredRomulan3 },
+ { Action(ACTION_FINISHED_WALKING, 5, 0, 0), &Room::love4MccoyReachedRomulan2 },
+ { Action(ACTION_FINISHED_ANIMATION, 4, 0, 0), &Room::love4MccoyCuredRomulan2 },
+ { Action(ACTION_FINISHED_WALKING, 6, 0, 0), &Room::love4MccoyReachedRomulan1 },
+ { Action(ACTION_FINISHED_ANIMATION, 5, 0, 0), &Room::love4MccoyCuredRomulan1 },
+
{ Action(ACTION_USE, OBJECT_IH2O, 9, 0), &Room::love4UseWaterOnRomulan },
{ Action(ACTION_USE, OBJECT_IH2O, 10, 0), &Room::love4UseWaterOnRomulan },
{ Action(ACTION_USE, OBJECT_IH2O, 11, 0), &Room::love4UseWaterOnRomulan },
@@ -1216,6 +1259,9 @@ RoomAction love5ActionList[] = {
{ Action(ACTION_LOOK, 11, 0, 0), &Room::love5LookAtDrCheever },
{ Action(ACTION_LOOK, 9, 0, 0), &Room::love5LookAtPreax },
{ Action(ACTION_TALK, 9, 0, 0), &Room::love5TalkToPreax },
+ { Action(ACTION_FINISHED_WALKING, 5, 0, 0), &Room::love5MccoyReachedSpockToCure },
+ { Action(ACTION_FINISHED_ANIMATION, 6, 0, 0), &Room::love5MccoyCuredSpock },
+ { Action(ACTION_FINISHED_WALKING, 6, 0, 0), &Room::love5CrewmanReachedBeamoutPosition },
{ Action(ACTION_TALK, 10, 0, 0), &Room::love5TalkToDrMarcus },
{ Action(ACTION_TALK, 11, 0, 0), &Room::love5TalkToDrCheever },
{ Action(ACTION_TALK, OBJECT_KIRK, 0, 0), &Room::love5TalkToKirk },
@@ -1231,9 +1277,16 @@ RoomAction love5ActionList[] = {
{ Action(ACTION_USE, OBJECT_IH2O, 9, 0), &Room::love5UseWaterOnPreax },
{ Action(ACTION_USE, OBJECT_ISAMPLE, 9, 0), &Room::love5UseCureSampleOnPreax },
{ Action(ACTION_USE, OBJECT_ICURE, 9, 0), &Room::love5UseCureOnPreax },
+ { Action(ACTION_FINISHED_WALKING, 4, 0, 0), &Room::love5ReachedPreaxUsingCure },
+ { Action(ACTION_FINISHED_ANIMATION, 5, 0, 0), &Room::love5CuredPreax },
{ Action(ACTION_USE, -1, 9, 0), &Room::love5UseAnythingOnPreax },
{ Action(ACTION_USE, OBJECT_KIRK, 10, 0), &Room::love5UseKirkOnMarcusOrCheever },
{ Action(ACTION_USE, OBJECT_KIRK, 11, 0), &Room::love5UseKirkOnMarcusOrCheever },
+ { Action(ACTION_FINISHED_WALKING, 1, 0, 0), &Room::love5KirkReachedCheever },
+ { Action(ACTION_FINISHED_ANIMATION, 2, 0, 0), &Room::love5KirkUntiedCheever },
+ { Action(ACTION_FINISHED_WALKING, 2, 0, 0), &Room::love5KirkReachedMarcus },
+ { Action(ACTION_FINISHED_ANIMATION, 3, 0, 0), &Room::love5KirkUntiedMarcus },
+ { Action(ACTION_FINISHED_ANIMATION, 4, 0, 0), &Room::love5MarcusStoodUp },
// TODO: common code
};
diff --git a/engines/startrek/startrek.cpp b/engines/startrek/startrek.cpp
index 0296e359d9..7fe0257409 100644
--- a/engines/startrek/startrek.cpp
+++ b/engines/startrek/startrek.cpp
@@ -459,12 +459,7 @@ void StarTrekEngine::updateActorAnimations() {
if (nextAnimFrame == actor->numAnimFrames - 1) {
actor->field62++;
if (actor->triggerActionWhenAnimFinished) {
- if (actor->finishedAnimCallback != nullptr) {
- addAction(Action(ACTION_CALLBACK, actor->finishedAnimCallback));
- actor->finishedAnimCallback = nullptr;
- }
- else
- addAction(Action(ACTION_FINISHED_ANIMATION, actor->finishedAnimActionParam, 0, 0));
+ addAction(Action(ACTION_FINISHED_ANIMATION, actor->finishedAnimActionParam, 0, 0));
}
}
}
@@ -535,12 +530,7 @@ void StarTrekEngine::updateActorAnimations() {
if (actor->iwSrcPosition == -1) {
if (actor->triggerActionWhenAnimFinished) {
actor->triggerActionWhenAnimFinished = false;
- if (actor->finishedAnimCallback != nullptr) {
- addAction(Action(ACTION_CALLBACK, actor->finishedAnimCallback));
- actor->finishedAnimCallback = nullptr;
- }
- else
- addAction(Action(ACTION_FINISHED_WALKING, actor->finishedAnimActionParam & 0xff, 0, 0));
+ addAction(Action(ACTION_FINISHED_WALKING, actor->finishedAnimActionParam & 0xff, 0, 0));
}
actor->sprite.bitmap.reset();