diff options
Diffstat (limited to 'engines/startrek')
-rw-r--r-- | engines/startrek/awaymission.cpp | 2 | ||||
-rw-r--r-- | engines/startrek/awaymission.h | 4 | ||||
-rw-r--r-- | engines/startrek/room.h | 47 | ||||
-rw-r--r-- | engines/startrek/rooms/function_map.h | 36 | ||||
-rw-r--r-- | engines/startrek/rooms/love4.cpp | 7 | ||||
-rw-r--r-- | engines/startrek/rooms/love5.cpp | 391 | ||||
-rw-r--r-- | engines/startrek/startrek.cpp | 2 | ||||
-rw-r--r-- | engines/startrek/text.h | 178 |
8 files changed, 649 insertions, 18 deletions
diff --git a/engines/startrek/awaymission.cpp b/engines/startrek/awaymission.cpp index 01520fa200..4c2e8a1343 100644 --- a/engines/startrek/awaymission.cpp +++ b/engines/startrek/awaymission.cpp @@ -41,7 +41,7 @@ void StarTrekEngine::initAwayMission() { _roomIndexToLoad = -1; // Load crew positions for beaming in - initAwayCrewPositions(0); + initAwayCrewPositions(4); } void StarTrekEngine::runAwayMission() { diff --git a/engines/startrek/awaymission.h b/engines/startrek/awaymission.h index 13d8c83eea..fdf46ee65f 100644 --- a/engines/startrek/awaymission.h +++ b/engines/startrek/awaymission.h @@ -165,6 +165,9 @@ struct AwayMission { bool visitedRoomWithRomulans; // 0x3f bool romulansCured; // 0x40 bool romulansUnconsciousFromVirus; // 0x41 + bool freedMarcusAndCheever; // 0x42 + bool preaxCured; // 0x43 + bool spockCured; // 0x46 bool spockAccessedConsole; // 0x49 bool mccoyAccessedConsole; // 0x4a bool gotPolyberylcarbonate; // 0x4b @@ -172,6 +175,7 @@ struct AwayMission { bool gotPointsForOpeningGrate; // 0x4d bool gotPointsForGassingRomulans; // 0x4e bool gotCure; // 0x4f + bool gotPointsForHydratingPreax; // 0x50 bool gotPointsForHydratingRomulans; // 0x51 int16 missionScore; // 0x52 } love; diff --git a/engines/startrek/room.h b/engines/startrek/room.h index 0a3a0e2ddd..3775974019 100644 --- a/engines/startrek/room.h +++ b/engines/startrek/room.h @@ -109,7 +109,7 @@ private: // Command 0x05: "demon4ShowSunPuzzle" void loadRoomIndex(int roomIndex, int spawnIndex); // Cmd 0x06 void loseItem(int item); // Cmd 0x07 - void walkCrewman(int actorIndex, int16 destX, int16 destY, uint16 finishedAnimActionParam);// Cmd 0x08 + void walkCrewman(int actorIndex, int16 destX, int16 destY, uint16 finishedAnimActionParam = 0);// Cmd 0x08 void walkCrewmanC(int actorIndex, int16 destX, int16 destY, void (Room::*funcPtr)()); // Cmd 0x08 void loadMapFile(const Common::String &name); // Cmd 0x09 void showBitmapFor5Ticks(const Common::String &bmpName, int priority); // Cmd 0x0a @@ -1053,6 +1053,47 @@ public: // LOVE5 void love5Tick1(); + void love5TouchedWarp1(); + void love5Timer4Expired(); + void love5UseStunPhaserOnPreax(); + void love5LookAtKirk(); + void love5LookAtSpock(); + void love5LookAtMccoy(); + void love5LookAtRedshirt(); + void love5LookAnywhere(); + void love5LookAtDevice(); + void love5LookAtConsole(); + void love5LookAtDrMarcus(); + void love5LookAtDrCheever(); + void love5LookAtPreax(); + void love5TalkToPreax(); + void love5MccoyReachedSpockToCure(); + void love5MccoyCuredSpock(); + void love5EndMission(); + void love5CrewmanReachedBeamoutPosition(); + void love5TalkToDrMarcus(); + void love5TalkToDrCheever(); + void love5TalkToKirk(); + void love5TalkToSpock(); + void love5TalkToMccoy(); + void love5TalkToRedshirt(); + void love5UseSTricorderAnywhere(); + void love5UseSTricorderOnDevice(); + void love5UseMTricorderOnMarcusOrCheever(); + void love5UseMTricorderOnPreax(); + void love5UseMedkitOnPreax(); + void love5UseWaterOnPreax(); + void love5UseCureSampleOnPreax(); + void love5UseCureOnPreax(); + void love5ReachedPreaxUsingCure(); + void love5CuredPreax(); + void love5UseAnythingOnPreax(); + void love5UseKirkOnMarcusOrCheever(); + void love5KirkReachedCheever(); + void love5KirkUntiedCheever(); + void love5KirkReachedMarcus(); + void love5KirkUntiedMarcus(); + void love5MarcusStoodUp(); private: // Room-specific variables. This is memset'ed to 0 when the room is initialized. @@ -1174,6 +1215,10 @@ private: bool walkingToDoor; // 0xcc } love4; + struct { + byte numCrewmenReadyToBeamOut; // 0xcb + } love5; + } _roomVar; }; diff --git a/engines/startrek/rooms/function_map.h b/engines/startrek/rooms/function_map.h index 22cecb68fc..54b1028eda 100644 --- a/engines/startrek/rooms/function_map.h +++ b/engines/startrek/rooms/function_map.h @@ -1150,6 +1150,7 @@ RoomAction love4ActionList[] = { { Action(ACTION_USE, OBJECT_IPHASERS, 10, 0), &Room::love4UseStunPhaserOnRomulan }, { Action(ACTION_USE, OBJECT_IPHASERS, 11, 0), &Room::love4UseStunPhaserOnRomulan }, { Action(ACTION_USE, OBJECT_IPHASERS, 12, 0), &Room::love4UseStunPhaserOnRomulan }, + // NOTE: nothing for OBJECT_IPHASERK. There's an unused audio file which might fit. { Action(ACTION_LOOK, -1, 0, 0), &Room::love4LookAnywhere }, { Action(ACTION_LOOK, 0x21, 0, 0), &Room::love4LookAtLadder }, { Action(ACTION_LOOK, 8, 0, 0), &Room::love4LookAtDoor }, @@ -1195,10 +1196,45 @@ 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 }; RoomAction love5ActionList[] = { { Action(ACTION_TICK, 1, 0, 0), &Room::love5Tick1 }, + { Action(ACTION_TOUCHED_WARP, 1, 0, 0), &Room::love5TouchedWarp1 }, + { Action(ACTION_TIMER_EXPIRED, 4, 0, 0), &Room::love5Timer4Expired }, + { Action(ACTION_USE, OBJECT_IPHASERS, 9, 0), &Room::love5UseStunPhaserOnPreax }, + // NOTE: nothing for OBJECT_IPHASERK. There's an unused audio file which might fit. + { Action(ACTION_LOOK, OBJECT_KIRK, 0, 0), &Room::love5LookAtKirk }, + { Action(ACTION_LOOK, OBJECT_SPOCK, 0, 0), &Room::love5LookAtSpock }, + { Action(ACTION_LOOK, OBJECT_MCCOY, 0, 0), &Room::love5LookAtMccoy }, + { Action(ACTION_LOOK, OBJECT_REDSHIRT, 0, 0), &Room::love5LookAtRedshirt }, + { Action(ACTION_LOOK, -1, 0, 0), &Room::love5LookAnywhere }, + { Action(ACTION_LOOK, 0x20, 0, 0), &Room::love5LookAtDevice }, + { Action(ACTION_LOOK, 0x21, 0, 0), &Room::love5LookAtConsole }, + { Action(ACTION_LOOK, 10, 0, 0), &Room::love5LookAtDrMarcus }, + { Action(ACTION_LOOK, 11, 0, 0), &Room::love5LookAtDrCheever }, + { Action(ACTION_LOOK, 9, 0, 0), &Room::love5LookAtPreax }, + { Action(ACTION_TALK, 9, 0, 0), &Room::love5TalkToPreax }, + { Action(ACTION_TALK, 10, 0, 0), &Room::love5TalkToDrMarcus }, + { Action(ACTION_TALK, 11, 0, 0), &Room::love5TalkToDrCheever }, + { Action(ACTION_TALK, OBJECT_KIRK, 0, 0), &Room::love5TalkToKirk }, + { Action(ACTION_TALK, OBJECT_SPOCK, 0, 0), &Room::love5TalkToSpock }, + { Action(ACTION_TALK, OBJECT_MCCOY, 0, 0), &Room::love5TalkToMccoy }, + { Action(ACTION_TALK, OBJECT_REDSHIRT, 0, 0), &Room::love5TalkToRedshirt }, + { Action(ACTION_USE, OBJECT_ISTRICOR, -1, 0), &Room::love5UseSTricorderAnywhere }, + { Action(ACTION_USE, OBJECT_ISTRICOR, 0x20, 0), &Room::love5UseSTricorderOnDevice }, + { Action(ACTION_USE, OBJECT_IMTRICOR, 10, 0), &Room::love5UseMTricorderOnMarcusOrCheever }, + { Action(ACTION_USE, OBJECT_IMTRICOR, 11, 0), &Room::love5UseMTricorderOnMarcusOrCheever }, + { Action(ACTION_USE, OBJECT_IMTRICOR, 9, 0), &Room::love5UseMTricorderOnPreax }, + { Action(ACTION_USE, OBJECT_IMEDKIT, 9, 0), &Room::love5UseMedkitOnPreax }, + { Action(ACTION_USE, OBJECT_IH2O, 9, 0), &Room::love5UseWaterOnPreax }, + { Action(ACTION_USE, OBJECT_ISAMPLE, 9, 0), &Room::love5UseCureSampleOnPreax }, + { Action(ACTION_USE, OBJECT_ICURE, 9, 0), &Room::love5UseCureOnPreax }, + { Action(ACTION_USE, -1, 9, 0), &Room::love5UseAnythingOnPreax }, + { Action(ACTION_USE, OBJECT_KIRK, 10, 0), &Room::love5UseKirkOnMarcusOrCheever }, + { Action(ACTION_USE, OBJECT_KIRK, 11, 0), &Room::love5UseKirkOnMarcusOrCheever }, + // TODO: common code }; diff --git a/engines/startrek/rooms/love4.cpp b/engines/startrek/rooms/love4.cpp index 63d1d9d654..e1cfcf3cdf 100644 --- a/engines/startrek/rooms/love4.cpp +++ b/engines/startrek/rooms/love4.cpp @@ -261,9 +261,10 @@ void Room::love4UseWaterOnRomulan() { } // Note the following unused block of code, an alternative implementation of the - // function? If they succumbed to the virus from taking too long, McCoy doesn't let - // you hydrate them, saying it's dangerous. Otherwise, the romulans get up even - // without receiving the cure. (At least the narration says they do.) + // function, resembling the version in love5. If they succumbed to the virus from + // taking too long, McCoy doesn't let you hydrate them, saying it's dangerous. + // Otherwise, the romulans get up even without receiving the cure. (At least the + // narration says they do.) // These events don't make too much sense, probably cut in the original release, but // they did get voice acted anyway. if (false) { diff --git a/engines/startrek/rooms/love5.cpp b/engines/startrek/rooms/love5.cpp index 0abeb59f4a..9a0cd8d1ce 100644 --- a/engines/startrek/rooms/love5.cpp +++ b/engines/startrek/rooms/love5.cpp @@ -22,14 +22,401 @@ #include "startrek/room.h" -#define OBJECT_DOOR1 8 +#define OBJECT_8 8 +#define OBJECT_PREAX 9 +#define OBJECT_MARCUS 10 +#define OBJECT_CHEEVER 11 -#define HOTSPOT_CONSOLE 0x20 +#define HOTSPOT_DEVICE 0x20 +#define HOTSPOT_CONSOLE 0x21 namespace StarTrek { void Room::love5Tick1() { + playVoc("LOV5LOOP"); + loadActorAnim(OBJECT_8, "s3r6c1", 0x27, 0xa9); + + if (_vm->_awayMission.love.freedMarcusAndCheever) { + loadActorAnim(OBJECT_MARCUS, "marcusst", 0x28, 0xa6); + loadActorAnim(OBJECT_CHEEVER, "s3gtupst", 0x49, 0xac); + } + else { + loadActorAnim(OBJECT_MARCUS, "marcus2", 0x28, 0xa6); + loadActorAnim(OBJECT_CHEEVER, "s3gtup2", 0x49, 0xac); + } + + if (_vm->_awayMission.love.preaxCured) + loadActorAnim(OBJECT_PREAX, "s3r6r3", 0x116, 0xba); + else + loadActorAnim(OBJECT_PREAX, "s3r6r2", 0x116, 0xba); + + if (_vm->_awayMission.love.field2c) + _vm->_awayMission.timers[0] = getRandomWordInRange(200, 400); + if (_vm->_awayMission.love.field2d) + _vm->_awayMission.timers[1] = getRandomWordInRange(200, 400); + _vm->_awayMission.timers[2] = 200; +} + +void Room::love5TouchedWarp1() { + _vm->_awayMission.disableInput = true; + playSoundEffectIndex(SND_DOOR1); + _vm->_awayMission.timers[4] = 10; +} + +void Room::love5Timer4Expired() { + loadRoomIndex(4, 0); +} + +void Room::love5UseStunPhaserOnPreax() { + showText(TX_SPEAKER_MCCOY, TX_LOV5_011); + + // BUG: this function has two implementations. The second one (which is shadowed) is + // below. + // Perhaps one was supposed to be for IPHASERK, or for Dr. Marcus? + //showText(TX_SPEAKER_MCCOY, TX_FEA5_008); +} + +void Room::love5LookAtKirk() { + showText(TX_LOV5N004); +} + +void Room::love5LookAtSpock() { + showText(TX_LOV5N005); +} + +void Room::love5LookAtMccoy() { + showText(TX_LOV5N002); +} + +void Room::love5LookAtRedshirt() { + showText(TX_LOV5N003); +} + +void Room::love5LookAnywhere() { + showText(TX_LOV5N008); + + // There is an unused version of this function, which states "This is Dr. Marcus's + // quarters, and there are hostages and 4 romulans here". That description doesn't + // match any actual room. + // There are LOVE6.MAP and LOVE6.IW files, but none of the other necessary files to + // load room LOVE6. This may be a leftover from a removed room that somehow ended up + // here. + + //showText(TX_LOV5N009); +} + +void Room::love5LookAtDevice() { + showText(TX_LOV5N013); + showText(TX_SPEAKER_MCCOY, TX_LOV5_028); + showText(TX_SPEAKER_MARCUS, TX_LOV5_044); +} + +void Room::love5LookAtConsole() { + showText(TX_LOV5N016); + showText(TX_SPEAKER_MCCOY, TX_LOV5_031); + showText(TX_SPEAKER_MARCUS, TX_LOV5_050); +} + +void Room::love5LookAtDrMarcus() { + if (_vm->_awayMission.love.freedMarcusAndCheever) + showText(TX_LOV5N001); + else { + // BUGFIX: originally played audio "LOV5N001", which is only the first sentence of + // what should be spoken. + showText(TX_LOV5N015); + + showText(TX_SPEAKER_MARCUS, TX_LOV5_046); + } +} + +void Room::love5LookAtDrCheever() { + if (_vm->_awayMission.love.freedMarcusAndCheever) + showText(TX_LOV5N000); + else { + showText(TX_LOV5N014); + showText(TX_SPEAKER_CHEEVER, TX_LOV5_057); + if (!_vm->_awayMission.redshirtDead) { + showText(TX_SPEAKER_FERRIS, TX_LOV5_054); + showText(TX_SPEAKER_CHEEVER, TX_LOV5_058); + } + } +} + +void Room::love5LookAtPreax() { + if (_vm->_awayMission.love.preaxCured) + showText(TX_LOV5N011); + else + showText(TX_LOV5N012); +} + +void Room::love5TalkToPreax() { + if (_vm->_awayMission.love.preaxCured) { + if (!_vm->_awayMission.love.freedMarcusAndCheever) + showText(TX_LOV5N006); + else { + const int choices[] = { + TX_SPEAKER_KIRK, + TX_LOV5_008, + TX_LOV5_004, + TX_LOV5_006, + TX_BLANK, + }; + + showText(TX_SPEAKER_PREAX, TX_LOV5_059); + int choice = showText(choices); + + switch (choice) { + case 1: + showText(TX_SPEAKER_MARCUS, TX_LOV5_043); + // fall through + case 0: + showText(TX_SPEAKER_PREAX, TX_LOV5_061); + showText(TX_SPEAKER_KIRK, TX_LOV5_010); + + // NOTE: This just says "(Spock raises an eyebrow)". No audio associated. + showText(TX_SPEAKER_SPOCK, TX_LOV5C001); + + showText(TX_SPEAKER_MCCOY, TX_LOV5_032); + + break; + case 2: + showText(TX_SPEAKER_PREAX, TX_LOV5_060); + break; + default: + showText(TX_DIALOG_ERROR); + break; + } + + showText(TX_SPEAKER_KIRK, TX_LOV5_002); + showText(TX_SPEAKER_MARCUS, TX_LOV5_045); + + _vm->_awayMission.disableInput = true; + + if (!_vm->_awayMission.love.spockCured) { + showText(TX_SPEAKER_MCCOY, TX_LOV5_021); + walkCrewmanC(OBJECT_MCCOY, 0x87, 0xc3, &Room::love5MccoyReachedSpockToCure); + } + else + love5EndMission(); + } + } else + showText(TX_SPEAKER_MARCUS, TX_LOV5_018); +} + +void Room::love5MccoyReachedSpockToCure() { + loadActorAnimC(OBJECT_MCCOY, "musemn", -1, -1, &Room::love5MccoyCuredSpock); +} + +void Room::love5MccoyCuredSpock() { + showText(TX_SPEAKER_MCCOY, TX_LOV5_030); + showText(TX_SPEAKER_SPOCK, TX_LOV5_038); + showText(TX_SPEAKER_MCCOY, TX_LOV5_027); + // NOTE: This just says "(Spock raises an eyebrow)". No audio associated. + showText(TX_SPEAKER_SPOCK, TX_LOV5C001); + love5EndMission(); +} + +void Room::love5EndMission() { + showText(TX_SPEAKER_KIRK, TX_LOV5_001); + + _vm->_awayMission.crewDirectionsAfterWalk[OBJECT_KIRK] = DIR_S; + walkCrewmanC(OBJECT_KIRK, 0x64, 0xc2, &Room::love5CrewmanReachedBeamoutPosition); + + _vm->_awayMission.crewDirectionsAfterWalk[OBJECT_SPOCK] = DIR_S; + walkCrewmanC(OBJECT_SPOCK, 0x5a, 0xb8, &Room::love5CrewmanReachedBeamoutPosition); + + _vm->_awayMission.crewDirectionsAfterWalk[OBJECT_MCCOY] = DIR_S; + walkCrewmanC(OBJECT_MCCOY, 0x6e, 0xb8, &Room::love5CrewmanReachedBeamoutPosition); + + if (!_vm->_awayMission.redshirtDead) { + _vm->_awayMission.crewDirectionsAfterWalk[OBJECT_REDSHIRT] = DIR_S; + walkCrewmanC(OBJECT_REDSHIRT, 0x69, 0xae, &Room::love5CrewmanReachedBeamoutPosition); + _roomVar.love5.numCrewmenReadyToBeamOut--; + } +} + +void Room::love5CrewmanReachedBeamoutPosition() { + _roomVar.love5.numCrewmenReadyToBeamOut++; + if (_roomVar.love5.numCrewmenReadyToBeamOut == 3) { + _vm->_awayMission.love.missionScore += 17; + endMission(_vm->_awayMission.love.missionScore, 0x2c, 0); + } +} + +void Room::love5TalkToDrMarcus() { + if (!_vm->_awayMission.love.freedMarcusAndCheever) + showText(TX_SPEAKER_MARCUS, TX_LOV5_040); + else { + if (!haveItem(OBJECT_ICURE)) + showText(TX_SPEAKER_MARCUS, TX_LOV5_039); + else + showText(TX_SPEAKER_MARCUS, TX_LOV5_042); + } +} + +void Room::love5TalkToDrCheever() { + if (!_vm->_awayMission.love.freedMarcusAndCheever) + showText(TX_SPEAKER_CHEEVER, TX_LOV5_055); + else + showText(TX_SPEAKER_CHEEVER, TX_LOV5_056); +} + +void Room::love5TalkToKirk() { + showText(TX_SPEAKER_KIRK, TX_LOV5_003); + showText(TX_SPEAKER_MARCUS, TX_LOV5_048); + showText(TX_SPEAKER_KIRK, TX_LOV5_009); + showText(TX_SPEAKER_MARCUS, TX_LOV5_047); +} + +void Room::love5TalkToSpock() { + showText(TX_SPEAKER_SPOCK, TX_LOV5_036); + showText(TX_SPEAKER_MARCUS, TX_LOV5_051); + showText(TX_SPEAKER_SPOCK, TX_G_024); +} + +void Room::love5TalkToMccoy() { + if (!_vm->_awayMission.love.preaxCured) + showText(TX_SPEAKER_MCCOY, TX_LOV5_014); +} + +void Room::love5TalkToRedshirt() { + showText(TX_SPEAKER_FERRIS, TX_LOV5_052); +} + +void Room::love5UseSTricorderAnywhere() { + spockScan(DIR_S, TX_LOV5_033, false); +} + +void Room::love5UseSTricorderOnDevice() { + spockScan(DIR_N, TX_LOV5_034, false); + showText(TX_SPEAKER_MARCUS, TX_LOV5_049); +} + +void Room::love5UseMTricorderOnMarcusOrCheever() { + mccoyScan(DIR_W, TX_LOV5_025, false); +} + +void Room::love5UseMTricorderOnPreax() { + if (!_vm->_awayMission.love.preaxCured) { + if (_vm->_awayMission.love.romulansUnconsciousFromLaughingGas) + mccoyScan(DIR_E, TX_LOV5_024, false); + else + mccoyScan(DIR_E, TX_LOV5_016, false); + } +} + +void Room::love5UseMedkitOnPreax() { + if (_vm->_awayMission.love.preaxCured) + showText(TX_SPEAKER_MCCOY, TX_LOV5_015); + else + showText(TX_SPEAKER_MCCOY, TX_LOV5_019); +} + +void Room::love5UseWaterOnPreax() { + if (_vm->_awayMission.love.preaxCured) { + showText(TX_LOV5N018); + showText(TX_SPEAKER_MCCOY, TX_LOV5_029); + showText(TX_SPEAKER_KIRK, TX_LOV5_007); + if (!_vm->_awayMission.love.gotPointsForHydratingPreax) { + _vm->_awayMission.love.gotPointsForHydratingPreax = true; + _vm->_awayMission.love.missionScore++; + } + loseItem(OBJECT_IH2O); + } + else { + if (_vm->_awayMission.love.romulansUnconsciousFromVirus) { + showText(TX_SPEAKER_MCCOY, TX_LOV5_013); + // BUGFIX: original didn't have correct speaker. Also, you shouldn't lose your + // water since it's not actually used here, so a "loseItem" line was removed. + } + else { + showText(TX_LOV5N017); + if (!_vm->_awayMission.redshirtDead) { + showText(TX_SPEAKER_FERRIS, TX_LOV5_053); + showText(TX_SPEAKER_KIRK, TX_LOV5_005); + } + showText(TX_SPEAKER_MCCOY, TX_LOV5_026); + loseItem(OBJECT_IH2O); + + // BUGFIX: give a point for hydrating the Preax. It's inconsistent to only + // give points if he's already cured. + if (!_vm->_awayMission.love.gotPointsForHydratingPreax) { + _vm->_awayMission.love.gotPointsForHydratingPreax = true; + _vm->_awayMission.love.missionScore++; + } + } + } +} + +void Room::love5UseCureSampleOnPreax() { + showText(TX_SPEAKER_MCCOY, TX_LOV5_020); // BUGFIX: original didn't have correct speaker +} + + +void Room::love5UseCureOnPreax() { + if (!_vm->_awayMission.love.preaxCured) + walkCrewmanC(OBJECT_MCCOY, 0x116, 0xbf, &Room::love5ReachedPreaxUsingCure); +} + +void Room::love5ReachedPreaxUsingCure() { + loadActorAnimC(OBJECT_MCCOY, "musemn", -1, -1, &Room::love5CuredPreax); +} + +void Room::love5CuredPreax() { + walkCrewman(OBJECT_MCCOY, 0xdc, 0xc3); + _vm->_awayMission.crewDirectionsAfterWalk[OBJECT_MCCOY] = DIR_E; + + showText(TX_LOV5N007); + + // BUG: says he's dehydrated, but doesn't check whether you've given water to him + // already (like it does in LOVE4). + // TODO: make the whole "giving water to romulans" thing consistent between LOVE4 and + // LOVE5? + showText(TX_SPEAKER_MCCOY, TX_LOV5_017); + + loadActorAnim2(OBJECT_PREAX, "s3r6r1", 0x116, 0xba); + _vm->_awayMission.love.preaxCured = true; +} + + +void Room::love5UseAnythingOnPreax() { + showText(TX_SPEAKER_MCCOY, TX_LOV5_023); +} + + +// Kirk walks to Cheever, unties him, then walks to Marcus, unties her. +void Room::love5UseKirkOnMarcusOrCheever() { + if (!_vm->_awayMission.love.freedMarcusAndCheever) { + _vm->_awayMission.disableInput = true; + walkCrewmanC(OBJECT_KIRK, 0x49, 0xb1, &Room::love5KirkReachedCheever); + _vm->_awayMission.love.freedMarcusAndCheever = true; + } +} + +void Room::love5KirkReachedCheever() { + loadActorAnimC(OBJECT_KIRK, "kuntie", -1, -1, &Room::love5KirkUntiedCheever); +} + +void Room::love5KirkUntiedCheever() { + loadActorAnim2(OBJECT_CHEEVER, "s3gtup", 0x49, 0xac); + walkCrewmanC(OBJECT_KIRK, 0x26, 0xb1, &Room::love5KirkReachedMarcus); +} + +void Room::love5KirkReachedMarcus() { + loadActorAnimC(OBJECT_KIRK, "kuntie", -1, -1, &Room::love5KirkUntiedMarcus); +} + +void Room::love5KirkUntiedMarcus() { + loadActorStandAnim(OBJECT_KIRK); + loadActorAnimC(OBJECT_MARCUS, "marcus", 0x28, 0xa6, &Room::love5MarcusStoodUp); + walkCrewman(OBJECT_KIRK, 0x35, 0xb9); + _vm->_awayMission.crewDirectionsAfterWalk[OBJECT_KIRK] = DIR_N; +} + +void Room::love5MarcusStoodUp() { + _vm->_awayMission.disableInput = false; + showText(TX_SPEAKER_MARCUS, TX_LOV5_041); } } diff --git a/engines/startrek/startrek.cpp b/engines/startrek/startrek.cpp index e239806c67..8d1bcf458f 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 = 4; + _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 a72c25310e..cb407ce08d 100644 --- a/engines/startrek/text.h +++ b/engines/startrek/text.h @@ -90,6 +90,11 @@ enum GameStringIDs { TX_SPEAKER_FERRIS, TX_SPEAKER_COMPUTER, + TX_SPEAKER_MARCUS, + TX_SPEAKER_CHEEVER, + TX_SPEAKER_PREAX, + + TX_G_024, TX_DEM0_001, TX_DEM0_002, @@ -796,11 +801,6 @@ enum GameStringIDs { TX_LOV0N007, TX_LOV0N008, TX_LOV0N009, - TX_LOV5_015, - TX_LOV5_019, - TX_LOV5_027, - TX_LOV5_030, - TX_LOV5_038, TX_LOVA_100, TX_LOVA_F01, TX_LOVA_F02, @@ -1074,6 +1074,85 @@ enum GameStringIDs { TX_LOV4N013, + TX_LOV5_001, + TX_LOV5_002, + TX_LOV5_003, + TX_LOV5_004, + TX_LOV5_005, + TX_LOV5_006, + TX_LOV5_007, + TX_LOV5_008, + TX_LOV5_009, + TX_LOV5_010, + TX_LOV5_011, + TX_LOV5_013, + TX_LOV5_014, + TX_LOV5_015, + TX_LOV5_016, + TX_LOV5_017, + TX_LOV5_018, + TX_LOV5_019, + TX_LOV5_020, + TX_LOV5_021, + TX_LOV5_023, + TX_LOV5_024, + TX_LOV5_025, + TX_LOV5_026, + TX_LOV5_027, + TX_LOV5_028, + TX_LOV5_029, + TX_LOV5_030, + TX_LOV5_031, + TX_LOV5_032, + TX_LOV5_033, + TX_LOV5_034, + TX_LOV5_036, + TX_LOV5_038, + TX_LOV5_039, + TX_LOV5_040, + TX_LOV5_041, + TX_LOV5_042, + TX_LOV5_043, + TX_LOV5_044, + TX_LOV5_045, + TX_LOV5_046, + TX_LOV5_047, + TX_LOV5_048, + TX_LOV5_049, + TX_LOV5_050, + TX_LOV5_051, + TX_LOV5_052, + TX_LOV5_053, + TX_LOV5_054, + TX_LOV5_055, + TX_LOV5_056, + TX_LOV5_057, + TX_LOV5_058, + TX_LOV5_059, + TX_LOV5_060, + TX_LOV5_061, + TX_LOV5N000, + TX_LOV5N001, + TX_LOV5N002, + TX_LOV5N003, + TX_LOV5N004, + TX_LOV5N005, + TX_LOV5N006, + TX_LOV5N007, + TX_LOV5N008, + TX_LOV5N009, + TX_LOV5N010, + TX_LOV5N011, + TX_LOV5N012, + TX_LOV5N013, + TX_LOV5N014, + TX_LOV5N015, + TX_LOV5N016, + TX_LOV5N017, + TX_LOV5N018, + TX_LOV5C001, // Custom + + TX_END }; @@ -1111,6 +1190,11 @@ const char * const g_gameStrings[] = { "Lt. Ferris", "Computer", + "Dr. Marcus", + "Dr. Cheever", + "Preax", + + "#GENE\\G_024#Fascinating.", "#DEM0\\DEM0_001#Doctor, you need to investigate the possibility of disease, mental or physical, among these people, before we go chasing up the mountains. Prelate Angiven, may we see those who have encountered the demons?", "#DEM0\\DEM0_002#Aside from seeing demons, has any hard data been collected? Any evidence I could see?", @@ -1817,11 +1901,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.", - "#LOV5\\LOV5_015#He's already cured, Jim.", - "#LOV5\\LOV5_019#I don't have the proper medicine to cure him, Jim.", - "#LOV5\\LOV5_027#Finally, a human response!", - "#LOV5\\LOV5_030#There. You're now cured.", - "#LOV5\\LOV5_038#Thank you, Doctor.", "#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.", @@ -2093,6 +2172,85 @@ const char * const g_gameStrings[] = { "#LOV4\\LOV4N011#This Romulan is groggy, but conscious.", "#LOV4\\LOV4N012#McCoy thinks to himself: 'Dammit, I'm a doctor, not a diplomat!'", "#LOV4\\LOV4N013#The Romulans drink thirstily and empty the container.", + + + "#LOV5\\LOV5_001#Well gentlemen, let's go home.", + "#LOV5\\LOV5_002#Goodbye Carol.", + "#LOV5\\LOV5_003#Hello, Carol. It's good to see you again.", + "#LOV5\\LOV5_004#I assure you, the Federation would never undertake such a foul program. It was all an accident, right, Dr. Marcus?", + "#LOV5\\LOV5_005#Lt. Ferris, collect his weapon.", + "#LOV5\\LOV5_006#Save it for someone who's buying, Preax. Leave Federation space immediately or we'll scatter your atoms across the quadrant.", + "#LOV5\\LOV5_007#We aren't barbarians, in spite of what some might think.", + "#LOV5\\LOV5_008#You also conducted yourself in the most honorable fashion, Centurion Preax. You may return to Romulan space without Federation interference.", + "#LOV5\\LOV5_009#You always could put me in my place, couldn't you?", + "#LOV5\\LOV5_010#You are also a worthy opponent, Preax. May you live long and prosper.", + "#LOV5\\LOV5_011#Are you crazy, Jim? That's not going to help in the least!", + "#LOV5\\LOV5_013#Careful there! He's suffering from dehydration but it's dangerous to give water to someone while they're unconscious. This man needs serum or he's going to die!", + "#LOV5\\LOV5_014#Dammit, Jim, I'm a doctor, not a diplomat. These people will be fine. I've got to try and save the Romulans.", + "#LOV5\\LOV5_015#He's already cured, Jim.", + "#LOV5\\LOV5_016#He's infected with the virus too, Jim.", + "#LOV5\\LOV5_017#He's severely dehydrated, but he'll live.", + "#LOV5\\LOV5_018#He's too weak to talk, Jim. He needs medical attention.", + "#LOV5\\LOV5_019#I don't have the proper medicine to cure him, Jim.", + "#LOV5\\LOV5_020#Jim, we need to synthesize more before we can use it.", + "#LOV5\\LOV5_021#Oops! Almost forgot about you Spock.", + "#LOV5\\LOV5_023#That's not working, Jim.", + "#LOV5\\LOV5_024#The hostages are scared, but fine. The laughing gas did the trick, Jim, but the Romulan is still very, very sick -- he's only got hours left.", + "#LOV5\\LOV5_025#They've been through a good deal of stress, but they are already starting to recover. Their heart rate is dropping, and their blood pressure is also dropping.", + "#LOV5\\LOV5_026#Dammit, Jim, these men are sick! They need my help!", + "#LOV5\\LOV5_027#Finally, a human response!", + "#LOV5\\LOV5_028#My God, that's some kind of weapon!", + "#LOV5\\LOV5_029#Take it easy now... You'll feel better in a few minutes. Good thing we had the water available, Jim.", + "#LOV5\\LOV5_030#There. You're now cured.", + "#LOV5\\LOV5_031#What does this stuff do? What's going on here?", + "#LOV5\\LOV5_032#You'll never cease to amaze me, Jim.", + "#LOV5\\LOV5_033#I detect no other lifeforms in the room, Captain.", + "#LOV5\\LOV5_034#Fascinating. This device contains over ten million forms of life. Patterns I have never seen before.", + "#LOV5\\LOV5_036#Fascinating equipment. I believe I have seen this sort of equipment someplace before.", + "#LOV5\\LOV5_038#Thank you, Doctor.", + "#LOV5\\LOV5_039#Anthony and I will look after these Romulans, Jim. Dr. McCoy, we could use your expertise on discovering a cure for the virus. All our equipment is at your disposal.", + "#LOV5\\LOV5_040#Jim, it's you! Please untie us!", + "#LOV5\\LOV5_041#Thank God it's you, Jim. I'm so glad you came.", + "#LOV5\\LOV5_042#Thank you for saving our station, Jim.", + "#LOV5\\LOV5_043#Absolutely. We've already destroyed all cultures and purged the data files. This will never happen again.", + "#LOV5\\LOV5_044#Everyone on this project is an avowed pacifist, doctor. Myself included. We do not make weapons.", + "#LOV5\\LOV5_045#Goodbye Jim.", + "#LOV5\\LOV5_046#How about someone giving us a hand?", + "#LOV5\\LOV5_047#That's the one thing I could never do. Your place was wandering the galaxy, and that's the one thing I could never give you.", + "#LOV5\\LOV5_048#There was a time when I wouldn't have agreed with that statement. But I guess some things do get better with age.", + "#LOV5\\LOV5_049#We call this the Cradle, Mr. Spock. One day, I hope, something wonderful will be produced here.", + "#LOV5\\LOV5_050#We're conducting research into the origins of life in the universe. This is our equipment. We believe that... uh, well, I guess you don't have the time. You can get the background in my doctoral thesis.", + "#LOV5\\LOV5_051#We're testing the effect of radiation on combinations of simple and complex molecules. We're trying to see what new forms of life are developed, and how they compare to our own early development.", + "#LOV5\\LOV5_052#These Romulans appear to be a negligible threat, sir.", + "#LOV5\\LOV5_053#Freeze, Romulan! You're covered!", + "#LOV5\\LOV5_054#I do. You just pull on the ropes until they're untied.", + "#LOV5\\LOV5_055#Hey! Would you please untie us?", + "#LOV5\\LOV5_056#It's about time someone got here.", + "#LOV5\\LOV5_057#Hey? Does anyone in Starfleet know how to untie a knot?", + "#LOV5\\LOV5_058#I don't care who does it, but could somebody get around to doing it on this Stardate?", + "#LOV5\\LOV5_059#I have called off the Romulan attack on this station, Kirk. I believed your virus was some kind of deliberate attack, but your great honor and compassion have convinced me otherwise.", + "#LOV5\\LOV5_060#Phah! And I thought you a man of honor... You need not worry, Captain Kirk. Your lack of warrior spirit stinks even across the vacuum of space, and I am eager to be free of it.", + "#LOV5\\LOV5_061#You are an honorable adversary, Kirk. Jolan-tru.", + "#LOV5\\LOV5N000#Dr. Anthony Cheever, the assistant of Dr. Marcus.", + "#LOV5\\LOV5N001#Dr. Carol Marcus, head of this station's research team.", + "#LOV5\\LOV5N002#Dr. McCoy is viewing this scene with interest.", + "#LOV5\\LOV5N003#Ensign Ferris is wondering when they're going to give him a tough assignment for a change.", + "#LOV5\\LOV5N004#James T. Kirk, glad to see Carol Marcus again, yet slightly uncomfortable.", + "#LOV5\\LOV5N005#Mr. Spock is fascinated by these machines.", + "#LOV5\\LOV5N006#The Preax remains silent, but glances between you and your tied up companions.", + "#LOV5\\LOV5N007#The Romulan Preax stirs weakly, then begins to get up... he has been cured!", + "#LOV5\\LOV5N008#This is a very advanced research laboratory.", + "#LOV5\\LOV5N009#This is Dr. Carol Marcus' quarters. The hostages and four Romulans are here.", + "#LOV5\\LOV5N010#This ladder leads back to the main level of the station.", + "#LOV5\\LOV5N011#This Romulan commander is cautiously looking at you.", + "#LOV5\\LOV5N012#This Romulan commander is unconscious.", + "#LOV5\\LOV5N013#An odd looking device, almost like a 20th Century torpedo, fitted with an experimental gear.", + "#LOV5\\LOV5N014#Dr. Anthony Cheever, Marcus's assistant. He has been bound by the Romulans.", + "#LOV5\\LOV5N015#Dr. Carol Marcus, head of this station's research team. She has been bound by the Romulans.", + "#LOV5\\LOV5N016#Some odd looking equipment, connected to the torpedo.", + "#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 }; } |