Files
2026-02-02 04:50:13 +01:00

794 lines
27 KiB
C++

/* ScummVM - Graphic Adventure Engine3
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source distribution.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
#include "startrek/room.h"
#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_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_TICK, 1, 0, 0, 0}, &Room::feather1Tick1 },
{ {ACTION_TICK, 45, 0, 0, 0}, &Room::feather1Tick45 },
{ {ACTION_TICK, 85, 0, 0, 0}, &Room::feather1Tick85 },
{ {ACTION_TICK, 95, 0, 0, 0}, &Room::feather1Tick95 },
{ {ACTION_FINISHED_ANIMATION, 18, 0, 0, 0}, &Room::feather1QuetzecoatlDisappeared },
{ {ACTION_GET, HOTSPOT_RIGHT_VINE, 0, 0, 0}, &Room::feather1GetRightVine },
{ {ACTION_GET, OBJECT_LEFT_VINE, 0, 0, 0}, &Room::feather1GetLeftVine },
{ {ACTION_GET, HOTSPOT_ROCKS, 0, 0, 0}, &Room::feather1GetRocks },
{ {ACTION_FINISHED_WALKING, 6, 0, 0, 0}, &Room::feather1ReachedRocks },
{ {ACTION_FINISHED_ANIMATION, 6, 0, 0, 0}, &Room::feather1PickedUpRocks },
{ {ACTION_GET, OBJECT_SNAKE, 0, 0, 0}, &Room::feather1GetSnake },
{ {ACTION_FINISHED_WALKING, 8, 0, 0, 0}, &Room::feather1ReachedSnake },
{ {ACTION_TIMER_EXPIRED, 1, 0, 0, 0}, &Room::feather1Timer1Expired },
{ {ACTION_TIMER_EXPIRED, 2, 0, 0, 0}, &Room::feather1Timer2Expired },
{ {ACTION_FINISHED_ANIMATION, 8, 0, 0, 0}, &Room::feather1PickedUpSnake },
{ {ACTION_TIMER_EXPIRED, 0, 0, 0, 0}, &Room::feather1Timer0Expired },
{ {ACTION_USE, OBJECT_ICOMM, 0xff, 0, 0}, &Room::feather1UseCommunicator },
{ {ACTION_USE, OBJECT_IROCK, HOTSPOT_HOLE, 0, 0}, &Room::feather1UseRockOnHole },
{ {ACTION_FINISHED_WALKING, 9, 0, 0, 0}, &Room::feather1ReachedHole },
{ {ACTION_TIMER_EXPIRED, 3, 0, 0, 0}, &Room::feather1Timer3Expired },
{ {ACTION_FINISHED_ANIMATION, 9, 0, 0, 0}, &Room::feather1PutRockInHole },
{ {ACTION_USE, OBJECT_ISNAKE, OBJECT_LEFT_VINE, 0, 0}, &Room::feather1UseSnakeOnLeftVine },
{ {ACTION_USE, OBJECT_ISNAKE, OBJECT_SPOCK, 0, 0}, &Room::feather1UseSnakeOnSpock },
{ {ACTION_USE, OBJECT_ISNAKE, OBJECT_KIRK, 0, 0}, &Room::feather1UseSnakeOnKirk },
{ {ACTION_USE, OBJECT_ISNAKE, OBJECT_MCCOY, 0, 0}, &Room::feather1UseSnakeOnMccoy },
{ {ACTION_USE, OBJECT_ISNAKE, OBJECT_REDSHIRT, 0, 0}, &Room::feather1UseSnakeOnRedshirt },
{ {ACTION_USE, OBJECT_IROCK, OBJECT_SNAKE, 0, 0}, &Room::feather1UseRockOnSnake },
{ {ACTION_USE, OBJECT_SPOCK, OBJECT_SNAKE, 0, 0}, &Room::feather1UseSpockOnSnake },
{ {ACTION_USE, OBJECT_MCCOY, OBJECT_SNAKE, 0, 0}, &Room::feather1UseMccoyOnSnake },
{ {ACTION_USE, OBJECT_REDSHIRT, OBJECT_SNAKE, 0, 0}, &Room::feather1UseRedshirtOnSnake },
{ {ACTION_USE, OBJECT_SPOCK, HOTSPOT_HOLE, 0, 0}, &Room::feather1UseSpockOnHole },
{ {ACTION_USE, OBJECT_MCCOY, HOTSPOT_HOLE, 0, 0}, &Room::feather1UseMccoyOnHole },
{ {ACTION_USE, OBJECT_REDSHIRT, HOTSPOT_HOLE, 0, 0}, &Room::feather1UseRedshirtOnHole },
{ {ACTION_USE, OBJECT_IROCK, HOTSPOT_MOSS, 0, 0}, &Room::feather1UseRockOnMoss },
{ {ACTION_USE, OBJECT_IROCK, OBJECT_SPOCK, 0, 0}, &Room::feather1UseRockOnSpock },
{ {ACTION_USE, OBJECT_IROCK, OBJECT_MCCOY, 0, 0}, &Room::feather1UseRockOnMccoy },
{ {ACTION_USE, OBJECT_IROCK, OBJECT_REDSHIRT, 0, 0}, &Room::feather1UseRockOnRedshirt },
{ {ACTION_USE, OBJECT_SPOCK, HOTSPOT_MOSS, 0, 0}, &Room::feather1UseSpockOnMoss },
{ {ACTION_USE, OBJECT_MCCOY, HOTSPOT_MOSS, 0, 0}, &Room::feather1UseMccoyOnMoss },
{ {ACTION_USE, OBJECT_REDSHIRT, HOTSPOT_MOSS, 0, 0}, &Room::feather1UseRedshirtOnMoss },
{ {ACTION_USE, OBJECT_IROCK, OBJECT_LEFT_VINE, 0, 0}, &Room::feather1UseRockOnLeftVine },
{ {ACTION_FINISHED_WALKING, 1, 0, 0, 0}, &Room::feather1ReadyToThrowRock1 },
{ {ACTION_FINISHED_ANIMATION, 1, 0, 0, 0}, &Room::feather1ThrewRock1 },
{ {ACTION_FINISHED_WALKING, 2, 0, 0, 0}, &Room::feather1ReadyToThrowRock2 },
{ {ACTION_FINISHED_ANIMATION, 2, 0, 0, 0}, &Room::feather1ThrewRock2 },
{ {ACTION_USE, OBJECT_SPOCK, OBJECT_LEFT_VINE, 0, 0}, &Room::feather1UseSpockOnVine },
{ {ACTION_USE, OBJECT_SPOCK, HOTSPOT_RIGHT_VINE, 0, 0}, &Room::feather1UseSpockOnVine },
{ {ACTION_USE, OBJECT_MCCOY, OBJECT_LEFT_VINE, 0, 0}, &Room::feather1UseMccoyOnVine },
{ {ACTION_USE, OBJECT_MCCOY, HOTSPOT_RIGHT_VINE, 0, 0}, &Room::feather1UseMccoyOnVine },
{ {ACTION_USE, OBJECT_REDSHIRT, OBJECT_LEFT_VINE, 0, 0}, &Room::feather1UseRedshirtOnVine },
{ {ACTION_USE, OBJECT_REDSHIRT, HOTSPOT_RIGHT_VINE, 0, 0}, &Room::feather1UseRedshirtOnVine },
{ {ACTION_USE, OBJECT_KIRK, OBJECT_LEFT_VINE, 0, 0}, &Room::feather1UseKirkOnVine },
{ {ACTION_USE, OBJECT_KIRK, HOTSPOT_RIGHT_VINE, 0, 0}, &Room::feather1UseKirkOnVine },
{ {ACTION_FINISHED_WALKING, 3, 0, 0, 0}, &Room::feather1ReachedVineToClimbUp },
{ {ACTION_FINISHED_ANIMATION, 3, 0, 0, 0}, &Room::feather1ClimbedUpVine },
{ {ACTION_FINISHED_WALKING, 10, 0, 0, 0}, &Room::feather1ReachedVineToClimbDown },
{ {ACTION_FINISHED_ANIMATION, 10, 0, 0, 0}, &Room::feather1ClimbedDownVine },
{ {ACTION_USE, OBJECT_IPHASERS, 0xff, 0, 0}, &Room::feather1UsePhaser },
{ {ACTION_USE, OBJECT_IPHASERK, 0xff, 0, 0}, &Room::feather1UsePhaser },
{ {ACTION_USE, OBJECT_ISTRICOR, HOTSPOT_RIGHT_VINE, 0, 0}, &Room::feather1UseSTricorderOnRightVine },
{ {ACTION_USE, OBJECT_ISTRICOR, OBJECT_SNAKE, 0, 0}, &Room::feather1UseSTricorderOnSnake },
{ {ACTION_USE, OBJECT_ISTRICOR, HOTSPOT_MOSS, 0, 0}, &Room::feather1UseSTricorderOnMoss },
{ {ACTION_USE, OBJECT_ISTRICOR, HOTSPOT_HOLE, 0, 0}, &Room::feather1UseSTricorderOnHole },
{ {ACTION_USE, OBJECT_ISTRICOR, 0xff, 0, 0}, &Room::feather1UseSTricorderAnywhere },
{ {ACTION_USE, OBJECT_ISTRICOR, HOTSPOT_ROCKS, 0, 0}, &Room::feather1UseSTricorderOnRocks },
{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_LEFT_VINE, 0, 0}, &Room::feather1UseMTricorderOnVine },
{ {ACTION_USE, OBJECT_IMTRICOR, HOTSPOT_RIGHT_VINE, 0, 0}, &Room::feather1UseMTricorderOnVine },
{ {ACTION_USE, OBJECT_IMTRICOR, HOTSPOT_MOSS, 0, 0}, &Room::feather1UseMTricorderOnMoss },
{ {ACTION_USE, OBJECT_IMTRICOR, HOTSPOT_HOLE, 0, 0}, &Room::feather1UseMTricorderOnHole },
{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_SNAKE, 0, 0}, &Room::feather1UseMTricorderOnSnake },
{ {ACTION_USE, OBJECT_IMEDKIT, 0xff, 0, 0}, &Room::feather1UseMedkit },
{ {ACTION_TALK, OBJECT_MCCOY, 0, 0, 0}, &Room::feather1TalkToMccoy },
{ {ACTION_TALK, OBJECT_SPOCK, 0, 0, 0}, &Room::feather1TalkToSpock },
{ {ACTION_TALK, OBJECT_REDSHIRT, 0, 0, 0}, &Room::feather1TalkToRedshirt },
{ {ACTION_WALK, HOTSPOT_EXIT, 0, 0, 0}, &Room::feather1WalkToExit },
{ {ACTION_LOOK, 0xff, 0, 0, 0}, &Room::feather1LookAnywhere },
{ {ACTION_LOOK, OBJECT_SNAKE, 0, 0, 0}, &Room::feather1LookAtSnake },
{ {ACTION_LOOK, HOTSPOT_RIGHT_VINE, 0, 0, 0}, &Room::feather1LookAtRightVine },
{ {ACTION_LOOK, HOTSPOT_HOLE, 0, 0, 0}, &Room::feather1LookAtHole },
{ {ACTION_LOOK, HOTSPOT_MOSS, 0, 0, 0}, &Room::feather1LookAtMoss },
{ {ACTION_LOOK, HOTSPOT_ROCKS, 0, 0, 0}, &Room::feather1LookAtRocks },
{ {ACTION_LOOK, HOTSPOT_LIGHT, 0, 0, 0}, &Room::feather1LookAtLight },
{ {ACTION_LOOK, HOTSPOT_EYES_1, 0, 0, 0}, &Room::feather1LookAtEyes },
{ {ACTION_LOOK, HOTSPOT_EYES_2, 0, 0, 0}, &Room::feather1LookAtEyes },
{ {ACTION_LOOK, HOTSPOT_EYES_3, 0, 0, 0}, &Room::feather1LookAtEyes },
{ {ACTION_LOOK, OBJECT_KIRK, 0, 0, 0}, &Room::feather1LookAtKirk },
{ {ACTION_LOOK, OBJECT_SPOCK, 0, 0, 0}, &Room::feather1LookAtSpock },
{ {ACTION_LOOK, OBJECT_MCCOY, 0, 0, 0}, &Room::feather1LookAtMccoy },
{ {ACTION_LOOK, OBJECT_REDSHIRT, 0, 0, 0}, &Room::feather1LookAtRedshirt },
{ {ACTION_LOOK, OBJECT_LEFT_VINE, 0, 0, 0}, &Room::feather1LookAtLeftVine },
{ {ACTION_LIST_END, 0, 0, 0, 0}, nullptr }
};
enum feather1TextIds {
TX_SPEAKER_KIRK, TX_SPEAKER_QUETZECOATL, TX_SPEAKER_MCCOY, TX_SPEAKER_SPOCK, TX_SPEAKER_STRAGEY,
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,
TX_FEA1_017, TX_FEA1_018, TX_FEA1_019, TX_FEA1_020, TX_FEA1_021,
TX_FEA1_022, 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, 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, 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,
TX_FEA1N008, TX_FEA1N009, TX_FEA1N010, TX_FEA1N011, TX_FEA1N012,
TX_FEA1N013, TX_FEA1N014, TX_FEA1N015, TX_FEA1N016, TX_FEA1N017,
TX_FEA1N018, TX_FEA1N019, TX_FEA1N020, TX_FEA1N021, TX_FEA1N022
};
// TODO: Finish floppy offsets
extern const RoomTextOffsets feather1TextOffsets[] = {
{ TX_SPEAKER_KIRK, 4412, 0, 0, 0 },
{ TX_SPEAKER_MCCOY, 4435, 0, 0, 0 },
{ TX_SPEAKER_SPOCK, 4445, 0, 0, 0 },
{ TX_SPEAKER_QUETZECOATL, 4423, 0, 0, 0 },
{ TX_SPEAKER_STRAGEY, 4455, 0, 0, 0 },
{ TX_FEA1_001, 10730, 0, 0, 0 },
{ TX_FEA1_002, 9907, 0, 0, 0 },
{ TX_FEA1_003, 10929, 0, 0, 0 },
{ TX_FEA1_004, 6487, 0, 0, 0 },
{ TX_FEA1_005, 6143, 0, 0, 0 },
{ TX_FEA1_006, 7970, 0, 0, 0 },
{ TX_FEA1_007, 9933, 0, 0, 0 },
{ TX_FEA1_008, 3761, 0, 0, 0 },
{ TX_FEA1_009, 4949, 0, 0, 0 },
{ TX_FEA1_010, 6430, 0, 0, 0 },
{ TX_FEA1_011, 9554, 0, 0, 0 },
{ TX_FEA1_012, 9519, 0, 0, 0 },
{ TX_FEA1_013, 5288, 0, 0, 0 },
{ TX_FEA1_014, 9462, 0, 0, 0 },
{ TX_FEA1_015, 6775, 0, 0, 0 },
{ TX_FEA1_017, 5616, 0, 0, 0 },
{ TX_FEA1_018, 10805, 0, 0, 0 },
{ TX_FEA1_019, 9608, 0, 0, 0 },
{ TX_FEA1_020, 10217, 0, 0, 0 },
{ TX_FEA1_021, 5876, 0, 0, 0 },
{ TX_FEA1_022, 9983, 0, 0, 0 },
{ TX_FEA1_023, 4693, 0, 0, 0 },
{ TX_FEA1_023, 4693, 0, 0, 0 },
{ TX_FEA1_024, 10984, 0, 0, 0 },
{ TX_FEA1_025, 6379, 0, 0, 0 },
{ TX_FEA1_026, 7037, 0, 0, 0 },
{ TX_FEA1_027, 6312, 0, 0, 0 },
{ TX_FEA1_028, 8659, 0, 0, 0 },
{ TX_FEA1_029, 8901, 0, 0, 0 },
{ TX_FEA1_030, 9168, 0, 0, 0 },
{ TX_FEA1_031, 9092, 0, 0, 0 },
{ TX_FEA1_032, 4842, 0, 0, 0 },
{ TX_FEA1_033, 6704, 0, 0, 0 },
{ TX_FEA1_034, 5992, 0, 0, 0 },
{ TX_FEA1_035, 6055, 0, 0, 0 },
{ TX_FEA1_037, 5146, 0, 0, 0 },
{ TX_FEA1_038, 9268, 0, 0, 0 },
{ TX_FEA1_039, 8771, 0, 0, 0 },
{ TX_FEA1_040, 8095, 0, 0, 0 },
{ TX_FEA1_041, 10597, 0, 0, 0 },
{ TX_FEA1_042, 5503, 0, 0, 0 },
{ TX_FEA1_043, 5770, 0, 0, 0 },
{ TX_FEA1_044, 9705, 0, 0, 0 },
{ TX_FEA1_045, 4988, 0, 0, 0 },
{ TX_FEA1_046, 6218, 0, 0, 0 },
{ TX_FEA1_047, 6618, 0, 0, 0 },
{ TX_FEA1_048, 8173, 0, 0, 0 },
{ TX_FEA1_049, 6859, 0, 0, 0 },
{ TX_FEA1_049, 6859, 0, 0, 0 },
{ TX_FEA1_050, 7132, 0, 0, 0 },
{ TX_FEA1_051, 6579, 0, 0, 0 },
{ TX_FEA1_052, 5409, 0, 0, 0 },
{ TX_FEA1_053, 5948, 0, 0, 0 },
{ TX_FEA1_054, 5696, 0, 0, 0 },
{ TX_FEA1_055, 9851, 0, 0, 0 },
{ TX_FEA1_056, 10123, 0, 0, 0 },
{ TX_FEA1_057, 4468, 0, 0, 0 },
{ TX_FEA1_A46, 5235, 0, 0, 0 },
{ TX_FEA1_F25, 6966, 0, 0, 0 },
{ TX_FEA1N000, 4782, 0, 0, 0 },
{ TX_FEA1N001, 10345, 0, 0, 0 },
{ TX_FEA1N002, 10538, 0, 0, 0 },
{ TX_FEA1N003, 10482, 0, 0, 0 },
{ TX_FEA1N004, 10429, 0, 0, 0 },
{ TX_FEA1N005, 5056, 0, 0, 0 },
{ TX_FEA1N006, 6661, 0, 0, 0 },
{ TX_FEA1N007, 8511, 0, 0, 0 },
{ TX_FEA1N008, 8454, 0, 0, 0 },
{ TX_FEA1N009, 8409, 0, 0, 0 },
{ TX_FEA1N010, 5100, 0, 0, 0 },
{ TX_FEA1N011, 7824, 0, 0, 0 },
{ TX_FEA1N012, 7295, 0, 0, 0 },
{ TX_FEA1N013, 7905, 0, 0, 0 },
{ TX_FEA1N014, 7650, 0, 0, 0 },
{ TX_FEA1N015, 7409, 0, 0, 0 },
{ TX_FEA1N016, 7758, 0, 0, 0 },
{ TX_FEA1N017, 7542, 0, 0, 0 },
{ TX_FEA1N018, 8586, 0, 0, 0 },
{ TX_FEA1N019, 8370, 0, 0, 0 },
{ TX_FEA1N020, 7467, 0, 0, 0 },
{ TX_FEA1N021, 8262, 0, 0, 0 },
{ TX_FEA1N022, 8317, 0, 0, 0 },
{ -1, 0, 0, 0, 0 }
};
extern const RoomText feather1Texts[] = {
{ -1, Common::UNK_LANG, "" }
};
void Room::feather1Tick1() {
playVoc("FEA1LOOP");
playMidiMusicTracks(MIDITRACK_27);
if (_awayMission->feather.vineState == 0)
_awayMission->disableInput = true;
if (!_awayMission->feather.gotSnake)
loadActorAnim(OBJECT_SNAKE, "s5r1so", 0x9c, 0xc1);
if (_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 (_awayMission->feather.vineState == 0) {
playVoc("LD3MAGAP");
loadActorAnim(OBJECT_QUETZECOATL, "s5r1qa", 0xb4, 0x32);
}
}
void Room::feather1Tick85() {
if (_awayMission->feather.vineState == 0)
showText(TX_SPEAKER_QUETZECOATL, TX_FEA1_057);
}
void Room::feather1Tick95() {
if (_awayMission->feather.vineState == 0) {
playVoc("LD3MAGDI");
loadActorAnimC(OBJECT_QUETZECOATL, "s5r1qd", -1, -1, &Room::feather1QuetzecoatlDisappeared);
}
}
void Room::feather1QuetzecoatlDisappeared() {
_awayMission->disableInput = false;
}
void Room::feather1GetRightVine() {
showDescription(TX_FEA1N008);
}
void Room::feather1GetLeftVine() {
if (_awayMission->feather.vineState == 0)
showDescription(TX_FEA1N009);
else
showDescription(TX_FEA1N008);
}
void Room::feather1GetRocks() {
if (_roomVar.feather.crewEscaped[OBJECT_KIRK])
showDescription(TX_FEA1N021);
else if (_awayMission->feather.gotRock)
showDescription(TX_FEA1N019);
else {
walkCrewmanC(OBJECT_KIRK, 0x90, 0xb6, &Room::feather1ReachedRocks);
_awayMission->disableInput = true;
}
}
void Room::feather1ReachedRocks() {
loadActorAnimC(OBJECT_KIRK, "s5r1kg", -1, -1, &Room::feather1PickedUpRocks);
}
void Room::feather1PickedUpRocks() {
_awayMission->disableInput = false;
loadActorStandAnim(OBJECT_KIRK);
giveItem(OBJECT_IROCK);
showDescription(TX_FEA1N022);
_awayMission->feather.gotRock = true;
}
void Room::feather1GetSnake() {
// BUG: Infinite score mechanism. Just keep trying and failing to get the snake.
_awayMission->feather.missionScore++;
if (!_roomVar.feather.crewEscaped[OBJECT_KIRK]) {
walkCrewmanC(OBJECT_KIRK, 0x90, 0xbe, &Room::feather1ReachedSnake);
_awayMission->disableInput = true;
} else
showDescription(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 (_awayMission->feather.holeBlocked)
_awayMission->timers[1] = 20;
else
_awayMission->timers[2] = 6;
}
void Room::feather1Timer1Expired() {
giveItem(OBJECT_ISNAKE);
loadActorStandAnim(OBJECT_SNAKE);
_awayMission->feather.gotSnake = true;
}
void Room::feather1Timer2Expired() { // Snake retreats into hole
loadActorAnim2(OBJECT_SNAKE, "s5r1si");
_awayMission->timers[0] = 80;
_roomVar.feather.snakeInHole = true;
}
void Room::feather1PickedUpSnake() {
_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])
showDescription(TX_FEA1N021);
else if (_awayMission->feather.holeBlocked)
showDescription(TX_FEA1N005);
else {
_awayMission->feather.missionScore++;
walkCrewmanC(OBJECT_KIRK, 0xa3, 0xb6, &Room::feather1ReachedHole);
_awayMission->disableInput = true;
if (_roomVar.feather.snakeInHole)
_awayMission->timers[0] = 12;
}
}
void Room::feather1ReachedHole() {
loadActorAnimC(OBJECT_KIRK, "s5r1kg", -1, -1, &Room::feather1PutRockInHole);
_awayMission->timers[3] = 18;
}
void Room::feather1Timer3Expired() {
loadActorAnim(OBJECT_ROCK_IN_HOLE, "s5r1rk", 0xad, 0xba);
_awayMission->feather.holeBlocked = true;
}
void Room::feather1PutRockInHole() {
_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 (!_awayMission->feather.gotSnake) {
loadActorAnim2(OBJECT_SNAKE, "s5r1si");
_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() {
showDescription(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 (_awayMission->feather.vineState == 0) {
_awayMission->feather.vineState++;
_awayMission->disableInput = true;
walkCrewmanC(OBJECT_KIRK, 0x7a, 0xb6, &Room::feather1ReadyToThrowRock1);
} else if (_awayMission->feather.vineState == 1) {
_awayMission->feather.vineState++;
_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() {
_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() {
_awayMission->feather.missionScore += 6;
loadActorStandAnim(OBJECT_KIRK);
_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 (_awayMission->feather.vineState == 2) {
_roomVar.feather.crewmanClimbingVine = OBJECT_SPOCK;
feather1CrewmanClimbVine();
} else
showText(TX_SPEAKER_SPOCK, TX_FEA1_A46);
}
void Room::feather1UseMccoyOnVine() {
if (_awayMission->feather.vineState == 2) {
_roomVar.feather.crewmanClimbingVine = OBJECT_MCCOY;
feather1CrewmanClimbVine();
} else
showText(TX_SPEAKER_MCCOY, TX_FEA1_013);
}
void Room::feather1UseRedshirtOnVine() {
if (_awayMission->feather.vineState == 2) {
_roomVar.feather.crewmanClimbingVine = OBJECT_REDSHIRT;
feather1CrewmanClimbVine();
} else
showText(TX_SPEAKER_STRAGEY, TX_FEA1_052);
}
void Room::feather1UseKirkOnVine() {
if (_awayMission->feather.vineState == 2) {
_roomVar.feather.crewmanClimbingVine = OBJECT_KIRK;
feather1CrewmanClimbVine();
} else
showDescription(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() {
_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() {
_awayMission->disableInput = false;
_roomVar.feather.crewEscaped[_roomVar.feather.crewmanClimbingVine] = true;
Common::String anim = 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;
default:
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() {
_awayMission->disableInput = false;
_roomVar.feather.crewEscaped[_roomVar.feather.crewmanClimbingVine] = false;
Common::String anim = 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;
default:
break;
}
}
void Room::feather1UsePhaser() {
showText(TX_SPEAKER_SPOCK, TX_FEA1_028);
}
void Room::feather1UseSTricorderOnRightVine() {
spockScan(DIR_N, TX_SPEAKER_SPOCK, TX_FEA1_039);
}
void Room::feather1UseSTricorderOnSnake() {
spockScan(DIR_S, TX_SPEAKER_SPOCK, TX_FEA1_029);
}
void Room::feather1UseSTricorderOnMoss() {
spockScan(DIR_E, TX_SPEAKER_SPOCK, TX_FEA1_038);
}
void Room::feather1UseSTricorderOnHole() {
if (_roomVar.feather.snakeInHole)
spockScan(DIR_E, TX_SPEAKER_SPOCK, TX_FEA1_030);
else
spockScan(DIR_E, TX_SPEAKER_SPOCK, TX_FEA1_031);
}
void Room::feather1UseSTricorderAnywhere() {
spockScan(DIR_S, TX_SPEAKER_SPOCK, TX_FEA1_024);
}
void Room::feather1UseSTricorderOnRocks() {
spockScan(DIR_E, TX_SPEAKER_SPOCK, TX_FEA1_003);
}
void Room::feather1UseMTricorderOnVine() {
// ENHANCEMENT: Original didn't play tricorder sound, etc
mccoyScan(DIR_E, TX_SPEAKER_MCCOY, TX_FEA1_007);
}
void Room::feather1UseMTricorderOnMoss() {
mccoyScan(DIR_E, TX_SPEAKER_MCCOY, TX_FEA1_014);
}
void Room::feather1UseMTricorderOnHole() {
if (_roomVar.feather.snakeInHole)
mccoyScan(DIR_E, TX_SPEAKER_MCCOY, TX_FEA1_011);
else
mccoyScan(DIR_E, TX_SPEAKER_MCCOY, TX_FEA1_012);
}
void Room::feather1UseMTricorderOnSnake() {
mccoyScan(DIR_S, TX_SPEAKER_MCCOY, 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() {
showDescription(TX_FEA1N020);
}
void Room::feather1LookAtSnake() {
showDescription(TX_FEA1N017);
}
void Room::feather1LookAtRightVine() {
showDescription(TX_FEA1N015);
}
void Room::feather1LookAtHole() {
showDescription(TX_FEA1N014);
}
void Room::feather1LookAtMoss() {
showDescription(TX_FEA1N016);
}
void Room::feather1LookAtRocks() {
showDescription(TX_FEA1N011);
}
void Room::feather1LookAtLight() {
showDescription(TX_FEA1N013);
}
void Room::feather1LookAtEyes() {
showDescription(TX_FEA1N000);
}
void Room::feather1LookAtKirk() {
showDescription(TX_FEA1N001);
}
void Room::feather1LookAtSpock() {
showDescription(TX_FEA1N004);
}
void Room::feather1LookAtMccoy() {
showDescription(TX_FEA1N003);
}
void Room::feather1LookAtRedshirt() {
showDescription(TX_FEA1N002);
}
void Room::feather1LookAtLeftVine() {
if (_awayMission->feather.vineState == 0)
showDescription(TX_FEA1N012);
else
showDescription(TX_FEA1N015);
}
}