aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/startrek/awaymission.h6
-rw-r--r--engines/startrek/room.h31
-rw-r--r--engines/startrek/rooms/demon3.cpp433
-rw-r--r--engines/startrek/rooms/function_map.h48
4 files changed, 504 insertions, 14 deletions
diff --git a/engines/startrek/awaymission.h b/engines/startrek/awaymission.h
index 9087589729..178b78887b 100644
--- a/engines/startrek/awaymission.h
+++ b/engines/startrek/awaymission.h
@@ -63,9 +63,11 @@ struct AwayMission {
bool mccoyMentionedFlora; // 0x38
byte numBouldersGone; // 0x39
byte enteredFrom; // 0x3a
- bool field3c; // 0x3c
+ bool field3b; // 0x3b
+ bool healedMiner; // 0x3c
bool curedBrother; // 0x3d
bool knowAboutHypoDytoxin; // 0x3f
+ bool minerDead; // 0x40
byte field41; // 0x41
bool foundMiner; // 0x43
bool field45; // 0x45
@@ -74,7 +76,7 @@ struct AwayMission {
bool boulder2Gone; // 0x4a
bool boulder3Gone; // 0x4b
bool boulder4Gone; // 0x4c
- bool doorRevealed; // 0x4d
+ bool doorOpened; // 0x4d
bool gotBerries; // 0x50
bool madeHypoDytoxin; // 0x51
byte field56; // 0x56
diff --git a/engines/startrek/room.h b/engines/startrek/room.h
index 785be2717e..4f0e49b828 100644
--- a/engines/startrek/room.h
+++ b/engines/startrek/room.h
@@ -272,6 +272,36 @@ public:
void demon3RedshirtReachedPanel();
void demon3RedshirtUsedPanel();
void demon3RedshirtElectrocuted();
+ void demon3UseSTricorderOnDoor();
+ void demon3UseSTricorderOnAnything();
+ void demon3UseMTricorderOnDoor();
+ void demon3UsePhaserOnDoor();
+ void demon3UseHandOnPanel();
+ void demon3KirkReachedHandPanel();
+ void demon3KirkUsedHandPanel();
+ void demon3UseMTricorderOnMiner();
+ void demon3UseMedkitOnMiner();
+ void demon3McCoyReachedMiner();
+ void demon3McCoyFinishedHealingMiner();
+ void demon3GetMiner();
+ void demon3TalkToKirk();
+ void demon3TalkToSpock();
+ void demon3TalkToMccoy();
+ void demon3TalkToRedshirt();
+ void demon3LookAtKirk();
+ void demon3LookAtSpock();
+ void demon3LookAtMccoy();
+ void demon3LookAtRedshirt();
+ void demon3LookAnywhere();
+ void demon3LookAtMiner();
+ void demon3LookAtBoulder1();
+ void demon3LookAtBoulder2();
+ void demon3LookAtBoulder3();
+ void demon3LookAtBoulder4();
+ void demon3LookAtStructure();
+ void demon3LookAtDoor();
+ void demon3LookAtPanel();
+ void demon3LookAtLight();
private:
// Room-specific variables. This is memset'ed to 0 when the room is initialized.
@@ -294,6 +324,7 @@ private:
bool inFiringPosition; // 0xd1
bool kirkPhaserOut; // 0xd3
char boulderAnim[10]; // 0xd4
+ int16 usedPhaserOnDoor; // 0xd6
} demon3;
} _roomVar;
};
diff --git a/engines/startrek/rooms/demon3.cpp b/engines/startrek/rooms/demon3.cpp
index c7ad9ce86a..3af6da9669 100644
--- a/engines/startrek/rooms/demon3.cpp
+++ b/engines/startrek/rooms/demon3.cpp
@@ -43,14 +43,14 @@ void Room::demon3Tick1() {
loadActorAnim(12, "bldr4", 0x22, 0, 0);
}
- if (_vm->_awayMission.demon.doorRevealed) {
+ if (_vm->_awayMission.demon.doorOpened) {
loadActorAnim(14, "door2", 0x82, 0x0c, 0);
}
else {
loadMapFile("demon3a");
}
- if (!_vm->_awayMission.demon.field3c && _vm->_awayMission.demon.boulder4Gone)
+ if (!_vm->_awayMission.demon.healedMiner && _vm->_awayMission.demon.boulder4Gone)
loadActorAnim(13, "miner", 0xda, 0x6c, 0);
if (_vm->_awayMission.redshirtDead && !_vm->_awayMission.demon.field45)
loadActorAnim(OBJECT_REDSHIRT, "deadre", 0x46, 0xa0, 0);
@@ -83,8 +83,28 @@ void Room::demon3Timer1Expired() {
loadActorAnim2(OBJECT_KIRK, "redkil", 0x46, 0xa0, 1);
}
+// Door just opened
void Room::demon3Timer3Expired() {
- // TODO
+ if (_vm->_awayMission.demon.field3b) {
+ const char *text[] = {
+ nullptr,
+ "#DEM3\\DEM3N008#The hand's circuitry triggers a connection, and the door opens.",
+ ""
+ };
+ showRoomSpecificText(text);
+ loadActorAnim(14, "door", 0x82, 0xc, 0);
+ loadMapFile("demon3");
+ _vm->_awayMission.demon.doorOpened = true;
+ _vm->_awayMission.missionScore += 2;
+ }
+ else {
+ const char *text[] = {
+ nullptr,
+ "#DEM3\\DEM3N007#The fit is perfect, but something seems to be shorting out.",
+ ""
+ };
+ showRoomSpecificText(text);
+ }
}
void Room::demon3FinishedAnimation1() {
@@ -96,8 +116,9 @@ void Room::demon3FinishedAnimation1() {
_vm->_awayMission.redshirtDead = true;
}
+// Just destroyed boulder 4 (revealing the miner)
void Room::demon3FinishedAnimation2() {
- // TODO
+ loadActorAnim(13, "miner", 0xda, 0x6c, 0);
}
void Room::demon3FinishedWalking5() {
@@ -160,7 +181,7 @@ void Room::demon3FireAtBoulder() {
_roomVar.demon3.shootingBoulder = false;
switch (_roomVar.demon3.boulderBeingShot) {
- case 1:
+ case 1: // FIXME: animation overlaps on Kirk, probably due to sprite sorting inaccuracy
loadActorAnim2(9, "sbldr1", 0x22, 0, 0);
break;
case 2:
@@ -170,7 +191,7 @@ void Room::demon3FireAtBoulder() {
loadActorAnim2(11, "sbldr3", 0x22, 0, 0);
break;
case 4:
- loadActorAnim2(12, "sbldr4", 0x22, 0, 0);
+ loadActorAnim2(12, "sbldr4", 0x22, 0, 2);
break;
default: {
// This should never happen (in the original game, this would cause a stack
@@ -265,10 +286,11 @@ void Room::demon3UsePhaserOnBoulder4() {
demon3BoulderCommon();
}
else {
- // BUG: Spock doesn't speak, even though an audio file exists
+ // BUGFIX: In the original, the audio didn't play, despite the file existing (and
+ // despite it being used for the boulder on the left).
const char *text[] = {
SPEAKER_SPOCK,
- "Captain, the structure is extremely unstable. I would not recommend disturbing the lower section before the upper sections have been cleared.",
+ "#DEM3\\DEM3_006#Captain, the structure is extremely unstable. I would not recommend disturbing the lower section before the upper sections have been cleared.",
""
};
showRoomSpecificText(text);
@@ -277,13 +299,11 @@ void Room::demon3UsePhaserOnBoulder4() {
void Room::demon3BoulderCommon() {
_vm->_awayMission.transitioningIntoRoom = true;
- Common::Point pos = getActorPos(13);
- /* FIXME
+ Common::Point pos = getActorPos(OBJECT_KIRK);
if (!(pos.x == 0x79 && pos.y == 0xa0)) {
_roomVar.demon3.inFiringPosition = false;
_roomVar.demon3.kirkPhaserOut = false;
}
- */
if (_roomVar.demon3.inFiringPosition) {
demon3PullOutPhaserAndFireAtBoulder();
@@ -434,4 +454,395 @@ void Room::demon3RedshirtElectrocuted() {
showRoomSpecificText(text);
}
+void Room::demon3UseSTricorderOnDoor() {
+ loadActorAnim2(OBJECT_SPOCK, "sscann", -1, -1, 0);
+ playSoundEffectIndex(0x04);
+ const char *text[] = {
+ SPEAKER_SPOCK,
+ "#DEM3\\DEM3_012#Fascinating, Captain. This door is made of an unknown material. It is clearly built by an alien race we have no knowledge of.",
+ ""
+ };
+ showRoomSpecificText(text);
+}
+
+void Room::demon3UseSTricorderOnAnything() {
+ loadActorAnim2(OBJECT_SPOCK, "sscann", -1, -1, 0);
+ playSoundEffectIndex(0x04);
+ const char *text[] = {
+ SPEAKER_SPOCK,
+ "#DEM3\\DEM3_027#Fascinating... I'm registering low-intensity shielding unlike anything we've encountered before. That kept this door -- and whatever is behind it -- hidden from the ship's sensors and earlier tricorder readings.",
+ ""
+ };
+ showRoomSpecificText(text);
+}
+
+void Room::demon3UseMTricorderOnDoor() {
+ loadActorAnim2(OBJECT_SPOCK, "mscann", -1, -1, 0);
+ playSoundEffectIndex(0x04);
+ const char *text[] = {
+ SPEAKER_MCCOY,
+ "#DEM3\\DEM3_016#This is incredible, Jim. I'm picking up faint lifesign readings behind this door!",
+ ""
+ };
+ showRoomSpecificText(text);
+}
+
+void Room::demon3UsePhaserOnDoor() {
+ _roomVar.demon3.usedPhaserOnDoor++;
+ if (_roomVar.demon3.usedPhaserOnDoor == 1) {
+ const char *text[] = {
+ nullptr,
+ "#DEM3\\DEM3N009#There is no apparent effect.",
+ ""
+ };
+ showRoomSpecificText(text);
+ }
+ else if (_roomVar.demon3.usedPhaserOnDoor == 2) {
+ const char *text[] = {
+ SPEAKER_SPOCK,
+ "#DEM3\\DEM3_011#Captain, this course of action is ineffectual.",
+ ""
+ };
+ showRoomSpecificText(text);
+ }
+}
+
+void Room::demon3UseHandOnPanel() {
+ if (_vm->_awayMission.demon.numBouldersGone == 4) {
+ if (_vm->_awayMission.demon.doorOpened)
+ return;
+ walkCrewman(OBJECT_KIRK, 0xd8, 0x70, 7);
+ }
+ else {
+ const char *text[] = {
+ SPEAKER_SPOCK,
+ "#DEM3\\DEM3_005#Captain, I would strongly recommend clearing all the debris first.",
+ ""
+ };
+ showRoomSpecificText(text);
+ }
+}
+
+void Room::demon3KirkReachedHandPanel() {
+ loadActorAnim2(OBJECT_KIRK, "kusehn", -1, -1, 6);
+ _vm->_awayMission.crewDirectionsAfterWalk[OBJECT_KIRK] = DIR_W;
+ playVoc("MUR4E1");
+}
+
+void Room::demon3KirkUsedHandPanel() {
+ loadActorAnim(15, "panel", 0xd6, 0x3d, 0);
+ _vm->_awayMission.timers[3] = 10;
+ playVoc("SE0FORCE");
+}
+
+void Room::demon3UseMTricorderOnMiner() {
+ loadActorAnim2(OBJECT_MCCOY, "mscann", -1, -1, 0);
+ playSoundEffectIndex(0x04);
+
+ if (_vm->_awayMission.demon.minerDead) {
+ const char *text[] = {
+ SPEAKER_MCCOY,
+ "#DEM3\\DEM3_022#The miner is dead.",
+ };
+ showRoomSpecificText(text);
+ }
+ else {
+ const char *text[] = {
+ SPEAKER_MCCOY,
+ "#DEM3\\DEM3_023#This man is badly hurt, and suffering from shock and exposure as well.",
+ ""
+ };
+ showRoomSpecificText(text);
+ }
+}
+
+void Room::demon3UseMedkitOnMiner() {
+ if (_vm->_awayMission.demon.healedMiner) {
+ const char *text[] = {
+ SPEAKER_MCCOY,
+ "#DEM3\\DEM3_015#I've done all I can. He just needs rest now.",
+ ""
+ };
+ showRoomSpecificText(text);
+ }
+ else {
+ walkCrewman(OBJECT_MCCOY, 0xe6, 0x7b, 6);
+ _roomVar.demon3.inFiringPosition = false;
+ _roomVar.demon3.kirkPhaserOut = false;
+ }
+}
+
+void Room::demon3McCoyReachedMiner() {
+ loadActorAnim2(OBJECT_MCCOY, "museln", -1, -1, 7);
+}
+
+void Room::demon3McCoyFinishedHealingMiner() {
+ if (_vm->_awayMission.demon.minerDead) {
+ const char *text[] = {
+ SPEAKER_MCCOY,
+ "#DEM3\\DEM3_022#The miner is dead.",
+ ""
+ };
+ showRoomSpecificText(text);
+ }
+ else {
+ const char *text[] = {
+ SPEAKER_MCCOY,
+ "#DEM3\\DEM3_021#It was a near thing, but he'll live.",
+ ""
+ };
+ showRoomSpecificText(text);
+ _vm->_awayMission.demon.healedMiner = true;
+ loadActorAnim2(13, "drmine", 0xda, 0x6c, 0);
+ _vm->_awayMission.missionScore += 2;
+ walkCrewman(OBJECT_MCCOY, 0x104, 0x96, 0);
+ }
+}
+
+void Room::demon3GetMiner() {
+ const char *text[] = {
+ SPEAKER_MCCOY,
+ "#DEM3\\DEM3_017#Dammit, Jim, I'm a doctor, not a bellhop. This man's too hurt to be moved.",
+ ""
+ };
+ showRoomSpecificText(text);
+}
+
+void Room::demon3TalkToKirk() {
+ const char *text1[] = {
+ SPEAKER_KIRK,
+ "#DEM3\\DEM3_002#A gateway to an alien race. The wonders of the galaxy are endless, aren't they, Mr. Spock?",
+ ""
+ };
+ const char *text2[] = {
+ SPEAKER_SPOCK,
+ "#DEM3\\DEM3_029#Indeed, Captain.",
+ ""
+ };
+ const char *text3[] = {
+ SPEAKER_MCCOY,
+ "#DEM3\\DEM3_026#They can also be damned cold.",
+ ""
+ };
+ showRoomSpecificText(text1);
+ showRoomSpecificText(text2);
+ showRoomSpecificText(text3);
+}
+
+void Room::demon3TalkToSpock() {
+ const char *text[] = {
+ SPEAKER_SPOCK,
+ "#DEM3\\DEM3_028#I recommend as thorough an analysis of this area as possible.",
+ ""
+ };
+ showRoomSpecificText(text);
+}
+
+void Room::demon3TalkToMccoy() {
+ if (_vm->_awayMission.redshirtDead) {
+ const char *text[] = {
+ SPEAKER_MCCOY,
+ "#DEM3\\DEM3_014#I'm sorry, Jim. Ensign Everts is beyond my help.",
+ ""
+ };
+ showRoomSpecificText(text);
+ }
+ else {
+ const char *text1[] = {
+ SPEAKER_MCCOY,
+ "#DEM3\\DEM3_025#Jim, the next time you need medical help on a snowball...",
+ ""
+ };
+ const char *text2[] = {
+ SPEAKER_KIRK,
+ "#DEM3\\DEM3_003#Bones..",
+ ""
+ };
+ const char *text3[] = {
+ SPEAKER_MCCOY,
+ "#DEM3\\DEM3_024#I'll probably end up coming along.",
+ ""
+ };
+ showRoomSpecificText(text1);
+ showRoomSpecificText(text2);
+ showRoomSpecificText(text3);
+
+ }
+}
+
+void Room::demon3TalkToRedshirt() {
+ // FIXME: this shouldn't work if he's dead. Should it check higher up whether that's
+ // the case?
+ const char *text1[] = {
+ SPEAKER_EVERTS,
+ "#DEM3\\DEM3_036#No sign of demons, Klingons, or other hostiles, Captain. I promise I'll let you know the instant something appears.",
+ ""
+ };
+ const char *text2[] = {
+ SPEAKER_KIRK,
+ "#DEM3\\DEM3_004#Don't be too anxious, Ensign. We may want to talk with them.",
+ ""
+ };
+ showRoomSpecificText(text1);
+ showRoomSpecificText(text2);
+}
+
+void Room::demon3LookAtKirk() {
+ const char *text[] = {
+ nullptr,
+ "#DEM3\\DEM3N004#James T. Kirk. Captain of the Enterprise.",
+ ""
+ };
+ showRoomSpecificText(text);
+}
+
+void Room::demon3LookAtSpock() {
+ const char *text[] = {
+ nullptr,
+ "#DEM3\\DEM3N001#Commander Spock; curious about what lies ahead.",
+ ""
+ };
+ showRoomSpecificText(text);
+}
+
+void Room::demon3LookAtMccoy() {
+ const char *text[] = {
+ nullptr,
+ "#DEM3\\DEM3N002#Doctor Leonard McCoy, glad that the cave provides some shelter from the breeze.",
+ ""
+ };
+ showRoomSpecificText(text);
+}
+
+void Room::demon3LookAtRedshirt() {
+ if (_vm->_awayMission.redshirtDead) {
+ const char *text[] = {
+ nullptr,
+ "#DEM3\\DEM3N017#Ensign Everts lies dead, crushed by the boulder.",
+ ""
+ };
+ showRoomSpecificText(text);
+ // NOTE: there's an alternate string that isn't used?
+ // "#DEM3\\DEM3N018#The crushed body of Ensign Everts reminds you of your poor command judgement.",
+ }
+ else {
+ const char *text[] = {
+ nullptr,
+ "#DEM3\\DEM3N003#Ensign Everts, wary of more ambushes.",
+ ""
+ };
+ showRoomSpecificText(text);
+ }
+}
+
+void Room::demon3LookAnywhere() {
+ const char *text[] = {
+ nullptr,
+ "#DEM3\\DEM3N010#A cavern, deep in Mount Idyll.",
+ ""
+ };
+ showRoomSpecificText(text);
+}
+
+void Room::demon3LookAtMiner() {
+ if (_vm->_awayMission.demon.healedMiner) {
+ const char *text[] = {
+ nullptr,
+ "#DEM3\\DEM3N000#Brother Kandrey is barely conscious, and is lying still, trying to regain his strength.",
+ ""
+ };
+ showRoomSpecificText(text);
+ }
+ else {
+ const char *text[] = {
+ nullptr,
+ "#DEM3\\DEM3N006#One of the Acolytes, who was trapped by the the rockfall.",
+ ""
+ };
+ showRoomSpecificText(text);
+ }
+}
+
+void Room::demon3LookAtBoulder1() {
+ const char *text[] = {
+ nullptr,
+ "#DEM3\\DEM3N011#A huge boulder sits upon a large pile of rubble.",
+ ""
+ };
+ showRoomSpecificText(text);
+}
+
+void Room::demon3LookAtBoulder2() {
+ const char *text[] = {
+ nullptr,
+ "#DEM3\\DEM3N013#A large pile of rubble blocks what appears to be a large metallic structure.",
+ ""
+ };
+ showRoomSpecificText(text);
+}
+
+void Room::demon3LookAtBoulder3() {
+ const char *text[] = {
+ nullptr,
+ "#DEM3\\DEM3N013#A large pile of rubble blocks what appears to be a large metallic structure.",
+ ""
+ };
+ showRoomSpecificText(text);
+}
+
+void Room::demon3LookAtBoulder4() {
+ const char *text[] = {
+ nullptr,
+ "#DEM3\\DEM3N020#You notice what appears to be a man's arm sticking out from beneath the rubble.",
+ ""
+ };
+ showRoomSpecificText(text);
+}
+
+void Room::demon3LookAtStructure() {
+ const char *text[] = {
+ nullptr,
+ "#DEM3\\DEM3N016#A structure built into the surrounding rock. It must have been buried here for millennia.",
+ ""
+ };
+ showRoomSpecificText(text);
+}
+
+void Room::demon3LookAtDoor() {
+ if (_vm->_awayMission.demon.doorOpened) {
+ const char *text[] = {
+ nullptr,
+ "#DEM3\\DEM3N014#A long tunnel descends into the mountain.",
+ ""
+ };
+ showRoomSpecificText(text);
+ }
+ else {
+ const char *text[] = {
+ nullptr,
+ "#DEM3\\DEM3N012#A large metallic door is set in the structure.",
+ ""
+ };
+ showRoomSpecificText(text);
+ }
+}
+
+void Room::demon3LookAtPanel() {
+ const char *text[] = {
+ nullptr,
+ "#DEM3\\DEM3N019#This looks like some of the hand security panels on the Enterprise.",
+ ""
+ };
+ showRoomSpecificText(text);
+}
+
+void Room::demon3LookAtLight() {
+ const char *text[] = {
+ nullptr,
+ "#DEM3\\DEM3N015#A pulsing red light is set in the structure above the door.",
+ ""
+ };
+ showRoomSpecificText(text);
+}
+
}
diff --git a/engines/startrek/rooms/function_map.h b/engines/startrek/rooms/function_map.h
index 274dea7c89..9c6c89f2ab 100644
--- a/engines/startrek/rooms/function_map.h
+++ b/engines/startrek/rooms/function_map.h
@@ -184,7 +184,7 @@ RoomAction demon2ActionList[] = {
{ Action(ACTION_LOOK, 0x24, 0, 0), &Room::demon2LookAtFern },
{ Action(ACTION_LOOK, 0x25, 0, 0), &Room::demon2LookAtMoss },
{ Action(ACTION_LOOK, 0x26, 0, 0), &Room::demon2LookAtLights },
- { Action(ACTION_LOOK, -1, 0, 0), &Room::demon2LookAtAnything },
+ { Action(ACTION_LOOK, -1, 0, 0), &Room::demon2LookAtAnything },
{ Action(ACTION_LOOK, OBJECT_KIRK, 0, 0), &Room::demon2LookAtKirk },
{ Action(ACTION_LOOK, OBJECT_SPOCK, 0, 0), &Room::demon2LookAtSpock },
@@ -260,6 +260,52 @@ RoomAction demon3ActionList[] = {
{ Action(ACTION_FINISHED_WALKING, 8, 0, 0), &Room::demon3RedshirtReachedPanel },
{ Action(ACTION_FINISHED_ANIMATION, 5, 0, 0), &Room::demon3RedshirtUsedPanel },
{ Action(ACTION_FINISHED_ANIMATION, 3, 0, 0), &Room::demon3RedshirtElectrocuted },
+
+ { Action(ACTION_USE, OBJECT_ISTRICOR, 0x21, 0), &Room::demon3UseSTricorderOnDoor },
+ { Action(ACTION_USE, OBJECT_ISTRICOR, -1, 0), &Room::demon3UseSTricorderOnAnything },
+ { Action(ACTION_USE, OBJECT_IMTRICOR, 14, 0), &Room::demon3UseMTricorderOnDoor },
+ { Action(ACTION_USE, OBJECT_IMTRICOR, 0x21, 0), &Room::demon3UseMTricorderOnDoor },
+ { Action(ACTION_USE, OBJECT_IMTRICOR, 0x22, 0), &Room::demon3UseMTricorderOnDoor },
+ { Action(ACTION_USE, OBJECT_IPHASERS, 14, 0), &Room::demon3UsePhaserOnDoor },
+ { Action(ACTION_USE, OBJECT_IPHASERK, 14, 0), &Room::demon3UsePhaserOnDoor },
+ { Action(ACTION_USE, OBJECT_IPHASERS, 0x21, 0), &Room::demon3UsePhaserOnDoor },
+ { Action(ACTION_USE, OBJECT_IPHASERK, 0x21, 0), &Room::demon3UsePhaserOnDoor },
+
+ { Action(ACTION_USE, OBJECT_IHAND, 0x20, 0), &Room::demon3UseHandOnPanel },
+ { Action(ACTION_FINISHED_WALKING, 7, 0, 0), &Room::demon3KirkReachedHandPanel },
+ { Action(ACTION_FINISHED_ANIMATION, 6, 0, 0), &Room::demon3KirkUsedHandPanel },
+
+ { Action(ACTION_USE, OBJECT_IMTRICOR, 13, 0), &Room::demon3UseMTricorderOnMiner },
+ { Action(ACTION_USE, OBJECT_MCCOY, 13, 0), &Room::demon3UseMedkitOnMiner },
+ { Action(ACTION_USE, OBJECT_IMEDKIT, 13, 0), &Room::demon3UseMedkitOnMiner },
+ { Action(ACTION_FINISHED_WALKING, 6, 0, 0), &Room::demon3McCoyReachedMiner },
+ { Action(ACTION_FINISHED_ANIMATION, 7, 0, 0), &Room::demon3McCoyFinishedHealingMiner },
+
+ { Action(ACTION_GET, 13, 0, 0), &Room::demon3GetMiner },
+
+ { Action(ACTION_TALK, OBJECT_KIRK, 0, 0), &Room::demon3TalkToKirk },
+ { Action(ACTION_TALK, OBJECT_SPOCK, 0, 0), &Room::demon3TalkToSpock },
+ { Action(ACTION_TALK, OBJECT_MCCOY, 0, 0), &Room::demon3TalkToMccoy },
+ { Action(ACTION_TALK, OBJECT_REDSHIRT, 0, 0), &Room::demon3TalkToRedshirt },
+
+ { Action(ACTION_LOOK, OBJECT_KIRK, 0, 0), &Room::demon3LookAtKirk },
+ { Action(ACTION_LOOK, OBJECT_SPOCK, 0, 0), &Room::demon3LookAtSpock },
+ { Action(ACTION_LOOK, OBJECT_MCCOY, 0, 0), &Room::demon3LookAtMccoy },
+ { Action(ACTION_LOOK, OBJECT_REDSHIRT, 0, 0), &Room::demon3LookAtRedshirt },
+
+ { Action(ACTION_LOOK, -1, 0, 0), &Room::demon3LookAnywhere },
+ { Action(ACTION_LOOK, 13, 0, 0), &Room::demon3LookAtMiner },
+ { Action(ACTION_LOOK, 9, 0, 0), &Room::demon3LookAtBoulder1 },
+ { Action(ACTION_LOOK, 10, 0, 0), &Room::demon3LookAtBoulder2 },
+ { Action(ACTION_LOOK, 11, 0, 0), &Room::demon3LookAtBoulder3 },
+ { Action(ACTION_LOOK, 12, 0, 0), &Room::demon3LookAtBoulder4 },
+ { Action(ACTION_LOOK, 0x22, 0, 0), &Room::demon3LookAtStructure },
+ { Action(ACTION_LOOK, 14, 0, 0), &Room::demon3LookAtDoor },
+ { Action(ACTION_LOOK, 0x21, 0, 0), &Room::demon3LookAtDoor },
+ { Action(ACTION_LOOK, 15, 0, 0), &Room::demon3LookAtPanel },
+ { Action(ACTION_LOOK, 0x20, 0, 0), &Room::demon3LookAtPanel },
+ { Action(ACTION_LOOK, 8, 0, 0), &Room::demon3LookAtLight },
+
};
}