//------------------------------
//AI Debugging functions

function aics()
{
	aidebug(-1);
   exec("scripts/ai.cs");
}

function ga(%pack)
{
	$testcheats = 1;
	giveall();
	switch$ (%pack)
	{
		case "repair":
			LocalClientConnection.player.setInventory(RepairPack, 1);
		case "charge":
			LocalClientConnection.player.setInventory(SatchelCharge, 1);
		case "energy":
			LocalClientConnection.player.setInventory(EnergyPack, 1);
		case "cloak":
			LocalClientConnection.player.setInventory(CloakingPack, 1);
		case "shield":
			LocalClientConnection.player.setInventory(ShieldPack, 1);
		case "jammer":
			LocalClientConnection.player.setInventory(SensorJammerPack, 1);
	}
}

function aiga(%client)
{
   $TestCheats = 1;
   %player = %client.player;
   %player.setInventory(RepairKit,999);
   %player.setInventory(Mine,999);
   %player.setInventory(MineAir,999);
   %player.setInventory(MineLand,999);
   %player.setInventory(MineSticky,999);
   %player.setInventory(Grenade,999);
   %player.setInventory(FlashGrenade,999);
   %player.setInventory(FlareGrenade,999);
   %player.setInventory(ConcussionGrenade,999);
   %player.setInventory(CameraGrenade, 999);
   %player.setInventory(Blaster,1);
   %player.setInventory(Plasma,1);
   %player.setInventory(Disc,1);
   %player.setInventory(Chaingun, 1);
   %player.setInventory(GrenadeLauncher, 1);
   %player.setInventory(MissileLauncher, 1);
   %player.setInventory(Mortar, 1);
   %player.setInventory(MissileLauncherAmmo, 999);
   %player.setInventory(GrenadeLauncherAmmo, 999);
   %player.setInventory(MortarAmmo, 999);
   %player.setInventory(PlasmaAmmo,999);  
   %player.setInventory(ChaingunAmmo, 999);
   %player.setInventory(DiscAmmo, 999);
   %player.setInventory(TargetingLaser, 1);
   %player.setInventory(ELFGun, 1);
   %player.setInventory(SniperRifle, 1);
   %player.setInventory(ShockLance, 1);
}

function aiCome(%from, %to)
{
	if (%to $= "")
		%to = 2;
	%from.player.setTransform(%to.player.getTransform());
}

function findBotWithInv(%item)
{
   for (%i = 0; %i < ClientGroup.getCount(); %i++)
   {
      %cl = ClientGroup.getObject(%i);
      if (isObject(%cl.player) && %cl.player.getInventory(%item))
         echo(%cl @ ":" SPC getTaggedString(%cl.name) SPC "has item" SPC %item);
   }
}

function listInv(%client)
{
   %player = %client.player;
   %count = %player.getInventory(RepairKit);
	if (%count > 0)
		echo("RepairKit: " @ %count);
   %count = %player.getInventory(Mine);
	if (%count > 0)
		echo("Mine: " @ %count);
   %count = %player.getInventory(MineAir);
	if (%count > 0)
		echo("MineAir: " @ %count);
   %count = %player.getInventory(MineLand);
	if (%count > 0)
		echo("MineLand: " @ %count);
   %count = %player.getInventory(MineSticky);
	if (%count > 0)
		echo("MineSticky: " @ %count);
   %count = %player.getInventory(Grenade);
	if (%count > 0)
		echo("Grenade: " @ %count);
   %count = %player.getInventory(FlashGrenade);
	if (%count > 0)
		echo("FlashGrenade: " @ %count);
   %count = %player.getInventory(FlareGrenade);
	if (%count > 0)
		echo("FlareGrenade: " @ %count);
   %count = %player.getInventory(ConcussionGrenade);
	if (%count > 0)
		echo("ConcussionGrenade: " @ %count);
	%count = %player.getInventory(CameraGrenade);
	if (%count > 0)
		echo("CameraGrenade: " @ %count);
   %count = %player.getInventory(Blaster);
	if (%count > 0)
		echo("Blaster: " @ %count);
   %count = %player.getInventory(Plasma);
	if (%count > 0)
		echo("Plasma: " @ %count);
   %count = %player.getInventory(Disc);
	if (%count > 0)
		echo("Disc: " @ %count);
   %count = %player.getInventory(Chaingun);
	if (%count > 0)
		echo("Chaingun: " @ %count);
   %count = %player.getInventory(GrenadeLauncher);
	if (%count > 0)
		echo("GrenadeLauncher: " @ %count);
   %count = %player.getInventory(MissileLauncher);
	if (%count > 0)
		echo("MissileLauncher: " @ %count);
   %count = %player.getInventory(Mortar);
	if (%count > 0)
		echo("Mortar: " @ %count);
   %count = %player.getInventory(MissileLauncherAmmo);
	if (%count > 0)
		echo("MissileLauncherAmmo: " @ %count);
   %count = %player.getInventory(GrenadeLauncherAmmo);
	if (%count > 0)
		echo("GrenadeLauncherAmmo: " @ %count);
   %count = %player.getInventory(MortarAmmo);
	if (%count > 0)
		echo("MortarAmmo: " @ %count);
   %count = %player.getInventory(PlasmaAmmo);
	if (%count > 0)
		echo("PlasmaAmmo: " @ %count);
   %count = %player.getInventory(ChaingunAmmo);
	if (%count > 0)
		echo("ChaingunAmmo: " @ %count);
   %count = %player.getInventory(DiscAmmo);
	if (%count > 0)
		echo("DiscAmmo: " @ %count);
   %count = %player.getInventory(TargetingLaser);
	if (%count > 0)
		echo("TargetingLaser: " @ %count);
   %count = %player.getInventory(ELFGun);
	if (%count > 0)
		echo("ELFGun: " @ %count);
   %count = %player.getInventory(SniperRifle);
	if (%count > 0)
		echo("SniperRifle: " @ %count);
   %count = %player.getInventory(ShockLance);
	if (%count > 0)
		echo("ShockLance: " @ %count);
   %count = %player.getInventory(RepairPack);
	if (%count > 0)
		echo("RepairPack: " @ %count);
   %count = %player.getInventory(EnergyPack);
	if (%count > 0)
		echo("EnergyPack: " @ %count);
   %count = %player.getInventory(ShieldPack);
	if (%count > 0)
		echo("ShieldPack: " @ %count);
   %count = %player.getInventory(CloakingPack);
	if (%count > 0)
		echo("CloakingPack: " @ %count);
   %count = %player.getInventory(SensorJammerPack);
	if (%count > 0)
		echo("SensorJammerPack: " @ %count);
}

function createAIDebugDlg()
{
	if (!isObject("AIDebugViewProfile"))
	{
		new GuiControlProfile("AIDebugViewProfile")
		{
		   fontType = "Arial Bold";
		   fontSize = 12;
		   fontColor = "255 0 255";
		   autoSizeWidth = false;
		   autoSizeHeight = false;
			modal = "false";
		};

		new GuiControl(aiDebugDlg)
		{
			profile = "GuiDefaultProfile";
			horizSizing = "width";
			vertSizing = "height";
			position = "0 0";
			extent = "640 480";
			minExtent = "8 8";
			visible = "True";
			setFirstResponder = "True";
			helpTag = "0";
		   
			new DebugView(aiDebug)
		   {
				profile = "AIDebugViewProfile";
				horizSizing = "width";
				vertSizing = "height";
				position = "8 8";
				extent = "624 464";
				minExtent = "8 8";
				visible = "True";
				setFirstResponder = "False";
				helpTag = "0";
			};
		};
	}
}

function ToggleAIDebug(%make)
{
   if (%make)
   {
      if ($AIDebugActive)
      {
         Canvas.popDialog(aiDebugDlg);
         $AIDebugActive = false;
      }
      else
      {
			createAIDebugDlg();
	      Canvas.pushDialog(aiDebugDlg, 70);
         $AIDebugActive = true;
      }
   }
}

GlobalActionMap.bind(keyboard, "ctrl tilde", "ToggleAIDebug");

//function showFPS()
//{
//	if (isObject(aiDebug))
//	   aiDebug.setText(0, "FPS:" SPC $fps::real SPC "                                              $patch1Avg" SPC $Patch1Avg);
//   schedule(1000, 0, "ShowFPS");
//}

function aiDebug(%client)
{
   if ($AIDebugTeam < 0 && $AIDebugClient < 0)
	{
		createAIDebugDlg();
      Canvas.pushDialog(aiDebugDlg, 70);
	}
      
   $AIDebugClient = %client;
   $AIDebugTeam = -1;
   
   if (%client > 0)
   {
		createAIDebugDlg();
      Canvas.pushDialog(aiDebugDlg, 70);
      aiDebug.clearText();
		$AIDebugActive = true;
   }
   else
	{
		$AIDebugActive = false;
      Canvas.popDialog(aiDebugDlg);
	}
}

function aiDebugText(%client, %line, %text)
{
   if (%client != $AIDebugClient)
      return;
      
   aiDebug.setText(%line, %text);
}

function aiDebugLine(%client, %startPt, %endPt, %color)
{
   if (%client != $AIDebugClient)
      return;
      
   aiDebug.addLine(%startPt, %endPt, %color);
}

function aiDebugClearLines(%client)
{
   if (%client != $AIDebugClient)
      return;
      
   aiDebug.clearLines();
}

function aiGetTaskDesc(%client)
{
	if (!%client.isAIControlled())
		%returnStr = getTaggedString(%client.name) @ ": " @ "HUMAN";

   else if (%client.objective > 0)
   {
      if (%client.objective.description !$= "")
         %returnStr = %client @ " " @ getTaggedString(%client.name) @ ": " @ %client.objective.description;
      else
         %returnStr = %client @ " " @ getTaggedString(%client.name) @ ": " @ %client.objective @ " NO DESC";
   }
   else
	{
		%curTask = %client.getTaskName();
		%curStep = %client.getStepName();
		if (%curTask !$= "")
	      %returnStr = %client @ " " @ getTaggedString(%client.name) @ ": " @ %curTask;
		else if (%curStep !$= "")
	      %returnStr = %client @ " " @ getTaggedString(%client.name) @ ": " @ %curStep;
		else
	      %returnStr = getTaggedString(%client.name) @ ": " @ "UNKNOWN";
	}

	//add in some color info
	if (Game.numTeams != 2)
		%color = "E";
	else if (%client.team == LocalClientConnection.team)
		%color = "F";
	else
		%color = "E";
      
   return %color @ ":" @ %returnStr;
}

$AIDebugTeam = -1;
$AIDebugClient = -1;
$AIDebugTasks = true;
Canvas.popDialog(aiDebugDlg);
$AIDebugActive = false;

function aiEchoObjective(%objective, %lineNum, %group)
{
	%clientAssigned = false;
	%indent = "    ";
	if (%group > 0)
	{
		%indent = "        ";
	   if (%group.clientLevel[1] > 0 && %group.clientLevel[1].objective == %objective)
		{
	      %assigned1 = getTaggedString(%group.clientLevel[1].name) @ ":" @ %group.clientLevel[1].objectiveWeight;
			%clientAssigned = true;
		}
	   else
	      %assigned1 = "           ";
	   if (%group.clientLevel[2] > 0 && %group.clientLevel[2].objective == %objective)
		{
	      %assigned2 = getTaggedString(%group.clientLevel[2].name);
			%clientAssigned = true;
		}
	   else
	      %assigned2 = "           ";
	}
	else
	{
	   if (%objective.clientLevel[1] > 0)
		{
	      %assigned1 = getTaggedString(%objective.clientLevel[1].name) @ ":" @ %objective.clientLevel[1].objectiveWeight;
			%clientAssigned = true;
		}
	   else
	      %assigned1 = "           ";
	   if (%objective.clientLevel[2] > 0)
		{
	      %assigned2 = getTaggedString(%objective.clientLevel[2].name);
			%clientAssigned = true;
		}
	   else
	      %assigned2 = "           ";
	}
      
   %text = %indent @ %objective @ "  " @ %objective.weightLevel1 @ "  " @ %assigned1 @ "  " @ %assigned2 @ "  " @ %objective.description;
	if (%clientAssigned)
		%color = "0 0 1";
	else
		%color = "1 0 1";
   aiDebug.setText(%lineNum, %text, %color);
}

function aiDebugQ(%team, %showTasks)
{
   if ($AIDebugTeam < 0 && $AIDebugClient < 0)
	{
		createAIDebugDlg();
      Canvas.pushDialog(aiDebugDlg, 70);
		$AIDebugActive = true;
	}
   
   $AIDebugTeam = %team;
   $AIDebugClient = -1;
   
   if ($AIDebugTeam < 0)
   {
      Canvas.popDialog(aiDebugDlg);
		$AIDebugActive = false;
      return;
   }

	if (%showTasks $= "")
		%showTasks = $AIDebugTasks;
	else
		$AIDebugTasks = %showTasks;
      
   aiDebug.clearText();

	if (! %showTasks)
		return;

	//make sure we have a valid objectiveQ
	if (!isObject($ObjectiveQ[%team]))
		return;

	%timeStamp = getSimTime();
	%lineNum = 1;
   %count = $ObjectiveQ[%team].getCount();

	//clear the time stamps from all groups
   for (%i = 0; %i < %count; %i++)
   {
      %objective = $ObjectiveQ[%team].getObject(%i);
		if (%objective.group > 0)
			%objective.group.debugStamp = 0;
	}

	//now loop through and echo out all the objectives...
   for (%i = 0; %i < %count; %i++)
   {
      %objective = $ObjectiveQ[%team].getObject(%i);

		//if the objective is part of a group, echo out the entire group first
		if (%objective.group > 0)
		{
			%group = %objective.group;
			if (%group.debugStamp != %timeStamp)
			{
				%group.debugStamp = %timeStamp;
				%grpCount = %group.getCount();

				//first print out the group label
		      %text = %group @ " GROUP: " @ %group.getName();
		      aiDebug.setText(%lineNum, %text);
				%lineNum++;

				//now loop through and print out the grouped objectives in the order they appear in the main list
				for (%j = 0; %j < %count; %j++)
				{
					//print them in the order they appear in the main list
					%obj = $ObjectiveQ[%team].getObject(%j);
					if  (%obj.group == %group)
					{
						aiEchoObjective(%obj, %lineNum, %group);
						%lineNum++;
					}
				}
			}
		}

		else
		{
			aiEchoObjective(%objective, %lineNum, 0);
			%lineNum++;
		}
   }
}

//------------------------------

function aioTest()
{
	//clear out the objective Q's
	$ObjectiveQ[0].clear();
	$ObjectiveQ[1].clear();
	$ObjectiveQ[2].clear();

   ///////////////////////////////
   //     team 1 objectives     //
   ///////////////////////////////
//	%newObjective = new AIObjective(AIORepairObject) {
//		position = "0 0 0";
//		rotation = "1 0 0 0";
//		scale = "1 1 1";
//		description = "Repair the generator";
//		targetObject = "Team0GeneratorLarge1";
//		targetClientId = "-1";
//		targetObjectId = nameToId("Team0GeneratorLarge1");
//		location = "0 0 0";
//		weightLevel1 = "3200";
//		weightLevel2 = "1600";
//		weightLevel3 = "0";
//		weightLevel4 = "0";
//		offense = "0";
//		defense = "1";
//		equipment = "RepairPack";
//		buyEquipmentSet = "HeavyRepairSet";
//		issuedByHuman = "0";
//		issuingClientId = "-1";
//		forceClientId = "-1";
//		locked = "0";
//	};
//   $ObjectiveQ[0].add(%newObjective);
//
//	%newObjective = new AIObjective(AIODefendLocation) {
//		position = "-178 -156 120";
//		rotation = "1 0 0 0";
//		scale = "1 1 1";
//		description = "Defend our generator";
//		targetObject = "Team0GeneratorLarge1";
//		targetClientId = "-1";
//		targetObjectId = "-1";
//		location = "-178 -156 120";
//		weightLevel1 = "3900";
//		weightLevel2 = "2000";
//		weightLevel3 = "0";
//		weightLevel4 = "0";
//		offense = "0";
//		defense = "1";
//		desiredEquipment = "ShieldPack Plasma PlasmaAmmo";
//		buyEquipmentSet = "MediumShieldSet LightShieldSet HeavyShieldSet";
//		chat = "";
//		issuedByHuman = "0";
//		issuingClientId = "-1";
//		forceClientId = "-1";
//		locked = "1";
//			radius = "0";
//			team = "0";
//	};
//   $ObjectiveQ[0].add(%newObjective);

//	%newObjective = new AIObjective(AIODefendLocation) {
//		position = "0 0 0";
//		rotation = "1 0 0 0";
//		scale = "1 1 1";
//		description = "Defend the generator";
//		targetObject = "Team0GeneratorLarge1";
//		targetClientId = "-1";
//		targetObjectId = nameToId("Team0GeneratorLarge1");
//		location = "0 0 0";
//		weightLevel1 = "3100";
//		weightLevel2 = "1500";
//		weightLevel3 = "0";
//		weightLevel4 = "0";
//		offense = "0";
//		defense = "1";
//		desiredEquipment = "ShieldPack Plasma PlasmaAmmo";
//		buyEquipmentSet = "HeavyShieldSet";
//		issuedByHuman = "0";
//		issuingClientId = "-1";
//		forceClientId = "-1";
//		locked = "0";
//	};
//   $ObjectiveQ[0].add(%newObjective);
//
//   %newObjective = new AIObjective(AIOAttackLocation)
//                        {
//                           weightLevel1 = 2000;
//                           description = "Sniper";
//                           location = "50 218 95";
//                           offense = true;
//                           defense = false;
//                           equipment = "SniperRifle EnergyPack";
//									buyEquipmentSet = "LightEnergySniper";
//                        };
//   $ObjectiveQ[0].add(%newObjective);
//
//   %newObjective = new AIObjective(AIOLazeObject)
//                        {
//                           weightLevel1 = 10000;
//                           description = "Laze the enemy turret";
//                           targetObject = NameToId("Team1Turret");
//									targetClient = %client;	//note, used to store the task requester
//                           offense = true;
//                           equipment = "TargetingLaser";
//									buyEquipmentSet = "LightEnergySniper";
//                        };
//   $ObjectiveQ[0].add(%newObjective);
//
//   %newObjective = new AIObjective(AIOMortarObject)
//                        {
//                           weightLevel1 = $AIWeightMortarTurret[1];
//                           weightLevel2 = $AIWeightMortarTurret[2];
//                           description = "Mortar the enemy turret";
//									targetObject = "Team1TurretBaseLarge1";
//									targetObjectId = nameToId("Team1TurretBaseLarge1");
//                           location = "";
//                           offense = true;
//                           defense = false;
//                           equipment = "Mortar MortarAmmo";
//									buyEquipmentSet = "HeavyShieldSet";
//                        };
//   $ObjectiveQ[0].add(%newObjective);
//   
//   %newObjective = new AIObjective(AIORepairObject)
//                        {
//                           weightLevel1 = $AIWeightRepairTurret[1];
//                           weightLevel2 = $AIWeightRepairTurret[2];
//                           description = "Repair the turret";
//                           targetObject = NameToId("Team0Turret");
//                           location = "";
//                           offense = false;
//                           defense = true;
//                           equipment = "RepairPack";
//                        };
//   $ObjectiveQ[0].add(%newObjective);
//   
//   %newObjective = new AIObjective(AIOAttackObject)
//                        {
//                           weightLevel1 = $AIWeightAttackGenerator[1];
//                           weightLevel2 = $AIWeightAttackGenerator[2];
//                           description = "Attack the enemy generator";
//                           targetObject = NameToId("Team1Generator");
//                           location = "";
//                           offense = true;
//                           defense = false;
//                           equipment = "plasma plasmaAmmo";
//									buyEquipmentSet = "HeavyShieldSet";
//                        };
//   $ObjectiveQ[0].add(%newObjective);
//   
//   %newObjective = new AIObjective(AIORepairObject)
//                        {
//                           //weightLevel1 = $AIWeightRepairGenerator[1];
//                           weightLevel1 = 10000;
//                           weightLevel2 = $AIWeightRepairGenerator[2];
//                           description = "Repair the generator";
//                           targetObject = NameToId("Team0Generator");
//                           location = "";
//                           offense = false;
//                           defense = true;
//                           equipment = "RepairPack";
//                        };
//   $ObjectiveQ[0].add(%newObjective);
//   
//   %newObjective = new AIObjective(AIODefendLocation)
//                        {
//                           weightLevel1 = $AIWeightDefendGenerator[1];
//                           weightLevel2 = $AIWeightDefendGenerator[2];
//                           description = "Defend our generator";
//                           //targetObject = NameToId("Team0Generator");
//                           location = "-20 -292 46";
//                           offense = false;
//                           defense = true;
//                        };
//   $ObjectiveQ[0].add(%newObjective);
// 	%newObjective = new AIObjective(AIOEscortPlayer)
// 	{
// 		weightLevel1 = $AIWeightEscortOffense[1];
// 		weightLevel2 = $AIWeightEscortOffense[2];
// 		targetClientId = 2;
// 		description = "Escort " @ getTaggedString(LocalClientConnection.name);
// 		offense = true;
// 		desiredEquipment = "EnergyPack";
// 		buyEquipmentSet = "LightEnergyELF";
// 	};
//    $ObjectiveQ[1].add(%newObjective);
   
   ///////////////////////////////
   //     team 2 objectives     //
   ///////////////////////////////
//	%newObjective = new AIObjective(AIODefendLocation) {
//		position = "196 461 181";
//		rotation = "1 0 0 0";
//		scale = "1 1 1";
//		description = "Missile defense";
//		targetObject = "";
//		targetClientId = "-1";
//		targetObjectId = "-1";
//		location = "196 461 181";
//		weightLevel1 = "3900";
//		weightLevel2 = "2000";
//		weightLevel3 = "0";
//		weightLevel4 = "0";
//		offense = "0";
//		defense = "1";
//		equipment = "MissileLauncher";
//		buyEquipmentSet = "MediumMissileSet HeavyMissileSet";
//		chat = "";
//		issuedByHuman = "0";
//		issuingClientId = "-1";
//		forceClientId = "-1";
//		locked = "1";
//			radius = "0";
//			team = "0";
//	};
//   $ObjectiveQ[2].add(%newObjective);
// 
//    %newObjective = new AIObjective(AIOAttackLocation)
//                         {
//                            weightLevel1 = 12000;
//                            description = "Sniper";
//                            location = "-164 381 134";
//                            offense = true;
//                            defense = false;
//                            equipment = "SniperRifle EnergyPack";
// 									buyEquipmentSet = "LightEnergySniper";
//                         };
//    $ObjectiveQ[2].add(%newObjective);
}

function aiGo(%count)
{
	%offense = true;
	for (%i = 0; %i < %count; %i++)
	{
		aiConnect(friendly @ %i, 1, 0.5, %offense);
		aiConnect(enemy @ %i, 2, 0.5, %offense);
		%offense = !%offense;
	}
}

function addBots(%count)
{
   if(%count > 0)
   {
      %count++;
      while(%count--)
         aiConnect("dude " @ %count);
   }
}

function aiGoTest(%count, %team)
{
	if (%team <= 0)
		%team = 1;

	%offense = false;
	for (%i = 0; %i < %count; %i++)
	{
		if (%offense)
			aiConnect(Offense @ %i, %team, 0.5, true);
		else
			aiConnect(Defense @ %i, %team, 0.5, false);

		%offense = !%offense;
	}
}

//------------------------------

function aiTest()
{
   //find/create an enemy
   %count = ClientGroup.getCount();
   if (%count <= 1)
   {
      %enemyCl = aiConnect(test, 1, 0.5, false);
   }
   else
      %enemyCl = ClientGroup.getObject(1);
      
   //create the objective
   if (! $testObjective)
   {
      $testObjective = new AIObjective(AIOAttackPlayer)
                           {
                              weightLevel1 = 10000;
                              description = "Attack the human!";
                              targetClient = nameToId(LocalClientConnection);
                              location = "";
                              offense = true;
                              defense = true;
                           };
      MissionCleanup.add($testObjective);
   }
   
   //set the enemy inventory
   %enemyPl = %enemyCl.player;
   %enemyPl.setInventory(RepairKit,1);
   %enemyPl.setInventory(Grenade,5);
   //%enemyPl.setInventory(Blaster,1);
   //%enemyPl.setInventory(Plasma,1);
   %enemyPl.setInventory(Disc,1);
   %enemyPl.setInventory(Chaingun, 1);
   %enemyPl.setInventory(GrenadeLauncher, 1);
   //%enemyPl.setInventory(Mortar, 1);
   %enemyPl.setInventory(ChaingunAmmo, 100);
   %enemyPl.setInventory(DiscAmmo, 15);
   %enemyPl.setInventory(PlasmaAmmo,20);  
   %enemyPl.setInventory(GrenadeLauncherAmmo, 10);
   %enemyPl.setInventory(MortarAmmo, 10);
   
	%enemyPl.setDamageLevel(0.0);
   
   //set the target inventory
   %targetCl = 2;
   %targetPl = %targetCl.player;
   %targetPl.setInventory(RepairKit,1);
   %targetPl.setInventory(Grenade,5);
   //%targetPl.setInventory(Blaster,1);
   //%targetPl.setInventory(Plasma,1);
   %targetPl.setInventory(Disc,1);
   %targetPl.setInventory(Chaingun, 1);
   %targetPl.setInventory(GrenadeLauncher, 1);
   //%targetPl.setInventory(Mortar, 1);
   %targetPl.setInventory(ChaingunAmmo, 100);
   %targetPl.setInventory(DiscAmmo, 15);
   %targetPl.setInventory(PlasmaAmmo,20);  
   %targetPl.setInventory(GrenadeLauncherAmmo, 10);
   %targetPl.setInventory(MortarAmmo, 10);
	%targetPl.setDamageLevel(0.0);
   
   //now force the attack objective
   AIForceObjective(%enemyCl, $testObjective);
   %enemyCl.stepEngage(2);
}

function aibump()
{
	%t1 = "-348 -470 142 0 0 1 0";
	%t2 = "-347 -453 142 0 0 1 3.14";

	%t3 = "-348 -462 142 0 0 1 0";
	2.player.setTransform(%t3);

	3.player.setTransform(%t1);
	4.player.setTransform(%t2);

	3.stepMove(%t2, 0.1);
	4.stepMove(%t1, 0.1);
}

function aibump2()
{
	%t1 = "-345.082 -464.229 142 0 0 1 0";
	%t2 = "-347 -453 142 0 0 1 3.14";
	%t3 = "-347.22 -463.439 142 0 0 1 1.89";
	2.player.setTransform(%t3);

	3.player.setTransform(%t1);
	3.stepMove(%t2, 0.1);
}

function aiTestDeploys(%client, %objective)
{
	//if we're just starting the test, unassign the client
	if (!isObject(%objective))
	{
		error("DEBUG begin testing deploy objectives!");
		$AITestDeployObjective = -1;
		aiUnassignClient(%client);
	}

	//if the client isn't still on the test objective, choose the next one
	if (%client.objective != $AITestDeployObjective)
	{
		//if there's a corresponding "repairObjective" for the deploy, then the deploy succeeded
		if (isobject($AITestDeployObjective))
		{
			if (!isObject($AITestDeployObjective.repairObjective))
				$AITestDeployObjective.isInvalid = true;
		}

		//loop through all the objectives, looking for next deploy ones...
		%foundCurrent = !isObject($AITestDeployObjective);
		%nextObjective = -1;
		%found = false;
		%count = $ObjectiveQ[%client.team].getCount();
		for (%i = 0; %i < %count && !%found; %i++)
		{
			%obj = $ObjectiveQ[%client.team].getObject(%i);

			//see if the objective is a group...
			if (%obj.getClassName() !$= "AIObjective")
			{
				%grpCount = %obj.getCount();
				for (%j = 0; %j < %grpCount && !%found; %j++)
				{
					%grpObj = %obj.getObject(%j);
					if (%grpObj.getName() $= "AIODeployEquipment")
					{
						if (%foundCurrent)
						{
							%nextObjective = %grpObj;
							%found = true;
						}
						else if (%grpObj == $AITestDeployObjective)
							%foundCurrent = true;
					}
				}
			}
			else if (%obj.getName() $= "AIODeployEquipment")
			{
				//see if this is the next one
				if (%foundCurrent)
				{
					%nextObjective = %obj;
					%found = true;
				}
				else if (%obj == $AITestDeployObjective)
					%foundCurrent = true;
			}
		}

		if (isObject(%nextObjective))
		{
			//kill all the turrets for your team...
			while (isObject($AIRemoteTurretSet.getObject(0)))
				$AIRemoteTurretSet.getObject(0).delete();

			//remove any associated repairobjective from this deploy
			if (isObject(%nextObjective.repairObjective))
			{
				AIClearObjective(%nextObjective.repairObjective);
				%nextObjective.repairObjective.delete();
				%nextObjective.repairObjective = "";
			}

			//assign the bot to the objective...
			error("DEBUG testing objective:" SPC %nextObjective);
			$AITestDeployObjective = %nextObjective;
			AIUnassignClient(%client);
		   AIForceObjective(%client, $AITestDeployObjective, 10000);
		}
		else
		{
			error("DEBUG testing of deploy objectives is complete:");
			%count = $ObjectiveQ[%client.team].getCount();
			for (%i = 0; %i < %count && !%found; %i++)
			{
				%obj = $ObjectiveQ[%client.team].getObject(%i);

				//see if the objective is a group...
				if (%obj.getClassName() !$= "AIObjective")
				{
					%grpCount = %obj.getCount();
					for (%j = 0; %j < %grpCount && !%found; %j++)
					{
						%grpObj = %obj.getObject(%j);
						if (%grpObj.getName() $= "AIODeployEquipment")
						{
							if (%grpObj.isInvalid)
								error(%grpObj SPC "is invalid.");
							else
								error(%grpObj SPC "passed.");
						}
					}
				}
				else if (%obj.getName() $= "AIODeployEquipment")
				{
					if (%obj.isInvalid)
						error(%obj SPC "is invalid.");
					else
						error(%obj SPC "passed.");
				}
			}
			return;
		}
	}

	//schedule the next call to see if we're still deploying...
	schedule(2000, %client.player, "aiTestDeploys", %client, $AITestDeployObjective);
}

//-----------------------------------------------------------------------------
//AI test pilot task
$TestPilotHeadings[0] = "203 -59 120";
$TestPilotHeadings[1] = "52 10 120";
$TestPilotHeadings[2] = "-112 125 120";
$TestPilotHeadings[3] = "-195 219 120";
$TestPilotHeadings[4] = "-198 323 120";
$TestPilotHeadings[5] = "-38 423 120";
$TestPilotHeadings[6] = "84 445 120";
$TestPilotHeadings[7] = "290 382 120";
$TestPilotHeadings[8] = "385 259 120";
$TestPilotHeadings[9] = "255 6 120";
$TestPilotHeadings[10] = "219 -49 120";
$TestPilotHeadings[11] = "222 -168 120";

function AITestPilot::assume(%task, %client)
{
   %task.setWeightFreq(30);
   %task.setMonitorFreq(10);

	//first, make sure the pilot is in light, and doesn't have an backpacks...
	%client.player.throwPack();
	%client.player.setArmor(Light);

	//next, start the pilot on his way to mounting the vehicle
	%client.pilotVehicle = true;
	%client.stepMove(%task.vehicle.position, 0.25, $AIModeMountVehicle);

	%task.locationIndex = -1;
}

function AITestPilot::weight(%task, %client)
{
	%task.setWeight(10000);
}

function AITestPilot::monitor(%task, %client)
{
	//see if we've mounted yet
	if (%task.locationIndex == -1)
	{
		//mount the vehicle
		%client.pilotVehicle = true;
		%client.stepMove(%task.vehicle.position, 0.25, $AIModeMountVehicle);

		if (isObject(%client.vehicleMounted))
		{
			%task.locationIndex++;
			%client.setPilotDestination($TestPilotHeadings[%task.locationIndex]);
		}
	}

	//else see if we're close enough to the current destination to choose the next
	else
	{
		%pos = %client.vehicleMounted.position;
		%pos2D = getWord(%pos, 0) SPC getWord(%pos, 1) SPC "0";
		%dest = $TestPilotHeadings[%task.locationIndex];
		%dest2D = getWord(%dest, 0) SPC getWord(%dest, 1) SPC "0";

		if (VectorDist(%dest2D, %pos2D) < 20)
		{
			if ($TestPilotHeadings[%task.locationIndex + 1] !$= "")
			{
				%task.locationIndex++;
				%client.setPilotDestination($TestPilotHeadings[%task.locationIndex]);
			}
			else
				%client.setPilotAim($TestPilotHeadings[0]);
		}
	}
}

function testPilot(%client, %vehicle)
{
	%client.clearTasks();

	if (%vehicle $= "")
		%vehicle = LocalClientConnection.vehicleMounted;

	%client.pilotTask = %client.addTask(AITestPilot);
	%client.pilotTask.vehicle = %vehicle;
}

