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