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

639 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"
namespace StarTrek {
extern const RoomAction tug0ActionList[] = {
{ {ACTION_TICK, 1, 0, 0, 0}, &Room::tug0Tick1 },
{ {ACTION_LOOK, 8, 0, 0, 0}, &Room::tug0LookAtEngineer },
{ {ACTION_GET, 8, 0, 0, 0}, &Room::tug0GetEngineer },
{ {ACTION_LOOK, 11, 0, 0, 0}, &Room::tug0LookAtControls },
{ {ACTION_LOOK, 0x21, 0, 0, 0}, &Room::tug0LookAtControls },
{ {ACTION_USE, OBJECT_SPOCK, 0x21, 0, 0}, &Room::tug0UseSpockOnControls },
{ {ACTION_FINISHED_WALKING, 16, 0, 0, 0}, &Room::tug0SpockReachedControlsToExamine },
{ {ACTION_FINISHED_ANIMATION, 17, 0, 0, 0}, &Room::tug0SpockExaminedControls },
{ {ACTION_USE, OBJECT_IRT, 0x21, 0, 0}, &Room::tug0UseTransmogrifierWithoutBitOnControls },
{ {ACTION_USE, OBJECT_IRTWB, 0x21, 0, 0}, &Room::tug0UseTransmogrifierWithBitOnControls },
{ {ACTION_FINISHED_WALKING, 6, 0, 0, 0}, &Room::tug0SpockReachedControlsWithTransmogrifier },
{ {ACTION_FINISHED_ANIMATION, 7, 0, 0, 0}, &Room::tug0SpockFinishedUsingTransmogrifier },
{ {ACTION_FINISHED_ANIMATION, 22, 0, 0, 0}, &Room::tug0TransporterScreenFullyLit },
{ {ACTION_USE, OBJECT_IWIRSCRP, 0x21, 0, 0}, &Room::tug0UseWireScrapsOnControls },
{ {ACTION_USE, OBJECT_IWIRING, 0x21, 0, 0}, &Room::tug0UseWireOnControls },
{ {ACTION_FINISHED_WALKING, 8, 0, 0, 0}, &Room::tug0SpockReachedControlsWithWire },
{ {ACTION_FINISHED_ANIMATION, 9, 0, 0, 0}, &Room::tug0SpockFinishedUsingWire },
{ {ACTION_USE, OBJECT_IMEDKIT, 8, 0, 0}, &Room::tug0UseMedkitOnEngineer },
{ {ACTION_FINISHED_WALKING, 2, 0, 0, 0}, &Room::tug0MccoyReachedEngineer },
{ {ACTION_FINISHED_ANIMATION, 13, 0, 0, 0}, &Room::tug0MccoyHealedEngineer },
{ {ACTION_FINISHED_ANIMATION, 1, 0, 0, 0}, &Room::tug0EngineerGotUp },
{ {ACTION_GET, 9, 0, 0, 0}, &Room::tug0GetTransmogrifier },
{ {ACTION_FINISHED_WALKING, 3, 0, 0, 0}, &Room::tug0KirkReachedToolbox },
{ {ACTION_FINISHED_ANIMATION, 4, 0, 0, 0}, &Room::tug0KirkGotTransmogrifier },
{ {ACTION_LOOK, 9, 0, 0, 0}, &Room::tug0LookAtToolbox },
{ {ACTION_USE, OBJECT_IPHASERS, OBJECT_IPWE, 0, 0}, &Room::tug0UsePhaserOnWelder },
{ {ACTION_USE, OBJECT_IPHASERK, OBJECT_IPWE, 0, 0}, &Room::tug0UsePhaserOnWelder },
{ {ACTION_USE, OBJECT_IPWF, OBJECT_IWIRSCRP, 0, 0}, &Room::tug0UseWelderOnWireScraps },
{ {ACTION_USE, OBJECT_IPWF, OBJECT_IJNKMETL, 0, 0}, &Room::tug0UseWelderOnMetalScraps },
{ {ACTION_USE, OBJECT_ICOMBBIT, OBJECT_IRT, 0, 0}, &Room::tug0UseCombBitOnTransmogrifier },
{ {ACTION_USE, OBJECT_SPOCK, 11, 0, 0}, &Room::tug0UseTransporter },
{ {ACTION_USE, OBJECT_KIRK, 0x22, 0, 0}, &Room::tug0UseTransporter },
{ {ACTION_FINISHED_WALKING, 14, 0, 0, 0}, &Room::tug0SpockReachedControlsToTransport },
{ {ACTION_FINISHED_ANIMATION, 18, 0, 0, 0}, &Room::tug0SpockPreparedTransporter },
{ {ACTION_FINISHED_WALKING, 20, 0, 0, 0}, &Room::tug0SpockReachedTransporter },
{ {ACTION_FINISHED_ANIMATION, 21, 0, 0, 0}, &Room::tug0FinishedTransporting },
{ {ACTION_USE, OBJECT_IBOMB, 0x22, 0, 0}, &Room::tug0UseBombOnTransporter },
{ {ACTION_FINISHED_WALKING, 5, 0, 0, 0}, &Room::tug0KirkReachedTransporter },
{ {ACTION_FINISHED_ANIMATION, 10, 0, 0, 0}, &Room::tug0KirkPlacedBomb },
{ {ACTION_FINISHED_WALKING, 15, 0, 0, 0}, &Room::tug0SpockReachedControlsForBomb },
{ {ACTION_FINISHED_ANIMATION, 19, 0, 0, 0}, &Room::tug0SpockBeginsBeamingBomb },
{ {ACTION_FINISHED_ANIMATION, 12, 0, 0, 0}, &Room::tug0SpockFinishesBeamingBomb },
{ {ACTION_TIMER_EXPIRED, 0, 0, 0, 0}, &Room::tug0BombExploded },
{ {ACTION_USE, OBJECT_MCCOY, 0x21, 0, 0}, &Room::tug0UseMTricorderOnControls },
{ {ACTION_USE, OBJECT_IMTRICOR, 0x21, 0, 0}, &Room::tug0UseMTricorderOnControls },
{ {ACTION_USE, OBJECT_ISTRICOR, 0x21, 0, 0}, &Room::tug0UseSTricorderOnControls },
{ {ACTION_USE, OBJECT_IMTRICOR, 8, 0, 0}, &Room::tug0UseMTricorderOnEngineer },
{ {ACTION_FINISHED_WALKING, 24, 0, 0, 0}, &Room::tug0MccoyReachedEngineerToScan },
{ {ACTION_FINISHED_ANIMATION, 25, 0, 0, 0}, &Room::tug0MccoyFinishedScanningEngineer },
{ {ACTION_USE, OBJECT_SPOCK, 8, 0, 0}, &Room::tug0UseSTricorderOnEngineer },
{ {ACTION_USE, OBJECT_ISTRICOR, 8, 0, 0}, &Room::tug0UseSTricorderOnEngineer },
{ {ACTION_WALK, 0x23, 0, 0, 0}, &Room::tug0WalkToDoor },
{ {ACTION_LOOK, OBJECT_KIRK, 0, 0, 0}, &Room::tug0LookAtKirk },
{ {ACTION_LOOK, OBJECT_SPOCK, 0, 0, 0}, &Room::tug0LookAtSpock },
{ {ACTION_LOOK, OBJECT_MCCOY, 0, 0, 0}, &Room::tug0LookAtMccoy },
{ {ACTION_LOOK, OBJECT_REDSHIRT, 0, 0, 0}, &Room::tug0LookAtRedshirt },
{ {ACTION_LOOK, 0x22, 0, 0, 0}, &Room::tug0LookAtTransporter },
{ {ACTION_LOOK, 0x23, 0, 0, 0}, &Room::tug0LookAtDoor },
{ {ACTION_TALK, OBJECT_KIRK, 0, 0, 0}, &Room::tug0TalkToKirk },
{ {ACTION_TALK, OBJECT_MCCOY, 0, 0, 0}, &Room::tug0TalkToMccoy },
{ {ACTION_TALK, OBJECT_SPOCK, 0, 0, 0}, &Room::tug0TalkToSpock },
{ {ACTION_TALK, OBJECT_REDSHIRT, 0, 0, 0}, &Room::tug0TalkToRedshirt },
{ {ACTION_TALK, 8, 0, 0, 0}, &Room::tug0TalkToEngineer },
{ {ACTION_USE, OBJECT_ICOMM, 0, 0, 0}, &Room::tug0UseCommunicator },
{ {ACTION_LOOK, 0xff, 0, 0, 0}, &Room::tug0LookAnywhere },
{ {ACTION_USE, OBJECT_ISTRICOR, 0xff, 0, 0}, &Room::tug0UseSTricorderAnywhere },
{ {ACTION_USE, OBJECT_IMTRICOR, 0xff, 0, 0}, &Room::tug0UseMTricorderAnywhere },
{ {ACTION_LIST_END, 0, 0, 0, 0}, nullptr }
};
enum tug0TextIds {
TX_SPEAKER_KIRK, TX_SPEAKER_MCCOY, TX_SPEAKER_SPOCK, TX_SPEAKER_CHRISTENSEN, TX_SPEAKER_SIMPSON,
TX_SPEAKER_STARFLEET, TX_SPEAKER_SCOTT,
TX_TUG0_001, TX_TUG0_002, TX_TUG0_003, TX_TUG0_004, TX_TUG0_005,
TX_TUG0_006, TX_TUG0_007, TX_TUG0_008, TX_TUG0_009, TX_TUG0_010,
TX_TUG0_011, TX_TUG0_012, TX_TUG0_013, TX_TUG0_014, TX_TUG0_015,
TX_TUG0_016, TX_TUG0_017, TX_TUG0_018, TX_TUG0_019, TX_TUG0_020,
TX_TUG0_021, TX_TUG0_022, TX_TUG0_023, TX_TUG0_024, TX_TUG0_025,
TX_TUG0_026, TX_TUG0_027, TX_TUG0_028, TX_TUG0_029, TX_TUG0_030,
TX_TUG0_031, TX_TUG0_032, TX_TUG0_033, TX_TUG0_034, TX_TUG0_035,
TX_TUG0_036, TX_TUG0_037, TX_TUG0_038, TX_TUG0_039, TX_TUG0_040,
TX_TUG0_041, TX_TUG0_042, TX_TUG0_043, TX_TUG0_F30, TX_TUG0_F31,
TX_TUG0_S06, TX_TUG0_S11, TX_TUG0L006, TX_TUG0L008, TX_TUG0L009,
TX_TUG0L010, TX_TUG0N000, TX_TUG0N001, TX_TUG0N002, TX_TUG0N003,
TX_TUG0N004, TX_TUG0N005, TX_TUG0N006, TX_TUG0N007, TX_TUG0N008,
TX_TUG0N009, TX_TUG0N010, TX_TUG0N011, TX_TUG0N012, TX_TUG0N013,
TX_TUG0N014
};
// TODO: Finish floppy offsets
extern const RoomTextOffsets tug0TextOffsets[] = {
{ TX_SPEAKER_KIRK, 9896, 0, 0, 0 },
{ TX_SPEAKER_MCCOY, 9907, 0, 0, 0 },
{ TX_SPEAKER_SPOCK, 9917, 0, 0, 0 },
{ TX_SPEAKER_CHRISTENSEN, 9927, 0, 0, 0 },
{ TX_SPEAKER_SIMPSON, 9943, 0, 0, 0 },
{ TX_SPEAKER_STARFLEET, 9959, 0, 0, 0 },
{ TX_SPEAKER_SCOTT, 9969, 0, 0, 0 },
{ TX_TUG0_001, 5358, 0, 0, 0 },
{ TX_TUG0_002, 2807, 0, 0, 0 },
{ TX_TUG0_003, 6532, 0, 0, 0 },
{ TX_TUG0_004, 6423, 0, 0, 0 },
{ TX_TUG0_005, 1215, 0, 0, 0 },
{ TX_TUG0_006, 8042, 0, 0, 0 },
{ TX_TUG0_007, 8362, 0, 0, 0 },
{ TX_TUG0_008, 1709, 0, 0, 0 },
{ TX_TUG0_009, 8667, 0, 0, 0 },
{ TX_TUG0_010, 2557, 0, 0, 0 },
{ TX_TUG0_011, 8189, 0, 0, 0 },
{ TX_TUG0_012, 9064, 0, 0, 0 },
{ TX_TUG0_013, 1403, 0, 0, 0 },
{ TX_TUG0_014, 1819, 0, 0, 0 },
{ TX_TUG0_015, 6862, 0, 0, 0 },
{ TX_TUG0_016, 6731, 0, 0, 0 },
{ TX_TUG0_017, 7106, 0, 0, 0 },
{ TX_TUG0_018, 7218, 0, 0, 0 },
{ TX_TUG0_019, 737, 0, 0, 0 },
{ TX_TUG0_020, 9705, 0, 0, 0 },
{ TX_TUG0_021, 3364, 0, 0, 0 },
{ TX_TUG0_022, 2612, 0, 0, 0 },
{ TX_TUG0_023, 6104, 0, 0, 0 },
{ TX_TUG0_024, 8445, 0, 0, 0 },
{ TX_TUG0_025, 8270, 0, 0, 0 },
{ TX_TUG0_026, 8961, 0, 0, 0 },
{ TX_TUG0_027, 6365, 0, 0, 0 },
{ TX_TUG0_028, 9470, 0, 0, 0 },
{ TX_TUG0_029, 1998, 0, 0, 0 },
{ TX_TUG0_030, 7391, 0, 0, 0 },
{ TX_TUG0_031, 9154, 0, 0, 0 },
{ TX_TUG0_032, 4852, 0, 0, 0 },
{ TX_TUG0_033, 3574, 0, 0, 0 },
{ TX_TUG0_034, 2228, 0, 0, 0 },
{ TX_TUG0_035, 5025, 0, 0, 0 },
{ TX_TUG0_036, 8121, 0, 0, 0 },
{ TX_TUG0_037, 6227, 0, 0, 0 },
{ TX_TUG0_038, 1564, 0, 0, 0 },
{ TX_TUG0_039, 2460, 0, 0, 0 },
{ TX_TUG0_040, 1136, 0, 0, 0 },
{ TX_TUG0_041, 3485, 0, 0, 0 },
{ TX_TUG0_042, 8510, 0, 0, 0 },
{ TX_TUG0_043, 1270, 0, 0, 0 },
{ TX_TUG0_F30, 8856, 0, 0, 0 },
{ TX_TUG0_F31, 3874, 0, 0, 0 },
{ TX_TUG0_S06, 6579, 0, 0, 0 },
{ TX_TUG0_S11, 6483, 0, 0, 0 },
{ TX_TUG0L006, 8741, 0, 0, 0 },
{ TX_TUG0L008, 3031, 0, 0, 0 },
{ TX_TUG0L009, 2860, 0, 0, 0 },
{ TX_TUG0L010, 3180, 0, 0, 0 },
{ TX_TUG0N000, 4358, 0, 0, 0 },
{ TX_TUG0N001, 944, 0, 0, 0 },
{ TX_TUG0N002, 581, 0, 0, 0 },
{ TX_TUG0N003, 7518, 0, 0, 0 },
{ TX_TUG0N004, 7787, 0, 0, 0 },
{ TX_TUG0N005, 7694, 0, 0, 0 },
{ TX_TUG0N006, 4643, 0, 0, 0 },
{ TX_TUG0N007, 7594, 0, 0, 0 },
{ TX_TUG0N008, 4556, 0, 0, 0 },
{ TX_TUG0N009, 9325, 0, 0, 0 },
{ TX_TUG0N010, 4706, 0, 0, 0 },
{ TX_TUG0N011, 7938, 0, 0, 0 },
{ TX_TUG0N012, 823, 0, 0, 0 },
{ TX_TUG0N013, 7857, 0, 0, 0 },
{ TX_TUG0N014, 625, 0, 0, 0 },
{ -1, 0, 0, 0, 0 }
};
extern const RoomText tug0Texts[] = {
{ -1, Common::UNK_LANG, "" }
};
void Room::tug0Tick1() {
playVoc("TUG0LOOP");
playMidiMusicTracks(MIDITRACK_0);
_awayMission->tug.field2b = 0x23;
if (_awayMission->tug.transporterRepaired)
loadActorAnim2(11, "t0con2", 0x105, 0xc2, 0);
if (!_awayMission->tug.engineerConscious)
loadActorAnim2(8, "tcdown", 0x27, 0xa8, 0);
else {
loadActorAnim2(8, "tcupd", 0x27, 0xa8, 0);
if (_awayMission->tug.gotTransmogrifier)
loadActorAnim2(9, "pempty", 0x27, 0xa9, 0);
else {
loadActorAnim2(9, "popend", 0x27, 0xa9, 0);
playVoc("MUR4E6S");
}
}
}
void Room::tug0LookAtEngineer() {
if (_awayMission->tug.engineerConscious)
showDescription(TX_TUG0N002);
else
showDescription(TX_TUG0N014);
}
void Room::tug0GetEngineer() {
showText(TX_SPEAKER_MCCOY, TX_TUG0_019);
}
void Room::tug0LookAtControls() {
if (_awayMission->tug.transporterRepaired)
showDescription(TX_TUG0N012);
else
showDescription(TX_TUG0N001);
}
void Room::tug0UseSpockOnControls() {
_awayMission->disableInput = true;
_awayMission->crewDirectionsAfterWalk[OBJECT_SPOCK] = DIR_E;
walkCrewman(OBJECT_SPOCK, 0xdb, 0xc5, 16);
}
void Room::tug0SpockReachedControlsToExamine() {
loadActorAnim2(OBJECT_SPOCK, "sscane", -1, -1, 17);
playSoundEffectIndex(kSfxTricorder);
}
void Room::tug0SpockExaminedControls() {
showText(TX_SPEAKER_SPOCK, TX_TUG0_040);
showText(TX_SPEAKER_KIRK, TX_TUG0_005);
showText(TX_SPEAKER_SPOCK, TX_TUG0_043);
showText(TX_SPEAKER_KIRK, TX_TUG0_013);
showText(TX_SPEAKER_SPOCK, TX_TUG0_038);
showText(TX_SPEAKER_KIRK, TX_TUG0_008);
_awayMission->tug.spockExaminedTransporter = true;
_awayMission->disableInput = false;
}
void Room::tug0UseTransmogrifierWithoutBitOnControls() {
showText(TX_SPEAKER_SPOCK, TX_TUG0_014);
}
void Room::tug0UseTransmogrifierWithBitOnControls() {
_awayMission->disableInput = true;
_awayMission->crewDirectionsAfterWalk[OBJECT_SPOCK] = DIR_E;
walkCrewman(OBJECT_SPOCK, 0xdb, 0xc5, 6);
}
void Room::tug0SpockReachedControlsWithTransmogrifier() {
showText(TX_SPEAKER_SPOCK, TX_TUG0_029);
loadActorAnim2(OBJECT_SPOCK, "susehn", -1, -1, 7);
}
void Room::tug0SpockFinishedUsingTransmogrifier() {
loseItem(OBJECT_IRTWB);
_awayMission->tug.usedTransmogrifierOnTransporter = true;
_awayMission->disableInput = false;
_awayMission->tug.missionScore++;
}
void Room::tug0TransporterScreenFullyLit() {
loadActorAnim2(11, "t0con2", 0x105, 0xc2, 0);
}
void Room::tug0UseWireScrapsOnControls() {
if (_awayMission->tug.usedTransmogrifierOnTransporter)
showText(TX_SPEAKER_SPOCK, TX_TUG0_034);
}
void Room::tug0UseWireOnControls() {
if (_awayMission->tug.usedTransmogrifierOnTransporter) {
_awayMission->disableInput = true;
_awayMission->crewDirectionsAfterWalk[OBJECT_SPOCK] = DIR_E;
walkCrewman(OBJECT_SPOCK, 0xdb, 0xc5, 8);
}
}
void Room::tug0SpockReachedControlsWithWire() {
loadActorAnim2(OBJECT_SPOCK, "susehn", -1, -1, 9);
}
void Room::tug0SpockFinishedUsingWire() {
_awayMission->disableInput = false;
loseItem(OBJECT_IWIRING);
_awayMission->tug.missionScore++;
loadActorAnim2(11, "t0con1", 0x105, 0xc2, 22);
showText(TX_SPEAKER_SPOCK, TX_TUG0_039);
_awayMission->tug.transporterRepaired = true;
showText(TX_SPEAKER_KIRK, TX_TUG0_010);
showText(TX_SPEAKER_MCCOY, TX_TUG0_022);
// BUGFIX: check if the redshirt is dead.
if (!_awayMission->redshirtDead) {
showText(TX_SPEAKER_KIRK, TX_TUG0_002);
showText(TX_SPEAKER_CHRISTENSEN, TX_TUG0L009);
showText(TX_SPEAKER_CHRISTENSEN, TX_TUG0L008);
if (_awayMission->tug.haveBomb) {
showText(TX_SPEAKER_CHRISTENSEN, TX_TUG0L010);
showText(TX_SPEAKER_MCCOY, TX_TUG0_021);
showText(TX_SPEAKER_SPOCK, TX_TUG0_041);
}
}
}
void Room::tug0UseMedkitOnEngineer() {
if (_awayMission->tug.engineerConscious)
return;
_awayMission->disableInput = true;
_awayMission->crewDirectionsAfterWalk[OBJECT_MCCOY] = DIR_N;
walkCrewman(OBJECT_MCCOY, 0x2d, 0xaf, 2);
}
void Room::tug0MccoyReachedEngineer() {
loadActorAnim2(OBJECT_MCCOY, "museln", -1, -1, 13);
}
void Room::tug0MccoyHealedEngineer() {
loadActorAnim2(8, "tcup", 0x27, 0xa8, 1);
_awayMission->crewDirectionsAfterWalk[OBJECT_MCCOY] = DIR_E;
walkCrewman(OBJECT_MCCOY, 0x41, 0xaf, 0);
_awayMission->disableInput = false;
_awayMission->tug.missionScore++;
}
void Room::tug0EngineerGotUp() {
showText(TX_SPEAKER_SIMPSON, TX_TUG0_F31);
_awayMission->tug.engineerConscious = true;
loadActorAnim2(8, "tcshow", 0x27, 0xa8, 0);
loadActorAnim2(9, "popen", 0x27, 0xa9, 0);
playVoc("MUR4E6S");
}
void Room::tug0GetTransmogrifier() {
if (_awayMission->tug.gotTransmogrifier)
return;
_awayMission->disableInput = true;
walkCrewman(OBJECT_KIRK, 0x1e, 0xb1, 3);
}
void Room::tug0KirkReachedToolbox() {
loadActorAnim2(OBJECT_KIRK, "kuselw", -1, -1, 4);
}
void Room::tug0KirkGotTransmogrifier() {
_awayMission->tug.gotTransmogrifier = true;
giveItem(OBJECT_IRT);
loadActorAnim2(9, "pempty", 0x27, 0xa9, 0);
loadActorStandAnim(OBJECT_KIRK);
_awayMission->disableInput = false;
_awayMission->tug.missionScore++;
}
void Room::tug0LookAtToolbox() {
if (_awayMission->tug.gotTransmogrifier)
showDescription(TX_TUG0N008);
else
showDescription(TX_TUG0N000);
}
void Room::tug0UsePhaserOnWelder() {
loseItem(OBJECT_IPWE);
giveItem(OBJECT_IPWF);
showDescription(TX_TUG0N006);
// BUGFIX: this following line didn't exist, despite it existing in TUG1; meaning this
// was supposed to give points, but it only did in a specific room.
_awayMission->tug.missionScore += 3;
}
void Room::tug0UseWelderOnWireScraps() {
showDescription(TX_TUG0N010);
loseItem(OBJECT_IWIRSCRP);
}
void Room::tug0UseWelderOnMetalScraps() {
showText(TX_SPEAKER_SPOCK, TX_TUG0_032);
loseItem(OBJECT_IJNKMETL);
giveItem(OBJECT_ICOMBBIT);
}
void Room::tug0UseCombBitOnTransmogrifier() {
showText(TX_SPEAKER_SPOCK, TX_TUG0_035);
loseItem(OBJECT_ICOMBBIT);
loseItem(OBJECT_IRT);
giveItem(OBJECT_IRTWB);
}
void Room::tug0UseTransporter() {
if (!_awayMission->tug.transporterRepaired)
return;
_awayMission->disableInput = true;
_awayMission->crewDirectionsAfterWalk[OBJECT_KIRK] = DIR_S;
walkCrewman(OBJECT_KIRK, 0x62, 0x7f, 0);
_awayMission->crewDirectionsAfterWalk[OBJECT_SPOCK] = DIR_W;
walkCrewman(OBJECT_SPOCK, 0x11e, 0xc7, 14);
_awayMission->crewDirectionsAfterWalk[OBJECT_MCCOY] = DIR_S;
walkCrewman(OBJECT_MCCOY, 0x7b, 0x7a, 0);
_awayMission->crewDirectionsAfterWalk[OBJECT_REDSHIRT] = DIR_S;
walkCrewman(OBJECT_REDSHIRT, 0x4a, 0x7b, 0);
}
void Room::tug0SpockReachedControlsToTransport() {
loadActorAnim2(OBJECT_SPOCK, "susehw", -1, -1, 18);
playSoundEffectIndex(kSfxButton);
playSoundEffectIndex(kSfxTransporterEnergize);
}
void Room::tug0SpockPreparedTransporter() {
showText(TX_SPEAKER_KIRK, TX_TUG0_001);
_awayMission->crewDirectionsAfterWalk[OBJECT_SPOCK] = DIR_S;
walkCrewman(OBJECT_SPOCK, 0x9a, 0x7e, 20);
}
void Room::tug0SpockReachedTransporter() {
playSoundEffectIndex(kSfxTransporterDematerialize);
loadActorAnim2(OBJECT_KIRK, "kteled", -1, -1, 21);
loadActorAnim2(OBJECT_SPOCK, "steled", -1, -1, 0);
loadActorAnim2(OBJECT_MCCOY, "mteled", -1, -1, 0);
loadActorAnim2(OBJECT_REDSHIRT, "rteled", -1, -1, 0);
}
void Room::tug0FinishedTransporting() {
_awayMission->tug.missionScore += 3;
_awayMission->disableInput = true;
loadRoomIndex(3, 4);
}
void Room::tug0UseBombOnTransporter() {
_awayMission->disableInput = true;
walkCrewman(OBJECT_KIRK, 0x62, 0x7f, 5);
_awayMission->crewDirectionsAfterWalk[OBJECT_MCCOY] = DIR_N;
walkCrewman(OBJECT_MCCOY, 0x46, 0xbe, 0);
_awayMission->crewDirectionsAfterWalk[OBJECT_REDSHIRT] = DIR_N;
walkCrewman(OBJECT_REDSHIRT, 0x78, 0xbe, 0);
}
void Room::tug0KirkReachedTransporter() {
loadActorAnim2(OBJECT_KIRK, "kpickw", -1, -1, 10);
}
void Room::tug0KirkPlacedBomb() {
loseItem(OBJECT_IBOMB);
loadActorAnim2(10, "bomb1", 0x5a, 0x7f, 0);
_awayMission->crewDirectionsAfterWalk[OBJECT_KIRK] = DIR_N;
walkCrewman(OBJECT_KIRK, 0xc8, 0xbe, 11);
_awayMission->crewDirectionsAfterWalk[OBJECT_SPOCK] = DIR_W;
walkCrewman(OBJECT_SPOCK, 0x11e, 0xc7, 15);
}
void Room::tug0SpockReachedControlsForBomb() {
loadActorAnim2(OBJECT_SPOCK, "susehw", -1, -1, 19);
playSoundEffectIndex(kSfxButton);
playSoundEffectIndex(kSfxTransporterEnergize);
}
void Room::tug0SpockBeginsBeamingBomb() {
playSoundEffectIndex(kSfxTransporterDematerialize);
loadActorAnim2(10, "bomb2", 0x5a, 0x7f, 12);
}
void Room::tug0SpockFinishesBeamingBomb() {
_awayMission->tug.missionScore = 0;
_awayMission->timers[0] = 64;
}
void Room::tug0BombExploded() {
playMidiMusicTracks(MIDITRACK_2);
showText(TX_SPEAKER_MCCOY, TX_TUG0_023);
showText(TX_SPEAKER_SPOCK, TX_TUG0_037);
showText(TX_SPEAKER_MCCOY, TX_TUG0_027);
showText(TX_SPEAKER_KIRK, TX_TUG0_004);
showText(TX_SPEAKER_SCOTT, TX_TUG0_S11);
showText(TX_SPEAKER_KIRK, TX_TUG0_003);
showText(TX_SPEAKER_SCOTT, TX_TUG0_S06);
_awayMission->tug.field2d = 1;
_awayMission->disableInput = true;
// FIXME: Why do we need to clip the mission score? It shouldn't have gone above 32
_awayMission->tug.missionScore = CLIP<int16>(_awayMission->tug.missionScore, 0, 32);
endMission(_awayMission->tug.missionScore, _awayMission->tug.field2b, _awayMission->tug.field2d);
}
void Room::tug0UseMTricorderOnControls() {
_awayMission->crewDirectionsAfterWalk[OBJECT_MCCOY] = DIR_S;
loadActorAnim2(OBJECT_MCCOY, "mscans", -1, -1, 0);
playSoundEffectIndex(kSfxTricorder);
showText(TX_SPEAKER_MCCOY, TX_TUG0_016);
}
void Room::tug0UseSTricorderOnControls() {
loadActorAnim2(OBJECT_SPOCK, "sscans", -1, -1, 23);
playSoundEffectIndex(kSfxTricorder);
showText(TX_SPEAKER_SPOCK, TX_TUG0_015);
}
void Room::tug0UseMTricorderOnEngineer() {
_awayMission->disableInput = true;
_awayMission->crewDirectionsAfterWalk[OBJECT_MCCOY] = DIR_N;
walkCrewman(OBJECT_MCCOY, 0x2d, 0xaf, 24);
}
void Room::tug0MccoyReachedEngineerToScan() {
playSoundEffectIndex(kSfxTricorder);
loadActorAnim2(OBJECT_MCCOY, "mscann", -1, -1, 25);
}
void Room::tug0MccoyFinishedScanningEngineer() {
if (_awayMission->tug.engineerConscious)
showText(TX_SPEAKER_MCCOY, TX_TUG0_017);
else
showText(TX_SPEAKER_MCCOY, TX_TUG0_018);
_awayMission->crewDirectionsAfterWalk[OBJECT_MCCOY] = DIR_W;
walkCrewman(OBJECT_MCCOY, 0x41, 0xaf, 26);
_awayMission->disableInput = false;
}
void Room::tug0UseSTricorderOnEngineer() {
_awayMission->crewDirectionsAfterWalk[OBJECT_SPOCK] = DIR_S;
loadActorAnim2(OBJECT_SPOCK, "sscans", -1, -1, 0);
playSoundEffectIndex(kSfxTricorder);
showText(TX_SPEAKER_SPOCK, TX_TUG0_030);
}
void Room::tug0WalkToDoor() {
walkCrewman(OBJECT_KIRK, 0x138, 0xaa, 0);
}
void Room::tug0LookAtKirk() {
showDescription(TX_TUG0N003);
}
void Room::tug0LookAtSpock() {
showDescription(TX_TUG0N007);
}
void Room::tug0LookAtMccoy() {
showDescription(TX_TUG0N005);
}
void Room::tug0LookAtRedshirt() {
showDescription(TX_TUG0N004);
}
void Room::tug0LookAtTransporter() {
showDescription(TX_TUG0N013);
}
void Room::tug0LookAtDoor() {
showDescription(TX_TUG0N011);
}
void Room::tug0TalkToKirk() {
showText(TX_SPEAKER_KIRK, TX_TUG0_006);
showText(TX_SPEAKER_SPOCK, TX_TUG0_036);
showText(TX_SPEAKER_KIRK, TX_TUG0_011);
}
void Room::tug0TalkToMccoy() {
showText(TX_SPEAKER_MCCOY, TX_TUG0_025);
showText(TX_SPEAKER_KIRK, TX_TUG0_007);
showText(TX_SPEAKER_MCCOY, TX_TUG0_024);
}
void Room::tug0TalkToSpock() {
showText(TX_SPEAKER_SPOCK, TX_TUG0_042);
showText(TX_SPEAKER_KIRK, TX_TUG0_009);
}
void Room::tug0TalkToRedshirt() {
showText(TX_SPEAKER_CHRISTENSEN, TX_TUG0L006);
}
void Room::tug0TalkToEngineer() {
if (_awayMission->tug.engineerConscious) {
showText(TX_SPEAKER_SIMPSON, TX_TUG0_F30);
showText(TX_SPEAKER_MCCOY, TX_TUG0_026);
showText(TX_SPEAKER_KIRK, TX_TUG0_012);
}
}
void Room::tug0UseCommunicator() {
showText(TX_SPEAKER_SPOCK, TX_TUG0_031);
}
void Room::tug0LookAnywhere() {
showDescription(TX_TUG0N009);
}
void Room::tug0UseSTricorderAnywhere() {
_awayMission->crewDirectionsAfterWalk[OBJECT_SPOCK] = DIR_S;
loadActorAnim2(OBJECT_SPOCK, "sscans", -1, -1, 0);
playSoundEffectIndex(kSfxTricorder);
showText(TX_SPEAKER_SPOCK, TX_TUG0_028);
}
void Room::tug0UseMTricorderAnywhere() {
_awayMission->crewDirectionsAfterWalk[OBJECT_MCCOY] = DIR_S;
loadActorAnim2(OBJECT_MCCOY, "mscans", -1, -1, 0);
playSoundEffectIndex(kSfxTricorder);
showText(TX_SPEAKER_MCCOY, TX_TUG0_020); // BUG: typo
}
}