diff options
author | Matthew Stewart | 2018-07-27 23:27:43 -0400 |
---|---|---|
committer | Eugene Sandulenko | 2018-08-09 08:37:30 +0200 |
commit | 93ca6a7b489fc1f382f963f09e291497b4aa8ece (patch) | |
tree | 3c487e62f7b948c207e24a17bbb68a44f564cded /engines/startrek/rooms | |
parent | bf1e125fa3af95027c9504dcc80bbb9e991bcefc (diff) | |
download | scummvm-rg350-93ca6a7b489fc1f382f963f09e291497b4aa8ece.tar.gz scummvm-rg350-93ca6a7b489fc1f382f963f09e291497b4aa8ece.tar.bz2 scummvm-rg350-93ca6a7b489fc1f382f963f09e291497b4aa8ece.zip |
STARTREK: SINS2
Diffstat (limited to 'engines/startrek/rooms')
-rw-r--r-- | engines/startrek/rooms/sins0.cpp | 4 | ||||
-rw-r--r-- | engines/startrek/rooms/sins1.cpp | 20 | ||||
-rw-r--r-- | engines/startrek/rooms/sins2.cpp | 300 |
3 files changed, 309 insertions, 15 deletions
diff --git a/engines/startrek/rooms/sins0.cpp b/engines/startrek/rooms/sins0.cpp index 7fb4f08e32..04a931d562 100644 --- a/engines/startrek/rooms/sins0.cpp +++ b/engines/startrek/rooms/sins0.cpp @@ -84,9 +84,9 @@ void Room::sins0Tick1() { if (!_awayMission->sins.enteredRoom0FirstTime) _awayMission->disableInput = 2; - if (_awayMission->sins.field3e) + if (_awayMission->sins.openedInnerDoor) loadActorAnim2(OBJECT_DOOR, "s0dr2", 0, 0); - if (_awayMission->sins.openedDoor) + else if (_awayMission->sins.openedOuterDoor) loadActorAnim2(OBJECT_DOOR, "s0dr1", 0, 0); playMidiMusicTracks(MIDITRACK_27, -3); diff --git a/engines/startrek/rooms/sins1.cpp b/engines/startrek/rooms/sins1.cpp index 76a959f513..356a99c429 100644 --- a/engines/startrek/rooms/sins1.cpp +++ b/engines/startrek/rooms/sins1.cpp @@ -96,13 +96,13 @@ void Room::sins1Tick1() { // BUGFIX: Set this to 2, not 1 (disable input even after walking animation is done) _awayMission->disableInput = 2; - if (_awayMission->sins.openedDoor) { + if (_awayMission->sins.openedOuterDoor) { loadActorAnim2(OBJECT_DOOR, "s1dro", 0, 0); loadMapFile("sins12"); } else loadMapFile("sins1"); - if (_awayMission->sins.field3e) + if (_awayMission->sins.openedInnerDoor) loadActorAnim2(OBJECT_DOOR, "s1ndro", 0, 0); _awayMission->sins.field32 = 1; @@ -153,7 +153,7 @@ void Room::sins1UseSTricorderOnLock() { } void Room::sins1UseSTricorderOnDoor() { - if (!_awayMission->sins.openedDoor) + if (!_awayMission->sins.openedOuterDoor) spockScan(DIR_N, TX_SIN1_019); } @@ -173,24 +173,24 @@ void Room::sins1UseRockOnDoor() { } void Room::sins1UseRedshirtOnKeypad() { - if (!_awayMission->sins.openedDoor) + if (!_awayMission->sins.openedOuterDoor) showText(TX_SPEAKER_MOSHER, TX_SIN1_028); } void Room::sins1UseMccoyOnKeypad() { - if (!_awayMission->sins.openedDoor) + if (!_awayMission->sins.openedOuterDoor) showText(TX_SPEAKER_MCCOY, TX_SIN1_012); } void Room::sins1UseKirkOnKeypad() { - if (!_awayMission->sins.openedDoor) { + if (!_awayMission->sins.openedOuterDoor) { showText(TX_SPEAKER_KIRK, TX_SIN1_001); sins1UseSpockOnKeypad(); } } void Room::sins1UseSpockOnKeypad() { - if (!_awayMission->sins.openedDoor) { + if (!_awayMission->sins.openedOuterDoor) { _awayMission->crewDirectionsAfterWalk[OBJECT_SPOCK] = DIR_N; walkCrewmanC(OBJECT_SPOCK, 0xfd, 0xad, &Room::sins1SpockReachedKeypad); } @@ -221,7 +221,7 @@ void Room::sins1SpockReachedKeypad() { void Room::sins1EnteredCorrectCode() { _awayMission->crewDirectionsAfterWalk[OBJECT_SPOCK] = DIR_W; walkCrewman(OBJECT_SPOCK, 0xf3, 0xad); - _awayMission->sins.openedDoor = true; + _awayMission->sins.openedOuterDoor = true; loadMapFile("sins12"); loadActorAnimC(OBJECT_DOOR, "s1door", 0, 0, &Room::sins1DoorDoneOpening); playVoc("HUGEDOO2"); @@ -318,7 +318,7 @@ void Room::sins1LookAtLens() { } void Room::sins1UseCommunicator() { - if (!_awayMission->sins.field44) { + if (!_awayMission->sins.enteredRoom2FirstTime) { showText(TX_SPEAKER_KIRK, TX_SIN1_008); showText(TX_SPEAKER_SCOTT, TX_SIN1_S51); showText(TX_SPEAKER_KIRK, TX_SIN1_002); @@ -337,7 +337,7 @@ void Room::sins1UseMTricorderOnCrewman() { } void Room::sins1WalkToDoor() { - if (_awayMission->sins.openedDoor) + if (_awayMission->sins.openedOuterDoor) walkCrewman(OBJECT_KIRK, 0x98, 0x9e, 5); // NOTE: Callback 5 not defined } diff --git a/engines/startrek/rooms/sins2.cpp b/engines/startrek/rooms/sins2.cpp index 976814acab..42102230ff 100644 --- a/engines/startrek/rooms/sins2.cpp +++ b/engines/startrek/rooms/sins2.cpp @@ -22,20 +22,314 @@ #include "startrek/room.h" -#define OBJECT_8 8 +#define OBJECT_DOOR 8 -#define HOTSPOT_20 0x20 +#define HOTSPOT_TERMINAL 0x20 +#define HOTSPOT_DOOR 0x21 +#define HOTSPOT_KEYPAD 0x22 namespace StarTrek { extern const RoomAction sins2ActionList[] = { - { {ACTION_TICK, 1, 0, 0}, &Room::sins2Tick1 }, + { {ACTION_TICK, 1, 0, 0}, &Room::sins2Tick1 }, + { {ACTION_USE, OBJECT_IPHASERK, HOTSPOT_DOOR, 0}, &Room::sins2UsePhaserOnDoor }, + { {ACTION_USE, OBJECT_IPHASERS, HOTSPOT_DOOR, 0}, &Room::sins2UsePhaserOnDoor }, + { {ACTION_USE, OBJECT_ISTRICOR, 0xff, 0}, &Room::sins2UseSTricorderAnywhere }, + + { {ACTION_USE, OBJECT_KIRK, HOTSPOT_TERMINAL, 0}, &Room::sins2UseKirkOnTerminal }, + { {ACTION_USE, OBJECT_SPOCK, HOTSPOT_TERMINAL, 0}, &Room::sins2UseSpockOnTerminal }, + { {ACTION_DONE_WALK, 5, 0, 0}, &Room::sins2SpockReachedTerminal }, + { {ACTION_DONE_ANIM, 6, 0, 0}, &Room::sins2SpockUsedTerminal }, + { {ACTION_USE, OBJECT_MCCOY, HOTSPOT_TERMINAL, 0}, &Room::sins2UseMccoyOnTerminal }, + { {ACTION_USE, OBJECT_REDSHIRT, HOTSPOT_TERMINAL, 0}, &Room::sins2UseRedshirtOnTerminal }, + { {ACTION_USE, OBJECT_ISTRICOR, HOTSPOT_TERMINAL, 0}, &Room::sins2UseSTricorderOnTerminal }, + { {ACTION_USE, OBJECT_ISTRICOR, HOTSPOT_KEYPAD, 0}, &Room::sins2UseSTricorderOnKeypad }, + { {ACTION_USE, OBJECT_ISTRICOR, HOTSPOT_DOOR, 0}, &Room::sins2UseSTricorderOnDoor }, + { {ACTION_USE, OBJECT_KIRK, HOTSPOT_KEYPAD, 0}, &Room::sins2UseKirkOnKeypad }, + { {ACTION_USE, OBJECT_SPOCK, HOTSPOT_KEYPAD, 0}, &Room::sins2UseSpockOnKeypad }, + { {ACTION_DONE_WALK, 2, 0, 0}, &Room::sins2SpockReachedKeypad }, + { {ACTION_DONE_ANIM, 3, 0, 0}, &Room::sins2EnteredCorrectCode }, + { {ACTION_DONE_ANIM, 4, 0, 0}, &Room::sins2EnteredIncorrectCode }, + { {ACTION_DONE_ANIM, 1, 0, 0}, &Room::sins2DoorFinishedOpening }, + + { {ACTION_TICK, 40, 0, 0}, &Room::sins2Tick40 }, + { {ACTION_LOOK, 0xff, 0, 0}, &Room::sins2LookAnywhere }, + { {ACTION_LOOK, OBJECT_DOOR, 0, 0}, &Room::sins2LookAtOpenDoor }, + { {ACTION_LOOK, HOTSPOT_TERMINAL, 0, 0}, &Room::sins2LookAtTerminal }, + { {ACTION_LOOK, HOTSPOT_KEYPAD, 0, 0}, &Room::sins2LookAtKeypad }, + { {ACTION_LOOK, OBJECT_KIRK, 0, 0}, &Room::sins2LookAtKirk }, + { {ACTION_LOOK, OBJECT_SPOCK, 0, 0}, &Room::sins2LookAtSpock }, + { {ACTION_LOOK, OBJECT_MCCOY, 0, 0}, &Room::sins2LookAtMccoy }, + { {ACTION_LOOK, OBJECT_REDSHIRT, 0, 0}, &Room::sins2LookAtRedshirt }, + { {ACTION_TALK, OBJECT_KIRK, 0, 0}, &Room::sins2TalkToKirk }, + { {ACTION_TALK, OBJECT_SPOCK, 0, 0}, &Room::sins2TalkToSpock }, + { {ACTION_TALK, OBJECT_MCCOY, 0, 0}, &Room::sins2TalkToMccoy }, + { {ACTION_TALK, OBJECT_REDSHIRT, 0, 0}, &Room::sins2TalkToRedshirt }, + { {ACTION_LOOK, HOTSPOT_DOOR, 0, 0}, &Room::sins2LookAtDoor }, + + { {ACTION_USE, OBJECT_SPOCK, HOTSPOT_DOOR, 0}, &Room::sins2UseSpockOnDoor }, + { {ACTION_USE, OBJECT_ICOMM, 0xff, 0}, &Room::sins2UseCommunicator }, + { {ACTION_USE, OBJECT_IMEDKIT, OBJECT_KIRK, 0}, &Room::sins2UseMedkitOnCrewman }, + { {ACTION_USE, OBJECT_IMEDKIT, OBJECT_SPOCK, 0}, &Room::sins2UseMedkitOnCrewman }, + { {ACTION_USE, OBJECT_IMEDKIT, OBJECT_MCCOY, 0}, &Room::sins2UseMedkitOnCrewman }, + { {ACTION_USE, OBJECT_IMEDKIT, OBJECT_REDSHIRT, 0}, &Room::sins2UseMedkitOnCrewman }, + { {ACTION_USE, OBJECT_IMTRICOR, OBJECT_KIRK, 0}, &Room::sins2UseMTricorderOnCrewman }, + { {ACTION_USE, OBJECT_IMTRICOR, OBJECT_SPOCK, 0}, &Room::sins2UseMTricorderOnCrewman }, + { {ACTION_USE, OBJECT_IMTRICOR, OBJECT_MCCOY, 0}, &Room::sins2UseMTricorderOnCrewman }, + { {ACTION_USE, OBJECT_IMTRICOR, OBJECT_REDSHIRT, 0}, &Room::sins2UseMTricorderOnCrewman }, + { {ACTION_USE, OBJECT_MCCOY, HOTSPOT_KEYPAD, 0}, &Room::sins2UseMccoyOnKeypad }, + { {ACTION_USE, OBJECT_REDSHIRT, HOTSPOT_KEYPAD, 0}, &Room::sins2UseRedshirtOnKeypad }, + + { {ACTION_WALK, HOTSPOT_DOOR, 0, 0}, &Room::sins2WalkToDoor }, + { {ACTION_WALK, OBJECT_DOOR, 0, 0}, &Room::sins2WalkToDoor }, }; extern const int sins2NumActions = sizeof(sins2ActionList) / sizeof(RoomAction); void Room::sins2Tick1() { + playVoc("SIN2LOOP"); + playMidiMusicTracks(MIDITRACK_27, -3); + + if (!_awayMission->sins.enteredRoom2FirstTime) + _awayMission->disableInput = 2; + + if (_awayMission->sins.openedInnerDoor) { + // NOTE: callback is never called, since animation never finishes? + loadActorAnimC(OBJECT_DOOR, "s2dro", 0, 0, &Room::sins2DoorFinishedOpening); + loadMapFile("sins22"); + } else { + loadMapFile("sins2"); + } +} + +void Room::sins2UsePhaserOnDoor() { + showText(TX_SPEAKER_SPOCK, TX_SIN2_025); +} + +void Room::sins2UseSTricorderAnywhere() { + spockScan(DIR_S, TX_SIN2_026); +} + +void Room::sins2UseKirkOnTerminal() { + showText(TX_SPEAKER_KIRK, TX_SIN2_002); + sins2UseSpockOnTerminal(); +} + +void Room::sins2UseSpockOnTerminal() { + _awayMission->crewDirectionsAfterWalk[OBJECT_SPOCK] = DIR_W; + walkCrewmanC(OBJECT_SPOCK, 0x5f, 0xa7, &Room::sins2SpockReachedTerminal); +} + +void Room::sins2SpockReachedTerminal() { + playVoc("EFX14S"); + loadActorAnimC(OBJECT_SPOCK, "susehw", -1, -1, &Room::sins2SpockUsedTerminal); +} + +void Room::sins2SpockUsedTerminal() { + showText(TX_SPEAKER_SPOCK, TX_SIN2_042); + showText(TX_SPEAKER_SPOCK, TX_SIN2_044); + + if (!_awayMission->sins.gotPointsForAccessingTerminal) { + _awayMission->sins.missionScore += 2; + _awayMission->sins.gotPointsForAccessingTerminal = true; + } + + showText(TX_SPEAKER_MCCOY, TX_SIN2_015); + showText(TX_SPEAKER_SPOCK, TX_SIN2_032); + showText(TX_SPEAKER_MOSHER, TX_SIN2_050); + showText(TX_SPEAKER_SPOCK, TX_SIN2_035); + showText(TX_SPEAKER_SPOCK, TX_SIN2_043); + showText(TX_SPEAKER_SPOCK, TX_SIN2_041); + showText(TX_SPEAKER_SPOCK, TX_SIN2_040); + showText(TX_SPEAKER_MCCOY, TX_SIN2_021); + showText(TX_SPEAKER_SPOCK, TX_SIN2_034); + showText(TX_SPEAKER_SPOCK, TX_SIN2_031); + showText(TX_SPEAKER_SPOCK, TX_SIN2_038); + showText(TX_SPEAKER_MCCOY, TX_SIN2_020); + showText(TX_SPEAKER_SPOCK, TX_SIN2_033); + showText(TX_SPEAKER_KIRK, TX_SIN2_007); + showText(TX_SPEAKER_SPOCK, TX_SIN2_037); + showText(TX_SPEAKER_MCCOY, TX_SIN2_022); + showText(TX_SPEAKER_SPOCK, TX_SIN2_029); +} + +void Room::sins2UseMccoyOnTerminal() { + showText(TX_SPEAKER_MCCOY, TX_SIN2_012); +} + +void Room::sins2UseRedshirtOnTerminal() { + showText(TX_SPEAKER_MOSHER, TX_SIN2_045); +} + +void Room::sins2UseSTricorderOnTerminal() { + spockScan(DIR_W, TX_SIN2_009); +} + +void Room::sins2UseSTricorderOnKeypad() { + spockScan(DIR_N, TX_SIN2_028); +} + +void Room::sins2UseSTricorderOnDoor() { + spockScan(DIR_N, TX_SIN2_027); +} + +void Room::sins2UseKirkOnKeypad() { + if (!_awayMission->sins.openedInnerDoor) { + showText(TX_SPEAKER_KIRK, TX_SIN2_001); + sins2UseSpockOnKeypad(); + } +} + +void Room::sins2UseSpockOnKeypad() { + if (!_awayMission->sins.openedInnerDoor) { + walkCrewmanC(OBJECT_SPOCK, 0xc3, 0x9b, &Room::sins2SpockReachedKeypad); + } +} + +void Room::sins2SpockReachedKeypad() { + const char *codes[] = { + "122", nullptr + }; + + int ans = showCodeInputBox(codes); + + if (ans == -1) { // ENHANCEMENT: if nothing was entered, do nothing. + } else if (ans == 1) { + playVoc("EFX28S"); + loadActorAnimC(OBJECT_SPOCK, "susehe", -1, -1, &Room::sins2EnteredCorrectCode); + } else { // Incorrect answer + playVoc("EFX28S"); + loadActorAnimC(OBJECT_SPOCK, "susehe", -1, -1, &Room::sins2EnteredIncorrectCode); + } +} + +void Room::sins2EnteredCorrectCode() { + _awayMission->sins.openedInnerDoor = true; + loadMapFile("sins22"); + playVoc("BIGDOOR3"); + loadActorAnimC(OBJECT_DOOR, "s2door", 0, 0, &Room::sins2DoorFinishedOpening); +} + +void Room::sins2EnteredIncorrectCode() { + showText(TX_SPEAKER_SPOCK, TX_SIN2_024); // BUGFIX: Speaker is spock, not "none" +} + +void Room::sins2DoorFinishedOpening() { + showText(TX_SPEAKER_SPOCK, TX_SIN2_010); +} + +void Room::sins2Tick40() { + if (!_awayMission->sins.enteredRoom2FirstTime) { + _awayMission->disableInput = false; + + showText(TX_SPEAKER_KIRK, TX_SIN2_005); + showText(TX_SPEAKER_SCOTT, TX_SIN2_S05); + showText(TX_SPEAKER_UHURA, TX_SIN2U085); + showText(TX_SPEAKER_KIRK, TX_SIN2_008); + showText(TX_SPEAKER_UHURA, TX_SIN2U097); + showText(TX_SPEAKER_MCCOY, TX_SIN2_F26); + showText(TX_SPEAKER_UHURA, TX_SIN2U096); + showText(TX_SPEAKER_MCCOY, TX_SIN2_019); + showText(TX_SPEAKER_KIRK, TX_SIN2_004); + + _awayMission->sins.enteredRoom2FirstTime = true; + } +} + +void Room::sins2LookAnywhere() { + showText(TX_SIN2N006); +} + +void Room::sins2LookAtOpenDoor() { + showText(TX_SIN2N007); +} + +void Room::sins2LookAtTerminal() { + showText(TX_SIN2N000); +} + +void Room::sins2LookAtKeypad() { + showText(TX_SIN2N001); +} + +void Room::sins2LookAtKirk() { + showText(TX_SIN2N003); +} + +void Room::sins2LookAtSpock() { + showText(TX_SIN2N005); +} + +void Room::sins2LookAtMccoy() { + showText(TX_SIN2N004); +} + +void Room::sins2LookAtRedshirt() { + showText(TX_SIN2N002); +} + +void Room::sins2TalkToKirk() { + showText(TX_SPEAKER_KIRK, TX_SIN2_003); +} + +void Room::sins2TalkToSpock() { + showText(TX_SPEAKER_SPOCK, TX_SIN2_039); + showText(TX_SPEAKER_MCCOY, TX_SIN2_016); +} + +void Room::sins2TalkToMccoy() { + showText(TX_SPEAKER_MCCOY, TX_SIN2_023); + showText(TX_SPEAKER_MOSHER, TX_SIN2_049); +} + +void Room::sins2TalkToRedshirt() { + showText(TX_SPEAKER_MOSHER, TX_SIN2_047); +} + +void Room::sins2LookAtDoor() { + if (!_awayMission->sins.openedInnerDoor) + showText(TX_SIN2N008); +} + +void Room::sins2UseSpockOnDoor() { + if (!_awayMission->sins.openedInnerDoor) { + showText(TX_SPEAKER_SPOCK, TX_SIN2_F12); + showText(TX_SPEAKER_MOSHER, TX_SIN2_048); + showText(TX_SPEAKER_SPOCK, TX_SIN2_030); + } +} + +void Room::sins2UseCommunicator() { + if (!_awayMission->sins.field46) { + showText(TX_SPEAKER_KIRK, TX_SIN2_006); + showText(TX_SPEAKER_SCOTT, TX_SIN2_S16); + showText(TX_SPEAKER_MCCOY, TX_SIN2_017); + } else + showText(TX_SPEAKER_UHURA, TX_SIN1U070); +} + +void Room::sins2UseMedkitOnCrewman() { + showText(TX_SPEAKER_MCCOY, TX_SIN2_014); +} + +void Room::sins2UseMTricorderOnCrewman() { + mccoyScan(DIR_S, TX_SIN3_008); // BUGFIX: original game had wrong audio file path +} + +void Room::sins2UseMccoyOnKeypad() { + if (!_awayMission->sins.openedInnerDoor) + showText(TX_SPEAKER_MCCOY, TX_SIN2_013); +} + +void Room::sins2UseRedshirtOnKeypad() { + if (!_awayMission->sins.openedInnerDoor) + showText(TX_SPEAKER_MOSHER, TX_SIN2_046); +} + +void Room::sins2WalkToDoor() { + if (_awayMission->sins.openedInnerDoor) + walkCrewman(OBJECT_KIRK, 0x9c, 0x8b); } } |