diff --git a/engines/startrek/awaymission.h b/engines/startrek/awaymission.h index 4af027015b11..d64de68c1bd5 100644 --- a/engines/startrek/awaymission.h +++ b/engines/startrek/awaymission.h @@ -264,9 +264,22 @@ struct AwayMission { } feather; struct { - int16 field29; // 0x29 + int16 missionScore; // 0x29 int16 field2b; // 0x2b - int16 missionScore; // 0x5f + bool entityDefeated; // 0x31: Used iron rod on the energy being + bool doorOpen; // 0x32 + bool scannedLock; // 0x33 + + // 0: Don't know the door code yet + // 2: Will just open the door when the keypad is used + // 5: Will activate the unknown program when the keypad is used + byte doorCodeBehaviour; // 0x34 + + bool forceFieldDown; // 0x5d + bool uhuraAnalyzedCode; // 0x5e + int16 field5f; // 0x5f + bool gotPointsForGettingRod; // 0x61 + bool gotPointsForCoatingRodWithIron; // 0x62 } trial; }; }; diff --git a/engines/startrek/room.cpp b/engines/startrek/room.cpp index dd53b47d38ef..ebd3074e5f8d 100644 --- a/engines/startrek/room.cpp +++ b/engines/startrek/room.cpp @@ -466,6 +466,10 @@ void Room::playVoc(Common::String filename) { _vm->_sound->playVoc(filename); } +void Room::stopAllVocSounds() { + _vm->_sound->stopAllVocSounds(); +} + void Room::spockScan(int direction, TextRef text, bool changeDirection) { const char *dirs = "nsew"; Common::String anim = "sscan_"; diff --git a/engines/startrek/room.h b/engines/startrek/room.h index 94a1ea6f5476..e3c0a96f891d 100644 --- a/engines/startrek/room.h +++ b/engines/startrek/room.h @@ -133,6 +133,7 @@ class Room { void endMission(int16 score, int16 arg2, int16 arg3); // Cmd 0x11 void showGameOverMenu(); // Cmd 0x12 void playVoc(Common::String filename); // Cmd 0x15 + void stopAllVocSounds(); // Cmd 0x17 // Helper functions for repetitive stuff. @@ -1755,6 +1756,89 @@ class Room { // TRIAL1 void trial1Tick1(); + void trial1Tick50(); + void trial1DoorOpened(); + void trial1TouchedHotspot0(); + void trial1KirkDied(); + void trial1TouchedHotspot1(); + void trial1GetRod(); + void trial1ReachedRod(); + void trial1PickedUpRod(); + void trial1LookAtKirk(); + void trial1LookAtSpock(); + void trial1LookAtMccoy(); + void trial1LookAtRedshirt(); + void trial1LookAtWall(); + void trial1LookAtFloor(); + void trial1LookAtRods(); + void trial1LookAtDoor(); + void trial1LookAtLock(); + void trial1LookAtEntity(); + void trial1LookAtMoltenRock(); + void trial1TalkToKirk(); + void trial1TalkToSpock(); + void trial1TalkToMccoy(); + void trial1TalkToRedshirt(); + void trial1TalkToEntity(); + void trial1UsePhaserOnCrewman(); + void trial1UsePhaserOnEntity(); + void trial1UsePhaserOnWall(); + void trial1UseStunPhaserOnFloor(); + void trial1ReachedFloorToUseStunPhaser(); + void trial1DoneShootingFloorWithStunPhaser(); + void trial1UseKillPhaserOnFloor(); + void trial1ReachedFloorToUseKillPhaser(); + void trial1DoneShootingFloorWithKillPhaser(); + void trial1UsePhaserOnRod(); + void trial1UsePhaserOnDoor(); + void trial1UsePhaserOnLock(); + void trial1UseMTricorderOnKirk(); + void trial1UseMTricorderOnSpock(); + void trial1UseMTricorderOnMccoy(); + void trial1UseMTricorderOnRedshirt(); + void trial1UseMTricorderOnEntity(); + void trial1UseSTricorderOnWall(); + void trial1UseSTricorderOnEntity(); + void trial1UseSTricorderOnRods(); + void trial1UseSTricorderOnFloor(); + void trial1UseSTricorderOnDoor(); + void trial1UseSTricorderOnLock(); + void trial1UseCommunicator(); + void trial1UseMccoyOnEntity(); + void trial1UseMccoyOnLock(); + void trial1UseMccoyOnFloor(); + void trial1UseSpockOnEntity(); + void trial1UseSpockOnLock(); + void trial1SpockReachedKeypad(); + void trial1SpockUsedKeypad(); + void trial1SpockReachedKeypadWithExtraProgram(); + void trial1SpockUsedKeypadWithExtraProgram(); + void trial1UseSpockOnFloor(); + void trial1UseRedshirtOnEntity(); + void trial1UseRedshirtOnLock(); + void trial1RedshirtReachedKeypad(); + void trial1RedshirtUsedKeypad(); + void trial1RedshirtReachedKeypadWithExtraProgram(); + void trial1RedshirtUsedKeypadWithExtraProgram(); + void trial1UseRedshirtOnFloor(); + void trial1UseRodOnMccoy(); + void trial1UseRodOnSpock(); + void trial1UseRodOnRedshirt(); + void trial1UseRodOnFloorOrWall(); + void trial1UseWoodRodOnEntity(); + void trial1ReachedPositionToThrowWoodRod(); + void trial1DoneThrowingWoodRod(); + void trial1UseWoodRodOnLock(); + void trial1UseWoodRodOnMoltenRock(); + void trial1ReachedMoltenRock(); + void trial1DoneCoatingWoodRod(); + void trial1UseIronRodOnEntity(); + void trial1ReachedPositionToThrowIronRod(); + void trial1DoneThrowingIronRod(); + void trial1UseIronRodOnLock(); + void trial1GetThrownIronRod(); + void trial1WalkToDoor(); + void trial1UseMedkit(); // TRIAL2 void trial2Tick1(); diff --git a/engines/startrek/rooms/trial0.cpp b/engines/startrek/rooms/trial0.cpp index a6a2741945c7..6d042bd5ffce 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 2df16b84af0b..e33c54d4ef10 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); } } diff --git a/engines/startrek/text.h b/engines/startrek/text.h index 3570863f479f..766e6e6eb597 100644 --- a/engines/startrek/text.h +++ b/engines/startrek/text.h @@ -110,6 +110,7 @@ enum GameStringIDs { TX_SPEAKER_BENNIE, TX_SPEAKER_VLICT, TX_SPEAKER_KLINGON_GUARD, + TX_SPEAKER_ENTITY, TX_BRIDU146, @@ -2068,6 +2069,101 @@ enum GameStringIDs { TX_TRI0U075, + // UNUSED (001) + TX_TRI1_002, + TX_TRI1_003, + TX_TRI1_004, + TX_TRI1_005, + TX_TRI1_006, + TX_TRI1_007, + TX_TRI1_008, + TX_TRI1_009, + TX_TRI1_010, + TX_TRI1_011, + TX_TRI1_012, + TX_TRI1_013, + TX_TRI1_014, + TX_TRI1_015, + TX_TRI1_016, + TX_TRI1_017, + TX_TRI1_018, + TX_TRI1_019, + TX_TRI1_020, + TX_TRI1_021, + TX_TRI1_022, + TX_TRI1_023, + TX_TRI1_024, + TX_TRI1_025, + TX_TRI1_026, + TX_TRI1_027, + // UNUSED + TX_TRI1_029, + TX_TRI1_030, + TX_TRI1_031, + TX_TRI1_032, + TX_TRI1_033, + TX_TRI1_034, + TX_TRI1_035, + TX_TRI1_036, + TX_TRI1_037, + TX_TRI1_038, + TX_TRI1_039, + TX_TRI1_040, + TX_TRI1_041, + TX_TRI1_042, + TX_TRI1_043, + TX_TRI1_044, + TX_TRI1_045, + TX_TRI1_046, + TX_TRI1_047, + TX_TRI1_048, + TX_TRI1_049, + TX_TRI1_050, + TX_TRI1_051, + TX_TRI1_052, + TX_TRI1_053, + TX_TRI1_054, + TX_TRI1_055, + TX_TRI1_056, + TX_TRI1_057, + // UNUSED (058 -> 066) + TX_TRI1_J00, + TX_TRI1N000, + TX_TRI1N001, + TX_TRI1N002, + TX_TRI1N003, + TX_TRI1N004, + TX_TRI1N005, + TX_TRI1N006, + TX_TRI1N007, + TX_TRI1N008, + TX_TRI1N009, + // UNUSED + TX_TRI1N011, + TX_TRI1N012, + TX_TRI1N013, + TX_TRI1N014, + TX_TRI1N015, + TX_TRI1N016, + TX_TRI1N017, + // UNUSED (018 -> 019) + TX_TRI1U068, + TX_TRI1U079, + TX_TRI1U080, + TX_TRI1U086, + TX_TRI1U090, + TX_TRI1U095, + TX_TRI1U098, + TX_TRI1U101, + TX_TRI1U102, + TX_TRI1U106, + // UNUSED: TRI1UO68 (that's 'O', not '0'); same as TRI1U068 but before the voice + // filter on the communicator is applied? + // There are also TRI3 audio files in the TRI1 folder? + TX_TRI1C001, // Custom + TX_TRI1C002, + + TX_TRI4_076, @@ -2133,6 +2229,7 @@ const char * const g_gameStrings[] = { "Ensign Bennie", "Vlict", "Klingon Guard", + "Entity", "#BRID\\BRIDU146#Nothing to report, Captain.", @@ -4069,6 +4166,93 @@ const char * const g_gameStrings[] = { "#TRI0\\TRI0U075#Uhura here. Captain, there's a force field over the planet. We will not be able to beam you aboard.", + "#TRI1\\TRI1_002#Affirmative, Uhura.", + "#TRI1\\TRI1_003#Affirmative.", + "#TRI1\\TRI1_004#Beam us to Vlict's position.", + "#TRI1\\TRI1_005#Beam us back to the Enterprise. Kirk out.", + "#TRI1\\TRI1_006#I want that door open.", + "#TRI1\\TRI1_007#I somehow doubt that Vlict intends for us to survive this, whatever the outcome. We're the only thing that stands between him and the killing of Quetzecoatl that he can justify.", + "#TRI1\\TRI1_008#Negative. Transmit the door entry code only.", + "#TRI1\\TRI1_009#Negative.", + "#TRI1\\TRI1_010#That's not true, Ensign. However, I suspect that Vlict's attack on Hrakkour exceeded his orders. He needs Quetzecoatl as a scapegoat, and he needs a fair trial to avoid an inquiry of his own actions.", + "#TRI1\\TRI1_011#Uhura, prepare to receive a tricorder message. There is a door with an entry coder here; try to analyze the circuits and let the main computer crack the code.", + "#TRI1\\TRI1_012#This creature is composed of electrical fields. I would not recommend approaching it. A metal projectile might disrupt its fields and render it harmless.", + "#TRI1\\TRI1_013#A Klingon entry door, slightly antiquated.", + "#TRI1\\TRI1_014#An entry coder for the door, keyed to a number sequence. The tricorder is unable to determine the code, but can scan the mechanism.", + "#TRI1\\TRI1_015#Captain, I would strongly recommend against disturbing the rod. It could result in awakening the creature or possibly electrocuting you.", + "#TRI1\\TRI1_016#Do you know what ten million volts can do to a man? It can ruin his whole damn day.", + "#TRI1\\TRI1_017#Does not register as a known life form.", + "#TRI1\\TRI1_018#Find someone else to be a volunteer. I've retired.", + "#TRI1\\TRI1_019#How could you do it, Jim? I spent hours trying to save his life, and you just gave him away in seconds to the Klingons!", + "#TRI1\\TRI1_020#I don't know the code.", + "#TRI1\\TRI1_021#Jim! Are you mad? that's our only way out!", + "#TRI1\\TRI1_022#One Male Human, average physical condition.", + "#TRI1\\TRI1_023#He's a Male Human, excellent physical condition.", + "#TRI1\\TRI1_024#Male Human, good physical condition.", + "#TRI1\\TRI1_025#Male Human-Vulcan hybrid. Excellent physical condition.", + "#TRI1\\TRI1_026#Nobody needs healing, Jim, but you will if they harm my patient.", + "#TRI1\\TRI1_027#Ouch!", + "#TRI1\\TRI1_029#This is not in my field of expertise.", + "#TRI1\\TRI1_030#This is not in my field of expertise.", + "#TRI1\\TRI1_031#What the blazes do you want me to do on a rock?", + "#TRI1\\TRI1_032#A test of courage? That is the Klingon way.", + "#TRI1\\TRI1_033#I'll bet it'll be mad.", + "#TRI1\\TRI1_034#Shut up Spock!", + "#TRI1\\TRI1_035#I do not understand the desired course of action.", + "#TRI1\\TRI1_036#If you will observe the position of the creature, Captain, I think that you will find that it prevents access to the keypad.", + "#TRI1\\TRI1_037#Ouch!", + "#TRI1\\TRI1_038#The door is already open Captain.", + "#TRI1\\TRI1_039#The odds of surviving contact with the creature are too small to calculate.", + "#TRI1\\TRI1_040#There is a high probability that shooting the door would be hasardous to our wellbeing.", + "#TRI1\\TRI1_041#These wooden rods are support beams that were not placed.", + "#TRI1\\TRI1_042#This rock has a high iron content.", + "#TRI1\\TRI1_043#This wall was carved from the natural rock.", + "#TRI1\\TRI1_044#We do not know the code, Captain.", + "#TRI1\\TRI1_045#As I suspected, Captain. The creature is in stasis. It should awaken in 3.48 days.", + "#TRI1\\TRI1_046#Captain, I have calculated the odds of surviving this at...", + "#TRI1\\TRI1_047#Not much is known about Hrakkour, Ensign. This would appear to be some sort of a mining installation; that creature might be a native lifeform.", + "#TRI1\\TRI1_048#Captain, my instructor at the Academy always told me that if you don't know what you're going to do with a phaser, you shouldn't draw it.", + "#TRI1\\TRI1_049#Do you want me to arrest it, interrogate it, or beat it up, Captain?", + "#TRI1\\TRI1_050#I refuse, Captain, on the grounds that it might eliminate me.", + "#TRI1\\TRI1_051#I refuse, Captain, on the grounds that it might eliminate me.", + "#TRI1\\TRI1_052#Ouch!", + "#TRI1\\TRI1_053#You handled those Klingons well, sir. We've got them on the run now.", + "#TRI1\\TRI1_054#You want me to smash it? But that's our only way out of here.", + "#TRI1\\TRI1_055#And our deaths will be the only way he can get it. Great.", + "#TRI1\\TRI1_056#What is this place?", + "#TRI1\\TRI1_057#Why should he worry about justification, Captain? He's a Klingon. Murder is as natural to them as breathing!", + "#TRI1\\TRI1_J00#Why do I have the feeling that I'm about to have a bad day?", + "#TRI1\\TRI1N000#A field of static lightning. It seems to be moving in a purposeful manner.", + "#TRI1\\TRI1N001#A slightly antiquated Klingon door, opened by a keycode entry.", + "#TRI1\\TRI1N002#A slightly antiquated Klingon lock-mechanism.", + "#TRI1\\TRI1N003#James T. Kirk, hero of the galaxy!", + "#TRI1\\TRI1N004#No effect.", + "#TRI1\\TRI1N005#No effect.", + "#TRI1\\TRI1N006#The floor is incomplete, made of unrefined, natural rock.", + "#TRI1\\TRI1N007#The melted rock is cooling, but still remains in a molten state.", + "#TRI1\\TRI1N008#The wall is resistant to phaser fire.", + "#TRI1\\TRI1N009#These wooden rods are support beams that were not placed.", + "#TRI1\\TRI1N011#This section of wall was carved by some sort of plasma field.", + "#TRI1\\TRI1N012#You burn one of the rods.", + "#TRI1\\TRI1N013#You coat the rod with molten iron. It hardens quickly.", + "#TRI1\\TRI1N014#You melt some of the rock.", + "#TRI1\\TRI1N015#Your ever dependable crewman, Ensign Bennie.", + "#TRI1\\TRI1N016#Your ever emotional friend, Dr. McCoy.", + "#TRI1\\TRI1N017#Your ever logical friend, Spock.", + "#TRI1\\TRI1U068#Nothing else to report Captain.", + "#TRI1\\TRI1U079#Affirmative sir. We will transmit code when you activate the keycode. Uhura out.", + "#TRI1\\TRI1U080#Affirmative, sir.", + "#TRI1\\TRI1U086#Captain, there is a force field between us and the planet.", + "#TRI1\\TRI1U090#Do you wish to be beamed up now Captain?", + "#TRI1\\TRI1U095#Good luck, Captain.", + "#TRI1\\TRI1U098#Keep us informed, we'll help you all we can. We can analyze any data you gather through the main computer.", + "#TRI1\\TRI1U101#Scan complete. Main computer has the code. We also read an anomaly. Something else has tapped into the keycode. Shall I analyze?", + "#TRI1\\TRI1U102#Sir, we have a secondary code that is nested in the Klingon program. Computer is unable to analyze its function. Shall we broadcast it to you when you activate the keypad?", + "#TRI1\\TRI1U106#We have your position at approximately thirty meters beneath the surface of Hrakkour, in what appears to be the ruins of an archeological dig.", + "Zzzt! Sptttz! Zzzt! Tttt!", + "Clunk.", + + "#TRI4\\TRI4_076#You humans have an excellent imagination, but a poor grasp of reality.",