/*
**	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
*     Mission10.cpp
*
* DESCRIPTION
*     Mission 10 scripts
*
* PROGRAMMER
*     Ryan Vervack, Dan Etter
*
* VERSION INFO
*     $Author: Dan_e $
*     $Revision: 69 $
*     $Modtime: 2/11/02 9:41a $
*     $Archive: /Commando/Code/Scripts/Mission10.cpp $
*
******************************************************************************/

#include "scripts.h"
#include "toolkit.h"
#include "mission10.h"

DECLARE_SCRIPT(M10_Objective_Controller, "")
{
	int silo_count, turret_count;
	int e_sam_count, w_sam_count;
	int primary_count;

	REGISTER_VARIABLES()
	{
		SAVE_VARIABLE(silo_count, 1);
		SAVE_VARIABLE(turret_count, 2);
		SAVE_VARIABLE(e_sam_count, 3);
		SAVE_VARIABLE(w_sam_count, 4);
		SAVE_VARIABLE(primary_count, 5);
	}

	void Created(GameObject * obj)
	{
		Commands->Set_Num_Tertiary_Objectives ( 2 );

		Commands->Start_Timer (obj, this, 0.5f, HAVOCS_SCRIPT);

		silo_count = turret_count = 0;
		e_sam_count = w_sam_count = 0;
		primary_count = 0;

		Commands->Add_Objective(1020, OBJECTIVE_TYPE_TERTIARY, OBJECTIVE_STATUS_HIDDEN, IDS_Enc_ObjTitle_Hidden_M10_01, NULL, IDS_Enc_Obj_Hidden_M10_01);
		Commands->Add_Objective(1021, OBJECTIVE_TYPE_TERTIARY, OBJECTIVE_STATUS_HIDDEN, IDS_Enc_ObjTitle_Hidden_M10_02, NULL, IDS_Enc_Obj_Hidden_M10_02);
	}

	void Remove_Pog(int id)
	{
		switch (id)
		{
		// Destroy the Power Plant
		case 1001: 
			{
				Commands->Set_Objective_HUD_Info(id, -1, "POG_M10_1_05.tga", IDS_POG_DESTROY);
			}
			break;
		// Destroy the Construction Yard
		case 1002: 
			{
				Commands->Set_Objective_HUD_Info(id, -1, "POG_M10_1_02.tga", IDS_POG_DESTROY);
			}
			break;
		// Place the Ion Cannon Beacon at the Temple of Nod Entrance
		case 1003: 
			{
				Commands->Set_Objective_HUD_Info(id, -1, "POG_M10_1_07.tga", IDS_POG_SABOTAGE);
			}
			break;
		// Destroy the Communications Center
		case 1004: 
			{
				Commands->Set_Objective_HUD_Info(id, -1, "POG_M10_1_04.tga", IDS_POG_DESTROY);
			}
			break;
		// Lower the Southeastern Base Gate
		case 1005: 
			{
				Commands->Set_Objective_HUD_Info(id, -1, "POG_M10_1_01.tga", IDS_POG_OPEN);
			}
			break;
		// Lower the Northeastern Base Gate
		case 1006: 
			{
				Commands->Set_Objective_HUD_Info(id, -1, "POG_M10_1_01.tga", IDS_POG_OPEN);
			}
			break;
		// Lower the Northwestern Base Gate
		case 1007: 
			{
				Commands->Set_Objective_HUD_Info(id, -1, "POG_M10_1_01.tga", IDS_POG_OPEN);
			}
			break;
		// Destroy the Hand of Nod
		case 1008: 
			{
				Commands->Set_Objective_HUD_Info(id, -1, "POG_M10_2_01.tga", IDS_POG_DESTROY);
			}
			break;
		// Destroy the Tiberium Refinery
		case 1009: 
			{
				Commands->Set_Objective_HUD_Info(id, -1, "POG_M10_2_02.tga", IDS_POG_DESTROY);
			}
			break;
		// Destroy the Nod Airstrip
		case 1010: 
			{
				Commands->Set_Objective_HUD_Info(id, -1, "POG_M10_2_06.tga", IDS_POG_DESTROY);
			}
			break;
		// Destroy the Tiberium Silos
		case 1011: 
			{
				Commands->Set_Objective_HUD_Info(id, -1, "POG_M10_2_02.tga", IDS_POG_DESTROY);
			}
			break;
		// Acquire the Level 1 Key From an Officer
		case 1012: 
			{
				Commands->Set_Objective_HUD_Info(id, -1, "POG_M03_1_02.tga", IDS_POG_ACQUIRE);
			}
			break;
		// Destroy the Northern Nod Helipad
		case 1013: 
			{
				Commands->Set_Objective_HUD_Info(id, -1, "POG_M10_2_02.tga", IDS_POG_DESTROY);
			}
			break;
		// Destroy the Western Nod Helipad
		case 1014: 
			{
				Commands->Set_Objective_HUD_Info(id, -1, "POG_M10_2_07.tga", IDS_POG_DESTROY);
			}
			break;
		// Destroy the Southern SAM Site
		case 1015: 
			{
				Commands->Set_Objective_HUD_Info(id, -1, "POG_M10_2_03.tga", IDS_POG_DESTROY);
			}
			break;
		// Destroy the Northern SAM Site
		case 1016: 
			{
				Commands->Set_Objective_HUD_Info(id, -1, "POG_M10_2_11.tga", IDS_POG_DESTROY);
			}
			break;
		// Destroy the Western SAM Site
		case 1017: 
			{
				Commands->Set_Objective_HUD_Info(id, -1, "POG_M10_2_06.tga", IDS_POG_DESTROY);
			}
			break;
		// Destroy the Eastern SAM Site
		case 1018: 
			{
				Commands->Set_Objective_HUD_Info(id, -1, "POG_M10_2_05.tga", IDS_POG_DESTROY);
			}
			break;
		// Destroy the Nod Turrets
		case 1019: 
			{
				Commands->Set_Objective_HUD_Info(id, -1, "POG_M10_2_12.tga", IDS_POG_DESTROY);
			}
			break;
		}
	}
	
	void Add_An_Objective(int id)
	{
		GameObject *object;
		GameObject *object2;
		GameObject *obj = Commands->Find_Object (1100154);

		switch (id)
		{
		case 1001: 
			{
				Commands->Add_Objective(1001, OBJECTIVE_TYPE_PRIMARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Primary_M10_05, NULL, IDS_Enc_Obj_Primary_M10_05);
				object = Commands->Find_Object(2007444);
				if(object)
				{
					Commands->Set_Objective_Radar_Blip_Object(1001, object);
					Commands->Set_Objective_HUD_Info_Position( 1001, 75, "POG_M10_1_05.tga", IDS_POG_DESTROY, Commands->Get_Position (object));
				}
			}
			break;
		case 1002:
			{
				Commands->Add_Objective(1002, OBJECTIVE_TYPE_PRIMARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Primary_M10_02, NULL, IDS_Enc_Obj_Primary_M10_02);
				object = Commands->Find_Object(2007445);
				if(object)
				{
					Commands->Set_Objective_Radar_Blip_Object(1002, object);
					Commands->Set_Objective_HUD_Info_Position( 1002, 78, "POG_M10_1_02.tga", IDS_POG_DESTROY, Commands->Get_Position (object));
				}
			}
			break;
		case 1003:
			{
				Commands->Add_Objective(1003, OBJECTIVE_TYPE_PRIMARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Primary_M10_07, NULL, IDS_Enc_Obj_Primary_M10_07);
				object = Commands->Find_Object(2007446);
				if(object)
				{
					Commands->Set_Objective_Radar_Blip_Object(1003, object);
					Commands->Set_Objective_HUD_Info_Position( 1003, 73, "POG_M10_1_07.tga", IDS_POG_SABOTAGE, Commands->Get_Position (object));
				}
			}
			break;
		case 1004:
			{
				Commands->Add_Objective(1004, OBJECTIVE_TYPE_PRIMARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Primary_M10_04, NULL, IDS_Enc_Obj_Primary_M10_04);
				object = Commands->Find_Object(2007447);
				if(object)
				{
					Commands->Set_Objective_Radar_Blip_Object(1004, object);
					Commands->Set_Objective_HUD_Info_Position( 1004, 76, "POG_M10_1_04.tga", IDS_POG_DESTROY, Commands->Get_Position (object));
				}
			}
			break;
		case 1005:
			{
				Commands->Add_Objective(1005, OBJECTIVE_TYPE_PRIMARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Primary_M10_01, NULL, IDS_Enc_Obj_Primary_M10_01);
				object = Commands->Find_Object(1100166);
				if(object)
				{
					Commands->Set_Objective_Radar_Blip_Object(1005, object);
					Commands->Set_Objective_HUD_Info_Position( 1005, 80, "POG_M10_1_01.tga", IDS_POG_OPEN, Commands->Get_Position (object));
				}
			}
			break;
		case 1006:
			{
				Commands->Add_Objective(1006, OBJECTIVE_TYPE_PRIMARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Primary_M10_06, NULL, IDS_Enc_Obj_Primary_M10_06);
				object = Commands->Find_Object(2017706);
				if(object)
				{
					Commands->Set_Objective_Radar_Blip_Object(1006, object);
					Commands->Set_Objective_HUD_Info_Position( 1006, 74, "POG_M10_1_01.tga", IDS_POG_OPEN, Commands->Get_Position (object));
				}
			}
			break;
		case 1007:
			{
				Commands->Add_Objective(1007, OBJECTIVE_TYPE_PRIMARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Primary_M10_03, NULL, IDS_Enc_Obj_Primary_M10_03);
				object = Commands->Find_Object(1100169);
				if(object)
				{
					Commands->Set_Objective_Radar_Blip_Object(1007, object);
					Commands->Set_Objective_HUD_Info_Position( 1007, 77, "POG_M10_1_01.tga", IDS_POG_OPEN, Commands->Get_Position (object));
				}
			}
			break;
		case 1008:
			{
				Commands->Add_Objective(1008, OBJECTIVE_TYPE_SECONDARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Secondary_M10_01, NULL, IDS_Enc_Obj_Secondary_M10_01);
				object = Commands->Find_Object(2007448);
				if(object)
				{
					Commands->Set_Objective_Radar_Blip_Object(1008, object);
					Commands->Set_Objective_HUD_Info_Position( 1008, 51, "POG_M10_2_01.tga", IDS_POG_DESTROY, Commands->Get_Position (object));
					Commands->Send_Custom_Event( obj, obj, REMOVE_SECONDARY_POG, 1008, SECONDARY_POG_DELAY );
				}
			}
			break;
		case 1009:
			{
				Commands->Add_Objective(1009, OBJECTIVE_TYPE_SECONDARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Secondary_M10_04, NULL, IDS_Enc_Obj_Secondary_M10_04);
				object = Commands->Find_Object(2007449);
				if(object)
				{
					Commands->Set_Objective_Radar_Blip_Object(1009, object);
					Commands->Set_Objective_HUD_Info_Position( 1009, 50, "POG_M10_2_03.tga", IDS_POG_DESTROY, Commands->Get_Position (object));
					Commands->Send_Custom_Event( obj, obj, REMOVE_SECONDARY_POG, 1009, SECONDARY_POG_DELAY );
				}
			}
			break;
		case 1010:
			{
				Commands->Add_Objective(1010, OBJECTIVE_TYPE_SECONDARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Secondary_M10_06, NULL, IDS_Enc_Obj_Secondary_M10_06);
				object = Commands->Find_Object(2007450);
				if(object)
				{
					Commands->Set_Objective_Radar_Blip_Object(1010, object);
					Commands->Set_Objective_HUD_Info_Position( 1010, 59, "POG_M10_2_05.tga", IDS_POG_DESTROY, Commands->Get_Position (object));
					Commands->Send_Custom_Event( obj, obj, REMOVE_SECONDARY_POG, 1010, SECONDARY_POG_DELAY );
				}
			}
			break;
		case 1011:
			{
				Commands->Add_Objective(1011, OBJECTIVE_TYPE_SECONDARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Secondary_M10_08, NULL, IDS_Enc_Obj_Secondary_M10_08);
				object = Commands->Find_Object(2005260);
				if(object)
				{
					Commands->Set_Objective_Radar_Blip_Object(1011, object);
					Commands->Set_Objective_HUD_Info_Position( 1011, 58, "POG_M10_2_07.tga", IDS_POG_DESTROY, Commands->Get_Position (object));
					Commands->Send_Custom_Event( obj, obj, REMOVE_SECONDARY_POG, 1011, SECONDARY_POG_DELAY );
				}
			}
			break;
		case 1012:
			{
				Commands->Add_Objective(1012, OBJECTIVE_TYPE_PRIMARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Primary_M10_08, NULL, IDS_Enc_Obj_Primary_M10_08);
				
				object = Commands->Find_Object(2000890);
				if(object)
				{
					Commands->Set_Objective_Radar_Blip_Object(1012, object);
					Commands->Set_Objective_HUD_Info_Position( 1012, 79, "POG_M10_1_08.tga", IDS_POG_ACQUIRE, Commands->Get_Position (object));
				}
				
			}
			break;
		case 1013:
			{
				Commands->Add_Objective(1013, OBJECTIVE_TYPE_SECONDARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Secondary_M10_10, NULL, IDS_Enc_Obj_Secondary_M10_10);
				object = Commands->Find_Object(1154083);
				if(object)
				{
					Commands->Set_Objective_Radar_Blip_Object(1013, object);
					Commands->Set_Objective_HUD_Info_Position( 1013, 57, "POG_M10_2_06.tga", IDS_POG_DESTROY, Commands->Get_Position (object));
					Commands->Send_Custom_Event( obj, obj, REMOVE_SECONDARY_POG, 1013, SECONDARY_POG_DELAY );
				}
			}
			break;
		case 1014:
			{
				Commands->Add_Objective(1014, OBJECTIVE_TYPE_SECONDARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Secondary_M10_07, NULL, IDS_Enc_Obj_Secondary_M10_07);
				object = Commands->Find_Object(1154084);
				if(object)
				{
					Commands->Set_Objective_Radar_Blip_Object(1014, object);
					Commands->Set_Objective_HUD_Info_Position( 1014, 56, "POG_M10_2_06.tga", IDS_POG_DESTROY, Commands->Get_Position (object));
					Commands->Send_Custom_Event( obj, obj, REMOVE_SECONDARY_POG, 1014, SECONDARY_POG_DELAY );
				}
			}
			break;
		case 1015:
			{
				Commands->Add_Objective(1015, OBJECTIVE_TYPE_SECONDARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Secondary_M10_03, NULL, IDS_Enc_Obj_Secondary_M10_03);
				object = Commands->Find_Object(1100007);
				if(object)
				{
					Commands->Set_Objective_Radar_Blip_Object(1015, object);
					Commands->Set_Objective_HUD_Info_Position( 1015, 55, "POG_M10_2_02.tga", IDS_POG_DESTROY, Commands->Get_Position (object));
					Commands->Send_Custom_Event( obj, obj, REMOVE_SECONDARY_POG, 1015, SECONDARY_POG_DELAY );
				}
			}
			break;
		case 1016:
			{
				Commands->Add_Objective(1016, OBJECTIVE_TYPE_SECONDARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Secondary_M10_11, NULL, IDS_Enc_Obj_Secondary_M10_11);
				object = Commands->Find_Object(1100010);
				if(object)
				{
					Commands->Set_Objective_Radar_Blip_Object(1016, object);
					Commands->Set_Objective_HUD_Info_Position( 1016, 54, "POG_M10_2_02.tga", IDS_POG_DESTROY, Commands->Get_Position (object));
					Commands->Send_Custom_Event( obj, obj, REMOVE_SECONDARY_POG, 1016, SECONDARY_POG_DELAY );
				}
			}
			break;
		case 1017:
			{
				Commands->Add_Objective(1017, OBJECTIVE_TYPE_SECONDARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Secondary_M10_09, NULL, IDS_Enc_Obj_Secondary_M10_09);
				object = Commands->Find_Object(1100012);
				object2 = Commands->Find_Object(1100011);
				if(object && object2)
				{
					Commands->Set_Objective_Radar_Blip_Object(1017, object);
					//Commands->Set_Objective_Radar_Blip_Object(1017, object2);
					Commands->Set_Objective_HUD_Info_Position( 1017, 53, "POG_M10_2_02.tga", IDS_POG_DESTROY, Commands->Get_Position (object));
					Commands->Send_Custom_Event( obj, obj, REMOVE_SECONDARY_POG, 1017, SECONDARY_POG_DELAY );
				}
			}
			break;
		case 1018:
			{
				Commands->Add_Objective(1018, OBJECTIVE_TYPE_SECONDARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Secondary_M10_05, NULL, IDS_Enc_Obj_Secondary_M10_05);
				object = Commands->Find_Object(1100008);
				object2 = Commands->Find_Object(1100009);
				if(object || object2)
				{
					Commands->Set_Objective_Radar_Blip_Object(1018, Commands->Find_Object (1209367));
					//Commands->Set_Objective_Radar_Blip_Object(1018, object2);
					Commands->Set_Objective_HUD_Info_Position( 1018, 52, "POG_M10_2_02.tga", IDS_POG_DESTROY, Commands->Get_Position (object));
				}
			}
			break;
		case 1019:
			{
				Commands->Add_Objective(1019, OBJECTIVE_TYPE_SECONDARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Secondary_M10_12, NULL, IDS_Enc_Obj_Secondary_M10_12);
				object = Commands->Find_Object(1100013);
				object2 = Commands->Find_Object(1100014);
				if(object || object2)
				{
					Commands->Set_Objective_Radar_Blip_Object(1019, object);
					//Commands->Set_Objective_Radar_Blip_Object(1019, object2);
					Commands->Set_Objective_HUD_Info_Position( 1019, 51, "POG_M10_2_11.tga", IDS_POG_DESTROY, Commands->Get_Position (object));
				}
			}
			break;
		}
	}

	void Action_Complete (GameObject *obj, int action_id, ActionCompleteReason reason)
	{
		if (action_id == 100045)
		{
			Commands->Set_Objective_Status(1017, OBJECTIVE_STATUS_ACCOMPLISHED);
		}

		if (action_id == 100052)
		{
			Commands->Add_Objective(1019, OBJECTIVE_TYPE_SECONDARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Secondary_M10_12, NULL, IDS_Enc_Obj_Secondary_M10_12);
			Commands->Set_Objective_Status(1019, OBJECTIVE_STATUS_ACCOMPLISHED);
		}		
	}

	void Custom(GameObject * obj, int type, int param, GameObject * sender)
	{
		/*if (type == REMOVE_SECONDARY_POG)
		{
			Remove_Pog(param);
		}*/

		if (type >= 1000 && type <= 1025)
		{

			switch (param)
			{
				case 1: if (type == 1011)
						  {						  
								  Commands->Set_Objective_Status(1011, OBJECTIVE_STATUS_ACCOMPLISHED);
						  }
					else if (type == 1019)
						  {
							  if (++turret_count == 2)
							  {
								  Commands->Add_Objective(1019, OBJECTIVE_TYPE_SECONDARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Secondary_M10_12, NULL, IDS_Enc_Obj_Secondary_M10_12);
								  Commands->Set_Objective_Status(1019, OBJECTIVE_STATUS_ACCOMPLISHED);

								  int id = Commands->Create_Conversation("M10CON052", 99, 2000, false);
								  Commands->Join_Conversation(NULL, id);
								  Commands->Join_Conversation(STAR, id);
								  Commands->Start_Conversation(id, 100052);
								  Commands->Monitor_Conversation(obj, id);
							  }
						  }
					else if (type == 1015)
					{
						int id = Commands->Create_Conversation("M10CON028", 99, 2000, false);
						Commands->Join_Conversation(NULL, id);
						Commands->Start_Conversation(id, 100028);
						Commands->Monitor_Conversation(obj, id);
					}

					else if (type == 1018)
					{
						if (++e_sam_count >= 1)
						{
							if (e_sam_count == 1)
							{
								int id = Commands->Create_Conversation("M10CON035", 99, 2000, false);
								Commands->Join_Conversation(NULL, id);
								Commands->Join_Conversation(STAR, id);
								Commands->Start_Conversation(id, 100035);
								Commands->Monitor_Conversation(obj, id);
							}

							if (e_sam_count == 2)
							{
								Commands->Add_Objective(1018, OBJECTIVE_TYPE_SECONDARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Secondary_M10_05, NULL, IDS_Enc_Obj_Secondary_M10_05);
								Commands->Set_Objective_Status(1018, OBJECTIVE_STATUS_ACCOMPLISHED);

								int id = Commands->Create_Conversation("M10CON034", 99, 2000, false);
								Commands->Join_Conversation(STAR, id);
								Commands->Start_Conversation(id, 100034);
								Commands->Monitor_Conversation(obj, id);
							}
						}
					}
					else if (type == 1017)
					{
						if (++w_sam_count == 2)
						{
							int id = Commands->Create_Conversation("M10CON045", 99, 2000, false);
							Commands->Join_Conversation(NULL, id);
							Commands->Join_Conversation(STAR, id);
							Commands->Start_Conversation(id, 100045);
							Commands->Monitor_Conversation(obj, id);

							Vector3 drop_loc = Commands->Get_Position (Commands->Find_Object (2005997));
							float facing = Commands->Get_Facing (Commands->Find_Object (2005997));
							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", "M10_GDI_Drop_HummVee.txt");
							}
						}
					}
					else
					{
						Commands->Set_Objective_Status(type, OBJECTIVE_STATUS_ACCOMPLISHED);
						if (type < 1008 || type == 1012)
						{
							if (++primary_count >= 7)
							{
								if (primary_count == 7)
								{
									int id = Commands->Create_Conversation("M10CON019", 99, 2000, false);
									Commands->Join_Conversation(STAR, id);
									Commands->Join_Conversation(NULL, id);
									Commands->Start_Conversation(id, 100019);
									Commands->Monitor_Conversation(obj, id);

									GameObject * chinook_obj = Commands->Create_Object ( "Invisible_Object", Vector3(146.59f, 67.52f, -5.25f));
									Commands->Set_Facing(chinook_obj, 0.0f);
									Commands->Attach_Script(chinook_obj, "Test_Cinematic", "X10I_GDI_Drop_PowerUp.txt");
								}

								if (type == 1003)
								{
									Commands->Start_Timer(obj, this, 5.0f, MISSION_COMPLETE);
								}
							}
							
						}
					}
					break;
				case 2: Commands->Set_Objective_Status(type, OBJECTIVE_STATUS_FAILED);
						break;
				case 3: Add_An_Objective(type);
					break;
				case 4: Commands->Set_Objective_Status(type, OBJECTIVE_STATUS_PENDING);
					break;
			}
		}
	}

	void Timer_Expired(GameObject * obj, int timer_id)
	{
		if(timer_id == HAVOCS_SCRIPT)
		{
			GameObject * obj_con = Commands->Find_Object(1100154);
			if (obj_con)
			{
				Commands->Start_Timer(obj, this, 3.0f, 1);
				Commands->Send_Custom_Event(obj, obj_con, 1003, 3);
				/*Commands->Send_Custom_Event(obj, obj_con, 1009, 3);
				Commands->Send_Custom_Event(obj, obj_con, 1008, 3);
				Commands->Send_Custom_Event(obj, obj_con, 1015, 3);				
				Commands->Send_Custom_Event(obj, obj_con, 1012, 3);*/
			}

			Commands->Attach_Script(STAR, "M10_Havoc_Script", "");
			
		}

		if(timer_id == 1)
		{
			int id = Commands->Create_Conversation("M10CON064", 99, 2000, false);
			Commands->Join_Conversation(NULL, id);
			Commands->Join_Conversation(STAR, id);
			Commands->Start_Conversation(id, 100064);
			Commands->Monitor_Conversation(obj, id);
		}


		if(timer_id == MISSION_COMPLETE)
		{
			Commands->Mission_Complete(true);
		}
	}
};

DECLARE_SCRIPT (M10_Ion_Cannon, "")
{
	void Custom( GameObject * obj, int type, int param, GameObject * sender ) 
	{
		if ( type == CUSTOM_EVENT_POWERUP_GRANTED ) 
		{
			GameObject * obj_con = Commands->Find_Object(1100154);
			Commands->Send_Custom_Event(obj, obj_con, 1003, 1);
		}
	}
};

DECLARE_SCRIPT (M10_Havoc_Script, "")
{
	void Created (GameObject *obj)
	{
		/*Commands->Give_PowerUp(obj, "POW_LaserChaingun_Player");
		Commands->Give_PowerUp(obj, "POW_LaserRifle_Player");
		Commands->Give_PowerUp(obj, "POW_MineRemote_Player");
		Commands->Give_PowerUp(obj, "POW_SniperRifle_Player");
		Commands->Give_PowerUp(obj, "POW_TiberiumAutoRifle_Player");
		Commands->Give_PowerUp(obj, "POW_GrenadeLauncher_Player");
		Commands->Give_PowerUp(obj, "POW_FlameThrower_Player");
		Commands->Give_PowerUp(obj, "POW_ChemSprayer_Player");
		Commands->Give_PowerUp(obj, "POW_LaserChaingun_Player");
		Commands->Give_PowerUp(obj, "POW_LaserRifle_Player");
		Commands->Give_PowerUp(obj, "POW_MineRemote_Player");
		Commands->Give_PowerUp(obj, "POW_RocketLauncher_Player");
		Commands->Give_PowerUp(obj, "POW_RocketLauncher_Player");
		Commands->Give_PowerUp(obj, "POW_TiberiumAutoRifle_Player");
		Commands->Give_PowerUp(obj, "POW_PersonalIonCannon_Player");
		Commands->Give_PowerUp(obj, "POW_FlameThrower_Player");
		Commands->Give_PowerUp(obj, "POW_ChemSprayer_Player");*/

	}
	
	/*void Destroyed(GameObject * obj) 
	{
		Commands->Send_Custom_Event (obj, Commands->Find_Object(2000071), 666, 666, 0.0f);	
	}*/
};

DECLARE_SCRIPT(M10_Turret_Tank, "CheckBlocked=1:int")
{
	void Created(GameObject * obj)
	{
		Commands->Enable_Enemy_Seen(obj, true);
	}

	void Enemy_Seen(GameObject * obj, GameObject * enemy)
	{
		bool blocked;

		if (Get_Int_Parameter ("CheckBlocked") != 0)
		{
			blocked = true;
		}

		else
		{
			blocked = false;
		}

		ActionParamsStruct params;
		params.Set_Basic(this, 90, 0);
		params.Set_Attack(enemy, 100.0f, 4.0f, true);
		params.AttackCheckBlocked = blocked;
		Commands->Action_Attack(obj, params);

		Commands->Start_Timer(obj, this, 10.0f, 0);
	}

	void Timer_Expired(GameObject * obj, int timer_id)
	{
		Commands->Action_Reset(obj, 99);
	}
};

DECLARE_SCRIPT(M10_Power_Plant, "")
{
	bool con_yard_destroyed;

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

	void Created(GameObject * obj)
	{
		con_yard_destroyed = false;
		Commands->Static_Anim_Phys_Goto_Frame ( 1285077, 0, "L10_LASERFENCE1.L10_LASERFENCE1" );
	}

	void Custom(GameObject * obj, int type, int param, GameObject * sender)
	{
		if (type == 1000 && param == 1000)
		{
			con_yard_destroyed = true;
		}
	}

	void Power_Off(void)
	{
		//Turns power off on all buildings (besides Obelisk, which is done elsewhere)
		GameObject * building;
		
		building = Commands->Find_Object(1153933); //Con Yard
		Commands->Set_Building_Power(building, false);
		building = Commands->Find_Object(1153932); //Comm Center
		Commands->Set_Building_Power(building, false);
		building = Commands->Find_Object(1153934); //Airstrip
		Commands->Set_Building_Power(building, false);
		building = Commands->Find_Object(1153940); //Refinery
		Commands->Set_Building_Power(building, false);
		building = Commands->Find_Object(1153939); //Hand of Nod
		Commands->Set_Building_Power(building, false);
	}

	void Action_Complete(GameObject * obj, int action_id, ActionCompleteReason reason)
	{
		GameObject * obj_con = Commands->Find_Object(1100154);

		if (action_id == 100014)
		{
			Commands->Send_Custom_Event(obj, obj_con, 1001, 3);
			Commands->Send_Custom_Event(obj, obj_con, 1001, 1);
		}
	}
	
	void Killed(GameObject * obj, GameObject * killer)
	{
		Commands->Enable_Radar ( true );

		Commands->Destroy_Object (Commands->Find_Object (1203589));

		int id = Commands->Create_Conversation("M10CON014", 99, 2000, false);
		Commands->Join_Conversation(NULL, id);
		Commands->Start_Conversation(id, 100014);
		Commands->Monitor_Conversation(obj, id);

		GameObject * obelisk = Commands->Find_Object(1153938);
		if (obelisk)
		{
			Commands->Send_Custom_Event(obj, obelisk, 1000, 1000);
		}

		Commands->Static_Anim_Phys_Goto_Frame ( 1285077, 1, "L10_LASERFENCE1.L10_LASERFENCE1" );
		Power_Off();
	}
};

DECLARE_SCRIPT(M10_Con_Yard, "")
{
	void Action_Complete(GameObject * obj, int action_id, ActionCompleteReason reason)
	{
		GameObject * obj_con = Commands->Find_Object(1100154);

		if (action_id == 100005)
		{
			Commands->Send_Custom_Event(obj, obj_con, 1002, 1);
		}
	}

	void Killed(GameObject * obj, GameObject * killer)
	{
		Commands->Destroy_Object (Commands->Find_Object (2014793));
		Commands->Destroy_Object (Commands->Find_Object (2014792));

		int id = Commands->Create_Conversation("M10CON005", 99, 2000, false);
		Commands->Join_Conversation(NULL, id);
		Commands->Start_Conversation(id, 100005);
		Commands->Monitor_Conversation(obj, id);

		GameObject * power_plant = Commands->Find_Object(1153931);
		if (power_plant)
		{
			Commands->Send_Custom_Event(obj, power_plant, 3000, 3000);
		}
		GameObject * turret1 = Commands->Find_Object(1100013);
		if (turret1)
		{
			Commands->Send_Custom_Event(obj, turret1, 3000, 3000);
		}
		GameObject * comm_center = Commands->Find_Object(1153932);
		if (comm_center)
		{
			Commands->Send_Custom_Event(obj, comm_center, 3000, 3000);
		}
		GameObject * heli_pad = Commands->Find_Object(1154083);
		if (heli_pad)
		{
			Commands->Send_Custom_Event(obj, heli_pad, 3000, 3000);
		}
		GameObject * sam_site = Commands->Find_Object(1100010);
		if (sam_site)
		{
			Commands->Send_Custom_Event(obj, sam_site, 3000, 3000);
		}
		GameObject * turret2 = Commands->Find_Object(1100014);
		if (turret2)
		{
			Commands->Send_Custom_Event(obj, turret2, 3000, 3000);
		}

		GameObject * hon = Commands->Find_Object(1153939);
		if (hon)
		{
			Commands->Send_Custom_Event(obj, hon, 3000, 3000);
		}
		GameObject * sam1 = Commands->Find_Object(1100007);
		if (sam1)
		{
			Commands->Send_Custom_Event(obj, sam1, 3000, 3000);
		}
		GameObject * turret3 = Commands->Find_Object(2000728);
		if (turret3)
		{
			Commands->Send_Custom_Event(obj, turret3, 3000, 3000);
		}
		GameObject * turret4 = Commands->Find_Object(2000729);
		if (turret4)
		{
			Commands->Send_Custom_Event(obj, turret4, 3000, 3000);
		}
		GameObject * refinery = Commands->Find_Object(1153940);
		if (refinery)
		{
			Commands->Send_Custom_Event(obj, refinery, 3000, 3000);
		}
		GameObject * turret5 = Commands->Find_Object(1205749);
		if (turret5)
		{
			Commands->Send_Custom_Event(obj, turret5, 3000, 3000);
		}
		GameObject * turret6 = Commands->Find_Object(1205748);
		if (turret6)
		{
			Commands->Send_Custom_Event(obj, turret6, 3000, 3000);
		}
		GameObject * obelisk = Commands->Find_Object(1153938);
		if (obelisk)
		{
			Commands->Send_Custom_Event(obj, obelisk, 3000, 3000);
		}
		GameObject * sam2 = Commands->Find_Object(1100008);
		if (sam2)
		{
			Commands->Send_Custom_Event(obj, sam2, 3000, 3000);
		}
		GameObject * sam3 = Commands->Find_Object(1100009);
		if (sam3)
		{
			Commands->Send_Custom_Event(obj, sam3, 3000, 3000);
		}
		GameObject * airstrip = Commands->Find_Object(1154061);
		if (airstrip)
		{
			Commands->Send_Custom_Event(obj, airstrip, 3000, 3000);
		}
		GameObject * helipad1 = Commands->Find_Object(1154084);
		if (helipad1)
		{
			Commands->Send_Custom_Event(obj, helipad1, 3000, 3000);
		}
		GameObject * sam4 = Commands->Find_Object(1100012);
		if (sam4)
		{
			Commands->Send_Custom_Event(obj, sam4, 3000, 3000);
		}
		GameObject * sam5 = Commands->Find_Object(1100011);
		if (sam5)
		{
			Commands->Send_Custom_Event(obj, sam5, 3000, 3000);
		}
		GameObject * silo1 = Commands->Find_Object(1153935);
		if (silo1)
		{
			Commands->Send_Custom_Event(obj, silo1, 3000, 3000);
		}
		GameObject * silo2 = Commands->Find_Object(1154051);
		if (silo2)
		{
			Commands->Send_Custom_Event(obj, silo2, 3000, 3000);
		}
	}
};

DECLARE_SCRIPT(M10_Comm_Center, "")
{
	void Action_Complete(GameObject * obj, int action_id, ActionCompleteReason reason)
	{
		GameObject * obj_con = Commands->Find_Object(1100154);

		if (action_id == 100011)
		{
			Commands->Send_Custom_Event(obj, obj_con, 1004, 3);
			Commands->Send_Custom_Event(obj, obj_con, 1004, 1);
		}
	}

	void Killed(GameObject * obj, GameObject * killer)
	{
		Commands->Destroy_Object (Commands->Find_Object (2014802));
		Commands->Enable_Radar (true);

		int id = Commands->Create_Conversation("M10CON011", 99, 2000, false);
		Commands->Join_Conversation(NULL, id);
		Commands->Join_Conversation(NULL, id);
		Commands->Start_Conversation(id, 100011);
		Commands->Monitor_Conversation(obj, id);

		//Commands->Give_PowerUp(STAR, "Ion Cannon Powerup");
	}
};

DECLARE_SCRIPT(M10_Hand_Of_Nod, "")
{
	void Action_Complete(GameObject * obj, int action_id, ActionCompleteReason reason)
	{
		GameObject * obj_con = Commands->Find_Object(1100154);

		if (action_id == 100021)
		{
			Commands->Send_Custom_Event(obj, obj_con, 1008, 1);
		}
	}

	void Killed(GameObject * obj, GameObject * killer)
	{
		int id = Commands->Create_Conversation("M10CON021", 99, 2000, false);
		Commands->Join_Conversation(NULL, id);
		Commands->Join_Conversation(STAR, id);
		Commands->Start_Conversation(id, 100021);
		Commands->Monitor_Conversation(obj, id);
	}
};

DECLARE_SCRIPT(M10_Refinery, "")
{
	void Action_Complete(GameObject * obj, int action_id, ActionCompleteReason reason)
	{
		GameObject * obj_con = Commands->Find_Object(1100154);

		if (action_id == 100031)
		{
			Commands->Send_Custom_Event(obj, obj_con, 1009, 1);
		}
	}

	void Killed(GameObject * obj, GameObject * killer)
	{
		int id = Commands->Create_Conversation("M10CON031", 99, 2000, false);
		Commands->Join_Conversation(STAR, id);
		Commands->Join_Conversation(NULL, id);
		Commands->Start_Conversation(id, 100031);
		Commands->Monitor_Conversation(obj, id);
	}
};

DECLARE_SCRIPT(M10_Airstrip, "")
{
	void Action_Complete(GameObject * obj, int action_id, ActionCompleteReason reason)
	{
		GameObject * obj_con = Commands->Find_Object(1100154);

		if (action_id == 100037)
		{
			Commands->Send_Custom_Event(obj, obj_con, 1010, 1);
		}
	}

	void Killed(GameObject * obj, GameObject * killer)
	{
		Commands->Send_Custom_Event(obj, Commands->Find_Object (1100161), NO_DROP, 0);

		int id = Commands->Create_Conversation("M10CON037", 99, 2000, false);
		Commands->Join_Conversation(NULL, id);
		Commands->Start_Conversation(id, 100037);
		Commands->Monitor_Conversation(obj, id);
	}
};

DECLARE_SCRIPT(M10_Silo, "")
{
	void Killed(GameObject * obj, GameObject * killer)
	{
		GameObject * silo_con = Commands->Find_Object(2005260);
		if (silo_con)
		{
			Commands->Send_Custom_Event(obj, silo_con, KILLED, 0);
		}
	}
};

DECLARE_SCRIPT(M10_Silo_Controller, "")
{
	int count;

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

	void Created (GameObject *obj)
	{
		count = 0;
	}

	void Action_Complete (GameObject *obj, int action_id, ActionCompleteReason reason)
	{
		if (action_id == 100043)
		{
			GameObject * obj_con = Commands->Find_Object(1100154);

			//Commands->Set_Objective_Status(1011, OBJECTIVE_STATUS_ACCOMPLISHED);
			Commands->Send_Custom_Event(obj, obj_con, 1011, 3);
			Commands->Send_Custom_Event(obj, obj_con, 1011, 1);
		}
	}

	void Custom (GameObject * obj, int type, int param, GameObject * sender)
	{
		if (type == KILLED)
		{
			count++;

			if (count >= 2)
			{
				int id = Commands->Create_Conversation("M10CON043", 99, 2000, false);
				Commands->Join_Conversation(STAR, id);
				Commands->Join_Conversation(NULL, id);
				Commands->Start_Conversation(id, 100043);
				Commands->Monitor_Conversation(obj, id);
			}
		}
	}
};



DECLARE_SCRIPT(M10_Obelisk, "")
{
	bool objective_completed, inside_obelisk, conyard_destroyed;
	float full_health, curr_health;

	REGISTER_VARIABLES()
	{
		SAVE_VARIABLE(objective_completed, 1);
		SAVE_VARIABLE(inside_obelisk, 2);
		SAVE_VARIABLE(conyard_destroyed, 3);
	}

	void Created(GameObject * obj)
	{
		objective_completed = inside_obelisk = conyard_destroyed = false;
		full_health = Commands->Get_Health(obj);
	}
	
	void Killed(GameObject * obj, GameObject * killer)
	{
		if (!objective_completed)
		{
			GameObject * obj_con = Commands->Find_Object(1100154);
			if (obj_con)
			{
				Commands->Send_Custom_Event(obj, obj_con, 1020, 1);
				Commands->Send_Custom_Event(obj, Commands->Find_Object (2010415), KILLED, 0);
				Commands->Send_Custom_Event(obj, Commands->Find_Object (6000728), KILLED, 0);
			}
		}
	}

	/*void Damaged(GameObject * obj, GameObject * damager, float amount)
	{
		if (inside_obelisk || conyard_destroyed)
		{
			return;
		}
		else
		{
			curr_health = Commands->Get_Health (obj);
			float counter = 1.0f;
			Commands->Set_Health(obj, (curr_health + 1));

			for (float x = curr_health; x <= full_health; x++)
			{
				Commands->Start_Timer(obj, this, counter, REBUILD);
				counter++;
			
				//Commands->Set_Health(obj, full_health);
			}
		}
	}*/

	void Timer_Expired(GameObject * obj, int timer_id )
	{
		if (timer_id == REBUILD)
		{
			curr_health++;
			Commands->Set_Health(obj, curr_health);
		}
	}


	void Custom(GameObject * obj, int type, int param, GameObject * sender)
	{
		if (type == 1000 && param == 1000)
		{
			Commands->Set_Building_Power(obj, false);
			objective_completed = false;
		}
		if (type == 2000 && param == 2000)
		{
			inside_obelisk = true;
		}
		if (type == 2000 && param == 2001)
		{
			inside_obelisk = false;
			full_health = Commands->Get_Health(obj);
		}
		if (type == 3000 && param == 3000)
		{
			conyard_destroyed = true;
		}
	}
};

DECLARE_SCRIPT(M10_Turret, "")
{
	void Created(GameObject * obj)
	{
		Commands->Enable_Enemy_Seen(obj, true);
	}

	void Enemy_Seen(GameObject * obj, GameObject * enemy)
	{
		ActionParamsStruct params;
		params.Set_Basic(this, 90, 0);
		params.Set_Attack(enemy, 100.0f, 4.0f, true);
		Commands->Action_Attack(obj, params);

		Commands->Start_Timer(obj, this, 10.0f, 0);
	}
	
	void Killed(GameObject * obj, GameObject * killer)
	{
		Vector3 my_pos = Commands->Get_Position(obj);
		float facing = Commands->Get_Facing(obj);
		GameObject * destroyed_turret = Commands->Create_Object("Nod_Turret_Destroyed", my_pos);
		Commands->Set_Facing(destroyed_turret, facing);
		Commands->Attach_Script(destroyed_turret, "M10_Destroyed_Turret", "");
	}

	void Timer_Expired(GameObject * obj, int timer_id)
	{
		Commands->Action_Reset(obj, 99);
	}
};

DECLARE_SCRIPT(M10_Destroyed_Turret, "")
{
	void Created(GameObject * obj)
	{
		Commands->Start_Timer(obj, this, 1.0f, 0);
	}

	void Timer_Expired(GameObject * obj, int timer_id)
	{
			Commands->Create_2D_Sound("EVA_Enemy_Structure_Destroyed");
	}
};

DECLARE_SCRIPT(M10_Destroy_Self, "")
{
	void Custom(GameObject * obj, int type, int param, GameObject * sender)
	{
		Commands->Destroy_Object(obj);
	}
};

DECLARE_SCRIPT(M10_Apache_Controller, "")
{
	bool active;
	int area;
	bool destroyed[3];
	int apache_id[3];
	int attacking_apache;

	REGISTER_VARIABLES()
	{
		SAVE_VARIABLE(active, 1);
		SAVE_VARIABLE(area, 2);
		SAVE_VARIABLE(destroyed, 3);
		SAVE_VARIABLE(apache_id, 4);
		SAVE_VARIABLE(attacking_apache, 5);
	}
	
	void Created(GameObject * obj)
	{
		active = false;
		attacking_apache = 0;
		area = -1;
		destroyed[0] = destroyed[1] = destroyed[2] = false;
		//apache_id[0] = Commands->Get_ID(Commands->Create_Object("Nod_Apache_No_Idle", Vector3(-12.129f, -149.546f, 2.949f)));
		//GameObject * apache = Commands->Find_Object(apache_id[0]);
		//Commands->Attach_Script(apache, "M10_Apache", "0");
		apache_id[1] = Commands->Get_ID(Commands->Create_Object("Nod_Apache_No_Idle", Vector3(-171.980f, 51.905f, 8.959f)));
		GameObject * apache = Commands->Find_Object(apache_id[1]);
		Commands->Attach_Script(apache, "M10_Apache", "1");
		apache_id[2] = Commands->Get_ID(Commands->Create_Object("Nod_Apache_No_Idle", Vector3(8.548f, 226.140f, 1.697f)));
		apache = Commands->Find_Object(apache_id[2]);
		Commands->Attach_Script(apache, "M10_Apache", "2");
	}

	void Custom(GameObject * obj, int type, int param, GameObject * sender)
	{
		if (param < -1 || param > 2)
		{
			return;
		}
		
		if (type == 1000)
		{
			destroyed[param] = true;
			if (Commands->Find_Object(apache_id[param]))
			{
				Commands->Send_Custom_Event(obj, Commands->Find_Object(apache_id[param]), 300, 300);
			}
		}
		if (type == 2000)
		{
			apache_id[param] = 0;
			if (!destroyed[param])
			{
				Commands->Start_Timer(obj, this, 40.0f, param);
			}
			else
			{
			}
		}
		if (type == 3000)
		{
			if (param == area)
			{
				return;
			}
			if (area > -1)
			{
				Return_To_Helipad(area);
			}
			area = param;
			if (area > -1)
			{
				Attack_Player(area);
			}
		}
		if (type == 4000)
		{
			if (area == param)
			{
				Commands->Send_Custom_Event(obj, sender, 100, 100);
				attacking_apache = area;
			}
		}
		if (type == 5000)
		{
			Reload_At_Helipad(area);
			Commands->Start_Timer(obj, this, 25.0f, 10 + area);
		}
	}

	void Return_To_Helipad(int current_area)
	{
		GameObject * apache = Commands->Find_Object(apache_id[current_area]);
		if (apache)
		{
			Commands->Send_Custom_Event(Owner(), apache, 200, 200);
		}
	}

	void Reload_At_Helipad(int current_area)
	{
		GameObject * apache = Commands->Find_Object(apache_id[current_area]);
		if (apache)
		{
			Commands->Send_Custom_Event(Owner(), apache, 500, 500);
		}
	}

	void Attack_Player(int current_area)
	{
		GameObject * apache = Commands->Find_Object(apache_id[area]);
		if (apache)
		{
			Commands->Send_Custom_Event(Owner(), apache, 100, 100);
			attacking_apache = area;
		}
	}

	void Replace_Apache(int current_area)
	{
		Vector3 start_loc;
		start_loc.Set(8.107f, 70.031f, 44.679f);

		GameObject * apache = Commands->Create_Object("Nod_Apache_No_Idle", start_loc);
		Commands->Enable_Engine(apache, true);
		char param[10];
		sprintf(param, "%d", current_area);
		Commands->Attach_Script(apache, "M10_Apache", param);
		Commands->Send_Custom_Event(Owner(), apache, 400, 400);
		apache_id[current_area] = Commands->Get_ID(apache);
	}
	
	void Timer_Expired(GameObject * obj, int timer_id)
	{
		if (timer_id >= 10)
		{
			int current_area = timer_id - 10;
			if (current_area == area)
			{
				GameObject * apache = Commands->Find_Object(apache_id[area]);
				if (apache)
				{
					Commands->Send_Custom_Event(Owner(), apache, 100, 100);
					attacking_apache = area;
				}
			}
			return;
		}

		if (!destroyed[timer_id])
		{
			Replace_Apache(timer_id);
		}
		else
		{
		}
	}
};

DECLARE_SCRIPT(M10_Apache, "Area:int")
{
	bool on_pad, pad_destroyed;
	int my_area;
	
	REGISTER_VARIABLES()
	{
		SAVE_VARIABLE(on_pad, 1);
		SAVE_VARIABLE(my_area, 2);
		SAVE_VARIABLE(pad_destroyed, 3);
	}
	
	void Created(GameObject * obj)
	{
		//Commands->Enable_Vehicle_Transitions ( obj, false );
		Commands->Enable_Hibernation(obj, false);
		
		on_pad = true;
		pad_destroyed = false;

		my_area = Get_Int_Parameter("Area");
	}
	
	void Custom(GameObject * obj, int type, int param, GameObject * sender)
	{
		if (type == 100 && param == 100)
		{
			on_pad = false;

			ActionParamsStruct params;
			params.Set_Basic(this, 90, 0);
			Vector3 pos = Commands->Get_Position(obj);
			pos.Z += 10.0f;
			params.Set_Movement(pos, 1.0f, 1.0f);
			params.MovePathfind = false;
			Commands->Action_Goto(obj, params);
		}
		if (type == 200 && param == 200)
		{
			int pad_obj[3] =
			{
				1110050,
				1110051,
				1110052
			};
			
			ActionParamsStruct params;
			params.Set_Basic(this, 90, 2);
			int area = Get_Int_Parameter("Area");
			params.Set_Movement(Commands->Find_Object(pad_obj[area]), 1.0f, 0.1f);
			params.MovePathfind = false;
			Commands->Action_Goto(obj, params);

		}
		if (type == 300 && param == 300)
		{
			pad_destroyed = true;
			if (on_pad)
			{
				Commands->Apply_Damage(obj, 10000.0f, "EXPLOSIVE");
			}
			else 
			{
				int pad_obj[3] =
				{
					1110050,
					1110051,
					1110052
				};
				
				ActionParamsStruct params;
				params.Set_Basic(this, 90, 2);
				int area = Get_Int_Parameter("Area");
				params.Set_Movement(Commands->Find_Object(pad_obj[area]), 1.0f, 0.1f);
				params.MovePathfind = false;
				Commands->Action_Goto(obj, params);
			}
		}
		if (type == 400 && param == 400)
		{
			int waypath[3] = 
			{
				1110082,
				1110040,
				1110045
			};
			
			ActionParamsStruct params;
			params.Set_Basic(this, 90, 2);
			int area = Get_Int_Parameter("Area");
			params.Set_Movement(Vector3(0,0,0), 1.0f, 1.0f);
			params.MovePathfind = false;
			params.WaypathID = waypath[area];
			Commands->Action_Goto(obj, params);

		}
		if (type == 500 && param == 500)
		{
			int pad_obj[3] =
			{
				1110050,
				1110051,
				1110052
			};
			
			ActionParamsStruct params;
			params.Set_Basic(this, 91, 3);
			int area = Get_Int_Parameter("Area");
			params.Set_Movement(Commands->Find_Object(pad_obj[area]), 1.0f, 0.1f);
			params.MovePathfind = false;
			Commands->Action_Goto(obj, params);

		}
	}
	
	void Timer_Expired(GameObject * obj, int timer_id)
	{
		if (!pad_destroyed)
		{
			if (timer_id == 0)
			{
				Vector3 pos = Commands->Get_Position(STAR);
				float facing = Commands->Get_Facing(STAR);
				pos.X -= cos(DEG_TO_RADF(facing)) * 6.0f;
				pos.Y -= sin(DEG_TO_RADF(facing)) * 6.0f;

				pos.Z = WWMath::Max(pos.Z + 12.0f, Commands->Get_Safe_Flight_Height(pos.X, pos.Y) + 6.0f);
				
				ActionParamsStruct params;
				params.Set_Basic(this, 90, 1);
				params.Set_Movement(pos, 1.0f, 5.0f);
				params.MovePathfind = false;
				Commands->Action_Goto(obj, params);
			}
			if (timer_id == 1)
			{
				if (!pad_destroyed && on_pad)
				{
					if (Commands->Get_Health(obj) < Commands->Get_Max_Health(obj))
					{
						Commands->Set_Health(obj, Commands->Get_Health(obj) + 5.0f);
					}
					Commands->Start_Timer(obj, this, 3.0f, 1);
				}
			}
			if (timer_id == 2)
			{
				Commands->Action_Reset(obj, 90);
				Commands->Start_Timer(obj, this, Commands->Get_Random(1.0f, 3.0f), 0);
			}
			if (timer_id == 3)
			{
				GameObject * controller = Commands->Find_Object(1110009);
				if (controller)
				{
					Commands->Send_Custom_Event(obj, controller, 5000, Get_Int_Parameter("Area"));
				}
			}
			if (timer_id == 4)
			{
				Commands->Enable_Engine(obj, false);
			}
		}
	}

	void Action_Complete(GameObject * obj, int action_id, ActionCompleteReason reason)
	{
		if (!pad_destroyed)
		{
			if (reason != ACTION_COMPLETE_NORMAL)
			{
				return;
			}
			if (action_id == 0)
			{
				Commands->Start_Timer(obj, this, 2.0f, 0);
				Commands->Start_Timer(obj, this, 60.0f, 3);
			}
			if (action_id == 1)
			{
				ActionParamsStruct params;
				params.Set_Basic(this, 90, 2);
				params.Set_Attack(STAR, 150.0f, 2.0f, true);
				params.MovePathfind = false;
				Commands->Action_Attack(obj, params);
		
				Commands->Start_Timer(obj, this, Commands->Get_Random(4.0f, 6.0f), 2);
			}
			if (action_id == 2)
			{
				Commands->Start_Timer(obj, this, 1.0f, 4);

				on_pad = true;
				Commands->Start_Timer(obj, this, 5.0f, 1);

				GameObject * controller = Commands->Find_Object(1110009);
				if (controller)
				{
					Commands->Send_Custom_Event(obj, controller, 4000, Get_Int_Parameter("Area"));
				}
			}
			if (action_id == 3)
			{
				Commands->Start_Timer(obj, this, 1.0f, 4);

				on_pad = true;
				Commands->Start_Timer(obj, this, 5.0f, 1);
			}
		}
	}

	void Killed(GameObject * obj, GameObject * killer)
	{
		GameObject * controller = Commands->Find_Object(1110009);
		if (controller)
		{
			Commands->Send_Custom_Event(obj, controller, 2000, Get_Int_Parameter("Area"));
		}
	}
};

DECLARE_SCRIPT(M10_Reinforcement_Controller, "")
{
	int area_count[3];			//Number of units killed in area since last reinforcement
	int target_count[3];			//Number of units neccessary to be killed before reinforcements arrive
	int max_reinforcements[3]; //Max number of times an area can be reinforced
	int current_area;				//Current area the Commando is in

	REGISTER_VARIABLES()
	{
		SAVE_VARIABLE(area_count, 1);
		SAVE_VARIABLE(current_area, 2);
		SAVE_VARIABLE(target_count, 3);
		SAVE_VARIABLE(max_reinforcements, 4);
	}

	void Created(GameObject * obj)
	{
		area_count[0] = area_count[1] = area_count[2] = 0;
		target_count[0] = target_count[1] = target_count[2] = 4 - DIFFICULTY;
		max_reinforcements[0] = max_reinforcements[1] = max_reinforcements[2] = 3;
		current_area = -1;
	}
	
	void Custom(GameObject * obj, int type, int param, GameObject * sender)
	{
		if (type == 3000)
		{
			current_area = param;
			
			if (current_area > 2)
			{
				current_area = 2;
			}
			if (current_area < -1)
			{
				current_area = -1;
			}
		}
		if (type == 10000 && param == 10000 && current_area != -1)
		{
			if (++area_count[current_area] >= target_count[current_area])
			{
				area_count[current_area] = 0;
				Reinforce_Area();
			}
		}
		if (type == 20000 && param >= 0 && param <= 2 && param > -1)
		{
			target_count[param]++;
		}
	}

	void Reinforce_Area(void)
	{
		if (current_area != -1 && max_reinforcements[current_area]-- <= 0)
		{
			max_reinforcements[current_area] = 0;
			return;
		}
		
		typedef struct
		{
			Vector3 Pos;
			float Facing;
		} Reinforce_Info;
		
		Reinforce_Info reinforce[3][4];

		reinforce[0][0].Pos.Set(110.498f, -161.705f, 3.060f);
		reinforce[0][0].Facing = 140.0f;
		reinforce[0][1].Pos.Set(31.971f, -136.521f, 6.669f);
		reinforce[0][1].Facing = 165.0f;
		reinforce[0][2].Pos.Set(-11.678f, -140.165f, 5.467f);
		reinforce[0][2].Facing = -165.0f;
		reinforce[0][3].Pos.Set(11.674f, -195.396f, 0.926f);
		reinforce[0][3].Facing = -175.0f;
		reinforce[1][0].Pos.Set(-98.021f, -67.086f, 7.0f);
		reinforce[1][0].Facing = 130.0f;
		reinforce[1][1].Pos.Set(-96.862f, 19.633f, 7.0f);
		reinforce[1][1].Facing = -105.0f;
		reinforce[1][2].Pos.Set(-161.272f, -26.111f, 8.513f);
		reinforce[1][2].Facing = 15.0f;
		reinforce[1][3].Pos.Set(-184.338f, 60.513f, 8.852f);
		reinforce[1][3].Facing = -145.0f;
		reinforce[2][0].Pos.Set(16.075f, 172.231f, 2.541f);
		reinforce[2][0].Facing = 175.0f;
		reinforce[2][1].Pos.Set(56.842f, 182.570f, 1.399f);
		reinforce[2][1].Facing = 30.0f;
		reinforce[2][2].Pos.Set(24.164f, 230.841f, 0.704f);
		reinforce[2][2].Facing = 15.0f;
		reinforce[2][3].Pos.Set(23.470f, 158.990f, 6.251f);
		reinforce[2][3].Facing = 0.0f;

		if (Commands->Get_Random_Int(0, 2) == 1)
		{
			int num = Commands->Get_Random_Int(0, 4);
			Reinforce_By_Rope(reinforce[current_area][num].Pos, reinforce[current_area][num].Facing);
		}
		else
		{
			int num = Commands->Get_Random_Int(0, 4);
			Reinforce_By_Parachute(reinforce[current_area][num].Pos, reinforce[current_area][num].Facing);
		}
	}

	void Reinforce_By_Rope(const Vector3 & pos, float facing)
	{
		GameObject *new_obj = Commands->Create_Object("Invisible_Object", pos);
		Commands->Set_Facing(new_obj, facing);
		Commands->Attach_Script(new_obj, "Test_Cinematic", "X10I_TroopDrop.txt");
	}

	void Reinforce_By_Parachute(const Vector3 & pos, float facing)
	{
		GameObject * new_obj = Commands->Create_Object("Invisible_Object", pos);
		Commands->Set_Facing(new_obj, facing);
		Commands->Attach_Script(new_obj, "Test_Cinematic", "X10D_CHTroopdrop1.txt");
	}
};

DECLARE_SCRIPT(M10_Chinook_ParaDrop, "Preset:string")
{
	int chinook_id;
	bool dead;
	int out;

	REGISTER_VARIABLES()
	{
		SAVE_VARIABLE(chinook_id, 1);
		SAVE_VARIABLE(dead, 2);
		SAVE_VARIABLE(out, 3);
	}
	
	void Created(GameObject * obj)
	{
		Vector3 loc = Commands->Get_Position(obj);
		float facing = Commands->Get_Facing(obj);
		
		GameObject *chinook_rail = Commands->Create_Object("Generic_Cinematic", loc);
		Commands->Set_Model(chinook_rail, "X5D_Chinookfly");
		Commands->Set_Facing(chinook_rail, facing);
		Commands->Set_Animation(chinook_rail, "X5D_Chinookfly.X5D_Chinookfly", false);
		GameObject *chinook = Commands->Create_Object("Nod_Chinook", loc);
		Commands->Set_Facing(chinook, facing);
		Commands->Set_Animation(chinook, "v_nod_chinook.vf_nod_chinook", true);
		Commands->Attach_To_Object_Bone(chinook, chinook_rail, "BN_Chinook_1");

		dead = false;
		out = 0;
		char params[10];
		sprintf(params, "%d", Commands->Get_ID(obj));
		Commands->Attach_Script(chinook, "M10_Reinforcement_Chinook", params);

		chinook_id = Commands->Get_ID(chinook);
		
		// Destroy Chinook
		Commands->Start_Timer(obj, this, 280.0f/30.0f, 0);
		// Parachutes
		Commands->Start_Timer(obj, this, 169.0f/30.0f, 1);
		Commands->Start_Timer(obj, this, 179.0f/30.0f, 2);
		Commands->Start_Timer(obj, this, 198.0f/30.0f, 3);
		// Soldiers
		Commands->Start_Timer(obj, this, 145.0f/30.0f, 4);
		Commands->Start_Timer(obj, this, 155.0f/30.0f, 5);
		Commands->Start_Timer(obj, this, 165.0f/30.0f, 6);

		
	}

	void Timer_Expired(GameObject * obj, int timer_id)
	{
		Vector3 loc = Commands->Get_Position(obj);
		const char * preset = Get_Parameter("Preset");
		float facing = Commands->Get_Facing(obj);

		switch (timer_id)
		{
		case 0: 
			GameObject *chinook;
			chinook = Commands->Find_Object(chinook_id);
			Commands->Destroy_Object(chinook);
			break;
		case 1: 
			if (out >= 1)
			{
				GameObject *para1;
				para1 = Commands->Create_Object("Generic_Cinematic", loc);
				Commands->Set_Facing(para1, facing);
				Commands->Set_Model(para1, "X5D_Parachute");
				Commands->Set_Animation(para1, "X5D_Parachute.X5D_ParaC_1", false);
				Commands->Create_3D_Sound_At_Bone("parachute_open", para1, "ROOTTRANSFORM");
				Commands->Attach_Script(para1, "M10_No_More_Parachute", "");
			}
			break;
		case 2: 
			if (out >= 2)
			{
				GameObject *para2;
				para2 = Commands->Create_Object("Generic_Cinematic", loc);
				Commands->Set_Facing(para2, facing);
				Commands->Set_Model(para2, "X5D_Parachute");
				Commands->Set_Animation(para2, "X5D_Parachute.X5D_ParaC_2", false);
				Commands->Create_3D_Sound_At_Bone("parachute_open", para2, "ROOTTRANSFORM");
				Commands->Attach_Script(para2, "M10_No_More_Parachute", "");
			}
			break;
		case 3: 
			if (out == 3)
			{
				GameObject *para3;
				para3 = Commands->Create_Object("Generic_Cinematic", loc);
				Commands->Set_Facing(para3, facing);
				Commands->Set_Model(para3, "X5D_Parachute");
				Commands->Set_Animation(para3, "X5D_Parachute.X5D_ParaC_3", false);
				Commands->Create_3D_Sound_At_Bone("parachute_open", para3, "ROOTTRANSFORM");
				Commands->Attach_Script(para3, "M10_No_More_Parachute", "");
			}
			break;
		case 4: 
			if (!dead)
			{
			
			GameObject *box1 = Commands->Create_Object("Generic_Cinematic", loc);
			Commands->Set_Model(box1, "X5D_Box01");
			Commands->Set_Facing(box1, facing);
			Commands->Set_Animation(box1, "X5D_Box01.X5D_Box01", false);

			GameObject *soldier1;
			soldier1 = Commands->Create_Object_At_Bone(box1, preset, "Box01");
			Commands->Set_Facing(soldier1, facing);
			Commands->Attach_Script(soldier1, "RMV_Trigger_Killed", "1110009, 10000, 10000");
			Commands->Attach_Script(soldier1, "M00_No_Falling_Damage_DME", "");
			Commands->Attach_To_Object_Bone( soldier1, box1, "Box01" );
			Commands->Set_Animation(soldier1, "s_a_human.H_A_X5D_ParaT_1", false);
			out++;
		
			}
			break;
		case 5: 
			if (!dead)
			{

			GameObject *box2 = Commands->Create_Object("Generic_Cinematic", loc);
			Commands->Set_Model(box2, "X5D_Box02");
			Commands->Set_Facing(box2, facing);
			Commands->Set_Animation(box2, "X5D_Box02.X5D_Box02", false);

			GameObject *soldier2;
			soldier2 = Commands->Create_Object_At_Bone(box2, preset, "Box02");
			Commands->Set_Facing(soldier2, facing);
			Commands->Attach_Script(soldier2, "RMV_Trigger_Killed", "1110009, 10000, 10000");
			Commands->Attach_Script(soldier2, "M00_No_Falling_Damage_DME", "");
			Commands->Set_Animation(soldier2, "s_a_human.H_A_X5D_ParaT_2", false);
			Commands->Attach_To_Object_Bone( soldier2, box2, "Box02" );
			out++;
				
			}
			break;
		case 6: 
			if (!dead)
			{

			GameObject *box3 = Commands->Create_Object("Generic_Cinematic", loc);
			Commands->Set_Model(box3, "X5D_Box03");
			Commands->Set_Facing(box3, facing);
			Commands->Set_Animation(box3, "X5D_Box03.X5D_Box03", false);

			GameObject *soldier3;
			soldier3 = Commands->Create_Object_At_Bone(box3, preset, "Box03");
			Commands->Set_Facing(soldier3, facing);
			Commands->Attach_Script(soldier3, "RMV_Trigger_Killed", "1110009, 10000, 10000");
			Commands->Attach_Script(soldier3, "M00_No_Falling_Damage_DME", "");
			Commands->Set_Animation(soldier3, "s_a_human.H_A_X5D_ParaT_3", false);
			Commands->Attach_To_Object_Bone( soldier3, box3, "Box03" );
			out++;
			
			}
			break;
		
		}
	}

	void Custom(GameObject * obj, int type, int param, GameObject * sender)
	{
		if (type == 23000 && param == 23000)
		{
			dead = true;
		}
	}
};

DECLARE_SCRIPT(M10_No_More_Parachute, "")
{
	void Destroyed(GameObject * obj)
	{
		Commands->Create_3D_Sound_At_Bone("parachute_away", obj, "ROOTTRANSFORM");
	}
};

DECLARE_SCRIPT(M10_Reinforcement_Chinook, "Controller_ID:int")
{
	int sound_id;

	REGISTER_VARIABLES()
	{
		SAVE_VARIABLE(sound_id, 1);
	}
	
	void Created(GameObject * obj)
	{
		sound_id = Commands->Create_3D_Sound_At_Bone("Chinook_Idle_01", obj, "V_FUSELAGE");
	}
	
	void Killed(GameObject * obj, GameObject * killer)
	{
		GameObject * con = Commands->Find_Object(Get_Int_Parameter(0));
		Commands->Send_Custom_Event(obj, con, 23000, 23000);
	}

	void Destroyed(GameObject * obj)
	{
		Commands->Stop_Sound(sound_id, true);
	}
};

DECLARE_SCRIPT(M10_Cargo_Plane_Dropoff, "")
{
	bool already_entered;
	bool tank_alive;
	bool airstrip_alive;
		
	// Register variables to be Auto-Saved
	// All variables must have a unique ID, less than 256, that never changes
	REGISTER_VARIABLES()
	{
		SAVE_VARIABLE( already_entered, 1 );
		SAVE_VARIABLE( tank_alive, 2 );
		SAVE_VARIABLE( airstrip_alive, 3 );
	}

	void Created (GameObject * obj)
	{
		already_entered = false;
		tank_alive = false;
		airstrip_alive = true;				
	}

	void Custom( GameObject * obj, int type, int param, GameObject * sender )
	{
		if (type == TANK_KILLED)
		{
			tank_alive = false;
		}

		if (type == NO_DROP)
		{
			airstrip_alive = false;
		}
	}

	void Entered(GameObject * obj, GameObject * enterer)
	{
		if (!already_entered && Commands->Get_Health (Commands->Find_Object (1154061)) > 0.0f)
		{
			already_entered = true;
			tank_alive = true;
		
			Vector3 pos = Vector3(-128.772f, -3.245f, 8.151f);
			GameObject * new_object = Commands->Create_Object("Invisible_Object", pos);
			Commands->Set_Facing(new_object, 90.0f);
			Commands->Attach_Script(new_object, "Test_Cinematic", "CnC_C130Drop.txt");

			GameObject * stealth_tank = Commands->Create_Object("Nod_Stealth_Tank", Vector3(0,0,0));
			if (stealth_tank)
			{
				Commands->Send_Custom_Event(obj, new_object, M00_CUSTOM_CINEMATIC_SET_SLOT + 3, Commands->Get_ID(stealth_tank));
				Commands->Attach_Script(stealth_tank, "M10_Stealth_Attack_02", "");
			}

			Commands->Start_Timer (obj, this, 10.0f, CARGO_DROP);
		}		
	}

	void Timer_Expired(GameObject * obj, int timer_id )
	{
		if (timer_id == CARGO_DROP)
		{
			if (!tank_alive && airstrip_alive)
			{
				tank_alive = true;

				Vector3 pos = Vector3(-128.772f, -3.245f, 8.151f);
				GameObject * new_object = Commands->Create_Object("Invisible_Object", pos);
				Commands->Set_Facing(new_object, 90.0f);
				Commands->Attach_Script(new_object, "Test_Cinematic", "CnC_C130Drop.txt");

				GameObject * stealth_tank = Commands->Create_Object("Nod_Stealth_Tank", Vector3(0,0,0));
				if (stealth_tank)
				{
					Commands->Send_Custom_Event(obj, new_object, M00_CUSTOM_CINEMATIC_SET_SLOT + 3, Commands->Get_ID(stealth_tank));
					Commands->Attach_Script(stealth_tank, "M10_Stealth_Attack_02", "");
				}

				Commands->Start_Timer (obj, this, 10.0f, CARGO_DROP);
			}
		}
	}
};

DECLARE_SCRIPT(M10_Light_Tank, "")
{
	bool attacking;

	REGISTER_VARIABLES()
	{
		SAVE_VARIABLE(attacking, 1);
	}
	
	void Created(GameObject * obj)
	{
		attacking = false;
		
		Commands->Start_Timer(obj, this, (470.0f/30.0f + 2.0f), 0);
	}

	void Timer_Expired(GameObject * obj, int timer_id)
	{
		if (timer_id == 0)
		{
			ActionParamsStruct params;
			params.Set_Basic(this, 90, 0);
			params.Set_Movement(STAR, 0.2f, 20.0f);
			params.MoveFollow = true;
			params.Set_Attack(STAR, 100.0f, 4.0f, true);
			params.AttackActive = attacking;
			Commands->Action_Attack(obj, params);
			Commands->Start_Timer(obj, this, 3.0f, 1);
		}
		if (timer_id == 1)
		{
			ActionParamsStruct params;
			params.Set_Basic(this, 90, 0);
			params.Set_Movement(STAR, 0.2f, 20.0f);
			params.MoveFollow = true;
			params.Set_Attack(STAR, 100.0f, 4.0f, true);
			attacking = !attacking;
			params.AttackActive = attacking;
			Commands->Modify_Action(obj, 0, params);
			Commands->Start_Timer(obj, this, (attacking) ? 3.0f : 5.0f, 1);
		}
	}
};

DECLARE_SCRIPT(M10_Ion_Cannon_Detector, "")
{
	void Created(GameObject * obj)
	{
		Commands->Set_Is_Rendered(obj, false);
		Commands->Enable_Hibernation(obj, false);
		Commands->Disable_All_Collisions(obj);
	}
	
	void Damaged(GameObject * obj, GameObject * damager, float amount)
	{
		Commands->Set_Health(obj, Commands->Get_Max_Health(obj));
	}
	
	void Sound_Heard(GameObject * obj, const CombatSound & sound)
	{
		if (sound.Type != SOUND_TYPE_DESIGNER07)
		{
			return;
		}
		
		GameObject * obj_con = Commands->Find_Object(1100154);
		Vector3 my_pos = Commands->Get_Position(obj);
		if (Commands->Get_Distance(my_pos, sound.Position) <= 6.0f)
		{
			if (obj_con)
			{
				Commands->Send_Custom_Event(obj, obj_con, 1007, 1);
			}
		}
		else
		{
			if (obj_con)
			{
				Commands->Send_Custom_Event(obj, obj_con, 1007, 2);
			}
		}
	}
};

    ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////DME/////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////

DECLARE_SCRIPT (M10_Vehicle_Attack_02, "")	
{
	bool attacking, charge, charging;

	Vector3 current_loc;
	Vector3 enemy_loc;

	enum{ATTACK_OVER};

	// Register variables to be Auto-Saved
	// All variables must have a unique ID, less than 256, that never changes
	REGISTER_VARIABLES()
	{		
		SAVE_VARIABLE( attacking, 1 );
		SAVE_VARIABLE( charge, 2 );
		SAVE_VARIABLE( charging, 3 );
		SAVE_VARIABLE( current_loc, 4 );
		SAVE_VARIABLE( enemy_loc, 5 );
	}

	void Created(GameObject * obj)
	{
		Commands->Set_Player_Type ( obj, SCRIPT_PLAYERTYPE_NOD );
		Commands->Enable_Enemy_Seen( obj, true);
		attacking = false;	
	}

	void Enemy_Seen(GameObject * obj, GameObject *enemy )
	{
		current_loc = Commands->Get_Position ( obj );
		enemy_loc = Commands->Get_Position ( enemy );
		
		if (!attacking)
		{
			if ((Commands->Get_Distance(current_loc, enemy_loc)) < 100.0f)
			{
				attacking = true;
				
				ActionParamsStruct params;
				params.Set_Basic( this, INNATE_PRIORITY_ENEMY_SEEN + 5, 10 );
				params.Set_Attack(enemy, 100.0f, 7.5f, true);
				params.AttackCheckBlocked = true;
				params.AttackActive = true;
				Commands->Action_Attack (obj, params);				
				
				Commands->Start_Timer(obj, this, 5.0f, ATTACK_OVER);
								
			}
		}

	}

	void Timer_Expired (GameObject* obj, int timer_id)
	{
		ActionParamsStruct params;

		if (timer_id == ATTACK_OVER)
		{
			attacking = false;
			
		}

	}
	
};

DECLARE_SCRIPT (M10_Stealth, "")	
{
	void Created (GameObject *obj)
	{
		Commands->Enable_Stealth (obj, true);
	}
};

DECLARE_SCRIPT(M10_Home_Point, "Radius=5.0:float")
{
	void Created(GameObject * obj)
	{
		Commands->Set_Innate_Soldier_Home_Location(obj, Commands->Get_Position(obj), Get_Float_Parameter("Radius"));
	}
};

DECLARE_SCRIPT(M10_HON_Spawn_Zones, "Zone_Number:int")
{
	void Entered(GameObject * obj, GameObject * enterer)
	{
		switch (Get_Int_Parameter("Zone_Number"))
		{
		case 1:
			{
				Commands->Enable_Spawner (1100124, true);
				Commands->Enable_Spawner (1100123, true);
			}
			break;
		case 2:
			{
				Commands->Enable_Spawner (1100125, true);
				Commands->Enable_Spawner (1100127, true);
			}
			break;
		case 3:
			{
				Commands->Enable_Spawner (1100128, true);
				Commands->Enable_Spawner (1100130, true);
				Commands->Enable_Spawner (1100129, true);
			}
			break;
		case 4:
			{
				Commands->Enable_Spawner (1100142, true);
				Commands->Enable_Spawner (1100143, true);
				Commands->Enable_Spawner (1100145, true);
				Commands->Enable_Spawner (1100147, true);
				Commands->Enable_Spawner (1100153, true);
			}
			break;
		case 5:
			{
				Commands->Enable_Spawner (1100148, true);
				Commands->Enable_Spawner (1100150, true);
				Commands->Enable_Spawner (1100151, true);
				Commands->Enable_Spawner (2000748, true);
				Commands->Enable_Spawner (2000749, true);
				Commands->Enable_Spawner (2000750, true);
				Commands->Enable_Spawner (2000751, true);
			}
			break;
		}
	}
};

DECLARE_SCRIPT(M10_Refinery_Spawn_Zones, "Zone_Number:int")
{
	void Entered(GameObject * obj, GameObject * enterer)
	{
		switch (Get_Int_Parameter("Zone_Number"))
		{
		case 1:
			{
				Commands->Enable_Spawner (1100202, true);
				Commands->Enable_Spawner (1100209, true);
			}
			break;
		case 2:
			{
				Commands->Enable_Spawner (1100203, true);
				Commands->Enable_Spawner (1100204, true);
				Commands->Enable_Spawner (2000890, true);
			}
			break;
		case 3:
			{
				Commands->Enable_Spawner (1100212, true);
				Commands->Enable_Spawner (1100210, true);
			}
			break;
		case 4:
			{
				Commands->Enable_Spawner (2000767, true);
				Commands->Enable_Spawner (2000758, true);
				Commands->Enable_Spawner (1100213, true);
				Commands->Enable_Spawner (2000768, true);
			}
			break;
		case 5:
			{
				Commands->Enable_Spawner (1100215, true);
				Commands->Enable_Spawner (1100216, true);
				Commands->Enable_Spawner (2000769, true);
			}
			break;
		case 6:
			{
				Commands->Enable_Spawner (2000770, true);
				Commands->Enable_Spawner (1100220, true);
			}
			break;
		}
	}
};

DECLARE_SCRIPT(M10_PowerPlant_Spawn_Zones, "Zone_Number:int")
{
	void Entered(GameObject * obj, GameObject * enterer)
	{
		switch (Get_Int_Parameter("Zone_Number"))
		{
		case 1:
			{
				Commands->Enable_Spawner (1100244, true);
				Commands->Enable_Spawner (1100245, true);
			}
			break;
		case 2:
			{
				Commands->Enable_Spawner (1100252, true);
				Commands->Enable_Spawner (1100255, true);
			}
			break;
		case 3:
			{
				Commands->Enable_Spawner (1100257, true);
				Commands->Enable_Spawner (1100259, true);
			}
			break;
		case 4:
			{
				Commands->Enable_Spawner (2000801, true);
				Commands->Enable_Spawner (2000802, true);
				Commands->Enable_Spawner (2000803, true);
				Commands->Enable_Spawner (2000804, true);
			}
			break;
		}
	}
};

DECLARE_SCRIPT(M10_ComCenter_Spawn_Zones, "Zone_Number:int")
{
	void Entered(GameObject * obj, GameObject * enterer)
	{
		switch (Get_Int_Parameter("Zone_Number"))
		{
		case 1:
			{
				Commands->Enable_Spawner (1100232, true);
				Commands->Enable_Spawner (2000805, true);
			}
			break;
		case 2:
			{
				Commands->Enable_Spawner (2000806, true);
				//Commands->Enable_Spawner (1100238, true);
				Commands->Enable_Spawner (1100243, true);
				Commands->Enable_Spawner (2000812, true);
			}
			break;
		case 3:
			{
				Commands->Enable_Spawner (2000807, true);
				Commands->Enable_Spawner (1100233, true);
				//Commands->Enable_Spawner (1100234, true);
				//Commands->Enable_Spawner (2000811, true);
				Commands->Enable_Spawner (2000809, true);
				Commands->Enable_Spawner (2000810, true);
				//Commands->Enable_Spawner (2000808, true);
			}
			break;
		case 4:
			{
				Commands->Enable_Spawner (2000813, true);
				//Commands->Enable_Spawner (1100241, true);
				Commands->Enable_Spawner (1100240, true);
				//Commands->Enable_Spawner (2000814, true);
				Commands->Enable_Spawner (2000815, true);
			}
			break;
		case 5:
			{
				Commands->Enable_Spawner (2000816, true);
				Commands->Enable_Spawner (2000817, true);
			}
			break;
		case 6:
			{
				Commands->Enable_Spawner (2000819, true);
				Commands->Enable_Spawner (2000818, true);
			}
			break;
		}
	}
};

DECLARE_SCRIPT (M10_Gate_Test, "")
{
	void Poked(GameObject * obj, GameObject * poker)
	{
		Commands->Static_Anim_Phys_Goto_Last_Frame (2050007, NULL );
	}
};

DECLARE_SCRIPT (M10_Mammoth_Attack, "")	
{
	bool attacking;
	int target [4];
	bool valid [4];
	int choice;

	
	enum{ATTACK_OVER};

	// Register variables to be Auto-Saved
	// All variables must have a unique ID, less than 256, that never changes
	REGISTER_VARIABLES()
	{		
		SAVE_VARIABLE( attacking, 1 );
		SAVE_VARIABLE( valid, 2 );
		SAVE_VARIABLE( choice, 3 );
	}

	void Created(GameObject * obj)
	{
		attacking = false;
		
		target [0] = 2000788;
		target [1] = 2000795;
		target [2] = 2000796;
		target [3] = 2000797;

		valid [0] = true;
		valid [1] = true;
		valid [2] = true;
		valid [3] = true;

		choice = Commands->Get_Random_Int(0,4);
	}

	void Custom(GameObject * obj, int type, int param, GameObject * sender)
	{
		if (type == MAMMOTH && param == ATTACK)
		{
			Commands->Start_Timer(obj, this, 0.1f, ATTACK_OVER);
		}

		if (type == TARGET)
		{
			switch (param)
			{
			case 0:
				{
					valid [param] = false;
				}
				break;
			case 1:
				{
					valid [param] = false;
				}
				break;
			case 2:
				{
					valid [param] = false;
				}
				break;
			}
		}
	}

	void Timer_Expired (GameObject* obj, int timer_id)
	{


		if (timer_id == ATTACK_OVER)
		{

			if (!attacking)
			{
					attacking = true;
					
					while (!(valid [choice]))
					{
						choice = Commands->Get_Random_Int(0,4);
					}

					GameObject *mammoth_target = Commands->Find_Object(target [choice]);

					ActionParamsStruct params;
					params.Set_Basic( this, INNATE_PRIORITY_ENEMY_SEEN + 5, 10 );
					params.Set_Attack(mammoth_target, 1500.0f, 1.5f, true);
					params.AttackCheckBlocked = false;
					params.AttackActive = true;
					Commands->Action_Attack (obj, params);				
					
					Commands->Start_Timer(obj, this, 5.0f, ATTACK_OVER);
			}
			attacking = false;			
		}
	}	
};

DECLARE_SCRIPT (M10_Mammoth_Target_Destruction, "Target_Number:int")
{
	void Destroyed(GameObject * obj)
	{
		Commands->Send_Custom_Event (obj, Commands->Find_Object(2000787), TARGET, Get_Int_Parameter("Target_Number"), 0.0f);
	}
};


DECLARE_SCRIPT (M10_Mammoth_Activate_Zone, "")
{
	bool already_entered;
	
		
	// Register variables to be Auto-Saved
	// All variables must have a unique ID, less than 256, that never changes
	REGISTER_VARIABLES()
	{
		SAVE_VARIABLE( already_entered, 1 );		
	}

	void Created (GameObject * obj)
	{
		already_entered = false;
				
	}
	
	void Entered (GameObject * obj, GameObject * enterer)
	{
		if ((Commands->Is_A_Star(enterer)) && (!already_entered))
		{
			already_entered = true;

			Commands->Send_Custom_Event (obj, Commands->Find_Object(2000787), MAMMOTH, ATTACK, 0.0f);
		}
	}
};

DECLARE_SCRIPT (M10_Stationary, "")
{
	void Created(GameObject *obj)
	{
		Commands->Set_Innate_Is_Stationary ( obj, true );

	}
};

DECLARE_SCRIPT(M10_TestStealth, "")
{
	bool stealthed;
	float delayTimer;

	REGISTER_VARIABLES()
	{		
		SAVE_VARIABLE( stealthed, 1 );
		SAVE_VARIABLE( delayTimer, 2 );
	}

	void Created( GameObject * obj ) 
	{
		Commands->Innate_Disable(obj);
		delayTimer = Commands->Get_Random ( 10, 20 );
		Commands->Start_Timer(obj, this, delayTimer, 5);
		stealthed = false;
	}

	void Timer_Expired(GameObject * obj, int timer_id)
	{
		if (stealthed == true)
		{
			stealthed = false;
			Commands->Enable_Stealth(obj, false);
			Commands->Debug_Message ( "***************************going out of stealth\n" );
		}

		else
		{
			stealthed = true;
			Commands->Enable_Stealth(obj, true);
			Commands->Debug_Message ( "***************************going to stealth\n" );
		}


		Commands->Start_Timer(obj, this, delayTimer, 5);
	}
};

DECLARE_SCRIPT (M10_GDI_Reinforcement_Waypath, "")
{
	void Created (GameObject * obj)
	{
		Commands->Set_Innate_Aggressiveness ( obj, 10.0f );
		Commands->Set_Innate_Take_Cover_Probability ( obj, 100.0f );

		ActionParamsStruct params;
		params.Set_Basic( this, INNATE_PRIORITY_ENEMY_SEEN - 5, 10 );
		params.Set_Movement( Vector3(0,0,0), RUN, 0 );
		params.WaypathID = 2000852;			
		Commands->Action_Goto (obj, params);
	}

	void Killed(GameObject * obj, GameObject * killer)
	{
		Commands->Send_Custom_Event(obj, Commands->Find_Object (2000861), KILLED, 1);
	}		
};

DECLARE_SCRIPT (M10_GDI_Reinforcement, "")
{
	bool already_entered;
	int kill_tally;
	
		
	// Register variables to be Auto-Saved
	// All variables must have a unique ID, less than 256, that never changes
	REGISTER_VARIABLES()
	{
		SAVE_VARIABLE( already_entered, 1 );
		SAVE_VARIABLE( kill_tally, 2 );
	}

	void Created (GameObject * obj)
	{
		already_entered = false;
		kill_tally = 0;
				
	}

	void Custom(GameObject * obj, int type, int param, GameObject * sender)
	{
		if (type == REINFORCE)
		{
			Commands->Enable_Spawner (2000850, true);
			Commands->Enable_Spawner (2000849, true);
			Commands->Enable_Spawner (2000851, true);


			GameObject *drop_obj = Commands->Find_Object (2000861);
			GameObject *drop_obj2 = Commands->Find_Object (1203588);

			float facing = Commands->Get_Facing (drop_obj);
			Vector3 drop_loc = Commands->Get_Position (drop_obj);

			float facing2 = Commands->Get_Facing (drop_obj2);
			Vector3 drop_loc2 = Commands->Get_Position (drop_obj2);

			GameObject *new_obj = Commands->Create_Object("Invisible_Object", drop_loc);
			Commands->Set_Facing(new_obj, facing);
			Commands->Attach_Script(new_obj, "Test_Cinematic", "M10_X3I_GDI_TroopDrop1.txt");

			GameObject *new_obj2 = Commands->Create_Object("Invisible_Object", drop_loc2);
			Commands->Set_Facing(new_obj2, facing2);
			Commands->Attach_Script(new_obj2, "Test_Cinematic", "M10_X3I_GDI_TroopDrop1.txt");
		}

		if (type == KILLED)
		{
			kill_tally++;

			if (kill_tally >= 3)
			{
				kill_tally = 0;

				GameObject *drop_obj = Commands->Find_Object (2000861);

				float facing = Commands->Get_Facing (drop_obj);
				Vector3 drop_loc = Commands->Get_Position (drop_obj);

				GameObject *new_obj = Commands->Create_Object("Invisible_Object", drop_loc);
				Commands->Set_Facing(new_obj, facing);
				Commands->Attach_Script(new_obj, "Test_Cinematic", "M10_X3I_GDI_TroopDrop1.txt");
			}
		}
	}
};

DECLARE_SCRIPT (M10_SAM_Reinforce, "")
{
	void Killed (GameObject * obj, GameObject * killer)
	{
		Commands->Send_Custom_Event(obj, Commands->Find_Object (2000861), REINFORCE, 1);
	}
};

DECLARE_SCRIPT (M10_Refinery_Key_Grant, "")
{
	void Killed (GameObject * obj, GameObject * killer)
	{
		Vector3 create_position = Commands->Get_Position( obj );
		create_position.Z += 1.0f;
		GameObject * key1;
		key1 = Commands->Create_Object( "Level_01_Keycard", create_position );
		Commands->Attach_Script(key1, "M10_Refinery_Keycard", "");
		
		Commands->Set_Objective_Radar_Blip_Object(1012, key1);
	}
};

DECLARE_SCRIPT (M10_Gate_Check, "Objective:int, Gate1:int, Gate2:int")
{
	bool already_poked, first, second;

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

	void Created (GameObject *obj)
	{
		already_poked = false;
		first = false;
		second = false;
	}

	void Action_Complete(GameObject * obj, int action_id, ActionCompleteReason reason)
	{
		GameObject * obj_con = Commands->Find_Object(1100154);

		if (action_id == 100002)
		{
			first = true;
			Commands->Send_Custom_Event(obj, obj_con, 1005, 1);
		}

		if (action_id == 100008)
		{
			second = true;
			Commands->Send_Custom_Event(obj, obj_con, 1007, 1);
		}

		if (action_id == 100017)
		{
			Commands->Send_Custom_Event(obj, obj_con, 1006, 1);
		}

	}
	
	void Poked(GameObject * obj, GameObject * poker)
	{
		GameObject * obj_con = Commands->Find_Object(1100154);

		if (!already_poked)
		{			
			if (Commands->Has_Key(STAR, 1))
			{
				already_poked = true;

				int objective = Get_Int_Parameter("Objective");
				int gate1 = Get_Int_Parameter("Gate1");
				int gate2 = Get_Int_Parameter("Gate2");

					//Commands->Send_Custom_Event(obj, Commands->Find_Object (1100154), objective, 1);
				Commands->Static_Anim_Phys_Goto_Last_Frame (gate1, NULL );
				Commands->Static_Anim_Phys_Goto_Last_Frame (gate2, NULL );

				if (objective == 1005)
				{
					int id = Commands->Create_Conversation("M10CON002", 99, 2000, false);
					Commands->Join_Conversation(NULL, id);
					Commands->Start_Conversation(id, 100002);
					Commands->Monitor_Conversation(obj, id);
				}

				if (objective == 1007 && first)
				{
					int id = Commands->Create_Conversation("M10CON008", 99, 2000, false);
					Commands->Join_Conversation(NULL, id);
					Commands->Start_Conversation(id, 100008);
					Commands->Monitor_Conversation(obj, id);
				}

				if (objective == 1007 && !first)
				{
					second = true;
					Commands->Send_Custom_Event(obj, obj_con, 1007, 1);
				}

				if (objective == 1006 && first && second)
				{
					int id = Commands->Create_Conversation("M10CON017", 99, 2000, false);
					Commands->Join_Conversation(NULL, id);
					Commands->Join_Conversation(STAR, id);
					Commands->Start_Conversation(id, 100017);
					Commands->Monitor_Conversation(obj, id);
				}

				if (objective == 1006 && !first && second)
				{
					Commands->Send_Custom_Event(obj, obj_con, 1006, 1);
				}

				if (objective == 1006 && first && !second)
				{
					Commands->Send_Custom_Event(obj, obj_con, 1006, 1);
				}

				if (objective == 1006 && !first && !second)
				{
					Commands->Send_Custom_Event(obj, obj_con, 1006, 1);
				}
			}
		}
	}
};

DECLARE_SCRIPT (M10_ConYard_Key_Grant, "")
{
	void Killed (GameObject * obj, GameObject * killer)
	{
		Vector3 create_position = Commands->Get_Position( obj );
		create_position.Z += 1.0f;
		Commands->Create_Object( "Level_03_Keycard", create_position );
			
	}
};

DECLARE_SCRIPT (M10_Spacecraft_Check, "")
{
	void Poked(GameObject * obj, GameObject * poker)
	{
		if (Commands->Has_Key(STAR, 3))
		{
			Commands->Static_Anim_Phys_Goto_Last_Frame (2058171, NULL );
		}
	}
};

DECLARE_SCRIPT (M10_Mammoth_Grant_Controller, "") //2001634
{
	bool hon_alive;


	// Register variables to be Auto-Saved
	// All variables must have a unique ID, less than 256, that never changes
	REGISTER_VARIABLES()
	{
		SAVE_VARIABLE( hon_alive, 1 );
		
	}

	void Created (GameObject * obj)
	{
		hon_alive = true;
				
	}
	
	void Custom(GameObject * obj, int type, int param, GameObject * sender)
	{
		GameObject * mammoth = Commands->Find_Object (2000787);

		if (type == KILLED)
		{
			if (param == HON)
			{
				hon_alive = false;
				
				if (!hon_alive && mammoth)
				{
					Commands->Send_Custom_Event(obj, obj, GRANT, 0);
				}
			}			
		}

		if (type == GRANT)
		{
			GameObject *mammoth = Commands->Find_Object (2000787);
			float curr_health = Commands->Get_Health(mammoth);
			Vector3 mammoth_loc = Commands->Get_Position (mammoth);
			float mammoth_face = Commands->Get_Facing (mammoth);

			GameObject *mammoth_new;
			
			mammoth_new = Commands->Create_Object ("GDI_Mammoth_Tank_Player", mammoth_loc);
			Commands->Attach_Script(mammoth_new, "M10_Occupied", "");
			Commands->Set_Health(mammoth_new, curr_health);
			Commands->Set_Facing ( mammoth_new, mammoth_face );

			Commands->Destroy_Object (mammoth);

			GameObject *GDI_soldier;
			Vector3 GI_loc = Commands->Get_Position (Commands->Find_Object (2001634));
			GDI_soldier = Commands->Create_Object ("GDI_MP", GI_loc);

			int id = Commands->Create_Conversation("M10CON071", 99, 2000, false);
			Commands->Join_Conversation(GDI_soldier, id);
			Commands->Start_Conversation(id, 100071);
			Commands->Monitor_Conversation(obj, id);		
		}
	}
};

DECLARE_SCRIPT (M10_Hon_Killed, "")
{
	void Killed(GameObject * obj, GameObject * killer)
	{
		Commands->Enable_Spawner (2000849, false);
		Commands->Enable_Spawner (2000850, false);
		Commands->Enable_Spawner (2000851, false);

		Commands->Send_Custom_Event(obj, Commands->Find_Object (2001634), KILLED, HON);
	}
};

DECLARE_SCRIPT (M10_Helipad_Killed, "")
{
	void Killed(GameObject * obj, GameObject * killer)
	{
		Commands->Send_Custom_Event(obj, Commands->Find_Object (2001634), KILLED, HELIPAD);
	}
};

DECLARE_SCRIPT (M10_Stealth_Drop, "")
{
	void Created (GameObject * obj)
	{
		Commands->Enable_Stealth (obj, false);
	}

	void Destroyed(GameObject * obj) 
	{
		Commands->Send_Custom_Event( obj, Commands->Find_Object (1110056), KILLED, 0 );
	}

	void Custom(GameObject * obj, int type, int param, GameObject * sender)
	{
		if (type == 2500)
		{
			Commands->Enable_Stealth (obj, true);

			Commands->Start_Timer(obj, this, 2.5f, 2501);
		}

		if (type == 3500)
		{
			Commands->Enable_Stealth (obj, true);			
		}
	}

	void Timer_Expired(GameObject * obj, int timer_id )
	{		
		if(timer_id == 2501)
		{
			Commands->Destroy_Object (obj);
		}
	}
};

DECLARE_SCRIPT(DME_Cinematic_Zone, "")
{
	bool already_entered;
	int drop_area [4];
	bool stealthtank_alive;
	int reinforce_chance;
	int stealth_counter;
		
		
	// Register variables to be Auto-Saved
	// All variables must have a unique ID, less than 256, that never changes
	REGISTER_VARIABLES()
	{
		SAVE_VARIABLE( already_entered, 1 );
		SAVE_VARIABLE( stealthtank_alive, 2 );
		SAVE_VARIABLE( reinforce_chance, 3 );
		SAVE_VARIABLE( stealth_counter, 4 );
		SAVE_VARIABLE( drop_area [0], 5 );
		SAVE_VARIABLE( drop_area [1], 6 );
		SAVE_VARIABLE( drop_area [2], 7 );
		SAVE_VARIABLE( drop_area [3], 8 );
	}

	void Created (GameObject * obj)
	{
		already_entered = false;
		stealthtank_alive = false;
		reinforce_chance = 0;
		stealth_counter = 0;

		drop_area [0] = 2002356; //Top of Hill
		drop_area [1] = 2002357; //Hand of Nod
		drop_area [2] = 2003814; //Bottom of Hill
		drop_area [3] = 2003815; //Above Tank				
	}
	
	void Entered (GameObject * obj, GameObject * enterer)
	{
		if(!already_entered)
		{
			already_entered = true;
			stealth_counter++;

			float stealth_face = Commands->Get_Facing (Commands->Find_Object (drop_area [2]));
			Vector3 drop_loc = Commands->Get_Position (Commands->Find_Object (drop_area [2]));

			GameObject * chinook_obj3 = Commands->Create_Object ( "Invisible_Object", drop_loc);
			Commands->Set_Facing(chinook_obj3, stealth_face);
			Commands->Attach_Script(chinook_obj3, "Test_Cinematic", "M10_XG_VehicleDrop2.txt");

			stealthtank_alive = true;
			Commands->Start_Timer(obj, this, 10.0f, FAKE_TIMER);
		}

	}

	void Timer_Expired (GameObject* obj, int timer_id)
	{
		reinforce_chance = Commands->Get_Random_Int (1, 6);

		if (timer_id == FAKE_TIMER && stealth_counter < 4)
		{
			if (!stealthtank_alive && reinforce_chance >= 4)
			{
				stealth_counter++;
				stealthtank_alive = true;

				int random_loc = Commands->Get_Random_Int (0, 4);

				float stealth_face = Commands->Get_Facing (Commands->Find_Object (drop_area [random_loc]));
				Vector3 drop_loc = Commands->Get_Position (Commands->Find_Object (drop_area [random_loc]));

				GameObject * chinook_obj3 = Commands->Create_Object ( "Invisible_Object", drop_loc);
				Commands->Set_Facing(chinook_obj3, stealth_face);
				Commands->Attach_Script(chinook_obj3, "Test_Cinematic", "M10_XG_VehicleDrop2.txt");
			}

			Commands->Start_Timer(obj, this, 10.0f, FAKE_TIMER);
		}
	}

	void Custom (GameObject * obj, int type, int param, GameObject * sender)
	{
		if (type == KILLED)
		{
			stealthtank_alive = false;
		}
	}

};

DECLARE_SCRIPT (M10_Stealth_Attack_01, "")	
{
	bool attacking, charge, charging, same;
	int attack_loc [13];
	float loc_dist;
	int loc;

	Vector3 current_loc;
	Vector3 enemy_loc;

	enum{ATTACK_OVER};

	// Register variables to be Auto-Saved
	// All variables must have a unique ID, less than 256, that never changes
	REGISTER_VARIABLES()
	{
		SAVE_VARIABLE( attacking, 1 );
		SAVE_VARIABLE( charge, 2 );
		SAVE_VARIABLE( charging, 3 );
		SAVE_VARIABLE( current_loc, 4 );
		SAVE_VARIABLE( enemy_loc, 5 );
		SAVE_VARIABLE( loc_dist, 6 );
		SAVE_VARIABLE( loc, 7 );
		SAVE_VARIABLE( same, 8 );
	}

	void Created(GameObject * obj)
	{
		Commands->Enable_Enemy_Seen( obj, true);
		attacking = false;
		charge = false;
		charging = false;
		same = false;

		attack_loc [0] = 2003080;
		attack_loc [1] = 2003081;
		attack_loc [2] = 2003082;
		attack_loc [3] = 2003083;
		attack_loc [4] = 2003084;
		attack_loc [5] = 2003085;
		attack_loc [6] = 2003086;
		attack_loc [7] = 2003087;
		attack_loc [8] = 2003088;
		attack_loc [9] = 2003089;
		attack_loc [10] = 2003090;
		attack_loc [11] = 2003091;
		attack_loc [12] = 2003092;

		loc_dist = 1000.0f;
		loc = 100;

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

	}

	void Action_Complete(GameObject * obj, int action_id, ActionCompleteReason reason)
	{
		if (action_id == 10 && reason ==ACTION_COMPLETE_NORMAL)
		{
			Commands->Debug_Message ("Up Yours!!");
		}
	}

	void Enemy_Seen(GameObject * obj, GameObject *enemy )
	{
		ActionParamsStruct params;

		params.Set_Basic( this, INNATE_PRIORITY_ENEMY_SEEN +5, 10 );
		params.Set_Movement( Commands->Get_Position (Commands->Find_Object (attack_loc [loc])), 1.0f, 5.0f );
		params.Set_Attack(enemy, 100.0f, 5.0f, true);
		params.AttackCheckBlocked = false;
		//params.AttackActive = true;
		
		Commands->Modify_Action(obj, 10, params);				
	}

	void Killed(GameObject * obj, GameObject * killer)
	{
		Commands->Send_Custom_Event( obj, Commands->Find_Object (1110056), KILLED, 0 );
	}

	void Timer_Expired (GameObject* obj, int timer_id)
	{
		if (timer_id == GOTO_LOC)
		{
			current_loc = Commands->Get_Position ( obj );
			Vector3 star_loc = Commands->Get_Position (STAR);

			for (int x = 0; x <= 12; x++)
			{
				float dist = Commands->Get_Distance(star_loc, Commands->Get_Position (Commands->Find_Object (attack_loc [x])));
				
				if (dist < loc_dist)
				{
					loc_dist = dist;
					
					loc = x;
				}
			}

			loc_dist = 1000.0f;
			if(loc >= 13)
			{
				Commands->Debug_Message("*** Warning! Loc = %d", loc);
			}

			if (!same)
			{
				Commands->Action_Reset(obj, 99);
			
				ActionParamsStruct params;
				params.Set_Basic( this, INNATE_PRIORITY_ENEMY_SEEN +5, 10 );
				params.Set_Movement( Commands->Get_Position (Commands->Find_Object (attack_loc [loc])), 1.0f, 5.0f );
				//params.Set_Attack(STAR, 100.0f, 5.0f, true);
				//params.AttackCheckBlocked = false;
				//params.AttackActive = true;
				//Commands->Modify_Action(obj, 10, params);

				Commands->Action_Attack(obj, params);
			}

			Commands->Start_Timer(obj, this, 10.0f, GOTO_LOC);			
		}
	}
};

DECLARE_SCRIPT (M10_Stealth_Attack_02, "")	
{
	bool attacking, charge, charging, same;
	int attack_loc [13];
	float loc_dist;
	int loc;

	Vector3 current_loc;
	Vector3 enemy_loc;

	enum{ATTACK_OVER};

	// Register variables to be Auto-Saved
	// All variables must have a unique ID, less than 256, that never changes
	REGISTER_VARIABLES()
	{
		SAVE_VARIABLE( attacking, 1 );
		SAVE_VARIABLE( charge, 2 );
		SAVE_VARIABLE( charging, 3 );
		SAVE_VARIABLE( current_loc, 4 );
		SAVE_VARIABLE( enemy_loc, 5 );
		SAVE_VARIABLE( loc_dist, 6 );
		SAVE_VARIABLE( loc, 7 );
	}

	void Created(GameObject * obj)
	{
		Commands->Enable_Enemy_Seen( obj, true);
		attacking = false;
		charge = false;
		charging = false;
		same = false;

		Commands->Enable_Stealth (obj, true);

		attack_loc [0] = 2005985;
		attack_loc [1] = 2005986;
		attack_loc [2] = 2005987;
		attack_loc [3] = 2005988;
		attack_loc [4] = 2005989;
		attack_loc [5] = 2005990;
		attack_loc [6] = 2005991;
		attack_loc [7] = 2005992;
		attack_loc [8] = 2005993;
		attack_loc [9] = 2005994;
		attack_loc [10] = 2005995;
		attack_loc [11] = 2005996;
		attack_loc [12] = 2005996;

		loc_dist = 1000.0f;
		loc = 100;

		Commands->Start_Timer(obj, this, 0.25f, GOTO_LOC);			
		

		/*ActionParamsStruct params;

		params.Set_Basic( this, INNATE_PRIORITY_ENEMY_SEEN - 5, 10 );
		params.Set_Movement( Vector3(0,0,0), 1.0f, 0 );
		params.WaypathID = 2000095;
		
		Commands->Action_Attack (obj, params);*/
	}

	void Killed(GameObject * obj, GameObject *killer )
	{
		Commands->Send_Custom_Event( obj, Commands->Find_Object (1100161), TANK_KILLED, 0);
	}
	
	void Action_Complete(GameObject * obj, int action_id, ActionCompleteReason reason)
	{
		if (action_id == 10 && reason ==ACTION_COMPLETE_NORMAL)
		{
			Commands->Debug_Message ("Up Yours!!");
		}
	}

	void Enemy_Seen(GameObject * obj, GameObject *enemy )
	{
		ActionParamsStruct params;

		params.Set_Basic( this, INNATE_PRIORITY_ENEMY_SEEN +5, 10 );
		params.Set_Movement( Commands->Get_Position (Commands->Find_Object (attack_loc [loc])), 1.0f, 5.0f );
		params.Set_Attack(enemy, 100.0f, 5.0f, true);
		params.AttackCheckBlocked = false;
		//params.AttackActive = true;
		
		Commands->Modify_Action(obj, 10, params);				
	}

	void Timer_Expired (GameObject* obj, int timer_id)
	{
		if (timer_id == GOTO_LOC)
		{
			current_loc = Commands->Get_Position ( obj );
			Vector3 star_loc = Commands->Get_Position (STAR);

			for (int x = 0; x <= 12; x++)
			{
				float dist = Commands->Get_Distance(star_loc, Commands->Get_Position (Commands->Find_Object (attack_loc [x])));
				
				if (dist < loc_dist)
				{
					loc_dist = dist;
					
					loc = x;
				}
			}

			loc_dist = 1000.0f;

			if (!same)
			{
				Commands->Action_Reset(obj, 99);
			
				ActionParamsStruct params;
				params.Set_Basic( this, INNATE_PRIORITY_ENEMY_SEEN +5, 10 );
				params.Set_Movement( Commands->Get_Position (Commands->Find_Object (attack_loc [loc])), 1.0f, 5.0f );
				//params.Set_Attack(STAR, 100.0f, 5.0f, true);
				//params.AttackCheckBlocked = false;
				//params.AttackActive = true;
				//Commands->Modify_Action(obj, 10, params);

				Commands->Action_Attack(obj, params);
			}

			Commands->Start_Timer(obj, this, 10.0f, GOTO_LOC);			
		}
	}
};

DECLARE_SCRIPT(M10_Nod_Obelisk, "")
{
	bool attacking;
	
	enum{ATTACK_OVER};

	// Register variables to be Auto-Saved
	// All variables must have a unique ID, less than 256, that never changes
	REGISTER_VARIABLES()
	{
		SAVE_VARIABLE( attacking, 1 );
	}

	void Created (GameObject * obj)
	{
		Commands->Disable_All_Collisions(obj);
		Commands->Set_Player_Type(obj, SCRIPT_PLAYERTYPE_NOD );
		Commands->Set_Is_Rendered(obj, false);
		Commands->Enable_Enemy_Seen( obj, true);
		attacking = false;
		
	}

	void Enemy_Seen(GameObject * obj, GameObject *enemy )
	{
		ActionParamsStruct params;

		if(!attacking)
		{
			attacking = true;
			params.Set_Basic( this, 99, 1 );
			params.Set_Attack (enemy, 100.0f, 0.5f, 1);
			params.AttackCheckBlocked = false;
			Commands->Action_Attack( obj, params );
			
			Commands->Start_Timer(obj, this, 6.0f, ATTACK_OVER);
		}
	}

	void Custom(GameObject * obj, int type, int param, GameObject * sender)
	{
		if(type == M10_PLAYERTYPE_CHANGE_OBELISK)
		{
			Commands->Set_Player_Type(obj, SCRIPT_PLAYERTYPE_GDI );			
		}

		if (type == KILLED)
		{
			Commands->Destroy_Object (obj);
		}		
	}

	void Damaged( GameObject * obj, GameObject * damager, float amount ) 
	{
		ActionParamsStruct params;

		if(!attacking)
		{
			attacking = true;
			params.Set_Basic( this, 99, 1 );
			params.Set_Attack (damager, 100.0f, 0.5f, 1);
			params.AttackCheckBlocked = false;
			Commands->Action_Attack( obj, params );
			
			Commands->Start_Timer(obj, this, 6.0f, ATTACK_OVER);
		}

	}

	void Timer_Expired (GameObject* obj, int timer_id)
	{
		ActionParamsStruct params;

		if(timer_id == ATTACK_OVER)
		{
			attacking = false;
		}
	}	
};

DECLARE_SCRIPT(M10_Obelisk_MCT, "")
{
	bool alive;

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

	void Created (GameObject * obj)
	{
		//Commands->Set_Is_Rendered(obj, false);
		alive = true;
	}

	void Poked(GameObject * obj, GameObject * poker)
	{
		if (alive)
		{
			Commands->Send_Custom_Event( obj, Commands->Find_Object (2010415), M10_PLAYERTYPE_CHANGE_OBELISK, 0);
		}
	}

	void Custom(GameObject * obj, int type, int param, GameObject * sender)
	{
		if (type == KILLED)
		{
			alive = false;
		}		
	}
};

DECLARE_SCRIPT(M10_Refinery_Keycard, "")
{
	void Custom( GameObject * obj, int type, int param, GameObject * sender ) 
	{
		if ( type == CUSTOM_EVENT_POWERUP_GRANTED ) 
		{
			GameObject * obj_con = Commands->Find_Object(1100154);
			if (obj_con)
			{
				Commands->Send_Custom_Event(obj, obj_con, 1012, 1);
			}
		}
	}
};


DECLARE_SCRIPT(M10_Playertype_Nod, "")
{
	void Created (GameObject *obj)
	{
		Commands->Set_Player_Type ( obj, SCRIPT_PLAYERTYPE_NOD );
	}
};

DECLARE_SCRIPT (M10_Flyover_Controller, "")
{
	int last;
	int last2;
	int last3;
	int count;
	bool already_entered;


	REGISTER_VARIABLES()
	{
		SAVE_VARIABLE( last, 1 );
		SAVE_VARIABLE( last2, 2 );
		SAVE_VARIABLE( last3, 3 );
		SAVE_VARIABLE( count, 4 );
		SAVE_VARIABLE( already_entered, 5 );
	}

	void Created (GameObject *obj)
	{
		last, last2, last3 = 100;
		count = 2;
		already_entered = false;
	}

	void Entered (GameObject * obj, GameObject * enterer)
	{
		if (!already_entered)
		{
			already_entered = true;

			Commands->Send_Custom_Event ( obj, obj, FLYOVER, 0, 0 );
		}
	}

	void Custom( GameObject * obj, int type, int param, GameObject * sender )
	{
		
		if (type == FLYOVER)
		{
			if (++count >= 3)
			{
				count = 0;

				char *flyovers[10] = 
				{
					"X10A_Apache_00.txt",
					"X10A_Apache_01.txt",
					"X10A_Apache_02.txt",
					"X10A_Apache_03.txt",
					"X10A_Apache_04.txt",
					
					"X10A_Trnspt_00.txt",
					"X10A_Trnspt_01.txt",
					"X10A_Trnspt_02.txt",
					"X10A_Trnspt_03.txt",
					"X10A_Trnspt_04.txt",
			
				};
				
				int random = int(Commands->Get_Random(0, 8-WWMATH_EPSILON));			
				while (random == last) {
					random = int(Commands->Get_Random(0, 8-WWMATH_EPSILON));
				}

				GameObject *controller = Commands->Create_Object("Invisible_Object", Vector3(0,0,0));
				Commands->Attach_Script(controller, "Test_Cinematic", flyovers[random]);
				last = random;
		
				int random2 = int(Commands->Get_Random(0, 8-WWMATH_EPSILON));	
				while (random2 == last2 || random2 == random) {
					random2 = int(Commands->Get_Random(0, 8-WWMATH_EPSILON));
				}

				GameObject *controller2 = Commands->Create_Object("Invisible_Object", Vector3(0,0,0));
				Commands->Attach_Script(controller2, "Test_Cinematic", flyovers[random2]);
				last2 = random2;
	
				int random3 = int(Commands->Get_Random(0, 8-WWMATH_EPSILON));	
				while (random3 == last3 || random3 == random || random3 == random2) {
					random3 = int(Commands->Get_Random(0, 8-WWMATH_EPSILON));
				}					

				GameObject *controller3 = Commands->Create_Object("Invisible_Object", Vector3(0,0,0));
				Commands->Attach_Script(controller3, "Test_Cinematic", flyovers[random3]);
				last3 = random3;
			}
		}	
	}
};

DECLARE_SCRIPT (M10_Conversation_Zone, "Conv_Num:int")
{
	bool already_entered;
		
	REGISTER_VARIABLES()
	{
		SAVE_VARIABLE( already_entered, 1 );		
	}

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

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

	void Timer_Expired(GameObject * obj, int timer_id)
	{
		GameObject * obj_con = Commands->Find_Object(1100154);

		if (timer_id == KEY_OBJ)
		{
			Commands->Send_Custom_Event(obj, obj_con, 1012, 3);
		}
	};

	void Action_Complete(GameObject * obj, int action_id, ActionCompleteReason reason)
	{
		GameObject * obj_con = Commands->Find_Object(1100154);

		if (action_id == 100001)
		{
			Commands->Send_Custom_Event(obj, obj_con, 1005, 3);
			Commands->Start_Timer (obj, this, 2.5f, KEY_OBJ);		
		}
		
		if (action_id == 100004)
		{
			Commands->Send_Custom_Event(obj, obj_con, 1002, 3);
		}

		if (action_id == 100007)
		{
			Commands->Send_Custom_Event(obj, obj_con, 1007, 3);
		}

		if (action_id == 100010)
		{
			Commands->Send_Custom_Event(obj, obj_con, 1004, 3);
		}

		if (action_id == 100015)
		{
			Commands->Send_Custom_Event(obj, obj_con, 1001, 3);
		}

		if (action_id == 100018)
		{
			Commands->Send_Custom_Event(obj, obj_con, 1006, 3);
		}

		if (action_id == 100020)
		{
			Commands->Send_Custom_Event(obj, obj_con, 1008, 3);
		}

		if (action_id == 100027)
		{
			Commands->Send_Custom_Event(obj, obj_con, 1015, 3);
		}

		if (action_id == 100030)
		{
			Commands->Send_Custom_Event(obj, obj_con, 1009, 3);
		}

		if (action_id == 100033)
		{
			Commands->Send_Custom_Event(obj, obj_con, 1018, 3);
		}

		if (action_id == 100036)
		{
			Commands->Send_Custom_Event(obj, obj_con, 1010, 3);
		}

		if (action_id == 100039)
		{
			Commands->Send_Custom_Event(obj, obj_con, 1014, 3);
		}

		if (action_id == 100042)
		{
			Commands->Send_Custom_Event(obj, obj_con, 1011, 3);
		}

		if (action_id == 100044)
		{
			Commands->Send_Custom_Event(obj, obj_con, 1017, 3);
		}

		if (action_id == 100051)
		{
			Commands->Send_Custom_Event(obj, obj_con, 1019, 3);
		}
	}


	void Entered (GameObject * obj, GameObject * enterer)
	{
		if (!already_entered)
		{
			switch(Get_Int_Parameter("Conv_Num"))
			{
			case 1: 
				{
					already_entered = true;

					int id = Commands->Create_Conversation("M10CON001", 99, 2000, false);
					Commands->Join_Conversation(NULL, id);
					Commands->Start_Conversation(id, 100001);
					Commands->Monitor_Conversation(obj, id);
				}
				break;
			case 3: 
				{
					already_entered = true;

					int id = Commands->Create_Conversation("M10CON003", 99, 2000, false);
					Commands->Join_Conversation(NULL, id);
					Commands->Start_Conversation(id, 100003);
					Commands->Monitor_Conversation(obj, id);
				}
				break;
			case 4: 
				{
					already_entered = true;

					int id = Commands->Create_Conversation("M10CON004", 100, 2000, false);
					Commands->Join_Conversation(NULL, id);
					Commands->Start_Conversation(id, 100004);
					Commands->Monitor_Conversation(obj, id);
				}
				break;
			case 6: 
				{
					already_entered = true;

					Commands->Send_Custom_Event(obj, Commands->Find_Object (2014793), ENTERED, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object (2014792), ENTERED, 0);

					int id = Commands->Create_Conversation("M10CON006", 99, 2000, false);
					Commands->Join_Conversation(NULL, id);
					Commands->Join_Conversation(STAR, id);
					Commands->Start_Conversation(id, 100006);
					Commands->Monitor_Conversation(obj, id);
				}
				break;
			case 7: 
				{
					already_entered = true;

					Commands->Send_Custom_Event(obj, Commands->Find_Object (2017710), ENTERED, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object (2014796), ENTERED, 0);

					int id = Commands->Create_Conversation("M10CON007", 99, 2000, false);
					Commands->Join_Conversation(NULL, id);
					Commands->Start_Conversation(id, 100007);
					Commands->Monitor_Conversation(obj, id);
				}
				break;
			case 10: 
				{
					already_entered = true;

					int id = Commands->Create_Conversation("M10CON010", 99, 2000, false);
					Commands->Join_Conversation(NULL, id);
					Commands->Join_Conversation(STAR, id);
					Commands->Start_Conversation(id, 100010);
					Commands->Monitor_Conversation(obj, id);
				}
				break;
			case 13: 
				{
					already_entered = true;

					int id = Commands->Create_Conversation("M10CON013", 99, 2000, false);
					Commands->Join_Conversation(NULL, id);
					Commands->Start_Conversation(id, 100013);
					Commands->Monitor_Conversation(obj, id);
				}
				break;
			case 15: 
				{
					already_entered = true;

					Commands->Send_Custom_Event(obj, Commands->Find_Object (2014798), ENTERED, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object (2014799), ENTERED, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object (2014800), ENTERED, 0);

					int id = Commands->Create_Conversation("M10CON015", 99, 2000, false);
					Commands->Join_Conversation(NULL, id);
					Commands->Start_Conversation(id, 100015);
					Commands->Monitor_Conversation(obj, id);
				}
				break;
			case 16: 
				{
					already_entered = true;

					int id = Commands->Create_Conversation("M10CON009", 99, 2000, false);
					Commands->Join_Conversation(NULL, id);
					Commands->Join_Conversation(STAR, id);
					Commands->Start_Conversation(id, 100016);
					Commands->Monitor_Conversation(obj, id);
				}
				break;
			case 18: 
				{
					already_entered = true;

					int id = Commands->Create_Conversation("M10CON018", 99, 2000, false);
					Commands->Join_Conversation(NULL, id);
					Commands->Join_Conversation(STAR, id);					
					Commands->Start_Conversation(id, 100018);
					Commands->Monitor_Conversation(obj, id);
				}
				break;
			case 20: 
				{
					already_entered = true;

					int id = Commands->Create_Conversation("M10CON020", 99, 2000, false);
					Commands->Join_Conversation(NULL, id);
					Commands->Join_Conversation(STAR, id);					
					Commands->Start_Conversation(id, 100020);
					Commands->Monitor_Conversation(obj, id);
				}
				break;
			case 22: 
				{
					if (Commands->Get_Health (Commands->Find_Object (1153939)) > 0.0f)
					{
						already_entered = true;

						int id = Commands->Create_Conversation("M10CON022", 99, 2000, false);
						Commands->Join_Conversation(NULL, id);
						Commands->Join_Conversation(STAR, id);					
						Commands->Start_Conversation(id, 100022);
						Commands->Monitor_Conversation(obj, id);
					}
				}
				break;
			case 23: 
				{
					if (Commands->Get_Health (Commands->Find_Object (1153939)) > 0.0f)
					{
						already_entered = true;

						int id = Commands->Create_Conversation("M10CON023", 99, 2000, false);
						Commands->Join_Conversation(NULL, id);
						Commands->Start_Conversation(id, 100023);
						Commands->Monitor_Conversation(obj, id);
					}
				}
				break;
			case 27: 
				{
					already_entered = true;

					int id = Commands->Create_Conversation("M10CON027", 99, 2000, false);
					Commands->Join_Conversation(NULL, id);
					Commands->Join_Conversation(STAR, id);					
					Commands->Start_Conversation(id, 100027);
					Commands->Monitor_Conversation(obj, id);
				}
				break;
			case 29: 
				{
					if (Commands->Get_Health (Commands->Find_Object (1100007)) > 0.0f)
					{
						already_entered = true;

						int id = Commands->Create_Conversation("M10CON029", 99, 2000, false);
						Commands->Join_Conversation(NULL, id);
						Commands->Join_Conversation(STAR, id);					
						Commands->Start_Conversation(id, 100029);
						Commands->Monitor_Conversation(obj, id);
					}
				}
				break;
			case 30: 
				{
					already_entered = true;

					Commands->Send_Custom_Event(obj, Commands->Find_Object (2015525), ENTERED, 0);
						Commands->Send_Custom_Event(obj, Commands->Find_Object (2015524), ENTERED, 0);

					int id = Commands->Create_Conversation("M10CON030", 99, 2000, false);
					Commands->Join_Conversation(NULL, id);
					Commands->Join_Conversation(STAR, id);					
					Commands->Start_Conversation(id, 100030);
					Commands->Monitor_Conversation(obj, id);
				}
				break;
			case 32: 
				{
					if (Commands->Get_Health (Commands->Find_Object (1153940)) > 0.0f)
					{
						already_entered = true;

						Commands->Send_Custom_Event(obj, Commands->Find_Object (2016248), ENTERED, 0);
						Commands->Send_Custom_Event(obj, Commands->Find_Object (2016249), ENTERED, 0);

						int id = Commands->Create_Conversation("M10CON032", 99, 2000, false);
						Commands->Join_Conversation(NULL, id);
						Commands->Join_Conversation(STAR, id);					
						Commands->Start_Conversation(id, 100032);
						Commands->Monitor_Conversation(obj, id);
					}
				}
				break;
			case 33: 
				{
					if (Commands->Find_Object (1100008) && Commands->Find_Object (1100009))
					{
						already_entered = true;

						int id = Commands->Create_Conversation("M10CON033", 99, 2000, false);
						Commands->Join_Conversation(NULL, id);
						Commands->Join_Conversation(STAR, id);					
						Commands->Start_Conversation(id, 100033);
						Commands->Monitor_Conversation(obj, id);
					}
				}
				break;
			case 36: 
				{
					if (Commands->Get_Health (Commands->Find_Object (1153934)) > 0.0f)
					{
						already_entered = true;

						int id = Commands->Create_Conversation("M10CON036", 99, 2000, false);
						Commands->Join_Conversation(STAR, id);		
						Commands->Start_Conversation(id, 100036);
						Commands->Monitor_Conversation(obj, id);
					}
				}
				break;
			case 38: 
				{
					if (Commands->Get_Health (Commands->Find_Object (1153934)) > 0.0f)
					{
						already_entered = true;

						int id = Commands->Create_Conversation("M10CON038", 99, 2000, false);
						Commands->Join_Conversation(NULL, id);
						Commands->Join_Conversation(STAR, id);		
						Commands->Start_Conversation(id, 100038);
						Commands->Monitor_Conversation(obj, id);
					}
				}
				break;
			case 39: 
				{
					if (Commands->Get_Health (Commands->Find_Object (2063322)) > 0.0f)
					{
						already_entered = true;

						int id = Commands->Create_Conversation("M10CON039", 99, 2000, false);
						Commands->Join_Conversation(NULL, id);
						Commands->Join_Conversation(STAR, id);		
						Commands->Start_Conversation(id, 100039);
						Commands->Monitor_Conversation(obj, id);
					}
				}
				break;
			case 42: 
				{
					if (Commands->Get_Health (Commands->Find_Object (2063323)) > 0.0f || Commands->Get_Health (Commands->Find_Object (1153935)) > 0.0f)
					{
						already_entered = true;

						Commands->Send_Custom_Event(obj, Commands->Find_Object (2016251), ENTERED, 0);
						Commands->Send_Custom_Event(obj, Commands->Find_Object (2016976), ENTERED, 0);

						int id = Commands->Create_Conversation("M10CON042", 99, 2000, false);
						Commands->Join_Conversation(STAR, id);
						Commands->Join_Conversation(NULL, id);
						Commands->Start_Conversation(id, 100042);
						Commands->Monitor_Conversation(obj, id);
					}
				}
				break;
			case 44: 
				{
					if (Commands->Get_Health (Commands->Find_Object (1100012)) > 0.0f || Commands->Get_Health (Commands->Find_Object (1100011)) > 0.0f)
					{
						already_entered = true;

						Commands->Send_Custom_Event(obj, Commands->Find_Object (2017698), ENTERED, 0);
						Commands->Send_Custom_Event(obj, Commands->Find_Object (2017699), ENTERED, 0);

						int id = Commands->Create_Conversation("M10CON044", 99, 2000, false);
						Commands->Join_Conversation(NULL, id);
						Commands->Start_Conversation(id, 100044);
						Commands->Monitor_Conversation(obj, id);
					}
				}
				break;
			case 47: 
				{
					if (Commands->Get_Health (Commands->Find_Object (2063324)) > 0.0f)
					{
						already_entered = true;

						int id = Commands->Create_Conversation("M10CON047", 99, 2000, false);
						Commands->Join_Conversation(STAR, id);
						Commands->Join_Conversation(NULL, id);
						Commands->Start_Conversation(id, 100047);
						Commands->Monitor_Conversation(obj, id);
					}
				}
				break;
			case 49: 
				{
					if (Commands->Get_Health (Commands->Find_Object (1100010)) > 0.0f)
					{
						already_entered = true;

						/*int id = Commands->Create_Conversation("M10CON049", 99, 2000, false);
						Commands->Join_Conversation(STAR, id);
						Commands->Join_Conversation(NULL, id);
						Commands->Start_Conversation(id, 100049);
						Commands->Monitor_Conversation(obj, id);*/
					}
				}
				break;
			case 51: 
				{
					if (Commands->Get_Health (Commands->Find_Object (1100014)) > 0.0f || Commands->Get_Health (Commands->Find_Object (1100013)) > 0.0f)
					{
						already_entered = true;

						int id = Commands->Create_Conversation("M10CON051", 99, 2000, false);
						Commands->Join_Conversation(STAR, id);
						Commands->Join_Conversation(NULL, id);
						Commands->Start_Conversation(id, 100051);
						Commands->Monitor_Conversation(obj, id);
					}
				}
				break;
			case 54: 
				{
					already_entered = true;

					Commands->Send_Custom_Event(obj, Commands->Find_Object (2014795), ENTERED, 0);
					Commands->Send_Custom_Event(obj, Commands->Find_Object (2017711), ENTERED, 0);

					int id = Commands->Create_Conversation("M10CON054", 99, 2000, false);
					Commands->Join_Conversation(STAR, id);
					Commands->Start_Conversation(id, 100054);
					Commands->Monitor_Conversation(obj, id);					
				}
				break;
			}
		}
	}
};

DECLARE_SCRIPT(M10_Sam_Killed, "SamNumber:int")
{
	/*void Action_Complete(GameObject * obj, int action_id, ActionCompleteReason reason)
	{
		GameObject * obj_con = Commands->Find_Object(1100154);

		if (action_id == 100028)
		{
			Commands->Set_Objective_Status(1015, OBJECTIVE_STATUS_ACCOMPLISHED);
		}

		if (action_id == 100050)
		{
			Commands->Send_Custom_Event(obj, obj_con, 1016, 1);
		}
	}*/

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

		switch(Get_Int_Parameter("SamNumber"))
		{
		case 1: 
			{
				Commands->Send_Custom_Event(obj, obj_con, 1015, 3);
				Commands->Send_Custom_Event(obj, obj_con, 1015, 1);

				Commands->Set_Objective_Status(1015, OBJECTIVE_STATUS_ACCOMPLISHED);
			}
			break;
		case 2:
			{
				Commands->Send_Custom_Event(obj, obj_con, 1017, 1);
			}
			break;
		case 3:
			{
				Commands->Send_Custom_Event(obj, obj_con, 1018, 1);
			}
			break;
		case 4:
			{
				Commands->Send_Custom_Event(obj, obj_con, 1016, 3);
				Commands->Send_Custom_Event(obj, obj_con, 1016, 1);

				Commands->Set_Objective_Status(1016, OBJECTIVE_STATUS_ACCOMPLISHED);
			}
			break;
		}
	}	
};

DECLARE_SCRIPT(M10_Helipad_Destroyed, "PadNumber:int")
{
	void Action_Complete(GameObject * obj, int action_id, ActionCompleteReason reason)
	{
		GameObject * obj_con = Commands->Find_Object(1100154);

		if (action_id == 100040)
		{
			Commands->Send_Custom_Event(obj, obj_con, 1014, 3);
			Commands->Send_Custom_Event(obj, obj_con, 1014, 1);
		}

		if (action_id == 100048)
		{
			Commands->Send_Custom_Event(obj, obj_con, 1013, 3);
			Commands->Send_Custom_Event(obj, obj_con, 1013, 1);
		}
	}

	void Killed(GameObject * obj, GameObject * killer)
	{
		switch(Get_Int_Parameter("PadNumber"))
		{
		case 1: 
			{
				int id = Commands->Create_Conversation("M10CON040", 99, 2000, false);
				Commands->Join_Conversation(NULL, id);
				Commands->Join_Conversation(STAR, id);
				Commands->Start_Conversation(id, 100040);
				Commands->Monitor_Conversation(obj, id);
			}
			break;
		case 2:
			{
				GameObject * obj_con = Commands->Find_Object(1100154);

				Commands->Send_Custom_Event(obj, obj_con, 1013, 3);
				Commands->Send_Custom_Event(obj, obj_con, 1013, 1);

				/*int id = Commands->Create_Conversation("M10CON048", 99, 2000, false);
				Commands->Join_Conversation(STAR, id);
				Commands->Join_Conversation(NULL, id);
				Commands->Start_Conversation(id, 100048);
				Commands->Monitor_Conversation(obj, id);*/
			}
			break;
		}
	}	
};

DECLARE_SCRIPT(M10_Turret_Killed, "")
{
	void Killed(GameObject * obj, GameObject * killer)
	{
		GameObject * obj_con = Commands->Find_Object(1100154);

		Commands->Send_Custom_Event(obj, obj_con, 1019, 3);
		Commands->Send_Custom_Event(obj, obj_con, 1019, 1);
	}	
};

DECLARE_SCRIPT(M10_Mrls_Grant, "")
{
	bool already_poked;
	int drop_loc1;
	int drop_loc2;
	bool occupied1;
	bool occupied2;
	bool grant;
	
	REGISTER_VARIABLES()
	{
		SAVE_VARIABLE( already_poked, 1 );
		SAVE_VARIABLE( drop_loc1, 2 );
		SAVE_VARIABLE( drop_loc2, 3 );
		SAVE_VARIABLE( occupied1, 4 );
		SAVE_VARIABLE( occupied2, 5 );
		SAVE_VARIABLE( grant, 6 );
	}

	void Created (GameObject *obj)
	{
		already_poked = false;
		drop_loc1 = 1112072;
		drop_loc2 = 1112073;
		occupied1 = false;
		occupied1 = false;
		grant = false;
	}

	void Poked(GameObject * obj, GameObject * poker)
	{
		if (!already_poked)
		{			
			if (Commands->Has_Key(STAR, 1))
			{
				already_poked = true;

				Commands->Create_Logical_Sound (obj, CLEAR1, Commands->Get_Position (Commands->Find_Object (drop_loc1)), 10.0f);
				Commands->Create_Logical_Sound (obj, CLEAR2, Commands->Get_Position (Commands->Find_Object (drop_loc2)), 10.0f);
				
				Commands->Start_Timer ( obj, this, 2.0f, GRANT_MRLS );
			}
		}
	}	

	void Custom (GameObject *obj, int type, int param, GameObject *sender)
	{
		if (type == MAMMY)
		{
			if (param == 1)
			{
				grant = false;
			}

			if (param == 0)
			{
				grant = true;
			}
		}

		if (type == OCCUPIED)
		{
			if (param == 1)
			{
				occupied1 = true;
			}

			if (param == 2)
			{
				occupied2 = true;
			}
		}
	}

	void Timer_Expired(GameObject * obj, int timer_id)
	{
		if (timer_id == GRANT_MRLS)
		{
			if (!occupied1 && grant)
			{
				GameObject * mrls = Commands->Create_Object ( "GDI_MRLS_Player", Commands->Get_Position (Commands->Find_Object (drop_loc1)));
				Commands->Attach_Script(mrls, "M10_Mrls_Waypath", "");
			}

			else if (!occupied2 && grant)
			{
				GameObject * mrls2 = Commands->Create_Object ( "GDI_MRLS_Player", Commands->Get_Position (Commands->Find_Object (drop_loc2)));
				Commands->Attach_Script(mrls2, "M10_Mrls_Waypath", "");
			}
		}
	}
};

DECLARE_SCRIPT(M10_Mrls_Waypath, "")
{
	void Created (GameObject *obj)
	{
		Commands->Send_Custom_Event(obj, Commands->Find_Object (1100007), M00_CUSTOM_SAM_SITE_IGNORE, Commands->Get_ID (obj));
		Commands->Send_Custom_Event(obj, Commands->Find_Object (1100008), M00_CUSTOM_SAM_SITE_IGNORE, Commands->Get_ID (obj));
		Commands->Send_Custom_Event(obj, Commands->Find_Object (1100009), M00_CUSTOM_SAM_SITE_IGNORE, Commands->Get_ID (obj));
		Commands->Send_Custom_Event(obj, Commands->Find_Object (1100010), M00_CUSTOM_SAM_SITE_IGNORE, Commands->Get_ID (obj));
		Commands->Send_Custom_Event(obj, Commands->Find_Object (1100011), M00_CUSTOM_SAM_SITE_IGNORE, Commands->Get_ID (obj));
		Commands->Send_Custom_Event(obj, Commands->Find_Object (1100012), M00_CUSTOM_SAM_SITE_IGNORE, Commands->Get_ID (obj));

		ActionParamsStruct params;
		params.Set_Basic( this, 99, 10 );
		params.Set_Movement( Vector3(0,0,0), RUN, 4.0f );
		params.WaypathID = 1112795;			
		Commands->Action_Goto (obj, params);
	}
};

DECLARE_SCRIPT(M10_Humm_SAMIgnore, "")
{
	void Created (GameObject *obj)
	{
		Commands->Send_Custom_Event(obj, Commands->Find_Object (1100007), M00_CUSTOM_SAM_SITE_IGNORE, Commands->Get_ID (obj));
		Commands->Send_Custom_Event(obj, Commands->Find_Object (1100008), M00_CUSTOM_SAM_SITE_IGNORE, Commands->Get_ID (obj));
		Commands->Send_Custom_Event(obj, Commands->Find_Object (1100009), M00_CUSTOM_SAM_SITE_IGNORE, Commands->Get_ID (obj));
		Commands->Send_Custom_Event(obj, Commands->Find_Object (1100010), M00_CUSTOM_SAM_SITE_IGNORE, Commands->Get_ID (obj));
		Commands->Send_Custom_Event(obj, Commands->Find_Object (1100011), M00_CUSTOM_SAM_SITE_IGNORE, Commands->Get_ID (obj));
		Commands->Send_Custom_Event(obj, Commands->Find_Object (1100012), M00_CUSTOM_SAM_SITE_IGNORE, Commands->Get_ID (obj));
	}
};

DECLARE_SCRIPT(M10_Occupied, "")
{
	void Created (GameObject *obj)
	{
		Commands->Send_Custom_Event(obj, Commands->Find_Object (1100007), M00_CUSTOM_SAM_SITE_IGNORE, Commands->Get_ID (obj));
		Commands->Send_Custom_Event(obj, Commands->Find_Object (1100008), M00_CUSTOM_SAM_SITE_IGNORE, Commands->Get_ID (obj));
		Commands->Send_Custom_Event(obj, Commands->Find_Object (1100009), M00_CUSTOM_SAM_SITE_IGNORE, Commands->Get_ID (obj));
		Commands->Send_Custom_Event(obj, Commands->Find_Object (1100010), M00_CUSTOM_SAM_SITE_IGNORE, Commands->Get_ID (obj));
		Commands->Send_Custom_Event(obj, Commands->Find_Object (1100011), M00_CUSTOM_SAM_SITE_IGNORE, Commands->Get_ID (obj));
		Commands->Send_Custom_Event(obj, Commands->Find_Object (1100012), M00_CUSTOM_SAM_SITE_IGNORE, Commands->Get_ID (obj));
	}

	void Killed( GameObject * obj, GameObject * killer ) 
	{
		Commands->Send_Custom_Event(obj, Commands->Find_Object (1100166), MAMMY, 0);
	}

	void Sound_Heard(GameObject* obj, const CombatSound & sound)
	{
		if (sound.Type == CLEAR1)
		{
			Commands->Send_Custom_Event(obj, Commands->Find_Object (1100166), OCCUPIED, 1);
		}

		if (sound.Type == CLEAR2)
		{
			Commands->Send_Custom_Event(obj, Commands->Find_Object (1100166), OCCUPIED, 2);
		}
	}
};

DECLARE_SCRIPT(M10_Con_Yard_Repair, "RepairSpeed=1:float")
{
	bool objective_completed, inside_obelisk, conyard_destroyed;
	float full_health, curr_health, counter;

	REGISTER_VARIABLES()
	{
		SAVE_VARIABLE(objective_completed, 1);
		SAVE_VARIABLE(conyard_destroyed, 2);
		SAVE_VARIABLE(curr_health, 3);
		SAVE_VARIABLE(counter, 4);
		SAVE_VARIABLE(full_health, 5);

	}

	void Created(GameObject * obj)
	{
		objective_completed = conyard_destroyed = false;
		full_health = curr_health = Commands->Get_Health(obj);
	}
	
	
	void Damaged(GameObject * obj, GameObject * damager, float amount)
	{
		if (conyard_destroyed)
		{
			return;
		}
		else
		{
			if (damager == STAR)
			{
				Commands->Send_Custom_Event(obj, Commands->Find_Object (1206469), DAMAGED, 0);
			}

			curr_health = Commands->Get_Health (obj);
			counter = 1.0f;
			//Commands->Set_Health(obj, (curr_health + Get_Float_Parameter("RepairSpeed")));

			for (float x = curr_health; x <= full_health; x++)
			{
				Commands->Start_Timer(obj, this, counter, REBUILD);
				counter++;
			
				//Commands->Set_Health(obj, full_health);
			}
		}
	}

	void Timer_Expired(GameObject * obj, int timer_id )
	{
		if (timer_id == REBUILD && Commands->Get_Health(obj) > 0)
		{
			curr_health += Get_Float_Parameter("RepairSpeed");
			Commands->Set_Health(obj, curr_health);
		}
	}


	void Custom(GameObject * obj, int type, int param, GameObject * sender)
	{
		if (type == 3000 && param == 3000)
		{
			conyard_destroyed = true;
		}
	}
};

DECLARE_SCRIPT (M10_Ssm_Trigger, "")
{
	bool already_entered;
		
	REGISTER_VARIABLES()
	{
		SAVE_VARIABLE( already_entered, 1 );		
	}

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

	void Entered( GameObject * obj, GameObject * enterer )
	{
		if (!already_entered)
		{
			already_entered = true;

			Commands->Send_Custom_Event (obj, Commands->Find_Object (2009688), M00_LAUNCH_SSM, 0);
		}
	}
};

DECLARE_SCRIPT (M10_Pokeable_Item_OnePoke, "")
{
	bool poked;

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

	void Created (GameObject * obj)
	{
		poked = false;
		Commands->Enable_HUD_Pokable_Indicator ( obj, true );			
	}

	void Poked(GameObject * obj, GameObject * poker)
	{
		if (!poked)
		{
			poked = true;

			Commands->Enable_HUD_Pokable_Indicator ( obj, false );
		}
	}
};

DECLARE_SCRIPT(M10_Radar_Scramble, "")
{
	bool already_entered;
	
	REGISTER_VARIABLES()
	{
		SAVE_VARIABLE( already_entered, 1 );		
	}

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

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

	void Entered (GameObject *obj, GameObject *enterer)
	{
		if (Commands->Get_Health (Commands->Find_Object (1153932)) > 0 && Commands->Get_Health (Commands->Find_Object (1153931)) > 0)
		{
			if (!already_entered)
			{
				Commands->Send_Custom_Event (obj, Commands->Find_Object (1110022), ENTERED, 0);
				Commands->Send_Custom_Event (obj, Commands->Find_Object (1100160), ENTERED, 0);
				already_entered = true;

				int id = Commands->Create_Conversation("M03CON068", 99, 2000, false);
				Commands->Join_Conversation(NULL, id);
				Commands->Start_Conversation(id, 100068);
				Commands->Monitor_Conversation(obj, id);
			}
			Commands->Enable_Radar ( false );
		}
	}
};

DECLARE_SCRIPT(M10_Radar_UnScramble, "")
{
	void Entered (GameObject *obj, GameObject *enterer)
	{
		Commands->Enable_Radar ( true );
	}
};

DECLARE_SCRIPT (M10_HON_KillPrevention, "")
{
	void Killed(GameObject * obj, GameObject * killer)
	{
		if (killer != STAR)
		{
			Commands->Set_Health (obj, 1.0f);
		}
	}
};

DECLARE_SCRIPT (M10_SoldierPoke, "")
{
	bool already_picked [6];
	int count;

	REGISTER_VARIABLES()
	{
		SAVE_VARIABLE( already_picked [0], 1 );
		SAVE_VARIABLE( already_picked [1], 2 );
		SAVE_VARIABLE( already_picked [2], 3 );
		SAVE_VARIABLE( already_picked [3], 4 );
		SAVE_VARIABLE( already_picked [4], 5 );
		SAVE_VARIABLE( already_picked [5], 6 );
	}

	void Created (GameObject * obj)
	{
		count = 0;
		for (int x = 0; x <= 5; x++)
		{
			already_picked [x] = false;
		}
	}

	void Poked(GameObject * obj, GameObject * poker)
	{
		if (count >= 5)
		{
			for (int x = 0; x <= 5; x++)
			{
				already_picked [x] = false;
			}
		}

		int random = Commands->Get_Random_Int (0, 6);
		while (!already_picked)
		{
			random = Commands->Get_Random_Int (0, 6);
		}

		already_picked [random] = true;
		count++;

		switch (random)
		{
		// Destroy the Power Plant
		case 0: 
			{
				int id = Commands->Create_Conversation("M10CON065", 99, 2000, false);
				Commands->Join_Conversation(obj, id);
				Commands->Start_Conversation(id, 100065);
				Commands->Monitor_Conversation(obj, id);
			}
			break;
		case 1:
			{
				int id = Commands->Create_Conversation("M10CON066", 99, 2000, false);
				Commands->Join_Conversation(obj, id);
				Commands->Start_Conversation(id, 100066);
				Commands->Monitor_Conversation(obj, id);
			}
			break;
		case 2:
			{
				int id = Commands->Create_Conversation("M10CON067", 99, 2000, false);
				Commands->Join_Conversation(obj, id);
				Commands->Start_Conversation(id, 100067);
				Commands->Monitor_Conversation(obj, id);
			}
			break;
		case 3:
			{
				int id = Commands->Create_Conversation("M10CON068", 99, 2000, false);
				Commands->Join_Conversation(obj, id);
				Commands->Start_Conversation(id, 100068);
				Commands->Monitor_Conversation(obj, id);
			}
			break;
		case 4:
			{
				int id = Commands->Create_Conversation("M10CON069", 99, 2000, false);
				Commands->Join_Conversation(obj, id);
				Commands->Start_Conversation(id, 100069);
				Commands->Monitor_Conversation(obj, id);
			}
			break;
		case 5:
			{
				int id = Commands->Create_Conversation("M10CON070", 99, 2000, false);
				Commands->Join_Conversation(obj, id);
				Commands->Start_Conversation(id, 100070);
				Commands->Monitor_Conversation(obj, id);
			}
			break;
		}
	}
};

DECLARE_SCRIPT(M10_NBase_Attacked, "") //1206469
{
	bool message_fired;

	REGISTER_VARIABLES()
	{
		SAVE_VARIABLE( message_fired, 1 );
	}
	
	void Created (GameObject *obj)
	{
		message_fired = false;
	}

	void Timer_Expired (GameObject *obj, int timer_id)
	{
		if (timer_id == RESET)
		{
			message_fired = false;
		}
	}

	void Custom (GameObject *obj, int type, int param, GameObject *sender)
	{
		if (type == DAMAGED && !message_fired)
		{
			message_fired = true;

			int id = Commands->Create_Conversation("M10CON072", 99, 2000, false);
			Commands->Join_Conversation(NULL, id);
			Commands->Start_Conversation(id, 100072);
			Commands->Monitor_Conversation(obj, id);

			Commands->Start_Timer(obj, this, 60.0f, RESET);
		}
	}
};

DECLARE_SCRIPT (M10_NBase_Damage_Modifier, "Damage_multiplier:float")
{
	float current_health, last_health, damage_tally;
	bool conyard_destroyed;

	REGISTER_VARIABLES()
	{
		SAVE_VARIABLE( current_health, 1 );
		SAVE_VARIABLE( last_health, 2 );
		SAVE_VARIABLE( damage_tally, 3 );
		SAVE_VARIABLE( conyard_destroyed, 4 );
	}

	void Created (GameObject *obj)
	{
		last_health = Commands->Get_Health (obj);
		damage_tally = 0;

		conyard_destroyed = false;
	}

	void Custom(GameObject * obj, int type, int param, GameObject * sender)
	{
		if (type == 3000 && param == 3000)
		{
			conyard_destroyed = true;
		}
	}

	void Damaged( GameObject * obj, GameObject * damager, float amount ) 
	{
		if (!conyard_destroyed)
		{
			float damage;

			if (damager == STAR)
			{
				last_health = Commands->Get_Health (obj);
			}

			if (damager != STAR)
			{
				current_health = Commands->Get_Health (obj);
				if (current_health == 0) 
				{
					damage = ((last_health - current_health) + damage_tally);
					damage_tally = 0;
				}

				else
				{
					damage = (last_health - current_health);
					damage_tally = 0;
				}
				float mod_damage = (damage * (Get_Float_Parameter("Damage_multiplier")));
				damage_tally += mod_damage;
				
				Commands->Set_Health (obj, (last_health - mod_damage));
				last_health = Commands->Get_Health (obj);
				current_health = Commands->Get_Health (obj);
			}
		}
	}
};

DECLARE_SCRIPT(M10_Lv2_KeyCarrier, "")
{
	void Killed( GameObject * obj, GameObject * killer ) 
	{
		Vector3 spawnLocation = Commands->Get_Position ( obj );
		spawnLocation.Z += 0.75f;
		Commands->Create_Object ( "Level_02_Keycard", spawnLocation );
	}
};

DECLARE_SCRIPT(M10_Holograph_EntryZone_DME, "")
{
	bool entered;

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

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

	void Entered( GameObject * obj, GameObject * enterer ) 
	{
		if (enterer == STAR && entered == false)
		{
			entered = true;
			float delayTimer = Commands->Get_Random ( 0.25f, 1.0f );
			Commands->Send_Custom_Event( obj, obj, 0, 8000, delayTimer );
		}
	}

	void Custom( GameObject * obj, int type, int param, GameObject * sender ) 
	{
		if (param == 8000)
		{
			GameObject * holograph = Commands->Find_Object ( 1208599 );
			if (holograph)
			{
				GameObject * kane = Commands->Create_Object_At_Bone ( holograph, "Nod_Kane_HologramHead", "O_ARROW" );
				Commands->Attach_To_Object_Bone( kane, holograph, "O_ARROW" );
				Commands->Disable_All_Collisions ( kane );
				Commands->Set_Facing (kane, Commands->Get_Facing (holograph));
				Commands->Set_Loiters_Allowed( kane, false );
				Commands->Attach_Script(kane, "M10_KaneHead_DME", "");

				Commands->Send_Custom_Event( obj, Commands->Find_Object (1209308), KANE_CONV, Commands->Get_ID (obj), 0.0f );
				//kane_ID = Commands->Get_ID ( kane );
			}

			//Commands->Destroy_Object ( obj );//one time only zone--cleaning up
		}
	}
};

DECLARE_SCRIPT(M10_Holograph_EntryZone2_DME, "")
{
	bool entered;
	int kane_id;

	REGISTER_VARIABLES()
	{
		SAVE_VARIABLE(entered, 1);
		SAVE_VARIABLE(kane_id, 2);
	}

	void Created( GameObject * obj ) 
	{
		entered = false;
		kane_id = 0;
	}

	void Entered( GameObject * obj, GameObject * enterer ) 
	{
		if (enterer == STAR && entered == false)
		{
			entered = true;
			Commands->Send_Custom_Event( obj, obj, 0, 8500, 0 );
		}
	}

	void Custom( GameObject * obj, int type, int param, GameObject * sender ) 
	{
		if (type == KANE_CONV)
		{
			kane_id = param;
		}

		if (param == 8500)
		{
			GameObject * kane = Commands->Find_Object ( kane_id );
			if (kane)
			{
				Commands->Attach_Script(kane, "M10_KaneHead2_DME", "");
			}

			//Commands->Destroy_Object ( obj );//one time only zone--cleaning up
		}
	}
};

DECLARE_SCRIPT(M10_KaneHead_DME, "") //2017221
{
	int kane_conversation02;

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

	void Created( GameObject * obj ) 
	{
		GameObject *officer = Commands->Find_Object (1208600);

		if (officer)
		{
			int id = Commands->Create_Conversation("M10CON056", 99, 100, true);
			Commands->Join_Conversation_Facing ( obj, id, Commands->Get_ID (officer) );
			Commands->Join_Conversation_Facing ( officer, id, Commands->Get_ID (obj) );
			Commands->Start_Conversation(id, 100056);
			Commands->Monitor_Conversation(obj, id);
		}
	}

	/*void Action_Complete( GameObject * obj, int action_id, ActionCompleteReason complete_reason )	
	{
		switch (complete_reason)
		{
			case ACTION_COMPLETE_CONVERSATION_ENDED: 
				{
					if (action_id == 100061) 
					{
						Commands->Debug_Message ( "***************************kane conversation 02 is over--sending delete custom\n" );
						Commands->Send_Custom_Event ( obj, obj, 0, 8000, 2 );
					}
				}
				break;
		}
	}*/

	void Custom( GameObject * obj, int type, int param, GameObject * sender ) 
	{
		if (param == 8000)//conversation is over--go away
		{
			Commands->Debug_Message ( "***************************delete custom received--kane should now vanish\n" );
			Commands->Destroy_Object ( obj );
		}
	}
};

DECLARE_SCRIPT(M10_KaneHead2_DME, "") //2017221
{
	void Created( GameObject * obj ) 
	{
		if (STAR)
		{
			int id = Commands->Create_Conversation("M10CON057", 99, 100, true);
			Commands->Join_Conversation_Facing ( obj, id, Commands->Get_ID (STAR) );
			Commands->Join_Conversation_Facing ( STAR, id, Commands->Get_ID (obj) );
			Commands->Start_Conversation(id, 100057);
			Commands->Monitor_Conversation(obj, id);
		}
	}

	void Action_Complete( GameObject * obj, int action_id, ActionCompleteReason complete_reason )	
	{
		switch (complete_reason)
		{
			case ACTION_COMPLETE_CONVERSATION_ENDED: 
				{
					if (action_id == 100057) 
					{
						Commands->Debug_Message ( "***************************kane conversation 02 is over--sending delete custom\n" );
						Commands->Send_Custom_Event ( obj, obj, 0, 8000, 2 );
					}
				}
				break;
		}
	}

	void Custom( GameObject * obj, int type, int param, GameObject * sender ) 
	{
		if (param == 8000)//conversation is over--go away
		{
			Commands->Debug_Message ( "***************************delete custom received--kane should now vanish\n" );
			Commands->Destroy_Object ( obj );
		}
	}
};