mirror of
https://github.com/libretro/scummvm.git
synced 2025-02-21 19:51:49 +00:00
719 lines
24 KiB
C++
719 lines
24 KiB
C++
/* ScummVM - Graphic Adventure Engine
|
|
*
|
|
* 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 2
|
|
* 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, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
*
|
|
*/
|
|
|
|
#include "startrek/room.h"
|
|
|
|
#define OBJECT_ENTITY 8
|
|
#define OBJECT_MOLTEN_ROCK 9
|
|
#define OBJECT_DOOR 10
|
|
#define OBJECT_THROWN_IRON_ROD 11
|
|
|
|
#define HOTSPOT_DOOR 0x20
|
|
#define HOTSPOT_LOCK 0x21
|
|
#define HOTSPOT_RODS 0x22
|
|
#define HOTSPOT_WALL 0x23
|
|
#define HOTSPOT_FLOOR 0x24
|
|
|
|
namespace StarTrek {
|
|
|
|
extern const RoomAction trial1ActionList[] = {
|
|
{ {ACTION_TICK, 1, 0, 0}, &Room::trial1Tick1 },
|
|
{ {ACTION_TICK, 50, 0, 0}, &Room::trial1Tick50 },
|
|
{ {ACTION_DONE_ANIM, 9, 0, 0}, &Room::trial1DoorOpened },
|
|
|
|
{ {ACTION_TOUCHED_HOTSPOT, 0, 0, 0}, &Room::trial1TouchedHotspot0 },
|
|
{ {ACTION_DONE_ANIM, 1, 0, 0}, &Room::trial1KirkDied },
|
|
|
|
{ {ACTION_TOUCHED_HOTSPOT, 1, 0, 0}, &Room::trial1TouchedHotspot1 },
|
|
|
|
{ {ACTION_GET, HOTSPOT_RODS, 0, 0}, &Room::trial1GetRod },
|
|
{ {ACTION_DONE_WALK, 4, 0, 0}, &Room::trial1ReachedRod },
|
|
{ {ACTION_DONE_ANIM, 5, 0, 0}, &Room::trial1PickedUpRod },
|
|
|
|
{ {ACTION_LOOK, OBJECT_KIRK, 0, 0}, &Room::trial1LookAtKirk },
|
|
{ {ACTION_LOOK, OBJECT_SPOCK, 0, 0}, &Room::trial1LookAtSpock },
|
|
{ {ACTION_LOOK, OBJECT_MCCOY, 0, 0}, &Room::trial1LookAtMccoy },
|
|
{ {ACTION_LOOK, OBJECT_REDSHIRT, 0, 0}, &Room::trial1LookAtRedshirt },
|
|
{ {ACTION_LOOK, HOTSPOT_WALL, 0, 0}, &Room::trial1LookAtWall },
|
|
{ {ACTION_LOOK, HOTSPOT_FLOOR, 0, 0}, &Room::trial1LookAtFloor },
|
|
{ {ACTION_LOOK, HOTSPOT_RODS, 0, 0}, &Room::trial1LookAtRods },
|
|
{ {ACTION_LOOK, HOTSPOT_DOOR, 0, 0}, &Room::trial1LookAtDoor },
|
|
{ {ACTION_LOOK, HOTSPOT_LOCK, 0, 0}, &Room::trial1LookAtLock },
|
|
{ {ACTION_LOOK, OBJECT_ENTITY, 0, 0}, &Room::trial1LookAtEntity },
|
|
{ {ACTION_LOOK, OBJECT_MOLTEN_ROCK, 0, 0}, &Room::trial1LookAtMoltenRock },
|
|
{ {ACTION_TALK, OBJECT_KIRK, 0, 0}, &Room::trial1TalkToKirk },
|
|
{ {ACTION_TALK, OBJECT_SPOCK, 0, 0}, &Room::trial1TalkToSpock },
|
|
{ {ACTION_TALK, OBJECT_MCCOY, 0, 0}, &Room::trial1TalkToMccoy },
|
|
{ {ACTION_TALK, OBJECT_REDSHIRT, 0, 0}, &Room::trial1TalkToRedshirt },
|
|
{ {ACTION_TALK, OBJECT_ENTITY, 0, 0}, &Room::trial1TalkToEntity },
|
|
|
|
{ {ACTION_USE, OBJECT_IPHASERS, OBJECT_KIRK, 0}, &Room::trial1UsePhaserOnCrewman },
|
|
{ {ACTION_USE, OBJECT_IPHASERK, OBJECT_KIRK, 0}, &Room::trial1UsePhaserOnCrewman },
|
|
{ {ACTION_USE, OBJECT_IPHASERS, OBJECT_SPOCK, 0}, &Room::trial1UsePhaserOnCrewman },
|
|
{ {ACTION_USE, OBJECT_IPHASERK, OBJECT_SPOCK, 0}, &Room::trial1UsePhaserOnCrewman },
|
|
{ {ACTION_USE, OBJECT_IPHASERS, OBJECT_MCCOY, 0}, &Room::trial1UsePhaserOnCrewman },
|
|
{ {ACTION_USE, OBJECT_IPHASERK, OBJECT_MCCOY, 0}, &Room::trial1UsePhaserOnCrewman },
|
|
{ {ACTION_USE, OBJECT_IPHASERS, OBJECT_REDSHIRT, 0}, &Room::trial1UsePhaserOnCrewman },
|
|
{ {ACTION_USE, OBJECT_IPHASERK, OBJECT_REDSHIRT, 0}, &Room::trial1UsePhaserOnCrewman },
|
|
|
|
{ {ACTION_USE, OBJECT_IPHASERS, OBJECT_ENTITY, 0}, &Room::trial1UsePhaserOnEntity },
|
|
{ {ACTION_USE, OBJECT_IPHASERK, OBJECT_ENTITY, 0}, &Room::trial1UsePhaserOnEntity },
|
|
{ {ACTION_USE, OBJECT_IPHASERS, HOTSPOT_WALL, 0}, &Room::trial1UsePhaserOnWall },
|
|
{ {ACTION_USE, OBJECT_IPHASERK, HOTSPOT_WALL, 0}, &Room::trial1UsePhaserOnWall },
|
|
|
|
{ {ACTION_USE, OBJECT_IPHASERS, HOTSPOT_FLOOR, 0}, &Room::trial1UseStunPhaserOnFloor },
|
|
{ {ACTION_DONE_WALK, 12, 0, 0}, &Room::trial1ReachedFloorToUseStunPhaser },
|
|
{ {ACTION_DONE_ANIM, 13, 0, 0}, &Room::trial1DoneShootingFloorWithStunPhaser },
|
|
|
|
{ {ACTION_USE, OBJECT_IPHASERK, HOTSPOT_FLOOR, 0}, &Room::trial1UseKillPhaserOnFloor },
|
|
{ {ACTION_DONE_WALK, 14, 0, 0}, &Room::trial1ReachedFloorToUseKillPhaser },
|
|
{ {ACTION_DONE_ANIM, 15, 0, 0}, &Room::trial1DoneShootingFloorWithKillPhaser },
|
|
|
|
{ {ACTION_USE, OBJECT_IPHASERS, HOTSPOT_RODS, 0}, &Room::trial1UsePhaserOnRod },
|
|
{ {ACTION_USE, OBJECT_IPHASERK, HOTSPOT_RODS, 0}, &Room::trial1UsePhaserOnRod },
|
|
{ {ACTION_USE, OBJECT_IPHASERS, HOTSPOT_DOOR, 0}, &Room::trial1UsePhaserOnDoor },
|
|
{ {ACTION_USE, OBJECT_IPHASERK, HOTSPOT_DOOR, 0}, &Room::trial1UsePhaserOnDoor },
|
|
{ {ACTION_USE, OBJECT_IPHASERS, HOTSPOT_LOCK, 0}, &Room::trial1UsePhaserOnLock },
|
|
{ {ACTION_USE, OBJECT_IPHASERK, HOTSPOT_LOCK, 0}, &Room::trial1UsePhaserOnLock },
|
|
{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_KIRK, 0}, &Room::trial1UseMTricorderOnKirk },
|
|
{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_SPOCK, 0}, &Room::trial1UseMTricorderOnSpock },
|
|
{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_MCCOY, 0}, &Room::trial1UseMTricorderOnMccoy },
|
|
{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_REDSHIRT, 0}, &Room::trial1UseMTricorderOnRedshirt },
|
|
{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_ENTITY, 0}, &Room::trial1UseMTricorderOnEntity },
|
|
{ {ACTION_USE, OBJECT_ISTRICOR, HOTSPOT_WALL, 0}, &Room::trial1UseSTricorderOnWall },
|
|
{ {ACTION_USE, OBJECT_ISTRICOR, OBJECT_ENTITY, 0}, &Room::trial1UseSTricorderOnEntity },
|
|
{ {ACTION_USE, OBJECT_ISTRICOR, HOTSPOT_RODS, 0}, &Room::trial1UseSTricorderOnRods },
|
|
{ {ACTION_USE, OBJECT_ISTRICOR, HOTSPOT_FLOOR, 0}, &Room::trial1UseSTricorderOnFloor },
|
|
{ {ACTION_USE, OBJECT_ISTRICOR, HOTSPOT_DOOR, 0}, &Room::trial1UseSTricorderOnDoor },
|
|
{ {ACTION_USE, OBJECT_ISTRICOR, HOTSPOT_LOCK, 0}, &Room::trial1UseSTricorderOnLock },
|
|
{ {ACTION_USE, OBJECT_ICOMM, 0xff, 0}, &Room::trial1UseCommunicator },
|
|
{ {ACTION_USE, OBJECT_MCCOY, OBJECT_ENTITY, 0}, &Room::trial1UseMccoyOnEntity },
|
|
{ {ACTION_USE, OBJECT_MCCOY, HOTSPOT_LOCK, 0}, &Room::trial1UseMccoyOnLock },
|
|
{ {ACTION_USE, OBJECT_MCCOY, HOTSPOT_FLOOR, 0}, &Room::trial1UseMccoyOnFloor },
|
|
{ {ACTION_USE, OBJECT_SPOCK, OBJECT_ENTITY, 0}, &Room::trial1UseSpockOnEntity },
|
|
|
|
{ {ACTION_USE, OBJECT_SPOCK, HOTSPOT_LOCK, 0}, &Room::trial1UseSpockOnLock },
|
|
{ {ACTION_DONE_WALK, 18, 0, 0}, &Room::trial1SpockReachedKeypad },
|
|
{ {ACTION_DONE_ANIM, 19, 0, 0}, &Room::trial1SpockUsedKeypad },
|
|
{ {ACTION_DONE_WALK, 20, 0, 0}, &Room::trial1SpockReachedKeypadWithExtraProgram },
|
|
{ {ACTION_DONE_ANIM, 21, 0, 0}, &Room::trial1SpockUsedKeypadWithExtraProgram },
|
|
|
|
{ {ACTION_USE, OBJECT_SPOCK, HOTSPOT_FLOOR, 0}, &Room::trial1UseSpockOnFloor },
|
|
{ {ACTION_USE, OBJECT_REDSHIRT, OBJECT_ENTITY, 0}, &Room::trial1UseRedshirtOnEntity },
|
|
|
|
{ {ACTION_USE, OBJECT_REDSHIRT, HOTSPOT_LOCK, 0}, &Room::trial1UseRedshirtOnLock },
|
|
{ {ACTION_DONE_WALK, 24, 0, 0}, &Room::trial1RedshirtReachedKeypad },
|
|
{ {ACTION_DONE_ANIM, 25, 0, 0}, &Room::trial1RedshirtUsedKeypad },
|
|
{ {ACTION_DONE_WALK, 26, 0, 0}, &Room::trial1RedshirtReachedKeypadWithExtraProgram },
|
|
{ {ACTION_DONE_ANIM, 27, 0, 0}, &Room::trial1RedshirtUsedKeypadWithExtraProgram },
|
|
|
|
{ {ACTION_USE, OBJECT_REDSHIRT, HOTSPOT_FLOOR, 0}, &Room::trial1UseRedshirtOnFloor },
|
|
{ {ACTION_USE, OBJECT_IWROD, OBJECT_MCCOY, 0}, &Room::trial1UseRodOnMccoy },
|
|
{ {ACTION_USE, OBJECT_IWROD, OBJECT_SPOCK, 0}, &Room::trial1UseRodOnSpock },
|
|
{ {ACTION_USE, OBJECT_IWROD, OBJECT_REDSHIRT, 0}, &Room::trial1UseRodOnRedshirt },
|
|
{ {ACTION_USE, OBJECT_IWROD, HOTSPOT_FLOOR, 0}, &Room::trial1UseRodOnFloorOrWall },
|
|
{ {ACTION_USE, OBJECT_IWROD, HOTSPOT_WALL, 0}, &Room::trial1UseRodOnFloorOrWall },
|
|
|
|
{ {ACTION_USE, OBJECT_IWROD, OBJECT_ENTITY, 0}, &Room::trial1UseWoodRodOnEntity },
|
|
{ {ACTION_DONE_WALK, 10, 0, 0}, &Room::trial1ReachedPositionToThrowWoodRod },
|
|
{ {ACTION_DONE_ANIM, 6, 0, 0}, &Room::trial1DoneThrowingWoodRod },
|
|
|
|
{ {ACTION_USE, OBJECT_IWROD, HOTSPOT_LOCK, 0}, &Room::trial1UseWoodRodOnLock },
|
|
|
|
{ {ACTION_USE, OBJECT_IWROD, OBJECT_MOLTEN_ROCK, 0}, &Room::trial1UseWoodRodOnMoltenRock },
|
|
{ {ACTION_DONE_WALK, 16, 0, 0}, &Room::trial1ReachedMoltenRock },
|
|
{ {ACTION_DONE_ANIM, 17, 0, 0}, &Room::trial1DoneCoatingWoodRod },
|
|
|
|
{ {ACTION_USE, OBJECT_IIROD, OBJECT_MCCOY, 0}, &Room::trial1UseRodOnMccoy },
|
|
{ {ACTION_USE, OBJECT_IIROD, OBJECT_SPOCK, 0}, &Room::trial1UseRodOnSpock },
|
|
{ {ACTION_USE, OBJECT_IIROD, OBJECT_REDSHIRT, 0}, &Room::trial1UseRodOnRedshirt },
|
|
{ {ACTION_USE, OBJECT_IIROD, HOTSPOT_FLOOR, 0}, &Room::trial1UseRodOnFloorOrWall },
|
|
{ {ACTION_USE, OBJECT_IIROD, HOTSPOT_WALL, 0}, &Room::trial1UseRodOnFloorOrWall },
|
|
|
|
{ {ACTION_USE, OBJECT_IIROD, OBJECT_ENTITY, 0}, &Room::trial1UseIronRodOnEntity },
|
|
{ {ACTION_DONE_WALK, 11, 0, 0}, &Room::trial1ReachedPositionToThrowIronRod },
|
|
{ {ACTION_DONE_ANIM, 7, 0, 0}, &Room::trial1DoneThrowingIronRod },
|
|
|
|
{ {ACTION_USE, OBJECT_IIROD, HOTSPOT_LOCK, 0}, &Room::trial1UseIronRodOnLock },
|
|
{ {ACTION_GET, OBJECT_THROWN_IRON_ROD, 0, 0}, &Room::trial1GetThrownIronRod },
|
|
{ {ACTION_WALK, HOTSPOT_DOOR, 0, 0}, &Room::trial1WalkToDoor },
|
|
{ {ACTION_USE, OBJECT_IMEDKIT, 0xff, 0}, &Room::trial1UseMedkit },
|
|
|
|
// ENHANCEMENT: Implement actions for the door object, not just the hotspot
|
|
{ {ACTION_LOOK, OBJECT_DOOR, 0, 0}, &Room::trial1LookAtDoor },
|
|
{ {ACTION_USE, OBJECT_IPHASERS, OBJECT_DOOR, 0}, &Room::trial1UsePhaserOnDoor },
|
|
{ {ACTION_USE, OBJECT_IPHASERK, OBJECT_DOOR, 0}, &Room::trial1UsePhaserOnDoor },
|
|
{ {ACTION_USE, OBJECT_ISTRICOR, OBJECT_DOOR, 0}, &Room::trial1UseSTricorderOnDoor },
|
|
{ {ACTION_WALK, OBJECT_DOOR, 0, 0}, &Room::trial1WalkToDoor },
|
|
};
|
|
|
|
extern const int trial1NumActions = ARRAYSIZE(trial1ActionList);
|
|
|
|
|
|
void Room::trial1Tick1() {
|
|
if (!_awayMission->trial.doorOpen) {
|
|
_awayMission->disableInput = 2;
|
|
loadActorAnim2(OBJECT_DOOR, "t1drc");
|
|
}
|
|
if (!_awayMission->trial.entityDefeated) {
|
|
loadActorAnim2(OBJECT_ENTITY, "ec", 0x5f, 0xb1, 3); // No callback defined
|
|
playVoc("TRI1LOOP");
|
|
}
|
|
}
|
|
|
|
void Room::trial1Tick50() {
|
|
if (!_awayMission->trial.doorOpen)
|
|
_awayMission->disableInput = false;
|
|
if (!_awayMission->trial.entityDefeated) {
|
|
showText(TX_SPEAKER_BENNIE, 56, true);
|
|
showText(TX_SPEAKER_SPOCK, 47, true);
|
|
showText(TX_SPEAKER_MCCOY, 32, true);
|
|
showText(TX_SPEAKER_KIRK, 7, true);
|
|
showText(TX_SPEAKER_BENNIE, 57, true);
|
|
showText(TX_SPEAKER_KIRK, 10, true);
|
|
showText(TX_SPEAKER_BENNIE, 55, true);
|
|
}
|
|
}
|
|
|
|
void Room::trial1DoorOpened() { // Called after Spock opens the door
|
|
_awayMission->trial.doorOpen = true;
|
|
loadActorStandAnim(OBJECT_DOOR);
|
|
}
|
|
|
|
void Room::trial1TouchedHotspot0() { // Kirk touched the energy thing
|
|
if (!_awayMission->trial.entityDefeated) {
|
|
// BUGFIX: Disable input, otherwise you can cancel the death
|
|
_awayMission->disableInput = true;
|
|
loadActorAnimC(OBJECT_KIRK, "kkills", -1, -1, &Room::trial1KirkDied);
|
|
}
|
|
}
|
|
|
|
void Room::trial1KirkDied() {
|
|
showGameOverMenu();
|
|
}
|
|
|
|
void Room::trial1TouchedHotspot1() { // Entered the door
|
|
if (_awayMission->trial.doorOpen) {
|
|
_awayMission->disableInput = true;
|
|
loadRoomIndex(2, 2);
|
|
}
|
|
}
|
|
|
|
|
|
void Room::trial1GetRod() {
|
|
_awayMission->disableInput = true;
|
|
walkCrewmanC(OBJECT_KIRK, 0xe9, 0xa9, &Room::trial1ReachedRod);
|
|
}
|
|
|
|
void Room::trial1ReachedRod() {
|
|
loadActorAnimC(OBJECT_KIRK, "t1pkup", 0xe9, 0xa9, &Room::trial1PickedUpRod);
|
|
giveItem(OBJECT_IWROD);
|
|
if (!_awayMission->trial.gotPointsForGettingRod) {
|
|
_awayMission->trial.gotPointsForGettingRod = true;
|
|
_awayMission->trial.missionScore += 1;
|
|
}
|
|
}
|
|
|
|
void Room::trial1PickedUpRod() {
|
|
_awayMission->disableInput = false;
|
|
}
|
|
|
|
void Room::trial1LookAtKirk() {
|
|
showDescription(3, true);
|
|
}
|
|
|
|
void Room::trial1LookAtSpock() {
|
|
showDescription(17, true);
|
|
}
|
|
|
|
void Room::trial1LookAtMccoy() {
|
|
showDescription(16, true);
|
|
}
|
|
|
|
void Room::trial1LookAtRedshirt() {
|
|
showDescription(15, true);
|
|
}
|
|
|
|
void Room::trial1LookAtWall() {
|
|
showDescription(11, true);
|
|
}
|
|
|
|
void Room::trial1LookAtFloor() {
|
|
showDescription(6, true);
|
|
}
|
|
|
|
void Room::trial1LookAtRods() {
|
|
showDescription(9, true);
|
|
}
|
|
|
|
void Room::trial1LookAtDoor() {
|
|
showDescription(1, true);
|
|
}
|
|
|
|
void Room::trial1LookAtLock() {
|
|
showDescription(2, true);
|
|
}
|
|
|
|
void Room::trial1LookAtEntity() {
|
|
showDescription(0, true);
|
|
}
|
|
|
|
void Room::trial1LookAtMoltenRock() {
|
|
showDescription(7, true);
|
|
}
|
|
|
|
void Room::trial1TalkToKirk() {
|
|
showText(TX_SPEAKER_KIRK, TX_TRI1_J00);
|
|
}
|
|
|
|
void Room::trial1TalkToSpock() {
|
|
showText(TX_SPEAKER_SPOCK, 46, true);
|
|
showText(TX_SPEAKER_MCCOY, 34, true);
|
|
}
|
|
|
|
void Room::trial1TalkToMccoy() {
|
|
showText(TX_SPEAKER_MCCOY, 19, true);
|
|
}
|
|
|
|
void Room::trial1TalkToRedshirt() {
|
|
showText(TX_SPEAKER_BENNIE, 53, true);
|
|
}
|
|
|
|
void Room::trial1TalkToEntity() {
|
|
showText(TX_SPEAKER_ENTITY, TX_TRI1C001);
|
|
}
|
|
|
|
void Room::trial1UsePhaserOnCrewman() {
|
|
showText(TX_SPEAKER_BENNIE, 48, true);
|
|
}
|
|
|
|
void Room::trial1UsePhaserOnEntity() {
|
|
showDescription(4, true);
|
|
}
|
|
|
|
void Room::trial1UsePhaserOnWall() {
|
|
showDescription(8, true);
|
|
}
|
|
|
|
|
|
void Room::trial1UseStunPhaserOnFloor() {
|
|
_awayMission->disableInput = true;
|
|
_awayMission->crewDirectionsAfterWalk[OBJECT_KIRK] = DIR_E;
|
|
walkCrewmanC(OBJECT_KIRK, 0xca, 0xbc, &Room::trial1ReachedFloorToUseStunPhaser);
|
|
}
|
|
|
|
void Room::trial1ReachedFloorToUseStunPhaser() {
|
|
playSoundEffectIndex(SND_PHASSHOT);
|
|
loadActorAnimC(OBJECT_KIRK, "t1mlts", 0xca, 0xbc, &Room::trial1DoneShootingFloorWithStunPhaser);
|
|
}
|
|
|
|
void Room::trial1DoneShootingFloorWithStunPhaser() {
|
|
_awayMission->disableInput = false;
|
|
_awayMission->crewDirectionsAfterWalk[OBJECT_KIRK] = DIR_E;
|
|
loadActorStandAnim(OBJECT_KIRK);
|
|
}
|
|
|
|
|
|
void Room::trial1UseKillPhaserOnFloor() {
|
|
_awayMission->disableInput = true;
|
|
_awayMission->crewDirectionsAfterWalk[OBJECT_KIRK] = DIR_E;
|
|
walkCrewmanC(OBJECT_KIRK, 0xca, 0xbc, &Room::trial1ReachedFloorToUseKillPhaser);
|
|
}
|
|
|
|
void Room::trial1ReachedFloorToUseKillPhaser() {
|
|
playSoundEffectIndex(SND_PHASSHOT);
|
|
loadActorAnimC(OBJECT_KIRK, "t1mltk", 0xca, 0xbc, &Room::trial1DoneShootingFloorWithKillPhaser);
|
|
}
|
|
|
|
void Room::trial1DoneShootingFloorWithKillPhaser() {
|
|
showDescription(14, true);
|
|
loadActorAnim2(OBJECT_MOLTEN_ROCK, "t1mltd", 0xca, 0xbc);
|
|
|
|
_awayMission->crewDirectionsAfterWalk[OBJECT_KIRK] = DIR_E;
|
|
loadActorStandAnim(OBJECT_KIRK);
|
|
|
|
// BUG: Infinite score mechanism
|
|
_awayMission->trial.missionScore += 1;
|
|
_awayMission->disableInput = false;
|
|
}
|
|
|
|
void Room::trial1UsePhaserOnRod() {
|
|
showDescription(12, true);
|
|
}
|
|
|
|
void Room::trial1UsePhaserOnDoor() {
|
|
showText(TX_SPEAKER_SPOCK, 40, true);
|
|
}
|
|
|
|
void Room::trial1UsePhaserOnLock() {
|
|
showText(TX_SPEAKER_MCCOY, 21, true);
|
|
}
|
|
|
|
void Room::trial1UseMTricorderOnKirk() {
|
|
mccoyScan(DIR_S, 24, false, true);
|
|
}
|
|
|
|
void Room::trial1UseMTricorderOnSpock() {
|
|
// ENHANCEMENT: Original didn't play tricorder sound, etc
|
|
mccoyScan(DIR_S, 25, false, true);
|
|
}
|
|
|
|
void Room::trial1UseMTricorderOnMccoy() {
|
|
mccoyScan(DIR_S, 22, false, true);
|
|
}
|
|
|
|
void Room::trial1UseMTricorderOnRedshirt() {
|
|
mccoyScan(DIR_S, 23, false, true);
|
|
}
|
|
|
|
void Room::trial1UseMTricorderOnEntity() {
|
|
mccoyScan(DIR_S, 17, false, true);
|
|
}
|
|
|
|
void Room::trial1UseSTricorderOnWall() {
|
|
spockScan(DIR_S, 43, false, true);
|
|
}
|
|
|
|
void Room::trial1UseSTricorderOnEntity() {
|
|
spockScan(DIR_S, 12, false, true);
|
|
|
|
// BUG: infinite score mechanism
|
|
_awayMission->trial.missionScore += 1;
|
|
}
|
|
|
|
void Room::trial1UseSTricorderOnRods() {
|
|
spockScan(DIR_S, 41, false, true);
|
|
}
|
|
|
|
void Room::trial1UseSTricorderOnFloor() {
|
|
spockScan(DIR_S, 42, false, true);
|
|
|
|
// BUG: infinite score mechanism
|
|
_awayMission->trial.missionScore += 1;
|
|
}
|
|
|
|
void Room::trial1UseSTricorderOnDoor() {
|
|
spockScan(DIR_S, 13, false, true);
|
|
}
|
|
|
|
void Room::trial1UseSTricorderOnLock() {
|
|
spockScan(DIR_S, 14, false, true);
|
|
|
|
if (!_awayMission->trial.scannedLock) {
|
|
_awayMission->trial.scannedLock = true;
|
|
// BUGFIX: Moved this into the if statement (used to be an infinite score mechanism)
|
|
_awayMission->trial.missionScore += 1;
|
|
}
|
|
}
|
|
|
|
void Room::trial1UseCommunicator() {
|
|
if (_awayMission->trial.forceFieldDown) {
|
|
showText(TX_SPEAKER_UHURA, 90, true);
|
|
|
|
const TextRef choices[] = {
|
|
TX_SPEAKER_KIRK,
|
|
5, 4, 9,
|
|
TX_BLANK
|
|
};
|
|
int choice = showMultipleTexts(choices, true);
|
|
|
|
if (choice == 0) { // "Beam us back to the enterprise"
|
|
_awayMission->trial.missionEndMethod = 1;
|
|
endMission(1, 1, 1);
|
|
} else if (choice == 1) { // "Beam us to Vlict's position"
|
|
showText(TX_SPEAKER_UHURA, 80, true);
|
|
_awayMission->disableInput = true;
|
|
loadRoomIndex(4, 4);
|
|
} // Else don't transport anywhere
|
|
} else { // Force field still up
|
|
if (_awayMission->trial.uhuraAnalyzedCode)
|
|
showText(TX_SPEAKER_UHURA, 68, true);
|
|
else {
|
|
showText(TX_SPEAKER_UHURA, 86, true);
|
|
showText(TX_SPEAKER_UHURA, 106, true);
|
|
showText(TX_SPEAKER_UHURA, 98, true);
|
|
|
|
if (_awayMission->trial.scannedLock) {
|
|
showText(TX_SPEAKER_KIRK, 11, true);
|
|
showText(TX_SPEAKER_UHURA, 101, true);
|
|
|
|
const TextRef choices[] = {
|
|
TX_SPEAKER_KIRK,
|
|
6, 2,
|
|
TX_BLANK
|
|
};
|
|
int choice = showMultipleTexts(choices, true);
|
|
|
|
if (choice == 0) { // Don't analyze the anomolous program
|
|
showText(TX_SPEAKER_UHURA, 79, true);
|
|
_awayMission->trial.doorCodeBehaviour = 2;
|
|
_awayMission->trial.uhuraAnalyzedCode = true;
|
|
_awayMission->trial.missionScore += 1;
|
|
} else { // Analyze the anomolous program
|
|
showText(TX_SPEAKER_UHURA, 102, true);
|
|
|
|
const TextRef choices2[] = {
|
|
TX_SPEAKER_KIRK,
|
|
3, 8,
|
|
TX_BLANK
|
|
};
|
|
choice = showMultipleTexts(choices2, true);
|
|
|
|
if (choice == 0) { // Activate the program
|
|
showText(TX_SPEAKER_UHURA, 95, true);
|
|
_awayMission->trial.doorCodeBehaviour = 5;
|
|
_awayMission->trial.uhuraAnalyzedCode = true;
|
|
_awayMission->trial.missionScore += 3;
|
|
} else { // Don't activate, only open the door
|
|
showText(TX_SPEAKER_UHURA, 79, true);
|
|
_awayMission->trial.doorCodeBehaviour = 2;
|
|
_awayMission->trial.uhuraAnalyzedCode = true;
|
|
_awayMission->trial.missionScore += 1;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void Room::trial1UseMccoyOnEntity() {
|
|
showText(TX_SPEAKER_MCCOY, 16, true);
|
|
}
|
|
|
|
void Room::trial1UseMccoyOnLock() {
|
|
if (!_awayMission->trial.entityDefeated)
|
|
showText(TX_SPEAKER_MCCOY, 18, true);
|
|
else if (_awayMission->trial.doorCodeBehaviour == 0)
|
|
showText(TX_SPEAKER_MCCOY, 20, true);
|
|
else
|
|
showText(TX_SPEAKER_MCCOY, 29, true);
|
|
}
|
|
|
|
void Room::trial1UseMccoyOnFloor() {
|
|
showText(TX_SPEAKER_MCCOY, 31, true);
|
|
}
|
|
|
|
void Room::trial1UseSpockOnEntity() {
|
|
showText(TX_SPEAKER_SPOCK, 39, true);
|
|
}
|
|
|
|
|
|
void Room::trial1UseSpockOnLock() {
|
|
if (_awayMission->trial.doorOpen)
|
|
showText(TX_SPEAKER_SPOCK, 38, true);
|
|
else if (!_awayMission->trial.entityDefeated)
|
|
showText(TX_SPEAKER_SPOCK, 36, true);
|
|
else if (_awayMission->trial.doorCodeBehaviour == 0)
|
|
showText(TX_SPEAKER_SPOCK, 44, true);
|
|
else if (_awayMission->trial.doorCodeBehaviour == 2)
|
|
walkCrewmanC(OBJECT_SPOCK, 0x1f, 0xb8, &Room::trial1SpockReachedKeypad);
|
|
else
|
|
walkCrewmanC(OBJECT_SPOCK, 0x1f, 0xb8, &Room::trial1SpockReachedKeypadWithExtraProgram);
|
|
}
|
|
|
|
void Room::trial1SpockReachedKeypad() { // Spock opens the door
|
|
playSoundEffectIndex(SND_07);
|
|
loadActorAnimC(OBJECT_SPOCK, "susemw", -1, -1, &Room::trial1SpockUsedKeypad);
|
|
}
|
|
|
|
void Room::trial1SpockUsedKeypad() {
|
|
_awayMission->crewDirectionsAfterWalk[OBJECT_SPOCK] = DIR_W;
|
|
loadActorStandAnim(OBJECT_SPOCK);
|
|
playSoundEffectIndex(SND_DOOR1);
|
|
loadActorAnimC(OBJECT_DOOR, "t1drco", -1, -1, &Room::trial1DoorOpened);
|
|
_awayMission->trial.doorOpen = true;
|
|
}
|
|
|
|
void Room::trial1SpockReachedKeypadWithExtraProgram() { // Spock activates the unknown program
|
|
playSoundEffectIndex(SND_07);
|
|
loadActorAnimC(OBJECT_SPOCK, "susemw", -1, -1, &Room::trial1SpockUsedKeypadWithExtraProgram);
|
|
}
|
|
|
|
void Room::trial1SpockUsedKeypadWithExtraProgram() {
|
|
_awayMission->crewDirectionsAfterWalk[OBJECT_SPOCK] = DIR_W;
|
|
loadActorStandAnim(OBJECT_SPOCK);
|
|
|
|
_awayMission->disableInput = true;
|
|
loadRoomIndex(5, 5);
|
|
}
|
|
|
|
|
|
void Room::trial1UseSpockOnFloor() {
|
|
showText(TX_SPEAKER_SPOCK, 35, true);
|
|
}
|
|
|
|
void Room::trial1UseRedshirtOnEntity() {
|
|
showText(TX_SPEAKER_BENNIE, 50, true);
|
|
}
|
|
|
|
|
|
void Room::trial1UseRedshirtOnLock() {
|
|
if (_awayMission->trial.doorOpen)
|
|
return;
|
|
else if (!_awayMission->trial.entityDefeated)
|
|
showText(TX_SPEAKER_BENNIE, 51, true);
|
|
else if (_awayMission->trial.doorCodeBehaviour == 0)
|
|
showText(TX_SPEAKER_BENNIE, 54, true);
|
|
else if (_awayMission->trial.doorCodeBehaviour == 2)
|
|
walkCrewmanC(OBJECT_REDSHIRT, 0x1f, 0xb8, &Room::trial1RedshirtReachedKeypad);
|
|
else
|
|
walkCrewmanC(OBJECT_REDSHIRT, 0x1f, 0xb8, &Room::trial1RedshirtReachedKeypadWithExtraProgram);
|
|
}
|
|
|
|
void Room::trial1RedshirtReachedKeypad() { // Redshirt opens the lock
|
|
playSoundEffectIndex(SND_07);
|
|
loadActorAnimC(OBJECT_REDSHIRT, "rusemw", -1, -1, &Room::trial1RedshirtUsedKeypad);
|
|
}
|
|
|
|
void Room::trial1RedshirtUsedKeypad() {
|
|
_awayMission->crewDirectionsAfterWalk[OBJECT_REDSHIRT] = DIR_W;
|
|
loadActorStandAnim(OBJECT_REDSHIRT);
|
|
playSoundEffectIndex(SND_DOOR1);
|
|
loadActorAnimC(OBJECT_DOOR, "t1drco", -1, -1, &Room::trial1DoorOpened);
|
|
_awayMission->trial.doorOpen = true;
|
|
}
|
|
|
|
void Room::trial1RedshirtReachedKeypadWithExtraProgram() {
|
|
playSoundEffectIndex(SND_07);
|
|
loadActorAnimC(OBJECT_REDSHIRT, "rusemw", -1, -1, &Room::trial1RedshirtUsedKeypadWithExtraProgram);
|
|
}
|
|
|
|
void Room::trial1RedshirtUsedKeypadWithExtraProgram() {
|
|
_awayMission->crewDirectionsAfterWalk[OBJECT_REDSHIRT] = DIR_W;
|
|
loadActorStandAnim(OBJECT_REDSHIRT);
|
|
|
|
_awayMission->disableInput = true;
|
|
loadRoomIndex(5, 5);
|
|
}
|
|
|
|
|
|
void Room::trial1UseRedshirtOnFloor() {
|
|
showText(TX_SPEAKER_BENNIE, 49, true);
|
|
}
|
|
|
|
void Room::trial1UseRodOnMccoy() {
|
|
// ENHANCEMENT: This was originally only voiced with the wooden rod, not the iron rod.
|
|
// (This applies to the Spock and Redshirt functions below, too.)
|
|
showText(TX_SPEAKER_MCCOY, 27, true);
|
|
}
|
|
|
|
void Room::trial1UseRodOnSpock() {
|
|
showText(TX_SPEAKER_SPOCK, 37, true);
|
|
}
|
|
|
|
void Room::trial1UseRodOnRedshirt() {
|
|
showText(TX_SPEAKER_BENNIE, 52, true);
|
|
}
|
|
|
|
void Room::trial1UseRodOnFloorOrWall() {
|
|
showDescription(TX_TRI1C002);
|
|
}
|
|
|
|
|
|
void Room::trial1UseWoodRodOnEntity() {
|
|
_awayMission->disableInput = true;
|
|
walkCrewmanC(OBJECT_KIRK, 0xe9, 0xad, &Room::trial1ReachedPositionToThrowWoodRod);
|
|
loseItem(OBJECT_IWROD);
|
|
}
|
|
|
|
void Room::trial1ReachedPositionToThrowWoodRod() {
|
|
loadActorAnimC(OBJECT_KIRK, "kthrwr", 0xe9, 0xad, &Room::trial1DoneThrowingWoodRod);
|
|
}
|
|
|
|
void Room::trial1DoneThrowingWoodRod() {
|
|
_awayMission->disableInput = false;
|
|
}
|
|
|
|
|
|
void Room::trial1UseWoodRodOnLock() {
|
|
showDescription(5, true);
|
|
}
|
|
|
|
|
|
void Room::trial1UseWoodRodOnMoltenRock() {
|
|
_awayMission->disableInput = true;
|
|
walkCrewmanC(OBJECT_KIRK, 0xe4, 0xc4, &Room::trial1ReachedMoltenRock);
|
|
}
|
|
|
|
void Room::trial1ReachedMoltenRock() {
|
|
loadActorAnimC(OBJECT_KIRK, "t1dip", 0xe4, 0xc4, &Room::trial1DoneCoatingWoodRod);
|
|
}
|
|
|
|
void Room::trial1DoneCoatingWoodRod() {
|
|
_awayMission->disableInput = false;
|
|
showDescription(13, true);
|
|
loseItem(OBJECT_IWROD);
|
|
giveItem(OBJECT_IIROD);
|
|
|
|
if (!_awayMission->trial.gotPointsForCoatingRodWithIron) {
|
|
_awayMission->trial.gotPointsForCoatingRodWithIron = true;
|
|
_awayMission->trial.missionScore += 1;
|
|
}
|
|
}
|
|
|
|
|
|
void Room::trial1UseIronRodOnEntity() {
|
|
_awayMission->disableInput = true;
|
|
walkCrewmanC(OBJECT_KIRK, 0xe9, 0xac, &Room::trial1ReachedPositionToThrowIronRod);
|
|
_awayMission->trial.entityDefeated = true;
|
|
loseItem(OBJECT_IIROD);
|
|
}
|
|
|
|
void Room::trial1ReachedPositionToThrowIronRod() {
|
|
loadActorAnimC(OBJECT_KIRK, "kthri", 0xe9, 0xac, &Room::trial1DoneThrowingIronRod);
|
|
loadActorStandAnim(OBJECT_ENTITY);
|
|
}
|
|
|
|
void Room::trial1DoneThrowingIronRod() {
|
|
loadActorAnim(OBJECT_THROWN_IRON_ROD, "t1irod", 0xe9, 0xac, 8); // No callback defined
|
|
|
|
_awayMission->crewDirectionsAfterWalk[OBJECT_KIRK] = DIR_W;
|
|
loadActorStandAnim(OBJECT_KIRK);
|
|
|
|
_awayMission->disableInput = false;
|
|
stopAllVocSounds();
|
|
showText(TX_SPEAKER_SPOCK, 45, true);
|
|
showText(TX_SPEAKER_MCCOY, 33, true);
|
|
|
|
_awayMission->trial.missionScore += 1;
|
|
}
|
|
|
|
|
|
void Room::trial1UseIronRodOnLock() {
|
|
showDescription(4, true);
|
|
}
|
|
|
|
void Room::trial1GetThrownIronRod() {
|
|
showText(TX_SPEAKER_SPOCK, 15, true);
|
|
}
|
|
|
|
void Room::trial1WalkToDoor() {
|
|
if (_awayMission->trial.doorOpen)
|
|
walkCrewman(OBJECT_KIRK, 0x1a, 0xac, 28);
|
|
}
|
|
|
|
void Room::trial1UseMedkit() {
|
|
showText(TX_SPEAKER_MCCOY, 26, true);
|
|
}
|
|
|
|
}
|