Filippos Karapetis 5bead291d6 STARTREK: Initial work on the texts of the German and French versions
This is still a proof of concept, and only some of the first room texts
have been added
2021-08-30 22:05:30 +03:00

1161 lines
44 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 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.
*
*/
#include "startrek/room.h"
// This room is confusing, because it has two hotspots directly adjacent to each other
// that deal with torpedos, but they act differently.
// BUG: It's possible to swap from having shields up to some other system, by first
// putting shields up, then swapping to another system in the few seconds before the Elasi
// hail the ship.
// BUG: Once you have permission to power down the shields, attempting to power on the
// transporter gives you text along the lines of "the elasi would detect us lowering the
// shields" (even after lowering the shields).
#define OBJECT_DECK 8
#define OBJECT_STRICORDER 9
#define OBJECT_MTRICORDER 10
#define OBJECT_VIEWSCREEN 11
#define OBJECT_DAMAGE_DISPLAY_1 12
#define OBJECT_MAIN_COMPUTER 13
#define OBJECT_TORPEDO_BUTTON 14
#define OBJECT_IMPULSE_CONSOLE 15
#define OBJECT_MIDDLE_CONSOLE 16
#define OBJECT_RIGHT_COMPUTER_PANEL 17
#define OBJECT_DECK_IO_CONSOLE 18
#define OBJECT_CEILING_PANEL 19
#define OBJECT_LEFT_COMPUTER_PANEL 20
#define OBJECT_DAMAGE_DISPLAY_2 21
#define HOTSPOT_TORPEDO_BUTTON 0x20
#define HOTSPOT_TORPEDO_CONTROL 0x21
#define HOTSPOT_DECK_IO_SLOT 0x22
#define HOTSPOT_IMPULSE_CONSOLE 0x23
#define HOTSPOT_MAIN_COMPUTER 0x24
#define HOTSPOT_DECK_IO_CONSOLE 0x25
#define HOTSPOT_MIDDLE_CONSOLE 0x26
#define HOTSPOT_VIEWSCREEN 0x27
#define HOTSPOT_DAMAGE_DISPLAY 0x28
namespace StarTrek {
extern const RoomAction veng2ActionList[] = {
{ {ACTION_TICK, 1, 0, 0}, &Room::veng2Tick1 },
{ {ACTION_TIMER_EXPIRED, 0, 0, 0}, &Room::veng2Timer0Expired },
{ {ACTION_TICK, 40, 0, 0}, &Room::veng2Timer0Expired },
{ {ACTION_DONE_ANIM, 5, 0, 0}, &Room::veng2ElasiShipDecloaked },
{ {ACTION_TIMER_EXPIRED, 2, 0, 0}, &Room::veng2Timer2Expired },
{ {ACTION_TOUCHED_WARP, 1, 0, 0}, &Room::veng2TouchedDoor },
{ {ACTION_LOOK, OBJECT_VIEWSCREEN, 0, 0}, &Room::veng2LookAtViewscreen },
{ {ACTION_LOOK, HOTSPOT_VIEWSCREEN, 0, 0}, &Room::veng2LookAtViewscreen },
{ {ACTION_LOOK, OBJECT_MIDDLE_CONSOLE, 0, 0}, &Room::veng2LookAtMiddleConsole },
{ {ACTION_LOOK, HOTSPOT_MIDDLE_CONSOLE, 0, 0}, &Room::veng2LookAtMiddleConsole },
{ {ACTION_LOOK, OBJECT_DAMAGE_DISPLAY_1, 0, 0}, &Room::veng2LookAtDamageDisplay },
{ {ACTION_LOOK, OBJECT_DAMAGE_DISPLAY_2, 0, 0}, &Room::veng2LookAtDamageDisplay },
{ {ACTION_LOOK, HOTSPOT_DAMAGE_DISPLAY, 0, 0}, &Room::veng2LookAtDamageDisplay },
{ {ACTION_LOOK, OBJECT_STRICORDER, 0, 0}, &Room::veng2LookAtSTricorder },
{ {ACTION_LOOK, OBJECT_MTRICORDER, 0, 0}, &Room::veng2LookAtMTricorder },
{ {ACTION_LOOK, OBJECT_TORPEDO_BUTTON, 0, 0}, &Room::veng2LookAtTorpedoButton },
{ {ACTION_LOOK, HOTSPOT_TORPEDO_BUTTON, 0, 0}, &Room::veng2LookAtTorpedoButton },
{ {ACTION_LOOK, HOTSPOT_TORPEDO_CONTROL, 0, 0}, &Room::veng2LookAtTorpedoControl },
{ {ACTION_LOOK, OBJECT_IMPULSE_CONSOLE, 0, 0}, &Room::veng2LookAtImpulseConsole },
{ {ACTION_LOOK, HOTSPOT_IMPULSE_CONSOLE, 0, 0}, &Room::veng2LookAtImpulseConsole },
{ {ACTION_LOOK, OBJECT_MAIN_COMPUTER, 0, 0}, &Room::veng2LookAtMainComputer },
{ {ACTION_LOOK, HOTSPOT_MAIN_COMPUTER, 0, 0}, &Room::veng2LookAtMainComputer },
{ {ACTION_LOOK, OBJECT_DECK, 0, 0}, &Room::veng2LookAtRecordDeck },
{ {ACTION_LOOK, OBJECT_DECK_IO_CONSOLE, 0, 0}, &Room::veng2LookAtDeckIOConsole },
{ {ACTION_LOOK, HOTSPOT_DECK_IO_CONSOLE, 0, 0}, &Room::veng2LookAtDeckIOConsole },
{ {ACTION_LOOK, HOTSPOT_DECK_IO_SLOT, 0, 0}, &Room::veng2LookAtDeckIOConsole },
{ {ACTION_LOOK, OBJECT_KIRK, 0, 0}, &Room::veng2LookAtKirk },
{ {ACTION_LOOK, OBJECT_SPOCK, 0, 0}, &Room::veng2LookAtSpock },
{ {ACTION_LOOK, OBJECT_MCCOY, 0, 0}, &Room::veng2LookAtMccoy },
{ {ACTION_LOOK, OBJECT_REDSHIRT, 0, 0}, &Room::veng2LookAtRedshirt },
{ {ACTION_LOOK, 0xff, 0, 0}, &Room::veng2LookAnywhere },
{ {ACTION_TALK, OBJECT_KIRK, 0, 0}, &Room::veng2TalkToKirk },
{ {ACTION_TALK, OBJECT_SPOCK, 0, 0}, &Room::veng2TalkToSpock },
{ {ACTION_TALK, OBJECT_MCCOY, 0, 0}, &Room::veng2TalkToMccoy },
{ {ACTION_TALK, OBJECT_REDSHIRT, 0, 0}, &Room::veng2TalkToRedshirt },
{ {ACTION_USE, OBJECT_ITECH, OBJECT_DECK_IO_CONSOLE, 0}, &Room::veng2UseTechJournalOnDeckIOConsole },
{ {ACTION_USE, OBJECT_ITECH, HOTSPOT_DECK_IO_CONSOLE, 0}, &Room::veng2UseTechJournalOnDeckIOConsole },
{ {ACTION_USE, OBJECT_ITECH, HOTSPOT_DECK_IO_SLOT, 0}, &Room::veng2UseTechJournalOnDeckIOConsole },
{ {ACTION_DONE_WALK, 22, 0, 0}, &Room::veng2ReachedDeckIOWithTechJournal },
{ {ACTION_DONE_ANIM, 23, 0, 0}, &Room::veng2DoneReadingTechJournal },
{ {ACTION_USE, OBJECT_IDECK, OBJECT_DECK_IO_CONSOLE, 0}, &Room::veng2UseLogOnDeckIOConsole },
{ {ACTION_USE, OBJECT_IDECK, HOTSPOT_DECK_IO_CONSOLE, 0}, &Room::veng2UseLogOnDeckIOConsole },
{ {ACTION_USE, OBJECT_IDECK, HOTSPOT_DECK_IO_SLOT, 0}, &Room::veng2UseLogOnDeckIOConsole },
{ {ACTION_DONE_WALK, 24, 0, 0}, &Room::veng2ReachedDeckIOWithLog },
{ {ACTION_DONE_ANIM, 25, 0, 0}, &Room::veng2LoadedLog },
{ {ACTION_USE, OBJECT_ICOMM, OBJECT_KIRK, 0}, &Room::veng2UseCommunicator },
{ {ACTION_USE, OBJECT_KIRK, OBJECT_TORPEDO_BUTTON, 0}, &Room::veng2UseKirkOnTorpedoButton },
{ {ACTION_USE, OBJECT_KIRK, HOTSPOT_TORPEDO_BUTTON, 0}, &Room::veng2UseKirkOnTorpedoButton },
{ {ACTION_DONE_WALK, 18, 0, 0}, &Room::veng2UseKirkReachedTorpedoButton },
{ {ACTION_DONE_ANIM, 19, 0, 0}, &Room::veng2KirkFiredTorpedo },
{ {ACTION_DONE_ANIM, 7, 0, 0}, &Room::veng2TorpedoStruckElasiShip },
{ {ACTION_DONE_ANIM, 6, 0, 0}, &Room::veng2ElasiRetreated },
{ {ACTION_DONE_WALK, 1, 0, 0}, &Room::veng2CrewmanInPositionToBeamOut },
{ {ACTION_DONE_WALK, 2, 0, 0}, &Room::veng2CrewmanInPositionToBeamOut },
{ {ACTION_DONE_WALK, 3, 0, 0}, &Room::veng2CrewmanInPositionToBeamOut },
{ {ACTION_DONE_WALK, 4, 0, 0}, &Room::veng2CrewmanInPositionToBeamOut },
{ {ACTION_USE, OBJECT_ISTRICOR, OBJECT_TORPEDO_BUTTON, 0}, &Room::veng2UseSTricorderOnTorpedoButton }, // FIXME: hotspots?
{ {ACTION_USE, OBJECT_ISTRICOR, OBJECT_MIDDLE_CONSOLE, 0}, &Room::veng2UseSTricorderOnMiddleConsole },
{ {ACTION_USE, OBJECT_ISTRICOR, HOTSPOT_MIDDLE_CONSOLE, 0}, &Room::veng2UseSTricorderOnMiddleConsole },
{ {ACTION_USE, OBJECT_KIRK, HOTSPOT_TORPEDO_CONTROL, 0}, &Room::veng2UseSTricorderOnTorpedoControl },
{ {ACTION_USE, OBJECT_ISTRICOR, HOTSPOT_TORPEDO_CONTROL, 0}, &Room::veng2UseSTricorderOnTorpedoControl },
{ {ACTION_USE, OBJECT_SPOCK, HOTSPOT_TORPEDO_CONTROL, 0}, &Room::veng2UseSTricorderOnTorpedoControl },
{ {ACTION_USE, OBJECT_KIRK, OBJECT_IMPULSE_CONSOLE, 0}, &Room::veng2UseImpulseConsole },
{ {ACTION_USE, OBJECT_SPOCK, OBJECT_IMPULSE_CONSOLE, 0}, &Room::veng2UseImpulseConsole },
{ {ACTION_USE, OBJECT_KIRK, HOTSPOT_IMPULSE_CONSOLE, 0}, &Room::veng2UseImpulseConsole },
{ {ACTION_USE, OBJECT_SPOCK, HOTSPOT_IMPULSE_CONSOLE, 0}, &Room::veng2UseImpulseConsole },
{ {ACTION_DONE_WALK, 20, 0, 0}, &Room::veng2SpockReachedImpulseConsole },
{ {ACTION_DONE_ANIM, 21, 0, 0}, &Room::veng2SpockUsedImpulseConsole },
{ {ACTION_USE, OBJECT_KIRK, OBJECT_MAIN_COMPUTER, 0}, &Room::veng2UseMainComputer },
{ {ACTION_USE, OBJECT_SPOCK, OBJECT_MAIN_COMPUTER, 0}, &Room::veng2UseMainComputer },
{ {ACTION_USE, OBJECT_KIRK, HOTSPOT_MAIN_COMPUTER, 0}, &Room::veng2UseMainComputer },
{ {ACTION_USE, OBJECT_SPOCK, HOTSPOT_MAIN_COMPUTER, 0}, &Room::veng2UseMainComputer },
{ {ACTION_USE, OBJECT_ISTRICOR, OBJECT_MAIN_COMPUTER, 0}, &Room::veng2UseSTricorderOnMainComputer },
{ {ACTION_USE, OBJECT_ISTRICOR, HOTSPOT_MAIN_COMPUTER, 0}, &Room::veng2UseSTricorderOnMainComputer },
{ {ACTION_DONE_WALK, 10, 0, 0}, &Room::veng2SpockReachedMainComputerToPutTricorder },
{ {ACTION_DONE_ANIM, 11, 0, 0}, &Room::veng2AttachedSTricorderToComputer },
{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_MAIN_COMPUTER, 0}, &Room::veng2UseMTricorderOnMainComputer },
{ {ACTION_USE, OBJECT_IMTRICOR, HOTSPOT_MAIN_COMPUTER, 0}, &Room::veng2UseMTricorderOnMainComputer },
{ {ACTION_DONE_WALK, 12, 0, 0}, &Room::veng2MccoyReachedMainComputerToPutTricorder },
{ {ACTION_DONE_ANIM, 13, 0, 0}, &Room::veng2AttachedMTricorderToComputer },
{ {ACTION_USE, OBJECT_ISTRICOR, OBJECT_DECK_IO_CONSOLE, 0}, &Room::veng2UseSTricorderOnDeckIOConsole },
{ {ACTION_USE, OBJECT_ISTRICOR, HOTSPOT_DECK_IO_SLOT, 0}, &Room::veng2UseSTricorderOnDeckIOConsole },
{ {ACTION_USE, OBJECT_ISTRICOR, OBJECT_IMPULSE_CONSOLE, 0}, &Room::veng2UseSTricorderOnImpulseConsole },
{ {ACTION_USE, OBJECT_ISTRICOR, HOTSPOT_IMPULSE_CONSOLE, 0}, &Room::veng2UseSTricorderOnImpulseConsole },
{ {ACTION_USE, OBJECT_IFUSION, HOTSPOT_MAIN_COMPUTER, 0}, &Room::veng2UseFusionPackOnMainComputer },
{ {ACTION_USE, OBJECT_IFUSION, OBJECT_MAIN_COMPUTER, 0}, &Room::veng2UseFusionPackOnMainComputer },
{ {ACTION_GET, OBJECT_DECK, 0, 0}, &Room::veng2GetLogDeck },
{ {ACTION_DONE_WALK, 8, 0, 0}, &Room::veng2ReachedLogDeck },
{ {ACTION_DONE_ANIM, 9, 0, 0}, &Room::veng2PickedUpLogDeck },
{ {ACTION_GET, OBJECT_STRICORDER, 0, 0}, &Room::veng2GetSTricorder },
{ {ACTION_DONE_WALK, 14, 0, 0}, &Room::veng2ReachedSTricorderToGet },
{ {ACTION_DONE_ANIM, 15, 0, 0}, &Room::veng2PickedUpSTricorder },
{ {ACTION_GET, OBJECT_MTRICORDER, 0, 0}, &Room::veng2GetMTricorder },
{ {ACTION_DONE_WALK, 16, 0, 0}, &Room::veng2ReachedMTricorderToGet },
{ {ACTION_DONE_ANIM, 17, 0, 0}, &Room::veng2PickedUpMTricorder },
// Common code
{ {ACTION_TICK, 0xff, 0xff, 0xff}, &Room::vengaTick },
{ {ACTION_USE, OBJECT_IPHASERS, 0xff, 0}, &Room::vengaUsePhaserAnywhere },
{ {ACTION_USE, OBJECT_IPHASERK, 0xff, 0}, &Room::vengaUsePhaserAnywhere },
{ {ACTION_LOOK, OBJECT_IHYPO, 0, 0}, &Room::vengaLookAtHypo },
// ENHANCEMENTs
{ {ACTION_USE, OBJECT_KIRK, HOTSPOT_TORPEDO_CONTROL, 0}, &Room::veng2UseKirkOnTorpedoButton },
// TODO: uncomment
// { {ACTION_USE, OBJECT_ISTRICOR, HOTSPOT_DECK_IO_CONSOLE, 0}, &Room::veng2UseSTricorderOnDeckIOConsole },
{ {ACTION_LIST_END, 0, 0, 0}, nullptr }
};
enum veng2TextIds {
TX_SPEAKER_KIRK, TX_SPEAKER_MCCOY, TX_SPEAKER_SPOCK, TX_SPEAKER_KIJE, TX_SPEAKER_SCOTT,
TX_SPEAKER_CHEKOV, TX_SPEAKER_ELASI_CAPTAIN, TX_SPEAKER_PATTERSON, TX_SPEAKER_UHURA, TX_SPEAKER_ANDRADE,
TX_SPEAKER_ELASI_WEAPONS_MASTER, TX_SPEAKER_ELASI_CREWMAN,
TX_VEN2_001, TX_VEN2_002, TX_VEN2_003, TX_VEN2_004, TX_VEN2_005,
TX_VEN2_006, TX_VEN2_007, TX_VEN2_008, TX_VEN2_009, TX_VEN2_010,
TX_VEN2_011, TX_VEN2_012, TX_VEN2_013, TX_VEN2_014, TX_VEN2_015,
TX_VEN2_016, TX_VEN2_017, TX_VEN2_018, TX_VEN2_019, TX_VEN2_020,
TX_VEN2_021, TX_VEN2_022, TX_VEN2_023, TX_VEN2_024, TX_VEN2_025,
TX_VEN2_026, TX_VEN2_027, TX_VEN2_028, TX_VEN2_029, TX_VEN2_030,
TX_VEN2_031, TX_VEN2_032, TX_VEN2_033, TX_VEN2_034, TX_VEN2_035,
TX_VEN2_036, TX_VEN2_037, TX_VEN2_038, TX_VEN2_039, TX_VEN2_040,
TX_VEN2_041, TX_VEN2_042, TX_VEN2_043, TX_VEN2_044, TX_VEN2_045,
TX_VEN2_046, TX_VEN2_047, TX_VEN2_048, TX_VEN2_050, TX_VEN2_051,
TX_VEN2_052, TX_VEN2_053, TX_VEN2_054, TX_VEN2_055, TX_VEN2_056,
TX_VEN2_057, TX_VEN2_058, TX_VEN2_059, TX_VEN2_060, TX_VEN2_061,
TX_VEN2_062, TX_VEN2_063, TX_VEN2_064, TX_VEN2_065, TX_VEN2_066,
TX_VEN2_067, TX_VEN2_068, TX_VEN2_069, TX_VEN2_070, TX_VEN2_071,
TX_VEN2_072, TX_VEN2_073, TX_VEN2_074, TX_VEN2_075, TX_VEN2_076,
TX_VEN2_077, TX_VEN2_078, TX_VEN2_079, TX_VEN2_080, TX_VEN2_081,
TX_VEN2_082, TX_VEN2_083, TX_VEN2_084, TX_VEN2_085, TX_VEN2_086,
TX_VEN2_087, TX_VEN2_088, TX_VEN2_089, TX_VEN2_091, TX_VEN2_092,
TX_VEN2_093, TX_VEN2_094, TX_VEN2_096, TX_VEN2_097, TX_VEN2_098,
TX_VEN2_099, TX_VEN2_100, TX_VEN2_101, TX_VEN2_102, TX_VEN2_103,
TX_VEN2_104, TX_VEN2_105, TX_VEN2_106, TX_VEN2_107, TX_VEN2_108,
TX_VEN2_109, TX_VEN2_110, TX_VEN2_111, TX_VEN2_112, TX_VEN2_113,
TX_VEN2_114, TX_VEN2_115, TX_VEN2_ELA, TX_VEN2_ENT, TX_VEN2_F28,
TX_VEN2_F29, TX_VEN2_F35, TX_VEN2_S09, TX_VEN2_SHI, TX_VEN2_TRA,
TX_VEN2_WEA, TX_VEN4N010, TX_VEN4_017, TX_VEN6N007, TX_VENA_F32,
TX_VENA_F34, TX_VENA_F40, TX_MUD4_018, TX_VEN2N000, TX_VEN2N001,
TX_VEN2N002, TX_VEN2N003, TX_VEN2N004, TX_VEN2N005, TX_VEN2N006,
TX_VEN2N007, TX_VEN2N008, TX_VEN2N009, TX_VEN2N010, TX_VEN2N011,
TX_VEN2N012, TX_VEN2N013, TX_VEN2N015, TX_VEN2N016, TX_VEN2N017,
TX_VEN2N018, TX_VEN2N019, TX_VEN2N020, TX_VEN2N021, TX_VEN2N022,
TX_VEN2N023, TX_VEN2N024, TX_VEN2N025, TX_VEN2N027, TX_VEN2N028,
TX_VEN2N029, TX_VEN2N030, TX_VEN2N031, TX_VEN2N032, TX_VEN2N033,
TX_VEN2N034, TX_VEN2N035, TX_VEN2N038, TX_VEN2N039, TX_VEN2U093,
TX_VEN2U094, TX_VEN2_HAIL_ELASI, TX_VEN2_HAIL_ENT, TX_VEN2_CANCEL,
TX_VEN2_090
};
// TODO: Finish floppy offsets
extern const RoomTextOffsets veng2TextOffsets[] = {
{ TX_SPEAKER_KIRK, 20603, 0, 0, 0 },
{ TX_SPEAKER_MCCOY, 20614, 0, 0, 0 },
{ TX_SPEAKER_SPOCK, 20624, 0, 0, 0 },
{ TX_SPEAKER_KIJE, 20719, 0, 0, 0 },
{ TX_SPEAKER_SCOTT, 20634, 0, 0, 0 },
{ TX_SPEAKER_CHEKOV, 20644, 0, 0, 0 },
{ TX_SPEAKER_ELASI_CAPTAIN, 20731, 0, 0, 0 },
{ TX_SPEAKER_PATTERSON, 20677, 0, 0, 0 },
{ TX_SPEAKER_UHURA, 20658, 0, 0, 0 },
{ TX_SPEAKER_ANDRADE, 20695, 0, 0, 0 },
{ TX_SPEAKER_ELASI_WEAPONS_MASTER, 20745, 0, 0, 0 },
{ TX_SPEAKER_ELASI_CREWMAN, 20766, 0, 0, 0 },
{ TX_VEN2_001, 12332, 0, 0, 0 },
{ TX_VEN2_002, 15643, 0, 0, 0 },
{ TX_VEN2_003, 13474, 0, 0, 0 },
{ TX_VEN2_003, 13295, 0, 0, 0 },
{ TX_VEN2_004, 6710, 0, 0, 0 },
{ TX_VEN2_005, 6633, 0, 0, 0 },
{ TX_VEN2_006, 1862, 0, 0, 0 },
{ TX_VEN2_007, 7242, 0, 0, 0 },
{ TX_VEN2_008, 2468, 0, 0, 0 },
{ TX_VEN2_009, 6954, 0, 0, 0 },
{ TX_VEN2_010, 1756, 0, 0, 0 },
{ TX_VEN2_011, 22026, 0, 0, 0 },
{ TX_VEN2_012, 21967, 0, 0, 0 },
{ TX_VEN2_013, 11534, 0, 0, 0 },
{ TX_VEN2_014, 11088, 0, 0, 0 },
{ TX_VEN2_015, 9563, 0, 0, 0 },
{ TX_VEN2_015, 22250, 0, 0, 0 },
{ TX_VEN2_016, 1372, 0, 0, 0 },
{ TX_VEN2_017, 8039, 0, 0, 0 },
{ TX_VEN2_018, 15028, 0, 0, 0 },
{ TX_VEN2_019, 1051, 0, 0, 0 },
{ TX_VEN2_020, 2081, 0, 0, 0 },
{ TX_VEN2_021, 2626, 0, 0, 0 },
{ TX_VEN2_022, 3046, 0, 0, 0 },
{ TX_VEN2_023, 22533, 0, 0, 0 },
{ TX_VEN2_024, 15934, 0, 0, 0 },
{ TX_VEN2_025, 10100, 0, 0, 0 },
{ TX_VEN2_026, 11332, 0, 0, 0 },
{ TX_VEN2_027, 1576, 0, 0, 0 },
{ TX_VEN2_028, 8928, 0, 0, 0 },
{ TX_VEN2_029, 9654, 0, 0, 0 },
{ TX_VEN2_029, 22325, 0, 0, 0 },
{ TX_VEN2_030, 17649, 0, 0, 0 },
{ TX_VEN2_031, 16748, 0, 0, 0 },
{ TX_VEN2_032, 1198, 0, 0, 0 },
{ TX_VEN2_033, 14498, 0, 0, 0 },
{ TX_VEN2_034, 14871, 0, 0, 0 },
{ TX_VEN2_035, 13922, 0, 0, 0 },
{ TX_VEN2_036, 22919, 0, 0, 0 },
{ TX_VEN2_037, 23214, 0, 0, 0 },
{ TX_VEN2_038, 17250, 0, 0, 0 },
{ TX_VEN2_039, 7091, 0, 0, 0 },
{ TX_VEN2_040, 9261, 0, 0, 0 },
{ TX_VEN2_041, 7154, 0, 0, 0 },
{ TX_VEN2_042, 1139, 0, 0, 0 },
{ TX_VEN2_043, 7956, 0, 0, 0 },
{ TX_VEN2_044, 3004, 0, 0, 0 },
{ TX_VEN2_045, 16134, 0, 0, 0 },
{ TX_VEN2_046, 7637, 0, 0, 0 },
{ TX_VEN2_047, 18668, 0, 0, 0 },
{ TX_VEN2_047, 19102, 0, 0, 0 },
{ TX_VEN2_048, 22718, 0, 0, 0 },
{ TX_VEN2_050, 13181, 0, 0, 0 },
{ TX_VEN2_051, 18177, 0, 0, 0 },
{ TX_VEN2_052, 14307, 0, 0, 0 },
{ TX_VEN2_053, 22827, 0, 0, 0 },
{ TX_VEN2_054, 10390, 0, 0, 0 },
{ TX_VEN2_055, 12792, 0, 0, 0 },
{ TX_VEN2_056, 18054, 0, 0, 0 },
{ TX_VEN2_057, 13554, 0, 0, 0 },
{ TX_VEN2_058, 10271, 0, 0, 0 },
{ TX_VEN2_059, 16593, 0, 0, 0 },
{ TX_VEN2_060, 18322, 0, 0, 0 },
{ TX_VEN2_061, 8589, 0, 0, 0 },
{ TX_VEN2_062, 12484, 0, 0, 0 },
{ TX_VEN2_063, 13376, 0, 0, 0 },
{ TX_VEN2_064, 12699, 0, 0, 0 },
{ TX_VEN2_065, 12924, 0, 0, 0 },
{ TX_VEN2_066, 9124, 0, 0, 0 },
{ TX_VEN2_067, 17887, 0, 0, 0 },
{ TX_VEN2_068, 13011, 0, 0, 0 },
{ TX_VEN2_069, 13740, 0, 0, 0 },
{ TX_VEN2_070, 7834, 0, 0, 0 },
{ TX_VEN2_071, 15497, 0, 0, 0 },
{ TX_VEN2_072, 2934, 0, 0, 0 },
{ TX_VEN2_073, 1295, 0, 0, 0 },
{ TX_VEN2_074, 16244, 0, 0, 0 },
{ TX_VEN2_075, 6898, 0, 0, 0 },
{ TX_VEN2_076, 1100, 0, 0, 0 },
{ TX_VEN2_077, 15137, 0, 0, 0 },
{ TX_VEN2_078, 7533, 0, 0, 0 },
{ TX_VEN2_079, 15779, 0, 0, 0 },
{ TX_VEN2_080, 15999, 0, 0, 0 },
{ TX_VEN2_081, 8104, 0, 0, 0 },
{ TX_VEN2_082, 8295, 0, 0, 0 },
{ TX_VEN2_083, 21010, 0, 0, 0 },
{ TX_VEN2_084, 21263, 0, 0, 0 },
{ TX_VEN2_085, 14671, 0, 0, 0 },
{ TX_VEN2_086, 7302, 0, 0, 0 },
{ TX_VEN2_087, 15414, 0, 0, 0 },
{ TX_VEN2_088, 14226, 0, 0, 0 },
{ TX_VEN2_089, 14584, 0, 0, 0 },
{ TX_VEN2_091, 14077, 0, 0, 0 },
{ TX_VEN2_092, 14813, 0, 0, 0 },
{ TX_VEN2_093, 995, 0, 0, 0 },
{ TX_VEN2_094, 7375, 0, 0, 0 },
{ TX_VEN2_096, 16473, 0, 0, 0 },
{ TX_VEN2_097, 21609, 0, 0, 0 },
{ TX_VEN2_098, 19583, 0, 0, 0 },
{ TX_VEN2_098, 8666, 0, 0, 0 },
{ TX_VEN2_099, 2384, 0, 0, 0 },
{ TX_VEN2_100, 9831, 0, 0, 0 },
{ TX_VEN2_101, 11009, 0, 0, 0 },
{ TX_VEN2_102, 2733, 0, 0, 0 },
{ TX_VEN2_103, 1799, 0, 0, 0 },
{ TX_VEN2_104, 10706, 0, 0, 0 },
{ TX_VEN2_105, 2512, 0, 0, 0 },
{ TX_VEN2_106, 11136, 0, 0, 0 },
{ TX_VEN2_107, 22443, 0, 0, 0 },
{ TX_VEN2_108, 9448, 0, 0, 0 },
{ TX_VEN2_109, 1454, 0, 0, 0 },
{ TX_VEN2_110, 22561, 0, 0, 0 },
{ TX_VEN2_111, 1956, 0, 0, 0 },
{ TX_VEN2_112, 2187, 0, 0, 0 },
{ TX_VEN2_113, 1620, 0, 0, 0 },
{ TX_VEN2_114, 9953, 0, 0, 0 },
{ TX_VEN2_115, 11383, 0, 0, 0 },
{ TX_VEN2_ELA, 22180, 0, 0, 0 },
{ TX_VEN2_ENT, 22215, 0, 0, 0 },
{ TX_VEN2_F28, 10925, 0, 0, 0 },
{ TX_VEN2_F29, 10850, 0, 0, 0 },
{ TX_VEN2_F35, 11997, 0, 0, 0 },
{ TX_VEN2_S09, 11713, 0, 0, 0 },
{ TX_VEN2_SHI, 21908, 0, 0, 0 },
{ TX_VEN2_TRA, 21931, 0, 0, 0 },
{ TX_VEN2_WEA, 21885, 0, 0, 0 },
{ TX_VEN4_017, 6826, 0, 0, 0 },
{ TX_VENA_F32, 19813, 0, 0, 0 },
{ TX_VENA_F34, 20083, 0, 0, 0 },
{ TX_VENA_F40, 19678, 0, 0, 0 },
//{ TX_DEM6_015, 20930, 0, 0, 0 },
{ TX_VEN2N000, 4402, 0, 0, 0 },
{ TX_VEN2N001, 4341, 0, 0, 0 },
{ TX_VEN2N002, 3318, 0, 0, 0 },
{ TX_VEN2N003, 5479, 0, 0, 0 },
{ TX_VEN2N004, 6403, 0, 0, 0 },
{ TX_VEN2N005, 5275, 0, 0, 0 },
{ TX_VEN2N006, 5363, 0, 0, 0 },
{ TX_VEN2N007, 5177, 0, 0, 0 },
{ TX_VEN2N008, 4856, 0, 0, 0 },
{ TX_VEN2N009, 4957, 0, 0, 0 },
{ TX_VEN2N009, 5067, 0, 0, 0 },
{ TX_VEN2N010, 6159, 0, 0, 0 },
{ TX_VEN2N011, 20781, 0, 0, 0 },
{ TX_VEN2N012, 6331, 0, 0, 0 },
{ TX_VEN2N013, 19468, 0, 0, 0 },
{ TX_VEN2N015, 19034, 0, 0, 0 },
{ TX_VEN2N016, 17487, 0, 0, 0 },
{ TX_VEN2N017, 17096, 0, 0, 0 },
{ TX_VEN2N018, 20823, 0, 0, 0 },
{ TX_VEN2N019, 6259, 0, 0, 0 },
{ TX_VEN2N020, 4671, 0, 0, 0 },
{ TX_VEN2N021, 4553, 0, 0, 0 },
{ TX_VEN2N022, 3192, 0, 0, 0 },
{ TX_VEN2N023, 5574, 0, 0, 0 },
{ TX_VEN2N024, 4064, 0, 0, 0 },
{ TX_VEN2N025, 5766, 0, 0, 0 },
{ TX_VEN2N027, 3963, 0, 0, 0 },
{ TX_VEN2N027, 5673, 0, 0, 0 },
{ TX_VEN2N028, 10216, 0, 0, 0 },
{ TX_VEN2N029, 5898, 0, 0, 0 },
{ TX_VEN2N030, 12131, 0, 0, 0 },
{ TX_VEN2N030, 3479, 0, 0, 0 },
{ TX_VEN2N031, 6071, 0, 0, 0 },
{ TX_VEN2N031, 5983, 0, 0, 0 },
{ TX_VEN2N032, 23477, 0, 0, 0 },
{ TX_VEN2N032, 3824, 0, 0, 0 },
{ TX_VEN2N033, 4173, 0, 0, 0 },
{ TX_VEN2N033, 4257, 0, 0, 0 },
{ TX_VEN2N034, 4778, 0, 0, 0 },
{ TX_VEN2N035, 6492, 0, 0, 0 },
{ TX_VEN2N035, 3689, 0, 0, 0 },
{ TX_VEN2N038, 20875, 0, 0, 0 },
{ TX_VEN2N039, 18582, 0, 0, 0 },
{ TX_VEN2U093, 8821, 0, 0, 0 },
{ TX_VEN2U094, 11259, 0, 0, 0 },
{ TX_VEN4N010, 20237, 0, 0, 0 },
{ TX_VEN6N007, 20302, 0, 0, 0 },
{ TX_MUD4_018, 8758, 0, 0, 0 },
{ TX_VEN2_HAIL_ELASI, 9004, 0, 0, 0 },
{ TX_VEN2_HAIL_ENT, 9031, 0, 0, 0 },
{ TX_VEN2_CANCEL, 9063, 0, 0, 0 },
//TODO: TX_VEN2_090
{ -1, 0, 0, 0, 0 }
};
extern const RoomText veng2Texts[] = {
{ -1, Common::UNK_LANG, "" }
};
#define STRICORDER_POS_X 0x45
#define STRICORDER_POS_Y 0x71
#define MTRICORDER_POS_X 0x55
#define MTRICORDER_POS_Y 0x67
#define MAIN_COMPUTER_X 0x4f
#define MAIN_COMPUTER_Y 0x71
#define VIEWSCREEN_X 0x9e
#define VIEWSCREEN_Y 0x63
#define DAMAGE_DISPLAY_1_X 0xfa
#define DAMAGE_DISPLAY_1_Y 0x64
#define TORPEDO_BUTTON_X 0x97
#define TORPEDO_BUTTON_Y 0x74
void Room::veng2Tick1() {
if (!_awayMission->veng.tookRecordDeckFromAuxilaryControl)
loadActorAnim2(OBJECT_DECK, "s7r2d1", 0xee, 0x8c);
if (!haveItem(OBJECT_ISTRICOR))
loadActorAnim2(OBJECT_STRICORDER, "s7r2t1", STRICORDER_POS_X, STRICORDER_POS_Y);
if (!haveItem(OBJECT_IMTRICOR))
loadActorAnim2(OBJECT_MTRICORDER, "s7r2t2", MTRICORDER_POS_X, MTRICORDER_POS_Y);
if (_awayMission->veng.tricordersPluggedIntoComputer == 3)
loadActorAnim2(OBJECT_MAIN_COMPUTER, "s7r2t3", MAIN_COMPUTER_X, MAIN_COMPUTER_Y);
if (_awayMission->veng.elasiShipDecloaked)
loadActorAnim2(OBJECT_VIEWSCREEN, "s7r2u2", VIEWSCREEN_X, VIEWSCREEN_Y);
if (_awayMission->veng.poweredSystem == 2)
loadActorAnim2(OBJECT_DAMAGE_DISPLAY_1, "s7r2sh2", DAMAGE_DISPLAY_1_X, DAMAGE_DISPLAY_1_Y);
loadActorAnim2(OBJECT_TORPEDO_BUTTON, "s7r2pl", TORPEDO_BUTTON_X, TORPEDO_BUTTON_Y);
if (_awayMission->veng.torpedoLoaded)
loadActorAnim2(OBJECT_TORPEDO_BUTTON, "s7r2pm", TORPEDO_BUTTON_X, TORPEDO_BUTTON_Y);
if (!_awayMission->veng.impulseEnginesOn) {
loadActorAnim2(OBJECT_IMPULSE_CONSOLE, "s7r2o1", 0x0b, 0x87);
loadActorAnim2(OBJECT_LEFT_COMPUTER_PANEL, "s7r2o2", 0x36, 0x63);
loadActorAnim2(OBJECT_RIGHT_COMPUTER_PANEL, "s7r2o3", 0x58, 0x5f);
loadActorAnim2(OBJECT_MIDDLE_CONSOLE, "s7r2o4", 0x9e, 0x7b);
loadActorAnim2(OBJECT_DAMAGE_DISPLAY_2, "s7r2o5", 0x112, 0x66);
loadActorAnim2(OBJECT_DECK_IO_CONSOLE, "s7r2o6", 0x131, 0x86);
loadActorAnim2(OBJECT_CEILING_PANEL, "s7r2o7", 0x9b, 0x14);
// FIXME: this doesn't loop
playVoc("VEN2LOFF");
} else
playVoc("VEN2LON");
}
void Room::veng2Timer0Expired() { // Elasi decloak if they haven't already
if (_awayMission->veng.tricordersPluggedIntoComputer == 3 && _awayMission->veng.impulseEnginesOn) {
if (!_awayMission->veng.elasiShipDecloaked) {
_awayMission->veng.elasiShipDecloaked = true;
playVoc("UNCLOAK");
loadActorAnimC(OBJECT_VIEWSCREEN, "s7r2u1", VIEWSCREEN_X, VIEWSCREEN_Y, &Room::veng2ElasiShipDecloaked);
_awayMission->disableInput = true;
} else if (!_awayMission->veng.elasiHailedRepublic && _awayMission->veng.poweredSystem == 2)
_awayMission->timers[2] = 45; // Timer until Elasi hail
}
}
void Room::veng2ElasiShipDecloaked() {
_awayMission->disableInput = false;
showText(TX_SPEAKER_KIJE, TX_VEN2_093);
showText(TX_SPEAKER_KIRK, TX_VEN2_019);
showText(TX_SPEAKER_SPOCK, TX_VEN2_076);
showText(TX_SPEAKER_MCCOY, TX_VEN2_042);
if (_awayMission->veng.poweredSystem != 2) {
showText(TX_SPEAKER_SPOCK, TX_VEN2_032);
_awayMission->veng.counterUntilElasiBoardWithShieldsDown = 1800;
} else
veng2Timer2Expired();
}
void Room::veng2Timer2Expired() { // Elasi hail the Enterprise if they haven't already
if (_awayMission->veng.elasiHailedRepublic)
return;
_awayMission->veng.elasiHailedRepublic = true;
showText(TX_SPEAKER_SPOCK, TX_VEN2_073);
showText(TX_SPEAKER_KIRK, TX_VEN2_016);
loadActorAnim2(OBJECT_VIEWSCREEN, "s7r2p1", VIEWSCREEN_X, VIEWSCREEN_Y);
showText(TX_SPEAKER_ELASI_CAPTAIN, TX_VEN2_109);
showText(TX_SPEAKER_KIRK, TX_VEN2_027);
showText(TX_SPEAKER_ELASI_CAPTAIN, TX_VEN2_113);
showText(TX_SPEAKER_KIRK, TX_VEN2_010);
showText(TX_SPEAKER_ELASI_CAPTAIN, TX_VEN2_103);
showText(TX_SPEAKER_KIRK, TX_VEN2_006);
showText(TX_SPEAKER_ELASI_CAPTAIN, TX_VEN2_111);
showText(TX_SPEAKER_KIRK, TX_VEN2_020);
showText(TX_SPEAKER_ELASI_CAPTAIN, TX_VEN2_112);
const TextRef choices[] = {
TX_SPEAKER_KIRK,
TX_VEN2_012, TX_VEN2_011,
TX_END
};
int choice = showMultipleTexts(choices);
if (choice == 0) {
showText(TX_SPEAKER_ELASI_CAPTAIN, TX_VEN2_099);
showText(TX_SPEAKER_KIRK, TX_VEN2_008);
}
showText(TX_SPEAKER_ELASI_CAPTAIN, TX_VEN2_105);
showText(TX_SPEAKER_KIRK, TX_VEN2_021);
showText(TX_SPEAKER_ELASI_CAPTAIN, TX_VEN2_102);
showText(TX_SPEAKER_SPOCK, TX_VEN2_072);
showText(TX_SPEAKER_MCCOY, TX_VEN2_044);
showText(TX_SPEAKER_KIRK, TX_VEN2_022);
loadActorAnim2(OBJECT_VIEWSCREEN, "s7r2u2", VIEWSCREEN_X, VIEWSCREEN_Y);
_awayMission->veng.counterUntilElasiAttack = 27000;
_awayMission->veng.countdownStarted = true;
}
void Room::veng2TouchedDoor() {
playSoundEffectIndex(kSfxDoor);
_awayMission->rdfStillDoDefaultAction = true;
}
void Room::veng2LookAtViewscreen() {
if (!_awayMission->veng.elasiShipDecloaked)
showDescription(TX_VEN2N022);
else
showDescription(TX_VEN2N002);
}
void Room::veng2LookAtMiddleConsole() {
showDescription(TX_VEN2N030);
}
void Room::veng2LookAtDamageDisplay() {
if (!_awayMission->veng.impulseEnginesOn)
showDescription(TX_VEN2N035);
else
showDescription(TX_VEN2N032);
// NOTE: There were originally 2 more cases, where "poweredSystem == 2" or otherwise. For
// the case where poweredSystem == 2, it played TX_VEN2N032, but with mismatching text.
}
void Room::veng2LookAtSTricorder() {
showDescription(TX_VEN2N027);
}
void Room::veng2LookAtMTricorder() {
showDescription(TX_VEN2N024);
}
void Room::veng2LookAtTorpedoButton() {
showDescription(TX_VEN2N033);
}
// TODO: Consider merging "veng2LookAtTorpedoButton" with "veng2LookAtTorpedoControl"
// (and the same for use actions)
void Room::veng2LookAtTorpedoControl() {
showDescription(TX_VEN2N033);
if (!_awayMission->veng.impulseEnginesOn)
showDescription(TX_VEN2N001); // Unused, since it can't be selected when impulse is off?
else if (!_awayMission->veng.torpedoLoaded) {
showDescription(TX_VEN2N000);
if (!_awayMission->veng.elasiShipDecloaked)
showText(TX_SPEAKER_SPOCK, TX_VEN2_036);
else
showText(TX_SPEAKER_SPOCK, TX_VEN2_037);
_awayMission->veng.examinedTorpedoControl = true;
} else if (!_awayMission->veng.firedTorpedo)
showDescription(TX_VEN2N021);
else
showDescription(TX_VEN2N020); // Unused, since after firing the torpedo, the mission ends
}
void Room::veng2LookAtImpulseConsole() {
showDescription(TX_VEN2N034);
if (!_awayMission->veng.impulseEnginesOn)
showDescription(TX_VEN2N008);
else if (_awayMission->veng.tricordersPluggedIntoComputer != 3)
showDescription(TX_VEN2N009);
else if (_awayMission->veng.poweredSystem == 0)
showDescription(TX_VEN2N009);
else if (_awayMission->veng.poweredSystem == 1)
showDescription(TX_VEN2N007);
else if (_awayMission->veng.poweredSystem == 2)
showDescription(TX_VEN2N005);
else
showDescription(TX_VEN2N006);
}
void Room::veng2LookAtMainComputer() {
if (_awayMission->veng.tricordersPluggedIntoComputer == 0)
showDescription(TX_VEN2N003);
else if (_awayMission->veng.tricordersPluggedIntoComputer == 1) // Med tricorder plugged in
showDescription(TX_VEN2N023);
else if (_awayMission->veng.tricordersPluggedIntoComputer == 2) // Sci tricorder plugged in
showDescription(TX_VEN2N027);
else // Both
showDescription(TX_VEN2N025);
}
void Room::veng2LookAtRecordDeck() {
showDescription(TX_VEN2N029);
}
void Room::veng2LookAtDeckIOConsole() {
showDescription(TX_VEN2N031);
}
void Room::veng2LookAtKirk() {
showDescription(TX_VEN2N010);
}
void Room::veng2LookAtSpock() {
showDescription(TX_VEN2N019);
}
void Room::veng2LookAtMccoy() {
showDescription(TX_VEN2N012);
}
void Room::veng2LookAtRedshirt() {
showDescription(TX_VEN2N004);
}
void Room::veng2LookAnywhere() {
showDescription(TX_VEN2N035);
}
void Room::veng2TalkToKirk() {
if (_awayMission->veng.countdownStarted)
showText(TX_SPEAKER_KIRK, TX_VEN2_004);
else
showText(TX_SPEAKER_KIRK, TX_VEN2_005);
}
void Room::veng2TalkToSpock() {
if (_awayMission->veng.countdownStarted) {
showText(TX_SPEAKER_SPOCK, TX_VEN2_075);
showText(TX_SPEAKER_KIRK, TX_VEN2_009);
} else
showText(TX_SPEAKER_SPOCK, TX_VEN4_017);
}
void Room::veng2TalkToMccoy() {
if (_awayMission->veng.countdownStarted) {
showText(TX_SPEAKER_MCCOY, TX_VEN2_041);
showText(TX_SPEAKER_KIRK, TX_VEN2_007);
} else
showText(TX_SPEAKER_MCCOY, TX_VEN2_039);
}
void Room::veng2TalkToRedshirt() {
if (_awayMission->veng.countdownStarted) {
showText(TX_SPEAKER_KIJE, TX_VEN2_094);
showText(TX_SPEAKER_SPOCK, TX_VEN2_078);
} else
showText(TX_SPEAKER_KIJE, TX_VEN2_086);
}
void Room::veng2UseTechJournalOnDeckIOConsole() {
if (_awayMission->veng.readEngineeringJournal)
showText(TX_SPEAKER_SPOCK, TX_VEN2_046);
else {
_awayMission->disableInput = true;
walkCrewmanC(OBJECT_SPOCK, 0x112, 0x98, &Room::veng2ReachedDeckIOWithTechJournal);
}
}
void Room::veng2ReachedDeckIOWithTechJournal() {
loadActorAnimC(OBJECT_SPOCK, "susemn", -1, -1, &Room::veng2DoneReadingTechJournal);
}
void Room::veng2DoneReadingTechJournal() {
_awayMission->disableInput = false;
showText(TX_SPEAKER_SPOCK, TX_VEN2_070);
showText(TX_SPEAKER_MCCOY, TX_VEN2_043);
showText(TX_SPEAKER_KIRK, TX_VEN2_017);
showText(TX_SPEAKER_SPOCK, TX_VEN2_081);
_awayMission->veng.readEngineeringJournal = true;
}
void Room::veng2UseLogOnDeckIOConsole() {
_awayMission->disableInput = true;
walkCrewmanC(OBJECT_KIRK, 0x112, 0x98, &Room::veng2ReachedDeckIOWithLog);
}
void Room::veng2ReachedDeckIOWithLog() {
loadActorAnimC(OBJECT_KIRK, "kusemn", -1, -1, &Room::veng2LoadedLog);
}
void Room::veng2LoadedLog() {
playVoc("COMPUTER");
_awayMission->disableInput = false;
_awayMission->veng.captainsLogIndex++;
if (_awayMission->veng.captainsLogIndex == 1)
showText(TX_SPEAKER_PATTERSON, TX_VEN2_082);
else if (_awayMission->veng.captainsLogIndex == 2)
showText(TX_SPEAKER_PATTERSON, TX_VEN2_083);
else if (_awayMission->veng.captainsLogIndex == 3)
showText(TX_SPEAKER_PATTERSON, TX_VEN2_084);
else if (_awayMission->veng.captainsLogIndex == 4) {
showText(TX_SPEAKER_ANDRADE, TX_VEN2_097);
_awayMission->veng.readAllLogs = true;
showText(TX_SPEAKER_SPOCK, TX_VEN2_061);
} else
showText(TX_SPEAKER_SPOCK, TX_VEN2_061);
}
void Room::veng2UseCommunicator() {
if (_awayMission->veng.toldElasiToBeamOver)
showText(TX_SPEAKER_ELASI_CAPTAIN, TX_VEN2_098);
else if (_awayMission->veng.countdownStarted) {
const TextRef choices[] = {
TX_SPEAKER_KIRK,
TX_VEN2_HAIL_ELASI, TX_VEN2_HAIL_ENT, TX_VEN2_CANCEL,
TX_END
};
int choice = showMultipleTexts(choices);
if (choice == 0) { // Hail Elasi
if (!_awayMission->veng.torpedoLoaded)
showText(TX_SPEAKER_MCCOY, TX_VEN2_040);
else {
loadActorAnim2(OBJECT_VIEWSCREEN, "s7r2p1", VIEWSCREEN_X, VIEWSCREEN_Y);
showText(TX_SPEAKER_ELASI_CAPTAIN, TX_VEN2_108);
const TextRef choices2[] = {
TX_SPEAKER_KIRK,
TX_VEN2_015, TX_VEN2_029,
TX_END
};
choice = showMultipleTexts(choices2);
if (choice == 0) { // "We don't have it yet"
showText(TX_SPEAKER_ELASI_CAPTAIN, TX_VEN2_100);
loadActorAnim2(OBJECT_VIEWSCREEN, "s7r2u2", VIEWSCREEN_X, VIEWSCREEN_Y);
} else { // "You'll have to beam over"
showText(TX_SPEAKER_ELASI_CAPTAIN, TX_VEN2_114);
showText(TX_SPEAKER_KIRK, TX_VEN2_025);
loadActorAnim2(OBJECT_VIEWSCREEN, "s7r2u2", VIEWSCREEN_X, VIEWSCREEN_Y);
_awayMission->veng.counterUntilElasiNagToDisableShields = 1800;
_awayMission->veng.toldElasiToBeamOver = true;
}
}
} else if (choice == 1) // Hail enterprise
showText(TX_SPEAKER_SPOCK, TX_VEN2_066);
} else if (_awayMission->veng.elasiShipDecloaked) {
showText(TX_SPEAKER_SPOCK, TX_VEN2_066);
} else {
showText(TX_SPEAKER_KIRK, TX_MUD4_018);
showText(TX_SPEAKER_UHURA, TX_VEN2U093);
showText(TX_SPEAKER_KIRK, TX_VEN2_028);
}
}
void Room::veng2UseKirkOnTorpedoButton() {
if (_awayMission->veng.poweredSystem != 1)
showDescription(TX_VEN2N028);
else if (!_awayMission->veng.torpedoLoaded)
showText(TX_SPEAKER_SPOCK, TX_VEN2_058);
else if (!_awayMission->veng.elasiShieldsDown)
showText(TX_SPEAKER_SPOCK, TX_VEN2_054); // Probably unused; weapons can't be powered while elasi shields are up?
else { // Fire on the defenseless Elasi
_awayMission->disableInput = true;
walkCrewmanC(OBJECT_KIRK, 0x90, 0x95, &Room::veng2UseKirkReachedTorpedoButton);
_awayMission->crewDirectionsAfterWalk[OBJECT_KIRK] = DIR_N;
}
}
void Room::veng2UseKirkReachedTorpedoButton() {
loadActorAnimC(OBJECT_KIRK, "kusemn", -1, -1, &Room::veng2KirkFiredTorpedo);
}
void Room::veng2KirkFiredTorpedo() {
playVoc("DBLWHAM2");
loadActorAnimC(OBJECT_VIEWSCREEN, "s7r2ph", 0, 0, &Room::veng2TorpedoStruckElasiShip);
}
void Room::veng2TorpedoStruckElasiShip() {
loadActorAnim2(OBJECT_VIEWSCREEN, "s7r2p1", VIEWSCREEN_X, VIEWSCREEN_Y);
showText(TX_SPEAKER_ELASI_CAPTAIN, TX_VEN2_104);
showText(TX_SPEAKER_ELASI_WEAPONS_MASTER, TX_VEN2_F29);
showText(TX_SPEAKER_ELASI_CREWMAN, TX_VEN2_F28);
showText(TX_SPEAKER_ELASI_CAPTAIN, TX_VEN2_101);
showText(TX_SPEAKER_KIRK, TX_VEN2_014);
showText(TX_SPEAKER_ELASI_CAPTAIN, TX_VEN2_106);
loadActorAnimC(OBJECT_VIEWSCREEN, "s7r2rc", 0, 0, &Room::veng2ElasiRetreated);
}
void Room::veng2ElasiRetreated() {
showText(TX_SPEAKER_UHURA, TX_VEN2U094);
showText(TX_SPEAKER_KIRK, TX_VEN2_026);
showText(TX_SPEAKER_CHEKOV, TX_VEN2_115);
showText(TX_SPEAKER_KIRK, TX_VEN2_013);
showText(TX_SPEAKER_SCOTT, TX_VEN2_S09);
_awayMission->veng.firedTorpedo = true;
walkCrewmanC(OBJECT_KIRK, 0xec, 0x9d, &Room::veng2CrewmanInPositionToBeamOut);
walkCrewmanC(OBJECT_SPOCK, 0xd5, 0x96, &Room::veng2CrewmanInPositionToBeamOut);
walkCrewmanC(OBJECT_MCCOY, 0x101, 0x95, &Room::veng2CrewmanInPositionToBeamOut);
walkCrewmanC(OBJECT_REDSHIRT, 0xec, 0x8c, &Room::veng2CrewmanInPositionToBeamOut);
}
void Room::veng2CrewmanInPositionToBeamOut() {
if (++_roomVar.veng.numCrewmenReadyToBeamOut == 4) {
_awayMission->veng.missionScore = 16;
if (_awayMission->veng.field68)
_awayMission->veng.missionScore += 1;
if (_awayMission->veng.getPointsForHealingBrittany)
_awayMission->veng.missionScore += 1;
if (_awayMission->veng.readAllLogs)
_awayMission->veng.missionScore += 1;
if (_awayMission->veng.field6b)
_awayMission->veng.missionScore += 1;
if (_awayMission->veng.field6c)
_awayMission->veng.missionScore += 1;
endMission(_awayMission->veng.missionScore, 21, 0);
}
}
void Room::veng2UseSTricorderOnTorpedoButton() {
spockScan(DIR_N, TX_SPEAKER_SPOCK, TX_VEN2_F35); // ENHANCEMENT: Use spockScan (don't just show text)
}
void Room::veng2UseSTricorderOnMiddleConsole() {
spockScan(DIR_N, TX_SPEAKER_SPOCK, -1);
showDescription(TX_VEN2N030); // This is a narration, not Spock speaking
}
void Room::veng2UseSTricorderOnTorpedoControl() {
showText(TX_SPEAKER_KIRK, TX_VEN2_001);
spockScan(DIR_N, TX_SPEAKER_SPOCK, -1); // FIXME: delete this since Spock might not have his tricorder?
if (_awayMission->veng.poweredSystem != 1) { // No power to weapons
if (!_awayMission->veng.scannedMainComputer)
showText(TX_SPEAKER_SPOCK, TX_VEN2_062);
else
showText(TX_SPEAKER_SPOCK, TX_VEN2_064);
} else if (_awayMission->veng.tricordersPluggedIntoComputer != 3)
showText(TX_SPEAKER_SPOCK, TX_VEN2_055);
#if 0
// FIXME: Unused, since the same condition is above. Fix needed?
else if (_awayMission->veng.poweredSystem != 1)
showText(TX_SPEAKER_SPOCK, TX_VEN2_065);
#endif
else if (!_awayMission->veng.torpedoLoaded) {
showText(TX_SPEAKER_SPOCK, TX_VEN2_068);
if (!_awayMission->veng.elasiShipDecloaked)
showText(TX_SPEAKER_SPOCK, TX_VEN2_036);
else
showText(TX_SPEAKER_SPOCK, TX_VEN2_037);
_awayMission->veng.examinedTorpedoControl = true;
// TODO: consider making it easier to trigger the above flag? (using spock on it
// won't work once the elasi are there, since you can't power the system; you need
// to look at it instead.)
} else
showText(TX_SPEAKER_SPOCK, TX_VEN2_050);
}
void Room::veng2UseImpulseConsole() {
if (!_awayMission->veng.impulseEnginesOn) {
showText(TX_SPEAKER_KIRK, TX_VEN2_003);
showText(TX_SPEAKER_SPOCK, TX_VEN2_063);
} else if (_awayMission->veng.tricordersPluggedIntoComputer != 3) {
showText(TX_SPEAKER_KIRK, TX_VEN2_003);
showText(TX_SPEAKER_SPOCK, TX_VEN2_057);
} else {
_awayMission->disableInput = true;
walkCrewmanC(OBJECT_SPOCK, 0x22, 0x9b, &Room::veng2SpockReachedImpulseConsole);
}
}
void Room::veng2SpockReachedImpulseConsole() {
loadActorAnimC(OBJECT_SPOCK, "susemn", -1, -1, &Room::veng2SpockUsedImpulseConsole);
}
void Room::veng2PowerWeapons() {
if (_awayMission->veng.poweredSystem == 2) {
playVoc("LD6BMOFF");
loadActorAnim2(OBJECT_DAMAGE_DISPLAY_1, "s7r2sh3", DAMAGE_DISPLAY_1_X, DAMAGE_DISPLAY_1_Y);
}
_awayMission->veng.poweredSystem = 1;
showText(TX_SPEAKER_KIJE, TX_VEN2_088);
if (_awayMission->veng.toldElasiToBeamOver) {
showText(TX_SPEAKER_SPOCK, TX_VEN2_052);
_awayMission->veng.elasiShieldsDown = true;
_awayMission->veng.counterUntilElasiBoardWithInvitation = 900;
}
if (_awayMission->veng.elasiShipDecloaked && !_awayMission->veng.elasiHailedRepublic) {
showText(TX_SPEAKER_SPOCK, TX_VEN2_033);
_awayMission->veng.counterUntilElasiBoardWithShieldsDown = 1800;
}
}
void Room::veng2SpockUsedImpulseConsole() {
_awayMission->disableInput = false;
showText(TX_SPEAKER_SPOCK, TX_VEN2_069);
// Choose where to transfer power
const TextRef choices[] = {
TX_EMPTY,
TX_VEN2_WEA, TX_VEN2_SHI, TX_VEN2_TRA,
TX_END
};
int choice = showMultipleTexts(choices);
if (choice == 0) { // Weapons
if (_awayMission->veng.toldElasiToBeamOver)
veng2PowerWeapons();
else if (_awayMission->veng.countdownStarted)
showText(TX_SPEAKER_SPOCK, TX_VEN2_035);
else if (_awayMission->veng.poweredSystem == 1) // Weapons already powered
showText(TX_SPEAKER_KIJE, TX_VEN2_091);
else
veng2PowerWeapons();
} else if (choice == 1) { // Shields
if (_awayMission->veng.poweredSystem == 2) // Shields already powered
showText(TX_SPEAKER_KIJE, TX_VEN2_089);
else if (_awayMission->veng.toldElasiToBeamOver)
showText(TX_SPEAKER_KIJE, TX_VEN2_085);
else {
loadActorAnim2(OBJECT_DAMAGE_DISPLAY_1, "s7r2sh", DAMAGE_DISPLAY_1_X, DAMAGE_DISPLAY_1_Y);
_awayMission->veng.poweredSystem = 2;
if (_awayMission->veng.elasiShipDecloaked)
_awayMission->timers[2] = 45; // Timer until the elasi hail the ship
showText(TX_SPEAKER_KIJE, TX_VEN2_092);
}
} else if (choice == 2) { // Transporter
if (_awayMission->veng.countdownStarted) {
showText(TX_SPEAKER_SPOCK, TX_VEN2_034);
if (_awayMission->veng.havePowerPack) {
showText(TX_SPEAKER_KIRK, TX_VEN2_018);
showText(TX_SPEAKER_SPOCK, TX_VEN2_077);
}
} else if (_awayMission->veng.poweredSystem == 3) // Transporter already powered
showText(TX_SPEAKER_KIJE, TX_VEN2_090); // BUGFIX: audio didn't play properly
else {
if (_awayMission->veng.poweredSystem == 2) {
playVoc("LD6BMOFF"); // ENHANCEMENT: make this consistent with the weapons code
loadActorAnim2(OBJECT_DAMAGE_DISPLAY_1, "s7r2sh3", DAMAGE_DISPLAY_1_X, DAMAGE_DISPLAY_1_Y);
}
_awayMission->veng.poweredSystem = 3;
showText(TX_SPEAKER_KIJE, TX_VEN2_087);
if (_awayMission->veng.elasiShipDecloaked && !_awayMission->veng.elasiHailedRepublic) {
showText(TX_SPEAKER_SPOCK, TX_VEN2_071);
_awayMission->veng.counterUntilElasiBoardWithShieldsDown = 1800;
}
}
}
}
void Room::veng2UseMainComputer() {
showText(TX_SPEAKER_KIRK, TX_VEN2_002);
if (_awayMission->veng.tricordersPluggedIntoComputer != 3) {
spockScan(DIR_W, TX_SPEAKER_SPOCK, TX_VEN2_079);
showText(TX_SPEAKER_KIRK, TX_VEN2_024);
showText(TX_SPEAKER_SPOCK, TX_VEN2_080);
showText(TX_SPEAKER_MCCOY, TX_VEN2_045);
showText(TX_SPEAKER_SPOCK, TX_VEN2_074);
showText(TX_SPEAKER_KIJE, TX_VEN2_096);
_awayMission->veng.scannedMainComputer = true;
} else
showText(TX_SPEAKER_SPOCK, TX_VEN2_059);
}
void Room::veng2UseSTricorderOnMainComputer() {
if (!_awayMission->veng.scannedMainComputer)
veng2UseMainComputer();
else if (!_awayMission->veng.impulseEnginesOn)
showText(TX_SPEAKER_SPOCK, TX_VEN2_031);
else {
_awayMission->disableInput = true;
walkCrewmanC(OBJECT_SPOCK, 0x52, 0x84, &Room::veng2SpockReachedMainComputerToPutTricorder);
}
}
void Room::veng2SpockReachedMainComputerToPutTricorder() {
loadActorAnimC(OBJECT_SPOCK, "susemn", -1, -1, &Room::veng2AttachedSTricorderToComputer);
}
void Room::veng2AttachedSTricorderToComputer() {
playVoc("MUR4E1");
_awayMission->disableInput = false;
if (_awayMission->veng.tricordersPluggedIntoComputer != 1) // Mccoy's isn't in yet
_awayMission->veng.tricordersPluggedIntoComputer = 2;
else {
_awayMission->veng.tricordersPluggedIntoComputer = 3;
_awayMission->timers[0] = 40; // Timer until Elasi appear
}
loseItem(OBJECT_ISTRICOR);
loadActorAnim2(OBJECT_STRICORDER, "s7r2t1", STRICORDER_POS_X, STRICORDER_POS_Y);
showDescription(TX_VEN2N017);
walkCrewman(OBJECT_SPOCK, 0x5f, 0xaa);
if (_awayMission->veng.tricordersPluggedIntoComputer == 3) // Both tricorders plugged in
veng2BothTricordersPluggedIn();
}
void Room::veng2UseMTricorderOnMainComputer() {
if (!_awayMission->veng.impulseEnginesOn)
showText(TX_SPEAKER_MCCOY, TX_VEN2_038);
else {
_awayMission->disableInput = true;
walkCrewmanC(OBJECT_SPOCK, 0x52, 0x84, &Room::veng2MccoyReachedMainComputerToPutTricorder);
}
}
void Room::veng2MccoyReachedMainComputerToPutTricorder() {
loadActorAnimC(OBJECT_SPOCK, "susemn", -1, -1, &Room::veng2AttachedMTricorderToComputer);
}
void Room::veng2AttachedMTricorderToComputer() {
playVoc("MUR4E1");
_awayMission->disableInput = false;
if (_awayMission->veng.tricordersPluggedIntoComputer != 2) // Spock's isn't in yet
_awayMission->veng.tricordersPluggedIntoComputer = 1;
else {
_awayMission->veng.tricordersPluggedIntoComputer = 3;
_awayMission->timers[0] = 40; // Timer until Elasi appear
}
loseItem(OBJECT_IMTRICOR);
loadActorAnim2(OBJECT_MTRICORDER, "s7r2t2", MTRICORDER_POS_X, MTRICORDER_POS_Y);
showDescription(TX_VEN2N016);
walkCrewman(OBJECT_SPOCK, 0x5f, 0xaa);
if (_awayMission->veng.tricordersPluggedIntoComputer == 3) // Both tricorders plugged in
veng2BothTricordersPluggedIn();
}
void Room::veng2BothTricordersPluggedIn() {
loadActorAnim2(OBJECT_MAIN_COMPUTER, "s7r2t3", MAIN_COMPUTER_X, MAIN_COMPUTER_Y);
showText(TX_SPEAKER_SPOCK, TX_VEN2_030);
}
void Room::veng2UseSTricorderOnDeckIOConsole() {
spockScan(DIR_E, TX_SPEAKER_SPOCK, TX_VEN2_067);
}
void Room::veng2UseSTricorderOnImpulseConsole() {
if (!_awayMission->veng.impulseEnginesOn)
spockScan(DIR_W, TX_SPEAKER_SPOCK, TX_VEN2_056);
else
spockScan(DIR_W, TX_SPEAKER_SPOCK, TX_VEN2_051);
}
void Room::veng2UseFusionPackOnMainComputer() {
showText(TX_SPEAKER_SPOCK, TX_VEN2_060);
}
void Room::veng2GetLogDeck() {
walkCrewmanC(OBJECT_KIRK, 0xe7, 0x93, &Room::veng2ReachedLogDeck);
_awayMission->disableInput = true;
}
void Room::veng2ReachedLogDeck() {
loadActorAnimC(OBJECT_KIRK, "kuseln", -1, -1, &Room::veng2PickedUpLogDeck);
}
void Room::veng2PickedUpLogDeck() {
loadActorStandAnim(OBJECT_DECK);
_awayMission->disableInput = false;
_awayMission->veng.tookRecordDeckFromAuxilaryControl = true;
showDescription(TX_VEN2N039);
giveItem(OBJECT_IDECK);
}
void Room::veng2GetSTricorder() {
if (_awayMission->veng.countdownStarted)
showText(TX_SPEAKER_SPOCK, TX_VEN2_047);
else {
_awayMission->disableInput = true;
walkCrewmanC(OBJECT_SPOCK, 0x52, 0x84, &Room::veng2ReachedSTricorderToGet);
}
}
void Room::veng2ReachedSTricorderToGet() {
loadActorAnimC(OBJECT_SPOCK, "susemn", -1, -1, &Room::veng2PickedUpSTricorder);
}
void Room::veng2PickedUpSTricorder() {
_awayMission->disableInput = false;
_awayMission->veng.tricordersPluggedIntoComputer &= ~2;
giveItem(OBJECT_ISTRICOR);
loadActorStandAnim(OBJECT_STRICORDER);
loadActorStandAnim(OBJECT_MAIN_COMPUTER);
walkCrewman(OBJECT_SPOCK, 0x5f, 0xaa);
showDescription(TX_VEN2N015);
}
void Room::veng2GetMTricorder() {
if (_awayMission->veng.countdownStarted)
showText(TX_SPEAKER_SPOCK, TX_VEN2_047);
else {
_awayMission->disableInput = true;
walkCrewmanC(OBJECT_SPOCK, 0x52, 0x84, &Room::veng2ReachedMTricorderToGet);
}
}
void Room::veng2ReachedMTricorderToGet() {
loadActorAnimC(OBJECT_SPOCK, "susemn", -1, -1, &Room::veng2PickedUpMTricorder);
}
void Room::veng2PickedUpMTricorder() {
_awayMission->disableInput = false;
_awayMission->veng.tricordersPluggedIntoComputer &= ~1;
giveItem(OBJECT_IMTRICOR);
loadActorStandAnim(OBJECT_MTRICORDER);
loadActorStandAnim(OBJECT_MAIN_COMPUTER);
walkCrewman(OBJECT_SPOCK, 0x5f, 0xaa);
showDescription(TX_VEN2N013);
}
}