diff options
author | Matthew Stewart | 2018-06-15 23:13:51 -0400 |
---|---|---|
committer | Eugene Sandulenko | 2018-08-09 08:37:30 +0200 |
commit | 933d21429fdb3cc1c97237bbee1cd2168c33d95f (patch) | |
tree | 0ac4ef7a45923ab3c71606d34c12195c82110b2a /engines/startrek/rooms | |
parent | 28debc6673eb51b764d4d8229a596740df8ec7f5 (diff) | |
download | scummvm-rg350-933d21429fdb3cc1c97237bbee1cd2168c33d95f.tar.gz scummvm-rg350-933d21429fdb3cc1c97237bbee1cd2168c33d95f.tar.bz2 scummvm-rg350-933d21429fdb3cc1c97237bbee1cd2168c33d95f.zip |
STARTREK: LOVE1
Diffstat (limited to 'engines/startrek/rooms')
-rw-r--r-- | engines/startrek/rooms/function_map.h | 138 | ||||
-rw-r--r-- | engines/startrek/rooms/love0.cpp | 2 | ||||
-rw-r--r-- | engines/startrek/rooms/love1.cpp | 661 | ||||
-rw-r--r-- | engines/startrek/rooms/love2.cpp | 35 | ||||
-rw-r--r-- | engines/startrek/rooms/love3.cpp | 35 | ||||
-rw-r--r-- | engines/startrek/rooms/love4.cpp | 35 | ||||
-rw-r--r-- | engines/startrek/rooms/love5.cpp | 35 |
7 files changed, 940 insertions, 1 deletions
diff --git a/engines/startrek/rooms/function_map.h b/engines/startrek/rooms/function_map.h index dcf8bf3545..a1cb9286cb 100644 --- a/engines/startrek/rooms/function_map.h +++ b/engines/startrek/rooms/function_map.h @@ -823,6 +823,144 @@ RoomAction love0ActionList[] = { // unused, but I'm not sure how it's run. }; +RoomAction love1ActionList[] = { + { Action(ACTION_TICK, 1, 0, 0), &Room::love1Tick1 }, + + { Action(ACTION_WALK, 10, 0, 0), &Room::love1WalkToDoor3 }, + { Action(ACTION_WALK, 0x26, 0, 0), &Room::love1WalkToDoor3 }, + { Action(ACTION_TOUCHED_HOTSPOT, 1, 0, 0), &Room::love1OpenDoor3 }, + { Action(ACTION_FINISHED_WALKING, 15, 0, 0), &Room::love1ReachedDoor3 }, + { Action(ACTION_FINISHED_ANIMATION, 2, 0, 0), &Room::love1ReachedDoor3 }, + + { Action(ACTION_WALK, 8, 0, 0), &Room::love1WalkToDoor1 }, + { Action(ACTION_WALK, 0x27, 0, 0), &Room::love1WalkToDoor1 }, + { Action(ACTION_TOUCHED_HOTSPOT, 2, 0, 0), &Room::love1OpenDoor1 }, + { Action(ACTION_FINISHED_WALKING, 16, 0, 0), &Room::love1ReachedDoor1 }, + { Action(ACTION_FINISHED_ANIMATION, 3, 0, 0), &Room::love1ReachedDoor1 }, + + { Action(ACTION_WALK, 9, 0, 0), &Room::love1WalkToDoor2 }, + { Action(ACTION_WALK, 0x28, 0, 0), &Room::love1WalkToDoor2 }, + { Action(ACTION_TOUCHED_HOTSPOT, 3, 0, 0), &Room::love1OpenDoor2 }, + { Action(ACTION_FINISHED_WALKING, 17, 0, 0), &Room::love1ReachedDoor2 }, + { Action(ACTION_FINISHED_ANIMATION, 4, 0, 0), &Room::love1ReachedDoor2 }, + + { Action(ACTION_LOOK, 0x25, 0, 0), &Room::love1LookAtLaser }, + { Action(ACTION_LOOK, OBJECT_KIRK, 0, 0), &Room::love1LookAtKirk }, + { Action(ACTION_LOOK, OBJECT_SPOCK, 0, 0), &Room::love1LookAtSpock }, + { Action(ACTION_LOOK, OBJECT_MCCOY, 0, 0), &Room::love1LookAtMccoy }, + { Action(ACTION_LOOK, OBJECT_REDSHIRT, 0, 0), &Room::love1LookAtRedshirt }, + { Action(ACTION_LOOK, -1, 0, 0), &Room::love1LookAnywhere }, + { Action(ACTION_LOOK, 15, 0, 0), &Room::love1LookAtNozzle }, + { Action(ACTION_LOOK, 0x24, 0, 0), &Room::love1LookAtNozzle }, + { Action(ACTION_LOOK, 0x20, 0, 0), &Room::love1LookAtLadder }, + { Action(ACTION_LOOK, 9, 0, 0), &Room::love1LookAtDoor1Or2 }, + { Action(ACTION_LOOK, 8, 0, 0), &Room::love1LookAtDoor1Or2 }, + { Action(ACTION_LOOK, 10, 0, 0), &Room::love1LookAtDoor3 }, + { Action(ACTION_LOOK, 0x21, 0, 0), &Room::love1LookAtDistillator }, + { Action(ACTION_LOOK, 14, 0, 0), &Room::love1LookAtChamber }, + { Action(ACTION_LOOK, 12, 0, 0), &Room::love1LookAtChamber }, + { Action(ACTION_LOOK, 0x23, 0, 0), &Room::love1LookAtReplicator }, + { Action(ACTION_LOOK, 11, 0, 0), &Room::love1LookAtFreezer }, + { Action(ACTION_LOOK, 0x22, 0, 0), &Room::love1LookAtFreezer }, + { Action(ACTION_LOOK, OBJECT_IDISHES, 0, 0), &Room::love1LookAtDishes }, + { Action(ACTION_TALK, OBJECT_KIRK, 0, 0), &Room::love1TalkToKirk }, + { Action(ACTION_TALK, OBJECT_SPOCK, 0, 0), &Room::love1TalkToSpock }, + { Action(ACTION_TALK, OBJECT_MCCOY, 0, 0), &Room::love1TalkToMccoy }, + { Action(ACTION_TALK, OBJECT_REDSHIRT, 0, 0), &Room::love1TalkToRedshirt }, + { Action(ACTION_USE, OBJECT_IMTRICOR, OBJECT_IDISHES, 0), &Room::love1UseMTricorderOnDishes }, + { Action(ACTION_USE, OBJECT_IMTRICOR, -1, 0), &Room::love1UseMTricorderAnywhere }, + { Action(ACTION_USE, OBJECT_ISTRICOR, 0x23, 0), &Room::love1UseSTricorderOnReplicator }, + { Action(ACTION_USE, OBJECT_ISTRICOR, 12, 0), &Room::love1UseSTricorderOnReplicator }, + { Action(ACTION_USE, OBJECT_SPOCK, 0x25, 0), &Room::love1UseSTricorderOnLaser }, + { Action(ACTION_USE, OBJECT_ISTRICOR, 0x25, 0), &Room::love1UseSTricorderOnLaser }, + { Action(ACTION_USE, OBJECT_ISTRICOR, 0x22, 0), &Room::love1UseSTricorderOnFreezer }, + { Action(ACTION_USE, OBJECT_ISTRICOR, -1, 0), &Room::love1UseSTricorderAnywhere }, + { Action(ACTION_USE, OBJECT_ISTRICOR, OBJECT_IDISHES, 0), &Room::love1UseSTricorderOnDishes }, + { Action(ACTION_USE, OBJECT_ISTRICOR, 0x21, 0), &Room::love1UseSTricorderOnDistillator }, + { Action(ACTION_GET, 11, 0, 0), &Room::love1GetFreezer }, + { Action(ACTION_GET, 0x22, 0, 0), &Room::love1GetFreezer }, + { Action(ACTION_FINISHED_WALKING, 14, 0, 0), &Room::love1KirkReachedFreezer }, + { Action(ACTION_FINISHED_ANIMATION, 9, 0, 0), &Room::love1KirkGotVirusCulture }, + { Action(ACTION_GET, 14, 0, 0), &Room::love1GetFromChamber }, + { Action(ACTION_GET, 12, 0, 0), &Room::love1GetFromChamber }, + { Action(ACTION_GET, 0x23, 0, 0), &Room::love1GetFromChamber }, + { Action(ACTION_FINISHED_WALKING, 8, 0, 0), &Room::love1KirkReachedChamber }, + { Action(ACTION_FINISHED_ANIMATION, 10, 0, 0), &Room::love1KirkGotCureSample }, + { Action(ACTION_GET, 15, 0, 0), &Room::love1GetFromNozzle }, + { Action(ACTION_GET, 0x24, 0, 0), &Room::love1GetFromNozzle }, + { Action(ACTION_FINISHED_WALKING, 2, 0, 0), &Room::love1KirkReachedNozzleToGet }, + { Action(ACTION_FINISHED_ANIMATION, 11, 0, 0), &Room::love1KirkGotBottleFromNozzle }, + { Action(ACTION_USE, OBJECT_IN2O, 0x24, 0), &Room::love1UseN2OOnNozzle }, + { Action(ACTION_USE, OBJECT_IH2O, 0x24, 0), &Room::love1UseH2OOnNozzle }, + { Action(ACTION_USE, OBJECT_INH3, 0x24, 0), &Room::love1UseNH3OnNozzle }, + { Action(ACTION_USE, OBJECT_IRLG, 0x24, 0), &Room::love1UseRLGOnNozzle }, + { Action(ACTION_FINISHED_WALKING, 3, 0, 0), &Room::love1KirkReachedNozzleToPut }, + { Action(ACTION_FINISHED_ANIMATION, 12, 0, 0), &Room::love1KirkPutBottleInNozzle }, + { Action(ACTION_USE, -1, 0x24, 0), &Room::love1UseAnthingOnNozzle }, + { Action(ACTION_USE, OBJECT_SPOCK, 0x23, 0), &Room::love1UseSpockOnReplicator }, + { Action(ACTION_USE, OBJECT_REDSHIRT, 0x23, 0), &Room::love1UseRedshirtOnReplicator }, + { Action(ACTION_USE, OBJECT_MCCOY, 14, 0), &Room::love1UseMccoyOnReplicator }, + { Action(ACTION_USE, OBJECT_MCCOY, 15, 0), &Room::love1UseMccoyOnReplicator }, + { Action(ACTION_USE, OBJECT_MCCOY, 0x23, 0), &Room::love1UseMccoyOnReplicator }, + { Action(ACTION_FINISHED_WALKING, 4, 0, 0), &Room::love1MccoyReachedReplicator }, + { Action(ACTION_FINISHED_ANIMATION, 13, 0, 0), &Room::love1MccoyUsedReplicator }, + { Action(ACTION_FINISHED_ANIMATION, 7, 0, 0), &Room::love1ChamberClosed }, + { Action(ACTION_FINISHED_ANIMATION, 8, 0, 0), &Room::love1ChamberOpened }, + { Action(ACTION_USE, -1, 12, 0), &Room::love1UseAnythingOnChamber }, + { Action(ACTION_USE, OBJECT_IDISHES, 12, 0), &Room::love1UseDishesOnChamber }, + { Action(ACTION_USE, OBJECT_IDISHES, 0x23, 0), &Room::love1UseDishesOnChamber }, + { Action(ACTION_FINISHED_WALKING, 5, 0, 0), &Room::love1KirkReachedChamberToPut }, + { Action(ACTION_FINISHED_ANIMATION, 1, 0, 0), &Room::love1ChamberOpenedForDish }, + { Action(ACTION_FINISHED_ANIMATION, 14, 0, 0), &Room::love1KirkPutDishInChamber }, + { Action(ACTION_USE, OBJECT_IINSULAT, 0x21, 0), &Room::love1UseInsulationOnDistillator }, + { Action(ACTION_FINISHED_WALKING, 6, 0, 0), &Room::love1KirkReachedDistillator }, + { Action(ACTION_FINISHED_ANIMATION, 15, 0, 0), &Room::love1KirkGotPolyberylcarbonate }, + { Action(ACTION_USE, OBJECT_KIRK, 0x22, 0), &Room::love1UseKirkOnFreezer }, + { Action(ACTION_USE, OBJECT_KIRK, 11, 0), &Room::love1UseKirkOnFreezer }, + { Action(ACTION_USE, OBJECT_REDSHIRT, 0x22, 0), &Room::love1UseRedshirtOnFreezer }, + { Action(ACTION_USE, OBJECT_REDSHIRT, 11, 0), &Room::love1UseRedshirtOnFreezer }, + { Action(ACTION_USE, OBJECT_SPOCK, 0x22, 0), &Room::love1UseSpockOnFreezer }, + { Action(ACTION_USE, OBJECT_SPOCK, 11, 0), &Room::love1UseSpockOnFreezer }, + { Action(ACTION_USE, OBJECT_MCCOY, 0x22, 0), &Room::love1UseMccoyOnFreezer }, + { Action(ACTION_USE, OBJECT_MCCOY, 11, 0), &Room::love1UseMccoyOnFreezer }, + { Action(ACTION_FINISHED_WALKING, 7, 0, 0), &Room::love1CrewmanReachedFreezer }, + { Action(ACTION_FINISHED_ANIMATION, 16, 0, 0), &Room::love1CrewmanOpenedOrClosedFreezer }, + { Action(ACTION_USE, -1, 0x22, 0), &Room::love1UseAnythingOnFreezer }, + { Action(ACTION_FINISHED_WALKING, 11, 0, 0), &Room::love1ReachedFreezerWithArbitraryItem }, + { Action(ACTION_FINISHED_ANIMATION, 17, 0, 0), &Room::love1FinishedUsingArbitraryItemOnFreezer }, + { Action(ACTION_USE, -1, 0x23, 0), &Room::love1UseAnythingOnReplicator }, + { Action(ACTION_FINISHED_WALKING, 12, 0, 0), &Room::love1ReachedReplicatorWithArbitraryItem }, + { Action(ACTION_FINISHED_ANIMATION, 18, 0, 0), &Room::love1FinishedUsingArbitraryItemOnReplicator }, + { Action(ACTION_USE, -1, 0x21, 0), &Room::love1UseAnythingOnDistillator }, + { Action(ACTION_FINISHED_WALKING, 13, 0, 0), &Room::love1ReachedDistillatorWithArbitraryItem }, + { Action(ACTION_FINISHED_ANIMATION, 19, 0, 0), &Room::love1FinishedUsingArbitraryItemOnDistillator }, + { Action(ACTION_USE, OBJECT_KIRK, 0x20, 0), &Room::love1UseKirkOnLadder }, + { Action(ACTION_USE, OBJECT_SPOCK, 0x20, 0), &Room::love1UseSpockOnLadder }, + { Action(ACTION_USE, OBJECT_MCCOY, 0x20, 0), &Room::love1UseMccoyOnLadder }, + { Action(ACTION_USE, OBJECT_REDSHIRT, 0x20, 0), &Room::love1UseRedshirtOnLadder }, + { Action(ACTION_FINISHED_WALKING, 1, 0, 0), &Room::love1CrewmanReachedLadder }, + { Action(ACTION_FINISHED_ANIMATION, 6, 0, 0), &Room::love1CrewmanDiedFromPhaser }, + { Action(ACTION_TOUCHED_HOTSPOT, 0, 0, 0), &Room::love1TouchedHotspot0 }, + // TODO: common code +}; + +RoomAction love2ActionList[] = { + { Action(ACTION_TICK, 1, 0, 0), &Room::love2Tick1 }, +}; + +RoomAction love3ActionList[] = { + { Action(ACTION_TICK, 1, 0, 0), &Room::love3Tick1 }, +}; + +RoomAction love4ActionList[] = { + { Action(ACTION_TICK, 1, 0, 0), &Room::love4Tick1 }, +}; + +RoomAction love5ActionList[] = { + { Action(ACTION_TICK, 1, 0, 0), &Room::love5Tick1 }, +}; + + } #endif diff --git a/engines/startrek/rooms/love0.cpp b/engines/startrek/rooms/love0.cpp index 7ab161a8c4..e4e3932944 100644 --- a/engines/startrek/rooms/love0.cpp +++ b/engines/startrek/rooms/love0.cpp @@ -91,7 +91,7 @@ void Room::love0OpenDoor1() { void Room::love0ReachedDoor1() { _roomVar.love0.door1OpenCounter++; if (_roomVar.love0.door1OpenCounter == 2) - loadRoomIndex(3, 1); + loadRoomIndex(1, 3); } void Room::love0LookAtConsole() { diff --git a/engines/startrek/rooms/love1.cpp b/engines/startrek/rooms/love1.cpp new file mode 100644 index 0000000000..509f35f882 --- /dev/null +++ b/engines/startrek/rooms/love1.cpp @@ -0,0 +1,661 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "startrek/room.h" + +#define OBJECT_DOOR1 8 +#define OBJECT_DOOR2 9 +#define OBJECT_DOOR3 10 +#define OBJECT_FREEZER 11 +#define OBJECT_CHAMBER 12 +#define OBJECT_PHASERSHOT 13 +#define OBJECT_DISH_IN_CHAMBER 14 +#define OBJECT_BOTTLE 15 + +#define HOTSPOT_LADDER 0x20 +#define HOTSPOT_DISTILLATOR 0x21 +#define HOTSPOT_FREEZER 0x22 +#define HOTSPOT_REPLICATOR 0x23 +#define HOTSPOT_NOZZLE 0x24 +#define HOTSPOT_LASER 0x25 +#define HOTSPOT_DOOR3 0x26 +#define HOTSPOT_DOOR1 0x27 +#define HOTSPOT_DOOR2 0x28 + +namespace StarTrek { + +void Room::love1Tick1() { + playVoc("LOV1LOOP"); + + if (_vm->_awayMission.love.freezerOpen) + loadActorAnim(OBJECT_FREEZER, "s3r2d4o", 0x67, 0x8d, 0); + + if (_vm->_awayMission.love.chamberHasDish) + loadActorAnim(OBJECT_CHAMBER, "s3r2d5o", 0xb4, 0x75, 0); + else + loadActorAnim(OBJECT_CHAMBER, "s3r2d5c", 0xb4, 0x75, 0); + + if (_vm->_awayMission.love.chamberHasDish) + loadActorAnim(OBJECT_DISH_IN_CHAMBER, "dishes", 0xb4, 0x71, 0); + + switch (_vm->_awayMission.love.bottleInNozzle) { + case BOTTLETYPE_N2O: + strcpy(_roomVar.love1.bottleAnimation, "btle1"); + _roomVar.love1.itemInNozzle = OBJECT_IN2O; + goto common; + case BOTTLETYPE_NH3: + strcpy(_roomVar.love1.bottleAnimation, "btle2"); + _roomVar.love1.itemInNozzle = OBJECT_INH3; + goto common; + case BOTTLETYPE_H2O: + strcpy(_roomVar.love1.bottleAnimation, "btle3"); + _roomVar.love1.itemInNozzle = OBJECT_IH2O; + goto common; + case BOTTLETYPE_RLG: + strcpy(_roomVar.love1.bottleAnimation, "btle4"); + _roomVar.love1.itemInNozzle = OBJECT_IRLG; + goto common; + +common: + loadActorAnim(OBJECT_BOTTLE, _roomVar.love1.bottleAnimation, 0xa3, 0x72, 0); + // fall through + + case BOTTLETYPE_NONE: + if (_vm->_awayMission.love.field2c) + _vm->_awayMission.timers[0] = getRandomWordInRange(200, 400); + break; + } + + if (_vm->_awayMission.love.field2d) + _vm->_awayMission.timers[1] = getRandomWordInRange(200, 400); + _vm->_awayMission.timers[2] = 200; + + loadActorAnim(OBJECT_DOOR3, "s3r2d3a", 0xdb, 0x7e, 0); + loadActorAnim(OBJECT_DOOR1, "s3r2d1a", 0, 0, 0); + loadActorAnim(OBJECT_DOOR2, "s3r2d2a", 0, 0, 0); + + _roomVar.love1._1d2a = 0x90; + _roomVar.love1._1d2b = 0xa7; +} + +void Room::love1WalkToDoor3() { + _vm->_awayMission.disableInput = true; + _roomVar.love1.walkingToDoor = true; + walkCrewman(OBJECT_KIRK, 0xd9, 0x81, 15); +} + +void Room::love1OpenDoor3() { + if (_roomVar.love1.walkingToDoor) { + loadActorAnim(OBJECT_DOOR3, "s3r2d3", 0xdb, 0x7e, 2); + playSoundEffectIndex(SND_DOOR1); + } +} + +// Door 3 opened, or door 3 reached (both must occur before transition happens) +void Room::love1ReachedDoor3() { + _roomVar.love1.door3OpenCounter++; + if (_roomVar.love1.door3OpenCounter == 2) + loadRoomIndex(3, 1); +} + +void Room::love1WalkToDoor1() { + _vm->_awayMission.disableInput = true; + _roomVar.love1.walkingToDoor = true; + walkCrewman(OBJECT_KIRK, 0x42, 0x97, 16); +} + +void Room::love1OpenDoor1() { + if (_roomVar.love1.walkingToDoor) { + loadActorAnim(OBJECT_DOOR1, "s3r2d1", 0, 0, 3); + playSoundEffectIndex(SND_DOOR1); + } +} + +// Door 1 opened, or door 1 reached +void Room::love1ReachedDoor1() { + _roomVar.love1.door1OpenCounter++; + if (_roomVar.love1.door1OpenCounter == 2) + loadRoomIndex(0, 2); +} + +void Room::love1WalkToDoor2() { + _vm->_awayMission.disableInput = true; + _roomVar.love1.walkingToDoor = true; + walkCrewman(OBJECT_KIRK, 0x79, 0x85, 17); +} + +void Room::love1OpenDoor2() { + if (_roomVar.love1.walkingToDoor) { + loadActorAnim(OBJECT_DOOR2, "s3r2d2", 0, 0, 4); + playSoundEffectIndex(SND_DOOR1); + } +} + +// Door 2 opened, or door 2 reached +void Room::love1ReachedDoor2() { + _roomVar.love1.door2OpenCounter++; + if (_roomVar.love1.door2OpenCounter == 2) + loadRoomIndex(2, 0); +} + +void Room::love1LookAtLaser() { + showText(TX_LOV1N000); +} + +void Room::love1LookAtKirk() { + showText(TX_LOV1N003); +} + +void Room::love1LookAtSpock() { + showText(TX_LOV1N004); +} + +void Room::love1LookAtMccoy() { + showText(TX_LOV1N001); +} + +void Room::love1LookAtRedshirt() { + showText(TX_LOV1N002); +} + +void Room::love1LookAnywhere() { + showText(TX_LOV1N019); +} + +void Room::love1LookAtNozzle() { + showText(TX_LOV1N022); +} + +void Room::love1LookAtLadder() { + showText(TX_LOV1N021); +} + +void Room::love1LookAtDoor1Or2() { + showText(TX_LOV1N020); +} + +void Room::love1LookAtDoor3() { + showText(TX_LOV1N017); +} + +void Room::love1LookAtDistillator() { + showText(TX_LOV1N016); +} + +void Room::love1LookAtChamber() { + if (_vm->_awayMission.love.chamberHasCure) + showText(TX_LOV1N013); + else + showText(TX_LOV1N014); +} + +void Room::love1LookAtReplicator() { + showText(TX_LOV1N015); +} + +void Room::love1LookAtFreezer() { + if (_vm->_awayMission.love.freezerOpen) + showText(TX_LOV1N023); + else + showText(TX_LOV1N018); +} + +void Room::love1LookAtDishes() { + showText(TX_LOV1N012); +} + +void Room::love1TalkToKirk() { + showText(TX_SPEAKER_KIRK, TX_LOV1_001); +} + +void Room::love1TalkToSpock() { + showText(TX_SPEAKER_SPOCK, TX_LOV1_005); +} + +void Room::love1TalkToMccoy() { + showText(TX_SPEAKER_MCCOY, TX_LOV1_011); +} + +void Room::love1TalkToRedshirt() { + showText(TX_SPEAKER_FERRIS, TX_LOV1_027); +} + +void Room::love1UseMTricorderOnDishes() { + mccoyScan(DIR_W, TX_LOV1_017, false); + // TODO: only works in this room, despite being inventory item? +} + +void Room::love1UseMTricorderAnywhere() { + if (_vm->_awayMission.love.knowAboutVirus) + mccoyScan(DIR_S, TX_LOV1_009, false); + else + mccoyScan(DIR_S, TX_LOV1_010, false); +} + +void Room::love1UseSTricorderOnReplicator() { + spockScan(DIR_N, TX_LOV1_022, false); +} + +void Room::love1UseSTricorderOnLaser() { + spockScan(DIR_E, TX_LOV1_006, false); +} + +void Room::love1UseSTricorderOnFreezer() { + spockScan(DIR_W, TX_LOV1_023, false); +} + +void Room::love1UseSTricorderAnywhere() { + spockScan(DIR_S, TX_LOV1_003, false); +} + +void Room::love1UseSTricorderOnDishes() { + spockScan(DIR_W, TX_LOV1_004, false); + // TODO: only works in this room, despite being inventory item? +} + +void Room::love1UseSTricorderOnDistillator() { + spockScan(DIR_S, TX_LOV1_007, false); +} + +void Room::love1GetFreezer() { + walkCrewman(OBJECT_KIRK, 0x71, 0x8e, 14); +} + +void Room::love1KirkReachedFreezer() { + if (_vm->_awayMission.love.freezerOpen) + loadActorAnim2(OBJECT_KIRK, "kusehw", -1, -1, 9); + else + showText(TX_LOV1N010); +} + +void Room::love1KirkGotVirusCulture() { + giveItem(OBJECT_IDISHES); + showText(TX_LOV1N006); +} + +void Room::love1GetFromChamber() { + if (!_vm->_awayMission.love.chamberHasDish) + showText(TX_LOV1N009); + else + walkCrewman(OBJECT_KIRK, 0xb5, 0x8c, 8); +} + +void Room::love1KirkReachedChamber() { + loadActorAnim2(OBJECT_KIRK, "kusemn", -1, -1, 10); +} + +void Room::love1KirkGotCureSample() { + if (_vm->_awayMission.love.chamberHasCure) { + giveItem(OBJECT_ISAMPLE); + showText(TX_LOV1N035); + } + else { + giveItem(OBJECT_IDISHES); + showText(TX_LOV1N006); + } + + loadActorStandAnim(OBJECT_DISH_IN_CHAMBER); + loadActorAnim2(OBJECT_CHAMBER, "s3r2d6", 0xb4, 0x75, 0); + playSoundEffectIndex(SND_DOOR1); + _vm->_awayMission.love.chamberHasDish = false; +} + +void Room::love1GetFromNozzle() { + walkCrewman(OBJECT_KIRK, 0xa6, 0x90, 2); +} + +void Room::love1KirkReachedNozzleToGet() { + if (_vm->_awayMission.love.bottleInNozzle == 0) + loadActorAnim2(OBJECT_KIRK, "kusemn", -1, -1, 11); + else + showText(TX_LOV1N011); +} + +void Room::love1KirkGotBottleFromNozzle() { + switch (_vm->_awayMission.love.bottleInNozzle) { + case BOTTLETYPE_N2O: + giveItem(OBJECT_IN2O); + break; + case BOTTLETYPE_NH3: + giveItem(OBJECT_INH3); + break; + case BOTTLETYPE_H2O: + giveItem(OBJECT_IH2O); + break; + case BOTTLETYPE_RLG: + giveItem(OBJECT_IRLG); + break; + default: + showText(TX_DIALOG_ERROR); + break; + } + + _vm->_awayMission.love.bottleInNozzle = BOTTLETYPE_NONE; + loadActorStandAnim(OBJECT_BOTTLE); + showText(TX_LOV1N007); + _roomVar.love1.itemInNozzle = 0; +} + +void Room::love1UseN2OOnNozzle() { + if (_vm->_awayMission.love.bottleInNozzle == BOTTLETYPE_NONE) { + _roomVar.love1.itemInNozzle = OBJECT_IN2O; + strcpy(_roomVar.love1.bottleAnimation, "btle1"); + _vm->_awayMission.love.bottleInNozzle = BOTTLETYPE_N2O; + walkCrewman(OBJECT_KIRK, 0xa6, 0x90, 3); + } +} + +void Room::love1UseH2OOnNozzle() { + if (_vm->_awayMission.love.bottleInNozzle == BOTTLETYPE_NONE) { + _roomVar.love1.itemInNozzle = OBJECT_IH2O; + strcpy(_roomVar.love1.bottleAnimation, "btle3"); + _vm->_awayMission.love.bottleInNozzle = BOTTLETYPE_H2O; + walkCrewman(OBJECT_KIRK, 0xa6, 0x90, 3); + } +} + +void Room::love1UseNH3OnNozzle() { + if (_vm->_awayMission.love.bottleInNozzle == BOTTLETYPE_NONE) { + _roomVar.love1.itemInNozzle = OBJECT_INH3; + strcpy(_roomVar.love1.bottleAnimation, "btle2"); + _vm->_awayMission.love.bottleInNozzle = BOTTLETYPE_NH3; + walkCrewman(OBJECT_KIRK, 0xa6, 0x90, 3); + } +} + +void Room::love1UseRLGOnNozzle() { + if (_vm->_awayMission.love.bottleInNozzle == BOTTLETYPE_NONE) { + _roomVar.love1.itemInNozzle = OBJECT_IRLG; + strcpy(_roomVar.love1.bottleAnimation, "btle4"); + _vm->_awayMission.love.bottleInNozzle = BOTTLETYPE_RLG; + walkCrewman(OBJECT_KIRK, 0xa6, 0x90, 3); + } +} + +void Room::love1KirkReachedNozzleToPut() { + loadActorAnim2(OBJECT_KIRK, "kusemn", -1, -1, 12); +} + +void Room::love1KirkPutBottleInNozzle() { + loadActorAnim(OBJECT_BOTTLE, _roomVar.love1.bottleAnimation, 0xa3, 0x72, 0); + loseItem(_roomVar.love1.itemInNozzle); +} + +void Room::love1UseAnthingOnNozzle() { + showText(TX_SPEAKER_MCCOY, TX_LOV1_012); +} + +void Room::love1UseSpockOnReplicator() { + showText(TX_SPEAKER_SPOCK, TX_LOV1_002); +} + +void Room::love1UseRedshirtOnReplicator() { + showText(TX_SPEAKER_FERRIS, TX_LOV1_026); +} + +void Room::love1UseMccoyOnReplicator() { + walkCrewman(OBJECT_MCCOY, 0xb1, 0x8c, 4); +} + +void Room::love1MccoyReachedReplicator() { + if (_vm->_awayMission.love.bottleInNozzle == BOTTLETYPE_NONE) { + showText(TX_SPEAKER_MCCOY, TX_LOV1_021); + walkCrewman(OBJECT_MCCOY, 0xbf, 0x98, 0); + } + else if (!_vm->_awayMission.love.chamberHasDish) { + showText(TX_SPEAKER_MCCOY, TX_LOV1_015); + walkCrewman(OBJECT_MCCOY, 0xbf, 0x98, 0); + } + else + loadActorAnim2(OBJECT_MCCOY, "musehn", -1, -1, 13); +} + +void Room::love1MccoyUsedReplicator() { + if (_roomVar.love1.itemInNozzle == OBJECT_INH3) { + loadActorStandAnim(OBJECT_DISH_IN_CHAMBER); + loadActorAnim2(OBJECT_CHAMBER, "s3r2d6", 0xb4, 0x75, 7); + playSoundEffectIndex(SND_DOOR1); + walkCrewman(OBJECT_MCCOY, 0xbf, 0x98, 0); + } + else { + showText(TX_SPEAKER_MCCOY, TX_LOV1_019); + walkCrewman(OBJECT_MCCOY, 0xbf, 0x98, 0); + } +} + +void Room::love1ChamberClosed() { + loadActorAnim2(OBJECT_CHAMBER, "s3r2d5", 0xb4, 0x75, 8); + playSoundEffectIndex(SND_DOOR1); +} + +void Room::love1ChamberOpened() { + loadActorAnim(OBJECT_DISH_IN_CHAMBER, "dishes", 0xb4, 0x71, 0); + showText(TX_SPEAKER_MCCOY, TX_LOV1_018); + _vm->_awayMission.love.chamberHasCure = true; +} + +void Room::love1UseAnythingOnChamber() { + showText(TX_SPEAKER_MCCOY, TX_LOV1_013); +} + +void Room::love1UseDishesOnChamber() { + walkCrewman(OBJECT_KIRK, 0xb3, 0x8c, 5); +} + +void Room::love1KirkReachedChamberToPut() { + if (_vm->_awayMission.love.chamberHasDish) + showText(TX_LOV1_014); // TODO: test + else { + loadActorAnim(OBJECT_CHAMBER, "s3r2d5", 0xb4, 0x75, 1); + playSoundEffectIndex(SND_DOOR1); + } +} + +void Room::love1ChamberOpenedForDish() { + loadActorAnim2(OBJECT_KIRK, "kusemn", -1, -1, 14); +} + +void Room::love1KirkPutDishInChamber() { + loadActorAnim(OBJECT_DISH_IN_CHAMBER, "dishes", 0xb4, 0x71, 0); + loseItem(OBJECT_IDISHES); + _vm->_awayMission.love.chamberHasDish = true; +} + +void Room::love1UseInsulationOnDistillator() { + walkCrewman(OBJECT_KIRK, 0xbe, 0xc1, 6); +} + +void Room::love1KirkReachedDistillator() { + loadActorAnim2(OBJECT_KIRK, "kusemn", -1, -1, 15); + playVoc("LD1PROCE"); +} + +void Room::love1KirkGotPolyberylcarbonate() { + // Result of using insulation on distillator + showText(TX_LOV1N034); + if (!_vm->_awayMission.love.gotPolyberylcarbonate) { + _vm->_awayMission.love.gotPolyberylcarbonate = true; + _vm->_awayMission.love.missionScore++; + } + + giveItem(OBJECT_IPBC); + loseItem(OBJECT_IINSULAT); +} + +void Room::love1UseKirkOnFreezer() { + _roomVar.love1.crewmanUsingFreezerRetY = 0xa0; + _roomVar.love1.crewmanUsingFreezerRetX = 0x96; + _roomVar.love1.crewmanUsingDevice = OBJECT_KIRK; + walkCrewman(_roomVar.love1.crewmanUsingDevice, 0x71, 0x8e, 7); + _vm->_awayMission.disableInput = true; +} + +void Room::love1UseRedshirtOnFreezer() { + _roomVar.love1.crewmanUsingFreezerRetY = 0x89; + _roomVar.love1.crewmanUsingFreezerRetX = 0x95; + _roomVar.love1.crewmanUsingDevice = OBJECT_REDSHIRT; + walkCrewman(_roomVar.love1.crewmanUsingDevice, 0x71, 0x8e, 7); + _vm->_awayMission.disableInput = true; +} + +void Room::love1UseSpockOnFreezer() { + _roomVar.love1.crewmanUsingFreezerRetY = 0xa9; + _roomVar.love1.crewmanUsingFreezerRetX = 0x61; + _roomVar.love1.crewmanUsingDevice = OBJECT_SPOCK; + walkCrewman(_roomVar.love1.crewmanUsingDevice, 0x71, 0x8e, 7); + _vm->_awayMission.disableInput = true; +} + +void Room::love1UseMccoyOnFreezer() { + _roomVar.love1.crewmanUsingFreezerRetY = 0x98; + _roomVar.love1.crewmanUsingFreezerRetX = 0xbf; + _roomVar.love1.crewmanUsingDevice = OBJECT_MCCOY; + walkCrewman(_roomVar.love1.crewmanUsingDevice, 0x71, 0x8e, 7); + _vm->_awayMission.disableInput = true; +} + +void Room::love1CrewmanReachedFreezer() { + Common::String useAnim = _vm->getCrewmanAnimFilename(_roomVar.love1.crewmanUsingDevice, "usehw"); + + loadActorAnim2(_roomVar.love1.crewmanUsingDevice, useAnim, -1, -1, 16); +} + +void Room::love1CrewmanOpenedOrClosedFreezer() { + if (_vm->_awayMission.love.freezerOpen) + loadActorAnim(OBJECT_FREEZER, "s3r2d4a", 0x67, 0x8d, 0); + else + loadActorAnim(OBJECT_FREEZER, "s3r2d4", 0x67, 0x8d, 0); + + playSoundEffectIndex(SND_DOOR1); + _vm->_awayMission.love.freezerOpen = !_vm->_awayMission.love.freezerOpen; + + walkCrewman(_roomVar.love1.crewmanUsingDevice, _roomVar.love1.crewmanUsingFreezerRetX, _roomVar.love1.crewmanUsingFreezerRetY, 0); + _vm->_awayMission.disableInput = false; +} + +void Room::love1UseAnythingOnFreezer() { + walkCrewman(OBJECT_KIRK, 0x6f, 0x8e, 11); +} + +void Room::love1ReachedFreezerWithArbitraryItem() { + loadActorAnim2(OBJECT_KIRK, "kusemw", -1, -1, 17); +} + +void Room::love1FinishedUsingArbitraryItemOnFreezer() { + showText(TX_LOV1N008); +} + +void Room::love1UseAnythingOnReplicator() { + walkCrewman(OBJECT_KIRK, 0xb5, 0x8c, 12); +} + +void Room::love1ReachedReplicatorWithArbitraryItem() { + loadActorAnim2(OBJECT_KIRK, "kusemn", -1, -1, 18); +} + +void Room::love1FinishedUsingArbitraryItemOnReplicator() { + showText(TX_SPEAKER_MCCOY, TX_LOV1_016); +} + +void Room::love1UseAnythingOnDistillator() { + walkCrewman(OBJECT_KIRK, 0xc2, 0xb2, 13); +} + +void Room::love1ReachedDistillatorWithArbitraryItem() { + loadActorAnim2(OBJECT_KIRK, "kuseme", -1, -1, 19); +} + +void Room::love1FinishedUsingArbitraryItemOnDistillator() { + showText(TX_SPEAKER_MCCOY, TX_LOV1_008); +} + +void Room::love1UseKirkOnLadder() { + _roomVar.love1.crewmanUsingDevice = OBJECT_KIRK; + _vm->_awayMission.crewDirectionsAfterWalk[_roomVar.love1.crewmanUsingDevice] = DIR_N; + walkCrewman(_roomVar.love1.crewmanUsingDevice, 0x102, 0x89, 1); + _vm->_awayMission.disableInput = true; +} + +void Room::love1UseSpockOnLadder() { + _roomVar.love1.crewmanUsingDevice = OBJECT_SPOCK; + _vm->_awayMission.crewDirectionsAfterWalk[_roomVar.love1.crewmanUsingDevice] = DIR_N; + walkCrewman(_roomVar.love1.crewmanUsingDevice, 0x102, 0x89, 1); + _vm->_awayMission.disableInput = true; +} + +void Room::love1UseMccoyOnLadder() { + _roomVar.love1.crewmanUsingDevice = OBJECT_MCCOY; + _vm->_awayMission.crewDirectionsAfterWalk[_roomVar.love1.crewmanUsingDevice] = DIR_N; + walkCrewman(_roomVar.love1.crewmanUsingDevice, 0x102, 0x89, 1); + _vm->_awayMission.disableInput = true; +} + +void Room::love1UseRedshirtOnLadder() { + _roomVar.love1.crewmanUsingDevice = OBJECT_REDSHIRT; + _vm->_awayMission.crewDirectionsAfterWalk[_roomVar.love1.crewmanUsingDevice] = DIR_N; + walkCrewman(_roomVar.love1.crewmanUsingDevice, 0x102, 0x89, 1); + _vm->_awayMission.disableInput = true; +} + +void Room::love1CrewmanReachedLadder() { + const int32 speakers[] = { + TX_SPEAKER_KIRK, + TX_SPEAKER_SPOCK, + TX_SPEAKER_MCCOY, + TX_SPEAKER_FERRIS + }; + + if (_vm->_awayMission.love.field2b || _vm->_awayMission.love.field41) // Romulans unconscious + loadRoomIndex(4, 3); + else { // Romulans still conscious, they shoot you + loadActorAnim(OBJECT_PHASERSHOT, "s3r2s2", 0xf3, 0x89, 0); + playSoundEffectIndex(SND_PHASSHOT); + + Common::String anim = _vm->getCrewmanAnimFilename(_roomVar.love1.crewmanUsingDevice, "killw"); + loadActorAnim(_roomVar.love1.crewmanUsingDevice, anim, 0x102, 0x89, 6); + _roomVar.love1.dyingSpeaker = speakers[_roomVar.love1.crewmanUsingDevice]; + } +} + +void Room::love1CrewmanDiedFromPhaser() { + if (_roomVar.love1.crewmanUsingDevice == OBJECT_REDSHIRT) { + _vm->_awayMission.disableInput = false; + showText(TX_SPEAKER_FERRIS, TX_LOV1_024); + _vm->_awayMission.redshirtDead = true; + } + else { + showText(_roomVar.love1.dyingSpeaker, TX_LOV1_025); + showGameOverMenu(); + } +} + +// Romulans fire a "warning shot" when you go to the right part of the room. +void Room::love1TouchedHotspot0() { + if (_vm->_awayMission.love.field2b || _vm->_awayMission.love.field41) + return; + loadActorAnim(OBJECT_PHASERSHOT, "s3r2s1", 0xf3, 0x89, 0); + playSoundEffectIndex(SND_PHASSHOT); + if (!_vm->_awayMission.redshirtDead) + showText(TX_SPEAKER_FERRIS, TX_LOV1_028); +} + +} diff --git a/engines/startrek/rooms/love2.cpp b/engines/startrek/rooms/love2.cpp new file mode 100644 index 0000000000..43cdd64ecf --- /dev/null +++ b/engines/startrek/rooms/love2.cpp @@ -0,0 +1,35 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "startrek/room.h" + +#define OBJECT_DOOR1 8 + +#define HOTSPOT_CONSOLE 0x20 + +namespace StarTrek { + +void Room::love2Tick1() { + +} + +} diff --git a/engines/startrek/rooms/love3.cpp b/engines/startrek/rooms/love3.cpp new file mode 100644 index 0000000000..44203dfa2f --- /dev/null +++ b/engines/startrek/rooms/love3.cpp @@ -0,0 +1,35 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "startrek/room.h" + +#define OBJECT_DOOR1 8 + +#define HOTSPOT_CONSOLE 0x20 + +namespace StarTrek { + +void Room::love3Tick1() { + +} + +} diff --git a/engines/startrek/rooms/love4.cpp b/engines/startrek/rooms/love4.cpp new file mode 100644 index 0000000000..ec82191a6d --- /dev/null +++ b/engines/startrek/rooms/love4.cpp @@ -0,0 +1,35 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "startrek/room.h" + +#define OBJECT_DOOR1 8 + +#define HOTSPOT_CONSOLE 0x20 + +namespace StarTrek { + +void Room::love4Tick1() { + +} + +} diff --git a/engines/startrek/rooms/love5.cpp b/engines/startrek/rooms/love5.cpp new file mode 100644 index 0000000000..0abeb59f4a --- /dev/null +++ b/engines/startrek/rooms/love5.cpp @@ -0,0 +1,35 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "startrek/room.h" + +#define OBJECT_DOOR1 8 + +#define HOTSPOT_CONSOLE 0x20 + +namespace StarTrek { + +void Room::love5Tick1() { + +} + +} |