aboutsummaryrefslogtreecommitdiff
path: root/engines/startrek/rooms
diff options
context:
space:
mode:
authorMatthew Stewart2018-06-28 18:44:22 -0400
committerEugene Sandulenko2018-08-09 08:37:30 +0200
commit0879985ddd27dd1e119efb6e8200df5f0ba3e970 (patch)
treecfcb3f0bbbf7189a83f873192de48cdee441bbfb /engines/startrek/rooms
parentc47150358157524c4b0079b7927ded660359f99f (diff)
downloadscummvm-rg350-0879985ddd27dd1e119efb6e8200df5f0ba3e970.tar.gz
scummvm-rg350-0879985ddd27dd1e119efb6e8200df5f0ba3e970.tar.bz2
scummvm-rg350-0879985ddd27dd1e119efb6e8200df5f0ba3e970.zip
STARTREK: MUDD3
Diffstat (limited to 'engines/startrek/rooms')
-rw-r--r--engines/startrek/rooms/function_map.h43
-rw-r--r--engines/startrek/rooms/mudd0.cpp7
-rw-r--r--engines/startrek/rooms/mudd2.cpp34
-rw-r--r--engines/startrek/rooms/mudd3.cpp406
4 files changed, 469 insertions, 21 deletions
diff --git a/engines/startrek/rooms/function_map.h b/engines/startrek/rooms/function_map.h
index d1f3b7800e..89b03975f7 100644
--- a/engines/startrek/rooms/function_map.h
+++ b/engines/startrek/rooms/function_map.h
@@ -1569,7 +1569,50 @@ RoomAction mudd2ActionList[] = {
RoomAction mudd3ActionList[] = {
{ Action(ACTION_TICK, 1, 0, 0), &Room::mudd3Tick1 },
+ { Action(ACTION_USE, OBJECT_ICOMM, -1, 0), &Room::mudd3UseCommunicator },
+ { Action(ACTION_LOOK, 0x20, 0, 0), &Room::mudd3LookAtScreen },
+ { Action(ACTION_USE, OBJECT_ISTRICOR, 0x20, 0), &Room::mudd3UseSTricorderOnScreen },
+ { Action(ACTION_USE, OBJECT_KIRK, 0x20, 0), &Room::mudd3UseKirkOnScreen },
+ { Action(ACTION_USE, OBJECT_SPOCK, 0x21, 0), &Room::mudd3UseSpockOnSphere },
+ { Action(ACTION_TIMER_EXPIRED, 3, 0, 0), &Room::mudd3Timer3Expired },
+ { Action(ACTION_USE, OBJECT_MCCOY, 0x21, 0), &Room::mudd3UseMccoyOnSphere },
+ { Action(ACTION_USE, OBJECT_REDSHIRT, 0x21, 0), &Room::mudd3UseRedshirtOnSphere },
+ { Action(ACTION_USE, OBJECT_IMTRICOR, 0x21, 0), &Room::mudd3UseMTricorderOnSphere },
+ { Action(ACTION_USE, OBJECT_ISTRICOR, 0x21, 0), &Room::mudd3UseSTricorderOnSphere },
+ { Action(ACTION_FINISHED_WALKING, 2, 0, 0), &Room::mudd3ReadyToHookUpTricorders },
+ { Action(ACTION_TIMER_EXPIRED, 1, 0, 0), &Room::mudd3Timer1Expired },
+ { Action(ACTION_TIMER_EXPIRED, 2, 0, 0), &Room::mudd3Timer2Expired },
+ { Action(ACTION_TIMER_EXPIRED, 4, 0, 0), &Room::mudd3Timer4Expired },
+ { Action(ACTION_USE, OBJECT_IDISKS, 0x21, 0), &Room::mudd3UseMemoryDiskOnSphere },
+
+ // Common code
+ { Action(ACTION_USE, OBJECT_IDEGRIME, -1, 0), &Room::mudd0UseDegrimer },
+ { Action(ACTION_USE, OBJECT_ILENSES, OBJECT_IDEGRIME, 0), &Room::mudd0UseLenseOnDegrimer },
+ { Action(ACTION_USE, OBJECT_IALIENDV, -1, 0), &Room::mudd0UseAlienDevice },
+ { Action(ACTION_FINISHED_ANIMATION, 9, 0, 0), &Room::mudd0FiredAlienDevice },
+
+ { Action(ACTION_GET, 13, 0, 0), &Room::mudd3GetRepairTool },
+ { Action(ACTION_FINISHED_WALKING, 3, 0, 0), &Room::mudd3ReachedRepairTool },
+ { Action(ACTION_FINISHED_ANIMATION, 1, 0, 0), &Room::mudd3PickedUpRepairTool },
+ { Action(ACTION_LOOK, 0x21, 0, 0), &Room::mudd3LookAtSphere },
+ { Action(ACTION_WALK, 0x22, 0, 0), &Room::mudd3WalkToNorthDoor },
+ { Action(ACTION_TOUCHED_HOTSPOT, 0, 0, 0), &Room::mudd3TouchedHotspot0 },
+ { Action(ACTION_WALK, 0x23, 0, 0), &Room::mudd3WalkToEastDoor },
+ { Action(ACTION_TOUCHED_HOTSPOT, 1, 0, 0), &Room::mudd3TouchedHotspot1 },
+ { Action(ACTION_LOOK, OBJECT_KIRK, 0, 0), &Room::mudd3LookAtKirk },
+ { Action(ACTION_LOOK, OBJECT_SPOCK, 0, 0), &Room::mudd3LookAtSpock },
+ { Action(ACTION_LOOK, OBJECT_MCCOY, 0, 0), &Room::mudd3LookAtMccoy },
+ { Action(ACTION_LOOK, OBJECT_REDSHIRT, 0, 0), &Room::mudd3LookAtRedshirt },
+ { Action(ACTION_LOOK, 8, 0, 0), &Room::mudd3LookAtMudd },
+ { Action(ACTION_TALK, OBJECT_KIRK, 0, 0), &Room::mudd3TalkToKirk },
+ { Action(ACTION_TALK, OBJECT_SPOCK, 0, 0), &Room::mudd3TalkToSpock },
+ { Action(ACTION_TALK, OBJECT_MCCOY, 0, 0), &Room::mudd3TalkToMccoy },
+ { Action(ACTION_TALK, OBJECT_REDSHIRT, 0, 0), &Room::mudd3TalkToRedshirt },
+ { Action(ACTION_TALK, 8, 0, 0), &Room::mudd3TalkToMudd },
+ { Action(ACTION_USE, OBJECT_IMEDKIT, -1, 0), &Room::mudd3UseMedkit },
+ // TODO: remainder? something about losing atmosphere?
};
+
RoomAction mudd4ActionList[] = {
{ Action(ACTION_TICK, 1, 0, 0), &Room::mudd4Tick1 },
};
diff --git a/engines/startrek/rooms/mudd0.cpp b/engines/startrek/rooms/mudd0.cpp
index 54b3a2244f..381a07a14b 100644
--- a/engines/startrek/rooms/mudd0.cpp
+++ b/engines/startrek/rooms/mudd0.cpp
@@ -165,7 +165,7 @@ void Room::mudd0UseLenseOnDegrimer() {
_vm->_awayMission.mudd.missionScore++;
showText(TX_MUD0N011);
- // Identical (?) audio files: TX_MUD0N011, TX_MUD1N013, TX_MUD2N010
+ // Identical (?) audio files: TX_MUD0N011, TX_MUD1N013, TX_MUD2N010, TX_MUD3N016
}
@@ -174,6 +174,7 @@ void Room::mudd0UseAlienDevice() {
9, // MUDD0
13, // MUDD1
11, // MUDD2
+ 11, // MUDD3
};
_vm->_awayMission.disableInput = true;
@@ -191,13 +192,13 @@ void Room::mudd0FiredAlienDevice() {
_vm->_awayMission.mudd.discoveredLenseAndDegrimerFunction = true;
_vm->_awayMission.mudd.missionScore += 5;
showText(TX_SPEAKER_KIRK, TX_MUD0_002);
- // Identical (?) audio files: TX_MUD0_002, TX_MUD1_002
+ // Identical (?) audio files: TX_MUD0_002, TX_MUD1_002, TX_MUD2_002
}
}
void Room::mudd0UseDegrimer() {
- // Identical (?) audio files: TX_MUD0N002, TX_MUD1N004, TX_MUD2N001...
+ // Identical (?) audio files: TX_MUD0N002, TX_MUD1N004, TX_MUD2N001, TX_MUD3N001...
showText(TX_MUD0N002);
}
diff --git a/engines/startrek/rooms/mudd2.cpp b/engines/startrek/rooms/mudd2.cpp
index 81a975dfe6..d2a420d0c4 100644
--- a/engines/startrek/rooms/mudd2.cpp
+++ b/engines/startrek/rooms/mudd2.cpp
@@ -69,9 +69,9 @@ void Room::mudd2Tick1() {
_vm->_awayMission.crewDirectionsAfterWalk[OBJECT_REDSHIRT] = DIR_W;
_vm->_awayMission.mudd.muddDroppedCapsule = false;
- if (_vm->_awayMission.mudd.field4e == 0) {
- _vm->_awayMission.mudd.field4e = 0;
- } else if (_vm->_awayMission.mudd.field4e == 2) {
+ if (_vm->_awayMission.mudd.muddState == 0) {
+ _vm->_awayMission.mudd.muddState = 0;
+ } else if (_vm->_awayMission.mudd.muddState == 2) {
_vm->_awayMission.mudd.muddDroppedCapsule = true;
if (!_vm->_awayMission.mudd.muddUnconscious) {
_vm->_awayMission.mudd.muddUnconscious = false;
@@ -80,16 +80,16 @@ void Room::mudd2Tick1() {
} else {
loadActorAnim2(OBJECT_MUDD, "s4sbob", 0x9f, 0xba);
}
- } else if (_vm->_awayMission.mudd.field3f) {
- _vm->_awayMission.mudd.field4e = 0;
- } else if (_vm->_awayMission.mudd.field4e == 1) {
+ } else if (_vm->_awayMission.mudd.muddCurrentlyInsane) {
+ _vm->_awayMission.mudd.muddState = 0;
+ } else if (_vm->_awayMission.mudd.muddState == 1) {
playMidiMusicTracks(3);
loadActorAnim2(OBJECT_MUDD, "s4sbhw", 0x99, 0xbf);
_vm->_awayMission.disableInput = 2;
_vm->_awayMission.mudd.muddInhaledGas = true;
_vm->_awayMission.timers[1] = 70;
- _vm->_awayMission.mudd.field4e = 2;
- _vm->_awayMission.mudd.field3f = true;
+ _vm->_awayMission.mudd.muddState = 2;
+ _vm->_awayMission.mudd.muddCurrentlyInsane = true;
}
}
@@ -107,7 +107,7 @@ void Room::mudd2UseSpockOnCapsules() {
void Room::mudd2GetCapsules() {
if (!_vm->_awayMission.mudd.muddInhaledGas || _vm->_awayMission.mudd.muddUnconscious) {
- if (!_vm->_awayMission.mudd.field36)
+ if (!_vm->_awayMission.mudd.translatedAlienLanguage)
showText(TX_SPEAKER_MCCOY, TX_MUD2_024);
else
walkCrewmanC(OBJECT_MCCOY, 0x9f, 0xbf, &Room::mudd2MccoyReachedCapsules);
@@ -149,7 +149,7 @@ void Room::mudd2UseCapsuleOnControlPanel() {
}
void Room::mudd2MccoyReachedControlPanel() {
- if (_vm->_awayMission.mudd.field36)
+ if (_vm->_awayMission.mudd.translatedAlienLanguage)
showText(TX_SPEAKER_MCCOY, TX_MUD2_014);
else
loadActorAnimC(OBJECT_MCCOY, "musehn", -1, -1, &Room::mudd2MccoyPutCapsuleInControlPanel);
@@ -164,15 +164,17 @@ void Room::mudd2MccoyPutCapsuleInControlPanel() {
if (_vm->_awayMission.mudd.muddUnconscious)
showText(TX_SPEAKER_MCCOY, TX_MUD2_034);
+ _vm->_awayMission.mudd.putCapsuleInMedicalMachine = true;
+
loseItem(OBJECT_ICAPSULE);
_vm->_awayMission.crewDirectionsAfterWalk[OBJECT_MCCOY] = DIR_W;
walkCrewman(OBJECT_MCCOY, 0xfe, 0xb2);
}
void Room::mudd2UseKirkOnBed() {
- if (!_vm->_awayMission.mudd.field4c && !_vm->_awayMission.mudd.field36) {
+ if (!_vm->_awayMission.mudd.putCapsuleInMedicalMachine && !_vm->_awayMission.mudd.translatedAlienLanguage) {
walkCrewmanC(OBJECT_KIRK, 0xd7, 0xbd, &Room::mudd2KirkReachedBed);
- } else if (_vm->_awayMission.mudd.field36) {
+ } else if (_vm->_awayMission.mudd.translatedAlienLanguage) {
walkCrewman(OBJECT_KIRK, 0xd7, 0xbd, 7); // BUG(?): no continuation?
}
}
@@ -293,9 +295,9 @@ void Room::mudd2UseMedkitOnMudd() {
if (!_vm->_awayMission.mudd.muddInhaledGas)
return;
else if (_vm->_awayMission.mudd.muddUnconscious) {
- if (!_vm->_awayMission.mudd.field36)
+ if (!_vm->_awayMission.mudd.translatedAlienLanguage)
showText(TX_SPEAKER_MCCOY, TX_MUD2_015);
- else if (!_vm->_awayMission.mudd.field4c)
+ else if (!_vm->_awayMission.mudd.putCapsuleInMedicalMachine)
showText(TX_SPEAKER_MCCOY, TX_MUD2_021);
else
walkCrewmanC(OBJECT_MCCOY, 0xde, 0xaf, &Room::mudd2MccoyReachedMudd);
@@ -310,8 +312,8 @@ void Room::mudd2MccoyReachedMudd() {
}
void Room::mudd2MccoyCuredMudd() {
- _vm->_awayMission.mudd.field3f = false;
- _vm->_awayMission.mudd.field4e = 3;
+ _vm->_awayMission.mudd.muddCurrentlyInsane = false;
+ _vm->_awayMission.mudd.muddState = 3;
_vm->_awayMission.mudd.muddDroppedCapsule = false;
_vm->_awayMission.mudd.muddInhaledGas = false;
diff --git a/engines/startrek/rooms/mudd3.cpp b/engines/startrek/rooms/mudd3.cpp
index e3f215f784..1eed3de931 100644
--- a/engines/startrek/rooms/mudd3.cpp
+++ b/engines/startrek/rooms/mudd3.cpp
@@ -22,13 +22,415 @@
#include "startrek/room.h"
-#define OBJECT_DOOR1 8
+#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_CONSOLE 0x20
+#define HOTSPOT_SCREEN 0x20
+#define HOTSPOT_SPHERE 0x21
+#define HOTSPOT_NORTH_DOOR 0x22
+#define HOTSPOT_EAST_DOOR 0x23
namespace StarTrek {
void Room::mudd3Tick1() {
+ playVoc("MUD3LOOP");
+
+ _vm->_awayMission.crewDirectionsAfterWalk[OBJECT_REDSHIRT] = DIR_W;
+
+ if (_vm->_awayMission.mudd.databaseDestroyed) {
+ loadActorAnim(OBJECT_9, "s4lbpb", 0xa2, 0x9f);
+
+ // FIXME: is this supposed to be in this if statement?
+ if (!_vm->_awayMission.mudd.tookRepairToolFromDatabaseRoom)
+ loadActorAnim(OBJECT_REPAIR_TOOL, "s4lbdv", 0xb7, 0xa8);
+ }
+
+ _vm->_awayMission.mudd.muddInDatabaseRoom = false;
+
+ if (!_vm->_awayMission.mudd.muddVisitedDatabaseRoom && _vm->_awayMission.mudd.translatedAlienLanguage && !_vm->_awayMission.mudd.muddCurrentlyInsane) {
+ _vm->_awayMission.mudd.muddVisitedDatabaseRoom = true;
+ loadActorAnim(OBJECT_MUDD, "s4lbhs", 0xa2, 0x9f);
+ playMidiMusicTracks(3);
+ _vm->_awayMission.mudd.muddInDatabaseRoom = true;
+ _vm->_awayMission.timers[2] = 10;
+ }
+}
+
+void Room::mudd3UseCommunicator() {
+ showText(TX_SPEAKER_KIRK, TX_MUD3_003);
+ showText(TX_SPEAKER_UHURA, TX_STATICU1);
+}
+
+void Room::mudd3LookAtScreen() {
+ if (_vm->_awayMission.mudd.translatedAlienLanguage) // FIXME: flipped conditions?
+ showText(TX_MUD3N017);
+ else
+ showText(TX_SPEAKER_SPOCK, TX_MUD3_038);
+}
+
+void Room::mudd3UseSTricorderOnScreen() {
+ if (_roomVar.mudd.tricordersUnavailable)
+ showText(TX_SPEAKER_SPOCK, TX_MUD3_039);
+ else
+ spockScan(DIR_S, TX_MUD3_017, false);
+}
+
+// BUGFIX: Event was actually "use screen on kirk", which makes no sense.
+void Room::mudd3UseKirkOnScreen() {
+ if (!_vm->_awayMission.mudd.translatedAlienLanguage) {
+ showText(TX_MUD3N011);
+ showText(TX_SPEAKER_SPOCK, TX_MUD3_037);
+ }
+}
+
+void Room::mudd3UseSpockOnSphere() {
+ _vm->_awayMission.crewDirectionsAfterWalk[OBJECT_SPOCK] = DIR_S;
+ loadActorStandAnim(OBJECT_SPOCK);
+
+ if (_vm->_awayMission.mudd.computerDataErased) {
+ if (!_vm->_awayMission.mudd.databaseDestroyed) {
+ showText(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 (_vm->_awayMission.mudd.translatedAlienLanguage) {
+ if (_vm->_awayMission.mudd.accessedAlienDatabase)
+ showText(TX_SPEAKER_SPOCK, TX_MUD3_035);
+ else {
+ _vm->_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);
+
+ _vm->_awayMission.mudd.missionScore++;
+ playVoc("LSHAIANS");
+ loadActorAnim(OBJECT_ALIEN_IMAGE, "s4lbap", 0x32, 0x64);
+
+ _vm->_awayMission.crewDirectionsAfterWalk[OBJECT_KIRK] = DIR_W;
+ _vm->_awayMission.crewDirectionsAfterWalk[OBJECT_SPOCK] = DIR_W;
+ _vm->_awayMission.crewDirectionsAfterWalk[OBJECT_MCCOY] = DIR_W;
+ _vm->_awayMission.crewDirectionsAfterWalk[OBJECT_REDSHIRT] = DIR_W;
+ loadActorStandAnim(OBJECT_KIRK);
+ loadActorStandAnim(OBJECT_SPOCK);
+ loadActorStandAnim(OBJECT_MCCOY);
+ loadActorStandAnim(OBJECT_REDSHIRT);
+
+ _vm->_awayMission.disableInput = true;
+ _vm->_awayMission.timers[3] = 40;
+ }
+ } else if (_vm->_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);
+ _vm->_awayMission.crewDirectionsAfterWalk[OBJECT_SPOCK] = DIR_W;
+ walkCrewman(OBJECT_SPOCK, 0xcd, 0x87);
+ }
+}
+
+// Finished looking at alien image
+void Room::mudd3Timer3Expired() {
+ _vm->_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
+ _vm->_awayMission.crewDirectionsAfterWalk[OBJECT_MCCOY] = DIR_S;
+ loadActorStandAnim(OBJECT_MCCOY);
+
+ showText(TX_SPEAKER_MCCOY, TX_MUD3_021);
+ _vm->_awayMission.crewDirectionsAfterWalk[OBJECT_MCCOY] = DIR_W;
+ walkCrewman(OBJECT_MCCOY, 0xec, 0x84);
+}
+
+void Room::mudd3UseRedshirtOnSphere() {
+ // ENHANCEMENT: Turn to face south
+ _vm->_awayMission.crewDirectionsAfterWalk[OBJECT_REDSHIRT] = DIR_S;
+ loadActorStandAnim(OBJECT_REDSHIRT);
+
+ showText(TX_SPEAKER_BUCHERT, TX_MUD3_068); // BUGFIX: original played McCoy's audio by mistake
+ _vm->_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 {
+ _vm->_awayMission.crewDirectionsAfterWalk[OBJECT_MCCOY] = DIR_S;
+ loadActorStandAnim(OBJECT_MCCOY);
+ if (!_vm->_awayMission.mudd.translatedAlienLanguage && _roomVar.mudd.suggestedUsingTricorders && _vm->_awayMission.mudd.discoveredBase3System) {
+ _vm->_awayMission.disableInput = true;
+
+ _vm->_awayMission.crewDirectionsAfterWalk[OBJECT_MCCOY] = DIR_S;
+ walkCrewman(OBJECT_MCCOY, 0xac, 0x88);
+ _vm->_awayMission.crewDirectionsAfterWalk[OBJECT_SPOCK] = DIR_S;
+ walkCrewmanC(OBJECT_SPOCK, 0xa5, 0x8c, &Room::mudd3ReadyToHookUpTricorders);
+ } else {
+ showText(TX_SPEAKER_MCCOY, TX_MUD3_021);
+ _vm->_awayMission.crewDirectionsAfterWalk[OBJECT_MCCOY] = DIR_W;
+ walkCrewman(OBJECT_MCCOY, 0xec, 0x84);
+ }
+ }
+}
+
+void Room::mudd3UseSTricorderOnSphere() {
+ _vm->_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 (_vm->_awayMission.mudd.translatedAlienLanguage || (_vm->_awayMission.mudd.discoveredBase3System && !_roomVar.mudd.suggestedUsingTricorders)) {
+ showText(TX_SPEAKER_SPOCK, TX_MUD3_041);
+ _vm->_awayMission.crewDirectionsAfterWalk[OBJECT_SPOCK] = DIR_W;
+ walkCrewman(OBJECT_SPOCK, 0xcd, 0x87);
+ } else if (_vm->_awayMission.mudd.discoveredBase3System && _roomVar.mudd.suggestedUsingTricorders) { // Hooking up tricorders
+ _vm->_awayMission.disableInput = true;
+ _vm->_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;
+ _vm->_awayMission.timers[1] = 50;
+
+ loadActorAnim2(OBJECT_SPOCK, "sscans");
+ playSoundEffectIndex(SND_TRICORDER);
+}
+
+void Room::mudd3Timer1Expired() { // Tricorders ready for use again
+ showText(TX_SPEAKER_SPOCK, TX_MUD3_040);
+ showText(TX_SPEAKER_SPOCK, TX_MUD3_034);
+
+ _vm->_awayMission.disableInput = false;
+ _roomVar.mudd.tricordersUnavailable = false;
+ _roomVar.mudd.suggestedUsingTricorders = false;
+ _vm->_awayMission.mudd.translatedAlienLanguage = true;
+ _vm->_awayMission.mudd.missionScore++;
+
+ _vm->_awayMission.crewDirectionsAfterWalk[OBJECT_SPOCK] = DIR_W;
+ _vm->_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 int choices[] = {
+ TX_SPEAKER_KIRK,
+ TX_MUD3_010,
+ TX_MUD3_009,
+ TX_BLANK
+ };
+
+ _vm->_awayMission.mudd.computerDataErased = true;
+
+ showText(TX_SPEAKER_MUDD, TX_MUD3_065);
+ int choice = showText(choices);
+
+ if (choice == 0) { // Allow him to access the database
+ showText(TX_SPEAKER_MUDD, TX_MUD3_066);
+ _vm->_awayMission.mudd.gaveMuddDatabaseAccess = true;
+ } else { // Don't allow it (he destroys it by accident)
+ showText(TX_SPEAKER_MUDD, TX_MUD3_064);
+ _vm->_awayMission.timers[4] = 98;
+ _vm->_awayMission.disableInput = 2;
+ playMidiMusicTracks(26);
+ loadActorAnim(OBJECT_MUDD, "s4lbhb", 0xa2, 0x9f);
+ }
+}
+
+void Room::mudd3Timer4Expired() {
+ _vm->_awayMission.mudd.databaseDestroyed = true;
+
+ showText(TX_SPEAKER_MUDD, TX_MUD3_063);
+ showText(TX_SPEAKER_MCCOY, TX_MUD3_031);
+
+ _vm->_awayMission.disableInput = false;
+}
+
+void Room::mudd3UseMemoryDiskOnSphere() {
+ if (_vm->_awayMission.mudd.databaseDestroyed)
+ showText(TX_MUD3N014);
+ else if (_vm->_awayMission.mudd.translatedAlienLanguage && !_vm->_awayMission.mudd.gaveMuddDatabaseAccess) {
+ showText(TX_MUD3N020);
+ if (!_vm->_awayMission.mudd.gotPointsForDownloadingData) {
+ _vm->_awayMission.mudd.missionScore += 3;
+ _vm->_awayMission.mudd.gotPointsForDownloadingData = true;
+ }
+ } else
+ showText(TX_MUD3N019);
+}
+
+
+void Room::mudd3GetRepairTool() {
+ if (_vm->_awayMission.mudd.tookRepairToolFromDatabaseRoom)
+ showText(TX_MUD3N018); // NOTE: unused, since the object disappears, can't be selected again
+ else {
+ _vm->_awayMission.disableInput = true;
+ _vm->_awayMission.crewDirectionsAfterWalk[OBJECT_KIRK] = DIR_N;
+ walkCrewmanC(OBJECT_KIRK, 0xba, 0xc1, &Room::mudd3ReachedRepairTool);
+ }
+}
+
+void Room::mudd3ReachedRepairTool() {
+ _vm->_awayMission.crewDirectionsAfterWalk[OBJECT_KIRK] = DIR_N;
+ loadActorAnimC(OBJECT_KIRK, "kusemn", -1, -1, &Room::mudd3PickedUpRepairTool);
+}
+
+void Room::mudd3PickedUpRepairTool() {
+ _vm->_awayMission.disableInput = false;
+ loadActorStandAnim(OBJECT_REPAIR_TOOL);
+ _vm->_awayMission.mudd.tookRepairToolFromDatabaseRoom = true;
+ _vm->_awayMission.mudd.missionScore++;
+ giveItem(OBJECT_IDOOVER);
+}
+
+void Room::mudd3LookAtSphere() {
+ // ENHANCEMENT: Turn to face south
+ _vm->_awayMission.crewDirectionsAfterWalk[OBJECT_KIRK] = DIR_S;
+ loadActorStandAnim(OBJECT_KIRK);
+
+ showText(TX_MUD3N015);
+}
+
+void Room::mudd3WalkToNorthDoor() {
+ _roomVar.mudd.walkingToDoor = true;
+ _vm->_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;
+ _vm->_awayMission.disableInput = true;
+ walkCrewman(OBJECT_KIRK, 0x121, 0x81);
+}
+
+void Room::mudd3TouchedHotspot1() {
+ if (_roomVar.mudd.walkingToDoor) {
+ playVoc("SMADOOR3");
+ }
+}
+
+void Room::mudd3LookAtKirk() {
+ if (!_vm->_awayMission.mudd.muddInDatabaseRoom)
+ showText(TX_MUD3N005);
+ else
+ showText(TX_MUD3N004);
+}
+
+void Room::mudd3LookAtSpock() {
+ if (!_vm->_awayMission.mudd.muddInDatabaseRoom)
+ showText(TX_MUD3N012);
+ else
+ showText(TX_MUD3N002);
+}
+
+void Room::mudd3LookAtMccoy() {
+ if (!_vm->_awayMission.mudd.muddInDatabaseRoom)
+ showText(TX_MUD3N010);
+ else
+ showText(TX_MUD3N009);
+}
+
+void Room::mudd3LookAtRedshirt() {
+ if (!_vm->_awayMission.mudd.muddInDatabaseRoom)
+ showText(TX_MUD3N007);
+ else
+ showText(TX_MUD3N006);
+}
+
+void Room::mudd3LookAtMudd() {
+ showText(TX_MUD3N003);
+}
+
+void Room::mudd3TalkToKirk() {
+ if (!_vm->_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 (!_vm->_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 (!_vm->_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 (!_vm->_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() {
+ if (_vm->_awayMission.mudd.databaseDestroyed) {
+ 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_MUD3C001);
+ 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);
}
}