From 933d21429fdb3cc1c97237bbee1cd2168c33d95f Mon Sep 17 00:00:00 2001 From: Matthew Stewart Date: Fri, 15 Jun 2018 23:13:51 -0400 Subject: STARTREK: LOVE1 --- engines/startrek/awaymission.h | 16 + engines/startrek/module.mk | 5 + engines/startrek/room.cpp | 20 + engines/startrek/room.h | 120 ++++++ engines/startrek/rooms/function_map.h | 138 +++++++ engines/startrek/rooms/love0.cpp | 2 +- engines/startrek/rooms/love1.cpp | 661 ++++++++++++++++++++++++++++++++++ engines/startrek/rooms/love2.cpp | 35 ++ engines/startrek/rooms/love3.cpp | 35 ++ engines/startrek/rooms/love4.cpp | 35 ++ engines/startrek/rooms/love5.cpp | 35 ++ engines/startrek/text.h | 114 +++++- 12 files changed, 1214 insertions(+), 2 deletions(-) create mode 100644 engines/startrek/rooms/love1.cpp create mode 100644 engines/startrek/rooms/love2.cpp create mode 100644 engines/startrek/rooms/love3.cpp create mode 100644 engines/startrek/rooms/love4.cpp create mode 100644 engines/startrek/rooms/love5.cpp diff --git a/engines/startrek/awaymission.h b/engines/startrek/awaymission.h index 3fca387850..8b8e7e1c3b 100644 --- a/engines/startrek/awaymission.h +++ b/engines/startrek/awaymission.h @@ -142,16 +142,32 @@ struct AwayMission { struct { bool alreadyStartedMission; // 0x29 bool knowAboutVirus; // 0x2a + bool field2b; // 0x2b bool field2c; // 0x2c bool field2d; // 0x2d + bool chamberHasCure; // 0x2e + bool freezerOpen; // 0x2f + bool chamberHasDish; // 0x30 + byte bottleInNozzle; // 0x31 byte field36; // 0x36 byte field37; // 0x37 + bool field41; // 0x41 bool spockAccessedConsole; // 0x49 bool mccoyAccessedConsole; // 0x4a + bool gotPolyberylcarbonate; // 0x4b int16 missionScore; // 0x52 } love; }; }; // Size: 0x129 bytes +// Bottle types for Love's Labor Jeopardized +enum BottleTypes { + BOTTLETYPE_NONE = 0, + BOTTLETYPE_N2O = 1, + BOTTLETYPE_NH3 = 2, + BOTTLETYPE_H2O = 3, + BOTTLETYPE_RLG = 4 // Romulan Laughing Gas +}; + #endif diff --git a/engines/startrek/module.mk b/engines/startrek/module.mk index 85a31df800..1696da7708 100644 --- a/engines/startrek/module.mk +++ b/engines/startrek/module.mk @@ -31,6 +31,11 @@ MODULE_OBJS = \ rooms/tug2.o \ rooms/tug3.o \ rooms/love0.o \ + rooms/love1.o \ + rooms/love2.o \ + rooms/love3.o \ + rooms/love4.o \ + rooms/love5.o \ diff --git a/engines/startrek/room.cpp b/engines/startrek/room.cpp index 245edb707b..b1b26b0872 100644 --- a/engines/startrek/room.cpp +++ b/engines/startrek/room.cpp @@ -85,6 +85,26 @@ Room::Room(StarTrekEngine *vm, const Common::String &name) : _vm(vm) { _roomActionList = love0ActionList; _numRoomActions = sizeof(love0ActionList) / sizeof(RoomAction); } + else if (name == "LOVE1") { + _roomActionList = love1ActionList; + _numRoomActions = sizeof(love1ActionList) / sizeof(RoomAction); + } + else if (name == "LOVE2") { + _roomActionList = love2ActionList; + _numRoomActions = sizeof(love2ActionList) / sizeof(RoomAction); + } + else if (name == "LOVE3") { + _roomActionList = love3ActionList; + _numRoomActions = sizeof(love3ActionList) / sizeof(RoomAction); + } + else if (name == "LOVE4") { + _roomActionList = love4ActionList; + _numRoomActions = sizeof(love4ActionList) / sizeof(RoomAction); + } + else if (name == "LOVE5") { + _roomActionList = love5ActionList; + _numRoomActions = sizeof(love5ActionList) / sizeof(RoomAction); + } else { warning("Room \"%s\" unimplemented", name.c_str()); _numRoomActions = 0; diff --git a/engines/startrek/room.h b/engines/startrek/room.h index 660af0f23f..a6a2e70557 100644 --- a/engines/startrek/room.h +++ b/engines/startrek/room.h @@ -746,6 +746,110 @@ public: void love0MccoyAccessedConsole(); void love0InteractWithConsole(); + // LOVE1 + void love1Tick1(); + void love1WalkToDoor3(); + void love1OpenDoor3(); + void love1ReachedDoor3(); + void love1WalkToDoor1(); + void love1OpenDoor1(); + void love1ReachedDoor1(); + void love1WalkToDoor2(); + void love1OpenDoor2(); + void love1ReachedDoor2(); + void love1LookAtLaser(); + void love1LookAtKirk(); + void love1LookAtSpock(); + void love1LookAtMccoy(); + void love1LookAtRedshirt(); + void love1LookAnywhere(); + void love1LookAtNozzle(); + void love1LookAtLadder(); + void love1LookAtDoor1Or2(); + void love1LookAtDoor3(); + void love1LookAtDistillator(); + void love1LookAtChamber(); + void love1LookAtReplicator(); + void love1LookAtFreezer(); + void love1LookAtDishes(); + void love1TalkToKirk(); + void love1TalkToSpock(); + void love1TalkToMccoy(); + void love1TalkToRedshirt(); + void love1UseMTricorderOnDishes(); + void love1UseMTricorderAnywhere(); + void love1UseSTricorderOnReplicator(); + void love1UseSTricorderOnLaser(); + void love1UseSTricorderOnFreezer(); + void love1UseSTricorderAnywhere(); + void love1UseSTricorderOnDishes(); + void love1UseSTricorderOnDistillator(); + void love1GetFreezer(); + void love1KirkReachedFreezer(); + void love1KirkGotVirusCulture(); + void love1GetFromChamber(); + void love1KirkReachedChamber(); + void love1KirkGotCureSample(); + void love1GetFromNozzle(); + void love1KirkReachedNozzleToGet(); + void love1KirkGotBottleFromNozzle(); + void love1UseN2OOnNozzle(); + void love1UseH2OOnNozzle(); + void love1UseNH3OnNozzle(); + void love1UseRLGOnNozzle(); + void love1KirkReachedNozzleToPut(); + void love1KirkPutBottleInNozzle(); + void love1UseAnthingOnNozzle(); + void love1UseSpockOnReplicator(); + void love1UseRedshirtOnReplicator(); + void love1UseMccoyOnReplicator(); + void love1MccoyReachedReplicator(); + void love1MccoyUsedReplicator(); + void love1ChamberClosed(); + void love1ChamberOpened(); + void love1UseAnythingOnChamber(); + void love1UseDishesOnChamber(); + void love1KirkReachedChamberToPut(); + void love1ChamberOpenedForDish(); + void love1KirkPutDishInChamber(); + void love1UseInsulationOnDistillator(); + void love1KirkReachedDistillator(); + void love1KirkGotPolyberylcarbonate(); + void love1UseKirkOnFreezer(); + void love1UseRedshirtOnFreezer(); + void love1UseSpockOnFreezer(); + void love1UseMccoyOnFreezer(); + void love1CrewmanReachedFreezer(); + void love1CrewmanOpenedOrClosedFreezer(); + void love1UseAnythingOnFreezer(); + void love1ReachedFreezerWithArbitraryItem(); + void love1FinishedUsingArbitraryItemOnFreezer(); + void love1UseAnythingOnReplicator(); + void love1ReachedReplicatorWithArbitraryItem(); + void love1FinishedUsingArbitraryItemOnReplicator(); + void love1UseAnythingOnDistillator(); + void love1ReachedDistillatorWithArbitraryItem(); + void love1FinishedUsingArbitraryItemOnDistillator(); + void love1UseKirkOnLadder(); + void love1UseSpockOnLadder(); + void love1UseMccoyOnLadder(); + void love1UseRedshirtOnLadder(); + void love1CrewmanReachedLadder(); + void love1CrewmanDiedFromPhaser(); + void love1TouchedHotspot0(); + + // LOVE2 + void love2Tick1(); + + // LOVE3 + void love3Tick1(); + + // LOVE4 + void love4Tick1(); + + // LOVE5 + void love5Tick1(); + private: // Room-specific variables. This is memset'ed to 0 when the room is initialized. union { @@ -824,6 +928,22 @@ private: byte _8ac; // 0x8ac } love0; + struct { + byte door3OpenCounter; // 0xcb + byte door1OpenCounter; // 0xcc + byte door2OpenCounter; // 0xcd + bool walkingToDoor; // 0xce + int32 dyingSpeaker; // 0xcf + int16 crewmanUsingFreezerRetX; // 0xd1 + int16 crewmanUsingFreezerRetY; // 0xd3 + int16 crewmanUsingDevice; // 0xd9 + int16 itemInNozzle; // 0xdd + char bottleAnimation[10]; // 0xdf + + byte _1d2a; // 0x1d2a + byte _1d2b; // 0x1d2b + } love1; + } _roomVar; }; 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() { + +} + +} diff --git a/engines/startrek/text.h b/engines/startrek/text.h index c71dcb7981..81a198d4f3 100644 --- a/engines/startrek/text.h +++ b/engines/startrek/text.h @@ -60,6 +60,7 @@ enum GameStringIDs { TX_NULL, TX_BLANK, TX_DIALOG_ERROR, + TX_ANIMATION_ERROR, TX_SPEAKER_KIRK, TX_SPEAKER_SPOCK, @@ -817,13 +818,69 @@ enum GameStringIDs { TX_VENA_F41, + TX_LOV1_001, + TX_LOV1_002, + TX_LOV1_003, + TX_LOV1_004, + TX_LOV1_005, + TX_LOV1_006, + TX_LOV1_007, + TX_LOV1_008, + TX_LOV1_009, + TX_LOV1_010, + TX_LOV1_011, + TX_LOV1_012, + TX_LOV1_013, + TX_LOV1_014, + TX_LOV1_015, + TX_LOV1_016, + TX_LOV1_017, + TX_LOV1_018, + TX_LOV1_019, + TX_LOV1_021, + TX_LOV1_022, + TX_LOV1_023, + TX_LOV1_024, + TX_LOV1_025, + TX_LOV1_026, + TX_LOV1_027, + TX_LOV1_028, + TX_LOV1N000, + TX_LOV1N001, + TX_LOV1N002, + TX_LOV1N003, + TX_LOV1N004, + TX_LOV1N005, + TX_LOV1N006, + TX_LOV1N007, + TX_LOV1N008, + TX_LOV1N009, + TX_LOV1N010, + TX_LOV1N011, + TX_LOV1N012, + TX_LOV1N013, + TX_LOV1N014, + TX_LOV1N015, + TX_LOV1N016, + TX_LOV1N017, + TX_LOV1N018, + TX_LOV1N019, + TX_LOV1N020, + TX_LOV1N021, + TX_LOV1N022, + TX_LOV1N023, + TX_LOV1N034, + TX_LOV1N035, + + TX_END }; const char * const g_gameStrings[] = { nullptr, "", - "There is a dialog error here.", + "Dialog error", + "Animation error", "Capt. Kirk", "Mr. Spock", @@ -1579,6 +1636,61 @@ const char * const g_gameStrings[] = { "#MUD4\\MUD4_018#Kirk to Enterprise ... Kirk to Enterprise.", "#sfx\\spokcoff#cough... cough...", "#VENA\\VENA_F41#Kirk out.", + + + "#LOV1\\LOV1_001#When you are finished admiring all the equipment Bones, maybe you can help us figure out what's going on here.", + "#LOV1\\LOV1_002#Captain, I believe Dr. McCoy has the necessary skills to run that equipment.", + "#LOV1\\LOV1_003#It is a standard research lab.", + "#LOV1\\LOV1_004#The seals on these dishes are intact, but that's all I can determine.", + "#LOV1\\LOV1_005#This is a very well-equipped laboratory, Captain. Perhaps Dr. McCoy could be of some use here.", + "#LOV1\\LOV1_006#A Hawking Neutrino Accelerator. It is one of the finest in production today.", + "#LOV1\\LOV1_007#A Khrygellian II Basic Compound Distillator. Excellent piece of equipment for reducing complex materials to their basic compounds.", + "#LOV1\\LOV1_008#Careful, Jim! That's a distillator, not a can-opener.", + "#LOV1\\LOV1_009#Except for the Oroborus virus, I'm not picking up anything unusual.", + "#LOV1\\LOV1_010#I'm picking up some strange, airborne virus. I can't identify it without more information.", + "#LOV1\\LOV1_011#Jim, this lab is incredible! What I wouldn't give to have some of this equipment on the Enterprise.", + "#LOV1\\LOV1_012#That nozzle is for anti-agents only, Jim.", + "#LOV1\\LOV1_013#That's for Virus Cultures only, Jim.", + "#LOV1\\LOV1_014#There is already something in the chamber.", + "#LOV1\\LOV1_015#There is no specimen in the chamber.", + "#LOV1\\LOV1_016#This isn't a microwave, Jim! This is a delicate piece of equipment!", + "#LOV1\\LOV1_017#Jim, these viral cultures are alive. I can use them to work on a cure.", + "#LOV1\\LOV1_018#Eureka! This is it, Jim! There's not much, but all I need to do is synthesize some more, and we're in business.", + "#LOV1\\LOV1_019#This isn't the result I was hoping for, Jim.", + "#LOV1\\LOV1_021#We have to attach something to the nozzle first.", + "#LOV1\\LOV1_022#Residue of a viral agent is still within the chamber.", + "#LOV1\\LOV1_023#There are multiple culture samples of the virus within the freezer, Captain.", + "#LOV1\\LOV1_024#Arrggghhh!", + "#LOV1\\LOV1_025#Aieee!!", + "#LOV1\\LOV1_026#Sir, I think Dr. McCoy should run it. I may break it.", + "#LOV1\\LOV1_027#This level appears to be deserted, sir, but I'm worried about a Romulan counter-attack. They outnumber us.", + "#LOV1\\LOV1_028#Watch out, sir! It looks like the Romulans have taken control of the lower decks.", + "#LOV1\\LOV1N000#A device to accelerate neutrinos. Not much good for anything else.", + "#LOV1\\LOV1N001#Dr. McCoy is thinking about chemical formulas.", + "#LOV1\\LOV1N002#Ensign Ferris doesn't know much about chemical formulas.", + "#LOV1\\LOV1N003#James Tiberius Kirk.", + "#LOV1\\LOV1N004#Mr. Spock is thinking about chemical formulas.", + "#LOV1\\LOV1N005#You already have a culture dish.", + "#LOV1\\LOV1N006#You take the Oroborus virus culture.", + "#LOV1\\LOV1N007#Done.", + "#LOV1\\LOV1N008#It gets a little colder, but nothing else happens.", + "#LOV1\\LOV1N009#The chamber is empty.", + "#LOV1\\LOV1N010#The Freezer unit is too large to take.", + "#LOV1\\LOV1N011#The nozzle is empty.", + "#LOV1\\LOV1N012#There are many virus culture dishes, all of them labeled, \"Oroborus Virus -- DANGER!!\".", + "#LOV1\\LOV1N013#There is a single viral culture dish in here, and it contains a sample of the Oroborus cure.", + "#LOV1\\LOV1N014#This chamber is where virus samples are placed.", + "#LOV1\\LOV1N015#This device is used for the rapid reproduction of virus cultures in the presence of suspected anti-agents.", + "#LOV1\\LOV1N016#This is a distillator, used to isolate specific compounds from raw material.", + "#LOV1\\LOV1N017#This is a large engineering safety door with heavy shielding. Its entry codes seem to be breached.", + "#LOV1\\LOV1N018#This is a large refrigeration unit.", + "#LOV1\\LOV1N019#This is a research lab, with lots of expensive equipment.", + "#LOV1\\LOV1N020#This is a standard door, leading to another room on this deck.", + "#LOV1\\LOV1N021#This is an access ladder. It appears to lead to the next deck below.", + "#LOV1\\LOV1N022#This nozzle is where anti-agents are placed.", + "#LOV1\\LOV1N023#This refrigerator has a number of specimen dishes inside.", + "#LOV1\\LOV1N034#You have distilled a quantity of Polyberylcarbonate.", + "#LOV1\\LOV1N035#You retrieve the Oroborus cure sample.", }; } -- cgit v1.2.3