diff options
author | Matthew Stewart | 2018-07-06 23:54:00 -0400 |
---|---|---|
committer | Eugene Sandulenko | 2018-08-09 08:37:30 +0200 |
commit | 3cccf651791fee66e7ad1d6fd1f9927d73d26b06 (patch) | |
tree | a6b3e9a2637386dd81a4fc7599c7fbd60eabf253 /engines/startrek/rooms | |
parent | 0f3efc0e55d07fe77f5defb5b40053c1b403694f (diff) | |
download | scummvm-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.cpp | 6 | ||||
-rw-r--r-- | engines/startrek/rooms/trial1.cpp | 683 |
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); } } |