aboutsummaryrefslogtreecommitdiff
path: root/engines/startrek/rooms/mudd2.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/startrek/rooms/mudd2.cpp')
-rw-r--r--engines/startrek/rooms/mudd2.cpp375
1 files changed, 373 insertions, 2 deletions
diff --git a/engines/startrek/rooms/mudd2.cpp b/engines/startrek/rooms/mudd2.cpp
index f4b5b5f904..81a975dfe6 100644
--- a/engines/startrek/rooms/mudd2.cpp
+++ b/engines/startrek/rooms/mudd2.cpp
@@ -22,13 +22,384 @@
#include "startrek/room.h"
-#define OBJECT_DOOR1 8
+#define OBJECT_MUDD 8
+#define OBJECT_CAPSULE 9
+#define OBJECT_NORTH_DOOR 10
+#define OBJECT_ALIENDV 11
-#define HOTSPOT_CONSOLE 0x20
+#define HOTSPOT_CAPSULES 0x20
+#define HOTSPOT_NORTH_DOOR 0x21
+#define HOTSPOT_WEST_DOOR 0x22
+#define HOTSPOT_CONTROL_PANEL 0x23
+#define HOTSPOT_LEFT_BED 0x24
+#define HOTSPOT_RIGHT_BED 0x25
namespace StarTrek {
+void Room::mudd2WalkToNorthDoor() {
+ _roomVar.mudd.walkingToDoor = true;
+ _vm->_awayMission.disableInput = true;
+ walkCrewman(OBJECT_KIRK, 0xbc, 0x6a);
+}
+
+void Room::mudd2TouchedHotspot0() { // Trigger north door
+ if (_roomVar.mudd.walkingToDoor) {
+ playVoc("SMADOOR3");
+ loadActorAnim(OBJECT_NORTH_DOOR, "s4sbdo", 0xbe, 0x6b);
+ }
+}
+
+void Room::mudd2WalkToSouthDoor() {
+ _roomVar.mudd.walkingToDoor = true;
+ _vm->_awayMission.disableInput = true;
+ walkCrewman(OBJECT_KIRK, 0x46, 0x6f);
+}
+
+void Room::mudd2TouchedHotspot1() {
+ if (_roomVar.mudd.walkingToDoor) {
+ playVoc("SMADOOR3");
+ }
+}
+
void Room::mudd2Tick1() {
+ playVoc("MUD2LOOP");
+ _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;
+ _vm->_awayMission.mudd.muddDroppedCapsule = false;
+
+ if (_vm->_awayMission.mudd.field4e == 0) {
+ _vm->_awayMission.mudd.field4e = 0;
+ } else if (_vm->_awayMission.mudd.field4e == 2) {
+ _vm->_awayMission.mudd.muddDroppedCapsule = true;
+ if (!_vm->_awayMission.mudd.muddUnconscious) {
+ _vm->_awayMission.mudd.muddUnconscious = false;
+ loadActorAnim2(OBJECT_MUDD, "s4sbhn", 0x9f, 0xbf);
+ loadActorAnim2(OBJECT_CAPSULE, "s4sbvp", 0x93, 0xc3);
+ } 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) {
+ 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;
+ }
+}
+
+void Room::mudd2Timer1Expired() {
+ loadActorAnimC(OBJECT_MUDD, "s4sbmt", 0xa0, 0xbf, &Room::mudd2MuddNoticedKirk);
+}
+
+void Room::mudd2UseSTricorderAnywhere() {
+ spockScan(DIR_S, TX_MUD2_037, false);
+}
+
+void Room::mudd2UseSpockOnCapsules() {
+ showText(TX_SPEAKER_MCCOY, TX_MUD2_018);
+}
+
+void Room::mudd2GetCapsules() {
+ if (!_vm->_awayMission.mudd.muddInhaledGas || _vm->_awayMission.mudd.muddUnconscious) {
+ if (!_vm->_awayMission.mudd.field36)
+ showText(TX_SPEAKER_MCCOY, TX_MUD2_024);
+ else
+ walkCrewmanC(OBJECT_MCCOY, 0x9f, 0xbf, &Room::mudd2MccoyReachedCapsules);
+ } else {
+ showText(TX_SPEAKER_MCCOY, TX_MUD2_023);
+ }
+}
+
+void Room::mudd2MccoyReachedCapsules() {
+ loadActorAnimC(OBJECT_MCCOY, "musehn", -1, -1, &Room::mudd2MccoyPickedUpCapsules);
+ giveItem(OBJECT_ICAPSULE);
+}
+
+void Room::mudd2MccoyPickedUpCapsules() {
+ _vm->_awayMission.crewDirectionsAfterWalk[OBJECT_MCCOY] = DIR_W;
+ walkCrewman(OBJECT_MCCOY, 0xfe, 0xb2);
+}
+
+void Room::mudd2UseCommunicator() {
+ showText(TX_SPEAKER_KIRK, TX_MUD2_009);
+ showText(TX_SPEAKER_UHURA, TX_STATICU1);
+}
+
+void Room::mudd2LookAtCapsules() {
+ showText(TX_MUD2N008);
+}
+
+void Room::mudd2UseMTricorderOnCapsules() {
+ mccoyScan(DIR_W, TX_MUD2_030, false);
+ showText(TX_SPEAKER_KIRK, TX_MUD2_004);
+ showText(TX_SPEAKER_MCCOY, TX_MUD2_019);
+}
+
+void Room::mudd2UseCapsuleOnControlPanel() {
+ if (!_vm->_awayMission.mudd.muddInhaledGas || _vm->_awayMission.mudd.muddUnconscious)
+ walkCrewmanC(OBJECT_MCCOY, 0x9f, 0xbf, &Room::mudd2MccoyReachedControlPanel);
+ else
+ showText(TX_SPEAKER_MCCOY, TX_MUD2_023);
+}
+
+void Room::mudd2MccoyReachedControlPanel() {
+ if (_vm->_awayMission.mudd.field36)
+ showText(TX_SPEAKER_MCCOY, TX_MUD2_014);
+ else
+ loadActorAnimC(OBJECT_MCCOY, "musehn", -1, -1, &Room::mudd2MccoyPutCapsuleInControlPanel);
+}
+
+void Room::mudd2MccoyPutCapsuleInControlPanel() {
+ _vm->_awayMission.crewDirectionsAfterWalk[OBJECT_MCCOY] = DIR_N;
+ loadActorStandAnim(OBJECT_MCCOY);
+ showText(TX_SPEAKER_MCCOY, TX_MUD2_020);
+ showText(TX_SPEAKER_MCCOY, TX_MUD2_029);
+ showText(TX_SPEAKER_SPOCK, TX_MUD2_039);
+ if (_vm->_awayMission.mudd.muddUnconscious)
+ showText(TX_SPEAKER_MCCOY, TX_MUD2_034);
+
+ 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) {
+ walkCrewmanC(OBJECT_KIRK, 0xd7, 0xbd, &Room::mudd2KirkReachedBed);
+ } else if (_vm->_awayMission.mudd.field36) {
+ walkCrewman(OBJECT_KIRK, 0xd7, 0xbd, 7); // BUG(?): no continuation?
+ }
+}
+
+void Room::mudd2KirkReachedBed() {
+ // BUGFIX: Speaker is mccoy, not none
+ showText(TX_SPEAKER_MCCOY, TX_MUD2_022);
+}
+
+
+void Room::mudd2MuddNoticedKirk() {
+ showText(TX_SPEAKER_MUDD, TX_MUD2_044);
+ playVoc("BATTYGAS");
+ loadActorAnimC(OBJECT_MUDD, "s4sbhb", 0x9f, 0xbf, &Room::mudd2MuddDroppedCapsule); // Drops the capsule
+ playMidiMusicTracks(0);
+}
+
+void Room::mudd2MuddDroppedCapsule() {
+ loadActorAnim2(OBJECT_MUDD, "s4sbhn", 0x9f, 0xbf, 3); // NOTE: no callback from this
+ loadActorAnim2(OBJECT_CAPSULE, "s4sbvp", 0x93, 0xc3);
+ _vm->_awayMission.mudd.muddDroppedCapsule = true;
+
+ showText(TX_SPEAKER_MCCOY, TX_MUD2_032);
+ showText(TX_SPEAKER_MUDD, TX_MUD2_049);
+ showText(TX_SPEAKER_MCCOY, TX_MUD2_026);
+ showText(TX_SPEAKER_MUDD, TX_MUD2_051);
+ showText(TX_SPEAKER_MCCOY, TX_MUD2_031);
+ showText(TX_SPEAKER_MUDD, TX_MUD2_050);
+
+ _vm->_awayMission.disableInput = false;
+}
+
+
+void Room::mudd2UsePhaserOnMudd() {
+ if (_vm->_awayMission.mudd.muddInhaledGas && !_vm->_awayMission.mudd.muddUnconscious) {
+ showText(TX_SPEAKER_BUCHERT, TX_MUD2_053);
+ showText(TX_SPEAKER_MUDD, TX_MUD2_042);
+ showText(TX_SPEAKER_MUDD, TX_MUD2_043);
+ }
+}
+
+
+// Spock neck-pinches Mudd
+void Room::mudd2UseSpockOnMudd() {
+ if (_vm->_awayMission.mudd.muddInhaledGas && !_vm->_awayMission.mudd.muddUnconscious) {
+ _vm->_awayMission.disableInput = true;
+ walkCrewmanC(OBJECT_SPOCK, 0x8a, 0xbf, &Room::mudd2SpockReachedMudd);
+ }
+}
+
+void Room::mudd2SpockReachedMudd() {
+ loadActorAnimC(OBJECT_SPOCK, "s4sbsp", 0x9f, 0xbf, &Room::mudd2SpockPinchedMudd);
+ loadActorStandAnim(OBJECT_MUDD);
+}
+
+void Room::mudd2SpockPinchedMudd() {
+ loadActorAnim2(OBJECT_MUDD, "s4sbob", 0x9f, 0xba);
+ loadActorAnim2(OBJECT_SPOCK, "sstnde", 0xd0, 0xbd);
+
+ showText(TX_SPEAKER_SPOCK, TX_MUD2_012);
+
+ _vm->_awayMission.disableInput = false;
+ _vm->_awayMission.mudd.muddUnconscious = true;
+ _vm->_awayMission.crewDirectionsAfterWalk[OBJECT_SPOCK] = DIR_W;
+ walkCrewman(OBJECT_SPOCK, 0x118, 0xc4);
+}
+
+void Room::mudd2UseKirkOnMudd() {
+ if (_vm->_awayMission.mudd.muddInhaledGas && !_vm->_awayMission.mudd.muddUnconscious) {
+ showText(TX_SPEAKER_KIRK, TX_MUD2_001);
+ mudd2UseSpockOnMudd();
+ }
+}
+
+
+void Room::mudd2UseRedshirtOnMudd() {
+ if (_vm->_awayMission.mudd.muddInhaledGas && !_vm->_awayMission.mudd.muddUnconscious) {
+ _vm->_awayMission.disableInput = true;
+ walkCrewmanC(OBJECT_REDSHIRT, 0xc3, 0xbe, &Room::mudd2RedshirtReachedMudd);
+ }
+}
+
+void Room::mudd2RedshirtReachedMudd() {
+ _vm->_awayMission.timers[2] = 8;
+ loadActorAnimC(OBJECT_REDSHIRT, "s4sbrh", -1, -1, &Room::mudd2RedshirtPushedAway);
+ playVoc("ROCKFACE");
+ loadActorAnimC(OBJECT_MUDD, "s4sbhh", 0x9f, 0xbf, &Room::mudd2MuddFinishedPushingRedshirt);
+}
+
+void Room::mudd2Timer2Expired() {
+ playSoundEffectIndex(SND_BLANK_0b);
+}
+
+void Room::mudd2MuddFinishedPushingRedshirt() {
+ loadActorAnim2(OBJECT_MUDD, "s4sbhn");
+}
+
+void Room::mudd2RedshirtPushedAway() {
+ showText(TX_SPEAKER_BUCHERT, TX_MUD2_052);
+ loadActorAnim(OBJECT_REDSHIRT, "rstnds", 0xd8, 0xc3);
+ _vm->_awayMission.disableInput = false;
+ _vm->_awayMission.crewDirectionsAfterWalk[OBJECT_REDSHIRT] = DIR_W;
+ walkCrewman(OBJECT_REDSHIRT, 0x117, 0xae);
+}
+
+
+// BUGFIX: This was originally "Action 0x45 on Mudd"; as far as I know, action 0x45
+// doesn't exist. It's far more likely that 0x45 is supposed to correspond to
+// OBJECT_IMTRICOR in a USE action.
+// The function itself was also modified (ie. condition for showing text was inverted).
+void Room::mudd2UseMTricorderOnMudd() {
+ if (_vm->_awayMission.mudd.muddInhaledGas && !_vm->_awayMission.mudd.muddUnconscious)
+ mccoyScan(DIR_W, TX_MUD2_013, false);
+}
+
+
+void Room::mudd2UseMedkitOnMudd() {
+ if (!_vm->_awayMission.mudd.muddInhaledGas)
+ return;
+ else if (_vm->_awayMission.mudd.muddUnconscious) {
+ if (!_vm->_awayMission.mudd.field36)
+ showText(TX_SPEAKER_MCCOY, TX_MUD2_015);
+ else if (!_vm->_awayMission.mudd.field4c)
+ showText(TX_SPEAKER_MCCOY, TX_MUD2_021);
+ else
+ walkCrewmanC(OBJECT_MCCOY, 0xde, 0xaf, &Room::mudd2MccoyReachedMudd);
+ }
+ else // Can't get to him since he's busy being crazy
+ showText(TX_SPEAKER_MCCOY, TX_MUD2_016);
+}
+
+void Room::mudd2MccoyReachedMudd() {
+ _vm->_awayMission.mudd.missionScore += 2;
+ loadActorAnimC(OBJECT_MCCOY, "s4sbms", -1, -1, &Room::mudd2MccoyCuredMudd);
+}
+
+void Room::mudd2MccoyCuredMudd() {
+ _vm->_awayMission.mudd.field3f = false;
+ _vm->_awayMission.mudd.field4e = 3;
+ _vm->_awayMission.mudd.muddDroppedCapsule = false;
+ _vm->_awayMission.mudd.muddInhaledGas = false;
+
+ showText(TX_SPEAKER_MCCOY, TX_MUD2_033);
+ showText(TX_SPEAKER_MUDD, TX_MUD2_045);
+
+ _vm->_awayMission.mudd.muddUnconscious = false;
+}
+
+
+void Room::mudd2LookAtKirk() {
+ showText(TX_MUD2N003);
+}
+
+void Room::mudd2LookAtSpock() {
+ showText(TX_MUD2N006);
+}
+
+void Room::mudd2LookAtMccoy() {
+ showText(TX_MUD2N000);
+}
+
+void Room::mudd2LookAtRedshirt() {
+ showText(TX_MUD2N004);
+}
+
+void Room::mudd2LookAtMudd() {
+ showText(TX_MUD2N002);
+}
+
+void Room::mudd2LookAtControlPanel() {
+ showText(TX_MUD2N011);
+}
+
+void Room::mudd2LookAtBed() {
+ showText(TX_MUD2N007);
+}
+
+// FIXME: The conditions in the below functions seem wrong.
+void Room::mudd2TalkToKirk() {
+ if (!_vm->_awayMission.mudd.muddDroppedCapsule || _vm->_awayMission.mudd.muddInhaledGas || _vm->_awayMission.mudd.muddUnconscious)
+ showText(TX_SPEAKER_KIRK, TX_MUD2_010);
+ else {
+ showText(TX_SPEAKER_KIRK, TX_MUD2_005);
+ showText(TX_SPEAKER_MUDD, TX_MUD2_046);
+ showText(TX_SPEAKER_MCCOY, TX_MUD2_035);
+ }
+}
+
+void Room::mudd2TalkToSpock() {
+ if (!_vm->_awayMission.mudd.muddDroppedCapsule || _vm->_awayMission.mudd.muddInhaledGas || _vm->_awayMission.mudd.muddUnconscious) {
+ showText(TX_SPEAKER_SPOCK, TX_MUD2_040);
+ showText(TX_SPEAKER_KIRK, TX_MUD2_011);
+ } else {
+ showText(TX_SPEAKER_SPOCK, TX_MUD2_038);
+ }
+}
+
+void Room::mudd2TalkToMccoy() {
+ if (!_vm->_awayMission.mudd.muddDroppedCapsule || _vm->_awayMission.mudd.muddInhaledGas || _vm->_awayMission.mudd.muddUnconscious) {
+ showText(TX_SPEAKER_MCCOY, TX_MUD2_025);
+ showText(TX_SPEAKER_KIRK, TX_MUD2_007);
+ } else {
+ showText(TX_SPEAKER_MCCOY, TX_MUD2_027);
+ }
+}
+
+void Room::mudd2TalkToRedshirt() {
+ if (!_vm->_awayMission.mudd.muddDroppedCapsule || _vm->_awayMission.mudd.muddInhaledGas || _vm->_awayMission.mudd.muddUnconscious) {
+ showText(TX_SPEAKER_BUCHERT, TX_MUD2_054);
+ showText(TX_SPEAKER_KIRK, TX_MUD2_008);
+ } else {
+ showText(TX_SPEAKER_BUCHERT, TX_MUD2_055);
+ showText(TX_SPEAKER_KIRK, TX_MUD2_003);
+ showText(TX_SPEAKER_MCCOY, TX_MUD2_048);
+ }
+}
+
+void Room::mudd2TalkToMudd() {
+ if (!_vm->_awayMission.mudd.muddDroppedCapsule || _vm->_awayMission.mudd.muddUnconscious)
+ return;
+ else if (_vm->_awayMission.mudd.muddInhaledGas) {
+ showText(TX_SPEAKER_MUDD, TX_MUD2_048);
+ showText(TX_SPEAKER_MCCOY, TX_MUD2_028);
+ } else {
+ showText(TX_SPEAKER_MUDD, TX_MUD2_047);
+ showText(TX_SPEAKER_KIRK, TX_MUD2_006);
+ }
}
}