aboutsummaryrefslogtreecommitdiff
path: root/engines/startrek/rooms
diff options
context:
space:
mode:
authorMatthew Stewart2018-07-06 23:54:00 -0400
committerEugene Sandulenko2018-08-09 08:37:30 +0200
commit3cccf651791fee66e7ad1d6fd1f9927d73d26b06 (patch)
treea6b3e9a2637386dd81a4fc7599c7fbd60eabf253 /engines/startrek/rooms
parent0f3efc0e55d07fe77f5defb5b40053c1b403694f (diff)
downloadscummvm-rg350-3cccf651791fee66e7ad1d6fd1f9927d73d26b06.tar.gz
scummvm-rg350-3cccf651791fee66e7ad1d6fd1f9927d73d26b06.tar.bz2
scummvm-rg350-3cccf651791fee66e7ad1d6fd1f9927d73d26b06.zip
STARTREK: TRIAL1
Diffstat (limited to 'engines/startrek/rooms')
-rw-r--r--engines/startrek/rooms/trial0.cpp6
-rw-r--r--engines/startrek/rooms/trial1.cpp683
2 files changed, 686 insertions, 3 deletions
diff --git a/engines/startrek/rooms/trial0.cpp b/engines/startrek/rooms/trial0.cpp
index a6a2741945..6d042bd5ff 100644
--- a/engines/startrek/rooms/trial0.cpp
+++ b/engines/startrek/rooms/trial0.cpp
@@ -197,10 +197,10 @@ void Room::trial0ReachedRoomCenter() {
playMidiMusicTracks(2, -1);
showText(TX_SPEAKER_VLICT, TX_TRI0_049);
showText(TX_SPEAKER_VLICT, TX_TRI0_044);
- _vm->_awayMission.trial.missionScore = 0;
+ _vm->_awayMission.trial.field5f = 0;
// FIXME: Are these parameters in the right order?
- endMission(_vm->_awayMission.trial.field29, _vm->_awayMission.trial.field2b, 0);
+ endMission(_vm->_awayMission.trial.missionScore, _vm->_awayMission.trial.field2b, 0);
}
}
@@ -279,10 +279,12 @@ void Room::trial0UsePhaserOrRock() {
}
void Room::trial0UseSnakeOnVlict() {
+ // Unused, since the snake item doesn't carry over to the courtroom
showText(TX_SPEAKER_VLICT, TX_TRI4_076);
}
void Room::trial0UseSnakeOnGuard() {
+ // Unused, since the snake item doesn't carry over to the courtroom
showText(TX_SPEAKER_KLINGON_GUARD, TX_TRI0_F24);
}
diff --git a/engines/startrek/rooms/trial1.cpp b/engines/startrek/rooms/trial1.cpp
index 2df16b84af..e33c54d4ef 100644
--- a/engines/startrek/rooms/trial1.cpp
+++ b/engines/startrek/rooms/trial1.cpp
@@ -22,16 +22,697 @@
#include "startrek/room.h"
+#define OBJECT_ENTITY 8
+#define OBJECT_MOLTEN_ROCK 9
+#define OBJECT_DOOR 10
+#define OBJECT_THROWN_IRON_ROD 11
+
+#define HOTSPOT_DOOR 0x20
+#define HOTSPOT_LOCK 0x21
+#define HOTSPOT_RODS 0x22
+#define HOTSPOT_WALL 0x23
+#define HOTSPOT_FLOOR 0x24
+
namespace StarTrek {
extern const RoomAction trial1ActionList[] = {
- { {ACTION_TICK, 1, 0, 0}, &Room::trial1Tick1 },
+ { {ACTION_TICK, 1, 0, 0}, &Room::trial1Tick1 },
+ { {ACTION_TICK, 50, 0, 0}, &Room::trial1Tick50 },
+ { {ACTION_DONE_ANIM, 9, 0, 0}, &Room::trial1DoorOpened },
+
+ { {ACTION_TOUCHED_HOTSPOT, 0, 0, 0}, &Room::trial1TouchedHotspot0 },
+ { {ACTION_DONE_ANIM, 1, 0, 0}, &Room::trial1KirkDied },
+
+ { {ACTION_TOUCHED_HOTSPOT, 1, 0, 0}, &Room::trial1TouchedHotspot1 },
+
+ { {ACTION_GET, HOTSPOT_RODS, 0, 0}, &Room::trial1GetRod },
+ { {ACTION_DONE_WALK, 4, 0, 0}, &Room::trial1ReachedRod },
+ { {ACTION_DONE_ANIM, 5, 0, 0}, &Room::trial1PickedUpRod },
+
+ { {ACTION_LOOK, OBJECT_KIRK, 0, 0}, &Room::trial1LookAtKirk },
+ { {ACTION_LOOK, OBJECT_SPOCK, 0, 0}, &Room::trial1LookAtSpock },
+ { {ACTION_LOOK, OBJECT_MCCOY, 0, 0}, &Room::trial1LookAtMccoy },
+ { {ACTION_LOOK, OBJECT_REDSHIRT, 0, 0}, &Room::trial1LookAtRedshirt },
+ { {ACTION_LOOK, HOTSPOT_WALL, 0, 0}, &Room::trial1LookAtWall },
+ { {ACTION_LOOK, HOTSPOT_FLOOR, 0, 0}, &Room::trial1LookAtFloor },
+ { {ACTION_LOOK, HOTSPOT_RODS, 0, 0}, &Room::trial1LookAtRods },
+ { {ACTION_LOOK, HOTSPOT_DOOR, 0, 0}, &Room::trial1LookAtDoor },
+ { {ACTION_LOOK, HOTSPOT_LOCK, 0, 0}, &Room::trial1LookAtLock },
+ { {ACTION_LOOK, OBJECT_ENTITY, 0, 0}, &Room::trial1LookAtEntity },
+ { {ACTION_LOOK, OBJECT_MOLTEN_ROCK, 0, 0}, &Room::trial1LookAtMoltenRock },
+ { {ACTION_TALK, OBJECT_KIRK, 0, 0}, &Room::trial1TalkToKirk },
+ { {ACTION_TALK, OBJECT_SPOCK, 0, 0}, &Room::trial1TalkToSpock },
+ { {ACTION_TALK, OBJECT_MCCOY, 0, 0}, &Room::trial1TalkToMccoy },
+ { {ACTION_TALK, OBJECT_REDSHIRT, 0, 0}, &Room::trial1TalkToRedshirt },
+ { {ACTION_TALK, OBJECT_ENTITY, 0, 0}, &Room::trial1TalkToEntity },
+
+ { {ACTION_USE, OBJECT_IPHASERS, OBJECT_KIRK, 0}, &Room::trial1UsePhaserOnCrewman },
+ { {ACTION_USE, OBJECT_IPHASERK, OBJECT_KIRK, 0}, &Room::trial1UsePhaserOnCrewman },
+ { {ACTION_USE, OBJECT_IPHASERS, OBJECT_SPOCK, 0}, &Room::trial1UsePhaserOnCrewman },
+ { {ACTION_USE, OBJECT_IPHASERK, OBJECT_SPOCK, 0}, &Room::trial1UsePhaserOnCrewman },
+ { {ACTION_USE, OBJECT_IPHASERS, OBJECT_MCCOY, 0}, &Room::trial1UsePhaserOnCrewman },
+ { {ACTION_USE, OBJECT_IPHASERK, OBJECT_MCCOY, 0}, &Room::trial1UsePhaserOnCrewman },
+ { {ACTION_USE, OBJECT_IPHASERS, OBJECT_REDSHIRT, 0}, &Room::trial1UsePhaserOnCrewman },
+ { {ACTION_USE, OBJECT_IPHASERK, OBJECT_REDSHIRT, 0}, &Room::trial1UsePhaserOnCrewman },
+
+ { {ACTION_USE, OBJECT_IPHASERS, OBJECT_ENTITY, 0}, &Room::trial1UsePhaserOnEntity },
+ { {ACTION_USE, OBJECT_IPHASERK, OBJECT_ENTITY, 0}, &Room::trial1UsePhaserOnEntity },
+ { {ACTION_USE, OBJECT_IPHASERS, HOTSPOT_WALL, 0}, &Room::trial1UsePhaserOnWall },
+ { {ACTION_USE, OBJECT_IPHASERK, HOTSPOT_WALL, 0}, &Room::trial1UsePhaserOnWall },
+
+ { {ACTION_USE, OBJECT_IPHASERS, HOTSPOT_FLOOR, 0}, &Room::trial1UseStunPhaserOnFloor },
+ { {ACTION_DONE_WALK, 12, 0, 0}, &Room::trial1ReachedFloorToUseStunPhaser },
+ { {ACTION_DONE_ANIM, 13, 0, 0}, &Room::trial1DoneShootingFloorWithStunPhaser },
+
+ { {ACTION_USE, OBJECT_IPHASERK, HOTSPOT_FLOOR, 0}, &Room::trial1UseKillPhaserOnFloor },
+ { {ACTION_DONE_WALK, 14, 0, 0}, &Room::trial1ReachedFloorToUseKillPhaser },
+ { {ACTION_DONE_ANIM, 15, 0, 0}, &Room::trial1DoneShootingFloorWithKillPhaser },
+
+ { {ACTION_USE, OBJECT_IPHASERS, HOTSPOT_RODS, 0}, &Room::trial1UsePhaserOnRod },
+ { {ACTION_USE, OBJECT_IPHASERK, HOTSPOT_RODS, 0}, &Room::trial1UsePhaserOnRod },
+ { {ACTION_USE, OBJECT_IPHASERS, HOTSPOT_DOOR, 0}, &Room::trial1UsePhaserOnDoor },
+ { {ACTION_USE, OBJECT_IPHASERK, HOTSPOT_DOOR, 0}, &Room::trial1UsePhaserOnDoor },
+ { {ACTION_USE, OBJECT_IPHASERS, HOTSPOT_LOCK, 0}, &Room::trial1UsePhaserOnLock },
+ { {ACTION_USE, OBJECT_IPHASERK, HOTSPOT_LOCK, 0}, &Room::trial1UsePhaserOnLock },
+ { {ACTION_USE, OBJECT_IMTRICOR, OBJECT_KIRK, 0}, &Room::trial1UseMTricorderOnKirk },
+ { {ACTION_USE, OBJECT_IMTRICOR, OBJECT_SPOCK, 0}, &Room::trial1UseMTricorderOnSpock },
+ { {ACTION_USE, OBJECT_IMTRICOR, OBJECT_MCCOY, 0}, &Room::trial1UseMTricorderOnMccoy },
+ { {ACTION_USE, OBJECT_IMTRICOR, OBJECT_REDSHIRT, 0}, &Room::trial1UseMTricorderOnRedshirt },
+ { {ACTION_USE, OBJECT_IMTRICOR, OBJECT_ENTITY, 0}, &Room::trial1UseMTricorderOnEntity },
+ { {ACTION_USE, OBJECT_ISTRICOR, HOTSPOT_WALL, 0}, &Room::trial1UseSTricorderOnWall },
+ { {ACTION_USE, OBJECT_ISTRICOR, OBJECT_ENTITY, 0}, &Room::trial1UseSTricorderOnEntity },
+ { {ACTION_USE, OBJECT_ISTRICOR, HOTSPOT_RODS, 0}, &Room::trial1UseSTricorderOnRods },
+ { {ACTION_USE, OBJECT_ISTRICOR, HOTSPOT_FLOOR, 0}, &Room::trial1UseSTricorderOnFloor },
+ { {ACTION_USE, OBJECT_ISTRICOR, HOTSPOT_DOOR, 0}, &Room::trial1UseSTricorderOnDoor },
+ { {ACTION_USE, OBJECT_ISTRICOR, HOTSPOT_LOCK, 0}, &Room::trial1UseSTricorderOnLock },
+ { {ACTION_USE, OBJECT_ICOMM, 0xff, 0}, &Room::trial1UseCommunicator },
+ { {ACTION_USE, OBJECT_MCCOY, OBJECT_ENTITY, 0}, &Room::trial1UseMccoyOnEntity },
+ { {ACTION_USE, OBJECT_MCCOY, HOTSPOT_LOCK, 0}, &Room::trial1UseMccoyOnLock },
+ { {ACTION_USE, OBJECT_MCCOY, HOTSPOT_FLOOR, 0}, &Room::trial1UseMccoyOnFloor },
+ { {ACTION_USE, OBJECT_SPOCK, OBJECT_ENTITY, 0}, &Room::trial1UseSpockOnEntity },
+
+ { {ACTION_USE, OBJECT_SPOCK, HOTSPOT_LOCK, 0}, &Room::trial1UseSpockOnLock },
+ { {ACTION_DONE_WALK, 18, 0, 0}, &Room::trial1SpockReachedKeypad },
+ { {ACTION_DONE_ANIM, 19, 0, 0}, &Room::trial1SpockUsedKeypad },
+ { {ACTION_DONE_WALK, 20, 0, 0}, &Room::trial1SpockReachedKeypadWithExtraProgram },
+ { {ACTION_DONE_ANIM, 21, 0, 0}, &Room::trial1SpockUsedKeypadWithExtraProgram },
+
+ { {ACTION_USE, OBJECT_SPOCK, HOTSPOT_FLOOR, 0}, &Room::trial1UseSpockOnFloor },
+ { {ACTION_USE, OBJECT_REDSHIRT, OBJECT_ENTITY, 0}, &Room::trial1UseRedshirtOnEntity },
+
+ { {ACTION_USE, OBJECT_REDSHIRT, HOTSPOT_LOCK, 0}, &Room::trial1UseRedshirtOnLock },
+ { {ACTION_DONE_WALK, 24, 0, 0}, &Room::trial1RedshirtReachedKeypad },
+ { {ACTION_DONE_ANIM, 25, 0, 0}, &Room::trial1RedshirtUsedKeypad },
+ { {ACTION_DONE_WALK, 26, 0, 0}, &Room::trial1RedshirtReachedKeypadWithExtraProgram },
+ { {ACTION_DONE_ANIM, 27, 0, 0}, &Room::trial1RedshirtUsedKeypadWithExtraProgram },
+
+ { {ACTION_USE, OBJECT_REDSHIRT, HOTSPOT_FLOOR, 0}, &Room::trial1UseRedshirtOnFloor },
+ { {ACTION_USE, OBJECT_IWROD, OBJECT_MCCOY, 0}, &Room::trial1UseRodOnMccoy },
+ { {ACTION_USE, OBJECT_IWROD, OBJECT_SPOCK, 0}, &Room::trial1UseRodOnSpock },
+ { {ACTION_USE, OBJECT_IWROD, OBJECT_REDSHIRT, 0}, &Room::trial1UseRodOnRedshirt },
+ { {ACTION_USE, OBJECT_IWROD, HOTSPOT_FLOOR, 0}, &Room::trial1UseRodOnFloorOrWall },
+ { {ACTION_USE, OBJECT_IWROD, HOTSPOT_WALL, 0}, &Room::trial1UseRodOnFloorOrWall },
+
+ { {ACTION_USE, OBJECT_IWROD, OBJECT_ENTITY, 0}, &Room::trial1UseWoodRodOnEntity },
+ { {ACTION_DONE_WALK, 10, 0, 0}, &Room::trial1ReachedPositionToThrowWoodRod },
+ { {ACTION_DONE_ANIM, 6, 0, 0}, &Room::trial1DoneThrowingWoodRod },
+
+ { {ACTION_USE, OBJECT_IWROD, HOTSPOT_LOCK, 0}, &Room::trial1UseWoodRodOnLock },
+
+ { {ACTION_USE, OBJECT_IWROD, OBJECT_MOLTEN_ROCK, 0}, &Room::trial1UseWoodRodOnMoltenRock },
+ { {ACTION_DONE_WALK, 16, 0, 0}, &Room::trial1ReachedMoltenRock },
+ { {ACTION_DONE_ANIM, 17, 0, 0}, &Room::trial1DoneCoatingWoodRod },
+
+ { {ACTION_USE, OBJECT_IIROD, OBJECT_MCCOY, 0}, &Room::trial1UseRodOnMccoy },
+ { {ACTION_USE, OBJECT_IIROD, OBJECT_SPOCK, 0}, &Room::trial1UseRodOnSpock },
+ { {ACTION_USE, OBJECT_IIROD, OBJECT_REDSHIRT, 0}, &Room::trial1UseRodOnRedshirt },
+ { {ACTION_USE, OBJECT_IIROD, HOTSPOT_FLOOR, 0}, &Room::trial1UseRodOnFloorOrWall },
+ { {ACTION_USE, OBJECT_IIROD, HOTSPOT_WALL, 0}, &Room::trial1UseRodOnFloorOrWall },
+
+ { {ACTION_USE, OBJECT_IIROD, OBJECT_ENTITY, 0}, &Room::trial1UseIronRodOnEntity },
+ { {ACTION_DONE_WALK, 11, 0, 0}, &Room::trial1ReachedPositionToThrowIronRod },
+ { {ACTION_DONE_ANIM, 7, 0, 0}, &Room::trial1DoneThrowingIronRod },
+
+ { {ACTION_USE, OBJECT_IIROD, HOTSPOT_LOCK, 0}, &Room::trial1UseIronRodOnLock },
+ { {ACTION_GET, OBJECT_THROWN_IRON_ROD, 0, 0}, &Room::trial1GetThrownIronRod },
+ { {ACTION_WALK, HOTSPOT_DOOR, 0, 0}, &Room::trial1WalkToDoor },
+ { {ACTION_USE, OBJECT_IMEDKIT, 0xff, 0}, &Room::trial1UseMedkit },
+
+ // ENHANCEMENT: Implement actions for the door object, not just the hotspot
+ { {ACTION_LOOK, OBJECT_DOOR, 0, 0}, &Room::trial1LookAtDoor },
+ { {ACTION_USE, OBJECT_IPHASERS, OBJECT_DOOR, 0}, &Room::trial1UsePhaserOnDoor },
+ { {ACTION_USE, OBJECT_IPHASERK, OBJECT_DOOR, 0}, &Room::trial1UsePhaserOnDoor },
+ { {ACTION_USE, OBJECT_ISTRICOR, OBJECT_DOOR, 0}, &Room::trial1UseSTricorderOnDoor },
+ { {ACTION_WALK, OBJECT_DOOR, 0, 0}, &Room::trial1WalkToDoor },
};
extern const int trial1NumActions = sizeof(trial1ActionList) / sizeof(RoomAction);
void Room::trial1Tick1() {
+ if (!_vm->_awayMission.trial.doorOpen) {
+ _vm->_awayMission.disableInput = 2;
+ loadActorAnim2(OBJECT_DOOR, "t1drc");
+ }
+ if (!_vm->_awayMission.trial.entityDefeated) {
+ loadActorAnim2(OBJECT_ENTITY, "ec", 0x5f, 0xb1, 3); // No callback defined
+ playVoc("TRI1LOOP");
+ }
+}
+
+void Room::trial1Tick50() {
+ if (!_vm->_awayMission.trial.doorOpen)
+ _vm->_awayMission.disableInput = false;
+ if (!_vm->_awayMission.trial.entityDefeated) {
+ showText(TX_SPEAKER_BENNIE, TX_TRI1_056);
+ showText(TX_SPEAKER_SPOCK, TX_TRI1_047);
+ showText(TX_SPEAKER_MCCOY, TX_TRI1_032);
+ showText(TX_SPEAKER_KIRK, TX_TRI1_007);
+ showText(TX_SPEAKER_BENNIE, TX_TRI1_057);
+ showText(TX_SPEAKER_KIRK, TX_TRI1_010);
+ showText(TX_SPEAKER_BENNIE, TX_TRI1_055);
+ }
+}
+
+void Room::trial1DoorOpened() { // Called after Spock opens the door
+ _vm->_awayMission.trial.doorOpen = true;
+ loadActorStandAnim(OBJECT_DOOR);
+}
+
+void Room::trial1TouchedHotspot0() { // Kirk touched the energy thing
+ if (!_vm->_awayMission.trial.entityDefeated) {
+ // BUGFIX: Disable input, otherwise you can cancel the death
+ _vm->_awayMission.disableInput = true;
+ loadActorAnimC(OBJECT_KIRK, "kkills", -1, -1, &Room::trial1KirkDied);
+ }
+}
+
+void Room::trial1KirkDied() {
+ showGameOverMenu();
+}
+
+void Room::trial1TouchedHotspot1() { // Entered the door
+ if (_vm->_awayMission.trial.doorOpen) {
+ _vm->_awayMission.disableInput = true;
+ loadRoomIndex(2, 2);
+ }
+}
+
+
+void Room::trial1GetRod() {
+ _vm->_awayMission.disableInput = true;
+ walkCrewmanC(OBJECT_KIRK, 0xe9, 0xa9, &Room::trial1ReachedRod);
+}
+
+void Room::trial1ReachedRod() {
+ loadActorAnimC(OBJECT_KIRK, "t1pkup", 0xe9, 0xa9, &Room::trial1PickedUpRod);
+ giveItem(OBJECT_IWROD);
+ if (!_vm->_awayMission.trial.gotPointsForGettingRod) {
+ _vm->_awayMission.trial.gotPointsForGettingRod = true;
+ _vm->_awayMission.trial.missionScore += 1;
+ }
+}
+
+void Room::trial1PickedUpRod() {
+ _vm->_awayMission.disableInput = false;
+}
+
+void Room::trial1LookAtKirk() {
+ showText(TX_TRI1N003);
+}
+
+void Room::trial1LookAtSpock() {
+ showText(TX_TRI1N017);
+}
+
+void Room::trial1LookAtMccoy() {
+ showText(TX_TRI1N016);
+}
+
+void Room::trial1LookAtRedshirt() {
+ showText(TX_TRI1N015);
+}
+
+void Room::trial1LookAtWall() {
+ showText(TX_TRI1N011);
+}
+
+void Room::trial1LookAtFloor() {
+ showText(TX_TRI1N006);
+}
+
+void Room::trial1LookAtRods() {
+ showText(TX_TRI1N009);
+}
+
+void Room::trial1LookAtDoor() {
+ showText(TX_TRI1N001);
+}
+
+void Room::trial1LookAtLock() {
+ showText(TX_TRI1N002);
+}
+
+void Room::trial1LookAtEntity() {
+ showText(TX_TRI1N000);
+}
+
+void Room::trial1LookAtMoltenRock() {
+ showText(TX_TRI1N007);
+}
+
+void Room::trial1TalkToKirk() {
+ showText(TX_SPEAKER_KIRK, TX_TRI1_J00);
+}
+
+void Room::trial1TalkToSpock() {
+ showText(TX_SPEAKER_SPOCK, TX_TRI1_046);
+ showText(TX_SPEAKER_MCCOY, TX_TRI1_034);
+}
+
+void Room::trial1TalkToMccoy() {
+ showText(TX_SPEAKER_MCCOY, TX_TRI1_019);
+}
+
+void Room::trial1TalkToRedshirt() {
+ showText(TX_SPEAKER_BENNIE, TX_TRI1_053);
+}
+
+void Room::trial1TalkToEntity() {
+ showText(TX_SPEAKER_ENTITY, TX_TRI1C001);
+}
+
+void Room::trial1UsePhaserOnCrewman() {
+ showText(TX_SPEAKER_BENNIE, TX_TRI1_048);
+}
+
+void Room::trial1UsePhaserOnEntity() {
+ showText(TX_TRI1N004);
+}
+
+void Room::trial1UsePhaserOnWall() {
+ showText(TX_TRI1N008);
+}
+
+
+void Room::trial1UseStunPhaserOnFloor() {
+ _vm->_awayMission.disableInput = true;
+ _vm->_awayMission.crewDirectionsAfterWalk[OBJECT_KIRK] = DIR_E;
+ walkCrewmanC(OBJECT_KIRK, 0xca, 0xbc, &Room::trial1ReachedFloorToUseStunPhaser);
+}
+
+void Room::trial1ReachedFloorToUseStunPhaser() {
+ playSoundEffectIndex(SND_PHASSHOT);
+ loadActorAnimC(OBJECT_KIRK, "t1mlts", 0xca, 0xbc, &Room::trial1DoneShootingFloorWithStunPhaser);
+}
+
+void Room::trial1DoneShootingFloorWithStunPhaser() {
+ _vm->_awayMission.disableInput = false;
+ _vm->_awayMission.crewDirectionsAfterWalk[OBJECT_KIRK] = DIR_E;
+ loadActorStandAnim(OBJECT_KIRK);
+}
+
+
+void Room::trial1UseKillPhaserOnFloor() {
+ _vm->_awayMission.disableInput = true;
+ _vm->_awayMission.crewDirectionsAfterWalk[OBJECT_KIRK] = DIR_E;
+ walkCrewmanC(OBJECT_KIRK, 0xca, 0xbc, &Room::trial1ReachedFloorToUseKillPhaser);
+}
+
+void Room::trial1ReachedFloorToUseKillPhaser() {
+ playSoundEffectIndex(SND_PHASSHOT);
+ loadActorAnimC(OBJECT_KIRK, "t1mltk", 0xca, 0xbc, &Room::trial1DoneShootingFloorWithKillPhaser);
+}
+
+void Room::trial1DoneShootingFloorWithKillPhaser() {
+ showText(TX_TRI1N014);
+ loadActorAnim2(OBJECT_MOLTEN_ROCK, "t1mltd", 0xca, 0xbc);
+
+ _vm->_awayMission.crewDirectionsAfterWalk[OBJECT_KIRK] = DIR_E;
+ loadActorStandAnim(OBJECT_KIRK);
+
+ // BUG: Infinite score mechanism
+ _vm->_awayMission.trial.missionScore += 1;
+ _vm->_awayMission.disableInput = false;
+}
+
+void Room::trial1UsePhaserOnRod() {
+ showText(TX_TRI1N012);
+}
+
+void Room::trial1UsePhaserOnDoor() {
+ showText(TX_SPEAKER_SPOCK, TX_TRI1_040);
+}
+
+void Room::trial1UsePhaserOnLock() {
+ showText(TX_SPEAKER_MCCOY, TX_TRI1_021);
+}
+
+void Room::trial1UseMTricorderOnKirk() {
+ mccoyScan(DIR_S, TX_TRI1_024, true);
+}
+
+void Room::trial1UseMTricorderOnSpock() {
+ // ENHANCEMENT: Original didn't play tricorder sound, etc
+ mccoyScan(DIR_S, TX_TRI1_025, true);
+}
+
+void Room::trial1UseMTricorderOnMccoy() {
+ mccoyScan(DIR_S, TX_TRI1_022, true);
+}
+
+void Room::trial1UseMTricorderOnRedshirt() {
+ mccoyScan(DIR_S, TX_TRI1_023, true);
+}
+
+void Room::trial1UseMTricorderOnEntity() {
+ mccoyScan(DIR_S, TX_TRI1_017, true);
+}
+
+void Room::trial1UseSTricorderOnWall() {
+ spockScan(DIR_S, TX_TRI1_043, true);
+}
+
+void Room::trial1UseSTricorderOnEntity() {
+ spockScan(DIR_S, TX_TRI1_012, true);
+
+ // BUG: infinite score mechanism
+ _vm->_awayMission.trial.missionScore += 1;
+}
+
+void Room::trial1UseSTricorderOnRods() {
+ spockScan(DIR_S, TX_TRI1_041, true);
+}
+
+void Room::trial1UseSTricorderOnFloor() {
+ spockScan(DIR_S, TX_TRI1_042, true);
+
+ // BUG: infinite score mechanism
+ _vm->_awayMission.trial.missionScore += 1;
+}
+
+void Room::trial1UseSTricorderOnDoor() {
+ spockScan(DIR_S, TX_TRI1_013, true);
+}
+
+void Room::trial1UseSTricorderOnLock() {
+ spockScan(DIR_S, TX_TRI1_014, true);
+
+ if (!_vm->_awayMission.trial.scannedLock) {
+ _vm->_awayMission.trial.scannedLock = true;
+ // BUGFIX: Moved this into the if statement (used to be an infinite score mechanism)
+ _vm->_awayMission.trial.missionScore += 1;
+ }
+}
+
+void Room::trial1UseCommunicator() {
+ if (_vm->_awayMission.trial.forceFieldDown) {
+ showText(TX_SPEAKER_UHURA, TX_TRI1U090);
+
+ const TextRef choices[] = {
+ TX_SPEAKER_KIRK,
+ TX_TRI1_005, TX_TRI1_004, TX_TRI1_009,
+ TX_BLANK
+ };
+ int choice = showText(choices);
+
+ if (choice == 0) { // "Beam us back to the enterprise"
+ _vm->_awayMission.trial.field5f = 1;
+ endMission(1, 1, 1);
+ } else if (choice == 1) { // "Beam us to Vlict's position"
+ showText(TX_SPEAKER_UHURA, TX_TRI1U080);
+ _vm->_awayMission.disableInput = true;
+ loadRoomIndex(4, 4);
+ } // Else don't transport anywhere
+ } else { // Force field still up
+ if (_vm->_awayMission.trial.uhuraAnalyzedCode)
+ showText(TX_SPEAKER_UHURA, TX_TRI1U068);
+ else {
+ showText(TX_SPEAKER_UHURA, TX_TRI1U086);
+ showText(TX_SPEAKER_UHURA, TX_TRI1U106);
+ showText(TX_SPEAKER_UHURA, TX_TRI1U098);
+
+ if (_vm->_awayMission.trial.scannedLock) {
+ showText(TX_SPEAKER_KIRK, TX_TRI1_011);
+ showText(TX_SPEAKER_UHURA, TX_TRI1U101);
+
+ const TextRef choices[] = {
+ TX_SPEAKER_KIRK,
+ TX_TRI1_006, TX_TRI1_002,
+ TX_BLANK
+ };
+ int choice = showText(choices);
+
+ if (choice == 0) { // Don't analyze the anomolous program
+ showText(TX_SPEAKER_UHURA, TX_TRI1U079);
+ _vm->_awayMission.trial.doorCodeBehaviour = 2;
+ _vm->_awayMission.trial.uhuraAnalyzedCode = true;
+ _vm->_awayMission.trial.missionScore += 1;
+ } else { // Analyze the anomolous program
+ showText(TX_SPEAKER_UHURA, TX_TRI1U102);
+
+ const TextRef choices2[] = {
+ TX_SPEAKER_KIRK,
+ TX_TRI1_003, TX_TRI1_008,
+ TX_BLANK
+ };
+ choice = showText(choices2);
+
+ if (choice == 0) { // Activate the program
+ showText(TX_SPEAKER_UHURA, TX_TRI1U095);
+ _vm->_awayMission.trial.doorCodeBehaviour = 5;
+ _vm->_awayMission.trial.uhuraAnalyzedCode = true;
+ _vm->_awayMission.trial.missionScore += 3;
+ } else { // Don't activate, only open the door
+ showText(TX_SPEAKER_UHURA, TX_TRI1U079);
+ _vm->_awayMission.trial.doorCodeBehaviour = 2;
+ _vm->_awayMission.trial.uhuraAnalyzedCode = true;
+ _vm->_awayMission.trial.missionScore += 1;
+ }
+ }
+ }
+ }
+ }
+}
+
+void Room::trial1UseMccoyOnEntity() {
+ showText(TX_SPEAKER_MCCOY, TX_TRI1_016);
+}
+
+void Room::trial1UseMccoyOnLock() {
+ if (!_vm->_awayMission.trial.entityDefeated)
+ showText(TX_SPEAKER_MCCOY, TX_TRI1_018);
+ else if (_vm->_awayMission.trial.doorCodeBehaviour == 0)
+ showText(TX_SPEAKER_MCCOY, TX_TRI1_020);
+ else
+ showText(TX_SPEAKER_MCCOY, TX_TRI1_029);
+}
+
+void Room::trial1UseMccoyOnFloor() {
+ showText(TX_SPEAKER_MCCOY, TX_TRI1_031);
+}
+
+void Room::trial1UseSpockOnEntity() {
+ showText(TX_SPEAKER_SPOCK, TX_TRI1_039);
+}
+
+
+void Room::trial1UseSpockOnLock() {
+ if (_vm->_awayMission.trial.doorOpen)
+ showText(TX_SPEAKER_SPOCK, TX_TRI1_038);
+ else if (!_vm->_awayMission.trial.entityDefeated)
+ showText(TX_SPEAKER_SPOCK, TX_TRI1_036);
+ else if (_vm->_awayMission.trial.doorCodeBehaviour == 0)
+ showText(TX_SPEAKER_SPOCK, TX_TRI1_044);
+ else if (_vm->_awayMission.trial.doorCodeBehaviour == 2)
+ walkCrewmanC(OBJECT_SPOCK, 0x1f, 0xb8, &Room::trial1SpockReachedKeypad);
+ else
+ walkCrewmanC(OBJECT_SPOCK, 0x1f, 0xb8, &Room::trial1SpockReachedKeypadWithExtraProgram);
+}
+
+void Room::trial1SpockReachedKeypad() { // Spock opens the door
+ playSoundEffectIndex(SND_07);
+ loadActorAnimC(OBJECT_SPOCK, "susemw", -1, -1, &Room::trial1SpockUsedKeypad);
+}
+
+void Room::trial1SpockUsedKeypad() {
+ _vm->_awayMission.crewDirectionsAfterWalk[OBJECT_SPOCK] = DIR_W;
+ loadActorStandAnim(OBJECT_SPOCK);
+ playSoundEffectIndex(SND_DOOR1);
+ loadActorAnimC(OBJECT_DOOR, "t1drco", -1, -1, &Room::trial1DoorOpened);
+ _vm->_awayMission.trial.doorOpen = true;
+}
+
+void Room::trial1SpockReachedKeypadWithExtraProgram() { // Spock activates the unknown program
+ playSoundEffectIndex(SND_07);
+ loadActorAnimC(OBJECT_SPOCK, "susemw", -1, -1, &Room::trial1SpockUsedKeypadWithExtraProgram);
+}
+
+void Room::trial1SpockUsedKeypadWithExtraProgram() {
+ _vm->_awayMission.crewDirectionsAfterWalk[OBJECT_SPOCK] = DIR_W;
+ loadActorStandAnim(OBJECT_SPOCK);
+
+ _vm->_awayMission.disableInput = true;
+ loadRoomIndex(5, 5);
+}
+
+
+void Room::trial1UseSpockOnFloor() {
+ showText(TX_SPEAKER_SPOCK, TX_TRI1_035);
+}
+
+void Room::trial1UseRedshirtOnEntity() {
+ showText(TX_SPEAKER_BENNIE, TX_TRI1_050);
+}
+
+
+void Room::trial1UseRedshirtOnLock() {
+ if (_vm->_awayMission.trial.doorOpen)
+ return;
+ else if (!_vm->_awayMission.trial.entityDefeated)
+ showText(TX_SPEAKER_BENNIE, TX_TRI1_051);
+ else if (_vm->_awayMission.trial.doorCodeBehaviour == 0)
+ showText(TX_SPEAKER_BENNIE, TX_TRI1_054);
+ else if (_vm->_awayMission.trial.doorCodeBehaviour == 2)
+ walkCrewmanC(OBJECT_REDSHIRT, 0x1f, 0xb8, &Room::trial1RedshirtReachedKeypad);
+ else
+ walkCrewmanC(OBJECT_REDSHIRT, 0x1f, 0xb8, &Room::trial1RedshirtReachedKeypadWithExtraProgram);
+}
+
+void Room::trial1RedshirtReachedKeypad() { // Redshirt opens the lock
+ playSoundEffectIndex(SND_07);
+ loadActorAnimC(OBJECT_REDSHIRT, "rusemw", -1, -1, &Room::trial1RedshirtUsedKeypad);
+}
+
+void Room::trial1RedshirtUsedKeypad() {
+ _vm->_awayMission.crewDirectionsAfterWalk[OBJECT_REDSHIRT] = DIR_W;
+ loadActorStandAnim(OBJECT_REDSHIRT);
+ playSoundEffectIndex(SND_DOOR1);
+ loadActorAnimC(OBJECT_DOOR, "t1drco", -1, -1, &Room::trial1DoorOpened);
+ _vm->_awayMission.trial.doorOpen = true;
+}
+
+void Room::trial1RedshirtReachedKeypadWithExtraProgram() {
+ playSoundEffectIndex(SND_07);
+ loadActorAnimC(OBJECT_REDSHIRT, "rusemw", -1, -1, &Room::trial1RedshirtUsedKeypadWithExtraProgram);
+}
+
+void Room::trial1RedshirtUsedKeypadWithExtraProgram() {
+ _vm->_awayMission.crewDirectionsAfterWalk[OBJECT_REDSHIRT] = DIR_W;
+ loadActorStandAnim(OBJECT_REDSHIRT);
+
+ _vm->_awayMission.disableInput = true;
+ loadRoomIndex(5, 5);
+}
+
+
+void Room::trial1UseRedshirtOnFloor() {
+ showText(TX_SPEAKER_BENNIE, TX_TRI1_049);
+}
+
+void Room::trial1UseRodOnMccoy() {
+ // ENHANCEMENT: This was originally only voiced with the wooden rod, not the iron rod.
+ // (This applies to the Spock and Redshirt functions below, too.)
+ showText(TX_SPEAKER_MCCOY, TX_TRI1_027);
+}
+
+void Room::trial1UseRodOnSpock() {
+ showText(TX_SPEAKER_SPOCK, TX_TRI1_037);
+}
+
+void Room::trial1UseRodOnRedshirt() {
+ showText(TX_SPEAKER_BENNIE, TX_TRI1_052);
+}
+
+void Room::trial1UseRodOnFloorOrWall() {
+ showText(TX_TRI1C002);
+}
+
+
+void Room::trial1UseWoodRodOnEntity() {
+ _vm->_awayMission.disableInput = true;
+ walkCrewmanC(OBJECT_KIRK, 0xe9, 0xad, &Room::trial1ReachedPositionToThrowWoodRod);
+ loseItem(OBJECT_IWROD);
+}
+
+void Room::trial1ReachedPositionToThrowWoodRod() {
+ loadActorAnimC(OBJECT_KIRK, "kthrwr", 0xe9, 0xad, &Room::trial1DoneThrowingWoodRod);
+}
+
+void Room::trial1DoneThrowingWoodRod() {
+ _vm->_awayMission.disableInput = false;
+}
+
+
+void Room::trial1UseWoodRodOnLock() {
+ showText(TX_TRI1N005);
+}
+
+
+void Room::trial1UseWoodRodOnMoltenRock() {
+ _vm->_awayMission.disableInput = true;
+ walkCrewmanC(OBJECT_KIRK, 0xe4, 0xc4, &Room::trial1ReachedMoltenRock);
+}
+
+void Room::trial1ReachedMoltenRock() {
+ loadActorAnimC(OBJECT_KIRK, "t1dip", 0xe4, 0xc4, &Room::trial1DoneCoatingWoodRod);
+}
+
+void Room::trial1DoneCoatingWoodRod() {
+ _vm->_awayMission.disableInput = false;
+ showText(TX_TRI1N013);
+ loseItem(OBJECT_IWROD);
+ giveItem(OBJECT_IIROD);
+
+ if (!_vm->_awayMission.trial.gotPointsForCoatingRodWithIron) {
+ _vm->_awayMission.trial.gotPointsForCoatingRodWithIron = true;
+ _vm->_awayMission.trial.missionScore += 1;
+ }
+}
+
+
+void Room::trial1UseIronRodOnEntity() {
+ _vm->_awayMission.disableInput = true;
+ walkCrewmanC(OBJECT_KIRK, 0xe9, 0xac, &Room::trial1ReachedPositionToThrowIronRod);
+ _vm->_awayMission.trial.entityDefeated = true;
+ loseItem(OBJECT_IIROD);
+}
+
+void Room::trial1ReachedPositionToThrowIronRod() {
+ loadActorAnimC(OBJECT_KIRK, "kthri", 0xe9, 0xac, &Room::trial1DoneThrowingIronRod);
+ loadActorStandAnim(OBJECT_ENTITY);
+}
+
+void Room::trial1DoneThrowingIronRod() {
+ loadActorAnim(OBJECT_THROWN_IRON_ROD, "t1irod", 0xe9, 0xac, 8); // No callback defined
+
+ _vm->_awayMission.crewDirectionsAfterWalk[OBJECT_KIRK] = DIR_W;
+ loadActorStandAnim(OBJECT_KIRK);
+
+ _vm->_awayMission.disableInput = false;
+ stopAllVocSounds();
+ showText(TX_SPEAKER_SPOCK, TX_TRI1_045);
+ showText(TX_SPEAKER_MCCOY, TX_TRI1_033);
+
+ _vm->_awayMission.trial.missionScore += 1;
+}
+
+
+void Room::trial1UseIronRodOnLock() {
+ showText(TX_TRI1N004);
+}
+
+void Room::trial1GetThrownIronRod() {
+ showText(TX_SPEAKER_SPOCK, TX_TRI1_015);
+}
+
+void Room::trial1WalkToDoor() {
+ if (_vm->_awayMission.trial.doorOpen)
+ walkCrewman(OBJECT_KIRK, 0x1a, 0xac, 28);
+}
+
+void Room::trial1UseMedkit() {
+ showText(TX_SPEAKER_MCCOY, TX_TRI1_026);
}
}