aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
authorMatthew Stewart2018-06-24 16:18:12 -0400
committerEugene Sandulenko2018-08-09 08:37:30 +0200
commitaca19870562fe4dfcd98f3b062bf74dd0dee6daa (patch)
tree3386f904cb9265b550a0f04fd1d660ef30add684 /engines
parenta5c7d6ae11c255647e2026ae447e76f0ae52c67f (diff)
downloadscummvm-rg350-aca19870562fe4dfcd98f3b062bf74dd0dee6daa.tar.gz
scummvm-rg350-aca19870562fe4dfcd98f3b062bf74dd0dee6daa.tar.bz2
scummvm-rg350-aca19870562fe4dfcd98f3b062bf74dd0dee6daa.zip
STARTREK: Implement common code for LOVE mission
Diffstat (limited to 'engines')
-rw-r--r--engines/startrek/awaymission.h7
-rw-r--r--engines/startrek/module.mk1
-rw-r--r--engines/startrek/room.cpp10
-rw-r--r--engines/startrek/room.h87
-rw-r--r--engines/startrek/rooms/function_map.h117
-rw-r--r--engines/startrek/rooms/love0.cpp55
-rw-r--r--engines/startrek/rooms/love1.cpp148
-rw-r--r--engines/startrek/rooms/love2.cpp128
-rw-r--r--engines/startrek/rooms/love3.cpp28
-rw-r--r--engines/startrek/rooms/love4.cpp19
-rw-r--r--engines/startrek/rooms/love5.cpp10
-rw-r--r--engines/startrek/rooms/lovea.cpp253
-rw-r--r--engines/startrek/startrek.cpp2
-rw-r--r--engines/startrek/text.h62
14 files changed, 653 insertions, 274 deletions
diff --git a/engines/startrek/awaymission.h b/engines/startrek/awaymission.h
index 8eaabbebc9..2edcf18f16 100644
--- a/engines/startrek/awaymission.h
+++ b/engines/startrek/awaymission.h
@@ -143,8 +143,8 @@ struct AwayMission {
bool alreadyStartedMission; // 0x29
bool knowAboutVirus; // 0x2a
bool romulansUnconsciousFromLaughingGas; // 0x2b
- bool field2c; // 0x2c
- bool field2d; // 0x2d
+ bool releasedHumanLaughingGas; // 0x2c
+ bool releasedRomulanLaughingGas; // 0x2d
bool chamberHasCure; // 0x2e
bool freezerOpen; // 0x2f
bool chamberHasDish; // 0x30
@@ -167,7 +167,10 @@ struct AwayMission {
bool romulansUnconsciousFromVirus; // 0x41
bool freedMarcusAndCheever; // 0x42
bool preaxCured; // 0x43
+ byte spockInfectionCounter; // 0x45: When this reached 100, Spock dies.
bool spockCured; // 0x46
+ bool contactedEnterpriseBeforeCure; // 0x47
+ bool contactedEnterpriseAfterCure; // 0x48
bool spockAccessedConsole; // 0x49
bool mccoyAccessedConsole; // 0x4a
bool gotPolyberylcarbonate; // 0x4b
diff --git a/engines/startrek/module.mk b/engines/startrek/module.mk
index 1696da7708..6de706e257 100644
--- a/engines/startrek/module.mk
+++ b/engines/startrek/module.mk
@@ -36,6 +36,7 @@ MODULE_OBJS = \
rooms/love3.o \
rooms/love4.o \
rooms/love5.o \
+ rooms/lovea.o \
diff --git a/engines/startrek/room.cpp b/engines/startrek/room.cpp
index ae5523fd3c..f4d9dd86d0 100644
--- a/engines/startrek/room.cpp
+++ b/engines/startrek/room.cpp
@@ -279,7 +279,7 @@ int Room::showRoomSpecificText(const char **array) {
return _vm->showText(&StarTrekEngine::readTextFromArray, (uintptr)array, 20, 20, textColor, true, false, false);
}
-int Room::showText(const int *textIDs) {
+int Room::showText(const TextRef *textIDs) {
int numIDs = 0;
while (textIDs[numIDs] != TX_BLANK)
numIDs++;
@@ -293,7 +293,7 @@ int Room::showText(const int *textIDs) {
return retval;
}
-int Room::showText(int speaker, int text) {
+int Room::showText(TextRef speaker, TextRef text) {
int textIDs[3];
textIDs[0] = speaker;
textIDs[1] = text;
@@ -301,7 +301,7 @@ int Room::showText(int speaker, int text) {
return showText(textIDs);
}
-int Room::showText(int text) {
+int Room::showText(TextRef text) {
return showText(TX_NULL, text);
}
@@ -458,7 +458,7 @@ void Room::playVoc(Common::String filename) {
_vm->_sound->playVoc(filename);
}
-void Room::spockScan(int direction, int text, bool changeDirection) {
+void Room::spockScan(int direction, TextRef text, bool changeDirection) {
const char *dirs = "nsew";
Common::String anim = "sscan_";
anim.setChar(dirs[direction], 5);
@@ -471,7 +471,7 @@ void Room::spockScan(int direction, int text, bool changeDirection) {
showText(TX_SPEAKER_SPOCK, text);
}
-void Room::mccoyScan(int direction, int text, bool changeDirection) {
+void Room::mccoyScan(int direction, TextRef text, bool changeDirection) {
const char *dirs = "nsew";
Common::String anim = "mscan_";
anim.setChar(dirs[direction], 5);
diff --git a/engines/startrek/room.h b/engines/startrek/room.h
index 74a191f7ca..c203c34a28 100644
--- a/engines/startrek/room.h
+++ b/engines/startrek/room.h
@@ -104,9 +104,9 @@ private:
void loadActorStandAnim(int actorIndex); // Cmd 0x01
void loadActorAnim2(int actorIndex, Common::String anim, int16 x, int16 y, uint16 field66 = 0);// Cmd 0x02
int showRoomSpecificText(const char **textAddr); // (Deprecated, use function below) // Cmd 0x03
- int showText(const int *text); // Cmd 0x03
- int showText(int speaker, int text); // Cmd 0x03
- int showText(int text); // Cmd 0x03
+ int showText(const TextRef *text); // Cmd 0x03
+ int showText(TextRef speaker, TextRef text); // Cmd 0x03
+ int showText(TextRef text); // Cmd 0x03
void giveItem(int item); // Cmd 0x04
// Command 0x05: "demon4ShowSunPuzzle"
void loadRoomIndex(int roomIndex, int spawnIndex); // Cmd 0x06
@@ -129,8 +129,8 @@ private:
// If "changeDirection" is true, they remain facing that direction even after their
// animation is finished. The game is inconsistent about doing this.
- void spockScan(int direction, int text, bool changeDirection);
- void mccoyScan(int direction, int text, bool changeDirection);
+ void spockScan(int direction, TextRef text, bool changeDirection);
+ void mccoyScan(int direction, TextRef text, bool changeDirection);
// Room-specific code
public:
@@ -753,6 +753,7 @@ public:
void love0MccoyReachedConsole();
void love0MccoyAccessedConsole();
void love0InteractWithConsole();
+ void love0GetDoorOrConsole();
// LOVE1
void love1Tick1();
@@ -1100,6 +1101,22 @@ public:
void love5KirkUntiedMarcus();
void love5MarcusStoodUp();
+ // LOVEA (common code)
+ void loveaTimer0Expired();
+ void loveaTimer1Expired();
+ void loveaUseMedkitOnSpock();
+ void loveaUseCureSampleOnSpock();
+ void loveaUseCureOnSpock();
+ void loveaSpockOrMccoyInPositionToUseCure();
+ void loveaFinishedCuringSpock();
+ void loveaTimer2Expired();
+ void loveaUseMTricorderOnSpock();
+ void loveaUseMTricorderOnHuman();
+ void loveaUseRomulanLaughingGas();
+ void loveaUseHumanLaughingGas();
+ void loveaUseAmmonia();
+ void loveaUseCommunicator();
+
private:
// Room-specific variables. This is memset'ed to 0 when the room is initialized.
union {
@@ -1163,66 +1180,48 @@ private:
byte shootKirkOverride; // 0x1ec4
} tug2;
+
struct {
+ // love0
bool heardSummaryOfVirus; // 0xda
- byte door2OpenCounter; // 0xdc
- byte door1OpenCounter; // 0xdd
- byte _de; // 0xde
-
int16 consoleCrewman; // 0xe3
char consoleAnimation[10]; // 0xe5
- int32 consoleSpeaker; // 0xe7
- int32 consoleText; // 0xe9
+ TextRef consoleSpeaker; // 0xe7
+ TextRef consoleText; // 0xe9
- byte _8ab; // 0x8ab
- byte _8ac; // 0x8ac
- } love0;
-
- struct {
- byte door3OpenCounter; // 0xcb
- byte door1OpenCounter; // 0xcc
- byte door2OpenCounter; // 0xcd
- bool walkingToDoor; // 0xce
- int32 dyingSpeaker; // 0xcf
+ // love1
+ TextRef dyingSpeaker; // 0xcf
int16 crewmanUsingFreezerRetX; // 0xd1
int16 crewmanUsingFreezerRetY; // 0xd3
int16 crewmanUsingDevice; // 0xd9
int16 itemInNozzle; // 0xdd
char bottleAnimation[10]; // 0xdf
- byte _1d2a; // 0x1d2a
- byte _1d2b; // 0x1d2b
- } love1;
-
- struct {
+ // love2
byte canisterType; // 0xca
byte cb; // 0xcb
- bool walkingToDoor; // 0xcc
- byte doorOpenCounter; // 0xcd
int16 canisterItem; // 0xce
char canisterAnim[10]; // 0xd0
- int16 d2; // 0xd2
- char d6[10]; // 0xd6
- char d8[10]; // 0xd8
- byte _2966; // 0x2966
- byte _2967; // 0x2967
- } love2;
+ int16 chamberObject; // 0xd2
+ char chamberInputAnim[10]; // 0xd6
+ char chamberOutputAnim[10]; // 0xd8
- struct {
+ // love3
byte activeCrewman;
- byte _188e; // 0x188e
- byte _188f; // 0x188f
- } love3;
- struct {
+ // love4
bool gaveWaterToRomulans; // 0xca
- byte doorOpenCounter; // 0xcb
- bool walkingToDoor; // 0xcc
- } love4;
- struct {
+ // love5
byte numCrewmenReadyToBeamOut; // 0xcb
- } love5;
+
+ // common
+ byte walkingToDoor;
+ byte doorOpenCounter;
+ byte spockAndMccoyReadyToUseCure;
+ byte cmnXPosToCureSpock;
+ byte cmnYPosToCureSpock;
+ } love;
} _roomVar;
diff --git a/engines/startrek/rooms/function_map.h b/engines/startrek/rooms/function_map.h
index 7eafd5b8cf..18f7005407 100644
--- a/engines/startrek/rooms/function_map.h
+++ b/engines/startrek/rooms/function_map.h
@@ -819,8 +819,27 @@ RoomAction love0ActionList[] = {
{ Action(ACTION_USE, OBJECT_MCCOY, 0x20, 0), &Room::love0UseMccoyOnConsole },
{ Action(ACTION_FINISHED_WALKING, 3, 0, 0), &Room::love0MccoyReachedConsole },
{ Action(ACTION_FINISHED_ANIMATION, 6, 0, 0), &Room::love0MccoyAccessedConsole },
- // TODO: there's a lot of "extra" stuff at the end of the file. I don't think it's
- // unused, but I'm not sure how it's run.
+ { Action(ACTION_GET, 8, 0, 0), &Room::love0GetDoorOrConsole },
+ { Action(ACTION_GET, 9, 0, 0), &Room::love0GetDoorOrConsole },
+ { Action(ACTION_GET, 0x20, 0, 0), &Room::love0GetDoorOrConsole },
+
+ // Common code
+ { Action(ACTION_TIMER_EXPIRED, 0, 0, 0), &Room::loveaTimer0Expired },
+ { Action(ACTION_TIMER_EXPIRED, 1, 0, 0), &Room::loveaTimer1Expired },
+ { Action(ACTION_USE, OBJECT_IMEDKIT, OBJECT_SPOCK, 0), &Room::loveaUseMedkitOnSpock },
+ { Action(ACTION_USE, OBJECT_ISAMPLE, OBJECT_SPOCK, 0), &Room::loveaUseCureSampleOnSpock },
+ { Action(ACTION_USE, OBJECT_ICURE, OBJECT_SPOCK, 0), &Room::loveaUseCureOnSpock },
+ { Action(ACTION_FINISHED_WALKING, 99, 0, 0), &Room::loveaSpockOrMccoyInPositionToUseCure },
+ { Action(ACTION_FINISHED_ANIMATION, 99, 0, 0), &Room::loveaFinishedCuringSpock },
+ { Action(ACTION_TIMER_EXPIRED, 2, 0, 0), &Room::loveaTimer2Expired },
+ { Action(ACTION_USE, OBJECT_IMTRICOR, OBJECT_SPOCK, 0), &Room::loveaUseMTricorderOnSpock },
+ { Action(ACTION_USE, OBJECT_IMTRICOR, OBJECT_KIRK, 0), &Room::loveaUseMTricorderOnHuman },
+ { Action(ACTION_USE, OBJECT_IMTRICOR, OBJECT_MCCOY, 0), &Room::loveaUseMTricorderOnHuman },
+ { Action(ACTION_USE, OBJECT_IMTRICOR, OBJECT_REDSHIRT, 0), &Room::loveaUseMTricorderOnHuman },
+ { Action(ACTION_USE, OBJECT_IRLG, -1, 0), &Room::loveaUseRomulanLaughingGas },
+ { Action(ACTION_USE, OBJECT_IN2O, -1, 0), &Room::loveaUseHumanLaughingGas },
+ { Action(ACTION_USE, OBJECT_INH3, -1, 0), &Room::loveaUseAmmonia },
+ { Action(ACTION_USE, OBJECT_ICOMM, -1, 0), &Room::loveaUseCommunicator },
};
RoomAction love1ActionList[] = {
@@ -941,7 +960,24 @@ RoomAction love1ActionList[] = {
{ Action(ACTION_FINISHED_WALKING, 1, 0, 0), &Room::love1CrewmanReachedLadder },
{ Action(ACTION_FINISHED_ANIMATION, 6, 0, 0), &Room::love1CrewmanDiedFromPhaser },
{ Action(ACTION_TOUCHED_HOTSPOT, 0, 0, 0), &Room::love1TouchedHotspot0 },
- // TODO: common code
+
+ // Common code
+ { Action(ACTION_TIMER_EXPIRED, 0, 0, 0), &Room::loveaTimer0Expired },
+ { Action(ACTION_TIMER_EXPIRED, 1, 0, 0), &Room::loveaTimer1Expired },
+ { Action(ACTION_USE, OBJECT_IMEDKIT, OBJECT_SPOCK, 0), &Room::loveaUseMedkitOnSpock },
+ { Action(ACTION_USE, OBJECT_ISAMPLE, OBJECT_SPOCK, 0), &Room::loveaUseCureSampleOnSpock },
+ { Action(ACTION_USE, OBJECT_ICURE, OBJECT_SPOCK, 0), &Room::loveaUseCureOnSpock },
+ { Action(ACTION_FINISHED_WALKING, 99, 0, 0), &Room::loveaSpockOrMccoyInPositionToUseCure },
+ { Action(ACTION_FINISHED_ANIMATION, 99, 0, 0), &Room::loveaFinishedCuringSpock },
+ { Action(ACTION_TIMER_EXPIRED, 2, 0, 0), &Room::loveaTimer2Expired },
+ { Action(ACTION_USE, OBJECT_IMTRICOR, OBJECT_SPOCK, 0), &Room::loveaUseMTricorderOnSpock },
+ { Action(ACTION_USE, OBJECT_IMTRICOR, OBJECT_KIRK, 0), &Room::loveaUseMTricorderOnHuman },
+ { Action(ACTION_USE, OBJECT_IMTRICOR, OBJECT_MCCOY, 0), &Room::loveaUseMTricorderOnHuman },
+ { Action(ACTION_USE, OBJECT_IMTRICOR, OBJECT_REDSHIRT, 0), &Room::loveaUseMTricorderOnHuman },
+ { Action(ACTION_USE, OBJECT_IRLG, -1, 0), &Room::loveaUseRomulanLaughingGas },
+ { Action(ACTION_USE, OBJECT_IN2O, -1, 0), &Room::loveaUseHumanLaughingGas },
+ { Action(ACTION_USE, OBJECT_INH3, -1, 0), &Room::loveaUseAmmonia },
+ { Action(ACTION_USE, OBJECT_ICOMM, -1, 0), &Room::loveaUseCommunicator },
};
RoomAction love2ActionList[] = {
@@ -1058,7 +1094,23 @@ RoomAction love2ActionList[] = {
{ Action(ACTION_FINISHED_WALKING, 11, 0, 0), &Room::love2ReachedCure },
{ Action(ACTION_FINISHED_ANIMATION, 24, 0, 0), &Room::love2GotCure },
- // TODO: common code
+ // Common code
+ { Action(ACTION_TIMER_EXPIRED, 0, 0, 0), &Room::loveaTimer0Expired },
+ { Action(ACTION_TIMER_EXPIRED, 1, 0, 0), &Room::loveaTimer1Expired },
+ { Action(ACTION_USE, OBJECT_IMEDKIT, OBJECT_SPOCK, 0), &Room::loveaUseMedkitOnSpock },
+ { Action(ACTION_USE, OBJECT_ISAMPLE, OBJECT_SPOCK, 0), &Room::loveaUseCureSampleOnSpock },
+ { Action(ACTION_USE, OBJECT_ICURE, OBJECT_SPOCK, 0), &Room::loveaUseCureOnSpock },
+ { Action(ACTION_FINISHED_WALKING, 99, 0, 0), &Room::loveaSpockOrMccoyInPositionToUseCure },
+ { Action(ACTION_FINISHED_ANIMATION, 99, 0, 0), &Room::loveaFinishedCuringSpock },
+ { Action(ACTION_TIMER_EXPIRED, 2, 0, 0), &Room::loveaTimer2Expired },
+ { Action(ACTION_USE, OBJECT_IMTRICOR, OBJECT_SPOCK, 0), &Room::loveaUseMTricorderOnSpock },
+ { Action(ACTION_USE, OBJECT_IMTRICOR, OBJECT_KIRK, 0), &Room::loveaUseMTricorderOnHuman },
+ { Action(ACTION_USE, OBJECT_IMTRICOR, OBJECT_MCCOY, 0), &Room::loveaUseMTricorderOnHuman },
+ { Action(ACTION_USE, OBJECT_IMTRICOR, OBJECT_REDSHIRT, 0), &Room::loveaUseMTricorderOnHuman },
+ { Action(ACTION_USE, OBJECT_IRLG, -1, 0), &Room::loveaUseRomulanLaughingGas },
+ { Action(ACTION_USE, OBJECT_IN2O, -1, 0), &Room::loveaUseHumanLaughingGas },
+ { Action(ACTION_USE, OBJECT_INH3, -1, 0), &Room::loveaUseAmmonia },
+ { Action(ACTION_USE, OBJECT_ICOMM, -1, 0), &Room::loveaUseCommunicator },
};
RoomAction love3ActionList[] = {
@@ -1164,7 +1216,24 @@ RoomAction love3ActionList[] = {
{ 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
+
+ // Common code
+ { Action(ACTION_TIMER_EXPIRED, 0, 0, 0), &Room::loveaTimer0Expired },
+ { Action(ACTION_TIMER_EXPIRED, 1, 0, 0), &Room::loveaTimer1Expired },
+ { Action(ACTION_USE, OBJECT_IMEDKIT, OBJECT_SPOCK, 0), &Room::loveaUseMedkitOnSpock },
+ { Action(ACTION_USE, OBJECT_ISAMPLE, OBJECT_SPOCK, 0), &Room::loveaUseCureSampleOnSpock },
+ { Action(ACTION_USE, OBJECT_ICURE, OBJECT_SPOCK, 0), &Room::loveaUseCureOnSpock },
+ { Action(ACTION_FINISHED_WALKING, 99, 0, 0), &Room::loveaSpockOrMccoyInPositionToUseCure },
+ { Action(ACTION_FINISHED_ANIMATION, 99, 0, 0), &Room::loveaFinishedCuringSpock },
+ { Action(ACTION_TIMER_EXPIRED, 2, 0, 0), &Room::loveaTimer2Expired },
+ { Action(ACTION_USE, OBJECT_IMTRICOR, OBJECT_SPOCK, 0), &Room::loveaUseMTricorderOnSpock },
+ { Action(ACTION_USE, OBJECT_IMTRICOR, OBJECT_KIRK, 0), &Room::loveaUseMTricorderOnHuman },
+ { Action(ACTION_USE, OBJECT_IMTRICOR, OBJECT_MCCOY, 0), &Room::loveaUseMTricorderOnHuman },
+ { Action(ACTION_USE, OBJECT_IMTRICOR, OBJECT_REDSHIRT, 0), &Room::loveaUseMTricorderOnHuman },
+ { Action(ACTION_USE, OBJECT_IRLG, -1, 0), &Room::loveaUseRomulanLaughingGas },
+ { Action(ACTION_USE, OBJECT_IN2O, -1, 0), &Room::loveaUseHumanLaughingGas },
+ { Action(ACTION_USE, OBJECT_INH3, -1, 0), &Room::loveaUseAmmonia },
+ { Action(ACTION_USE, OBJECT_ICOMM, -1, 0), &Room::loveaUseCommunicator },
};
RoomAction love4ActionList[] = {
@@ -1239,7 +1308,24 @@ RoomAction love4ActionList[] = {
{ Action(ACTION_USE, -1, 10, 0), &Room::love4UseAnythingOnRomulan },
{ Action(ACTION_USE, -1, 11, 0), &Room::love4UseAnythingOnRomulan },
{ Action(ACTION_USE, -1, 12, 0), &Room::love4UseAnythingOnRomulan },
- // TODO: common code
+
+ // Common code
+ { Action(ACTION_TIMER_EXPIRED, 0, 0, 0), &Room::loveaTimer0Expired },
+ { Action(ACTION_TIMER_EXPIRED, 1, 0, 0), &Room::loveaTimer1Expired },
+ { Action(ACTION_USE, OBJECT_IMEDKIT, OBJECT_SPOCK, 0), &Room::loveaUseMedkitOnSpock },
+ { Action(ACTION_USE, OBJECT_ISAMPLE, OBJECT_SPOCK, 0), &Room::loveaUseCureSampleOnSpock },
+ { Action(ACTION_USE, OBJECT_ICURE, OBJECT_SPOCK, 0), &Room::loveaUseCureOnSpock },
+ { Action(ACTION_FINISHED_WALKING, 99, 0, 0), &Room::loveaSpockOrMccoyInPositionToUseCure },
+ { Action(ACTION_FINISHED_ANIMATION, 99, 0, 0), &Room::loveaFinishedCuringSpock },
+ { Action(ACTION_TIMER_EXPIRED, 2, 0, 0), &Room::loveaTimer2Expired },
+ { Action(ACTION_USE, OBJECT_IMTRICOR, OBJECT_SPOCK, 0), &Room::loveaUseMTricorderOnSpock },
+ { Action(ACTION_USE, OBJECT_IMTRICOR, OBJECT_KIRK, 0), &Room::loveaUseMTricorderOnHuman },
+ { Action(ACTION_USE, OBJECT_IMTRICOR, OBJECT_MCCOY, 0), &Room::loveaUseMTricorderOnHuman },
+ { Action(ACTION_USE, OBJECT_IMTRICOR, OBJECT_REDSHIRT, 0), &Room::loveaUseMTricorderOnHuman },
+ { Action(ACTION_USE, OBJECT_IRLG, -1, 0), &Room::loveaUseRomulanLaughingGas },
+ { Action(ACTION_USE, OBJECT_IN2O, -1, 0), &Room::loveaUseHumanLaughingGas },
+ { Action(ACTION_USE, OBJECT_INH3, -1, 0), &Room::loveaUseAmmonia },
+ { Action(ACTION_USE, OBJECT_ICOMM, -1, 0), &Room::loveaUseCommunicator },
};
RoomAction love5ActionList[] = {
@@ -1287,7 +1373,24 @@ RoomAction love5ActionList[] = {
{ 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
+
+ // Common code
+ { Action(ACTION_TIMER_EXPIRED, 0, 0, 0), &Room::loveaTimer0Expired },
+ { Action(ACTION_TIMER_EXPIRED, 1, 0, 0), &Room::loveaTimer1Expired },
+ { Action(ACTION_USE, OBJECT_IMEDKIT, OBJECT_SPOCK, 0), &Room::loveaUseMedkitOnSpock },
+ { Action(ACTION_USE, OBJECT_ISAMPLE, OBJECT_SPOCK, 0), &Room::loveaUseCureSampleOnSpock },
+ { Action(ACTION_USE, OBJECT_ICURE, OBJECT_SPOCK, 0), &Room::loveaUseCureOnSpock },
+ { Action(ACTION_FINISHED_WALKING, 99, 0, 0), &Room::loveaSpockOrMccoyInPositionToUseCure },
+ { Action(ACTION_FINISHED_ANIMATION, 99, 0, 0), &Room::loveaFinishedCuringSpock },
+ { Action(ACTION_TIMER_EXPIRED, 2, 0, 0), &Room::loveaTimer2Expired },
+ { Action(ACTION_USE, OBJECT_IMTRICOR, OBJECT_SPOCK, 0), &Room::loveaUseMTricorderOnSpock },
+ { Action(ACTION_USE, OBJECT_IMTRICOR, OBJECT_KIRK, 0), &Room::loveaUseMTricorderOnHuman },
+ { Action(ACTION_USE, OBJECT_IMTRICOR, OBJECT_MCCOY, 0), &Room::loveaUseMTricorderOnHuman },
+ { Action(ACTION_USE, OBJECT_IMTRICOR, OBJECT_REDSHIRT, 0), &Room::loveaUseMTricorderOnHuman },
+ { Action(ACTION_USE, OBJECT_IRLG, -1, 0), &Room::loveaUseRomulanLaughingGas },
+ { Action(ACTION_USE, OBJECT_IN2O, -1, 0), &Room::loveaUseHumanLaughingGas },
+ { Action(ACTION_USE, OBJECT_INH3, -1, 0), &Room::loveaUseAmmonia },
+ { Action(ACTION_USE, OBJECT_ICOMM, -1, 0), &Room::loveaUseCommunicator },
};
diff --git a/engines/startrek/rooms/love0.cpp b/engines/startrek/rooms/love0.cpp
index d43f35d7a5..e3a5ab24ce 100644
--- a/engines/startrek/rooms/love0.cpp
+++ b/engines/startrek/rooms/love0.cpp
@@ -40,16 +40,16 @@ void Room::love0Tick1() {
playVoc("LOV0LOOP"); // FIXME: no audio after first entry?
}
- if (_vm->_awayMission.love.field2c)
+ if (_vm->_awayMission.love.releasedHumanLaughingGas)
_vm->_awayMission.timers[0] = getRandomWordInRange(200, 400);
- if (_vm->_awayMission.love.field2d)
+ if (_vm->_awayMission.love.releasedRomulanLaughingGas)
_vm->_awayMission.timers[1] = getRandomWordInRange(200, 400);
_vm->_awayMission.timers[2] = 200;
loadActorAnim(OBJECT_DOOR2, "s3r0d2a", 0xe6, 0x80, 0);
loadActorAnim(OBJECT_DOOR1, "s3r0d1a", 0x123, 0x8d, 0);
- _roomVar.love0._8ab = 0xf4;
- _roomVar.love0._8ac = 0x8f;
+ _roomVar.love.cmnXPosToCureSpock = 0xf4;
+ _roomVar.love.cmnYPosToCureSpock = 0x8f;
}
void Room::love0Tick10() {
@@ -57,40 +57,40 @@ void Room::love0Tick10() {
void Room::love0WalkToDoor2() {
_vm->_awayMission.disableInput = true;
- _roomVar.love0._de = 2;
+ _roomVar.love.walkingToDoor = 2;
walkCrewman(OBJECT_KIRK, 0xe6, 0x81, 4);
_vm->_awayMission.crewDirectionsAfterWalk[OBJECT_KIRK] = DIR_N;
}
void Room::love0OpenDoor2() {
- if (_roomVar.love0._de == 2) {
+ if (_roomVar.love.walkingToDoor == 2) {
loadActorAnim(OBJECT_DOOR2, "s3r0d2", 0xe6, 0x80, 3);
playSoundEffectIndex(SND_DOOR1);
}
}
void Room::love0ReachedDoor2() {
- _roomVar.love0.door2OpenCounter++;
- if (_roomVar.love0.door2OpenCounter == 2)
+ _roomVar.love.doorOpenCounter++;
+ if (_roomVar.love.doorOpenCounter == 2)
loadRoomIndex(2, 1);
}
void Room::love0WalkToDoor1() {
_vm->_awayMission.disableInput = true;
- _roomVar.love0._de = 1;
+ _roomVar.love.walkingToDoor = 1;
walkCrewman(OBJECT_KIRK, 0x125, 0x8d, 5);
}
void Room::love0OpenDoor1() {
- if (_roomVar.love0._de == 1) {
+ if (_roomVar.love.walkingToDoor == 1) {
loadActorAnim(OBJECT_DOOR1, "s3r0d1", 0x123, 0x8d, 4);
playSoundEffectIndex(SND_DOOR1);
}
}
void Room::love0ReachedDoor1() {
- _roomVar.love0.door1OpenCounter++;
- if (_roomVar.love0.door1OpenCounter == 2)
+ _roomVar.love.doorOpenCounter++;
+ if (_roomVar.love.doorOpenCounter == 2)
loadRoomIndex(1, 3);
}
@@ -171,12 +171,12 @@ void Room::love0UseRedshirtOnConsole() {
}
void Room::love0UseSpockOnConsole() {
- _roomVar.love0.consoleCrewman = OBJECT_SPOCK;
- _roomVar.love0.consoleSpeaker = TX_SPEAKER_SPOCK;
- _roomVar.love0.consoleText = TX_LOV0_005;
- strcpy(_roomVar.love0.consoleAnimation, "susemn");
+ _roomVar.love.consoleCrewman = OBJECT_SPOCK;
+ _roomVar.love.consoleSpeaker = TX_SPEAKER_SPOCK;
+ _roomVar.love.consoleText = TX_LOV0_005;
+ strcpy(_roomVar.love.consoleAnimation, "susemn");
- walkCrewman(_roomVar.love0.consoleCrewman, 0x9a, 0x9a, 2);
+ walkCrewman(_roomVar.love.consoleCrewman, 0x9a, 0x9a, 2);
if (!_vm->_awayMission.love.spockAccessedConsole) {
_vm->_awayMission.love.spockAccessedConsole = true;
_vm->_awayMission.love.missionScore += 4;
@@ -184,7 +184,7 @@ void Room::love0UseSpockOnConsole() {
}
void Room::love0SpockReachedConsole() {
- loadActorAnim2(_roomVar.love0.consoleCrewman, _roomVar.love0.consoleAnimation, -1, -1, 5);
+ loadActorAnim2(_roomVar.love.consoleCrewman, _roomVar.love.consoleAnimation, -1, -1, 5);
}
void Room::love0SpockAccessedConsole() {
@@ -193,8 +193,8 @@ void Room::love0SpockAccessedConsole() {
love0InteractWithConsole();
else {
showText(TX_SPEAKER_COMPUTER, TX_COMPU188);
- showText(_roomVar.love0.consoleSpeaker, _roomVar.love0.consoleText);
- _roomVar.love0.heardSummaryOfVirus = true;
+ showText(_roomVar.love.consoleSpeaker, _roomVar.love.consoleText);
+ _roomVar.love.heardSummaryOfVirus = true;
}
}
@@ -216,9 +216,9 @@ void Room::love0MccoyAccessedConsole() {
if (_vm->_awayMission.love.knowAboutVirus)
love0InteractWithConsole();
else {
- if (!_roomVar.love0.heardSummaryOfVirus) {
+ if (!_roomVar.love.heardSummaryOfVirus) {
showText(TX_SPEAKER_COMPUTER, TX_COMPU188);
- _roomVar.love0.heardSummaryOfVirus = true;
+ _roomVar.love.heardSummaryOfVirus = true;
}
showText(TX_SPEAKER_MCCOY, TX_LOV0_024);
showText(TX_SPEAKER_SPOCK, TX_LOV0_035);
@@ -271,4 +271,15 @@ void Room::love0InteractWithConsole() {
}
}
+void Room::love0GetDoorOrConsole() {
+ // BUGFIX: There was a problem with "get door 1" where it would execute a bit of
+ // non-code before reaching where it was supposed to be. Not sure if it had any actual
+ // effect.
+ showText(TX_LOV0N001);
+
+ // NOTE: There is an unused block of code that's jumped over in the "get door 2"
+ // function. (Spock says "that's not logical".)
+ //showText(TX_SPEAKER_SPOCK, TX_LOV0_030);
+}
+
}
diff --git a/engines/startrek/rooms/love1.cpp b/engines/startrek/rooms/love1.cpp
index 6398b38dc5..bdcbb6a167 100644
--- a/engines/startrek/rooms/love1.cpp
+++ b/engines/startrek/rooms/love1.cpp
@@ -59,33 +59,33 @@ void Room::love1Tick1() {
switch (_vm->_awayMission.love.bottleInNozzle) {
case BOTTLETYPE_N2O:
- strcpy(_roomVar.love1.bottleAnimation, "btle1");
- _roomVar.love1.itemInNozzle = OBJECT_IN2O;
+ strcpy(_roomVar.love.bottleAnimation, "btle1");
+ _roomVar.love.itemInNozzle = OBJECT_IN2O;
goto common;
case BOTTLETYPE_NH3:
- strcpy(_roomVar.love1.bottleAnimation, "btle2");
- _roomVar.love1.itemInNozzle = OBJECT_INH3;
+ strcpy(_roomVar.love.bottleAnimation, "btle2");
+ _roomVar.love.itemInNozzle = OBJECT_INH3;
goto common;
case BOTTLETYPE_H2O:
- strcpy(_roomVar.love1.bottleAnimation, "btle3");
- _roomVar.love1.itemInNozzle = OBJECT_IH2O;
+ strcpy(_roomVar.love.bottleAnimation, "btle3");
+ _roomVar.love.itemInNozzle = OBJECT_IH2O;
goto common;
case BOTTLETYPE_RLG:
- strcpy(_roomVar.love1.bottleAnimation, "btle4");
- _roomVar.love1.itemInNozzle = OBJECT_IRLG;
+ strcpy(_roomVar.love.bottleAnimation, "btle4");
+ _roomVar.love.itemInNozzle = OBJECT_IRLG;
goto common;
common:
- loadActorAnim(OBJECT_BOTTLE, _roomVar.love1.bottleAnimation, 0xa3, 0x72, 0);
+ loadActorAnim(OBJECT_BOTTLE, _roomVar.love.bottleAnimation, 0xa3, 0x72, 0);
// fall through
case BOTTLETYPE_NONE:
- if (_vm->_awayMission.love.field2c)
- _vm->_awayMission.timers[0] = getRandomWordInRange(200, 400);
break;
}
- if (_vm->_awayMission.love.field2d)
+ if (_vm->_awayMission.love.releasedHumanLaughingGas)
+ _vm->_awayMission.timers[0] = getRandomWordInRange(200, 400);
+ if (_vm->_awayMission.love.releasedRomulanLaughingGas)
_vm->_awayMission.timers[1] = getRandomWordInRange(200, 400);
_vm->_awayMission.timers[2] = 200;
@@ -93,18 +93,18 @@ common:
loadActorAnim(OBJECT_DOOR1, "s3r2d1a", 0, 0, 0);
loadActorAnim(OBJECT_DOOR2, "s3r2d2a", 0, 0, 0);
- _roomVar.love1._1d2a = 0x90;
- _roomVar.love1._1d2b = 0xa7;
+ _roomVar.love.cmnXPosToCureSpock = 0x90;
+ _roomVar.love.cmnYPosToCureSpock = 0xa7;
}
void Room::love1WalkToDoor3() {
_vm->_awayMission.disableInput = true;
- _roomVar.love1.walkingToDoor = true;
+ _roomVar.love.walkingToDoor = true;
walkCrewman(OBJECT_KIRK, 0xd9, 0x81, 15);
}
void Room::love1OpenDoor3() {
- if (_roomVar.love1.walkingToDoor) {
+ if (_roomVar.love.walkingToDoor) {
loadActorAnim(OBJECT_DOOR3, "s3r2d3", 0xdb, 0x7e, 2);
playSoundEffectIndex(SND_DOOR1);
}
@@ -112,19 +112,19 @@ void Room::love1OpenDoor3() {
// Door 3 opened, or door 3 reached (both must occur before transition happens)
void Room::love1ReachedDoor3() {
- _roomVar.love1.door3OpenCounter++;
- if (_roomVar.love1.door3OpenCounter == 2)
+ _roomVar.love.doorOpenCounter++;
+ if (_roomVar.love.doorOpenCounter == 2)
loadRoomIndex(3, 1);
}
void Room::love1WalkToDoor1() {
_vm->_awayMission.disableInput = true;
- _roomVar.love1.walkingToDoor = true;
+ _roomVar.love.walkingToDoor = true;
walkCrewman(OBJECT_KIRK, 0x42, 0x97, 16);
}
void Room::love1OpenDoor1() {
- if (_roomVar.love1.walkingToDoor) {
+ if (_roomVar.love.walkingToDoor) {
loadActorAnim(OBJECT_DOOR1, "s3r2d1", 0, 0, 3);
playSoundEffectIndex(SND_DOOR1);
}
@@ -132,19 +132,19 @@ void Room::love1OpenDoor1() {
// Door 1 opened, or door 1 reached
void Room::love1ReachedDoor1() {
- _roomVar.love1.door1OpenCounter++;
- if (_roomVar.love1.door1OpenCounter == 2)
+ _roomVar.love.doorOpenCounter++;
+ if (_roomVar.love.doorOpenCounter == 2)
loadRoomIndex(0, 2);
}
void Room::love1WalkToDoor2() {
_vm->_awayMission.disableInput = true;
- _roomVar.love1.walkingToDoor = true;
+ _roomVar.love.walkingToDoor = true;
walkCrewman(OBJECT_KIRK, 0x79, 0x85, 17);
}
void Room::love1OpenDoor2() {
- if (_roomVar.love1.walkingToDoor) {
+ if (_roomVar.love.walkingToDoor) {
loadActorAnim(OBJECT_DOOR2, "s3r2d2", 0, 0, 4);
playSoundEffectIndex(SND_DOOR1);
}
@@ -152,8 +152,8 @@ void Room::love1OpenDoor2() {
// Door 2 opened, or door 2 reached
void Room::love1ReachedDoor2() {
- _roomVar.love1.door2OpenCounter++;
- if (_roomVar.love1.door2OpenCounter == 2)
+ _roomVar.love.doorOpenCounter++;
+ if (_roomVar.love.doorOpenCounter == 2)
loadRoomIndex(2, 0);
}
@@ -355,13 +355,13 @@ void Room::love1KirkGotBottleFromNozzle() {
_vm->_awayMission.love.bottleInNozzle = BOTTLETYPE_NONE;
loadActorStandAnim(OBJECT_BOTTLE);
showText(TX_LOV1N007);
- _roomVar.love1.itemInNozzle = 0;
+ _roomVar.love.itemInNozzle = 0;
}
void Room::love1UseN2OOnNozzle() {
if (_vm->_awayMission.love.bottleInNozzle == BOTTLETYPE_NONE) {
- _roomVar.love1.itemInNozzle = OBJECT_IN2O;
- strcpy(_roomVar.love1.bottleAnimation, "btle1");
+ _roomVar.love.itemInNozzle = OBJECT_IN2O;
+ strcpy(_roomVar.love.bottleAnimation, "btle1");
_vm->_awayMission.love.bottleInNozzle = BOTTLETYPE_N2O;
walkCrewman(OBJECT_KIRK, 0xa6, 0x90, 3);
}
@@ -369,8 +369,8 @@ void Room::love1UseN2OOnNozzle() {
void Room::love1UseH2OOnNozzle() {
if (_vm->_awayMission.love.bottleInNozzle == BOTTLETYPE_NONE) {
- _roomVar.love1.itemInNozzle = OBJECT_IH2O;
- strcpy(_roomVar.love1.bottleAnimation, "btle3");
+ _roomVar.love.itemInNozzle = OBJECT_IH2O;
+ strcpy(_roomVar.love.bottleAnimation, "btle3");
_vm->_awayMission.love.bottleInNozzle = BOTTLETYPE_H2O;
walkCrewman(OBJECT_KIRK, 0xa6, 0x90, 3);
}
@@ -378,8 +378,8 @@ void Room::love1UseH2OOnNozzle() {
void Room::love1UseNH3OnNozzle() {
if (_vm->_awayMission.love.bottleInNozzle == BOTTLETYPE_NONE) {
- _roomVar.love1.itemInNozzle = OBJECT_INH3;
- strcpy(_roomVar.love1.bottleAnimation, "btle2");
+ _roomVar.love.itemInNozzle = OBJECT_INH3;
+ strcpy(_roomVar.love.bottleAnimation, "btle2");
_vm->_awayMission.love.bottleInNozzle = BOTTLETYPE_NH3;
walkCrewman(OBJECT_KIRK, 0xa6, 0x90, 3);
}
@@ -387,8 +387,8 @@ void Room::love1UseNH3OnNozzle() {
void Room::love1UseRLGOnNozzle() {
if (_vm->_awayMission.love.bottleInNozzle == BOTTLETYPE_NONE) {
- _roomVar.love1.itemInNozzle = OBJECT_IRLG;
- strcpy(_roomVar.love1.bottleAnimation, "btle4");
+ _roomVar.love.itemInNozzle = OBJECT_IRLG;
+ strcpy(_roomVar.love.bottleAnimation, "btle4");
_vm->_awayMission.love.bottleInNozzle = BOTTLETYPE_RLG;
walkCrewman(OBJECT_KIRK, 0xa6, 0x90, 3);
}
@@ -399,8 +399,8 @@ void Room::love1KirkReachedNozzleToPut() {
}
void Room::love1KirkPutBottleInNozzle() {
- loadActorAnim(OBJECT_BOTTLE, _roomVar.love1.bottleAnimation, 0xa3, 0x72, 0);
- loseItem(_roomVar.love1.itemInNozzle);
+ loadActorAnim(OBJECT_BOTTLE, _roomVar.love.bottleAnimation, 0xa3, 0x72, 0);
+ loseItem(_roomVar.love.itemInNozzle);
}
void Room::love1UseAnthingOnNozzle() {
@@ -431,7 +431,7 @@ void Room::love1MccoyReachedReplicator() {
}
void Room::love1MccoyUsedReplicator() {
- if (_roomVar.love1.itemInNozzle == OBJECT_INH3) {
+ if (_roomVar.love.itemInNozzle == OBJECT_INH3) {
loadActorStandAnim(OBJECT_DISH_IN_CHAMBER);
loadActorAnim2(OBJECT_CHAMBER, "s3r2d6", 0xb4, 0x75, 7);
playSoundEffectIndex(SND_DOOR1);
@@ -502,41 +502,41 @@ void Room::love1KirkGotPolyberylcarbonate() {
}
void Room::love1UseKirkOnFreezer() {
- _roomVar.love1.crewmanUsingFreezerRetY = 0xa0;
- _roomVar.love1.crewmanUsingFreezerRetX = 0x96;
- _roomVar.love1.crewmanUsingDevice = OBJECT_KIRK;
- walkCrewman(_roomVar.love1.crewmanUsingDevice, 0x71, 0x8e, 7);
+ _roomVar.love.crewmanUsingFreezerRetY = 0xa0;
+ _roomVar.love.crewmanUsingFreezerRetX = 0x96;
+ _roomVar.love.crewmanUsingDevice = OBJECT_KIRK;
+ walkCrewman(_roomVar.love.crewmanUsingDevice, 0x71, 0x8e, 7);
_vm->_awayMission.disableInput = true;
}
void Room::love1UseRedshirtOnFreezer() {
- _roomVar.love1.crewmanUsingFreezerRetY = 0x89;
- _roomVar.love1.crewmanUsingFreezerRetX = 0x95;
- _roomVar.love1.crewmanUsingDevice = OBJECT_REDSHIRT;
- walkCrewman(_roomVar.love1.crewmanUsingDevice, 0x71, 0x8e, 7);
+ _roomVar.love.crewmanUsingFreezerRetY = 0x89;
+ _roomVar.love.crewmanUsingFreezerRetX = 0x95;
+ _roomVar.love.crewmanUsingDevice = OBJECT_REDSHIRT;
+ walkCrewman(_roomVar.love.crewmanUsingDevice, 0x71, 0x8e, 7);
_vm->_awayMission.disableInput = true;
}
void Room::love1UseSpockOnFreezer() {
- _roomVar.love1.crewmanUsingFreezerRetY = 0xa9;
- _roomVar.love1.crewmanUsingFreezerRetX = 0x61;
- _roomVar.love1.crewmanUsingDevice = OBJECT_SPOCK;
- walkCrewman(_roomVar.love1.crewmanUsingDevice, 0x71, 0x8e, 7);
+ _roomVar.love.crewmanUsingFreezerRetY = 0xa9;
+ _roomVar.love.crewmanUsingFreezerRetX = 0x61;
+ _roomVar.love.crewmanUsingDevice = OBJECT_SPOCK;
+ walkCrewman(_roomVar.love.crewmanUsingDevice, 0x71, 0x8e, 7);
_vm->_awayMission.disableInput = true;
}
void Room::love1UseMccoyOnFreezer() {
- _roomVar.love1.crewmanUsingFreezerRetY = 0x98;
- _roomVar.love1.crewmanUsingFreezerRetX = 0xbf;
- _roomVar.love1.crewmanUsingDevice = OBJECT_MCCOY;
- walkCrewman(_roomVar.love1.crewmanUsingDevice, 0x71, 0x8e, 7);
+ _roomVar.love.crewmanUsingFreezerRetY = 0x98;
+ _roomVar.love.crewmanUsingFreezerRetX = 0xbf;
+ _roomVar.love.crewmanUsingDevice = OBJECT_MCCOY;
+ walkCrewman(_roomVar.love.crewmanUsingDevice, 0x71, 0x8e, 7);
_vm->_awayMission.disableInput = true;
}
void Room::love1CrewmanReachedFreezer() {
- Common::String useAnim = _vm->getCrewmanAnimFilename(_roomVar.love1.crewmanUsingDevice, "usehw");
+ Common::String useAnim = _vm->getCrewmanAnimFilename(_roomVar.love.crewmanUsingDevice, "usehw");
- loadActorAnim2(_roomVar.love1.crewmanUsingDevice, useAnim, -1, -1, 16);
+ loadActorAnim2(_roomVar.love.crewmanUsingDevice, useAnim, -1, -1, 16);
}
void Room::love1CrewmanOpenedOrClosedFreezer() {
@@ -548,7 +548,7 @@ void Room::love1CrewmanOpenedOrClosedFreezer() {
playSoundEffectIndex(SND_DOOR1);
_vm->_awayMission.love.freezerOpen = !_vm->_awayMission.love.freezerOpen;
- walkCrewman(_roomVar.love1.crewmanUsingDevice, _roomVar.love1.crewmanUsingFreezerRetX, _roomVar.love1.crewmanUsingFreezerRetY, 0);
+ walkCrewman(_roomVar.love.crewmanUsingDevice, _roomVar.love.crewmanUsingFreezerRetX, _roomVar.love.crewmanUsingFreezerRetY, 0);
_vm->_awayMission.disableInput = false;
}
@@ -589,30 +589,30 @@ void Room::love1FinishedUsingArbitraryItemOnDistillator() {
}
void Room::love1UseKirkOnLadder() {
- _roomVar.love1.crewmanUsingDevice = OBJECT_KIRK;
- _vm->_awayMission.crewDirectionsAfterWalk[_roomVar.love1.crewmanUsingDevice] = DIR_N;
- walkCrewman(_roomVar.love1.crewmanUsingDevice, 0x102, 0x89, 1);
+ _roomVar.love.crewmanUsingDevice = OBJECT_KIRK;
+ _vm->_awayMission.crewDirectionsAfterWalk[_roomVar.love.crewmanUsingDevice] = DIR_N;
+ walkCrewman(_roomVar.love.crewmanUsingDevice, 0x102, 0x89, 1);
_vm->_awayMission.disableInput = true;
}
void Room::love1UseSpockOnLadder() {
- _roomVar.love1.crewmanUsingDevice = OBJECT_SPOCK;
- _vm->_awayMission.crewDirectionsAfterWalk[_roomVar.love1.crewmanUsingDevice] = DIR_N;
- walkCrewman(_roomVar.love1.crewmanUsingDevice, 0x102, 0x89, 1);
+ _roomVar.love.crewmanUsingDevice = OBJECT_SPOCK;
+ _vm->_awayMission.crewDirectionsAfterWalk[_roomVar.love.crewmanUsingDevice] = DIR_N;
+ walkCrewman(_roomVar.love.crewmanUsingDevice, 0x102, 0x89, 1);
_vm->_awayMission.disableInput = true;
}
void Room::love1UseMccoyOnLadder() {
- _roomVar.love1.crewmanUsingDevice = OBJECT_MCCOY;
- _vm->_awayMission.crewDirectionsAfterWalk[_roomVar.love1.crewmanUsingDevice] = DIR_N;
- walkCrewman(_roomVar.love1.crewmanUsingDevice, 0x102, 0x89, 1);
+ _roomVar.love.crewmanUsingDevice = OBJECT_MCCOY;
+ _vm->_awayMission.crewDirectionsAfterWalk[_roomVar.love.crewmanUsingDevice] = DIR_N;
+ walkCrewman(_roomVar.love.crewmanUsingDevice, 0x102, 0x89, 1);
_vm->_awayMission.disableInput = true;
}
void Room::love1UseRedshirtOnLadder() {
- _roomVar.love1.crewmanUsingDevice = OBJECT_REDSHIRT;
- _vm->_awayMission.crewDirectionsAfterWalk[_roomVar.love1.crewmanUsingDevice] = DIR_N;
- walkCrewman(_roomVar.love1.crewmanUsingDevice, 0x102, 0x89, 1);
+ _roomVar.love.crewmanUsingDevice = OBJECT_REDSHIRT;
+ _vm->_awayMission.crewDirectionsAfterWalk[_roomVar.love.crewmanUsingDevice] = DIR_N;
+ walkCrewman(_roomVar.love.crewmanUsingDevice, 0x102, 0x89, 1);
_vm->_awayMission.disableInput = true;
}
@@ -630,19 +630,19 @@ void Room::love1CrewmanReachedLadder() {
loadActorAnim(OBJECT_PHASERSHOT, "s3r2s2", 0xf3, 0x89, 0);
playSoundEffectIndex(SND_PHASSHOT);
- Common::String anim = _vm->getCrewmanAnimFilename(_roomVar.love1.crewmanUsingDevice, "killw");
- loadActorAnim(_roomVar.love1.crewmanUsingDevice, anim, 0x102, 0x89, 6);
- _roomVar.love1.dyingSpeaker = speakers[_roomVar.love1.crewmanUsingDevice];
+ Common::String anim = _vm->getCrewmanAnimFilename(_roomVar.love.crewmanUsingDevice, "killw");
+ loadActorAnim(_roomVar.love.crewmanUsingDevice, anim, 0x102, 0x89, 6);
+ _roomVar.love.dyingSpeaker = speakers[_roomVar.love.crewmanUsingDevice];
}
}
void Room::love1CrewmanDiedFromPhaser() {
- if (_roomVar.love1.crewmanUsingDevice == OBJECT_REDSHIRT) {
+ if (_roomVar.love.crewmanUsingDevice == OBJECT_REDSHIRT) {
_vm->_awayMission.disableInput = false;
showText(TX_SPEAKER_FERRIS, TX_LOV1_024);
_vm->_awayMission.redshirtDead = true;
} else {
- showText(_roomVar.love1.dyingSpeaker, TX_LOV1_025);
+ showText(_roomVar.love.dyingSpeaker, TX_LOV1_025);
showGameOverMenu();
}
}
diff --git a/engines/startrek/rooms/love2.cpp b/engines/startrek/rooms/love2.cpp
index 7ccbfd20cf..c8bec64160 100644
--- a/engines/startrek/rooms/love2.cpp
+++ b/engines/startrek/rooms/love2.cpp
@@ -105,38 +105,38 @@ void Room::love2Tick1() {
switch (_vm->_awayMission.love.field35) {
case SYNTHITEM_PBC:
- strcpy(_roomVar.love2.d6, "pbcanm");
- _roomVar.love2.d2 = OBJECT_POLYBERYLCARBONATE;
+ strcpy(_roomVar.love.chamberInputAnim, "pbcanm");
+ _roomVar.love.chamberObject = OBJECT_POLYBERYLCARBONATE;
break;
case SYNTHITEM_VIRUS_SAMPLE:
- strcpy(_roomVar.love2.d6, "dishes");
- _roomVar.love2.d2 = OBJECT_VIRUSSAMPLE;
+ strcpy(_roomVar.love.chamberInputAnim, "dishes");
+ _roomVar.love.chamberObject = OBJECT_VIRUSSAMPLE;
break;
case SYNTHITEM_CURE_SAMPLE:
- strcpy(_roomVar.love2.d6, "dishes");
- _roomVar.love2.d2 = OBJECT_CURESAMPLE;
+ strcpy(_roomVar.love.chamberInputAnim, "dishes");
+ _roomVar.love.chamberObject = OBJECT_CURESAMPLE;
break;
case SYNTHITEM_BOTTLE:
switch (_vm->_awayMission.love.synthesizerProduct) {
case 1:
- strcpy(_roomVar.love2.d8, "btle1");
- _roomVar.love2.d2 = OBJECT_SYNTHESIZER_OUTPUT;
+ strcpy(_roomVar.love.chamberOutputAnim, "btle1");
+ _roomVar.love.chamberObject = OBJECT_SYNTHESIZER_OUTPUT;
break;
case 2:
- strcpy(_roomVar.love2.d8, "btle2");
- _roomVar.love2.d2 = OBJECT_SYNTHESIZER_OUTPUT;
+ strcpy(_roomVar.love.chamberOutputAnim, "btle2");
+ _roomVar.love.chamberObject = OBJECT_SYNTHESIZER_OUTPUT;
break;
case 3:
- strcpy(_roomVar.love2.d8, "btle3");
- _roomVar.love2.d2 = OBJECT_SYNTHESIZER_OUTPUT;
+ strcpy(_roomVar.love.chamberOutputAnim, "btle3");
+ _roomVar.love.chamberObject = OBJECT_SYNTHESIZER_OUTPUT;
break;
case 4:
- strcpy(_roomVar.love2.d8, "btle4");
- _roomVar.love2.d2 = OBJECT_SYNTHESIZER_OUTPUT;
+ strcpy(_roomVar.love.chamberOutputAnim, "btle4");
+ _roomVar.love.chamberObject = OBJECT_SYNTHESIZER_OUTPUT;
break;
default:
- strcpy(_roomVar.love2.d8, "cure");
- _roomVar.love2.d2 = OBJECT_CURE;
+ strcpy(_roomVar.love.chamberOutputAnim, "cure");
+ _roomVar.love.chamberObject = OBJECT_CURE;
break;
}
break;
@@ -147,21 +147,21 @@ void Room::love2Tick1() {
if (valid) {
if (_vm->_awayMission.love.field35 == 9)
- loadActorAnim2(_roomVar.love2.d2, _roomVar.love2.d8, 0x8a, 0x8b, 0);
+ loadActorAnim2(_roomVar.love.chamberObject, _roomVar.love.chamberOutputAnim, 0x8a, 0x8b, 0);
else
- loadActorAnim2(_roomVar.love2.d2, _roomVar.love2.d6, 0x8a, 0x8b, 0);
+ loadActorAnim2(_roomVar.love.chamberObject, _roomVar.love.chamberInputAnim, 0x8a, 0x8b, 0);
}
- if (_vm->_awayMission.love.field2c)
+ if (_vm->_awayMission.love.releasedHumanLaughingGas)
_vm->_awayMission.timers[0] = getRandomWordInRange(200, 400);
- if (_vm->_awayMission.love.field2d)
+ if (_vm->_awayMission.love.releasedRomulanLaughingGas)
_vm->_awayMission.timers[1] = getRandomWordInRange(200, 400);
_vm->_awayMission.timers[2] = 200;
loadActorAnim(OBJECT_DOOR, "s3r3d3a", 0x12a, 0xb5, 0);
- _roomVar.love2._2966 = 0xc9;
- _roomVar.love2._2967 = 0xb7;
+ _roomVar.love.cmnXPosToCureSpock = 0xc9;
+ _roomVar.love.cmnYPosToCureSpock = 0xb7;
}
void Room::love2TouchedWarp1() {
@@ -176,21 +176,21 @@ void Room::love2Timer3Expired() {
void Room::love2WalkToDoor() {
_vm->_awayMission.disableInput = true;
- _roomVar.love2.walkingToDoor = true;
+ _roomVar.love.walkingToDoor = true;
walkCrewman(OBJECT_KIRK, 0x127, 0xba, 14);
}
// Triggers door opening
void Room::love2TouchedHotspot0() {
- if (_roomVar.love2.walkingToDoor) {
+ if (_roomVar.love.walkingToDoor) {
loadActorAnim(OBJECT_DOOR, "s3r3d3", 0x12a, 0xb5, 1);
playSoundEffectIndex(SND_DOOR1);
}
}
void Room::love2DoorReachedOrOpened() {
- _roomVar.love2.doorOpenCounter++;
- if (_roomVar.love2.doorOpenCounter == 2)
+ _roomVar.love.doorOpenCounter++;
+ if (_roomVar.love.doorOpenCounter == 2)
loadRoomIndex(1, 1);
}
@@ -303,28 +303,28 @@ void Room::love2UseSTricorderAnywhere() {
}
void Room::love2UseKirkOnCabinet() {
- _roomVar.love2.d2 = OBJECT_KIRK;
+ _roomVar.love.chamberObject = OBJECT_KIRK;
walkCrewman(OBJECT_KIRK, 0x2b, 0xbb, 12);
}
void Room::love2UseSpockOnCabinet() {
- _roomVar.love2.d2 = OBJECT_SPOCK;
+ _roomVar.love.chamberObject = OBJECT_SPOCK;
walkCrewman(OBJECT_SPOCK, 0x2b, 0xbb, 12);
}
void Room::love2UseMccoyOnCabinet() {
- _roomVar.love2.d2 = OBJECT_MCCOY;
+ _roomVar.love.chamberObject = OBJECT_MCCOY;
walkCrewman(OBJECT_MCCOY, 0x2b, 0xbb, 12);
}
void Room::love2UseRedshirtOnCabinet() {
- _roomVar.love2.d2 = OBJECT_REDSHIRT;
+ _roomVar.love.chamberObject = OBJECT_REDSHIRT;
walkCrewman(OBJECT_REDSHIRT, 0x2b, 0xbb, 12);
}
void Room::love2CrewmanReachedCabinet() {
- Common::String anim = _vm->getCrewmanAnimFilename(_roomVar.love2.d2, "usehw");
- loadActorAnim2(_roomVar.love2.d2, anim, -1, -1, 11);
+ Common::String anim = _vm->getCrewmanAnimFilename(_roomVar.love.chamberObject, "usehw");
+ loadActorAnim2(_roomVar.love.chamberObject, anim, -1, -1, 11);
}
void Room::love2CrewmanAccessedCabinet() {
@@ -368,23 +368,23 @@ void Room::love2ChangedGasFeed() {
}
void Room::love2UseO2GasOnCanisterSlot() {
- _roomVar.love2.canisterType = CANTYPE_O2;
- strcpy(_roomVar.love2.canisterAnim, "o2can");
- _roomVar.love2.canisterItem = OBJECT_IO2GAS;
+ _roomVar.love.canisterType = CANTYPE_O2;
+ strcpy(_roomVar.love.canisterAnim, "o2can");
+ _roomVar.love.canisterItem = OBJECT_IO2GAS;
walkCrewman(OBJECT_KIRK, 0xa8, 0xb7, 3);
}
void Room::love2UseH2GasOnCanisterSlot() {
- _roomVar.love2.canisterType = CANTYPE_H2;
- strcpy(_roomVar.love2.canisterAnim, "h2can");
- _roomVar.love2.canisterItem = OBJECT_IH2GAS;
+ _roomVar.love.canisterType = CANTYPE_H2;
+ strcpy(_roomVar.love.canisterAnim, "h2can");
+ _roomVar.love.canisterItem = OBJECT_IH2GAS;
walkCrewman(OBJECT_KIRK, 0xa8, 0xb7, 3);
}
void Room::love2UseN2GasOnCanisterSlot() {
- _roomVar.love2.canisterType = CANTYPE_N2;
- strcpy(_roomVar.love2.canisterAnim, "n2can");
- _roomVar.love2.canisterItem = OBJECT_IN2GAS;
+ _roomVar.love.canisterType = CANTYPE_N2;
+ strcpy(_roomVar.love.canisterAnim, "n2can");
+ _roomVar.love.canisterItem = OBJECT_IN2GAS;
walkCrewman(OBJECT_KIRK, 0xa8, 0xb7, 3);
}
@@ -403,18 +403,18 @@ void Room::love2ReachedCanisterSlot() {
void Room::love2PutCanisterInSlot1() {
playVoc("SE6FOOD");
- loadActorAnim(OBJECT_CAN1, _roomVar.love2.canisterAnim, 0xa7, 0xae, 0);
- _vm->_awayMission.love.canister1 = _roomVar.love2.canisterType;
+ loadActorAnim(OBJECT_CAN1, _roomVar.love.canisterAnim, 0xa7, 0xae, 0);
+ _vm->_awayMission.love.canister1 = _roomVar.love.canisterType;
showText(TX_LOV2N034);
- loseItem(_roomVar.love2.canisterItem);
+ loseItem(_roomVar.love.canisterItem);
}
void Room::love2PutCanisterInSlot2() {
playVoc("SE6FOOD");
- loadActorAnim(OBJECT_CAN2, _roomVar.love2.canisterAnim, 0xb1, 0xaf, 0);
- _vm->_awayMission.love.canister2 = _roomVar.love2.canisterType;
+ loadActorAnim(OBJECT_CAN2, _roomVar.love.canisterAnim, 0xb1, 0xaf, 0);
+ _vm->_awayMission.love.canister2 = _roomVar.love.canisterType;
showText(TX_LOV2N035);
- loseItem(_roomVar.love2.canisterItem);
+ loseItem(_roomVar.love.canisterItem);
}
void Room::love2UseAntigravOnCanister1() {
@@ -485,42 +485,42 @@ void Room::love2TookCanister2() {
}
void Room::love2UseKirkOnSynthesizer() {
- _roomVar.love2.d2 = OBJECT_KIRK;
- walkCrewman(_roomVar.love2.d2, 0x46, 0xae, 13);
+ _roomVar.love.chamberObject = OBJECT_KIRK;
+ walkCrewman(_roomVar.love.chamberObject, 0x46, 0xae, 13);
}
void Room::love2UseSpockOnSynthesizer() {
- _roomVar.love2.d2 = OBJECT_SPOCK;
- walkCrewman(_roomVar.love2.d2, 0x46, 0xae, 13);
+ _roomVar.love.chamberObject = OBJECT_SPOCK;
+ walkCrewman(_roomVar.love.chamberObject, 0x46, 0xae, 13);
}
void Room::love2UseMccoyOnSynthesizer() {
- _roomVar.love2.d2 = OBJECT_MCCOY;
- walkCrewman(_roomVar.love2.d2, 0x46, 0xae, 13);
+ _roomVar.love.chamberObject = OBJECT_MCCOY;
+ walkCrewman(_roomVar.love.chamberObject, 0x46, 0xae, 13);
}
void Room::love2UseRedshirtOnSynthesizer() {
- _roomVar.love2.d2 = OBJECT_REDSHIRT;
- walkCrewman(_roomVar.love2.d2, 0x46, 0xae, 13);
+ _roomVar.love.chamberObject = OBJECT_REDSHIRT;
+ walkCrewman(_roomVar.love.chamberObject, 0x46, 0xae, 13);
}
void Room::love2CrewmanReachedSynthesizer() {
- Common::String anim = _vm->getCrewmanAnimFilename(_roomVar.love2.d2, "usemn");
- loadActorAnim2(_roomVar.love2.d2, anim, -1, -1, 17);
+ Common::String anim = _vm->getCrewmanAnimFilename(_roomVar.love.chamberObject, "usemn");
+ loadActorAnim2(_roomVar.love.chamberObject, anim, -1, -1, 17);
}
void Room::love2CrewmanUsedSynthesizer() {
if (_vm->_awayMission.love.gasFeedOn) {
love2UseSynthesizer();
} else {
- if (_roomVar.love2.cb == 3) {
+ if (_roomVar.love.cb == 3) {
if (haveItem(OBJECT_IWRENCH)) {
showText(TX_SPEAKER_SPOCK, TX_LOV2_005);
walkCrewman(OBJECT_SPOCK, 0xa8, 0xb7, 16);
} else
showText(TX_SPEAKER_SPOCK, TX_LOV2_006);
} else {
- _roomVar.love2.cb++;
+ _roomVar.love.cb++;
showText(TX_LOV2N012);
}
}
@@ -582,7 +582,7 @@ bottleFailure:
case SYNTHITEM_NONE: // Water
default:
_vm->_awayMission.love.synthesizerProduct = BOTTLETYPE_H2O;
- strcpy(_roomVar.love2.d8, "btle3");
+ strcpy(_roomVar.love.chamberOutputAnim, "btle3");
produceBottle:
loadActorAnim(OBJECT_SYNTHESIZER_DOOR, "s3r3d2", 0x8a, 0x8d, 3); // -> love2SynthesizerDoorClosed
playSoundEffectIndex(SND_DOOR1);
@@ -622,7 +622,7 @@ inertMatterFailure:
case SYNTHITEM_NONE: // Ammonia
default:
_vm->_awayMission.love.synthesizerProduct = BOTTLETYPE_NH3;
- strcpy(_roomVar.love2.d8, "btle2");
+ strcpy(_roomVar.love.chamberOutputAnim, "btle2");
goto produceBottle;
}
} else if (c1 == CANTYPE_O2 && c2 == CANTYPE_N2) {
@@ -645,7 +645,7 @@ inertMatterFailure:
case SYNTHITEM_NONE: // Laughing gas
default:
_vm->_awayMission.love.synthesizerProduct = BOTTLETYPE_N2O;
- strcpy(_roomVar.love2.d8, "btle1");
+ strcpy(_roomVar.love.chamberOutputAnim, "btle1");
goto produceBottle;
}
}
@@ -663,7 +663,7 @@ inertMatterFailure:
void Room::love2SynthesizerDoorClosed() {
playVoc("LD1SCAN");
- loadActorAnim(OBJECT_SYNTHESIZER_OUTPUT, _roomVar.love2.d8, 0x8a, 0x8d, 4); // -> love2SynthesizerFinished
+ loadActorAnim(OBJECT_SYNTHESIZER_OUTPUT, _roomVar.love.chamberOutputAnim, 0x8a, 0x8d, 4); // -> love2SynthesizerFinished
_vm->_awayMission.love.field35 = SYNTHITEM_BOTTLE;
}
@@ -704,7 +704,7 @@ void Room::love2SynthesizerFinished() {
void Room::love2ClosedSynthesizerDoorMakingRLG() {
_vm->_awayMission.love.synthesizerProduct = BOTTLETYPE_RLG;
- strcpy(_roomVar.love2.d8, "btle4");
+ strcpy(_roomVar.love.chamberOutputAnim, "btle4");
loadActorAnim(OBJECT_SYNTHESIZER_DOOR, "s3r3d2", 0x8a, 0x8d, 3); // -> love2SynthesizerDoorClosed
playSoundEffectIndex(SND_DOOR1);
}
diff --git a/engines/startrek/rooms/love3.cpp b/engines/startrek/rooms/love3.cpp
index 0ac288548e..d562d69cfc 100644
--- a/engines/startrek/rooms/love3.cpp
+++ b/engines/startrek/rooms/love3.cpp
@@ -57,14 +57,14 @@ void Room::love3Tick1() {
else
loadActorAnim(OBJECT_SERVICE_PANEL, "s3r4d2", 1, 0, 0);
- if (_vm->_awayMission.love.field2c)
+ if (_vm->_awayMission.love.releasedHumanLaughingGas)
_vm->_awayMission.timers[0] = getRandomWordInRange(200, 400);
- if (_vm->_awayMission.love.field2d)
+ if (_vm->_awayMission.love.releasedRomulanLaughingGas)
_vm->_awayMission.timers[1] = getRandomWordInRange(200, 400);
_vm->_awayMission.timers[2] = 200;
- _roomVar.love3._188e = 0xb4;
- _roomVar.love3._188f = 0xb7;
+ _roomVar.love.cmnXPosToCureSpock = 0xb4;
+ _roomVar.love.cmnYPosToCureSpock = 0xb7;
}
void Room::love3Tick80() {
@@ -183,28 +183,28 @@ void Room::love3UseSTricorderAnywhere() {
}
void Room::love3UseKirkOnServicePanel() {
- _roomVar.love3.activeCrewman = OBJECT_KIRK;
- walkCrewman(_roomVar.love3.activeCrewman, 0x104, 0xae, 1);
+ _roomVar.love.activeCrewman = OBJECT_KIRK;
+ walkCrewman(_roomVar.love.activeCrewman, 0x104, 0xae, 1);
}
void Room::love3UseSpockOnServicePanel() {
- _roomVar.love3.activeCrewman = OBJECT_SPOCK;
- walkCrewman(_roomVar.love3.activeCrewman, 0x104, 0xae, 1);
+ _roomVar.love.activeCrewman = OBJECT_SPOCK;
+ walkCrewman(_roomVar.love.activeCrewman, 0x104, 0xae, 1);
}
void Room::love3UseMccoyOnServicePanel() {
- _roomVar.love3.activeCrewman = OBJECT_MCCOY;
- walkCrewman(_roomVar.love3.activeCrewman, 0x104, 0xae, 1);
+ _roomVar.love.activeCrewman = OBJECT_MCCOY;
+ walkCrewman(_roomVar.love.activeCrewman, 0x104, 0xae, 1);
}
void Room::love3UseRedshirtOnServicePanel() {
- _roomVar.love3.activeCrewman = OBJECT_REDSHIRT;
- walkCrewman(_roomVar.love3.activeCrewman, 0x104, 0xae, 1);
+ _roomVar.love.activeCrewman = OBJECT_REDSHIRT;
+ walkCrewman(_roomVar.love.activeCrewman, 0x104, 0xae, 1);
}
void Room::love3CrewmanReachedServicePanel() {
- Common::String anim = _vm->getCrewmanAnimFilename(_roomVar.love3.activeCrewman, "usehe");
- loadActorAnim2(_roomVar.love3.activeCrewman, anim, -1, -1, 1);
+ Common::String anim = _vm->getCrewmanAnimFilename(_roomVar.love.activeCrewman, "usehe");
+ loadActorAnim2(_roomVar.love.activeCrewman, anim, -1, -1, 1);
}
void Room::love3OpenedOrClosedServicePanel() {
diff --git a/engines/startrek/rooms/love4.cpp b/engines/startrek/rooms/love4.cpp
index e1cfcf3cdf..6aad01eb80 100644
--- a/engines/startrek/rooms/love4.cpp
+++ b/engines/startrek/rooms/love4.cpp
@@ -49,13 +49,16 @@ void Room::love4Tick1() {
loadActorAnim2(OBJECT_ROMULAN_4, "s3r5r4a", 0x12a, 0xaa, 0);
}
- if (_vm->_awayMission.love.field2c)
+ if (_vm->_awayMission.love.releasedHumanLaughingGas)
_vm->_awayMission.timers[0] = getRandomWordInRange(200, 400);
- if (_vm->_awayMission.love.field2d)
+ if (_vm->_awayMission.love.releasedRomulanLaughingGas)
_vm->_awayMission.timers[1] = getRandomWordInRange(200, 400);
_vm->_awayMission.timers[2] = 200;
loadActorAnim(OBJECT_DOOR, "s3r5d1a", 0x90, 0x99, 0);
+
+ _roomVar.love.cmnXPosToCureSpock = 0x6b;
+ _roomVar.love.cmnYPosToCureSpock = 0xb2;
}
void Room::love4Tick10() {
@@ -67,21 +70,21 @@ void Room::love4Tick10() {
void Room::love4WalkToDoor() {
_vm->_awayMission.disableInput = true;
- _roomVar.love4.walkingToDoor = true;
+ _roomVar.love.walkingToDoor = true;
walkCrewmanC(OBJECT_KIRK, 0x91, 0x9c, &Room::love4DoorOpenedOrReached);
}
// Triggers the door opening
void Room::love4TouchedHotspot0() {
- if (_roomVar.love4.walkingToDoor) {
+ if (_roomVar.love.walkingToDoor) {
loadActorAnimC(OBJECT_DOOR, "s3r5d1", 0x90, 0x99, &Room::love4DoorOpenedOrReached);
playSoundEffectIndex(SND_DOOR1);
}
}
void Room::love4DoorOpenedOrReached() {
- _roomVar.love4.doorOpenCounter++;
- if (_roomVar.love4.doorOpenCounter == 2)
+ _roomVar.love.doorOpenCounter++;
+ if (_roomVar.love.doorOpenCounter == 2)
loadRoomIndex(5, 1);
}
@@ -232,7 +235,7 @@ void Room::love4MccoyCuredRomulan1() {
loadActorAnim2(OBJECT_ROMULAN_1, "s3r5r1", 0x36, 0xb3, 0);
showText(TX_LOV4N005);
- if (!_roomVar.love4.gaveWaterToRomulans)
+ if (!_roomVar.love.gaveWaterToRomulans)
showText(TX_LOV4_023);
_vm->_awayMission.disableInput = false;
@@ -246,7 +249,7 @@ void Room::love4UseWaterOnRomulan() {
if (!_vm->_awayMission.love.romulansCured)
showText(TX_SPEAKER_MCCOY, TX_LOV4_009);
else {
- _roomVar.love4.gaveWaterToRomulans = true;
+ _roomVar.love.gaveWaterToRomulans = true;
if (_vm->_awayMission.love.romulansCured) {
showText(TX_LOV4N013);
showText(TX_SPEAKER_MCCOY, TX_LOV4_026);
diff --git a/engines/startrek/rooms/love5.cpp b/engines/startrek/rooms/love5.cpp
index 9a0cd8d1ce..26708a85fa 100644
--- a/engines/startrek/rooms/love5.cpp
+++ b/engines/startrek/rooms/love5.cpp
@@ -51,9 +51,9 @@ void Room::love5Tick1() {
else
loadActorAnim(OBJECT_PREAX, "s3r6r2", 0x116, 0xba);
- if (_vm->_awayMission.love.field2c)
+ if (_vm->_awayMission.love.releasedHumanLaughingGas)
_vm->_awayMission.timers[0] = getRandomWordInRange(200, 400);
- if (_vm->_awayMission.love.field2d)
+ if (_vm->_awayMission.love.releasedRomulanLaughingGas)
_vm->_awayMission.timers[1] = getRandomWordInRange(200, 400);
_vm->_awayMission.timers[2] = 200;
}
@@ -232,13 +232,13 @@ void Room::love5EndMission() {
if (!_vm->_awayMission.redshirtDead) {
_vm->_awayMission.crewDirectionsAfterWalk[OBJECT_REDSHIRT] = DIR_S;
walkCrewmanC(OBJECT_REDSHIRT, 0x69, 0xae, &Room::love5CrewmanReachedBeamoutPosition);
- _roomVar.love5.numCrewmenReadyToBeamOut--;
+ _roomVar.love.numCrewmenReadyToBeamOut--;
}
}
void Room::love5CrewmanReachedBeamoutPosition() {
- _roomVar.love5.numCrewmenReadyToBeamOut++;
- if (_roomVar.love5.numCrewmenReadyToBeamOut == 3) {
+ _roomVar.love.numCrewmenReadyToBeamOut++;
+ if (_roomVar.love.numCrewmenReadyToBeamOut == 3) {
_vm->_awayMission.love.missionScore += 17;
endMission(_vm->_awayMission.love.missionScore, 0x2c, 0);
}
diff --git a/engines/startrek/rooms/lovea.cpp b/engines/startrek/rooms/lovea.cpp
new file mode 100644
index 0000000000..59e0bb7eff
--- /dev/null
+++ b/engines/startrek/rooms/lovea.cpp
@@ -0,0 +1,253 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+// Common code for all rooms in LOVE mission.
+// TODO: from a cursory glance, this seems to be different in the floppy version?
+
+#include "startrek/room.h"
+
+namespace StarTrek {
+
+// Mccoy or Ferris say something under effects of laughing gas
+void Room::loveaTimer0Expired() {
+ const TextRef ferrisText[] = {
+ TX_LOV0_039,
+ TX_LOV0_048,
+ TX_LOV0_045,
+ TX_LOV0_040,
+ TX_LOV0_042,
+ TX_LOV0_050,
+ TX_LOV0_043,
+ TX_LOV0_041,
+ TX_LOV0_047,
+ TX_LOV0_046,
+ TX_LOV0_039
+ };
+
+ const TextRef mccoyText[] = {
+ TX_LOV0_011,
+ TX_LOV0_020,
+ TX_LOV0_016,
+ TX_LOV0_012,
+ TX_LOV0_014,
+ TX_LOV0_022,
+ TX_LOV0_015,
+ TX_LOV0_021,
+ TX_LOV0_013,
+ TX_LOV0_019,
+ TX_LOV0_017
+ };
+
+ // BUGFIX: should range from 0-1, not 0-2. Original had "get name errors" when it
+ // rolled a 2.
+ byte randomVal = getRandomWordInRange(0, 1);
+ TextRef speaker;
+
+ const TextRef *textTable;
+
+ if (randomVal == 0 || _vm->_awayMission.redshirtDead) {
+ speaker = TX_SPEAKER_MCCOY;
+ textTable = mccoyText;
+ }
+ else {
+ speaker = TX_SPEAKER_FERRIS;
+ textTable = ferrisText;
+ }
+
+ randomVal = getRandomWordInRange(0, 10);
+
+ showText(speaker, textTable[randomVal]);
+
+ if (!_vm->_awayMission.love.releasedRomulanLaughingGas) {
+ const int spockText[] = {
+ TX_LOV0_029,
+ TX_LOV0_033,
+ TX_LOV0_026,
+ TX_LOV0_124
+ };
+ showText(TX_SPEAKER_SPOCK, spockText[getRandomWordInRange(0, 3)]);
+
+ // BUG(?): This is in an if statement, meaning the human crewmen stop talking from
+ // laughing gas if Spock is under laughing gas effects. Might be intentional, to
+ // reduce "spamming" of text?
+ _vm->_awayMission.timers[0] = getRandomWordInRange(200, 400);
+ }
+}
+
+// Spock says something under effects of laughing gas
+void Room::loveaTimer1Expired() {
+ const int spockText[] = {
+ TX_LOV0_025,
+ TX_LOV0_101,
+ TX_LOV0_102,
+ TX_LOV0_103,
+ TX_LOV0_104,
+ TX_LOV0_105,
+ TX_LOV0_106,
+ TX_LOV0_107
+ };
+
+ showText(TX_SPEAKER_SPOCK, spockText[getRandomWordInRange(0, 7)]);
+
+ _vm->_awayMission.timers[1] = getRandomWordInRange(200, 400);
+}
+
+void Room::loveaUseMedkitOnSpock() {
+ if (_vm->_awayMission.love.spockCured)
+ showText(TX_SPEAKER_MCCOY, TX_LOV5_015);
+ else
+ showText(TX_SPEAKER_MCCOY, TX_LOV5_019);
+}
+
+void Room::loveaUseCureSampleOnSpock() {
+ if (_vm->_awayMission.love.spockCured) {
+ walkCrewman(OBJECT_SPOCK, _roomVar.love.cmnXPosToCureSpock, _roomVar.love.cmnYPosToCureSpock, 99);
+ walkCrewman(OBJECT_MCCOY, _roomVar.love.cmnXPosToCureSpock, _roomVar.love.cmnYPosToCureSpock + 10, 99);
+ }
+ else
+ showText(TX_SPEAKER_MCCOY, TX_LOVA_F55);
+}
+
+
+void Room::loveaUseCureOnSpock() {
+ if (_vm->_awayMission.love.spockCured)
+ showText(TX_SPEAKER_MCCOY, TX_LOV5_015);
+ else {
+ walkCrewman(OBJECT_SPOCK, _roomVar.love.cmnXPosToCureSpock, _roomVar.love.cmnYPosToCureSpock, 99);
+ walkCrewman(OBJECT_MCCOY, _roomVar.love.cmnXPosToCureSpock, _roomVar.love.cmnYPosToCureSpock + 10, 99);
+ }
+}
+
+void Room::loveaSpockOrMccoyInPositionToUseCure() {
+ _roomVar.love.spockAndMccoyReadyToUseCure++;
+ if (_roomVar.love.spockAndMccoyReadyToUseCure == 2)
+ loadActorAnim2(OBJECT_MCCOY, "musemn", -1, -1, 99);
+}
+
+void Room::loveaFinishedCuringSpock() {
+ showText(TX_SPEAKER_MCCOY, TX_LOV5_030);
+ showText(TX_SPEAKER_SPOCK, TX_LOV5_038);
+ showText(TX_SPEAKER_MCCOY, TX_LOV5_027);
+ showText(TX_SPEAKER_SPOCK, TX_LOV5C001);
+}
+
+
+// Timer 2 counts down the time until Spock and the Romulans succumb to the virus.
+// BUG(-ish): once Spock is cured, the romulans will never succumb to the virus.
+void Room::loveaTimer2Expired() {
+ if (!_vm->_awayMission.love.spockCured) {
+ _vm->_awayMission.love.spockInfectionCounter++;
+ if (_vm->_awayMission.love.spockInfectionCounter >= 100) { // Spock succumbs, game over
+ loadActorAnim(OBJECT_SPOCK, "sgetdn", -1, -1, 0);
+ playMidiMusicTracks(2, -1); // FIXME: assembly had no second parameter...?
+ showText(TX_GENER004);
+ showGameOverMenu();
+ }
+ else if (_vm->_awayMission.love.spockInfectionCounter == 15) {
+ showText(TX_SPEAKER_SPOCK, TX_SPOKCOFF);
+ _vm->_awayMission.love.spockInfectionCounter++;
+ }
+ else if (_vm->_awayMission.love.spockInfectionCounter == 30) {
+ showText(TX_SPEAKER_MCCOY, TX_LOVA_F08);
+ _vm->_awayMission.love.spockInfectionCounter++;
+ }
+ else if (_vm->_awayMission.love.spockInfectionCounter == 45) {
+ showText(TX_SPEAKER_SPOCK, TX_SPOKCOFF);
+ _vm->_awayMission.love.spockInfectionCounter++;
+ }
+ else if (_vm->_awayMission.love.spockInfectionCounter == 60) {
+ showText(TX_SPEAKER_SPOCK, TX_LOVA_F54);
+ _vm->_awayMission.love.romulansUnconsciousFromVirus = true;
+ _vm->_awayMission.love.spockInfectionCounter++;
+ }
+ }
+
+ _vm->_awayMission.timers[2] = 200;
+}
+
+void Room::loveaUseMTricorderOnSpock() {
+ // Mccoy doesn't do his animation, I guess because he doesn't know which way to face?
+ // (possible future enhancement?)
+ playSoundEffectIndex(SND_TRICORDER);
+
+ if (_vm->_awayMission.love.spockCured)
+ showText(TX_SPEAKER_MCCOY, TX_LOVA_F01);
+ else if (!_vm->_awayMission.love.knowAboutVirus)
+ showText(TX_SPEAKER_MCCOY, TX_LOVA_F02);
+ else if (_vm->_awayMission.love.spockInfectionCounter < 10)
+ showText(TX_SPEAKER_MCCOY, TX_LOVA_F04);
+ else if (_vm->_awayMission.love.spockInfectionCounter < 30)
+ showText(TX_SPEAKER_MCCOY, TX_LOVA_F03);
+ else if (_vm->_awayMission.love.spockInfectionCounter < 50)
+ showText(TX_SPEAKER_MCCOY, TX_LOVA_F08);
+ else if (_vm->_awayMission.love.spockInfectionCounter < 70) // BUGFIX: < 70 instead of == 70
+ showText(TX_SPEAKER_MCCOY, TX_TUG2_010);
+ else if (_vm->_awayMission.love.spockInfectionCounter < 100)
+ showText(TX_SPEAKER_MCCOY, TX_LOVA_F10);
+ else
+ showText(TX_SPEAKER_MCCOY, TX_LOVA_100);
+}
+
+void Room::loveaUseMTricorderOnHuman() {
+ playSoundEffectIndex(SND_TRICORDER);
+ showText(TX_SPEAKER_MCCOY, TX_LOVA_F07);
+}
+
+void Room::loveaUseRomulanLaughingGas() {
+ showText(TX_LOV2N005);
+ _vm->_awayMission.love.releasedRomulanLaughingGas = true;
+ loseItem(OBJECT_IRLG);
+
+ // BUGFIX: start the effects immediately
+ _vm->_awayMission.timers[1] = getRandomWordInRange(200, 400);
+}
+
+void Room::loveaUseHumanLaughingGas() {
+ showText(TX_LOV2N005);
+ showText(TX_SPEAKER_SPOCK, TX_MUD2_040);
+ _vm->_awayMission.love.releasedHumanLaughingGas = true;
+ loseItem(OBJECT_IN2O);
+ playMidiMusicTracks(3, -1); // FIXME: assembly had no second parameter...?
+
+ // BUGFIX: start the effects immediately
+ _vm->_awayMission.timers[0] = getRandomWordInRange(200, 400);
+}
+
+void Room::loveaUseAmmonia() {
+ showText(TX_LOV2N005);
+ // TODO: redshirt says something in floppy edition only
+ loseItem(OBJECT_INH3);
+}
+
+void Room::loveaUseCommunicator() {
+ // There were originally number of branches here, based on whether we've got the cure
+ // and whether we've contacted the enterprise already; but all of them branch to the
+ // exact same code.
+ // TODO: perhaps the floppy edition had different text for each case.
+
+ showText(TX_SPEAKER_KIRK, TX_MUD4_018);
+ showText(TX_SPEAKER_UHURA, TX_BRIDU146);
+ showText(TX_SPEAKER_KIRK, TX_VENA_F41);
+ _vm->_awayMission.love.contactedEnterpriseBeforeCure = true;
+}
+
+}
diff --git a/engines/startrek/startrek.cpp b/engines/startrek/startrek.cpp
index 7fe0257409..b0eb045a8b 100644
--- a/engines/startrek/startrek.cpp
+++ b/engines/startrek/startrek.cpp
@@ -84,7 +84,7 @@ StarTrekEngine::StarTrekEngine(OSystem *syst, const StarTrekGameDescription *gam
_textboxHasMultipleChoices = false;
_missionToLoad = "LOVE";
- _roomIndexToLoad = 2;
+ _roomIndexToLoad = 0;
for (int i = 0; i < NUM_OBJECTS; i++)
_itemList[i] = g_itemList[i];
diff --git a/engines/startrek/text.h b/engines/startrek/text.h
index 7ae6b0be09..e7a529d8dc 100644
--- a/engines/startrek/text.h
+++ b/engines/startrek/text.h
@@ -29,6 +29,8 @@
namespace StarTrek {
+typedef int32 TextRef;
+
// Text that's loaded from "GROUND.TXT". First 0x40 pieces of text are for items.
enum GroundTextIDs {
// Generic "perform undefined action" text (ie. look at nothing, talk to wall)
@@ -805,20 +807,6 @@ enum GameStringIDs {
TX_LOV0N007,
TX_LOV0N008,
TX_LOV0N009,
- TX_LOVA_100,
- TX_LOVA_F01,
- TX_LOVA_F02,
- TX_LOVA_F03,
- TX_LOVA_F04,
- TX_LOVA_F07,
- TX_LOVA_F08,
- TX_LOVA_F10,
- TX_LOVA_F54,
- TX_LOVA_F55,
- TX_MUD2_040,
- TX_MUD4_018,
- TX_spokcoff,
- TX_VENA_F41,
TX_LOV1_001,
@@ -1157,6 +1145,22 @@ enum GameStringIDs {
TX_LOV5C001, // Custom
+ TX_LOVA_100,
+ TX_LOVA_F01,
+ TX_LOVA_F02,
+ TX_LOVA_F03,
+ TX_LOVA_F04,
+ TX_LOVA_F07,
+ TX_LOVA_F08,
+ TX_LOVA_F10,
+ TX_LOVA_F54,
+ TX_LOVA_F55,
+ TX_MUD2_040,
+ TX_MUD4_018,
+ TX_SPOKCOFF,
+ TX_VENA_F41,
+
+
TX_END
};
@@ -1905,20 +1909,6 @@ const char * const g_gameStrings[] = {
"#LOV0\\LOV0N007#This is a heavily secured door, leading to another section of the station. Its access code has been breached.",
"#LOV0\\LOV0N008#This is a standard door, leading to another room on this deck.",
"#LOV0\\LOV0N009#You are on the bridge of the ARK7.",
- "#LOVA\\LOVA_100#He's dead, Jim.",
- "#LOVA\\LOVA_F01#He's been cured of the Oroborus virus.",
- "#LOVA\\LOVA_F02#I'm picking up some kind of virus. I can't identify it without more information.",
- "#LOVA\\LOVA_F03#He's infected with the virus, Jim.",
- "#LOVA\\LOVA_F04#The virus affects the Romulan-Vulcan genotype, Jim.",
- "#LOVA\\LOVA_F07#All lifesigns are normal.",
- "#LOVA\\LOVA_F08#It's what I was afraid of, Jim. I think spock is getting worse.",
- "#LOVA\\LOVA_F10#He has weak vital signs.",
- "#LOVA\\LOVA_F54#The virus has spread to me, Captain.Isuggestyouconcentrateyoureffortsonthe",
- "#LOVA\\LOVA_F55#Jim, we need to sysnthesize more to make the serum before we can use it.",
- "#MUD2\\MUD2_040#You look troubled, Captain.",
- "#MUD4\\MUD4_018#Kirk to Enterprise ... Kirk to Enterprise.",
- "#sfx\\spokcoff#cough... cough...",
- "#VENA\\VENA_F41#Kirk out.",
"#LOV1\\LOV1_001#When you are finished admiring all the equipment Bones, maybe you can help us figure out what's going on here.",
@@ -2255,6 +2245,22 @@ const char * const g_gameStrings[] = {
"#LOV5\\LOV5N017#The Romulan Preax weakly regains conscienceness, reaching for his weapon.",
"#LOV5\\LOV5N018#The Romulan Preax drinks thirstily and empties the container.",
"(Raises an eyebrow).", // NOTE: no corresponding audio
+
+
+ "#LOVA\\LOVA_100#He's dead, Jim.",
+ "#LOVA\\LOVA_F01#He's been cured of the Oroborus virus.",
+ "#LOVA\\LOVA_F02#I'm picking up some kind of virus. I can't identify it without more information.",
+ "#LOVA\\LOVA_F03#He's infected with the virus, Jim.",
+ "#LOVA\\LOVA_F04#The virus affects the Romulan-Vulcan genotype, Jim.",
+ "#LOVA\\LOVA_F07#All lifesigns are normal.",
+ "#LOVA\\LOVA_F08#It's what I was afraid of, Jim. I think Spock is getting worse.", // TYPO
+ "#LOVA\\LOVA_F10#He has weak vital signs.",
+ "#LOVA\\LOVA_F54#The virus has spread to me, Captain. I suggest you concentrate your efforts on the problem.",
+ "#LOVA\\LOVA_F55#Jim, we need to synthesize more to make the serum before we can use it.", // TYPO
+ "#MUD2\\MUD2_040#You look troubled, Captain.",
+ "#MUD4\\MUD4_018#Kirk to Enterprise ... Kirk to Enterprise.",
+ "#sfx\\spokcoff#cough... cough...",
+ "#VENA\\VENA_F41#Kirk out.",
};
}