1 /* ScummVM - Graphic Adventure Engine
2  *
3  * ScummVM is the legal property of its developers, whose names
4  * are too numerous to list here. Please refer to the COPYRIGHT
5  * file distributed with this source distribution.
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License
9  * as published by the Free Software Foundation; either version 2
10  * of the License, or (at your option) any later version.
11 
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16 
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20  *
21  */
22 
23 // BUGFIX: some of the audio filenames in the text were incorrect? (see text.h)
24 
25 #include "startrek/room.h"
26 
27 #define OBJECT_CABINET 8
28 #define OBJECT_SYNTHESIZER_DOOR 9
29 #define OBJECT_DOOR 10
30 #define OBJECT_GAS_FEED 11
31 #define OBJECT_CAN1 12
32 #define OBJECT_CAN2 13
33 #define OBJECT_ANTIGRAV 14
34 #define OBJECT_SYNTHESIZER_OUTPUT 15
35 #define OBJECT_POLYBERYLCARBONATE 16
36 #define OBJECT_VIRUSSAMPLE 17
37 #define OBJECT_CURESAMPLE 18
38 #define OBJECT_CURE 19
39 
40 #define HOTSPOT_SYNTHESIZER 0x20
41 #define HOTSPOT_ARDAK 0x21
42 #define HOTSPOT_DOOR 0x22
43 #define HOTSPOT_CANISTER_SLOT 0x23
44 
45 namespace StarTrek {
46 
47 extern const RoomAction love2ActionList[] = {
48 	{ {ACTION_TICK, 1, 0, 0}, &Room::love2Tick1 },
49 	{ {ACTION_TOUCHED_WARP, 1, 0, 0}, &Room::love2TouchedWarp1 },
50 	{ {ACTION_TIMER_EXPIRED, 3, 0, 0}, &Room::love2Timer3Expired },
51 	{ {ACTION_WALK, 10, 0, 0}, &Room::love2WalkToDoor },
52 	{ {ACTION_WALK, 0x22, 0, 0}, &Room::love2WalkToDoor },
53 	{ {ACTION_TOUCHED_HOTSPOT, 0, 0, 0}, &Room::love2TouchedHotspot0 },
54 	{ {ACTION_FINISHED_WALKING, 14, 0, 0}, &Room::love2DoorReachedOrOpened },
55 	{ {ACTION_FINISHED_ANIMATION, 1, 0, 0}, &Room::love2DoorReachedOrOpened },
56 	{ {ACTION_LOOK, 8, 0, 0}, &Room::love2LookAtCabinet },
57 	{ {ACTION_LOOK, 10, 0, 0}, &Room::love2LookAtDoor },
58 	{ {ACTION_LOOK, 0x20, 0, 0}, &Room::love2LookAtSynthesizer },
59 	{ {ACTION_LOOK, 0xff, 0, 0}, &Room::love2LookAtAnywhere },
60 	{ {ACTION_LOOK, 14, 0, 0}, &Room::love2LookAtAntigrav },
61 	{ {ACTION_LOOK, OBJECT_MCCOY, 0, 0}, &Room::love2LookAtMccoy },
62 	{ {ACTION_LOOK, OBJECT_SPOCK, 0, 0}, &Room::love2LookAtSpock },
63 	{ {ACTION_LOOK, OBJECT_REDSHIRT, 0, 0}, &Room::love2LookAtRedshirt },
64 	{ {ACTION_LOOK, OBJECT_KIRK, 0, 0}, &Room::love2LookAtKirk },
65 	{ {ACTION_LOOK, 0x21, 0, 0}, &Room::love2LookAtArdak },
66 	{ {ACTION_LOOK, 15, 0, 0}, &Room::love2LookAtChamber },
67 	{ {ACTION_LOOK, 16, 0, 0}, &Room::love2LookAtChamber },
68 	{ {ACTION_LOOK, 18, 0, 0}, &Room::love2LookAtChamber },
69 	{ {ACTION_LOOK, 19, 0, 0}, &Room::love2LookAtChamber },
70 	{ {ACTION_LOOK, 17, 0, 0}, &Room::love2LookAtChamber },
71 	{ {ACTION_LOOK, 9, 0, 0}, &Room::love2LookAtChamber },
72 	{ {ACTION_LOOK, 12, 0, 0}, &Room::love2LookAtCan1 },
73 	{ {ACTION_LOOK, 13, 0, 0}, &Room::love2LookAtCan2 },
74 	{ {ACTION_TALK, OBJECT_KIRK, 0, 0}, &Room::love2TalkToKirk },
75 	{ {ACTION_TALK, OBJECT_SPOCK, 0, 0}, &Room::love2TalkToSpock },
76 	{ {ACTION_TALK, OBJECT_MCCOY, 0, 0}, &Room::love2TalkToMccoy },
77 	{ {ACTION_TALK, OBJECT_REDSHIRT, 0, 0}, &Room::love2TalkToRedshirt },
78 	{ {ACTION_USE, OBJECT_IMTRICOR, 0xff, 0}, &Room::love2UseMTricorderAnywhere },
79 	{ {ACTION_USE, OBJECT_ISTRICOR, 0xff, 0}, &Room::love2UseSTricorderAnywhere },
80 	{ {ACTION_USE, OBJECT_KIRK, 8, 0}, &Room::love2UseKirkOnCabinet },
81 	{ {ACTION_USE, OBJECT_SPOCK, 8, 0}, &Room::love2UseSpockOnCabinet },
82 	{ {ACTION_USE, OBJECT_MCCOY, 8, 0}, &Room::love2UseMccoyOnCabinet },
83 	{ {ACTION_USE, OBJECT_REDSHIRT, 8, 0}, &Room::love2UseRedshirtOnCabinet },
84 	{ {ACTION_FINISHED_WALKING, 12, 0, 0}, &Room::love2CrewmanReachedCabinet },
85 	{ {ACTION_FINISHED_ANIMATION, 11, 0, 0}, &Room::love2CrewmanAccessedCabinet },
86 	{ {ACTION_FINISHED_ANIMATION, 2, 0, 0}, &Room::love2CrewmanOpenedOrClosedCabinet },
87 	{ {ACTION_USE, OBJECT_IWRENCH, 11, 0}, &Room::love2UseWrenchOnGasFeed },
88 	{ {ACTION_FINISHED_WALKING, 1, 0, 0}, &Room::love2ReachedGasFeed },
89 	{ {ACTION_FINISHED_ANIMATION, 12, 0, 0}, &Room::love2ChangedGasFeed },
90 	{ {ACTION_USE, OBJECT_IO2GAS, 0x23, 0}, &Room::love2UseO2GasOnCanisterSlot },
91 	{ {ACTION_USE, OBJECT_IH2GAS, 0x23, 0}, &Room::love2UseH2GasOnCanisterSlot },
92 	{ {ACTION_USE, OBJECT_IN2GAS, 0x23, 0}, &Room::love2UseN2GasOnCanisterSlot },
93 	{ {ACTION_FINISHED_WALKING, 3, 0, 0}, &Room::love2ReachedCanisterSlot },
94 	{ {ACTION_FINISHED_ANIMATION, 13, 0, 0}, &Room::love2PutCanisterInSlot1 },
95 	{ {ACTION_FINISHED_ANIMATION, 14, 0, 0}, &Room::love2PutCanisterInSlot2 },
96 	{ {ACTION_USE, OBJECT_IANTIGRA, 12, 0}, &Room::love2UseAntigravOnCanister1 },
97 	{ {ACTION_FINISHED_WALKING, 4, 0, 0}, &Room::love2ReachedCanisterSlot1ToGet },
98 	{ {ACTION_FINISHED_ANIMATION, 15, 0, 0}, &Room::love2TookCanister1 },
99 	{ {ACTION_USE, OBJECT_IANTIGRA, 13, 0}, &Room::love2UseAntigravOnCanister2 },
100 	{ {ACTION_FINISHED_WALKING, 5, 0, 0}, &Room::love2ReachedCanisterSlot2ToGet },
101 	{ {ACTION_FINISHED_ANIMATION, 16, 0, 0}, &Room::love2TookCanister2 },
102 	{ {ACTION_USE, OBJECT_KIRK, 0x20, 0}, &Room::love2UseKirkOnSynthesizer },
103 	{ {ACTION_USE, OBJECT_SPOCK, 0x20, 0}, &Room::love2UseSpockOnSynthesizer },
104 	{ {ACTION_USE, OBJECT_MCCOY, 0x20, 0}, &Room::love2UseMccoyOnSynthesizer },
105 	{ {ACTION_USE, OBJECT_REDSHIRT, 0x20, 0}, &Room::love2UseRedshirtOnSynthesizer },
106 	{ {ACTION_FINISHED_WALKING, 13, 0, 0}, &Room::love2CrewmanReachedSynthesizer },
107 	{ {ACTION_FINISHED_ANIMATION, 17, 0, 0}, &Room::love2CrewmanUsedSynthesizer },
108 	{ {ACTION_FINISHED_WALKING, 16, 0, 0}, &Room::love2SpockReachedGasFeeds },
109 	{ {ACTION_FINISHED_ANIMATION, 18, 0, 0}, &Room::love2SpockEnabledGasFeeds },
110 	{ {ACTION_FINISHED_ANIMATION, 3, 0, 0}, &Room::love2SynthesizerDoorClosed },
111 	{ {ACTION_FINISHED_ANIMATION, 4, 0, 0}, &Room::love2SynthesizerFinished },
112 	{ {ACTION_FINISHED_ANIMATION, 27, 0, 0}, &Room::love2ClosedSynthesizerDoorMakingRLG },
113 	{ {ACTION_FINISHED_ANIMATION, 8, 0, 0}, &Room::love2ClosedSynthesizerDoorMakingCure },
114 	{ {ACTION_FINISHED_ANIMATION, 9, 0, 0}, &Room::love2CureStartedSynthesizing },
115 	{ {ACTION_FINISHED_ANIMATION, 10, 0, 0}, &Room::love2CureSynthesized },
116 	{ {ACTION_USE, OBJECT_IPBC, 9, 0}, &Room::love2UsePolyberylcarbonateOnSynthesizerDoor },
117 	{ {ACTION_FINISHED_WALKING, 6, 0, 0}, &Room::love2KirkReachedSynthesizerWithPolyberylcarbonate },
118 	{ {ACTION_FINISHED_ANIMATION, 5, 0, 0}, &Room::love2SynthesizerDoorOpenedWithPolyberylcarbonate },
119 	{ {ACTION_FINISHED_ANIMATION, 19, 0, 0}, &Room::love2PutPolyberylcarbonateInSynthesizer },
120 
121 	{ {ACTION_USE, OBJECT_IDISHES, 9, 0}, &Room::love2UseVirusSampleOnSynthesizerDoor },
122 	{ {ACTION_FINISHED_WALKING, 7, 0, 0}, &Room::love2KirkReachedSynthesizerWithVirusSample },
123 	{ {ACTION_FINISHED_ANIMATION, 6, 0, 0}, &Room::love2SynthesizerDoorOpenedWithVirusSample },
124 	{ {ACTION_FINISHED_ANIMATION, 20, 0, 0}, &Room::love2PutVirusSampleInSynthesizer },
125 
126 	{ {ACTION_USE, OBJECT_ISAMPLE, 9, 0}, &Room::love2UseCureSampleOnSynthesizerDoor },
127 	{ {ACTION_FINISHED_WALKING, 8, 0, 0}, &Room::love2KirkReachedSynthesizerWithCureSample },
128 	{ {ACTION_FINISHED_ANIMATION, 7, 0, 0}, &Room::love2SynthesizerDoorOpenedWithCureSample },
129 	{ {ACTION_FINISHED_ANIMATION, 21, 0, 0}, &Room::love2PutCureSampleInSynthesizer },
130 
131 	{ {ACTION_USE, 0xff, 9, 0}, &Room::love2UseAnythingOnSynthesizerDoor },
132 	{ {ACTION_USE, 0xff, 0x20, 0}, &Room::love2UseAnythingOnSynthesizer },
133 	{ {ACTION_GET, 13, 0, 0}, &Room::love2GetCanister },
134 	{ {ACTION_GET, 12, 0, 0}, &Room::love2GetCanister },
135 
136 	{ {ACTION_GET, 14, 0, 0}, &Room::love2GetAntigrav },
137 	{ {ACTION_FINISHED_WALKING, 9, 0, 0}, &Room::love2ReachedAntigrav },
138 	{ {ACTION_FINISHED_ANIMATION, 22, 0, 0}, &Room::love2GotAntigrav },
139 
140 	{ {ACTION_GET, 16, 0, 0}, &Room::love2GetPolyberylcarbonate },
141 	{ {ACTION_FINISHED_WALKING, 18, 0, 0}, &Room::love2ReachedPolyberylcarbonate },
142 	{ {ACTION_FINISHED_ANIMATION, 26, 0, 0}, &Room::love2GotPolyberylcarbonate },
143 
144 	{ {ACTION_GET, 17, 0, 0}, &Room::love2GetDishes },
145 	{ {ACTION_FINISHED_WALKING, 17, 0, 0}, &Room::love2ReachedDishes },
146 	{ {ACTION_FINISHED_ANIMATION, 25, 0, 0}, &Room::love2GotDishes },
147 
148 	{ {ACTION_GET, 18, 0, 0}, &Room::love2GetSample },
149 	{ {ACTION_FINISHED_WALKING, 19, 0, 0}, &Room::love2ReachedSample },
150 	{ {ACTION_FINISHED_ANIMATION, 28, 0, 0}, &Room::love2GotSample },
151 
152 	{ {ACTION_GET, 15, 0, 0}, &Room::love2GetSynthesizerOutput },
153 	{ {ACTION_FINISHED_WALKING, 10, 0, 0}, &Room::love2ReachedSynthesizerOutput },
154 	{ {ACTION_FINISHED_ANIMATION, 23, 0, 0}, &Room::love2GotSynthesizerOutput },
155 
156 	{ {ACTION_GET, 19, 0, 0}, &Room::love2GetCure },
157 	{ {ACTION_FINISHED_WALKING, 11, 0, 0}, &Room::love2ReachedCure },
158 	{ {ACTION_FINISHED_ANIMATION, 24, 0, 0}, &Room::love2GotCure },
159 
160 	// Common code
161 	{ {ACTION_TIMER_EXPIRED, 0, 0, 0}, &Room::loveaTimer0Expired },
162 	{ {ACTION_TIMER_EXPIRED, 1, 0, 0}, &Room::loveaTimer1Expired },
163 	{ {ACTION_USE, OBJECT_IMEDKIT, OBJECT_SPOCK, 0}, &Room::loveaUseMedkitOnSpock },
164 	{ {ACTION_USE, OBJECT_ISAMPLE, OBJECT_SPOCK, 0}, &Room::loveaUseCureSampleOnSpock },
165 	{ {ACTION_USE, OBJECT_ICURE, OBJECT_SPOCK, 0}, &Room::loveaUseCureOnSpock },
166 	{ {ACTION_FINISHED_WALKING,   99, 0, 0}, &Room::loveaSpockOrMccoyInPositionToUseCure },
167 	{ {ACTION_FINISHED_ANIMATION, 99, 0, 0}, &Room::loveaFinishedCuringSpock },
168 	{ {ACTION_TIMER_EXPIRED, 2, 0, 0}, &Room::loveaTimer2Expired },
169 	{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_SPOCK, 0}, &Room::loveaUseMTricorderOnSpock },
170 	{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_KIRK, 0}, &Room::loveaUseMTricorderOnHuman },
171 	{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_MCCOY, 0}, &Room::loveaUseMTricorderOnHuman },
172 	{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_REDSHIRT, 0}, &Room::loveaUseMTricorderOnHuman },
173 	{ {ACTION_USE, OBJECT_IRLG, 0xff, 0}, &Room::loveaUseRomulanLaughingGas },
174 	{ {ACTION_USE, OBJECT_IN2O, 0xff, 0}, &Room::loveaUseHumanLaughingGas },
175 	{ {ACTION_USE, OBJECT_INH3, 0xff, 0}, &Room::loveaUseAmmonia },
176 	{ {ACTION_USE, OBJECT_ICOMM, 0xff, 0}, &Room::loveaUseCommunicator },
177 	{ {ACTION_LIST_END, 0, 0, 0}, nullptr }
178 };
179 
180 enum love2TextIds {
181 	TX_SPEAKER_KIRK, TX_SPEAKER_MCCOY, TX_SPEAKER_SPOCK, TX_SPEAKER_FERRIS, TX_SPEAKER_COMPUTER,
182 	TX_LOV0_011, TX_LOV0_012, TX_LOV0_013, TX_LOV0_014, TX_LOV0_015,
183 	TX_LOV0_016, TX_LOV0_017, TX_LOV0_019, TX_LOV0_020, TX_LOV0_021,
184 	TX_LOV0_022, TX_LOV0_025, TX_LOV0_026, TX_LOV0_029, TX_LOV0_033,
185 	TX_LOV0_039, TX_LOV0_040, TX_LOV0_041, TX_LOV0_042, TX_LOV0_043,
186 	TX_LOV0_045, TX_LOV0_046, TX_LOV0_047, TX_LOV0_048, TX_LOV0_049,
187 	TX_LOV0_050, TX_LOV0_101, TX_LOV0_102, TX_LOV0_103, TX_LOV0_104,
188 	TX_LOV0_105, TX_LOV0_106, TX_LOV0_107, TX_LOV0_124, TX_LOV2_001,
189 	TX_LOV2_002, TX_LOV2_003, TX_LOV2_004, TX_LOV2_005, TX_LOV2_006,
190 	TX_LOV2_007, TX_LOV2_008, TX_LOV2_009, TX_LOV2_010, TX_LOV2_011,
191 	TX_LOV2_012, TX_LOV2_014, TX_LOV2_015, TX_LOV2_016, TX_LOV2_017,
192 	TX_LOV2_018, TX_LOV2_019, TX_LOV2_020, TX_LOV2_021, TX_LOV2_022,
193 	TX_LOV2_023, TX_LOV2_024, TX_LOV2_025, TX_LOV2_026, TX_LOV2_027,
194 	TX_LOV2_028, TX_LOV2_029, TX_LOV2_030, TX_LOV2_031, TX_LOV2_032,
195 	TX_LOV2_033, TX_LOV2_034, TX_LOV2_035, TX_LOV2_036, TX_LOV2_037,
196 	TX_LOV2_038, TX_LOV2_039, TX_LOV2_040, TX_LOV2_041, TX_LOV2_043,
197 	TX_LOV5_015, TX_LOV5_019, TX_LOV5_027, TX_LOV5_030, TX_LOV5_038,
198 	TX_LOVA_100, TX_LOVA_F01, TX_LOVA_F02, TX_LOVA_F03, TX_LOVA_F04,
199 	TX_LOVA_F07, TX_LOVA_F08, TX_LOVA_F10, TX_LOVA_F54, TX_LOVA_F55,
200 	TX_LOV2N000, TX_LOV2N001, TX_LOV2N002, TX_LOV2N003, TX_LOV2N004,
201 	TX_LOV2N005, TX_LOV2N006, TX_LOV2N007, TX_LOV2N008, TX_LOV2N009,
202 	TX_LOV2N010, TX_LOV2N011, TX_LOV2N012, TX_LOV2N013, TX_LOV2N014,
203 	TX_LOV2N015, TX_LOV2N016, TX_LOV2N017, TX_LOV2N018, TX_LOV2N019,
204 	TX_LOV2N024, TX_LOV2N025, TX_LOV2N026, TX_LOV2N027, TX_LOV2N028,
205 	TX_LOV2N029, TX_LOV2N030, TX_LOV2N031, TX_LOV2N033, TX_LOV2N034,
206 	TX_LOV2N035, TX_LOV2N036, TX_LOV2N037, TX_LOV2N038, TX_LOV2N039,
207 	TX_LOV2N040, TX_LOV2N041, TX_LOV2N042, TX_LOV2N043, TX_LOV2N044,
208 	TX_LOV2N045, TX_LOV2N046, TX_LOV2N047, TX_LOV2N048, TX_LOV2N049,
209 	TX_LOV2N050, TX_LOV2N051, TX_MUD2_040, TX_MUD4_018, TX_TUG2_010,
210 	TX_VENA_F41, TX_BRIDU146, TX_GENER004
211 };
212 
213 // TODO: Finish floppy offsets
214 extern const RoomTextOffsets love2TextOffsets[] = {
215 	{ TX_SPEAKER_KIRK, 14244, 0 },
216 	{ TX_SPEAKER_MCCOY, 14255, 0 },
217 	{ TX_SPEAKER_SPOCK, 14265, 0 },
218 	{ TX_SPEAKER_FERRIS, 14275, 0 },
219 	{ TX_SPEAKER_COMPUTER, 14287, 0 },
220 	{ TX_LOV0_011, 16471, 0 },
221 	{ TX_LOV0_012, 16598, 0 },
222 	{ TX_LOV0_013, 16894, 0 },
223 	{ TX_LOV0_014, 16658, 0 },
224 	{ TX_LOV0_015, 16762, 0 },
225 	{ TX_LOV0_016, 16565, 0 },
226 	{ TX_LOV0_017, 17028, 0 },
227 	{ TX_LOV0_019, 16948, 0 },
228 	{ TX_LOV0_020, 16505, 0 },
229 	{ TX_LOV0_021, 16816, 0 },
230 	{ TX_LOV0_022, 16706, 0 },
231 	{ TX_LOV0_025, 17954, 0 },
232 	{ TX_LOV0_026, 17827, 0 },
233 	{ TX_LOV0_029, 17707, 0 },
234 	{ TX_LOV0_033, 17767, 0 },
235 	{ TX_LOV0_039, 17089, 0 },
236 	{ TX_LOV0_040, 17216, 0 },
237 	{ TX_LOV0_041, 17512, 0 },
238 	{ TX_LOV0_042, 17276, 0 },
239 	{ TX_LOV0_043, 17380, 0 },
240 	{ TX_LOV0_045, 17183, 0 },
241 	{ TX_LOV0_046, 17646, 0 },
242 	{ TX_LOV0_047, 17566, 0 },
243 	{ TX_LOV0_048, 17123, 0 },
244 	{ TX_LOV0_049, 17434, 0 },
245 	{ TX_LOV0_050, 17324, 0 },
246 	{ TX_LOV0_101, 18035, 0 },
247 	{ TX_LOV0_102, 18099, 0 },
248 	{ TX_LOV0_103, 18169, 0 },
249 	{ TX_LOV0_104, 18219, 0 },
250 	{ TX_LOV0_105, 18276, 0 },
251 	{ TX_LOV0_106, 18388, 0 },
252 	{ TX_LOV0_107, 18456, 0 },
253 	{ TX_LOV0_124, 17904, 0 },
254 	{ TX_LOV2_001, 1734, 0 },
255 	{ TX_LOV2_002, 6690, 0 },
256 	{ TX_LOV2_003, 5722, 0 },
257 	{ TX_LOV2_004, 5885, 0 },
258 	{ TX_LOV2_005, 4110, 0 },
259 	{ TX_LOV2_006, 4025, 0 },
260 	{ TX_LOV2_007, 8933, 0 },
261 	{ TX_LOV2_008, 15998, 0 },
262 	{ TX_LOV2_009, 15764, 0 },
263 	{ TX_LOV2_010, 4710, 0 },
264 	//{ TX_LOV2_010, 16437, 0 },	// ignore duplicate line
265 	{ TX_LOV2_011, 9129, 0 },
266 	{ TX_LOV2_012, 1916, 0 },
267 	{ TX_LOV2_014, 8848, 0 },
268 	{ TX_LOV2_015, 5377, 0 },
269 	{ TX_LOV2_016, 15386, 0 },
270 	{ TX_LOV2_017, 7699, 0 },
271 	{ TX_LOV2_018, 6248, 0 },
272 	{ TX_LOV2_019, 15259, 0 },
273 	{ TX_LOV2_020, 8083, 0 },
274 	{ TX_LOV2_021, 6856, 0 },
275 	{ TX_LOV2_022, 6402, 0 },
276 	{ TX_LOV2_023, 7371, 0 },
277 	{ TX_LOV2_024, 4468, 0 },
278 	{ TX_LOV2_025, 3226, 0 },
279 	//{ TX_LOV2_025, 3540, 0 },		// ignore duplicate line
280 	{ TX_LOV2_026, 2639, 0 },
281 	{ TX_LOV2_027, 16081, 0 },
282 	{ TX_LOV2_028, 6936, 0 },
283 	{ TX_LOV2_029, 15832, 0 },
284 	{ TX_LOV2_030, 6312, 0 },
285 	{ TX_LOV2_031, 6088, 0 },
286 	{ TX_LOV2_032, 5224, 0 },
287 	{ TX_LOV2_033, 15321, 0 },
288 	{ TX_LOV2_034, 7288, 0 },	// NOTE: has typo (dash instead of underscore)
289 	{ TX_LOV2_035, 14978, 0 },
290 	{ TX_LOV2_036, 5447, 0 },
291 	{ TX_LOV2_037, 15561, 0 },
292 	{ TX_LOV2_038, 6472, 0 },
293 	{ TX_LOV2_039, 7111, 0 },	// NOTE: has typo (dash instead of underscore)
294 	{ TX_LOV2_040, 9058, 0 },
295 	{ TX_LOV2_041, 15889, 0 },
296 	{ TX_LOV2_043, 5634, 0 },
297 	{ TX_LOV5_015, 11567, 0 },
298 	//{ TX_LOV5_015, 11388, 0 },	// ignore duplicate line
299 	{ TX_LOV5_019, 11310, 0 },
300 	{ TX_LOV5_027, 11823, 0 },
301 	{ TX_LOV5_030, 11727, 0 },
302 	{ TX_LOV5_038, 11778, 0 },
303 	{ TX_LOVA_100, 12932, 0 },
304 	{ TX_LOVA_F01, 12374, 0 },
305 	{ TX_LOVA_F02, 12446, 0 },
306 	{ TX_LOVA_F03, 12645, 0 },
307 	{ TX_LOVA_F04, 12560, 0 },
308 	{ TX_LOVA_F07, 13009, 0 },
309 	{ TX_LOVA_F08, 11998, 0 },
310 	//{ TX_LOVA_F08, 12713, 0 },	// ignore duplicate line
311 	{ TX_LOVA_F10, 12880, 0 },
312 	{ TX_LOVA_F54, 12154, 0 },
313 	{ TX_LOVA_F55, 11455, 0 },
314 	{ TX_LOV2N000, 16147, 0 },
315 	{ TX_LOV2N001, 15741, 0 },
316 	{ TX_LOV2N002, 14608, 0 },
317 	{ TX_LOV2N003, 14647, 0 },
318 	{ TX_LOV2N004, 14569, 0 },
319 	{ TX_LOV2N005,  4653, 0 },
320 	//{ TX_LOV2N005, 13294, 0 },	// ignore duplicate line
321 	//{ TX_LOV2N005, 13148, 0 },	// ignore duplicate line
322 	//{ TX_LOV2N005, 13068, 0 },	// ignore duplicate line
323 	//{ TX_LOV2N005,  4410, 0 },	// ignore duplicate line
324 	{ TX_LOV2N006, 14300, 0 },
325 	{ TX_LOV2N007, 16217, 0 },
326 	{ TX_LOV2N008, 16186, 0 },
327 	{ TX_LOV2N009,  1467, 0 },
328 	{ TX_LOV2N010, 14780, 0 },
329 	{ TX_LOV2N011, 14686, 0 },
330 	{ TX_LOV2N012,  4334, 0 },
331 	{ TX_LOV2N013, 16249, 0 },
332 	{ TX_LOV2N014, 14728, 0 },
333 	{ TX_LOV2N015, 16281, 0 },
334 	{ TX_LOV2N016,  5555, 0 },
335 	{ TX_LOV2N017,  5147, 0 },
336 	{ TX_LOV2N018,  5812, 0 },
337 	{ TX_LOV2N019,  6013, 0 },
338 	{ TX_LOV2N024,  2955, 0 },
339 	{ TX_LOV2N025,  8231, 0 },
340 	//{ TX_LOV2N025,  8454, 0 },	// ignore duplicate line
341 	{ TX_LOV2N026, 14840, 0 },
342 	{ TX_LOV2N027, 14878, 0 },
343 	{ TX_LOV2N028, 14425, 0 },
344 	{ TX_LOV2N029, 14920, 0 },
345 	{ TX_LOV2N030,  3356, 0 },
346 	{ TX_LOV2N031,  3696, 0 },
347 	{ TX_LOV2N033, 16366, 0 },
348 	{ TX_LOV2N034,  2843, 0 },
349 	{ TX_LOV2N035,  3081, 0 },
350 	{ TX_LOV2N036,  9618, 0 },
351 	{ TX_LOV2N037,  9803, 0 },
352 	{ TX_LOV2N038, 10228, 0 },
353 	{ TX_LOV2N039, 10072, 0 },
354 	{ TX_LOV2N040,  9986, 0 },
355 	{ TX_LOV2N041, 10152, 0 },
356 	{ TX_LOV2N042,  9298, 0 },
357 	{ TX_LOV2N043, 10484, 0 },
358 	{ TX_LOV2N044,  9430, 0 },
359 	{ TX_LOV2N045, 15417, 0 },
360 	{ TX_LOV2N046,  8005, 0 },
361 	{ TX_LOV2N047,  7616, 0 },
362 	{ TX_LOV2N048,  7209, 0 },
363 	{ TX_LOV2N049,  7033, 0 },
364 	{ TX_LOV2N050,  6778, 0 },
365 	{ TX_LOV2N051,  6612, 0 },
366 	{ TX_MUD2_040, 13205, 0 },
367 	{ TX_MUD4_018, 13414, 0 },
368 	//{ TX_MUD4_018, 13911, 0 },	// ignore duplicate line
369 	//{ TX_MUD4_018, 13747, 0 },	// ignore duplicate line
370 	//{ TX_MUD4_018, 13578, 0 },	// ignore duplicate line
371 	{ TX_TUG2_010, 12810, 0 },
372 	{ TX_VENA_F41, 14034, 0 },
373 	//{ TX_VENA_F41, 13537, 0 },	// ignore duplicate line
374 	//{ TX_VENA_F41, 13870, 0 },	// ignore duplicate line
375 	//{ TX_VENA_F41, 13701, 0 },	// ignore duplicate line
376 	{ TX_BRIDU146, 13647, 0 },
377 	//{ TX_BRIDU146, 13980, 0 },	// ignore duplicate line
378 	//{ TX_BRIDU146, 13816, 0 },	// ignore duplicate line
379 	//{ TX_BRIDU146, 13483, 0 },	// ignore duplicate line
380 	{ TX_GENER004, 12303, 0 },
381 	{          -1, 0,    0 }
382 };
383 
384 extern const RoomText love2Texts[] = {
385 	{ -1, Common::UNK_LANG, "" }
386 };
387 
love2Tick1()388 void Room::love2Tick1() {
389 	playVoc("LOV2LOOP");
390 
391 	char canName[10];
392 
393 	switch (_awayMission->love.canister1) {
394 	case CANTYPE_O2:
395 		strcpy(canName, "o2can");
396 		break;
397 	case CANTYPE_H2:
398 		strcpy(canName, "h2can");
399 		break;
400 	case CANTYPE_N2:
401 		strcpy(canName, "n2can");
402 		break;
403 	default:
404 		break;
405 	}
406 
407 	if (_awayMission->love.canister1 >= 1 && _awayMission->love.canister1 <= 3)
408 		loadActorAnim(OBJECT_CAN1, canName, 0xa7, 0xae, 0);
409 
410 	switch (_awayMission->love.canister2) {
411 	case CANTYPE_O2:
412 		strcpy(canName, "o2can");
413 		break;
414 	case CANTYPE_H2:
415 		strcpy(canName, "h2can");
416 		break;
417 	case CANTYPE_N2:
418 		strcpy(canName, "n2can");
419 		break;
420 	default:
421 		break;
422 	}
423 
424 	if (_awayMission->love.canister2 >= 1 && _awayMission->love.canister2 <= 3)
425 		loadActorAnim(OBJECT_CAN2, canName, 0xb1, 0xaf, 0);
426 
427 	if (_awayMission->love.gasFeedOn)
428 		loadActorAnim(OBJECT_GAS_FEED, "s3r3vo", 0xac, 0x75, 0);
429 	else
430 		loadActorAnim(OBJECT_GAS_FEED, "s3r3vc", 0xac, 0x75, 0);
431 
432 	if (_awayMission->love.cabinetOpen)
433 		loadActorAnim(OBJECT_CABINET, "s3r3d1o", 0x1e, 0xaf, 0);
434 	else
435 		loadActorAnim(OBJECT_CABINET, "s3r3d1c", 0x1e, 0xaf, 0);
436 
437 	if (_awayMission->love.cabinetOpen && !haveItem(OBJECT_IANTIGRA))
438 		loadActorAnim(OBJECT_ANTIGRAV, "antigr", 0x1f, 0xa7, 0);
439 
440 	if (_awayMission->love.synthesizerContents != 0)
441 		loadActorAnim(OBJECT_SYNTHESIZER_DOOR, "s3r3d2o", 0x8a, 0x8d, 0);
442 	else
443 		loadActorAnim(OBJECT_SYNTHESIZER_DOOR, "s3r3d2c", 0x8a, 0x8d, 0);
444 
445 	bool valid = true;
446 
447 	switch (_awayMission->love.synthesizerContents) {
448 	case SYNTHITEM_PBC:
449 		strcpy(_roomVar.love.chamberInputAnim, "pbcanm");
450 		_roomVar.love.chamberObject = OBJECT_POLYBERYLCARBONATE;
451 		break;
452 	case SYNTHITEM_VIRUS_SAMPLE:
453 		strcpy(_roomVar.love.chamberInputAnim, "dishes");
454 		_roomVar.love.chamberObject = OBJECT_VIRUSSAMPLE;
455 		break;
456 	case SYNTHITEM_CURE_SAMPLE:
457 		strcpy(_roomVar.love.chamberInputAnim, "dishes");
458 		_roomVar.love.chamberObject = OBJECT_CURESAMPLE;
459 		break;
460 	case SYNTHITEM_BOTTLE:
461 		switch (_awayMission->love.synthesizerBottleIndex) {
462 		case 1:
463 			strcpy(_roomVar.love.chamberOutputAnim, "btle1");
464 			_roomVar.love.chamberObject = OBJECT_SYNTHESIZER_OUTPUT;
465 			break;
466 		case 2:
467 			strcpy(_roomVar.love.chamberOutputAnim, "btle2");
468 			_roomVar.love.chamberObject = OBJECT_SYNTHESIZER_OUTPUT;
469 			break;
470 		case 3:
471 			strcpy(_roomVar.love.chamberOutputAnim, "btle3");
472 			_roomVar.love.chamberObject = OBJECT_SYNTHESIZER_OUTPUT;
473 			break;
474 		case 4:
475 			strcpy(_roomVar.love.chamberOutputAnim, "btle4");
476 			_roomVar.love.chamberObject = OBJECT_SYNTHESIZER_OUTPUT;
477 			break;
478 		default:
479 			strcpy(_roomVar.love.chamberOutputAnim, "cure");
480 			_roomVar.love.chamberObject = OBJECT_CURE;
481 			break;
482 		}
483 		break;
484 	default:
485 		valid = false;
486 		break;
487 	}
488 
489 	if (valid) {
490 		if (_awayMission->love.synthesizerContents == 9)
491 			loadActorAnim2(_roomVar.love.chamberObject, _roomVar.love.chamberOutputAnim, 0x8a, 0x8b, 0);
492 		else
493 			loadActorAnim2(_roomVar.love.chamberObject, _roomVar.love.chamberInputAnim, 0x8a, 0x8b, 0);
494 	}
495 
496 	if (_awayMission->love.releasedHumanLaughingGas)
497 		_awayMission->timers[0] = getRandomWordInRange(200, 400);
498 	if (_awayMission->love.releasedRomulanLaughingGas)
499 		_awayMission->timers[1] = getRandomWordInRange(200, 400);
500 	_awayMission->timers[2] = 200;
501 
502 	loadActorAnim(OBJECT_DOOR, "s3r3d3a", 0x12a, 0xb5, 0);
503 
504 	_roomVar.love.cmnXPosToCureSpock = 0xc9;
505 	_roomVar.love.cmnYPosToCureSpock = 0xb7;
506 }
507 
love2TouchedWarp1()508 void Room::love2TouchedWarp1() {
509 	_awayMission->disableInput = true;
510 	playSoundEffectIndex(kSfxDoor);
511 	_awayMission->timers[3] = 10;
512 }
513 
love2Timer3Expired()514 void Room::love2Timer3Expired() {
515 	loadRoomIndex(0, 0);
516 }
517 
love2WalkToDoor()518 void Room::love2WalkToDoor() {
519 	_awayMission->disableInput = true;
520 	_roomVar.love.walkingToDoor = true;
521 	walkCrewman(OBJECT_KIRK, 0x127, 0xba, 14);
522 }
523 
524 // Triggers door opening
love2TouchedHotspot0()525 void Room::love2TouchedHotspot0() {
526 	if (_roomVar.love.walkingToDoor) {
527 		loadActorAnim(OBJECT_DOOR, "s3r3d3", 0x12a, 0xb5, 1);
528 		playSoundEffectIndex(kSfxDoor);
529 	}
530 }
531 
love2DoorReachedOrOpened()532 void Room::love2DoorReachedOrOpened() {
533 	_roomVar.love.doorOpenCounter++;
534 	if (_roomVar.love.doorOpenCounter == 2)
535 		loadRoomIndex(1, 1);
536 }
537 
love2LookAtCabinet()538 void Room::love2LookAtCabinet() {
539 	showDescription(TX_LOV2N027);
540 }
541 
love2LookAtDoor()542 void Room::love2LookAtDoor() {
543 	showDescription(TX_LOV2N001);
544 }
545 
love2LookAtSynthesizer()546 void Room::love2LookAtSynthesizer() {
547 	showDescription(TX_LOV2N028);
548 }
549 
love2LookAtAnywhere()550 void Room::love2LookAtAnywhere() {
551 	showDescription(TX_LOV2N026);
552 }
553 
love2LookAtAntigrav()554 void Room::love2LookAtAntigrav() {
555 	showDescription(TX_LOV2N006);
556 }
557 
love2LookAtMccoy()558 void Room::love2LookAtMccoy() {
559 	showDescription(TX_LOV2N011);
560 }
561 
love2LookAtSpock()562 void Room::love2LookAtSpock() {
563 	showDescription(TX_LOV2N014);
564 }
565 
love2LookAtRedshirt()566 void Room::love2LookAtRedshirt() {
567 	showDescription(TX_LOV2N010);
568 }
569 
love2LookAtKirk()570 void Room::love2LookAtKirk() {
571 	showDescription(TX_LOV2N009);
572 }
573 
love2LookAtArdak()574 void Room::love2LookAtArdak() {
575 	showDescription(TX_LOV2N045);
576 	showText(TX_SPEAKER_SPOCK, TX_LOV2_037);
577 }
578 
love2LookAtChamber()579 void Room::love2LookAtChamber() {
580 	showDescription(TX_LOV2N029);
581 	showText(TX_SPEAKER_SPOCK, TX_LOV2_035);
582 	showText(TX_SPEAKER_MCCOY, TX_LOV2_019);
583 	showText(TX_SPEAKER_SPOCK, TX_LOV2_033);
584 	showText(TX_SPEAKER_MCCOY, TX_LOV2_016);
585 }
586 
love2LookAtCan1()587 void Room::love2LookAtCan1() {
588 	switch (_awayMission->love.canister1) {
589 	case CANTYPE_O2:
590 		showDescription(TX_LOV2N004);
591 		break;
592 	case CANTYPE_H2:
593 		showDescription(TX_LOV2N002);
594 		break;
595 	case CANTYPE_N2:
596 	default:
597 		showDescription(TX_LOV2N003);
598 		break;
599 	}
600 }
601 
love2LookAtCan2()602 void Room::love2LookAtCan2() {
603 	switch (_awayMission->love.canister2) {
604 	case CANTYPE_O2:
605 		showDescription(TX_LOV2N004);
606 		break;
607 	case CANTYPE_H2:
608 		showDescription(TX_LOV2N002);
609 		break;
610 	case CANTYPE_N2:
611 	default:
612 		showDescription(TX_LOV2N003);
613 		break;
614 	}
615 }
616 
love2TalkToKirk()617 void Room::love2TalkToKirk() {
618 	showText(TX_SPEAKER_KIRK, TX_LOV2_001);
619 }
620 
love2TalkToSpock()621 void Room::love2TalkToSpock() {
622 	showText(TX_SPEAKER_SPOCK, TX_LOV2_029);
623 }
624 
love2TalkToMccoy()625 void Room::love2TalkToMccoy() {
626 	showText(TX_SPEAKER_MCCOY, TX_LOV2_009);
627 }
628 
love2TalkToRedshirt()629 void Room::love2TalkToRedshirt() {
630 	showText(TX_SPEAKER_FERRIS, TX_LOV2_041);
631 }
632 
love2UseMTricorderAnywhere()633 void Room::love2UseMTricorderAnywhere() {
634 	if (_awayMission->love.knowAboutVirus)
635 		mccoyScan(DIR_S, TX_SPEAKER_MCCOY, TX_LOV2_008, false);
636 	else
637 		mccoyScan(DIR_S, TX_SPEAKER_MCCOY, TX_LOV2_012, false);
638 }
639 
love2UseSTricorderAnywhere()640 void Room::love2UseSTricorderAnywhere() {
641 	spockScan(DIR_S, TX_SPEAKER_SPOCK, TX_LOV2_027, false);
642 }
643 
love2UseKirkOnCabinet()644 void Room::love2UseKirkOnCabinet() {
645 	_roomVar.love.chamberObject = OBJECT_KIRK;
646 	walkCrewman(OBJECT_KIRK, 0x2b, 0xbb, 12);
647 }
648 
love2UseSpockOnCabinet()649 void Room::love2UseSpockOnCabinet() {
650 	_roomVar.love.chamberObject = OBJECT_SPOCK;
651 	walkCrewman(OBJECT_SPOCK, 0x2b, 0xbb, 12);
652 }
653 
love2UseMccoyOnCabinet()654 void Room::love2UseMccoyOnCabinet() {
655 	_roomVar.love.chamberObject = OBJECT_MCCOY;
656 	walkCrewman(OBJECT_MCCOY, 0x2b, 0xbb, 12);
657 }
658 
love2UseRedshirtOnCabinet()659 void Room::love2UseRedshirtOnCabinet() {
660 	_roomVar.love.chamberObject = OBJECT_REDSHIRT;
661 	walkCrewman(OBJECT_REDSHIRT, 0x2b, 0xbb, 12);
662 }
663 
love2CrewmanReachedCabinet()664 void Room::love2CrewmanReachedCabinet() {
665 	Common::String anim = getCrewmanAnimFilename(_roomVar.love.chamberObject, "usehw");
666 	loadActorAnim2(_roomVar.love.chamberObject, anim, -1, -1, 11);
667 }
668 
love2CrewmanAccessedCabinet()669 void Room::love2CrewmanAccessedCabinet() {
670 	if (_awayMission->love.cabinetOpen)
671 		loadActorAnim2(OBJECT_CABINET, "s3r3d4", 0x1e, 0xaf, 2);
672 	else
673 		loadActorAnim2(OBJECT_CABINET, "s3r3d1", 0x1e, 0xaf, 2);
674 
675 	playSoundEffectIndex(kSfxDoor);
676 
677 	if (_awayMission->love.cabinetOpen)
678 		loadActorStandAnim(OBJECT_ANTIGRAV);
679 
680 	_awayMission->love.cabinetOpen = !_awayMission->love.cabinetOpen;
681 }
682 
love2CrewmanOpenedOrClosedCabinet()683 void Room::love2CrewmanOpenedOrClosedCabinet() {
684 	if (_awayMission->love.cabinetOpen && !haveItem(OBJECT_IANTIGRA))
685 		loadActorAnim(OBJECT_ANTIGRAV, "antigr", 0x1f, 0xa7, 0);
686 }
687 
love2UseWrenchOnGasFeed()688 void Room::love2UseWrenchOnGasFeed() {
689 	walkCrewman(OBJECT_KIRK, 0xa8, 0xb7, 1);
690 }
691 
love2ReachedGasFeed()692 void Room::love2ReachedGasFeed() {
693 	loadActorAnim2(OBJECT_KIRK, "kusehn", -1, -1, 12);
694 	playVoc("MUR3E1S");
695 }
696 
love2ChangedGasFeed()697 void Room::love2ChangedGasFeed() {
698 	if (_awayMission->love.gasFeedOn) {
699 		_awayMission->love.gasFeedOn = false;
700 		loadActorAnim2(OBJECT_GAS_FEED, "s3r3v2", 0xac, 0x75, 0);
701 		showDescription(TX_LOV2N007);
702 	} else {
703 		_awayMission->love.gasFeedOn = true;
704 		loadActorAnim2(OBJECT_GAS_FEED, "s3r3v1", 0xac, 0x75, 0);
705 		showDescription(TX_LOV2N008);
706 	}
707 }
708 
love2UseO2GasOnCanisterSlot()709 void Room::love2UseO2GasOnCanisterSlot() {
710 	_roomVar.love.canisterType = CANTYPE_O2;
711 	strcpy(_roomVar.love.canisterAnim, "o2can");
712 	_roomVar.love.canisterItem = OBJECT_IO2GAS;
713 	walkCrewman(OBJECT_KIRK, 0xa8, 0xb7, 3);
714 }
715 
love2UseH2GasOnCanisterSlot()716 void Room::love2UseH2GasOnCanisterSlot() {
717 	_roomVar.love.canisterType = CANTYPE_H2;
718 	strcpy(_roomVar.love.canisterAnim, "h2can");
719 	_roomVar.love.canisterItem = OBJECT_IH2GAS;
720 	walkCrewman(OBJECT_KIRK, 0xa8, 0xb7, 3);
721 }
722 
love2UseN2GasOnCanisterSlot()723 void Room::love2UseN2GasOnCanisterSlot() {
724 	_roomVar.love.canisterType = CANTYPE_N2;
725 	strcpy(_roomVar.love.canisterAnim, "n2can");
726 	_roomVar.love.canisterItem = OBJECT_IN2GAS;
727 	walkCrewman(OBJECT_KIRK, 0xa8, 0xb7, 3);
728 }
729 
love2ReachedCanisterSlot()730 void Room::love2ReachedCanisterSlot() {
731 	if (_awayMission->love.gasFeedOn)
732 		showText(TX_SPEAKER_SPOCK, TX_LOV2_026);
733 	else {
734 		if (_awayMission->love.canister1 == CANTYPE_NONE)
735 			loadActorAnim2(OBJECT_KIRK, "kusehn", -1, -1, 13);
736 		else if (_awayMission->love.canister2 == CANTYPE_NONE)
737 			loadActorAnim2(OBJECT_KIRK, "kusehn", -1, -1, 14);
738 		else
739 			showDescription(TX_LOV2N024);
740 	}
741 }
742 
love2PutCanisterInSlot1()743 void Room::love2PutCanisterInSlot1() {
744 	playVoc("SE6FOOD");
745 	loadActorAnim(OBJECT_CAN1, _roomVar.love.canisterAnim, 0xa7, 0xae, 0);
746 	_awayMission->love.canister1 = _roomVar.love.canisterType;
747 	showDescription(TX_LOV2N034);
748 	loseItem(_roomVar.love.canisterItem);
749 }
750 
love2PutCanisterInSlot2()751 void Room::love2PutCanisterInSlot2() {
752 	playVoc("SE6FOOD");
753 	loadActorAnim(OBJECT_CAN2, _roomVar.love.canisterAnim, 0xb1, 0xaf, 0);
754 	_awayMission->love.canister2 = _roomVar.love.canisterType;
755 	showDescription(TX_LOV2N035);
756 	loseItem(_roomVar.love.canisterItem);
757 }
758 
love2UseAntigravOnCanister1()759 void Room::love2UseAntigravOnCanister1() {
760 	walkCrewman(OBJECT_KIRK, 0xa8, 0xb7, 4);
761 }
762 
love2ReachedCanisterSlot1ToGet()763 void Room::love2ReachedCanisterSlot1ToGet() {
764 	if (_awayMission->love.gasFeedOn)
765 		showText(TX_SPEAKER_SPOCK, TX_LOV2_025);
766 	else {
767 		loadActorAnim2(OBJECT_KIRK, "kusehn", -1, -1, 15);
768 		// BUGFIX: original game only played this for canister 2
769 		playVoc("SE3PLBAT");
770 	}
771 }
772 
love2TookCanister1()773 void Room::love2TookCanister1() {
774 	showDescription(TX_LOV2N030);
775 	loadActorStandAnim(OBJECT_CAN1);
776 
777 	switch (_awayMission->love.canister1) {
778 	case CANTYPE_O2:
779 		giveItem(OBJECT_IO2GAS);
780 		break;
781 	case CANTYPE_H2:
782 		giveItem(OBJECT_IH2GAS);
783 		break;
784 	case CANTYPE_N2:
785 	default:
786 		giveItem(OBJECT_IN2GAS);
787 		break;
788 	}
789 
790 	_awayMission->love.canister1 = CANTYPE_NONE;
791 }
792 
love2UseAntigravOnCanister2()793 void Room::love2UseAntigravOnCanister2() {
794 	walkCrewman(OBJECT_KIRK, 0xa8, 0xb7, 5);
795 }
796 
love2ReachedCanisterSlot2ToGet()797 void Room::love2ReachedCanisterSlot2ToGet() {
798 	if (_awayMission->love.gasFeedOn)
799 		showText(TX_SPEAKER_SPOCK, TX_LOV2_025);
800 	else {
801 		loadActorAnim2(OBJECT_KIRK, "kusehn", -1, -1, 16);
802 		playVoc("SE3PLBAT");
803 	}
804 }
805 
love2TookCanister2()806 void Room::love2TookCanister2() {
807 	showDescription(TX_LOV2N031);
808 	loadActorStandAnim(OBJECT_CAN2);
809 
810 	switch (_awayMission->love.canister2) {
811 	case CANTYPE_O2:
812 		giveItem(OBJECT_IO2GAS);
813 		break;
814 	case CANTYPE_H2:
815 		giveItem(OBJECT_IH2GAS);
816 		break;
817 	case CANTYPE_N2:
818 	default:
819 		giveItem(OBJECT_IN2GAS);
820 		break;
821 	}
822 
823 	_awayMission->love.canister2 = CANTYPE_NONE;
824 }
825 
love2UseKirkOnSynthesizer()826 void Room::love2UseKirkOnSynthesizer() {
827 	_roomVar.love.chamberObject = OBJECT_KIRK;
828 	walkCrewman(_roomVar.love.chamberObject, 0x46, 0xae, 13);
829 }
830 
love2UseSpockOnSynthesizer()831 void Room::love2UseSpockOnSynthesizer() {
832 	_roomVar.love.chamberObject = OBJECT_SPOCK;
833 	walkCrewman(_roomVar.love.chamberObject, 0x46, 0xae, 13);
834 }
835 
love2UseMccoyOnSynthesizer()836 void Room::love2UseMccoyOnSynthesizer() {
837 	_roomVar.love.chamberObject = OBJECT_MCCOY;
838 	walkCrewman(_roomVar.love.chamberObject, 0x46, 0xae, 13);
839 }
840 
love2UseRedshirtOnSynthesizer()841 void Room::love2UseRedshirtOnSynthesizer() {
842 	_roomVar.love.chamberObject = OBJECT_REDSHIRT;
843 	walkCrewman(_roomVar.love.chamberObject, 0x46, 0xae, 13);
844 }
845 
love2CrewmanReachedSynthesizer()846 void Room::love2CrewmanReachedSynthesizer() {
847 	Common::String anim = getCrewmanAnimFilename(_roomVar.love.chamberObject, "usemn");
848 	loadActorAnim2(_roomVar.love.chamberObject, anim, -1, -1, 17);
849 }
850 
love2CrewmanUsedSynthesizer()851 void Room::love2CrewmanUsedSynthesizer() {
852 	if (_awayMission->love.gasFeedOn) {
853 		love2UseSynthesizer();
854 	} else {
855 		if (_roomVar.love.cb == 3) {
856 			if (haveItem(OBJECT_IWRENCH)) {
857 				showText(TX_SPEAKER_SPOCK, TX_LOV2_005);
858 				walkCrewman(OBJECT_SPOCK, 0xa8, 0xb7, 16);
859 			} else
860 				showText(TX_SPEAKER_SPOCK, TX_LOV2_006);
861 		} else {
862 			_roomVar.love.cb++;
863 			showDescription(TX_LOV2N012);
864 		}
865 	}
866 }
867 
868 
love2SpockReachedGasFeeds()869 void Room::love2SpockReachedGasFeeds() {
870 	loadActorAnim2(OBJECT_SPOCK, "susehn", -1, -1, 18);
871 }
872 
love2SpockEnabledGasFeeds()873 void Room::love2SpockEnabledGasFeeds() {
874 	_awayMission->love.gasFeedOn = true;
875 
876 	loadActorAnim2(OBJECT_GAS_FEED, "s3r3v1", 0xac, 0x75, 0);
877 	showDescription(TX_LOV2N008);
878 	walkCrewman(OBJECT_SPOCK, 0xc6, 0xbb, 0);
879 
880 	love2UseSynthesizer();
881 }
882 
883 // Synthesizer takes the input and produces some output
love2UseSynthesizer()884 void Room::love2UseSynthesizer() {
885 	if (_awayMission->love.canister1 != 0) {
886 		if (_awayMission->love.canister2 != 0) {
887 			int c1 = _awayMission->love.canister1;
888 			int c2 = _awayMission->love.canister2;
889 			if (c1 > c2) {
890 				int tmp = c1;
891 				c1 = c2;
892 				c2 = tmp;
893 			}
894 
895 			if (c1 == CANTYPE_O2 && c2 == CANTYPE_H2) {
896 				switch (_awayMission->love.synthesizerContents) {
897 				case SYNTHITEM_PBC: // Romulan Laughing Gas
898 					loadActorAnim(OBJECT_SYNTHESIZER_DOOR, "s3r3d5", -1, -1, 27); // -> love2ClosedSynthesizerDoorMakingRLG
899 					playSoundEffectIndex(kSfxDoor);
900 					loadActorStandAnim(OBJECT_POLYBERYLCARBONATE);
901 					break;
902 
903 				case SYNTHITEM_VIRUS_SAMPLE: // Wet goo
904 					showDescription(TX_LOV2N051);
905 					showText(TX_SPEAKER_KIRK, TX_LOV2_002);
906 					loadActorStandAnim(OBJECT_VIRUSSAMPLE);
907 					// Close synthesizer door
908 					loadActorAnim(OBJECT_SYNTHESIZER_DOOR, "s3r3d5", 0x8a, 0x8d, 0);
909 					playSoundEffectIndex(kSfxDoor);
910 					_awayMission->love.synthesizerContents = 0;
911 					break;
912 
913 				case SYNTHITEM_CURE_SAMPLE: // Wet goo
914 					showDescription(TX_LOV2N050);
915 					showText(TX_SPEAKER_MCCOY, TX_LOV2_021);
916 					loadActorStandAnim(OBJECT_CURESAMPLE);
917 					// Close synthesizer door
918 					loadActorAnim(OBJECT_SYNTHESIZER_DOOR, "s3r3d5", 0x8a, 0x8d, 0);
919 					playSoundEffectIndex(kSfxDoor);
920 					_awayMission->love.synthesizerContents = 0;
921 					break;
922 
923 				case SYNTHITEM_BOTTLE: // Nothing happens
924 					showText(TX_SPEAKER_SPOCK, TX_LOV2_028);
925 					break;
926 
927 				case SYNTHITEM_NONE: // Water
928 				default:
929 					_awayMission->love.synthesizerBottleIndex = BOTTLETYPE_H2O;
930 					strcpy(_roomVar.love.chamberOutputAnim, "btle3");
931 					// Produce bottle
932 					loadActorAnim(OBJECT_SYNTHESIZER_DOOR, "s3r3d2", 0x8a, 0x8d, 3); // -> love2SynthesizerDoorClosed
933 					playSoundEffectIndex(kSfxDoor);
934 					break;
935 				}
936 			} else if (c1 == CANTYPE_H2 && c2 == CANTYPE_N2) {
937 				switch (_awayMission->love.synthesizerContents) {
938 				case SYNTHITEM_PBC: // Inert matter
939 					showDescription(TX_LOV2N049);
940 					showText(TX_SPEAKER_SPOCK, TX_LOV2_039); // BUGFIX: original didn't play audio
941 					loadActorStandAnim(OBJECT_POLYBERYLCARBONATE);
942 					// Close synthesizer door
943 					loadActorAnim(OBJECT_SYNTHESIZER_DOOR, "s3r3d5", 0x8a, 0x8d, 0);
944 					playSoundEffectIndex(kSfxDoor);
945 					_awayMission->love.synthesizerContents = 0;
946 					break;
947 
948 				case SYNTHITEM_VIRUS_SAMPLE: // Colorless goo (with useful information about virus in ammonia)
949 					showDescription(TX_LOV2N048);
950 					showText(TX_SPEAKER_SPOCK, TX_LOV2_034); // BUGFIX: original didn't play audio
951 					showText(TX_SPEAKER_MCCOY, TX_LOV2_023);
952 					loadActorStandAnim(OBJECT_VIRUSSAMPLE);
953 					// Close synthesizer door
954 					loadActorAnim(OBJECT_SYNTHESIZER_DOOR, "s3r3d5", 0x8a, 0x8d, 0);
955 					playSoundEffectIndex(kSfxDoor);
956 					_awayMission->love.synthesizerContents = 0;
957 					break;
958 
959 				case SYNTHITEM_CURE_SAMPLE: // Cure
960 					loadActorStandAnim(OBJECT_CURESAMPLE);
961 					loadActorAnim2(OBJECT_SYNTHESIZER_DOOR, "s3r3d5", 0x8a, 0x8d, 8); // -> love2ClosedSynthesizerDoorMakingCure
962 					playSoundEffectIndex(kSfxDoor);
963 					break;
964 
965 				case SYNTHITEM_BOTTLE: // Nothing happens
966 					showText(TX_SPEAKER_SPOCK, 28);
967 					break;
968 
969 				case SYNTHITEM_NONE: // Ammonia
970 				default:
971 					_awayMission->love.synthesizerBottleIndex = BOTTLETYPE_NH3;
972 					strcpy(_roomVar.love.chamberOutputAnim, "btle2");
973 					// Produce bottle
974 					loadActorAnim(OBJECT_SYNTHESIZER_DOOR, "s3r3d2", 0x8a, 0x8d, 3); // -> love2SynthesizerDoorClosed
975 					playSoundEffectIndex(kSfxDoor);
976 					break;
977 				}
978 			} else if (c1 == CANTYPE_O2 && c2 == CANTYPE_N2) {
979 				switch (_awayMission->love.synthesizerContents) {
980 				case SYNTHITEM_PBC: // Inert matter
981 					showDescription(TX_LOV2N049);
982 					showText(TX_SPEAKER_SPOCK, TX_LOV2_039); // BUGFIX: original didn't play audio
983 					loadActorStandAnim(OBJECT_POLYBERYLCARBONATE);
984 					// Close synthesizer door
985 					loadActorAnim(OBJECT_SYNTHESIZER_DOOR, "s3r3d5", 0x8a, 0x8d, 0);
986 					playSoundEffectIndex(kSfxDoor);
987 					_awayMission->love.synthesizerContents = 0;
988 					break;
989 
990 				case SYNTHITEM_VIRUS_SAMPLE: // Wet goo
991 					showDescription(TX_LOV2N047);
992 					showText(TX_SPEAKER_MCCOY, TX_LOV2_017);
993 					loadActorStandAnim(OBJECT_VIRUSSAMPLE);
994 					// Close synthesizer door
995 					loadActorAnim(OBJECT_SYNTHESIZER_DOOR, "s3r3d5", 0x8a, 0x8d, 0);
996 					playSoundEffectIndex(kSfxDoor);
997 					_awayMission->love.synthesizerContents = 0;
998 					break;
999 
1000 				case SYNTHITEM_CURE_SAMPLE: // Wet goo
1001 					showDescription(TX_LOV2N050);
1002 					showText(TX_SPEAKER_MCCOY, TX_LOV2_021);
1003 					loadActorStandAnim(OBJECT_CURESAMPLE);
1004 					// Close synthesizer door
1005 					loadActorAnim(OBJECT_SYNTHESIZER_DOOR, "s3r3d5", 0x8a, 0x8d, 0);
1006 					playSoundEffectIndex(kSfxDoor);
1007 					_awayMission->love.synthesizerContents = 0;
1008 					break;
1009 
1010 				case SYNTHITEM_BOTTLE: // Nothing happens
1011 					showText(TX_SPEAKER_SPOCK, 28);
1012 					break;
1013 
1014 				case SYNTHITEM_NONE: // Laughing gas
1015 				default:
1016 					_awayMission->love.synthesizerBottleIndex = BOTTLETYPE_N2O;
1017 					strcpy(_roomVar.love.chamberOutputAnim, "btle1");
1018 					// Produce bottle
1019 					loadActorAnim(OBJECT_SYNTHESIZER_DOOR, "s3r3d2", 0x8a, 0x8d, 3); // -> love2SynthesizerDoorClosed
1020 					playSoundEffectIndex(kSfxDoor);
1021 					break;
1022 				}
1023 			}
1024 		} else {
1025 			playVoc("EFX24");
1026 			showDescription(TX_LOV2N005);
1027 			showText(TX_SPEAKER_MCCOY, TX_LOV2_010);
1028 		}
1029 	} else {
1030 		playVoc("EFX24");
1031 		showDescription(TX_LOV2N005);
1032 		showText(TX_SPEAKER_SPOCK, TX_LOV2_024);
1033 	}
1034 }
1035 
love2SynthesizerDoorClosed()1036 void Room::love2SynthesizerDoorClosed() {
1037 	playVoc("LD1SCAN");
1038 	loadActorAnim(OBJECT_SYNTHESIZER_OUTPUT, _roomVar.love.chamberOutputAnim, 0x8a, 0x8d, 4); // -> love2SynthesizerFinished
1039 	_awayMission->love.synthesizerContents = SYNTHITEM_BOTTLE;
1040 }
1041 
1042 // Final product of synthesizer is produced
love2SynthesizerFinished()1043 void Room::love2SynthesizerFinished() {
1044 	switch (_awayMission->love.synthesizerBottleIndex) {
1045 	case BOTTLETYPE_N2O:
1046 		showDescription(TX_LOV2N017);
1047 		showText(TX_SPEAKER_SPOCK, TX_LOV2_032);
1048 		showText(TX_SPEAKER_MCCOY, TX_LOV2_015);
1049 		showText(TX_SPEAKER_SPOCK, TX_LOV2_036);
1050 		break;
1051 
1052 	case BOTTLETYPE_NH3:
1053 		showDescription(TX_LOV2N016);
1054 		if (!_awayMission->redshirtDead) {
1055 			showText(TX_SPEAKER_FERRIS, TX_LOV2_043);
1056 			showText(TX_SPEAKER_KIRK, TX_LOV2_003);
1057 		}
1058 		break;
1059 
1060 	case BOTTLETYPE_H2O:
1061 		showDescription(TX_LOV2N018);
1062 		showText(TX_SPEAKER_SPOCK, TX_LOV2_004);
1063 		break;
1064 
1065 	case BOTTLETYPE_RLG:
1066 	default:
1067 		showDescription(TX_LOV2N019);
1068 		showText(TX_SPEAKER_SPOCK, TX_LOV2_031);
1069 		showText(TX_SPEAKER_MCCOY, TX_LOV2_018);
1070 		showText(TX_SPEAKER_SPOCK, TX_LOV2_030);
1071 		showText(TX_SPEAKER_MCCOY, TX_LOV2_022);
1072 		showText(TX_SPEAKER_SPOCK, TX_LOV2_038);
1073 		break;
1074 	}
1075 }
1076 
love2ClosedSynthesizerDoorMakingRLG()1077 void Room::love2ClosedSynthesizerDoorMakingRLG() {
1078 	_awayMission->love.synthesizerBottleIndex = BOTTLETYPE_RLG;
1079 	strcpy(_roomVar.love.chamberOutputAnim, "btle4");
1080 	loadActorAnim(OBJECT_SYNTHESIZER_DOOR, "s3r3d2", 0x8a, 0x8d, 3); // -> love2SynthesizerDoorClosed
1081 	playSoundEffectIndex(kSfxDoor);
1082 }
1083 
1084 // Synthesizer door closed, using N2 + O2 on cure sample
love2ClosedSynthesizerDoorMakingCure()1085 void Room::love2ClosedSynthesizerDoorMakingCure() {
1086 	loadActorAnim2(OBJECT_SYNTHESIZER_DOOR, "s3r3d2", 0x8a, 0x8d, 9); // -> love2CureStartedSynthesizing
1087 }
1088 
love2CureStartedSynthesizing()1089 void Room::love2CureStartedSynthesizing() {
1090 	loadActorAnim(OBJECT_CURE, "cure", 0x8a, 0x8b, 10); // -> love2CureSynthesized
1091 }
1092 
love2CureSynthesized()1093 void Room::love2CureSynthesized() {
1094 	showDescription(TX_LOV2N046);
1095 	showText(TX_SPEAKER_MCCOY, TX_LOV2_020);
1096 }
1097 
1098 
1099 // Put polycarbonate in synthesizer
love2UsePolyberylcarbonateOnSynthesizerDoor()1100 void Room::love2UsePolyberylcarbonateOnSynthesizerDoor() {
1101 	walkCrewman(OBJECT_KIRK, 0x85, 0xad, 6);
1102 	_awayMission->crewDirectionsAfterWalk[OBJECT_KIRK] = DIR_N;
1103 }
1104 
love2KirkReachedSynthesizerWithPolyberylcarbonate()1105 void Room::love2KirkReachedSynthesizerWithPolyberylcarbonate() {
1106 	if (_awayMission->love.synthesizerContents != 0)
1107 		showDescription(TX_LOV2N025);
1108 	else {
1109 		loadActorAnim(OBJECT_SYNTHESIZER_DOOR, "s3r3d2", 0x8a, 0x8d, 5);
1110 		playSoundEffectIndex(kSfxDoor);
1111 	}
1112 }
1113 
love2SynthesizerDoorOpenedWithPolyberylcarbonate()1114 void Room::love2SynthesizerDoorOpenedWithPolyberylcarbonate() {
1115 	loadActorAnim2(OBJECT_KIRK, "kusemn", -1, -1, 19);
1116 }
1117 
love2PutPolyberylcarbonateInSynthesizer()1118 void Room::love2PutPolyberylcarbonateInSynthesizer() {
1119 	loadActorAnim(OBJECT_POLYBERYLCARBONATE, "pbcanm", 0x8a, 0x8b, 0);
1120 	loseItem(OBJECT_IPBC);
1121 	_awayMission->love.synthesizerContents = SYNTHITEM_PBC;
1122 }
1123 
1124 
1125 // Put dish (virus sample) in synthesizer
love2UseVirusSampleOnSynthesizerDoor()1126 void Room::love2UseVirusSampleOnSynthesizerDoor() {
1127 	walkCrewman(OBJECT_KIRK, 0x85, 0xad, 7);
1128 	_awayMission->crewDirectionsAfterWalk[OBJECT_KIRK] = DIR_N;
1129 }
1130 
love2KirkReachedSynthesizerWithVirusSample()1131 void Room::love2KirkReachedSynthesizerWithVirusSample() {
1132 	if (_awayMission->love.synthesizerContents != 0)
1133 		showDescription(TX_LOV2N025);
1134 	else {
1135 		loadActorAnim(OBJECT_SYNTHESIZER_DOOR, "s3r3d2", 0x8a, 0x8d, 6);
1136 		playSoundEffectIndex(kSfxDoor);
1137 	}
1138 }
1139 
love2SynthesizerDoorOpenedWithVirusSample()1140 void Room::love2SynthesizerDoorOpenedWithVirusSample() {
1141 	loadActorAnim2(OBJECT_KIRK, "kusemn", -1, -1, 20);
1142 }
1143 
love2PutVirusSampleInSynthesizer()1144 void Room::love2PutVirusSampleInSynthesizer() {
1145 	loadActorAnim(OBJECT_VIRUSSAMPLE, "dishes", 0x8a, 0x8b, 0);
1146 	loseItem(OBJECT_IDISHES);
1147 	_awayMission->love.synthesizerContents = SYNTHITEM_VIRUS_SAMPLE;
1148 }
1149 
1150 
1151 // Put cure sample in synthesizer
love2UseCureSampleOnSynthesizerDoor()1152 void Room::love2UseCureSampleOnSynthesizerDoor() {
1153 	walkCrewman(OBJECT_KIRK, 0x85, 0xad, 8);
1154 	_awayMission->crewDirectionsAfterWalk[OBJECT_KIRK] = DIR_N;
1155 }
1156 
love2KirkReachedSynthesizerWithCureSample()1157 void Room::love2KirkReachedSynthesizerWithCureSample() {
1158 	if (_awayMission->love.synthesizerContents != 0)
1159 		showDescription(TX_LOV2N025); // BUGFIX: original didn't play audio
1160 	else {
1161 		loadActorAnim(OBJECT_SYNTHESIZER_DOOR, "s3r3d2", 0x8a, 0x8d, 7);
1162 		playSoundEffectIndex(kSfxDoor);
1163 	}
1164 }
1165 
love2SynthesizerDoorOpenedWithCureSample()1166 void Room::love2SynthesizerDoorOpenedWithCureSample() {
1167 	loadActorAnim2(OBJECT_KIRK, "kusemn", -1, -1, 21);
1168 }
1169 
love2PutCureSampleInSynthesizer()1170 void Room::love2PutCureSampleInSynthesizer() {
1171 	loadActorAnim(OBJECT_CURESAMPLE, "dishes", 0x8a, 0x8b, 0);
1172 	loseItem(OBJECT_ISAMPLE);
1173 	_awayMission->love.synthesizerContents = SYNTHITEM_CURE_SAMPLE;
1174 }
1175 
1176 
1177 
love2UseAnythingOnSynthesizerDoor()1178 void Room::love2UseAnythingOnSynthesizerDoor() {
1179 	showText(TX_SPEAKER_MCCOY, TX_LOV2_014);
1180 }
1181 
love2UseAnythingOnSynthesizer()1182 void Room::love2UseAnythingOnSynthesizer() {
1183 	showText(TX_SPEAKER_SPOCK, TX_LOV2_007);
1184 }
1185 
love2GetCanister()1186 void Room::love2GetCanister() {
1187 	if (_awayMission->redshirtDead)
1188 		showText(TX_SPEAKER_MCCOY, TX_LOV2_011);
1189 	else
1190 		showText(TX_SPEAKER_FERRIS, TX_LOV2_040);
1191 }
1192 
1193 
1194 // Get antigrav from cabinet
love2GetAntigrav()1195 void Room::love2GetAntigrav() {
1196 	walkCrewman(OBJECT_KIRK, 0x37, 0xb4, 9);
1197 }
1198 
love2ReachedAntigrav()1199 void Room::love2ReachedAntigrav() {
1200 	loadActorAnim2(OBJECT_KIRK, "kusehw", -1, -1, 22);
1201 }
1202 
love2GotAntigrav()1203 void Room::love2GotAntigrav() {
1204 	loadActorStandAnim(OBJECT_ANTIGRAV);
1205 	giveItem(OBJECT_IANTIGRA);
1206 	showDescription(TX_LOV2N042);
1207 }
1208 
1209 
1210 // Get polyberylcarbonate from synthesizer
love2GetPolyberylcarbonate()1211 void Room::love2GetPolyberylcarbonate() {
1212 	walkCrewman(OBJECT_KIRK, 0x85, 0xad, 18);
1213 	_awayMission->crewDirectionsAfterWalk[OBJECT_KIRK] = DIR_N;
1214 }
1215 
love2ReachedPolyberylcarbonate()1216 void Room::love2ReachedPolyberylcarbonate() {
1217 	loadActorAnim2(OBJECT_KIRK, "kusemn", -1, -1, 26);
1218 }
1219 
love2GotPolyberylcarbonate()1220 void Room::love2GotPolyberylcarbonate() {
1221 	loadActorStandAnim(OBJECT_POLYBERYLCARBONATE);
1222 	showDescription(TX_LOV2N044);
1223 	giveItem(OBJECT_IPBC);
1224 	_awayMission->love.synthesizerContents = 0;
1225 	loadActorAnim(OBJECT_SYNTHESIZER_DOOR, "s3r3d5", 0x8a, 0x8d, 0);
1226 	playSoundEffectIndex(kSfxDoor);
1227 }
1228 
1229 
1230 // Get virus sample from synthesizer
love2GetDishes()1231 void Room::love2GetDishes() {
1232 	walkCrewman(OBJECT_KIRK, 0x85, 0xad, 17);
1233 	_awayMission->crewDirectionsAfterWalk[OBJECT_KIRK] = DIR_N;
1234 }
1235 
love2ReachedDishes()1236 void Room::love2ReachedDishes() {
1237 	loadActorAnim2(OBJECT_KIRK, "kusemn", -1, -1, 25);
1238 }
1239 
love2GotDishes()1240 void Room::love2GotDishes() {
1241 	loadActorStandAnim(OBJECT_VIRUSSAMPLE);
1242 	showDescription(TX_LOV2N036); // FIXME: text doesn't match audio
1243 	giveItem(OBJECT_IDISHES);
1244 	_awayMission->love.synthesizerContents = 0;
1245 	loadActorAnim(OBJECT_SYNTHESIZER_DOOR, "s3r3d5", 0x8a, 0x8d, 0);
1246 	playSoundEffectIndex(kSfxDoor);
1247 }
1248 
1249 
1250 // Get cure sample from synthesizer
love2GetSample()1251 void Room::love2GetSample() {
1252 	walkCrewman(OBJECT_KIRK, 0x85, 0xad, 19);
1253 	_awayMission->crewDirectionsAfterWalk[OBJECT_KIRK] = DIR_N;
1254 }
1255 
love2ReachedSample()1256 void Room::love2ReachedSample() {
1257 	loadActorAnim2(OBJECT_KIRK, "kusemn", -1, -1, 28);
1258 }
1259 
love2GotSample()1260 void Room::love2GotSample() {
1261 	loadActorStandAnim(OBJECT_CURESAMPLE);
1262 	showDescription(TX_LOV2N037);
1263 	giveItem(OBJECT_ISAMPLE);
1264 	_awayMission->love.synthesizerContents = 0;
1265 	loadActorAnim(OBJECT_SYNTHESIZER_DOOR, "s3r3d5", 0x8a, 0x8d, 0);
1266 	playSoundEffectIndex(kSfxDoor);
1267 }
1268 
1269 
1270 // Get synthesizer output
love2GetSynthesizerOutput()1271 void Room::love2GetSynthesizerOutput() {
1272 	walkCrewman(OBJECT_KIRK, 0x85, 0xad, 10);
1273 	_awayMission->crewDirectionsAfterWalk[OBJECT_KIRK] = DIR_N;
1274 }
1275 
love2ReachedSynthesizerOutput()1276 void Room::love2ReachedSynthesizerOutput() {
1277 	loadActorAnim2(OBJECT_KIRK, "kusemn", -1, -1, 23);
1278 }
1279 
love2GotSynthesizerOutput()1280 void Room::love2GotSynthesizerOutput() {
1281 	switch (_awayMission->love.synthesizerBottleIndex) {
1282 	case BOTTLETYPE_N2O:
1283 		showDescription(TX_LOV2N040);
1284 		giveItem(OBJECT_IN2O);
1285 		break;
1286 
1287 	case BOTTLETYPE_NH3:
1288 		showDescription(TX_LOV2N039);
1289 		giveItem(OBJECT_INH3);
1290 		break;
1291 
1292 	case BOTTLETYPE_H2O:
1293 		showDescription(TX_LOV2N041);
1294 		giveItem(OBJECT_IH2O);
1295 		break;
1296 
1297 	case BOTTLETYPE_RLG:
1298 	default:
1299 		showDescription(TX_LOV2N038);
1300 		if (!_awayMission->love.gotTLDH) {
1301 			_awayMission->love.gotTLDH = true;
1302 			_awayMission->love.missionScore += 4;
1303 		}
1304 		giveItem(OBJECT_IRLG);
1305 		break;
1306 	}
1307 
1308 	loadActorStandAnim(OBJECT_SYNTHESIZER_OUTPUT);
1309 	loadActorAnim(OBJECT_SYNTHESIZER_DOOR, "s3r3d5", 0x8a, 0x8d, 0);
1310 	playSoundEffectIndex(kSfxDoor);
1311 
1312 	_awayMission->love.synthesizerContents = 0;
1313 	_awayMission->love.synthesizerBottleIndex = 0;
1314 }
1315 
1316 // Get the cure
love2GetCure()1317 void Room::love2GetCure() {
1318 	walkCrewman(OBJECT_KIRK, 0x85, 0xad, 11);
1319 	_awayMission->crewDirectionsAfterWalk[OBJECT_KIRK] = DIR_N;
1320 }
1321 
love2ReachedCure()1322 void Room::love2ReachedCure() {
1323 	loadActorAnim2(OBJECT_KIRK, "kusemn", -1, -1, 24);
1324 }
1325 
love2GotCure()1326 void Room::love2GotCure() {
1327 	if (!_awayMission->love.gotCure) {
1328 		_awayMission->love.gotCure = true;
1329 		_awayMission->love.missionScore += 5;
1330 	}
1331 
1332 	giveItem(OBJECT_ICURE);
1333 	loadActorStandAnim(OBJECT_CURE);
1334 	showDescription(TX_LOV2N043);
1335 
1336 	loadActorAnim(OBJECT_SYNTHESIZER_DOOR, "s3r3d5", 0x8a, 0x8d, 0);
1337 	playSoundEffectIndex(kSfxDoor);
1338 	_awayMission->love.synthesizerContents = 0;
1339 }
1340 
1341 }
1342