diff options
-rw-r--r-- | engines/startrek/awaymission.cpp | 14 | ||||
-rw-r--r-- | engines/startrek/awaymission.h | 12 | ||||
-rw-r--r-- | engines/startrek/room.cpp | 14 | ||||
-rw-r--r-- | engines/startrek/room.h | 105 | ||||
-rw-r--r-- | engines/startrek/rooms/feather1.cpp | 645 | ||||
-rw-r--r-- | engines/startrek/rooms/function_map.h | 5 | ||||
-rw-r--r-- | engines/startrek/text.h | 168 |
7 files changed, 948 insertions, 15 deletions
diff --git a/engines/startrek/awaymission.cpp b/engines/startrek/awaymission.cpp index daf28958fe..8ae11d4d7e 100644 --- a/engines/startrek/awaymission.cpp +++ b/engines/startrek/awaymission.cpp @@ -120,7 +120,7 @@ void StarTrekEngine::initAwayCrewPositions(int warpEntryIndex) { memset(_awayMission.crewDirectionsAfterWalk, 0xff, 4); switch (warpEntryIndex) { - case 0: // 0-3: Read warp positions from RDF file + case 0: // 0-3: Crew spawns in a spot and walks to a spot. case 1: case 2: case 3: @@ -155,9 +155,19 @@ void StarTrekEngine::initAwayCrewPositions(int warpEntryIndex) { playSoundEffectIndex(0x09); _warpHotspotsActive = false; break; - case 5: + case 5: // Crew spawns in directly at a position. + for (int i = 0; i < (_awayMission.redshirtDead ? 3 : 4); i++) { + Common::String animFilename = getCrewmanAnimFilename(i, "stnds"); + Common::Point warpPos = _room->getSpawnPosition(i); + loadActorAnimWithRoomScaling(i, animFilename, warpPos.x, warpPos.y); + } + _warpHotspotsActive = true; break; case 6: + error("initAwayCrewPositions(6) unimplemented"); + break; + default: + warning("Invalid parameter (%d) to initAwayCrewPositions", warpEntryIndex); break; } } diff --git a/engines/startrek/awaymission.h b/engines/startrek/awaymission.h index 21b75f981a..4c4d0bccfb 100644 --- a/engines/startrek/awaymission.h +++ b/engines/startrek/awaymission.h @@ -241,6 +241,18 @@ struct AwayMission { bool repairedLifeSupportGenerator; // 0x59 int16 missionScore; // 0x5a } mudd; + + struct { + // 0: initial state + // 1: one rock thrown at it + // 2: two rocks thrown at it (low enough to climb up) + byte vineState; // 0x2a + + bool gotRock; // 0x2b + bool gotSnake; // 0x2c + bool holeBlocked; // 0x31 + int16 missionScore; // 0x36 + } feather; }; }; // Size: 0x129 bytes diff --git a/engines/startrek/room.cpp b/engines/startrek/room.cpp index 1c467d37c7..0ce807b198 100644 --- a/engines/startrek/room.cpp +++ b/engines/startrek/room.cpp @@ -137,7 +137,7 @@ Room::Room(StarTrekEngine *vm, const Common::String &name) : _vm(vm) { } else if (name == "FEATHER1") { _roomActionList = feather1ActionList; - _numRoomActions = sizeof(feather1ActionList) / sizeof(RoomAction); + _numRoomActions = feather1NumActions; } else if (name == "FEATHER2") { _roomActionList = feather2ActionList; @@ -180,7 +180,7 @@ uint16 Room::readRdfWord(int offset) { } bool Room::actionHasCode(const Action &action) { - RoomAction *roomActionPtr = _roomActionList; + const RoomAction *roomActionPtr = _roomActionList; int n = _numRoomActions; while (n-- > 0) { @@ -192,7 +192,7 @@ bool Room::actionHasCode(const Action &action) { } bool Room::handleAction(const Action &action) { - RoomAction *roomActionPtr = _roomActionList; + const RoomAction *roomActionPtr = _roomActionList; int n = _numRoomActions; while (n-- > 0) { @@ -208,7 +208,7 @@ bool Room::handleAction(const Action &action) { } bool Room::handleActionWithBitmask(const Action &action) { - RoomAction *roomActionPtr = _roomActionList; + const RoomAction *roomActionPtr = _roomActionList; int n = _numRoomActions; while (n-- > 0) { @@ -225,10 +225,14 @@ bool Room::handleActionWithBitmask(const Action &action) { } Common::Point Room::getBeamInPosition(int crewmanIndex) { - int base = 0xaa + crewmanIndex * 4; + int base = RDF_BEAM_IN_POSITIONS + crewmanIndex * 4; return Common::Point(readRdfWord(base), readRdfWord(base + 2)); } +Common::Point Room::getSpawnPosition(int crewmanIndex) { + int base = RDF_SPAWN_POSITIONS + crewmanIndex * 4; + return Common::Point(readRdfWord(base), readRdfWord(base + 2)); +} // For actions of type ACTION_FINISHED_ANIMATION or ACTION_FINISHED_WALKING, this takes // a function pointer and returns the index corresponding to that callback. diff --git a/engines/startrek/room.h b/engines/startrek/room.h index 2b5f95cd17..bd6d7d9420 100644 --- a/engines/startrek/room.h +++ b/engines/startrek/room.h @@ -49,6 +49,7 @@ struct RoomAction { const int RDF_WARP_ROOM_INDICES = 0x22; const int RDF_ROOM_ENTRY_POSITIONS = 0x2a; const int RDF_BEAM_IN_POSITIONS = 0xaa; +const int RDF_SPAWN_POSITIONS = 0xba; class Room { @@ -85,6 +86,10 @@ public: uint16 getDoorPolygonEndOffset() { return readRdfWord(0x1c); } Common::Point getBeamInPosition(int crewmanIndex); + // This is analagous to above, but instead of beaming in, they just appear in a spot. + // Used sparingly, ie. in feather's serpent when appearing in cave after Quetzecoatl + // warps the crew. + Common::Point getSpawnPosition(int crewmanIndex); public: byte *_rdfData; @@ -92,7 +97,7 @@ public: private: StarTrekEngine *_vm; - RoomAction *_roomActionList; + const RoomAction *_roomActionList; int _numRoomActions; int _roomIndex; // ie. for DEMON2, this is 2 @@ -131,8 +136,8 @@ private: // If "changeDirection" is true, they remain facing that direction even after their // animation is finished. The game is inconsistent about doing this. - void spockScan(int direction, TextRef text, bool changeDirection); - void mccoyScan(int direction, TextRef text, bool changeDirection); + void spockScan(int direction, TextRef text, bool changeDirection = false); + void mccoyScan(int direction, TextRef text, bool changeDirection = false); // Room-specific code public: @@ -1408,6 +1413,88 @@ public: // FEATHER1 void feather1Tick1(); + void feather1Tick45(); + void feather1Tick85(); + void feather1Tick95(); + void feather1QuetzecoatlDisappeared(); + void feather1GetRightVine(); + void feather1GetLeftVine(); + void feather1GetRocks(); + void feather1ReachedRocks(); + void feather1PickedUpRocks(); + void feather1GetSnake(); + void feather1ReachedSnake(); + void feather1Timer1Expired(); + void feather1Timer2Expired(); + void feather1PickedUpSnake(); + void feather1Timer0Expired(); + void feather1UseCommunicator(); + void feather1UseRockOnHole(); + void feather1ReachedHole(); + void feather1Timer3Expired(); + void feather1PutRockInHole(); + void feather1UseSnakeOnLeftVine(); + void feather1UseSnakeOnSpock(); + void feather1UseSnakeOnKirk(); + void feather1UseSnakeOnMccoy(); + void feather1UseSnakeOnRedshirt(); + void feather1UseRockOnSnake(); + void feather1UseSpockOnSnake(); + void feather1UseMccoyOnSnake(); + void feather1UseRedshirtOnSnake(); + void feather1UseSpockOnHole(); + void feather1UseMccoyOnHole(); + void feather1UseRedshirtOnHole(); + void feather1UseRockOnMoss(); + void feather1UseRockOnSpock(); + void feather1UseRockOnMccoy(); + void feather1UseRockOnRedshirt(); + void feather1UseSpockOnMoss(); + void feather1UseMccoyOnMoss(); + void feather1UseRedshirtOnMoss(); + void feather1UseRockOnLeftVine(); + void feather1ReadyToThrowRock1(); + void feather1ThrewRock1(); + void feather1ReadyToThrowRock2(); + void feather1ThrewRock2(); + void feather1UseSpockOnVine(); + void feather1UseMccoyOnVine(); + void feather1UseRedshirtOnVine(); + void feather1UseKirkOnVine(); + void feather1CrewmanClimbVine(); + void feather1ReachedVineToClimbUp(); + void feather1ClimbedUpVine(); + void feather1ReachedVineToClimbDown(); + void feather1ClimbedDownVine(); + void feather1UsePhaser(); + void feather1UseSTricorderOnRightVine(); + void feather1UseSTricorderOnSnake(); + void feather1UseSTricorderOnMoss(); + void feather1UseSTricorderOnHole(); + void feather1UseSTricorderAnywhere(); + void feather1UseSTricorderOnRocks(); + void feather1UseMTricorderOnVine(); + void feather1UseMTricorderOnMoss(); + void feather1UseMTricorderOnHole(); + void feather1UseMTricorderOnSnake(); + void feather1UseMedkit(); + void feather1TalkToMccoy(); + void feather1TalkToSpock(); + void feather1TalkToRedshirt(); + void feather1WalkToExit(); + void feather1LookAnywhere(); + void feather1LookAtSnake(); + void feather1LookAtRightVine(); + void feather1LookAtHole(); + void feather1LookAtMoss(); + void feather1LookAtRocks(); + void feather1LookAtLight(); + void feather1LookAtEyes(); + void feather1LookAtKirk(); + void feather1LookAtSpock(); + void feather1LookAtMccoy(); + void feather1LookAtRedshirt(); + void feather1LookAtLeftVine(); // FEATHER2 void feather2Tick1(); @@ -1546,6 +1633,18 @@ private: byte walkingToDoor; } mudd; + struct { + // feather1 + byte snakeInHole; // 0xca + bool scannedSnake; // 0xcb + bool crewEscaped[4]; // 0xcc + byte kirkEscaped; // 0xcc + byte spockEscaped; // 0xcd + byte mccoyEscaped; // 0xce + byte cf; // 0xcf + byte crewmanClimbingVine; + } feather; + } _roomVar; }; diff --git a/engines/startrek/rooms/feather1.cpp b/engines/startrek/rooms/feather1.cpp index ac4f147a6f..488244e4dc 100644 --- a/engines/startrek/rooms/feather1.cpp +++ b/engines/startrek/rooms/feather1.cpp @@ -22,14 +22,655 @@ #include "startrek/room.h" -#define OBJECT_8 8 +#define OBJECT_QUETZECOATL 8 +#define OBJECT_LEFT_VINE 9 +#define OBJECT_SNAKE 10 +#define OBJECT_THROWN_ROCK 11 +#define OBJECT_ROCK_IN_HOLE 12 -#define HOTSPOT_20 0x20 +#define HOTSPOT_ROCKS 0x20 +#define HOTSPOT_HOLE 0x21 +#define HOTSPOT_MOSS 0x22 +#define HOTSPOT_RIGHT_VINE 0x23 +#define HOTSPOT_LIGHT 0x24 +#define HOTSPOT_EYES_1 0x25 +#define HOTSPOT_EYES_2 0x26 +#define HOTSPOT_EYES_3 0x27 +#define HOTSPOT_EXIT 0x28 + +// Positions where crewmen walk to when climbing up or down the vine +#define VINE_TOP_X 0xcc +#define VINE_TOP_Y 0x30 +#define VINE_BOT_X 0xc3 +#define VINE_BOT_Y 0xc7 namespace StarTrek { +extern const RoomAction feather1ActionList[] = { + { Action(ACTION_TICK, 1, 0, 0), &Room::feather1Tick1 }, + { Action(ACTION_TICK, 45, 0, 0), &Room::feather1Tick45 }, + { Action(ACTION_TICK, 85, 0, 0), &Room::feather1Tick85 }, + { Action(ACTION_TICK, 95, 0, 0), &Room::feather1Tick95 }, + { Action(ACTION_FINISHED_ANIMATION, 18, 0, 0), &Room::feather1QuetzecoatlDisappeared }, + { Action(ACTION_GET, HOTSPOT_RIGHT_VINE, 0, 0), &Room::feather1GetRightVine }, + { Action(ACTION_GET, OBJECT_LEFT_VINE, 0, 0), &Room::feather1GetLeftVine }, + { Action(ACTION_GET, HOTSPOT_ROCKS, 0, 0), &Room::feather1GetRocks }, + { Action(ACTION_FINISHED_WALKING, 6, 0, 0), &Room::feather1ReachedRocks }, + { Action(ACTION_FINISHED_ANIMATION, 6, 0, 0), &Room::feather1PickedUpRocks }, + { Action(ACTION_GET, OBJECT_SNAKE, 0, 0), &Room::feather1GetSnake }, + { Action(ACTION_FINISHED_WALKING, 8, 0, 0), &Room::feather1ReachedSnake }, + { Action(ACTION_TIMER_EXPIRED, 1, 0, 0), &Room::feather1Timer1Expired }, + { Action(ACTION_TIMER_EXPIRED, 2, 0, 0), &Room::feather1Timer2Expired }, + { Action(ACTION_FINISHED_ANIMATION, 8, 0, 0), &Room::feather1PickedUpSnake }, + { Action(ACTION_TIMER_EXPIRED, 0, 0, 0), &Room::feather1Timer0Expired }, + { Action(ACTION_USE, OBJECT_ICOMM, -1, 0), &Room::feather1UseCommunicator }, + { Action(ACTION_USE, OBJECT_IROCK, HOTSPOT_HOLE, 0), &Room::feather1UseRockOnHole }, + { Action(ACTION_FINISHED_WALKING, 9, 0, 0), &Room::feather1ReachedHole }, + { Action(ACTION_TIMER_EXPIRED, 3, 0, 0), &Room::feather1Timer3Expired }, + { Action(ACTION_FINISHED_ANIMATION, 9, 0, 0), &Room::feather1PutRockInHole }, + { Action(ACTION_USE, OBJECT_ISNAKE, OBJECT_LEFT_VINE, 0), &Room::feather1UseSnakeOnLeftVine }, + { Action(ACTION_USE, OBJECT_ISNAKE, OBJECT_SPOCK, 0), &Room::feather1UseSnakeOnSpock }, + { Action(ACTION_USE, OBJECT_ISNAKE, OBJECT_KIRK, 0), &Room::feather1UseSnakeOnKirk }, + { Action(ACTION_USE, OBJECT_ISNAKE, OBJECT_MCCOY, 0), &Room::feather1UseSnakeOnMccoy }, + { Action(ACTION_USE, OBJECT_ISNAKE, OBJECT_REDSHIRT, 0), &Room::feather1UseSnakeOnRedshirt }, + { Action(ACTION_USE, OBJECT_IROCK, OBJECT_SNAKE, 0), &Room::feather1UseRockOnSnake }, + { Action(ACTION_USE, OBJECT_SPOCK, OBJECT_SNAKE, 0), &Room::feather1UseSpockOnSnake }, + { Action(ACTION_USE, OBJECT_MCCOY, OBJECT_SNAKE, 0), &Room::feather1UseMccoyOnSnake }, + { Action(ACTION_USE, OBJECT_REDSHIRT, OBJECT_SNAKE, 0), &Room::feather1UseRedshirtOnSnake }, + { Action(ACTION_USE, OBJECT_SPOCK, HOTSPOT_HOLE, 0), &Room::feather1UseSpockOnHole }, + { Action(ACTION_USE, OBJECT_MCCOY, HOTSPOT_HOLE, 0), &Room::feather1UseMccoyOnHole }, + { Action(ACTION_USE, OBJECT_REDSHIRT, HOTSPOT_HOLE, 0), &Room::feather1UseRedshirtOnHole }, + { Action(ACTION_USE, OBJECT_IROCK, HOTSPOT_MOSS, 0), &Room::feather1UseRockOnMoss }, + { Action(ACTION_USE, OBJECT_IROCK, OBJECT_SPOCK, 0), &Room::feather1UseRockOnSpock }, + { Action(ACTION_USE, OBJECT_IROCK, OBJECT_MCCOY, 0), &Room::feather1UseRockOnMccoy }, + { Action(ACTION_USE, OBJECT_IROCK, OBJECT_REDSHIRT, 0), &Room::feather1UseRockOnRedshirt }, + { Action(ACTION_USE, OBJECT_SPOCK, HOTSPOT_MOSS, 0), &Room::feather1UseSpockOnMoss }, + { Action(ACTION_USE, OBJECT_MCCOY, HOTSPOT_MOSS, 0), &Room::feather1UseMccoyOnMoss }, + { Action(ACTION_USE, OBJECT_REDSHIRT, HOTSPOT_MOSS, 0), &Room::feather1UseRedshirtOnMoss }, + { Action(ACTION_USE, OBJECT_IROCK, OBJECT_LEFT_VINE, 0), &Room::feather1UseRockOnLeftVine }, + { Action(ACTION_FINISHED_WALKING, 1, 0, 0), &Room::feather1ReadyToThrowRock1 }, + { Action(ACTION_FINISHED_ANIMATION, 1, 0, 0), &Room::feather1ThrewRock1 }, + { Action(ACTION_FINISHED_WALKING, 2, 0, 0), &Room::feather1ReadyToThrowRock2 }, + { Action(ACTION_FINISHED_ANIMATION, 2, 0, 0), &Room::feather1ThrewRock2 }, + + { Action(ACTION_USE, OBJECT_SPOCK, OBJECT_LEFT_VINE, 0), &Room::feather1UseSpockOnVine }, + { Action(ACTION_USE, OBJECT_SPOCK, HOTSPOT_RIGHT_VINE, 0), &Room::feather1UseSpockOnVine }, + { Action(ACTION_USE, OBJECT_MCCOY, OBJECT_LEFT_VINE, 0), &Room::feather1UseMccoyOnVine }, + { Action(ACTION_USE, OBJECT_MCCOY, HOTSPOT_RIGHT_VINE, 0), &Room::feather1UseMccoyOnVine }, + { Action(ACTION_USE, OBJECT_REDSHIRT, OBJECT_LEFT_VINE, 0), &Room::feather1UseRedshirtOnVine }, + { Action(ACTION_USE, OBJECT_REDSHIRT, HOTSPOT_RIGHT_VINE, 0), &Room::feather1UseRedshirtOnVine }, + { Action(ACTION_USE, OBJECT_KIRK, OBJECT_LEFT_VINE, 0), &Room::feather1UseKirkOnVine }, + { Action(ACTION_USE, OBJECT_KIRK, HOTSPOT_RIGHT_VINE, 0), &Room::feather1UseKirkOnVine }, + { Action(ACTION_FINISHED_WALKING, 3, 0, 0), &Room::feather1ReachedVineToClimbUp }, + { Action(ACTION_FINISHED_ANIMATION, 3, 0, 0), &Room::feather1ClimbedUpVine }, + { Action(ACTION_FINISHED_WALKING, 10, 0, 0), &Room::feather1ReachedVineToClimbDown }, + { Action(ACTION_FINISHED_ANIMATION, 10, 0, 0), &Room::feather1ClimbedDownVine }, + + { Action(ACTION_USE, OBJECT_IPHASERS, -1, 0), &Room::feather1UsePhaser }, + { Action(ACTION_USE, OBJECT_IPHASERK, -1, 0), &Room::feather1UsePhaser }, + { Action(ACTION_USE, OBJECT_ISTRICOR, HOTSPOT_RIGHT_VINE, 0), &Room::feather1UseSTricorderOnRightVine }, + { Action(ACTION_USE, OBJECT_ISTRICOR, OBJECT_SNAKE, 0), &Room::feather1UseSTricorderOnSnake }, + { Action(ACTION_USE, OBJECT_ISTRICOR, HOTSPOT_MOSS, 0), &Room::feather1UseSTricorderOnMoss }, + { Action(ACTION_USE, OBJECT_ISTRICOR, HOTSPOT_HOLE, 0), &Room::feather1UseSTricorderOnHole }, + { Action(ACTION_USE, OBJECT_ISTRICOR, -1, 0), &Room::feather1UseSTricorderAnywhere }, + { Action(ACTION_USE, OBJECT_ISTRICOR, HOTSPOT_ROCKS, 0), &Room::feather1UseSTricorderOnRocks }, + { Action(ACTION_USE, OBJECT_IMTRICOR, OBJECT_LEFT_VINE, 0), &Room::feather1UseMTricorderOnVine }, + { Action(ACTION_USE, OBJECT_IMTRICOR, HOTSPOT_RIGHT_VINE, 0), &Room::feather1UseMTricorderOnVine }, + { Action(ACTION_USE, OBJECT_IMTRICOR, HOTSPOT_MOSS, 0), &Room::feather1UseMTricorderOnMoss }, + { Action(ACTION_USE, OBJECT_IMTRICOR, HOTSPOT_HOLE, 0), &Room::feather1UseMTricorderOnHole }, + { Action(ACTION_USE, OBJECT_IMTRICOR, OBJECT_SNAKE, 0), &Room::feather1UseMTricorderOnSnake }, + { Action(ACTION_USE, OBJECT_IMEDKIT, -1, 0), &Room::feather1UseMedkit }, + { Action(ACTION_TALK, OBJECT_MCCOY, 0, 0), &Room::feather1TalkToMccoy }, + { Action(ACTION_TALK, OBJECT_SPOCK, 0, 0), &Room::feather1TalkToSpock }, + { Action(ACTION_TALK, OBJECT_REDSHIRT, 0, 0), &Room::feather1TalkToRedshirt }, + { Action(ACTION_WALK, HOTSPOT_EXIT, 0, 0), &Room::feather1WalkToExit }, + { Action(ACTION_LOOK, -1, 0, 0), &Room::feather1LookAnywhere }, + { Action(ACTION_LOOK, OBJECT_SNAKE, 0, 0), &Room::feather1LookAtSnake }, + { Action(ACTION_LOOK, HOTSPOT_RIGHT_VINE, 0, 0), &Room::feather1LookAtRightVine }, + { Action(ACTION_LOOK, HOTSPOT_HOLE, 0, 0), &Room::feather1LookAtHole }, + { Action(ACTION_LOOK, HOTSPOT_MOSS, 0, 0), &Room::feather1LookAtMoss }, + { Action(ACTION_LOOK, HOTSPOT_ROCKS, 0, 0), &Room::feather1LookAtRocks }, + { Action(ACTION_LOOK, HOTSPOT_LIGHT, 0, 0), &Room::feather1LookAtLight }, + { Action(ACTION_LOOK, HOTSPOT_EYES_1, 0, 0), &Room::feather1LookAtEyes }, + { Action(ACTION_LOOK, HOTSPOT_EYES_2, 0, 0), &Room::feather1LookAtEyes }, + { Action(ACTION_LOOK, HOTSPOT_EYES_3, 0, 0), &Room::feather1LookAtEyes }, + { Action(ACTION_LOOK, OBJECT_KIRK, 0, 0), &Room::feather1LookAtKirk }, + { Action(ACTION_LOOK, OBJECT_SPOCK, 0, 0), &Room::feather1LookAtSpock }, + { Action(ACTION_LOOK, OBJECT_MCCOY, 0, 0), &Room::feather1LookAtMccoy }, + { Action(ACTION_LOOK, OBJECT_REDSHIRT, 0, 0), &Room::feather1LookAtRedshirt }, + { Action(ACTION_LOOK, OBJECT_LEFT_VINE, 0, 0), &Room::feather1LookAtLeftVine }, +}; + +extern const int feather1NumActions = sizeof(feather1ActionList) / sizeof(RoomAction); + + void Room::feather1Tick1() { + playVoc("FEA1LOOP"); + playMidiMusicTracks(27); + + if (_vm->_awayMission.feather.vineState == 0) + _vm->_awayMission.disableInput = true; + + if (!_vm->_awayMission.feather.gotSnake) + loadActorAnim(OBJECT_SNAKE, "s5r1so", 0x9c, 0xc1); + if (_vm->_awayMission.feather.vineState == 0) + loadActorAnim(OBJECT_LEFT_VINE, "s5r1v0", 0xa0, 0x23); + else { + _roomVar.feather.crewEscaped[OBJECT_KIRK] = true; + _roomVar.feather.crewEscaped[OBJECT_SPOCK] = true; + _roomVar.feather.crewEscaped[OBJECT_MCCOY] = true; + _roomVar.feather.crewEscaped[OBJECT_REDSHIRT] = true; + loadActorAnim(OBJECT_LEFT_VINE, "s5r1v4", 0xa0, 0x23); + } +} + +void Room::feather1Tick45() { + if (_vm->_awayMission.feather.vineState == 0) { + playVoc("LD3MAGAP"); + loadActorAnim(OBJECT_QUETZECOATL, "s5r1qa", 0xb4, 0x32); + } +} + +void Room::feather1Tick85() { + if (_vm->_awayMission.feather.vineState == 0) + showText(TX_SPEAKER_QUETZECOATL, TX_FEA1_057); +} + +void Room::feather1Tick95() { + if (_vm->_awayMission.feather.vineState == 0) { + playVoc("LD3MAGDI"); + loadActorAnimC(OBJECT_QUETZECOATL, "s5r1qd", -1, -1, &Room::feather1QuetzecoatlDisappeared); + } +} + +void Room::feather1QuetzecoatlDisappeared() { + _vm->_awayMission.disableInput = false; +} + +void Room::feather1GetRightVine() { + showText(TX_FEA1N008); +} + +void Room::feather1GetLeftVine() { + if (_vm->_awayMission.feather.vineState == 0) + showText(TX_FEA1N009); + else + showText(TX_FEA1N008); +} + +void Room::feather1GetRocks() { + if (_roomVar.feather.crewEscaped[OBJECT_KIRK]) + showText(TX_FEA1N021); + else if (_vm->_awayMission.feather.gotRock) + showText(TX_FEA1N019); + else { + walkCrewmanC(OBJECT_KIRK, 0x90, 0xb6, &Room::feather1ReachedRocks); + _vm->_awayMission.disableInput = true; + } +} + +void Room::feather1ReachedRocks() { + loadActorAnimC(OBJECT_KIRK, "s5r1kg", -1, -1, &Room::feather1PickedUpRocks); +} + +void Room::feather1PickedUpRocks() { + _vm->_awayMission.disableInput = false; + loadActorStandAnim(OBJECT_KIRK); + giveItem(OBJECT_IROCK); + showText(TX_FEA1N022); + _vm->_awayMission.feather.gotRock = true; +} + +void Room::feather1GetSnake() { + // BUG: Infinite score mechanism. Just keep trying and failing to get the snake. + _vm->_awayMission.feather.missionScore++; + + if (!_roomVar.feather.crewEscaped[OBJECT_KIRK]) { + walkCrewmanC(OBJECT_KIRK, 0x90, 0xbe, &Room::feather1ReachedSnake); + _vm->_awayMission.disableInput = true; + } else + showText(TX_FEA1N021); +} + +void Room::feather1ReachedSnake() { + // NOTE: There are two pieces of unused text that could fit here. + // TX_FEA1N007: "The snake darts back into its hole" + // TX_FEA1N018: "With nowhere for the snake to go, you capture it" + + loadActorAnimC(OBJECT_KIRK, "s5r1kg", -1, -1, &Room::feather1PickedUpSnake); + if (_vm->_awayMission.feather.holeBlocked) + _vm->_awayMission.timers[1] = 20; + else + _vm->_awayMission.timers[2] = 6; +} + +void Room::feather1Timer1Expired() { + giveItem(OBJECT_ISNAKE); + loadActorStandAnim(OBJECT_SNAKE); + _vm->_awayMission.feather.gotSnake = true; +} + +void Room::feather1Timer2Expired() { // Snake retreats into hole + loadActorAnim2(OBJECT_SNAKE, "s5r1si"); + _vm->_awayMission.timers[0] = 80; + _roomVar.feather.snakeInHole = true; +} + +void Room::feather1PickedUpSnake() { + _vm->_awayMission.disableInput = false; + loadActorStandAnim(OBJECT_KIRK); +} + +void Room::feather1Timer0Expired() { // Snake comes back out of hole + loadActorAnim2(OBJECT_SNAKE, "s5r1so"); + _roomVar.feather.snakeInHole = false; +} + +void Room::feather1UseCommunicator() { + showText(TX_SPEAKER_SPOCK, TX_FEA1_023); +} + +void Room::feather1UseRockOnHole() { + if (_roomVar.feather.crewEscaped[OBJECT_KIRK]) + showText(TX_FEA1N021); + else if (_vm->_awayMission.feather.holeBlocked) + showText(TX_FEA1N005); + else { + _vm->_awayMission.feather.missionScore++; + walkCrewmanC(OBJECT_KIRK, 0xa3, 0xb6, &Room::feather1ReachedHole); + _vm->_awayMission.disableInput = true; + if (_roomVar.feather.snakeInHole) + _vm->_awayMission.timers[0] = 12; + } +} + +void Room::feather1ReachedHole() { + loadActorAnimC(OBJECT_KIRK, "s5r1kg", -1, -1, &Room::feather1PutRockInHole); + _vm->_awayMission.timers[3] = 18; +} + +void Room::feather1Timer3Expired() { + loadActorAnim(OBJECT_ROCK_IN_HOLE, "s5r1rk", 0xad, 0xba); + _vm->_awayMission.feather.holeBlocked = true; +} + +void Room::feather1PutRockInHole() { + _vm->_awayMission.disableInput = false; + loadActorStandAnim(OBJECT_KIRK); +} + +void Room::feather1UseSnakeOnLeftVine() { + showText(TX_SPEAKER_SPOCK, TX_FEA1_037); +} + +void Room::feather1UseSnakeOnSpock() { + showText(TX_SPEAKER_SPOCK, TX_FEA1_041); + showText(TX_SPEAKER_KIRK, TX_FEA1_001); + showText(TX_SPEAKER_MCCOY, TX_FEA1_018); +} + +void Room::feather1UseSnakeOnKirk() { + showText(TX_SPEAKER_SPOCK, TX_FEA1_026); +} + +void Room::feather1UseSnakeOnMccoy() { + showText(TX_SPEAKER_MCCOY, TX_FEA1_F25); +} + +void Room::feather1UseSnakeOnRedshirt() { + showText(TX_SPEAKER_STRAGEY, TX_FEA1_050); +} + +void Room::feather1UseRockOnSnake() { + if (!_vm->_awayMission.feather.gotSnake) { + loadActorAnim2(OBJECT_SNAKE, "s5r1si"); + _vm->_awayMission.timers[0] = 80; + _roomVar.feather.snakeInHole = true; + showText(TX_SPEAKER_SPOCK, TX_FEA1_034); // BUGFIX: speaker is Spock, not Stragey + } +} + +void Room::feather1UseSpockOnSnake() { + showText(TX_SPEAKER_SPOCK, TX_FEA1_035); +} + +void Room::feather1UseMccoyOnSnake() { + showText(TX_SPEAKER_MCCOY, TX_FEA1_005); +} + +void Room::feather1UseRedshirtOnSnake() { + showText(TX_SPEAKER_STRAGEY, TX_FEA1_046); +} + +void Room::feather1UseSpockOnHole() { + if (_roomVar.feather.snakeInHole) + showText(TX_SPEAKER_SPOCK, TX_FEA1_025); + else + showText(TX_SPEAKER_SPOCK, TX_FEA1_027); +} + +void Room::feather1UseMccoyOnHole() { + if (_roomVar.feather.snakeInHole) + showText(TX_SPEAKER_MCCOY, TX_FEA1_004); + else + showText(TX_SPEAKER_MCCOY, TX_FEA1_010); +} + +void Room::feather1UseRedshirtOnHole() { + if (_roomVar.feather.snakeInHole) + showText(TX_SPEAKER_STRAGEY, TX_FEA1_047); + else + showText(TX_SPEAKER_STRAGEY, TX_FEA1_051); +} + +void Room::feather1UseRockOnMoss() { + showText(TX_FEA1N006); +} + +void Room::feather1UseRockOnSpock() { + showText(TX_SPEAKER_SPOCK, TX_FEA1_032); +} + +void Room::feather1UseRockOnMccoy() { + showText(TX_SPEAKER_MCCOY, TX_FEA1_009); +} + +void Room::feather1UseRockOnRedshirt() { + showText(TX_SPEAKER_STRAGEY, TX_FEA1_045); +} + +void Room::feather1UseSpockOnMoss() { + showText(TX_SPEAKER_SPOCK, TX_FEA1_033); +} + +void Room::feather1UseMccoyOnMoss() { + showText(TX_SPEAKER_MCCOY, TX_FEA1_015); +} + +void Room::feather1UseRedshirtOnMoss() { + showText(TX_SPEAKER_MCCOY, TX_FEA1_049); +} + +void Room::feather1UseRockOnLeftVine() { + if (_vm->_awayMission.feather.vineState == 0) { + _vm->_awayMission.feather.vineState++; + _vm->_awayMission.disableInput = true; + walkCrewmanC(OBJECT_KIRK, 0x7a, 0xb6, &Room::feather1ReadyToThrowRock1); + } else if (_vm->_awayMission.feather.vineState == 1) { + _vm->_awayMission.feather.vineState++; + _vm->_awayMission.disableInput = true; + walkCrewmanC(OBJECT_KIRK, 0xa2, 0xb9, &Room::feather1ReadyToThrowRock2); + } +} + +void Room::feather1ReadyToThrowRock1() { + loadActorAnimC(OBJECT_KIRK, "s5r1kt", -1, -1, &Room::feather1ThrewRock1); + loadActorAnim2(OBJECT_LEFT_VINE, "s5r1v2"); + loadActorAnim(OBJECT_THROWN_ROCK, "s5r1ru", 0x81, 0x6d); + playVoc("THROWROC"); +} + +void Room::feather1ThrewRock1() { + _vm->_awayMission.disableInput = false; + loadActorStandAnim(OBJECT_KIRK); + + showText(TX_SPEAKER_SPOCK, TX_FEA1_042); + showText(TX_SPEAKER_MCCOY, TX_FEA1_017); + showText(TX_SPEAKER_STRAGEY, TX_FEA1_054); +} + +void Room::feather1ReadyToThrowRock2() { + loadActorAnimC(OBJECT_KIRK, "s5r1kt", -1, -1, &Room::feather1ThrewRock2); + loadActorAnim2(OBJECT_LEFT_VINE, "s5r1v3"); + loadActorAnim(OBJECT_THROWN_ROCK, "s5r1ru", 0xa3, 0x70); + playVoc("THROWROC"); +} + +void Room::feather1ThrewRock2() { + _vm->_awayMission.feather.missionScore += 6; + loadActorStandAnim(OBJECT_KIRK); + _vm->_awayMission.disableInput = false; + + showText(TX_SPEAKER_SPOCK, TX_FEA1_043); + showText(TX_SPEAKER_MCCOY, TX_FEA1_021); + showText(TX_SPEAKER_STRAGEY, TX_FEA1_053); +} + + +void Room::feather1UseSpockOnVine() { + if (_vm->_awayMission.feather.vineState == 2) { + _roomVar.feather.crewmanClimbingVine = OBJECT_SPOCK; + feather1CrewmanClimbVine(); + } else + showText(TX_SPEAKER_SPOCK, TX_FEA1_A46); +} + +void Room::feather1UseMccoyOnVine() { + if (_vm->_awayMission.feather.vineState == 2) { + _roomVar.feather.crewmanClimbingVine = OBJECT_MCCOY; + feather1CrewmanClimbVine(); + } else + showText(TX_SPEAKER_MCCOY, TX_FEA1_013); +} + +void Room::feather1UseRedshirtOnVine() { + if (_vm->_awayMission.feather.vineState == 2) { + _roomVar.feather.crewmanClimbingVine = OBJECT_REDSHIRT; + feather1CrewmanClimbVine(); + } else + showText(TX_SPEAKER_STRAGEY, TX_FEA1_052); +} + +void Room::feather1UseKirkOnVine() { + if (_vm->_awayMission.feather.vineState == 2) { + _roomVar.feather.crewmanClimbingVine = OBJECT_KIRK; + feather1CrewmanClimbVine(); + } else + showText(TX_FEA1N010); +} + +// This was refactored, due to the similarity of the code for each crewman. Originally, the +// following 5 vine-climbing functions were repeated for each crewman. +void Room::feather1CrewmanClimbVine() { + _vm->_awayMission.disableInput = true; + if (_roomVar.feather.crewEscaped[_roomVar.feather.crewmanClimbingVine]) + walkCrewmanC(_roomVar.feather.crewmanClimbingVine, VINE_TOP_X, VINE_TOP_Y, + &Room::feather1ReachedVineToClimbDown); + else + walkCrewmanC(_roomVar.feather.crewmanClimbingVine, VINE_BOT_X, VINE_BOT_Y, + &Room::feather1ReachedVineToClimbUp); +} + +void Room::feather1ReachedVineToClimbUp() { + const char *crew = "ksmr"; + Common::String anim = "s5r1_c"; + anim.setChar(crew[_roomVar.feather.crewmanClimbingVine], 4); + loadActorAnimC(_roomVar.feather.crewmanClimbingVine, anim, -1, -1, &Room::feather1ClimbedUpVine); +} + +void Room::feather1ClimbedUpVine() { + _vm->_awayMission.disableInput = false; + _roomVar.feather.crewEscaped[_roomVar.feather.crewmanClimbingVine] = true; + + Common::String anim = _vm->getCrewmanAnimFilename(_roomVar.feather.crewmanClimbingVine, "stndw"); + loadActorAnim2(_roomVar.feather.crewmanClimbingVine, anim, VINE_TOP_X, VINE_TOP_Y); + + switch (_roomVar.feather.crewmanClimbingVine) { + case OBJECT_SPOCK: + walkCrewman(OBJECT_SPOCK, 0xaf, 0x30); + break; + case OBJECT_MCCOY: + walkCrewman(OBJECT_MCCOY, 0xbe, 0x30); + break; + case OBJECT_REDSHIRT: + walkCrewman(OBJECT_REDSHIRT, 0xca, 0x30); + break; + case OBJECT_KIRK: + walkCrewman(OBJECT_KIRK, 0xa0, 0x30); + break; + } +} + +void Room::feather1ReachedVineToClimbDown() { + const char *crew = "ksmr"; + Common::String anim = "s5r1_d"; + anim.setChar(crew[_roomVar.feather.crewmanClimbingVine], 4); + loadActorAnimC(_roomVar.feather.crewmanClimbingVine, anim, VINE_BOT_X, VINE_BOT_Y, &Room::feather1ClimbedDownVine); +} + +void Room::feather1ClimbedDownVine() { + _vm->_awayMission.disableInput = false; + _roomVar.feather.crewEscaped[_roomVar.feather.crewmanClimbingVine] = false; + + Common::String anim = _vm->getCrewmanAnimFilename(_roomVar.feather.crewmanClimbingVine, "stndw"); + loadActorAnim2(_roomVar.feather.crewmanClimbingVine, anim, VINE_BOT_X, VINE_BOT_Y); + + switch (_roomVar.feather.crewmanClimbingVine) { + case OBJECT_SPOCK: + walkCrewman(OBJECT_SPOCK, 0x68, 0xbe); + break; + case OBJECT_MCCOY: + walkCrewman(OBJECT_MCCOY, 0x55, 0xb4); + break; + case OBJECT_REDSHIRT: + walkCrewman(OBJECT_REDSHIRT, 0xdc, 0xc6); + break; + case OBJECT_KIRK: + walkCrewman(OBJECT_KIRK, 0x87, 0xba); + break; + } +} + +void Room::feather1UsePhaser() { + showText(TX_SPEAKER_SPOCK, TX_FEA1_028); +} + +void Room::feather1UseSTricorderOnRightVine() { + spockScan(DIR_N, TX_FEA1_039); +} + +void Room::feather1UseSTricorderOnSnake() { + spockScan(DIR_S, TX_FEA1_029); +} + +void Room::feather1UseSTricorderOnMoss() { + spockScan(DIR_E, TX_FEA1_038); +} + +void Room::feather1UseSTricorderOnHole() { + if (_roomVar.feather.snakeInHole) + spockScan(DIR_E, TX_FEA1_030); + else + spockScan(DIR_E, TX_FEA1_031); +} + +void Room::feather1UseSTricorderAnywhere() { + spockScan(DIR_S, TX_FEA1_024); +} + +void Room::feather1UseSTricorderOnRocks() { + spockScan(DIR_E, TX_FEA1_003); +} + +void Room::feather1UseMTricorderOnVine() { + // ENHANCEMENT: Original didn't play tricorder sound, etc + mccoyScan(DIR_E, TX_FEA1_007); +} + +void Room::feather1UseMTricorderOnMoss() { + mccoyScan(DIR_E, TX_FEA1_014); +} + +void Room::feather1UseMTricorderOnHole() { + if (_roomVar.feather.snakeInHole) + mccoyScan(DIR_E, TX_FEA1_011); + else + mccoyScan(DIR_E, TX_FEA1_012); +} + +void Room::feather1UseMTricorderOnSnake() { + mccoyScan(DIR_S, TX_FEA1_019); + if (!_roomVar.feather.scannedSnake) { + showText(TX_SPEAKER_SPOCK, TX_FEA1_044); + showText(TX_SPEAKER_STRAGEY, TX_FEA1_055); + showText(TX_SPEAKER_KIRK, TX_FEA1_002); + _roomVar.feather.scannedSnake = true; + } +} + +void Room::feather1UseMedkit() { + showText(TX_SPEAKER_MCCOY, TX_FEA1_008); +} + +void Room::feather1TalkToMccoy() { + showText(TX_SPEAKER_MCCOY, TX_FEA1_006); +} + +void Room::feather1TalkToSpock() { + showText(TX_SPEAKER_SPOCK, TX_FEA1_040); +} + +void Room::feather1TalkToRedshirt() { + showText(TX_SPEAKER_STRAGEY, TX_FEA1_048); +} + +void Room::feather1WalkToExit() { + walkCrewman(OBJECT_KIRK, 0x0a, 0x30); +} + +void Room::feather1LookAnywhere() { + showText(TX_FEA1N020); +} + +void Room::feather1LookAtSnake() { + showText(TX_FEA1N017); +} + +void Room::feather1LookAtRightVine() { + showText(TX_FEA1N015); +} + +void Room::feather1LookAtHole() { + showText(TX_FEA1N014); +} + +void Room::feather1LookAtMoss() { + showText(TX_FEA1N016); +} + +void Room::feather1LookAtRocks() { + showText(TX_FEA1N011); +} + +void Room::feather1LookAtLight() { + showText(TX_FEA1N013); +} + +void Room::feather1LookAtEyes() { + showText(TX_FEA1N000); +} + +void Room::feather1LookAtKirk() { + showText(TX_FEA1N001); +} + +void Room::feather1LookAtSpock() { + showText(TX_FEA1N004); +} + +void Room::feather1LookAtMccoy() { + showText(TX_FEA1N003); +} + +void Room::feather1LookAtRedshirt() { + showText(TX_FEA1N002); +} +void Room::feather1LookAtLeftVine() { + if (_vm->_awayMission.feather.vineState == 0) + showText(TX_FEA1N012); + else + showText(TX_FEA1N015); } } diff --git a/engines/startrek/rooms/function_map.h b/engines/startrek/rooms/function_map.h index c79b81e67a..cec0eae87e 100644 --- a/engines/startrek/rooms/function_map.h +++ b/engines/startrek/rooms/function_map.h @@ -1785,9 +1785,8 @@ RoomAction feather0ActionList[] = { { Action(ACTION_USE, OBJECT_IMTRICOR, 8, 0), &Room::feather0UseMTricorderOnQuetzecoatl }, }; -RoomAction feather1ActionList[] = { - { Action(ACTION_TICK, 1, 0, 0), &Room::feather1Tick1 }, -}; +extern const RoomAction feather1ActionList[]; +extern const int feather1NumActions; RoomAction feather2ActionList[] = { { Action(ACTION_TICK, 1, 0, 0), &Room::feather2Tick1 }, diff --git a/engines/startrek/text.h b/engines/startrek/text.h index f0831877d1..4bc5f67ee7 100644 --- a/engines/startrek/text.h +++ b/engines/startrek/text.h @@ -109,6 +109,7 @@ enum GameStringIDs { TX_BRIDU146, TX_G_024, + TX_G_043, TX_GENER004, @@ -1638,6 +1639,90 @@ enum GameStringIDs { TX_FEA0N009, + TX_FEA1_001, + TX_FEA1_002, + TX_FEA1_003, + TX_FEA1_004, + TX_FEA1_005, + TX_FEA1_006, + TX_FEA1_007, + TX_FEA1_008, + TX_FEA1_009, + TX_FEA1_010, + TX_FEA1_011, + TX_FEA1_012, + TX_FEA1_013, + TX_FEA1_014, + TX_FEA1_015, + // MISSING + TX_FEA1_017, + TX_FEA1_018, + TX_FEA1_019, + TX_FEA1_020, // UNUSED + TX_FEA1_021, + TX_FEA1_022, // UNUSED + TX_FEA1_023, + TX_FEA1_024, + TX_FEA1_025, + TX_FEA1_026, + TX_FEA1_027, + TX_FEA1_028, + TX_FEA1_029, + TX_FEA1_030, + TX_FEA1_031, + TX_FEA1_032, + TX_FEA1_033, + TX_FEA1_034, + TX_FEA1_035, + // MISSING + TX_FEA1_037, + TX_FEA1_038, + TX_FEA1_039, + TX_FEA1_040, + TX_FEA1_041, + TX_FEA1_042, + TX_FEA1_043, + TX_FEA1_044, + TX_FEA1_045, + TX_FEA1_046, + TX_FEA1_047, + TX_FEA1_048, + TX_FEA1_049, + TX_FEA1_050, + TX_FEA1_051, + TX_FEA1_052, + TX_FEA1_053, + TX_FEA1_054, + TX_FEA1_055, + TX_FEA1_056, // UNUSED + TX_FEA1_057, + TX_FEA1_A46, + TX_FEA1_F25, + TX_FEA1N000, + TX_FEA1N001, + TX_FEA1N002, + TX_FEA1N003, + TX_FEA1N004, + TX_FEA1N005, + TX_FEA1N006, + TX_FEA1N007, // UNUSED + TX_FEA1N008, + TX_FEA1N009, + TX_FEA1N010, + TX_FEA1N011, + TX_FEA1N012, + TX_FEA1N013, + TX_FEA1N014, + TX_FEA1N015, + TX_FEA1N016, + TX_FEA1N017, + TX_FEA1N018, // UNUSED + TX_FEA1N019, + TX_FEA1N020, + TX_FEA1N021, + TX_FEA1N022, + + TX_SIN3_012, @@ -1698,6 +1783,7 @@ const char * const g_gameStrings[] = { "#BRID\\BRIDU146#Nothing to report, Captain.", "#GENE\\G_024#Fascinating.", + "#GENE\\G_043#Ouch! Watch it with that thing!", "#GENE\\GENER004#Game Over", @@ -3216,6 +3302,88 @@ const char * const g_gameStrings[] = { "#FEA0\\FEA0N009#You see dense vegetation in all directions.", + "#FEA1\\FEA1_001#We wouldn't want to bleed all over Dr. McCoy now, would we?", + "#FEA1\\FEA1_002#Well, yes.", + "#FEA1\\FEA1_003#A pile of small igneous rocks, Captain.", + "#FEA1\\FEA1_004#And get my fingers taken off by some alien reptile? You've got to be joking.", + "#FEA1\\FEA1_005#Are you nuts? There's no way I'm touching any damned snake!", + "#FEA1\\FEA1_006#Do I look like Houdini to you? I'm afraid you're going to have to pull the rabbit out of the hat on this one.", + "#FEA1\\FEA1_007#Does it look sick to you, Captain?", + "#FEA1\\FEA1_008#Everyone is healthy, Jim, there's no need for the medical kit here.", + "#FEA1\\FEA1_009#Hey! What was that for?", + "#FEA1\\FEA1_010#I'm not putting my fingers in there, Jim.", + "#FEA1\\FEA1_011#It's a damned hole with a snake in it.", + "#FEA1\\FEA1_012#It's a damned hole.", + "#FEA1\\FEA1_013#It's bad enough that you put me in the damn transporter, now you want me to break my neck climbing that?!", + "#FEA1\\FEA1_014#It's moss. Anyone got any rolling stones?", + "#FEA1\\FEA1_015#No toxic reaction. It appears to be ordinary, except for this resin.", + "#FEA1\\FEA1_017#Didn't they have baseball on Vulcan? Show us your fastball, Jim.", + "#FEA1\\FEA1_018#Especially that green Vulcan blood. The last thing I need is a pint of T-Negative blood all over my uniform.", + "#FEA1\\FEA1_019#It's a damned snake! Do you know what snakebite does? It can ruin your whole day.", + "#FEA1\\FEA1_020#It's bad enough being around pointy-eared Vulcans, now I have to listen to ensigns who think they can do my job!", + "#FEA1\\FEA1_021#Probability? That was a perfect pitch if I ever saw one.", + "#FEA1\\FEA1_022#The bite wasn't serious Captain. He'll be fine, but I would like to get him to sickbay in case there's some alien infection.", + "#FEA1\\FEA1_023#Fascinating. Our communicators have apparently been rendered ineffective.", + "#FEA1\\FEA1_024#I am picking up residual energy readings from the area where the alien's projection was.", + "#FEA1\\FEA1_025#I can not reach the snake, Captain.", + "#FEA1\\FEA1_026#I realize that humans form emotional bonds with pets, but I recommend tribbles.", + "#FEA1\\FEA1_027#I see no logic in searching an empty hole, Captain.", + "#FEA1\\FEA1_028#It is logical that an entity that professes to teach peace would render our phasers inoperative.", + "#FEA1\\FEA1_029#It looks like a Zamphorian pit snake. A rather common species in this region, noted by galactic herpatologists for their quickness. It is not venomous or dangerous to humans. ", + "#FEA1\\FEA1_030#It would appear that this is where the snake lives, Captain. It is currently inside.", + "#FEA1\\FEA1_031#It would appear that this is where the snake lives, Captain.", + "#FEA1\\FEA1_032#Thank you, Captain, but I assure you that I was giving this situation my fullest attention.", + "#FEA1\\FEA1_033#The resin does not seem to have any unusual properties.", + "#FEA1\\FEA1_034#The snake has gone back into the hole, Captain.", + "#FEA1\\FEA1_035#The snake is too quick to be easily grabbed before it retreats, Captain.", // TYPO + "#FEA1\\FEA1_037#This isn't very logical, but as you are human, it is quite understandable.", // TYPO + "#FEA1\\FEA1_038#This variety of moss seems to leave a very sticky resin behind. Perhaps to trap the large amounts of pollen from the plants on the surface, and use it as a secondary food source.", + "#FEA1\\FEA1_039#This vine is not likely to support our weight by itself, Captain. You would have to find some way to reinforce it.", + "#FEA1\\FEA1_040#Those vines would be useful to escape, if we could reach them.", + "#FEA1\\FEA1_041#A fascinating specimen, Captain, but I would be careful handling it. From the looks of it, it may have a nasty bite.", // TYPO + "#FEA1\\FEA1_042#Fascinating. It did appear to knock the vine down near to the point where one of us can reach it.", + "#FEA1\\FEA1_043#The probability of getting the vine on the second try was only 36.53%. Well done, Captain.", + "#FEA1\\FEA1_044#We are not likely to find a way out of this pit with humor, doctor. I suggest you concentrate your efforts to the problem at hand.", + "#FEA1\\FEA1_045#I'm glad I was taught pain-nullification techniques.", + "#FEA1\\FEA1_046#It doesn't seem to want to be grabbed, sir. It just slithers back to its hole.", + "#FEA1\\FEA1_047#It's coming out again, sir.", + "#FEA1\\FEA1_048#No enemies in sight, but supplies could be a problem if we don't get out.", + "#FEA1\\FEA1_049#Sure is sticky sir. I can't see much use in it.", + "#FEA1\\FEA1_050#That's something of a runt, Captain. You should've seen this Rigilian python that Cadet Tyrli put in the shower at the Academy. Twenty meters long!", + "#FEA1\\FEA1_051#The hole is empty, sir.", + "#FEA1\\FEA1_052#There's no way that we're getting up that way, Captain. The vine is too weak.", + "#FEA1\\FEA1_053#All Right! We're on our way!", + "#FEA1\\FEA1_054#Baseball? No one plays that anymore. Good try though, sir.", + "#FEA1\\FEA1_055#Do they always argue like this, Captain?", + "#FEA1\\FEA1_056#Doctors! It'll take more than a couple of scratches to put me out action, sir.", + "#FEA1\\FEA1_057#You clearly are not the inheritors of the noble Aztec world. What you have said has greatly disturbed me. You should not lie so. You shall remain here until you have learned the error of angering Quetzecoatl!", + "#FEA1\\FEA1_A46#There is not enough support, Captain.", + "#FEA1\\FEA1_F25#What on Earth are you doing with that slithering thing!", + "#FEA1\\FEA1N000#Feral red eyes glare out of the dark at you.", + "#FEA1\\FEA1N001#James T. Kirk does not seem very happy with his current predicament.", + "#FEA1\\FEA1N002#Lt. Stragey is carefully examining the pit.", + "#FEA1\\FEA1N003#McCoy is examining the floor of the pit.", + "#FEA1\\FEA1N004#Spock is carefully examining the pit.", + "#FEA1\\FEA1N005#The hole is already blocked.", + "#FEA1\\FEA1N006#The rock is a bit stickier.", + "#FEA1\\FEA1N007#The snake darts back into its hole before you can catch it.", + "#FEA1\\FEA1N008#The vine is attached to a tree above you.", + "#FEA1\\FEA1N009#The vine is not within reach.", + "#FEA1\\FEA1N010#The vine will not support you.", + "#FEA1\\FEA1N011#There are rocks here, quite suitable for picking up and throwing.", + "#FEA1\\FEA1N012#There are several loose vines hanging over the side of the pit, out of reach. This is one of them.", + "#FEA1\\FEA1N013#There is a light suspended from above by a chain.", + "#FEA1\\FEA1N014#There is a tiny hole in the wall at this point. Certainly no human could crawl through here.", + "#FEA1\\FEA1N015#There is a vine hanging down into the pit.", + "#FEA1\\FEA1N016#This moss is covered with a very sticky substance.", + "#FEA1\\FEA1N017#This particular snake doesn't seem to like your company, and moves whenever you get near it.", + "#FEA1\\FEA1N018#With no where for the snake to go, you easliy capture it.", + "#FEA1\\FEA1N019#You already have rocks.", + "#FEA1\\FEA1N020#You are in a deep pit. It is a long, hard climb to the top.", + "#FEA1\\FEA1N021#You cannot reach it from where you are.", + "#FEA1\\FEA1N022#You pick up some rocks from the pile.", + + "#SIN3\\SIN3_012#Can't say I like the decor.", |