// don't want this executing when building graphs
if($OFFLINE_NAV_BUILD)
   return;

echo("Running Mission 4 Script");
activatePackage(Training4);
activatePackage(singlePlayerMissionAreaEnforce);


//special sound
datablock AudioProfile(HudFlashSound)
{
   filename    = "gui/buttonover.wav";
   description = AudioDefault3d;
   preload = true;
};

$numberOfEnemies[1] = 0;
$numberOfEnemies[2] = 0;
$numberOfEnemies[3] = 0;

// Mission Variables
$numberOfWaves[1] = 3;
$numberOfWaves[2] = 5;
$numberOfWaves[3] = 7;

$numberInWave[1] = 3;
$numberInWave[2] = 5;
$numberInWave[3] = 7;

$delayBeforeFirstWave[1] = 300000;
$delayBeforeFirstWave[2] = 200000;
$delayBeforeFirstWave[3] =   20000;

$missionBotSkill[1] = 0.0;
$missionBotSkill[2] = 0.5;
$missionBotSkill[3] = 0.8;

$numberOfTeammates = 2;

package training4 {
//===============================================begin the training 4 package stuff====
function getTeammateGlobals()
{
	$TeammateWarnom0 = "Firecrow";
	$teammateskill0 = 0.5;
	$teammateVoice0 = Fem3;
	$teammateEquipment0 = 0;
	$teammateGender0 = Female;

	$TeammateWarnom1 = "Proteus";
	$teammateSkill1 = 0.5;
	$teammateVoice1 = Male4;
	$teammateEquipment1 = 0;
	$teammateGender1 = Male;
}


function MP3Audio::play(%this)
{
	//too bad...no mp3 in training
}


function ClientCmdSetHudMode(%mode, %type, %node)
{
	parent::ClientCmdSetHudMode(%mode, %type, %node);
	//TrainingMap.push();
}

// get the ball rolling
function startCurrentMission(%game)
{
	game.equip($player.player);

	if($pref::TrainingDifficulty == 3)
		updateTrainingObjectiveHud(obj10);
	else{
		schedule(5000, game, repairSensorTower);
		updateTrainingObjectiveHud(obj1);
	}
	$player.beginSpawn = schedule($delayBeforeFirstWave[$pref::TrainingDifficulty], %game, spawnWave, 1);
	$AIDisableChat = true;
	game.missionTime = getSimTime();
	activateskillSpecificTrainingSettings();
}

function activateskillSpecificTrainingSettings()
{
	%skill = $pref::TrainingDifficulty;

	// all
	nameToId("Team1SensorLargePulse1").setDamageLevel(1.5);
	nameToId("Team1SensorLargePulse2").setDamageLevel(1.5);
	
	//skill 2 & 3 :
		//no forcefield, no upstairs Inventory deploy, aaturret(in the mis file)
	if(%skill > 1) {

		%invDepObj = findObjByDescription("Deploy Upstairs Station", 1);
		removeDescribedObj(%invDepObj, 1);
	}
	// skill 3: no turret, no destroy turret or upstairs gen objectives
	if(%skill > 2) {
		nameToId(Team1TurretBaseLarge1).hide(true);
      freeTarget(nameToId(Team1TurretBaseLarge1).getTarget());
		nameToId(GenForceField).delete();
	}
}

function countTurretsAllowed(%type)
{
	return $TeamDeployableMax[%type];
}

function giveall()
{
	error("When the going gets tough...wussies like you start cheating!");
	messageClient($player, 0, "Cheating eh?  What\'s next?  Camping?");
}

function kobayashi_maru()
{
   $testcheats = true;
   commandToServer('giveAll');
}


function pickEquipment()
{
	return getRandom(10);
}

function AIEngageTask::assume(%task, %client)
{
	Parent::assume(%task, %client);

	if(%client.team != $playerTeam)
		game.biodermAssume(%client);
}

function toggleScoreScreen(%val)
{
	if ( %val )
		messageClient($player, 0, $player.miscMsg[noScoreScreen]);
}

function singlePlayerGame::pickTeamSpawn(%game, %client)
{
	if(%client.team == $player.team)
		return parent::pickTeamSpawn(%game, %client);
	%dp = game.pickRandomDropPoint(%client);
	InitContainerRadiusSearch(%dp.position, 2, $TypeMasks::PlayerObjectType);
  	if( containerSearchNext() ) {
		//echo("Too close object, picking again?");
		if(game.DPRetries++ > 100)
			return "0 0 300";
		else return game.pickTeamSpawn(%client);
	}

	else {
		game.DPRetries = 0;
		return %dp.getTransform();
	}
}

function singlePlayerGame::pickRandomDropPoint(%game, %client)
{
	error("picking random point for "@%client);
	%group = nameToID("MissionGroup/Teams/team" @ %client.team @ "/DropPoints");
	%num = %group.getCount();
	%random = getRandom(1,%num);
	%dp = %group.getObject( %random );

	return %dp;
}

function spawnSinglePlayer()
{
	$player.lives--;
	
	%spawn = DefaultGame::pickTeamSpawn(game, $playerTeam);
	game.createPlayer($player, %spawn);
	$player.setControlObject($player.player);
	//messageClient($player, 0, "Respawns Remaining: "@$player.lives);
	game.equip($player.player, 0);
}

function Generator::onDisabled(%data, %obj, %prevState)
{
   Parent::onDisabled(%data, %obj, %prevState);
	if(%obj == nameToId(BaseGen))  //its our primary gen
	{
		doText(T4_Warning02);
		game.MissionCounter = schedule(60000,  0, MissionFailedTimer);
		setWaypointAt(%obj.position, "Repair Generator");
		clockHud.setTime(1);
		updateTrainingObjectiveHud(obj5);
	}
	else if($pref::trainingDifficulty < 2)
	{
		if (getRandom() < 0.5 )
			doText(T4_ForceFields01);
		else doText(T4_FFGenDown01); 
	}

}

function Generator::onEnabled(%data, %obj, %prevState)
{
   Parent::onEnabled(%data, %obj, %prevState);
	//error("Gen up somewhere");
	if(%obj == nameToId(BaseGen)) {
		cancel(game.MissionCounter);
		objectiveHud.trainingTimer.setVisible(false);
		updateTrainingObjectiveHud(obj10);
		$player.currentWaypoint.delete();
		cancel($player.player.trainingTimerHide);
		doText(T4_GenUp);
		checkForWin();
		//error("its the main gen");

		//restore the clock
		%time = getSimTime() - game.missionTime;
		%dif = %time /60000;
		clockHud.setTime(%dif * -1);
	}
}



// mortar mount 
function playerMountWeapon(%tag, %text, %image, %player, %slot)
{		   
	if( game.firstTime++ < 2)
		return;  // initial weapon mount doesnt count
	if(%image.getName() $= "MortarImage" && !game.msgMortar) {
		game.msgMortar = true;
		doText(T4_TipMortar);
	}  
}

// station use
function StationInvEnter(%a1, %a2, %data, %obj, %colObj)
{
	if(%colObj != $player.player)
		return;
	//clearQueue();
	//if(!game.blowoff)
		//blowoff();
	if(game.msgEnterInv++ == 1){
		doText(T4_tipDefense05);
	}
}

function stationTrigger::onEnterTrigger(%data, %obj, %colObj)  
{
	Parent::onEnterTrigger(%data, %obj, %colObj);
	messageClient(%colObj.client, 'msgEnterInvStation', "", %data, %obj, %colObj);
}


function serverCmdBuildClientTask(%client, %task, %team)
{
     parent::serverCmdBuildClientTask(%client, %task, %team);
     error("serverCmdBuildClientTask(" @%client@", "@%task@", "@%team@")");
	
	if($pref::trainingDifficulty > 2)
		return;
	
	//hack: we have to get %objective from the parent function
	// this seems to work	
	%objective = %client.currentAIObjective;
	error(%client.currentAIObjective SPC %objective.getName());

	if ((%objective.getName() $= "AIORepairObject") && 
        (%objective.targetObjectId.getDataBlock().getName() $= "SensorLargePulse")) {
        
        //error("repair order issued and forced");
        // force the ai
        %objective.weightLevel1 = 10000;

     	if(!game.issueRepairOrder && game.expectingRepairOrder) { 
			game.issueRepairOrder = true;
			doText(Any_good, 2000);
			cameraSpiel();
		}
	}
}

function CommanderMapGui::onWake(%this)
{
	
	parent::onWake(%this);
	if(game.firstSpawn)
		return;	
	//error("Waking the command map.");
	messageClient($player, 'commandMapWake', "");
}

function CommanderTree::onCategoryOpen(%this, %category, %open)
{
	//error("commander tree button pressed");
	parent::onCategoryOpen(%this, %category, %open);
 	
 	if(%category $= "Support" && game.ExpectiongSupportButton) {
 		game.ExpectiongSupportButton = false;
		doText(ANY_check01);
		doText(T4_03i, 1000);
		doText(T4_03j);
 	}
 	if(%category $= "Tactical" && game.ExpectiongTacticalButton) {
 		game.ExpectiongTacticalButton = false;
		doText(ANY_check02);
		messageClient($player, 0, "Click on the control box after the turrets name to control the turret.");
	 	game.CheckingTurretControl = true;
	 }
}

// control turret/camera
//------------------------------------------------------------------------------
function serverCmdControlObject(%client, %targetId)
{
   parent::serverCmdControlObject(%client, %targetId);
	
	if(game.firstSpawn)
		return;	

	error("Training 4 serverCmdControlObject");
  	 %obj = getTargetObject(%targetId);
	echo("what do we get back from the parent funtion ?   "@%obj);
	%objType = %obj.getDataBlock().getName();
	echo("it is a "@%objType);   

   if(game.CheckingTurretControl) {
      if(%objType $= "TurretBaseLarge") {
			game.CheckingTurretControl = false;
			schedule(3000, game, turretSpielEnd);
			//error("Debug: You are controlling a turret f00!");
		}
	}
//    if(game.CheckingCameraControl) {
//       if(%objType $= "TurretDeployedCamera") {
// 			game.CheckingCameraControl = false;
// 			schedule(3000, $player.player, cameraSpielEnd);
// 			//error("Debug: You are controlling a camera, w00t!");
// 		}
// 	}
}

function singlePlayerGame::sensorOnRepaired(%obj, %objName)
{
	//error("singlePlayerGame::sensorOnRepaired called");
	Parent::sensorOnRepaired(%obj, %objName);
	if(game.expectingTowerRepair && !game.playedOpening && !game.firstSpawn)
		openingSpiel();
}

function cameraSpiel()
{
	if(game.firstSpawn)
		return;	
	
	doText(T4_tipCamera01);
	updateTrainingObjectiveHud(obj3);
	$player.player.setInventory(CameraGrenade , 8);  // cheating just in case the player is a dufas
	game.CheckingCameraControl = true;

}

function CameraGrenadeThrown::onThrow(%this, %camGren)
{
	Parent::onThrow(%this, %camGren);
	if(game.CheckingCameraControl && !game.firstSpawn) {
		messageClient($player, 0, "Go back to the command map to access camera view.");
		game.CheckingCameraControl = false;
		game.wakeExpectingCamera = true;
		updateTrainingObjectiveHud(obj2);
		doText(T4_tipCamera02);
	}
}

//like mission 1 and 2 there is a spiel at the begining
function repairSensorTower()
{
	if(game.firstSpawn)
		return;
			
	setWaypointAt(nameToId(Team1SensorLargePulse2).position, "Repair Sensor");
	game.expectingTowerRepair = true;
	doText(T4_01);
	doText(T4_01b);
}

function openingSpiel()
{
	if(game.firstSpawn)
		return;

	$player.currentWaypoint.delete();
	updateTrainingObjectiveHud(obj7);
	
	game.playedOpening = true;
	//doText(T4_01c);
	doText(T4_02a);
	doText(T4_03);
	doText(T4_02);
	//doText(T4_02b);
	doText(T4_03a);
}

function ThreeAEval()
{
	if(game.firstSpawn)
		return;
	
	game.wakeExpectingSquadOrder = true;	
	updateTrainingObjectiveHud(obj2);
}

function missionSpawnedAI()
{
	if(!game.firstSpawn) {
		game.firstspawn = true;
		doText(ANY_warning05);
		doText(ANY_warning03);  // does a playgui check
		
		//updateTrainingObjectiveHud(obj5);
	}
}

function singlePlayerPlayGuiCheck()
{
   if(CommanderMapGui.open)
      CommanderMapGui.close();
		
	updateTrainingObjectiveHud(obj10);
}


function missionWaveDestroyed(%wave)
{
	if(%wave == 1) {
		doText(T4_06);
		doText(T4_tipDefense02);
	}
	else if(%wave == 2)
		doText(T4_08);

	else if( %wave == $numberOfWaves[$pref::TrainingDifficulty] ) {
		//MessageAll(0, "The last wave is destroyed.  This mission would end.");
		game.allEnemiesKilled = true;
		checkForWin();
	}
}

function checkForWin()
{
	if(game.allEnemiesKilled && nameToId(BaseGen).isEnabled()) {
			clearQueue();
			doText(T4_10);
			doText(T4_11);
			schedule(4000, game, missionComplete, $player.miscMsg[training4win]);
	}
}


function cameraSpielEnd()
{
	if(game.firstSpawn)
		return;
			
	doText(T4_tipCamera03);
	doText(T4_tipCamera04, 2000);
	doText(T4_controlTurret);
	game.CheckingTurretControl = true;
	game.wakeExpectingTurret = true;
	updateTrainingObjectiveHud(obj4);
}

function turretSpielEnd()
{
	if(game.firstSpawn)
		return;
			
	doText(T4_tipObjects);
	doText(T4_CCend, 4000);
	
	doText(T4_TipGenerator01, 2000);
	doText(T4_TipGenerator01a);
	doText(T4_TipGenerator01b);
	doText(T4_TipGenerator02, 2000);
	
	
	doText(T4_tipDefense01);
// 	doText(T4_tipDefense06);
// 	doText(T4_tipDefense07);
// 	doText(T4_tipDefense08);
// 	doText(T4_tipDefense09);
	updateTrainingObjectiveHud(obj9);
	//game.blowOff = true;   //feel free to use the inventory stations
}


// turret deployment advice and messages
function singlePlayerFailDeploy(%tag, %message)
{
	%text = detag(%message);
	%phrase = getWord(%text, 0) SPC getWord(%text, 1);
	//echo(%phrase);

	switch$(%phrase) {
		case "\c2Item must":
			if(!game.tipDep1) {
				game.tipDep1 = true;
				doText(T4_tipDeploy01);
			}
		case "\c2You cannot":
			if(!game.tipDep2) {
				game.tipDep2 = true;
				doText(T4_tipDeploy02);
			}
		case "\c2Interference from":
			if(!game.tipDepT) {
				game.tipDepT = true;
				doText(T4_tipDepTurret);
			}
	}
}


// not really a callback but this prolly goes here
function cloakingUnitAdded()
{
	if(game.addedCloak++ < 2) {
		doText(T4_TipDefense03);
	}
}

function RepairingObj(%tag, %text, %name, %obj)
{
	if(%obj.getDataBlock().getName() $= "SensorLargePulse" && !game.repairingSensor) {
		game.repairingSensor = true;
		schedule(2000, $player.player, doText, T4_01c);		
	}
}

// equipment =======================================================================
//===================================================================================

//there are a plethora of configs in this mission

function SinglePlayerGame::equip(%game, %player, %set)
{
	if(!isObject(%player))
		return;

	//ya start with nothing...NOTHING!
	%player.clearInventory();

	for(%i =0; %i<$InventoryHudCount; %i++)
	  %player.client.setInventoryHudItem($InventoryHudData[%i, itemDataName], 0, 1);

	//error("equping Player "@%player@" with set"@%set);
	switch (%set)
	{
		case 0:
			//echo("player Heavy");

			%player.setArmor("Heavy");
		   
			%player.setInventory(RepairPack, 1);
		   
			%player.setInventory(RepairKit,1);
			%player.setInventory(CameraGrenade,8);
			%player.setInventory(Mine,3);

			%player.setInventory(Chaingun, 1);
			%player.setInventory(ChaingunAmmo, 200);
			%player.setInventory(Disc,1);
			%player.setInventory(DiscAmmo, 15);
			%player.setInventory(Mortar, 1);
			%player.setInventory(MortarAmmo, 10);
			%player.setInventory(Blaster,1);
			%player.setInventory(GrenadeLauncher,1);
			%player.setInventory(GrenadeLauncherAmmo,15);
			%player.setInventory(TargetingLaser, 1);

			%player.use("Disc");
			%player.weaponCount = 5;

		case 1:
			//echo("Light Skirmisher");

			%player.setArmor("Light");

			%player.setInventory(EnergyPack, 1);

			%player.setInventory(RepairKit,1);
			%player.setInventory(ConcussionGrenade,5);

			%player.setInventory(Blaster,1);
			%player.setInventory(Disc,1);
			%player.setInventory(DiscAmmo, 15);
			%player.setInventory(Chaingun, 1);
			%player.setInventory(ChaingunAmmo, 100);
			%player.setInventory(TargetingLaser, 1);

			%player.use("Chaingun");
			%player.weaponCount = 3;

		case 2:
			//script hook in our equip stuff also
			cloakingUnitAdded();
			
			//echo("Light Assassin Config");

			%player.setArmor("Light");
		   
			%player.setInventory(CloakingPack, 1);
		   
			%player.setInventory(RepairKit,1);
			%player.setInventory(FlashGrenade,5);
			%player.setInventory(Mine,3);

			%player.setInventory(Plasma, 1);
			%player.setInventory(PlasmaAmmo, 20);
			%player.setInventory(Disc,1);
			%player.setInventory(DiscAmmo, 15);
			%player.setInventory(ShockLance,1);
			%player.setInventory(TargetingLaser, 1);

			%player.use("Disc");
			%player.weaponCount = 3;

		case 3:
			//echo("Light Sniper");

			%player.setArmor("Light");

			%player.setInventory(EnergyPack, 1);

			%player.setInventory(RepairKit,1);
			%player.setInventory(ConcussionGrenade,5);

			%player.setInventory(Chaingun,1);
			%player.setInventory(ChaingunAmmo,100);
			%player.setInventory(Disc,1);
			%player.setInventory(DiscAmmo, 15);
			%player.setInventory(SniperRifle, 1);
			%player.setInventory(TargetingLaser, 1);

			%player.use("SniperRifle");
			%player.weaponCount = 3;

		case 4:
			echo("Medium Base Rape");

			%player.setArmor("Medium");
		   
			%player.setInventory(ShieldPack, 1);
		   
			%player.setInventory(RepairKit,1);
			%player.setInventory(Grenade,6);
			%player.setInventory(Mine,3);

			%player.setInventory(Plasma, 1);
			%player.setInventory(PlasmaAmmo, 40);
			%player.setInventory(Disc,1);
			%player.setInventory(DiscAmmo, 15);
			%player.setInventory(ElfGun, 1);
			%player.setInventory(GrenadeLauncher,1);
			%player.setInventory(GrenadeLauncherAmmo, 10);
			%player.setInventory(TargetingLaser, 1);

			%player.use("GrenadeLauncher");
			%player.weaponCount = 4;

		case 5:
			//echo("Medium Killing Machine");

			%player.setArmor("Medium");
		   
			%player.setInventory(AmmoPack, 1);
		   
			%player.setInventory(RepairKit,1);
			%player.setInventory(Grenade,6);
			%player.setInventory(Mine,3);

			%player.setInventory(Plasma, 1);
			%player.setInventory(PlasmaAmmo, 40);
			%player.setInventory(Disc,1);
			%player.setInventory(DiscAmmo, 15);
			%player.setInventory(GrenadeLauncher, 1);
			%player.setInventory(GrenadeLauncherAmmo, 10);
			%player.setInventory(MissileLauncher,1);
			%player.setInventory(MissileLauncherAmmo, 10);
			%player.setInventory(TargetingLaser, 1);

			%player.use("Plasma");
			%player.weaponCount = 4;

		case 6:
			//echo("Medium Wuss");

			%player.setArmor("Medium");
		   
			%player.setInventory(EnergyPack, 1);
		   
			%player.setInventory(RepairKit,1);
			%player.setInventory(ConcussionGrenade,6);

			%player.setInventory(Blaster, 1);
			%player.setInventory(Disc,1);
			%player.setInventory(DiscAmmo, 15);
			%player.setInventory(Elf, 1);
			%player.setInventory(Chaingun,1);
			%player.setInventory(ChaingunAmmo, 150);
			%player.setInventory(TargetingLaser, 1);

			%player.use("Disc");
			%player.weaponCount = 4;

		case 7:
			//echo("Heavy Long Range");

			%player.setArmor("Heavy");
		   
			%player.setInventory(EnergyPack, 1);
		   
			%player.setInventory(RepairKit,1);
			%player.setInventory(Grenade,8);
			%player.setInventory(Mine,3);

			%player.setInventory(Plasma, 1);
			%player.setInventory(PlasmaAmmo, 50);
			%player.setInventory(Disc,1);
			%player.setInventory(DiscAmmo, 15);
			%player.setInventory(Mortar, 1);
			%player.setInventory(MortarAmmo, 10);
			%player.setInventory(MissileLauncher,1);
			%player.setInventory(MissileLauncherAmmo, 15);
			%player.setInventory(GrenadeLauncher,1);
			%player.setInventory(GrenadeLauncherAmmo,15);
			%player.setInventory(TargetingLaser, 1);

			%player.use("Mortar");
			%player.weaponCount = 5;

		case 8:
			//echo("Default Config");

			%player.setArmor("Light");

			%player.setInventory(RepairKit,1);

			%player.setInventory(Blaster,1);
			%player.setInventory(Disc,1);
			%player.setInventory(DiscAmmo, 15);
			%player.setInventory(Chaingun, 1);
			%player.setInventory(ChaingunAmmo, 100);
			%player.setInventory(TargetingLaser, 1);

			%player.use("Blaster");
			%player.weaponCount = 3;

		case 9:
			//echo("Heavy Rate of Fire");

			%player.setArmor("Heavy");
		   
			%player.setInventory(AmmoPack, 1);
		   
			%player.setInventory(RepairKit,1);
			%player.setInventory(Grenade,8);
			%player.setInventory(Mine,3);

			%player.setInventory(Chaingun, 1);
			%player.setInventory(ChaingunAmmo, 200);
			%player.setInventory(Disc,1);
			%player.setInventory(DiscAmmo, 15);
			%player.setInventory(Mortar, 1);
			%player.setInventory(MortarAmmo, 10);
			%player.setInventory(Plasma,1);
			%player.setInventory(PlasmaAmmo, 50);
			%player.setInventory(GrenadeLauncher,1);
			%player.setInventory(GrenadeLauncherAmmo,15);
			%player.setInventory(TargetingLaser, 1);

			%player.use("Mortar");
			%player.weaponCount = 5;
		
		case 10:
			//echo("Heavy Inside Attacker");

			%player.setArmor("Heavy");
		   
			%player.setInventory(ShieldPack, 1);
		   
			%player.setInventory(RepairKit,1);
			%player.setInventory(ConcussionGrenade,8);
			%player.setInventory(Mine,3);

			%player.setInventory(Plasma, 1);
			%player.setInventory(PlasmaAmmo, 50);
			%player.setInventory(Disc,1);
			%player.setInventory(DiscAmmo, 15);
			%player.setInventory(Mortar, 1);
			%player.setInventory(MortarAmmo, 10);
			%player.setInventory(ShockLance,1);
			%player.setInventory(Chaingun,1);
			%player.setInventory(ChaingunAmmo,200);
			%player.setInventory(TargetingLaser, 1);

			%player.use("Mortar");
			%player.weaponCount = 5;
	}
}

// silly littly functions 
function flashButton(%buttonName)
{
	%time = 800;
	%num = 6;
	for(%i=0; %i<%num; %i++) {
		schedule( %time*%i, $player.player, "eval", %buttonName@".setVisible(false);");
		
		schedule(%time*%i + %time/2, $player.player, "eval", %buttonName@".setVisible(true);");
		schedule(%time*%i, $player.player, serverPlay2d, HudFlashSound);
	}
}

function showCommandPulldown(%button)
{
	//this is what I hacked in to make pretty with the showing off of the command tree
	commanderTree.openCategory(%button, true);
	mentionPulldown(%button);
	commanderTree.schedule(3000, openCategory, %button, false);
}

function affectAllCommandPulldown(%open)
{
	commanderTree.openCategory(Clients, %open);
	commanderTree.openCategory(Tactical, %open);
	commanderTree.openCategory(Support, %open);
	commanderTree.openCategory(Waypoints, %open);
	commanderTree.openCategory(Objectives, %open);
}

function mentionPulldown(%button)
{
	switch$(%button)
	{
		case "Clients":
			doText(T4_03b);
			 
		case "Tactical":
			doText(T4_03c);
			 
		case "Support":
			doText(T4_03d);
			 
		case "Waypoints":
			doText(T4_03e);
			 
		case "Objectives":
			doText(T4_03f);
			doText(T4_03g);
			doText(t4_03h);
	}
}

function training4CommandMapWake()
{
	error("training4CommandMapWake Called");
	if(game.wakeExpectingSquadOrder && !game.firstSpawn) {
		game.wakeExpectingSquadOrder = false;

		// commander map waypoint
		%pos = nameToId(Base).position;
		%obj = createClientTarget(-1, %pos);
		%obj.createWaypoint("Nagakhun Base");

 		// cmap objective
 		commanderTree.registerEntryType("Objectives", getTag('Base'), false, "commander/MiniIcons/com_flag_grey", "255 255 255");
 		createTarget(%id, 'Defend', "", "", 'Base', $player.getSensorGroup());
 
		affectAllCommandPulldown(false);

 		//here we go...drop down the thingies
 		schedule( 2500, $player.player, showCommandPulldown, Clients);
 		schedule( 6000, $player.player, showCommandPulldown, Tactical);
 		schedule(10000, $player.player, showCommandPulldown, Support);
 		schedule(14000, $player.player, showCommandPulldown, Waypoints);
 		schedule(18000, $player.player, showCommandPulldown, Objectives);

		//schedule(24000, $player.player, affectAllCommandPulldown, true);
	}
	else if(game.wakeExpectingTurret && !game.firstSpawn) {
		messageClient($player, 0, "Click on \"Tactical Assets\" to view turrets.");
		//flashButton(CMDTacticalButton);
 		game.ExpectiongTacticalButton = true;
		game.wakeExpectingTurret = false;
	}
	else if(game.wakeExpectingCamera && !game.firstSpawn) {
		messageClient($player, 0, "Click on the control box to the  right of the camera\'s name to control the camera.");
		cameraSpielEnd();
		game.wakeExpectingCamera = false;
	}
}

// Objectives ==================================================================
//================================================================================
function missionFailedTimer()
{
	missionFailed($player.miscMsg[training4GenLoss]);
}


function blowoff()
{
	game.blowoff = true;
	clearQueue();
	doText(Any_Blowoff02, 2000, 1);
	
	// okay, the player wants to play huh?
	// if we are still waiting for the enemies to spawn at this point
	// cancel that and spawn them now...well, soon
	if($player.beginSpawn){
		cancel($player.beginSpawn);	
		%time = getRandom(1, 20);
		//error("Blowing off the training: spawning enemies in "@ %time * 1000 @" seconds.");
		schedule(%time*1000, game, beginTraining4Enemies);
	}

}

function findObjbyDescription(%desc, %team)
{
	%q = $objectiveQ[%team];
	for(%i = 0; %i < %q.getCount(); %i++)
	{
		%objective = %q.getObject(%i);
		if(%objective.description $= %desc)
			return %objective;
	}
}

function removeDescribedObj( %obj )
{
	%invDepObj.weightLevel1 = 0;
	%invDepObj.weightLevel2 = 0;
	%invDepObj.weightLevel3 = 0;
	%invDepObj.weightLevel4 = 0;
	$ObjectiveQ[1].remove(%invDepObj);
	// clear it in case anyone has picked it up
	AIClearObjective(%invDepObj);
}

//===============================================END the training 4 package stuff====
};

// Dialog stuff ===================================================================
//=================================================================================



// Callbacks //==================================================================
//================================================================================

//add callbacks
addMessageCallback('MsgDeployFailed', singlePlayerFailDeploy);
addMessageCallback('MsgWeaponMount', playerMountWeapon);
addMessageCallback('msgEnterInvStation', StationInvEnter);
addMessageCallback('MsgRepairPackRepairingObj', RepairingObj);
addMessageCallback('commandMapWake', training4CommandMapWake);

