Files
scummvm-cursorfix/engines/startrek/rooms/love5.cpp
2026-02-02 04:50:13 +01:00

648 lines
22 KiB
C++

/* 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 3 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, see <http://www.gnu.org/licenses/>.
*
*/
#include "startrek/room.h"
#define OBJECT_8 8
#define OBJECT_PREAX 9
#define OBJECT_MARCUS 10
#define OBJECT_CHEEVER 11
#define HOTSPOT_DEVICE 0x20
#define HOTSPOT_CONSOLE 0x21
namespace StarTrek {
extern const RoomAction love5ActionList[] = {
{ {ACTION_TICK, 1, 0, 0, 0}, &Room::love5Tick1 },
{ {ACTION_TOUCHED_WARP, 1, 0, 0, 0}, &Room::love5TouchedWarp1 },
{ {ACTION_TIMER_EXPIRED, 4, 0, 0, 0}, &Room::love5Timer4Expired },
{ {ACTION_USE, OBJECT_IPHASERS, 9, 0, 0}, &Room::love5UseStunPhaserOnPreax },
// NOTE: nothing for OBJECT_IPHASERK. There's an unused audio file which might fit.
{ {ACTION_LOOK, OBJECT_KIRK, 0, 0, 0}, &Room::love5LookAtKirk },
{ {ACTION_LOOK, OBJECT_SPOCK, 0, 0, 0}, &Room::love5LookAtSpock },
{ {ACTION_LOOK, OBJECT_MCCOY, 0, 0, 0}, &Room::love5LookAtMccoy },
{ {ACTION_LOOK, OBJECT_REDSHIRT, 0, 0, 0}, &Room::love5LookAtRedshirt },
{ {ACTION_LOOK, 0xff, 0, 0, 0}, &Room::love5LookAnywhere },
{ {ACTION_LOOK, 0x20, 0, 0, 0}, &Room::love5LookAtDevice },
{ {ACTION_LOOK, 0x21, 0, 0, 0}, &Room::love5LookAtConsole },
{ {ACTION_LOOK, 10, 0, 0, 0}, &Room::love5LookAtDrMarcus },
{ {ACTION_LOOK, 11, 0, 0, 0}, &Room::love5LookAtDrCheever },
{ {ACTION_LOOK, 9, 0, 0, 0}, &Room::love5LookAtPreax },
{ {ACTION_TALK, 9, 0, 0, 0}, &Room::love5TalkToPreax },
{ {ACTION_FINISHED_WALKING, 5, 0, 0, 0}, &Room::love5MccoyReachedSpockToCure },
{ {ACTION_FINISHED_ANIMATION, 6, 0, 0, 0}, &Room::love5MccoyCuredSpock },
{ {ACTION_FINISHED_WALKING, 6, 0, 0, 0}, &Room::love5CrewmanReachedBeamoutPosition },
{ {ACTION_TALK, 10, 0, 0, 0}, &Room::love5TalkToDrMarcus },
{ {ACTION_TALK, 11, 0, 0, 0}, &Room::love5TalkToDrCheever },
{ {ACTION_TALK, OBJECT_KIRK, 0, 0, 0}, &Room::love5TalkToKirk },
{ {ACTION_TALK, OBJECT_SPOCK, 0, 0, 0}, &Room::love5TalkToSpock },
{ {ACTION_TALK, OBJECT_MCCOY, 0, 0, 0}, &Room::love5TalkToMccoy },
{ {ACTION_TALK, OBJECT_REDSHIRT, 0, 0, 0}, &Room::love5TalkToRedshirt },
{ {ACTION_USE, OBJECT_ISTRICOR, 0xff, 0, 0}, &Room::love5UseSTricorderAnywhere },
{ {ACTION_USE, OBJECT_ISTRICOR, 0x20, 0, 0}, &Room::love5UseSTricorderOnDevice },
{ {ACTION_USE, OBJECT_IMTRICOR, 10, 0, 0}, &Room::love5UseMTricorderOnMarcusOrCheever },
{ {ACTION_USE, OBJECT_IMTRICOR, 11, 0, 0}, &Room::love5UseMTricorderOnMarcusOrCheever },
{ {ACTION_USE, OBJECT_IMTRICOR, 9, 0, 0}, &Room::love5UseMTricorderOnPreax },
{ {ACTION_USE, OBJECT_IMEDKIT, 9, 0, 0}, &Room::love5UseMedkitOnPreax },
{ {ACTION_USE, OBJECT_IH2O, 9, 0, 0}, &Room::love5UseWaterOnPreax },
{ {ACTION_USE, OBJECT_ISAMPLE, 9, 0, 0}, &Room::love5UseCureSampleOnPreax },
{ {ACTION_USE, OBJECT_ICURE, 9, 0, 0}, &Room::love5UseCureOnPreax },
{ {ACTION_FINISHED_WALKING, 4, 0, 0, 0}, &Room::love5ReachedPreaxUsingCure },
{ {ACTION_FINISHED_ANIMATION, 5, 0, 0, 0}, &Room::love5CuredPreax },
{ {ACTION_USE, 0xff, 9, 0, 0}, &Room::love5UseAnythingOnPreax },
{ {ACTION_USE, OBJECT_KIRK, 10, 0, 0}, &Room::love5UseKirkOnMarcusOrCheever },
{ {ACTION_USE, OBJECT_KIRK, 11, 0, 0}, &Room::love5UseKirkOnMarcusOrCheever },
{ {ACTION_FINISHED_WALKING, 1, 0, 0, 0}, &Room::love5KirkReachedCheever },
{ {ACTION_FINISHED_ANIMATION, 2, 0, 0, 0}, &Room::love5KirkUntiedCheever },
{ {ACTION_FINISHED_WALKING, 2, 0, 0, 0}, &Room::love5KirkReachedMarcus },
{ {ACTION_FINISHED_ANIMATION, 3, 0, 0, 0}, &Room::love5KirkUntiedMarcus },
{ {ACTION_FINISHED_ANIMATION, 4, 0, 0, 0}, &Room::love5MarcusStoodUp },
// Common code
{ {ACTION_TIMER_EXPIRED, 0, 0, 0, 0}, &Room::loveaTimer0Expired },
{ {ACTION_TIMER_EXPIRED, 1, 0, 0, 0}, &Room::loveaTimer1Expired },
{ {ACTION_USE, OBJECT_IMEDKIT, OBJECT_SPOCK, 0, 0}, &Room::loveaUseMedkitOnSpock },
{ {ACTION_USE, OBJECT_ISAMPLE, OBJECT_SPOCK, 0, 0}, &Room::loveaUseCureSampleOnSpock },
{ {ACTION_USE, OBJECT_ICURE, OBJECT_SPOCK, 0, 0}, &Room::loveaUseCureOnSpock },
{ {ACTION_FINISHED_WALKING, 99, 0, 0, 0}, &Room::loveaSpockOrMccoyInPositionToUseCure },
{ {ACTION_FINISHED_ANIMATION, 99, 0, 0, 0}, &Room::loveaFinishedCuringSpock },
{ {ACTION_TIMER_EXPIRED, 2, 0, 0, 0}, &Room::loveaTimer2Expired },
{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_SPOCK, 0, 0}, &Room::loveaUseMTricorderOnSpock },
{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_KIRK, 0, 0}, &Room::loveaUseMTricorderOnHuman },
{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_MCCOY, 0, 0}, &Room::loveaUseMTricorderOnHuman },
{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_REDSHIRT, 0, 0}, &Room::loveaUseMTricorderOnHuman },
{ {ACTION_USE, OBJECT_IRLG, 0xff, 0, 0}, &Room::loveaUseRomulanLaughingGas },
{ {ACTION_USE, OBJECT_IN2O, 0xff, 0, 0}, &Room::loveaUseHumanLaughingGas },
{ {ACTION_USE, OBJECT_INH3, 0xff, 0, 0}, &Room::loveaUseAmmonia },
{ {ACTION_USE, OBJECT_ICOMM, 0xff, 0, 0}, &Room::loveaUseCommunicator },
{ {ACTION_LIST_END, 0, 0, 0, 0}, nullptr }
};
enum love5TextIds {
TX_SPEAKER_KIRK, TX_SPEAKER_MCCOY, TX_SPEAKER_SPOCK, TX_SPEAKER_FERRIS, TX_SPEAKER_MARCUS,
TX_SPEAKER_CHEEVER, TX_SPEAKER_PREAX,
TX_LOV0_011, TX_LOV0_012, TX_LOV0_013, TX_LOV0_014, TX_LOV0_015,
TX_LOV0_016, TX_LOV0_017, TX_LOV0_019, TX_LOV0_020, TX_LOV0_021,
TX_LOV0_022, TX_LOV0_025, TX_LOV0_026, TX_LOV0_029, TX_LOV0_033,
TX_LOV0_039, TX_LOV0_040, TX_LOV0_041, TX_LOV0_042, TX_LOV0_043,
TX_LOV0_045, TX_LOV0_046, TX_LOV0_047, TX_LOV0_048, TX_LOV0_049,
TX_LOV0_050, TX_LOV0_101, TX_LOV0_102, TX_LOV0_103, TX_LOV0_104,
TX_LOV0_105, TX_LOV0_106, TX_LOV0_107, TX_LOV0_124, 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_FEA5_008, 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_LOV5N016, TX_LOV5N017, TX_LOV5N018,
/*TX_LOV5C001,*/ TX_DEM0N009, TX_G_024, TX_DIALOG_ERROR
};
// TODO: Finish floppy offsets
extern const RoomTextOffsets love5TextOffsets[] = {
{ TX_SPEAKER_KIRK, 8968, 0, 0, 0 },
{ TX_SPEAKER_MCCOY, 8979, 0, 0, 0 },
{ TX_SPEAKER_SPOCK, 8989, 0, 0, 0 },
{ TX_SPEAKER_FERRIS, 8999, 0, 0, 0 },
{ TX_SPEAKER_CHEEVER, 9027, 0, 0, 0 },
{ TX_SPEAKER_MARCUS, 9016, 0, 0, 0 },
{ TX_SPEAKER_PREAX, 9010, 0, 0, 0 },
{ TX_LOV0_011, 13010, 0, 0, 0 },
{ TX_LOV0_012, 13137, 0, 0, 0 },
{ TX_LOV0_013, 13433, 0, 0, 0 },
{ TX_LOV0_014, 13197, 0, 0, 0 },
{ TX_LOV0_015, 13301, 0, 0, 0 },
{ TX_LOV0_016, 13104, 0, 0, 0 },
{ TX_LOV0_017, 13567, 0, 0, 0 },
{ TX_LOV0_019, 13487, 0, 0, 0 },
{ TX_LOV0_020, 13044, 0, 0, 0 },
{ TX_LOV0_021, 13355, 0, 0, 0 },
{ TX_LOV0_022, 13245, 0, 0, 0 },
{ TX_LOV0_025, 14493, 0, 0, 0 },
{ TX_LOV0_026, 14366, 0, 0, 0 },
{ TX_LOV0_029, 14246, 0, 0, 0 },
{ TX_LOV0_033, 14306, 0, 0, 0 },
{ TX_LOV0_039, 13628, 0, 0, 0 },
{ TX_LOV0_040, 13755, 0, 0, 0 },
{ TX_LOV0_041, 14051, 0, 0, 0 },
{ TX_LOV0_042, 13815, 0, 0, 0 },
{ TX_LOV0_043, 13919, 0, 0, 0 },
{ TX_LOV0_045, 13722, 0, 0, 0 },
{ TX_LOV0_046, 14185, 0, 0, 0 },
{ TX_LOV0_047, 14105, 0, 0, 0 },
{ TX_LOV0_048, 13662, 0, 0, 0 },
{ TX_LOV0_049, 13973, 0, 0, 0 },
{ TX_LOV0_050, 13863, 0, 0, 0 },
{ TX_LOV0_101, 14574, 0, 0, 0 },
{ TX_LOV0_102, 14638, 0, 0, 0 },
{ TX_LOV0_103, 14708, 0, 0, 0 },
{ TX_LOV0_104, 14758, 0, 0, 0 },
{ TX_LOV0_105, 14815, 0, 0, 0 },
{ TX_LOV0_106, 14927, 0, 0, 0 },
{ TX_LOV0_107, 14995, 0, 0, 0 },
{ TX_LOV0_124, 14443, 0, 0, 0 },
{ TX_LOV5_001, 2119, 0, 0, 0 },
{ TX_LOV5_002, 1715, 0, 0, 0 },
{ TX_LOV5_003, 10797, 0, 0, 0 },
{ TX_LOV5_004, 12334, 0, 0, 0 },
{ TX_LOV5_005, 4485, 0, 0, 0 },
{ TX_LOV5_006, 12464, 0, 0, 0 },
{ TX_LOV5_007, 4020, 0, 0, 0 },
{ TX_LOV5_008, 12178, 0, 0, 0 },
{ TX_LOV5_009, 10983, 0, 0, 0 },
{ TX_LOV5_010, 1502, 0, 0, 0 },
{ TX_LOV5_011, 614, 0, 0, 0 },
{ TX_LOV5_013, 4130, 0, 0, 0 },
{ TX_LOV5_014, 2897, 0, 0, 0 },
{ TX_LOV5_015, 3732, 0, 0, 0 },
{ TX_LOV5_016, 3576, 0, 0, 0 },
{ TX_LOV5_017, 4915, 0, 0, 0 },
{ TX_LOV5_018, 1263, 0, 0, 0 },
{ TX_LOV5_019, 3654, 0, 0, 0 },
{ TX_LOV5_020, 4640, 0, 0, 0 },
{ TX_LOV5_021, 1821, 0, 0, 0 },
{ TX_LOV5_024, 3407, 0, 0, 0 },
{ TX_LOV5_025, 11753, 0, 0, 0 },
{ TX_LOV5_026, 4543, 0, 0, 0 },
{ TX_LOV5_027, 2035, 0, 0, 0 },
{ TX_LOV5_028, 9148, 0, 0, 0 },
{ TX_LOV5_029, 3893, 0, 0, 0 },
{ TX_LOV5_030, 1939, 0, 0, 0 },
{ TX_LOV5_031, 9380, 0, 0, 0 },
{ TX_LOV5_032, 1629, 0, 0, 0 },
{ TX_LOV5_033, 3159, 0, 0, 0 },
{ TX_LOV5_034, 11526, 0, 0, 0 },
{ TX_LOV5_036, 11189, 0, 0, 0 },
{ TX_LOV5_038, 1990, 0, 0, 0 },
{ TX_LOV5_039, 2414, 0, 0, 0 },
{ TX_LOV5_040, 2334, 0, 0, 0 },
{ TX_LOV5_042, 2607, 0, 0, 0 },
{ TX_LOV5_043, 12668, 0, 0, 0 },
{ TX_LOV5_044, 9199, 0, 0, 0 },
{ TX_LOV5_045, 1756, 0, 0, 0 },
{ TX_LOV5_046, 9839, 0, 0, 0 },
{ TX_LOV5_047, 11049, 0, 0, 0 },
{ TX_LOV5_048, 10854, 0, 0, 0 },
{ TX_LOV5_049, 11642, 0, 0, 0 },
{ TX_LOV5_050, 9442, 0, 0, 0 },
{ TX_LOV5_051, 11290, 0, 0, 0 },
{ TX_LOV5_052, 3039, 0, 0, 0 },
{ TX_LOV5_053, 4426, 0, 0, 0 },
{ TX_LOV5_054, 10123, 0, 0, 0 },
{ TX_LOV5_055, 2685, 0, 0, 0 },
{ TX_LOV5_056, 2744, 0, 0, 0 },
{ TX_LOV5_057, 10052, 0, 0, 0 },
{ TX_LOV5_058, 10193, 0, 0, 0 },
{ TX_LOV5_059, 11980, 0, 0, 0 },
{ TX_LOV5_060, 12789, 0, 0, 0 },
{ TX_LOV5_061, 12604, 0, 0, 0 },
{ TX_LOV5_023, 5017, 0, 0, 0 },
{ TX_LOV5_041, 5296, 0, 0, 0 },
{ TX_FEA5_008, 706, 0, 0, 0 },
{ TX_G_024, 11501, 0, 0, 0 },
{ TX_LOV5N000, 10294, 0, 0, 0 },
{ TX_LOV5N001, 9732, 0, 0, 0 },
{ TX_LOV5N001, 9890, 0, 0, 0 },
{ TX_LOV5N002, 10571, 0, 0, 0 },
{ TX_LOV5N003, 10691, 0, 0, 0 },
{ TX_LOV5N004, 10481, 0, 0, 0 },
{ TX_LOV5N005, 10633, 0, 0, 0 },
{ TX_LOV5N006, 1352, 0, 0, 0 },
{ TX_LOV5N007, 4813, 0, 0, 0 },
{ TX_LOV5N008, 863, 0, 0, 0 },
{ TX_LOV5N009, 1115, 0, 0, 0 },
{ TX_LOV5N010, 9660, 0, 0, 0 },
{ TX_LOV5N011, 10413, 0, 0, 0 },
{ TX_LOV5N012, 10359, 0, 0, 0 },
{ TX_LOV5N013, 9040, 0, 0, 0 },
{ TX_LOV5N014, 9961, 0, 0, 0 },
{ TX_LOV5N016, 9311, 0, 0, 0 },
{ TX_LOV5N017, 4320, 0, 0, 0 },
{ TX_LOV5N018, 3805, 0, 0, 0 },
//{ TX_LOV5C001, 1598, 0, 0, 0 },
{ TX_DIALOG_ERROR, 11927, 0, 0, 0 },
{ -1, 0, 0, 0, 0 }
};
extern const RoomText love5Texts[] = {
{ TX_DEM0N009, Common::EN_ANY, "#DEM0\\DEM0N009#Spock raises an eyebrow" },
{ -1, Common::UNK_LANG, "" }
};
void Room::love5Tick1() {
playVoc("LOV5LOOP");
loadActorAnim(OBJECT_8, "s3r6c1", 0x27, 0xa9);
if (_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 (_awayMission->love.preaxCured)
loadActorAnim(OBJECT_PREAX, "s3r6r3", 0x116, 0xba);
else
loadActorAnim(OBJECT_PREAX, "s3r6r2", 0x116, 0xba);
if (_awayMission->love.releasedHumanLaughingGas)
_awayMission->timers[0] = getRandomWordInRange(200, 400);
if (_awayMission->love.releasedRomulanLaughingGas)
_awayMission->timers[1] = getRandomWordInRange(200, 400);
_awayMission->timers[2] = 200;
_roomVar.love.cmnXPosToCureSpock = 0x89;
_roomVar.love.cmnXPosToCureSpock = 0xb9;
}
void Room::love5TouchedWarp1() {
_awayMission->disableInput = true;
playSoundEffectIndex(kSfxDoor);
_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() {
showDescription(TX_LOV5N004);
}
void Room::love5LookAtSpock() {
showDescription(TX_LOV5N005);
}
void Room::love5LookAtMccoy() {
showDescription(TX_LOV5N002);
}
void Room::love5LookAtRedshirt() {
showDescription(TX_LOV5N003);
}
void Room::love5LookAnywhere() {
showDescription(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() {
showDescription(TX_LOV5N013);
showText(TX_SPEAKER_MCCOY, TX_LOV5_028);
showText(TX_SPEAKER_MARCUS, TX_LOV5_044);
}
void Room::love5LookAtConsole() {
showDescription(TX_LOV5N016);
showText(TX_SPEAKER_MCCOY, TX_LOV5_031);
showText(TX_SPEAKER_MARCUS, TX_LOV5_050);
}
void Room::love5LookAtDrMarcus() {
if (_awayMission->love.freedMarcusAndCheever)
showDescription(TX_LOV5N001);
else {
// BUGFIX: originally played audio "LOV5N001", which is only the first sentence of
// what should be spoken.
//showDescription(TX_LOV5N015); // TODO
showText(TX_SPEAKER_MARCUS, TX_LOV5_046);
}
}
void Room::love5LookAtDrCheever() {
if (_awayMission->love.freedMarcusAndCheever)
showDescription(TX_LOV5N000);
else {
showDescription(TX_LOV5N014);
showText(TX_SPEAKER_CHEEVER, TX_LOV5_057);
if (!_awayMission->redshirtDead) {
showText(TX_SPEAKER_FERRIS, TX_LOV5_054);
showText(TX_SPEAKER_CHEEVER, TX_LOV5_058);
}
}
}
void Room::love5LookAtPreax() {
if (_awayMission->love.preaxCured)
showDescription(TX_LOV5N011);
else
showDescription(TX_LOV5N012);
}
void Room::love5TalkToPreax() {
if (_awayMission->love.preaxCured) {
if (!_awayMission->love.freedMarcusAndCheever)
showDescription(TX_LOV5N006);
else {
const TextRef choices[] = {
TX_SPEAKER_KIRK,
TX_LOV5_008,
TX_LOV5_004,
TX_LOV5_006,
TX_END,
};
showText(TX_SPEAKER_PREAX, TX_LOV5_059);
int choice = showMultipleTexts(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);
// ENHANCEMENT: Original text was just "(Spock raises eyebrow)" without any audio.
// This changes it to a narration to make it flow better.
showText(TX_SPEAKER_SPOCK, TX_DEM0N009);
showText(TX_SPEAKER_MCCOY, TX_LOV5_032);
break;
case 2:
showText(TX_SPEAKER_PREAX, TX_LOV5_060);
break;
default:
showDescription(TX_DIALOG_ERROR);
break;
}
showText(TX_SPEAKER_KIRK, TX_LOV5_002);
showText(TX_SPEAKER_MARCUS, TX_LOV5_045);
_awayMission->disableInput = true;
if (!_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);
// ENHANCEMENT: Original text was just "(Spock raises eyebrow)" without any audio.
// This changes it to a narration to make it flow better.
showText(TX_SPEAKER_SPOCK, TX_DEM0N009);
love5EndMission();
}
void Room::love5EndMission() {
showText(TX_SPEAKER_KIRK, TX_LOV5_001);
_awayMission->crewDirectionsAfterWalk[OBJECT_KIRK] = DIR_S;
walkCrewmanC(OBJECT_KIRK, 0x64, 0xc2, &Room::love5CrewmanReachedBeamoutPosition);
_awayMission->crewDirectionsAfterWalk[OBJECT_SPOCK] = DIR_S;
walkCrewmanC(OBJECT_SPOCK, 0x5a, 0xb8, &Room::love5CrewmanReachedBeamoutPosition);
_awayMission->crewDirectionsAfterWalk[OBJECT_MCCOY] = DIR_S;
walkCrewmanC(OBJECT_MCCOY, 0x6e, 0xb8, &Room::love5CrewmanReachedBeamoutPosition);
if (!_awayMission->redshirtDead) {
_awayMission->crewDirectionsAfterWalk[OBJECT_REDSHIRT] = DIR_S;
walkCrewmanC(OBJECT_REDSHIRT, 0x69, 0xae, &Room::love5CrewmanReachedBeamoutPosition);
_roomVar.love.numCrewmenReadyToBeamOut--;
}
}
void Room::love5CrewmanReachedBeamoutPosition() {
_roomVar.love.numCrewmenReadyToBeamOut++;
if (_roomVar.love.numCrewmenReadyToBeamOut == 3) {
_awayMission->love.missionScore += 17;
endMission(_awayMission->love.missionScore, 0x2c, 0);
}
}
void Room::love5TalkToDrMarcus() {
if (!_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 (!_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 (!_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_SPEAKER_SPOCK, TX_LOV5_033, false);
}
void Room::love5UseSTricorderOnDevice() {
spockScan(DIR_N, TX_SPEAKER_SPOCK, 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 (!_awayMission->love.preaxCured) {
if (_awayMission->love.romulansUnconsciousFromLaughingGas)
mccoyScan(DIR_E, TX_SPEAKER_MCCOY, TX_LOV5_024, false);
else
mccoyScan(DIR_E, TX_SPEAKER_MCCOY, TX_LOV5_016, false);
}
}
void Room::love5UseMedkitOnPreax() {
if (_awayMission->love.preaxCured)
showText(TX_SPEAKER_MCCOY, TX_LOV5_015);
else
showText(TX_SPEAKER_MCCOY, TX_LOV5_019);
}
void Room::love5UseWaterOnPreax() {
if (_awayMission->love.preaxCured) {
showDescription(TX_LOV5N018);
showText(TX_SPEAKER_MCCOY, TX_LOV5_029);
showText(TX_SPEAKER_KIRK, TX_LOV5_007);
if (!_awayMission->love.gotPointsForHydratingPreax) {
_awayMission->love.gotPointsForHydratingPreax = true;
_awayMission->love.missionScore++;
}
loseItem(OBJECT_IH2O);
} else {
if (_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 {
showDescription(TX_LOV5N017);
if (!_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 (!_awayMission->love.gotPointsForHydratingPreax) {
_awayMission->love.gotPointsForHydratingPreax = true;
_awayMission->love.missionScore++;
}
}
}
}
void Room::love5UseCureSampleOnPreax() {
showText(TX_SPEAKER_MCCOY, TX_LOV5_020); // BUGFIX: original didn't have correct speaker
}
void Room::love5UseCureOnPreax() {
if (!_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);
_awayMission->crewDirectionsAfterWalk[OBJECT_MCCOY] = DIR_E;
showDescription(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);
_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 (!_awayMission->love.freedMarcusAndCheever) {
_awayMission->disableInput = true;
walkCrewmanC(OBJECT_KIRK, 0x49, 0xb1, &Room::love5KirkReachedCheever);
_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);
_awayMission->crewDirectionsAfterWalk[OBJECT_KIRK] = DIR_N;
}
void Room::love5MarcusStoodUp() {
_awayMission->disableInput = false;
showText(TX_SPEAKER_MARCUS, TX_LOV5_041);
}
}