aboutsummaryrefslogtreecommitdiff
path: root/engines/startrek
diff options
context:
space:
mode:
authorMatthew Stewart2018-06-20 05:51:54 -0400
committerEugene Sandulenko2018-08-09 08:37:30 +0200
commitdc1e44efb9863333300482bcb4c352cf8de66bf8 (patch)
tree992f54cc51c16e6ff0d4a1700dcf1cf22d7c5ebe /engines/startrek
parent44b0a4c7bb4615933a7e9f6124a7fffbd309da8d (diff)
downloadscummvm-rg350-dc1e44efb9863333300482bcb4c352cf8de66bf8.tar.gz
scummvm-rg350-dc1e44efb9863333300482bcb4c352cf8de66bf8.tar.bz2
scummvm-rg350-dc1e44efb9863333300482bcb4c352cf8de66bf8.zip
STARTREK: Most of LOVE2 done
Diffstat (limited to 'engines/startrek')
-rw-r--r--engines/startrek/awaymission.cpp2
-rw-r--r--engines/startrek/awaymission.h18
-rw-r--r--engines/startrek/room.cpp4
-rw-r--r--engines/startrek/room.h107
-rw-r--r--engines/startrek/rooms/function_map.h113
-rw-r--r--engines/startrek/rooms/love0.cpp4
-rw-r--r--engines/startrek/rooms/love2.cpp825
-rw-r--r--engines/startrek/startrek.cpp2
-rw-r--r--engines/startrek/text.h183
9 files changed, 1248 insertions, 10 deletions
diff --git a/engines/startrek/awaymission.cpp b/engines/startrek/awaymission.cpp
index 341624ba99..83e16c9ac3 100644
--- a/engines/startrek/awaymission.cpp
+++ b/engines/startrek/awaymission.cpp
@@ -41,7 +41,7 @@ void StarTrekEngine::initAwayMission() {
_roomIndexToLoad = -1;
// Load crew positions for beaming in
- initAwayCrewPositions(4);
+ initAwayCrewPositions(0);
}
void StarTrekEngine::runAwayMission() {
diff --git a/engines/startrek/awaymission.h b/engines/startrek/awaymission.h
index 8b8e7e1c3b..9114bb9edf 100644
--- a/engines/startrek/awaymission.h
+++ b/engines/startrek/awaymission.h
@@ -149,12 +149,18 @@ struct AwayMission {
bool freezerOpen; // 0x2f
bool chamberHasDish; // 0x30
byte bottleInNozzle; // 0x31
- byte field36; // 0x36
- byte field37; // 0x37
+ bool cabinetOpen; // 0x32
+ bool gasFeedOn; // 0x33
+ byte synthesizerProduct; // 0x34
+ byte field35; // 0x35
+ byte canister1; // 0x36
+ byte canister2; // 0x37
bool field41; // 0x41
bool spockAccessedConsole; // 0x49
bool mccoyAccessedConsole; // 0x4a
bool gotPolyberylcarbonate; // 0x4b
+ bool gotTLDH; // 0x4c (Got romulan laughing gas)
+ bool gotCure; // 0x4f
int16 missionScore; // 0x52
} love;
};
@@ -170,4 +176,12 @@ enum BottleTypes {
BOTTLETYPE_RLG = 4 // Romulan Laughing Gas
};
+// Canister types for Love's Labor Jeopardized
+enum CanisterTypes {
+ CANTYPE_NONE = 0,
+ CANTYPE_O2 = 1,
+ CANTYPE_H2 = 2,
+ CANTYPE_N2 = 3
+};
+
#endif
diff --git a/engines/startrek/room.cpp b/engines/startrek/room.cpp
index b1b26b0872..05645073fb 100644
--- a/engines/startrek/room.cpp
+++ b/engines/startrek/room.cpp
@@ -347,6 +347,10 @@ void Room::showBitmapFor5Ticks(const Common::String &bmpName, int priority) {
_vm->_gfx->delSprite(&sprite);
}
+bool Room::haveItem(int item) {
+ return _vm->_itemList[item - 0x40].have;
+}
+
Common::Point Room::getActorPos(int actorIndex) {
return _vm->_actorList[actorIndex].pos;
}
diff --git a/engines/startrek/room.h b/engines/startrek/room.h
index 05db770347..371d57fd19 100644
--- a/engines/startrek/room.h
+++ b/engines/startrek/room.h
@@ -112,6 +112,7 @@ private:
void loadMapFile(const Common::String &name); // Cmd 0x09
void showBitmapFor5Ticks(const Common::String &bmpName, int priority); // Cmd 0x0a
// Command 0x0c: "demon6ShowCase"
+ bool haveItem(int item); // Cmd 0x0b
Common::Point getActorPos(int actorIndex); // Cmd 0x0d
int16 getRandomWordInRange(int start, int end); // Cmd 0x0e
void playSoundEffectIndex(int soundEffect); // Cmd 0x0f
@@ -843,6 +844,97 @@ public:
// LOVE2
void love2Tick1();
+ void love2TouchedWarp1();
+ void love2Timer3Expired();
+ void love2WalkToDoor();
+ void love2TouchedHotspot0();
+ void love2DoorReachedOrOpened();
+ void love2LookAtCabinet();
+ void love2LookAtDoor();
+ void love2LookAtSynthesizer();
+ void love2LookAtAnywhere();
+ void love2LookAtAntigrav();
+ void love2LookAtMccoy();
+ void love2LookAtSpock();
+ void love2LookAtRedshirt();
+ void love2LookAtKirk();
+ void love2LookAtArdak();
+ void love2LookAtChamber();
+ void love2LookAtCan1();
+ void love2LookAtCan2();
+ void love2TalkToKirk();
+ void love2TalkToSpock();
+ void love2TalkToMccoy();
+ void love2TalkToRedshirt();
+ void love2UseMTricorderAnywhere();
+ void love2UseSTricorderAnywhere();
+ void love2UseKirkOnCabinet();
+ void love2UseSpockOnCabinet();
+ void love2UseMccoyOnCabinet();
+ void love2UseRedshirtOnCabinet();
+ void love2CrewmanReachedCabinet();
+ void love2CrewmanAccessedCabinet();
+ void love2CrewmanOpenedOrClosedCabinet();
+ void love2UseWrenchOnGasFeed();
+ void love2ReachedGasFeed();
+ void love2ChangedGasFeed();
+ void love2UseO2GasOnCanisterSlot();
+ void love2UseH2GasOnCanisterSlot();
+ void love2UseN2GasOnCanisterSlot();
+ void love2ReachedCanisterSlot();
+ void love2PutCanisterInSlot1();
+ void love2PutCanisterInSlot2();
+ void love2UseAntigravOnCanister1();
+ void love2ReachedCanisterSlot1ToGet();
+ void love2TookCanister1();
+ void love2UseAntigravOnCanister2();
+ void love2ReachedCanisterSlot2ToGet();
+ void love2TookCanister2();
+ void love2UseKirkOnSynthesizer();
+ void love2UseSpockOnSynthesizer();
+ void love2UseMccoyOnSynthesizer();
+ void love2UseRedshirtOnSynthesizer();
+ void love2CrewmanReachedSynthesizer();
+ void love2CrewmanUsedSynthesizer();
+ void love2SpockReachedGasFeeds();
+ void love2SpockEnabledGasFeeds();
+ void love2UseSynthesizer();
+ void love2SynthesizerDoorClosed();
+ void love2SynthesizerFinished();
+ void love2FinishedAnimation27();
+ void love2UsePolyberylcarbonateOnSynthesizerDoor();
+ void love2KirkReachedSynthesizerWithPolyberylcarbonate();
+ void love2SynthesizerDoorOpenedWithPolyberylcarbonate();
+ void love2PutPolyberylcarbonateInSynthesizer();
+ void love2UseDishesOnSynthesizerDoor();
+ void love2KirkReachedSynthesizerWithDishes();
+ void love2SynthesizerDoorOpenedWithDishes();
+ void love2PutDishesInSynthesizer();
+ void love2UseSampleOnSynthesizerDoor();
+ void love2KirkReachedSynthesizerWithSample();
+ void love2SynthesizerDoorOpenedWithSample();
+ void love2PutSampleInSynthesizer();
+ void love2UseAnythingOnSynthesizerDoor();
+ void love2UseAnythingOnSynthesizer();
+ void love2GetCanister();
+ void love2GetAntigrav();
+ void love2ReachedAntigrav();
+ void love2GotAntigrav();
+ void love2GetPolyberylcarbonate();
+ void love2ReachedPolyberylcarbonate();
+ void love2GotPolyberylcarbonate();
+ void love2GetDishes();
+ void love2ReachedDishes();
+ void love2GotDishes();
+ void love2GetSample();
+ void love2ReachedSample();
+ void love2GotSample();
+ void love2GetSynthesizerOutput();
+ void love2ReachedSynthesizerOutput();
+ void love2GotSynthesizerOutput();
+ void love2GetCure();
+ void love2ReachedCure();
+ void love2GotCure();
// LOVE3
void love3Tick1();
@@ -947,6 +1039,21 @@ private:
byte _1d2b; // 0x1d2b
} love1;
+ struct {
+ byte canisterType; // 0xca
+ byte cb; // 0xcb
+ bool walkingToDoor; // 0xcc
+ byte doorOpenCounter; // 0xcd
+ int16 canisterItem; // 0xce
+ char canisterAnim[10]; // 0xd0
+ int16 d2; // 0xd2
+ char d6[10]; // 0xd6
+ char d8[10]; // 0xd8
+ byte _2966; // 0x2966
+ byte _2967; // 0x2967
+ } love2;
+
+
} _roomVar;
};
diff --git a/engines/startrek/rooms/function_map.h b/engines/startrek/rooms/function_map.h
index a1cb9286cb..b16dbff5f8 100644
--- a/engines/startrek/rooms/function_map.h
+++ b/engines/startrek/rooms/function_map.h
@@ -946,6 +946,119 @@ RoomAction love1ActionList[] = {
RoomAction love2ActionList[] = {
{ Action(ACTION_TICK, 1, 0, 0), &Room::love2Tick1 },
+ { Action(ACTION_TOUCHED_WARP, 1, 0, 0), &Room::love2TouchedWarp1 },
+ { Action(ACTION_TIMER_EXPIRED, 3, 0, 0), &Room::love2Timer3Expired },
+ { Action(ACTION_WALK, 10, 0, 0), &Room::love2WalkToDoor },
+ { Action(ACTION_WALK, 0x22, 0, 0), &Room::love2WalkToDoor },
+ { Action(ACTION_TOUCHED_HOTSPOT, 0, 0, 0), &Room::love2TouchedHotspot0 },
+ { Action(ACTION_FINISHED_WALKING, 14, 0, 0), &Room::love2DoorReachedOrOpened },
+ { Action(ACTION_FINISHED_ANIMATION, 1, 0, 0), &Room::love2DoorReachedOrOpened },
+ { Action(ACTION_LOOK, 8, 0, 0), &Room::love2LookAtCabinet },
+ { Action(ACTION_LOOK, 10, 0, 0), &Room::love2LookAtDoor },
+ { Action(ACTION_LOOK, 0x20, 0, 0), &Room::love2LookAtSynthesizer },
+ { Action(ACTION_LOOK, -1, 0, 0), &Room::love2LookAtAnywhere },
+ { Action(ACTION_LOOK, 14, 0, 0), &Room::love2LookAtAntigrav },
+ { Action(ACTION_LOOK, OBJECT_MCCOY, 0, 0), &Room::love2LookAtMccoy },
+ { Action(ACTION_LOOK, OBJECT_SPOCK, 0, 0), &Room::love2LookAtSpock },
+ { Action(ACTION_LOOK, OBJECT_REDSHIRT, 0, 0), &Room::love2LookAtRedshirt },
+ { Action(ACTION_LOOK, OBJECT_KIRK, 0, 0), &Room::love2LookAtKirk },
+ { Action(ACTION_LOOK, 0x21, 0, 0), &Room::love2LookAtArdak },
+ { Action(ACTION_LOOK, 15, 0, 0), &Room::love2LookAtChamber },
+ { Action(ACTION_LOOK, 16, 0, 0), &Room::love2LookAtChamber },
+ { Action(ACTION_LOOK, 18, 0, 0), &Room::love2LookAtChamber },
+ { Action(ACTION_LOOK, 19, 0, 0), &Room::love2LookAtChamber },
+ { Action(ACTION_LOOK, 17, 0, 0), &Room::love2LookAtChamber },
+ { Action(ACTION_LOOK, 9, 0, 0), &Room::love2LookAtChamber },
+ { Action(ACTION_LOOK, 12, 0, 0), &Room::love2LookAtCan1 },
+ { Action(ACTION_LOOK, 13, 0, 0), &Room::love2LookAtCan2 },
+ { Action(ACTION_TALK, OBJECT_KIRK, 0, 0), &Room::love2TalkToKirk },
+ { Action(ACTION_TALK, OBJECT_SPOCK, 0, 0), &Room::love2TalkToSpock },
+ { Action(ACTION_TALK, OBJECT_MCCOY, 0, 0), &Room::love2TalkToMccoy },
+ { Action(ACTION_TALK, OBJECT_REDSHIRT, 0, 0), &Room::love2TalkToRedshirt },
+ { Action(ACTION_USE, OBJECT_IMTRICOR, -1, 0), &Room::love2UseMTricorderAnywhere },
+ { Action(ACTION_USE, OBJECT_ISTRICOR, -1, 0), &Room::love2UseSTricorderAnywhere },
+ { Action(ACTION_USE, OBJECT_KIRK, 8, 0), &Room::love2UseKirkOnCabinet },
+ { Action(ACTION_USE, OBJECT_SPOCK, 8, 0), &Room::love2UseSpockOnCabinet },
+ { Action(ACTION_USE, OBJECT_MCCOY, 8, 0), &Room::love2UseMccoyOnCabinet },
+ { Action(ACTION_USE, OBJECT_REDSHIRT, 8, 0), &Room::love2UseRedshirtOnCabinet },
+ { Action(ACTION_FINISHED_WALKING, 12, 0, 0), &Room::love2CrewmanReachedCabinet },
+ { Action(ACTION_FINISHED_ANIMATION, 11, 0, 0), &Room::love2CrewmanAccessedCabinet },
+ { Action(ACTION_FINISHED_ANIMATION, 2, 0, 0), &Room::love2CrewmanOpenedOrClosedCabinet },
+ { Action(ACTION_USE, OBJECT_IWRENCH, 11, 0), &Room::love2UseWrenchOnGasFeed },
+ { Action(ACTION_FINISHED_WALKING, 1, 0, 0), &Room::love2ReachedGasFeed },
+ { Action(ACTION_FINISHED_ANIMATION, 12, 0, 0), &Room::love2ChangedGasFeed },
+ { Action(ACTION_USE, OBJECT_IO2GAS, 0x23, 0), &Room::love2UseO2GasOnCanisterSlot },
+ { Action(ACTION_USE, OBJECT_IH2GAS, 0x23, 0), &Room::love2UseH2GasOnCanisterSlot },
+ { Action(ACTION_USE, OBJECT_IN2GAS, 0x23, 0), &Room::love2UseN2GasOnCanisterSlot },
+ { Action(ACTION_FINISHED_WALKING, 3, 0, 0), &Room::love2ReachedCanisterSlot },
+ { Action(ACTION_FINISHED_ANIMATION, 13, 0, 0), &Room::love2PutCanisterInSlot1 },
+ { Action(ACTION_FINISHED_ANIMATION, 14, 0, 0), &Room::love2PutCanisterInSlot2 },
+ { Action(ACTION_USE, OBJECT_IANTIGRA, 12, 0), &Room::love2UseAntigravOnCanister1 },
+ { Action(ACTION_FINISHED_WALKING, 4, 0, 0), &Room::love2ReachedCanisterSlot1ToGet },
+ { Action(ACTION_FINISHED_ANIMATION, 15, 0, 0), &Room::love2TookCanister1 },
+ { Action(ACTION_USE, OBJECT_IANTIGRA, 13, 0), &Room::love2UseAntigravOnCanister2 },
+ { Action(ACTION_FINISHED_WALKING, 5, 0, 0), &Room::love2ReachedCanisterSlot2ToGet },
+ { Action(ACTION_FINISHED_ANIMATION, 16, 0, 0), &Room::love2TookCanister2 },
+ { Action(ACTION_USE, OBJECT_KIRK, 0x20, 0), &Room::love2UseKirkOnSynthesizer },
+ { Action(ACTION_USE, OBJECT_SPOCK, 0x20, 0), &Room::love2UseSpockOnSynthesizer },
+ { Action(ACTION_USE, OBJECT_MCCOY, 0x20, 0), &Room::love2UseMccoyOnSynthesizer },
+ { Action(ACTION_USE, OBJECT_REDSHIRT, 0x20, 0), &Room::love2UseRedshirtOnSynthesizer },
+ { Action(ACTION_FINISHED_WALKING, 13, 0, 0), &Room::love2CrewmanReachedSynthesizer },
+ { Action(ACTION_FINISHED_ANIMATION, 17, 0, 0), &Room::love2CrewmanUsedSynthesizer },
+ { Action(ACTION_FINISHED_WALKING, 16, 0, 0), &Room::love2SpockReachedGasFeeds },
+ { Action(ACTION_FINISHED_ANIMATION, 18, 0, 0), &Room::love2SpockEnabledGasFeeds },
+ { Action(ACTION_FINISHED_ANIMATION, 3, 0, 0), &Room::love2SynthesizerDoorClosed },
+ { Action(ACTION_FINISHED_ANIMATION, 4, 0, 0), &Room::love2SynthesizerFinished },
+ { Action(ACTION_FINISHED_ANIMATION, 27, 0, 0), &Room::love2FinishedAnimation27 },
+
+ // TODO: more
+
+ { Action(ACTION_USE, OBJECT_IPBC, 9, 0), &Room::love2UsePolyberylcarbonateOnSynthesizerDoor },
+ { Action(ACTION_FINISHED_WALKING, 6, 0, 0), &Room::love2KirkReachedSynthesizerWithPolyberylcarbonate },
+ { Action(ACTION_FINISHED_ANIMATION, 5, 0, 0), &Room::love2SynthesizerDoorOpenedWithPolyberylcarbonate },
+ { Action(ACTION_FINISHED_ANIMATION, 19, 0, 0), &Room::love2PutPolyberylcarbonateInSynthesizer },
+
+ { Action(ACTION_USE, OBJECT_IDISHES, 9, 0), &Room::love2UseDishesOnSynthesizerDoor },
+ { Action(ACTION_FINISHED_WALKING, 7, 0, 0), &Room::love2KirkReachedSynthesizerWithDishes },
+ { Action(ACTION_FINISHED_ANIMATION, 6, 0, 0), &Room::love2SynthesizerDoorOpenedWithDishes },
+ { Action(ACTION_FINISHED_ANIMATION, 20, 0, 0), &Room::love2PutDishesInSynthesizer },
+
+ { Action(ACTION_USE, OBJECT_ISAMPLE, 9, 0), &Room::love2UseSampleOnSynthesizerDoor },
+ { Action(ACTION_FINISHED_WALKING, 8, 0, 0), &Room::love2KirkReachedSynthesizerWithSample },
+ { Action(ACTION_FINISHED_ANIMATION, 7, 0, 0), &Room::love2SynthesizerDoorOpenedWithSample },
+ { Action(ACTION_FINISHED_ANIMATION, 21, 0, 0), &Room::love2PutSampleInSynthesizer },
+
+ { Action(ACTION_USE, -1, 9, 0), &Room::love2UseAnythingOnSynthesizerDoor },
+ { Action(ACTION_USE, -1, 0x20, 0), &Room::love2UseAnythingOnSynthesizer },
+ { Action(ACTION_GET, 13, 0, 0), &Room::love2GetCanister },
+ { Action(ACTION_GET, 12, 0, 0), &Room::love2GetCanister },
+
+ { Action(ACTION_GET, 14, 0, 0), &Room::love2GetAntigrav },
+ { Action(ACTION_FINISHED_WALKING, 9, 0, 0), &Room::love2ReachedAntigrav },
+ { Action(ACTION_FINISHED_ANIMATION, 22, 0, 0), &Room::love2GotAntigrav },
+
+ { Action(ACTION_GET, 16, 0, 0), &Room::love2GetPolyberylcarbonate },
+ { Action(ACTION_FINISHED_WALKING, 18, 0, 0), &Room::love2ReachedPolyberylcarbonate },
+ { Action(ACTION_FINISHED_ANIMATION, 26, 0, 0), &Room::love2GotPolyberylcarbonate },
+
+ { Action(ACTION_GET, 17, 0, 0), &Room::love2GetDishes },
+ { Action(ACTION_FINISHED_WALKING, 17, 0, 0), &Room::love2ReachedDishes },
+ { Action(ACTION_FINISHED_ANIMATION, 25, 0, 0), &Room::love2GotDishes },
+
+ { Action(ACTION_GET, 18, 0, 0), &Room::love2GetSample },
+ { Action(ACTION_FINISHED_WALKING, 19, 0, 0), &Room::love2ReachedSample },
+ { Action(ACTION_FINISHED_ANIMATION, 28, 0, 0), &Room::love2GotSample },
+
+ { Action(ACTION_GET, 15, 0, 0), &Room::love2GetSynthesizerOutput },
+ { Action(ACTION_FINISHED_WALKING, 10, 0, 0), &Room::love2ReachedSynthesizerOutput },
+ { Action(ACTION_FINISHED_ANIMATION, 23, 0, 0), &Room::love2GotSynthesizerOutput },
+
+ // TODO: test these
+ { Action(ACTION_GET, 19, 0, 0), &Room::love2GetCure },
+ { Action(ACTION_FINISHED_WALKING, 11, 0, 0), &Room::love2ReachedCure },
+ { Action(ACTION_FINISHED_ANIMATION, 24, 0, 0), &Room::love2GotCure },
+
+ // TODO: common code
};
RoomAction love3ActionList[] = {
diff --git a/engines/startrek/rooms/love0.cpp b/engines/startrek/rooms/love0.cpp
index e4e3932944..d43f35d7a5 100644
--- a/engines/startrek/rooms/love0.cpp
+++ b/engines/startrek/rooms/love0.cpp
@@ -34,8 +34,8 @@ namespace StarTrek {
void Room::love0Tick1() {
if (!_vm->_awayMission.love.alreadyStartedMission) {
- _vm->_awayMission.love.field36 = 1;
- _vm->_awayMission.love.field37 = 2;
+ _vm->_awayMission.love.canister1 = CANTYPE_O2;
+ _vm->_awayMission.love.canister2 = CANTYPE_H2;
_vm->_awayMission.love.alreadyStartedMission = true;
playVoc("LOV0LOOP"); // FIXME: no audio after first entry?
}
diff --git a/engines/startrek/rooms/love2.cpp b/engines/startrek/rooms/love2.cpp
index 43cdd64ecf..1744b108ba 100644
--- a/engines/startrek/rooms/love2.cpp
+++ b/engines/startrek/rooms/love2.cpp
@@ -20,16 +20,837 @@
*
*/
+// BUGFIX: some of the audio filenames in the text were incorrect? (see text.h)
+
#include "startrek/room.h"
-#define OBJECT_DOOR1 8
+#define OBJECT_CABINET 8
+#define OBJECT_SYNTHESIZER_DOOR 9
+#define OBJECT_DOOR 10
+#define OBJECT_GAS_FEED 11
+#define OBJECT_CAN1 12
+#define OBJECT_CAN2 13
+#define OBJECT_ANTIGRAV 14
+#define OBJECT_SYNTHESIZER_OUTPUT 15
+#define OBJECT_POLYBERYLCARBONATE 16
+#define OBJECT_DISHES 17
+#define OBJECT_CURESAMPLE 18
+#define OBJECT_CURE 19
-#define HOTSPOT_CONSOLE 0x20
+#define HOTSPOT_SYNTHESIZER 0x20
+#define HOTSPOT_ARDAK 0x21
+#define HOTSPOT_DOOR 0x22
+#define HOTSPOT_CANISTER_SLOT 0x23
namespace StarTrek {
void Room::love2Tick1() {
+ playVoc("LOV2LOOP");
+
+ char canName[10];
+
+ switch (_vm->_awayMission.love.canister1) {
+ case CANTYPE_O2:
+ strcpy(canName, "o2can");
+ break;
+ case CANTYPE_H2:
+ strcpy(canName, "h2can");
+ break;
+ case CANTYPE_N2:
+ strcpy(canName, "n2can");
+ break;
+ default:
+ break;
+ }
+
+ if (_vm->_awayMission.love.canister1 >= 1 && _vm->_awayMission.love.canister1 <= 3)
+ loadActorAnim(OBJECT_CAN1, canName, 0xa7, 0xae, 0);
+
+ switch (_vm->_awayMission.love.canister2) {
+ case CANTYPE_O2:
+ strcpy(canName, "o2can");
+ break;
+ case CANTYPE_H2:
+ strcpy(canName, "h2can");
+ break;
+ case CANTYPE_N2:
+ strcpy(canName, "n2can");
+ break;
+ default:
+ break;
+ }
+
+ if (_vm->_awayMission.love.canister2 >= 1 && _vm->_awayMission.love.canister2 <= 3)
+ loadActorAnim(OBJECT_CAN2, canName, 0xb1, 0xaf, 0);
+
+ if (_vm->_awayMission.love.gasFeedOn)
+ loadActorAnim(OBJECT_GAS_FEED, "s3r3vo", 0xac, 0x75, 0);
+ else
+ loadActorAnim(OBJECT_GAS_FEED, "s3r3vc", 0xac, 0x75, 0);
+
+ if (_vm->_awayMission.love.cabinetOpen)
+ loadActorAnim(OBJECT_CABINET, "s3r3d1o", 0x1e, 0xaf, 0);
+ else
+ loadActorAnim(OBJECT_CABINET, "s3r3d1c", 0x1e, 0xaf, 0);
+
+ if (_vm->_awayMission.love.cabinetOpen && !haveItem(OBJECT_IANTIGRA))
+ loadActorAnim(OBJECT_ANTIGRAV, "antigr", 0x1f, 0xa7, 0);
+
+ if (_vm->_awayMission.love.field35 != 0)
+ loadActorAnim(OBJECT_SYNTHESIZER_DOOR, "s3r3d2o", 0x8a, 0x8d, 0);
+ else
+ loadActorAnim(OBJECT_SYNTHESIZER_DOOR, "s3r3d2c", 0x8a, 0x8d, 0);
+
+ bool valid = true;
+
+ switch (_vm->_awayMission.love.field35) {
+ case 1:
+ strcpy(_roomVar.love2.d6, "pbcanm");
+ _roomVar.love2.d2 = 0x10;
+ break;
+ case 2:
+ strcpy(_roomVar.love2.d6, "dishes");
+ _roomVar.love2.d2 = 0x11;
+ break;
+ case 3:
+ strcpy(_roomVar.love2.d6, "dishes");
+ _roomVar.love2.d2 = 0x12;
+ break;
+ case 9:
+ switch (_vm->_awayMission.love.synthesizerProduct) {
+ case 1:
+ strcpy(_roomVar.love2.d8, "btle1");
+ _roomVar.love2.d2 = 0x0f;
+ break;
+ case 2:
+ strcpy(_roomVar.love2.d8, "btle2");
+ _roomVar.love2.d2 = 0x0f;
+ break;
+ case 3:
+ strcpy(_roomVar.love2.d8, "btle3");
+ _roomVar.love2.d2 = 0x0f;
+ break;
+ case 4:
+ strcpy(_roomVar.love2.d8, "btle4");
+ _roomVar.love2.d2 = 0x0f;
+ break;
+ default:
+ strcpy(_roomVar.love2.d8, "cure");
+ _roomVar.love2.d2 = 0x13;
+ break;
+ }
+ break;
+ default:
+ valid = false;
+ break;
+ }
+
+ if (valid) {
+ if (_vm->_awayMission.love.field35 == 9)
+ loadActorAnim2(_roomVar.love2.d2, _roomVar.love2.d8, 0x8a, 0x8b, 0);
+ else
+ loadActorAnim2(_roomVar.love2.d2, _roomVar.love2.d6, 0x8a, 0x8b, 0);
+ }
+
+ if (_vm->_awayMission.love.field2c)
+ _vm->_awayMission.timers[0] = getRandomWordInRange(200, 400);
+ if (_vm->_awayMission.love.field2d)
+ _vm->_awayMission.timers[1] = getRandomWordInRange(200, 400);
+ _vm->_awayMission.timers[2] = 200;
+
+ loadActorAnim(OBJECT_DOOR, "s3r3d3a", 0x12a, 0xb5, 0);
+
+ _roomVar.love2._2966 = 0xc9;
+ _roomVar.love2._2967 = 0xb7;
+}
+
+void Room::love2TouchedWarp1() {
+ _vm->_awayMission.disableInput = true;
+ playSoundEffectIndex(SND_DOOR1);
+ _vm->_awayMission.timers[3] = 10;
+}
+
+void Room::love2Timer3Expired() {
+ loadRoomIndex(0, 0);
+}
+
+void Room::love2WalkToDoor() {
+ _vm->_awayMission.disableInput = true;
+ _roomVar.love2.walkingToDoor = true;
+ walkCrewman(OBJECT_KIRK, 0x127, 0xba, 14);
+}
+
+// Triggers door opening
+void Room::love2TouchedHotspot0() {
+ if (_roomVar.love2.walkingToDoor) {
+ loadActorAnim(OBJECT_DOOR, "s3r3d3", 0x12a, 0xb5, 1);
+ playSoundEffectIndex(SND_DOOR1);
+ }
+}
+
+void Room::love2DoorReachedOrOpened() {
+ _roomVar.love2.doorOpenCounter++;
+ if (_roomVar.love2.doorOpenCounter == 2)
+ loadRoomIndex(1, 1);
+}
+
+void Room::love2LookAtCabinet() {
+ showText(TX_LOV2N027);
+}
+
+void Room::love2LookAtDoor() {
+ showText(TX_LOV2N001);
+}
+
+void Room::love2LookAtSynthesizer() {
+ showText(TX_LOV2N028);
+}
+
+void Room::love2LookAtAnywhere() {
+ showText(TX_LOV2N026);
+}
+
+void Room::love2LookAtAntigrav() {
+ showText(TX_LOV2N006);
+}
+
+void Room::love2LookAtMccoy() {
+ showText(TX_LOV2N011);
+}
+
+void Room::love2LookAtSpock() {
+ showText(TX_LOV2N014);
+}
+
+void Room::love2LookAtRedshirt() {
+ showText(TX_LOV2N010);
+}
+
+void Room::love2LookAtKirk() {
+ showText(TX_LOV2N009);
+}
+
+void Room::love2LookAtArdak() {
+ showText(TX_LOV2N045);
+ showText(TX_SPEAKER_SPOCK, TX_LOV2_037);
+}
+
+void Room::love2LookAtChamber() {
+ showText(TX_LOV2N029);
+ showText(TX_SPEAKER_SPOCK, TX_LOV2_035);
+ showText(TX_SPEAKER_MCCOY, TX_LOV2_019);
+ showText(TX_SPEAKER_SPOCK, TX_LOV2_033);
+ showText(TX_SPEAKER_MCCOY, TX_LOV2_016);
+}
+
+void Room::love2LookAtCan1() {
+ switch (_vm->_awayMission.love.canister1) {
+ case CANTYPE_O2:
+ showText(TX_LOV2N004);
+ break;
+ case CANTYPE_H2:
+ showText(TX_LOV2N002);
+ break;
+ case CANTYPE_N2:
+ default:
+ showText(TX_LOV2N003);
+ break;
+ }
+}
+
+void Room::love2LookAtCan2() {
+ switch (_vm->_awayMission.love.canister2) {
+ case CANTYPE_O2:
+ showText(TX_LOV2N004);
+ break;
+ case CANTYPE_H2:
+ showText(TX_LOV2N002);
+ break;
+ case CANTYPE_N2:
+ default:
+ showText(TX_LOV2N003);
+ break;
+ }
+}
+
+void Room::love2TalkToKirk() {
+ showText(TX_SPEAKER_KIRK, TX_LOV2_001);
+}
+
+void Room::love2TalkToSpock() {
+ showText(TX_SPEAKER_SPOCK, TX_LOV2_029);
+}
+
+void Room::love2TalkToMccoy() {
+ showText(TX_SPEAKER_MCCOY, TX_LOV2_009);
+}
+
+void Room::love2TalkToRedshirt() {
+ showText(TX_SPEAKER_FERRIS, TX_LOV2_041);
+}
+
+void Room::love2UseMTricorderAnywhere() {
+ if (_vm->_awayMission.love.knowAboutVirus)
+ mccoyScan(DIR_S, TX_LOV2_008, false);
+ else
+ // BUGFIX: should be TX_LOV2_012, but the audio file is missing. Using equivalent
+ // audio from another room.
+ mccoyScan(DIR_S, TX_LOV1_010, false);
+}
+
+void Room::love2UseSTricorderAnywhere() {
+ spockScan(DIR_S, TX_LOV2_027, false);
+}
+
+void Room::love2UseKirkOnCabinet() {
+ _roomVar.love2.d2 = OBJECT_KIRK;
+ walkCrewman(OBJECT_KIRK, 0x2b, 0xbb, 12);
+}
+
+void Room::love2UseSpockOnCabinet() {
+ _roomVar.love2.d2 = OBJECT_SPOCK;
+ walkCrewman(OBJECT_SPOCK, 0x2b, 0xbb, 12);
+}
+
+void Room::love2UseMccoyOnCabinet() {
+ _roomVar.love2.d2 = OBJECT_MCCOY;
+ walkCrewman(OBJECT_MCCOY, 0x2b, 0xbb, 12);
+}
+
+void Room::love2UseRedshirtOnCabinet() {
+ _roomVar.love2.d2 = OBJECT_REDSHIRT;
+ walkCrewman(OBJECT_REDSHIRT, 0x2b, 0xbb, 12);
+}
+
+void Room::love2CrewmanReachedCabinet() {
+ Common::String anim = _vm->getCrewmanAnimFilename(_roomVar.love2.d2, "usehw");
+ loadActorAnim2(_roomVar.love2.d2, anim, -1, -1, 11);
+}
+
+void Room::love2CrewmanAccessedCabinet() {
+ if (_vm->_awayMission.love.cabinetOpen)
+ loadActorAnim2(OBJECT_CABINET, "s3r3d4", 0x1e, 0xaf, 2);
+ else
+ loadActorAnim2(OBJECT_CABINET, "s3r3d1", 0x1e, 0xaf, 2);
+
+ playSoundEffectIndex(SND_DOOR1);
+
+ if (_vm->_awayMission.love.cabinetOpen)
+ loadActorStandAnim(OBJECT_ANTIGRAV);
+
+ _vm->_awayMission.love.cabinetOpen = !_vm->_awayMission.love.cabinetOpen;
+}
+
+void Room::love2CrewmanOpenedOrClosedCabinet() {
+ if (_vm->_awayMission.love.cabinetOpen && !haveItem(OBJECT_IANTIGRA))
+ loadActorAnim(OBJECT_ANTIGRAV, "antigr", 0x1f, 0xa7, 0);
+}
+
+void Room::love2UseWrenchOnGasFeed() {
+ walkCrewman(OBJECT_KIRK, 0xa8, 0xb7, 1);
+}
+
+void Room::love2ReachedGasFeed() {
+ loadActorAnim2(OBJECT_KIRK, "kusehn", -1, -1, 12);
+ playVoc("MUR3E1S");
+}
+
+void Room::love2ChangedGasFeed() {
+ if (_vm->_awayMission.love.gasFeedOn) {
+ _vm->_awayMission.love.gasFeedOn = false;
+ loadActorAnim2(OBJECT_GAS_FEED, "s3r3v2", 0xac, 0x75, 0);
+ showText(TX_LOV2N007);
+ }
+ else {
+ _vm->_awayMission.love.gasFeedOn = true;
+ loadActorAnim2(OBJECT_GAS_FEED, "s3r3v1", 0xac, 0x75, 0);
+ showText(TX_LOV2N008);
+ }
+}
+
+void Room::love2UseO2GasOnCanisterSlot() {
+ _roomVar.love2.canisterType = CANTYPE_O2;
+ strcpy(_roomVar.love2.canisterAnim, "o2can");
+ _roomVar.love2.canisterItem = OBJECT_IO2GAS;
+ walkCrewman(OBJECT_KIRK, 0xa8, 0xb7, 3);
+}
+
+void Room::love2UseH2GasOnCanisterSlot() {
+ _roomVar.love2.canisterType = CANTYPE_H2;
+ strcpy(_roomVar.love2.canisterAnim, "h2can");
+ _roomVar.love2.canisterItem = OBJECT_IH2GAS;
+ walkCrewman(OBJECT_KIRK, 0xa8, 0xb7, 3);
+}
+
+void Room::love2UseN2GasOnCanisterSlot() {
+ _roomVar.love2.canisterType = CANTYPE_N2;
+ strcpy(_roomVar.love2.canisterAnim, "n2can");
+ _roomVar.love2.canisterItem = OBJECT_IN2GAS;
+ walkCrewman(OBJECT_KIRK, 0xa8, 0xb7, 3);
+}
+
+void Room::love2ReachedCanisterSlot() {
+ if (_vm->_awayMission.love.gasFeedOn)
+ showText(TX_SPEAKER_SPOCK, TX_LOV2_026);
+ else {
+ if (_vm->_awayMission.love.canister1 == CANTYPE_NONE)
+ loadActorAnim2(OBJECT_KIRK, "kusehn", -1, -1, 13);
+ else if (_vm->_awayMission.love.canister2 == CANTYPE_NONE)
+ loadActorAnim2(OBJECT_KIRK, "kusehn", -1, -1, 14);
+ else
+ showText(TX_LOV2N024);
+ }
+}
+
+void Room::love2PutCanisterInSlot1() {
+ playVoc("SE6FOOD");
+ loadActorAnim(OBJECT_CAN1, _roomVar.love2.canisterAnim, 0xa7, 0xae, 0);
+ _vm->_awayMission.love.canister1 = _roomVar.love2.canisterType;
+ showText(TX_LOV2N034);
+ loseItem(_roomVar.love2.canisterItem);
+}
+
+void Room::love2PutCanisterInSlot2() {
+ playVoc("SE6FOOD");
+ loadActorAnim(OBJECT_CAN2, _roomVar.love2.canisterAnim, 0xb1, 0xaf, 0);
+ _vm->_awayMission.love.canister2 = _roomVar.love2.canisterType;
+ showText(TX_LOV2N035);
+ loseItem(_roomVar.love2.canisterItem);
+}
+
+void Room::love2UseAntigravOnCanister1() {
+ walkCrewman(OBJECT_KIRK, 0xa8, 0xb7, 4);
+}
+
+void Room::love2ReachedCanisterSlot1ToGet() {
+ if (_vm->_awayMission.love.gasFeedOn)
+ showText(TX_SPEAKER_SPOCK, TX_LOV2_025);
+ else {
+ loadActorAnim2(OBJECT_KIRK, "kusehn", -1, -1, 15);
+ // BUGFIX: original game only played this for canister 2
+ playVoc("SEPLBAT");
+ }
+}
+
+void Room::love2TookCanister1() {
+ showText(TX_LOV2N030);
+ loadActorStandAnim(OBJECT_CAN1);
+
+ switch (_vm->_awayMission.love.canister1) {
+ case CANTYPE_O2:
+ giveItem(OBJECT_IO2GAS);
+ break;
+ case CANTYPE_H2:
+ giveItem(OBJECT_IH2GAS);
+ break;
+ case CANTYPE_N2:
+ default:
+ giveItem(OBJECT_IN2GAS);
+ break;
+ }
+}
+
+void Room::love2UseAntigravOnCanister2() {
+ walkCrewman(OBJECT_KIRK, 0xa8, 0xb7, 5);
+}
+
+void Room::love2ReachedCanisterSlot2ToGet() {
+ if (_vm->_awayMission.love.gasFeedOn)
+ showText(TX_SPEAKER_SPOCK, TX_LOV2_025);
+ else {
+ loadActorAnim2(OBJECT_KIRK, "kusehn", -1, -1, 16);
+ playVoc("SEPLBAT");
+ }
+}
+
+void Room::love2TookCanister2() {
+ showText(TX_LOV2N031);
+ loadActorStandAnim(OBJECT_CAN2);
+
+ switch (_vm->_awayMission.love.canister2) {
+ case CANTYPE_O2:
+ giveItem(OBJECT_IO2GAS);
+ break;
+ case CANTYPE_H2:
+ giveItem(OBJECT_IH2GAS);
+ break;
+ case CANTYPE_N2:
+ default:
+ giveItem(OBJECT_IN2GAS);
+ break;
+ }
+}
+
+void Room::love2UseKirkOnSynthesizer() {
+ _roomVar.love2.d2 = OBJECT_KIRK;
+ walkCrewman(_roomVar.love2.d2, 0x46, 0xae, 13);
+}
+
+void Room::love2UseSpockOnSynthesizer() {
+ _roomVar.love2.d2 = OBJECT_SPOCK;
+ walkCrewman(_roomVar.love2.d2, 0x46, 0xae, 13);
+}
+
+void Room::love2UseMccoyOnSynthesizer() {
+ _roomVar.love2.d2 = OBJECT_MCCOY;
+ walkCrewman(_roomVar.love2.d2, 0x46, 0xae, 13);
+}
+
+void Room::love2UseRedshirtOnSynthesizer() {
+ _roomVar.love2.d2 = OBJECT_REDSHIRT;
+ walkCrewman(_roomVar.love2.d2, 0x46, 0xae, 13);
+}
+
+void Room::love2CrewmanReachedSynthesizer() {
+ Common::String anim = _vm->getCrewmanAnimFilename(_roomVar.love2.d2, "usemn");
+ loadActorAnim2(_roomVar.love2.d2, anim, -1, -1, 17);
+}
+
+void Room::love2CrewmanUsedSynthesizer() {
+ if (_vm->_awayMission.love.gasFeedOn) {
+ love2UseSynthesizer();
+ }
+ else {
+ if (_roomVar.love2.cb == 3) {
+ if (haveItem(OBJECT_IWRENCH)) {
+ showText(TX_SPEAKER_SPOCK, TX_LOV2_005);
+ walkCrewman(OBJECT_SPOCK, 0xa8, 0xb7, 16);
+ }
+ else
+ showText(TX_SPEAKER_SPOCK, TX_LOV2_006);
+ }
+ else {
+ _roomVar.love2.cb++;
+ showText(TX_LOV2N012);
+ }
+ }
+}
+
+
+void Room::love2SpockReachedGasFeeds() {
+ loadActorAnim2(OBJECT_SPOCK, "susehn", -1, -1, 18);
+}
+
+void Room::love2SpockEnabledGasFeeds() {
+ _vm->_awayMission.love.gasFeedOn = true;
+
+ loadActorAnim2(OBJECT_GAS_FEED, "s3r3v1", 0xac, 0x75, 0);
+ showText(TX_LOV2N008);
+ walkCrewman(OBJECT_SPOCK, 0xc6, 0xbb, 0);
+
+ love2UseSynthesizer();
+}
+
+void Room::love2UseSynthesizer() {
+ if (_vm->_awayMission.love.canister1 != 0) {
+ if (_vm->_awayMission.love.canister2 != 0) {
+ // TODO
+ loadActorAnim(OBJECT_SYNTHESIZER_DOOR, "s3r3d2", 0x8a, 0x8d, 3);
+ playSoundEffectIndex(SND_DOOR1);
+ }
+ else {
+ playVoc("EFX24");
+ showText(TX_LOV2N005);
+ showText(TX_SPEAKER_MCCOY, TX_LOV2_010);
+ }
+ }
+ else {
+ playVoc("EFX24");
+ showText(TX_SPEAKER_SPOCK, TX_LOV2N005);
+ showText(TX_SPEAKER_SPOCK, TX_LOV2_024);
+ }
+}
+
+void Room::love2SynthesizerDoorClosed() {
+ playVoc("LD1SCAN");
+ loadActorAnim(OBJECT_SYNTHESIZER_OUTPUT, _roomVar.love2.d8, 0x8a, 0x8d, 4);
+ _vm->_awayMission.love.field35 = 9;
+}
+
+// Final product of synthesizer is produced
+void Room::love2SynthesizerFinished() {
+ switch (_vm->_awayMission.love.synthesizerProduct) {
+ case BOTTLETYPE_N2O:
+ showText(TX_LOV2N017);
+ showText(TX_SPEAKER_SPOCK, TX_LOV2_032);
+ showText(TX_SPEAKER_MCCOY, TX_LOV2_015);
+ showText(TX_SPEAKER_SPOCK, TX_LOV2_036);
+ break;
+
+ case BOTTLETYPE_NH3:
+ showText(TX_LOV2N016);
+ if (!_vm->_awayMission.redshirtDead) {
+ showText(TX_SPEAKER_FERRIS, TX_LOV2_043);
+ showText(TX_SPEAKER_KIRK, TX_LOV2_003);
+ }
+ break;
+
+ case BOTTLETYPE_H2O:
+ showText(TX_LOV2N018);
+ showText(TX_SPEAKER_SPOCK, TX_LOV2_004);
+ break;
+
+ case BOTTLETYPE_RLG:
+ default:
+ showText(TX_LOV2N019);
+ showText(TX_SPEAKER_SPOCK, TX_LOV2_031);
+ showText(TX_SPEAKER_MCCOY, TX_LOV2_018);
+ showText(TX_SPEAKER_SPOCK, TX_LOV2_030);
+ showText(TX_SPEAKER_MCCOY, TX_LOV2_022);
+ showText(TX_SPEAKER_SPOCK, TX_LOV2_038);
+ break;
+ }
+}
+
+void Room::love2FinishedAnimation27() {
+ // TODO: better name
+ _vm->_awayMission.love.synthesizerProduct = BOTTLETYPE_RLG;
+ strcpy(_roomVar.love2.d8, "btle4");
+ loadActorAnim(OBJECT_SYNTHESIZER_DOOR, "s3r3d2", 0x8a, 0x8d, 3);
+ playSoundEffectIndex(SND_DOOR1);
+}
+
+
+// Put polycarbonate in synthesizer
+void Room::love2UsePolyberylcarbonateOnSynthesizerDoor() {
+ walkCrewman(OBJECT_KIRK, 0x85, 0xad, 6);
+ _vm->_awayMission.crewDirectionsAfterWalk[OBJECT_KIRK] = DIR_N;
+}
+
+void Room::love2KirkReachedSynthesizerWithPolyberylcarbonate() {
+ if (_vm->_awayMission.love.field35 != 0)
+ showText(TX_LOV2N025);
+ else {
+ loadActorAnim(OBJECT_SYNTHESIZER_DOOR, "s3r3d2", 0x8a, 0x8d, 5);
+ playSoundEffectIndex(SND_DOOR1);
+ }
+}
+
+void Room::love2SynthesizerDoorOpenedWithPolyberylcarbonate() {
+ loadActorAnim2(OBJECT_KIRK, "kusemn", -1, -1, 19);
+}
+
+void Room::love2PutPolyberylcarbonateInSynthesizer() {
+ loadActorAnim(OBJECT_POLYBERYLCARBONATE, "pbcanm", 0x8a, 0x8b, 0);
+ loseItem(OBJECT_IPBC);
+ _vm->_awayMission.love.field35 = 1;
+}
+
+
+// Put dish (virus sample) in synthesizer
+void Room::love2UseDishesOnSynthesizerDoor() {
+ walkCrewman(OBJECT_KIRK, 0x85, 0xad, 7);
+ _vm->_awayMission.crewDirectionsAfterWalk[OBJECT_KIRK] = DIR_N;
+}
+
+void Room::love2KirkReachedSynthesizerWithDishes() {
+ if (_vm->_awayMission.love.field35 != 0)
+ showText(TX_LOV2N025);
+ else {
+ loadActorAnim(OBJECT_SYNTHESIZER_DOOR, "s3r3d2", 0x8a, 0x8d, 6);
+ playSoundEffectIndex(SND_DOOR1);
+ }
+}
+
+void Room::love2SynthesizerDoorOpenedWithDishes() {
+ loadActorAnim2(OBJECT_KIRK, "kusemn", -1, -1, 20);
+}
+
+void Room::love2PutDishesInSynthesizer() {
+ loadActorAnim(OBJECT_DISHES, "dishes", 0x8a, 0x8b, 0);
+ loseItem(OBJECT_IDISHES);
+ _vm->_awayMission.love.field35 = 2;
+}
+
+
+// Put cure sample in synthesizer
+void Room::love2UseSampleOnSynthesizerDoor() {
+ walkCrewman(OBJECT_KIRK, 0x85, 0xad, 8);
+ _vm->_awayMission.crewDirectionsAfterWalk[OBJECT_KIRK] = DIR_N;
+}
+
+void Room::love2KirkReachedSynthesizerWithSample() {
+ if (_vm->_awayMission.love.field35 != 0)
+ showText(TX_LOV2N025); // BUGFIX: original didn't play audio
+ else {
+ loadActorAnim(OBJECT_SYNTHESIZER_DOOR, "s3r3d2", 0x8a, 0x8d, 7);
+ playSoundEffectIndex(SND_DOOR1);
+ }
+}
+
+void Room::love2SynthesizerDoorOpenedWithSample() {
+ loadActorAnim2(OBJECT_KIRK, "kusemn", -1, -1, 21);
+}
+
+void Room::love2PutSampleInSynthesizer() {
+ loadActorAnim(OBJECT_CURESAMPLE, "dishes", 0x8a, 0x8b, 0);
+ loseItem(OBJECT_ISAMPLE);
+ _vm->_awayMission.love.field35 = 3;
+}
+
+
+
+void Room::love2UseAnythingOnSynthesizerDoor() {
+ showText(TX_SPEAKER_MCCOY, TX_LOV2_014);
+}
+
+void Room::love2UseAnythingOnSynthesizer() {
+ showText(TX_SPEAKER_SPOCK, TX_LOV2_007);
+}
+
+void Room::love2GetCanister() {
+ if (_vm->_awayMission.redshirtDead)
+ showText(TX_SPEAKER_MCCOY, TX_LOV2_011);
+ else
+ showText(TX_SPEAKER_FERRIS, TX_LOV2_040);
+}
+
+
+// Get antigrav from cabinet
+void Room::love2GetAntigrav() {
+ walkCrewman(OBJECT_KIRK, 0x37, 0xb4, 9);
+}
+
+void Room::love2ReachedAntigrav() {
+ loadActorAnim2(OBJECT_KIRK, "kusehw", -1, -1, 22);
+}
+
+void Room::love2GotAntigrav() {
+ loadActorStandAnim(OBJECT_ANTIGRAV);
+ giveItem(OBJECT_IANTIGRA);
+ showText(TX_LOV2N042);
+}
+
+
+// Get polyberylcarbonate from synthesizer
+void Room::love2GetPolyberylcarbonate() {
+ walkCrewman(OBJECT_KIRK, 0x85, 0xad, 18);
+ _vm->_awayMission.crewDirectionsAfterWalk[OBJECT_KIRK] = DIR_N;
+}
+
+void Room::love2ReachedPolyberylcarbonate() {
+ loadActorAnim2(OBJECT_KIRK, "kusemn", -1, -1, 26);
+}
+
+void Room::love2GotPolyberylcarbonate() {
+ loadActorStandAnim(OBJECT_POLYBERYLCARBONATE);
+ showText(TX_LOV2N044);
+ giveItem(OBJECT_IPBC);
+ _vm->_awayMission.love.field35 = 0;
+ loadActorAnim(OBJECT_SYNTHESIZER_DOOR, "s3r3d5", 0x8a, 0x8d, 0);
+ playSoundEffectIndex(SND_DOOR1);
+}
+
+
+// Get virus sample from synthesizer
+void Room::love2GetDishes() {
+ walkCrewman(OBJECT_KIRK, 0x85, 0xad, 17);
+ _vm->_awayMission.crewDirectionsAfterWalk[OBJECT_KIRK] = DIR_N;
+}
+
+void Room::love2ReachedDishes() {
+ loadActorAnim2(OBJECT_KIRK, "kusemn", -1, -1, 25);
+}
+
+void Room::love2GotDishes() {
+ loadActorStandAnim(OBJECT_DISHES);
+ showText(TX_LOV2N036);
+ giveItem(OBJECT_IDISHES);
+ _vm->_awayMission.love.field35 = 0;
+ loadActorAnim(OBJECT_SYNTHESIZER_DOOR, "s3r3d5", 0x8a, 0x8d, 0);
+ playSoundEffectIndex(SND_DOOR1);
+}
+
+
+// Get cure sample from synthesizer
+void Room::love2GetSample() {
+ walkCrewman(OBJECT_KIRK, 0x85, 0xad, 19);
+ _vm->_awayMission.crewDirectionsAfterWalk[OBJECT_KIRK] = DIR_N;
+}
+
+void Room::love2ReachedSample() {
+ loadActorAnim2(OBJECT_KIRK, "kusemn", -1, -1, 28);
+}
+
+void Room::love2GotSample() {
+ loadActorStandAnim(OBJECT_CURESAMPLE);
+ showText(TX_LOV2N037);
+ giveItem(OBJECT_ISAMPLE);
+ _vm->_awayMission.love.field35 = 0;
+ loadActorAnim(OBJECT_SYNTHESIZER_DOOR, "s3r3d5", 0x8a, 0x8d, 0);
+ playSoundEffectIndex(SND_DOOR1);
+}
+
+
+// Get synthesizer output
+void Room::love2GetSynthesizerOutput() {
+ walkCrewman(OBJECT_KIRK, 0x85, 0xad, 10);
+ _vm->_awayMission.crewDirectionsAfterWalk[OBJECT_KIRK] = DIR_N;
+}
+
+void Room::love2ReachedSynthesizerOutput() {
+ loadActorAnim2(OBJECT_KIRK, "kusemn", -1, -1, 23);
+}
+
+void Room::love2GotSynthesizerOutput() {
+ switch (_vm->_awayMission.love.synthesizerProduct) {
+ case BOTTLETYPE_N2O:
+ showText(TX_LOV2N040);
+ giveItem(OBJECT_IN2O);
+ break;
+
+ case BOTTLETYPE_NH3:
+ showText(TX_LOV2N039);
+ giveItem(OBJECT_INH3);
+ break;
+
+ case BOTTLETYPE_H2O:
+ showText(TX_LOV2N041);
+ giveItem(OBJECT_IH2O);
+ break;
+
+ case BOTTLETYPE_RLG:
+ default:
+ showText(TX_LOV2N038);
+ if (!_vm->_awayMission.love.gotTLDH) {
+ _vm->_awayMission.love.gotTLDH = true;
+ _vm->_awayMission.love.missionScore += 4;
+ }
+ giveItem(OBJECT_IRLG);
+ break;
+ }
+
+ loadActorStandAnim(OBJECT_SYNTHESIZER_OUTPUT);
+ loadActorAnim(OBJECT_SYNTHESIZER_DOOR, "s3r3d5", 0x8a, 0x8d, 0);
+ playSoundEffectIndex(SND_DOOR1);
+
+ _vm->_awayMission.love.field35 = 0;
+ _vm->_awayMission.love.synthesizerProduct = 0;
+}
+
+// Get the cure
+void Room::love2GetCure() {
+ walkCrewman(OBJECT_KIRK, 0x85, 0xad, 11);
+ _vm->_awayMission.crewDirectionsAfterWalk[OBJECT_KIRK] = DIR_N;
+}
+
+void Room::love2ReachedCure() {
+ loadActorAnim2(OBJECT_KIRK, "kusemn", -1, -1, 24);
+}
+
+void Room::love2GotCure() {
+ if (!_vm->_awayMission.love.gotCure) {
+ _vm->_awayMission.love.gotCure = true;
+ _vm->_awayMission.love.missionScore += 5;
+ }
+
+ giveItem(OBJECT_ICURE);
+ loadActorStandAnim(OBJECT_CURE);
+ showText(TX_LOV2N043);
+ loadActorAnim(OBJECT_SYNTHESIZER_DOOR, "s3r3d5", 0x8a, 0x8d, 0);
+ playSoundEffectIndex(SND_DOOR1);
+ _vm->_awayMission.love.field35 = 0;
}
}
diff --git a/engines/startrek/startrek.cpp b/engines/startrek/startrek.cpp
index 4fd6b404ae..26c8c54393 100644
--- a/engines/startrek/startrek.cpp
+++ b/engines/startrek/startrek.cpp
@@ -84,7 +84,7 @@ StarTrekEngine::StarTrekEngine(OSystem *syst, const StarTrekGameDescription *gam
_textboxHasMultipleChoices = false;
_missionToLoad = "LOVE";
- _roomIndexToLoad = 0;
+ _roomIndexToLoad = 2;
for (int i = 0; i < NUM_OBJECTS; i++)
_itemList[i] = g_itemList[i];
diff --git a/engines/startrek/text.h b/engines/startrek/text.h
index 81a198d4f3..b6b1c0d1f8 100644
--- a/engines/startrek/text.h
+++ b/engines/startrek/text.h
@@ -796,7 +796,6 @@ enum GameStringIDs {
TX_LOV0N007,
TX_LOV0N008,
TX_LOV0N009,
- TX_LOV2N005,
TX_LOV5_015,
TX_LOV5_019,
TX_LOV5_027,
@@ -873,6 +872,97 @@ enum GameStringIDs {
TX_LOV1N035,
+ TX_LOV2_001,
+ TX_LOV2_002,
+ TX_LOV2_003,
+ TX_LOV2_004,
+ TX_LOV2_005,
+ TX_LOV2_006,
+ TX_LOV2_007,
+ TX_LOV2_008,
+ TX_LOV2_009,
+ TX_LOV2_010,
+ TX_LOV2_011,
+ TX_LOV2_012,
+ TX_LOV2_014,
+ TX_LOV2_015,
+ TX_LOV2_016,
+ TX_LOV2_017,
+ TX_LOV2_018,
+ TX_LOV2_019,
+ TX_LOV2_020,
+ TX_LOV2_021,
+ TX_LOV2_022,
+ TX_LOV2_023,
+ TX_LOV2_024,
+ TX_LOV2_025,
+ TX_LOV2_026,
+ TX_LOV2_027,
+ TX_LOV2_028,
+ TX_LOV2_029,
+ TX_LOV2_030,
+ TX_LOV2_031,
+ TX_LOV2_032,
+ TX_LOV2_033,
+ TX_LOV2_034,
+ TX_LOV2_035,
+ TX_LOV2_036,
+ TX_LOV2_037,
+ TX_LOV2_038,
+ TX_LOV2_039,
+ TX_LOV2_040,
+ TX_LOV2_041,
+ TX_LOV2_043,
+ TX_LOV2N000,
+ TX_LOV2N001,
+ TX_LOV2N002,
+ TX_LOV2N003,
+ TX_LOV2N004,
+ TX_LOV2N005,
+ TX_LOV2N006,
+ TX_LOV2N007,
+ TX_LOV2N008,
+ TX_LOV2N009,
+ TX_LOV2N010,
+ TX_LOV2N011,
+ TX_LOV2N012,
+ TX_LOV2N013,
+ TX_LOV2N014,
+ TX_LOV2N015,
+ TX_LOV2N016,
+ TX_LOV2N017,
+ TX_LOV2N018,
+ TX_LOV2N019,
+ TX_LOV2N024,
+ TX_LOV2N025,
+ TX_LOV2N026,
+ TX_LOV2N027,
+ TX_LOV2N028,
+ TX_LOV2N029,
+ TX_LOV2N030,
+ TX_LOV2N031,
+ TX_LOV2N033,
+ TX_LOV2N034,
+ TX_LOV2N035,
+ TX_LOV2N036,
+ TX_LOV2N037,
+ TX_LOV2N038,
+ TX_LOV2N039,
+ TX_LOV2N040,
+ TX_LOV2N041,
+ TX_LOV2N042,
+ TX_LOV2N043,
+ TX_LOV2N044,
+ TX_LOV2N045,
+ TX_LOV2N046,
+ TX_LOV2N047,
+ TX_LOV2N048,
+ TX_LOV2N049,
+ TX_LOV2N050,
+ TX_LOV2N051,
+
+
+
TX_END
};
@@ -1616,7 +1706,6 @@ const char * const g_gameStrings[] = {
"#LOV0\\LOV0N007#This is a heavily secured door, leading to another section of the station. Its access code has been breached.",
"#LOV0\\LOV0N008#This is a standard door, leading to another room on this deck.",
"#LOV0\\LOV0N009#You are on the bridge of the ARK7.",
- "#LOV2\\LOV2N005#A loud hissing fills the room.",
"#LOV5\\LOV5_015#He's already cured, Jim.",
"#LOV5\\LOV5_019#I don't have the proper medicine to cure him, Jim.",
"#LOV5\\LOV5_027#Finally, a human response!",
@@ -1691,6 +1780,96 @@ const char * const g_gameStrings[] = {
"#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.",
+
+
+ "#LOV2\\LOV2_001#Well, gentlemen, I believe this equipment may be of some use.",
+ "#LOV2\\LOV2_002#I think we can call that one a failure, Bones.",
+ "#LOV2\\LOV2_003#I think we can set this aside and not worry about it.",
+ "#LOV2\\LOV2_004#A clean drink of water, but I don't see its application in the context of our difficulties, Captain.",
+ "#LOV2\\LOV2_005#Captain, I see the problem: the gas feeds are turned off. If you'll permit me...",
+ "#LOV2\\LOV2_006#Captain, I see the problem: the gas feeds are turned off.",
+ "#LOV2\\LOV2_007#Fascinating, Captain, but it doesn't appear to get us any closer to our goal.",
+ "#LOV2\\LOV2_008#Except for the Oroborus virus, I'm not picking up anything unusual.",
+ "#LOV2\\LOV2_009#Go bother Spock. This is the kind of place he likes.",
+ "#LOV2\\LOV2_010#I think I'll stick to combining two gases in future experiments. That's how the machine's designed, after all.",
+ "#LOV2\\LOV2_011#I wouldn't try to lift that. You might hurt yourself.",
+ "#LOV2\\LOV2_012#I'm picking up some strange, airborne virus. I can't identify it without more information.", // BUG: audio file missing
+ "#LOV2\\LOV2_014#That's not the right material to put in there, Jim.",
+ "#LOV2\\LOV2_015#Do you mean to say it's undignified, Spock?",
+ "#LOV2\\LOV2_016#I rest my case.",
+ "#LOV2\\LOV2_017#I think I'd have more luck hypergrowing the virus in the presence of a limited quantity of gas.",
+ "#LOV2\\LOV2_018#It doesn't affect Vulcans, of course.",
+ "#LOV2\\LOV2_019#Next he'll tell us the DNA molecule is simple!",
+ "#LOV2\\LOV2_020#That's it, Jim. We've got enough serum here to cure everybody on the station!",
+ "#LOV2\\LOV2_021#We must be doing something wrong, Jim.",
+ "#LOV2\\LOV2_022#Why that's just dandy! Vulcan laughing gas!",
+ "#LOV2\\LOV2_023#You're wrong, Spock. Look... the virus culture has been eliminated. That's why it's clear. It'd be more useful for me to see how the virus might grow in the presence of a limited quantity of ammonia gas.",
+ "#LOV2\\LOV2_024#I recommend we follow the design specifications of the machine. Two gas tanks should always be attached before activating it.",
+ "#LOV2\\LOV2_025#I would not recommend removing the canister without turning off the valve.",
+ "#LOV2\\LOV2_026#It would be very dangerous to place the tanks without first turning off the valve.",
+ "#LOV2\\LOV2_027#Nothing unusual is detected.",
+ "#LOV2\\LOV2_028#The machine does not seem to be able to process that particular item.",
+ "#LOV2\\LOV2_029#This is an outstanding facility, Captain.",
+ "#LOV2\\LOV2_030#Actually, Doctor, both Romulans and Vulcans suffer its effects.",
+ "#LOV2\\LOV2_031#An unusual compound, Captain. It can induce laughter and feelings of exhiliration in some, much the way nitrous oxide affects humans.",
+ "#LOV2\\LOV2_032#Be careful with that canister, Captain. I think you would not care to fall under the effects of laughing gas in these straits.",
+ "#LOV2\\LOV2_033#Compared to many molecular models, it is, Doctor.",
+ "#LOV2\\LOV2_034#I don't think that's useful in your experiment, Doctor.", // TYPO (in audio filename)
+ "#LOV2\\LOV2_035#In principle, Captain, this device is quite simple. When this chamber is empty and gas tanks are attached, it will combine the gases to make new compounds. If chemicals are placed in the chamber, the machine will combine them with the gases to create new materials.",
+ "#LOV2\\LOV2_036#It is, at the least, inappropriate for a starship crew on duty, Doctor.",
+ "#LOV2\\LOV2_037#It would take us several hours to get this machine working, Captain. I do not believe we will need it. The synthesis chamber should be able to give us what we need.",
+ "#LOV2\\LOV2_038#Please, Doctor. This is not a laughing matter.",
+ "#LOV2\\LOV2_039#This does not appear to provide us with anything useful.", // TYPO (in audio filename)
+ "#LOV2\\LOV2_040#The can looks much too heavy to carry, sir.",
+ "#LOV2\\LOV2_041#This room is very defensible, Captain -- if things get nasty, we may want to retreat to here.",
+ "#LOV2\\LOV2_043#I hope you don't want me to swab the deck with that, Captain.",
+ "#LOV2\\LOV2N000#You already have the ?.",
+ "#LOV2\\LOV2N001#A door.",
+ "#LOV2\\LOV2N002#A gas tank marked 'H2'.", // TYPO
+ "#LOV2\\LOV2N003#A gas tank marked 'N2',", // TYPO
+ "#LOV2\\LOV2N004#A gas tank marked 'O2'.", // TYPO
+ "#LOV2\\LOV2N005#A loud hissing fills the room.",
+ "#LOV2\\LOV2N006#A small field-effect anti-gravity unit, useful for moving things too heavy to lift and carry by muscle alone.",
+ "#LOV2\\LOV2N007#Gas feed is off.",
+ "#LOV2\\LOV2N008#Gas feed is on.",
+ "#LOV2\\LOV2N009#James Tiberius Kirk.",
+ "#LOV2\\LOV2N010#Lt. Ferris is carefully watching the hallway.", // TYPO
+ "#LOV2\\LOV2N011#McCoy is fidgeting around.",
+ "#LOV2\\LOV2N012#Nothing Happens.",
+ "#LOV2\\LOV2N013#Nothing happens.",
+ "#LOV2\\LOV2N014#Spock is analyzing the surroundings.",
+ "#LOV2\\LOV2N015#The item is much soggier than it used to be, but otherwise undamaged.",
+ "#LOV2\\LOV2N016#The machine synthesizes a liter of ammonia.",
+ "#LOV2\\LOV2N017#The machine synthesizes a liter of nitrous oxide.",
+ "#LOV2\\LOV2N018#The machine synthesizes a liter of pure water.",
+ "#LOV2\\LOV2N019#The machine synthesizes one liter of TLTDH gas.",
+ "#LOV2\\LOV2N024#There is no room for another canister.",
+ "#LOV2\\LOV2N025#There is something already in the chamber.",
+ "#LOV2\\LOV2N026#This is a science lab.",
+ "#LOV2\\LOV2N027#This is a storage cabinet.",
+ "#LOV2\\LOV2N028#This is a synthesizer, used to combine and replicate chemicals and form new compounds. This particular model has twin gas feeds.",
+ "#LOV2\\LOV2N029#This is the door to the synthesis chamber.",
+ "#LOV2\\LOV2N030#You attach the antigrav unit to the gas tank. It can be moved freely.",
+ "#LOV2\\LOV2N031#You attach the antigrav unit to the gas tank. It can be moved freely.",
+ "#LOV2\\LOV2N033#You have synthesized one liter of Romulan Laughing Gas.",
+ "#LOV2\\LOV2N034#You install the gas tank to the synthesizer's feed lines.",
+ "#LOV2\\LOV2N035#You install the gas tank to the synthesizer's feed lines.",
+ "#LOV2\\LOV2N036#Oroborus virus culture taken.",
+ "#LOV2\\LOV2N037#Oroborus virus cure sample taken.",
+ "#LOV2\\LOV2N038#You take a one litre container of TLTDH gas.",
+ "#LOV2\\LOV2N039#You take a one litre container of Ammonia.",
+ "#LOV2\\LOV2N040#You take a one litre container of Nitrous Oxide.",
+ "#LOV2\\LOV2N041#You take a one litre container of pure water.",
+ "#LOV2\\LOV2N042#You take the antigrav unit.",
+ "#LOV2\\LOV2N043#You take the hypo with Oroborus toxin cure.",
+ "#LOV2\\LOV2N044#You take the Polyberylcarbonate.",
+ "#LOV2\\LOV2N045#An Ardak 1000, the last word in molecular replication, one of the most advanced pieces of scientific equipment ever constructed.",
+ "#LOV2\\LOV2N046#The machine synthesizes a quantity serum in a hypo.",
+ "#LOV2\\LOV2N047#The machine synthesizes a quantity of bubbling grey goo.",
+ "#LOV2\\LOV2N048#The machine synthesizes a quantity of colorless goo.",
+ "#LOV2\\LOV2N049#The machine synthesizes a quantity of inert matter.",
+ "#LOV2\\LOV2N050#The machine synthesizes a quantity of wet grey goo.",
+ "#LOV2\\LOV2N051#The machine synthesizes a quantity of wet grey goo.",
};
}