aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/startrek/awaymission.h16
-rw-r--r--engines/startrek/module.mk5
-rw-r--r--engines/startrek/room.cpp20
-rw-r--r--engines/startrek/room.h120
-rw-r--r--engines/startrek/rooms/function_map.h138
-rw-r--r--engines/startrek/rooms/love0.cpp2
-rw-r--r--engines/startrek/rooms/love1.cpp661
-rw-r--r--engines/startrek/rooms/love2.cpp35
-rw-r--r--engines/startrek/rooms/love3.cpp35
-rw-r--r--engines/startrek/rooms/love4.cpp35
-rw-r--r--engines/startrek/rooms/love5.cpp35
-rw-r--r--engines/startrek/text.h114
12 files changed, 1214 insertions, 2 deletions
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.",
};
}