630 lines
22 KiB
C++
630 lines
22 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 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_MUDD 8
|
|
#define OBJECT_9 9
|
|
#define OBJECT_ALIEN_IMAGE 10
|
|
#define OBJECT_ALIENDV 11
|
|
#define OBJECT_NORTH_DOOR 12
|
|
#define OBJECT_REPAIR_TOOL 13
|
|
|
|
#define HOTSPOT_SCREEN 0x20
|
|
#define HOTSPOT_SPHERE 0x21
|
|
#define HOTSPOT_NORTH_DOOR 0x22
|
|
#define HOTSPOT_EAST_DOOR 0x23
|
|
|
|
namespace StarTrek {
|
|
|
|
extern const RoomAction mudd3ActionList[] = {
|
|
{ {ACTION_TICK, 1, 0, 0, 0}, &Room::mudd3Tick1 },
|
|
{ {ACTION_USE, OBJECT_ICOMM, 0xff, 0, 0}, &Room::mudd3UseCommunicator },
|
|
{ {ACTION_LOOK, 0x20, 0, 0, 0}, &Room::mudd3LookAtScreen },
|
|
{ {ACTION_USE, OBJECT_ISTRICOR, 0x20, 0, 0}, &Room::mudd3UseSTricorderOnScreen },
|
|
{ {ACTION_USE, OBJECT_KIRK, 0x20, 0, 0}, &Room::mudd3UseKirkOnScreen },
|
|
{ {ACTION_USE, OBJECT_SPOCK, 0x21, 0, 0}, &Room::mudd3UseSpockOnSphere },
|
|
{ {ACTION_TIMER_EXPIRED, 3, 0, 0, 0}, &Room::mudd3Timer3Expired },
|
|
{ {ACTION_USE, OBJECT_MCCOY, 0x21, 0, 0}, &Room::mudd3UseMccoyOnSphere },
|
|
{ {ACTION_USE, OBJECT_REDSHIRT, 0x21, 0, 0}, &Room::mudd3UseRedshirtOnSphere },
|
|
{ {ACTION_USE, OBJECT_IMTRICOR, 0x21, 0, 0}, &Room::mudd3UseMTricorderOnSphere },
|
|
{ {ACTION_USE, OBJECT_ISTRICOR, 0x21, 0, 0}, &Room::mudd3UseSTricorderOnSphere },
|
|
{ {ACTION_FINISHED_WALKING, 2, 0, 0, 0}, &Room::mudd3ReadyToHookUpTricorders },
|
|
{ {ACTION_TIMER_EXPIRED, 1, 0, 0, 0}, &Room::mudd3Timer1Expired },
|
|
{ {ACTION_TIMER_EXPIRED, 2, 0, 0, 0}, &Room::mudd3Timer2Expired },
|
|
{ {ACTION_TIMER_EXPIRED, 4, 0, 0, 0}, &Room::mudd3Timer4Expired },
|
|
{ {ACTION_USE, OBJECT_IDISKS, 0x21, 0, 0}, &Room::mudd3UseMemoryDiskOnSphere },
|
|
|
|
// Common code (next 4 lines)
|
|
{ {ACTION_USE, OBJECT_IDEGRIME, 0xff, 0, 0}, &Room::muddaUseDegrimer },
|
|
{ {ACTION_USE, OBJECT_ILENSES, OBJECT_IDEGRIME, 0, 0}, &Room::muddaUseLenseOnDegrimer },
|
|
{ {ACTION_USE, OBJECT_IALIENDV, 0xff, 0, 0}, &Room::muddaUseAlienDevice },
|
|
{ {ACTION_FINISHED_ANIMATION, 9, 0, 0, 0}, &Room::muddaFiredAlienDevice },
|
|
|
|
{ {ACTION_GET, 13, 0, 0, 0}, &Room::mudd3GetRepairTool },
|
|
{ {ACTION_FINISHED_WALKING, 3, 0, 0, 0}, &Room::mudd3ReachedRepairTool },
|
|
{ {ACTION_FINISHED_ANIMATION, 1, 0, 0, 0}, &Room::mudd3PickedUpRepairTool },
|
|
{ {ACTION_LOOK, 0x21, 0, 0, 0}, &Room::mudd3LookAtSphere },
|
|
{ {ACTION_WALK, 0x22, 0, 0, 0}, &Room::mudd3WalkToNorthDoor },
|
|
{ {ACTION_TOUCHED_HOTSPOT, 0, 0, 0, 0}, &Room::mudd3TouchedHotspot0 },
|
|
{ {ACTION_WALK, 0x23, 0, 0, 0}, &Room::mudd3WalkToEastDoor },
|
|
{ {ACTION_TOUCHED_HOTSPOT, 1, 0, 0, 0}, &Room::mudd3TouchedHotspot1 },
|
|
{ {ACTION_LOOK, OBJECT_KIRK, 0, 0, 0}, &Room::mudd3LookAtKirk },
|
|
{ {ACTION_LOOK, OBJECT_SPOCK, 0, 0, 0}, &Room::mudd3LookAtSpock },
|
|
{ {ACTION_LOOK, OBJECT_MCCOY, 0, 0, 0}, &Room::mudd3LookAtMccoy },
|
|
{ {ACTION_LOOK, OBJECT_REDSHIRT, 0, 0, 0}, &Room::mudd3LookAtRedshirt },
|
|
{ {ACTION_LOOK, 8, 0, 0, 0}, &Room::mudd3LookAtMudd },
|
|
{ {ACTION_TALK, OBJECT_KIRK, 0, 0, 0}, &Room::mudd3TalkToKirk },
|
|
{ {ACTION_TALK, OBJECT_SPOCK, 0, 0, 0}, &Room::mudd3TalkToSpock },
|
|
{ {ACTION_TALK, OBJECT_MCCOY, 0, 0, 0}, &Room::mudd3TalkToMccoy },
|
|
{ {ACTION_TALK, OBJECT_REDSHIRT, 0, 0, 0}, &Room::mudd3TalkToRedshirt },
|
|
{ {ACTION_TALK, 8, 0, 0, 0}, &Room::mudd3TalkToMudd },
|
|
{ {ACTION_USE, OBJECT_IMEDKIT, 0xff, 0, 0}, &Room::mudd3UseMedkit },
|
|
|
|
// Common code (countdown for losing atmosphere when life support malfunctioning)
|
|
{ {ACTION_TICK, 0xff, 0xff, 0xff, 0}, &Room::muddaTick },
|
|
{ {ACTION_LIST_END, 0, 0, 0, 0}, nullptr }
|
|
};
|
|
|
|
enum mudd3TextIds {
|
|
TX_SPEAKER_KIRK, TX_SPEAKER_MCCOY, TX_SPEAKER_SPOCK, TX_SPEAKER_UHURA,
|
|
TX_SPEAKER_BUCHERT, TX_SPEAKER_MUDD,
|
|
TX_MUD3_002, TX_MUD3_003, TX_MUD3_005, TX_MUD3_006, TX_MUD3_007,
|
|
TX_MUD3_008, TX_MUD3_009, TX_MUD3_010, TX_MUD3_011, TX_MUD3_012,
|
|
TX_MUD3_013, TX_MUD3_014, TX_MUD3_015, TX_MUD3_016, TX_MUD3_017,
|
|
TX_MUD3_018, TX_MUD3_019, TX_MUD3_020, TX_MUD3_021, TX_MUD3_022,
|
|
TX_MUD3_023, TX_MUD3_024, TX_MUD3_025, TX_MUD3_026, TX_MUD3_027,
|
|
TX_MUD3_028, TX_MUD3_029, TX_MUD3_030, TX_MUD3_031, TX_MUD3_032,
|
|
TX_MUD3_033, TX_MUD3_034, TX_MUD3_035, TX_MUD3_037, TX_MUD3_038,
|
|
TX_MUD3_039, TX_MUD3_040, TX_MUD3_041, TX_MUD3_042, TX_MUD3_043,
|
|
TX_MUD3_044, TX_MUD3_046, TX_MUD3_047, TX_MUD3_048, TX_MUD3_049,
|
|
TX_MUD3_050, TX_MUD3_051, TX_MUD3_052, TX_MUD3_053, TX_MUD3_054,
|
|
TX_MUD3_055, TX_MUD3_056, TX_MUD3_057, TX_MUD3_058, TX_MUD3_059,
|
|
TX_MUD3_060, TX_MUD3_061, TX_MUD3_062, TX_MUD3_063, TX_MUD3_064,
|
|
TX_MUD3_065, TX_MUD3_066, TX_MUD3_067, TX_MUD3_068, TX_MUD3_069,
|
|
TX_MUD3_070, TX_MUD3_071, TX_MUD3N000, TX_MUD3N002, TX_MUD3N003,
|
|
TX_MUD3N004, TX_MUD3N005, TX_MUD3N006, TX_MUD3N007, TX_MUD3N008,
|
|
TX_MUD3N009, TX_MUD3N010, TX_MUD3N011, TX_MUD3N012, TX_MUD3N013,
|
|
TX_MUD3N014, TX_MUD3N015, TX_MUD3N017, TX_MUD3N018, TX_MUD3N019,
|
|
TX_MUD3N020, TX_DEM0N009, TX_STATICU1
|
|
};
|
|
|
|
// TODO: Finish floppy offsets
|
|
extern const RoomTextOffsets mudd3TextOffsets[] = {
|
|
{ TX_SPEAKER_KIRK, 3778, 0, 0, 0 },
|
|
{ TX_SPEAKER_MCCOY, 3789, 0, 0, 0 },
|
|
{ TX_SPEAKER_SPOCK, 3799, 0, 0, 0 },
|
|
{ TX_SPEAKER_UHURA, 524, 0, 0, 0 },
|
|
{ TX_SPEAKER_BUCHERT, 3809, 0, 0, 0 },
|
|
{ TX_SPEAKER_MUDD, 3821, 0, 0, 0 },
|
|
{ TX_MUD3_002, 12100, 0, 0, 0 },
|
|
{ TX_MUD3_003, 487, 0, 0, 0 },
|
|
{ TX_MUD3_005, 13314, 0, 0, 0 },
|
|
{ TX_MUD3_006, 9361, 0, 0, 0 },
|
|
{ TX_MUD3_007, 7734, 0, 0, 0 },
|
|
{ TX_MUD3_008, 9718, 0, 0, 0 },
|
|
{ TX_MUD3_009, 8704, 0, 0, 0 },
|
|
{ TX_MUD3_010, 8569, 0, 0, 0 },
|
|
{ TX_MUD3_011, 11631, 0, 0, 0 },
|
|
{ TX_MUD3_012, 9147, 0, 0, 0 },
|
|
{ TX_MUD3_013, 12946, 0, 0, 0 },
|
|
{ TX_MUD3_014, 11167, 0, 0, 0 },
|
|
{ TX_MUD3_015, 5526, 0, 0, 0 },
|
|
{ TX_MUD3_016, 11915, 0, 0, 0 },
|
|
{ TX_MUD3_017, 4507, 0, 0, 0 },
|
|
{ TX_MUD3_018, 6344, 0, 0, 0 },
|
|
{ TX_MUD3_019, 12146, 0, 0, 0 },
|
|
{ TX_MUD3_020, 3473, 0, 0, 0 },
|
|
{ TX_MUD3_021, 6291, 0, 0, 0 },
|
|
{ TX_MUD3_022, 5312, 0, 0, 0 },
|
|
{ TX_MUD3_023, 11763, 0, 0, 0 },
|
|
{ TX_MUD3_024, 9282, 0, 0, 0 },
|
|
{ TX_MUD3_025, 11373, 0, 0, 0 },
|
|
{ TX_MUD3_026, 8287, 0, 0, 0 },
|
|
{ TX_MUD3_027, 7770, 0, 0, 0 },
|
|
{ TX_MUD3_028, 8134, 0, 0, 0 },
|
|
{ TX_MUD3_029, 12593, 0, 0, 0 },
|
|
{ TX_MUD3_030, 12257, 0, 0, 0 },
|
|
{ TX_MUD3_031, 8858, 0, 0, 0 },
|
|
{ TX_MUD3_032, 7050, 0, 0, 0 },
|
|
{ TX_MUD3_033, 11586, 0, 0, 0 },
|
|
{ TX_MUD3_034, 4190, 0, 0, 0 },
|
|
{ TX_MUD3_035, 3833, 0, 0, 0 },
|
|
{ TX_MUD3_037, 4647, 0, 0, 0 },
|
|
{ TX_MUD3_038, 4388, 0, 0, 0 },
|
|
{ TX_MUD3_039, 3907, 0, 0, 0 },
|
|
{ TX_MUD3_040, 4049, 0, 0, 0 },
|
|
{ TX_MUD3_041, 6156, 0, 0, 0 },
|
|
{ TX_MUD3_042, 5896, 0, 0, 0 },
|
|
{ TX_MUD3_043, 5086, 0, 0, 0 },
|
|
{ TX_MUD3_044, 4851, 0, 0, 0 },
|
|
{ TX_MUD3_046, 7649, 0, 0, 0 },
|
|
{ TX_MUD3_047, 5629, 0, 0, 0 },
|
|
{ TX_MUD3_048, 9448, 0, 0, 0 },
|
|
{ TX_MUD3_049, 7393, 0, 0, 0 },
|
|
{ TX_MUD3_050, 7152, 0, 0, 0 },
|
|
{ TX_MUD3_051, 9784, 0, 0, 0 },
|
|
{ TX_MUD3_052, 9015, 0, 0, 0 },
|
|
{ TX_MUD3_053, 7890, 0, 0, 0 },
|
|
{ TX_MUD3_054, 6745, 0, 0, 0 },
|
|
{ TX_MUD3_055, 11459, 0, 0, 0 },
|
|
{ TX_MUD3_056, 5448, 0, 0, 0 },
|
|
{ TX_MUD3_057, 11261, 0, 0, 0 },
|
|
{ TX_MUD3_058, 13030, 0, 0, 0 },
|
|
{ TX_MUD3_059, 13225, 0, 0, 0 },
|
|
{ TX_MUD3_060, 12512, 0, 0, 0 },
|
|
{ TX_MUD3_061, 12832, 0, 0, 0 },
|
|
{ TX_MUD3_062, 12375, 0, 0, 0 },
|
|
{ TX_MUD3_063, 8836, 0, 0, 0 },
|
|
{ TX_MUD3_064, 8794, 0, 0, 0 },
|
|
{ TX_MUD3_065, 8447, 0, 0, 0 },
|
|
{ TX_MUD3_066, 8633, 0, 0, 0 },
|
|
{ TX_MUD3_067, 12427, 0, 0, 0 },
|
|
{ TX_MUD3_069, 13141, 0, 0, 0 },
|
|
{ TX_MUD3_070, 11823, 0, 0, 0 },
|
|
{ TX_MUD3_071, 11966, 0, 0, 0 },
|
|
{ TX_MUD3N000, 8982, 0, 0, 0 },
|
|
{ TX_MUD3N002, 10865, 0, 0, 0 },
|
|
{ TX_MUD3N003, 11075, 0, 0, 0 },
|
|
{ TX_MUD3N004, 10800, 0, 0, 0 },
|
|
{ TX_MUD3N005, 10481, 0, 0, 0 },
|
|
{ TX_MUD3N006, 10993, 0, 0, 0 },
|
|
{ TX_MUD3N007, 10692, 0, 0, 0 },
|
|
{ TX_MUD3N008, 2490, 0, 0, 0 },
|
|
{ TX_MUD3N009, 10937, 0, 0, 0 },
|
|
{ TX_MUD3N010, 10640, 0, 0, 0 },
|
|
{ TX_MUD3N011, 4615, 0, 0, 0 },
|
|
{ TX_MUD3N012, 10570, 0, 0, 0 },
|
|
{ TX_MUD3N013, 2698, 0, 0, 0 },
|
|
{ TX_MUD3N014, 9939, 0, 0, 0 },
|
|
{ TX_MUD3N015, 4749, 0, 0, 0 },
|
|
{ TX_MUD3N017, 4331, 0, 0, 0 },
|
|
{ TX_MUD3N018, 10144, 0, 0, 0 },
|
|
{ TX_MUD3N019, 10095, 0, 0, 0 },
|
|
{ TX_MUD3N020, 10005, 0, 0, 0 },
|
|
{ TX_STATICU1, 534, 0, 0, 0 },
|
|
{ -1, 0, 0, 0, 0 }
|
|
};
|
|
|
|
extern const RoomText mudd3Texts[] = {
|
|
{ TX_MUD3_068, Common::EN_ANY, "#MUD3\\MUD3_068#Not my area of expertise, I'm afraid." }, // Same as MUD3_021, spoken by Buchert
|
|
{ TX_DEM0N009, Common::EN_ANY, "#DEM0\\DEM0N009#Spock raises an eyebrow" },
|
|
{ -1, Common::UNK_LANG, "" }
|
|
};
|
|
|
|
// BUG-ish: trying to scan the sphere while someone is behind it causes it to scan that
|
|
// object instead.
|
|
|
|
void Room::mudd3Tick1() {
|
|
playVoc("MUD3LOOP");
|
|
|
|
_awayMission->crewDirectionsAfterWalk[OBJECT_REDSHIRT] = DIR_W;
|
|
|
|
if (_awayMission->mudd.databaseDestroyed) {
|
|
loadActorAnim(OBJECT_9, "s4lbpb", 0xa2, 0x9f);
|
|
|
|
// FIXME: is this supposed to be in this if statement?
|
|
if (!_awayMission->mudd.tookRepairTool)
|
|
loadActorAnim(OBJECT_REPAIR_TOOL, "s4lbdv", 0xb7, 0xa8);
|
|
}
|
|
|
|
_awayMission->mudd.muddInDatabaseRoom = false;
|
|
|
|
if (!_awayMission->mudd.muddVisitedDatabaseRoom && _awayMission->mudd.translatedAlienLanguage && !_awayMission->mudd.muddUnavailable) {
|
|
_awayMission->mudd.muddVisitedDatabaseRoom = true;
|
|
loadActorAnim(OBJECT_MUDD, "s4lbhs", 0xa2, 0x9f);
|
|
playMidiMusicTracks(MIDITRACK_3);
|
|
_awayMission->mudd.muddInDatabaseRoom = true;
|
|
_awayMission->timers[2] = 10;
|
|
}
|
|
}
|
|
|
|
void Room::mudd3UseCommunicator() {
|
|
showText(TX_SPEAKER_KIRK, TX_MUD3_003);
|
|
showText(TX_SPEAKER_UHURA, TX_STATICU1);
|
|
}
|
|
|
|
void Room::mudd3LookAtScreen() {
|
|
// BUGFIX: the condition was flipped in the original; the more "vague" description
|
|
// should be shown before the alien language is understood.
|
|
if (_awayMission->mudd.translatedAlienLanguage)
|
|
showText(TX_SPEAKER_SPOCK, TX_MUD3_038);
|
|
else
|
|
showDescription(TX_MUD3N017);
|
|
}
|
|
|
|
void Room::mudd3UseSTricorderOnScreen() {
|
|
if (_roomVar.mudd.tricordersUnavailable)
|
|
showText(TX_SPEAKER_SPOCK, TX_MUD3_039);
|
|
else
|
|
spockScan(DIR_S, TX_SPEAKER_SPOCK, TX_MUD3_017, false);
|
|
}
|
|
|
|
// BUGFIX: Event was actually "use screen on kirk", which makes no sense.
|
|
void Room::mudd3UseKirkOnScreen() {
|
|
if (!_awayMission->mudd.translatedAlienLanguage) {
|
|
showDescription(TX_MUD3N011);
|
|
showText(TX_SPEAKER_SPOCK, TX_MUD3_037);
|
|
}
|
|
}
|
|
|
|
void Room::mudd3UseSpockOnSphere() {
|
|
_awayMission->crewDirectionsAfterWalk[OBJECT_SPOCK] = DIR_S;
|
|
loadActorStandAnim(OBJECT_SPOCK);
|
|
|
|
if (_awayMission->mudd.computerDataErasedOrDestroyed) {
|
|
if (!_awayMission->mudd.databaseDestroyed) {
|
|
showDescription(TX_MUD3N000);
|
|
showText(TX_SPEAKER_SPOCK, TX_MUD3_052);
|
|
showText(TX_SPEAKER_KIRK, TX_MUD3_012);
|
|
showText(TX_SPEAKER_MCCOY, TX_MUD3_024);
|
|
}
|
|
showText(TX_SPEAKER_KIRK, TX_MUD3_006);
|
|
showText(TX_SPEAKER_SPOCK, TX_MUD3_048);
|
|
showText(TX_SPEAKER_KIRK, TX_MUD3_008);
|
|
showText(TX_SPEAKER_SPOCK, TX_MUD3_051);
|
|
} else if (_awayMission->mudd.translatedAlienLanguage) {
|
|
if (_awayMission->mudd.accessedAlienDatabase)
|
|
showText(TX_SPEAKER_SPOCK, TX_MUD3_035);
|
|
else {
|
|
_awayMission->mudd.accessedAlienDatabase = true;
|
|
|
|
showText(TX_SPEAKER_SPOCK, TX_MUD3_054);
|
|
showText(TX_SPEAKER_MCCOY, TX_MUD3_032);
|
|
showText(TX_SPEAKER_SPOCK, TX_MUD3_050);
|
|
showText(TX_SPEAKER_SPOCK, TX_MUD3_049);
|
|
showText(TX_SPEAKER_SPOCK, TX_MUD3_046);
|
|
showText(TX_SPEAKER_KIRK, TX_MUD3_007);
|
|
|
|
_awayMission->mudd.missionScore++;
|
|
playVoc("LSHAIANS");
|
|
loadActorAnim(OBJECT_ALIEN_IMAGE, "s4lbap", 0x32, 0x64);
|
|
|
|
_awayMission->crewDirectionsAfterWalk[OBJECT_KIRK] = DIR_W;
|
|
_awayMission->crewDirectionsAfterWalk[OBJECT_SPOCK] = DIR_W;
|
|
_awayMission->crewDirectionsAfterWalk[OBJECT_MCCOY] = DIR_W;
|
|
_awayMission->crewDirectionsAfterWalk[OBJECT_REDSHIRT] = DIR_W;
|
|
loadActorStandAnim(OBJECT_KIRK);
|
|
loadActorStandAnim(OBJECT_SPOCK);
|
|
loadActorStandAnim(OBJECT_MCCOY);
|
|
loadActorStandAnim(OBJECT_REDSHIRT);
|
|
|
|
_awayMission->disableInput = true;
|
|
_awayMission->timers[3] = 40;
|
|
}
|
|
} else if (_awayMission->mudd.discoveredBase3System) {
|
|
showText(TX_SPEAKER_SPOCK, TX_MUD3_043);
|
|
showText(TX_SPEAKER_MCCOY, TX_MUD3_022);
|
|
showText(TX_SPEAKER_SPOCK, TX_MUD3_056);
|
|
showText(TX_SPEAKER_KIRK, TX_MUD3_015);
|
|
showText(TX_SPEAKER_SPOCK, TX_MUD3_047);
|
|
_roomVar.mudd.suggestedUsingTricorders = true;
|
|
} else {
|
|
showText(TX_SPEAKER_SPOCK, TX_MUD3_044);
|
|
_awayMission->crewDirectionsAfterWalk[OBJECT_SPOCK] = DIR_W;
|
|
walkCrewman(OBJECT_SPOCK, 0xcd, 0x87);
|
|
}
|
|
}
|
|
|
|
// Finished looking at alien image
|
|
void Room::mudd3Timer3Expired() {
|
|
_awayMission->disableInput = false;
|
|
|
|
showText(TX_SPEAKER_MCCOY, TX_MUD3_027);
|
|
showText(TX_SPEAKER_SPOCK, TX_MUD3_053);
|
|
showText(TX_SPEAKER_MCCOY, TX_MUD3_028);
|
|
showText(TX_SPEAKER_MCCOY, TX_MUD3_026);
|
|
}
|
|
|
|
void Room::mudd3UseMccoyOnSphere() {
|
|
// ENHANCEMENT: Turn to face south
|
|
_awayMission->crewDirectionsAfterWalk[OBJECT_MCCOY] = DIR_S;
|
|
loadActorStandAnim(OBJECT_MCCOY);
|
|
|
|
showText(TX_SPEAKER_MCCOY, TX_MUD3_021);
|
|
_awayMission->crewDirectionsAfterWalk[OBJECT_MCCOY] = DIR_W;
|
|
walkCrewman(OBJECT_MCCOY, 0xec, 0x84);
|
|
}
|
|
|
|
void Room::mudd3UseRedshirtOnSphere() {
|
|
// ENHANCEMENT: Turn to face south
|
|
_awayMission->crewDirectionsAfterWalk[OBJECT_REDSHIRT] = DIR_S;
|
|
loadActorStandAnim(OBJECT_REDSHIRT);
|
|
|
|
showText(TX_SPEAKER_BUCHERT, TX_MUD3_068); // BUGFIX: original played McCoy's audio by mistake
|
|
_awayMission->crewDirectionsAfterWalk[OBJECT_REDSHIRT] = DIR_W;
|
|
walkCrewman(OBJECT_REDSHIRT, 0xec, 0x84);
|
|
}
|
|
|
|
void Room::mudd3UseMTricorderOnSphere() {
|
|
if (_roomVar.mudd.tricordersUnavailable)
|
|
showText(TX_SPEAKER_SPOCK, TX_MUD3_039); // BUGFIX: speaker is Spock
|
|
else {
|
|
_awayMission->crewDirectionsAfterWalk[OBJECT_MCCOY] = DIR_S;
|
|
loadActorStandAnim(OBJECT_MCCOY);
|
|
if (!_awayMission->mudd.translatedAlienLanguage && _roomVar.mudd.suggestedUsingTricorders && _awayMission->mudd.discoveredBase3System) {
|
|
_awayMission->disableInput = true;
|
|
|
|
_awayMission->crewDirectionsAfterWalk[OBJECT_MCCOY] = DIR_S;
|
|
walkCrewman(OBJECT_MCCOY, 0xac, 0x88);
|
|
_awayMission->crewDirectionsAfterWalk[OBJECT_SPOCK] = DIR_S;
|
|
walkCrewmanC(OBJECT_SPOCK, 0xa5, 0x8c, &Room::mudd3ReadyToHookUpTricorders);
|
|
} else {
|
|
showText(TX_SPEAKER_MCCOY, TX_MUD3_021);
|
|
_awayMission->crewDirectionsAfterWalk[OBJECT_MCCOY] = DIR_W;
|
|
walkCrewman(OBJECT_MCCOY, 0xec, 0x84);
|
|
}
|
|
}
|
|
}
|
|
|
|
void Room::mudd3UseSTricorderOnSphere() {
|
|
_awayMission->crewDirectionsAfterWalk[OBJECT_SPOCK] = DIR_S;
|
|
loadActorStandAnim(OBJECT_SPOCK);
|
|
|
|
if (_roomVar.mudd.tricordersUnavailable)
|
|
showText(TX_SPEAKER_SPOCK, TX_MUD3_039); // BUGFIX: speaker is Spock
|
|
else if (_awayMission->mudd.translatedAlienLanguage || (_awayMission->mudd.discoveredBase3System && !_roomVar.mudd.suggestedUsingTricorders)) {
|
|
showText(TX_SPEAKER_SPOCK, TX_MUD3_041);
|
|
_awayMission->crewDirectionsAfterWalk[OBJECT_SPOCK] = DIR_W;
|
|
walkCrewman(OBJECT_SPOCK, 0xcd, 0x87);
|
|
} else if (_awayMission->mudd.discoveredBase3System && _roomVar.mudd.suggestedUsingTricorders) { // Hooking up tricorders
|
|
_awayMission->disableInput = true;
|
|
_awayMission->crewDirectionsAfterWalk[OBJECT_MCCOY] = DIR_S;
|
|
walkCrewmanC(OBJECT_MCCOY, 0xca, 0x88, &Room::mudd3ReadyToHookUpTricorders);
|
|
} else { // No idea how to access it
|
|
showText(TX_SPEAKER_SPOCK, TX_MUD3_042);
|
|
walkCrewman(OBJECT_SPOCK, 0xcd, 0x87);
|
|
}
|
|
}
|
|
|
|
void Room::mudd3ReadyToHookUpTricorders() {
|
|
showText(TX_SPEAKER_SPOCK, TX_MUD3_018);
|
|
|
|
_roomVar.mudd.tricordersUnavailable = true;
|
|
_awayMission->timers[1] = 50;
|
|
|
|
loadActorAnim2(OBJECT_SPOCK, "sscans");
|
|
playSoundEffectIndex(kSfxTricorder);
|
|
}
|
|
|
|
void Room::mudd3Timer1Expired() { // Tricorders ready for use again
|
|
showText(TX_SPEAKER_SPOCK, TX_MUD3_040);
|
|
showText(TX_SPEAKER_SPOCK, TX_MUD3_034);
|
|
|
|
_awayMission->disableInput = false;
|
|
_roomVar.mudd.tricordersUnavailable = false;
|
|
_roomVar.mudd.suggestedUsingTricorders = false;
|
|
_awayMission->mudd.translatedAlienLanguage = true;
|
|
_awayMission->mudd.missionScore++;
|
|
|
|
_awayMission->crewDirectionsAfterWalk[OBJECT_SPOCK] = DIR_W;
|
|
_awayMission->crewDirectionsAfterWalk[OBJECT_MCCOY] = DIR_W;
|
|
walkCrewman(OBJECT_SPOCK, 0xcd, 0x87);
|
|
walkCrewman(OBJECT_MCCOY, 0xec, 0x84);
|
|
}
|
|
|
|
// Harry Mudd stumbled into the room
|
|
void Room::mudd3Timer2Expired() {
|
|
const TextRef choices[] = {
|
|
TX_SPEAKER_KIRK,
|
|
TX_MUD3_010,
|
|
TX_MUD3_009,
|
|
TX_END
|
|
};
|
|
|
|
_awayMission->mudd.computerDataErasedOrDestroyed = true;
|
|
|
|
showText(TX_SPEAKER_MUDD, TX_MUD3_065);
|
|
int choice = showMultipleTexts(choices);
|
|
|
|
if (choice == 0) { // Allow him to access the database (he ends up erasing it)
|
|
showText(TX_SPEAKER_MUDD, TX_MUD3_066);
|
|
_awayMission->mudd.muddErasedDatabase = true;
|
|
|
|
// ENHANCEMENT: Add a few lines to make it clear that Mudd erased the databanks.
|
|
// Otherwise, the end of the mission when you confront Mudd doesn't make sense
|
|
// unless the player happened to try accessing the database again. Also, if you
|
|
// talk to the crew, they berate him for no apparent reason if this isn't clear.
|
|
showDescription(TX_MUD3N000);
|
|
showText(TX_SPEAKER_MCCOY, TX_MUD3_031);
|
|
|
|
} else { // Don't allow it (he destroys it by accident)
|
|
showText(TX_SPEAKER_MUDD, TX_MUD3_064);
|
|
_awayMission->timers[4] = 98;
|
|
_awayMission->disableInput = 2;
|
|
playMidiMusicTracks(MIDITRACK_26);
|
|
loadActorAnim(OBJECT_MUDD, "s4lbhb", 0xa2, 0x9f);
|
|
}
|
|
}
|
|
|
|
void Room::mudd3Timer4Expired() {
|
|
_awayMission->mudd.databaseDestroyed = true;
|
|
|
|
showText(TX_SPEAKER_MUDD, TX_MUD3_063);
|
|
showText(TX_SPEAKER_MCCOY, TX_MUD3_031);
|
|
|
|
_awayMission->disableInput = false;
|
|
}
|
|
|
|
void Room::mudd3UseMemoryDiskOnSphere() {
|
|
// ENHANCEMENT: Turn to face south
|
|
_awayMission->crewDirectionsAfterWalk[OBJECT_KIRK] = DIR_S;
|
|
loadActorStandAnim(OBJECT_KIRK);
|
|
|
|
if (_awayMission->mudd.databaseDestroyed)
|
|
showDescription(TX_MUD3N014);
|
|
else if (_awayMission->mudd.translatedAlienLanguage && !_awayMission->mudd.muddErasedDatabase) {
|
|
showDescription(TX_MUD3N020);
|
|
if (!_awayMission->mudd.gotPointsForDownloadingData) {
|
|
_awayMission->mudd.missionScore += 3;
|
|
_awayMission->mudd.gotPointsForDownloadingData = true;
|
|
}
|
|
} else
|
|
showDescription(TX_MUD3N019);
|
|
}
|
|
|
|
|
|
void Room::mudd3GetRepairTool() {
|
|
if (_awayMission->mudd.tookRepairTool)
|
|
showDescription(TX_MUD3N018); // NOTE: unused, since the object disappears, can't be selected again
|
|
else {
|
|
_awayMission->disableInput = true;
|
|
_awayMission->crewDirectionsAfterWalk[OBJECT_KIRK] = DIR_N;
|
|
walkCrewmanC(OBJECT_KIRK, 0xba, 0xc1, &Room::mudd3ReachedRepairTool);
|
|
}
|
|
}
|
|
|
|
void Room::mudd3ReachedRepairTool() {
|
|
_awayMission->crewDirectionsAfterWalk[OBJECT_KIRK] = DIR_N;
|
|
loadActorAnimC(OBJECT_KIRK, "kusemn", -1, -1, &Room::mudd3PickedUpRepairTool);
|
|
}
|
|
|
|
void Room::mudd3PickedUpRepairTool() {
|
|
_awayMission->disableInput = false;
|
|
loadActorStandAnim(OBJECT_REPAIR_TOOL);
|
|
_awayMission->mudd.tookRepairTool = true;
|
|
_awayMission->mudd.missionScore++;
|
|
giveItem(OBJECT_IDOOVER);
|
|
}
|
|
|
|
void Room::mudd3LookAtSphere() {
|
|
// ENHANCEMENT: Turn to face south
|
|
_awayMission->crewDirectionsAfterWalk[OBJECT_KIRK] = DIR_S;
|
|
loadActorStandAnim(OBJECT_KIRK);
|
|
|
|
showDescription(TX_MUD3N015);
|
|
}
|
|
|
|
void Room::mudd3WalkToNorthDoor() {
|
|
_roomVar.mudd.walkingToDoor = true;
|
|
_awayMission->disableInput = true;
|
|
walkCrewman(OBJECT_KIRK, 0xb8, 0x70);
|
|
}
|
|
|
|
void Room::mudd3TouchedHotspot0() { // Triggers north door
|
|
if (_roomVar.mudd.walkingToDoor) {
|
|
playVoc("SMADOOR3");
|
|
loadActorAnim(OBJECT_NORTH_DOOR, "s4lbdo", 0xba, 0x6f);
|
|
}
|
|
}
|
|
|
|
void Room::mudd3WalkToEastDoor() {
|
|
_roomVar.mudd.walkingToDoor = true;
|
|
_awayMission->disableInput = true;
|
|
walkCrewman(OBJECT_KIRK, 0x121, 0x81);
|
|
}
|
|
|
|
void Room::mudd3TouchedHotspot1() {
|
|
if (_roomVar.mudd.walkingToDoor) {
|
|
playVoc("SMADOOR3");
|
|
}
|
|
}
|
|
|
|
void Room::mudd3LookAtKirk() {
|
|
if (!_awayMission->mudd.muddInDatabaseRoom)
|
|
showDescription(TX_MUD3N005);
|
|
else
|
|
showDescription(TX_MUD3N004);
|
|
}
|
|
|
|
void Room::mudd3LookAtSpock() {
|
|
if (!_awayMission->mudd.muddInDatabaseRoom)
|
|
showDescription(TX_MUD3N012);
|
|
else
|
|
showDescription(TX_MUD3N002);
|
|
}
|
|
|
|
void Room::mudd3LookAtMccoy() {
|
|
if (!_awayMission->mudd.muddInDatabaseRoom)
|
|
showDescription(TX_MUD3N010);
|
|
else
|
|
showDescription(TX_MUD3N009);
|
|
}
|
|
|
|
void Room::mudd3LookAtRedshirt() {
|
|
if (!_awayMission->mudd.muddInDatabaseRoom)
|
|
showDescription(TX_MUD3N007);
|
|
else
|
|
showDescription(TX_MUD3N006);
|
|
}
|
|
|
|
void Room::mudd3LookAtMudd() {
|
|
showDescription(TX_MUD3N003);
|
|
}
|
|
|
|
void Room::mudd3TalkToKirk() {
|
|
if (!_awayMission->mudd.muddInDatabaseRoom) {
|
|
showText(TX_SPEAKER_KIRK, TX_MUD3_014);
|
|
showText(TX_SPEAKER_SPOCK, TX_MUD3_057);
|
|
showText(TX_SPEAKER_MCCOY, TX_MUD3_025);
|
|
} else
|
|
showText(TX_SPEAKER_KIRK, TX_MUD3_002);
|
|
}
|
|
|
|
void Room::mudd3TalkToSpock() {
|
|
if (!_awayMission->mudd.muddInDatabaseRoom) {
|
|
showText(TX_SPEAKER_SPOCK, TX_MUD3_055);
|
|
showText(TX_SPEAKER_MCCOY, TX_MUD3_033);
|
|
showText(TX_SPEAKER_KIRK, TX_MUD3_011);
|
|
} else
|
|
showText(TX_SPEAKER_SPOCK, TX_MUD3_019);
|
|
}
|
|
|
|
void Room::mudd3TalkToMccoy() {
|
|
if (!_awayMission->mudd.muddInDatabaseRoom)
|
|
showText(TX_SPEAKER_MCCOY, TX_MUD3_023);
|
|
else {
|
|
showText(TX_SPEAKER_MCCOY, TX_MUD3_030);
|
|
showText(TX_SPEAKER_MUDD, TX_MUD3_062);
|
|
}
|
|
}
|
|
|
|
void Room::mudd3TalkToRedshirt() {
|
|
if (!_awayMission->mudd.muddInDatabaseRoom) {
|
|
showText(TX_SPEAKER_BUCHERT, TX_MUD3_070);
|
|
showText(TX_SPEAKER_KIRK, TX_MUD3_016);
|
|
showText(TX_SPEAKER_BUCHERT, TX_MUD3_071);
|
|
} else
|
|
showText(TX_SPEAKER_BUCHERT, TX_MUD3_067);
|
|
}
|
|
|
|
void Room::mudd3TalkToMudd() {
|
|
// ENHANCEMENT: the 2nd part of the if condition is new; whether he physically
|
|
// destroys the database or does through software, he should give this reaction.
|
|
if (_awayMission->mudd.databaseDestroyed || _awayMission->mudd.muddErasedDatabase) {
|
|
showText(TX_SPEAKER_MUDD, TX_MUD3_060);
|
|
showText(TX_SPEAKER_MCCOY, TX_MUD3_029);
|
|
showText(TX_SPEAKER_MUDD, TX_MUD3_061);
|
|
showText(TX_SPEAKER_KIRK, TX_MUD3_013);
|
|
showText(TX_SPEAKER_MUDD, TX_MUD3_058);
|
|
showText(TX_SPEAKER_SPOCK, TX_DEM0N009); // ENHANCEMENT: Original text was just "(Raises eyebrow)" without any audio.
|
|
showText(TX_SPEAKER_BUCHERT, TX_MUD3_069);
|
|
showText(TX_SPEAKER_MUDD, TX_MUD3_059);
|
|
showText(TX_SPEAKER_KIRK, TX_MUD3_005);
|
|
}
|
|
}
|
|
|
|
void Room::mudd3UseMedkit() {
|
|
showText(TX_SPEAKER_MCCOY, TX_MUD3_020);
|
|
}
|
|
|
|
}
|