/*
**	Command & Conquer Renegade(tm)
**	Copyright 2025 Electronic Arts Inc.
**
**	This program is free software: you can redistribute it and/or modify
**	it under the terms of the GNU General Public License as published by
**	the Free Software Foundation, either version 3 of the License, or
**	(at your option) any later version.
**
**	This program is distributed in the hope that it will be useful,
**	but WITHOUT ANY WARRANTY; without even the implied warranty of
**	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
**	GNU General Public License for more details.
**
**	You should have received a copy of the GNU General Public License
**	along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

/******************************************************************************
*
* FILE
*     Mission02.cpp
*
* DESCRIPTION
*     Mission 02 Specific Scripts
*
* PROGRAMMER
*     Ryan Vervack, Rich Donnelly
*
* VERSION INFO
*     $Author: Rich_d $
*     $Revision: 332 $
*     $Modtime: 1/13/02 5:40p $
*     $Archive: /Commando/Code/Scripts/Mission02.cpp $
*
******************************************************************************/

#include "scripts.h"
#include "toolkit.h"
#include "mission2.h"


// Mission Objective Controller and Initializer

DECLARE_SCRIPT(M02_Objective_Controller, "")
{
	int convoy_trucks;
	int count_dead;
	int count_dead_09;
	bool rocket_soldier_speech;

	REGISTER_VARIABLES()
	{
		SAVE_VARIABLE (convoy_trucks, 1);
		SAVE_VARIABLE (count_dead, 2);
		SAVE_VARIABLE (count_dead_09, 3);
	}

	void Created(GameObject * obj)
	{
		Commands->Reveal_Encyclopedia_Character (37);
		Commands->Reveal_Encyclopedia_Character (4);
		Commands->Reveal_Encyclopedia_Character (10);
		Commands->Reveal_Encyclopedia_Character (8);
		Commands->Set_Background_Music ("02-Packing Iron.mp3");

		// Set the Dam MCT to animation frame 0

		GameObject * dam = Commands->Find_Object (1111116);
		if (dam)
		{
			Commands->Set_Animation_Frame (dam, "MCT_NOD.MCT_NOD", 0);
		}
		count_dead = 0;
		count_dead_09 = 0;
		rocket_soldier_speech = false;

		// Set up the expected number of convoy trucks for the objective.

		convoy_trucks = 3;

		// Prevent the Objective Controller from hibernating

		Commands->Enable_Hibernation(obj, false);

		// Turn on the first primary objective (Locate the Missing Scientists)
		// Turn on the tertiary objectives (if any)

		Commands->Set_HUD_Help_Text(IDS_M00DSGN_DSGN1004I1DSGN_TXT, TEXT_COLOR_OBJECTIVE_PRIMARY);
		Commands->Add_Objective (201, OBJECTIVE_TYPE_PRIMARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Primary_M02_01, NULL, IDS_Enc_Obj_Primary_M02_01);
		Commands->Set_Objective_HUD_Info_Position (201, 50, "POG_M08_1_04.tga", IDS_POG_LOCATE, Vector3 (1208.31f,562.49f,55.02f));
		Commands->Add_Objective (223, OBJECTIVE_TYPE_TERTIARY, OBJECTIVE_STATUS_HIDDEN, IDS_Enc_ObjTitle_Hidden_M02_01, NULL, IDS_Enc_Obj_Hidden_M02_01);
		Commands->Add_Objective (222, OBJECTIVE_TYPE_TERTIARY, OBJECTIVE_STATUS_HIDDEN, IDS_Enc_ObjTitle_Hidden_M02_02, NULL, IDS_Enc_Obj_Hidden_M02_02);
		Commands->Start_Timer (obj, this, 2.0f, 201);
	}

	// This custom receives requests to activate and deactivate objectives
	// Type = Objective ID
	// Param 0 = Activate this objective (Pending)
	// Param 1 = Complete this objective (Accomplished)
	// Param 2 = Fail this objective (Failed)
	// Param 3 = Convoy truck special - counting

	void Custom(GameObject * obj, int type, int param, GameObject * sender)
	{
		if (type > 199)
		{
			switch (param)
			{
			case (0): // Activate and set radar marker
				{
					Add_An_Objective (obj, type);
					Commands->Start_Timer (obj, this, 2.0f, type);
					break;
				}
			case (1): // Success
				{
					Commands->Set_HUD_Help_Text(IDS_M00DSGN_DSGN1006I1DSGN_TXT, TEXT_COLOR_OBJECTIVE_PRIMARY);
					Commands->Set_Objective_Status (type, OBJECTIVE_STATUS_ACCOMPLISHED);
					Commands->Start_Timer (obj, this, 2.0f, (type + 200));
					break;
				}
			case (2): // Failure
				{
					Commands->Set_Objective_Status (type, OBJECTIVE_STATUS_FAILED);
					break;
				}
			case (3): // Counting Convoy Trucks
				{
					convoy_trucks--;
					if (!convoy_trucks)
					{
						Commands->Set_HUD_Help_Text(IDS_M00DSGN_DSGN1006I1DSGN_TXT, TEXT_COLOR_OBJECTIVE_PRIMARY);
						Commands->Set_Objective_Status (213, OBJECTIVE_STATUS_ACCOMPLISHED);
						Commands->Stop_All_Conversations ();
						int id = Commands->Create_Conversation ("M02_SECONDARY_09_FINISH", 100, 300, true);
						Commands->Join_Conversation (NULL, id);
						Commands->Join_Conversation (STAR, id, true, false, false);
						Commands->Start_Conversation (id);
					}
					break;
				}
			default:
				{
					if (type == 1000)
					{
						if (param == 1000)
						{
							count_dead++;
							if (count_dead > 1)
							{
								count_dead = 0;
								Vector3 drop_loc = Vector3(-10.6f,-25.1f,-38.2f);
								float facing = 70.5f;
								const char* textfile = "X2I_GDI_Drop02_Rocket.txt";
								GameObject * chinook_obj1 = Commands->Create_Object("Invisible_Object", drop_loc);

								if (chinook_obj1)
								{
									Commands->Set_Facing(chinook_obj1, facing);
									Commands->Attach_Script(chinook_obj1, "Test_Cinematic", textfile);
								}

								if (!rocket_soldier_speech)
								{
									rocket_soldier_speech = true;
									Commands->Stop_All_Conversations ();
									int id = Commands->Create_Conversation("M02_MORE_ROCKET_SOLDIERS", 100, 300, true);
									Commands->Join_Conversation(NULL, id);
									Commands->Join_Conversation (STAR, id, true, false, false);
									Commands->Start_Conversation(id);
								}
							}
						}
						else if (param == 1001)
						{
							count_dead_09++;
							if (count_dead_09 > 2)
							{
								count_dead_09 = 0;
								Vector3 drop_loc = Vector3(819.38f,884.05f,24.50f);
								float facing = 110.0f;
								const char* textfile = "X2I_GDI_Drop03_Minigunner.txt";
								GameObject * chinook_obj1 = Commands->Create_Object("Invisible_Object", drop_loc);

								if (chinook_obj1)
								{
									Commands->Set_Facing(chinook_obj1, facing);
									Commands->Attach_Script(chinook_obj1, "Test_Cinematic", textfile);
								}
							}
						}
						else if (param == 1002)
						{
							Commands->Give_PowerUp (STAR, "Level_01_Keycard", true);
						}
					}
					break;
				}
			}
		}
	}

	void Timer_Expired (GameObject * obj, int timer_id)
	{
		int id = 0;
		Commands->Stop_All_Conversations ();

		switch (timer_id)
		{
		case (10): // Reminder for final objective.
			{
				id = Commands->Create_Conversation("M02_PRIMARY_04_REMIND", 100, 300, true);
				break;
			}

		// Initiation Conversations

		case (201):
			{
				id = Commands->Create_Conversation("M02_PRIMARY_01_START", 100, 300, true);
				break;
			}
		case (204):
			{
				id = Commands->Create_Conversation("M02_SECONDARY_01_START", 100, 300, true);
				break;
			}
		case (205):
			{
				id = Commands->Create_Conversation("M02_PRIMARY_04_START", 100, 300, true);
				Commands->Start_Timer (obj, this, 120.0f, 10);
				break;
			}
		case (206):
			{
				id = Commands->Create_Conversation("M02_SECONDARY_02_START", 100, 300, true);
				break;
			}
		case (208):
			{
				id = Commands->Create_Conversation("M02_SECONDARY_04_START", 100, 300, true);
				break;
			}
		case (210):
			{
				id = Commands->Create_Conversation("MX2DSGN_DSGN0004", 100, 300, true);
				break;
			}
		case (211):
			{
				id = Commands->Create_Conversation("M02_SECONDARY_07_START", 100, 300, true);
				break;
			}
		case (212):
			{
				id = Commands->Create_Conversation("M02_SECONDARY_08_START", 100, 300, true);
				break;
			}
		case (214):
			{
				id = Commands->Create_Conversation("M02_SECONDARY_10_START", 100, 300, true);
				break;
			}
		case (218):
			{
				id = Commands->Create_Conversation("M02_SECONDARY_14_START", 100, 300, true);
				break;
			}

		// Success Conversations

		case (403):
			{
				id = Commands->Create_Conversation("M02_PRIMARY_03_FINISH", 100, 300, true);
				break;
			}
		case (404):
			{
				id = Commands->Create_Conversation("M02_SECONDARY_01_FINISH", 100, 300, true);
				break;
			}
		case (406):
			{
				id = Commands->Create_Conversation("M02_SECONDARY_02_FINISH", 100, 300, true);
				break;
			}
		case (407):
			{
				id = Commands->Create_Conversation("M02_SECONDARY_03_FINISH", 100, 300, true);
				break;
			}
		case (408):
			{
				id = Commands->Create_Conversation("M02_SECONDARY_04_FINISH", 100, 300, true);
				break;
			}
		case (409):
			{
				id = Commands->Create_Conversation("M02_SECONDARY_05_FINISH", 100, 300, true);
				break;
			}
		case (410):
			{
				id = Commands->Create_Conversation("M02_SECONDARY_06_FINISH", 100, 300, true);
				break;
			}
		case (411):
			{
				id = Commands->Create_Conversation("M02_SECONDARY_07_FINISH", 100, 300, true);
				Commands->Start_Timer (obj, this, 5.0f, 11);
				break;
			}
		case (412):
			{
				id = Commands->Create_Conversation("M02_SECONDARY_08_FINISH", 100, 300, true);
				break;
			}
		case (414):
			{
				id = Commands->Create_Conversation("M02_SECONDARY_10_FINISH", 100, 300, true);
				break;
			}
		case (416):
			{
				id = Commands->Create_Conversation("M02_SECONDARY_12_FINISH", 100, 300, true);
				break;
			}
		case (417):
			{
				id = Commands->Create_Conversation("M02_SECONDARY_13_FINISH", 100, 300, true);
				break;
			}
		}
		if (id)
		{
			Commands->Join_Conversation(NULL, id);
			Commands->Join_Conversation (STAR, id, true, false, false);
			Commands->Start_Conversation(id);
		}
	}

	void Add_An_Objective(GameObject * obj, int id)
	{
		Vector3 objective_pos;
		objective_pos = Objective_Radar_Locations [(id - 202)];

		switch (id)
		{
		case 202:
			{
				Commands->Set_HUD_Help_Text(IDS_M00DSGN_DSGN1004I1DSGN_TXT, TEXT_COLOR_OBJECTIVE_PRIMARY);
				Commands->Add_Objective(id, OBJECTIVE_TYPE_SECONDARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Primary_M02_02, NULL, IDS_Enc_Obj_Primary_M02_02);
				Commands->Set_Objective_Radar_Blip(id, objective_pos);
				Commands->Set_Objective_HUD_Info_Position (id, 66, "POG_M07_2_05.tga", IDS_POG_DISABLE, objective_pos);
				break;
			}
		case 203:
			{
				Commands->Set_HUD_Help_Text(IDS_M00DSGN_DSGN1004I1DSGN_TXT, TEXT_COLOR_OBJECTIVE_PRIMARY);
				Commands->Add_Objective(id, OBJECTIVE_TYPE_PRIMARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Primary_M02_03, NULL, IDS_Enc_Obj_Primary_M02_03);
				Commands->Set_Objective_Radar_Blip(id, objective_pos);
				Commands->Set_Objective_HUD_Info_Position (id, 67, "POG_M02_1_03.tga", IDS_POG_DESTROY, objective_pos);
				break;
			}
		case 204:
			{
				Commands->Set_HUD_Help_Text(IDS_M00DSGN_DSGN1005I1DSGN_TXT, TEXT_COLOR_OBJECTIVE_PRIMARY);
				Commands->Add_Objective(id, OBJECTIVE_TYPE_SECONDARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Secondary_M02_01, NULL, IDS_Enc_Obj_Secondary_M02_01);
				Commands->Set_Objective_Radar_Blip(id, objective_pos);
				Commands->Set_Objective_HUD_Info_Position (id, 80, "POG_M02_2_01.tga", IDS_POG_DESTROY, objective_pos);
				break;
			}
		case 205:
			{
				Commands->Set_HUD_Help_Text(IDS_M00DSGN_DSGN1004I1DSGN_TXT, TEXT_COLOR_OBJECTIVE_PRIMARY);
				Commands->Add_Objective(id, OBJECTIVE_TYPE_PRIMARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Primary_M02_04, NULL, IDS_Enc_Obj_Primary_M02_04);
				Commands->Set_Objective_Radar_Blip(id, objective_pos);
				Commands->Set_Objective_HUD_Info_Position (id, 80, "POG_M02_1_04.tga", IDS_POG_CAPTURE, objective_pos);
				break;
			}
		case 206:
			{
				Commands->Set_HUD_Help_Text(IDS_M00DSGN_DSGN1005I1DSGN_TXT, TEXT_COLOR_OBJECTIVE_PRIMARY);
				Commands->Add_Objective(id, OBJECTIVE_TYPE_SECONDARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Secondary_M02_02, NULL, IDS_Enc_Obj_Secondary_M02_02);
				Commands->Set_Objective_Radar_Blip(id, objective_pos);
				Commands->Set_Objective_HUD_Info_Position (id, 53, "POG_M02_2_02.tga", IDS_POG_DESTROY, objective_pos);
				break;
			}
		case 207:
			{
				Commands->Set_HUD_Help_Text(IDS_M00DSGN_DSGN1005I1DSGN_TXT, TEXT_COLOR_OBJECTIVE_PRIMARY);
				Commands->Add_Objective(id, OBJECTIVE_TYPE_SECONDARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Secondary_M02_03, NULL, IDS_Enc_Obj_Secondary_M02_03);
				Commands->Set_Objective_Radar_Blip(id, objective_pos);
				Commands->Set_Objective_HUD_Info_Position (id, 54, "POG_M02_2_03.tga", IDS_POG_ELIMINATE, objective_pos);
				break;
			}
		case 208:
			{
				Commands->Set_HUD_Help_Text(IDS_M00DSGN_DSGN1005I1DSGN_TXT, TEXT_COLOR_OBJECTIVE_PRIMARY);
				Commands->Add_Objective(id, OBJECTIVE_TYPE_SECONDARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Secondary_M02_05, NULL, IDS_Enc_Obj_Secondary_M02_05);
				Commands->Set_Objective_Radar_Blip(id, objective_pos);
				Commands->Set_Objective_HUD_Info_Position (id, 56, "POG_M02_2_06.tga", IDS_POG_ELIMINATE, objective_pos);
				break;
			}
		case 209:
			{
				Commands->Set_HUD_Help_Text(IDS_M00DSGN_DSGN1005I1DSGN_TXT, TEXT_COLOR_OBJECTIVE_PRIMARY);
				Commands->Add_Objective(id, OBJECTIVE_TYPE_SECONDARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Secondary_M02_04, NULL, IDS_Enc_Obj_Secondary_M02_04);
				Commands->Set_Objective_Radar_Blip(id, objective_pos);
				Commands->Set_Objective_HUD_Info_Position (id, 55, "POG_M02_2_05.tga", IDS_POG_ELIMINATE, objective_pos);
				break;
			}
		case 210:
			{
				Commands->Set_HUD_Help_Text(IDS_M00DSGN_DSGN1005I1DSGN_TXT, TEXT_COLOR_OBJECTIVE_PRIMARY);
				Commands->Add_Objective(id, OBJECTIVE_TYPE_SECONDARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Secondary_M02_06, NULL, IDS_Enc_Obj_Secondary_M02_06);
				Commands->Set_Objective_Radar_Blip(id, objective_pos);
				Commands->Set_Objective_HUD_Info_Position (id, 57, "POG_M02_2_04.tga", IDS_POG_ELIMINATE, objective_pos);
				break;
			}
		case 211:
			{
				Commands->Set_HUD_Help_Text(IDS_M00DSGN_DSGN1005I1DSGN_TXT, TEXT_COLOR_OBJECTIVE_PRIMARY);
				Commands->Add_Objective(id, OBJECTIVE_TYPE_SECONDARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Secondary_M02_07, NULL, IDS_Enc_Obj_Secondary_M02_07);
				Commands->Set_Objective_Radar_Blip(id, objective_pos);
				Commands->Set_Objective_HUD_Info_Position (id, 61, "POG_M02_2_07.tga", IDS_POG_ELIMINATE, objective_pos);
				break;
			}
		case 212:
			{
				Commands->Set_HUD_Help_Text(IDS_M00DSGN_DSGN1005I1DSGN_TXT, TEXT_COLOR_OBJECTIVE_PRIMARY);
				Commands->Add_Objective(id, OBJECTIVE_TYPE_SECONDARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Secondary_M02_08, NULL, IDS_Enc_Obj_Secondary_M02_08);
				Commands->Set_Objective_Radar_Blip(id, objective_pos);
				Commands->Set_Objective_HUD_Info_Position (id, 59, "POG_M02_2_08.tga", IDS_POG_DESTROY, objective_pos);
				break;
			}
		case 213:
			{
				Commands->Set_HUD_Help_Text(IDS_M00DSGN_DSGN1005I1DSGN_TXT, TEXT_COLOR_OBJECTIVE_PRIMARY);
				Commands->Add_Objective(id, OBJECTIVE_TYPE_SECONDARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Secondary_M02_09, NULL, IDS_Enc_Obj_Secondary_M02_09);
				Commands->Set_Objective_Radar_Blip(id, objective_pos);
				Commands->Set_Objective_HUD_Info_Position (id, 60, "POG_M02_2_09.tga", IDS_POG_DESTROY, objective_pos);
				break;
			}
		case 214:
			{
				Commands->Set_HUD_Help_Text(IDS_M00DSGN_DSGN1005I1DSGN_TXT, TEXT_COLOR_OBJECTIVE_PRIMARY);
				Commands->Add_Objective(id, OBJECTIVE_TYPE_SECONDARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Secondary_M02_10, NULL, IDS_Enc_Obj_Secondary_M02_10);
				Commands->Set_Objective_Radar_Blip(id, objective_pos);
				Commands->Set_Objective_HUD_Info_Position (id, 62, "POG_M02_2_10.tga", IDS_POG_DESTROY, objective_pos);
				break;
			}
		case 215:
			{
				Commands->Set_HUD_Help_Text(IDS_M00DSGN_DSGN1005I1DSGN_TXT, TEXT_COLOR_OBJECTIVE_PRIMARY);
				Commands->Add_Objective(id, OBJECTIVE_TYPE_SECONDARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Secondary_M02_11, NULL, IDS_Enc_Obj_Secondary_M02_11);
				Commands->Set_Objective_Radar_Blip(id, objective_pos);
				Commands->Set_Objective_HUD_Info_Position (id, 63, "POG_M02_2_11.tga", IDS_POG_DESTROY, objective_pos);
				break;
			}
		case 216:
			{
				Commands->Set_HUD_Help_Text(IDS_M00DSGN_DSGN1005I1DSGN_TXT, TEXT_COLOR_OBJECTIVE_PRIMARY);
				Commands->Add_Objective(id, OBJECTIVE_TYPE_SECONDARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Secondary_M02_12, NULL, IDS_Enc_Obj_Secondary_M02_12);
				Commands->Set_Objective_Radar_Blip(id, objective_pos);
				Commands->Set_Objective_HUD_Info_Position (id, 64, "POG_M02_2_12.tga", IDS_POG_DESTROY, objective_pos);
				break;
			}
		case 217:
			{
				Commands->Set_HUD_Help_Text(IDS_M00DSGN_DSGN1005I1DSGN_TXT, TEXT_COLOR_OBJECTIVE_PRIMARY);
				Commands->Add_Objective(id, OBJECTIVE_TYPE_SECONDARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Secondary_M02_13, NULL, IDS_Enc_Obj_Secondary_M02_13);
				Commands->Set_Objective_Radar_Blip(id, objective_pos);
				Commands->Set_Objective_HUD_Info_Position (id, 65, "POG_M02_2_13.tga", IDS_POG_DESTROY, objective_pos);
				break;
			}
		case 218:
			{
				Commands->Set_HUD_Help_Text(IDS_M00DSGN_DSGN1005I1DSGN_TXT, TEXT_COLOR_OBJECTIVE_PRIMARY);
				Commands->Add_Objective(id, OBJECTIVE_TYPE_SECONDARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Secondary_M02_14, NULL, IDS_Enc_Obj_Secondary_M02_14);
				Commands->Set_Objective_Radar_Blip(id, objective_pos);
				Commands->Set_Objective_HUD_Info_Position (id, 70, "POG_M02_2_14.tga", IDS_POG_DESTROY, objective_pos);
				break;
			}
		case 219:
			{
				Commands->Set_HUD_Help_Text(IDS_M00DSGN_DSGN1005I1DSGN_TXT, TEXT_COLOR_OBJECTIVE_PRIMARY);
				Commands->Add_Objective(id, OBJECTIVE_TYPE_SECONDARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Secondary_M02_15, NULL, IDS_Enc_Obj_Secondary_M02_15);
				Commands->Set_Objective_Radar_Blip(id, objective_pos);
				Commands->Set_Objective_HUD_Info_Position (id, 71, "POG_M02_2_14.tga", IDS_POG_DESTROY, objective_pos);
				break;
			}
		case 220:
			{
				Commands->Set_HUD_Help_Text(IDS_M00DSGN_DSGN1005I1DSGN_TXT, TEXT_COLOR_OBJECTIVE_PRIMARY);
				Commands->Add_Objective(id, OBJECTIVE_TYPE_SECONDARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Secondary_M02_16, NULL, IDS_Enc_Obj_Secondary_M02_16);
				Commands->Set_Objective_Radar_Blip(id, objective_pos);
				Commands->Set_Objective_HUD_Info_Position (id, 72, "POG_M02_2_14.tga", IDS_POG_DESTROY, objective_pos);
				break;
			}
		case 221:
			{
				Commands->Set_HUD_Help_Text(IDS_M00DSGN_DSGN1005I1DSGN_TXT, TEXT_COLOR_OBJECTIVE_PRIMARY);
				Commands->Add_Objective(id, OBJECTIVE_TYPE_SECONDARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Secondary_M02_17, NULL, IDS_Enc_Obj_Secondary_M02_17);
				Commands->Set_Objective_Radar_Blip(id, objective_pos);
				Commands->Set_Objective_HUD_Info_Position (id, 58, "POG_M02_2_15.tga", IDS_POG_ACQUIRE, objective_pos);
				break;
			}
		}
	}
};


DECLARE_SCRIPT(M02_Objective_Zone, "")
{
	bool enemies_defeated;
	bool was_entered;
	bool gave_secure_warning;
	int mendoza_id;

	REGISTER_VARIABLES()
	{
		SAVE_VARIABLE (enemies_defeated, 1);
		SAVE_VARIABLE (mendoza_id, 2);
		SAVE_VARIABLE (was_entered, 3);
		SAVE_VARIABLE (gave_secure_warning, 4);
	}

	void Created(GameObject *obj)
	{
		gave_secure_warning = false;
		mendoza_id = 0;
		was_entered = false;
		enemies_defeated = false;
	}

	void Entered(GameObject *obj, GameObject *enterer)
	{
		// Send customs to activate the appropriate objectives

		GameObject * object = Commands->Find_Object(M02_OBJCONTROLLER);

		if (object)
		{
			bool destroy_zone = false;
			int dual_zone = 0;
			int zone_id = Commands->Get_ID(obj);

			switch (zone_id)
			{
			case (301601):
				{
					if (!Commands->Has_Key(STAR, 6))
					{
						Commands->Stop_All_Conversations ();
						int id = Commands->Create_Conversation("M02_BAY_DOOR_WARNING", 100, 300, true);
						Commands->Join_Conversation(NULL, id);
						Commands->Join_Conversation (STAR, id, true, false, false);
						Commands->Start_Conversation(id);
						destroy_zone = true;
					}
					break;
				}
			case (303203):
				{
					Commands->Stop_All_Conversations ();
					int id = Commands->Create_Conversation("M02_PRIMARY_03_GUIDE", 100, 300, true);
					Commands->Join_Conversation(NULL, id);
					Commands->Join_Conversation (STAR, id, true, false, false);
					Commands->Start_Conversation(id);
					destroy_zone = true;
					break;
				}
			case (304006):
				{
					if (!was_entered)
					{
						was_entered = true;
						int id = Commands->Create_Conversation("MX2DSGN_DSGN0001", 100, 300, true);
						Commands->Join_Conversation(NULL, id);
						Commands->Join_Conversation (STAR, id, true, false, false);
						Commands->Start_Conversation(id);
						Commands->Set_HUD_Help_Text(IDS_M02DSGN_DSGN0186I1DSGN_TXT, TEXT_COLOR_OBJECTIVE_PRIMARY);
					}
					break;
				}
			case (400184):
				{
					// Turn on objectives

					Commands->Send_Custom_Event(obj, object, 206, 0);
					Commands->Send_Custom_Event(obj, object, 207, 0);

					// Turn on A00

					Commands->Send_Custom_Event(obj, object, 104, 0);

					// Call GDI Rocket Soldiers

					Call_GDI_Soldiers(0);
					
					// Call the Nod Apache

					Create_Apache(0);

					// Tell A00 units to wake up

					Commands->Send_Custom_Event(obj, Commands->Find_Object(400286), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(400287), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(400288), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(400292), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(400293), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(400285), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(400206), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401004), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401005), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401006), 0, 0);

					destroy_zone = true;
					break;
				}
			case (400185):
				{
					// Turn on objectives

					Commands->Send_Custom_Event(obj, object, 208, 0);
					Commands->Send_Custom_Event(obj, object, 209, 0);

					// Turn on A01
					
					Commands->Send_Custom_Event(obj, object, 104, 1);

					// Create A01 Nod Buggy for Player

					Commands->Send_Custom_Event(obj, object, 112, 1);
					Commands->Send_Custom_Event(obj, object, 111, 1);

					// Tell the GDI Rocket Soldiers for A00 to go to the tower.

					Vector3 obj_position = Commands->Get_Position (obj);
					Commands->Create_Logical_Sound (obj, 1100, obj_position, 1000.0f);	

					// Tell A23 units to go to home points.

					Commands->Create_Logical_Sound (obj, 1073, obj_position, 1000.0f);

					// Tell A01 units to wake up.

					Commands->Send_Custom_Event(obj, Commands->Find_Object(400342), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(400343), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(400347), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(400332), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(400340), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(400348), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(400344), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(400345), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(400333), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(400207), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(400371), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401008), 0, 0);

					destroy_zone = true;
					break;
				}
			case (400186):
				{
					// Turn on objectives

					Commands->Send_Custom_Event(obj, object, 210, 0);
					Commands->Send_Custom_Event(obj, object, 221, 0);

					//Turn off A01, Turn on A02

					Commands->Send_Custom_Event(obj, object, 105, 1);
					Commands->Send_Custom_Event(obj, object, 104, 2);
					
					// Tell A01 units to go to home points.

					Vector3 obj_position = Commands->Get_Position (obj);
					Commands->Create_Logical_Sound (obj, 1051, obj_position, 1000.0f);

					// Turn on A02 units

					Commands->Send_Custom_Event(obj, Commands->Find_Object(400372), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(400373), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(400374), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401167), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(400208), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401014), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401015), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401016), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401017), 0, 0);

					// Create the A02 buggy

					Create_Buggy (2);

					// Bring in A02 Sakura

					Create_Sakura (2);

					// Start the tank conversation

					destroy_zone = true;
					break;
				}
			case (400187):
				{
					// Turn on objectives

					Commands->Send_Custom_Event(obj, object, 211, 0);

					//Turn off A03, Turn on A04

					Commands->Send_Custom_Event(obj, object, 105, 3);
					Commands->Send_Custom_Event(obj, object, 104, 4);

					// Tell the GDI Rocket Soldiers for A02 to go to the house.

					Vector3 obj_position = Commands->Get_Position (obj);
					Commands->Create_Logical_Sound (obj, 1102, obj_position, 1000.0f);

					// Tell A03 units to go to home points.

					Commands->Create_Logical_Sound (obj, 1053, obj_position, 1000.0f);

					// Wake up A04 units

					Commands->Send_Custom_Event(obj, Commands->Find_Object(400210), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(400451), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(400452), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(400453), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(400499), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(400500), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401025), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401026), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401027), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401028), 0, 0);

					// Create A04 Nod Light Tank for Player

					Commands->Send_Custom_Event(obj, object, 112, 4);
					Commands->Send_Custom_Event(obj, object, 111, 4);

					// Create the A04 Nod Buggy

					Create_Buggy (4);

					// Activate the A04 Medium Tank motion and destruction.

					Commands->Send_Custom_Event(obj, Commands->Find_Object(401018), 0, 0);

					// Start the tank speaking timer

					Commands->Start_Timer (obj, this, 0.1f, 10);

					destroy_zone = true;
					dual_zone = 400267;
					break;
				}
			case (400188):
				{
					// Turn on objectives

					Commands->Send_Custom_Event(obj, object, 212, 0);
					Commands->Send_Custom_Event(obj, object, 213, 0);

					//Turn off A02, Turn on A03

					Commands->Send_Custom_Event(obj, object, 105, 2);
					Commands->Send_Custom_Event(obj, object, 104, 3);

					// Tell A02 units to go to home points.

					Vector3 obj_position = Commands->Get_Position (obj);
					Commands->Create_Logical_Sound (obj, 1052, obj_position, 1000.0f);

					// Create the Light Tank for A03

					Create_Light_Tank (3);

					// Wake up A03 units

					Commands->Send_Custom_Event(obj, Commands->Find_Object(400410), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(400209), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(400411), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(400412), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(400413), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(400414), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(400415), 0, 0);

					destroy_zone = true;
					break;
				}
			case (400189):
				{
					// Turn on objectives

					Commands->Send_Custom_Event(obj, object, 215, 0);
					Commands->Send_Custom_Event(obj, object, 216, 0);

					//Turn on A06

					Commands->Send_Custom_Event(obj, object, 104, 6);

					// Wake up A06 units

					Commands->Send_Custom_Event(obj, Commands->Find_Object(400211), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(400976), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(400975), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(400977), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(400978), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(400979), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(400980), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401036), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401037), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401038), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401045), 0, 0);

					destroy_zone = true;
					break;
				}
			case (400192):
				{
					// Default shut off for A11, Power Plant spawns.

					Commands->Send_Custom_Event(obj, object, 105, 11);
					
					// Tell A11 units to go to home points.

					Vector3 obj_position = Commands->Get_Position (obj);
					Commands->Create_Logical_Sound (obj, 1061, obj_position, 1000.0f);

					destroy_zone = true;
					break;
				}
			case (400193):
				{
					GameObject * object = Commands->Create_Object("Invisible_Object", Vector3(0,0,0));
					if (object)
					{
						Commands->Control_Enable (STAR, false);
						Commands->Start_Timer (obj, this, 1.0f, 9);
						GameObject * controller = Commands->Find_Object (M02_OBJCONTROLLER);
						if (controller)
						{
							Commands->Send_Custom_Event (obj, controller, 1000, 1002, 25.0f);
						}
						Commands->Attach_Script (object, "Test_Cinematic", "X2K_Midtro.txt");
					}
					break;
				}
			case (400194):
				{
					if (!was_entered)
					{
						was_entered = true;

						// Complete final objective

						Commands->Send_Custom_Event(obj, object, 205, 1);
						Commands->Mission_Complete (true);

						//Turn off A21
						
						Commands->Send_Custom_Event(obj, object, 105, 21);
					}
					break;
				}
			case (400195):
				{
					Check_For_Soldiers (obj, 3);
					break;
				}
			case (400196):
				{
					Check_For_Soldiers (obj, 4);
					break;
				}
			case (400197):
				{
					Check_For_Soldiers (obj, 5);
					break;
				}
			case (400198):
				{
					Check_For_Soldiers (obj, 6);
					break;
				}
			case (400201):
				{
					Check_For_Soldiers (obj, 7);
					break;
				}
			case (400267):
				{
					// Turn on objectives

					Commands->Send_Custom_Event(obj, object, 211, 0);

					// Turn off A03, Turn on A04

					Commands->Send_Custom_Event(obj, object, 105, 3);
					Commands->Send_Custom_Event(obj, object, 104, 4);

					// Tell A03 units to go to home points.

					Vector3 obj_position = Commands->Get_Position (obj);
					Commands->Create_Logical_Sound (obj, 1053, obj_position, 1000.0f);

					// Tell the GDI Rocket Soldiers for A02 to go to the house.

					Commands->Create_Logical_Sound (obj, 1102, obj_position, 1000.0f);	

					// Wake up A04 units

					Commands->Send_Custom_Event(obj, Commands->Find_Object(400210), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(400451), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(400452), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(400453), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(400499), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(400500), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401025), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401026), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401027), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401028), 0, 0);

					// Create A04 Nod Light Tank for Player

					Commands->Send_Custom_Event(obj, object, 112, 4);
					Commands->Send_Custom_Event(obj, object, 111, 4);

					// Create the A04 Nod Buggy

					Create_Buggy (4);

					// Activate the A04 Medium Tank motion and destruction.

					Commands->Send_Custom_Event(obj, Commands->Find_Object(401018), 0, 0);

					// Start the tank speaking timer

					Commands->Start_Timer (obj, this, 0.1f, 10);

					destroy_zone = true;
					dual_zone = 400187;
					break;
				}
			case (400268):
				{
					// Turn off A04

					Commands->Send_Custom_Event(obj, object, 105, 4);

					// Tell A04 units to go to home points.

					Vector3 obj_position = Commands->Get_Position (obj);
					Commands->Create_Logical_Sound (obj, 1054, obj_position, 1000.0f);

					// Turn on A05 units

					Commands->Send_Custom_Event(obj, Commands->Find_Object(400552), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(400553), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(400560), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(400555), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(400558), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(400559), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(400557), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(400554), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(400556), 0, 0);

					//Turn off A24

					Commands->Send_Custom_Event(obj, object, 105, 24);

					destroy_zone = true;
					break;
				}
			case (400269):
				{
					// Turn on objectives

					Commands->Send_Custom_Event(obj, object, 202, 0);
					Commands->Send_Custom_Event(obj, object, 203, 0);
					Commands->Send_Custom_Event(obj, object, 217, 0);

					//Turn off A06, Turn on A09 (Dam Top)

					Commands->Send_Custom_Event(obj, object, 105, 6);
					Commands->Send_Custom_Event(obj, object, 104, 9);

					// Turn on A09 units.

					Commands->Send_Custom_Event(obj, Commands->Find_Object(400212), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(400981), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(400982), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(400983), 0, 0);

					// Tell A06 units to go to home points.

					Vector3 obj_position = Commands->Get_Position (obj);
					Commands->Create_Logical_Sound (obj, 1056, obj_position, 1000.0f);

					// Create the GDI soldier set

					Call_GDI_Soldiers (9);

					// Primary 01 GUIDE Conversation

					Commands->Stop_All_Conversations ();
					int id = Commands->Create_Conversation("M02_PRIMARY_01_GUIDE", 100, 300, true);
					Commands->Join_Conversation(NULL, id);
					Commands->Join_Conversation (STAR, id, true, false, false);
					Commands->Start_Conversation(id);

					destroy_zone = true;
					break;
				}
			case (400270):
				{
					//Turn off A09, Turn on A08 (Dam Interior)

					Commands->Send_Custom_Event(obj, object, 105, 9);
					Commands->Send_Custom_Event(obj, object, 104, 8);

					// Wake up A08 units

					Commands->Send_Custom_Event(obj, Commands->Find_Object(400275), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401046), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401047), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401048), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401049), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401050), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401051), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401052), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401053), 0, 0);

					// Tell A09 units to go to home points.

					Vector3 obj_position = Commands->Get_Position (obj);
					Commands->Create_Logical_Sound (obj, 1059, obj_position, 1000.0f);

					dual_zone = 400271;
					destroy_zone = true;
					break;
				}
			case (400271):
				{
					//Turn off A09, Turn on A08 (Dam Interior)

					Commands->Send_Custom_Event(obj, object, 105, 9);
					Commands->Send_Custom_Event(obj, object, 104, 8);

					// Wake up A08 units

					Commands->Send_Custom_Event(obj, Commands->Find_Object(400275), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401046), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401047), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401048), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401049), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401050), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401051), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401052), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401053), 0, 0);

					// Tell A09 units to go to home points.

					Vector3 obj_position = Commands->Get_Position (obj);
					Commands->Create_Logical_Sound (obj, 1059, obj_position, 1000.0f);

					GameObject * deadzone = Commands->Find_Object (303203);
					if (deadzone)
					{
						Commands->Destroy_Object (deadzone);
					}

					dual_zone = 400270;
					destroy_zone = true;
					break;
				}
			case (400272):
				{
					//Turn off A08, Turn on A10

					Commands->Send_Custom_Event(obj, object, 105, 8);
					Commands->Send_Custom_Event(obj, object, 104, 10);

					// Tell A08 units to go to home points.

					Vector3 obj_position = Commands->Get_Position (obj);
					Commands->Create_Logical_Sound (obj, 1058, obj_position, 1000.0f);

					// Wake up A10 units

					Commands->Send_Custom_Event(obj, Commands->Find_Object(400213), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(400984), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401054), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401055), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401056), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401057), 0, 0);

					destroy_zone = true;
					break;
				}
			case (400273):
				{
					//Turn off A10, Turn on A11

					Commands->Send_Custom_Event(obj, object, 105, 10);
					Commands->Send_Custom_Event(obj, object, 104, 11);

					// Force an A11 spawn

					Commands->Send_Custom_Event(obj, object, 114, 11);
					Commands->Send_Custom_Event(obj, object, 102, 11);

					// Wake up A11 units

					Commands->Send_Custom_Event(obj, Commands->Find_Object(400276), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(400199), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401065), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401058), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401059), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401060), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401061), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401063), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401064), 0, 0);

					// Tell A10 units to go to home points.

					Vector3 obj_position = Commands->Get_Position (obj);
					Commands->Create_Logical_Sound (obj, 1060, obj_position, 1000.0f);

					destroy_zone = true;
					break;
				}
			case (400274):
				{
					//Trigger A11 off only when Power Plant is destroyed.

					GameObject* power_plant_obj = Commands->Find_Object(1153846);

					if (power_plant_obj)
					{
						float health_check = Commands->Get_Health(power_plant_obj);
						if (health_check <= 0.0f)
						{
							Commands->Send_Custom_Event(obj, object, 105, 11);

							// Tell A11 units to go to home points.

							Vector3 obj_position = Commands->Get_Position (obj);
							Commands->Create_Logical_Sound (obj, 1061, obj_position, 1000.0f);

							// Force an A10 spawn.

							Commands->Send_Custom_Event(obj, object, 114, 10);
							Commands->Send_Custom_Event(obj, object, 102, 10);
							destroy_zone = true;
						}

						// Shut off the Power Plant announcement

						Commands->Send_Custom_Event(obj, power_plant_obj, 1, 0);
					}
					break;
				}
			case (400316):
				{
					// Make the A00 soldiers return to home points, turn of A00

					Commands->Send_Custom_Event(obj, object, 105, 0);
					Vector3 obj_position = Commands->Get_Position (obj);
					Commands->Create_Logical_Sound (obj, 1050, obj_position, 1000.0f);

					// Turn on A23 units

					Commands->Send_Custom_Event(obj, Commands->Find_Object(400317), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(400318), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(400319), 0, 0);

					destroy_zone = true;
					break;
				}
			case (400501):
				{
					//Turn on A24

					// Wake up A24 units

					Commands->Send_Custom_Event(obj, Commands->Find_Object(400503), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(400504), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(400505), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(400506), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(400507), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(400508), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(400509), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(400510), 0, 0);

					Commands->Send_Custom_Event(obj, object, 104, 24);

					// Turn on objective - SAM Site
					
					Commands->Send_Custom_Event(obj, object, 214, 0);

					dual_zone = 400502;
					destroy_zone = true;
					break;
				}
			case (400502):
				{
					//Turn on A24

					Commands->Send_Custom_Event(obj, object, 104, 24);

					// Wake up A24 units

					Commands->Send_Custom_Event(obj, Commands->Find_Object(400503), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(400504), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(400505), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(400506), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(400507), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(400508), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(400509), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(400510), 0, 0);

					// Turn on objective - SAM Site
					
					Commands->Send_Custom_Event(obj, object, 214, 0);

					dual_zone = 400501;
					destroy_zone = true;
					break;
				}
			case (400551):
				{
					// Create the Apache for this area

					Create_Apache (24);

					destroy_zone = true;
					break;
				}
			case (400989):
				{
					destroy_zone = true;
					break;
				}
			case (400990):
				{
					// Trigger the Failed Drop Cinematic

					GameObject * chinook_obj1 = Commands->Create_Object("Invisible_Object", Vector3(0,0,0));

					if (chinook_obj1)
					{
						Commands->Attach_Script(chinook_obj1, "Test_Cinematic", "X2E_C130Drop.txt");
					}

					destroy_zone = true;
					break;
				}
			case (400991):
				{
					// Trigger the Orca shootdown cinematic

					GameObject * chinook_obj1 = Commands->Create_Object("Invisible_Object", Vector3(0,0,0));

					if (chinook_obj1)
					{
						Commands->Attach_Script(chinook_obj1, "Test_Cinematic", "X2F_OrcaSam.txt");
					}

					destroy_zone = true;
					break;
				}
			case (400992):
				{
					// Trigger the Apache Orca crash cinematic

					GameObject * chinook_obj1 = Commands->Create_Object("Invisible_Object", Vector3(0,0,0));

					if (chinook_obj1)
					{
						Commands->Attach_Script(chinook_obj1, "Test_Cinematic", "X2G_AirCrash.txt");
					}

					destroy_zone = true;
					break;
				}
			case (401001):
				{
					// Trigger the Apache bridge crash cinematic.
					GameObject * chinook_obj1 = Commands->Create_Object("Invisible_Object", Vector3(0,0,0));

					if (chinook_obj1)
					{
						Commands->Attach_Script(chinook_obj1, "Test_Cinematic", "X2H_ApacheSpray.txt");
					}

					destroy_zone = true;
					break;
				}
			case (401029):
				{
					// Trigger the crash cinematic in A01

					GameObject * chinook_obj1 = Commands->Create_Object("Invisible_Object", Vector3(0,0,0));

					if (chinook_obj1)
					{
						Commands->Attach_Script(chinook_obj1, "Test_Cinematic", "X2D_MTank_Slip.txt");
					}

					destroy_zone = true;
					break;
				}
			case (401054):
				{
					// Force an A08 spawn

					Commands->Send_Custom_Event(obj, object, 114, 8);
					Commands->Send_Custom_Event(obj, object, 102, 8);
					destroy_zone = true;
					break;
				}
			case (401066):
				{
					// Wake up A13 Obelisk units. No spawns in here.

					Commands->Send_Custom_Event(obj, Commands->Find_Object(400200), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401067), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401068), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401069), 0, 0);

					// Shut off the Obelisk warning.

					GameObject * obelisk = Commands->Find_Object(1153845);
					
					if (obelisk)
					{
						Commands->Send_Custom_Event (obj, obelisk, 1, 0);
					}

					destroy_zone = true;
					break;
				}
			case (401070):
				{
					// Turn on A14, Turn off A11 as default.

					Commands->Send_Custom_Event(obj, object, 105, 11);
					Commands->Send_Custom_Event(obj, object, 104, 14);

					// Tell A11 units to go to home points.

					Vector3 obj_position = Commands->Get_Position (obj);
					Commands->Create_Logical_Sound (obj, 1061, obj_position, 1000.0f);

					// Wake up A14 units

					Commands->Send_Custom_Event(obj, Commands->Find_Object(401071), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401072), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401073), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401074), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401075), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401076), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401077), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401078), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401192), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401193), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401194), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401195), 0, 0);

					dual_zone = 401196;
					destroy_zone = true;
					break;
				}
			case (401079):
				{
					// Turn off A14, Turn on A15

					Commands->Send_Custom_Event(obj, object, 105, 14);
					Commands->Send_Custom_Event(obj, object, 104, 15);

					// Tell A14 units to go to home points.

					Vector3 obj_position = Commands->Get_Position (obj);
					Commands->Create_Logical_Sound (obj, 1064, obj_position, 1000.0f);

					// Turn on A15 Objectives

					Commands->Send_Custom_Event(obj, object, 218, 0);
					Commands->Send_Custom_Event(obj, object, 219, 0);
					Commands->Send_Custom_Event(obj, object, 220, 0);

					// Wake up A15 Units

					Commands->Send_Custom_Event(obj, Commands->Find_Object(401089), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401087), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401086), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401088), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401085), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401090), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401091), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401092), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401094), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401095), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401096), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401097), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401189), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401190), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401191), 0, 0);

					dual_zone = 401080;
					destroy_zone = true;
					break;
				}
			case (401080):
				{
					// Turn off A14, Turn on A15

					Commands->Send_Custom_Event(obj, object, 105, 14);
					Commands->Send_Custom_Event(obj, object, 104, 15);

					// Tell A14 units to go to home points.

					Vector3 obj_position = Commands->Get_Position (obj);
					Commands->Create_Logical_Sound (obj, 1064, obj_position, 1000.0f);

					// Turn on A15 Objectives

					Commands->Send_Custom_Event(obj, object, 218, 0);
					Commands->Send_Custom_Event(obj, object, 219, 0);
					Commands->Send_Custom_Event(obj, object, 220, 0);

					// Wake up A15 Units

					Commands->Send_Custom_Event(obj, Commands->Find_Object(401089), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401087), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401086), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401088), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401085), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401090), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401091), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401092), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401094), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401095), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401096), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401097), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401189), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401190), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401191), 0, 0);

					dual_zone = 401079;
					destroy_zone = true;
					break;
				}
			case (401101):
				{
					// Turn on Hand of Nod objective

					Commands->Send_Custom_Event(obj, object, 204, 0);

					// Tell A15 units to go to home points.

					Vector3 obj_position = Commands->Get_Position (obj);
					Commands->Create_Logical_Sound (obj, 1065, obj_position, 1000.0f);

					// Turn off A15, Turn on A16 units - First HoN encounter set.

					Commands->Send_Custom_Event(obj, Commands->Find_Object(401103), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401104), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401105), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401106), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401107), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401108), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401109), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401110), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401112), 0, 0);

					dual_zone = 401102;
					destroy_zone = true;
					break;
				}
			case (401102):
				{
					// Turn on Hand of Nod objective

					Commands->Send_Custom_Event(obj, object, 204, 0);

					// Tell A15 units to go to home points.

					Vector3 obj_position = Commands->Get_Position (obj);
					Commands->Create_Logical_Sound (obj, 1065, obj_position, 1000.0f);

					// Turn off A15, Turn on A16 units - First HoN encounter set.

					Commands->Send_Custom_Event(obj, Commands->Find_Object(401103), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401104), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401105), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401106), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401107), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401108), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401109), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401110), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401112), 0, 0);

					dual_zone = 401101;
					destroy_zone = true;
					break;
				}
			case (401113):
				{
					// Turn on A17 Units, Hand of Nod underside.

					Commands->Send_Custom_Event(obj, Commands->Find_Object(401115), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401116), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401117), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401118), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401119), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401120), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401121), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401122), 0, 0);

					dual_zone = 401114;
					destroy_zone = true;
					break;
				}
			case (401114):
				{
					// Turn on A17 Units, Hand of Nod underside.

					Commands->Send_Custom_Event(obj, Commands->Find_Object(401115), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401116), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401117), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401118), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401119), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401120), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401121), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401122), 0, 0);

					dual_zone = 401113;
					destroy_zone = true;
					break;
				}
			case (401123):
				{
					// Turn on A18 Units, Hand of Nod Lowest Level

					Commands->Send_Custom_Event(obj, Commands->Find_Object(401124), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401125), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401126), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401127), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401128), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401129), 0, 0);

					destroy_zone = true;
					break;
				}
			case (401130):
				{
					GameObject * controller = Commands->Find_Object (1157690);
					if (controller)
					{
						float health = Commands->Get_Health (controller);
						if (health)
						{
							Commands->Stop_All_Conversations ();
							int id = Commands->Create_Conversation("M02_SECONDARY_01_GUIDE", 100, 300, true);
							Commands->Join_Conversation(NULL, id);
							Commands->Join_Conversation (STAR, id, true, false, false);
							Commands->Start_Conversation(id);
						}
					}

					// Turn on A19 Units, Hand of Nod area

					Commands->Send_Custom_Event(obj, Commands->Find_Object(401132), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401133), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401134), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401135), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401136), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401137), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401138), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401139), 0, 0);

					dual_zone = 401131;
					destroy_zone = true;
					break;
				}
			case (401131):
				{
					GameObject * controller = Commands->Find_Object (1157690);
					if (controller)
					{
						float health = Commands->Get_Health (controller);
						if (health)
						{
							Commands->Stop_All_Conversations ();
							int id = Commands->Create_Conversation("M02_SECONDARY_01_GUIDE", 100, 300, true);
							Commands->Join_Conversation(NULL, id);
							Commands->Join_Conversation (STAR, id, true, false, false);
							Commands->Start_Conversation(id);
						}
					}

					// Turn on A19 Units, Hand of Nod area

					Commands->Send_Custom_Event(obj, Commands->Find_Object(401132), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401133), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401134), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401135), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401136), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401137), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401138), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401139), 0, 0);

					dual_zone = 401130;
					destroy_zone = true;
					break;
				}
			case (401186):
				{
					// Create the A15 Apache

					Create_Apache(15);

					// M02 Secondary 14 GUIDE Conversation

					Commands->Stop_All_Conversations ();
					int id = Commands->Create_Conversation("M02_SECONDARY_14_GUIDE", 100, 300, true);
					Commands->Join_Conversation(NULL, id);
					Commands->Join_Conversation (STAR, id, true, false, false);
					Commands->Start_Conversation(id);

					dual_zone = 401187;
					destroy_zone = true;
					break;
				}
			case (401187):
				{
					// Create the A15 Apache

					Create_Apache(15);

					// M02 Secondary 14 GUIDE Conversation

					Commands->Stop_All_Conversations ();
					int id = Commands->Create_Conversation("M02_SECONDARY_14_GUIDE", 100, 300, true);
					Commands->Join_Conversation(NULL, id);
					Commands->Join_Conversation (STAR, id, true, false, false);
					Commands->Start_Conversation(id);

					dual_zone = 401186;
					destroy_zone = true;
					break;
				}
			case (401196):
				{
					// Turn on A14, Turn off A11 as default.

					Commands->Send_Custom_Event(obj, object, 105, 11);
					Commands->Send_Custom_Event(obj, object, 104, 14);

					// Tell A11 units to go to home points.

					Vector3 obj_position = Commands->Get_Position (obj);
					Commands->Create_Logical_Sound (obj, 1061, obj_position, 1000.0f);

					// Wake up A14 units

					Commands->Send_Custom_Event(obj, Commands->Find_Object(401071), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401072), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401073), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401074), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401075), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401076), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401077), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401078), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401192), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401193), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401194), 0, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object(401195), 0, 0);

					dual_zone = 401070;
					destroy_zone = true;
					break;
				}
			case (401982):
				{
					Commands->Stop_All_Conversations ();
					int id = Commands->Create_Conversation("M02_SECONDARY_13_START", 100, 300, true);
					Commands->Join_Conversation(NULL, id);
					Commands->Join_Conversation (STAR, id, true, false, false);
					Commands->Start_Conversation(id);

					// Fly the Lear Jet over

					GameObject * lear_jet = Commands->Create_Object ("Nod_Jet", Vector3(929.91f,1132.34f,70.5f));
					if (lear_jet)
					{
						Commands->Attach_Script (lear_jet, "M02_Nod_Jet", "");
					}
					destroy_zone = true;
					break;
				}
			case (405116):
				{
					Commands->Stop_All_Conversations ();
					int id = Commands->Create_Conversation("M02_OBELISK_APPROACH", 100, 300, true);
					Commands->Join_Conversation(NULL, id);
					Commands->Join_Conversation (STAR, id, true, false, false);
					Commands->Start_Conversation(id);
					destroy_zone = true;
					break;
				}
			case (405117):
				{
					Commands->Stop_All_Conversations ();
					int id = Commands->Create_Conversation("M02_PRIMARY_02_REMIND", 100, 300, true);
					Commands->Join_Conversation(NULL, id);
					Commands->Join_Conversation (STAR, id, true, false, false);
					Commands->Start_Conversation(id);
					destroy_zone = true;
					break;
				}
			case (405118):
				{
					destroy_zone = true;
					break;
				}
			case (405119):
				{
					Commands->Stop_All_Conversations ();
					int id = Commands->Create_Conversation("M02_SECONDARY_03_START", 100, 300, true);
					Commands->Join_Conversation(NULL, id);
					Commands->Join_Conversation (STAR, id, true, false, false);
					Commands->Start_Conversation(id);
					destroy_zone = true;
					break;
				}
			case (405120):
				{
					// Drop the A02 Mammoth Tank

					Vector3 droploc = Vector3(570.06f,261.47f,-55.0f);
					GameObject * chinook_obj1 = Commands->Create_Object("GDI_Mammoth_Tank_Player", droploc);
					if (chinook_obj1)
					{
						Commands->Set_Facing (chinook_obj1, 45.0f);
						Commands->Attach_Script(chinook_obj1, "M02_Player_Vehicle", "2");
					}
					destroy_zone = true;
					break;
				}
			case (405122):
				{
					Commands->Stop_All_Conversations ();
					int id = Commands->Create_Conversation("M02_SECONDARY_11_START", 100, 300, true);
					Commands->Join_Conversation(NULL, id);
					Commands->Join_Conversation (STAR, id, true, false, false);
					Commands->Start_Conversation(id);

					Commands->Start_Timer (obj, this, 6.0f, 12);
					destroy_zone = true;
					break;
				}
			}

			if (dual_zone)
			{
				// Another zone is also associated with this trigger. Destroy it as well.

				GameObject* dual_zone_obj = Commands->Find_Object(dual_zone);

				if (dual_zone_obj)
				{
					Commands->Destroy_Object(dual_zone_obj);
				}
			}

			if (destroy_zone)
			{
				Commands->Destroy_Object(obj);
			}
		}
	}

	void Check_For_Soldiers (GameObject* obj, int timer_id)
	{
		enemies_defeated = true;
		Vector3 obj_position = Commands->Get_Position (obj);
		Commands->Create_Logical_Sound (obj, 1000, obj_position, 70.0f);	
		Commands->Start_Timer(obj, this, 1.0f, timer_id);
	}

	void Timer_Expired(GameObject * obj, int timer_id)
	{
		if (timer_id == 3)
		{
			Send_and_Destroy (obj, 207);
		}
		else if (timer_id == 4)
		{
			Send_and_Destroy (obj, 208);
		}
		else if (timer_id == 5)
		{
			Send_and_Destroy (obj, 209);
		}
		else if (timer_id == 6)
		{
			Send_and_Destroy (obj, 210);
		}
		else if (timer_id == 7)
		{
			Send_and_Destroy (obj, 211);
		}
		else if (timer_id == 9)
		{
			// Teleport the star to the rooftop area.

			Commands->Set_Position (STAR, Vector3(1190.268f,558.538f,32.5f));

			// Create the Nod Jet and fly it out

			GameObject * jet = Commands->Create_Object ("Nod_Jet", Vector3(1209.879f,528.647f,21.313f));
			if (jet)
			{
				Commands->Attach_Script(jet, "M02_Nod_Jet_Waypath", "");
			}

			// Turn on objectives

			GameObject * object = Commands->Find_Object (M02_OBJCONTROLLER);
			if (object)
			{
				Commands->Control_Enable (STAR, true);
				ActionParamsStruct params;
				params.Set_Basic (this, 100, 0);
				Commands->Action_Follow_Input (STAR, params);

				Commands->Send_Custom_Event(obj, object, 201, 1);
				Commands->Send_Custom_Event(obj, object, 205, 0);

				//Turn on A21

				Commands->Send_Custom_Event(obj, object, 104, 21);

				// Wake up A21 units

				Commands->Send_Custom_Event(obj, Commands->Find_Object(400277), 0, 0);
				Commands->Send_Custom_Event(obj, Commands->Find_Object(401141), 0, 0);
				Commands->Send_Custom_Event(obj, Commands->Find_Object(401142), 0, 0);
				Commands->Send_Custom_Event(obj, Commands->Find_Object(401143), 0, 0);
				Commands->Send_Custom_Event(obj, Commands->Find_Object(401144), 0, 0);
				Commands->Send_Custom_Event(obj, Commands->Find_Object(401145), 0, 0);
				Commands->Send_Custom_Event(obj, Commands->Find_Object(401146), 0, 0);

				// Create Mendoza

				GameObject * mendoza = Commands->Create_Object("Nod_FlameThrower_3Boss", Vector3(1260.007f,535.460f,18.428f));
				if (mendoza)
				{
					Commands->Attach_Script(mendoza, "M02_Mendoza", "");
					mendoza_id = Commands->Get_ID (mendoza);
					GameObject * endzone = Commands->Find_Object (400194);
					if (endzone)
					{
						Commands->Send_Custom_Event(obj, endzone, 999, mendoza_id);
					}
				}
				Commands->Destroy_Object(obj);
			}
		}
		else if (timer_id == 10)
		{
			GameObject * tank = Commands->Find_Object (401028);
			if (tank)
			{
				Vector3 tank_pos = Commands->Get_Position (tank);
				Vector3 my_pos = Commands->Get_Position (STAR);
				float distance = Commands->Get_Distance (tank_pos, my_pos);
				if (distance < 20.0f)
				{
					int id = Commands->Create_Conversation ("MX2DSGN_DSGN0009", 100, 300, true);
					Commands->Join_Conversation (NULL, id);
					Commands->Join_Conversation (STAR, id, true, false, false);
					Commands->Start_Conversation (id);
				}
				else
				{
					Commands->Start_Timer (obj, this, 2.0f, 10);
				}
			}
		}
		else if (timer_id == 11)
		{
			GameObject * tank = Commands->Find_Object (401028);
			if (tank)
			{
				int id = Commands->Create_Conversation ("MX2DSGN_DSGN0010", 100, 300, true);
				Commands->Join_Conversation (NULL, id);
				Commands->Join_Conversation (STAR, id, true, false, false);
				Commands->Start_Conversation (id);
			}
		}
		else if (timer_id == 12)
		{
			GameObject * tank = Commands->Find_Object (401036);
			if (tank)
			{
				int id = Commands->Create_Conversation ("MX2DSGN_DSGN0011", 100, 300, true);
				Commands->Join_Conversation (NULL, id);
				Commands->Join_Conversation (STAR, id, true, false, false);
				Commands->Start_Conversation (id);
			}
		}
	}

	void Send_and_Destroy (GameObject *obj, int type)
	{
		if (enemies_defeated)
		{
			GameObject * object = Commands->Find_Object(M02_OBJCONTROLLER);

			if (object)
			{
				Commands->Send_Custom_Event(obj, object, type, 1);
				enemies_defeated = false;
				Commands->Destroy_Object(obj);
				
				if (type == 207)
				{
					// Check if the commando needs a new vehicle.

					Commands->Send_Custom_Event(obj, object, 111, 0);

					// Tell the GDI rocket solders to go to the tower.

					Vector3 obj_position = Commands->Get_Position (obj);
					Commands->Create_Logical_Sound (obj, 1100, obj_position, 1000.0f);
				}
				else if (type == 210)
				{
					// Air drop GDI soldiers into A02

					Call_GDI_Soldiers (2);
				}
			}
		}
		else if (!gave_secure_warning)
		{
			gave_secure_warning = true;
			Commands->Stop_All_Conversations ();
			int id = Commands->Create_Conversation("M02_EVAG_SECURE_WARNING", 100, 300, true);
			Commands->Join_Conversation(NULL, id);
			Commands->Join_Conversation (STAR, id, true, false, false);
			Commands->Start_Conversation(id);
		}
	}

	void Custom(GameObject * obj, int type, int param, GameObject * sender)
	{
		// Custom received from living units in an area. 

		if ((type == 100) && (param == 1))
		{
			enemies_defeated = false;
		}
		else if (type == 999)
		{
			if (param == 999)
			{
				GameObject * mendoza = Commands->Find_Object (mendoza_id);
				if (mendoza)
				{
					mendoza_id = 0;
					Commands->Destroy_Object (mendoza);
				}
			}
			else
			{
				mendoza_id = param;
			}
		}
	}

	void Call_GDI_Soldiers (int area_id)
	{
		Vector3 drop_loc = Vector3(0.0f,0.0f,0.0f);
		float facing = 0.0f;
		const char* textfile = "X2I_GDI_Drop02_Rocket.txt";

		switch (area_id)
		{
		case (0):
			{
				drop_loc = Vector3(-10.6f,-25.1f,-38.2f);
				facing = 70.5f;
				textfile = "X2I_GDI_Drop02_Rocket.txt";
				break;
			}
		case (2):
			{
				drop_loc = Vector3(664.70f,312.57f,-59.65f);
				facing = -150.0f;
				textfile = "X2I_GDI_Drop02_Rocket_2.txt";
				break;
			}
		case (9): // Dam Top Rush
			{
				drop_loc = Vector3(869.320f,912.316f,30.150f);
				facing = 110.0f;
				textfile = "X2I_GDI_Drop03_Minigunner.txt";
				break;
			}
		}

		GameObject * chinook_obj1 = Commands->Create_Object("Invisible_Object", drop_loc);

		if (chinook_obj1)
		{
			Commands->Set_Facing(chinook_obj1, facing);
			Commands->Attach_Script(chinook_obj1, "Test_Cinematic", textfile);
		}
	}

	void Create_Apache (int area_id)
	{
		GameObject *helipad = Commands->Find_Object(474463);

		if (helipad)
		{
			// This will stop working when the Power Plant goes down, but it won't matter by that time.

			float currenthealth = Commands->Get_Health (helipad);

			if (((Commands->Get_Building_Power (helipad)) && (currenthealth > 0.0f)) || (area_id == 15))
			{
				Vector3 create_pos = Vector3(0.0f, 0.0f, 0.0f);
				float facing = 0.0f;
				const char* apache_params = "0";

				switch(area_id)
				{
				case (0):
					{
						create_pos = Vector3(138.36f, -5.61f, -12.20f);
						facing = -80.0f;
						apache_params = "0";
						break;
					}
				case (15):
					{
						create_pos = Vector3(1300.898f,657.717f,67.364f);
						facing = 0.0f;
						apache_params = "15";
						break;
					}
				case (24):
					{
						create_pos = Vector3(610.03f,1036.35f,-15.676f);
						facing = 0.0f;
						apache_params = "24";
						break;
					}
				}

				GameObject * apache = Commands->Create_Object("Nod_Apache", create_pos);
				if (apache)
				{
					Commands->Set_Facing(apache, facing);
					Commands->Attach_Script(apache, "M02_Nod_Apache", apache_params);
				}
			}
		}
	}

	void Create_Light_Tank (int area_id)
	{
		Vector3 create_pos = Vector3(465.645f, 715.86f, -14.935f);
		float facing = -10.0f;
		const char* tank_params = "3";
		GameObject * tank = Commands->Create_Object("Nod_Light_Tank", create_pos);

		if (tank)
		{
			Commands->Set_Facing(tank, facing);
			Commands->Attach_Script(tank, "M02_Nod_Vehicle", tank_params);
		}
	}

	void Create_Sakura (int area_id)
	{
		GameObject *helipad = Commands->Find_Object(474463);

		if (helipad)
		{
			float currenthealth = Commands->Get_Health (helipad);

			if ((Commands->Get_Building_Power (helipad)) && (currenthealth > 0.0f))
			{
				Vector3 create_pos = Vector3(509.362f,473.582f,-40.0f);
				float facing = 0.0f;
				const char* sakura_params = "2";

				GameObject * sakura = Commands->Create_Object("Nod_Apache", create_pos);
				
				if (sakura)
				{
					Commands->Set_Facing(sakura, facing);
					Commands->Attach_Script(sakura, "M02_Nod_Sakura", sakura_params);
				}
			}
		}
	}

	void Create_Buggy (int area_id)
	{
		Vector3 create_pos = Vector3(0.0f, 0.0f, 0.0f);
		float facing = 0.0f;
		const char* buggy_params = "0";

		switch (area_id)
		{
		case (2):
			{
				create_pos = Vector3(674.622f,308.296f,-61.674f);
				facing = -90.0f;
				buggy_params = "2";
				break;
			}
		case (4):
			{
				create_pos = Vector3(366.209f,861.401f,6.488f);
				facing = -110.0f;
				buggy_params = "4";
				break;
			}
		}

		GameObject * buggy = Commands->Create_Object("Nod_Buggy", create_pos);
		if (buggy)
		{
			Commands->Set_Facing(buggy, facing);
			Commands->Attach_Script(buggy, "M02_Nod_Vehicle", buggy_params);
		}
	}
};


DECLARE_SCRIPT (M02_Respawn_Controller, "")
{
	bool active_area [M02_AREACOUNT];
	bool area_spawn_heli_drop_01_active [M02_AREACOUNT];
	bool area_spawn_heli_drop_02_active [M02_AREACOUNT];
	bool area_spawn_parachute_active [M02_AREACOUNT];

	char area_unit_count [M02_AREACOUNT];
	char area_unit_max [M02_AREACOUNT];
	int area_officer [M02_AREACOUNT];

	int spawner_rotator;
	int replacement_vehicle;
	int destroyed_sam;
	int destroyed_silo;

	REGISTER_VARIABLES()
	{
		SAVE_VARIABLE( active_area, 1);
		SAVE_VARIABLE( area_spawn_heli_drop_01_active, 2);
		SAVE_VARIABLE( area_spawn_heli_drop_02_active, 3);
		SAVE_VARIABLE( area_spawn_parachute_active, 4);
		SAVE_VARIABLE( area_unit_count, 5);
		SAVE_VARIABLE( area_unit_max, 6);
		SAVE_VARIABLE( area_officer, 7);
		SAVE_VARIABLE( spawner_rotator, 8);
		SAVE_VARIABLE( replacement_vehicle, 9);
		SAVE_VARIABLE( destroyed_sam, 10);
		SAVE_VARIABLE( destroyed_silo, 11);
	}

	void Created (GameObject *obj)
	{
		int counter;
		counter = 0;
		spawner_rotator = 0;
		replacement_vehicle = -1;
		destroyed_sam = 0;
		destroyed_silo = 0;

		while (counter < ARRAY_ELEMENT_COUNT(active_area))
		{
			active_area [counter] = false;
			area_unit_count [counter] = 0;
			area_officer [counter] = 0;
			area_unit_max [counter] = 8;
			area_spawn_heli_drop_01_active [counter] = false;
			area_spawn_heli_drop_02_active [counter] = false;
			area_spawn_parachute_active [counter] = false;

			// Turning the actives to true in here means they do not occur in the area
			// provided you don't turn them off later on in the mission.

			switch (counter)
			{
			case (1):
				{
					area_unit_max [counter] = 7;
					break;
				}
			case (2):
				{
					area_unit_max [counter] = 7;
					break;
				}
			case (3):
				{
					area_unit_max [counter] = 5;
					break;
				}
			case (6):
				{
					area_unit_max [counter] = 6;
					break;
				}
			case (8):
				{
					area_spawn_heli_drop_01_active [counter] = true;
					area_spawn_heli_drop_02_active [counter] = true;
					area_spawn_parachute_active [counter] = true;
					area_unit_max [counter] = 3;
					break;
				}
			case (9):
				{
					area_unit_max [counter] = 7;
					break;
				}
			case (10):
				{
					area_spawn_parachute_active [counter] = true;
					break;
				}
			case (11):
				{
					area_spawn_heli_drop_01_active [counter] = true;
					area_spawn_heli_drop_02_active [counter] = true;
					area_spawn_parachute_active [counter] = true;
					area_unit_max [counter] = 3;
					break;
				}
			case (14):
				{
					area_spawn_heli_drop_01_active [counter] = true;
					area_spawn_heli_drop_02_active [counter] = true;
					area_spawn_parachute_active [counter] = true;
					area_unit_max [counter] = 3;
					break;
				}
			case (15):
				{
					area_spawn_heli_drop_01_active [counter] = true;
					area_spawn_heli_drop_02_active [counter] = true;
					area_spawn_parachute_active [counter] = true;
					area_unit_max [counter] = 3;
					break;
				}
			case (21):
				{
					area_unit_max [counter] = 5;
					break;
				}
			case (24):
				{
					area_spawn_heli_drop_01_active [counter] = true;
					area_spawn_heli_drop_02_active [counter] = true;
					area_spawn_parachute_active [counter] = true;
					area_unit_max [counter] = 3;
					break;
				}
			}
			counter++;
		}

		// Create the GDI Transport Helicopter and fly it out of scene.

		GameObject * helicopter = Commands->Create_Object ("GDI_Transport_Helicopter", Vector3(-26.87f,37.42f,20.75f));
		if (helicopter)
		{
			Commands->Set_Facing (helicopter, -155.0f);
			Commands->Attach_Script (helicopter, "M02_GDI_Helicopter", "");
		}

		// Drop the first Humm-Vee into the start area.

		Call_GDI_HummVee (0);

		// Wake up the A25 units.

		Commands->Send_Custom_Event(obj, Commands->Find_Object(400985), 0, 0);

		// Call the ORCA strike intro.

		GameObject * chinook_obj1 = Commands->Create_Object("Invisible_Object", Vector3(0,0,0));
		if (chinook_obj1)
		{
			Commands->Attach_Script(chinook_obj1, "Test_Cinematic", "X2A_OrcaStrike.txt");
		}

		Commands->Start_Timer(obj, this, 3.0f, 2);
	}

	void Call_GDI_HummVee (int area_id)
	{
		Vector3 drop_loc = Vector3(-87.2f,-13.1f,-40.1f);
		float facing = 102.9f;
		GameObject * chinook_obj1 = Commands->Create_Object("Invisible_Object", drop_loc);

		if (chinook_obj1)
		{
			Commands->Set_Facing(chinook_obj1, facing);
			Commands->Attach_Script(chinook_obj1, "Test_Cinematic", "X2I_GDI_Drop_HummVee.txt");
		}
	}

	void Call_GDI_PowerUp (int area_id)
	{
		Vector3 drop_loc = Vector3(511.3f,680.3f,-21.2f);
		float facing = 146.6f;
		GameObject * chinook_obj1 = Commands->Create_Object("Invisible_Object", drop_loc);

		if (chinook_obj1)
		{
			Commands->Set_Facing(chinook_obj1, facing);
			Commands->Attach_Script(chinook_obj1, "Test_Cinematic", "X2I_GDI_Drop_PowerUp.txt");
		}
	}

	void Timer_Expired(GameObject * obj, int timer_id)
	{
		if (timer_id == 2)
		{
			// Count through each area, check if it is active.

			int counter;
			counter = 0;
			while (counter < ARRAY_ELEMENT_COUNT(active_area))
			{
				if (active_area[counter])
				{
					// Check if the area still has an officer associated.

					if (area_officer[counter])
					{
						GameObject* officer = Commands->Find_Object(area_officer[counter]);

						if (officer)
						{
							Check_Respawns (counter);
						}
					}
				}
				counter++;
			}
			int players_difficulty = Commands->Get_Difficulty_Level();
			float timer_length = 25 - (10 * (players_difficulty));
			Commands->Start_Timer(obj, this, timer_length, 2);
		}
	}

	void Check_Respawns (int area_id)
	{
		// Can this particular area handle respawns?
		// Count through the spawn sequence until all units have been accounted for.

		int counter;
		int stop_point;
		bool stopped_counter;
		int spawner_buffer = 0;

		stopped_counter = false;
		counter = Get_Int_Random(0,2);
		stop_point = counter;

		int tempcount = area_unit_count[area_id];

		while (tempcount < area_unit_max [area_id])
		{
			if (!stopped_counter)
			{
				// Check which respawn type I can use.

				switch (counter)
				{
				case (0):
					{
						if (!area_spawn_heli_drop_01_active[area_id])
						{
							if ((area_unit_max[area_id] - tempcount) > 2)
							{
								area_spawn_heli_drop_01_active[area_id] = true;
								tempcount += 3;
								Use_Heli_Drop_01(area_id);
							}
						}
						break;
					}
				case (1):
					{
						if (!area_spawn_heli_drop_02_active[area_id])
						{
							if ((area_unit_max[area_id] - tempcount) > 1)
							{
								area_spawn_heli_drop_02_active[area_id] = true;
								tempcount += 2;
								Use_Heli_Drop_02(area_id);
							}
						}
						break;
					}
				case (2):
					{
						if (!area_spawn_parachute_active[area_id])
						{
							if ((area_unit_max[area_id] - tempcount) > 2)
							{
								area_spawn_parachute_active[area_id] = true;
								Use_Parachute_Drop(area_id);
								tempcount += 3;
							}
						}
						break;
					}
				}
			}
			else
			{
				spawner_buffer++;
				if (spawner_buffer < 3)
				{
					tempcount ++;
					Use_Spawners (area_id);
				}
				else
				{
					tempcount = area_unit_max[area_id];
				}
			}

			if (!stopped_counter)
			{
				counter++;
				if (counter > 2)
				{
					counter = 0;
				}
				if (counter == stop_point)
				{
					stopped_counter = true;
				}
			}
		}
	}

	// This uses a helicopter to drop three units.

	void Use_Heli_Drop_01 (int area_id)
	{
		Vector3 drop_location;
		float facing;
		const char* cinematic;
		const char* textfile;
		const char* parameters;

		cinematic = "Test_Cinematic";
		textfile = "X2I_Drop03_Area00.txt";
		parameters = "0,107";
		drop_location = Vector3(0.0f,0.0f,0.0f);
		facing = 0.0f;

		switch (area_id)
		{
		case (0): // A00 Guard Tower
			{
				parameters = "0,107";
				textfile = "X2I_Drop03_Area00.txt";
				drop_location = Vector3(119.5f,6.1f,-19.7f);
				facing = 140.0f;
				break;
			}
		case (1):
			{
				parameters = "1,107";
				textfile = "X2I_Drop03_Area01.txt";
				drop_location = Vector3(515.5f,17.1f,-58.9f);
				facing = 51.3f;
				break;
			}
		case (2):
			{
				parameters = "2,107";
				textfile = "X2I_Drop03_Area02.txt";
				drop_location = Vector3(619.9f,310.4f,-59.9f);
				facing = 0.0f;
				break;
			}
		case (3):
			{
				parameters = "3,107";
				textfile = "X2I_Drop03_Area03.txt";
				drop_location = Vector3(530.4f,690.8f,-19.2f);
				facing = -22.8f;
				break;
			}
		case (4):
			{
				parameters = "4,107";
				textfile = "X2I_Drop03_Area04.txt";
				drop_location = Vector3(461.5f,908.0f,5.3f);
				facing = -102.4f;
				break;
			}
		case (6):
			{
				parameters = "6,107";
				textfile = "X2I_Drop03_Area06.txt";
				drop_location = Vector3(772.1f,969.6f,21.4f);
				facing = 163.2f;
				break;
			}
		case (9):
			{
				parameters = "9,107";
				textfile = "X2I_Drop03_Area09.txt";
				drop_location = Vector3(957.638f,879.421f,34.220f);
				facing = 55.0f;
				break;
			}
		case (10):
			{
				parameters = "10,107";
				textfile = "X2I_Drop03_Area10.txt";
				drop_location = Vector3(1044.01f,947.144f,-37.816f);
				facing = -83.5f;
				break;
			}
		case (11):
			{
				parameters = "11,107";
				textfile = "X2I_Drop03_Area11.txt";
				drop_location = Vector3(1072.776f,997.836f,6.492f);
				facing = -35.0f;
				break;
			}
		case (21):
			{
				parameters = "21,107";
				textfile = "X2I_Drop03_Area21.txt";
				drop_location = Vector3(1173.998f,478.803f,22.657f);
				facing = 55.0f;
				break;
			}
		}

		GameObject * chinook_obj1 = Commands->Create_Object("Invisible_Object", drop_location);

		if (chinook_obj1)
		{
			Commands->Set_Facing(chinook_obj1, facing);
			Commands->Attach_Script(chinook_obj1, "M02_Reset_Spawn", parameters);
			Commands->Attach_Script(chinook_obj1, cinematic, textfile);
		}
	}

	// This uses a different helicopter route to drop two units.

	void Use_Heli_Drop_02 (int area_id)
	{
		Vector3 drop_location;
		float facing;
		const char* cinematic;
		const char* textfile;
		const char* parameters;

		cinematic = "Test_Cinematic";
		textfile = "X2I_Drop02_Area00.txt";
		parameters = "0,108";
		drop_location = Vector3(0.0f,0.0f,0.0f);
		facing = 0.0f;

		switch (area_id)
		{
		case (0):
			{
				parameters = "0,108";
				textfile = "X2I_Drop02_Area00.txt";
				drop_location = Vector3(99.4f,-13.8f,-28.4f);
				facing = 25.1f;
				break;
			}
		case (1):
			{
				parameters = "1,108";
				textfile = "X2I_Drop02_Area01.txt";
				drop_location = Vector3(522.4f,128.1f,-58.7f);
				facing = -133.9f;
				break;
			}
		case (2):
			{
				parameters = "2,108";
				textfile = "X2I_Drop02_Area02.txt";
				drop_location = Vector3(614.8f,278.9f,-52.3f);
				facing = 22.8f;
				break;
			}
		case (3):
			{
				parameters = "3,108";
				textfile = "X2I_Drop02_Area03.txt";
				drop_location = Vector3(506.11f,567.12f,-39.60f);
				facing = 66.9f;
				break;
			}
		case (4):
			{
				parameters = "4,108";
				textfile = "X2I_Drop02_Area04.txt";
				drop_location = Vector3(471.1f,854.9f,3.7f);
				facing = -171.2f;
				break;
			}
		case (6):
			{
				parameters = "6,108";
				textfile = "X2I_Drop02_Area06.txt";
				drop_location = Vector3(786.0f,1032.3f,21.3f);
				facing = 168.7f;
				break;
			}
		case (9):
			{
				parameters = "9,108";
				textfile = "X2I_Drop02_Area09.txt";
				drop_location = Vector3(1047.111f,879.541f,34.220f);
				facing = 140.0f;
				break;
			}
		case (10):
			{
				parameters = "10,108";
				textfile = "X2I_Drop02_Area10.txt";
				drop_location = Vector3(970.504f,941.132f,-37.812f);
				facing = -130.0f;
				break;
			}
		case (11):
			{
				parameters = "11,108";
				textfile = "X2I_Drop02_Area11.txt";
				drop_location = Vector3(1092.028f,975.856f,4.14f);
				facing = 15.0f;
				break;
			}
		case (21):
			{
				parameters = "21,108";
				textfile = "X2I_Drop02_Area21.txt";
				drop_location = Vector3(1173.369f,562.608f,32.394f);
				facing = 0.0f;
				break;
			}
		}

		GameObject * chinook_obj2 = Commands->Create_Object("Invisible_Object", drop_location);

		if (chinook_obj2)
		{
			Commands->Set_Facing(chinook_obj2, facing);
			Commands->Attach_Script(chinook_obj2, "M02_Reset_Spawn", parameters);
			Commands->Attach_Script(chinook_obj2, cinematic, textfile);
		}
	}

	// This uses a cargo plane parachute drop to drop three units.

	void Use_Parachute_Drop (int area_id)
	{
		Vector3 drop_location;
		float facing;
		const char* cinematic;
		const char* textfile;
		const char* parameters;

		cinematic = "Test_Cinematic";
		textfile = "X2I_Para03_Area00.txt";
		parameters = "0,109";
		drop_location = Vector3(0.0f,0.0f,0.0f);
		facing = 0.0f;

		switch (area_id)
		{
		case (0):
			{
				textfile = "X2I_Para03_Area00.txt";
				parameters = "0,109";
				drop_location = Vector3(119.5f,38.2f,-15.6f);
				facing = -144.9f;
				break;
			}
		case (1):
			{
				textfile = "X2I_Para03_Area01.txt";
				parameters = "1,109";
				drop_location = Vector3(509.7f,78.3f,-55.2f);
				facing = -73.7f;
				break;
			}
		case (2):
			{
				textfile = "X2I_Para03_Area02.txt";
				parameters = "2,109";
				drop_location = Vector3(598.7f,342.2f,-62.7f);
				facing = -119.1f;
				break;
			}
		case (3):
			{
				textfile = "X2I_Para03_Area03.txt";
				parameters = "3,109";
				drop_location = Vector3(488.2f,608.4f,-41.2f);
				facing = -158.2f;
				break;
			}
		case (4):
			{
				textfile = "X2I_Para03_Area04.txt";
				parameters = "4,109";
				drop_location = Vector3(371.1f,794.0f,3.7f);
				facing = 90.0f;
				break;
			}
		case (6):
			{
				textfile = "X2I_Para03_Area06.txt";
				parameters = "6,109";
				drop_location = Vector3(765.5f,1004.0f,21.4f);
				facing = -14.4f;
				break;
			}
		case (9):
			{
				textfile = "X2I_Para03_Area09.txt";
				parameters = "9,109";
				drop_location = Vector3(1028.1f,876.4f,34.2f);
				facing = 87.2f;
				break;
			}
		case (21):
			{
				textfile = "X2I_Para03_Area21.txt";
				parameters = "21,109";
				drop_location = Vector3(1255.732f,565.134f,17.602f);
				facing = 150.0f;
				break;
			}
		}

		GameObject * plane_obj = Commands->Create_Object("Invisible_Object", drop_location);

		if (plane_obj)
		{
			Commands->Set_Facing(plane_obj, facing);
			Commands->Attach_Script(plane_obj, "M02_Reset_Spawn", parameters);
			Commands->Attach_Script(plane_obj, cinematic, textfile);
		}
	}

	// This uses the regular spawners to generate one unit.

	bool Use_Spawners (int area_id)
	{
		int spawner_id;
		const char *spawner_params;
		spawner_id = 0;
		spawner_params = "0,0,-1";
		spawner_rotator++;
		if (spawner_rotator > 2)
		{
			spawner_rotator = 0;
		}

		switch (area_id)
		{
		case (0):
			{
				switch (spawner_rotator)
				{
				case (0):
					{
						spawner_id = 400233;
						break;
					}
				case (1):
					{
						spawner_id = 400236;
						break;
					}
				default:
					{
						spawner_id = 400237;
						break;
					}
				}
				spawner_params = "0,0,-1";
				break;
			}
		case (1):
			{
				switch (spawner_rotator)
				{
				case (0):
					{
						spawner_id = 400234;
						break;
					}
				case (1):
					{
						spawner_id = 400238;
						break;
					}
				default:
					{
						spawner_id = 400239;
						break;
					}
				}
				spawner_params = "1,0,-1";
				break;
			}
		case (2):
			{
				switch (spawner_rotator)
				{
				case (0):
					{
						spawner_id = 400235;
						break;
					}
				case (1):
					{
						spawner_id = 400240;
						break;
					}
				default:
					{
						spawner_id = 400241;
						break;
					}
				}
				spawner_params = "2,0,-1";
				break;
			}
		case (3):
			{
				switch (spawner_rotator)
				{
				case (0):
					{
						spawner_id = 400242;
						break;
					}
				case (1):
					{
						spawner_id = 400243;
						break;
					}
				default:
					{
						spawner_id = 400244;
						break;
					}
				}
				spawner_params = "3,0,-1";
				break;
			}
		case (4):
			{
				switch (spawner_rotator)
				{
				case (0):
					{
						spawner_id = 400245;
						break;
					}
				case (1):
					{
						spawner_id = 400246;
						break;
					}
				default:
					{
						spawner_id = 400247;
						break;
					}
				}
				spawner_params = "4,0,-1";
				break;
			}
		case (6):
			{
				switch (spawner_rotator)
				{
				case (0):
					{
						spawner_id = 400248;
						break;
					}
				case (1):
					{
						spawner_id = 400249;
						break;
					}
				default:
					{
						spawner_id = 400250;
						break;
					}
				}
				spawner_params = "6,0,-1";
				break;
			}
		case (8):
			{
				switch (spawner_rotator)
				{
				case (0):
					{
						spawner_id = 400261;
						break;
					}
				case (1):
					{
						spawner_id = 400262;
						break;
					}
				default:
					{
						spawner_id = 400263;
						break;
					}
				}
				spawner_params = "8,0,-1";
				break;
			}
		case (9):
			{
				switch (spawner_rotator)
				{
				case (0):
					{
						spawner_id = 400251;
						break;
					}
				case (1):
					{
						spawner_id = 400252;
						break;
					}
				default:
					{
						spawner_id = 400253;
						break;
					}
				}
				spawner_params = "9,0,-1";
				break;
			}
		case (10):
			{
				switch (spawner_rotator)
				{
				case (0):
					{
						spawner_id = 400254;
						break;
					}
				case (1):
					{
						spawner_id = 400255;
						break;
					}
				default:
					{
						spawner_id = 400256;
						break;
					}
				}
				spawner_params = "10,0,-1";
				break;
			}
		case (11):
			{
				switch (spawner_rotator)
				{
				case (0):
					{
						spawner_id = 400257;
						break;
					}
				case (1):
					{
						spawner_id = 400258;
						break;
					}
				default:
					{
						spawner_id = 400259;
						break;
					}
				}
				spawner_params = "11,0,-1";
				break;
			}
		case (14):
			{
				switch (spawner_rotator)
				{
				case (0):
					{
						spawner_id = 401081;
						break;
					}
				case (1):
					{
						spawner_id = 401082;
						break;
					}
				default:
					{
						spawner_id = 401083;
						break;
					}
				}
				spawner_params = "14,0,-1";
				break;
			}
		case (15):
			{
				switch (spawner_rotator)
				{
				case (0):
					{
						spawner_id = 401098;
						break;
					}
				case (1):
					{
						spawner_id = 401099;
						break;
					}
				default:
					{
						spawner_id = 401100;
						break;
					}
				}
				spawner_params = "15,0,-1";
				break;
			}
		case (21):
			{
				switch (spawner_rotator)
				{
				case (0):
					{
						spawner_id = 400264;
						break;
					}
				case (1):
					{
						spawner_id = 400265;
						break;
					}
				default:
					{
						spawner_id = 400266;
						break;
					}
				}
				spawner_params = "21,0,-1";
				break;
			}
		case (24):
			{
				switch (spawner_rotator)
				{
				case (0):
					{
						spawner_id = 400540;
						break;
					}
				case (1):
					{
						spawner_id = 400541;
						break;
					}
				default:
					{
						spawner_id = 400542;
						break;
					}
				}
				spawner_params = "24,0,-1";
				break;
			}
		}
		GameObject * spawn1 = Commands->Trigger_Spawner(spawner_id);
		if (spawn1)
		{
			Commands->Attach_Script(spawn1, "M02_Nod_Soldier", spawner_params);
			return true;
		}
		else
		{
			return false;
		}
	}

	void Custom (GameObject *obj, int type, int param, GameObject *sender)
	{
		if (type == 101)
		{
			// A unit has died, subtract him from his area (param).

			area_unit_count [param]--;
			if (area_unit_count [param] < 0)
			{
				area_unit_count [param] = 0;
			}
		}
		else if (type == 102)
		{
			// A specific area is requesting a forced spawn if possible.

			Check_Respawns (param);
		}
		else if (type == 103)
		{
			// A unit is registering with the area unit count.

			area_unit_count [param]++;
		}
		else if (type == 104)
		{
			// An area is being activated. Turn on the area.
			active_area [param] = true;
		}
		else if (type == 105)
		{
			// An area is being deactivated.

			active_area [param] = false;
		}
		else if (type == 106)
		{
			// An officer is registering with his area.

			if (sender)
			{
				area_officer[param] = Commands->Get_ID(sender);
			}
		}
		else if (type == 107)
		{
			// A Heli_01 spawner type is attempting to reset itself.
			
			area_spawn_heli_drop_01_active[param] = false;
		}
		else if (type == 108)
		{
			// A Heli_02 spawner type is attempting to reset itself.

			area_spawn_heli_drop_02_active[param] = false;
		}
		else if (type == 109)
		{
			// A Parachute spawner type is attempting to reset itself.

			area_spawn_parachute_active[param] = false;
		}
		else if (type == 111)
		{
			// A request to spawn a new vehicle for the commando has been made.

			Replacement_Vehicle (obj, param);
		}
		else if (type == 112)
		{
			// A player controlled vehicle has been destroyed, turn on the ability to make a new one

			replacement_vehicle = param;
		}
		else if (type == 113)
		{
			// A request has been made to call in a GDI power-up drop.

			Call_GDI_PowerUp (3);
		}
		else if (type == 114)
		{
			// Reset the unit area count to zero.

			area_unit_count [param] = 0;
		}
		else if (type == 115)
		{
			// Destroyed SAM on the bridge - add to count, determine if both are destroyed.

			destroyed_sam++;
			if (destroyed_sam > 1)
			{
				// Drop a Medium Tank on the bridge.

				replacement_vehicle = 6;
				Replacement_Vehicle (obj, 6);
			}
		}
		else if (type == 116)
		{
			// Destroyed Tiberium Silo - add to count, determine if both are destroyed.

			destroyed_silo++;
			if (destroyed_silo > 1)
			{
				// Complete this mission objective.

				Commands->Send_Custom_Event (obj, obj, 222, 1);
				Commands->Stop_All_Conversations ();
				int id = Commands->Create_Conversation("M02_HIDDEN_02_FINISH", 100, 300, true);
				Commands->Join_Conversation(NULL, id);
				Commands->Join_Conversation (STAR, id, true, false, false);
				Commands->Start_Conversation(id);
			}
		}
	}

	// When a player controlled vehicle is destroyed, it sends a custom to this controller
	// to turn on the ability to create a new vehicle in a certain area.
	// Another object then sends a custom to check for new vehicle creation. If the flag for
	// creating a new vehicle for this area is active, it is reset and the vehicle is delivered.

	void Replacement_Vehicle (GameObject *obj, int area_id)
	{
		Vector3 drop_loc = Vector3(0.0f,0.0f,0.0f);
		float facing = 0.0f;
		const char* textfile = "X2I_GDI_Drop_HummVee.txt";
		bool nocinematic = false;

		switch (area_id)
		{
		case (0):
			{
				drop_loc = Vector3(161.6f,27.6f,-18.0f);
				facing = 115.4f;
				textfile = "X2I_GDI_Drop_HummVee.txt";
				break;
			}
		case (1):
			{
				drop_loc = Vector3(494.652f,128.786f,-56.159f);
				facing = 30.0f;
				GameObject *buggy = Commands->Create_Object ("Nod_Buggy_Player", drop_loc);
				if (buggy)
				{
					Commands->Set_Facing (buggy, facing);
					Commands->Attach_Script (buggy, "M02_Player_Vehicle", "3");
				}
				nocinematic = true;
				break;
			}
		case (2):
			{
				drop_loc = Vector3(448.32f,717.19f,-12.35f);
				facing = -30.0f;
				textfile = "X2I_GDI_Drop_MediumTank.txt";
				break;
			}
		case (4):
			{
				drop_loc = Vector3(429.672f, 894.045f, 4.354f);
				facing = -25.0f;
				GameObject *buggy = Commands->Create_Object ("Nod_Light_Tank_Player", drop_loc);
				if (buggy)
				{
					Commands->Set_Facing (buggy, facing);
					Commands->Attach_Script (buggy, "M02_Player_Vehicle", "5");
				}
				nocinematic = true;
				break;
			}
		case (5):
			{
				drop_loc = Vector3(611.1f, 1164.9f, 4.6f);
				facing = -39.7f;
				GameObject *buggy = Commands->Create_Object ("Nod_Recon_Bike_Player", drop_loc);
				if (buggy)
				{
					Commands->Set_Facing (buggy, facing);
					Commands->Attach_Script (buggy, "M02_Player_Vehicle", "6");
				}
				nocinematic = true;
				break;
			}
		case (6):
			{
				drop_loc = Vector3(785.3f,893.9f,21.8f);
				facing = 138.0f;
				textfile = "X2I_GDI_Drop_MediumTank.txt";
				break;
			}
		case (14):
			{
				drop_loc = Vector3(1229.37f, 742.89f, 27.03f);
				facing = 85.0f;
				GameObject *buggy = Commands->Create_Object ("Nod_Recon_Bike_Player", drop_loc);
				if (buggy)
				{
					Commands->Set_Facing (buggy, facing);
					Commands->Attach_Script (buggy, "M02_Player_Vehicle", "14");
				}
				nocinematic = true;
				break;
			}
		}

		if (!nocinematic)
		{
			GameObject * chinook_obj1 = Commands->Create_Object("Invisible_Object", drop_loc);

			if (chinook_obj1)
			{
				Commands->Set_Facing(chinook_obj1, facing);
				Commands->Attach_Script(chinook_obj1, "Test_Cinematic", textfile);
			}
		}
	}
};


DECLARE_SCRIPT (M02_Reset_Spawn, "Area_ID:int,Spawn_Type:int")
{
	void Destroyed (GameObject *obj)
	{
		GameObject * object = Commands->Find_Object(M02_OBJCONTROLLER);

		if (object)
		{
			int area_id;
			int spawn_type;
			area_id = Get_Int_Parameter("Area_ID");
			spawn_type = Get_Int_Parameter("Spawn_Type");
			Commands->Send_Custom_Event(obj, object, spawn_type, area_id);
		}
	}
};


DECLARE_SCRIPT (M02_Nod_Soldier, "Area_Number:int,Area_Officer:int,Pre_Placed:int")
{
	Vector3 my_home_point;
	bool no_return_home;
	int officeranimcounter;
	bool initial_damage;
	float initial_health;
	bool enemy_seen;

	REGISTER_VARIABLES()
	{
		SAVE_VARIABLE (my_home_point, 1);
		SAVE_VARIABLE (no_return_home, 2);
		SAVE_VARIABLE (officeranimcounter, 3);
		SAVE_VARIABLE (initial_damage, 4);
		SAVE_VARIABLE (initial_health, 5);
		SAVE_VARIABLE (enemy_seen, 6);
	}

	void Created (GameObject *obj)
	{
		officeranimcounter = 0;
		no_return_home = false;
		enemy_seen = false;
		initial_damage = false;
		initial_health = Commands->Get_Health(obj);

		// Set the unit's home point, save the value.

		Vector3 my_home_point = Commands->Get_Position(obj);
		Commands->Set_Innate_Soldier_Home_Location(obj, my_home_point, 20.0f);

		// Turn hibernation off for a moment.
		
		Commands->Enable_Hibernation (obj, 0);

		// Start the timer to register with the controller.

		Commands->Start_Timer(obj, this, 1.0f, 1);

		// If the unit is spawned, do not disturb it.
		// If the unit is preplaced, turn of actions.
		// If the unit is flown in, order it to move to the commando.

		int preplaced = Get_Int_Parameter("Pre_Placed");

		if (!preplaced)
		{
			// Give spawned units a green key for the Hand of Nod.

			Commands->Grant_Key (obj, 1, true);

			GameObject *starobj = Commands->Get_A_Star (my_home_point);

			if (starobj)
			{
				ActionParamsStruct params;
				params.Set_Basic(this, 71, 0);
				params.Set_Movement(starobj, RUN, 5.0f, 0);
				Commands->Action_Goto(obj, params);
			}
		}
		else
		{
			if (preplaced > 0)
			{
				// Turn off all actions for preplaced soldiers.

				Commands->Innate_Disable (obj);
			}
		}
	}

	void Enemy_Seen (GameObject * obj, GameObject * enemy)
	{
		enemy_seen = true;
	}

	void Sound_Heard (GameObject * obj, const CombatSound & sound)
	{
		// If an objective shouts, respond to it, letting it know the area is not cleared.

		if (sound.Type == 1000)
		{
			if (sound.Creator)
			{
				Commands->Send_Custom_Event(obj, sound.Creator, 100, 1);
			}
		}

		// If a zone shouts to return to home points, do so.

		else if ((sound.Type > 1049) && (sound.Type < 1100) && (!no_return_home))
		{
			int area_id = (sound.Type - 1050);
			int area_num = Get_Int_Parameter("Area_Number");

			if (area_num == area_id)
			{
				// Tell this unit to return to its home point, conserving unit counts.

				ActionParamsStruct params;
				params.Set_Basic(this, 99, 0);
				params.Set_Movement(my_home_point, RUN, 20.0f, false);
				Commands->Modify_Action (obj, 0, params, true, false);
			}
		}
	}

	void Timer_Expired (GameObject *obj, int timer_id)
	{
		if (timer_id == 1)
		{
			// Register with the respawn controller - send my area number.

			int officer = Get_Int_Parameter("Area_Officer");
			int preplaced = Get_Int_Parameter("Pre_Placed");
			int param = Get_Int_Parameter("Area_Number");
			GameObject * object = Commands->Find_Object(M02_OBJCONTROLLER);

			if (object)
			{
				// Register with the respawn controller.

				Commands->Send_Custom_Event(obj, object, 103, param);

				if (officer)
				{
					// Unit is a preplaced officer. Register as an officer and hibernate.
				
					Commands->Set_Innate_Take_Cover_Probability (obj, 100.0f);
					Commands->Send_Custom_Event(obj, object, 106, param);
					Commands->Enable_Hibernation (obj, 1);
				}
				else
				{
					if (preplaced > 0)
					{

						// SPECIAL CASE SETUP: Force fire routine for Rocket Soldiers.

						if (preplaced == 4)
						{
							Commands->Attach_Script (obj, "M00_Soldier_Powerup_Disable", "");

							if ((param == 0) || (param == 3) || (param == 6) || (param == 10) || (param == 16) || (param == 21))
							{
								no_return_home = true;
								Commands->Start_Timer(obj, this, 15.0f, 4);
							}
						}

						// Soldiers in start cinematic begin self-destruct.

						if ((preplaced == 2) && (param == 99))
						{
							Commands->Start_Timer(obj, this, 5.0f, 6);
						}
						Commands->Enable_Hibernation (obj, 1);
					}
					else
					{
						// Unit is not pre-placed, activate cleanup code and do not hibernate if not in the interior areas.

						Commands->Start_Timer(obj, this, 15.0f, 2);
					}
				}
			}
		}
		else if (timer_id == 2)
		{
			// Cleanup code - find the nearest star, check distance, then check visibility

			Vector3 myloc = Commands->Get_Position(obj);
			GameObject *star_obj = Commands->Get_A_Star(myloc);

			if (star_obj)
			{
				Vector3 starloc = Commands->Get_Position(star_obj);
				float distance = Commands->Get_Distance (myloc, starloc);
				
				if (distance > 70.0f)
				{
					bool visibility = Commands->Is_Object_Visible(star_obj, obj);
					if (!visibility)
					{
						Commands->Apply_Damage(obj, 10000.0f, "Blamokiller");
					}
					else
					{
						Force_Move (obj);
					}
				}
				else
				{
					Force_Move (obj);
				}
			}
			Commands->Start_Timer(obj, this, 5.0f, 2);
		}
		else if (timer_id == 3)
		{
			// Force movement code to prevent irregular activity.
		
			Force_Move (obj);
			Commands->Start_Timer(obj, this, 15.0f, 3);
		}
		else if (timer_id == 4)
		{
			// Force fire at star code to prevent irregular activity.

			Vector3 myloc;
			myloc = Commands->Get_Position(obj);
			GameObject* starobj = Commands->Get_A_Star(myloc);

			if (starobj)
			{
				Vector3 starloc;
				float distance;

				starloc = Commands->Get_Position(starobj);
				distance = Commands->Get_Distance(myloc, starloc);

				if (distance < 150.0f)
				{
					ActionParamsStruct params;
					params.Set_Basic(this, 90, 0);
					params.Set_Attack(starobj, 150.0f, 0.0f, true);
					Commands->Action_Attack(obj, params);
				}
			}
			Commands->Start_Timer(obj, this, 15.0f, 4);
		}
		else if (timer_id == 5)
		{
			// An officer is trying to play an animation.

			Vector3 playerloc = Commands->Get_Position (STAR);
			Vector3 myloc = Commands->Get_Position(obj);

			float distance = Commands->Get_Distance(myloc, playerloc);

			if ((distance > 10.0f) && (!Commands->Is_Performing_Pathfind_Action(obj)))
			{
				officeranimcounter++;
				if (officeranimcounter > 2)
				{
					officeranimcounter = 0;
				}

				switch (officeranimcounter)
				{
				case (0):
					{
						GameObject *nearsoldier = Commands->Find_Closest_Soldier (myloc, 1.0f, 50.0f);
						if ((nearsoldier) && (nearsoldier != STAR))
						{
							ActionParamsStruct params;
							params.Set_Basic(this, 99, 0);
							Vector3 soldierloc = Commands->Get_Position (nearsoldier);
							params.Set_Animation ("H_A_J18C", false);
							params.Set_Face_Location (soldierloc, 4.0f);
							Commands->Action_Play_Animation (obj, params);
						}
						break;
					}
				case (1):
					{
						if (STAR)
						{
							ActionParamsStruct params;
							params.Set_Basic(this, 99, 0);
							params.Set_Animation ("H_A_J23C", false);
							params.Set_Face_Location (playerloc, 4.0f);
							Commands->Action_Play_Animation (obj, params);
						}
						break;
					}
				default:
					{
						if (STAR)
						{
							ActionParamsStruct params;
							params.Set_Basic(this, 99, 0);
							params.Set_Animation ("H_A_J27C", false);
							params.Set_Face_Location (playerloc, 4.0f);
							Commands->Action_Play_Animation (obj, params);
						}
						break;
					}
				}
			}
			Commands->Start_Timer(obj, this, 10.0f, 5);
		}
		else if (timer_id == 6)
		{
			Commands->Apply_Damage(obj, 10000.0f, "Blamokiller");
		}
		else if (timer_id == 7)
		{
			if (!enemy_seen)
			{
				// Time to move the chem-warrior. Pick a new location.
				
				Vector3 newloc;
				int rndnum = (Get_Int_Random(0.0f,1.0f) * 5);
				switch (rndnum)
				{
				case (0):
					{
						newloc = Vector3(1301.55f,617.89f,19.66f);
						break;
					}
				case (1):
					{
						newloc = Vector3(1340.65f,655.04f,19.51f);
						break;
					}
				case (2):
					{
						newloc = Vector3(1310.67f,694.74f,19.71f);
						break;
					}
				default:
					{
						newloc = Vector3(1242.26f,646.04f,19.65f);
						break;
					}
				}
				ActionParamsStruct params;
				params.Set_Basic(this, 31, 0);
				params.Set_Movement(newloc, WALK, 10.0f, false);
				Commands->Action_Goto(obj, params);
			}
			else
			{
				Force_Move (obj);
			}
			Commands->Start_Timer(obj, this, 30.0f, 7);
		}
		else if (timer_id == 10)
		{
			Vector3 my_pos = Commands->Get_Position (obj);
			Vector3 star_pos = Commands->Get_Position (STAR);
			float distance = Commands->Get_Distance (my_pos, star_pos);
			if (distance < 20.0f)
			{
				int id = Commands->Create_Conversation ("MX2DSGN_DSGN0014", 100, 300, true);
				Commands->Join_Conversation (NULL, id);
				Commands->Join_Conversation (STAR, id, true, false, false);
				Commands->Start_Conversation (id);
				Commands->Start_Timer (obj, this, 3.0f, 11);
			}
			else
			{
				Commands->Start_Timer (obj, this, 2.0f, 10);
			}
		}
		else if (timer_id == 11)
		{
			int id = Commands->Create_Conversation ("MX2DSGN_DSGN0015", 100, 300, true);
			Commands->Join_Conversation (NULL, id);
			Commands->Join_Conversation (STAR, id, true, false, false);
			Commands->Start_Conversation (id);
		}
	}

	void Force_Move (GameObject* obj)
	{
		if (!Commands->Is_Performing_Pathfind_Action(obj))
		{
			Vector3 mypos = Commands->Get_Position(obj);
			GameObject *starobj = Commands->Get_A_Star (mypos);
			if (starobj)
			{
				ActionParamsStruct params;
				params.Set_Basic(this, 90, 0);
				params.Set_Movement(starobj, RUN, 10.0f, 0);
				params.Set_Attack(starobj, 150.0f, 0.0f, true);
				Commands->Action_Attack(obj, params);
			}
		}
	}

	void Killed (GameObject *obj, GameObject *killer)
	{
		// Tell the respawn controller I am dead.

		int param;
		param = Get_Int_Parameter("Area_Number");
		GameObject * object = Commands->Find_Object(M02_OBJCONTROLLER);

		if (object)
		{
			Commands->Send_Custom_Event(obj, object, 101, param);
		}
		if (param == 3)
		{
			int officer = Get_Int_Parameter("Area_Officer");

			if (officer)
			{
				// If a Medium Tank is needed for A03, drop it.
					
				Commands->Send_Custom_Event (obj, object, 111, 2);
			}
		}
	}

	void Custom (GameObject *obj, int type, int param, GameObject *sender)
	{
		int specific_id = Commands->Get_ID (obj);
		if (specific_id == 400276)
		{
			Commands->Start_Timer (obj, this, 2.0f, 10);
		}

		if ((type == 0) && (param == 0))
		{
			Commands->Innate_Enable (obj);

			// If the unit is a preplaced minigunner, forced movement code is activated for this unit.
			
			int preplaced = Get_Int_Parameter("Pre_Placed");

			if (preplaced == 2)
			{
				int myid = Commands->Get_ID(obj);
				if ((myid != 400512) || (myid != 400513))
				{
					Commands->Start_Timer(obj, this, 1.0f, 3);
				}
			}
			else if (preplaced == 1)
			{
				// Unit is an officer, start the animation timer.

				Commands->Start_Timer(obj, this, 10.0f, 5);
			}
			else if (preplaced == 6)
			{
				// Unit is a chem-warrior, start low priority wandering.

				Commands->Start_Timer(obj, this, 1.0f, 7);
			}
			else if (preplaced == 5)
			{
				int areanum = Get_Int_Parameter("Area_Number");
				if (areanum == 19)
				{
					// Unit is a technician, who plays an animation in front of a terminal.

					ActionParamsStruct params;
					params.Set_Basic(this, 31, 100);
					params.Set_Animation ("H_A_CON2", true);
					Commands->Action_Play_Animation (obj, params);
				}
			}
		}
		if ((type == 99) && (!Commands->Is_Performing_Pathfind_Action(obj)))
		{
			if (param == 214)
			{

				// An Objective or Building is asking to be repaired.

				ActionParamsStruct params;
				params.Set_Basic(this, 71, 214);
				params.Set_Movement(sender, RUN, 10.0f, 0);
				Vector3 senderpos = Commands->Get_Position(sender);
				senderpos.Z -= 1.0f;
				params.Set_Attack(senderpos, 10.0f, 0.0f, false);
				Commands->Action_Attack(obj, params);
			}
			else if (param == 202)
			{
				ActionParamsStruct params;
				params.Set_Basic(this, 50, 214);
				params.Set_Movement(Vector3(1113.61f,877.4f,17.15f), RUN, 10.0f, 0);
				params.Set_Attack(Vector3(1113.61f,877.4f,17.15f), 10.0f, 0.0f, false);
				Commands->Action_Attack(obj, params);
			}
			else if (param == 217)
			{
				ActionParamsStruct params;
				params.Set_Basic(this, 50, 214);
				params.Set_Movement(Vector3(1062.24f,978.38f,-16.85f), RUN, 10.0f, 0);
				params.Set_Attack(Vector3(1062.24f,978.38f,-16.85f), 10.0f, 0.0f, false);
				Commands->Action_Attack(obj, params);
			}
		}
		if (!initial_damage)
		{
			if (type == CUSTOM_EVENT_FALLING_DAMAGE)
			{
				initial_health = Commands->Get_Max_Health(obj);
			}
		}
	}

	void Damaged( GameObject * obj, GameObject *damager, float amount)
	{
		if (!initial_damage && damager == NULL)
		{
			initial_damage = true;
			Commands->Set_Health(obj, initial_health);
		}
	}
};


DECLARE_SCRIPT(M02_Obelisk, "")
{
	bool info_given;

	void Created(GameObject*obj)
	{
		info_given = false;
	}

	void Damaged(GameObject * obj, GameObject * damager, float amount)
	{
		if (Commands->Get_Building_Power (obj))
		{
			// Check if the engineer is alive

			GameObject * obj_engineer = Commands->Find_Object(400200);

			if (obj_engineer)
			{
				// Tell the Engineer to repair the building.

				Commands->Send_Custom_Event (obj, obj_engineer, 99, 202);

				//Actually repair the building.

				float maxhealth = Commands->Get_Max_Health (obj);
				Commands->Set_Health (obj, maxhealth);

				// Announce the returned health as an engineer repairing internally.
				
				if ((!info_given) && (damager == STAR))
				{
					info_given = true;
					Commands->Stop_All_Conversations ();
					int id = Commands->Create_Conversation("M02_EVA_OBELISK_REPAIR", 100, 300, true);
					Commands->Join_Conversation(NULL, id);
					Commands->Join_Conversation (STAR, id, true, false, false);
					Commands->Start_Conversation(id);
				}
			}
		}
	}

	void Killed(GameObject * obj, GameObject * killer)
	{
		if (Commands->Get_Building_Power (obj))
		{
			GameObject * object = Commands->Find_Object(M02_OBJCONTROLLER);

			if (object)
			{
				Commands->Send_Custom_Event(obj, object, 202, 1);
			}
		}
		GameObject * zone = Commands->Find_Object (405116);
		if (zone)
		{
			Commands->Destroy_Object (zone);
		}
		zone = Commands->Find_Object (405117);
		if (zone)
		{
			Commands->Destroy_Object (zone);
		}
	}

	void Custom (GameObject *obj, int type, int param, GameObject *sender)
	{
		if (type == 1)
		{
			info_given = true;
		}
	}
};


DECLARE_SCRIPT (M02_Power_Plant, "")
{
	bool info_given;

	void Created(GameObject*obj)
	{
		info_given = false;
	}

	void Damaged(GameObject * obj, GameObject * damager, float amount)
	{
		// Check if the engineer is alive

		GameObject * obj_engineer = Commands->Find_Object(400199);

		if (obj_engineer)
		{
			// Tell the Engineer to repair the building.

			Commands->Send_Custom_Event (obj, obj_engineer, 99, 217);

			//Actually repair the building.

			float maxhealth = Commands->Get_Max_Health (obj);
			Commands->Set_Health (obj, maxhealth);

			// Announce the returned health as an engineer repairing internally.

			if ((!info_given) && (damager == STAR))
			{
				info_given = true;
				Commands->Stop_All_Conversations ();
				int id = Commands->Create_Conversation("M02_EVA_POWER_REPAIR", 100, 300, true);
				Commands->Join_Conversation(NULL, id);
				Commands->Join_Conversation (STAR, id, true, false, false);
				Commands->Start_Conversation(id);
			}
		}
	}

	void Killed(GameObject * obj, GameObject * killer)
	{
		GameObject * object = Commands->Find_Object(M02_OBJCONTROLLER);

		if (object)
		{
			Commands->Send_Custom_Event(obj, object, 217, 1);
			Commands->Send_Custom_Event(obj, object, 202, 1);
		}

		GameObject * obelisk = Commands->Find_Object(1153845);
		
		if (obelisk)
		{
			Commands->Set_Building_Power(obelisk, false);
		}

		GameObject * zone = Commands->Find_Object (405116);
		if (zone)
		{
			Commands->Destroy_Object (zone);
		}
		zone = Commands->Find_Object (405117);
		if (zone)
		{
			Commands->Destroy_Object (zone);
		}

		GameObject * hand_of_nod = Commands->Find_Object(1157690);

		if (hand_of_nod)
		{
			Commands->Set_Building_Power(hand_of_nod, false);
		}
	}

	void Custom (GameObject *obj, int type, int param, GameObject *sender)
	{
		if (type == 1)
		{
			info_given = true;
		}
	}
};


DECLARE_SCRIPT (M02_Dam_MCT, "")
{
	bool destroyed;

	REGISTER_VARIABLES()
	{
		SAVE_VARIABLE (destroyed, 1);
	}

	void Created (GameObject * obj)
	{
		destroyed = false;
	}

	void Damaged (GameObject * obj, GameObject * damager, float amount)
	{
		float health = Commands->Get_Health(obj);
		if (health < 1.0f)
		{
			Commands->Set_Health (obj, 0.1f);
			if (!destroyed)
			{
				destroyed = true;
				GameObject * object = Commands->Find_Object(M02_OBJCONTROLLER);
				if (object)
				{
					Commands->Send_Custom_Event(obj, object, 203, 1);
					Commands->Grant_Key (STAR, 6, true);
				}
				Commands->Set_Animation_Frame (obj, "MCT_NOD.MCT_NOD", 7);
			}
		}
	}
};


DECLARE_SCRIPT (M02_Helipad, "")
{
	void Killed(GameObject *obj, GameObject *killer)
	{
		GameObject * object = Commands->Find_Object(M02_OBJCONTROLLER);

		if (object)
		{
			Commands->Send_Custom_Event(obj, object, 206, 1);
		}
	}
};


DECLARE_SCRIPT (M02_Destroy_Objective, "Objective_ID:int")
{
	void Killed(GameObject *obj, GameObject *killer)
	{
		int objective_id;
		objective_id = Get_Int_Parameter ("Objective_ID");
		GameObject * object = Commands->Find_Object(M02_OBJCONTROLLER);

		if (object)
		{
			if (objective_id != 222)
			{
				Commands->Send_Custom_Event(obj, object, objective_id, 1);
			}

			// Special case items, mission is solved by above line!

			if (objective_id == 212)
			{
				// Drop powerups into A03.

				Commands->Send_Custom_Event(obj, object, 113, 3);
			}
			else if (objective_id == 214)
			{
				GameObject * chinook_obj1 = Commands->Create_Object("Invisible_Object", Vector3(580.37f,889.69f,-0.57f));

				if (chinook_obj1)
				{
					Commands->Set_Facing(chinook_obj1, -180.0f);
					Commands->Attach_Script(chinook_obj1, "Test_Cinematic", "X2I_GDI_Drop02_Rocket_24.txt");
				}
			}
			else if ((objective_id == 215) || (objective_id == 216))
			{
				// Send a custom to the controller to count destroyed SAMs on the bridge.

				Commands->Send_Custom_Event(obj, object, 115, 0);
			}
			else if (objective_id == 204)
			{
				// Hand of Nod destroyed, turn off respawns in the area.

				Commands->Send_Custom_Event(obj, object, 105, 21);
			}
			else if (objective_id == 222)
			{
				// Send a custom to the controller to count destroyed Tiberium Silos.

				Commands->Send_Custom_Event(obj, object, 116, 0);
			}
		}
	}

	void Damaged(GameObject *obj, GameObject *damager, float amount)
	{
		int objective_id;
		objective_id = Get_Int_Parameter ("Objective_ID");
		if (objective_id == 214)
		{
			GameObject* engineer = Commands->Find_Object(400510);
			if (engineer)
			{
				Commands->Send_Custom_Event(obj, engineer, 99, 214);
			}
		}
	}
};


DECLARE_SCRIPT (M02_Nod_Convoy_Truck, "")
{
	void Killed(GameObject *obj, GameObject *killer)
	{
		GameObject * object = Commands->Find_Object(M02_OBJCONTROLLER);

		if (object)
		{
			// Tell the controller to subtract a truck.

			Commands->Send_Custom_Event(obj, object, 900, 3);

			// Create an explosion here.

			Vector3 myloc;
			myloc = Commands->Get_Position(obj);
		}
	}
};


// SOLDIER TYPE PARAMETERS FOR GDI
// 1 = Rocket Soldier
// 2 = Minigunner Officer
// 3 = Minigunner Enlisted
// 4 = Grenadier Enlisted

DECLARE_SCRIPT (M02_GDI_Soldier, "Area_ID:int, Soldier_Type=0:int")
{
	bool stop_following;
	bool said_message;
	int shout_count;

	REGISTER_VARIABLES()
	{
		SAVE_VARIABLE (stop_following, 1);
		SAVE_VARIABLE (said_message, 2);
		SAVE_VARIABLE (shout_count, 3);
	}

	void Created(GameObject* obj)
	{
		Commands->Enable_Hibernation(obj, false);
		stop_following = false;
		said_message = false;
		shout_count = 0;

		// Special case checks for preplaced soldiers.
		
		int area_id = Get_Int_Parameter("Area_ID");

		if (area_id == 1)
		{
			Commands->Innate_Disable (obj);
			int soldier_type = Get_Int_Parameter ("Soldier_Type");
			if (soldier_type == 2)
			{
				Commands->Start_Timer(obj, this, 10.0f, 2);
			}
		}
		else
		{
			// Default spawned following unit - Give orders to stay near the commando on a timer.

			Commands->Start_Timer(obj, this, 1.0f, 1);
		}
	}

	void Timer_Expired(GameObject * obj, int timer_id)
	{
		if (timer_id == 1)
		{
			int area_id = Get_Int_Parameter("Area_ID");
			if (area_id == 9)
			{
				// GDI soldiers in A09 Dam Top rush the Obelisk and die.

				GameObject * obelisk = Commands->Find_Object(1153845);
				
				if (obelisk)
				{
					bool power = Commands->Get_Building_Power (obelisk);
					if (power)
					{
						ActionParamsStruct params;
						params.Set_Basic(this, 71, 0);
						params.Set_Movement(Vector3(1105.78f,897.75f,35.05f), 1.0f, 20.0f, 0);
						Commands->Action_Goto(obj, params);
					}
				}
			}
			else if (!stop_following)
			{
				// Follow the commando. Start this check timer again.

				Vector3 mypos = Commands->Get_Position(obj);
				GameObject *starobj = Commands->Get_A_Star (mypos);
				if (starobj)
				{
					ActionParamsStruct params;
					params.Set_Basic(this, 71, 1);
					params.Set_Movement(starobj, 1.0f, 20.0f, 0);
					Commands->Action_Goto(obj, params);
				}
				else
				{
					stop_following = true;
				}
			}
			Commands->Start_Timer(obj, this, 10.0f, 1);
		}
		else if (timer_id == 2)
		{
			if(!said_message)
			{
				Vector3 mypos = Commands->Get_Position (obj);
				Vector3 starpos = Commands->Get_Position (STAR);
				float distance = Commands->Get_Distance (mypos, starpos);
				if (distance < 30.0f)
				{
					switch (shout_count)
					{
					case (0):
						{
							int id = Commands->Create_Conversation("M02_GOMG_RADIO_01", 99, 20, true);
							Commands->Join_Conversation (obj, id, true, true, true);
							Commands->Start_Conversation(id);
							shout_count++;
							break;
						}
					case (1):
						{
							int id = Commands->Create_Conversation("M02_GOMG_RADIO_02", 99, 20, true);
							Commands->Join_Conversation (obj, id, true, true, true);
							Commands->Start_Conversation(id);
							shout_count++;
							break;
						}
					case (2):
						{
							int id = Commands->Create_Conversation("M02_GOMG_RADIO_03", 99, 20, true);
							Commands->Join_Conversation (obj, id, true, true, true);
							Commands->Start_Conversation(id);
							shout_count++;
							break;
						}
					default:
						{
							break;
						}
					}
				}
				Commands->Start_Timer(obj, this, 10.0f, 2);
			}
		}
	}

	void Poked (GameObject * obj, GameObject * poker)
	{
		int soldier_type = Get_Int_Parameter ("Soldier_Type");
		if ((soldier_type == 2) && (!said_message))
		{
			said_message = true;
			int id = Commands->Create_Conversation("M02_GOMG_CONVERSATION", 99, 10, true);
			Commands->Join_Conversation (obj, id, true, true, true);
			Commands->Join_Conversation(STAR, id, true, true, false);
			Commands->Start_Conversation(id);
		}
	}

	void Sound_Heard (GameObject * obj, const CombatSound & sound)
	{
		if ((sound.Type > 1099) && (sound.Type < 1199))
		{
			// Make sure this is the sound this unit is supposed to react to.

			int area_id = Get_Int_Parameter("Area_ID");
			if ((sound.Type - 1100) == area_id)
			{
				stop_following = true;
				switch (area_id)
				{
				case (0):
					{
						Commands->Action_Reset (obj, 100);
						break;
					}
				case (2):
					{
						Vector3 house_loc = Vector3(648.77f,300.74f,-59.99f);
						ActionParamsStruct params;
						params.Set_Basic(this, 81, 0);
						params.Set_Movement(house_loc, WALK, 1.0f, 0);
						Commands->Action_Goto(obj, params);
						break;
					}
				}
			}
		}
	}

	void Custom (GameObject *obj, int type, int param, GameObject *sender)
	{
		if ((type == 0) && (param == 0))
		{
			// A zone is trying to enable actions for this soldier.

			Commands->Innate_Enable (obj);
		}
	}

	void Killed (GameObject * obj, GameObject * killer)
	{
		int area_id = Get_Int_Parameter("Area_ID");
		if (area_id == 0)
		{
			GameObject * controller = Commands->Find_Object (M02_OBJCONTROLLER);
			if (controller)
			{
				Commands->Send_Custom_Event (obj, controller, 1000, 1000);
			}
		}
		else if (area_id == 9)
		{
			GameObject * controller = Commands->Find_Object (M02_OBJCONTROLLER);
			if (controller)
			{
				Commands->Send_Custom_Event (obj, controller, 1000, 1001);
			}
		}
	}

	void Action_Complete (GameObject * obj, int action_id, ActionCompleteReason complete_reason)
	{
		if ((action_id == 1) && (complete_reason == ACTION_COMPLETE_NORMAL))
		{
			if (!said_message)
			{
				said_message = true;

				int soldier_type = Get_Int_Parameter ("Soldier_Type");

				switch (soldier_type)
				{
				case (1): // Rocket Soldier
					{
						int id = Commands->Create_Conversation("M02_GERS_COVER_01", 99, 50, true);
						Commands->Join_Conversation (obj, id, true, true, false);
						Commands->Join_Conversation(STAR, id, true, true, false);
						Commands->Start_Conversation(id);
						break;
					}
				case (4): // Grenadier
					{
						int id = Commands->Create_Conversation("M02_GEGR_COVER_01", 99, 50, true);
						Commands->Join_Conversation (obj, id, true, true, false);
						Commands->Join_Conversation(STAR, id, true, true, false);
						Commands->Start_Conversation(id);
						break;
					}
				default:
					{
						break;
					}
				}
			}
		}
	}
};


DECLARE_SCRIPT (M02_Stationary_Vehicle,"Area_ID:int")
{
	void Created (GameObject* obj)
	{
		int area_id;
		area_id = Get_Int_Parameter("Area_ID");

		// Area One is a conflict area, other stationary vehicles in conflict areas must be paused as well

		Commands->Enable_Enemy_Seen (obj, false);

		if (area_id == 99)
		{
			Commands->Innate_Disable (obj);
			Commands->Start_Timer (obj, this, 5.33f, 1);
		}
	}

	void Killed (GameObject * obj, GameObject * killer)
	{
		int area_id = Get_Int_Parameter ("Area_ID");
		int my_id = Commands->Get_ID (obj);
		if (area_id == 2)
		{
			if (my_id == 401016)
			{
				int id = Commands->Create_Conversation ("MX2DSGN_DSGN0008", 100, 300, true);
				Commands->Join_Conversation (NULL, id);
				Commands->Join_Conversation (STAR, id, true, false, false);
				Commands->Start_Conversation (id);
			}
			else if (my_id == 401167)
			{
				GameObject * tank = Commands->Find_Object (401016);
				if (tank)
				{
					int id = Commands->Create_Conversation ("MX2DSGN_DSGN0007", 100, 300, true);
					Commands->Join_Conversation (tank, id);
					Commands->Join_Conversation (STAR, id, true, false, false);
					Commands->Start_Conversation (id);
				}
			}
		}
	}

	void Enemy_Seen (GameObject * obj, GameObject * enemy)
	{
		int area_id;
		area_id = Get_Int_Parameter("Area_ID");
		if (area_id != 99)
		{
			ActionParamsStruct params;
			params.Set_Basic(this, 90, 0);
			params.Set_Attack(enemy, 300.0f, 0.0f, true);
			params.AttackCheckBlocked = false;
			Commands->Action_Attack(obj, params);
			Commands->Start_Timer(obj, this, 5.0f, 2);
		}
	}

	void Sound_Heard (GameObject * obj, const CombatSound & sound)
	{
		// If an objective shouts, respond to it, letting it know the area is not cleared.

		if (sound.Type == 1000)
		{
			if (sound.Creator)
			{
				int	player_type = Commands->Get_Player_Type (obj);
				if (player_type == SCRIPT_PLAYERTYPE_NOD)
				{
					Commands->Send_Custom_Event(obj, sound.Creator, 100, 1);
				}
			}
		}
	}

	void Custom (GameObject *obj, int type, int param, GameObject *sender)
	{
		if ((type == 0) && (param == 0))
		{
			// A zone is trying to enable actions for this vehicle.

			Commands->Enable_Enemy_Seen (obj, true);
		}
	}

	void Timer_Expired(GameObject * obj, int timer_id)
	{
		if (timer_id == 1)
		{
			Commands->Apply_Damage (obj, 10000.0f, "Blamokiller");
		}
		else if (timer_id == 2)
		{
			Commands->Action_Reset (obj, 100);
		}
	}
};


DECLARE_SCRIPT (M02_Nod_Apache, "Area_ID:int")
{
	int waypath_id;

	REGISTER_VARIABLES()
	{
		SAVE_VARIABLE( waypath_id, 1);
	}

	void Created (GameObject* obj)
	{
		int area_id = Get_Int_Parameter("Area_ID");
		float timer_len = 1.0f;

		//First waypath means area for looping Apaches, it is set when timer expires, and then uses real IDs.
		
		switch (area_id)
		{
		case (0):
			{
				waypath_id = 0;
				timer_len = 8.0f;
				break;
			}
		case (15):
			{
				waypath_id = 1;
				timer_len = 15.0f;
				break;
			}
		case (24):
			{
				waypath_id = 24;
				break;
			}
		}

		Commands->Enable_Engine(obj, true);
		Commands->Disable_Physical_Collisions(obj);
		Commands->Start_Timer(obj, this, timer_len, 1);
		Commands->Start_Timer(obj, this, 15.0f, 3);
	}

	void Timer_Expired(GameObject * obj, int timer_id)
	{
		if (timer_id == 1)
		{
			// Delayed initial action.

			switch (waypath_id)
			{
			case (0): // Area 0 Apache delay timer expired, start movement
				{
					waypath_id = 400296;
					break;
				}
			case (1): // Area 15 Apache delay timer expired, start movement.
				{
					waypath_id = 401169;
					break;
				}
			case (24):
				{
					waypath_id = 400544;
					break;
				}
			case (400296):
				{
					waypath_id = 400304;
					break;
				}
			case (400304):
				{
					waypath_id = 400310;
					break;
				}
			case (400310):
				{
					waypath_id = 400304;
					break;
				}
			case (400544):
				{
					waypath_id = -1;
					break;
				}
			case (401169):
				{
					waypath_id = 401173;
					break;
				}
			case (401173):
				{
					waypath_id = 401180;
					break;
				}
			case (401180):
				{
					waypath_id = 401173;
					break;
				}
			}
			if (waypath_id != -1)
			{
				ActionParamsStruct params;
				params.Set_Basic(this, 90, 0);
				params.Set_Movement(Vector3(0,0,0), 0.2 + (0.1 * DIFFICULTY), 5.0f);
				params.WaypathID = waypath_id;
				params.WaypathSplined = true;
				params.MovePathfind = false;
				params.Set_Attack(STAR, 200.0f, 0.0f, true);
				params.AttackCheckBlocked = false;
				params.AttackActive = false;
				Commands->Action_Attack(obj, params);
			}
			Commands->Start_Timer(obj, this, 5.0f, 2);
		}
		else if (timer_id == 2)
		{
			// Time to start firing, and move again in a second.

			Vector3 myloc = Commands->Get_Position(obj);

			ActionParamsStruct params;
			params.Set_Basic(this, 90, 0);
			params.Set_Movement(myloc, 0.0, 5.0f);
			params.MovePathfind = false;
			params.Set_Attack(STAR, 200.0f, 0.0f, true);
			params.AttackCheckBlocked = false;
			params.AttackActive = true;
			Commands->Action_Attack(obj, params);
			Commands->Start_Timer(obj, this, 5.0f, 1);
		}
		else if (timer_id == 3)
		{
			// Cleanup code - find the nearest star, check distance.

			float distance;
			Vector3 myloc;
			Vector3 starloc;
			myloc = Commands->Get_Position(obj);
			GameObject *star_obj = Commands->Get_A_Star(myloc);
			if (star_obj)
			{
				starloc = Commands->Get_Position(star_obj);
				distance = Commands->Get_Distance (myloc, starloc);
				if (distance > 300.0f)
				{
					Commands->Apply_Damage(obj, 10000.0f, "Blamokiller");
				}
			}
			Commands->Start_Timer(obj, this, 15.0f, 3);
		}
	}

	// If an objective shouts, respond to it, letting it know the area is not cleared.

	void Sound_Heard (GameObject * obj, const CombatSound & sound)
	{
		if (sound.Type == 1000)
		{
			if (sound.Creator)
			{
				Commands->Send_Custom_Event(obj, sound.Creator, 100, 1);
			}
		}
	}
};


DECLARE_SCRIPT (M02_Nod_Vehicle, "Area_ID:int")
{
	void Created (GameObject* obj)
	{
		Commands->Enable_Enemy_Seen (obj, true);
		Commands->Enable_Engine(obj, true);

		// Get my area id and determine what I need to to immediately.

		int area_id = Get_Int_Parameter("Area_ID");

		switch (area_id)
		{
		case (2):
			{
				ActionParamsStruct params;
				params.Set_Basic(this, 98, 0);
				params.Set_Movement(Vector3(0,0,0), 1.0f, 5.0f);
				params.WaypathID = 400375;
				params.WaypathSplined = false;
				params.Set_Attack(STAR, 300.0f, 0.0f, true);
				Commands->Action_Attack(obj, params);
				break;
			}
		case (3):
			{
				ActionParamsStruct params;
				params.Set_Basic(this, 98, 0);
				params.Set_Movement(Vector3(0,0,0), 1.0f, 5.0f);
				params.WaypathID = 400416;
				params.WaypathSplined = false;
				params.Set_Attack(STAR, 300.0f, 0.0f, true);
				Commands->Action_Attack(obj, params);
				break;
			}
		case (4):
			{
				ActionParamsStruct params;
				params.Set_Basic(this, 98, 0);
				params.Set_Movement(Vector3(0,0,0), 1.0f, 5.0f);
				params.WaypathID = 400454;
				params.WaypathSplined = false;
				params.Set_Attack(STAR, 300.0f, 0.0f, true);
				Commands->Action_Attack(obj, params);
				break;
			}
		}
		Commands->Start_Timer(obj, this, 15.0f, 1);
	}

	// If an objective shouts, respond to it, letting it know the area is not cleared.

	void Sound_Heard (GameObject * obj, const CombatSound & sound)
	{
		if (sound.Type == 1000)
		{
			if (sound.Creator)
			{
				Commands->Send_Custom_Event(obj, sound.Creator, 100, 1);
			}
		}
	}

	void Timer_Expired(GameObject * obj, int timer_id)
	{
		if (timer_id == 1)
		{
			// Cleanup code - find the nearest star, check distance, then check visibility

			float distance;
			Vector3 myloc;
			Vector3 starloc;
			myloc = Commands->Get_Position(obj);
			GameObject *star_obj = Commands->Get_A_Star(myloc);
			if (star_obj)
			{
				starloc = Commands->Get_Position(star_obj);
				distance = Commands->Get_Distance (myloc, starloc);
				if (distance > 300.0f)
				{
					Commands->Apply_Damage(obj, 10000.0f, "Blamokiller");
				}
			}
			Commands->Start_Timer(obj, this, 15.0f, 1);
		}
	}
};


DECLARE_SCRIPT (M02_Player_Vehicle, "Area_ID:int")
{
	bool entered_me;

	REGISTER_VARIABLES()
	{
		SAVE_VARIABLE(entered_me, 1);
	}

	void Created (GameObject* obj)
	{
		entered_me = false;
		Commands->Enable_Vehicle_Transitions (obj, true);
		Commands->Set_Player_Type (obj, SCRIPT_PLAYERTYPE_NEUTRAL);
		Commands->Start_Timer(obj, this, 15.0f, 1);
		int unitid = Commands->Get_ID (obj);
		Send_Custom_To_SAM_Sites (obj, M00_CUSTOM_SAM_SITE_IGNORE, unitid);
	}

	void Timer_Expired(GameObject * obj, int timer_id)
	{
		if (timer_id == 1)
		{
			// Check if this vehicle needs to be removed.

			Vector3 myloc = Commands->Get_Position(obj);
			GameObject *star_obj = Commands->Get_A_Star(myloc);

			if (star_obj)
			{
				Vector3 starloc = Commands->Get_Position(star_obj);
				float distance = Commands->Get_Distance (myloc, starloc);

				if (distance > 300.0f)
				{
					Commands->Apply_Damage(obj, 10000.0f, "Blamokiller");
				}
			}
			Commands->Start_Timer(obj, this, 15.0f, 1);
		}
	}

	void Destroyed (GameObject* obj)
	{
		int area_id = Get_Int_Parameter ("Area_ID");
		GameObject* controller = Commands->Find_Object(M02_OBJCONTROLLER);
		if (controller)
		{
			Commands->Send_Custom_Event(obj, controller, 112, area_id);
		}
		if ((area_id == 2) && (!entered_me))
		{
			Commands->Send_Custom_Event(obj, controller, 221, 2);
		}
	}

	void Custom(GameObject * obj, int type, int param, GameObject * sender)
	{
		if (type == CUSTOM_EVENT_VEHICLE_ENTERED)
		{
			int area_id = Get_Int_Parameter ("Area_ID");
			if ((area_id == 2) && (!entered_me))
			{
				entered_me = true;
				GameObject* controller = Commands->Find_Object(M02_OBJCONTROLLER);
				if (controller)
				{
					Commands->Send_Custom_Event(obj, controller, 221, 1);
				}
			}
		}
	}
};


DECLARE_SCRIPT (M02_Nod_Sakura, "Area_ID:int")
{
	bool onmywayout;

	REGISTER_VARIABLES()
	{
		SAVE_VARIABLE(onmywayout, 1);
	}

	void Created (GameObject* obj)
	{
		onmywayout = false;
		int waypath_id = 400397;

		Commands->Enable_Enemy_Seen (obj, true);
		Commands->Enable_Engine(obj, true);
		Commands->Disable_Physical_Collisions(obj);

		ActionParamsStruct params;
		params.Set_Basic(this, 91, 0);
		params.Set_Movement(Vector3(0,0,0), 2.5f, 1.0f);
		params.WaypathID = waypath_id;
		params.WaypathSplined = true;
		params.Set_Attack(STAR, 200.0f, 0.0f, true);
		Commands->Action_Goto(obj, params);

		Commands->Start_Timer(obj, this, 15.0f, 1);
		Commands->Start_Timer(obj, this, 10.0f, 3);
	}

	void Enemy_Seen (GameObject * obj, GameObject * enemy)
	{
		ActionParamsStruct params;
		params.Set_Basic(this, 92, 2);
		params.AttackCheckBlocked = false;
		params.Set_Attack(enemy, 300.0f, 0.0f, true);
		Commands->Action_Attack(obj, params);
	}

	void Timer_Expired(GameObject * obj, int timer_id)
	{
		if (timer_id == 1)
		{
			// Cleanup code - find the nearest star, check distance, then check visibility

			float distance;
			Vector3 myloc;
			Vector3 starloc;
			myloc = Commands->Get_Position(obj);
			GameObject *star_obj = Commands->Get_A_Star(myloc);
			if (star_obj)
			{
				starloc = Commands->Get_Position(star_obj);
				distance = Commands->Get_Distance (myloc, starloc);
				if (distance > 300.0f)
				{
					Commands->Apply_Damage(obj, 10000.0f, "Blamokiller");
				}
			}
			Commands->Start_Timer(obj, this, 15.0f, 1);
		}
		else if (timer_id == 2)
		{
			Commands->Destroy_Object (obj);
		}
		else if (timer_id == 3)
		{
			Vector3 myloc = Commands->Get_Position(obj);
			ActionParamsStruct params;
			params.Set_Basic(this, 93, 1);
			params.Set_Movement(myloc, 0.0, 5.0f);
			params.Set_Attack(STAR, 200.0f, 0.0f, true);
			params.AttackActive = true;
			Commands->Action_Attack(obj, params);
		}
	}

	// If an objective shouts, respond to it, letting it know the area is not cleared.

	void Sound_Heard (GameObject * obj, const CombatSound & sound)
	{
		if (sound.Type == 1000)
		{
			if (sound.Creator)
			{
				Commands->Send_Custom_Event(obj, sound.Creator, 100, 1);
			}
		}
	}
};


// This script handles approach vehicles.

DECLARE_SCRIPT (M02_Approach_Vehicle, "Area_ID:int")
{
	void Custom(GameObject * obj, int type, int param, GameObject * sender)
	{
		if ((type == 0) && (param == 0))
		{
			Commands->Enable_Engine (obj, true);

			// Unit is being activated. Determine waypath and follow it.
			
			int area_id = Get_Int_Parameter("Area_ID");
			ActionParamsStruct params;
			params.Set_Basic(this, 100, 0);
			params.Set_Movement(Vector3(0,0,0), 1.0f, 1.0f);

			switch (area_id)
			{
			case (1):
				{
					params.WaypathID = 401009;
					break;
				}
			case (4):
				{
					params.WaypathID = 401031;
					break;
				}
			case (6):
				{
					params.WaypathID = 401039;
					break;
				}
			}
			Commands->Action_Goto(obj, params);
			Commands->Start_Timer(obj, this, 6.0f, 0);
		}
	}

	void Timer_Expired(GameObject * obj, int timer_id)
	{
		Commands->Apply_Damage(obj, 10000.0f, "Blamokiller");
	}
};


// This script is currently only used for an Orca above a SAM Site objective, in A03.

DECLARE_SCRIPT (M02_Destroy_Vehicle, "")
{
	void Created (GameObject* obj)
	{
		Commands->Enable_Engine(obj, true);
		Commands->Disable_Physical_Collisions(obj);
		Commands->Start_Timer(obj, this, 4.0f, 1);
	}

	void Timer_Expired(GameObject * obj, int timer_id)
	{
		if (timer_id == 1)
		{
			ActionParamsStruct params;
			params.Set_Basic(this, 99, 0);
			params.Set_Movement(Vector3(0,0,0), 2.5f, 1.0f);
			params.WaypathID = 400993;
			params.WaypathSplined = true;
			Commands->Action_Goto(obj, params);
			Commands->Start_Timer(obj, this, 20.0f, 2);
		}
		else if (timer_id == 2)
		{
			Commands->Apply_Damage(obj, 10000.0f, "Blamokiller");
		}
	}

	void Damaged (GameObject* obj, GameObject* damager, float amount)
	{
		if (damager != STAR)
		{
			Commands->Apply_Damage(obj, 10000.0f, "Blamokiller");
		}
	}

	void Enemy_Seen (GameObject * obj, GameObject * enemy)
	{
		ActionParamsStruct params;
		params.Set_Basic(this, 90, 1);
		params.Set_Attack(enemy, 200.0f, 0.0f, true);
		params.AttackActive = true;
		Commands->Action_Attack(obj, params);
	}
};


DECLARE_SCRIPT (M02_Mendoza, "")
{
	bool calling_extraction;
	bool move_toggle;
	float start_health;
	float last_armor;
	int counter;

	REGISTER_VARIABLES()
	{
		SAVE_VARIABLE (calling_extraction, 1);
		SAVE_VARIABLE (start_health, 2);
		SAVE_VARIABLE (last_armor, 3);
		SAVE_VARIABLE (counter, 4);
		SAVE_VARIABLE (move_toggle, 5);
	}

	void Created (GameObject * obj)
	{
		start_health = Commands->Get_Health (obj);
		last_armor = Commands->Get_Shield_Strength (obj);
		calling_extraction = false;
		move_toggle = false;
		counter = 0;

		Commands->Innate_Disable (obj);

		ActionParamsStruct params;
		params.Set_Basic (this, 98, 3);
		params.Set_Attack (STAR, 300.0f, 0.0f, true);
		Commands->Action_Attack(obj, params);

		Commands->Start_Timer (obj, this, 2.0f, 1);
	}

	void Damaged (GameObject * obj, GameObject * damager, float amount)
	{
		Commands->Set_Health (obj, start_health);
		last_armor -= 2.0f;
		Commands->Set_Shield_Strength (obj, last_armor);

		if (last_armor < 1.0f)
		{
			if (!calling_extraction)
			{
				calling_extraction = true;
				ActionParamsStruct params;
				params.Set_Basic(this, 100, 1);
				params.Set_Movement(Vector3(1260.007f,535.460f,18.428f), RUN, 5.0f);
				Commands->Action_Goto(obj, params);
			}
		}
	}

	void Action_Complete (GameObject * obj, int action_id, ActionCompleteReason complete_reason)
	{
		if (action_id == 1)
		{
			Commands->Innate_Disable (obj);
			Vector3 my_location = Commands->Get_Position (obj);
			GameObject * chinook_obj1 = Commands->Create_Object("Invisible_Object", my_location);

			if (chinook_obj1)
			{
				Commands->Attach_Script(chinook_obj1, "Test_Cinematic", "XG_ROPE_EVAC_F.txt");
				int id = Commands->Create_Conversation ("MX2DSGN_DSGN0025", 100, 300, true);
				Commands->Join_Conversation (obj, id, true, false, false);
				Commands->Join_Conversation (STAR, id, true, false, false);
				Commands->Join_Conversation (NULL, id);
				Commands->Start_Conversation (id);
			}
		}
		else if (action_id == 2)
		{
			ActionParamsStruct params;
			params.Set_Basic (this, 98, 3);
			params.Set_Attack (STAR, 300.0f, 0.0f, true);
			Commands->Action_Attack(obj, params);
		}
	}

	void Timer_Expired (GameObject * obj, int timer_id)
	{
		if ((timer_id == 1) && (!calling_extraction))
		{
			int id = Commands->Create_Conversation ("MX2DSGN_DSGN0019", 100, 300, true);

			counter++;
			if (counter > 6)
			{
				counter = 1;
			}

			switch (counter)
			{
			case (1):
				{
					id = Commands->Create_Conversation ("MX2DSGN_DSGN0019", 100, 300, true);
					break;
				}
			case (2):
				{
					id = Commands->Create_Conversation ("MX2DSGN_DSGN0020", 100, 300, true);
					break;
				}
			case (3):
				{
					id = Commands->Create_Conversation ("MX2DSGN_DSGN0021", 100, 300, true);
					break;
				}
			case (4):
				{
					id = Commands->Create_Conversation ("MX2DSGN_DSGN0022", 100, 300, true);
					break;
				}
			case (5):
				{
					id = Commands->Create_Conversation ("MX2DSGN_DSGN0023", 100, 300, true);
					break;
				}
			case (6):
				{
					id = Commands->Create_Conversation ("MX2DSGN_DSGN0024", 100, 300, true);
					break;
				}
			default:
				{
					id = Commands->Create_Conversation ("MX2DSGN_DSGN0024", 100, 300, true);
					break;
				}
			}
			Commands->Join_Conversation (obj, id, true, false, false);
			Commands->Join_Conversation (STAR, id, true, false, false);
			Commands->Start_Conversation (id);
			Commands->Start_Timer (obj, this, 7.0f, 1);

			if (!move_toggle)
			{
				move_toggle = true;
				Commands->Action_Reset (obj, 100);
				ActionParamsStruct params;
				params.Set_Basic(this, 99, 2);
				switch (Get_Int_Random (0,3))
				{
				case (0):
					{
						params.Set_Movement(Vector3(1248.592f,568.431f,17.396f), RUN, 5.0f);
						break;
					}
				case (1):
					{
						params.Set_Movement(Vector3(1264.680f,564.459f,17.816f), RUN, 5.0f);
						break;
					}
				case (2):
					{
						params.Set_Movement(Vector3(1270.220f,541.406f,17.978f), RUN, 5.0f);
						break;
					}
				case (3):
					{
						params.Set_Movement(Vector3(1251.213f,544.658f,17.854f), RUN, 5.0f);
						break;
					}
				default:
					{
						params.Set_Movement(Vector3(1260.007f,535.460f,18.428f), RUN, 5.0f);
						break;
					}
				}
				Commands->Action_Goto(obj, params);
			}
			else
			{
				move_toggle = false;
			}
		}
	}
};


DECLARE_SCRIPT (M02_Nod_Jet, "")
{
	void Created (GameObject * obj)
	{
		Commands->Enable_Engine (obj, true);
		Commands->Disable_Physical_Collisions (obj);
		ActionParamsStruct params;
		params.MovePathfind = false;
		params.Set_Basic(this, 100, 1);
		params.Set_Movement(Vector3(1143.09f,702.08f,70.5f), 4.0f, 5.0f);
		Commands->Action_Goto(obj, params);
	}

	void Action_Complete (GameObject * obj, int action_id, ActionCompleteReason complete_reason)
	{
		if (action_id == 1)
		{
			Commands->Destroy_Object (obj);
		}
	}
};


DECLARE_SCRIPT (M02_Nod_Jet_Waypath, "")
{
	void Created (GameObject * obj)
	{
		Commands->Enable_Engine (obj, true);
		Commands->Disable_Physical_Collisions (obj);
		ActionParamsStruct params;
		params.Set_Basic(this, 100, 1);
		params.Set_Movement(Vector3(0,0,0), 4.0f, 5.0f);
		params.WaypathID = 403389;
		params.WaypathSplined = true;
		Commands->Action_Goto(obj, params);
	}

	void Action_Complete (GameObject * obj, int action_id, ActionCompleteReason complete_reason)
	{
		if (action_id == 1)
		{
			Commands->Destroy_Object (obj);
		}
	}
};


DECLARE_SCRIPT (M02_GDI_Helicopter, "")
{
	void Created (GameObject * obj)
	{
		Commands->Enable_Engine (obj, true);
		Commands->Disable_Physical_Collisions (obj);
		ActionParamsStruct params;
		params.Set_Basic(this, 100, 1);
		params.Set_Movement(Vector3(-246.87f,17.42f,100.75f), 1.0f, 5.0f);
		Commands->Action_Goto(obj, params);
	}

	void Action_Complete (GameObject * obj, int action_id, ActionCompleteReason complete_reason)
	{
		if (action_id == 1)
		{
			Commands->Destroy_Object (obj);
		}
	}
};


DECLARE_SCRIPT (M02_Commando_Start, "")
{
	void Created (GameObject * obj)
	{
		Commands->Give_PowerUp (obj, "POW_MineRemote_Player", false);
		Commands->Give_PowerUp (obj, "POW_Chaingun_Player", false);
		Commands->Give_PowerUp (obj, "POW_SniperRifle_Player", false);
	}
};


DECLARE_SCRIPT (M02_Data_Disk, "Disk_ID:int")
{
	void Custom (GameObject * obj, int type, int param, GameObject * sender)
	{
		if (type == CUSTOM_EVENT_POWERUP_GRANTED) 
		{
			int id = Get_Int_Parameter ("Disk_ID");
			Vector3 reveal_loc = Vector3 (0,0,0);
			int radius = 15;
			switch (id)
			{
			case (1): // Disk Reveals the Ski Resort
				{
					reveal_loc = Vector3(425.76f,840.78f,8.19f);
					radius = 15;
					break;
				}
			case (2): // Disk Reveals the Dam Area
				{
					reveal_loc = Vector3(1016.43f,885.96f,35.41f);
					radius = 30;
					break;
				}
			default: // Disk Reveals the Hand of Nod
				{
					reveal_loc = Vector3(1204.46f,565.35f,37.84f);
					radius = 15;
					break;
				}
			}
			Commands->Clear_Map_Region_By_Pos (reveal_loc, radius);
			Commands->Set_HUD_Help_Text (IDS_M00EVAG_DSGN0103I1EVAG_TXT, TEXT_COLOR_OBJECTIVE_PRIMARY);
		}
	}
};


DECLARE_SCRIPT (M02_Encyclopedia_Reveal, "Disk_ID:int")
{
	void Custom (GameObject * obj, int type, int param, GameObject * sender)
	{
		if (type == CUSTOM_EVENT_POWERUP_GRANTED) 
		{
			int id = Get_Int_Parameter ("Disk_ID");
			switch (id)
			{
			case (1):
				{
					Commands->Reveal_Encyclopedia_Vehicle (5);
					break;
				}
			default:
				{
					Commands->Reveal_Encyclopedia_Building (15);
					break;
				}
			}
			Commands->Set_HUD_Help_Text (IDS_M00EVAG_DSGN0104I1EVAG_TXT, TEXT_COLOR_OBJECTIVE_PRIMARY);
		}
	}
};
