diff options
author | Matthew Stewart | 2018-06-24 16:18:12 -0400 |
---|---|---|
committer | Eugene Sandulenko | 2018-08-09 08:37:30 +0200 |
commit | aca19870562fe4dfcd98f3b062bf74dd0dee6daa (patch) | |
tree | 3386f904cb9265b550a0f04fd1d660ef30add684 /engines/startrek | |
parent | a5c7d6ae11c255647e2026ae447e76f0ae52c67f (diff) | |
download | scummvm-rg350-aca19870562fe4dfcd98f3b062bf74dd0dee6daa.tar.gz scummvm-rg350-aca19870562fe4dfcd98f3b062bf74dd0dee6daa.tar.bz2 scummvm-rg350-aca19870562fe4dfcd98f3b062bf74dd0dee6daa.zip |
STARTREK: Implement common code for LOVE mission
Diffstat (limited to 'engines/startrek')
-rw-r--r-- | engines/startrek/awaymission.h | 7 | ||||
-rw-r--r-- | engines/startrek/module.mk | 1 | ||||
-rw-r--r-- | engines/startrek/room.cpp | 10 | ||||
-rw-r--r-- | engines/startrek/room.h | 87 | ||||
-rw-r--r-- | engines/startrek/rooms/function_map.h | 117 | ||||
-rw-r--r-- | engines/startrek/rooms/love0.cpp | 55 | ||||
-rw-r--r-- | engines/startrek/rooms/love1.cpp | 148 | ||||
-rw-r--r-- | engines/startrek/rooms/love2.cpp | 128 | ||||
-rw-r--r-- | engines/startrek/rooms/love3.cpp | 28 | ||||
-rw-r--r-- | engines/startrek/rooms/love4.cpp | 19 | ||||
-rw-r--r-- | engines/startrek/rooms/love5.cpp | 10 | ||||
-rw-r--r-- | engines/startrek/rooms/lovea.cpp | 253 | ||||
-rw-r--r-- | engines/startrek/startrek.cpp | 2 | ||||
-rw-r--r-- | engines/startrek/text.h | 62 |
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.", }; } |