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 #include "startrek/room.h"
24 
25 #define OBJECT_SERVICE_PANEL 8
26 #define OBJECT_INSULATION 9
27 #define OBJECT_WRENCH 10
28 #define OBJECT_GRATE 11
29 #define OBJECT_GAS_TANK 12
30 
31 #define HOTSPOT_ENGINEERING_PANEL 0x20
32 #define HOTSPOT_MONITOR 0x21
33 #define HOTSPOT_SHAFT 0x22
34 #define HOTSPOT_TURBINES 0x23
35 
36 namespace StarTrek {
37 
38 extern const RoomAction love3ActionList[] = {
39 	{ {ACTION_TICK, 1, 0, 0}, &Room::love3Tick1 },
40 	{ {ACTION_TICK, 80, 0, 0}, &Room::love3Tick80 },
41 	{ {ACTION_TOUCHED_WARP, 1, 0, 0}, &Room::love3TouchedWarp1 },
42 	{ {ACTION_TIMER_EXPIRED, 3, 0, 0}, &Room::love3Timer3Expired },
43 	{ {ACTION_LOOK, 8, 0, 0}, &Room::love3LookAtServicePanel },
44 	{ {ACTION_LOOK, 0x21, 0, 0}, &Room::love3LookAtMonitor },
45 	{ {ACTION_LOOK, 10, 0, 0}, &Room::love3LookAtWrench },
46 	{ {ACTION_LOOK, OBJECT_KIRK, 0, 0}, &Room::love3LookAtKirk },
47 	{ {ACTION_LOOK, OBJECT_MCCOY, 0, 0}, &Room::love3LookAtMccoy },
48 	{ {ACTION_LOOK, OBJECT_SPOCK, 0, 0}, &Room::love3LookAtSpock },
49 	{ {ACTION_LOOK, OBJECT_REDSHIRT, 0, 0}, &Room::love3LookAtRedshirt },
50 	{ {ACTION_LOOK, 0xff, 0, 0}, &Room::love3LookAnywhere },
51 	{ {ACTION_LOOK, 0x22, 0, 0}, &Room::love3LookAtShaft },
52 	{ {ACTION_LOOK, 11, 0, 0}, &Room::love3LookAtGrate },
53 	{ {ACTION_LOOK, 9, 0, 0}, &Room::love3LookAtPanel },
54 	{ {ACTION_LOOK, 0x20, 0, 0}, &Room::love3LookAtPanel },
55 	{ {ACTION_LOOK, 12, 0, 0}, &Room::love3LookAtGasTank },
56 	{ {ACTION_LOOK, 0x23, 0, 0}, &Room::love3LookAtTurbines },
57 	{ {ACTION_TALK, OBJECT_KIRK, 0, 0}, &Room::love3TalkToKirk },
58 	{ {ACTION_TALK, OBJECT_SPOCK, 0, 0}, &Room::love3TalkToSpock },
59 	{ {ACTION_TALK, OBJECT_MCCOY, 0, 0}, &Room::love3TalkToMccoy },
60 	{ {ACTION_TALK, OBJECT_REDSHIRT, 0, 0}, &Room::love3TalkToRedshirt },
61 	{ {ACTION_USE, OBJECT_IMTRICOR, 0xff, 0}, &Room::love3UseMTricorderAnywhere },
62 	{ {ACTION_USE, OBJECT_ISTRICOR, 0x23, 0}, &Room::love3UseSTricorderOnTurbines },
63 	{ {ACTION_USE, OBJECT_ISTRICOR, 9, 0}, &Room::love3UseSTricorderOnInsulation },
64 	{ {ACTION_USE, OBJECT_ISTRICOR, 0xff, 0}, &Room::love3UseSTricorderAnywhere },
65 	{ {ACTION_USE, OBJECT_KIRK, 8, 0}, &Room::love3UseKirkOnServicePanel },
66 	{ {ACTION_USE, OBJECT_SPOCK, 8, 0}, &Room::love3UseSpockOnServicePanel },
67 	{ {ACTION_USE, OBJECT_MCCOY, 8, 0}, &Room::love3UseMccoyOnServicePanel },
68 	{ {ACTION_USE, OBJECT_REDSHIRT, 8, 0}, &Room::love3UseRedshirtOnServicePanel },
69 	{ {ACTION_FINISHED_WALKING, 1, 0, 0}, &Room::love3CrewmanReachedServicePanel },
70 	{ {ACTION_FINISHED_ANIMATION, 1, 0, 0}, &Room::love3OpenedOrClosedServicePanel },
71 
72 	{ {ACTION_USE, OBJECT_IWRENCH, 12, 0}, &Room::love3UseWrenchOnGasTank },
73 	{ {ACTION_FINISHED_WALKING, 2, 0, 0}, &Room::love3ReachedGasTankToUnscrew },
74 	{ {ACTION_FINISHED_ANIMATION, 2, 0, 0}, &Room::love3ScrewedOrUnscrewedGasTank },
75 
76 	{ {ACTION_USE, OBJECT_IWRENCH, OBJECT_IO2GAS, 0}, &Room::love3UseWrenchOnO2OrH2Gas },
77 	{ {ACTION_USE, OBJECT_IWRENCH, OBJECT_IH2GAS, 0}, &Room::love3UseWrenchOnO2OrH2Gas },
78 
79 	{ {ACTION_USE, OBJECT_IWRENCH, OBJECT_IN2GAS, 0}, &Room::love3UseWrenchOnN2Gas },
80 	{ {ACTION_FINISHED_WALKING, 15, 0, 0}, &Room::love3ReachedGasTankToPutDown },
81 	{ {ACTION_FINISHED_ANIMATION, 3, 0, 0}, &Room::love3PutN2TankBack },
82 
83 	{ {ACTION_USE, OBJECT_IWRENCH, 0x20, 0}, &Room::love3UseWrenchOnEngineeringPanel },
84 	{ {ACTION_FINISHED_WALKING, 3, 0, 0}, &Room::love3ReachedEngineeringPanel },
85 	{ {ACTION_FINISHED_ANIMATION, 4, 0, 0}, &Room::love3OpenedEngineeringPanel },
86 
87 	{ {ACTION_USE, OBJECT_IWRENCH, 0x21, 0}, &Room::love3UseWrenchOnMonitor },
88 
89 	{ {ACTION_USE, OBJECT_IH2O, 0x21, 0}, &Room::love3UseWaterOnMonitor },
90 	{ {ACTION_FINISHED_WALKING, 14, 0, 0}, &Room::love3ReachedMonitorToUseWater },
91 	{ {ACTION_FINISHED_ANIMATION, 6, 0, 0}, &Room::love3PouredWaterOnMonitor },
92 
93 	{ {ACTION_USE, OBJECT_KIRK, 0x20, 0}, &Room::love3UseCrewmanOnEngineeringPanelOrGrate },
94 	{ {ACTION_USE, OBJECT_SPOCK, 0x20, 0}, &Room::love3UseCrewmanOnEngineeringPanelOrGrate },
95 	{ {ACTION_USE, OBJECT_MCCOY, 0x20, 0}, &Room::love3UseCrewmanOnEngineeringPanelOrGrate },
96 	{ {ACTION_USE, OBJECT_REDSHIRT, 0x20, 0}, &Room::love3UseCrewmanOnEngineeringPanelOrGrate },
97 	{ {ACTION_USE, OBJECT_KIRK, 11, 0}, &Room::love3UseCrewmanOnEngineeringPanelOrGrate },
98 	{ {ACTION_USE, OBJECT_SPOCK, 11, 0}, &Room::love3UseCrewmanOnEngineeringPanelOrGrate },
99 	{ {ACTION_USE, OBJECT_MCCOY, 11, 0}, &Room::love3UseCrewmanOnEngineeringPanelOrGrate },
100 	{ {ACTION_USE, OBJECT_REDSHIRT, 11, 0}, &Room::love3UseCrewmanOnEngineeringPanelOrGrate },
101 
102 	{ {ACTION_USE, OBJECT_IWRENCH, 11, 0}, &Room::love3UseWrenchOnGrate },
103 	{ {ACTION_FINISHED_WALKING, 4, 0, 0}, &Room::love3ReachedGateWithWrench },
104 	{ {ACTION_FINISHED_ANIMATION, 7, 0, 0}, &Room::love3OpenedOrClosedGrate },
105 
106 	{ {ACTION_USE, OBJECT_KIRK, 0x22, 0}, &Room::love3UseCrewmanOnShaft },
107 	{ {ACTION_USE, OBJECT_SPOCK, 0x22, 0}, &Room::love3UseCrewmanOnShaft },
108 	{ {ACTION_USE, OBJECT_MCCOY, 0x22, 0}, &Room::love3UseCrewmanOnShaft },
109 	{ {ACTION_USE, OBJECT_REDSHIRT, 0x22, 0}, &Room::love3UseCrewmanOnShaft },
110 
111 	{ {ACTION_USE, OBJECT_IH2O, 0x22, 0}, &Room::love3UseWaterOnShaft },
112 	{ {ACTION_FINISHED_WALKING, 5, 0, 0}, &Room::love3ReachedShaftUsingWater },
113 	{ {ACTION_FINISHED_ANIMATION, 8, 0, 0}, &Room::love3PouredWaterDownShaft },
114 
115 	{ {ACTION_USE, OBJECT_IN2O, 0x22, 0}, &Room::love3UseNitrousOxideOnShaft },
116 	{ {ACTION_FINISHED_WALKING, 6, 0, 0}, &Room::love3ReachedShaftUsingNitrousOxide },
117 	{ {ACTION_FINISHED_ANIMATION, 9, 0, 0}, &Room::love3PouredNitrousOxideDownShaft },
118 
119 	{ {ACTION_USE, OBJECT_INH3, 0x22, 0}, &Room::love3UseAmmoniaOnShaft },
120 	{ {ACTION_FINISHED_WALKING, 7, 0, 0}, &Room::love3ReachedShaftUsingAmmonia },
121 	{ {ACTION_FINISHED_ANIMATION, 10, 0, 0}, &Room::love3PouredAmmoniaDownShaft },
122 
123 	{ {ACTION_USE, OBJECT_IRLG, 0x22, 0}, &Room::love3UseRomulanLaughingGasOnShaft },
124 	{ {ACTION_FINISHED_WALKING, 8, 0, 0}, &Room::love3ReachedShaftUsingRomulanLaughingGas },
125 	{ {ACTION_FINISHED_ANIMATION, 11, 0, 0}, &Room::love3PouredRomulanLaughingGasDownShaft },
126 
127 	{ {ACTION_GET, 10, 0, 0}, &Room::love3GetWrench },
128 	{ {ACTION_FINISHED_WALKING, 9, 0, 0}, &Room::love3ReachedWrenchToGet },
129 	{ {ACTION_FINISHED_ANIMATION, 12, 0, 0}, &Room::love3PickedUpWrench },
130 
131 	{ {ACTION_GET, 12, 0, 0}, &Room::love3GetGasTank },
132 	{ {ACTION_FINISHED_WALKING, 10, 0, 0}, &Room::love3ReachedGasTankToGet },
133 
134 	{ {ACTION_USE, OBJECT_IANTIGRA, 12, 0}, &Room::love3UseAntigravOnGasTank },
135 	{ {ACTION_FINISHED_WALKING, 11, 0, 0}, &Room::love3ReachedGasTankUsingAntigrav },
136 	{ {ACTION_FINISHED_ANIMATION, 13, 0, 0}, &Room::love3PickedUpGasTank },
137 
138 	{ {ACTION_GET, 9, 0, 0}, &Room::love3GetInsulation },
139 	{ {ACTION_FINISHED_WALKING, 12, 0, 0}, &Room::love3ReachedInsulationToGet },
140 	{ {ACTION_FINISHED_ANIMATION, 14, 0, 0}, &Room::love3PickedUpInsulation },
141 
142 	// Common code
143 	{ {ACTION_TIMER_EXPIRED, 0, 0, 0}, &Room::loveaTimer0Expired },
144 	{ {ACTION_TIMER_EXPIRED, 1, 0, 0}, &Room::loveaTimer1Expired },
145 	{ {ACTION_USE, OBJECT_IMEDKIT, OBJECT_SPOCK, 0}, &Room::loveaUseMedkitOnSpock },
146 	{ {ACTION_USE, OBJECT_ISAMPLE, OBJECT_SPOCK, 0}, &Room::loveaUseCureSampleOnSpock },
147 	{ {ACTION_USE, OBJECT_ICURE, OBJECT_SPOCK, 0}, &Room::loveaUseCureOnSpock },
148 	{ {ACTION_FINISHED_WALKING,   99, 0, 0}, &Room::loveaSpockOrMccoyInPositionToUseCure },
149 	{ {ACTION_FINISHED_ANIMATION, 99, 0, 0}, &Room::loveaFinishedCuringSpock },
150 	{ {ACTION_TIMER_EXPIRED, 2, 0, 0}, &Room::loveaTimer2Expired },
151 	{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_SPOCK, 0}, &Room::loveaUseMTricorderOnSpock },
152 	{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_KIRK, 0}, &Room::loveaUseMTricorderOnHuman },
153 	{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_MCCOY, 0}, &Room::loveaUseMTricorderOnHuman },
154 	{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_REDSHIRT, 0}, &Room::loveaUseMTricorderOnHuman },
155 	{ {ACTION_USE, OBJECT_IRLG, 0xff, 0}, &Room::loveaUseRomulanLaughingGas },
156 	{ {ACTION_USE, OBJECT_IN2O, 0xff, 0}, &Room::loveaUseHumanLaughingGas },
157 	{ {ACTION_USE, OBJECT_INH3, 0xff, 0}, &Room::loveaUseAmmonia },
158 	{ {ACTION_USE, OBJECT_ICOMM, 0xff, 0}, &Room::loveaUseCommunicator },
159 	{ {ACTION_LIST_END, 0, 0, 0}, nullptr }
160 };
161 
162 enum love3TextIds {
163 	TX_SPEAKER_KIRK, TX_SPEAKER_MCCOY, TX_SPEAKER_SPOCK, TX_SPEAKER_FERRIS,
164 	TX_LOV0_011, TX_LOV0_012, TX_LOV0_013, TX_LOV0_014, TX_LOV0_015,
165 	TX_LOV0_016, TX_LOV0_017, TX_LOV0_019, TX_LOV0_020, TX_LOV0_021,
166 	TX_LOV0_022, TX_LOV0_025, TX_LOV0_026, TX_LOV0_029, TX_LOV0_033,
167 	TX_LOV0_039, TX_LOV0_040, TX_LOV0_041, TX_LOV0_042, TX_LOV0_043,
168 	TX_LOV0_045, TX_LOV0_046, TX_LOV0_047, TX_LOV0_048, TX_LOV0_049,
169 	TX_LOV0_050, TX_LOV0_101, TX_LOV0_102, TX_LOV0_103, TX_LOV0_104,
170 	TX_LOV0_105, TX_LOV0_106, TX_LOV0_107, TX_LOV0_124, TX_LOV3_001,
171 	TX_LOV3_002, TX_LOV3_003, TX_LOV3_004, TX_LOV3_005, TX_LOV3_006,
172 	TX_LOV3_007, TX_LOV3_008, TX_LOV3_009, TX_LOV3_010, TX_LOV3_011,
173 	TX_LOV3_012, TX_LOV3_013, TX_LOV3_014, TX_LOV3_015, TX_LOV3_016,
174 	TX_LOV3_017, TX_LOV3_018, TX_LOV3_019, TX_LOV3_020, TX_LOV3_021,
175 	TX_LOV3_022, TX_LOV3_023, TX_LOV3_024, TX_LOV3_025, TX_LOV3_026,
176 	TX_LOV5_015, TX_LOV5_019, TX_LOV5_027, TX_LOV5_030, TX_LOV5_038,
177 	TX_LOVA_100, TX_LOVA_F01, TX_LOVA_F02, TX_LOVA_F03, TX_LOVA_F04,
178 	TX_LOVA_F07, TX_LOVA_F08, TX_LOVA_F10, TX_LOVA_F54, TX_LOVA_F55,
179 	TX_MUD2_040, TX_MUD4_018, TX_TUG2_010, TX_VENA_F41, TX_BRIDU146,
180 	TX_GENER004, TX_LOV2N005, TX_LOV3N000, TX_LOV3N001, TX_LOV3N002,
181 	TX_LOV3N003, TX_LOV3N004, TX_LOV3N005, TX_LOV3N006, TX_LOV3N007,
182 	TX_LOV3N008, TX_LOV3N009, TX_LOV3N010, TX_LOV3N011, TX_LOV3N012,
183 	TX_LOV3N013, TX_LOV3N014, TX_LOV3N015, TX_LOV3N016, TX_LOV3N017,
184 	TX_LOV3N018, TX_LOV3N019, TX_LOV3N020, TX_LOV3N021, TX_LOV3N022,
185 	TX_LOV3N023, TX_LOV3N024, TX_LOV3N025, TX_LOV3N026, TX_LOV3N027,
186 	TX_LOV3N028, TX_LOV3N029, TX_LOV3N030, TX_LOV3N031, TX_LOV3N032,
187 	TX_LOV3NA08, TX_LOV3NA09, TX_LOV3NA20, TX_LOV3NA21, TX_LOV3NA22,
188 	TX_LOV3NA23, TX_LOV3NJ32, TX_DIALOG_ERROR
189 };
190 
191 // TODO: Finish floppy offsets
192 extern const RoomTextOffsets love3TextOffsets[] = {
193 	{ TX_SPEAKER_KIRK, 9959, 0 },
194 	{ TX_SPEAKER_MCCOY, 9970, 0 },
195 	{ TX_SPEAKER_SPOCK, 9980, 0 },
196 	{ TX_SPEAKER_FERRIS, 9990, 0 },
197 	{ TX_LOV0_011, 12469, 0 },
198 	{ TX_LOV0_012, 12596, 0 },
199 	{ TX_LOV0_013, 12892, 0 },
200 	{ TX_LOV0_014, 12656, 0 },
201 	{ TX_LOV0_015, 12760, 0 },
202 	{ TX_LOV0_016, 12563, 0 },
203 	{ TX_LOV0_017, 13026, 0 },
204 	{ TX_LOV0_019, 12946, 0 },
205 	{ TX_LOV0_020, 12503, 0 },
206 	{ TX_LOV0_021, 12814, 0 },
207 	{ TX_LOV0_022, 12704, 0 },
208 	{ TX_LOV0_025, 13952, 0 },
209 	{ TX_LOV0_026, 13825, 0 },
210 	{ TX_LOV0_029, 13705, 0 },
211 	{ TX_LOV0_033, 13765, 0 },
212 	{ TX_LOV0_039, 13087, 0 },
213 	{ TX_LOV0_040, 13214, 0 },
214 	{ TX_LOV0_041, 13510, 0 },
215 	{ TX_LOV0_042, 13274, 0 },
216 	{ TX_LOV0_043, 13378, 0 },
217 	{ TX_LOV0_045, 13181, 0 },
218 	{ TX_LOV0_046, 13644, 0 },
219 	{ TX_LOV0_047, 13564, 0 },
220 	{ TX_LOV0_048, 13121, 0 },
221 	{ TX_LOV0_049, 13432, 0 },
222 	{ TX_LOV0_050, 13322, 0 },
223 	{ TX_LOV0_101, 14033, 0 },
224 	{ TX_LOV0_102, 14097, 0 },
225 	{ TX_LOV0_103, 14167, 0 },
226 	{ TX_LOV0_104, 14217, 0 },
227 	{ TX_LOV0_105, 14274, 0 },
228 	{ TX_LOV0_106, 14386, 0 },
229 	{ TX_LOV0_107, 14454, 0 },
230 	{ TX_LOV0_124, 13902, 0 },
231 	{ TX_LOV3_001, 1598, 0 },
232 	{ TX_LOV3_002, 11502, 0 },
233 	{ TX_LOV3_003, 11007, 0 },
234 	{ TX_LOV3_004, 11136, 0 },
235 	{ TX_LOV3_005, 11251, 0 },
236 	{ TX_LOV3_006, 2083, 0 },
237 	{ TX_LOV3_007, 14507, 0 },
238 	{ TX_LOV3_008, 1826, 0 },
239 	{ TX_LOV3_009, 10712, 0 },
240 	{ TX_LOV3_010, 684, 0 },
241 	{ TX_LOV3_011, 5079, 0 },
242 	{ TX_LOV3_012, 4619, 0 },
243 	{ TX_LOV3_013, 11334, 0 },
244 	{ TX_LOV3_014, 11378, 0 },
245 	{ TX_LOV3_015, 6046, 0 },
246 	{ TX_LOV3_016, 3156, 0 },
247 	{ TX_LOV3_017, 1696, 0 },
248 	{ TX_LOV3_018, 11891, 0 },
249 	{ TX_LOV3_019, 10794, 0 },
250 	{ TX_LOV3_020, 851, 0 },
251 	{ TX_LOV3_021, 3714, 0 },
252 	{ TX_LOV3_022, 2953, 0 },
253 	{ TX_LOV3_023, 4928, 0 },
254 	{ TX_LOV3_024, 1960, 0 },
255 	{ TX_LOV3_025, 5869, 0 },
256 	{ TX_LOV3_026, 10954, 0 },
257 	{ TX_LOV5_015, 7076, 0 },
258 	//{ TX_LOV5_015, 7255, 0 },	// ignore duplicate line
259 	{ TX_LOV5_019, 6998, 0 },
260 	{ TX_LOV5_027, 7511, 0 },
261 	{ TX_LOV5_030, 7415, 0 },
262 	{ TX_LOV5_038, 7466, 0 },
263 	{ TX_LOVA_100, 8620, 0 },
264 	{ TX_LOVA_F01, 8062, 0 },
265 	{ TX_LOVA_F02, 8134, 0 },
266 	{ TX_LOVA_F03, 8333, 0 },
267 	{ TX_LOVA_F04, 8248, 0 },
268 	{ TX_LOVA_F07, 8697, 0 },
269 	{ TX_LOVA_F08, 7686, 0 },
270 	//{ TX_LOVA_F08, 8401, 0 }, // ignore duplicate line
271 	{ TX_LOVA_F10, 8568, 0 },
272 	{ TX_LOVA_F54, 7842, 0 },
273 	{ TX_LOVA_F55, 7143, 0 },
274 	{ TX_MUD2_040, 8893, 0 },
275 	{ TX_MUD4_018, 9435, 0 },
276 	//{ TX_MUD4_018, 9266, 0 },	// ignore duplicate line
277 	//{ TX_MUD4_018, 9599, 0 },	// ignore duplicate line
278 	//{ TX_MUD4_018, 9102, 0 },	// ignore duplicate line
279 	{ TX_TUG2_010, 8498, 0 },
280 	{ TX_VENA_F41, 9389, 0 },
281 	//{ TX_VENA_F41, 9722, 0 },	// ignore duplicate line
282 	//{ TX_VENA_F41, 9225, 0 },	// ignore duplicate line
283 	//{ TX_VENA_F41, 9558, 0 },	// ignore duplicate line
284 	{ TX_BRIDU146, 9668, 0 },
285 	//{ TX_BRIDU146, 9335, 0 },	// ignore duplicate line
286 	//{ TX_BRIDU146, 9504, 0 },	// ignore duplicate line
287 	//{ TX_BRIDU146, 9171, 0 },	// ignore duplicate line
288 	{ TX_GENER004, 7991, 0 },
289 	{ TX_LOV2N005, 8756, 0 },
290 	//{ TX_LOV2N005, 8982, 0 },	// ignore duplicate line
291 	//{ TX_LOV2N005, 8836, 0 },	// ignore duplicate line
292 	{ TX_LOV3N000, 10223, 0 },	// typo: the audio file is wrong
293 	{ TX_LOV3N001, 4852, 0 },
294 	{ TX_LOV3N002, 10260, 0 },
295 	{ TX_LOV3N003, 10324, 0 },
296 	{ TX_LOV3N004, 10475, 0 },
297 	{ TX_LOV3N005, 10381, 0 },
298 	{ TX_LOV3N006, 1503, 0 },
299 	{ TX_LOV3N007, 5476, 0 },
300 	{ TX_LOV3N008, 10423, 0 },
301 	{ TX_LOV3N009, 4422, 0 },
302 	{ TX_LOV3N010, 5947, 0 },
303 	{ TX_LOV3N011, 4277, 0 },
304 	{ TX_LOV3N012, 2895, 0 },
305 	{ TX_LOV3N013, 3371, 0 },
306 	{ TX_LOV3N014, 5550, 0 },
307 	{ TX_LOV3N015, 3060, 0 },
308 	{ TX_LOV3N016, 12045, 0 },
309 	{ TX_LOV3N017, 1374, 0 },
310 	{ TX_LOV3N018, 4564, 0 },
311 	{ TX_LOV3N019, 1272, 0 },
312 	{ TX_LOV3N020, 2580, 0 },
313 	{ TX_LOV3N021, 11748, 0 },
314 	{ TX_LOV3N022, 2675, 0 },
315 	{ TX_LOV3N023, 2631, 0 },
316 	{ TX_LOV3N024, 10535, 0 },
317 	{ TX_LOV3N025, 12110, 0 },
318 	{ TX_LOV3N026, 10600, 0 },
319 	{ TX_LOV3N027, 11699, 0 },
320 	{ TX_LOV3N028, 11606, 0 },
321 	{ TX_LOV3N029, 11650, 0 },
322 	{ TX_LOV3N030, 3914, 0 },
323 	{ TX_LOV3N031, 11563, 0 },
324 	{ TX_LOV3N032, 4188, 0 },
325 	{ TX_LOV3NA08, 12359, 0 },
326 	{ TX_LOV3NA09, 12156, 0 },
327 	{ TX_LOV3NA20, 10123, 0 },
328 	{ TX_LOV3NA21, 1187, 0 },
329 	{ TX_LOV3NA22, 10002, 0 },
330 	{ TX_LOV3NA23, 1089, 0 },
331 	{ TX_LOV3NJ32, 5767, 0 },
332 	{ TX_DIALOG_ERROR, 14528, 0 },
333 	{          -1, 0,    0 }
334 };
335 
336 extern const RoomText love3Texts[] = {
337 	{ -1, Common::UNK_LANG, "" }
338 };
339 
love3Tick1()340 void Room::love3Tick1() {
341 	playVoc("LOV3LOOP");
342 
343 	if (!_awayMission->love.wrenchTaken)
344 		loadActorAnim(OBJECT_WRENCH, "wrench", 0x10a, 0xb6, 0);
345 
346 	if (_awayMission->love.grateRemoved)
347 		loadActorAnim(OBJECT_GRATE, "s3r4g3", 0, 0, 0);
348 	else
349 		loadActorAnim(OBJECT_GRATE, "s3r4g1", 0x116, 0x8f, 0);
350 
351 	if (_awayMission->love.insulationOnGround)
352 		loadActorAnim(OBJECT_INSULATION, "s3r4p2", 0, 0, 0);
353 
354 	if (!_awayMission->love.tookN2TankFromServicePanel)
355 		loadActorAnim(OBJECT_GAS_TANK, "r4n2", 0, 0, 0);
356 
357 	if (_awayMission->love.servicePanelOpen)
358 		loadActorAnim(OBJECT_SERVICE_PANEL, "s3r4d1a", 1, 0, 0);
359 	else
360 		loadActorAnim(OBJECT_SERVICE_PANEL, "s3r4d2", 1, 0, 0);
361 
362 	if (_awayMission->love.releasedHumanLaughingGas)
363 		_awayMission->timers[0] = getRandomWordInRange(200, 400);
364 	if (_awayMission->love.releasedRomulanLaughingGas)
365 		_awayMission->timers[1] = getRandomWordInRange(200, 400);
366 	_awayMission->timers[2] = 200;
367 
368 	_roomVar.love.cmnXPosToCureSpock = 0xb4;
369 	_roomVar.love.cmnYPosToCureSpock = 0xb7;
370 }
371 
love3Tick80()372 void Room::love3Tick80() {
373 	if (!_awayMission->love.visitedRoomWithRomulans && haveItem(OBJECT_IRLG)) {
374 		showText(TX_SPEAKER_MCCOY, TX_LOV3_010);
375 		showText(TX_SPEAKER_SPOCK, TX_LOV3_020);
376 	}
377 }
378 
love3TouchedWarp1()379 void Room::love3TouchedWarp1() {
380 	_awayMission->disableInput = true;
381 	playSoundEffectIndex(kSfxDoor);
382 	_awayMission->timers[3] = 10;
383 }
384 
love3Timer3Expired()385 void Room::love3Timer3Expired() {
386 	loadRoomIndex(1, 0);
387 }
388 
love3LookAtServicePanel()389 void Room::love3LookAtServicePanel() {
390 	showDescription(TX_LOV3NA20);
391 }
392 
love3LookAtMonitor()393 void Room::love3LookAtMonitor() {
394 	showDescription(TX_LOV3N000); // BUGFIX: original didn't play the audio
395 }
396 
love3LookAtWrench()397 void Room::love3LookAtWrench() {
398 	showDescription(TX_LOV3N002);
399 }
400 
love3LookAtKirk()401 void Room::love3LookAtKirk() {
402 	showDescription(TX_LOV3N003);
403 }
404 
love3LookAtMccoy()405 void Room::love3LookAtMccoy() {
406 	showDescription(TX_LOV3N005);
407 }
408 
love3LookAtSpock()409 void Room::love3LookAtSpock() {
410 	showDescription(TX_LOV3N008);
411 }
412 
love3LookAtRedshirt()413 void Room::love3LookAtRedshirt() {
414 	showDescription(TX_LOV3N004);
415 }
416 
love3LookAnywhere()417 void Room::love3LookAnywhere() {
418 	showDescription(TX_LOV3NA23);
419 }
420 
love3LookAtShaft()421 void Room::love3LookAtShaft() {
422 	showDescription(TX_LOV3NA21);
423 }
424 
love3LookAtGrate()425 void Room::love3LookAtGrate() {
426 	showDescription(TX_LOV3N019);
427 }
428 
love3LookAtPanel()429 void Room::love3LookAtPanel() {
430 	if (_awayMission->love.insulationOnGround)
431 		showDescription(TX_LOV3N017);
432 	else
433 		showDescription(TX_LOV3NA22);
434 }
435 
love3LookAtGasTank()436 void Room::love3LookAtGasTank() {
437 	showDescription(TX_LOV3N006);
438 }
439 
love3LookAtTurbines()440 void Room::love3LookAtTurbines() {
441 	showDescription(TX_LOV3N026);
442 	showText(TX_SPEAKER_MCCOY, TX_LOV3_009);
443 	showText(TX_SPEAKER_SPOCK, TX_LOV3_019);
444 	if (!_awayMission->redshirtDead)
445 		showText(TX_SPEAKER_FERRIS, TX_LOV3_026);
446 }
447 
love3TalkToKirk()448 void Room::love3TalkToKirk() {
449 	showText(TX_SPEAKER_KIRK, TX_LOV3_001);
450 }
451 
love3TalkToSpock()452 void Room::love3TalkToSpock() {
453 	if (_awayMission->love.visitedRoomWithRomulans)
454 		showText(TX_SPEAKER_SPOCK, TX_LOV3_003);
455 	else if (_awayMission->love.romulansUnconsciousFromLaughingGas)
456 		showText(TX_SPEAKER_SPOCK, TX_LOV3_017);
457 	else if (haveItem(OBJECT_IRLG))
458 		showText(TX_SPEAKER_SPOCK, TX_LOV3_004);
459 	else
460 		showText(TX_SPEAKER_SPOCK, TX_LOV3_003);
461 }
462 
love3TalkToMccoy()463 void Room::love3TalkToMccoy() {
464 	showText(TX_SPEAKER_MCCOY, TX_LOV3_008);
465 }
466 
love3TalkToRedshirt()467 void Room::love3TalkToRedshirt() {
468 	showText(TX_SPEAKER_FERRIS, TX_LOV3_024);
469 }
470 
love3UseMTricorderAnywhere()471 void Room::love3UseMTricorderAnywhere() {
472 	if (_awayMission->love.knowAboutVirus)
473 		mccoyScan(DIR_S, TX_SPEAKER_MCCOY, TX_LOV3_005, false);
474 	else
475 		mccoyScan(DIR_S, TX_SPEAKER_MCCOY, TX_LOV3_006, false);
476 }
477 
love3UseSTricorderOnTurbines()478 void Room::love3UseSTricorderOnTurbines() {
479 	spockScan(DIR_N, TX_SPEAKER_SPOCK, TX_LOV3_014, false);
480 }
481 
love3UseSTricorderOnInsulation()482 void Room::love3UseSTricorderOnInsulation() {
483 	if (_awayMission->love.insulationOnGround)
484 		spockScan(DIR_W, TX_SPEAKER_SPOCK, TX_LOV3_002, false);
485 }
486 
love3UseSTricorderAnywhere()487 void Room::love3UseSTricorderAnywhere() {
488 	spockScan(DIR_S, TX_SPEAKER_SPOCK, TX_LOV3_013, false);
489 }
490 
love3UseKirkOnServicePanel()491 void Room::love3UseKirkOnServicePanel() {
492 	_roomVar.love.activeCrewman = OBJECT_KIRK;
493 	walkCrewman(_roomVar.love.activeCrewman, 0x104, 0xae, 1);
494 }
495 
love3UseSpockOnServicePanel()496 void Room::love3UseSpockOnServicePanel() {
497 	_roomVar.love.activeCrewman = OBJECT_SPOCK;
498 	walkCrewman(_roomVar.love.activeCrewman, 0x104, 0xae, 1);
499 }
500 
love3UseMccoyOnServicePanel()501 void Room::love3UseMccoyOnServicePanel() {
502 	_roomVar.love.activeCrewman = OBJECT_MCCOY;
503 	walkCrewman(_roomVar.love.activeCrewman, 0x104, 0xae, 1);
504 }
505 
love3UseRedshirtOnServicePanel()506 void Room::love3UseRedshirtOnServicePanel() {
507 	_roomVar.love.activeCrewman = OBJECT_REDSHIRT;
508 	walkCrewman(_roomVar.love.activeCrewman, 0x104, 0xae, 1);
509 }
510 
love3CrewmanReachedServicePanel()511 void Room::love3CrewmanReachedServicePanel() {
512 	Common::String anim = getCrewmanAnimFilename(_roomVar.love.activeCrewman, "usehe");
513 	loadActorAnim2(_roomVar.love.activeCrewman, anim, -1, -1, 1);
514 }
515 
love3OpenedOrClosedServicePanel()516 void Room::love3OpenedOrClosedServicePanel() {
517 	if (_awayMission->love.servicePanelOpen)
518 		loadActorAnim2(OBJECT_SERVICE_PANEL, "s3r4d1b", 1, 0, 0);
519 	else
520 		loadActorAnim2(OBJECT_SERVICE_PANEL, "s3r4d1", 1, 0, 0);
521 
522 	playVoc("SMADOOR1");
523 	_awayMission->love.servicePanelOpen = !_awayMission->love.servicePanelOpen;
524 
525 	if (_awayMission->love.servicePanelOpen) {
526 		if (_awayMission->love.tookN2TankFromServicePanel)
527 			showDescription(TX_LOV3N023);
528 		else
529 			showDescription(TX_LOV3N022);
530 	} else
531 		showDescription(TX_LOV3N020);
532 }
533 
534 // Use wrench on gas tank, to screw or unscrew it in position
love3UseWrenchOnGasTank()535 void Room::love3UseWrenchOnGasTank() {
536 	walkCrewman(OBJECT_KIRK, 0x10e, 0xae, 2);
537 }
538 
love3ReachedGasTankToUnscrew()539 void Room::love3ReachedGasTankToUnscrew() {
540 	loadActorAnim2(OBJECT_KIRK, "kusehe", -1, -1, 2);
541 	playVoc("MUR3E1S");
542 }
543 
love3ScrewedOrUnscrewedGasTank()544 void Room::love3ScrewedOrUnscrewedGasTank() {
545 	if (!_awayMission->love.gasTankUnscrewed) {
546 		showDescription(TX_LOV3N012);
547 		if (!_awayMission->redshirtDead)
548 			showText(TX_SPEAKER_FERRIS, TX_LOV3_022);
549 		_awayMission->love.gasTankUnscrewed = true;
550 	} else {
551 		showDescription(TX_LOV3N015);
552 		_awayMission->love.gasTankUnscrewed = false;
553 	}
554 }
555 
556 
love3UseWrenchOnO2OrH2Gas()557 void Room::love3UseWrenchOnO2OrH2Gas() {
558 	showText(TX_SPEAKER_SPOCK, TX_LOV3_016);
559 }
560 
561 
562 // Use wrench on N2 gas = putting it from the inventory back to the service panel
love3UseWrenchOnN2Gas()563 void Room::love3UseWrenchOnN2Gas() {
564 	walkCrewman(OBJECT_KIRK, 0x10e, 0xae, 15);
565 }
566 
love3ReachedGasTankToPutDown()567 void Room::love3ReachedGasTankToPutDown() {
568 	loadActorAnim2(OBJECT_KIRK, "kusehe", -1, -1, 3);
569 	playVoc("MUR3E1S");
570 }
571 
love3PutN2TankBack()572 void Room::love3PutN2TankBack() {
573 	showDescription(TX_LOV3N013);
574 	_awayMission->love.tookN2TankFromServicePanel = false;
575 	loseItem(OBJECT_IN2GAS);
576 	loadActorAnim(OBJECT_GAS_TANK, "r4n2", 0, 0, 0);
577 }
578 
579 
580 // Use wrench on engineering panel, insulation comes out
love3UseWrenchOnEngineeringPanel()581 void Room::love3UseWrenchOnEngineeringPanel() {
582 	walkCrewman(OBJECT_KIRK, 0x37, 0xb4, 3);
583 }
584 
love3ReachedEngineeringPanel()585 void Room::love3ReachedEngineeringPanel() {
586 	loadActorAnim2(OBJECT_KIRK, "kuselw", -1, -1, 4);
587 	playVoc("MUR3E1S");
588 }
589 
love3OpenedEngineeringPanel()590 void Room::love3OpenedEngineeringPanel() {
591 	if (!_awayMission->love.insulationOnGround) {
592 		playVoc("MADR4E4A");
593 		loadActorAnim(OBJECT_INSULATION, "s3r4p1", 0, 0, 0);
594 		_awayMission->love.insulationOnGround = true;
595 	}
596 	showDescription(TX_LOV3N021);
597 }
598 
599 
love3UseWrenchOnMonitor()600 void Room::love3UseWrenchOnMonitor() {
601 	showText(TX_SPEAKER_SPOCK, TX_LOV3_018);
602 }
603 
604 
love3UseWaterOnMonitor()605 void Room::love3UseWaterOnMonitor() {
606 	walkCrewmanC(OBJECT_KIRK, 0xc8, 0xb2, &Room::love3ReachedMonitorToUseWater);
607 }
608 
love3ReachedMonitorToUseWater()609 void Room::love3ReachedMonitorToUseWater() {
610 	loadActorAnimC(OBJECT_KIRK, "kusemn", -1, -1, &Room::love3PouredWaterOnMonitor);
611 }
612 
love3PouredWaterOnMonitor()613 void Room::love3PouredWaterOnMonitor() {
614 	// BUGFIX: the speaker should be Lt. Ferris. In the original, the speaker wasn't
615 	// specified.
616 	// However, there is no substitute text for when Lt. Ferris is dead.
617 	showText(TX_SPEAKER_FERRIS, TX_LOV3_021);
618 
619 	loseItem(OBJECT_IH2O);
620 }
621 
622 
love3UseCrewmanOnEngineeringPanelOrGrate()623 void Room::love3UseCrewmanOnEngineeringPanelOrGrate() {
624 	showDescription(TX_LOV3N030);
625 }
626 
627 
love3UseWrenchOnGrate()628 void Room::love3UseWrenchOnGrate() {
629 	walkCrewmanC(OBJECT_KIRK, 0xf6, 0xaa, &Room::love3ReachedGateWithWrench);
630 	_awayMission->disableInput = true;
631 }
632 
love3ReachedGateWithWrench()633 void Room::love3ReachedGateWithWrench() {
634 	if (_awayMission->love.grateRemoved)
635 		loadActorAnimC(OBJECT_KIRK, "s3r4g2a", -1, -1, &Room::love3OpenedOrClosedGrate);
636 	else
637 		loadActorAnimC(OBJECT_KIRK, "s3r4g2",  -1, -1, &Room::love3OpenedOrClosedGrate);
638 	loadActorStandAnim(OBJECT_GRATE);
639 	playVoc("MUR3E1S");
640 }
641 
love3OpenedOrClosedGrate()642 void Room::love3OpenedOrClosedGrate() {
643 	_awayMission->disableInput = false;
644 	loadActorStandAnim(OBJECT_KIRK);
645 
646 	if (!_awayMission->love.grateRemoved) {
647 		_awayMission->love.grateRemoved = true;
648 		loadActorAnim(OBJECT_GRATE, "s3r4g3", 0, 0, 0);
649 		showDescription(TX_LOV3N016);
650 		if (!_awayMission->love.gotPointsForOpeningGrate) {
651 			_awayMission->love.gotPointsForOpeningGrate = true;
652 			_awayMission->love.missionScore++;
653 		}
654 	} else {
655 		loadActorAnim(OBJECT_GRATE, "s3r4g1", 0x116, 0x8f, 0);
656 		_awayMission->love.grateRemoved = false;
657 		showDescription(TX_LOV3N032);
658 	}
659 }
660 
661 
love3UseCrewmanOnShaft()662 void Room::love3UseCrewmanOnShaft() {
663 	showDescription(TX_LOV3N011);
664 }
665 
666 
love3UseWaterOnShaft()667 void Room::love3UseWaterOnShaft() {
668 	walkCrewmanC(OBJECT_KIRK, 0x100, 0xa6, &Room::love3ReachedShaftUsingWater);
669 }
670 
love3ReachedShaftUsingWater()671 void Room::love3ReachedShaftUsingWater() {
672 	if (!_awayMission->love.grateRemoved)
673 		showDescription(TX_LOV3N025);
674 	else
675 		loadActorAnimC(OBJECT_KIRK, "kuseme", -1, -1, &Room::love3PouredWaterDownShaft);
676 }
677 
love3PouredWaterDownShaft()678 void Room::love3PouredWaterDownShaft() {
679 	showDescription(TX_LOV3N009);
680 	loseItem(OBJECT_IH2O);
681 }
682 
683 
love3UseNitrousOxideOnShaft()684 void Room::love3UseNitrousOxideOnShaft() {
685 	walkCrewmanC(OBJECT_KIRK, 0x100, 0xa6, &Room::love3ReachedShaftUsingNitrousOxide);
686 }
687 
love3ReachedShaftUsingNitrousOxide()688 void Room::love3ReachedShaftUsingNitrousOxide() {
689 	if (!_awayMission->love.grateRemoved)
690 		showDescription(TX_LOV3N025);
691 	else
692 		loadActorAnimC(OBJECT_KIRK, "kuseme", -1, -1, &Room::love3PouredNitrousOxideDownShaft);
693 }
694 
love3PouredNitrousOxideDownShaft()695 void Room::love3PouredNitrousOxideDownShaft() {
696 	showDescription(TX_LOV3N018);
697 	showText(TX_SPEAKER_SPOCK, TX_LOV3_012);
698 	loseItem(OBJECT_IN2O);
699 }
700 
701 
love3UseAmmoniaOnShaft()702 void Room::love3UseAmmoniaOnShaft() {
703 	walkCrewmanC(OBJECT_KIRK, 0x100, 0xa6, &Room::love3ReachedShaftUsingAmmonia);
704 }
705 
love3ReachedShaftUsingAmmonia()706 void Room::love3ReachedShaftUsingAmmonia() {
707 	if (!_awayMission->love.grateRemoved)
708 		showDescription(TX_LOV3N025);
709 	else
710 		loadActorAnimC(OBJECT_KIRK, "kuseme", -1, -1, &Room::love3PouredAmmoniaDownShaft);
711 }
712 
love3PouredAmmoniaDownShaft()713 void Room::love3PouredAmmoniaDownShaft() {
714 	if (!_awayMission->love.romulansUnconsciousFromVirus) {
715 		showDescription(TX_LOV3N001);
716 		if (!_awayMission->redshirtDead)
717 			showText(TX_SPEAKER_FERRIS, TX_LOV3_023);
718 	}
719 
720 	loseItem(OBJECT_INH3);
721 }
722 
723 
love3UseRomulanLaughingGasOnShaft()724 void Room::love3UseRomulanLaughingGasOnShaft() {
725 	if (_awayMission->love.gotPointsForGassingRomulans) {
726 		// BUG-ish: you could get the points for this by starting the action, then
727 		// canceling it before Kirk reaches the shaft.
728 		_awayMission->love.gotPointsForGassingRomulans = true;
729 		_awayMission->love.missionScore += 6;
730 	}
731 	if (_awayMission->love.romulansUnconsciousFromLaughingGas)
732 		showText(TX_SPEAKER_SPOCK, TX_LOV3_011);
733 	else {
734 		walkCrewmanC(OBJECT_KIRK, 0xf6, 0xa4, &Room::love3ReachedShaftUsingRomulanLaughingGas);
735 	}
736 }
737 
love3ReachedShaftUsingRomulanLaughingGas()738 void Room::love3ReachedShaftUsingRomulanLaughingGas() {
739 	if (!_awayMission->love.grateRemoved)
740 		showDescription(TX_LOV3N025);
741 	else {
742 		loadActorAnimC(OBJECT_KIRK, "kuseme", -1, -1, &Room::love3PouredRomulanLaughingGasDownShaft);
743 		playVoc("EFX24");
744 	}
745 }
746 
love3PouredRomulanLaughingGasDownShaft()747 void Room::love3PouredRomulanLaughingGasDownShaft() {
748 	loseItem(OBJECT_IRLG);
749 	_awayMission->love.romulansUnconsciousFromLaughingGas = true;
750 
751 	if (_awayMission->love.romulansUnconsciousFromVirus) {
752 		showDescription(TX_LOV3NA08);
753 		_awayMission->love.romulansUnconsciousFromLaughingGas = false;
754 	} else {
755 		showDescription(TX_LOV3NA09);
756 		playVoc("ROMULANL");
757 	}
758 }
759 
760 
761 // Get the wrench on the ground
love3GetWrench()762 void Room::love3GetWrench() {
763 	walkCrewmanC(OBJECT_KIRK, 0x104, 0xb6, &Room::love3ReachedWrenchToGet);
764 }
765 
love3ReachedWrenchToGet()766 void Room::love3ReachedWrenchToGet() {
767 	loadActorAnimC(OBJECT_KIRK, "s5r1kg", -1, -1, &Room::love3PickedUpWrench);
768 }
769 
love3PickedUpWrench()770 void Room::love3PickedUpWrench() {
771 	loadActorStandAnim(OBJECT_KIRK);
772 	giveItem(OBJECT_IWRENCH);
773 	loadActorStandAnim(OBJECT_WRENCH);
774 	_awayMission->love.wrenchTaken = true;
775 	showDescription(TX_LOV3N031);
776 }
777 
778 
779 // Get the N2 gas tank in the service panel (fails due to weight)
love3GetGasTank()780 void Room::love3GetGasTank() {
781 	walkCrewmanC(OBJECT_KIRK, 0x121, 0xb7, &Room::love3ReachedGasTankToGet);
782 }
783 
love3ReachedGasTankToGet()784 void Room::love3ReachedGasTankToGet() {
785 	if (_awayMission->love.gasTankUnscrewed)
786 		showDescription(TX_LOV3N007);
787 	else
788 		showDescription(TX_LOV3N014);
789 }
790 
791 
792 // Use antigrav unit N2 gas tank in the service panel (succeeds)
love3UseAntigravOnGasTank()793 void Room::love3UseAntigravOnGasTank() {
794 	walkCrewmanC(OBJECT_KIRK, 0x10e, 0xae, &Room::love3ReachedGasTankUsingAntigrav);
795 }
796 
love3ReachedGasTankUsingAntigrav()797 void Room::love3ReachedGasTankUsingAntigrav() {
798 	if (_awayMission->love.gasTankUnscrewed) {
799 		loadActorAnimC(OBJECT_KIRK, "kusehe", -1, -1, &Room::love3PickedUpGasTank);
800 		playVoc("SE3PLBAT");
801 	} else {
802 		showDescription(TX_LOV3N010);
803 		showText(TX_SPEAKER_SPOCK, TX_LOV3_015);
804 	}
805 }
806 
love3PickedUpGasTank()807 void Room::love3PickedUpGasTank() {
808 	giveItem(OBJECT_IN2GAS);
809 	loadActorStandAnim(OBJECT_GAS_TANK);
810 	_awayMission->love.tookN2TankFromServicePanel = true;
811 
812 	showDescription(TX_LOV3NJ32);
813 	if (!_awayMission->redshirtDead)
814 		showText(TX_SPEAKER_FERRIS, TX_LOV3_025);
815 }
816 
love3GetInsulation()817 void Room::love3GetInsulation() {
818 	walkCrewmanC(OBJECT_KIRK, 0x32, 0xbe, &Room::love3ReachedInsulationToGet);
819 }
820 
love3ReachedInsulationToGet()821 void Room::love3ReachedInsulationToGet() {
822 	if (!_awayMission->love.field3c)
823 		loadActorAnimC(OBJECT_KIRK, "s5r1kg", -1, -1, &Room::love3PickedUpInsulation);
824 }
825 
love3PickedUpInsulation()826 void Room::love3PickedUpInsulation() {
827 	loadActorStandAnim(OBJECT_KIRK);
828 	giveItem(OBJECT_IINSULAT);
829 	showDescription(TX_LOV3N029);
830 }
831 
832 }
833