From 29e62d1a187e0df65411b8c5e3f7ed663dc421d5 Mon Sep 17 00:00:00 2001 From: Matthew Stewart Date: Mon, 28 May 2018 17:15:56 -0400 Subject: STARTREK: Finish demon3 --- engines/startrek/awaymission.h | 6 +- engines/startrek/room.h | 31 +++ engines/startrek/rooms/demon3.cpp | 433 +++++++++++++++++++++++++++++++++- engines/startrek/rooms/function_map.h | 48 +++- 4 files changed, 504 insertions(+), 14 deletions(-) (limited to 'engines/startrek') 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 }, + }; } -- cgit v1.2.3