diff options
author | Matthew Stewart | 2018-07-04 02:34:11 -0400 |
---|---|---|
committer | Eugene Sandulenko | 2018-08-09 08:37:30 +0200 |
commit | 1e60b6f96bd2733544b1340c6db1e4c550e2ab1e (patch) | |
tree | fdafb1df95762e9e698cc5a767d98d26305d7d26 /engines/startrek/rooms | |
parent | ae3be7b40730387707bf4c104ea4f2ff8b588523 (diff) | |
download | scummvm-rg350-1e60b6f96bd2733544b1340c6db1e4c550e2ab1e.tar.gz scummvm-rg350-1e60b6f96bd2733544b1340c6db1e4c550e2ab1e.tar.bz2 scummvm-rg350-1e60b6f96bd2733544b1340c6db1e4c550e2ab1e.zip |
STARTREK: FEATHER3
Diffstat (limited to 'engines/startrek/rooms')
-rw-r--r-- | engines/startrek/rooms/feather3.cpp | 385 | ||||
-rw-r--r-- | engines/startrek/rooms/function_map.h | 8 |
2 files changed, 385 insertions, 8 deletions
diff --git a/engines/startrek/rooms/feather3.cpp b/engines/startrek/rooms/feather3.cpp index 0f5f3b3d44..fd87c81d2f 100644 --- a/engines/startrek/rooms/feather3.cpp +++ b/engines/startrek/rooms/feather3.cpp @@ -22,14 +22,395 @@ #include "startrek/room.h" -#define OBJECT_8 8 +#define OBJECT_TLAOXAC 8 +#define OBJECT_KNIFE 9 +#define OBJECT_ROCK 10 -#define HOTSPOT_20 0x20 +#define HOTSPOT_LEFT_EXIT 0x20 +#define HOTSPOT_LIGHT_1 0x21 +#define HOTSPOT_LIGHT_2 0x22 + +#define KNIFE_X 0x64 +#define KNIFE_Y 0xb4 namespace StarTrek { +extern const RoomAction feather3ActionList[] = { + { {ACTION_TICK, 1, 0, 0}, &Room::feather3Tick1 }, + { {ACTION_TICK, 40, 0, 0}, &Room::feather3Tick40 }, + { {ACTION_TOUCHED_HOTSPOT, 0, 0, 0}, &Room::feather3TouchedHotspot0 }, + { {ACTION_USE, OBJECT_SPOCK, OBJECT_TLAOXAC, 0}, &Room::feather3UseSpockOnTlaoxac }, + { {ACTION_USE, OBJECT_MCCOY, OBJECT_TLAOXAC, 0}, &Room::feather3UseMccoyOnTlaoxac }, + { {ACTION_USE, OBJECT_REDSHIRT, OBJECT_TLAOXAC, 0}, &Room::feather3UseRedshirtOnTlaoxac }, + { {ACTION_USE, OBJECT_SPOCK, HOTSPOT_LEFT_EXIT, 0}, &Room::feather3UseCrewmanOnLeftExit }, + { {ACTION_USE, OBJECT_MCCOY, HOTSPOT_LEFT_EXIT, 0}, &Room::feather3UseCrewmanOnLeftExit }, + { {ACTION_USE, OBJECT_REDSHIRT, HOTSPOT_LEFT_EXIT, 0}, &Room::feather3UseCrewmanOnLeftExit }, + { {ACTION_USE, OBJECT_ICOMM, 0, 0}, &Room::feather3UseCommunicator }, + { {ACTION_USE, OBJECT_ISNAKE, OBJECT_KIRK, 0}, &Room::feather3UseSnakeOnKirk }, + { {ACTION_USE, OBJECT_ISNAKE, OBJECT_SPOCK, 0}, &Room::feather3UseSnakeOnSpock }, + { {ACTION_USE, OBJECT_ISNAKE, OBJECT_REDSHIRT, 0}, &Room::feather3UseSnakeOnRedshirt }, + { {ACTION_FINISHED_WALKING, 2, 0, 0}, &Room::feather3KirkReachedRedshirtWithSnake }, + { {ACTION_USE, OBJECT_ISNAKE, OBJECT_MCCOY, 0}, &Room::feather3UseSnakeOnMccoy }, + { {ACTION_USE, OBJECT_ISNAKE, OBJECT_TLAOXAC, 0}, &Room::feather3UseSnakeOnTlaoxac }, + { {ACTION_USE, OBJECT_IKNIFE, OBJECT_SPOCK, 0}, &Room::feather3UseKnifeOnSpock }, + { {ACTION_USE, OBJECT_IKNIFE, OBJECT_MCCOY, 0}, &Room::feather3UseKnifeOnMccoy }, + { {ACTION_USE, OBJECT_IKNIFE, OBJECT_REDSHIRT, 0}, &Room::feather3UseKnifeOnRedshirt }, + { {ACTION_USE, OBJECT_IROCK, OBJECT_TLAOXAC, 0}, &Room::feather3UseRockOnTlaoxac }, + { {ACTION_FINISHED_WALKING, 3, 0, 0}, &Room::feather3KirkReachedPositionToThrowRock }, + { {ACTION_TIMER_EXPIRED, 4, 0, 0}, &Room::feather3Timer4Expired }, + { {ACTION_TIMER_EXPIRED, 2, 0, 0}, &Room::feather3Timer2Expired }, + { {ACTION_TIMER_EXPIRED, 3, 0, 0}, &Room::feather3Timer3Expired }, + { {ACTION_FINISHED_ANIMATION, 4, 0, 0}, &Room::feather3TlaoxacKnockedOutFromRockThrow }, + { {ACTION_USE, OBJECT_IPHASERS, 0xff, 0}, &Room::feather3UsePhaser }, + { {ACTION_USE, OBJECT_IPHASERK, 0xff, 0}, &Room::feather3UsePhaser }, + { {ACTION_TALK, OBJECT_MCCOY, 0, 0}, &Room::feather3TalkToMccoy }, + { {ACTION_TALK, OBJECT_SPOCK, 0, 0}, &Room::feather3TalkToSpock }, + { {ACTION_TALK, OBJECT_REDSHIRT, 0, 0}, &Room::feather3TalkToRedshirt }, + { {ACTION_TALK, OBJECT_TLAOXAC, 0, 0}, &Room::feather3TalkToTlaoxac }, + { {ACTION_FINISHED_ANIMATION, 2, 0, 0}, &Room::feather3TlaoxacKilledRedshirt }, + { {ACTION_USE, OBJECT_IMTRICOR, OBJECT_TLAOXAC, 0},&Room::feather3UseMTricorderOnTlaoxac }, + { {ACTION_USE, OBJECT_IMEDKIT, OBJECT_TLAOXAC, 0}, &Room::feather3UseMedkitOnTlaoxac }, + { {ACTION_USE, OBJECT_IMEDKIT, OBJECT_REDSHIRT, 0},&Room::feather3UseMedkitOnRedshirt }, + { {ACTION_USE, OBJECT_IMEDKIT, 0xff, 0}, &Room::feather3UseMedkitAnywhere }, + { {ACTION_USE, OBJECT_IMTRICOR, HOTSPOT_LIGHT_1, 0}, &Room::feather3UseMTricorderOnLight }, + { {ACTION_USE, OBJECT_IMTRICOR, HOTSPOT_LIGHT_2, 0}, &Room::feather3UseMTricorderOnLight }, + { {ACTION_USE, OBJECT_ISTRICOR, HOTSPOT_LIGHT_1, 0}, &Room::feather3UseSTricorderOnLight }, + { {ACTION_USE, OBJECT_ISTRICOR, HOTSPOT_LIGHT_2, 0}, &Room::feather3UseSTricorderOnLight }, + { {ACTION_USE, OBJECT_ISTRICOR, 0xff, 0}, &Room::feather3UseSTricorderAnywhere }, + { {ACTION_GET, OBJECT_KNIFE, 0, 0}, &Room::feather3GetKnife }, + { {ACTION_FINISHED_WALKING, 1, 0, 0}, &Room::feather3ReachedKnife }, + { {ACTION_TIMER_EXPIRED, 1, 0, 0}, &Room::feather3Timer1Expired }, + { {ACTION_FINISHED_ANIMATION, 1, 0, 0}, &Room::feather3PickedUpKnife }, + { {ACTION_LOOK, OBJECT_SPOCK, 0, 0}, &Room::feather3LookAtSpock }, + { {ACTION_LOOK, OBJECT_REDSHIRT, 0, 0}, &Room::feather3LookAtRedshirt }, + { {ACTION_LOOK, OBJECT_TLAOXAC, 0, 0}, &Room::feather3LookAtTlaoxac }, + { {ACTION_LOOK, HOTSPOT_LIGHT_1, 0, 0}, &Room::feather3LookAtLight }, + { {ACTION_LOOK, HOTSPOT_LIGHT_2, 0, 0}, &Room::feather3LookAtLight }, + { {ACTION_LOOK, OBJECT_MCCOY, 0, 0}, &Room::feather3LookAtMccoy }, + { {ACTION_LOOK, OBJECT_KNIFE, 0, 0}, &Room::feather3LookAtKnife }, +}; + +extern const int feather3NumActions = sizeof(feather3ActionList) / sizeof(RoomAction); + + void Room::feather3Tick1() { + playVoc("FEA3LOOP"); + playMidiMusicTracks(27); + + if (!_vm->_awayMission.feather.tlaoxacTestPassed) { + loadActorAnim(OBJECT_TLAOXAC, "s5r3as", 0x2e, 0xab); + loadMapFile("feath3b"); + } else if (!_vm->_awayMission.feather.tookKnife) + loadActorAnim(OBJECT_KNIFE, "s5r3nf", 0x64, 0xb4); +} + +void Room::feather3Tick40() { + if (!_vm->_awayMission.feather.tlaoxacTestPassed) + showText(TX_SPEAKER_TLAOXAC, TX_FEA3_036); +} + +void Room::feather3TouchedHotspot0() { // Tlaoxac prevents you from passing this point + if (!_vm->_awayMission.feather.tlaoxacTestPassed) + showText(TX_SPEAKER_TLAOXAC, TX_FEA3_035); +} + +void Room::feather3UseSpockOnTlaoxac() { + showText(TX_SPEAKER_SPOCK, TX_FEA3_026); + showText(TX_SPEAKER_MCCOY, TX_FEA3_018); + showText(TX_SPEAKER_SPOCK, TX_FEA3_028); + showText(TX_SPEAKER_MCCOY, TX_FEA3_015); +} + +void Room::feather3UseMccoyOnTlaoxac() { + showText(TX_SPEAKER_MCCOY, TX_FEA3_016); + showText(TX_SPEAKER_SPOCK, TX_FEA3_027); + showText(TX_SPEAKER_MCCOY, TX_FEA3_017); +} + +void Room::feather3UseRedshirtOnTlaoxac() { + if (!_vm->_awayMission.redshirtDead) + showText(TX_SPEAKER_STRAGEY, TX_FEA3_029); +} + +void Room::feather3UseCrewmanOnLeftExit() { + if (!_vm->_awayMission.feather.tlaoxacTestPassed) + showText(TX_SPEAKER_TLAOXAC, TX_FEA3_041); +} + +void Room::feather3UseCommunicator() { + showText(TX_SPEAKER_SPOCK, TX_FEA3_024); +} + +void Room::feather3UseSnakeOnKirk() { + if (!_vm->_awayMission.feather.tlaoxacTestPassed && !_vm->_awayMission.redshirtDead) { + if (_roomVar.feather.showedSnakeToTlaoxac && _vm->_awayMission.feather.numRocksThrownAtTlaoxac == 0) { + showText(TX_SPEAKER_TLAOXAC, TX_FEA3_043); + _vm->_awayMission.feather.tlaoxacTestPassed = true; + _vm->_awayMission.feather.missionScore += 2; + loadMapFile("feather3"); + loadActorAnim(OBJECT_KNIFE, "s5r3nf", KNIFE_X, KNIFE_Y); + _vm->_awayMission.feather.field2e = true; + } else + showText(TX_FEA3N004); + } +} + +void Room::feather3UseSnakeOnSpock() { + if (_roomVar.feather.showedSnakeToTlaoxac) + showText(TX_SPEAKER_SPOCK, TX_FEA3_004); + else + showText(TX_SPEAKER_SPOCK, TX_FEA3_020); +} + +void Room::feather3UseSnakeOnRedshirt() { + if (!_vm->_awayMission.feather.tlaoxacTestPassed && !_vm->_awayMission.redshirtDead) { + if (_roomVar.feather.showedSnakeToTlaoxac && _vm->_awayMission.feather.numRocksThrownAtTlaoxac == 0) { + walkCrewmanC(OBJECT_KIRK, 0x7c, 0xbc, &Room::feather3KirkReachedRedshirtWithSnake); + _vm->_awayMission.disableInput = true; + } else + showText(TX_SPEAKER_STRAGEY, TX_FEA3_031); + } +} + +void Room::feather3KirkReachedRedshirtWithSnake() { + _vm->_awayMission.disableInput = false; + + showText(TX_SPEAKER_STRAGEY, TX_FEA3_034); + showText(TX_SPEAKER_TLAOXAC, TX_FEA3_044); + + _vm->_awayMission.feather.tlaoxacTestPassed = true; + _vm->_awayMission.feather.missionScore += 1; + loadMapFile("feather3"); + loadActorAnim(OBJECT_KNIFE, "s5r3nf", KNIFE_X, KNIFE_Y); + _vm->_awayMission.feather.field2e = true; +} + +void Room::feather3UseSnakeOnMccoy() { + showText(TX_SPEAKER_MCCOY, TX_FEA3_007); +} + +void Room::feather3UseSnakeOnTlaoxac() { + if (!_vm->_awayMission.feather.tlaoxacTestPassed && _vm->_awayMission.feather.numRocksThrownAtTlaoxac == 0) { + showText(TX_SPEAKER_TLAOXAC, TX_FEA3_039); + _roomVar.feather.showedSnakeToTlaoxac = true; + if (!_vm->_awayMission.feather.showedSnakeToTlaoxac) { + _vm->_awayMission.feather.showedSnakeToTlaoxac = true; + _vm->_awayMission.feather.missionScore += 1; + } + } +} + +void Room::feather3UseKnifeOnSpock() { + showText(TX_SPEAKER_SPOCK, TX_FEA3_025); +} + +void Room::feather3UseKnifeOnMccoy() { + showText(TX_SPEAKER_MCCOY, TX_FEA3_011); // BUGFIX: Speaker is Mccoy, not Spock. +} + +void Room::feather3UseKnifeOnRedshirt() { + if (!_vm->_awayMission.redshirtDead) + showText(TX_SPEAKER_STRAGEY, TX_FEA3_033); // BUGFIX: Speaker is Stragey, not Spock. +} + +void Room::feather3UseRockOnTlaoxac() { + if (_roomVar.feather.tlaoxacUnconscious) + showText(TX_SPEAKER_MCCOY, TX_FEA3_009); + else { + _vm->_awayMission.feather.numRocksThrownAtTlaoxac++; + _vm->_awayMission.disableInput = true; + walkCrewmanC(OBJECT_KIRK, 0xac, 0xb4, &Room::feather3KirkReachedPositionToThrowRock); + } +} + +void Room::feather3KirkReachedPositionToThrowRock() { + _vm->_awayMission.crewDirectionsAfterWalk[OBJECT_KIRK] = DIR_W; + loadActorAnim2(OBJECT_KIRK, "s5r3kt"); + loadActorAnim(OBJECT_ROCK, "s5r3rt", 0x80, 0x7e); + _vm->_awayMission.timers[4] = 21; + + if (_vm->_awayMission.feather.numRocksThrownAtTlaoxac == 2) { + _vm->_awayMission.feather.knockedOutTlaoxac = true; + _vm->_awayMission.feather.missionScore -= 2; + loadActorAnimC(OBJECT_TLAOXAC, "s5r3ad", -1, -1, &Room::feather3TlaoxacKnockedOutFromRockThrow); + playVoc("ROCKFACE"); + _vm->_awayMission.timers[2] = 24; + } else { + loadActorAnim2(OBJECT_TLAOXAC, "s5r3ah"); + playVoc("ROCKFACE"); + _vm->_awayMission.timers[3] = 97; + } +} + +void Room::feather3Timer4Expired() { + playSoundEffectIndex(SND_BLANK_0b); +} + +void Room::feather3Timer2Expired() { + if (!_vm->_awayMission.feather.tookKnife) + loadActorAnim(OBJECT_KNIFE, "s5r3nf", KNIFE_X, KNIFE_Y); +} + +void Room::feather3Timer3Expired() { + _vm->_awayMission.disableInput = false; + loadActorStandAnim(OBJECT_KIRK); +} + +void Room::feather3TlaoxacKnockedOutFromRockThrow() { + _vm->_awayMission.disableInput = false; + loadActorStandAnim(OBJECT_KIRK); + showText(TX_FEA3N006); + + if (!_vm->_awayMission.feather.tookKnife && !_vm->_awayMission.feather.field2e) + showText(TX_SPEAKER_MCCOY, TX_FEA3_008); + + _vm->_awayMission.feather.tlaoxacTestPassed = true; + _roomVar.feather.tlaoxacUnconscious = true; + loadMapFile("feather3"); +} + +void Room::feather3UsePhaser() { + showText(TX_SPEAKER_SPOCK, TX_FEA3_023); +} + +void Room::feather3TalkToMccoy() { + showText(TX_SPEAKER_MCCOY, TX_FEA3_005); +} + +void Room::feather3TalkToSpock() { + showText(TX_SPEAKER_SPOCK, TX_FEA3_022); +} + +void Room::feather3TalkToRedshirt() { + if (!_vm->_awayMission.redshirtDead) + showText(TX_SPEAKER_STRAGEY, TX_FEA3_032); +} + +void Room::feather3TalkToTlaoxac() { + if (!_vm->_awayMission.feather.tlaoxacTestPassed && !_vm->_awayMission.redshirtDead && !_roomVar.feather.tlaoxacUnconscious) { + if (!_roomVar.feather.showedSnakeToTlaoxac) + showText(TX_SPEAKER_TLAOXAC, TX_FEA3_038); + else if (_vm->_awayMission.feather.numRocksThrownAtTlaoxac != 0) + showText(TX_SPEAKER_TLAOXAC, TX_FEA3_038); + else { + const TextRef choices[] = { + TX_SPEAKER_KIRK, + TX_FEA3_001, TX_FEA3_002, TX_FEA3_003, + TX_BLANK + }; + int choice = showText(choices); + + if (choice == 0) + showText(TX_SPEAKER_TLAOXAC, TX_FEA3_037); + else if (choice == 1) + showText(TX_SPEAKER_TLAOXAC, TX_FEA3_042); + else if (choice == 2) { // Accidentally insulted Quetzecoatl + showText(TX_SPEAKER_TLAOXAC, TX_FEA3_040); + _vm->_awayMission.disableInput = true; + loadActorAnimC(OBJECT_TLAOXAC, "s5r3aj", -1, -1, &Room::feather3TlaoxacKilledRedshirt); + playMidiMusicTracks(2); + loadActorAnim(OBJECT_REDSHIRT, "s5r3rd"); + _vm->_awayMission.redshirtDead = true; + } else + showText(TX_DIALOG_ERROR); + } + } +} + +void Room::feather3TlaoxacKilledRedshirt() { + _vm->_awayMission.disableInput = false; +} + +void Room::feather3UseMTricorderOnTlaoxac() { + if (_roomVar.feather.tlaoxacUnconscious) + mccoyScan(DIR_W, TX_FEA3_010); + else + mccoyScan(DIR_W, TX_FEA3_014); +} + +void Room::feather3UseMedkitOnTlaoxac() { + if (_vm->_awayMission.feather.knockedOutTlaoxac) + showText(TX_SPEAKER_MCCOY, TX_FEA3_012); +} + +void Room::feather3UseMedkitOnRedshirt() { + if (_vm->_awayMission.redshirtDead) { + // BUGFIX: Original voice clip (TX_FEA3_030) is someone who's clearly not Kelley + // saying "he's dead, Jim". He recorded the line a few other times, so use one of + // those instead. + mccoyScan(DIR_N, TX_LOVA_100); + } +} + +void Room::feather3UseMedkitAnywhere() { + showText(TX_SPEAKER_MCCOY, TX_FEA3_006); +} + +void Room::feather3UseMTricorderOnLight() { + mccoyScan(DIR_W, TX_FEA3_013); +} + +void Room::feather3UseSTricorderOnLight() { + spockScan(DIR_W, TX_FEA3_019); +} + +void Room::feather3UseSTricorderAnywhere() { + spockScan(DIR_S, TX_FEA3_021); +} + +void Room::feather3GetKnife() { + _vm->_awayMission.feather.missionScore += 1; + walkCrewmanC(OBJECT_KIRK, 0x57, 0xb4, &Room::feather3ReachedKnife); + _vm->_awayMission.disableInput = true; +} + +void Room::feather3ReachedKnife() { + loadActorAnimC(OBJECT_KIRK, "s5r1kg", -1, -1, &Room::feather3PickedUpKnife); + _vm->_awayMission.timers[1] = 20; +} + +void Room::feather3Timer1Expired() { + giveItem(OBJECT_IKNIFE); + loadActorStandAnim(OBJECT_KNIFE); +} + +void Room::feather3PickedUpKnife() { + _vm->_awayMission.disableInput = false; + loadActorStandAnim(OBJECT_KIRK); + showText(TX_FEA3N010); +} + +void Room::feather3LookAtSpock() { + if (!_vm->_awayMission.feather.knockedOutTlaoxac && !_vm->_awayMission.feather.tlaoxacTestPassed) + showText(TX_FEA3N002); + else // ENHANCEMENT: Originally did nothing here. Fall back to default behaviour in the engine. + _vm->_awayMission.rdfStillDoDefaultAction = true; +} + +void Room::feather3LookAtRedshirt() { + if (_vm->_awayMission.redshirtDead) + showText(TX_FEA3N005); + else + showText(TX_FEA3N012); +} + +void Room::feather3LookAtTlaoxac() { + if (_vm->_awayMission.feather.knockedOutTlaoxac) + showText(TX_FEA3N003); + else + showText(TX_FEA3N007); +} + +void Room::feather3LookAtLight() { + showText(TX_FEA3N001); +} + +void Room::feather3LookAtMccoy() { + showText(TX_FEA3N000); +} +void Room::feather3LookAtKnife() { + showText(TX_FEA3N011); } } diff --git a/engines/startrek/rooms/function_map.h b/engines/startrek/rooms/function_map.h index cca19c46f7..95f343ccf7 100644 --- a/engines/startrek/rooms/function_map.h +++ b/engines/startrek/rooms/function_map.h @@ -1782,12 +1782,8 @@ RoomAction feather0ActionList[] = { { {ACTION_USE, OBJECT_IMTRICOR, 8, 0}, &Room::feather0UseMTricorderOnQuetzecoatl }, }; -extern const RoomAction feather1ActionList[], feather2ActionList[]; -extern const int feather1NumActions, feather2NumActions; - -RoomAction feather3ActionList[] = { - { {ACTION_TICK, 1, 0, 0}, &Room::feather3Tick1 }, -}; +extern const RoomAction feather1ActionList[], feather2ActionList[], feather3ActionList[]; +extern const int feather1NumActions, feather2NumActions, feather3NumActions; RoomAction feather4ActionList[] = { { {ACTION_TICK, 1, 0, 0}, &Room::feather4Tick1 }, |