1 #include "Directories.h"
2 #include "Font_Control.h"
3 #include "Overhead.h"
4 #include "Quests.h"
5 #include "Timer_Control.h"
6 #include "Soldier_Control.h"
7 #include "Weapons.h"
8 #include "Handle_Items.h"
9 #include "WorldDef.h"
10 #include "Rotting_Corpses.h"
11 #include "Isometric_Utils.h"
12 #include "Animation_Control.h"
13 #include "Game_Clock.h"
14 #include "Soldier_Create.h"
15 #include "RenderWorld.h"
16 #include "Tile_Animation.h"
17 #include "Merc_Entering.h"
18 #include "Sound_Control.h"
19 #include "Strategic.h"
20 #include "StrategicMap.h"
21 #include "Handle_UI.h"
22 #include "Squads.h"
23 #include "English.h"
24 #include "Cursor_Control.h"
25 #include "Merc_Hiring.h"
26 #include "Message.h"
27 #include "Text.h"
28 #include "Strategic_Turns.h"
29 #include "AI.h"
30 #include "Dialogue_Control.h"
31 #include "Music_Control.h"
32 #include "ContentMusic.h"
33 #include "UILayout.h"
34
35
36 #define MAX_MERC_IN_HELI 20
37 #define MAX_HELI_SCRIPT 30
38 #define ME_SCRIPT_DELAY 100
39 #define NUM_PER_HELI_RUN 6
40 #define REPEAT_HELI_MOVEAWAY ( (STD_SCREEN_X) / 7)
41
42 enum HeliStateEnums
43 {
44 HELI_APPROACH,
45 HELI_MOVETO,
46 HELI_BEGINDROP,
47 HELI_DROP,
48 HELI_ENDDROP,
49 HELI_MOVEAWAY,
50 HELI_EXIT,
51 NUM_HELI_STATES
52 };
53
54 enum HeliCodes
55 {
56 HELI_REST,
57 HELI_MOVE_DOWN,
58 HELI_MOVE_UP,
59 HELI_MOVESMALL_DOWN,
60 HELI_MOVESMALL_UP,
61 HELI_MOVEY,
62 HELI_MOVELARGERY,
63 HELI_HANDLE_DROP,
64 HELI_SHOW_HELI,
65
66 HELI_GOTO_BEGINDROP,
67 HELI_GOTO_DROP,
68 HELI_GOTO_EXIT,
69 HELI_GOTO_MOVETO,
70 HELI_GOTO_MOVEAWAY,
71 HELI_DONE
72 };
73
74
75 static UINT8 const ubHeliScripts[NUM_HELI_STATES][MAX_HELI_SCRIPT] =
76 {
77 {
78 // HELI_APPROACH
79 HELI_REST,
80 HELI_REST,
81 HELI_REST,
82 HELI_REST,
83 HELI_REST,
84
85 HELI_REST,
86 HELI_REST,
87 HELI_REST,
88 HELI_REST,
89 HELI_REST,
90
91 HELI_REST,
92 HELI_REST,
93 HELI_REST,
94 HELI_REST,
95 HELI_REST,
96
97 HELI_REST,
98 HELI_REST,
99 HELI_REST,
100 HELI_REST,
101 HELI_REST,
102
103 HELI_REST,
104 HELI_REST,
105 HELI_REST,
106 HELI_REST,
107 HELI_REST,
108
109 HELI_REST,
110 HELI_REST,
111 HELI_REST,
112 HELI_REST,
113 HELI_GOTO_MOVETO
114 },
115
116 {
117 // MOVE TO
118 HELI_SHOW_HELI,
119 HELI_MOVEY,
120 HELI_MOVEY,
121 HELI_MOVEY,
122 HELI_MOVEY,
123
124 HELI_MOVEY,
125 HELI_MOVEY,
126 HELI_MOVEY,
127 HELI_MOVEY,
128 HELI_MOVEY,
129
130 HELI_MOVEY,
131 HELI_MOVEY,
132 HELI_MOVEY,
133 HELI_MOVEY,
134 HELI_MOVEY,
135
136 HELI_MOVEY,
137 HELI_MOVEY,
138 HELI_MOVEY,
139 HELI_MOVEY,
140 HELI_MOVEY,
141
142 HELI_MOVEY,
143 HELI_MOVEY,
144 HELI_MOVEY,
145 HELI_MOVEY,
146 HELI_MOVEY,
147
148 HELI_MOVEY,
149 HELI_MOVEY,
150 HELI_MOVEY,
151 HELI_MOVEY,
152 HELI_GOTO_BEGINDROP
153 },
154
155 {
156 // HELI_BEGIN_DROP
157 HELI_MOVE_DOWN,
158 HELI_MOVE_DOWN,
159 HELI_MOVE_DOWN,
160 HELI_MOVE_DOWN,
161 HELI_MOVE_DOWN,
162
163 HELI_MOVE_DOWN,
164 HELI_MOVE_DOWN,
165 HELI_MOVE_DOWN,
166 HELI_MOVE_DOWN,
167 HELI_MOVE_DOWN,
168
169 HELI_MOVE_DOWN,
170 HELI_MOVE_DOWN,
171 HELI_MOVE_DOWN,
172 HELI_MOVE_DOWN,
173 HELI_MOVE_DOWN,
174
175 HELI_MOVE_DOWN,
176 HELI_MOVE_DOWN,
177 HELI_MOVE_DOWN,
178 HELI_MOVE_DOWN,
179 HELI_MOVE_DOWN,
180
181 HELI_MOVE_DOWN,
182 HELI_MOVE_DOWN,
183 HELI_MOVE_DOWN,
184 HELI_MOVE_DOWN,
185 HELI_MOVE_DOWN,
186
187 HELI_MOVE_DOWN,
188 HELI_MOVE_DOWN,
189 HELI_MOVE_DOWN,
190 HELI_MOVE_DOWN,
191 HELI_GOTO_DROP
192 },
193
194 {
195 // Heli Begin Drop
196 HELI_MOVESMALL_UP,
197 HELI_MOVESMALL_UP,
198 HELI_MOVESMALL_UP,
199 HELI_MOVESMALL_UP,
200 HELI_MOVESMALL_UP,
201
202 HELI_MOVESMALL_DOWN,
203 HELI_MOVESMALL_DOWN,
204 HELI_MOVESMALL_DOWN,
205 HELI_MOVESMALL_DOWN,
206 HELI_MOVESMALL_DOWN,
207
208 HELI_MOVESMALL_UP,
209 HELI_MOVESMALL_UP,
210 HELI_MOVESMALL_UP,
211 HELI_MOVESMALL_UP,
212 HELI_MOVESMALL_UP,
213
214 HELI_MOVESMALL_DOWN,
215 HELI_MOVESMALL_DOWN,
216 HELI_MOVESMALL_DOWN,
217 HELI_MOVESMALL_DOWN,
218 HELI_MOVESMALL_DOWN,
219
220 HELI_MOVESMALL_UP,
221 HELI_MOVESMALL_UP,
222 HELI_MOVESMALL_UP,
223 HELI_MOVESMALL_UP,
224 HELI_MOVESMALL_UP,
225
226 HELI_MOVESMALL_DOWN,
227 HELI_MOVESMALL_DOWN,
228 HELI_MOVESMALL_DOWN,
229 HELI_MOVESMALL_DOWN,
230 HELI_GOTO_DROP
231 },
232
233 {
234 // HELI END DROP
235 HELI_MOVE_UP,
236 HELI_MOVE_UP,
237 HELI_MOVE_UP,
238 HELI_MOVE_UP,
239 HELI_MOVE_UP,
240
241 HELI_MOVE_UP,
242 HELI_MOVE_UP,
243 HELI_MOVE_UP,
244 HELI_MOVE_UP,
245 HELI_MOVE_UP,
246
247 HELI_MOVE_UP,
248 HELI_MOVE_UP,
249 HELI_MOVE_UP,
250 HELI_MOVE_UP,
251 HELI_MOVE_UP,
252
253 HELI_MOVE_UP,
254 HELI_MOVE_UP,
255 HELI_MOVE_UP,
256 HELI_MOVE_UP,
257 HELI_MOVE_UP,
258
259 HELI_MOVE_UP,
260 HELI_MOVE_UP,
261 HELI_MOVE_UP,
262 HELI_MOVE_UP,
263 HELI_MOVE_UP,
264
265 HELI_MOVE_UP,
266 HELI_MOVE_UP,
267 HELI_MOVE_UP,
268 HELI_MOVE_UP,
269 HELI_GOTO_MOVEAWAY
270 },
271
272 {
273 // MOVE AWAY
274 HELI_MOVELARGERY,
275 HELI_MOVELARGERY,
276 HELI_MOVELARGERY,
277 HELI_MOVELARGERY,
278 HELI_MOVELARGERY,
279
280 HELI_MOVELARGERY,
281 HELI_MOVELARGERY,
282 HELI_MOVELARGERY,
283 HELI_MOVELARGERY,
284 HELI_MOVELARGERY,
285
286 HELI_MOVELARGERY,
287 HELI_MOVELARGERY,
288 HELI_MOVELARGERY,
289 HELI_MOVELARGERY,
290 HELI_MOVELARGERY,
291
292 HELI_MOVELARGERY,
293 HELI_MOVELARGERY,
294 HELI_MOVELARGERY,
295 HELI_MOVELARGERY,
296 HELI_MOVELARGERY,
297
298 HELI_MOVELARGERY,
299 HELI_MOVELARGERY,
300 HELI_MOVELARGERY,
301 HELI_MOVELARGERY,
302 HELI_MOVELARGERY,
303
304 HELI_MOVELARGERY,
305 HELI_MOVELARGERY,
306 HELI_MOVELARGERY,
307 HELI_MOVELARGERY,
308 HELI_GOTO_EXIT
309 },
310
311 {
312 // HELI EXIT
313 HELI_REST,
314 HELI_REST,
315 HELI_REST,
316 HELI_REST,
317 HELI_REST,
318
319 HELI_REST,
320 HELI_REST,
321 HELI_REST,
322 HELI_REST,
323 HELI_REST,
324
325 HELI_REST,
326 HELI_REST,
327 HELI_REST,
328 HELI_REST,
329 HELI_REST,
330
331 HELI_REST,
332 HELI_REST,
333 HELI_REST,
334 HELI_REST,
335 HELI_REST,
336
337 HELI_REST,
338 HELI_REST,
339 HELI_REST,
340 HELI_REST,
341 HELI_REST,
342
343 HELI_REST,
344 HELI_REST,
345 HELI_REST,
346 HELI_REST,
347 HELI_DONE
348 }
349 };
350
351
352 static BOOLEAN gfHandleHeli = FALSE;
353 static SOLDIERTYPE* gHeliSeats[MAX_MERC_IN_HELI];
354 static INT8 gbNumHeliSeatsOccupied = 0;
355
356 static BOOLEAN gfFirstGuyDown = FALSE;
357
358 static UINT32 uiSoundSample;
359 static INT16 gsGridNoSweetSpot;
360 static INT16 gsHeliXPos;
361 static INT16 gsHeliYPos;
362 static FLOAT gdHeliZPos;
363 static INT16 gsHeliScript;
364 static UINT8 gubHeliState;
365 static UINT32 guiHeliLastUpdate;
366 static INT8 gbCurDrop;
367 static INT8 gbExitCount;
368 static INT8 gbHeliRound;
369 static UINT8 gubMoveAwayRepeated = 0;
370
371 static BOOLEAN fFadingHeliIn = FALSE;
372 static BOOLEAN fFadingHeliOut = FALSE;
373
374 BOOLEAN gfIngagedInDrop = FALSE;
375
376 static ANITILE* gpHeli;
377 BOOLEAN gfFirstHeliRun;
378
379
ResetHeliSeats()380 void ResetHeliSeats( )
381 {
382 gbNumHeliSeatsOccupied = 0;
383 }
384
AddMercToHeli(SOLDIERTYPE * const s)385 void AddMercToHeli(SOLDIERTYPE* const s)
386 {
387 INT32 cnt;
388
389 if ( gbNumHeliSeatsOccupied < MAX_MERC_IN_HELI )
390 {
391 // Check if it already exists!
392 for ( cnt = 0; cnt < gbNumHeliSeatsOccupied; cnt++ )
393 {
394 if (gHeliSeats[cnt] == s) return;
395 }
396
397 gHeliSeats[gbNumHeliSeatsOccupied++] = s;
398 }
399 }
400
401
StartHelicopterRun(INT16 sGridNoSweetSpot)402 void StartHelicopterRun( INT16 sGridNoSweetSpot )
403 {
404 INT16 sX, sY;
405
406 gsGridNoSweetSpot = sGridNoSweetSpot;
407
408 if ( gbNumHeliSeatsOccupied == 0 )
409 {
410 return;
411 }
412
413 InterruptTime();
414 PauseGame();
415 LockPauseState(LOCK_PAUSE_START_HELI);
416
417 ConvertGridNoToCenterCellXY( sGridNoSweetSpot, &sX, &sY );
418
419 gsHeliXPos = sX - ( 2 * CELL_X_SIZE );
420 gsHeliYPos = sY - ( 10 * CELL_Y_SIZE );
421 //gsHeliXPos = sX - ( 3 * CELL_X_SIZE );
422 //gsHeliYPos = sY + ( 4 * CELL_Y_SIZE );
423 gdHeliZPos = 0;
424 gsHeliScript = 0;
425 gbCurDrop = 0;
426 gbExitCount = 0;
427 gbHeliRound = 1;
428
429 gubHeliState = HELI_APPROACH;
430 guiHeliLastUpdate = GetJA2Clock( );
431
432 // Start sound
433 uiSoundSample = PlayJA2Sample(HELI_1, 0, 10000, MIDDLEPAN);
434 fFadingHeliIn = TRUE;
435
436 gfHandleHeli = TRUE;
437
438 gfFirstGuyDown = TRUE;
439
440 guiPendingOverrideEvent = LU_BEGINUILOCK;
441 }
442
443
444 static void HandleFirstHeliDropOfGame(void);
445
446
HandleHeliDrop()447 void HandleHeliDrop( )
448 {
449 UINT8 ubScriptCode;
450 UINT32 uiClock;
451 INT32 iVol;
452 INT32 cnt;
453 ANITILE_PARAMS AniParams;
454
455
456 if ( gfHandleHeli )
457 {
458 if ( gCurrentUIMode != LOCKUI_MODE )
459 {
460 guiPendingOverrideEvent = LU_BEGINUILOCK;
461 }
462
463 if (_KeyDown(SDLK_ESCAPE))
464 {
465 // Loop through all mercs not yet placed
466 for ( cnt = gbCurDrop; cnt < gbNumHeliSeatsOccupied; cnt++ )
467 {
468 // Add merc to sector
469 SOLDIERTYPE& s = *gHeliSeats[cnt];
470 s.ubStrategicInsertionCode = INSERTION_CODE_NORTH;
471 UpdateMercInSector(s, SECTORX(START_SECTOR), SECTORY(START_SECTOR), 0);
472
473 // Check for merc arrives quotes...
474 HandleMercArrivesQuotes(s);
475
476 ScreenMsg(FONT_MCOLOR_WHITE, MSG_INTERFACE, st_format_printf(TacticalStr[MERC_HAS_ARRIVED_STR], s.name));
477 }
478
479 // Remove heli
480 DeleteAniTile( gpHeli );
481
482 RebuildCurrentSquad( );
483
484 // Remove sound
485 if( uiSoundSample!=NO_SAMPLE )
486 {
487 SoundStop( uiSoundSample );
488 }
489
490 gfHandleHeli = FALSE;
491 gfIgnoreScrolling = FALSE;
492 gbNumHeliSeatsOccupied = 0;
493 UnLockPauseState();
494 UnPauseGame();
495
496 // Select our first guy
497 SelectSoldier(gHeliSeats[0], SELSOLDIER_FORCE_RESELECT);
498
499 //guiCurrentEvent = LU_ENDUILOCK;
500 //gCurrentUIMode = LOCKUI_MODE;
501 guiPendingOverrideEvent = LU_ENDUILOCK;
502 //UIHandleLUIEndLock( NULL );
503
504 HandleFirstHeliDropOfGame( );
505 return;
506
507 }
508
509 gfIgnoreScrolling = TRUE;
510
511 uiClock = GetJA2Clock( );
512
513 if ( ( uiClock - guiHeliLastUpdate ) > ME_SCRIPT_DELAY )
514 {
515 guiHeliLastUpdate = uiClock;
516
517 if(fFadingHeliIn)
518 {
519 if( uiSoundSample!=NO_SAMPLE )
520 {
521 iVol=SoundGetVolume( uiSoundSample );
522 iVol=__min( HIGHVOLUME, iVol+5);
523 SoundSetVolume(uiSoundSample, iVol);
524 if(iVol==HIGHVOLUME)
525 fFadingHeliIn=FALSE;
526 }
527 else
528 {
529 fFadingHeliIn=FALSE;
530 }
531 }
532 else if(fFadingHeliOut)
533 {
534 if( uiSoundSample!=NO_SAMPLE )
535 {
536 iVol=SoundGetVolume(uiSoundSample);
537
538 iVol=__max( 0, iVol-5);
539
540 SoundSetVolume(uiSoundSample, iVol);
541 if(iVol==0)
542 {
543 // Stop sound
544 SoundStop( uiSoundSample );
545 fFadingHeliOut=FALSE;
546 gfHandleHeli = FALSE;
547 gfIgnoreScrolling = FALSE;
548 gbNumHeliSeatsOccupied = 0;
549 guiPendingOverrideEvent = LU_ENDUILOCK;
550 UnLockPauseState();
551 UnPauseGame();
552
553 RebuildCurrentSquad( );
554
555 HandleFirstHeliDropOfGame( );
556 }
557 }
558 else
559 {
560 fFadingHeliOut=FALSE;
561 gfHandleHeli = FALSE;
562 gfIgnoreScrolling = FALSE;
563 gbNumHeliSeatsOccupied = 0;
564 guiPendingOverrideEvent = LU_ENDUILOCK;
565 UnLockPauseState();
566 UnPauseGame();
567
568 RebuildCurrentSquad( );
569
570 HandleFirstHeliDropOfGame( );
571 }
572 }
573
574 if ( gsHeliScript == MAX_HELI_SCRIPT )
575 {
576 return;
577 }
578
579 ubScriptCode = ubHeliScripts[ gubHeliState ][ gsHeliScript ];
580
581 // Switch on mode...
582 if ( gubHeliState == HELI_DROP )
583 {
584 if ( !gfIngagedInDrop )
585 {
586 INT8 bEndVal;
587
588 bEndVal = ( gbHeliRound * NUM_PER_HELI_RUN );
589
590 if ( bEndVal > gbNumHeliSeatsOccupied )
591 {
592 bEndVal = gbNumHeliSeatsOccupied;
593 }
594
595 // OK, Check if we have anybody left to send!
596 if ( gbCurDrop < bEndVal )
597 {
598 SOLDIERTYPE& s = *gHeliSeats[gbCurDrop];
599 EVENT_InitNewSoldierAnim(&s, HELIDROP, 0 , FALSE);
600
601 // Change insertion code
602 s.ubStrategicInsertionCode = INSERTION_CODE_NORTH;
603
604 UpdateMercInSector(s, SECTORX(START_SECTOR), SECTORY(START_SECTOR), 0);
605
606 // IF the first guy down, set squad!
607 if ( gfFirstGuyDown )
608 {
609 gfFirstGuyDown = FALSE;
610 SetCurrentSquad(s.bAssignment, TRUE );
611 }
612 ScreenMsg(FONT_MCOLOR_WHITE, MSG_INTERFACE, st_format_printf(TacticalStr[MERC_HAS_ARRIVED_STR], s.name));
613
614 gbCurDrop++;
615
616 gfIngagedInDrop = TRUE;
617 }
618 else
619 {
620 if( gbExitCount == 0 )
621 {
622 gbExitCount = 2;
623 }
624 else
625 {
626 gbExitCount--;
627
628 if ( gbExitCount == 1 )
629 {
630 // Goto leave
631 gsHeliScript = -1;
632 gubHeliState = HELI_ENDDROP;
633
634 }
635 }
636 }
637 }
638 }
639
640 switch( ubScriptCode )
641 {
642 case HELI_REST:
643
644 break;
645
646 case HELI_MOVE_DOWN:
647
648 gdHeliZPos -= 1;
649 gpHeli->pLevelNode->sRelativeZ = ( INT16 )gdHeliZPos;
650 break;
651
652 case HELI_MOVE_UP:
653
654 gdHeliZPos += 1;
655 gpHeli->pLevelNode->sRelativeZ = ( INT16 )gdHeliZPos;
656 break;
657
658 case HELI_MOVESMALL_DOWN:
659
660 gdHeliZPos -= 0.25;
661 gpHeli->pLevelNode->sRelativeZ = ( INT16 )gdHeliZPos;
662 break;
663
664 case HELI_MOVESMALL_UP:
665
666 gdHeliZPos += 0.25;
667 gpHeli->pLevelNode->sRelativeZ = ( INT16 )gdHeliZPos;
668 break;
669
670
671 case HELI_MOVEY:
672
673 gpHeli->sRelativeY += 4;
674 break;
675
676 case HELI_MOVELARGERY:
677 // Repeat some frames on higher resolutions to avoid the heli shadow from disappearing mid screen
678 if (gubMoveAwayRepeated < REPEAT_HELI_MOVEAWAY)
679 {
680 gubMoveAwayRepeated++;
681 gsHeliScript--;
682 }
683 gpHeli->sRelativeY += 6;
684 break;
685
686 case HELI_GOTO_BEGINDROP:
687
688 gsHeliScript = -1;
689 gubHeliState = HELI_BEGINDROP;
690 break;
691
692 case HELI_SHOW_HELI:
693
694 // Start animation
695 AniParams = ANITILE_PARAMS{};
696 AniParams.sGridNo = gsGridNoSweetSpot;
697 AniParams.ubLevelID = ANI_SHADOW_LEVEL;
698 AniParams.sDelay = 90;
699 AniParams.sStartFrame = 0;
700 AniParams.uiFlags = ANITILE_FORWARD | ANITILE_LOOPING;
701 AniParams.sX = gsHeliXPos;
702 AniParams.sY = gsHeliYPos;
703 AniParams.sZ = (INT16)gdHeliZPos;
704 AniParams.zCachedFile = TILECACHEDIR "/heli_sh.sti";
705 gpHeli = CreateAnimationTile( &AniParams );
706 break;
707
708 case HELI_GOTO_DROP:
709
710 // Goto drop animation
711 gdHeliZPos -= 0.25;
712 gpHeli->pLevelNode->sRelativeZ = ( INT16 )gdHeliZPos;
713 gsHeliScript = -1;
714 gubHeliState = HELI_DROP;
715 break;
716
717 case HELI_GOTO_MOVETO:
718
719 // Goto drop animation
720 gsHeliScript = -1;
721 gubHeliState = HELI_MOVETO;
722 break;
723
724 case HELI_GOTO_MOVEAWAY:
725
726 // Goto drop animation
727 gsHeliScript = -1;
728 gubHeliState = HELI_MOVEAWAY;
729 break;
730
731 case HELI_GOTO_EXIT:
732
733 if ( gbCurDrop < gbNumHeliSeatsOccupied )
734 {
735 // Start another run......
736 INT16 sX, sY;
737
738 ConvertGridNoToCenterCellXY( gsGridNoSweetSpot, &sX, &sY );
739
740 gsHeliXPos = sX - ( 2 * CELL_X_SIZE );
741 gsHeliYPos = sY - ( 10 * CELL_Y_SIZE );
742 gdHeliZPos = 0;
743 gsHeliScript = 0;
744 gbExitCount = 0;
745 gubHeliState = HELI_APPROACH;
746 gbHeliRound++;
747
748 // Ahh, but still delete the heli!
749 DeleteAniTile( gpHeli );
750 gpHeli = NULL;
751 }
752 else
753 {
754 // Goto drop animation
755 gsHeliScript = -1;
756 gubHeliState = HELI_EXIT;
757
758 // Delete helicopter image!
759 DeleteAniTile( gpHeli );
760 gpHeli = NULL;
761 gfIgnoreScrolling = FALSE;
762
763 // Select our first guy
764 SelectSoldier(gHeliSeats[0], SELSOLDIER_FORCE_RESELECT);
765 }
766 break;
767
768 case HELI_DONE:
769
770 // End
771 fFadingHeliOut = TRUE;
772 break;
773 }
774
775 gsHeliScript++;
776
777 }
778 }
779 }
780
781
HandleFirstHeliDropOfGame(void)782 static void HandleFirstHeliDropOfGame(void)
783 {
784 // Are we in the first heli drop?
785 if ( gfFirstHeliRun )
786 {
787 SyncStrategicTurnTimes();
788
789 // Call people to area
790 CallAvailableEnemiesTo( gsGridNoSweetSpot );
791
792 // Say quote.....
793 SayQuoteFromAnyBodyInSector( QUOTE_ENEMY_PRESENCE );
794
795 // Start music
796 SetMusicMode( MUSIC_TACTICAL_ENEMYPRESENT );
797
798 gfFirstHeliRun = FALSE;
799
800 }
801
802 // Send message to turn on ai again....
803 DialogueEvent::Add(new DialogueEventCallback<UnPauseAI>());
804 }
805