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