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 namespace StarTrek {
26 
27 #define OBJECT_ELASI_1 8
28 #define OBJECT_ELASI_2 9
29 #define OBJECT_ELASI_3 10
30 #define OBJECT_ELASI_4 11
31 #define OBJECT_12 12
32 #define OBJECT_13 13
33 #define OBJECT_14 14
34 #define OBJECT_15 15
35 
36 #define GUARDSTAT_UP 0
37 #define GUARDSTAT_STUNNED 1
38 #define GUARDSTAT_DEAD 2
39 #define GUARDSTAT_SURRENDERED 4
40 #define GUARDSTAT_TIED 8
41 
tug3Tick1()42 void Room::tug3Tick1() {
43 	playVoc("TUG3LOOP");
44 
45 	_awayMission->disableWalking = true;
46 	loadActorAnim2(OBJECT_ELASI_1, "p1turn", 0xa4, 0x98, 0);
47 	loadActorAnim2(OBJECT_ELASI_2, "p2turn", 0xd1, 0x88, 0);
48 	loadActorAnim2(OBJECT_ELASI_3, "p3turn", 0xfb, 0xc4, 0);
49 	loadActorAnim2(OBJECT_ELASI_4, "p4turn", 0x5a, 0x9e, 0);
50 }
51 
tug3Tick40()52 void Room::tug3Tick40() {
53 	loadActorAnim2(OBJECT_KIRK, "kdraws", -1, -1, 0); // Draw phaser
54 }
55 
tug3LookAnywhere()56 void Room::tug3LookAnywhere() {
57 	showDescription(7, true);
58 }
59 
tug3ElasiSurrendered()60 void Room::tug3ElasiSurrendered() {
61 	// BUGFIX: the original game had the condition below. However, this would cause
62 	// problems if you start shooting, then get them to surrender; if timed correctly,
63 	// they could shoot Kirk as he's beaming out and the mission is "successful". To
64 	// prevent that, the below condition is removed in ScummVM.
65 	/*
66 	if (_awayMission->tug.bridgeElasiDrewPhasers)
67 		return;
68 	*/
69 
70 	// Also part of the bugfix (stop shooting)
71 	_awayMission->timers[0] = 0;
72 
73 	_awayMission->tug.elasiSurrendered = true;
74 	loadActorAnim2(OBJECT_ELASI_1, "p1surr", -1, -1, 0);
75 	_awayMission->tug.bridgeElasi1Status = GUARDSTAT_SURRENDERED;
76 
77 	if (_awayMission->tug.bridgeElasi2Status == GUARDSTAT_UP) {
78 		loadActorAnim2(OBJECT_ELASI_2, "p2surr", -1, -1, 0);
79 		_awayMission->tug.bridgeElasi2Status = GUARDSTAT_SURRENDERED;
80 	}
81 	if (_awayMission->tug.bridgeElasi3Status == GUARDSTAT_UP) {
82 		loadActorAnim2(OBJECT_ELASI_3, "p3surr", -1, -1, 0);
83 		_awayMission->tug.bridgeElasi3Status = GUARDSTAT_SURRENDERED;
84 	}
85 	if (_awayMission->tug.bridgeElasi4Status == GUARDSTAT_UP) {
86 		loadActorAnim2(OBJECT_ELASI_4, "p4surr", -1, -1, 0);
87 		_awayMission->tug.bridgeElasi4Status = GUARDSTAT_SURRENDERED;
88 	}
89 
90 	_awayMission->tug.missionScore += 4;
91 }
92 
tug3UsePhaserAnywhere()93 void Room::tug3UsePhaserAnywhere() {
94 	// Stub function to suppress "you can't do that" messages
95 }
96 
tug3ElasiDrawPhasers()97 void Room::tug3ElasiDrawPhasers() {
98 	if (_awayMission->tug.bridgeElasiDrewPhasers)
99 		return;
100 
101 	_awayMission->tug.bridgeElasiDrewPhasers = true;
102 
103 	// If brig guards are alive & untied, kill the hostages
104 	if (_awayMission->tug.guard1Status == 0 || _awayMission->tug.guard2Status == 0) {
105 		showText(TX_SPEAKER_ELASI_CLANSMAN, 81, true, true);
106 		_awayMission->tug.missionScore = 0;
107 	}
108 
109 	if (_awayMission->timers[0] == 0)
110 		_awayMission->timers[0] = 10;
111 
112 	// Make all elasi draw their phasers
113 	if (_awayMission->tug.bridgeElasi1Status == 0)
114 		loadActorAnim2(OBJECT_ELASI_1, "p1draw", -1, -1, 0);
115 	if (_awayMission->tug.bridgeElasi2Status == 0)
116 		loadActorAnim2(OBJECT_ELASI_2, "p2draw", -1, -1, 0);
117 	if (_awayMission->tug.bridgeElasi3Status == 0)
118 		loadActorAnim2(OBJECT_ELASI_3, "p3draw", -1, -1, 0);
119 	if (_awayMission->tug.bridgeElasi4Status == 0)
120 		loadActorAnim2(OBJECT_ELASI_4, "p4draw", -1, -1, 0);
121 }
122 
tug3UseStunPhaserOnElasi1()123 void Room::tug3UseStunPhaserOnElasi1() {
124 	if (_awayMission->tug.crewmanKilled[OBJECT_KIRK] || _awayMission->tug.bridgeElasi1Status != GUARDSTAT_UP)
125 		return;
126 	loadActorAnim2(OBJECT_ELASI_1, "p1stun", -1, -1, 12);
127 	playSoundEffectIndex(SND_PHASSHOT);
128 	showBitmapFor5Ticks("t3beem05", 5);
129 	_awayMission->tug.bridgeElasi1Status = GUARDSTAT_STUNNED;
130 	tug3ElasiDrawPhasers();
131 }
132 
tug3UseStunPhaserOnElasi2()133 void Room::tug3UseStunPhaserOnElasi2() {
134 	if (_awayMission->tug.crewmanKilled[OBJECT_KIRK] || _awayMission->tug.bridgeElasi2Status != GUARDSTAT_UP)
135 		return;
136 	loadActorAnim2(OBJECT_ELASI_2, "p2stun", -1, -1, 12);
137 	playSoundEffectIndex(SND_PHASSHOT);
138 	showBitmapFor5Ticks("t3beem06", 5);
139 	_awayMission->tug.bridgeElasi2Status = GUARDSTAT_STUNNED;
140 	tug3ElasiDrawPhasers();
141 }
142 
tug3UseStunPhaserOnElasi3()143 void Room::tug3UseStunPhaserOnElasi3() {
144 	if (_awayMission->tug.crewmanKilled[OBJECT_KIRK] || _awayMission->tug.bridgeElasi3Status != GUARDSTAT_UP)
145 		return;
146 	loadActorAnim2(OBJECT_ELASI_3, "p3stun", -1, -1, 12);
147 	playSoundEffectIndex(SND_PHASSHOT);
148 	showBitmapFor5Ticks("t3beem07", 5);
149 	_awayMission->tug.bridgeElasi3Status = GUARDSTAT_STUNNED;
150 	tug3ElasiDrawPhasers();
151 }
152 
tug3UseStunPhaserOnElasi4()153 void Room::tug3UseStunPhaserOnElasi4() {
154 	if (_awayMission->tug.crewmanKilled[OBJECT_KIRK] || _awayMission->tug.bridgeElasi4Status != GUARDSTAT_UP)
155 		return;
156 	loadActorAnim2(OBJECT_ELASI_4, "p4stun", -1, -1, 12);
157 	playSoundEffectIndex(SND_PHASSHOT);
158 	showBitmapFor5Ticks("t3beem04", 5);
159 	_awayMission->tug.bridgeElasi4Status = GUARDSTAT_STUNNED;
160 	tug3ElasiDrawPhasers();
161 }
162 
tug3UseKillPhaserOnElasi1()163 void Room::tug3UseKillPhaserOnElasi1() {
164 	if (_awayMission->tug.crewmanKilled[OBJECT_KIRK] || _awayMission->tug.bridgeElasi1Status != GUARDSTAT_UP)
165 		return;
166 	loadActorAnim2(OBJECT_ELASI_1, "p1Kill", -1, -1, 12);
167 	playSoundEffectIndex(SND_PHASSHOT);
168 	showBitmapFor5Ticks("t3beem25", 5);
169 	_awayMission->tug.bridgeElasi1Status = GUARDSTAT_DEAD;
170 	_awayMission->tug.missionScore -= 2;
171 	tug3ElasiDrawPhasers();
172 }
173 
tug3UseKillPhaserOnElasi2()174 void Room::tug3UseKillPhaserOnElasi2() {
175 	if (_awayMission->tug.crewmanKilled[OBJECT_KIRK] || _awayMission->tug.bridgeElasi2Status != GUARDSTAT_UP)
176 		return;
177 	loadActorAnim2(OBJECT_ELASI_2, "p2Kill", -1, -1, 12);
178 	playSoundEffectIndex(SND_PHASSHOT);
179 	showBitmapFor5Ticks("t3beem27", 5);
180 	_awayMission->tug.bridgeElasi2Status = GUARDSTAT_DEAD;
181 	_awayMission->tug.missionScore -= 2;
182 	tug3ElasiDrawPhasers();
183 }
184 
tug3UseKillPhaserOnElasi3()185 void Room::tug3UseKillPhaserOnElasi3() {
186 	if (_awayMission->tug.crewmanKilled[OBJECT_KIRK] || _awayMission->tug.bridgeElasi3Status != GUARDSTAT_UP)
187 		return;
188 	loadActorAnim2(OBJECT_ELASI_3, "p3Kill", -1, -1, 12);
189 	playSoundEffectIndex(SND_PHASSHOT);
190 	showBitmapFor5Ticks("t3beem26", 5);
191 	_awayMission->tug.bridgeElasi3Status = GUARDSTAT_DEAD;
192 	_awayMission->tug.missionScore -= 2;
193 	tug3ElasiDrawPhasers();
194 }
195 
tug3UseKillPhaserOnElasi4()196 void Room::tug3UseKillPhaserOnElasi4() {
197 	if (_awayMission->tug.crewmanKilled[OBJECT_KIRK] || _awayMission->tug.bridgeElasi4Status != GUARDSTAT_UP)
198 		return;
199 	loadActorAnim2(OBJECT_ELASI_4, "p4Kill", -1, -1, 12);
200 	playSoundEffectIndex(SND_PHASSHOT);
201 	showBitmapFor5Ticks("t3beem24", 5);
202 	_awayMission->tug.bridgeElasi4Status = GUARDSTAT_DEAD;
203 	_awayMission->tug.missionScore -= 2;
204 	tug3ElasiDrawPhasers();
205 }
206 
tug3ElasiStunnedOrKilled()207 void Room::tug3ElasiStunnedOrKilled() {
208 	if (_awayMission->tug.bridgeWinMethod == 1)
209 		return;
210 	if (_awayMission->tug.bridgeElasi1Status == GUARDSTAT_UP || _awayMission->tug.bridgeElasi2Status == GUARDSTAT_UP
211 	        || _awayMission->tug.bridgeElasi3Status == GUARDSTAT_UP || _awayMission->tug.bridgeElasi4Status == GUARDSTAT_UP)
212 		return;
213 
214 	// BUGFIX: if the ship is deorbiting, the mission isn't won yet.
215 	if (_awayMission->tug.orbitalDecayCounter != 0)
216 		return;
217 
218 	_awayMission->tug.bridgeWinMethod = 1;
219 	tug3EndMission();
220 }
221 
tug3TalkToElasi1()222 void Room::tug3TalkToElasi1() {
223 	if (_awayMission->tug.bridgeElasi1Status != GUARDSTAT_UP || _awayMission->tug.talkedToCereth)
224 		return;
225 	_awayMission->tug.talkedToCereth = true;
226 
227 	const TextRef choices[] = {
228 		TX_SPEAKER_KIRK,
229 		4,
230 		3,
231 		2,
232 		TX_BLANK
233 	};
234 	int choice = showMultipleTexts(choices, true);
235 
236 	switch (choice) {
237 	case 0: // They surrender
238 		showText(TX_SPEAKER_ELASI_CERETH, 84, true, true);
239 		_awayMission->tug.bridgeElasi1Status = GUARDSTAT_SURRENDERED;
240 		loadActorAnim2(OBJECT_ELASI_1, "p1surr", -1, -1, 0);
241 		tug3ElasiSurrendered();
242 		_awayMission->tug.bridgeWinMethod = 2;
243 		_awayMission->tug.missionScore += 8;
244 		tug3EndMission();
245 		break;
246 
247 	case 1: // Cereth shoots console, doesn't surrender
248 		_awayMission->disableInput = true;
249 		showText(TX_SPEAKER_ELASI_CERETH, TX_TUG3_F27);
250 		loadActorAnim2(OBJECT_ELASI_1, "p1draw", -1, -1, 3);
251 		break;
252 
253 	case 2: // Cereth shoots console and surrenders
254 		_awayMission->disableInput = true;
255 		showText(TX_SPEAKER_ELASI_CERETH, 83, true, true);
256 		loadActorAnim2(OBJECT_ELASI_1, "p1draw", -1, -1, 5);
257 
258 		// BUGFIX: they're going to surrender, so stop the firefight.
259 		_awayMission->timers[0] = 0;
260 		break;
261 	}
262 }
263 
tug3Elasi1DrewPhaser()264 void Room::tug3Elasi1DrewPhaser() {
265 	playSoundEffectIndex(SND_PHASSHOT);
266 	showBitmapFor5Ticks("t3beem41", 13);
267 	playSoundEffectIndex(SND_BLANK_16);
268 	loadActorAnim2(OBJECT_12, "sparks", 0xa0, 0xad, 4);
269 }
270 
tug3Elasi1ShotConsole()271 void Room::tug3Elasi1ShotConsole() {
272 	tug3ElasiDrawPhasers();
273 	_awayMission->disableInput = false;
274 	_awayMission->tug.bridgeWinMethod = 3;
275 	_awayMission->timers[1] = 10;
276 }
277 
tug3Elasi1DrewPhaser2()278 void Room::tug3Elasi1DrewPhaser2() {
279 	playSoundEffectIndex(SND_PHASSHOT);
280 	showBitmapFor5Ticks("t3beem41", 13);
281 	loadActorAnim2(OBJECT_12, "sparks", 0xa0, 0xad, 6);
282 }
283 
tug3Elasi1ShotConsoleAndSurrenders()284 void Room::tug3Elasi1ShotConsoleAndSurrenders() {
285 	showText(TX_SPEAKER_ELASI_CERETH, 80, true, true);
286 	tug3ElasiSurrendered();
287 	_awayMission->disableInput = false;
288 	_awayMission->tug.bridgeWinMethod = 3;
289 	_awayMission->timers[1] = 10;
290 }
291 
tug3LookAtMccoy()292 void Room::tug3LookAtMccoy() {
293 	showDescription(0, true);
294 }
295 
tug3LookAtSpock()296 void Room::tug3LookAtSpock() {
297 	showDescription(2, true);
298 }
299 
tug3LookAtRedshirt()300 void Room::tug3LookAtRedshirt() {
301 	showDescription(1, true);
302 }
303 
tug3LookAtElasi1()304 void Room::tug3LookAtElasi1() {
305 	// BUGFIX: there were two implementations of this function; the first was the same as
306 	// the other 3 elasi, the second was specific to the captain. The second was never
307 	// called in the original game, but it's used here instead for more variety.
308 	// The function itself is changed by checking both if he's stunned or if he's dead,
309 	// instead of just checking if he's stunned.
310 
311 	if (_awayMission->tug.bridgeElasi1Status == GUARDSTAT_STUNNED || _awayMission->tug.bridgeElasi1Status == GUARDSTAT_DEAD)
312 		showDescription(3, true);
313 	else
314 		showDescription(8, true);
315 }
316 
tug3LookAtElasi2()317 void Room::tug3LookAtElasi2() {
318 	// BUGFIX: also check if stunned. They can't "glare at the crewmembers" if they're
319 	// unconscious. (applies to below functions too.)
320 	if (_awayMission->tug.bridgeElasi2Status == GUARDSTAT_DEAD || _awayMission->tug.bridgeElasi2Status == GUARDSTAT_STUNNED)
321 		showDescription(4, true);
322 	else
323 		showDescription(5, true);
324 }
325 
tug3LookAtElasi3()326 void Room::tug3LookAtElasi3() {
327 	if (_awayMission->tug.bridgeElasi3Status == GUARDSTAT_DEAD || _awayMission->tug.bridgeElasi2Status == GUARDSTAT_STUNNED)
328 		showDescription(4, true);
329 	else
330 		showDescription(5, true);
331 }
332 
tug3LookAtElasi4()333 void Room::tug3LookAtElasi4() {
334 	if (_awayMission->tug.bridgeElasi4Status == GUARDSTAT_DEAD || _awayMission->tug.bridgeElasi2Status == GUARDSTAT_STUNNED)
335 		showDescription(4, true);
336 	else
337 		showDescription(5, true);
338 }
339 
tug3TalkToMccoy()340 void Room::tug3TalkToMccoy() {
341 	if (_awayMission->tug.orbitalDecayCounter != 0 || _awayMission->tug.bridgeElasi1Status != GUARDSTAT_UP) {
342 		if (_awayMission->tug.orbitalDecayCounter >= 10) {
343 			if (_awayMission->tug.orbitalDecayCounter < 16)
344 				showText(TX_SPEAKER_MCCOY, 11, true);
345 		} else if (_awayMission->tug.orbitalDecayCounter != 0) {
346 			// BUGFIX: original game displays a blank textbox. An appropriate audio file
347 			// exists, but the corresponding text was written from scratch for ScummVM.
348 			// TODO: check if original floppy version has text for this.
349 			showText(TX_SPEAKER_MCCOY, 12, true);
350 		}
351 	} else
352 		showText(TX_SPEAKER_MCCOY, 13, true);
353 }
354 
tug3TalkToSpock()355 void Room::tug3TalkToSpock() {
356 	if (_awayMission->tug.orbitalDecayCounter != 0) {
357 		if (_awayMission->tug.orbitalDecayCounter >= 10) {
358 			if (_awayMission->tug.orbitalDecayCounter < 16)
359 				showText(TX_SPEAKER_SPOCK, 8, true);
360 		} else
361 			showText(TX_SPEAKER_SPOCK, 9, true);
362 	}
363 }
364 
tug3TalkToRedshirt()365 void Room::tug3TalkToRedshirt() {
366 	showText(TX_SPEAKER_CHRISTENSEN, 3, true, true);
367 }
368 
tug3UseCommunicator()369 void Room::tug3UseCommunicator() {
370 	if (_awayMission->tug.orbitalDecayCounter == 0)
371 		return;
372 
373 	if (_awayMission->tug.orbitalDecayCounter < 10) {
374 		showText(TX_SPEAKER_KIRK, 7, true);
375 		showText(TX_SPEAKER_SULU, 15, true);
376 		showText(TX_SPEAKER_SHIPS_COMPUTER, TX_COMPA180);
377 		_awayMission->timers[1] = 0;
378 
379 		// BUGFIX: if still fighting the elasi, the mission isn't done yet.
380 		_awayMission->tug.orbitalDecayCounter = 0;
381 		if (!_awayMission->tug.elasiSurrendered &&
382 		        (_awayMission->tug.bridgeElasi1Status == GUARDSTAT_UP
383 		         || _awayMission->tug.bridgeElasi2Status == GUARDSTAT_UP
384 		         || _awayMission->tug.bridgeElasi3Status == GUARDSTAT_UP
385 		         || _awayMission->tug.bridgeElasi4Status == GUARDSTAT_UP))
386 			return;
387 
388 		tug3EndMission();
389 	} else {
390 		if (_awayMission->tug.orbitalDecayCounter < 16) {
391 			showText(TX_SPEAKER_KIRK, 6, true);
392 			showText(TX_SPEAKER_SCOTT, TX_TUG3_S07);
393 
394 			playMidiMusicTracks(-1, -1);
395 
396 			_awayMission->disableInput = true;
397 			if (_awayMission->tug.missionScore < 0)
398 				_awayMission->tug.missionScore = 0;
399 			endMission(_awayMission->tug.missionScore, _awayMission->tug.field2b, _awayMission->tug.field2d);
400 		}
401 	}
402 }
403 
404 // One of the elasi shoots one of the crewmen
tug3Timer0Expired()405 void Room::tug3Timer0Expired() {
406 	const char *beamAnims[][4] = {
407 		{ "t3beem33", "t3beem35", "t3beem34", "t3beem32" },
408 		{ "t3beem37", "t3beem39", "t3beem38", "t3beem36" },
409 		{ "t3beem29", "t3beem31", "t3beem30", "t3beem28" },
410 	};
411 
412 	int elasiShooter, elasiTarget;
413 
414 	if (_awayMission->tug.bridgeElasi2Status == GUARDSTAT_UP)
415 		elasiShooter = 0;
416 	else if (_awayMission->tug.bridgeElasi3Status == GUARDSTAT_UP)
417 		elasiShooter = 1;
418 	else if (_awayMission->tug.bridgeElasi4Status == GUARDSTAT_UP)
419 		elasiShooter = 2;
420 	else
421 		return;
422 
423 	if (!_awayMission->tug.crewmanKilled[OBJECT_REDSHIRT]) {
424 		_awayMission->tug.crewmanKilled[OBJECT_REDSHIRT] = 2;
425 		_awayMission->redshirtDead = true;
426 		loadActorAnim2(OBJECT_REDSHIRT, "rkills", -1, -1, 0);
427 		elasiTarget = OBJECT_REDSHIRT;
428 	} else if (!_awayMission->tug.crewmanKilled[OBJECT_KIRK]) {
429 		_awayMission->tug.crewmanKilled[OBJECT_KIRK] = 2;
430 		_awayMission->disableInput = true;
431 		loadActorAnim2(OBJECT_KIRK, "kkills", -1, -1, 0);
432 		elasiTarget = OBJECT_KIRK;
433 	} else if (!_awayMission->tug.crewmanKilled[OBJECT_SPOCK]) {
434 		_awayMission->tug.crewmanKilled[OBJECT_SPOCK] = 2;
435 		loadActorAnim2(OBJECT_SPOCK, "skills", -1, -1, 0);
436 		elasiTarget = OBJECT_SPOCK;
437 	} else if (!_awayMission->tug.crewmanKilled[OBJECT_MCCOY]) {
438 		_awayMission->tug.crewmanKilled[OBJECT_MCCOY] = 2;
439 		loadActorAnim2(OBJECT_MCCOY, "mkills", -1, -1, 13);
440 		elasiTarget = OBJECT_MCCOY;
441 	} else
442 		return;
443 
444 	playSoundEffectIndex(SND_PHASSHOT);
445 	showBitmapFor5Ticks(beamAnims[elasiShooter][elasiTarget], 5);
446 	_awayMission->timers[0] = 50;
447 }
448 
tug3AllCrewmenDead()449 void Room::tug3AllCrewmenDead() {
450 	playMidiMusicTracks(2, -1);
451 	showGameOverMenu();
452 }
453 
454 // "Orbital decay" countdown timer
tug3Timer1Expired()455 void Room::tug3Timer1Expired() {
456 	if (_awayMission->tug.orbitalDecayCounter < 10) { // Decay still preventable
457 		showText(TX_SPEAKER_SHIPS_COMPUTER, TX_COMPU182);
458 		_awayMission->timers[1] = 100;
459 		_awayMission->tug.orbitalDecayCounter++;
460 	} else if (_awayMission->tug.orbitalDecayCounter < 16) { // Decay now unavoidable
461 		showText(TX_SPEAKER_SHIPS_COMPUTER, TX_COMPU181);
462 		_awayMission->timers[1] = 100;
463 		_awayMission->tug.orbitalDecayCounter++;
464 	} else { // Game over
465 		showDescription(6, true);
466 		showGameOverMenu();
467 	}
468 }
469 
tug3EndMission()470 void Room::tug3EndMission() {
471 	playMidiMusicTracks(28, -1);
472 	showText(TX_SPEAKER_KIRK, 1, true);
473 	playSoundEffectIndex(SND_TRANSMAT);
474 	loadActorAnim2(OBJECT_13, "rteleb", 0x14, 0xa0, 7);
475 	loadActorAnim2(OBJECT_14, "rteleb", 0x118, 0xa0, 0);
476 	loadActorAnim2(OBJECT_15, "rteleb", 0x96, 0xbe, 0);
477 }
478 
tug3SecurityTeamBeamedIn()479 void Room::tug3SecurityTeamBeamedIn() {
480 	loadActorAnim2(OBJECT_13, "rdrawe", -1, -1, 8);
481 	loadActorAnim2(OBJECT_14, "rdraws", -1, -1, 9);
482 	loadActorAnim2(OBJECT_15, "rfiren", -1, -1, 10);
483 
484 	showText(TX_SPEAKER_KIRK, 5, true);
485 	showText(TX_SPEAKER_SCOTT, TX_TUG3_S08);
486 
487 	playMidiMusicTracks(-1, -1);
488 	_awayMission->disableInput = true;
489 	if (_awayMission->tug.missionScore < 0)
490 		_awayMission->tug.missionScore = 0;
491 	endMission(_awayMission->tug.missionScore, _awayMission->tug.field2b, _awayMission->tug.field2d);
492 }
493 
494 }
495