diff options
| author | Matthew Stewart | 2018-05-30 21:06:31 -0400 |
|---|---|---|
| committer | Eugene Sandulenko | 2018-08-09 08:37:30 +0200 |
| commit | fe5658ca175810f7ea6cbcaa078e6fc86faf36f1 (patch) | |
| tree | a5e392c93e9acc72453d88d0782a8837b6ecdf81 /engines/startrek/rooms | |
| parent | 1290b7ea0298dc6a565e2593ecb703710d051830 (diff) | |
| download | scummvm-rg350-fe5658ca175810f7ea6cbcaa078e6fc86faf36f1.tar.gz scummvm-rg350-fe5658ca175810f7ea6cbcaa078e6fc86faf36f1.tar.bz2 scummvm-rg350-fe5658ca175810f7ea6cbcaa078e6fc86faf36f1.zip | |
STARTREK: Mission 1 finished
Diffstat (limited to 'engines/startrek/rooms')
| -rw-r--r-- | engines/startrek/rooms/demon1.cpp | 6 | ||||
| -rw-r--r-- | engines/startrek/rooms/demon4.cpp | 498 | ||||
| -rw-r--r-- | engines/startrek/rooms/function_map.h | 40 |
3 files changed, 532 insertions, 12 deletions
diff --git a/engines/startrek/rooms/demon1.cpp b/engines/startrek/rooms/demon1.cpp index 325f13c843..a5c42d33d0 100644 --- a/engines/startrek/rooms/demon1.cpp +++ b/engines/startrek/rooms/demon1.cpp @@ -381,8 +381,10 @@ void Room::demon1UseSTricorderOnHand() { } void Room::demon1UseSTricorderOnKlingon1() { - // NOTE: it sets up the stack, but doesn't call the function... - //loadActorAnim2(OBJECT_SPOCK, "sscann", -1, -1, 0); + // BUGFIX: Original game sets up the stack for this function call, but doesn't + // actually call the function... + loadActorAnim2(OBJECT_SPOCK, "sscann", -1, -1, 0); + playSoundEffectIndex(0x04); if (_roomVar.demon1.numKlingonsKilled == 3 && !_vm->_awayMission.demon.tookKlingonHand && _rdfData[0xcf] != 1) { diff --git a/engines/startrek/rooms/demon4.cpp b/engines/startrek/rooms/demon4.cpp index 52286327ea..8f2e310c9e 100644 --- a/engines/startrek/rooms/demon4.cpp +++ b/engines/startrek/rooms/demon4.cpp @@ -24,18 +24,21 @@ namespace StarTrek { +// TODO: this room should have animations on computer terminals, but this isn't where +// they're implemented. Could be related to ".BAN" files which rooms can load? + void Room::demon4Tick1() { playVoc("DEM4LOOP"); if (!_vm->_awayMission.demon.healedMiner) _vm->_awayMission.demon.minerDead = true; - if (_vm->_awayMission.demon.field4e) { + if (_vm->_awayMission.demon.solvedSunPuzzle) { loadActorAnim(10, "bxrise2", 0x122, 0x91, 0); loadActorAnim(8, "stpout2", 0x107, 0x92, 0); - _roomVar.demon4.cb = true; + _roomVar.demon4.nauianEmerged = true; - if ((_vm->_awayMission.demon.itemsTakenFromCase & 0x10) && !_vm->_awayMission.demon.field47) + if ((_vm->_awayMission.demon.itemsTakenFromCase & 0x10) && !_vm->_awayMission.demon.gaveSkullToNauian) _vm->_awayMission.timers[6] = 20; } @@ -45,14 +48,164 @@ void Room::demon4Tick1() { } } +// Alien emerged void Room::demon4FinishedAnimation1() { - // TODO + loadActorAnim(8, "stpout", 0x107, 0x92, 5); + _roomVar.demon4.nauianEmerged = true; + if (_vm->_awayMission.demon.itemsTakenFromCase & 0x10) + _vm->_awayMission.timers[6] = 45; } void Room::demon4FinishedAnimation2() { + if (!_roomVar.demon4.cd) { + _roomVar.demon4.cd = true; + showText(TX_DEM4N011); + } + + showGameOverMenu(); + + // WORKAROUND: original game has the below line; however, it's never executed anyway + // since the game over menu manipulates the stack. Here, the menu could delete this + // room object, so it should be the last statement... + //_vm->_awayMission.disableInput = false; } void Room::demon4FinishedAnimation3() { + showText(TX_SPEAKER_NAUIAN, TX_DEM4_034); + showText(TX_SPEAKER_KIRK, TX_DEM4_010); + showText(TX_SPEAKER_NAUIAN, TX_DEM4_035); + showText(TX_SPEAKER_SPOCK, TX_DEM4_030); + + _vm->_awayMission.disableInput = true; + _vm->_awayMission.missionScore += 5; + _vm->_awayMission.timers[1] = 20; +} + +// Just solved sun puzzle +void Room::demon4Timer0Expired() { + loadActorAnim(10, "bxrise", 0x122, 0x91, 1); + _vm->_awayMission.crewDirectionsAfterWalk[OBJECT_KIRK] = DIR_E; + loadActorStandAnim(OBJECT_KIRK); + playVoc("SE2POWER"); +} + +// Mission end +void Room::demon4Timer1Expired() { + showText(TX_SPEAKER_KIRK, TX_DEM4_011); + + walkCrewman(OBJECT_KIRK, 0xbe, 0xa5, 4); + walkCrewman(OBJECT_SPOCK, 0xb4, 0x9b, 4); + walkCrewman(OBJECT_MCCOY, 0xc8, 0x9b, 4); + + if (!_vm->_awayMission.redshirtDead) + walkCrewman(OBJECT_REDSHIRT, 0xc1, 0x91, 4); + else + _roomVar.demon4.crewReadyToBeamOut++; +} + +void Room::demon4CrewmanReachedBeamoutPosition() { + _roomVar.demon4.crewReadyToBeamOut++; + if (_roomVar.demon4.crewReadyToBeamOut != 4) + return; + + if (!_vm->_awayMission.demon.insultedStephen) + _vm->_awayMission.missionScore += 3; + if (!_vm->_awayMission.redshirtDead) + _vm->_awayMission.missionScore += 2; + + endMission(_vm->_awayMission.missionScore, 0x24, 0); +} + +void Room::demon4Timer2Expired() { + loadActorAnim2(OBJECT_SPOCK, "skille", -1, -1, 0); +} + +void Room::demon4Timer3Expired() { + loadActorAnim2(OBJECT_REDSHIRT, "rkille", -1, -1, 0); +} + +void Room::demon4Timer4Expired() { + loadActorAnim2(OBJECT_MCCOY, "mkille", -1, -1, 0); +} + +void Room::demon4Timer5Expired() { + loadActorAnim2(OBJECT_KIRK, "kkille", -1, -1, 2); +} + +void Room::demon4Timer6Expired() { + showText(TX_SPEAKER_MCCOY, TX_DEM4_017); +} + +void Room::demon4UsePhaserOnNauian() { + if (!_roomVar.demon4.triedToShootNauian) { // Lenient the first time + showText(TX_SPEAKER_NAUIAN, TX_DEM4_033); + _roomVar.demon4.triedToShootNauian = true; + } + else { // Murdery the second time + showText(TX_SPEAKER_NAUIAN, TX_DEM4_032); + loadActorAnim2(10, "bxfire", 0, 0, 2); + playVoc("V0SPOCKT"); + _vm->_awayMission.disableInput = true; + _vm->_awayMission.timers[2] = 7; + _vm->_awayMission.timers[3] = 8; + _vm->_awayMission.timers[4] = 7; + _vm->_awayMission.timers[5] = 8; + } +} + +void Room::demon4UseMetalOnSecurityEquipment() { + _vm->_awayMission.disableInput = true; + walkCrewman(OBJECT_KIRK, 0xf5, 0x90, 5); +} + +void Room::demon4KirkReachedSecurityEquipment() { + loadActorAnim2(OBJECT_KIRK, "kusemn", -1, -1, 4); +} + +void Room::demon4KirkFinishedUsingSecurityEquipment() { + _vm->_awayMission.disableInput = false; + showText(TX_DEM4N014); +} + +void Room::demon4UseMetalOnNauian() { + walkCrewman(OBJECT_KIRK, 0xe9, 0x90, 1); + _vm->_awayMission.crewDirectionsAfterWalk[OBJECT_KIRK] = DIR_E; +} + +void Room::demon4KirkReachedNauian() { + loadActorAnim2(8, "usekey", 0x107, 0x8e, 3); + loseItem(OBJECT_IMETAL); + _vm->_awayMission.missionScore += 2; + _vm->_awayMission.demon.itemsTakenFromCase &= ~1; +} + +void Room::demon4UseSkullOnNauian() { + walkCrewman(OBJECT_KIRK, 0xe9, 0x90, 2); +} + +void Room::demon4KirkReachedNauianWithSkull() { + showText(TX_SPEAKER_NAUIAN, TX_DEM4_036); + + const int choices[] = { TX_SPEAKER_KIRK, TX_DEM4_006, TX_DEM4_003, TX_DEM4_005, TX_BLANK }; + int choice = showText(choices); + + switch (choice) { + case 0: + _vm->_awayMission.missionScore++; + loadActorAnim2(8, "takesk", 0x107, 0x8e, 0); + loseItem(OBJECT_ISKULL); + _vm->_awayMission.demon.itemsTakenFromCase &= ~16; // BUG: skull reappears in case? Can abuse for infinite ponits? + _vm->_awayMission.demon.gaveSkullToNauian = true; + break; + + case 1: + case 2: + break; + + default: + showText(TX_DIALOG_ERROR); + break; + } } void Room::demon4UsePhaserOnPanel() { @@ -67,9 +220,77 @@ void Room::demon4UsePhaserOnMccoy() { showText(TX_SPEAKER_MCCOY, TX_DEM4_018); } +void Room::demon4TalkToNauian() { + _vm->_awayMission.disableInput = false; + + if (!_vm->_awayMission.demon.metNauian) { + _vm->_awayMission.demon.metNauian = true; + showText(TX_SPEAKER_NAUIAN, TX_DEM4_044); + + const int choices[] = { TX_SPEAKER_KIRK, TX_DEM4_002, TX_DEM4_004, TX_DEM4_009, TX_BLANK }; + int choice = showText(choices); + + switch (choice) { + case 0: + _vm->_awayMission.demon.field2d = true; + showText(TX_SPEAKER_NAUIAN, TX_DEM4_042); + break; + + case 1: + break; + + case 2: + showText(TX_SPEAKER_NAUIAN, TX_DEM4_039); + break; + + default: + showText(TX_DIALOG_ERROR); + break; + } + + showText(TX_SPEAKER_NAUIAN, TX_DEM4_043); + + const int choices2[] = { TX_SPEAKER_KIRK, TX_DEM4_008, TX_DEM4_007, TX_BLANK }; + choice = showText(choices2); + + switch (choice) { + case 0: + _vm->_awayMission.demon.field2d = true; + showText(TX_SPEAKER_NAUIAN, TX_DEM4_041); + break; + case 1: + break; + default: + showText(TX_DIALOG_ERROR); + break; + } + + showText(TX_SPEAKER_NAUIAN, TX_DEM4_040); + + if (_roomVar.demon4.disabledSecurity) { // Impossible condition? + showText(TX_SPEAKER_NAUIAN, TX_DEM4_037); + + // BUGFIX: Originally all of these used no audio, despite the files existing + // (being used elsewhere). + showText(TX_SPEAKER_KIRK, TX_DEM4_010); + showText(TX_SPEAKER_NAUIAN, TX_DEM4_035); + showText(TX_SPEAKER_SPOCK, TX_DEM4_030); + + _vm->_awayMission.disableInput = true; + _vm->_awayMission.missionScore += 5; + _vm->_awayMission.timers[1] = 20; + } + else { + showText(TX_SPEAKER_NAUIAN, TX_DEM4_038); + } + } + else { + showText(TX_SPEAKER_NAUIAN, TX_DEM4_031); + } +} + void Room::demon4LookAtPattern() { showText(TX_DEM4N002); - } void Room::demon4LookAtAlien() { @@ -133,7 +354,7 @@ void Room::demon4UseRedshirtOnPanel() { } void Room::demon4UseCrewmanOnPanel() { - if (_vm->_awayMission.demon.field4e) + if (_vm->_awayMission.demon.solvedSunPuzzle) return; walkCrewman(_roomVar.demon4.crewmanUsingPanel, 0xda, 0x83, 3); _vm->_awayMission.crewDirectionsAfterWalk[_roomVar.demon4.crewmanUsingPanel] = DIR_N; @@ -141,7 +362,270 @@ void Room::demon4UseCrewmanOnPanel() { } void Room::demon4CrewmanReachedPanel() { - // TODO: puzzle implementation + if (demon4ShowSunPuzzle()) { + _vm->_awayMission.demon.solvedSunPuzzle = true; + loadActorAnim(9, "ctrl", 0, 0, 0); + _vm->_awayMission.missionScore += 3; + _vm->_awayMission.timers[0] = 10; + } + else + showText(TX_DEM4N013); + + walkCrewman(_roomVar.demon4.crewmanUsingPanel, 0xae, 0x93, 0); + _vm->_awayMission.disableInput = false; +} + +bool Room::demon4ShowSunPuzzle() { + bool solved = false; + + int sliderY = 17; + int sliderR = -17; + int sliderB = 17; + + _vm->_gfx->fadeoutScreen(); + _vm->_sound->stopAllVocSounds(); + + _vm->_gfx->pushSprites(); + _vm->_gfx->setBackgroundImage(_vm->_gfx->loadBitmap("machineb")); + _vm->_gfx->copyBackgroundScreen(); + _vm->_gfx->clearPri(); + + Sprite sprites[21]; + + for (int i = 0; i < 21; i++) { + _vm->_gfx->addSprite(&sprites[i]); + } + + sprites[0].setBitmap(_vm->_gfx->loadBitmap("levery")); + sprites[1].setBitmap(_vm->_gfx->loadBitmap("leverr")); + sprites[2].setBitmap(_vm->_gfx->loadBitmap("leverb")); + + SharedPtr<Bitmap> lightyBitmap = _vm->_gfx->loadBitmap("lighty"); + SharedPtr<Bitmap> lightrBitmap = _vm->_gfx->loadBitmap("lightr"); + SharedPtr<Bitmap> lightbBitmap = _vm->_gfx->loadBitmap("lightb"); + + for (int i = 3; i < 9; i++) + sprites[i].bitmap = lightyBitmap; + for (int i = 9; i < 15; i++) + sprites[i].bitmap = lightrBitmap; + for (int i = 15; i < 21; i++) + sprites[i].bitmap = lightbBitmap; + + Sprite doneButtonSprite; + _vm->_gfx->addSprite(&doneButtonSprite); + doneButtonSprite.setXYAndPriority(0x104, 0x64, 2); + doneButtonSprite.setBitmap(_vm->_gfx->loadBitmap("donebutt")); + // BUGFIX: use draw mode 2 so the entire button is clickable (not just non-transparent + // pixels) + doneButtonSprite.drawMode = 2; + + _vm->_gfx->fadeinScreen(); + + bool continueLoop = true; + bool sliderChanged = true; + + while (continueLoop) { + if (sliderChanged) { + sprites[0].setXYAndPriority(0xa0, sliderY + 0x75, 14); + sprites[1].setXYAndPriority(0xa8, sliderR + 0x75, 14); + sprites[2].setXYAndPriority(0xb0, sliderB + 0x75, 14); + + int var56 = 0x82; + int var58 = 0x83; + int var5a = 3; + int numSprites = abs(sliderY) / 3; + for (int i = 0; i < 6; i++) { + sprites[i + var5a].setXYAndPriority(var58, var56, 14); + } + var56 -= 6; + for (int i = 0; i < numSprites; i++) { + sprites[i + var5a].setXYAndPriority(var58, var56, 14); + var56 -= 6; + } + + var56 = 0x82; + var58 = 0x8b; + var5a = 9; + numSprites = abs(sliderR) / 3; + for (int i = 0; i < 6; i++) { + sprites[i + var5a].setXYAndPriority(var58, var56, 14); + } + var56 -= 6; + for (int i = 0; i < numSprites; i++) { + sprites[i + var5a].setXYAndPriority(var58, var56, 14); + var56 -= 6; + } + + var56 = 0x82; + var58 = 0x93; + var5a = 15; + numSprites = abs(sliderB) / 3; + for (int i = 0; i < 6; i++) { + sprites[i + var5a].setXYAndPriority(var58, var56, 14); + } + var56 -= 6; + for (int i = 0; i < numSprites; i++) { + sprites[i + var5a].setXYAndPriority(var58, var56, 14); + var56 -= 6; + } + + sliderChanged = false; + } + + TrekEvent event; + if (!_vm->popNextEvent(&event)) + continue; + + switch (event.type) { + case TREKEVENT_LBUTTONDOWN: { +lclick: + Common::Point mousePos = _vm->_gfx->getMousePos(); + if (_vm->_gfx->getSpriteAt(mousePos) == &doneButtonSprite) + goto done; + else { + if (mousePos.y >= 0x64 && mousePos.y <= 0x86) { + if (mousePos.x >= 0xa0 && mousePos.x <= 0xa6) + sliderY = mousePos.y - 0x75; + else if (mousePos.x >= 0xa8 && mousePos.x <= 0xae) + sliderR = mousePos.y - 0x75; + else if (mousePos.x >= 0xb0 && mousePos.x <= 0xb6) + sliderB = mousePos.y - 0x75; + sliderChanged = true; + } + } + break; + } + + case TREKEVENT_RBUTTONDOWN: +done: + if (abs(sliderY) <= 2 && abs(sliderR) <= 2 && abs(sliderB) <= 2) + solved = true; + else + solved = false; + continueLoop = false; + break; + + case TREKEVENT_KEYDOWN: + switch (event.kbd.keycode) { + case Common::KEYCODE_ESCAPE: + case Common::KEYCODE_F2: + goto done; + + case Common::KEYCODE_RETURN: + case Common::KEYCODE_KP_ENTER: + case Common::KEYCODE_F1: + goto lclick; + + default: + break; + } + break; + + default: + break; + } + + _vm->_gfx->drawAllSprites(); + } + + _vm->_gfx->fadeoutScreen(); + _vm->_gfx->popSprites(); + _vm->_gfx->loadPri(_vm->_screenName); + _vm->_gfx->setBackgroundImage(_vm->_gfx->loadBitmap(_vm->_screenName)); + _vm->_gfx->copyBackgroundScreen(); + _vm->_gfx->forceDrawAllSprites(); + + return solved; +} + +void Room::demon4TalkToKirk() { + showText(TX_SPEAKER_KIRK, TX_DEM4_001); +} + +void Room::demon4TalkToMccoy() { + if (_roomVar.demon4.nauianEmerged) + showText(TX_SPEAKER_MCCOY, TX_DEM4_019); + else + showText(TX_SPEAKER_MCCOY, TX_DEM4_015); +} + +void Room::demon4TalkToSpock() { + if (_roomVar.demon4.nauianEmerged) + showText(TX_SPEAKER_SPOCK, TX_DEM4_022); + else + showText(TX_SPEAKER_SPOCK, TX_DEM4_024); +} + +void Room::demon4TalkToRedshirt() { + if (_roomVar.demon4.nauianEmerged) + showText(TX_SPEAKER_EVERTS, TX_DEM4_047); + else + showText(TX_SPEAKER_EVERTS, TX_DEM4_046); +} + +void Room::demon4UseSTricorderOnChamber() { + loadActorAnim2(OBJECT_SPOCK, "sscane", -1, -1, 0); + playSoundEffectIndex(4); + showText(TX_SPEAKER_SPOCK, TX_DEM4_012); +} + +void Room::demon4UseSTricorderOnPattern() { + loadActorAnim2(OBJECT_SPOCK, "sscane", -1, -1, 0); + playSoundEffectIndex(4); + showText(TX_SPEAKER_SPOCK, TX_DEM4_014); + showText(TX_SPEAKER_SPOCK, TX_DEM4_025); +} + +void Room::demon4UseMTricorderOnPattern() { + showText(TX_SPEAKER_MCCOY, TX_DEM4_021); +} + +void Room::demon4UseSTricorderOnPanel() { + loadActorAnim2(OBJECT_SPOCK, "sscane", -1, -1, 0); + playSoundEffectIndex(4); + showText(TX_SPEAKER_SPOCK, TX_DEM4_027); +} + +void Room::demon4UseMTricorderOnPanel() { + loadActorAnim2(OBJECT_MCCOY, "mscane", -1, -1, 0); + playSoundEffectIndex(4); + showText(TX_SPEAKER_MCCOY, TX_DEM4_027); // BUG: Uses spock's voice (though speaker says "Mccoy") +} + +void Room::demon4UseSTricorderOnAnything() { + loadActorAnim2(OBJECT_SPOCK, "sscane", -1, -1, 0); + playSoundEffectIndex(4); + showText(TX_SPEAKER_SPOCK, TX_DEM4_023); +} + +void Room::demon4UseMTricorderOnAnything() { + loadActorAnim2(OBJECT_MCCOY, "mscane", -1, -1, 0); + playSoundEffectIndex(4); + showText(TX_SPEAKER_MCCOY, TX_DEM4_020); +} + +void Room::demon4UseSTricorderOnNauian() { + loadActorAnim2(OBJECT_SPOCK, "sscane", -1, -1, 0); + playSoundEffectIndex(4); + showText(TX_SPEAKER_SPOCK, TX_DEM4_029); +} + +void Room::demon4UseMTricorderOnNauian() { + loadActorAnim2(OBJECT_MCCOY, "mscane", -1, -1, 0); + playSoundEffectIndex(4); + showText(TX_SPEAKER_SPOCK, TX_DEM4_029); // BUG: Uses spock's voice (speaker says "Spock" too) +} + +void Room::demon4UseSTricorderOnSecurityEquipment() { + loadActorAnim2(OBJECT_SPOCK, "sscane", -1, -1, 0); + playSoundEffectIndex(4); + showText(TX_SPEAKER_SPOCK, TX_DEM4_026); +} + +void Room::demon4UseMTricorderOnSecurityEquipment() { + loadActorAnim2(OBJECT_MCCOY, "mscane", -1, -1, 0); + playSoundEffectIndex(4); + showText(TX_SPEAKER_SPOCK, TX_DEM4_026); // BUG: Uses spock's voice (speaker says "Spock" too) } } diff --git a/engines/startrek/rooms/function_map.h b/engines/startrek/rooms/function_map.h index fc5f73a28b..db647df41e 100644 --- a/engines/startrek/rooms/function_map.h +++ b/engines/startrek/rooms/function_map.h @@ -314,14 +314,31 @@ RoomAction demon4ActionList[] = { { Action(ACTION_FINISHED_ANIMATION, 1, 0, 0), &Room::demon4FinishedAnimation1 }, { Action(ACTION_FINISHED_ANIMATION, 2, 0, 0), &Room::demon4FinishedAnimation2 }, { Action(ACTION_FINISHED_ANIMATION, 3, 0, 0), &Room::demon4FinishedAnimation3 }, - - // TODO: everything + { Action(ACTION_TIMER_EXPIRED, 0, 0, 0), &Room::demon4Timer0Expired }, + { Action(ACTION_TIMER_EXPIRED, 1, 0, 0), &Room::demon4Timer1Expired }, + { Action(ACTION_FINISHED_WALKING, 4, 0, 0), &Room::demon4CrewmanReachedBeamoutPosition }, + { Action(ACTION_TIMER_EXPIRED, 2, 0, 0), &Room::demon4Timer2Expired }, + { Action(ACTION_TIMER_EXPIRED, 3, 0, 0), &Room::demon4Timer3Expired }, + { Action(ACTION_TIMER_EXPIRED, 4, 0, 0), &Room::demon4Timer4Expired }, + { Action(ACTION_TIMER_EXPIRED, 5, 0, 0), &Room::demon4Timer5Expired }, + { Action(ACTION_TIMER_EXPIRED, 6, 0, 0), &Room::demon4Timer6Expired }, + + { Action(ACTION_USE, OBJECT_IPHASERK, 8, 0), &Room::demon4UsePhaserOnNauian }, + { Action(ACTION_USE, OBJECT_IPHASERS, 8, 0), &Room::demon4UsePhaserOnNauian }, + { Action(ACTION_USE, OBJECT_IMETAL, 0x22, 0), &Room::demon4UseMetalOnSecurityEquipment }, + { Action(ACTION_FINISHED_WALKING, 5, 0, 0), &Room::demon4KirkReachedSecurityEquipment }, + { Action(ACTION_FINISHED_ANIMATION, 4, 0, 0), &Room::demon4KirkFinishedUsingSecurityEquipment }, + { Action(ACTION_USE, OBJECT_IMETAL, 8, 0), &Room::demon4UseMetalOnNauian }, + { Action(ACTION_FINISHED_WALKING, 1, 0, 0), &Room::demon4KirkReachedNauian }, + { Action(ACTION_USE, OBJECT_ISKULL, 8, 0), &Room::demon4UseSkullOnNauian }, + { Action(ACTION_FINISHED_WALKING, 2, 0, 0), &Room::demon4KirkReachedNauianWithSkull }, { Action(ACTION_USE, OBJECT_IPHASERS, 0x21, 0), &Room::demon4UsePhaserOnPanel }, { Action(ACTION_USE, OBJECT_IPHASERS, 0x20, 0), &Room::demon4UsePhaserOnPattern }, { Action(ACTION_USE, OBJECT_IPHASERS, OBJECT_MCCOY, 0), &Room::demon4UsePhaserOnMccoy }, - // TODO + { Action(ACTION_FINISHED_ANIMATION, 5, 0, 0), &Room::demon4TalkToNauian }, + { Action(ACTION_TALK, 8, 0, 0), &Room::demon4TalkToNauian }, { Action(ACTION_LOOK, 0x20, 0, 0), &Room::demon4LookAtPattern }, { Action(ACTION_LOOK, 8, 0, 0), &Room::demon4LookAtAlien }, @@ -342,6 +359,23 @@ RoomAction demon4ActionList[] = { { Action(ACTION_USE, OBJECT_MCCOY, 0x21, 0), &Room::demon4UseMccoyOnPanel }, { Action(ACTION_USE, OBJECT_REDSHIRT, 0x21, 0), &Room::demon4UseRedshirtOnPanel }, { Action(ACTION_FINISHED_WALKING, 3, 0, 0), &Room::demon4CrewmanReachedPanel }, + { Action(ACTION_TALK, OBJECT_KIRK, 0, 0), &Room::demon4TalkToKirk }, + { Action(ACTION_TALK, OBJECT_MCCOY, 0, 0), &Room::demon4TalkToMccoy }, + { Action(ACTION_TALK, OBJECT_SPOCK, 0, 0), &Room::demon4TalkToSpock }, + { Action(ACTION_TALK, OBJECT_REDSHIRT, 0, 0), &Room::demon4TalkToRedshirt }, + { Action(ACTION_USE, OBJECT_ISTRICOR, 10, 0), &Room::demon4UseSTricorderOnChamber }, + { Action(ACTION_USE, OBJECT_ISTRICOR, 0x20, 0), &Room::demon4UseSTricorderOnPattern }, + { Action(ACTION_USE, OBJECT_IMTRICOR, 0x20, 0), &Room::demon4UseMTricorderOnPattern }, + { Action(ACTION_USE, OBJECT_ISTRICOR, 0x21, 0), &Room::demon4UseSTricorderOnPanel }, + { Action(ACTION_USE, OBJECT_IMTRICOR, 0x21, 0), &Room::demon4UseMTricorderOnPanel }, + { Action(ACTION_USE, OBJECT_ISTRICOR, 0x23, 0), &Room::demon4UseSTricorderOnAnything }, + { Action(ACTION_USE, OBJECT_ISTRICOR, -1, 0), &Room::demon4UseSTricorderOnAnything }, + { Action(ACTION_USE, OBJECT_IMTRICOR, 0x23, 0), &Room::demon4UseMTricorderOnAnything }, + { Action(ACTION_USE, OBJECT_IMTRICOR, -1, 0), &Room::demon4UseMTricorderOnAnything }, + { Action(ACTION_USE, OBJECT_ISTRICOR, 8, 0), &Room::demon4UseSTricorderOnNauian }, + { Action(ACTION_USE, OBJECT_IMTRICOR, 8, 0), &Room::demon4UseMTricorderOnNauian }, + { Action(ACTION_USE, OBJECT_ISTRICOR, 0x22, 0), &Room::demon4UseSTricorderOnSecurityEquipment }, + { Action(ACTION_USE, OBJECT_IMTRICOR, 0x22, 0), &Room::demon4UseMTricorderOnSecurityEquipment }, }; RoomAction demon5ActionList[] = { |
