aboutsummaryrefslogtreecommitdiff
path: root/engines/startrek/rooms
diff options
context:
space:
mode:
authorMatthew Stewart2018-07-04 02:34:11 -0400
committerEugene Sandulenko2018-08-09 08:37:30 +0200
commit1e60b6f96bd2733544b1340c6db1e4c550e2ab1e (patch)
treefdafb1df95762e9e698cc5a767d98d26305d7d26 /engines/startrek/rooms
parentae3be7b40730387707bf4c104ea4f2ff8b588523 (diff)
downloadscummvm-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.cpp385
-rw-r--r--engines/startrek/rooms/function_map.h8
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 },