//Training_retrieval.cs

$Train::missionType = "F&R";
exec("server/game");
exec("server/training/training_AI");


function Retrieval::init(%clientId)
{
   message::bottomprint(%clientId, "<jc><f1>Training Mission 7 - Find and Retrieve", 5);
   schedule("message::bottomprint(" @ %clientId @ ", \"<f1><jc>This mission will introduce you to the Find and Retrieve game scenario.\", 5);", 5);
   schedule("message::bottomprint(" @ %clientId @ ", \"<f1><jc>Bring up The Objectives screen for a gameplay description.\", 5);", 10);
   schedule("message::All(0, \"~wshell_click.wav\");", 0);
   schedule("message::All(0, \"~wshell_click.wav\");", 5);
   schedule("message::All(0, \"~wshell_click.wav\");", 10);
   %player = Client::getOwnedObject(%clientId);
   %player.hasFlag = false;
   $flagDropped = false;
   %player.flag	= "";
   $flagReturnTime = 30;
   %lineNum = 13;
   $capsToWin = 0;
   $captures = 0;
   $ourBase = "-125.978 -91.6377 172.689";
   $flagBase = "247.425 -284.296 211.108";
   
   %group = nameToID("MissionGroup/Flags");
    
   %numObj = Group::objectCount(%group);
   
   for(%j = 0; %j < %numObj; %j++)
   { 
      %tempObj = Group::getObject(%group, %j);
      
      if(GameBase::getDataName(%tempObj) == flag)
      {
        %tempObj.lineNum = %lineNum++;
        %tempObj.isMounted = false;
        %tempObj.lost = false;
		%tempObj.conveyed = false;
        %tempObj.originalPos = GameBase::getPosition(%tempObj);
        $capsToWin++;
		retrieval::checkMissionObjectives(%clientId, %tempObj);
      }
   }
   schedule("retrieval::setWayPoint(" @ %tempObj @ ", " @ %clientId @ ", " @ true @ ");", 15);
}

function Game::initialMissionDrop(%clientId)
{
   GameBase::setTeam(%clientId, 0);
   Client::setGuiMode(%clientId, $GuiModePlay);
   Game::playerSpawn(%clientId, false);
   Retrieval::init(%clientId);
   Training::setupAI( %clientId );
}

///////////////////////////////////////
//Flag functions
///////////////////////////////////////
function FlagStand::onCollision(%this, %object)
{
   
   %standTeam = GameBase::getTeam(%this);
   %playerTeam = GameBase::getTeam(%object);
   %playerClient = Player::getClient(%object);
   
   
   if(getObjectType(%object) != "Player" || %playerTeam != %standTeam || %this.hasFlag)
      return;

   if(%object.hasFlag)
   {   
      // if we're here, we're carrying a flag, we've hit 
      // our flag stand, it doesn't have a flag.
      
      %flag = %object.flag;
      Item::hide(%object.flag, false);
      GameBase::setPosition(%object.flag, GameBase::getPosition(%this));
	   
      Player::setItemCount(%object, "Flag", 0);
      %this.hasFlag = true;
	  %object.hasFlag = false;
	  %object.flag.isMounted = true;
	  $captures++;
	  
	  if($captures != 3)
	  {  
	     message::bottomprint(%playerClient, "<jc><f1>You conveyed the " @ %object.flag.objective @ " to your base.", 5);
	  	 Training::moreAI($captures);
	  }
	  message::All(%playerClient, "~wflagcapture.wav");
	  %object.flag = "";
	  %flag.conveyed = true;
	  
	  retrieval::checkMissionObjectives(%playerClient, %flag);
	  if($captures != 3)
	     retrieval::setWayPoint(%flag, %playerClient, false);
   }
}

function Flag::onCollision(%this, %object)
{
   if(getObjectType(%object) != "Player" || %object.hasFlag || %this.isMounted)
      return;

   %playerClient = Player::getclient(%object);
   %flagTeam = GameBase::getTeam(%this);
   
   Player::setItemCount(%object, "Flag", 1); 
   Player::mountItem(%object, "Flag", $FlagSlot, %flagTeam);
   Item::hide(%this, true);
   %object.flag = %this;
   %object.hasFlag = true;    
   
   if(!$flagDropped)
     message::bottomprint(%playerClient, "<jc><f1>You took the " @ %this.objective @ " !", 5);
   else
   {  
     message::bottomprint(%playerClient, "<jc><f1>You recovered the " @ %this.objective @ " !", 5);
	 %this.lost = "false";
   }
   message::All(%playerClient, "~wflag1.wav");
   retrieval::checkMissionObjectives(%playerClient, %this);
   retrieval::setWayPoint(%this, %playerClient, false);
}

function Flag::onDrop(%player, %type)
{
   %playerTeam = GameBase::getTeam(%player);
   %playerClient = Player::getClient(%player);
   %dropClientName = Client::getName(Player::getClient(%player));
   %flag = %player.flag;
   %player.flag = "";
   %player.hasFlag = false;
   %flag.lost = true;
   
   message::bottomprint(%playerClient, "<jc><f1>You dropped the " @ %flag.objective @ " !", 5);
   GameBase::throw(%flag, %player, 10, false);
   Item::hide(%flag, false);
   Player::setItemCount(%player, "Flag", 0);
   
   schedule("Retrieval::checkFlagReturn(" @ %flag @ ", " @ %playerClient @ ");", $flagReturnTime);
   retrieval::checkMissionObjectives(%playerClient, %flag);
   $flagDropped = true;
   retrieval::setWayPoint(%flag, %playerClient, false);
}

function Retrieval::checkFlagReturn(%this, %clientId)
{
   if(%this.lost)
   {
      message::bottomprint(%clientId, "<f1><jc>" @ %this.objective @ " was returned to its base.", 5);
      dbecho(2,"moving flag to " @ %this.originalPos);
      GameBase::startFadeOut(%this);
      GameBase::setPosition(%this, %this.originalPos);
	  GameBase::startFadeIn(%this);
      $flagDropped = false;
	  %this.lost = false;
	  retrieval::checkMissionObjectives(%clientId, %this);
	  retrieval::setWayPoint(%this, %clientId, false);
   }
}

function retrieval::setWayPoint(%flag, %cl, %init)
{
   %player = Client::getOwnedObject(%cl);
   %flagPos = GameBase::getPosition(%flag);
   %flagx = getWord(%flagpos, 0);
   %flagy = getWord(%flagpos, 1);
   
   %homebasePos = $ourBase;
   %homebasex = getWord(%homebasePos, 0);
   %homebasey = getWord(%homebasePos, 1);
   
   %flagbasePos = $flagBase;
   %flagbasex = getWord(%flagbasePos, 0);
   %flagbasey = getWord(%flagbasePos, 1);  

   
   if(%flag.lost)
   {
      schedule("message::bottomprint(" @ %cl @ ", \"<jc><f1>Waypoint set to " @ %flag.objective @ "\", 5);", 5);
	  issueCommand(%cl, %cl, 0, "Waypoint set to " @ %flag.objective, %flagx, %flagy);
   }
   else	if(%flag.conveyed || %init)
   {
      schedule("message::bottomprint(" @ %cl @ ", \"<jc><f1>Waypoint set to next objective\", 5);", 5);
	  issueCommand(%cl, %cl, 0, "Waypoint set to next objective", %flagbasex, %flagbasey);
   }
   else if(%player.hasFlag)
   {
      schedule("message::bottomprint(" @ %cl @ ", \"<jc><f1>Waypoint set back to your base\", 5);", 5);
	  issueCommand(%cl, %cl, 0, "Waypoint set to your base", %homebasex, %homebasey);
   }
}

function retrieval::checkMissionObjectives(%cl, %flag)
{
  if(retrieval::MissionObjectives( Client::getTeam(%cl), %cl, %flag ))
   {
      retrieval::MissionComplete( %cl );
   }
}

function retrieval::MissionObjectives( %teamId, %cl, %this )
{
   %enemyTeam = $enemyTeam[%teamId];
   %teamName = getTeamName(%teamId); 
   %player = Client::getOwnedObject(%cl);
   %enemyTeamName = getTeamName(%enemyTeam);
   %capsNeeded = $capstowin - $captures;
  
   if(%capsNeeded == 0)
   {
     return "True";
   }
   
   Training::displayBitmap(0);
   
   Team::setObjective(%teamId, 1, "<f5><jl>GamePlay Description:");
   Team::setObjective(0, 2, "<f1><jl>   In a Find and Retrieve mission, your team must find objectives placed in a");  
   Team::setObjective(0, 3, "<f1><jl>   mission and bring them back to your base. This is similar to CTF, but the");
   Team::setObjective(0, 4, "<f1><jl>   objectives are not owned by any one team in the beginning.  For every");
   Team::setObjective(0, 5, "<f1><jl>   objective you return to your base, your team scores points.");
   Team::setObjective(%teamId, 6, "\n");
   Team::setObjective(%teamId, 7, "<f5><jl>Mission Completion:"); 
   Team::setObjective(%teamId, 8, "<f1>   -Convey all objective flags to your base");
   Team::setObjective(%teamId, 9, "\n");
   Team::setObjective(%teamId, 10, "<f5>Mission Information:");
   Team::setObjective(%teamId, 11, "<f1>   -Mission Name: Find and Retrieve Training"); 
   Team::setObjective(%teamId, 12, "\n");
   Team::setObjective(%teamId, 13, "<f5><jl>Mission Objectives:");

   if(%this.conveyed)
   {
      %status = "<Bflag_atbase.png><F1>\n    " @ %this.objective @ " has been conveyed";
      
   }
   else
   {
      
      if(%this.lost)
      {
         %status = "<Bflag_notatbase.png><f1>\n    " @ %this.objective @ " was dropped in the field";
      }
      else if($captures == 0 && !%player.hasFlag)
      {
		 %status = "<Bflag_neutral.png><f1>\n    " @ %this.objective @ " has not been conveyed";
      }
      else if(%player.hasFlag)
      {
         %status = "<Bflag_atbase.png><f1>\n    Convey " @ %this.objective @ " to your base";
      }
	  else
	     %status = "<Bflag_neutral.png><f1>\n    " @ %this.objective @ " has not been conveyed";
   }
   
   if(%this.lineNum == 14)
      Team::setObjective(%teamId, %this.lineNum, %status);
   else if(%this.lineNum == 15)
      Team::setObjective(%teamId, %this.lineNum, %status);
   else if(%this.lineNum == 16)
      Team::setObjective(%teamId, %this.lineNum, %status);

   return "False";
}

function Retrieval::missionComplete(%cl)
{
  
  schedule("Client::setGuiMode(" @ %cl @ ", " @ $GuiModeObjectives @ ");", 8);
  missionSummary();
  remoteEval(2049, TrainingEndMission);
}

function remoteTrainingEndMission()
{
   schedule("EndGame();", 16);
}

function missionSummary()
{
   %time = getSimTime() - $MatchStartTime;
   
   Training::displayBitmap(0);
   
   Team::setObjective(0, 1, "<f5><jl>Mission Completion:");
   Team::setObjective(0, 2, "<f1><t>   -Completed:");
   Team::setObjective(0, 3, "\n");
   Team::setObjective(0, 4, "<f5><jl>Mission Information:");
   Team::setObjective(0, 5, "<f1><t>   -Mission Name: Find and Retrieve Training");
   Team::setObjective(0, 6, "\n");
   
   Team::setObjective(0, 7, "<f5><j1>Mission Summary:");
   
   Team::setObjective(0, 8, "<f1><t>   -Enemy Kills: " @ "<f1>" @ $AIKilled @ " out of " @ $numGuards);
   Team::setObjective(0, 9, "<f1><t>   -Total Mission Time: " @ "<f1>" @ Time::getMinutes(%time) @ " Minutes " @ Time::getSeconds(%time) @ " Seconds");
   Team::setObjective(0, 10, "");
   Team::setObjective(0, 11, "");
   Team::setObjective(0, 12, "");
   Team::setObjective(0, 13, "");
   Team::setObjective(0, 14, "");
   Team::setObjective(0, 15, "");
   Team::setObjective(0, 16, "");
   Team::setObjective(0, 17, "");
   Team::setObjective(0, 18, "");
   Team::setObjective(0, 19, "");
   Team::setObjective(0, 20, "");

}


function Training::MoreAI(%wave)
{
  if(%wave == 1)
    %group = nameToId("MissionGroup/AIwave1");
  else if(%wave == 2)
    %group = nameToId("MissionGroup/AIwave2");

  if(%group == -1)
     dbecho(2,"No AI exists...");  
   
  else 
  {  
     %clientId = Client::getFirst(); 
     %AIname = "guard" @ $numGuards + 1;
     createAI(%AIname, %group, larmor);
     %aiId = AI::getId( %AIname );
     GameBase::setTeam(%aiId, 1);
     AI::setVar( %AIname,  iq,  70 );
     AI::setVar( %AIname,  attackMode, 0);
     AI::DirectiveTarget(%AIname, %clientId);
  }
  AI::callWithId(%AIname, Player::setItemCount, blaster, 1);
  AI::callWithId(%AIname, Player::mountItem, blaster, 0);
  AI::SetVar(%AIname, triggerPct, 0.04 );
  $numGuards++;
  
}

function remoteScoresOn(%clientId)
{
}

function remoteScoresOff(%clientId)
{
}
