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