/*
**	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
*     Mission07.cpp
*
* DESCRIPTION
*     Mission 7 specific scripts
*
* PROGRAMMER
*     Ryan Vervack
*
* VERSION INFO
*     $Author: Dan_e $
*     $Revision: 122 $
*     $Modtime: 1/08/02 12:14p $
*     $Archive: /Commando/Code/Scripts/Mission07.cpp $
*
******************************************************************************/

#include "scripts.h"
#include "toolkit.h"
#include "mission7.h"

// M07B 
// Objective Controller
DECLARE_SCRIPT(M07_Objective_Controller, "") // 100657
{
	bool accomplished_705;
	bool accomplished_701;
	
	enum {HAVOCS_SCRIPT, M07_DEAD_HAVOC, INITIAL_CONV, PROTECT_TEAM};

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

	void Created(GameObject * obj)
	{
		// Background Music
		Commands->Set_Background_Music ("07-Got A Present For Ya.mp3");

		Commands->Start_Timer (obj, this, 0.5f, HAVOCS_SCRIPT);
		Commands->Start_Timer (obj, this, 1.0f, INITIAL_CONV);
		Add_An_Objective(709);
		accomplished_705 = false;
		accomplished_701 = false;
	}

	void Add_An_Objective(int id)
	{
		GameObject *object;
						
		switch (id)
		{
		// Evacuate Sydney
		case 701: 
			{
				Commands->Add_Objective(701, OBJECTIVE_TYPE_PRIMARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Primary_M07_01, NULL, IDS_Enc_Obj_Primary_M07_01);
				object = Commands->Find_Object(100664);
				if(object)
				{
					Commands->Set_HUD_Help_Text ( IDS_M11DSGN_DSGN1007I1DSGN_TXT, TEXT_COLOR_OBJECTIVE_PRIMARY );
					Commands->Set_Objective_Radar_Blip_Object(701, object);
					Commands->Set_Objective_HUD_Info_Position(701, 90.0f, "POG_M07_1_04.tga", IDS_POG_EVACUATE, Commands->Get_Position (object));
				}
			}
			break;
		// Secure SAM Sites
		case 702: 
			{
				Commands->Add_Objective(702, OBJECTIVE_TYPE_PRIMARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Primary_M07_03, NULL, IDS_Enc_Obj_Primary_M07_03);
				object = Commands->Find_Object(100673);
				if(object)
				{
					Commands->Set_HUD_Help_Text ( IDS_M07DSGN_DSGN0089I1DSGN_TXT, TEXT_COLOR_OBJECTIVE_PRIMARY );
					Commands->Set_Objective_Radar_Blip_Object(702, object);
					Commands->Set_Objective_HUD_Info_Position(702, 90.0f, "POG_M07_1_01.tga", IDS_POG_SECURE, Commands->Get_Position (object));
				}
			}
			break;
		// Destroy SSM Launchers
		case 703: 
			{
				Commands->Add_Objective(703, OBJECTIVE_TYPE_PRIMARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Primary_M07_04, NULL, IDS_Enc_Obj_Primary_M07_04);
				object = Commands->Find_Object(100798);
				if(object)
				{
					Commands->Set_Objective_Radar_Blip_Object(703, object);
					Commands->Set_Objective_HUD_Info_Position(703, 90.0f, "POG_M07_1_02.tga", IDS_POG_DESTROY, Commands->Get_Position (object));
				}
			}
			break;
		// Destroy Radar Installations
		case 704: 
			{
				Commands->Add_Objective(704, OBJECTIVE_TYPE_SECONDARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Secondary_M07_01, NULL, IDS_Enc_Obj_Secondary_M07_01);
				object = Commands->Find_Object(100721);
				if(object)
				{
					Commands->Set_Objective_Radar_Blip_Object(704, object);
					Commands->Set_Objective_HUD_Info_Position(704, 90.0f, "POG_M07_2_07.tga", IDS_POG_DESTROY, Commands->Get_Position (object));
				}
			}
			break;
		// Rescue Resistance
		case 705: 
			{
				Commands->Add_Objective(705, OBJECTIVE_TYPE_SECONDARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Secondary_M07_02, NULL, IDS_Enc_Obj_Secondary_M07_02);
				object = Commands->Find_Object(115842);
				if(object)
				{
					Commands->Set_Objective_Radar_Blip_Object(705, object);
					Commands->Set_Objective_HUD_Info_Position(705, 90.0f, "POG_M07_2_04.tga", IDS_POG_RESCUE, Commands->Get_Position (object));
				}
			}
			break;
		// Destroy Napalm Stockpile
		case 706: 
			{
				Commands->Add_Objective(706, OBJECTIVE_TYPE_SECONDARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Secondary_M07_03, NULL, IDS_Enc_Obj_Secondary_M07_03);
				object = Commands->Find_Object(100781);
				if(object)
				{
					Commands->Set_Objective_Radar_Blip_Object(706, object);
					Commands->Set_Objective_HUD_Info_Position(706, 90.0f, "POG_M07_2_06.tga", IDS_POG_DESTROY, Commands->Get_Position (object));
				}
			}
			break;
		// Destroy Stealth Tank
		case 707: 
			{
				Commands->Add_Objective(707, OBJECTIVE_TYPE_SECONDARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Secondary_M07_04, NULL, IDS_Enc_Obj_Secondary_M07_04);
				object = Commands->Find_Object(100801);
				if(object)
				{
					Commands->Set_Objective_Radar_Blip_Object(707, object);
					Commands->Set_Objective_HUD_Info_Position(707, 90.0f, "POG_M07_2_03.tga", IDS_POG_DESTROY, Commands->Get_Position (object));
				}
			}
			break;
		// Defeat Obelisk
		case 708: 
			{
				Commands->Add_Objective(708, OBJECTIVE_TYPE_SECONDARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Secondary_M07_05, NULL, IDS_Enc_Obj_Secondary_M07_05);
				object = Commands->Find_Object(168926);
				if(object)
				{
					Commands->Set_Objective_Radar_Blip_Object(708, object);
					Commands->Set_Objective_HUD_Info_Position(708, 90.0f, "POG_M07_2_05.tga", IDS_POG_DEFEAT, Commands->Get_Position (object));
				}
			}
			break;
		// Protect Team Members
		case 709: 
			{
				Commands->Add_Objective(709, OBJECTIVE_TYPE_PRIMARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Primary_M07_05, NULL, IDS_Enc_Obj_Primary_M07_05);
				object = Commands->Find_Object(100717);
				if(object)
				{
					Commands->Set_HUD_Help_Text ( IDS_M07DSGN_DSGN0091I1DSGN_TXT, TEXT_COLOR_OBJECTIVE_PRIMARY );
					Commands->Set_Objective_Radar_Blip_Object(709, object);
					Commands->Set_Objective_HUD_Info_Position(709, 90.0f, "POG_M07_1_05.tga", IDS_POG_PROTECT, Commands->Get_Position (object));
				}
			}
			break;
		// Escape Nuclear Strike
		case 710: 
			{
				Commands->Add_Objective(710, OBJECTIVE_TYPE_PRIMARY, OBJECTIVE_STATUS_PENDING, IDS_Enc_ObjTitle_Primary_M07_02, NULL, IDS_Enc_Obj_Primary_M07_02);
				object = Commands->Find_Object(100717);
				if(object)
				{
					Commands->Set_Objective_Radar_Blip_Object(710, object);
					Commands->Set_Objective_HUD_Info_Position(710, 90.0f, "POG_M07_1_03.tga", IDS_POG_ESCAPE, Commands->Get_Position (object));
				}
			}
			break;
		}
	}

	void Remove_Pog(int id)
	{
		switch (id)
		{
		// Evacuate Dr. Sydney Mobius
		case 701: 
			{
				Commands->Set_Objective_HUD_Info (701, -1, "POG_M07_1_04.tga", IDS_POG_PROTECT);
			}
			break;
		}
	}

	void Custom(GameObject * obj, int type, int param, GameObject * sender)
	{
		switch (param)
		{
			case 1: 
				{
					if(type == 705 && accomplished_705)
					{
						return;
					}
					if(type == 705)
					{
						accomplished_705 = true;
					}
					if(type == 701)
					{
						accomplished_701 = true;
					}
					Commands->Clear_Radar_Marker (type);
					Commands->Set_Objective_Status(type, OBJECTIVE_STATUS_ACCOMPLISHED);
					Remove_Pog(type);
					if(type == 703)
					{
						Commands->Mission_Complete ( true );
					}
					
				}
				break;
			case 2:
				{
					if(type == 702 && accomplished_701)
					{
						return;
					}
					Commands->Clear_Radar_Marker (type);
					Commands->Set_Objective_Status(type, OBJECTIVE_STATUS_FAILED);
					Remove_Pog(type);
					if(type == 701)
					{
						Commands->Mission_Complete ( false );
					}
					if(type == 702)
					{
						Commands->Mission_Complete ( false );
					}
					if(type == 709)
					{
						Commands->Mission_Complete ( false );
					}
					if(type == 710)
					{
						Commands->Mission_Complete ( false );
					}
				}
				break;
			case 3: 
					Add_An_Objective(type);
				break;
			case 4: 
					Commands->Set_Objective_Status(type, OBJECTIVE_STATUS_PENDING);
				break;
			case 5: 
					Commands->Set_Objective_Status(type, OBJECTIVE_STATUS_HIDDEN);
				break;
		}
	}

		
	void Timer_Expired(GameObject * obj, int timer_id )
	{
		if(timer_id == INITIAL_CONV)
		{
			// How are Dr. Mobius and Sydney?\n
			const char *conv_name = ("M07_CON001");
			int conv_id = Commands->Create_Conversation (conv_name, INNATE_PRIORITY_ENEMY_SEEN - 5, 200.0f, false);
			Commands->Join_Conversation(NULL, conv_id, false, true);
			Commands->Join_Conversation(STAR, conv_id, false, true);
			Commands->Join_Conversation(NULL, conv_id, false, true);
			Commands->Join_Conversation(GUNNER, conv_id, true, true);
			Commands->Start_Conversation (conv_id, 300701);
			Commands->Monitor_Conversation (obj, conv_id);	
		}
		if(timer_id == PROTECT_TEAM)
		{
			Add_An_Objective(710);
		}
	}

	void Action_Complete(GameObject * obj, int action_id, ActionCompleteReason reason)
	{
		ActionParamsStruct params;

		if(action_id == 300701 && reason == ACTION_COMPLETE_CONVERSATION_ENDED)
		{
			Add_An_Objective(701);

			Commands->Start_Timer (obj, this, 2.0f, PROTECT_TEAM);
			
			// Start nuclear strike countdown
			Commands->Send_Custom_Event(obj, Commands->Find_Object(100663), M07_GO_EVAC_SITE, 1, 0.0f);
			// Customs to move team to evac site
			// Gunner
			Commands->Send_Custom_Event(obj, GUNNER, M07_GO_ASSEMBLY, 1, 0.0f);
			// Deadeye
			Commands->Send_Custom_Event(obj, DEADEYE, M07_GO_ASSEMBLY, 1, 0.0f);
			// Sydney
			Commands->Send_Custom_Event(obj, SYDNEY, M07_GO_ASSEMBLY, 1, 0.0f);
			// Hotwire
			Commands->Send_Custom_Event(obj, HOTWIRE, M07_GO_ASSEMBLY, 1, 2.0f);
			// Patch
			Commands->Send_Custom_Event(obj, PATCH, M07_GO_ASSEMBLY, 1, 2.0f);
		}
	}
};

//Grants initial weapons
DECLARE_SCRIPT(M07_Havoc_DLS, "")
{
	bool nuke_blast;

	enum {HAVOC_ALARM_SOUND};

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

	void Created(GameObject * obj)
	{
		nuke_blast = true;
		Commands->Give_PowerUp(obj, "POW_Chaingun_Player");
		Commands->Give_PowerUp(obj, "POW_SniperRifle_Player");
		Commands->Give_PowerUp(obj, "POW_RocketLauncher_Player");
		Commands->Give_PowerUp(obj, "POW_MineRemote_Player");
	}

	void Custom( GameObject * obj, int type, int param, GameObject * sender ) 
	{
		if ( type == M07_NUKE_BLAST ) 
		{
			nuke_blast = (param == 1) ? true : false;
		}
	}

	void Sound_Heard(GameObject * obj, const CombatSound &sound)
	{
		if (sound.Type == M07_NUKE_IMPACT)
		{
			if(nuke_blast)
			{
				Commands->Apply_Damage( obj, 10000.0f, "DEATH");
			}
		} 
	}

	void Enemy_Seen(GameObject * obj, GameObject *enemy )
	{
		if(enemy == Commands->Find_Object(100801))
		{
			// You've got to be kidding.\n
			const char *conv_name = ("M07_CON015");
			int conv_id = Commands->Create_Conversation (conv_name, 100.0f, 200.0f, false);
			Commands->Join_Conversation(STAR, conv_id, false, true);
			Commands->Start_Conversation (conv_id, 300707);
			Commands->Monitor_Conversation (obj, conv_id);
		}
	}

	void Action_Complete(GameObject * obj, int action_id, ActionCompleteReason reason)
	{
		if (action_id == 300702 && reason == ACTION_COMPLETE_CONVERSATION_ENDED)
		{
			// Defeat Stealth Tank.
			Commands->Send_Custom_Event(obj, Commands->Find_Object(100657), 707, 3, 0.0f);
			// Change soundtrack to attack
			Commands->Set_Background_Music ("Raveshaw_Act on Instinct");
		}
	}

	void Killed (GameObject * obj, GameObject * killer)
	{
		Commands->Mission_Complete(false);
	}

};

DECLARE_SCRIPT(M07_Dead6_Minigunner, "")  // Deadeye
{

	bool nuke_blast;
	float health;
	float shield;

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

	void Created(GameObject * obj)
	{
		nuke_blast = true;
		Commands->Set_Innate_Is_Stationary(obj, true);
		health = Commands->Get_Max_Health(obj);
		shield = Commands->Get_Max_Shield_Strength(obj);
		Commands->Enable_Hibernation(obj, false);
	}

	void Custom( GameObject * obj, int type, int param, GameObject * sender ) 
	{
		ActionParamsStruct params;

		if ( type == M07_GO_ASSEMBLY ) 
		{
			params.Set_Basic( this, INNATE_PRIORITY_ENEMY_SEEN - 5, M07_GO_ASSEMBLY );
			params.Set_Movement( Vector3(0,0,0), RUN, 1.5f );
			params.WaypathID = 102495;
			Commands->Action_Goto (obj, params);
		}
		if ( type == M07_GO_EVAC_SITE ) 
		{
			Commands->Apply_Damage( obj, -10000.0f, "DEATH");

			Commands->Set_Innate_Is_Stationary(obj, false);
			params.Set_Basic (this, (INNATE_PRIORITY_ENEMY_SEEN - 5), M07_GO_EVAC_SITE);
			params.Set_Movement (Commands->Find_Object(100664), RUN, 10.0f);
			Commands->Action_Goto (obj, params);
		}
		if ( type == M07_NUKE_BLAST ) 
		{
			nuke_blast = (param == 1) ? true : false;
		}
		if ( type == M07_CAPTURE_SAM ) 
		{
			params.Set_Basic (this, (INNATE_PRIORITY_ENEMY_SEEN + 5), M07_CAPTURE_SAM);
			params.Set_Movement (Commands->Find_Object(100682), RUN, 3.0f);
			Commands->Action_Goto (obj, params);
			Commands->Enable_Hibernation(obj, true);
		}
	}

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

		if(timer_id == M07_GO_EVAC_SITE)
		{
			params.Set_Basic (this, (INNATE_PRIORITY_ENEMY_SEEN - 5), M07_GO_EVAC_SITE);
			params.Set_Movement (Commands->Find_Object(100664), RUN, 10.0f);
			Commands->Action_Goto (obj, params);
		}
	}

	void Action_Complete(GameObject * obj, int action_id, ActionCompleteReason reason)
	{
		if (action_id == M07_GO_EVAC_SITE && reason == ACTION_COMPLETE_NORMAL)
		{
			Commands->Set_Innate_Soldier_Home_Location(obj, Commands->Get_Position(obj));
		}
		if (action_id == M07_GO_EVAC_SITE && reason == ACTION_COMPLETE_LOW_PRIORITY)
		{
			Commands->Start_Timer(obj, this, 6.0f, M07_GO_EVAC_SITE);
		}
		if (action_id == M07_CAPTURE_SAM && reason == ACTION_COMPLETE_NORMAL)
		{
			Commands->Set_Innate_Is_Stationary(obj, true);
		}
	}

	void Sound_Heard(GameObject * obj, const CombatSound &sound)
	{
		if (sound.Type == M07_NUKE_IMPACT)
		{
			if(nuke_blast)
			{
				Commands->Apply_Damage( obj, 10000.0f, "STEEL");
			}
		}
	}

	void Damaged( GameObject * obj, GameObject * damager, float amount ) 
	{
		if(damager == obj || damager == GUNNER || damager == PATCH || damager == HOTWIRE)
		{
			Commands->Set_Health(obj, health);
			Commands->Set_Shield_Strength(obj, shield);
		}
		else
		{
			health = Commands->Get_Health(obj);
			shield = Commands->Get_Shield_Strength(obj);
		}

	}

	void Killed (GameObject * obj, GameObject * killer)
	{
		// Deadeye Killed
		Commands->Set_HUD_Help_Text ( IDS_M05DSGN_DSGN0178I1DSGN_TXT, TEXT_COLOR_OBJECTIVE_PRIMARY );
		Commands->Send_Custom_Event(obj, Commands->Find_Object(100657), 710, 2, 1.0f);
		
	}
};

DECLARE_SCRIPT(M07_Dead6_Rocket_Soldier, "")  // Gunner
{

	bool nuke_blast;
	float health;
	float shield;

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

	void Created(GameObject * obj)
	{
		nuke_blast = true;
		Commands->Set_Innate_Is_Stationary(obj, true);
		health = Commands->Get_Max_Health(obj);
		shield = Commands->Get_Max_Shield_Strength(obj);
		Commands->Enable_Hibernation(obj, false);
	}

	void Custom( GameObject * obj, int type, int param, GameObject * sender ) 
	{
		ActionParamsStruct params;

		if ( type == M07_GO_ASSEMBLY ) 
		{
			params.Set_Basic( this, INNATE_PRIORITY_ENEMY_SEEN - 5, M07_GO_ASSEMBLY );
			params.Set_Movement( Vector3(0,0,0), RUN, 1.5f );
			params.WaypathID = 102479;
			Commands->Action_Goto (obj, params);
		}
		if ( type == M07_GO_EVAC_SITE ) 
		{
			Commands->Set_Innate_Is_Stationary(obj, false);
			params.Set_Basic (this, (INNATE_PRIORITY_ENEMY_SEEN - 5), M07_GO_EVAC_SITE);
			params.Set_Movement (Commands->Find_Object(100664), RUN, 10.0f);
			Commands->Action_Goto (obj, params);
		}
		if ( type == M07_NUKE_BLAST ) 
		{
			nuke_blast = (param == 1) ? true : false;
		}
		if ( type == M07_CAPTURE_SAM ) 
		{
			Commands->Apply_Damage( obj, -10000.0f, "DEATH");

			params.Set_Basic (this, (INNATE_PRIORITY_ENEMY_SEEN + 5), M07_CAPTURE_SAM);
			params.Set_Movement (Commands->Find_Object(100681), RUN, 3.0f);
			Commands->Action_Goto (obj, params);
			Commands->Enable_Hibernation(obj, true);
		}
	}

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

		if(timer_id == M07_GO_EVAC_SITE)
		{
			params.Set_Basic (this, (INNATE_PRIORITY_ENEMY_SEEN - 5), M07_GO_EVAC_SITE);
			params.Set_Movement (Commands->Find_Object(100664), RUN, 10.0f);
			Commands->Action_Goto (obj, params);
		}
	}

	void Action_Complete(GameObject * obj, int action_id, ActionCompleteReason reason)
	{
		if (action_id == M07_GO_EVAC_SITE && reason == ACTION_COMPLETE_NORMAL)
		{
			Commands->Set_Innate_Soldier_Home_Location(obj, Commands->Get_Position(obj));
		}
		if (action_id == M07_GO_EVAC_SITE && reason == ACTION_COMPLETE_LOW_PRIORITY)
		{
			Commands->Start_Timer(obj, this, 6.0f, M07_GO_EVAC_SITE);
		}
		if (action_id == M07_CAPTURE_SAM && reason == ACTION_COMPLETE_NORMAL)
		{
			Commands->Set_Innate_Is_Stationary(obj, true);
		}
	}

	void Sound_Heard(GameObject * obj, const CombatSound &sound)
	{
		if (sound.Type == M07_NUKE_IMPACT)
		{
			if(nuke_blast)
			{
				Commands->Apply_Damage( obj, 10000.0f, "STEEL");
			}
		}
	}

	void Damaged( GameObject * obj, GameObject * damager, float amount ) 
	{
		if(damager == obj || damager == DEADEYE || damager == PATCH || damager == HOTWIRE)
		{
			Commands->Set_Health(obj, health);
			Commands->Set_Shield_Strength(obj, shield);
		}
		else
		{
			health = Commands->Get_Health(obj);
			shield = Commands->Get_Shield_Strength(obj);
		}
	}

	void Killed (GameObject * obj, GameObject * killer)
	{
		// Gunner Killed
		Commands->Set_HUD_Help_Text ( IDS_M05DSGN_DSGN0176I1DSGN_TXT, TEXT_COLOR_OBJECTIVE_PRIMARY );

		Commands->Send_Custom_Event(obj, Commands->Find_Object(100657), 710, 2, 1.0f);
		
	}
};

DECLARE_SCRIPT(M07_Dead6_Grenadier, "")  // Patch
{

	bool nuke_blast;
	float health;
	float shield;

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

	void Created(GameObject * obj)
	{
		nuke_blast = true;
		Commands->Set_Innate_Is_Stationary(obj, true);
		health = Commands->Get_Max_Health(obj);
		shield = Commands->Get_Max_Shield_Strength(obj);
		Commands->Enable_Hibernation(obj, false);
	}

	void Custom( GameObject * obj, int type, int param, GameObject * sender ) 
	{
		ActionParamsStruct params;

		if ( type == M07_GO_ASSEMBLY ) 
		{
			params.Set_Basic( this, INNATE_PRIORITY_ENEMY_SEEN - 5, M07_GO_ASSEMBLY );
			params.Set_Movement( Vector3(0,0,0), RUN, 1.5f );
			params.WaypathID = 102495;
			Commands->Action_Goto (obj, params);
		}
		if ( type == M07_GO_EVAC_SITE ) 
		{
			Commands->Apply_Damage( obj, -10000.0f, "DEATH");

			Commands->Set_Innate_Is_Stationary(obj, false);
			params.Set_Basic (this, (INNATE_PRIORITY_ENEMY_SEEN - 5), M07_GO_EVAC_SITE);
			params.Set_Movement (Commands->Find_Object(100664), RUN, 10.0f);
			Commands->Action_Goto (obj, params);
		}
		if ( type == M07_NUKE_BLAST ) 
		{
			nuke_blast = (param == 1) ? true : false;
		}
		if ( type == M07_CAPTURE_SAM ) 
		{
			params.Set_Basic (this, (INNATE_PRIORITY_ENEMY_SEEN - 5), M07_CAPTURE_SAM);
			params.Set_Movement (SYDNEY, RUN, 3.0f);
			params.MoveFollow = true;
			Commands->Action_Goto (obj, params);
			Commands->Enable_Hibernation(obj, true);
		}
	}

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

		if(timer_id == M07_GO_EVAC_SITE)
		{
			params.Set_Basic (this, (INNATE_PRIORITY_ENEMY_SEEN - 5), M07_GO_EVAC_SITE);
			params.Set_Movement (Commands->Find_Object(100664), RUN, 10.0f);
			Commands->Action_Goto (obj, params);
		}
		if(timer_id == M07_CAPTURE_SAM)
		{
			params.Set_Basic (this, (INNATE_PRIORITY_ENEMY_SEEN - 5), M07_CAPTURE_SAM);
			params.Set_Movement (SYDNEY, RUN, 3.0f);
			params.MoveFollow = true;
			Commands->Action_Goto (obj, params);
		}
	}

	void Action_Complete(GameObject * obj, int action_id, ActionCompleteReason reason)
	{
		if (action_id == M07_GO_EVAC_SITE && reason == ACTION_COMPLETE_NORMAL)
		{
			Commands->Set_Innate_Soldier_Home_Location(obj, Commands->Get_Position(obj));
		}
		if (action_id == M07_GO_EVAC_SITE && reason == ACTION_COMPLETE_LOW_PRIORITY)
		{
			Commands->Start_Timer(obj, this, 6.0f, M07_GO_EVAC_SITE);
		}
		if (action_id == M07_CAPTURE_SAM && reason == ACTION_COMPLETE_LOW_PRIORITY)
		{
			Commands->Start_Timer(obj, this, 6.0f, M07_CAPTURE_SAM);
		}
	}

	void Sound_Heard(GameObject * obj, const CombatSound &sound)
	{
		if (sound.Type == M07_NUKE_IMPACT)
		{
			if(nuke_blast)
			{
				Commands->Apply_Damage( obj, 10000.0f, "STEEL");
			}
		}
	}

	void Damaged( GameObject * obj, GameObject * damager, float amount ) 
	{
		if(damager == obj || damager == DEADEYE || damager == GUNNER || damager == HOTWIRE)
		{
			Commands->Set_Health(obj, health);
			Commands->Set_Shield_Strength(obj, shield);
		}
		else
		{
			health = Commands->Get_Health(obj);
			shield = Commands->Get_Shield_Strength(obj);
		}

	}

	void Killed (GameObject * obj, GameObject * killer)
	{
		// Patch Killed
		Commands->Set_HUD_Help_Text ( IDS_M07DSGN_DSGN0092I1DSGN_TXT, TEXT_COLOR_OBJECTIVE_PRIMARY );

		Commands->Send_Custom_Event(obj, Commands->Find_Object(100657), 710, 2, 1.0f);
		
	}
};

DECLARE_SCRIPT(M07_Dead6_Grenadier2, "")  // Patch2
{

	enum{WAYPATH};

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

	void Created(GameObject * obj)
	{
		Commands->Enable_Hibernation(obj, false);

		ActionParamsStruct params;

		params.Set_Basic( this, INNATE_PRIORITY_ENEMY_SEEN + 5, WAYPATH );
		params.Set_Movement( Vector3(0,0,0), RUN, 1.5f );
		params.WaypathID = 103837;
		Commands->Action_Goto( obj, params );
	}

	void Action_Complete(GameObject * obj, int action_id, ActionCompleteReason reason)
	{
		if (action_id == WAYPATH)
		{
			int dead6_id = Commands->Get_ID(obj);
			Commands->Send_Custom_Event(obj, Commands->Find_Object(104496), M07_DEAD6_EVAC, dead6_id, 0.0f);
		}
		
	}

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

	}

	void Killed (GameObject * obj, GameObject * killer)
	{
		// Patch Killed
		Commands->Set_HUD_Help_Text ( IDS_M07DSGN_DSGN0092I1DSGN_TXT, TEXT_COLOR_OBJECTIVE_PRIMARY );
		Commands->Send_Custom_Event(obj, Commands->Find_Object(100657), 710, 2, 1.0f);
		
	}
};

DECLARE_SCRIPT(M07_Dead6_MiniGunner2, "")  // Deadeye2
{
	enum{WAYPATH};
	
	// Register variables to be Auto-Saved
	// All variables must have a unique ID, less than 256, that never changes
	REGISTER_VARIABLES()
	{
//		SAVE_VARIABLE( nuke_blast, 1 );
	}

	void Created(GameObject * obj)
	{
		Commands->Enable_Hibernation(obj, false);
		ActionParamsStruct params;

		params.Set_Basic( this, INNATE_PRIORITY_ENEMY_SEEN + 5, WAYPATH );
		params.Set_Movement( Vector3(0,0,0), RUN, 1.5f );
		params.WaypathID = 103837;
		Commands->Action_Goto( obj, params );
	}

	void Action_Complete(GameObject * obj, int action_id, ActionCompleteReason reason)
	{
		if (action_id == WAYPATH)
		{
			int dead6_id = Commands->Get_ID(obj);
			Commands->Send_Custom_Event(obj, Commands->Find_Object(104496), M07_DEAD6_EVAC, dead6_id, 0.0f);
		}
		
	}

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

	}

	void Killed (GameObject * obj, GameObject * killer)
	{
		// Deadeye Killed
		Commands->Set_HUD_Help_Text ( IDS_M05DSGN_DSGN0178I1DSGN_TXT, TEXT_COLOR_OBJECTIVE_PRIMARY );
		Commands->Send_Custom_Event(obj, Commands->Find_Object(100657), 710, 2, 1.0f);
		
	}

};

DECLARE_SCRIPT(M07_Dead6_Rocket_Soldier2, "")  // Gunner2
{

	enum{WAYPATH};

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

	void Created(GameObject * obj)
	{
		Commands->Enable_Hibernation(obj, false);

		ActionParamsStruct params;

		params.Set_Basic( this, INNATE_PRIORITY_ENEMY_SEEN + 5, WAYPATH );
		params.Set_Movement( Vector3(0,0,0), RUN, 1.5f );
		params.WaypathID = 103837;
		Commands->Action_Goto( obj, params );
	}

	void Action_Complete(GameObject * obj, int action_id, ActionCompleteReason reason)
	{
		if (action_id == WAYPATH)
		{
			int dead6_id = Commands->Get_ID(obj);
			Commands->Send_Custom_Event(obj, Commands->Find_Object(104496), M07_DEAD6_EVAC, dead6_id, 0.0f);
		}
		
	}

	void Damaged( GameObject * obj, GameObject * damager, float amount ) 
	{
		
	}

	void Killed (GameObject * obj, GameObject * killer)
	{
		// Gunner Killed
		Commands->Set_HUD_Help_Text ( IDS_M05DSGN_DSGN0176I1DSGN_TXT, TEXT_COLOR_OBJECTIVE_PRIMARY );
		Commands->Send_Custom_Event(obj, Commands->Find_Object(100657), 710, 2, 1.0f);
		
	}

};

DECLARE_SCRIPT(M07_Sydney2, "")  
{
	enum{WAYPATH};

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

	void Created(GameObject * obj)
	{
		Commands->Enable_Hibernation(obj, false);

		ActionParamsStruct params;

		params.Set_Basic( this, INNATE_PRIORITY_ENEMY_SEEN + 5, WAYPATH );
		params.Set_Movement( Vector3(0,0,0), 1.0f, 1.5f );
		params.WaypathID = 103837;
		Commands->Action_Goto( obj, params );
	}

	void Action_Complete(GameObject * obj, int action_id, ActionCompleteReason reason)
	{
		if (action_id == WAYPATH)
		{
			int dead6_id = Commands->Get_ID(obj);
			Commands->Send_Custom_Event(obj, Commands->Find_Object(104496), M07_DEAD6_EVAC, dead6_id, 0.0f);
		}
		
	}

	void Damaged( GameObject * obj, GameObject * damager, float amount ) 
	{
		
	}

	void Killed (GameObject * obj, GameObject * killer)
	{
		Commands->Set_HUD_Help_Text ( IDS_M11DSGN_DSGN1008I1DSGN_TXT, TEXT_COLOR_OBJECTIVE_PRIMARY );
		Commands->Send_Custom_Event(obj, Commands->Find_Object(100657), 701, 2, 1.0f);
		
	}

};

DECLARE_SCRIPT(M07_Dead6_Engineer, "")  // Hotwire
{

	bool nuke_blast;
	bool go_evac_site;
	bool dont_move;
	int current_move_loc;
	int move_loc[10];
	bool evac;
	float health;
	float shield;

	enum{GO_SAM1, ATTACK_SAM1, GO_SAM2, ATTACK_SAM2, 
		HOTWIRE_MOVE_LOC, MOVE_LOC_LOW_PRIORITY, TANK_STILL_THERE, ARRIVE_EVAC_SPOT};
	// Register variables to be Auto-Saved
	// All variables must have a unique ID, less than 256, that never changes
	REGISTER_VARIABLES()
	{
		SAVE_VARIABLE( nuke_blast, 1 );
		SAVE_VARIABLE( go_evac_site, 2 );
		SAVE_VARIABLE( dont_move, 3 );
		SAVE_VARIABLE( current_move_loc, 4 );
		SAVE_VARIABLE( evac, 5 );
		SAVE_VARIABLE( health, 6 );
		SAVE_VARIABLE( shield, 7 );
		SAVE_VARIABLE( move_loc, 8 );
	}

	void Created(GameObject * obj)
	{
		Commands->Enable_Hibernation(obj, false);

		nuke_blast = true;
		go_evac_site = false;
		Commands->Set_Innate_Is_Stationary(obj, true);
		dont_move = true;
		evac = false;
		current_move_loc = 0;
		move_loc[0] = 102469;
		move_loc[1] = 102470;
		move_loc[2] = 102471;
		move_loc[3] = 102472;
		move_loc[4] = 102473;
		move_loc[5] = 102474;
		move_loc[6] = 102475;
		move_loc[7] = 102476;
		move_loc[8] = 102477;
		move_loc[9] = 102478;

		health = Commands->Get_Max_Health(obj);
		shield = Commands->Get_Max_Shield_Strength(obj);
	}

	void Custom( GameObject * obj, int type, int param, GameObject * sender ) 
	{
		ActionParamsStruct params;

		if (type == M07_EVAC_INN) //SAM sites captured, evac DEAD6 and Sydney
		{
			evac = true;
			params.Set_Basic (this, (INNATE_PRIORITY_ENEMY_SEEN + 5), ARRIVE_EVAC_SPOT);
			params.Set_Movement (Commands->Find_Object(105151), RUN, 3.0f);
			Commands->Action_Goto (obj, params);
		}
		if ( type == M07_GO_ASSEMBLY ) 
		{
			params.Set_Basic( this, INNATE_PRIORITY_ENEMY_SEEN - 5, M07_GO_ASSEMBLY );
			params.Set_Movement( Vector3(0,0,0), RUN, 1.5f );
			params.WaypathID = 102510;
			Commands->Action_Goto (obj, params);
		}
		if ( type == M07_GO_EVAC_SITE ) 
		{
			Commands->Apply_Damage( obj, -10000.0f, "DEATH");

			Commands->Set_Innate_Is_Stationary(obj, false);
			params.Set_Basic (this, (INNATE_PRIORITY_ENEMY_SEEN - 5), M07_GO_EVAC_SITE);
			params.Set_Movement (Commands->Find_Object(100664), RUN, 10.0f);
			Commands->Action_Goto (obj, params);
		}
		if ( type == M07_NUKE_BLAST ) 
		{
			nuke_blast = (param == 1) ? true : false;
		}

		if ( type == M07_CAPTURE_SAM ) 
		{
			go_evac_site = true;

		//	params.Set_Basic (this, (INNATE_PRIORITY_ENEMY_SEEN + 5), M07_CAPTURE_SAM);
		//	params.Set_Movement (STAR, RUN, 3.0f);
		//	params.MoveFollow = true;
		//	Commands->Action_Goto (obj, params);

			dont_move = false;

			params.Set_Basic (this, (INNATE_PRIORITY_ENEMY_SEEN - 5), HOTWIRE_MOVE_LOC);
			params.Set_Movement (Commands->Find_Object(move_loc[current_move_loc]), RUN, 3.0f);
			Commands->Action_Goto (obj, params);
		}
		if ( type == M07_HOTWIRE_CAPTURE_SAMS && (!Commands->Find_Object(100905))) 
		{
			Commands->Action_Reset(obj, INNATE_PRIORITY_ENEMY_SEEN + 5);
			if(Commands->Find_Object(100674))
			{
				Commands->Set_Innate_Is_Stationary(obj, false);
				dont_move = true;
				params.Set_Basic( this, INNATE_PRIORITY_ENEMY_SEEN + 5, GO_SAM1 );
				params.Set_Movement (Commands->Find_Object(100674), RUN, 10.0f);
				Commands->Action_Goto( obj, params );

				GameObject * inn_loc = Commands->Find_Object(100718);
				Commands->Set_Innate_Soldier_Home_Location(obj, Commands->Get_Position(inn_loc));
			}

			else if(Commands->Find_Object(100673))
			{
				Commands->Set_Innate_Is_Stationary(obj, false);
				dont_move = true;
				params.Set_Basic( this, INNATE_PRIORITY_ENEMY_SEEN + 5, GO_SAM2 );
				params.Set_Movement (Commands->Find_Object(100673), RUN, 10.0f);
				Commands->Action_Goto( obj, params );

				GameObject * inn_loc = Commands->Find_Object(100718);
				Commands->Set_Innate_Soldier_Home_Location(obj, Commands->Get_Position(inn_loc));
			}
		}

		if ( type == M07_HOTWIRE_CAPTURE_SAMS && (Commands->Find_Object(100905)))
		{
			Commands->Start_Timer(obj, this, 5.0f, TANK_STILL_THERE);

		}

		if(type == M07_MOVE_HOTWIRE && !dont_move)
		{
			current_move_loc = param;

			params.Set_Basic (this, (INNATE_PRIORITY_ENEMY_SEEN - 5), HOTWIRE_MOVE_LOC);
			params.Set_Movement (Commands->Find_Object(move_loc[current_move_loc]), RUN, 3.0f);
			Commands->Action_Goto (obj, params);
		}

	}

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

		if(timer_id == M07_GO_EVAC_SITE && !go_evac_site && !evac)
		{
			params.Set_Basic (this, (INNATE_PRIORITY_ENEMY_SEEN - 5), M07_GO_EVAC_SITE);
			params.Set_Movement (Commands->Find_Object(100664), RUN, 10.0f);
			Commands->Action_Goto (obj, params);
		}
		if(timer_id == ATTACK_SAM1 && !evac)
		{
			// Custom to change SAMs playertype to GDI
			Commands->Send_Custom_Event (obj, Commands->Find_Object(100674), M07_CHANGE_SAM_TEAM, 1, 0.0f);
			Commands->Send_Custom_Event (obj, Commands->Find_Object(100679), M07_CHANGE_SAM_TEAM, 1, 0.0f);

			Commands->Action_Reset(obj, INNATE_PRIORITY_ENEMY_SEEN + 5);

			params.Set_Basic( this, INNATE_PRIORITY_ENEMY_SEEN + 5, GO_SAM2 );
			params.Set_Movement (Commands->Find_Object(100673), RUN, 10.0f);
			Commands->Action_Goto( obj, params );

			
		}
		if(timer_id == ATTACK_SAM2 && !evac)
		{
			// Custom to change SAMs playertype to GDI
			Commands->Send_Custom_Event (obj, Commands->Find_Object(100673), M07_CHANGE_SAM_TEAM, 1, 0.0f);
			Commands->Send_Custom_Event (obj, Commands->Find_Object(100680), M07_CHANGE_SAM_TEAM, 1, 0.0f);

			Commands->Action_Reset(obj, INNATE_PRIORITY_ENEMY_SEEN + 5);
			Commands->Select_Weapon(obj, NULL );
			
		}

		if(timer_id == MOVE_LOC_LOW_PRIORITY)
		{
			params.Set_Basic (this, (INNATE_PRIORITY_ENEMY_SEEN - 5), HOTWIRE_MOVE_LOC);
			params.Set_Movement (Commands->Find_Object(move_loc[current_move_loc]), RUN, 3.0f);
			Commands->Action_Goto (obj, params);

		}

		if(timer_id == TANK_STILL_THERE)
		{
			Commands->Send_Custom_Event (obj, obj, M07_HOTWIRE_CAPTURE_SAMS, 1, 0.0f);

		}
	}

	void Action_Complete(GameObject * obj, int action_id, ActionCompleteReason reason)
	{
		ActionParamsStruct params;

		if (action_id == ARRIVE_EVAC_SPOT && reason == ACTION_COMPLETE_NORMAL && evac)
		{
			int dead6_id = Commands->Get_ID(obj);
			Commands->Send_Custom_Event(obj, Commands->Find_Object(104496), M07_DEAD6_EVAC, dead6_id, 0.0f);
		}

		if (action_id == ARRIVE_EVAC_SPOT && reason == ACTION_COMPLETE_MOVE_NO_PROGRESS_MADE && evac)
		{
			// This is a hack for the moment, need to have pathfinding around dec_phys vehicles at inn
			int dead6_id = Commands->Get_ID(obj);
			Commands->Send_Custom_Event(obj, Commands->Find_Object(104496), M07_DEAD6_EVAC, dead6_id, 0.0f);
		}

		if (action_id == M07_GO_EVAC_SITE && reason == ACTION_COMPLETE_NORMAL && !evac)
		{
			go_evac_site = true;
			Commands->Set_Innate_Soldier_Home_Location(obj, Commands->Get_Position(obj));
		}
		if (action_id == M07_GO_EVAC_SITE && reason == ACTION_COMPLETE_LOW_PRIORITY && !evac)
		{
			Commands->Start_Timer(obj, this, 6.0f, M07_GO_EVAC_SITE);
		}
		
		if (action_id == GO_SAM1 && reason == ACTION_COMPLETE_NORMAL && !evac)
		{
			params.Set_Basic( this, INNATE_PRIORITY_ENEMY_SEEN + 5, 100 );
			params.Set_Attack (Commands->Find_Object(100679), 250.0f, 0.0f, 0);
			params.AttackCheckBlocked = true;
			Commands->Action_Attack( obj, params );

			Commands->Start_Timer(obj, this, 6.0f, ATTACK_SAM1);
		}
		if (action_id == GO_SAM1 && reason == ACTION_COMPLETE_LOW_PRIORITY && !evac)
		{
			// Keep trying to GO_SAM1
			Commands->Send_Custom_Event (obj, HOTWIRE, M07_HOTWIRE_CAPTURE_SAMS, 1, 2.0f);
		}
		if (action_id == GO_SAM2 && reason == ACTION_COMPLETE_NORMAL && !evac)
		{
			params.Set_Basic( this, INNATE_PRIORITY_ENEMY_SEEN + 5, 100 );
			params.Set_Attack (Commands->Find_Object(100680), 250.0f, 0.0f, 0);
			params.AttackCheckBlocked = true;
			Commands->Action_Attack( obj, params );

			Commands->Start_Timer(obj, this, 6.0f, ATTACK_SAM2);
		}

		if(action_id == HOTWIRE_MOVE_LOC && reason == ACTION_COMPLETE_NORMAL && !evac)
		{
			Commands->Set_Innate_Soldier_Home_Location(obj, Commands->Get_Position(obj), 4.0f);
		}
		if(action_id == HOTWIRE_MOVE_LOC && reason == ACTION_COMPLETE_LOW_PRIORITY && !evac)
		{
			Commands->Start_Timer(obj, this, 4.0f, MOVE_LOC_LOW_PRIORITY);
		}

		
	}

	void Destroyed(GameObject * obj)
	{
		Commands->Send_Custom_Event(obj, Commands->Find_Object(104496), M07_DEAD6_EVAC, 1, 0.0f);
		
	}

	void Sound_Heard(GameObject * obj, const CombatSound &sound)
	{
		if (sound.Type == M07_NUKE_IMPACT)
		{
			if(nuke_blast)
			{
				Commands->Apply_Damage( obj, 10000.0f, "STEEL");
			}
		}
	}

	void Damaged( GameObject * obj, GameObject * damager, float amount ) 
	{
		if(damager == obj || damager == DEADEYE || damager == GUNNER || damager == HOTWIRE)
		{
			Commands->Set_Health(obj, health);
			Commands->Set_Shield_Strength(obj, shield);
		}
		else
		{
			health = Commands->Get_Health(obj);
			shield = Commands->Get_Shield_Strength(obj);
		}

	}

	void Killed (GameObject * obj, GameObject * killer)
	{
		// Hotwire Killed
		Commands->Set_HUD_Help_Text ( IDS_M05DSGN_DSGN0174I1DSGN_TXT, TEXT_COLOR_OBJECTIVE_PRIMARY );
		Commands->Send_Custom_Event(obj, Commands->Find_Object(100657), 710, 2, 1.0f);
		
	}
};

DECLARE_SCRIPT(M07_Sydney, "")  
{
	bool nuke_blast;
	float health;
	float shield;

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

	void Created(GameObject * obj)
	{
		nuke_blast = true;
		Commands->Set_Innate_Is_Stationary(obj, true);
		Commands->Enable_Hibernation(obj, false);
		health = Commands->Get_Max_Health(obj);
		shield = Commands->Get_Max_Shield_Strength(obj);
		// Give Sydney initial pistol
		Commands->Give_PowerUp(obj, "POW_Pistol_AI");
		Commands->Select_Weapon(obj, "Weapon_Pistol_Ai" );
	}

	void Custom( GameObject * obj, int type, int param, GameObject * sender ) 
	{
		ActionParamsStruct params;

		if ( type == M07_GO_ASSEMBLY ) 
		{
			params.Set_Basic( this, INNATE_PRIORITY_ENEMY_SEEN - 5, M07_GO_ASSEMBLY );
			params.Set_Movement( Vector3(0,0,0), RUN, 1.5f );
			params.WaypathID = 102479;
			Commands->Action_Goto (obj, params);
		}
		if(type == M07_GO_EVAC_SITE)
		{
			params.Set_Basic (this, (INNATE_PRIORITY_ENEMY_SEEN - 5), M07_GO_EVAC_SITE);
			params.Set_Movement (Commands->Find_Object(100664), RUN, 10.0f);
			Commands->Action_Goto (obj, params);
		}
		if ( type == M07_NUKE_BLAST ) 
		{
			nuke_blast = (param == 1) ? true : false;
		}

		if ( type == M07_CAPTURE_SAM ) 
		{
			params.Set_Basic (this, (INNATE_PRIORITY_ENEMY_SEEN + 5), M07_CAPTURE_SAM);
			params.Set_Movement (Commands->Find_Object(100664), RUN, 3.0f);
			Commands->Action_Goto (obj, params);

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

	void Action_Complete(GameObject * obj, int action_id, ActionCompleteReason reason)
	{
		if (action_id == M07_CAPTURE_SAM && reason == ACTION_COMPLETE_NORMAL)
		{
			Commands->Set_Innate_Is_Stationary(obj, true);
		}
		if (action_id == M07_GO_EVAC_SITE && reason == ACTION_COMPLETE_NORMAL)
		{
			Commands->Set_Innate_Soldier_Home_Location(obj, Commands->Get_Position(obj));
		}
		if (action_id == M07_GO_EVAC_SITE && reason == ACTION_COMPLETE_LOW_PRIORITY)
		{
			Commands->Start_Timer(obj, this, 6.0f, M07_GO_EVAC_SITE);
		}
		
	}

	void Sound_Heard(GameObject * obj, const CombatSound &sound)
	{
		if (sound.Type == M07_NUKE_IMPACT)
		{
			if(nuke_blast)
			{
				Commands->Apply_Damage( obj, 10000.0f, "STEEL");
			}
		}
	}

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

		if(timer_id == M07_GO_EVAC_SITE)
		{
			params.Set_Basic (this, (INNATE_PRIORITY_ENEMY_SEEN - 5), M07_GO_EVAC_SITE);
			params.Set_Movement (Commands->Find_Object(100664), RUN, 10.0f);
			Commands->Action_Goto (obj, params);
		}
	}

	void Damaged( GameObject * obj, GameObject * damager, float amount ) 
	{
		if(damager == obj || damager == DEADEYE || damager == GUNNER || damager == HOTWIRE || damager == PATCH)
		{
			Commands->Set_Health(obj, health);
			Commands->Set_Shield_Strength(obj, shield);
		}
		else
		{
			health = Commands->Get_Health(obj);
			shield = Commands->Get_Shield_Strength(obj);
		}

	}

	void Killed (GameObject * obj, GameObject * killer)
	{
		// Sydney Killed
		Commands->Set_HUD_Help_Text ( IDS_M11DSGN_DSGN1008I1DSGN_TXT, TEXT_COLOR_OBJECTIVE_PRIMARY );
		Commands->Send_Custom_Event(obj, Commands->Find_Object(100657), 701, 2, 1.0f);
		
	}
};

DECLARE_SCRIPT(M07_Cathedral_Controller, "")  // 100663
{

	enum{TWO_MIN, ONE_MIN, THIRTY, TWENTY, TEN, FIVE, FOUR, THREE, TWO, ONE, ESCAPED, NUKEBITS};

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

	void Created(GameObject * obj)
	{
		
	}

	void Custom( GameObject * obj, int type, int param, GameObject * sender ) 
	{
		ActionParamsStruct params;

		if ( type == M07_GO_EVAC_SITE ) 
		{
			// Impact: 2 Minutes.\n
			const char *conv_name = ("M07_CON003");
			int conv_id = Commands->Create_Conversation (conv_name, 100.0f, 200.0f, false);
			Commands->Join_Conversation(NULL, conv_id, false, true);
			Commands->Start_Conversation (conv_id, 10);

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

	void Timer_Expired(GameObject * obj, int timer_id)
	{
		if(timer_id == TWO_MIN)
		{
			// Impact: 1 Minute.\n
			const char *conv_name = ("M07_CON004");
			int conv_id = Commands->Create_Conversation (conv_name, 100.0f, 200.0f, false);
			Commands->Join_Conversation(NULL, conv_id, false, true);
			Commands->Start_Conversation (conv_id, 10);

			Commands->Start_Timer(obj, this, 30.0f, ONE_MIN);
		}
		if(timer_id == ONE_MIN)
		{
			// Impact: 30 seconds.\n
			const char *conv_name = ("M07_CON005");
			int conv_id = Commands->Create_Conversation (conv_name, 100.0f, 200.0f, false);
			Commands->Join_Conversation(NULL, conv_id, false, true);
			Commands->Start_Conversation (conv_id, 10);

			Commands->Start_Timer(obj, this, 10.0f, THIRTY);
		}
		if(timer_id == THIRTY)
		{
			// Impact: 20 seconds.\n
			const char *conv_name = ("M07_CON006");
			int conv_id = Commands->Create_Conversation (conv_name, 100.0f, 200.0f, false);
			Commands->Join_Conversation(NULL, conv_id, false, true);
			Commands->Start_Conversation (conv_id, 10);

			Commands->Start_Timer(obj, this, 10.0f, TWENTY);
		}
		if(timer_id == TWENTY)
		{
			// Impact: 10 seconds.\n
			const char *conv_name = ("M07_CON007");
			int conv_id = Commands->Create_Conversation (conv_name, 100.0f, 200.0f, false);
			Commands->Join_Conversation(NULL, conv_id, false, true);
			Commands->Start_Conversation (conv_id, 10);

			Commands->Start_Timer(obj, this, 5.0f, TEN);
		}
		if(timer_id == TEN)
		{
			// Impact: 5 seconds.\n
			const char *conv_name = ("M07_CON008");
			int conv_id = Commands->Create_Conversation (conv_name, 100.0f, 200.0f, false);
			Commands->Join_Conversation(NULL, conv_id, false, true);
			Commands->Start_Conversation (conv_id, 10);

			Commands->Start_Timer(obj, this, 1.0f, FIVE);
		}
		if(timer_id == FIVE)
		{
			GameObject * cinematic_controller = Commands->Create_Object ( "Invisible_Object", Vector3(-100.879f, 88.570f, 29.184f));
			Commands->Attach_Script(cinematic_controller, "Test_Cinematic", "XG_NukeStrike.txt");

			// 4 seconds.\n
			const char *conv_name = ("M07_CON009");
			int conv_id = Commands->Create_Conversation (conv_name, 100.0f, 200.0f, false);
			Commands->Join_Conversation(NULL, conv_id, false, true);
			Commands->Start_Conversation (conv_id, 10);

			Commands->Start_Timer(obj, this, 1.0f, FOUR);
		}
		if(timer_id == FOUR)
		{
			// 3 seconds.\n
			const char *conv_name = ("M07_CON010");
			int conv_id = Commands->Create_Conversation (conv_name, 100.0f, 200.0f, false);
			Commands->Join_Conversation(NULL, conv_id, false, true);
			Commands->Start_Conversation (conv_id, 10);

			Commands->Start_Timer(obj, this, 1.0f, THREE);
		}
		if(timer_id == THREE)
		{
			// 2 seconds.\n
			const char *conv_name = ("M07_CON011");
			int conv_id = Commands->Create_Conversation (conv_name, 100.0f, 200.0f, false);
			Commands->Join_Conversation(NULL, conv_id, false, true);
			Commands->Start_Conversation (conv_id, 10);

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

			
		}
		if(timer_id == TWO)
		{
			// 1 seconds.\n
			const char *conv_name = ("M07_CON012");
			int conv_id = Commands->Create_Conversation (conv_name, 100.0f, 200.0f, false);
			Commands->Join_Conversation(NULL, conv_id, false, true);
			Commands->Start_Conversation (conv_id, 10);

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

			Commands->Set_Clouds (1.0f, 1.0f, 3.0f);
		}
		if(timer_id == ONE)
		{
			// Send customs to Nuke Blast Radius determination zones to deactivate them
			Commands->Send_Custom_Event (obj, Commands->Find_Object(100665), M07_DEACTIVATE_NUKE_BLAST, 1, 0.0f);
			Commands->Send_Custom_Event (obj, Commands->Find_Object(100666), M07_DEACTIVATE_NUKE_BLAST, 1, 0.0f);
			// Boom!
			Commands->Create_Logical_Sound(obj, M07_NUKE_IMPACT, Commands->Get_Position(obj), 2500.0f);
			Commands->Set_Ash(0.15f, 3.0f, false);
			Commands->Set_Wind(90.0f, 5.0f, 2.0f, 0.0f);
			
			Commands->Start_Timer(obj, this, 2.0f, NUKEBITS);
		}
		if(timer_id == NUKEBITS)
		{
			Commands->Create_Explosion("Ground Explosions Twiddler", Commands->Get_Position(Commands->Find_Object(119890))); 
			Commands->Create_Explosion("Ground Explosions Twiddler", Commands->Get_Position(Commands->Find_Object(119891))); 
			Commands->Create_Explosion("Ground Explosions Twiddler", Commands->Get_Position(Commands->Find_Object(119892))); 
			Commands->Create_Explosion("Ground Explosions Twiddler", Commands->Get_Position(Commands->Find_Object(119893))); 
			GameObject * nukebits = Commands->Create_Object("M07_Nukebits", Vector3(-128.295f, 71.892f, 26.754f));
			Commands->Set_Facing( nukebits, -10.000f );
			Commands->Start_Timer(obj, this, 3.0f, ESCAPED);
		}
		if(timer_id == ESCAPED)
		{
			if(SYDNEY)
			{
				Commands->Send_Custom_Event(obj, Commands->Find_Object(100657), 710, 1, 0.0f);
			}
		}
	}
};

DECLARE_SCRIPT(M07_In_Nuke_Blast, "")
{
		
	bool already_entered;
	bool star_in_blast;
	bool active;
	
	// 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( star_in_blast, 2 );
		SAVE_VARIABLE( active, 3 );
	}

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

	void Custom( GameObject * obj, int type, int param, GameObject * sender ) 
	{
		if ( type == M07_NUKE_BLAST ) 
		{
			star_in_blast = false;
			
		}
		if ( type == M07_DEACTIVATE_NUKE_BLAST ) 
		{
			active = false;
			
		}
	}


	void Entered (GameObject * obj, GameObject * enterer)
	{
		if(!active)
		{
			return;
		}
		// Send to enterer to let script know in blast zone
		Commands->Send_Custom_Event (obj, enterer, M07_NUKE_BLAST, 1, 0.0f);
		if(!star_in_blast && enterer == STAR)
		{
			star_in_blast = true;

			// Send custom to in blast script to let it know player is out of blast
			Commands->Send_Custom_Event (obj, Commands->Find_Object(100666), M07_NUKE_BLAST, 1, 0.0f);

			// Warning - Your are within the Nuclear Strike blast radius. Evacuate immediately.\n
			const char *conv_name = ("M07_CON013");
			int conv_id = Commands->Create_Conversation (conv_name, 100.0f, 200.0f, false);
			Commands->Join_Conversation(NULL, conv_id, false, true);
			Commands->Start_Conversation (conv_id, 10);
		}

	}
};

DECLARE_SCRIPT(M07_Out_Nuke_Blast, "")
{
		
	bool already_entered;
	bool star_in_blast;
	bool active;
	
	// 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( star_in_blast, 2 );
		SAVE_VARIABLE( active, 3 );
	}

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

	void Custom( GameObject * obj, int type, int param, GameObject * sender ) 
	{
		if ( type == M07_NUKE_BLAST ) 
		{
			star_in_blast = true;
		}
		if ( type == M07_DEACTIVATE_NUKE_BLAST ) 
		{
			active = false;
			
		}
	}

	void Entered (GameObject * obj, GameObject * enterer)
	{
		if(!active)
		{
			return;
		}
		// Send to enterer to let script know out blast zone
		Commands->Send_Custom_Event (obj, enterer, M07_NUKE_BLAST, 0, 0.0f);
		if(star_in_blast && enterer == STAR)
		{
			star_in_blast = false;

			// Minimum safe distance achieved.\n
			const char *conv_name = ("M07_CON014");
			int conv_id = Commands->Create_Conversation (conv_name, 100.0f, 200.0f, false);
			Commands->Join_Conversation(NULL, conv_id, false, true);
			Commands->Start_Conversation (conv_id, 10);

			// Send custom to in blast script to let it know player is out of blast
			Commands->Send_Custom_Event (obj, Commands->Find_Object(100665), M07_NUKE_BLAST, 1, 0.0f);
		}
		
	}
};

DECLARE_SCRIPT(M07_Nod_Gun_Emplacement, "")
{
	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->Set_Player_Type(obj, SCRIPT_PLAYERTYPE_NOD );
		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, INNATE_PRIORITY_ENEMY_SEEN, 1 );
			params.Set_Attack (enemy, 250.0f, 0.0f, 1);
			params.AttackCheckBlocked = false;
			Commands->Action_Attack( obj, params );
			
			Commands->Start_Timer(obj, this, 6.0f, ATTACK_OVER);
		}
	}

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

		if(!attacking)
		{
			attacking = true;
			params.Set_Basic( this, INNATE_PRIORITY_ENEMY_SEEN, 1 );
			params.Set_Attack (damager, 250.0f, 0.0f, 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;
		}
	}

	void Killed (GameObject * obj, GameObject * killer)
	{
		// Custom to evac site controller to count when four vehicles in area destroyed
		Commands->Send_Custom_Event (obj, Commands->Find_Object(100664), M07_EVAC_SITE_VEHICLE_KILLED, 1, 0.0f);
		Commands->Debug_Message("Evac Site Vehicle Killed = %d \n", Commands->Get_ID(obj));
	}
	
};

DECLARE_SCRIPT(M07_Evac_Site_Controller, "")  // 100664
{
	int m07_evac_site_vehicle_killed;

	enum{WHERE_EVAC};

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

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

	void Custom(GameObject * obj, int type, int param, GameObject * sender)
	{
		if (type == M07_EVAC_SITE_VEHICLE_KILLED)
		{
			
			m07_evac_site_vehicle_killed++;
			Commands->Debug_Message("Evac Site Vehicle Killed = %d \n", m07_evac_site_vehicle_killed);
			if(m07_evac_site_vehicle_killed == 4)
			{
				Commands->Debug_Message("Evac Site is clear.  Play Locke, where evac conversation");
				Commands->Start_Timer (obj, this, 4.0f, WHERE_EVAC);
			}
		}
	}

	void Timer_Expired(GameObject * obj, int timer_id )
	{
		
		if(timer_id == WHERE_EVAC)
		{
			// Locke, what's my evac status?\n
			const char *conv_name = ("M07_CON002");
			int conv_id = Commands->Create_Conversation (conv_name, INNATE_PRIORITY_ENEMY_SEEN + 5, 2000.0f, false);
			Commands->Join_Conversation(STAR, conv_id, false, true);
			Commands->Join_Conversation(NULL, conv_id, false, true);
			Commands->Join_Conversation(GUNNER, conv_id, false, true);
			Commands->Join_Conversation(HOTWIRE, conv_id, false, true);
			Commands->Join_Conversation(NULL, conv_id, false, true);
			Commands->Start_Conversation (conv_id, 300702);
			Commands->Monitor_Conversation (obj, conv_id);
		}
		
	}

	void Action_Complete(GameObject * obj, int action_id, ActionCompleteReason reason)
	{
		if (action_id == 300702 && (reason == ACTION_COMPLETE_CONVERSATION_ENDED || reason == ACTION_COMPLETE_CONVERSATION_INTERRUPTED))
		{
			// Activate Hotwire to SAM sites primary objective
			Commands->Send_Custom_Event(obj, Commands->Find_Object(100657), 702, 3, 0.0f);

			// Customs to position team for Primary MO 702
			// Hotwire
			Commands->Send_Custom_Event(obj, HOTWIRE, M07_CAPTURE_SAM, 1, 0.0f);
			// Patch
			Commands->Send_Custom_Event(obj, PATCH, M07_CAPTURE_SAM, 1, 0.0f);
			// Gunner
			Commands->Send_Custom_Event(obj, GUNNER, M07_CAPTURE_SAM, 1, 0.0f);
			// Deadeye
			Commands->Send_Custom_Event(obj, DEADEYE, M07_CAPTURE_SAM, 1, 0.0f);
			// Sydney
			Commands->Send_Custom_Event(obj, SYDNEY, M07_CAPTURE_SAM, 1, 0.0f);
		}
	}
};

DECLARE_SCRIPT(M07_Evac_Site_APC, "")  
{	
	void Killed (GameObject * obj, GameObject * killer)
	{
		// Custom to evac site controller to count when four vehicles in area destroyed
		Commands->Send_Custom_Event (obj, Commands->Find_Object(100664), M07_EVAC_SITE_VEHICLE_KILLED, 1);
		Commands->Debug_Message("Evac Site Vehicle Killed = %d \n", Commands->Get_ID(obj));
	}

};


DECLARE_SCRIPT(M07_Evac_Site_APC_Soldier, "APC_ID=0:int")
{

	int apc_id;

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

	void Created (GameObject * obj)
	{
		ActionParamsStruct params;

		apc_id = Get_Int_Parameter("APC_ID");	

		params.Set_Basic( this, INNATE_PRIORITY_ENEMY_SEEN - 5, 1 );
		params.Set_Movement( STAR, RUN, 20.0f );
		Commands->Action_Goto (obj, params);
	}

	void Killed (GameObject * obj, GameObject * killer)
	{
		if(Commands->Find_Object(apc_id))
		{
			Commands->Send_Custom_Event (obj, Commands->Find_Object(apc_id), M07_REINFORCEMENT_KILLED, apc_id, 0.0f);
		}
		
	}
};

DECLARE_SCRIPT(M07_Evac_Site_Soldier, "APC_ID=0:int")
{

	int apc_id;

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

	void Created (GameObject * obj)
	{
		apc_id = Get_Int_Parameter("APC_ID");	

		Commands->Set_Innate_Is_Stationary(obj, true);
	}

	void Killed (GameObject * obj, GameObject * killer)
	{
		if(Commands->Find_Object(apc_id))
		{
			Commands->Send_Custom_Event (obj, Commands->Find_Object(apc_id), M07_REINFORCEMENT_KILLED, apc_id, 0.0f);
		}
		
	}
};

DECLARE_SCRIPT(M07_Activate_Hotwire, "")
{
	bool already_entered;
	
	enum{HOTWIRE_CAPTURE_SAMS};

	// 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(enterer == HOTWIRE && !already_entered)
		{
			already_entered = true;
			Commands->Enable_Spawner(100715, true);

			// Keep those Nod forces off my back, Havoc.  I'll crack these SAM's in no time.\n
			const char *conv_name = ("M07_CON016");
			int conv_id = Commands->Create_Conversation (conv_name, 100.0f, 200.0f, false);
			Commands->Join_Conversation(HOTWIRE, conv_id, true, true);
			Commands->Start_Conversation (conv_id, HOTWIRE_CAPTURE_SAMS);
			Commands->Monitor_Conversation(obj, conv_id);
		}

	}

	void Action_Complete(GameObject * obj, int action_id, ActionCompleteReason reason)
	{
		if (action_id == HOTWIRE_CAPTURE_SAMS && reason == ACTION_COMPLETE_CONVERSATION_ENDED)
		{
			Commands->Send_Custom_Event (obj, HOTWIRE, M07_HOTWIRE_CAPTURE_SAMS, 1, 0.0f);
		}
	}
};

DECLARE_SCRIPT(M07_Fancy_Inn_Sam, "")
{
	
	// 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 Custom (GameObject * obj, int type, int param, GameObject * sender)
	{
		ActionParamsStruct params;

		if(type == M07_CHANGE_SAM_TEAM)
		{
			Commands->Set_Player_Type(obj, SCRIPT_PLAYERTYPE_GDI );
			Commands->Send_Custom_Event(obj, Commands->Find_Object(100685), M07_SAM_CONVERTED, 1, 0.0f);
		}

	}

	void Killed(GameObject * obj, GameObject * killer)
	{
		Commands->Send_Custom_Event(obj, Commands->Find_Object(100685), M07_SAM_KILLED, 1, 0.0f);
	}
};

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

	void Created (GameObject * obj)
	{
		health = Commands->Get_Max_Health(obj);
	}

	void Custom (GameObject * obj, int type, int param, GameObject * sender)
	{
		ActionParamsStruct params;

		if(type == M07_CHANGE_SAM_TEAM)
		{
			Commands->Set_Player_Type(obj, SCRIPT_PLAYERTYPE_GDI );
		}

	}

	void Damaged( GameObject * obj, GameObject * damager, float amount ) 
	{
		if(health > (.2 * Commands->Get_Max_Health(obj)))
		{
			float damage = health - Commands->Get_Health(obj);
			damage *= 0.5f;
			health -= damage;
			Commands->Set_Health(obj, health);
		}
	}

	void Killed(GameObject * obj, GameObject * killer)
	{
		Commands->Apply_Damage( Commands->Find_Object(100680), 10000.0f, "DEATH");
		
	}
};

DECLARE_SCRIPT(M07_SAM_Truck_100679, "")
{
	float health;

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

	void Created (GameObject * obj)
	{
		health = Commands->Get_Max_Health(obj);
	}

	void Custom (GameObject * obj, int type, int param, GameObject * sender)
	{
		ActionParamsStruct params;

		if(type == M07_CHANGE_SAM_TEAM)
		{
			Commands->Set_Player_Type(obj, SCRIPT_PLAYERTYPE_GDI );
		}

	}

	void Damaged( GameObject * obj, GameObject * damager, float amount ) 
	{
		if(health > (.2 * Commands->Get_Max_Health(obj)))
		{
			float damage = health - Commands->Get_Health(obj);
			damage *= 0.5f;
			health -= damage;
			Commands->Set_Health(obj, health);
		}
	}

	void Killed(GameObject * obj, GameObject * killer)
	{
		Commands->Apply_Damage( Commands->Find_Object(100679), 10000.0f, "DEATH");
	
	}
};

DECLARE_SCRIPT(M07_Fancy_Inn_Controller, "")
{
	int m07_sam_converted;
	int m07_sam_killed;

	enum{CONTROL_SAMS, DESTROY_SYDNEY, DROP_DEAD6_INN};

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

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

	void Custom (GameObject * obj, int type, int param, GameObject * sender)
	{
		if(type == M07_SAM_CONVERTED)
		{
			m07_sam_converted++;
			if(m07_sam_converted == 1)
			{
				Commands->Send_Custom_Event(obj, Commands->Find_Object(100657), 702, 1, 0.0f);
				Commands->Enable_Spawner(100715, false);
				Commands->Send_Custom_Event(obj, Commands->Find_Object(104496), M07_EVAC_INN, 1, 0.0f);
				Commands->Start_Timer(obj, this, 3.0f, CONTROL_SAMS);

				// Spawn DEAD6 and Sydney to evacuate
				Commands->Enable_Spawner(103833, true);
				Commands->Enable_Spawner(103834, true);
				Commands->Enable_Spawner(103835, true);
				Commands->Enable_Spawner(103836, true);

				// Destroy the initial group of people
				Commands->Destroy_Object(Commands->Find_Object(100659));
				Commands->Destroy_Object(Commands->Find_Object(100660));
				Commands->Destroy_Object(Commands->Find_Object(100661));
				Commands->Destroy_Object(Commands->Find_Object(100662));
			
				// Grant health increase medal
				Commands->Create_Object ( "POW_Medal_Health", Vector3(-45.888f, -73.569f, 4.222f));
				// Grant armor increase medal
				Commands->Create_Object ( "POW_Medal_Armor", Vector3(-43.445f, -73.384f, 4.222f));
			}
		}
		if(type == M07_SAM_KILLED)
		{
			m07_sam_killed++;
			if(m07_sam_killed == 2)
			{
				// SAMs Killed
				Commands->Set_HUD_Help_Text ( IDS_M07DSGN_DSGN0090I1DSGN_TXT, TEXT_COLOR_OBJECTIVE_PRIMARY );
				// Objective failed if both SAMs destroyed
				Commands->Send_Custom_Event(obj, Commands->Find_Object(100657), 702, 2, 1.0f);
			}
		}

	}

	
};

DECLARE_SCRIPT(M07_Inn_Apache, "")
{
	bool attacking;

	enum{WAYPATH, INN_PATROL, 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)
	{
		ActionParamsStruct params;

		attacking = false;
		Commands->Disable_Physical_Collisions(obj);

		params.Set_Basic( this, INNATE_PRIORITY_ENEMY_SEEN + 5, WAYPATH );
		params.Set_Movement( Vector3(0,0,0), RUN, 1.5f );
		params.WaypathID = 100707;
		params.MovePathfind = false;
		Commands->Action_Goto( obj, params );
	}

	void Action_Complete(GameObject * obj, int action_id, ActionCompleteReason reason)
	{
		ActionParamsStruct params;

		if (action_id == WAYPATH && reason == ACTION_COMPLETE_NORMAL)
		{
			Commands->Enable_Enemy_Seen(obj, true);

			params.Set_Basic( this, INNATE_PRIORITY_ENEMY_SEEN + 5, INN_PATROL );
			params.Set_Movement( Vector3(0,0,0), RUN, 1.5f );
			params.WaypathID = 100687;
			params.MovePathfind = false;
			Commands->Action_Attack( obj, params );
		}
	}

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

		if(!attacking)
		{
			attacking = true;

			params.Set_Basic( this, INNATE_PRIORITY_ENEMY_SEEN + 5, INN_PATROL );
			params.Set_Movement( Vector3(0,0,0), RUN, 1.5f );
			params.Set_Attack (enemy, 250.0f, 0.0f, 1);
			params.WaypathID = 100687;
			params.MovePathfind = false;
			Commands->Modify_Action (obj, INN_PATROL, 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(M07_Activate_Objective_704, "")
{
		
	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;
			
			// Attention GDI, this is Resistance Radio. Nod's aerial reinforcements are coordinated from mobile radar stations in the Town Square.  We need those radar dishes destroyed.\n
			const char *conv_name = ("M07_CON018");
			int conv_id = Commands->Create_Conversation (conv_name, 100.0f, 200.0f, false);
			Commands->Join_Conversation(NULL, conv_id, false, true);
			Commands->Join_Conversation(STAR, conv_id, false, true);
			Commands->Start_Conversation (conv_id, 300704);
			Commands->Monitor_Conversation (obj, conv_id);

			// Engineers in Town Square
			Commands->Enable_Spawner(100726, true);
			Commands->Enable_Spawner(100727, true);

			Commands->Send_Custom_Event(obj, Commands->Find_Object(100746), M07_TOWNSQUARE_CHINOOK, 1, 0.0f);
		}

	}

	void Action_Complete(GameObject * obj, int action_id, ActionCompleteReason reason)
	{
		if (action_id == 300704 && (reason == ACTION_COMPLETE_CONVERSATION_ENDED || reason == ACTION_COMPLETE_CONVERSATION_INTERRUPTED))
		{
			Commands->Send_Custom_Event(obj, Commands->Find_Object(100657), 704, 3, 0.0f);
		}
	}
};

DECLARE_SCRIPT(M07_Activate_Objective_705, "")
{
		
	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;
			
			// This is Resistance Radio, I have reports of captured resistance fighters west of your position.  Can anyone assist?\n
			const char *conv_name = ("M07_CON019");
			int conv_id = Commands->Create_Conversation (conv_name, 100.0f, 200.0f, false);
			Commands->Join_Conversation(NULL, conv_id, false, true);
			Commands->Join_Conversation(STAR, conv_id, false, true);
			Commands->Start_Conversation (conv_id, 300705);
			Commands->Monitor_Conversation (obj, conv_id);

			
		}

	}

	void Action_Complete(GameObject * obj, int action_id, ActionCompleteReason reason)
	{
		if (action_id == 300705 && (reason == ACTION_COMPLETE_CONVERSATION_ENDED || reason == ACTION_COMPLETE_CONVERSATION_INTERRUPTED))
		{
			Commands->Send_Custom_Event(obj, Commands->Find_Object(100657), 705, 3, 0.0f);
		}
	}
};

DECLARE_SCRIPT(M07_Activate_Objective_706, "")
{
		
	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;
			
			// Havoc, we've spotted an SSM napalm stockpile to your west.\n
			const char *conv_name = ("M07_CON020");
			int conv_id = Commands->Create_Conversation (conv_name, 100.0f, 200.0f, false);
			Commands->Join_Conversation(NULL, conv_id, false, true);
			Commands->Join_Conversation(STAR, conv_id, false, true);
			Commands->Start_Conversation (conv_id, 300706);
			Commands->Monitor_Conversation (obj, conv_id);

			
		}

	}

	void Action_Complete(GameObject * obj, int action_id, ActionCompleteReason reason)
	{
		if (action_id == 300706 && (reason == ACTION_COMPLETE_CONVERSATION_ENDED || reason == ACTION_COMPLETE_CONVERSATION_INTERRUPTED))
		{
			Commands->Send_Custom_Event(obj, Commands->Find_Object(100657), 706, 3, 0.0f);
		}
	}
};

DECLARE_SCRIPT(M07_Activate_Objective_707, "")
{
		
	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;
			
			// Those must be the SSMs. Time to get to work.\n
			const char *conv_name = ("M07_CON021");
			int conv_id = Commands->Create_Conversation (conv_name, 100.0f, 200.0f, false);
			Commands->Join_Conversation(STAR, conv_id, false, true);
			Commands->Start_Conversation (conv_id, 300707);
			Commands->Monitor_Conversation (obj, conv_id);

			
		}

	}

	void Action_Complete(GameObject * obj, int action_id, ActionCompleteReason reason)
	{
		if (action_id == 300707 && (reason == ACTION_COMPLETE_CONVERSATION_ENDED || reason == ACTION_COMPLETE_CONVERSATION_INTERRUPTED))
		{
			Commands->Send_Custom_Event(obj, Commands->Find_Object(100657), 707, 3, 0.0f);
		}
	}
};

DECLARE_SCRIPT(M07_Activate_Objective_708, "")
{
		
	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;
			
			// \\Warning - Nod Obelisk detected.\n
			const char *conv_name = ("M07_CON022");
			int conv_id = Commands->Create_Conversation (conv_name, 100.0f, 200.0f, false);
			Commands->Join_Conversation(NULL, conv_id, false, true);
			Commands->Join_Conversation(STAR, conv_id, false, true);
			Commands->Start_Conversation (conv_id, 300708);
			Commands->Monitor_Conversation (obj, conv_id);

			
		}

	}

	void Action_Complete(GameObject * obj, int action_id, ActionCompleteReason reason)
	{
		if (action_id == 300708 && (reason == ACTION_COMPLETE_CONVERSATION_ENDED || reason == ACTION_COMPLETE_CONVERSATION_INTERRUPTED))
		{
			Commands->Send_Custom_Event(obj, Commands->Find_Object(100657), 708, 3, 0.0f);
		}
	}
};

DECLARE_SCRIPT(M07_Activate_Objective_710, "")
{
		
	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 = true;
			
			Commands->Send_Custom_Event(obj, Commands->Find_Object(100657), 710, 3, 0.0f);
		}

	}
};

DECLARE_SCRIPT(M07_SAM_Site_Logic, "")
{
	bool target_acquired;
	int current, ignore_ids[10];

	REGISTER_VARIABLES()
	{
		SAVE_VARIABLE(target_acquired, 1);
		SAVE_VARIABLE(ignore_ids, 2);
		SAVE_VARIABLE(current, 3);
	}
	
	void Created(GameObject * obj)
	{
		Commands->Enable_Enemy_Seen(obj, true);
		target_acquired = false;
		current = 0;
		for (int x = 0; x < 10; x++)
		{
			ignore_ids[x] = 0;
		}
		Commands->Start_Timer(obj, this, Commands->Get_Random(2, 3), 1);
	}
	
	bool Is_Ignore_Target(int id)
	{
		bool retval = false;
		for (int x = 0; x < current; x++)
		{
			if (ignore_ids[x] == id)
			{
				retval = true;
				break;
			}
		}
		return retval;
	}
	
	void Enemy_Seen(GameObject * obj, GameObject * enemy)
	{
		if (target_acquired)
		{
			return;
		}

		if (Commands->Is_A_Star(enemy) || Is_Ignore_Target(Commands->Get_ID(enemy)))
		{
			return;
		}

		Vector3 target_pos = Commands->Get_Position(enemy);
		Vector3 my_pos = Commands->Get_Position(obj);
		if (target_pos.Z - my_pos.Z >= 5.0f)
		{
			target_acquired = true;
			ActionParamsStruct params;
			params.Set_Basic(this, 90, 0);
			params.Set_Attack(enemy, 500.0f, 0.0f, true);
			params.AttackCheckBlocked = false;
			Commands->Action_Attack(obj, params);
			Commands->Start_Timer(obj, this, 2.0f, 0);
		}
	}

	void Timer_Expired(GameObject * obj, int timer_id)
	{
		if (timer_id == 0)
		{
			target_acquired = false;
			Commands->Action_Reset(obj, 95);
		}
		if (timer_id == 1)
		{
			Vector3 my_target = Commands->Get_Position(obj);
			my_target.X += Commands->Get_Random( -10.0f , 10.0f);
			my_target.Y += Commands->Get_Random( -10.0f , 10.0f);
			my_target.Z += Commands->Get_Random( 2.0f, 6.0f);

			ActionParamsStruct params;
			params.Set_Basic( this, 80, 20 );
			params.Set_Attack( my_target, 0, 0, true );
			params.AttackCheckBlocked = true;
			Commands->Action_Attack (obj, params);
			Commands->Start_Timer(obj, this, Commands->Get_Random(2, 3), 1);
		}
	}

	void Killed(GameObject * obj, GameObject * killer)
	{
//		Vector3 my_position = Commands->Get_Position ( obj );
//		float my_facing = Commands->Get_Facing ( obj );
	//	GameObject * destroyedSam = Commands->Create_Object ( "M01_Destroyed_SAM", my_position);
	//	Commands->Set_Facing ( destroyedSam, my_facing );
	//	Commands->Attach_Script(destroyedSam, "M07_Destroyed_SAM_Site", "");
	}

	void Custom(GameObject * obj, int type, int param, GameObject * sender)
	{
		if (type == M00_CUSTOM_SAM_SITE_IGNORE && current < 10)
		{
			ignore_ids[current++] = param;
		}
	}
};

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

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

DECLARE_SCRIPT(M07_Mobile_Radar, "")
{
	
	// 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)
	{
		Commands->Set_Animation(obj, "v_nod_radar.v_nod_radar", true);
	}

	void Damaged(GameObject * obj, GameObject * damager, float amount)
	{
		if(Commands->Get_Health(obj) < Commands->Get_Max_Health(obj))
		{
			Commands->Create_Logical_Sound(obj, M07_RADAR_DAMAGED, Commands->Get_Position(obj), 10.0f);
		}
		else
		{
			Commands->Create_Logical_Sound(obj, M07_RADAR_FIXED, Commands->Get_Position(obj), 10.0f);
		}
			
	}

	void Killed(GameObject * obj, GameObject * killer)
	{
		Commands->Create_Explosion("Ground Explosions Twiddler", Commands->Get_Position(obj)); 
		Commands->Send_Custom_Event(obj, Commands->Find_Object(100746), M07_RADAR_KILLED, 0, 0.0f);
	}
};

DECLARE_SCRIPT(M07_Radar_Engineer, "Radar_ID=0:int")
{
	
	enum{GO_RADAR};

	// 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)
	{
		Commands->Enable_Enemy_Seen(obj, false);
		
		int radar_id = Get_Int_Parameter("Radar_ID");

		ActionParamsStruct params;
		params.Set_Basic(this, INNATE_PRIORITY_ENEMY_SEEN + 5, GO_RADAR);
		params.Set_Movement(Commands->Find_Object(radar_id), RUN, 1.0f);
		Commands->Action_Goto(obj, params);
	}

	void Sound_Heard(GameObject * obj, const CombatSound &sound)
	{
		ActionParamsStruct params;

		if (sound.Type == M07_RADAR_DAMAGED)
		{
			params.Set_Basic( this, INNATE_PRIORITY_ENEMY_SEEN + 5, 100 );
			params.Set_Attack (sound.Creator, 250.0f, 0.0f, 0);
			params.AttackCheckBlocked = false;
			Commands->Action_Attack( obj, params );
		}
		if (sound.Type == M07_RADAR_FIXED)
		{
			Commands->Action_Reset(obj, INNATE_PRIORITY_ENEMY_SEEN + 5);
		}
	}

	void Action_Complete(GameObject * obj, int action_id, ActionCompleteReason reason)
	{
		if (action_id == GO_RADAR && reason == ACTION_COMPLETE_NORMAL)
		{
			Commands->Set_Innate_Is_Stationary(obj, true);
		}
	}
};

DECLARE_SCRIPT(M07_TownSquare_Unit, "Spawn_ID=0:int, Waypath_ID=0:int")
{
	
	enum{WAYPATH};

	// 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)
	{
		ActionParamsStruct params;

		int waypath_id = Get_Int_Parameter("Waypath_ID");

		if(waypath_id == 0)
		{
			Commands->Set_Innate_Is_Stationary(obj, true);
		}
		else
		{
			params.Set_Basic( this, INNATE_PRIORITY_ENEMY_SEEN + 5, WAYPATH );
			params.Set_Movement( Vector3(0,0,0), RUN, 0.5f );
			params.WaypathID = waypath_id;
			Commands->Action_Goto( obj, params );
		}
	}

	void Action_Complete(GameObject * obj, int action_id, ActionCompleteReason reason)
	{
		if (action_id == WAYPATH && reason == ACTION_COMPLETE_NORMAL)
		{
			Commands->Set_Innate_Is_Stationary(obj, true);
		}
	}

	void Killed(GameObject * obj, GameObject * killer)
	{
		int spawn_id = Get_Int_Parameter("Spawn_ID");
		Commands->Enable_Spawner(spawn_id, true);
	}
};

DECLARE_SCRIPT(M07_TownSquare_Controller, "")  // 
{
	bool chinooks_active;
	int m07_radar_killed;

	enum{CHINOOK1, CHINOOK2};

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

	void Created (GameObject * obj)
	{
		chinooks_active = false;
		m07_radar_killed = 0;
	}

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

				GameObject * chinook_obj1 = Commands->Create_Object ( "Invisible_Object", Vector3(-316.374f, -149.140f, 5.023f));
				Commands->Set_Facing(chinook_obj1, 95.000f);
				Commands->Attach_Script(chinook_obj1, "Test_Cinematic", "M07_XG_EV3_1.txt");

				Commands->Start_Timer(obj, this, 20.0f, CHINOOK1);
				Commands->Start_Timer(obj, this, 10.0f, CHINOOK2);
			}
			if(param == 0)
			{
				chinooks_active = false;
			}


		}
		if (type == M07_RADAR_KILLED)
		{
			m07_radar_killed++;
			if(m07_radar_killed == 2)
			{
				Commands->Send_Custom_Event(obj, Commands->Find_Object(100657), 704, 1, 0.0f);
			}

		}
	}

	void Timer_Expired(GameObject * obj, int timer_id)
	{
		if(timer_id == CHINOOK1 && chinooks_active)
		{
			GameObject * chinook_obj1 = Commands->Create_Object ( "Invisible_Object", Vector3(-316.374f, -149.140f, 5.023f));
			Commands->Set_Facing(chinook_obj1, 95.000f);
			Commands->Attach_Script(chinook_obj1, "Test_Cinematic", "M07_XG_EV3_1.txt");

			Commands->Start_Timer(obj, this, 20.0f, CHINOOK1);
		}
		if(timer_id == CHINOOK2 && chinooks_active)
		{
			GameObject * chinook_obj2 = Commands->Create_Object ( "Invisible_Object", Vector3(-343.696f, -145.495f, 5.136f));
			Commands->Set_Facing(chinook_obj2, -55.000f);
			Commands->Attach_Script(chinook_obj2, "Test_Cinematic", "M07_XG_EV3_1.txt");

			Commands->Start_Timer(obj, this, 20.0f, CHINOOK2);
		}
	}
};

DECLARE_SCRIPT(M07_Deactivate_TownSquare_Chinook, "")
{
		
	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(100746), M07_TOWNSQUARE_CHINOOK, 0, 0.0f);
		}

	}

};

DECLARE_SCRIPT(M07_TownSquare_Gun_Emp, "")
{
	
	// 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 Killed(GameObject * obj, GameObject * killer)
	{
		Commands->Enable_Spawner(100748, true);
	}
};

DECLARE_SCRIPT(M07_Prisoner_Gate, "")
{

	// 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)
	{
		Commands->Set_Animation_Frame(obj, "cht_jail.cht_jail", 0);
	}

	void Killed(GameObject * obj, GameObject * killer)
	{
		Commands->Send_Custom_Event(obj, Commands->Find_Object(115842), M07_FREE_CIV, 1, 0.0f);
		Commands->Send_Custom_Event(obj, Commands->Find_Object(100751), M07_FREE_CIV, 1, 0.0f);
	}

};

DECLARE_SCRIPT(M07_Captured_Civ_Resist, "")
{

	bool poked;
	bool freed;

	

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

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

	void Poked(GameObject * obj, GameObject * poker)
	{
		ActionParamsStruct params;

		if ((Commands->Is_A_Star(poker)) && (!poked) && (!freed))
		{
			Commands->Create_Logical_Sound(obj, M07_FREE_CIV_RESIST, Commands->Get_Position(obj), 40.0f);
		}
	}

	void Sound_Heard(GameObject * obj, const CombatSound &sound)
	{
		if (sound.Type == M07_FREE_CIV_RESIST)
		{
			freed = true;
			Commands->Enable_HUD_Pokable_Indicator( obj, false );
			Commands->Set_Innate_Is_Stationary(obj, false);
			Commands->Give_PowerUp(obj, "POW_Chaingun_AI");
			Commands->Select_Weapon(obj, "Weapon_Chaingun_Ai" );
			Commands->Set_Player_Type(obj, SCRIPT_PLAYERTYPE_GDI );
			Commands->Send_Custom_Event(obj, Commands->Find_Object(100657), 705, 1, 0.0f);

			ActionParamsStruct params;
			params.Set_Basic(this, INNATE_PRIORITY_ENEMY_SEEN + 5, 10);
			params.Set_Movement(Commands->Find_Object(115823), RUN, 1.0f);
			Commands->Action_Goto(obj, params);
		}
	}

	void Killed(GameObject * obj, GameObject * killer)
	{
		// Spawn reinforcment civ resist
		Commands->Send_Custom_Event(obj, Commands->Find_Object(101056), M07_SPAWN_TRIANGLE_CIV, 1, 0.0f);
	}

};

DECLARE_SCRIPT(M07_Activate_Present, "")
{
		
	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;

			// Havoc, got a present for ya.\n
			const char *conv_name = ("M07_CON023");
			int conv_id = Commands->Create_Conversation (conv_name, 100.0f, 200.0f, false);
			Commands->Join_Conversation(NULL, conv_id, false, true);
			Commands->Join_Conversation(STAR, conv_id, false, true);
			Commands->Start_Conversation (conv_id, 300700);
						
			GameObject * chinook_obj1 = Commands->Create_Object ( "Invisible_Object", Vector3(-446.944f, -25.105f, 14.134f));
			Commands->Set_Facing(chinook_obj1, 155.000f);
			Commands->Attach_Script(chinook_obj1, "Test_Cinematic", "M07_XG_VehicleDrop1.txt");
		}

	}
};

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

	}

	void Created (GameObject * obj)
	{
		Commands->Set_Player_Type(obj, SCRIPT_PLAYERTYPE_GDI );
		health = Commands->Get_Max_Health(obj);
		int vehicle_id = Commands->Get_ID(obj);
		// Let enemy tank drop controller know player vehicle id
		Commands->Send_Custom_Event(obj, Commands->Find_Object(101131), M07_PLAYER_VEHICLE_ID, vehicle_id);
	}

	void Damaged(GameObject * obj, GameObject * damager, float amount)
	{
		if(health > (.2 * Commands->Get_Max_Health(obj)))
		{
			float damage = health - Commands->Get_Health(obj);
			damage *= 0.5f;
			health -= damage;
			Commands->Set_Health(obj, health);
		}

	}

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

DECLARE_SCRIPT(M07_Vehicle_Drop_Controller, "")
{
		
	int vehicle_drop[8];
	int drop_zone;
	int m07_player_vehicle_killed;

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

	void Created (GameObject * obj)
	{
		
		vehicle_drop[0] = 100755;
		vehicle_drop[1] = 100758;
		vehicle_drop[2] = 100759;
		vehicle_drop[3] = 100760;
		vehicle_drop[4] = 100761;
		vehicle_drop[5] = 100762;
		vehicle_drop[6] = 100768;
		vehicle_drop[7] = 100769;

		drop_zone = 0;
		m07_player_vehicle_killed = 0;
	}

	void Custom(GameObject * obj, int type, int param, GameObject * sender)
	{
		if (type == M07_VEHICLE_DROP_ZONE)
		{
			
			if(param == 10 && m07_player_vehicle_killed < 7)
			{
				// Havoc!  Taking missile fire over the park.  Launcher is unseen.  Repeat, launcher is unseen.\n
				const char *conv_name = ("M07_CON024");
				int conv_id = Commands->Create_Conversation (conv_name, 100.0f, 200.0f, false);
				Commands->Join_Conversation(NULL, conv_id, false, true);
				Commands->Join_Conversation(STAR, conv_id, false, true);
				Commands->Start_Conversation (conv_id, 300700);
			}
			else
			{
				drop_zone = param;
			}

		}
		if (type == M07_PLAYER_VEHICLE_KILLED)
		{
			m07_player_vehicle_killed++;
			if(m07_player_vehicle_killed < 4)
			{
				if(m07_player_vehicle_killed < 3)
				{
					// Got you another ride, inbound now!\n
					const char *conv_name = ("M07_CON025");
					int conv_id = Commands->Create_Conversation (conv_name, 100.0f, 200.0f, false);
					Commands->Join_Conversation(NULL, conv_id, false, true);
					Commands->Start_Conversation (conv_id, 300700);

					GameObject * drop_loc = Commands->Find_Object(vehicle_drop[drop_zone]);
					float drop_facing = Commands->Get_Facing(drop_loc);
				
					GameObject * chinook_obj1 = Commands->Create_Object ( "Invisible_Object", Commands->Get_Position(drop_loc));
					Commands->Set_Facing(chinook_obj1, drop_facing);
					Commands->Attach_Script(chinook_obj1, "Test_Cinematic", "M07_XG_VehicleDrop1.txt");
				}
				else
				{
					// Complements of the local resistance.\n
					const char *conv_name = ("M07_CON026");
					int conv_id = Commands->Create_Conversation (conv_name, 100.0f, 200.0f, false);
					Commands->Join_Conversation(NULL, conv_id, false, true);
					Commands->Join_Conversation(STAR, conv_id, false, true);
					Commands->Start_Conversation (conv_id, 300700);

					GameObject * drop_loc = Commands->Find_Object(vehicle_drop[drop_zone]);
					float drop_facing = Commands->Get_Facing(drop_loc);
				
					GameObject * chinook_obj1 = Commands->Create_Object ( "Invisible_Object", Commands->Get_Position(drop_loc));
					Commands->Set_Facing(chinook_obj1, drop_facing);
					Commands->Attach_Script(chinook_obj1, "Test_Cinematic", "M07_XG_VehicleDrop4.txt");
				}

				
			}
			else
			{
				// Last one, Captain.  Recon show Nod's pulling back to the park.\n
				const char *conv_name = ("M07_CON027");
				int conv_id = Commands->Create_Conversation (conv_name, 100.0f, 200.0f, false);
				Commands->Join_Conversation(NULL, conv_id, false, true);
				Commands->Join_Conversation(STAR, conv_id, false, true);
				Commands->Start_Conversation (conv_id, 300700);

				GameObject * drop_loc = Commands->Find_Object(vehicle_drop[drop_zone]);
				float drop_facing = Commands->Get_Facing(drop_loc);
			
				GameObject * chinook_obj1 = Commands->Create_Object ( "Invisible_Object", Commands->Get_Position(drop_loc));
				Commands->Set_Facing(chinook_obj1, drop_facing);
				Commands->Attach_Script(chinook_obj1, "Test_Cinematic", "M07_XG_VehicleDrop3.txt");
			}
			

		}
	}

};

DECLARE_SCRIPT(M07_Vehicle_Drop_Zone, "Zone_ID=0:int")
{

	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)
	{
		int zone_id = Get_Int_Parameter("Zone_ID");

		if(Commands->Is_A_Star(enterer) && !already_entered)
		{
			if(zone_id == 10)
			{
				already_entered = true;
			}

			Commands->Send_Custom_Event(obj, Commands->Find_Object(100757), M07_VEHICLE_DROP_ZONE, zone_id);
		}

	}
};

DECLARE_SCRIPT(M07_Biohazard_Barrel, "")
{

	enum{BOOM};

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

	void Created (GameObject * obj)
	{
		Commands->Set_Animation_Frame(obj, "o_barrl_bio.o_barrl_bio", 0);
	}

	void Killed(GameObject * obj, GameObject * killer)
	{
		Commands->Create_Explosion("Ground Explosions Twiddler", Commands->Get_Position(obj));
		
		Commands->Send_Custom_Event(obj, Commands->Find_Object(100781), M07_EXPLODE_BARRELS, 1);

	}
	
};

DECLARE_SCRIPT(M07_Stockpile_Object, "")
{

	bool damaged;

	enum{BOOM, STILL_DAMAGED};

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

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

	void Sound_Heard(GameObject * obj, const CombatSound &sound)
	{
		if (sound.Type == M07_EXPLODE_BARRELS)
		{
			Commands->Apply_Damage( obj, 100000.0f, "STEEL");
		}
	}

	void Timer_Expired(GameObject * obj, int timer_id)
	{
		if(timer_id == STILL_DAMAGED && damaged)
		{
			Commands->Create_Logical_Sound(obj, M07_ENGINEER_DAMAGED, Commands->Get_Position(obj), 40.0f);
			Commands->Start_Timer(obj, this, 8.0f, STILL_DAMAGED);
			damaged = true;
		}

	}

	void Damaged(GameObject * obj, GameObject * damager, float amount)
	{
		if(Commands->Get_Health(obj) < Commands->Get_Max_Health(obj))
		{
			Commands->Create_Logical_Sound(obj, M07_ENGINEER_DAMAGED, Commands->Get_Position(obj), 40.0f);
			Commands->Start_Timer(obj, this, 8.0f, STILL_DAMAGED);
			damaged = true;
		}
		else
		{
			damaged = false;
			Commands->Create_Logical_Sound(obj, M07_ENGINEER_FIXED, Commands->Get_Position(obj), 40.0f);
		}
			
	}

};

DECLARE_SCRIPT(M07_Stockpile_Controller, "")
{

	int ssm_crate_killed;

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

	void Created (GameObject * obj)
	{
		Commands->Enable_Spawner(100795, true);
		ssm_crate_killed = 0;
	}

	void Custom(GameObject * obj, int type, int param, GameObject * sender)
	{
		if (type == M07_SSM_CRATE_KILLED)
		{
			ssm_crate_killed++;
			if(ssm_crate_killed == 4)
			{
				Commands->Send_Custom_Event(obj, Commands->Find_Object(100657), 706, 1, 0.0f);
			}
		}
	}

};

DECLARE_SCRIPT(M07_Stockpile_Engineer, "")
{
	
	enum{GO_STOCKPILE};

	// 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)
	{
		Commands->Enable_Enemy_Seen(obj, false);
		
		ActionParamsStruct params;
		params.Set_Basic(this, INNATE_PRIORITY_ENEMY_SEEN + 5, GO_STOCKPILE);
		params.Set_Movement(Commands->Find_Object(100781), RUN, 1.0f);
		Commands->Action_Goto(obj, params);
	}

	void Sound_Heard(GameObject * obj, const CombatSound &sound)
	{
		ActionParamsStruct params;

		if (sound.Type == M07_ENGINEER_DAMAGED)
		{
			params.Set_Basic( this, INNATE_PRIORITY_ENEMY_SEEN + 5, 100 );
			params.Set_Attack (sound.Creator, 250.0f, 0.0f, 0);
			params.AttackCheckBlocked = false;
			Commands->Action_Attack( obj, params );
		}
		if (sound.Type == M07_ENGINEER_FIXED)
		{
			Commands->Action_Reset(obj, INNATE_PRIORITY_ENEMY_SEEN + 5);
		}
	}

	void Action_Complete(GameObject * obj, int action_id, ActionCompleteReason reason)
	{
		if (action_id == GO_STOCKPILE && reason == ACTION_COMPLETE_NORMAL)
		{
			Commands->Set_Innate_Is_Stationary(obj, true);
		}
	}
};

DECLARE_SCRIPT(M07_Park_Controller, "")
{
	int m07_artillery_killed;

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

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

	void Custom(GameObject * obj, int type, int param, GameObject * sender)
	{
		if(type == M07_ARTILLERY_KILLED)
		{
			m07_artillery_killed++;
			if(m07_artillery_killed == 2)
			{
				// Destroy Artillery Piece Objective
				Commands->Send_Custom_Event(obj, Commands->Find_Object(100657), 703, 1, 5.0f);
			}
		}
		
	}

};

DECLARE_SCRIPT(M07_Park_SSM, "")
{

	enum{STILL_DAMAGED};

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

	void Created (GameObject * obj)
	{
		
	}

	void Timer_Expired(GameObject * obj, int timer_id)
	{
		if(timer_id == STILL_DAMAGED)
		{
			if(Commands->Get_Health(obj) < Commands->Get_Max_Health(obj))
			{
				Commands->Create_Logical_Sound(obj, M07_SSM_DAMAGED, Commands->Get_Position(obj), 1000.0f);
				Commands->Start_Timer(obj, this, 10.0f, STILL_DAMAGED);
			}
			else
			{
				Commands->Create_Logical_Sound(obj, M07_SSM_FIXED, Commands->Get_Position(obj), 1000.0f);
			}

			
		}
	}

	void Damaged(GameObject * obj, GameObject * damager, float amount)
	{
		if(Commands->Get_Health(obj) < Commands->Get_Max_Health(obj))
		{
			Commands->Create_Logical_Sound(obj, M07_SSM_DAMAGED, Commands->Get_Position(obj), 1000.0f);
		}
		else
		{
			Commands->Create_Logical_Sound(obj, M07_SSM_FIXED, Commands->Get_Position(obj), 1000.0f);
		}
			
	}

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

DECLARE_SCRIPT(M07_Nod_Obelisk, "")
{
	int obelisk_weapon_id;
	bool converted;

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

	void Created (GameObject * obj)
	{
		obelisk_weapon_id = 0;
		converted = false;
	}

	void Custom(GameObject * obj, int type, int param, GameObject * sender)
	{
		if(type == M07_PLAYERTYPE_CHANGE_OBELISK)
		{
			converted = true;
			Commands->Set_Player_Type(Commands->Find_Object(obelisk_weapon_id), SCRIPT_PLAYERTYPE_GDI );
			
		}
		if(type == M00_OBELISK_WEAPON_ID)
		{
			obelisk_weapon_id = param;
			
		}
		
	}

	void Killed (GameObject * obj, GameObject * killer)
	{
		if(!converted)
		{
			// Custom to Objective_Controller that Obelisk has been destroyed
			Commands->Send_Custom_Event(obj, Commands->Find_Object(100657), 708, 1, 0.0f);
			// Custom to Obelisk Poke to turn it off so that it cannot be converted
			Commands->Send_Custom_Event(obj, Commands->Find_Object(100805), M07_OBELISK_KILLED, 1, 0.0f);
		}
	}
	
};

DECLARE_SCRIPT(M07_Nod_Obelisk_MCT, "")
{
	bool poked;

	// Register variables to be Auto-Saved
	// All variables must have a unique ID, less than 256, that never changes
	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 ((Commands->Is_A_Star(poker)) && (!poked))
		{
			Commands->Enable_HUD_Pokable_Indicator( obj, false );
			Commands->Create_Sound("Computer_Operate_02", Commands->Get_Position(obj), obj);
			poked = true;
			// Change playertype of Nod Obelisk
			Commands->Send_Custom_Event(obj, Commands->Find_Object(168926), M07_PLAYERTYPE_CHANGE_OBELISK, 1, 0.0f);

			Commands->Send_Custom_Event(obj, Commands->Find_Object(100657), 708, 1, 0.0f);
		}
	}

	void Custom(GameObject * obj, int type, int param, GameObject * sender)
	{
		if(type == M07_OBELISK_KILLED)
		{
			Commands->Enable_HUD_Pokable_Indicator( obj, false );
			poked = true;
		}
		
	}

};


DECLARE_SCRIPT(M07_Park_Zone, "Zone=0:int")
{
		
	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)
	{
		
	}

	void Entered (GameObject * obj, GameObject * enterer)
	{
		if ((Commands->Is_A_Star(enterer)))
		{
						
			int activate_zone = Get_Int_Parameter("Zone");
			Commands->Send_Custom_Event(obj, Commands->Find_Object(100801), M07_MOVE_STEALTH_TANK, activate_zone);

		}
	}

};


DECLARE_SCRIPT(M07_Activate_Encounter, "Spawner_ID1=0:int, Spawner_ID2=0:int, Spawner_ID3=0:int, Spawner_ID4=0:int, Spawner_ID5=0:int, Spawner_ID6=0:int")
{
		
	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;
			
			int spawner_id1 = Get_Int_Parameter("Spawner_ID1");
			int spawner_id2 = Get_Int_Parameter("Spawner_ID2");
			int spawner_id3 = Get_Int_Parameter("Spawner_ID3");
			int spawner_id4 = Get_Int_Parameter("Spawner_ID4");
			int spawner_id5 = Get_Int_Parameter("Spawner_ID5");
			int spawner_id6 = Get_Int_Parameter("Spawner_ID6");
			
			if(spawner_id1 != 0)
			{
				Commands->Enable_Spawner(spawner_id1, true);
			}
			if(spawner_id2 != 0)
			{
				Commands->Enable_Spawner(spawner_id2, true);
			}
			if(spawner_id3 != 0)
			{
				Commands->Enable_Spawner(spawner_id3, true);
			}
			if(spawner_id4 != 0)
			{
				Commands->Enable_Spawner(spawner_id4, true);
			}
			if(spawner_id5 != 0)
			{
				Commands->Enable_Spawner(spawner_id5, true);
			}
			if(spawner_id6 != 0)
			{
				Commands->Enable_Spawner(spawner_id6, true);
			}
			

		}
	}

	void Custom(GameObject * obj, int type, int param, GameObject * sender)
	{
		if (type == M07_DEACTIVATE_ENCOUNTER)
		{
			int spawner_id1 = Get_Int_Parameter("Spawner_ID1");
			int spawner_id2 = Get_Int_Parameter("Spawner_ID2");
			int spawner_id3 = Get_Int_Parameter("Spawner_ID3");
			int spawner_id4 = Get_Int_Parameter("Spawner_ID4");
			int spawner_id5 = Get_Int_Parameter("Spawner_ID5");
			int spawner_id6 = Get_Int_Parameter("Spawner_ID6");
			
			if(spawner_id1 != 0)
			{
				Commands->Enable_Spawner(spawner_id1, false);
			}
			if(spawner_id2 != 0)
			{
				Commands->Enable_Spawner(spawner_id2, false);
			}
			if(spawner_id3 != 0)
			{
				Commands->Enable_Spawner(spawner_id3, false);
			}
			if(spawner_id4 != 0)
			{
				Commands->Enable_Spawner(spawner_id4, false);
			}
			if(spawner_id5 != 0)
			{
				Commands->Enable_Spawner(spawner_id5, false);
			}
			if(spawner_id6 != 0)
			{
				Commands->Enable_Spawner(spawner_id6, false);
			}
		}
	}

};

DECLARE_SCRIPT(M07_Deactivate_Encounter, "Activate_Zone=0:int")
{
		
	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;
			
			int activate_zone = Get_Int_Parameter("Activate_Zone");
			Commands->Send_Custom_Event(obj, Commands->Find_Object(activate_zone), M07_DEACTIVATE_ENCOUNTER, 1);

		}
	}

};



DECLARE_SCRIPT(M07_Encounter_Unit, "Waypath_ID=0:int, Priority=0:int, Suicide=0:int, Stationary_at_End=0:int")
{
	int waypath_id;
	int priority;
	bool suicide;
	bool stationary;

	enum{DIE_SURPRISE, GO_STAR, WAYPATH};

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

	void Created (GameObject * obj)
	{
		ActionParamsStruct params;

		waypath_id = Get_Int_Parameter("Waypath_ID");
		priority = Get_Int_Parameter("Priority");
		suicide = (Get_Int_Parameter("Suicide") == 1) ? true : false;
		stationary = (Get_Int_Parameter("Stationary_at_End") == 1) ? true : false;

		if(waypath_id == 0)
		{
			Commands->Set_Innate_Is_Stationary(obj, true);
		}
		else if(waypath_id == 1)
		{
			params.Set_Basic( this, priority, GO_STAR );
			params.Set_Movement( STAR, RUN, 2.0f );
			Commands->Action_Goto (  obj, params );
		}
		else
		{
			params.Set_Basic( this, priority, WAYPATH );
			params.Set_Movement( Vector3(0,0,0), RUN, 1.5f );
			params.WaypathID = waypath_id;
			Commands->Action_Goto( obj, params );
		}
		
		if(suicide)
		{
			Commands->Start_Timer (obj, this, 15.0f, DIE_SURPRISE);
		}
	}

	void Timer_Expired(GameObject* obj, int timer_id)
	{
		
		if(timer_id == DIE_SURPRISE)
		{
			Commands->Apply_Damage( obj, 100000, "STEEL", NULL );
			Vector3 obj_pos = Commands->Get_Position(obj);
			Vector3 shot_pos;
			shot_pos.X = obj_pos.X + 4.0f;
			shot_pos.Y = obj_pos.Y + 4.0f;
			shot_pos.Z = obj_pos.Z + 4.0f;

			Commands->Create_Sound("Sniper_Fire_01", shot_pos, obj);
		}
	}

	void Action_Complete(GameObject * obj, int action_id, ActionCompleteReason reason)
	{
		if (reason != ACTION_COMPLETE_NORMAL) 
		{
			return;
		}
		if (action_id == WAYPATH)
		{
			Commands->Innate_Force_State_Enemy_Seen(obj, STAR);
			if(stationary)
			{
				Commands->Set_Innate_Is_Stationary(obj, true);
			}
		}
	}
};

DECLARE_SCRIPT(M07_V05_Controller, "")
{
	bool encounter;
	int m07_v05_units;
	bool reinforce;

	enum{REINFORCEMENT_CHECK};

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

	void Created (GameObject * obj)
	{
		m07_v05_units = 0;
		
		encounter= true;
		reinforce = true;
	}

	void Custom(GameObject * obj, int type, int param, GameObject * sender)
	{
		if(type == M07_REINFORCEMENT_UNIT_KILLED)
		{
			m07_v05_units--;
			
		}
		if(type == M07_REINFORCEMENT_UNIT_CREATED)
		{
			m07_v05_units++;
		}

		if (type == M07_DEACTIVATE_ENCOUNTER)
		{
			encounter = false;
		}

		if (type == M07_ACTIVATE_ENCOUNTER)
		{
			Commands->Start_Timer(obj, this, 0.0f, REINFORCEMENT_CHECK);
		}

		if (type == M07_V05_OFFICER_KILLED)
		{
			reinforce = false;
		}
		
	}

	void Timer_Expired(GameObject * obj, int timer_id)
	{
		if(timer_id == REINFORCEMENT_CHECK && encounter)
		{
			if(m07_v05_units < 3 && reinforce)
			{
				GameObject * chinook_obj1 = Commands->Create_Object ( "Invisible_Object", Vector3(30.873f, -9.825f, 5.346f));
				Commands->Set_Facing(chinook_obj1, -80.000f);
				Commands->Attach_Script(chinook_obj1, "Test_Cinematic", "X7I_TroopDrop1.txt");
			}
		}

		Commands->Start_Timer(obj, this, 30.0f, REINFORCEMENT_CHECK);
	}

	
};

DECLARE_SCRIPT(M07_V05_Officer, "")
{
	
	enum{REINFORCEMENT_CHECK};

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

	void Created (GameObject * obj)
	{
	
	}

	void Killed(GameObject * obj, GameObject * killer)
	{
		Commands->Send_Custom_Event(obj, Commands->Find_Object(100899), M07_V05_OFFICER_KILLED, 1, 0.0f);
	}

};

DECLARE_SCRIPT(M07_V05_Unit, "Stationary=0:int")
{
	
	// Register variables to be Auto-Saved
	// All variables must have a unique ID, less than 256, that never changes
	REGISTER_VARIABLES()
	{
//		SAVE_VARIABLE( poke_id, 1 );
	}

	void Created (GameObject * obj)
	{
		bool stationary = (Get_Int_Parameter("Stationary") == 1) ? true : false;
		if(stationary)
		{
			Commands->Set_Innate_Is_Stationary(obj, true);
		}

		Commands->Send_Custom_Event(obj, Commands->Find_Object(100899), M07_REINFORCEMENT_UNIT_CREATED, 1, 2.0f);
	}

	void Killed(GameObject * obj, GameObject * killer)
	{
		Commands->Send_Custom_Event(obj, Commands->Find_Object(100899), M07_REINFORCEMENT_UNIT_KILLED, 1, 2.0f);
	}
};

DECLARE_SCRIPT(M07_Activate_V05, "")
{
	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(100899), M07_ACTIVATE_ENCOUNTER, 1);				
			}

		}
	}

	
};

DECLARE_SCRIPT(M07_Nod_Light_Tank_Dec, "Attack_ID0=0:int, Attack_ID1=0:int, Attack_ID2=0:int")
{
	bool attacking;
	int attack_id[3];
	
	enum{ATTACK_OVER, ATTACK_LOC};

	// 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( attack_id, 2 );
	}

	void Created (GameObject * obj)
	{
		ActionParamsStruct params;

		Commands->Set_Player_Type(obj, SCRIPT_PLAYERTYPE_NOD );
		Commands->Enable_Enemy_Seen( obj, true);
		attacking = false;

		attack_id[0] = Get_Int_Parameter("Attack_ID0");
		attack_id[1] = Get_Int_Parameter("Attack_ID1");
		attack_id[2] = Get_Int_Parameter("Attack_ID2");

		if(attack_id[0] != 0)
		{
			int random = Commands->Get_Random_Int(0,2); 

			while(attack_id[random] == 0)
			{
				random = Commands->Get_Random_Int(0,2); 
			}

			params.Set_Basic( this, INNATE_PRIORITY_ENEMY_SEEN, 1 );
			params.Set_Attack (Commands->Find_Object(attack_id[random]), 250.0f, 0.0f, 1);
			params.AttackCheckBlocked = true;
			Commands->Action_Attack( obj, params );

			Commands->Start_Timer(obj, this, 6.0f, ATTACK_LOC);
		}
		
	}

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

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

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

		if(!attacking)
		{
			attacking = true;
			params.Set_Basic( this, INNATE_PRIORITY_ENEMY_SEEN, 1 );
			params.Set_Attack (damager, 250.0f, 0.0f, 1);
			params.AttackCheckBlocked = true;
			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;

		}
		if(timer_id == ATTACK_LOC && !attacking)
		{
			
			int random = Commands->Get_Random_Int(0,2); 

			params.Set_Basic( this, INNATE_PRIORITY_ENEMY_SEEN, 1 );
			params.Set_Attack (Commands->Find_Object(attack_id[random]), 250.0f, 0.0f, 1);
			params.AttackCheckBlocked = true;
			Commands->Action_Attack( obj, params );

			Commands->Start_Timer(obj, this, 6.0f, ATTACK_LOC);
		}
	}

	void Killed (GameObject * obj, GameObject * killer)
	{
		
	}
	
};

DECLARE_SCRIPT(M07_Nod_Inn_Light_Tank_Dec, "APC_ID=0:int")
{
	bool attacking;
	int apc_id;
	
	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->Set_Player_Type(obj, SCRIPT_PLAYERTYPE_NOD );
		Commands->Enable_Enemy_Seen( obj, true);
		attacking = false;
		apc_id = Get_Int_Parameter("APC_ID");	
	}

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

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

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

		if(!attacking)
		{
			attacking = true;
			params.Set_Basic( this, INNATE_PRIORITY_ENEMY_SEEN, 1 );
			params.Set_Attack (damager, 250.0f, 0.0f, 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;
		}
	}

	void Killed (GameObject * obj, GameObject * killer)
	{
		Commands->Send_Custom_Event (obj, Commands->Find_Object(apc_id), M07_REINFORCEMENT_KILLED, apc_id, 0.0f);
	}
	
};

DECLARE_SCRIPT(M07_Inn_APC, "")  
{
	bool attacking;
	int reinforce;
	
	enum{DROP_SOLDIERS, CHECK_ENEMY};
	// 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( reinforce, 2 );
	}

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

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

		if(!attacking)
		{
			attacking = true;

			params.Set_Basic( this, INNATE_PRIORITY_ENEMY_SEEN + 5, 1 );
			params.Set_Attack (enemy, 200.0f, 5.0f, 1);
			params.AttackCheckBlocked = true;
			Commands->Action_Attack (obj, params);

			Commands->Start_Timer (obj, this, 30.0f, CHECK_ENEMY);
		}
	}

	

	void Custom (GameObject * obj, int type, int param, GameObject * sender)
	{
		ActionParamsStruct params;

		if(type == M07_REINFORCEMENT_KILLED)
		{
			reinforce++;
			if(reinforce < 7)
			{
				char param1[10];
				sprintf(param1, "%d", Commands->Get_ID(obj));

				Vector3 pos = Commands->Get_Position(obj);
				float facing = Commands->Get_Facing(obj);
				float a = cos(DEG_TO_RADF(facing)) * -4.0;
				float b = sin(DEG_TO_RADF(facing)) * -4.0;
			
				Vector3 soldier_loc1 = pos + Vector3(a, b + .5f, 0.5f);
				GameObject * soldier1 = Commands->Create_Object("M07_Nod_APC", soldier_loc1);
				Commands->Attach_Script(soldier1, "M07_Inn_APC_Soldier", param1);

			}
		}

	}

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

	void Killed (GameObject * obj, GameObject * killer)
	{
		
	}

};

DECLARE_SCRIPT(M07_Inn_APC_Soldier, "APC_ID=0:int")
{

	int apc_id;

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

	void Created (GameObject * obj)
	{
		ActionParamsStruct params;

		apc_id = Get_Int_Parameter("APC_ID");	

		params.Set_Basic( this, INNATE_PRIORITY_ENEMY_SEEN - 5, 1 );
		params.Set_Movement( STAR, RUN, 20.0f );
		Commands->Action_Goto (obj, params);
	}

	void Killed (GameObject * obj, GameObject * killer)
	{
		if(Commands->Find_Object(apc_id))
		{
			Commands->Send_Custom_Event (obj, Commands->Find_Object(apc_id), M07_REINFORCEMENT_KILLED, apc_id, 0.0f);
		}
		
	}
};

DECLARE_SCRIPT(M07_Inn_Balcony_Sniper, "APC_ID=0:int")
{

	int apc_id;

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

	void Created (GameObject * obj)
	{
		apc_id = Get_Int_Parameter("APC_ID");	

		Commands->Set_Innate_Is_Stationary(obj, true);
	}

	void Killed (GameObject * obj, GameObject * killer)
	{
		if(Commands->Find_Object(apc_id))
		{
			Commands->Send_Custom_Event (obj, Commands->Find_Object(apc_id), M07_REINFORCEMENT_KILLED, apc_id, 0.0f);
		}
		
	}
};


DECLARE_SCRIPT(M07_Activate_V01, "")
{


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

	void Created (GameObject * obj)
	{
		

	}

	void Entered(GameObject * obj, GameObject * enterer)
	{
		if(Commands->Is_A_Star(enterer))
		{
			

			Commands->Send_Custom_Event (obj, Commands->Find_Object(100952), M07_ACTIVATE_V01, 1, 0.0f);
		}
	}
};

DECLARE_SCRIPT(M07_Deactivate_V01, "")
{


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

	void Created (GameObject * obj)
	{
		

	}

	void Entered(GameObject * obj, GameObject * enterer)
	{
		if(Commands->Is_A_Star(enterer))
		{
			

			Commands->Send_Custom_Event (obj, Commands->Find_Object(100953), M07_DEACTIVATE_V01, 1, 0.0f);
		}
	}
};

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

	void Created (GameObject * obj)
	{
		activated = false;	
		m07_v01_unit_killed = 0;
	}
	void Custom (GameObject * obj, int type, int param, GameObject * sender)
	{
		ActionParamsStruct params;

		if(type == M07_ACTIVATE_V01 && !activated)
		{
			activated = true;	

			Commands->Enable_Spawner(100956, true);
			Commands->Enable_Spawner(100962, true);

			GameObject * chinook_obj1 = Commands->Create_Object ( "Invisible_Object", Vector3(-193.706f, -82.114f, 4.987f));
			Commands->Set_Facing(chinook_obj1, 20.000f);
			Commands->Attach_Script(chinook_obj1, "Test_Cinematic", "X7D_CHTroopdrop2.txt");

		}

		if(type == M07_V01_UNIT_KILLED && activated)
		{
			m07_v01_unit_killed++;
			if(m07_v01_unit_killed%2 == 0)
			{
				GameObject * chinook_obj1 = Commands->Create_Object ( "Invisible_Object", Vector3(-193.706f, -82.114f, 4.987f));
				Commands->Set_Facing(chinook_obj1, 20.000f);
				Commands->Attach_Script(chinook_obj1, "Test_Cinematic", "X7D_CHTroopdrop2.txt");
			}

		}

		if(type == M07_DEACTIVATE_V01 && activated)
		{
			activated = false;	

			Commands->Enable_Spawner(100956, false);
			Commands->Enable_Spawner(100962, false);

		}

		
	}

	
};

DECLARE_SCRIPT(M07_V01_Destroyed_Flame_Tank, "")
{


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

	void Created (GameObject * obj)
	{
		

	}

	void Custom (GameObject * obj, int type, int param, GameObject * sender)
	{
		ActionParamsStruct params;

		if(type == M07_ACTIVATE_V01)
		{
			Commands->Apply_Damage( obj, 10000.0f, "DEATH");

		}
	}

	void Killed(GameObject * obj, GameObject * killer)
	{
		Commands->Send_Custom_Event (obj, Commands->Find_Object(100953), M07_ACTIVATE_V01, 1, 0.0f);
	}
};

DECLARE_SCRIPT(M07_Nod_Buggy_Dec, "")
{
	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->Set_Player_Type(obj, SCRIPT_PLAYERTYPE_NOD );
		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, INNATE_PRIORITY_ENEMY_SEEN, 1 );
			params.Set_Attack (enemy, 250.0f, 0.0f, 1);
			params.AttackCheckBlocked = false;
			Commands->Action_Attack( obj, params );
			
			Commands->Start_Timer(obj, this, 6.0f, ATTACK_OVER);
		}
	}

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

		if(!attacking)
		{
			attacking = true;
			params.Set_Basic( this, INNATE_PRIORITY_ENEMY_SEEN, 1 );
			params.Set_Attack (damager, 250.0f, 0.0f, 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;
		}
	}

	void Killed (GameObject * obj, GameObject * killer)
	{
		
	}
	
};

DECLARE_SCRIPT(M07_Nod_Recon_Bike_Dec, "")
{
	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->Set_Player_Type(obj, SCRIPT_PLAYERTYPE_NOD );
		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, INNATE_PRIORITY_ENEMY_SEEN, 1 );
			params.Set_Attack (enemy, 250.0f, 0.0f, 1);
			params.AttackCheckBlocked = false;
			Commands->Action_Attack( obj, params );
			
			Commands->Start_Timer(obj, this, 6.0f, ATTACK_OVER);
		}
	}

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

		if(!attacking)
		{
			attacking = true;
			params.Set_Basic( this, INNATE_PRIORITY_ENEMY_SEEN, 1 );
			params.Set_Attack (damager, 250.0f, 0.0f, 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;
		}
	}

	void Killed (GameObject * obj, GameObject * killer)
	{
		
	}
	
};

DECLARE_SCRIPT(M07_V01_Unit, "")
{
	
	enum{GO_STAR};

	// 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)
	{
		
		Commands->Start_Timer(obj, this, 3.0f, 10);
	}

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


		if(timer_id == GO_STAR)
		{
			params.Set_Basic( this, INNATE_PRIORITY_ENEMY_SEEN, GO_STAR );
			params.Set_Movement( STAR, RUN, 2.0f );
			Commands->Action_Goto (  obj, params );
		}
	}

	void Killed(GameObject * obj, GameObject * killer)
	{
		Commands->Send_Custom_Event (obj, Commands->Find_Object(100953), M07_V01_UNIT_KILLED, 1, 0.0f);
	}
};

DECLARE_SCRIPT(M07_Activate_Triangle_Apache, "")
{


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

	void Created (GameObject * obj)
	{
		

	}

	void Entered(GameObject * obj, GameObject * enterer)
	{
		if(Commands->Is_A_Star(enterer))
		{
			
			Commands->Enable_Spawner(101010, true);
			
		}
	}
};

DECLARE_SCRIPT(M07_Triangle_Apache, "")
{
	bool attacking;
	int curr_waypath;

	enum{WAYPATH, TRIANGLE_PATROL, 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( curr_waypath, 2 );
	}

	void Created (GameObject * obj)
	{
		ActionParamsStruct params;

		attacking = false;
		curr_waypath = 101011;

		params.Set_Basic( this, INNATE_PRIORITY_ENEMY_SEEN + 5, WAYPATH );
		params.Set_Movement( Vector3(0,0,0), RUN, 1.5f );
		params.WaypathID = 101011;
		Commands->Action_Goto( obj, params );
	}

	void Action_Complete(GameObject * obj, int action_id, ActionCompleteReason reason)
	{
		ActionParamsStruct params;

		if (action_id == WAYPATH && reason == ACTION_COMPLETE_NORMAL)
		{
			Commands->Enable_Enemy_Seen(obj, true);
			curr_waypath = 101016;

			params.Set_Basic( this, INNATE_PRIORITY_ENEMY_SEEN + 5, TRIANGLE_PATROL );
			params.Set_Movement( Vector3(0,0,0), RUN, 1.5f );
			params.WaypathID = curr_waypath;
			Commands->Action_Attack( obj, params );
		}
	}

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

		if(!attacking)
		{
			attacking = true;

			params.Set_Basic( this, INNATE_PRIORITY_ENEMY_SEEN + 5, TRIANGLE_PATROL );
			params.Set_Movement( Vector3(0,0,0), RUN, 1.5f );
			params.Set_Attack (enemy, 250.0f, 0.0f, 1);
			params.WaypathID = curr_waypath;
			Commands->Modify_Action (obj, TRIANGLE_PATROL, 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;
		}
	}

	void Sound_Heard(GameObject * obj, const CombatSound &sound)
	{
		ActionParamsStruct params;

		if (sound.Type == M07_RELOCATE_TRIANGLE_APACHE)
		{
			curr_waypath = 101033;

			params.Set_Basic( this, INNATE_PRIORITY_ENEMY_SEEN + 5, TRIANGLE_PATROL );
			params.Set_Movement( Vector3(0,0,0), RUN, 1.5f );
			params.WaypathID = curr_waypath;
			Commands->Action_Attack( obj, params );
		}
	}
	
};


DECLARE_SCRIPT(M07_Relocate_Triangle_Apache, "")
{


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

	void Created (GameObject * obj)
	{
		

	}

	void Entered(GameObject * obj, GameObject * enterer)
	{
		if(Commands->Is_A_Star(enterer))
		{
			
			Commands->Create_Logical_Sound(obj, M07_RELOCATE_TRIANGLE_APACHE, Commands->Get_Position(obj), 100.0f);
			
		}
	}
};

DECLARE_SCRIPT(M07_Triangle_APC, "")  
{
	
	void Killed (GameObject * obj, GameObject * killer)
	{
		Commands->Send_Custom_Event (obj, Commands->Find_Object(101056), M07_TRIANGLE_APC_KILLED, 1, 0.0f);
	}

};

DECLARE_SCRIPT(M07_Triangle_APC_Soldier, "APC_ID=0:int")
{

	int apc_id;

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

	void Created (GameObject * obj)
	{
		ActionParamsStruct params;

		apc_id = Get_Int_Parameter("APC_ID");	

		params.Set_Basic( this, INNATE_PRIORITY_ENEMY_SEEN - 5, 1 );
		params.Set_Movement( STAR, RUN, 20.0f );
		Commands->Action_Goto (obj, params);
	}

	void Killed (GameObject * obj, GameObject * killer)
	{
		if(Commands->Find_Object(apc_id))
		{
			Commands->Send_Custom_Event (obj, Commands->Find_Object(apc_id), M07_REINFORCEMENT_KILLED, apc_id, 0.0f);
		}
		
	}
};

DECLARE_SCRIPT(M07_Triangle_Guard, "APC_ID=0:int")
{

	int apc_id;

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

	void Created (GameObject * obj)
	{
		ActionParamsStruct params;

		apc_id = Get_Int_Parameter("APC_ID");	

		Commands->Set_Innate_Is_Stationary(obj, true);
	}

	void Killed (GameObject * obj, GameObject * killer)
	{
		if(Commands->Find_Object(apc_id))
		{
			Commands->Send_Custom_Event (obj, Commands->Find_Object(apc_id), M07_REINFORCEMENT_KILLED, apc_id, 0.0f);
		}
		
	}
};

DECLARE_SCRIPT(M07_Triangle_Controller, "")
{
	int m07_triangle_apc_killed;
	int m07_triangle_unit_killed;
	int civ_captive_killed;
	
	// Register variables to be Auto-Saved
	// All variables must have a unique ID, less than 256, that never changes
	REGISTER_VARIABLES()
	{
		SAVE_VARIABLE( m07_triangle_apc_killed, 1 );
		SAVE_VARIABLE( m07_triangle_unit_killed, 2 );
		SAVE_VARIABLE( civ_captive_killed, 3 );
	}

	void Created (GameObject * obj)
	{
		m07_triangle_apc_killed = 0;
		m07_triangle_unit_killed = 0;
		civ_captive_killed = 0;
	}

	void Custom (GameObject * obj, int type, int param, GameObject * sender)
	{
		if(type == M07_TRIANGLE_APC_KILLED)
		{
			m07_triangle_apc_killed++;
			if(m07_triangle_apc_killed == 2)
			{
				GameObject * chinook_obj1 = Commands->Create_Object ( "Invisible_Object", Vector3(-531.675f, -87.333f, 13.908f));
				Commands->Set_Facing(chinook_obj1, -70.000f);
				Commands->Attach_Script(chinook_obj1, "Test_Cinematic", "X7D_CHTroopdrop3.txt");
			}
		}

		if(type == M07_TRIANGLE_UNIT_KILLED)
		{
			m07_triangle_unit_killed++;
			if(m07_triangle_unit_killed%3 == 0 && m07_triangle_unit_killed < 9)
			{
				GameObject * chinook_obj1 = Commands->Create_Object ( "Invisible_Object", Vector3(-531.675f, -87.333f, 13.908f));
				Commands->Set_Facing(chinook_obj1, -70.000f);
				Commands->Attach_Script(chinook_obj1, "Test_Cinematic", "X7D_CHTroopdrop3.txt");
			}
		}
		if(type == M07_SPAWN_TRIANGLE_CIV)
		{
			civ_captive_killed++;
			if(civ_captive_killed == 2)
			{
				Commands->Send_Custom_Event(obj, Commands->Find_Object(100657), 705, 2, 0.0f);
			}
			switch(param)
			{
			case 1:
				{
					Commands->Enable_Spawner(101057, true);
				}
				break;
			case 2:
				{
					Commands->Enable_Spawner(101058, true);
				}
				break;
			}
		}
		
	}

};

DECLARE_SCRIPT(M07_Triangle_Unit, "")
{

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

	void Created (GameObject * obj)
	{
		
	}

	void Killed (GameObject * obj, GameObject * killer)
	{
		Commands->Send_Custom_Event (obj, Commands->Find_Object(101056), M07_TRIANGLE_UNIT_KILLED, 1, 0.0f);
		
	}
};

DECLARE_SCRIPT(M07_Activate_Hostage_Encounter, "")
{


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

	void Created (GameObject * obj)
	{
		

	}

	void Entered(GameObject * obj, GameObject * enterer)
	{
		if(Commands->Is_A_Star(enterer))
		{
			// Hostage
			Commands->Enable_Spawner(101066, true);

			// Hostage Takers
			Commands->Enable_Spawner(101073, true);
			Commands->Enable_Spawner(101074, true);
			Commands->Enable_Spawner(101079, true);
			
		}
	}
};

DECLARE_SCRIPT(M07_Fuel_Barrel, "")
{

	enum{BOOM};

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

	void Created (GameObject * obj)
	{
		Commands->Set_Animation_Frame(obj, "o_barrl_fuel.o_barrl_fuel", 0);
	}

	void Killed(GameObject * obj, GameObject * killer)
	{
		Commands->Create_Explosion("Ground Explosions Twiddler", Commands->Get_Position(obj));
		
		Commands->Send_Custom_Event(obj, Commands->Find_Object(101059), M07_EXPLODE_BARRELS, 1);

	}
	
};

DECLARE_SCRIPT(M07_Hostage_Controller, "")
{

	bool destroy_stockpile;

	enum{BOOM};

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

	void Created (GameObject * obj)
	{
		destroy_stockpile = false;
		Commands->Enable_Spawner(100795, true);
	}

	void Custom(GameObject * obj, int type, int param, GameObject * sender)
	{
		if (type == M07_EXPLODE_BARRELS && destroy_stockpile == false)
		{
			destroy_stockpile = true;
			
			Commands->Apply_Damage( Commands->Find_Object(101060), 10000.0f, "STEEL");
			Commands->Apply_Damage( Commands->Find_Object(101061), 10000.0f, "STEEL");
			Commands->Apply_Damage( Commands->Find_Object(101062), 10000.0f, "STEEL");
			Commands->Apply_Damage( Commands->Find_Object(101063), 10000.0f, "STEEL");
			Commands->Apply_Damage( Commands->Find_Object(101064), 10000.0f, "STEEL");
			Commands->Apply_Damage( Commands->Find_Object(101065), 10000.0f, "STEEL");
			Commands->Apply_Damage( Commands->Find_Object(101084), 10000.0f, "STEEL");
			
			
		}
	}

};

DECLARE_SCRIPT(M07_Hostage, "")
{
	bool poked;


	enum{WAYPATH, SWITCH_TYPE};

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

	void Created (GameObject * obj)
	{
		ActionParamsStruct params;

		params.Set_Basic( this, INNATE_PRIORITY_ENEMY_SEEN + 5, WAYPATH );
		params.Set_Movement( Vector3(0,0,0), RUN, 1.5f );
		params.WaypathID = 101067;
		Commands->Action_Goto( obj, params );

		Commands->Start_Timer(obj, this, 6.0f, SWITCH_TYPE);
		poked = false;
	}

	void Poked(GameObject * obj, GameObject * poker)
	{
		ActionParamsStruct params;

		if ((Commands->Is_A_Star(poker)) && (!poked))
		{
			poked = true;

			// Assume hands over head anim
			params.Set_Basic( this, INNATE_PRIORITY_ENEMY_SEEN + 5, 1);
			params.Set_Animation( "H_A_HOST_L1C", false );
			Commands->Action_Play_Animation (obj, params);

			Commands->Set_Innate_Is_Stationary(obj, false);

			Vector3 pos = Commands->Get_Position(obj);
			float facing = Commands->Get_Facing(obj);
			float a = cos(DEG_TO_RADF(facing)) * 1.5;
			float b = sin(DEG_TO_RADF(facing)) * 1.5;
			Vector3 powerup_loc = pos + Vector3(a, b, 0.5f);
			Commands->Create_Object("Ramjet_Weapon_Powerup", powerup_loc);

		}
	}

	


	void Action_Complete(GameObject * obj, int action_id, ActionCompleteReason reason)
	{
		ActionParamsStruct params;

		if (reason != ACTION_COMPLETE_NORMAL) 
		{
			return;
		}
		if (action_id == WAYPATH)
		{
			Commands->Set_Innate_Is_Stationary(obj, true);
			
			// Assume hands over head anim
			params.Set_Basic( this, INNATE_PRIORITY_ENEMY_SEEN + 5, 1);
			params.Set_Animation( "H_A_HOST_L1B", true );
			Commands->Action_Play_Animation (obj, params);
		}
	}

	void Timer_Expired(GameObject * obj, int timer_id)
	{
		if(timer_id == SWITCH_TYPE)
		{
			Commands->Set_Player_Type(obj, SCRIPT_PLAYERTYPE_GDI );
		}
	}
};

DECLARE_SCRIPT(M07_Hostage_Taker, "Waypath_ID=0:int")
{

	bool destroy_stockpile;

	enum{WAYPATH};

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

	void Created (GameObject * obj)
	{
		ActionParamsStruct params;

		int waypath_id = Get_Int_Parameter("Waypath_ID");

		params.Set_Basic( this, INNATE_PRIORITY_ENEMY_SEEN - 5, WAYPATH );
		params.Set_Movement( Vector3(0,0,0), RUN, 1.5f );
		params.WaypathID = waypath_id;
		Commands->Action_Goto( obj, params );
	}

	
};

DECLARE_SCRIPT(M07_APC_Dec, "")  
{
	bool attacking;
	int reinforce;
	
	enum{DROP_SOLDIERS, CHECK_ENEMY};
	// 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( reinforce, 2 );
	}

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

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

		if(!attacking)
		{
			attacking = true;

			params.Set_Basic( this, INNATE_PRIORITY_ENEMY_SEEN + 5, 1 );
			params.Set_Attack (enemy, 200.0f, 5.0f, 1);
			params.AttackCheckBlocked = true;
			Commands->Action_Attack (obj, params);

			Commands->Start_Timer (obj, this, 30.0f, CHECK_ENEMY);
		}
	}

	

	void Custom (GameObject * obj, int type, int param, GameObject * sender)
	{
		ActionParamsStruct params;

		if(type == M07_REINFORCEMENT_KILLED)
		{
			reinforce++;
			if(reinforce < 7)
			{
				char param1[10];
				sprintf(param1, "%d", Commands->Get_ID(obj));

				Vector3 pos = Commands->Get_Position(obj);
				float facing = Commands->Get_Facing(obj);
				float a = cos(DEG_TO_RADF(facing)) * -4.0;
				float b = sin(DEG_TO_RADF(facing)) * -4.0;
			
				Vector3 soldier_loc1 = pos + Vector3(a, b + .5f, 0.5f);
				GameObject * soldier1 = Commands->Create_Object("M07_Nod_APC", soldier_loc1);
				Commands->Attach_Script(soldier1, "M07_APC_Dec_Soldier", param1);

			}
		}

	}

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

	void Killed (GameObject * obj, GameObject * killer)
	{
		
	}

};

DECLARE_SCRIPT(M07_APC_Dec_Soldier, "APC_ID=0:int")
{

	int apc_id;

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

	void Created (GameObject * obj)
	{
		ActionParamsStruct params;

		apc_id = Get_Int_Parameter("APC_ID");	

		params.Set_Basic( this, INNATE_PRIORITY_ENEMY_SEEN - 5, 1 );
		params.Set_Movement( STAR, RUN, 20.0f );
		Commands->Action_Goto (obj, params);
	}

	void Killed (GameObject * obj, GameObject * killer)
	{
		if(Commands->Find_Object(apc_id))
		{
			Commands->Send_Custom_Event (obj, Commands->Find_Object(apc_id), M07_REINFORCEMENT_KILLED, apc_id, 0.0f);
		}
		
	}
};

DECLARE_SCRIPT(M07_Activate_Bridge_Civ, "")
{


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

	void Created (GameObject * obj)
	{
		

	}

	void Entered(GameObject * obj, GameObject * enterer)
	{
		if(Commands->Is_A_Star(enterer))
		{
			// Bridge Civilians
			Commands->Enable_Spawner(101109, true);
			Commands->Enable_Spawner(101114, true);
			// Bridge overlook Apache
			Commands->Enable_Spawner(109150, true);
		}
	}
};

DECLARE_SCRIPT(M07_Bridge_Civ, "Waypath_ID=0:int")
{

	enum{WAYPATH};

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

	void Created (GameObject * obj)
	{
		ActionParamsStruct params;

		int waypath_id = Get_Int_Parameter("Waypath_ID");

		params.Set_Basic( this, INNATE_PRIORITY_ENEMY_SEEN + 5, WAYPATH );
		params.Set_Movement( Vector3(0,0,0), RUN, 0.5f );
		params.WaypathID = waypath_id;
		Commands->Action_Goto( obj, params );
		

	}

	void Action_Complete(GameObject * obj, int action_id, ActionCompleteReason reason)
	{
		

		Commands->Set_Innate_Is_Stationary(obj, true);
	
	}

	
};

DECLARE_SCRIPT(M07_Activate_E10_Tank_Drop, "")
{
	int m07_player_vehicle_id;
	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( m07_player_vehicle_id, 1 );
		SAVE_VARIABLE( already_entered, 2 );
	}

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

	void Custom( GameObject * obj, int type, int param, GameObject * sender ) 
	{
		if ( type == M07_PLAYER_VEHICLE_ID ) 
		{
			m07_player_vehicle_id = param;
		}
		if ( type == M07_E10_TANK_CREATED ) 
		{
			Commands->Send_Custom_Event(obj, sender, M07_PLAYER_VEHICLE_ID, Commands->Get_ID(sender));
		}
	}

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

			GameObject * drop_loc = Commands->Find_Object(101132);
			float drop_facing = Commands->Get_Facing(drop_loc);
			
			GameObject * chinook_obj1 = Commands->Create_Object ( "Invisible_Object", Commands->Get_Position(drop_loc));
			Commands->Set_Facing(chinook_obj1, drop_facing);
			Commands->Attach_Script(chinook_obj1, "Test_Cinematic", "M07_XG_VehicleDrop2.txt");
		}
	}
};

DECLARE_SCRIPT(M07_E10_Tank, "")
{
	int m07_player_vehicle_id;

	enum{GO_PLAYER_VEHICLE};

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

	void Created (GameObject * obj)
	{
		Commands->Enable_Enemy_Seen(obj, true);
		m07_player_vehicle_id = 0;
		Commands->Send_Custom_Event(obj, Commands->Find_Object(101131), M07_E10_TANK_CREATED, 1);
	}

	void Custom( GameObject * obj, int type, int param, GameObject * sender ) 
	{
		if ( type == M07_PLAYER_VEHICLE_ID ) 
		{
			m07_player_vehicle_id = param;
			Commands->Start_Timer(obj, this, 3.0f, 10);
		}
		
	}

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

		if (Commands->Is_A_Star(enemy))
		{
			params.Set_Basic(this, INNATE_PRIORITY_ENEMY_SEEN + 5, GO_PLAYER_VEHICLE);
			params.Set_Attack(Commands->Find_Object(m07_player_vehicle_id), 40.0f, 1.0f, true);
			params.AttackCheckBlocked = false;
			params.MoveFollow = true;
			Commands->Modify_Action (obj, GO_PLAYER_VEHICLE, params);
		}
	}

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

			params.Set_Basic(this, INNATE_PRIORITY_ENEMY_SEEN + 5, GO_PLAYER_VEHICLE);
			params.Set_Attack(Commands->Find_Object(m07_player_vehicle_id), 40.0f, 1.0f, true);
			params.AttackCheckBlocked = false;
			params.MoveFollow = true;
			Commands->Action_Attack(obj, params);
		}
	}
};

DECLARE_SCRIPT(M07_Para_Drop_Controller, "")
{
		
	int para_drop[7];
	int drop_zone;
	int m07_paradrop_unit1_killed;
	int m07_paradrop_unit2_killed;
	int m07_paradrop_unit3_killed;
	int m07_paradrop_unit4_killed;
	bool active;

	
	// Register variables to be Auto-Saved
	// All variables must have a unique ID, less than 256, that never changes
	REGISTER_VARIABLES()
	{
//		SAVE_VARIABLE( para_drop, 1 );
		SAVE_VARIABLE( drop_zone, 2 );
		SAVE_VARIABLE( m07_paradrop_unit1_killed, 3 );
		SAVE_VARIABLE( m07_paradrop_unit2_killed, 4 );
		SAVE_VARIABLE( m07_paradrop_unit3_killed, 5 );
		SAVE_VARIABLE( m07_paradrop_unit4_killed, 6 );
		SAVE_VARIABLE( active, 7 );
	}

	void Created (GameObject * obj)
	{
		
		para_drop[0] = 101134;
		para_drop[1] = 101138;
		para_drop[2] = 101139;
		para_drop[3] = 101140;
		para_drop[4] = 101141;
		para_drop[5] = 101142;
		para_drop[6] = 101143;
		
		
		drop_zone = 0;
		m07_paradrop_unit1_killed = 0;
		m07_paradrop_unit2_killed = 0;
		m07_paradrop_unit3_killed = 0;
		m07_paradrop_unit4_killed = 0;

		active = true;
		
	}

	void Custom(GameObject * obj, int type, int param, GameObject * sender)
	{
		if (type == M07_DEACTIVATE_PARADROP)
		{
			
			active = false;
			
		}
		if (type == M07_VEHICLE_DROP_ZONE)
		{
			
			drop_zone = param;
			
		}
		if(type == M07_PARADROP_UNIT_KILLED && active)
		{
			switch(param)
			{
			case 1:
				{

					m07_paradrop_unit1_killed++;
					if(m07_paradrop_unit1_killed%3 == 0 && m07_paradrop_unit1_killed < 9)
					{
						GameObject * drop_loc = Commands->Find_Object(para_drop[drop_zone]);
						float drop_facing = Commands->Get_Facing(drop_loc);
						
						GameObject * chinook_obj1 = Commands->Create_Object ( "Invisible_Object", Commands->Get_Position(drop_loc));
						Commands->Set_Facing(chinook_obj1, drop_facing);
						Commands->Attach_Script(chinook_obj1, "Test_Cinematic", "X7D_CHTroopdrop4.txt");
					}
				}
				break;
			case 2:
				{

					m07_paradrop_unit2_killed++;
					if(m07_paradrop_unit2_killed < 2)
					{
						
						GameObject * drop_loc = Commands->Find_Object(109837);
						float drop_facing = Commands->Get_Facing(drop_loc);
						
						GameObject * chinook_obj1 = Commands->Create_Object ( "Invisible_Object", Commands->Get_Position(drop_loc));
						Commands->Set_Facing(chinook_obj1, drop_facing);
						Commands->Attach_Script(chinook_obj1, "Test_Cinematic", "X7D_CHTroopdrop5.txt");
					}
				}
				break;
			case 3:
				{

					m07_paradrop_unit3_killed++;
					if(m07_paradrop_unit3_killed < 2)
					{
						
						GameObject * drop_loc = Commands->Find_Object(109838);
						float drop_facing = Commands->Get_Facing(drop_loc);
						
						GameObject * chinook_obj1 = Commands->Create_Object ( "Invisible_Object", Commands->Get_Position(drop_loc));
						Commands->Set_Facing(chinook_obj1, drop_facing);
						Commands->Attach_Script(chinook_obj1, "Test_Cinematic", "X7D_CHTroopdrop6.txt");
					}
				}
				break;
			case 4:
				{

					m07_paradrop_unit4_killed++;
					if(m07_paradrop_unit4_killed < 2)
					{
						
						GameObject * drop_loc = Commands->Find_Object(109839);
						float drop_facing = Commands->Get_Facing(drop_loc);
						
						GameObject * chinook_obj1 = Commands->Create_Object ( "Invisible_Object", Commands->Get_Position(drop_loc));
						Commands->Set_Facing(chinook_obj1, drop_facing);
						Commands->Attach_Script(chinook_obj1, "Test_Cinematic", "X7D_CHTroopdrop7.txt");
					}
				}
				break;
			}
		}

		
	}

};

DECLARE_SCRIPT(M07_Para_Drop_Zone, "Zone_ID=0:int")
{

	// 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)
	{
	
	}

	void Entered(GameObject * obj, GameObject * enterer)
	{
		int zone_id = Get_Int_Parameter("Zone_ID");

		if(Commands->Is_A_Star(enterer))
		{
			Commands->Send_Custom_Event(obj, Commands->Find_Object(101133), M07_VEHICLE_DROP_ZONE, zone_id);
		}

	}
};

DECLARE_SCRIPT(M07_Para_Drop_Unit, "Unit_ID=0:int")
{

	enum{GO_STAR};

	// 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)
	{
		if(Get_Int_Parameter("Unit_ID") == 1)
		{
			Commands->Start_Timer(obj, this, 3.0f, GO_STAR);
		}
		else
		{
			Commands->Set_Innate_Is_Stationary(obj, true);
		}
	}

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

		if(timer_id == GO_STAR)
		{
			params.Set_Basic (this, (INNATE_PRIORITY_ENEMY_SEEN - 5), 10);
			params.Set_Movement (STAR, RUN, 10.0f);
			Commands->Action_Goto (obj, params);
		}
	}

	void Killed(GameObject * obj, GameObject * killer)
	{
		int unit_id = Get_Int_Parameter("Unit_ID");
		Commands->Send_Custom_Event(obj, Commands->Find_Object(101133), M07_PARADROP_UNIT_KILLED, unit_id);
	}
	
};

DECLARE_SCRIPT(M07_Activate_Para_Drop, "")
{
	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;

			GameObject * chinook_obj1 = Commands->Create_Object ( "Invisible_Object", Vector3(-417.090f, 39.921f, 20.435f));
			Commands->Set_Facing(chinook_obj1, 0.000f);
			Commands->Attach_Script(chinook_obj1, "Test_Cinematic", "X7D_CHTroopdrop4.txt");

			GameObject * chinook_obj2 = Commands->Create_Object ( "Invisible_Object", Vector3(-437.171f, 35.261f, 36.155f));
			Commands->Set_Facing(chinook_obj2, -5.000f);
			Commands->Attach_Script(chinook_obj2, "Test_Cinematic", "X7D_CHTroopdrop5.txt");

			GameObject * chinook_obj3 = Commands->Create_Object ( "Invisible_Object", Vector3(-474.645f, 36.897f, 32.859f));
			Commands->Set_Facing(chinook_obj3, 0.000f);
			Commands->Attach_Script(chinook_obj3, "Test_Cinematic", "X7D_CHTroopdrop6.txt");

			GameObject * chinook_obj4 = Commands->Create_Object ( "Invisible_Object", Vector3(-516.036f, 40.087f, 30.558f));
			Commands->Set_Facing(chinook_obj4, -5.000f);
			Commands->Attach_Script(chinook_obj4, "Test_Cinematic", "X7D_CHTroopdrop7.txt");

		}

	}
};

DECLARE_SCRIPT(M07_Deactivate_Para_Drop, "")
{
	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(101133), M07_DEACTIVATE_PARADROP, 1);

		}

	}
};

DECLARE_SCRIPT(M07_Flyover_Controller, "")
{
	int last;

	REGISTER_VARIABLES()
	{
		SAVE_VARIABLE(last, 1);
	}
	
	void Created(GameObject * obj)
	{
		Commands->Start_Timer(obj, this, 10.0f, 0);
		last = 0;
		
	}

	void Timer_Expired(GameObject * obj, int timer_id)
	{
		char *flyovers[8] = 
		{
			"X7A_CPlane_00.txt",
			"X7A_CPlane_01.txt",
			"X7A_CPlane_02.txt",
			"X7A_CPlane_03.txt",

			"X7A_Apache_00.txt",
			"X7A_Apache_01.txt",
			"X7A_Apache_02.txt",
			"X7A_Apache_03.txt",
			
		};
		int random = Commands->Get_Random_Int ( 0, 7 );
	
		while (random == last) 
		{
			random = Commands->Get_Random_Int ( 0, 7 );
		}

		GameObject *controller = Commands->Create_Object("Invisible_Object", Vector3(0,0,0));
		Commands->Attach_Script(controller, "Test_Cinematic", flyovers[random]);
		Commands->Start_Timer(obj, this, 10.0f, 0);
		
		last = random;
	}
};


DECLARE_SCRIPT(M07_Activate_Flyover, "Text_File:string")
{
	bool already_entered;

	enum {PLAY_AGAIN};

	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;

			const char * flyover = Get_Parameter("Text_File");

			GameObject *controller = Commands->Create_Object("Invisible_Object", Vector3(0,0,0));
			Commands->Attach_Script(controller, "Test_Cinematic", flyover);

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

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

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

	void Created(GameObject * obj)
	{
		Commands->Enable_Hibernation(obj, false);
	}

};

DECLARE_SCRIPT(M07_Move_To_Evac, "")
{
		
	bool already_entered;
	bool star_in_blast;
	
	// 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( star_in_blast, 2 );
	}

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

	void Custom( GameObject * obj, int type, int param, GameObject * sender ) 
	{
		
	}


	void Entered (GameObject * obj, GameObject * enterer)
	{
		if(Commands->Is_A_Star(enterer))
		{
			// Customs to move team to evac site
			// Havoc
			Commands->Send_Custom_Event(obj, STAR, M07_GO_EVAC_SITE, 1, 0.0f);
			// Hotwire
			Commands->Send_Custom_Event(obj, HOTWIRE, M07_GO_EVAC_SITE, 1, 0.0f);
			// Patch
			Commands->Send_Custom_Event(obj, PATCH, M07_GO_EVAC_SITE, 1, 0.0f);
			// Gunner
			Commands->Send_Custom_Event(obj, GUNNER, M07_GO_EVAC_SITE, 1, 0.0f);
			// Deadeye
			Commands->Send_Custom_Event(obj, DEADEYE, M07_GO_EVAC_SITE, 1, 0.0f);
			// Sydney
			Commands->Send_Custom_Event(obj, SYDNEY, M07_GO_EVAC_SITE, 1, 0.0f);
		}

	}
};

DECLARE_SCRIPT(M07_Move_Hotwire, "Move_Loc=0:int")
{
		
	
	// 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)
	{
		
	}

	void Entered (GameObject * obj, GameObject * enterer)
	{
		if (Commands->Is_A_Star(enterer))
		{
			int move_loc = Get_Int_Parameter("Move_Loc");
			Commands->Send_Custom_Event(obj, Commands->Find_Object(100658), M07_MOVE_HOTWIRE, move_loc, 0.0f);
		}
	}

};

DECLARE_SCRIPT(M07_Player_Rocket_Emplacement, "")
{
		
	
	// 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)
	{
		
	}

	void Damaged( GameObject * obj, GameObject * damager, float amount ) 
	{
		if(damager == Commands->Find_Object(100905))
		{
			if(Commands->Get_Health(obj) < 10.0f)
			{
				Commands->Set_Health(obj, 10.0f);
			}
			if(Commands->Get_Health(obj) < (.3 * Commands->Get_Max_Health(obj)))
			{
				Commands->Apply_Damage( obj, -10000.0f, "STEEL", NULL );
			}
		}

	}

};


DECLARE_SCRIPT(M07_Playertype_Neutral, "")
{
		
	
	// 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)
	{
		Commands->Set_Player_Type(obj, SCRIPT_PLAYERTYPE_NEUTRAL );
	}

};


DECLARE_SCRIPT(M07_Inn_Evac, "")//104496
{
	
	int evac_waypath_id;
	int evac_helicopter_id;
	int dead6_cnt;
	int evac_rope_id;

	enum{LOWER_ROPE, CHINOOK_OUT, DESTROY_SYDNEY};

	REGISTER_VARIABLES()
	{
		SAVE_VARIABLE(evac_waypath_id, 1);
		SAVE_VARIABLE(evac_helicopter_id, 2);
		SAVE_VARIABLE(dead6_cnt, 3);
		SAVE_VARIABLE(evac_rope_id, 4);
	}

	void Created( GameObject * obj ) 
	{
		dead6_cnt = 0;
		evac_waypath_id = 0;
		evac_helicopter_id = 0;
		evac_rope_id = 0;
	}

	void Custom( GameObject * obj, int type, int param, GameObject * sender ) 
	{
		if (type == M07_DEAD6_EVAC) //SAM sites captured, evac DEAD6 and Sydney
		{

			char param1[10];
			sprintf(param1, "%d", param);

			Vector3 evacPosition = Commands->Get_Position ( obj );
			float evacFacing = Commands->Get_Facing ( obj );
			GameObject *troopBone = Commands->Create_Object("Saveable_Invisible_Object", evacPosition );
			Commands->Set_Model ( troopBone, "XG_EV5_troopBN" );
			Commands->Set_Facing ( troopBone, evacFacing );
			Commands->Attach_Script(troopBone, "M07_Inn_Evac_Climb", param1);
			
			dead6_cnt++;
			if(dead6_cnt == 4)
			{
				Commands->Send_Custom_Event(obj, Commands->Find_Object(100658), M07_EVAC_INN, 1, 0.0f);

			}
			if(dead6_cnt == 5)
			{
				// This is Resistance Radio.  Nod SSM deployment confirmed.  All available personnel to the park.\n
				const char *conv_name = ("M07_CON017");
				int conv_id = Commands->Create_Conversation (conv_name, 100.0f, 200.0f, false);
				Commands->Join_Conversation(NULL, conv_id, false, true);
				Commands->Join_Conversation(STAR, conv_id, false, true);
				Commands->Join_Conversation(NULL, conv_id, false, true);
				Commands->Join_Conversation(NULL, conv_id, false, true);
				Commands->Start_Conversation (conv_id, 300703);
				Commands->Monitor_Conversation (obj, conv_id);
				
				
			}
		}
		if (type == M07_EVAC_INN) //SAM sites captured, evac DEAD6 and Sydney
		{
			Vector3 evacPosition = Commands->Get_Position ( obj );
			float evacFacing = Commands->Get_Facing ( obj );
			GameObject *evacWaypath = Commands->Create_Object("Saveable_Invisible_Object", evacPosition );
			Commands->Attach_Script(evacWaypath, "M07_Inn_Evac_Trajectory", "");
			Commands->Set_Model ( evacWaypath, "XG_EV5_Path" );
			Commands->Set_Facing ( evacWaypath, evacFacing );
			Commands->Set_Animation ( evacWaypath, "XG_EV5_Path.XG_EV5_PathA", false );
			Commands->Start_Timer (obj, this, 130.0f/30.0f, LOWER_ROPE);
			evac_waypath_id = Commands->Get_ID(evacWaypath);
			
			GameObject *evacChopper = Commands->Create_Object_At_Bone( evacWaypath, "GDI_Transport_Helicopter_Flyover", "BN_Trajectory" );
			Commands->Attach_Script(evacChopper, "M07_Inn_Evac_Helicopter", "");
			Commands->Set_Animation ( evacChopper, "v_GDI_trnspt.XG_EV5_trnsA", false );
			Commands->Attach_To_Object_Bone( evacChopper, evacWaypath, "BN_Trajectory" );
			evac_helicopter_id = Commands->Get_ID ( evacChopper );

		}

	}

	void Action_Complete(GameObject * obj, int action_id, ActionCompleteReason reason)
	{
		if (action_id == 300703 && (reason == ACTION_COMPLETE_CONVERSATION_ENDED || reason == ACTION_COMPLETE_CONVERSATION_INTERRUPTED))
		{
			// Destroy Artillery Piece Objective
			Commands->Send_Custom_Event(obj, Commands->Find_Object(100657), 703, 3, 0.0f);
			Commands->Start_Timer (obj, this, 3.0f, CHINOOK_OUT);
			

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

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

		if(timer_id == DESTROY_SYDNEY)
		{
			// Once GDI evac has arrived destroy Sydney and DEAD-6 to give appearance of liftoff
			Commands->Destroy_Object(DEADEYE);
			Commands->Destroy_Object(GUNNER);
			Commands->Destroy_Object(PATCH);
			Commands->Destroy_Object(SYDNEY);

			

	//		Commands->Start_Timer(obj, this, 10.0f, DROP_DEAD6_INN);
		}
		if(timer_id == LOWER_ROPE)
		{
			Vector3 evacPosition = Commands->Get_Position ( obj );
			float evacFacing = Commands->Get_Facing ( obj );
			GameObject * evacRope = Commands->Create_Object("Saveable_Invisible_Object", evacPosition );
			Commands->Attach_Script(evacRope, "M07_Inn_Evac_Rope", "");
			Commands->Set_Model ( evacRope, "XG_EV5_rope" );
			Commands->Set_Facing ( evacRope, evacFacing );
			Commands->Set_Animation ( evacRope, "XG_EV5_rope.XG_EV5_ropeA", false );
			evac_rope_id = Commands->Get_ID ( evacRope );
		}

		if(timer_id == CHINOOK_OUT)
		{
			GameObject * evacChopper = Commands->Find_Object ( evac_helicopter_id );
			GameObject * evacWaypath = Commands->Find_Object ( evac_waypath_id );
			GameObject * evacRope = Commands->Find_Object ( evac_rope_id );

			if (evacChopper != NULL)
			{
				Commands->Send_Custom_Event ( obj, evacChopper, M07_INN_HELICOPTER_OUT, 1, 0 );
			}

			if (evacWaypath != NULL)
			{
				Commands->Send_Custom_Event ( obj, evacWaypath, M07_INN_HELICOPTER_OUT, 1, 0 );
			}

			if (evacRope != NULL)
			{
				Commands->Send_Custom_Event ( obj, evacRope, M07_INN_HELICOPTER_OUT, 1, 0 );
			}

			// Objective accomplished for rescuing Sydney
			Commands->Send_Custom_Event(obj, Commands->Find_Object(100657), 701, 1, 0.0f);
			// Objective accomplished for protecting team
			Commands->Send_Custom_Event(obj, Commands->Find_Object(100657), 709, 1, 1.0f);
		}
		
	}

	
};

DECLARE_SCRIPT(M07_Inn_Evac_Climb, "Dead6_ID=0:int")
{

	void Created( GameObject * obj ) 
	{
		int dead6_id = Get_Int_Parameter("Dead6_ID");
		GameObject * dead6 = Commands->Find_Object(dead6_id);
		Commands->Attach_Script(dead6, "M07_Climb_Rope", "");
		Commands->Attach_To_Object_Bone(dead6, obj, "Troop_L" );
		Commands->Set_Animation ( obj, "XG_EV5_troopBN.XG_EV5_troopBN", false );
	}

	void Animation_Complete(GameObject * obj, const char *anim)
	{
		if (stricmp(anim, "XG_EV5_troopBN.XG_EV5_troopBN") == 0)
		{
			Commands->Destroy_Object ( obj );
		}

	}

};

DECLARE_SCRIPT(M07_Climb_Rope, "")
{
	enum{CLIMB_ROPE};
	
	void Created( GameObject * obj ) 
	{
		ActionParamsStruct params;

		params.Set_Basic( this, INNATE_PRIORITY_ENEMY_SEEN + 5, CLIMB_ROPE );
		params.Set_Animation ("S_A_Human.XG_EV5_Troop", false);
	//	params.Set_Animation ("S_A_HUMAN.H_A_A0F0", true);
		Commands->Action_Play_Animation (obj, params);
	}

	void Action_Complete(GameObject * obj, int action_id, ActionCompleteReason reason)
	{
		if(action_id == CLIMB_ROPE && reason == ACTION_COMPLETE_NORMAL)
		{
			Commands->Destroy_Object(obj);
		}
		
	}

};

DECLARE_SCRIPT(M07_Inn_Evac_Rope, "")
{
	void Animation_Complete(GameObject * obj, const char *anim)
	{
		if (stricmp(anim, "XG_EV5_rope.XG_EV5_ropeA") == 0)
		{
			Commands->Set_Animation ( obj, "XG_EV5_rope.XG_EV5_ropeL", true );
		}

		else if (stricmp(anim, "XG_EV5_rope.XG_EV5_ropeZ") == 0)
		{
			Commands->Destroy_Object ( obj );
		}
	}

	void Custom( GameObject * obj, int type, int param, GameObject * sender ) 
	{
		switch (type)
		{
			case M07_INN_HELICOPTER_OUT: 
				{
					Commands->Set_Animation ( obj, "XG_EV5_rope.XG_EV5_ropeZ", false );
				}
				break;
		}
	}
};

DECLARE_SCRIPT(M07_Inn_Evac_Trajectory, "")
{
	void Animation_Complete(GameObject * obj, const char *anim)
	{
		if (stricmp(anim, "XG_EV5_Path.XG_EV5_PathA") == 0)
		{
			Commands->Set_Animation ( obj, "XG_EV5_Path.XG_EV5_PathL", true );
		}

		else if (stricmp(anim, "XG_EV5_Path.XG_EV5_PathZ") == 0)
		{
			Commands->Destroy_Object ( obj );
		}
	}

	void Custom( GameObject * obj, int type, int param, GameObject * sender ) 
	{
		switch (type)
		{
			case M07_INN_HELICOPTER_OUT: 
				{
					Commands->Set_Animation ( obj, "XG_EV5_Path.XG_EV5_PathZ", false );
				}
				break;
		}
	}
};

DECLARE_SCRIPT(M07_Inn_Evac_Helicopter, "")
{
	void Created( GameObject * obj ) 
	{
		Commands->Enable_Hibernation( obj, false );
		Commands->Disable_Physical_Collisions ( obj );
		Commands->Send_Custom_Event ( obj, obj, M07_INN_HELO_COLLISIONS, 1, 3.0F );
	}

	void Animation_Complete(GameObject * obj, const char *anim)
	{
		if (stricmp(anim, "v_GDI_trnspt.XG_EV5_trnsA") == 0)
		{
			Commands->Set_Animation ( obj, "v_GDI_trnspt.XG_EV5_trnsL", true );
			Commands->Enable_Collisions ( obj );

			
		}

		else if (stricmp(anim, "v_GDI_trnspt.XG_EV5_trnsz") == 0)
		{
			Commands->Destroy_Object ( obj );
		}
	}

	void Custom( GameObject * obj, int type, int param, GameObject * sender ) 
	{
		switch (type)
		{
			case M07_INN_HELICOPTER_OUT: 
				{
					Commands->Disable_Physical_Collisions ( obj );
					Commands->Set_Animation ( obj, "v_GDI_trnspt.XG_EV5_trnsz", false );
				}
				break;

			case M07_INN_HELO_COLLISIONS: 
				{
					Commands->Enable_Collisions ( obj );
				}
				break;
		
		}
	}

	void Damaged( GameObject * obj, GameObject * damager, float amount ) 
	{
		if(Commands->Get_Health(obj) < 10.0f)
		{
			Commands->Set_Health(obj, 10.0f);
		}
		if(Commands->Get_Health(obj) < (.3 * Commands->Get_Max_Health(obj)))
		{
			Commands->Apply_Damage( obj, -10000.0f, "STEEL", NULL );
		}

	}
};

DECLARE_SCRIPT(M07_Deadeye_Nod_Chinook, "")
{

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

	void Created (GameObject * obj)
	{

	}

	void Damaged( GameObject * obj, GameObject * damager, float amount ) 
	{
		if(Commands->Get_Health(obj) < 10.0f)
		{
			Commands->Set_Health(obj, 10.0f);
		}
		if(Commands->Get_Health(obj) < (.3 * Commands->Get_Max_Health(obj)))
		{
			Commands->Apply_Damage( obj, -10000.0f, "STEEL", NULL );
		}

	}

};

DECLARE_SCRIPT(M07_Alley_Vehicle, "Waypath_ID=0:int")
{
	bool attacking;
	int waypath_id;
	bool active;
	
	enum{ATTACK_OVER, ATTACKING, WAYPATH};
	// 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( active, 2 );
		SAVE_VARIABLE( waypath_id, 3 );
	}

	void Created (GameObject * obj)
	{
		Commands->Enable_Enemy_Seen( obj, true);
		attacking = true;
		active = false;
		waypath_id = Get_Int_Parameter("Waypath_ID");
	}

	void Custom( GameObject * obj, int type, int param, GameObject * sender ) 
	{
		ActionParamsStruct params;

		if ( type == M07_CUSTOM_ACTIVATE ) 
		{
			attacking = false;

			params.Set_Basic( this, INNATE_PRIORITY_ENEMY_SEEN + 5, WAYPATH );
			params.Set_Movement( Vector3(0,0,0), 1.0f, 1.5f );
			params.WaypathID = waypath_id;
			Commands->Action_Attack( obj, params );
		}
	}

	void Action_Complete(GameObject * obj, int action_id, ActionCompleteReason reason)
	{
		ActionParamsStruct params;
		
		if(action_id == WAYPATH && reason == ACTION_COMPLETE_NORMAL)
		{
			attacking = false;
		}
		
	}

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

		if(!active)
		{
			active = true;
			Commands->Send_Custom_Event (obj, obj, M07_CUSTOM_ACTIVATE, 0.0f);
		}
		if(!attacking)
		{
			attacking = true;

			params.Set_Basic( this, INNATE_PRIORITY_ENEMY_SEEN + 5, WAYPATH );
			params.Set_Movement( Vector3(0,0,0), 0.0f, 1.5f );
			params.Set_Attack (enemy, 250.0f, 0.0f, 0);
			params.WaypathID = waypath_id;
			Commands->Modify_Action (obj, WAYPATH, params);

			Commands->Start_Timer (obj, this, 5.0f, ATTACK_OVER);
		}
	}

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

		if(!active)
		{
			active = true;
			Commands->Send_Custom_Event (obj, obj, M07_CUSTOM_ACTIVATE, 0.0f);
		}

		if(!attacking && (Commands->Get_Player_Type(damager) != SCRIPT_PLAYERTYPE_NOD))
		{
			attacking = true;

			params.Set_Basic( this, INNATE_PRIORITY_ENEMY_SEEN + 5, WAYPATH );
			params.Set_Movement( Vector3(0,0,0), 0.0f, 1.5f );
			params.Set_Attack (damager, 250.0f, 0.0f, 0);
			params.WaypathID = waypath_id;
			Commands->Modify_Action (obj, WAYPATH, 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;

			params.Set_Basic( this, INNATE_PRIORITY_ENEMY_SEEN + 5, WAYPATH );
			params.Set_Movement( Vector3(0,0,0), 1.0f, 1.5f );
			params.WaypathID = waypath_id;
			Commands->Modify_Action (obj, WAYPATH, params);

		}
		
	}

};

DECLARE_SCRIPT(M07_Custom_Activate, "Object1_ID=0:int, Object2_ID=0:int, Object3_ID=0:int,")
{
		
	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;
			int object1_id = Get_Int_Parameter("Object1_ID");
			int object2_id = Get_Int_Parameter("Object2_ID");
			int object3_id = Get_Int_Parameter("Object3_ID");

			if(object1_id != 0)
			{
				Commands->Send_Custom_Event (obj, Commands->Find_Object(object1_id), M07_CUSTOM_ACTIVATE, 1, 0.0f);
			}
			if(object2_id != 0)  
			{
				Commands->Send_Custom_Event (obj, Commands->Find_Object(object2_id), M07_CUSTOM_ACTIVATE, 1, 0.0f);
			}
			if(object3_id != 0)
			{
				Commands->Send_Custom_Event (obj, Commands->Find_Object(object3_id), M07_CUSTOM_ACTIVATE, 1, 0.0f);
			}
			
		}
	}
};

DECLARE_SCRIPT(M07_Bridge_Overlook_Apache, "")
{
	bool attacking;

	enum{WAYPATH, INN_PATROL, 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)
	{
		ActionParamsStruct params;

		attacking = false;
		Commands->Disable_Physical_Collisions(obj);

		params.Set_Basic( this, INNATE_PRIORITY_ENEMY_SEEN + 5, WAYPATH );
		params.Set_Movement( Vector3(0,0,0), RUN, 1.5f );
		params.WaypathID = 109145;
		Commands->Action_Goto( obj, params );
	}

	void Action_Complete(GameObject * obj, int action_id, ActionCompleteReason reason)
	{
		ActionParamsStruct params;

		if (action_id == WAYPATH && reason == ACTION_COMPLETE_NORMAL)
		{
			Commands->Enable_Enemy_Seen(obj, true);

			params.Set_Basic( this, INNATE_PRIORITY_ENEMY_SEEN + 5, INN_PATROL );
			params.Set_Movement( Vector3(0,0,0), RUN, 1.5f );
			params.WaypathID = 109151;
			Commands->Action_Attack( obj, params );
		}
	}

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

		if(!attacking)
		{
			attacking = true;

			params.Set_Basic( this, INNATE_PRIORITY_ENEMY_SEEN + 5, INN_PATROL );
			params.Set_Movement( Vector3(0,0,0), RUN, 1.5f );
			params.Set_Attack (enemy, 250.0f, 0.0f, 1);
			params.WaypathID = 109151;
			Commands->Modify_Action (obj, INN_PATROL, 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(M07_SSM_Unit, "")
{
	
	enum{GO_STAR};

	// 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)
	{
		Commands->Enable_Hibernation(obj, false);
		Commands->Set_Innate_Aggressiveness(obj, 1.0f );
		Commands->Set_Innate_Take_Cover_Probability(obj, 0.0f );

		ActionParamsStruct params;
		params.Set_Basic(this, INNATE_PRIORITY_ENEMY_SEEN - 5, GO_STAR);
		params.Set_Movement(STAR, RUN, 1.0f);
		Commands->Action_Goto(obj, params);
	}

	void Sound_Heard(GameObject * obj, const CombatSound &sound)
	{
		ActionParamsStruct params;

		const char * preset_name = Commands->Get_Preset_Name( obj );

		if (sound.Type == M07_SSM_DAMAGED && ( ::strncmp( "Nod_Engineer_0", preset_name, ::strlen( "Nod_Engineer_0" ) ) == 0 ))
		{
			params.Set_Basic( this, INNATE_PRIORITY_ENEMY_SEEN + 5, 100 );
			params.Set_Movement( Vector3(0,0,0), RUN, 5.5f );
			params.Set_Attack (sound.Creator, 250.0f, 0.0f, 0);
			params.AttackCheckBlocked = false;
			Commands->Action_Attack( obj, params );
		}
		if (sound.Type == M07_SSM_FIXED && ( ::strncmp( "Nod_Engineer_0", preset_name, ::strlen( "Nod_Engineer_0" ) ) == 0 ))
		{
			Commands->Action_Reset(obj, INNATE_PRIORITY_ENEMY_SEEN + 5);
		}
	}

};

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

	void Created(GameObject * obj)
	{
		Commands->Innate_Disable(obj);		
	}

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

};



DECLARE_SCRIPT (M07_Park_Stealth_Tank, "")	
{
	float health;

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

	void Created(GameObject * obj)
	{
		health = Commands->Get_Health(obj);
	}

	void Damaged(GameObject * obj, GameObject * damager, float amount)
	{
		if(health > (.2 * Commands->Get_Max_Health(obj)))
		{
			float damage = health - Commands->Get_Health(obj);
			damage *= 0.5f;
			health -= damage;
			Commands->Set_Health(obj, health);
		}
	}

	void Killed (GameObject * obj, GameObject * killer)
	{
		// Defeat Stealth Tank.
		Commands->Send_Custom_Event(obj, Commands->Find_Object(100657), 707, 1, 0.0f);
	}
};

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

	void Created (GameObject * obj)
	{
		
	}

	void Killed (GameObject * obj, GameObject * killer)
	{
		Commands->Create_Explosion("Explosion_Rocket_SSM", Commands->Get_Position(obj)); 
		Commands->Send_Custom_Event(obj, Commands->Find_Object(100781), M07_SSM_CRATE_KILLED, 1, 0.0f);
	}
};

DECLARE_SCRIPT(M07_DataDisc_01_DLS, "")//
{
	void Custom( GameObject * obj, int type, int param, GameObject * sender ) 
	{
		if ( type == CUSTOM_EVENT_POWERUP_GRANTED ) 
		{
			// Reveal Stealth Tank
			Commands->Reveal_Encyclopedia_Vehicle(33);
		}
	}
};

DECLARE_SCRIPT(M07_DataDisc_02_DLS, "")//
{
	void Custom( GameObject * obj, int type, int param, GameObject * sender ) 
	{
		if ( type == CUSTOM_EVENT_POWERUP_GRANTED ) 
		{
			// Reveal Stealth Soldier
			Commands->Reveal_Encyclopedia_Character(47);
		}
	}
};

DECLARE_SCRIPT(M07_Hotwire_Help, "")
{

	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;
			
			// Hotwire
			if(Commands->Find_Object(100658))
			{
				// Hotwire here, I need help!  Now!  Anyone!?
				const char *conv_name = ("M07_CON028");
				int conv_id = Commands->Create_Conversation (conv_name, 100.0f, 200.0f, false);
				Commands->Join_Conversation(NULL, conv_id, false, true);
				Commands->Start_Conversation (conv_id, 100658);
				
			}
				
		}
	}
	
};

DECLARE_SCRIPT(M07_Hotwire_Dead, "")
{

	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;
			
			// Hotwire
			if(Commands->Find_Object(100658))
			{
				// This is Hotwire, I can't hold this position! Requesting - oh great! <gunfire and static>
				const char *conv_name = ("M07_CON029");
				int conv_id = Commands->Create_Conversation (conv_name, 100.0f, 200.0f, false);
				Commands->Join_Conversation(NULL, conv_id, false, true);
				Commands->Start_Conversation (conv_id, 100658);
				Commands->Monitor_Conversation (obj, conv_id);	
			}
				
		}
	}

	void Action_Complete(GameObject * obj, int action_id, ActionCompleteReason reason)
	{
		if(reason == ACTION_COMPLETE_CONVERSATION_ENDED)
		{
			if(action_id == 100658)
			{
				// Hotwire Killed
				Commands->Set_HUD_Help_Text ( IDS_M05DSGN_DSGN0174I1DSGN_TXT, TEXT_COLOR_OBJECTIVE_PRIMARY );
				// Protect Team Members
				Commands->Send_Custom_Event(obj, Commands->Find_Object(100657), 709, 2, 0.0f);
				
			}

		}
	}

};


