aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/startrek/action.h6
-rw-r--r--engines/startrek/awaymission.h6
-rw-r--r--engines/startrek/room.cpp2
-rw-r--r--engines/startrek/room.h53
-rw-r--r--engines/startrek/rooms/feather3.cpp385
-rw-r--r--engines/startrek/rooms/function_map.h8
-rw-r--r--engines/startrek/text.h117
7 files changed, 558 insertions, 19 deletions
diff --git a/engines/startrek/action.h b/engines/startrek/action.h
index ab50defdb7..1416736ec5 100644
--- a/engines/startrek/action.h
+++ b/engines/startrek/action.h
@@ -42,12 +42,6 @@ enum ActionTypes {
ACTION_TOUCHED_HOTSPOT = 7, // Second kind of "hotspot" only relevant when an object touches them
ACTION_TIMER_EXPIRED = 8,
- ACTION_DONE_ANIM = 10,
- ACTION_DONE_WALK = 12,
-
- // TODO: Remove these two as redundant.
- // They're only here because I don't want to mess up the spacing in function_map.h by
- // find/replacing the old name.
ACTION_FINISHED_ANIMATION = 10,
ACTION_FINISHED_WALKING = 12,
diff --git a/engines/startrek/awaymission.h b/engines/startrek/awaymission.h
index 4c4d0bccfb..8202ddb4a5 100644
--- a/engines/startrek/awaymission.h
+++ b/engines/startrek/awaymission.h
@@ -250,7 +250,13 @@ struct AwayMission {
bool gotRock; // 0x2b
bool gotSnake; // 0x2c
+ bool tookKnife; // 0x2d
+ bool field2e; // 0x2e
+ byte numRocksThrownAtTlaoxac; // 0x2f
bool holeBlocked; // 0x31
+ bool tlaoxacTestPassed; // 0x32
+ bool knockedOutTlaoxac; // 0x33
+ bool showedSnakeToTlaoxac; // 0x35
int16 missionScore; // 0x36
} feather;
};
diff --git a/engines/startrek/room.cpp b/engines/startrek/room.cpp
index a2e5ff3e13..4dc15957f8 100644
--- a/engines/startrek/room.cpp
+++ b/engines/startrek/room.cpp
@@ -145,7 +145,7 @@ Room::Room(StarTrekEngine *vm, const Common::String &name) : _vm(vm) {
}
else if (name == "FEATHER3") {
_roomActionList = feather3ActionList;
- _numRoomActions = sizeof(feather3ActionList) / sizeof(RoomAction);
+ _numRoomActions = feather3NumActions;
}
else if (name == "FEATHER4") {
_roomActionList = feather4ActionList;
diff --git a/engines/startrek/room.h b/engines/startrek/room.h
index 2a37c7f552..e5a630db7d 100644
--- a/engines/startrek/room.h
+++ b/engines/startrek/room.h
@@ -1521,6 +1521,51 @@ public:
// FEATHER3
void feather3Tick1();
+ void feather3Tick40();
+ void feather3TouchedHotspot0();
+ void feather3UseSpockOnTlaoxac();
+ void feather3UseMccoyOnTlaoxac();
+ void feather3UseRedshirtOnTlaoxac();
+ void feather3UseCrewmanOnLeftExit();
+ void feather3UseCommunicator();
+ void feather3UseSnakeOnKirk();
+ void feather3UseSnakeOnSpock();
+ void feather3UseSnakeOnRedshirt();
+ void feather3KirkReachedRedshirtWithSnake();
+ void feather3UseSnakeOnMccoy();
+ void feather3UseSnakeOnTlaoxac();
+ void feather3UseKnifeOnSpock();
+ void feather3UseKnifeOnMccoy();
+ void feather3UseKnifeOnRedshirt();
+ void feather3UseRockOnTlaoxac();
+ void feather3KirkReachedPositionToThrowRock();
+ void feather3Timer4Expired();
+ void feather3Timer2Expired();
+ void feather3Timer3Expired();
+ void feather3TlaoxacKnockedOutFromRockThrow();
+ void feather3UsePhaser();
+ void feather3TalkToMccoy();
+ void feather3TalkToSpock();
+ void feather3TalkToRedshirt();
+ void feather3TalkToTlaoxac();
+ void feather3TlaoxacKilledRedshirt();
+ void feather3UseMTricorderOnTlaoxac();
+ void feather3UseMedkitOnTlaoxac();
+ void feather3UseMedkitOnRedshirt();
+ void feather3UseMedkitAnywhere();
+ void feather3UseMTricorderOnLight();
+ void feather3UseSTricorderOnLight();
+ void feather3UseSTricorderAnywhere();
+ void feather3GetKnife();
+ void feather3ReachedKnife();
+ void feather3Timer1Expired();
+ void feather3PickedUpKnife();
+ void feather3LookAtSpock();
+ void feather3LookAtRedshirt();
+ void feather3LookAtTlaoxac();
+ void feather3LookAtLight();
+ void feather3LookAtMccoy();
+ void feather3LookAtKnife();
// FEATHER4
void feather4Tick1();
@@ -1658,11 +1703,11 @@ private:
byte snakeInHole; // 0xca
bool scannedSnake; // 0xcb
bool crewEscaped[4]; // 0xcc
- byte kirkEscaped; // 0xcc
- byte spockEscaped; // 0xcd
- byte mccoyEscaped; // 0xce
- byte cf; // 0xcf
byte crewmanClimbingVine;
+
+ // feather2
+ bool showedSnakeToTlaoxac; // 0xca
+ bool tlaoxacUnconscious; // 0xcb
} feather;
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 },
diff --git a/engines/startrek/text.h b/engines/startrek/text.h
index 4dab29d7e2..15d20ae16d 100644
--- a/engines/startrek/text.h
+++ b/engines/startrek/text.h
@@ -105,6 +105,7 @@ enum GameStringIDs {
TX_SPEAKER_STRAGEY,
TX_SPEAKER_QUETZECOATL,
+ TX_SPEAKER_TLAOXAC,
TX_BRIDU146,
@@ -1744,6 +1745,64 @@ enum GameStringIDs {
TX_FEA2N008,
+ TX_FEA3_001,
+ TX_FEA3_002,
+ TX_FEA3_003,
+ TX_FEA3_004,
+ TX_FEA3_005,
+ TX_FEA3_006,
+ TX_FEA3_007,
+ TX_FEA3_008,
+ TX_FEA3_009,
+ TX_FEA3_010,
+ TX_FEA3_011,
+ TX_FEA3_012,
+ TX_FEA3_013,
+ TX_FEA3_014,
+ TX_FEA3_015,
+ TX_FEA3_016,
+ TX_FEA3_017,
+ TX_FEA3_018,
+ TX_FEA3_019,
+ TX_FEA3_020,
+ TX_FEA3_021,
+ TX_FEA3_022,
+ TX_FEA3_023,
+ TX_FEA3_024,
+ TX_FEA3_025,
+ TX_FEA3_026,
+ TX_FEA3_027,
+ TX_FEA3_028,
+ TX_FEA3_029,
+ TX_FEA3_030,
+ TX_FEA3_031,
+ TX_FEA3_032,
+ TX_FEA3_033,
+ TX_FEA3_034,
+ TX_FEA3_035,
+ TX_FEA3_036,
+ TX_FEA3_037,
+ TX_FEA3_038,
+ TX_FEA3_039,
+ TX_FEA3_040,
+ TX_FEA3_041,
+ TX_FEA3_042,
+ TX_FEA3_043,
+ TX_FEA3_044,
+ TX_FEA3N000,
+ TX_FEA3N001,
+ TX_FEA3N002,
+ TX_FEA3N003,
+ TX_FEA3N004,
+ TX_FEA3N005,
+ TX_FEA3N006,
+ TX_FEA3N007,
+ // MISSING
+ TX_FEA3N010,
+ TX_FEA3N011,
+ TX_FEA3N012,
+
+
TX_SIN3_012,
@@ -1800,6 +1859,7 @@ const char * const g_gameStrings[] = {
"Lt. Stragey",
"Quetzecoatl",
+ "Tlaoxac",
"#BRID\\BRIDU146#Nothing to report, Captain.",
@@ -3426,6 +3486,63 @@ const char * const g_gameStrings[] = {
"#FEA2\\FEA2N008#You are in a densely vegetated area. The overgrowth blocks your view in all directions.",
+ "#FEA3\\FEA3_001#Well, does anyone have any suggestions?",
+ "#FEA3\\FEA3_002#Great Tlaoxac, I do not understand. Quetzecoatl says that his is the way of peace, yet you wish blood to be shed?",
+ "#FEA3\\FEA3_003#It is urgent that we speak to Quetzecoatl. His life may depend on it. Please stand aside and let us pass?",
+ "#FEA3\\FEA3_004#An intriguing solution Captain, but it is unlikely that he will accept green blood as a proper sacrifice.",
+ "#FEA3\\FEA3_005#Did you ever get the feeling that people don't like you?",
+ "#FEA3\\FEA3_006#Everyone is healthy, Jim, there's no need for the medical kit here.",
+ "#FEA3\\FEA3_007#Get that thing away from me!",
+ "#FEA3\\FEA3_008#He dropped a knife, Jim!",
+ "#FEA3\\FEA3_009#He's out cold, Jim.I don't think we'll have any more trouble from him.",
+ "#FEA3\\FEA3_010#He's unconscious, Jim.",
+ "#FEA3\\FEA3_011#Hey! What do you think you're doing?",
+ "#FEA3\\FEA3_012#Jim, he'll be up in about a half hour. If I wake him now he's liable to retalliate for your thoughtless actions.", // TYPO
+ "#FEA3\\FEA3_013#These lamps are made up of insects much like fireflies, Jim.",
+ "#FEA3\\FEA3_014#Well, either this Aztec is a real flesh and blood human being, or I'm going to be retired as soon as I get back to the Enterprise.",
+ "#FEA3\\FEA3_015#Damn. He noticed.",
+ "#FEA3\\FEA3_016#Isn't that what they said to David before he fought Goliath?",
+ "#FEA3\\FEA3_017#Well, then send in David!",
+ "#FEA3\\FEA3_018#What about your famous nerve pinch?",
+ "#FEA3\\FEA3_019#Fascinating. These lights are actually swarms of bio-luminescent insects. I wonder how they are controlled.",
+ "#FEA3\\FEA3_020#Interesting. From the angle of its fangs and the shape of its mouth, it might have had the ability to inject its prey with venom at one time.", // TYPO
+ "#FEA3\\FEA3_021#Nothing unusual here, Captain.",
+ "#FEA3\\FEA3_022#Perhaps our host will be more reasonable now. I recommend trying to locate him, Captain.",
+ "#FEA3\\FEA3_023#Still inoperative, Captain.",
+ "#FEA3\\FEA3_024#Still inoperative, Captain.",
+ "#FEA3\\FEA3_025#That is not a logical act, Captain.",
+ "#FEA3\\FEA3_026#Captain, I do not think that I can defeat him in personal combat.",
+ "#FEA3\\FEA3_027#Doctor, may I remind you that David defeated Goliath?",
+ "#FEA3\\FEA3_028#It is unlikely to work on a man of that size, doctor.",
+ "#FEA3\\FEA3_029#All right! Time for some action. Let me show you how we did it at the Acad... uh, Captain, do you realize how BIG this guy is?",
+ "#FEA3\\FEA3_030#sHe's dead, Jim!", // TYPO
+ "#FEA3\\FEA3_031#I'm really not that anxious to get a good look at it, sir.",
+ "#FEA3\\FEA3_032#Nice planet. I kinda like it.",
+ "#FEA3\\FEA3_033#Ouch, sir.",
+ "#FEA3\\FEA3_034#Well, there is a doctor here, so I guess it's all right. They never told me I'd be doing this at the Academy.",
+ "#FEA3\\FEA3_035#Get back! You may not pass until you prove your worthiness.",
+ "#FEA3\\FEA3_036#I am Tlaoxac, priest of Quetzecoatl. Only one who knows his ways may approach his holy ground.",
+ "#FEA3\\FEA3_037#I do not understand your words, but it does not matter. You may not pass until blood is shed.",
+ "#FEA3\\FEA3_038#I will not listen to your deceitful ways.",
+ "#FEA3\\FEA3_039#Indeed you know the ways of Quetzecoatl But only a man of courage, one who will shed blood will pass.",
+ "#FEA3\\FEA3_040#None can threaten the great Quetzecoatl! You lie! Truly you do not serve the serpent-god. You may not pass!",
+ "#FEA3\\FEA3_041#None shall pass until blood is shed.", // TYPO
+ "#FEA3\\FEA3_042#Nonetheless, that is what must be done. Only men of courage are allowed into his presence.",
+ "#FEA3\\FEA3_043#Self-sacrifice is the noblest quality of humanity. You may go. Beware the monster in the water. You may have my knife to defend yourself.",
+ "#FEA3\\FEA3_044#You are truly a noble man, unlike the coward who was not capable of shedding his own blood. You may pass, but beware the man in the golden robe. He may lead you to your death. Use this knife to defend yourself.",
+ "#FEA3\\FEA3N000#McCoy seems rather nervous.",
+ "#FEA3\\FEA3N001#Primitive lights illuminate this savage scene.",
+ "#FEA3\\FEA3N002#Spock looks small compared to the great warrior.",
+ "#FEA3\\FEA3N003#The aztec warrior lies on the ground unconcious.",
+ "#FEA3\\FEA3N004#The snake enjoys snacking on you.",
+ "#FEA3\\FEA3N005#This was once a living member of your crew.",
+ "#FEA3\\FEA3N006#Tloaxac falls to the ground unconscious.",
+ "#FEA3\\FEA3N007#Towering over your security officer, holding a great spear in his huge hands, the great warrior Tlaoxac will let no one pass him.",
+ "#FEA3\\FEA3N010#You pick up the beautifully crafted knife.",
+ "#FEA3\\FEA3N011#You see a jewel encrusted, gold colored knife.",
+ "#FEA3\\FEA3N012#Your security officer looks at you for orders and, perhaps, inspiration.",
+
+
"#SIN3\\SIN3_012#Can't say I like the decor.",