#include "defs.qh"
#include "menu.qh"
#include "monsters.qh"

/*=======================================================//
// ARMY.QC - CustomTF 3.2.OfN              - 30/1/2001 - //
// by Sergio Fumaña Grunwaldt - OfteN aka superCOCK2000  //
=========================================================//
 Army job stuff
=========================================================*/

float(entity obj, entity builder) CheckArea;
void(entity player) PrintArmyTime;
void(entity sld, entity player, string msg) PrintFromSoldier;
entity(entity player) GetArmyTimer;
string(entity thething) GetEnemyName;
float() TeleSoldier;

$frame stand1 stand2 stand3 stand4 stand5 stand6 stand7 stand8 stand9
$frame stand10 stand11 stand12 stand13

void() JobArmy =
{
	if (self.current_menu == MENU_ARMY && self.job & JOB_DEMON_OUT)
	{
		if (self.demon_one.is_haxxxoring == 0)
			self.demon_one.is_haxxxoring = 1;
		else
			self.demon_one.is_haxxxoring = 0;
	}
    
    self.current_menu = MENU_ARMY;
	self.menu_count = MENU_REFRESH_RATE;   
};

void() Menu_Army1;
void() Menu_Army2;

void() Menu_Army =
{
    if (self.job & JOB_DEMON_OUT)
    {
        if (self.demon_one.is_haxxxoring == 1) Menu_Army2();
        else Menu_Army1();        
    }
    else Menu_Army1();
};

void() Menu_Army1 =
{
	local float readytime,temp;
    local string st,st2,st3;

    if (self.army_ready==FALSE)
    {           
        local entity ArmyTimer;
        ArmyTimer=GetArmyTimer(self);

        readytime=fabs(floor(ArmyTimer.nextthink - time));
        if (readytime<60)
        {
          st=ftos(readytime);
          st2=" seconds";
        }
        else
        {
          temp=floor(readytime/60);//+1;
          if (temp>1)
            st2=" minutes";
          else
            st2=" minute";

          st=ftos(floor(readytime/60));//+1);
        }
    }
   
    if (self.job & JOB_DEMON_OUT)
    {
/*        if (self.demon_one.goalentity==self)
            st="—.. Stay there!           ";
        else
            st="—.. Follow me!            ";*/ 
            
        if (self.demon_one.martyr_enemy==world && self.demon_one.demon_two==world)
            st3 = "  “.. Set primary ÷áùðïéîô    \n  ”.. Set secondary ÷áùðïéîô  ";
        
        else if (self.demon_one.martyr_enemy!=world && self.demon_one.demon_two==world && visible2(self.demon_one,self.demon_one.martyr_enemy))
            st3 = " “.. Set primary ÷áùðïéîô    \n  ”.. Set secondary ÷áùðïéîô  ";
        else if (self.demon_one.martyr_enemy!=world && self.demon_one.demon_two==world)
            st3 = "‹ “.. Set primary ÷áùðïéîô    \n  ”.. Set secondary ÷áùðïéîô  ";

        else if (self.demon_one.martyr_enemy==world && self.demon_one.demon_two!=world && visible2(self.demon_one,self.demon_one.demon_two))
            st3 = "  “.. Set primary ÷áùðïéîô    \n ”.. Set secondary ÷áùðïéîô  ";
        else if (self.demon_one.martyr_enemy==world && self.demon_one.demon_two!=world)
            st3 = "  “.. Set primary ÷áùðïéîô    \n‹ ”.. Set secondary ÷áùðïéîô  ";
        
        else if (self.demon_one.martyr_enemy!=world && self.demon_one.demon_two!=world && visible2(self.demon_one,self.demon_one.demon_two) && visible2(self.demon_one,self.demon_one.martyr_enemy))
            st3 = " “.. Set primary ÷áùðïéîô    \n ”.. Set secondary ÷áùðïéîô  ";
        else if (self.demon_one.martyr_enemy!=world && self.demon_one.demon_two!=world && visible2(self.demon_one,self.demon_one.demon_two))
            st3 = "‹ “.. Set primary ÷áùðïéîô    \n ”.. Set secondary ÷áùðïéîô  ";
        else if (self.demon_one.martyr_enemy!=world && self.demon_one.demon_two!=world && visible2(self.demon_one,self.demon_one.martyr_enemy))
            st3 = " “.. Set primary ÷áùðïéîô    \n‹ ”.. Set secondary ÷áùðïéîô  ";
        else if (self.demon_one.martyr_enemy!=world && self.demon_one.demon_two!=world)
            st3 = "‹ “.. Set primary ÷áùðïéîô    \n‹ ”.. Set secondary ÷áùðïéîô  ";

        st2=" Áãôéïî:                  \n\n";
        
        if (self.army_ready == TRUE)
            st2=" Áãôéïî: ¼soldier waiting¾\n\n";

        custom_demon_name(self.demon_one);

//1 “
//2 ”
//3 •
//4 –
//5 —
        
        
        //CenterPrint5(self, self.demon_one.undercover_name, self.demon_one.netname,"\n\n", st2, "\n\n”.. Soldier inventory     \n\n•.. Set primary ÷áùðïéîô  \n–.. Set secondary ÷áùðïéîô\n—.. Follow me!            \n˜.. Stay there!           \n\nš®® Detonate soldier brain\n\n’.. Îïôèéîç               \n");
        
        local string st4;
        st4="\n•.. Follow me!            \n–.. Stay there!           \n—.. Use your waypoints!   ";
        
        if (self.demon_one.penance_time==1)
            st4="\n* •.. Follow me!              \n–.. Stay there!           \n—.. Use your waypoints!   ";
        else if (self.demon_one.penance_time==2)
            st4="\n•.. Follow me!            \n* –.. Stay there!             \n—.. Use your waypoints!   ";
        else if (self.demon_one.penance_time==3)
            st4="\n•.. Follow me!            \n–.. Stay there!           \n* —.. Use your waypoints!     ";
        
        CenterPrint7(self, self.demon_one.undercover_name, self.demon_one.netname,"\n\n", st2, 
st3,st4,"\n\nš®® Detonate soldier brain\n\n’.. Îïôèéîç               \n");
        return;
    }
    else
    {
        if (self.army_ready==TRUE)
        {
            CenterPrint(self, " Áãôéïî:                  \n\n“.. Teleport soldier      \n\n’.. Îïôèéîç               \n\n\nReady for teleporting!");
        }
        else
        {
            CenterPrint3(self, " Áãôéïî:                  \n\n\n\n’.. Îïôèéîç               \n\n\nPreparing teleporting...\n\nÔéíå ìåæô: ",st,st2);
        }

    }

  //ideas:
  
  //((centered soldier status
  // \n attacking)) ((xxxx)) - seeking xxxx - standing - on patrol|walking - following you - following u (forced)//1 prt (2 vars, one for displaying and keep preference and the other for ai)

  //((1.. tactic mode:        normal - agressive - static // 1 prt))
  // 2.. ignore enemy:   on - off
  // normal - tries to return to waypoints when enemy not visible (like in the aussie version)
  // agressive - he tries to reach enemy when not visible (like before when no tactic stuff)
  // patrol - forces grunty to use waypoints - and reports when he cant
  // static - soldier dont move when attacking if no waypoints, if there r he moves on the line between them
  // passive - makes soldier to ignore enemy completely

  //NO! AI improvement - 0 none 1 desires to be close to enemy 2 desires to be farther

  //((3.. obstacle:     sort - stop  // 1 prt
  //4.. talk mode:     on - off))
  //((5.. reports:   all - most - some - off // 1 prt

  //st=

  //6.. show soldier's inventory
  //

  // health:)) ((500)) ((hp // 1 prt

    // 0.. NOTHING)) // 1 prt
  //FULL
  // (when in patrol or others) hmmm... forgot my xxxx waypoint, sorry!
  
  // when forced "follow me", random time until "lemme kill them!" and restore status
  // when forced "follow me" super_time controls time between the "i can see the enemy from here"

  // inv in new menu, so spacing nicer

  // "use ur waypoints!" in first menu

  // follow me, stay there and use ur waypoints defined in a variable to restore last intention when enemy becomes not visible

  //self.demon_one = AssignEasyWaypoint
  // scan for other targets when aggressive and enemy not visible
  // when aggressive augmnet probability of direct walk to last seen mark
  // * primary

  //in waypoint donothing, if soldier already have assinged the corresponding waypoint to another entity dremove(self);
};

void() Menu_Army2 =
{
    local string st,st2,st3,st4,st5,st6,st7;
    
    st3="";

    if (self.demon_one.enemy!=world && visible2(self.demon_one,self.demon_one.enemy))
    {
        st2="Ÿ Óïìäéåò Óôáôõó Ÿ\n\nAttacking ";
        st3=GetEnemyName(self.demon_one.enemy);
    }
    else if (self.demon_one.enemy!=world)
    {
        st2="Ÿ Óïìäéåò Óôáôõó Ÿ\n\nSeeking ";
        st3=GetEnemyName(self.demon_one.enemy);
    }
    else if (self.demon_one.goalentity==self)
        st2="Ÿ Óïìäéåò Óôáôõó Ÿ\n\nFollowing You";
    else if (self.demon_one.goalentity==world)
        st2="Ÿ Óïìäéåò Óôáôõó Ÿ\n\nStanding";
    else if (self.demon_one.goalentity!=world)
        st2="Ÿ Óïìäéåò Óôáôõó Ÿ\n\nOn Patrol";    

    st5=""; // this will be static range
    
   if (self.demon_one.is_malfunctioning==0)
    {
        if (self.demon_one.is_detpacking==0 && self.demon_one.is_toffingadet==1)
            st4="\n\n“.. Ôáãôéã Íïäå:    normal\n”.. Åîçáçå Åîåíù:   no    \n•.. Ïî Ïâóôáãìå:    stop  \n";
        else if (self.demon_one.is_detpacking==1 && self.demon_one.is_toffingadet==1)
            st4="\n\n“.. Ôáãôéã Íïäå:    normal\n”.. Åîçáçå Åîåíù:   yes   \n•.. Ïî Ïâóôáãìå:    stop  \n";
        else if (self.demon_one.is_detpacking==0 && self.demon_one.is_toffingadet==0)
            st4="\n\n“.. Ôáãôéã Íïäå:    normal\n”.. Åîçáçå Åîåíù:   no    \n•.. Ïî Ïâóôáãìå:    jump  \n";
        else if (self.demon_one.is_detpacking==1 && self.demon_one.is_toffingadet==0)
            st4="\n\n“.. Ôáãôéã Íïäå:    normal\n”.. Åîçáçå Åîåíù:   yes   \n•.. Ïî Ïâóôáãìå:    jump  \n";
    }
    else if (self.demon_one.is_malfunctioning==1)
    {
        if (self.demon_one.is_detpacking==0 && self.demon_one.is_toffingadet==1)
            st4="\n\n“.. Ôáãôéã Íïäå:    seek  \n”.. Åîçáçå Åîåíù:   no    \n•.. Ïî Ïâóôáãìå:    stop  \n";
        else if (self.demon_one.is_detpacking==1 && self.demon_one.is_toffingadet==1)
            st4="\n\n“.. Ôáãôéã Íïäå:    seek  \n”.. Åîçáçå Åîåíù:   yes   \n•.. Ïî Ïâóôáãìå:    stop  \n";
        else if (self.demon_one.is_detpacking==0 && self.demon_one.is_toffingadet==0)
            st4="\n\n“.. Ôáãôéã Íïäå:    seek  \n”.. Åîçáçå Åîåíù:   no    \n•.. Ïî Ïâóôáãìå:    jump  \n";
        else if (self.demon_one.is_detpacking==1 && self.demon_one.is_toffingadet==0)
            st4="\n\n“.. Ôáãôéã Íïäå:    seek  \n”.. Åîçáçå Åîåíù:   yes   \n•.. Ïî Ïâóôáãìå:    jump  \n";
    }
    else if (self.demon_one.is_malfunctioning==2)
    {
        if (self.demon_one.army_ready == 0)
           st5="–.. Óôáôéã Òáîçå:   none  \n";        
        else if (self.demon_one.army_ready == 1)
           st5="–.. Óôáôéã Òáîçå:   small \n";
        else if (self.demon_one.army_ready == 2)
           st5="–.. Óôáôéã Òáîçå:   medium\n";
        else if (self.demon_one.army_ready == 3)
           st5="–.. Óôáôéã Òáîçå:   large \n";

        if (self.demon_one.is_detpacking==0 && self.demon_one.is_toffingadet==1)
            st4="\n\n“.. Ôáãôéã Íïäå:    static\n”.. Åîçáçå Åîåíù:   no    \n•.. Ïî Ïâóôáãìå:    stop  \n";
        else if (self.demon_one.is_detpacking==1 && self.demon_one.is_toffingadet==1)
            st4="\n\n“.. Ôáãôéã Íïäå:    static\n”.. Åîçáçå Åîåíù:   yes   \n•.. Ïî Ïâóôáãìå:    stop  \n";
        else if (self.demon_one.is_detpacking==0 && self.demon_one.is_toffingadet==0)
            st4="\n\n“.. Ôáãôéã Íïäå:    static\n”.. Åîçáçå Åîåíù:   no    \n•.. Ïî Ïâóôáãìå:    jump  \n";
        else if (self.demon_one.is_detpacking==1 && self.demon_one.is_toffingadet==0)
            st4="\n\n“.. Ôáãôéã Íïäå:    static\n”.. Åîçáçå Åîåíù:   yes   \n•.. Ïî Ïâóôáãìå:    jump  \n";
    }
    
   if (self.demon_one.num_mines==0)
        st6="˜.. Òåðïòôó:        all   \n\n™.. Inventory  ’.. Îïôèéîç\n\nÍáø ÈÐ: ";
    else if (self.demon_one.num_mines==1) 
        st6="˜.. Òåðïòôó:        most  \n\n™.. Inventory  ’.. Îïôèéîç\n\nÍáø ÈÐ: ";
    else if (self.demon_one.num_mines==2) 
        st6="˜.. Òåðïòôó:        some  \n\n™.. Inventory  ’.. Îïôèéîç\n\nÍáø ÈÐ: ";
    else if (self.demon_one.num_mines==3) 
        st6="˜.. Òåðïòôó:        none  \n\n™.. Inventory  ’.. Îïôèéîç\n\nÍáø ÈÐ: ";                                     
                                     
                                     // "™.. Soldier inventory...  "
    st7=ftos(floor(self.demon_one.max_health));

    CenterPrint7(self,st,st2,st3,st4,st5,st6,st7);
};

void(float inp) Menu_Army_Input1;
void(float inp) Menu_Army_Input2;

void(float inp) Menu_Army_Input =
{
    if (self.job & JOB_DEMON_OUT)
    {
        if (self.demon_one.is_haxxxoring == 1) Menu_Army_Input2(inp);
        else Menu_Army_Input1(inp);        
    }
    else Menu_Army_Input1(inp);
};

void(float inp) Menu_Army_Input2 =
{
	if (inp == 10 || self.demon_one==world) // NOTHING
	{	
		ResetMenu();
		self.impulse = 0;
		self.demon_one.is_haxxxoring = 0; // go back to first menu
        return;
	}

    if (inp == 1)
    {
        self.impulse = 0;
        self.demon_one.is_malfunctioning=self.demon_one.is_malfunctioning+1;

        if (self.demon_one.is_malfunctioning > 2)
        self.demon_one.is_malfunctioning=0;
        return;
    }  

    if (inp == 2) // engage enemy??
    {
        self.impulse = 0;
        if (self.demon_one.is_detpacking == 0)
        {
            self.demon_one.is_detpacking=1;
            PrintFromSoldier(self.demon_one,self,"i'm gonna kill them all!\n");
        }
        else
        {
            self.demon_one.is_detpacking=0;
            self.demon_one.has_teleporter = 0;
			self.demon_one.effects = self.demon_one.effects - (self.demon_one.effects & EF_DIMLIGHT);

            if (self.demon_one.enemy!=world)//self.demon_one.goalentity)
            {
                self.demon_one.enemy=world;                
                self.demon_one.goalentity = ReturnEasyWaypoint(self.demon_one,self.demon_one);
            }

            PrintFromSoldier(self.demon_one,self,"Ignoring enemy!\n");
        }
    }  

    if (inp == 3) // jump or stop??
    {
        self.impulse = 0;
        if (self.demon_one.is_toffingadet == 0) self.demon_one.is_toffingadet=1;
        else self.demon_one.is_toffingadet=0;
    }

    if (inp == 4 && self.demon_one.is_malfunctioning == 2) // static range, small mdeium or large
    {
        self.impulse = 0;
        self.demon_one.army_ready=self.demon_one.army_ready+1;

        if (self.demon_one.army_ready > 3)
        self.demon_one.army_ready=0;
        return;
    }  


    if (inp == 6)
    {
        self.impulse = 0;
        self.demon_one.num_mines=self.demon_one.num_mines+1;

        if (self.demon_one.num_mines > 3)
        self.demon_one.num_mines=0;
        return;
    }

    else if (inp == 7) // Army info
	{
        ResetMenu();
        local entity oself;
        oself=self;
        self=self.demon_one;
        Grunty_StateInv();
        self=oself;
		self.impulse = 0;
        return;
	}

};

void(float inp) Menu_Army_Input1 =
{
	local float r;
	local entity SummonTimer;
	local float cost;
	local entity te;
	local float points;

	//self.demon_choice = 0; // reset demon choice var
	
	if (inp == 10) // NOTHING
	{	
		ResetMenu();
		self.impulse = 0;
     
        if (self.army_ready == FALSE && !(self.job & JOB_DEMON_OUT))
        {
            sprint(self,PRINT_HIGH,"Still ");
            PrintArmyTime(self);
            sprint(self,PRINT_HIGH," time left until next teleporting\n");
            self.job_finished=time+0.5;
        }
        
        return;
	}
    else if (inp == 1 && self.demon_one == world) // Teleport it!
	{	
		if (self.army_ready == TRUE && self.demon_one==world && !(self.job & JOB_DEMON_OUT))
        {
           ResetMenu();
           //StartTeleArmy();
           
           if (TeleSoldier())
           {
               self.army_ready=FALSE; // needed for setarmytimer
               SetArmyTimer(); // prepare reserve soldier
               self.job = self.job | JOB_DEMON_OUT; 
           }

           self.impulse = 0;
        }
		
        return;
	}	
	else if (inp == 8) // Kill it!
	{
		if (self.demon_one!=world)
        {            
            ResetMenu();
            sprint(self,PRINT_HIGH,"You detonate the micro-explosive implanted in his brain!\n");
            //PrintFromSoldier(self.demon_one,self,"(head): aw! what happens?!\n");
            kill_my_demon();
            teamprefixsprint(self.team_no, self);
            teamsprint(self.team_no,self, self.netname);
	        teamsprint(self.team_no,self, " detonates his soldier\n");
            self.impulse = 0;
		} 
        
          //  sprint(self,PRINT_HIGH,"You do not have a soldier in-battle currently\n");
		
		return;
	}
	else if (inp == 1 && self.demon_one != world) // primary waypoint
	{
        
        if (self.demon_one.martyr_enemy != world)
            RemoveWaypoint(self.demon_one.martyr_enemy,self.demon_one);
        
        if (self.demon_one.demon_two != world)
            RemoveWaypoint(self.demon_one.demon_two,self.demon_one);

            //dremove(self.demon_one.martyr_enemy);

        /*if (self.demon_one.demon_two != world)
			dremove(self.demon_one.demon_two);*/ // OfN - prova

    	self.demon_one.martyr_enemy = CreateWaypoint(self.origin, WAYPOINT_LIFE, WAYPOINT_TYPE_PRIMARY);
		self.demon_one.martyr_enemy.goalentity = world;
		
        self.demon_one.penance_time=3;
        if (visible2(self.demon_one,self.demon_one.martyr_enemy)) self.demon_one.goalentity = self.demon_one.martyr_enemy;
		
        ResetMenu(); // reset menu?
		
        self.impulse = 0;

        PrintFromSoldier(self.demon_one,self,"yes sir!\n");

		return;
	}
	else if (inp == 2 && self.demon_one != world) // secondary waypoint
	{
        if (self.demon_one.demon_two != world)
            RemoveWaypoint(self.demon_one.demon_two,self.demon_one);

        if (self.demon_one.martyr_enemy==world)
        {
            self.impulse=0;
            PrintFromSoldier(self.demon_one,self,"you must set my primary waypoint first!\n");
            ResetMenu(); // reset menu?
            return;
        }

            //dremove(self.demon_one.demon_two);

		self.demon_one.demon_two = CreateWaypoint(self.origin, WAYPOINT_LIFE, WAYPOINT_TYPE_SECONDARY);
		self.demon_one.demon_two.goalentity = self.demon_one.martyr_enemy;
		//self.demon_one.goalentity = self.demon_one.demon_two; 
        self.demon_one.job = 2;
        self.demon_one.penance_time=3;
        self.demon_one.goalentity = ReturnEasyWaypoint(self.demon_one,self.demon_one);
		if (self.demon_one.martyr_enemy!=world) self.demon_one.martyr_enemy.goalentity = self.demon_one.demon_two;
		
        ResetMenu(); // reset menu?
        
        self.impulse = 0;        

        PrintFromSoldier(self.demon_one,self,"Ok\n");

		return;
	}
	else if (inp == 3 && self.demon_one != world) // FOLLOW ME, GRUNTY!
	{
        if (self.demon_one.enemy!=world)
        {
            if (visible2(self.demon_one,self.demon_one.enemy))
            {
                PrintFromSoldier(self.demon_one,self,"i'm fighting the enemy!\n");
                ResetMenu();
                self.impulse=0;
                self.demon_one.penance_time = 1;
                return;
            }            
        }

        self.demon_one.has_teleporter = 0;
      	self.demon_one.effects = self.demon_one.effects - (self.demon_one.effects & EF_DIMLIGHT);
        self.demon_one.penance_time = 1;

        if (self.demon_one.goalentity != self)
		{
			self.demon_one.goalentity = self;			
            PrintFromSoldier(self.demon_one,self,"Ok!\n");
        }
		else
		{
			PrintFromSoldier(self.demon_one,self,"Already following you!\n");
		}

        ResetMenu();
		self.impulse = 0;
    	return;
	}

    else if (inp == 4 && self.demon_one != world) // Stay there!
	{
        if (self.demon_one.enemy!=world)
        {
            if (visible2(self.demon_one,self.demon_one.enemy))
            {
                PrintFromSoldier(self.demon_one,self,"i'm fighting the enemy!\n");
                ResetMenu();
                self.impulse=0;
                self.demon_one.penance_time = 2;
                return;
            }

            self.demon_one.has_teleporter = 0;
        	self.demon_one.effects = self.demon_one.effects - (self.demon_one.effects & EF_DIMLIGHT);
        }

		self.demon_one.goalentity = world;
        PrintFromSoldier(self.demon_one,self,"Holding position...\n");

        self.demon_one.penance_time = 2;

        ResetMenu();
		self.impulse = 0;
    	return;
	}

    else if (inp == 5 && self.demon_one != world) // Use your waypoints!
	{
        if (self.demon_one.enemy!=world)
        {
            if (visible2(self.demon_one,self.demon_one.enemy))
            {
                PrintFromSoldier(self.demon_one,self,"i'm fighting the enemy!\n");
                ResetMenu();
                self.impulse=0;
                self.demon_one.penance_time = 3;
                return;
            }
            self.demon_one.has_teleporter = 0;
        	self.demon_one.effects = self.demon_one.effects - (self.demon_one.effects & EF_DIMLIGHT);
        }

        self.demon_one.penance_time = 3;
        self.demon_one.goalentity = ReturnEasyWaypoint(self.demon_one,self.demon_one);

		if (self.demon_one.goalentity != world)
        {
            PrintFromSoldier(self.demon_one,self,"Moving on!\n");
        }
        /*else
        {
            PrintFromSoldier(self.demon_one,self,"Where are my waypoints?\n");
        }*/

        self.demon_one.has_teleporter = 0;
    	self.demon_one.effects = self.demon_one.effects - (self.demon_one.effects & EF_DIMLIGHT);

        ResetMenu();
		self.impulse = 0;
    	return;
	}

};


float() TeleSoldier =
{
    makevectors (self.v_angle);
	v_forward_z = 0;
	v_forward = normalize(v_forward) * 64;

	newmis = spawn();
	newmis.owner = newmis; //WK Self
	newmis.real_owner = self;
    
    newmis.classname = "monster_army";
    setmodel (newmis, "progs/grunty.mdl");

    newmis.origin = self.origin + v_forward;
	newmis.has_camera = 4;
	custom_demon_name(newmis); 
 
    if (!CheckArea(newmis,self)) { //No room for el diablo
		sprint(self,PRINT_HIGH,"Not enough room to teleport soldier!\n");
		newmis.think = SUB_Remove;
		newmis.nextthink = time + 0.1;
		return FALSE;
	}

    spawn_tfog(newmis.origin);
    
    setmodel (newmis, "progs/grunty.mdl");
	setsize (newmis, '-16 -16 -24', '16 16 32');

    newmis.skin = self.team_no - 1;
    
    //
    //newmis.colormap=self.colormap;
    //newmis.skin=self.skin;
    //newmis.team=self.team;

    teamprefixsprint(self.team_no,self);
    teamsprint(self.team_no,self,self.netname);
	teamsprint(self.team_no,self," teleported Private Class III ");
    //teamsprint(self.team_no,self, "");
	teamsprint(self.team_no,self,newmis.netname);
	teamsprint(self.team_no,self,"\n");

	self.job_finished = time + 1;	//Don't let em kill demon for 15 secs.
									// SB 15 is tight; 10
									// 10 is tight; 5
                                    // OfN 5 is tight; 3 ;)

	//newmis.velocity = v_forward * 10 + '0 0 250';
	newmis.velocity = v_forward * 10;
	newmis.angles = vectoangles(newmis.velocity);
	if (newmis.flags & FL_ONGROUND)
		newmis.flags = newmis.flags - FL_ONGROUND;

	newmis.movetype = MOVETYPE_TOSS;
    newmis.solid = SOLID_SLIDEBOX;
	newmis.takedamage = DAMAGE_AIM;
    
    newmis.health = GRUNTY_HP;
	newmis.has_tesla = 1; // SB level multiplier
	newmis.has_sensor = 1; // SB level
	newmis.has_sentry = 2; // SB frags to level
	
    newmis.frame = $stand13;
	
    newmis.th_stand = grunty_stand;
	newmis.th_run = grunty_run;
	newmis.th_missile = GruntyCheckFire;
	newmis.th_pain = grunty_pain;
	newmis.custom_speed = 10; // 10
	newmis.yaw_speed = 55;
	
    //#ifdef GRUNTY_EXTRA_WEAPONS
    //newmis.weapons_carried = WEAP_AXE + WEAP_SHOTGUN + WEAP_NAILGUN + GRUNTY_EXTRA_WEAPONS;
    //#else
    newmis.weapons_carried = WEAP_AXE + WEAP_SHOTGUN + WEAP_NAILGUN;
    //#endif
    
    newmis.tf_items = 0;
	newmis.view_ofs = '0 0 22';
	newmis.money = 100;
	newmis.respawn_time = time + 20;
	newmis.suicide_time = time + 20;
	newmis.ammo_shells = 25;
	newmis.ammo_nails = 50;
	newmis.ammo_rockets = 8; //was 4
	newmis.ammo_cells = 10;
	newmis.maxammo_shells = 50; // was 75;
	newmis.maxammo_nails = 200;//was 200;
	newmis.maxammo_rockets = 20;
	newmis.maxammo_cells = 100;
	newmis.current_weapon = WEAP_SHOTGUN;
	newmis.th_die = custom_grunt_die;
	newmis.think = walkmonster_start;
	newmis.nextthink = time + 1;
	newmis.armorclass = 0; //- OfN none // AT_SAVESHOT; // kevlar
	newmis.last_saveme_sound = 0; // ? oh that
	
    //newmis.touch = SUB_Null;
    newmis.touch = grunty_touch; //-OfN- 
    newmis.has_holo = time+2; // touch messages delay
    newmis.is_detpacking=1; //resets engage enemy to "yes"

    newmis.real_owner.demon_one = newmis; // DEMON ONE

	newmis.max_health = newmis.health;

    newmis.ltime=time; // trhown or felt on water?
    newmis.martyr_enemy=world;
    newmis.demon_one=world;
    newmis.demon_two=world;
    
    sprint(self,PRINT_HIGH,"You teleport your soldier.\n");
    //PrintFromSoldier(self.demon_one,self,"Your orders?\n");

    newmis.message = "XX"; // flag to identify monsters/army for sentry targetting

    newmis.team_no = self.team_no;

    GetRank(newmis); // needed for army menu first update

    return TRUE;

};

//==============================================================//

void() ArmyTimerThink;


void() SetArmyTimer =
{
    if (self.army_ready!=FALSE || self.job & JOB_DEMON_OUT) return;

    if (GetArmyTimer(self)!=world) return;
    
    newmis = spawn();
    newmis.classname="army_timer";
    newmis.owner=self;

    newmis.think = ArmyTimerThink;
    newmis.nextthink = time + (60*army_delay)+60-(120*random()); // +/- 1 random minute

#ifdef ARMY_TEST
    newmis.nextthink = time + 5; 
#endif

    self.army_ready=FALSE;    
};


void() ArmyTimerThink =
{
    //if (self.classname!="army_timer") return; not needed

                                      //FIXME: This shouldnt be needed
    if (self.owner.has_disconnected || !(self.owner.job & JOB_ARMY))
	{
        dremove(self);
        return;
    }

    if (self.owner.demon_one!=world)
    {
        sprint(self.owner,PRINT_HIGH,"You have another soldier waiting!\n");
        self.owner.army_ready = TRUE;
        dremove(self);
    }
    else
    {
        sprint(self.owner,PRINT_HIGH,"Soldier is ready for teleporting!\n");
        self.owner.army_ready = TRUE;
        dremove(self);                
//        self.nextthink = time + (60*army_delay)+60-(120*random());

  #ifdef ARMY_TEST
//        self.nextthink = time + 5; 
  #endif

    }
};

entity(entity player) GetArmyTimer =
{
    local entity te;
    te = find(world, classname, "army_timer");
    while (te)
	{
		if (te.owner == player)
          return te;
        
		te = find(te, classname, "army_timer");
	}

    return world;
};

void() RemoveArmyTimer =
{
    local entity te;
    te=GetArmyTimer(self);
    if (te!=world)
        dremove(te);
};

string (float num) Digitize;

void(entity player) PrintArmyTime =
{
    if (player.army_ready==TRUE || player.classname!="player") return;

    local string st;
    local float fl,fl2,fl3;
    local entity ArmyTimer;

    ArmyTimer=GetArmyTimer(player);

    if (ArmyTimer==world) return;

    fl=fabs(floor(ArmyTimer.nextthink - time));
    
    fl3=floor(fl/60);
    
    st=ftos(fl3);
   
    sprint(player,PRINT_HIGH,st);
    sprint(player,PRINT_HIGH,":");

    fl2=fabs(fl-fl3*60);
    st=Digitize(fl2);
    sprint(player,PRINT_HIGH,st);
};

string (float num) Digitize =
{
    if (num>9) 
        return ftos(num);
    else
    {
        if (num==0)
            return "00";
        else if (num==1)
            return "01";
        else if (num==2)
            return "02";
        else if (num==3)
            return "03";
        else if (num==4)
            return "04";
        else if (num==5)
            return "05";
        else if (num==6)
            return "06";
        else if (num==7)
            return "07";
        else if (num==8)
            return "08";
        else if (num==9)
            return "09";
    }
};

//=======================================================//

void(entity sld, entity player, string msg) PrintFromSoldier =
{
    if (sld.classname!="monster_army" || player.classname!="player") return;
    
    custom_demon_name(sld);
    sprint(player,PRINT_HIGH,sld.netname);
    sprint(player,PRINT_HIGH," ");
    sprint(player,PRINT_HIGH,msg);
};

string(entity sld) GetOwnerMessage =
{
    local float rnum;
    rnum=random();   
    
    if (sld.goalentity!=sld.real_owner)
    {
        if (rnum < 0.2 && sld.health < 200)
           return "tell my wife I love her!\n";
        else if (rnum < 0.2)
            return "remember I can't swim! heh\n";
        else if (rnum < 0.4)
            return "ready to kill!\n";  
        else if (rnum < 0.6)
            return "i'm looking for the enemy\n";
        else if (rnum < 0.8)
            return "i'm prepared!\n";            
        else return "awaiting your orders!\n";
    }
    else
    {
        if (rnum < 0.5)
            return "i'm following you!\n";
        else return "where do you want to go?\n";
    }

};

string(entity sld) GetFriendlyMessage =
{
    local float rnum;
    rnum=random();

    if (rnum < 0.5)
      return "try to not shoot me when fighting enemy! heh\n";
    else return "lets destroy the enemy!\n";
    //else return "Hope I don't crash the server\n";
};