Files
2026-02-02 04:50:13 +01:00

562 lines
20 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_CABLE_1 8
#define OBJECT_CABLE_2 9
#define OBJECT_JUNCTION_BOX 10
#define OBJECT_JOURNAL 11
#define OBJECT_DOOR 12
#define OBJECT_DEAD_GUY 13
#define OBJECT_IMPULSE_ENGINES 14
#define OBJECT_CABINET 15
#define HOTSPOT_LEFT_PORT 0x20
#define HOTSPOT_RIGHT_PORT 0x21
#define HOTSPOT_OIL_CANISTER 0x22
#define HOTSPOT_CABINET 0x23
#define HOTSPOT_RIGHT_CONSOLE 0x24 // Fusion mixture regulator
#define HOTSPOT_IMPULSE_ENGINES 0x25
#define HOTSPOT_LEFT_CONSOLE 0x26 // Impulse engine control
#define HOTSPOT_DOOR 0x27
namespace StarTrek {
extern const RoomAction veng6ActionList[] = {
{ {ACTION_TICK, 1, 0, 0, 0}, &Room::veng6Tick1 },
{ {ACTION_WALK, OBJECT_DOOR, 0, 0, 0}, &Room::veng6WalkToDoor },
{ {ACTION_WALK, HOTSPOT_DOOR, 0, 0, 0}, &Room::veng6WalkToDoor },
{ {ACTION_DONE_WALK, 2, 0, 0, 0}, &Room::veng6ReachedDoor },
{ {ACTION_DONE_ANIM, 1, 0, 0, 0}, &Room::veng6DoorOpened },
{ {ACTION_LOOK, HOTSPOT_LEFT_PORT, 0, 0, 0}, &Room::veng6LookAtLeftPort },
{ {ACTION_LOOK, HOTSPOT_RIGHT_PORT, 0, 0, 0}, &Room::veng6LookAtRightPort },
{ {ACTION_LOOK, OBJECT_DOOR, 0, 0, 0}, &Room::veng6LookAtDoor },
{ {ACTION_LOOK, HOTSPOT_DOOR, 0, 0, 0}, &Room::veng6LookAtDoor },
{ {ACTION_LOOK, HOTSPOT_OIL_CANISTER, 0, 0, 0}, &Room::veng6LookAtOilCanister },
{ {ACTION_LOOK, OBJECT_CABINET, 0, 0, 0}, &Room::veng6LookAtCabinet },
{ {ACTION_LOOK, HOTSPOT_CABINET, 0, 0, 0}, &Room::veng6LookAtCabinet },
{ {ACTION_LOOK, OBJECT_CABLE_2, 0, 0, 0}, &Room::veng6LookAtCable },
{ {ACTION_LOOK, OBJECT_CABLE_1, 0, 0, 0}, &Room::veng6LookAtCable },
{ {ACTION_LOOK, HOTSPOT_RIGHT_CONSOLE, 0, 0, 0}, &Room::veng6LookAtRightConsole },
{ {ACTION_LOOK, OBJECT_IMPULSE_ENGINES, 0, 0, 0}, &Room::veng6LookAtImpulseEngines },
{ {ACTION_LOOK, HOTSPOT_IMPULSE_ENGINES, 0, 0, 0}, &Room::veng6LookAtImpulseEngines },
{ {ACTION_LOOK, HOTSPOT_LEFT_CONSOLE, 0, 0, 0}, &Room::veng6LookAtLeftConsole },
{ {ACTION_LOOK, OBJECT_JUNCTION_BOX, 0, 0, 0}, &Room::veng6LookAtJunctionBox },
{ {ACTION_LOOK, OBJECT_JOURNAL, 0, 0, 0}, &Room::veng6LookAtJournal },
{ {ACTION_LOOK, OBJECT_KIRK, 0, 0, 0}, &Room::veng6LookAtKirk },
{ {ACTION_LOOK, OBJECT_SPOCK, 0, 0, 0}, &Room::veng6LookAtSpock },
{ {ACTION_LOOK, OBJECT_MCCOY, 0, 0, 0}, &Room::veng6LookAtMccoy },
{ {ACTION_LOOK, OBJECT_REDSHIRT, 0, 0, 0}, &Room::veng6LookAtRedshirt },
{ {ACTION_LOOK, OBJECT_DEAD_GUY, 0, 0, 0}, &Room::veng6LookAtDeadGuy },
{ {ACTION_LOOK, 0xff, 0, 0, 0}, &Room::veng6LookAnywhere },
{ {ACTION_TALK, OBJECT_KIRK, 0, 0, 0}, &Room::veng6TalkToKirk },
{ {ACTION_TALK, OBJECT_SPOCK, 0, 0, 0}, &Room::veng6TalkToSpock },
{ {ACTION_TALK, OBJECT_MCCOY, 0, 0, 0}, &Room::veng6TalkToMccoy },
{ {ACTION_TALK, OBJECT_REDSHIRT, 0, 0, 0}, &Room::veng6TalkToRedshirt },
{ {ACTION_USE, OBJECT_ICABLE1, HOTSPOT_LEFT_PORT, 0, 0}, &Room::veng6UseCable1OnLeftPort },
{ {ACTION_USE, OBJECT_ICABLE1, HOTSPOT_LEFT_CONSOLE, 0, 0}, &Room::veng6UseCable1OnLeftPort },
{ {ACTION_USE, OBJECT_ICABLE2, HOTSPOT_LEFT_PORT, 0, 0}, &Room::veng6UseCable2OnLeftPort },
{ {ACTION_USE, OBJECT_ICABLE2, HOTSPOT_LEFT_CONSOLE, 0, 0}, &Room::veng6UseCable2OnLeftPort },
{ {ACTION_DONE_WALK, 3, 0, 0, 0}, &Room::veng6KirkOrSpockReachedLeftPort },
{ {ACTION_DONE_WALK, 4, 0, 0, 0}, &Room::veng6KirkOrSpockReachedLeftPort },
{ {ACTION_DONE_ANIM, 5, 0, 0, 0}, &Room::veng6AttachedLeftCable },
{ {ACTION_USE, OBJECT_ICABLE1, HOTSPOT_RIGHT_PORT, 0, 0}, &Room::veng6UseCable1OnRightPort },
{ {ACTION_USE, OBJECT_ICABLE1, HOTSPOT_RIGHT_CONSOLE, 0, 0}, &Room::veng6UseCable1OnRightPort },
{ {ACTION_USE, OBJECT_ICABLE2, HOTSPOT_RIGHT_PORT, 0, 0}, &Room::veng6UseCable2OnRightPort },
{ {ACTION_USE, OBJECT_ICABLE2, HOTSPOT_RIGHT_CONSOLE, 0, 0}, &Room::veng6UseCable2OnRightPort },
{ {ACTION_DONE_WALK, 6, 0, 0, 0}, &Room::veng6KirkOrSpockReachedRightPort },
{ {ACTION_DONE_WALK, 7, 0, 0, 0}, &Room::veng6KirkOrSpockReachedRightPort },
{ {ACTION_DONE_ANIM, 8, 0, 0, 0}, &Room::veng6AttachedRightCable },
{ {ACTION_USE, OBJECT_SPOCK, OBJECT_JUNCTION_BOX, 0, 0}, &Room::veng6UseCrewmanOnJunctionBox },
{ {ACTION_USE, OBJECT_MCCOY, OBJECT_JUNCTION_BOX, 0, 0}, &Room::veng6UseCrewmanOnJunctionBox },
{ {ACTION_USE, OBJECT_REDSHIRT, OBJECT_JUNCTION_BOX, 0, 0}, &Room::veng6UseCrewmanOnJunctionBox },
{ {ACTION_USE, OBJECT_KIRK, OBJECT_JUNCTION_BOX, 0, 0}, &Room::veng6UseCrewmanOnJunctionBox },
{ {ACTION_DONE_WALK, 9, 0, 0, 0}, &Room::veng6SpockReachedJunctionBox },
{ {ACTION_DONE_ANIM, 10, 0, 0, 0}, &Room::veng6SpockAdjustedJunctionBox },
{ {ACTION_USE, OBJECT_IHYPO, HOTSPOT_OIL_CANISTER, 0, 0}, &Room::veng6UseHypoOnOilCanister },
{ {ACTION_DONE_WALK, 13, 0, 0, 0}, &Room::veng6ReachedOilCanister },
{ {ACTION_DONE_ANIM, 14, 0, 0, 0}, &Room::veng6FilledHypoWithOil },
{ {ACTION_USE, OBJECT_KIRK, OBJECT_CABINET, 0, 0}, &Room::veng6UseCabinet },
{ {ACTION_DONE_WALK, 15, 0, 0, 0}, &Room::veng6ReachedCabinet },
{ {ACTION_DONE_ANIM, 16, 0, 0, 0}, &Room::veng6OpenedOrClosedCabinet },
{ {ACTION_USE, OBJECT_ISTRICOR, HOTSPOT_IMPULSE_ENGINES, 0, 0}, &Room::veng6UseSTricorderOnImpulseEngines },
{ {ACTION_USE, OBJECT_ISTRICOR, HOTSPOT_RIGHT_CONSOLE, 0, 0}, &Room::veng6UseSTricorderOnRightConsole },
{ {ACTION_USE, OBJECT_ISTRICOR, OBJECT_JUNCTION_BOX, 0, 0}, &Room::veng6UseSTricorderOnJunctionBox },
{ {ACTION_USE, OBJECT_IFUSION, HOTSPOT_LEFT_CONSOLE, 0, 0}, &Room::veng6UsePowerPackOnLeftConsole },
{ {ACTION_GET, OBJECT_JUNCTION_BOX, 0, 0, 0}, &Room::veng6GetJunctionBox },
{ {ACTION_GET, HOTSPOT_OIL_CANISTER, 0, 0, 0}, &Room::veng6GetOilCanister },
{ {ACTION_GET, OBJECT_JOURNAL, 0, 0, 0}, &Room::veng6GetEngineeringJournal },
{ {ACTION_DONE_WALK, 11, 0, 0, 0}, &Room::veng6ReachedEngineeringJournal },
{ {ACTION_DONE_ANIM, 12, 0, 0, 0}, &Room::veng6TookEngineeringJournal },
// Common code
{ {ACTION_TICK, 0xff, 0xff, 0xff, 0}, &Room::vengaTick },
{ {ACTION_USE, OBJECT_IPHASERS, 0xff, 0, 0}, &Room::vengaUsePhaserAnywhere },
{ {ACTION_USE, OBJECT_IPHASERK, 0xff, 0, 0}, &Room::vengaUsePhaserAnywhere },
{ {ACTION_LOOK, OBJECT_IHYPO, 0, 0, 0}, &Room::vengaLookAtHypo },
{ {ACTION_USE, OBJECT_ICOMM, OBJECT_KIRK, 0, 0}, &Room::vengaUseCommunicator },
{ {ACTION_USE, OBJECT_IMEDKIT, OBJECT_DEAD_GUY, 0, 0}, &Room::vengaUseMccoyOnDeadGuy },
{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_DEAD_GUY, 0, 0}, &Room::vengaUseMccoyOnDeadGuy },
{ {ACTION_USE, OBJECT_MCCOY, OBJECT_DEAD_GUY, 0, 0}, &Room::vengaUseMccoyOnDeadGuy },
// ENHANCEMENT
{ {ACTION_USE, OBJECT_ISTRICOR, OBJECT_IMPULSE_ENGINES, 0, 0}, &Room::veng6UseSTricorderOnImpulseEngines },
{ {ACTION_LIST_END, 0, 0, 0, 0}, nullptr }
};
enum veng6TextIds {
TX_SPEAKER_KIRK, TX_SPEAKER_MCCOY, TX_SPEAKER_SPOCK, TX_SPEAKER_KIJE, TX_SPEAKER_COMPUTER,
TX_BRIDU146, TX_COMPA185, TX_DEM3_019, TX_MUD1N014, TX_MUD4_018,
TX_VEN0N016, TX_VEN0_016, TX_VEN2U093, TX_VEN2_028,
TX_VEN2_066, TX_VEN2_098, TX_VEN4N010, TX_VEN4_016, TX_VEN5N007,
TX_VEN6N000, TX_VEN6N001, TX_VEN6N002, TX_VEN6N003, TX_VEN6N005,
TX_VEN6N006, TX_VEN6N007, TX_VEN6N008, TX_VEN6N009, TX_VEN6N010,
TX_VEN6N011, TX_VEN6N012, TX_VEN6N013, TX_VEN6N015, TX_VEN6N016,
TX_VEN6N017, TX_VEN6N018, TX_VEN6N019, TX_VEN6N020, TX_VEN6N022,
TX_VEN6N024, TX_VEN6N025, TX_VEN6_001, TX_VEN6_002, TX_VEN6_003,
TX_VEN6_005, TX_VEN6_006, TX_VEN6_007, TX_VEN6_008, TX_VEN6_009,
TX_VEN6_010, TX_VEN6_011, TX_VEN6_012, TX_VEN6_013, TX_VEN6_014,
TX_VEN6_015, TX_VEN6_016, TX_VEN6_017, TX_VEN6_018, TX_VEN6_019,
TX_VEN6_020, TX_VEN6_021, TX_VEN6_022, TX_VEN6_023, TX_VENA_F32,
TX_VENA_F34, TX_VENA_F40
};
// TODO: Finish floppy offsets
extern const RoomTextOffsets veng6TextOffsets[] = {
{ TX_SPEAKER_KIRK, 8894, 0, 0, 0 },
{ TX_SPEAKER_MCCOY, 8905, 0, 0, 0 },
{ TX_SPEAKER_SPOCK, 8915, 0, 0, 0 },
{ TX_SPEAKER_KIJE, 8925, 0, 0, 0 },
{ TX_SPEAKER_COMPUTER, 8937, 0, 0, 0 },
{ TX_BRIDU146, 7831, 0, 0, 0 },
{ TX_COMPA185, 4008, 0, 0, 0 },
{ TX_DEM3_019, 8315, 0, 0, 0 },
{ TX_MUD1N014, 6550, 0, 0, 0 },
{ TX_MUD4_018, 7762, 0, 0, 0 },
//{ TX_MUD4_018, 7895, 0, 0, 0 }, // Skip duplicate text
{ TX_VEN0N016, 2156, 0, 0, 0 },
{ TX_VEN0_016, 8552, 0, 0, 0 },
//{ TX_VEN0_016, 8611, 0, 0, 0 }, // Skip duplicate text
{ TX_VEN2U093, 7963, 0, 0, 0 },
{ TX_VEN2_028, 8070, 0, 0, 0 },
{ TX_VEN2_066, 8148, 0, 0, 0 },
{ TX_VEN2_098, 6958, 0, 0, 0 },
{ TX_VEN4N010, 7612, 0, 0, 0 },
{ TX_VEN4_016, 8366, 0, 0, 0 },
{ TX_VEN5N007, 775, 0, 0, 0 },
{ TX_VEN6N000, 2099, 0, 0, 0 },
{ TX_VEN6N001, 1781, 0, 0, 0 },
{ TX_VEN6N002, 1999, 0, 0, 0 },
{ TX_VEN6N003, 1873, 0, 0, 0 },
{ TX_VEN6N005, 5276, 0, 0, 0 },
{ TX_VEN6N006, 4887, 0, 0, 0 },
{ TX_VEN6N007, 4998, 0, 0, 0 },
{ TX_VEN6N007, 7677, 0, 0, 0 },
{ TX_VEN6N008, 6615, 0, 0, 0 },
{ TX_VEN6N009, 1334, 0, 0, 0 },
{ TX_VEN6N010, 1253, 0, 0, 0 },
{ TX_VEN6N011, 845, 0, 0, 0 },
{ TX_VEN6N012, 1425, 0, 0, 0 },
{ TX_VEN6N013, 1052, 0, 0, 0 },
{ TX_VEN6N015, 976, 0, 0, 0 },
{ TX_VEN6N016, 8975, 0, 0, 0 },
{ TX_VEN6N018, 9063, 0, 0, 0 },
{ TX_VEN6N017, 1139, 0, 0, 0 },
{ TX_VEN6N019, 2207, 0, 0, 0 },
{ TX_VEN6N020, 3318, 0, 0, 0 },
{ TX_VEN6N022, 3710, 0, 0, 0 },
{ TX_VEN6N024, 6803, 0, 0, 0 },
{ TX_VEN6N025, 1536, 0, 0, 0 },
{ TX_VEN6_001, 5699, 0, 0, 0 },
{ TX_VEN6_002, 4457, 0, 0, 0 },
{ TX_VEN6_003, 4062, 0, 0, 0 },
{ TX_VEN6_005, 2298, 0, 0, 0 },
{ TX_VEN6_006, 6407, 0, 0, 0 },
{ TX_VEN6_007, 5830, 0, 0, 0 },
{ TX_VEN6_008, 2674, 0, 0, 0 },
{ TX_VEN6_009, 2457, 0, 0, 0 },
{ TX_VEN6_010, 5433, 0, 0, 0 },
{ TX_VEN6_011, 4737, 0, 0, 0 },
{ TX_VEN6_012, 3881, 0, 0, 0 },
{ TX_VEN6_013, 5972, 0, 0, 0 },
{ TX_VEN6_014, 2534, 0, 0, 0 },
{ TX_VEN6_015, 6196, 0, 0, 0 },
{ TX_VEN6_016, 4297, 0, 0, 0 },
{ TX_VEN6_017, 4105, 0, 0, 0 },
{ TX_VEN6_018, 2781, 0, 0, 0 },
{ TX_VEN6_019, 4596, 0, 0, 0 },
{ TX_VEN6_020, 5500, 0, 0, 0 },
{ TX_VEN6_021, 1616, 0, 0, 0 },
{ TX_VEN6_022, 9197, 0, 0, 0 },
{ TX_VEN6_023, 2954, 0, 0, 0 },
{ TX_VENA_F32, 7188, 0, 0, 0 },
{ TX_VENA_F34, 7458, 0, 0, 0 },
{ TX_VENA_F40, 7053, 0, 0, 0 },
{ -1, 0, 0, 0, 0 }
};
extern const RoomText veng6Texts[] = {
{ -1, Common::UNK_LANG, "" }
};
#define DOOR_X 0x13e
#define DOOR_Y 0xa8
#define CABLE_1_X 0x5d
#define CABLE_1_Y 0x95
#define CABLE_2_X 0x107
#define CABLE_2_Y 0x94
#define IMPULSE_ENGINE_X 0x9e
#define IMPULSE_ENGINE_Y 0x59
#define CABINET_X 0x19
#define CABINET_Y 0x86
void Room::veng6Tick1() {
loadActorAnim(OBJECT_DOOR, "s7r6d1c", DOOR_X, DOOR_Y);
loadActorAnim(OBJECT_DEAD_GUY, "s7r6c1", 0x82, 0x5c);
loadActorAnim(OBJECT_JUNCTION_BOX, "s7r6j1", 0x9a, 0xaf);
if (_awayMission->veng.junctionCablesConnected & 1)
loadActorAnim(OBJECT_CABLE_1, "s7r6cl", CABLE_1_X, CABLE_1_Y);
if (_awayMission->veng.junctionCablesConnected & 2)
loadActorAnim(OBJECT_CABLE_2, "s7r6cr", CABLE_2_X, CABLE_2_Y);
if (_awayMission->veng.impulseEnginesOn) {
loadActorAnim(OBJECT_IMPULSE_ENGINES, "s7r6i1", IMPULSE_ENGINE_X, IMPULSE_ENGINE_Y);
// FIXME: doesn't loop
playVoc("VEN6LON");
} else
playVoc("VEN6LOFF");
if (!_awayMission->veng.tookEngineeringJournal)
loadActorAnim(OBJECT_JOURNAL, "s7r6ej", 0x24, 0x82);
loadActorAnim(OBJECT_CABINET, "s7r6p1c", CABINET_X, CABINET_Y);
if (_awayMission->veng.engineeringCabinetOpen)
loadActorAnim(OBJECT_CABINET, "s7r6p1o", CABINET_X, CABINET_Y);
}
void Room::veng6WalkToDoor() {
walkCrewmanC(OBJECT_KIRK, 0x120, 0xad, &Room::veng6ReachedDoor);
}
void Room::veng6ReachedDoor() {
_awayMission->disableInput = true;
playSoundEffectIndex(kSfxDoor);
loadActorAnimC(OBJECT_DOOR, "s7r6d1", DOOR_X, DOOR_Y, &Room::veng6DoorOpened);
}
void Room::veng6DoorOpened() {
walkCrewman(OBJECT_KIRK, 0x136, 0xaa);
}
void Room::veng6LookAtLeftPort() {
showDescription(TX_VEN6N018);
}
void Room::veng6LookAtRightPort() {
showDescription(TX_VEN6N016);
}
void Room::veng6LookAtDoor() {
showDescription(TX_VEN5N007);
}
void Room::veng6LookAtOilCanister() {
showDescription(TX_VEN6N011);
}
void Room::veng6LookAtCabinet() {
showDescription(TX_VEN6N015);
}
void Room::veng6LookAtCable() {
showDescription(TX_VEN6N013);
}
void Room::veng6LookAtRightConsole() {
showDescription(TX_VEN6N017);
}
void Room::veng6LookAtImpulseEngines() {
showDescription(TX_VEN6N010);
}
void Room::veng6LookAtLeftConsole() {
showDescription(TX_VEN6N009);
}
void Room::veng6LookAtJunctionBox() {
showDescription(TX_VEN6N012);
}
void Room::veng6LookAtJournal() {
showDescription(TX_VEN6N025);
showText(TX_SPEAKER_SPOCK, TX_VEN6_021);
}
void Room::veng6LookAtKirk() {
showDescription(TX_VEN6N001);
}
void Room::veng6LookAtSpock() {
showDescription(TX_VEN6N003);
}
void Room::veng6LookAtMccoy() {
showDescription(TX_VEN6N002);
}
void Room::veng6LookAtRedshirt() {
showDescription(TX_VEN6N000);
}
void Room::veng6LookAtDeadGuy() {
showDescription(TX_VEN0N016);
}
void Room::veng6LookAnywhere() {
showDescription(TX_VEN6N019);
}
void Room::veng6TalkToKirk() {
showText(TX_SPEAKER_KIRK, TX_VEN6_005);
showText(TX_SPEAKER_MCCOY, TX_VEN6_009);
}
void Room::veng6TalkToSpock() {
showText(TX_SPEAKER_SPOCK, TX_VEN6_014);
}
void Room::veng6TalkToMccoy() {
showText(TX_SPEAKER_MCCOY, TX_VEN6_008);
showText(TX_SPEAKER_SPOCK, TX_VEN6_018);
}
void Room::veng6TalkToRedshirt() {
showText(TX_SPEAKER_KIJE, TX_VEN6_023);
}
void Room::veng6UseCable1OnLeftPort() {
veng6UseCableOnLeftPort(OBJECT_ICABLE1);
}
void Room::veng6UseCable2OnLeftPort() {
veng6UseCableOnLeftPort(OBJECT_ICABLE2);
}
void Room::veng6UseCableOnLeftPort(byte cable) {
_roomVar.veng.cableInUse = cable;
if (!(_awayMission->veng.junctionCablesConnected & 1)) {
_awayMission->disableInput = true;
walkCrewmanC(OBJECT_SPOCK, 0x91, 0xb4, &Room::veng6KirkOrSpockReachedLeftPort);
walkCrewmanC(OBJECT_KIRK, 0x5c, 0xa0, &Room::veng6KirkOrSpockReachedLeftPort);
}
}
void Room::veng6KirkOrSpockReachedLeftPort() {
if (++_roomVar.veng.kirkAndSpockReadyToAttachLeftCable == 2) {
loadActorAnimC(OBJECT_KIRK, "kuseln", -1, -1, &Room::veng6AttachedLeftCable);
loadActorAnim(OBJECT_SPOCK, "suseln");
playVoc("EFX4");
}
}
void Room::veng6AttachedLeftCable() {
loadActorAnim(OBJECT_CABLE_1, "s7r6cl", CABLE_1_X, CABLE_1_Y);
showDescription(TX_VEN6N020);
_awayMission->veng.junctionCablesConnected |= 1;
loseItem(_roomVar.veng.cableInUse);
_awayMission->disableInput = false;
}
void Room::veng6UseCable1OnRightPort() {
veng6UseCableOnRightPort(OBJECT_ICABLE1);
}
void Room::veng6UseCable2OnRightPort() {
veng6UseCableOnRightPort(OBJECT_ICABLE2);
}
void Room::veng6UseCableOnRightPort(byte cable) {
_roomVar.veng.cableInUse = cable;
if (!(_awayMission->veng.junctionCablesConnected & 2)) {
_awayMission->disableInput = true;
walkCrewmanC(OBJECT_SPOCK, 0xac, 0xb4, &Room::veng6KirkOrSpockReachedRightPort);
walkCrewmanC(OBJECT_KIRK, 0x107, 0xa0, &Room::veng6KirkOrSpockReachedRightPort);
}
}
void Room::veng6KirkOrSpockReachedRightPort() {
if (++_roomVar.veng.kirkAndSpockReadyToAttachRightCable == 2) {
loadActorAnimC(OBJECT_KIRK, "kuseln", -1, -1, &Room::veng6AttachedRightCable);
loadActorAnim(OBJECT_SPOCK, "suseln");
playVoc("EFX4");
}
}
void Room::veng6AttachedRightCable() {
loadActorAnim(OBJECT_CABLE_2, "s7r6cr", CABLE_2_X, CABLE_2_Y);
showDescription(TX_VEN6N022);
_awayMission->veng.junctionCablesConnected |= 2;
loseItem(_roomVar.veng.cableInUse);
_awayMission->disableInput = false;
}
void Room::veng6UseCrewmanOnJunctionBox() {
if (_awayMission->veng.impulseEnginesOn)
showText(TX_SPEAKER_SPOCK, TX_VEN6_012);
else if ((_awayMission->veng.junctionCablesConnected & 3) == 3) {
showText(TX_SPEAKER_COMPUTER, TX_COMPA185);
showText(TX_SPEAKER_KIRK, TX_VEN6_003);
if (!_awayMission->veng.readEngineeringJournal)
showText(TX_SPEAKER_SPOCK, TX_VEN6_017);
else {
showText(TX_SPEAKER_SPOCK, TX_VEN6_016);
showText(TX_SPEAKER_KIRK, TX_VEN6_002);
walkCrewmanC(OBJECT_SPOCK, 0x99, 0xb4, &Room::veng6SpockReachedJunctionBox);
}
} else
showText(TX_SPEAKER_SPOCK, TX_VEN6_011);
}
void Room::veng6SpockReachedJunctionBox() {
loadActorAnimC(OBJECT_SPOCK, "suseln", -1, -1, &Room::veng6SpockAdjustedJunctionBox);
}
void Room::veng6SpockAdjustedJunctionBox() {
showText(TX_SPEAKER_SPOCK, TX_VEN6_019);
loadActorAnim(OBJECT_IMPULSE_ENGINES, "s7r6i1", IMPULSE_ENGINE_X, IMPULSE_ENGINE_Y);
_awayMission->veng.impulseEnginesOn = true;
stopAllVocSounds();
playVoc("VEN6LON");
}
void Room::veng6UseHypoOnOilCanister() {
if (_awayMission->veng.oilInHypo)
showDescription(TX_VEN6N006);
else {
_awayMission->disableInput = true;
walkCrewmanC(OBJECT_KIRK, 0x3c, 0x9e, &Room::veng6ReachedOilCanister);
}
}
void Room::veng6ReachedOilCanister() {
loadActorAnimC(OBJECT_KIRK, "kusehw", -1, -1, &Room::veng6FilledHypoWithOil);
}
void Room::veng6FilledHypoWithOil() {
_awayMission->disableInput = false;
showDescription(TX_VEN6N007);
_awayMission->veng.oilInHypo = true;
}
void Room::veng6UseCabinet() {
_awayMission->disableInput = true;
walkCrewmanC(OBJECT_KIRK, 0x36, 0x9f, &Room::veng6ReachedCabinet);
}
void Room::veng6ReachedCabinet() {
loadActorAnimC(OBJECT_KIRK, "kusehw", -1, -1, &Room::veng6OpenedOrClosedCabinet);
}
void Room::veng6OpenedOrClosedCabinet() {
_awayMission->disableInput = false;
if (_awayMission->veng.engineeringCabinetOpen) {
loadActorAnim(OBJECT_CABINET, "s7r6p2", CABINET_X, CABINET_Y);
playSoundEffectIndex(kSfxDoor);
_awayMission->veng.engineeringCabinetOpen = false;
} else {
loadActorAnim(OBJECT_CABINET, "s7r6p1", CABINET_X, CABINET_Y);
playSoundEffectIndex(kSfxDoor);
_awayMission->veng.engineeringCabinetOpen = true;
if (!_awayMission->veng.tookEngineeringJournal)
showDescription(TX_VEN6N005);
}
}
void Room::veng6UseSTricorderOnImpulseEngines() {
if (_awayMission->veng.impulseEnginesOn)
spockScan(DIR_S, TX_SPEAKER_SPOCK, TX_VEN6_010);
else {
spockScan(DIR_S, TX_SPEAKER_SPOCK, TX_VEN6_020);
showText(TX_SPEAKER_KIRK, TX_VEN6_001);
showText(TX_SPEAKER_SPOCK, TX_VEN6_022);
}
}
void Room::veng6UseSTricorderOnRightConsole() {
if (_awayMission->veng.impulseEnginesOn)
spockScan(DIR_S, TX_SPEAKER_SPOCK, TX_VEN6_013);
else
spockScan(DIR_S, TX_SPEAKER_SPOCK, TX_VEN6_007);
}
void Room::veng6UseSTricorderOnJunctionBox() {
spockScan(DIR_S, TX_SPEAKER_SPOCK, TX_VEN6_015);
}
void Room::veng6UsePowerPackOnLeftConsole() {
showText(TX_SPEAKER_SPOCK, TX_VEN6_006);
}
void Room::veng6GetJunctionBox() {
showDescription(TX_MUD1N014);
}
void Room::veng6GetOilCanister() {
showDescription(TX_VEN6N008);
}
void Room::veng6GetEngineeringJournal() {
_awayMission->disableInput = true;
walkCrewmanC(OBJECT_KIRK, 0x36, 0x9f, &Room::veng6ReachedEngineeringJournal);
}
void Room::veng6ReachedEngineeringJournal() {
loadActorAnimC(OBJECT_KIRK, "kusemw", -1, -1, &Room::veng6TookEngineeringJournal);
}
void Room::veng6TookEngineeringJournal() {
loadActorStandAnim(OBJECT_JOURNAL);
_awayMission->disableInput = false;
showDescription(TX_VEN6N024);
_awayMission->veng.tookEngineeringJournal = true;
giveItem(OBJECT_ITECH);
}
}