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

/*=======================================================//
// haxxx.QC - CustomTF 3.2.OfN             - 30/1/2001 - //
// Idea and base code by SB-1 tech, rewritten by often   //
//=======================================================//
// Hacker related stuff                                  //
//=======================================================*/

void(float input) SBInitiateInterface;
string(entity thebuilding) GetBuildingName;
float(float input) IntToExp;
float (entity hacked) GetICELevel;
float() CheckHaxxx;
void(entity ignore, string st, string st2, string st3, string st4, string st5, string st6) teamsprint6;

void () Menu_Friend_Hax =
{
	if (!self.demon_two) // safety
    {
        sprint(self,PRINT_HIGH,"You have lost the connection!\n");
        ResetMenu();
        return;
    }
    
    local string st,st2,st3,st4,st5,st6,st7;

    st6="\n\nCom­Link åóôáâìéóèåä";
    st7=" Áãôéïî:                    \n\n";
    st5="\n\nš.. Hack-Repair       Û8 secÝ\n\n’.. Îïôèéîç                  "; 
    st4="";
    st2="\n.. Add ìåöåì “ ICE  Û20 secÝ";
	st = st3 = "";

    if (!visible2x(self,self.demon_two))
		st6="\n\nLost connection with target!\n";
/*    else 
    {
        local float dist;
        dist = vlen(self.origin - self.demon_two.origin);
        if (dist > HAX_UNSTABLEDIST)
        {
            st6="\n\nUnstable connection with target!\n";
        }
    }*/

    if (Teammate(self.demon_two.real_owner.team_no, self.team_no))
	{
		if (self.demon_two.classname == "building_dispenser")
        {
            st7="Targetº Friendly Dispenser\n\n"; 
            st=".. Improve capacity Û15 secÝ"; // DONE
            st3="\n•.. Enhance armour   Û10 secÝ"; // DONE
        }
		else if (self.demon_two.classname == "building_sentrygun")
        {
            st7="Targetº Friendly Sentry Gun\n\n";			
            st=".. Improve capacity Û10 secÝ"; // DONE - increase shells only
            st3="\n•.. Enhance armour   Û25 secÝ";
            st4="\n–.. Enhance circuits Û30 secÝ"; // DONE
		}
        else if (self.demon_two.classname == "building_tesla")
        {
            st7="Targetº Friendly Tesla Sentry\n\n";
            st=".. Improve capacity Û10 secÝ"; // DONE
            st3="\n•.. Enhance armour   Û25 secÝ"; // DONE
            st4="\n–.. Enhance circuits Û30 secÝ"; //\n—.. Add TractorBeam Û20 secÝ");
		}
        else if (self.demon_two.classname == "building_camera")
        {
            st7="Targetº Friendly Camera\n\n";
            st=".. Improve sensors  Û20 secÝ"; // DONE
            st3="\n•.. Enhance armour   Û20 secÝ"; // DONE       
		}
        else if (self.demon_two.classname == "building_sensor")
        {
            st7="Targetº Friendly Motion Sensor\n\n";
            st=".. Improve range    Û20 secÝ"; // DONE
            st3="\n•.. Enhance armour   Û10 secÝ"; // DONE
            st4="\n–.. Add spy revealer Û25 secÝ"; // DONE
        }
        else if (self.demon_two.classname == "building_teleporter")
        {
            st7="Targetº Friendly Teleporter\n\n";
            st=".. Improve capacity  Û5 secÝ"; // DONE
            st3="\n•.. Enhance armour   Û20 secÝ"; // DONE
            st4="\n–.. Increase range   Û30 secÝ"; // DONE
        }
        else if (self.demon_two.classname == "building_fieldgen")
        {
            st7="Targetº Friendly Field Generator\n\n";
            st=   ".. Improve capacity Û10 secÝ"; // DONE
            st3="\n•.. Enhance armour   Û15 secÝ"; // DONE
            st4="\n–.. Increase range   Û20 secÝ"; // DONE
        }
    }

    if (self.demon_two.num_mines & IMPROVED_ONE)
    {
        st="";
    }
    if (self.demon_two.num_mines & IMPROVED_TWO)
    {
        st2="\n.. Add ìåöåì ” ICE  Û25 secÝ";
        if (self.demon_two.num_mines & IMPROVED_FIVE)
        {
            st2="\n.. Add ìåöåì • ICE  Û30 secÝ";

            if (self.demon_two.num_mines & IMPROVED_SIX)
               st2="\n";
        }
        
    }
    if (self.demon_two.num_mines & IMPROVED_THREE)
    {
        st3="\n";
    }
    
    if (self.demon_two.classname != "building_sensor")
    {
        if (self.demon_two.num_mines & IMPROVED_FOUR)
        {
         st4="\n";
        }
    }
    else
    {
        if (self.demon_two.num_mines & IMPROVED_FOUR)
        {
            if (self.demon_two.num_mines & IMPROVED_SEVEN)
                st4="\n";
            else
                st4="\n–.. Thief revealer   Û25 secÝ";
        }
    }

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

};

void(float inp) Menu_FriendHax_Inp =
{
   	if (self.classname != "player" || !self.demon_two)
		return;
    
    if (inp == 10)
    {
        self.impulse=0;
        self.demon_two=NIL;
        ResetMenu();
        return;
    }
    if (inp == 8)
    {
        self.impulse=0;
        SBInitiateInterface(inp);
        ResetMenu();
        return;
    }
    if (inp < 5 && inp > 0)
    {
        
        if (inp == 4)
        {
            if (self.demon_two.classname == "building_sensor")
            {
                if (self.demon_two.num_mines & IMPROVED_FOUR)
                    inp = 7; // already has spy revealer so go for thief, check if it already has thief revealer below..
            }
            else if (self.demon_two.classname == "building_dispenser" || self.demon_two.classname == "building_camera")
            /*self.demon_two.classname != "building_sentrygun" &&
                self.demon_two.classname != "building_sensor" &&
                self.demon_two.classname != "building_teleporter" &&
                self.demon_two.classname != "building_tesla")*/
                return;
        }
        if (inp == 2 && self.demon_two.num_mines & IMPROVED_SIX)
            return; // device completelly iced, so do nothing
        
        if (self.demon_two.num_mines & IntToExp(inp) && inp != 2) // exclude ICE's
            return; // device already has this hack done, so do nothing

        SBInitiateInterface(inp);
        ResetMenu();		
		self.impulse = 0;
    }

};

void(float inp) Menu_EnemyHax_Inp =
{
   	if (self.classname != "player" || !self.demon_two)
		return;
    
    if (inp == 10)
    {
        self.impulse=0;
        self.demon_two=NIL;
        ResetMenu();
        return;
    }
    if (inp < 5 && inp > 0)
    {
        if (self.demon_two.is_malfunctioning & IntToExp(inp))
            return;
        
        SBInitiateInterface(inp);
        ResetMenu();		
		self.impulse = 0;
    }

};

void () Menu_Enemy_Hax =
{
	if (!self.demon_two) // safety
    {
        sprint(self,PRINT_HIGH,"You have lost the connection!\n");
        ResetMenu();
        return;
    }

    local string st,st2,st3,st4,st5,st6,st7;
	st=st2=st3=st4=st5=st6=st7="";

    st6="\n\nCom­Link åóôáâìéóèåä";
    st5="\n\n’.. Îïôèéîç                  ";
    st7=" Áãôéïî:                    \n\n";

    if (!visible2x(self,self.demon_two)) st6="\n\nLost connection with target!\n";
    else 
    {
        local float dist;
        dist = vlen(self.origin - self.demon_two.origin);
        if (dist > HAX_UNSTABLEDIST)
        {
            st6="\n\nUnstable connection with target!\n";
        }
    }

    if (!Teammate(self.demon_two.real_owner.team_no, self.team_no))
	{
		if (self.demon_two.classname == "building_dispenser")
        {
            st7="Ôáòçåô: Åîåíù Dispenser\n\n";
            st=".. Disable           Û3 secÝ";
            st2="\n.. Booby trap        Û6 secÝ";
            st3="\n•.. No production     Û3 secÝ";
            st4="\n–.. Subtle bomb       Û4 secÝ";            
        }
		else if (self.demon_two.classname == "building_sentrygun")
        {
            st7="Ôáòçåô: Åîåíù Sentry Gun\n\n";
            st=".. Incapacitate      Û3 secÝ";
            st2="\n.. Reduce accuracy   Û5 secÝ";
            st3="\n•.. RL malfunction    Û4 secÝ";
            st4="\n–.. Hostile takeover Û12 secÝ";            
        }
		else if (self.demon_two.classname == "building_tesla")
        {
            st7="Ôáòçåô: Åîåíù Tesla Sentry\n\n";            
            st=".. Incapacitate      Û8 secÝ";
            st2="\n.. Reduce output     Û6 secÝ";
            st3="\n•.. Overload          Û7 secÝ";
            st4="\n–.. Hostile takeover Û15 secÝ";
		}
        else if (self.demon_two.classname == "building_camera")
        {
            st7="Ôáòçåô: Åîåíù Camera\n\n";
            st=".. Disable comms     Û5 secÝ";
            st2="\n.. Disable speaker   Û2 secÝ";
            st3="\n•.. Sensor ghosts     Û6 secÝ";
            st4="\n–.. Hostile takeover  Û5 secÝ";
   		}
        else if (self.demon_two.classname == "building_sensor")
        {
            st7="Ôáòçåô: Åîåíù Motion Sensor\n\n";
            st=".. Disable sound     Û5 secÝ";
            st2="\n.. Disable light     Û5 secÝ";
            st3="\n•.. Deactivate        Û5 secÝ";
            st4="\n–.. Hostile takeover  Û5 secÝ";
        }
        else if (self.demon_two.classname == "building_teleporter")
		{
            st7="Ôáòçåô: Åîåíù Teleporter\n\n";
            st=".. Item stripper     Û3 secÝ";
            st2="\n.. Void location     Û7 secÝ";
            st3="\n•.. Target builder    Û5 secÝ";
            st4="\n–.. Disable           Û2 secÝ";
        }
        else if (self.demon_two.classname == "building_fieldgen")
		{
            st7="Ôáòçåô: Åîåíù Field Generator\n\n";
            st=".. Corrupt Generator Û3 secÝ";
            st2="\n.. Engineer Trap     Û7 secÝ";
            st3="\n•.. Reduce Output     Û5 secÝ";
            st4="\n–.. Disable           Û2 secÝ";
        }

	}

    if (self.demon_two.is_malfunctioning & SCREWUP_ONE)
    {
        st="";
    }
    if (self.demon_two.is_malfunctioning & SCREWUP_TWO)
    {
        st2="\n";
    }
    if (self.demon_two.is_malfunctioning & SCREWUP_THREE)
    {
        st3="\n";
    }
    if (self.demon_two.is_malfunctioning & SCREWUP_FOUR)
    {
        st4="\n";
    }

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

/*
===============
SBFireInterface

Uses the Cyber Interface on whatever you're looking at.

OfN - Rewritten
===============
*/

void() SBFireInterface =
{
	if (CheckHaxxx() == FALSE) return;
    
    local entity oself;
	local entity targ;
	local float hackThis;
	
	targ = self.martyr_enemy;
	hackThis = self.has_camera;   
	
	oself = self;
	
    self = self.owner;
	
    oself.think = SUB_Remove;	
    oself.nextthink = 0.1;
	dremove(oself);
	
	self.is_haxxxoring = 0;

	self.tfstate = self.tfstate - (self.tfstate & TFSTATE_CANT_MOVE);
	TeamFortress_SetSpeed(self);

    if (hackThis == -2)
    {
		sprint(self, PRINT_HIGH, "Hack aborted.\n");
        return;
    }

	if (targ.classname == "player" && (targ.cutf_items & CUTF_CYBERAUG))
	{
		if (!Teammate(targ.team_no, self.team_no))
		{
			targ.is_malfunctioning = 1;
			sprint(targ, PRINT_HIGH, "Oh no! Your cybernetic augmentations are malfunctioning!\n");
			sprint(self, PRINT_HIGH, "You tamper with ", targ.netname, "'s cybernetic augmentations.\n");
		}
		else if (Teammate(targ.team_no,self.team_no) && targ.is_malfunctioning)
		{
			targ.is_malfunctioning = 0;
			sprint(targ, PRINT_HIGH, self.netname, " adjusts your cybernetics to work properly again.\n");
			sprint(self, PRINT_HIGH, "You readjust ", targ.netname, "'s CyberAugs to work properly again.\n");
		}
	}
	else if (IsBuilding(targ))
	{
		if (!Teammate(targ.real_owner.team_no, self.team_no) && GetICELevel(targ)==1 && random() < 0.2)
        {
            sprint(self, PRINT_HIGH, "This device has a level 1 ICE, it's not easy to hack!\n");
            //sprint(targ.real_owner, PRINT_HIGH,"Somebody tried to hack your stuff...\n");
            return;
        }
        if (!Teammate(targ.real_owner.team_no, self.team_no) && GetICELevel(targ)==2)
        {
            sprint(self, PRINT_HIGH, "This device is hack-protected.\n");
            sprint(targ.real_owner, PRINT_HIGH,"Somebody just tried to hack your stuff...\n");
            return;
        }
        if (!Teammate(targ.real_owner.team_no, self.team_no) && GetICELevel(targ)==3)
        {
            sprint(self, PRINT_HIGH, "This device is hack-protected with a level 3 ICE!\n");
            deathmsg=DMSG_ANTIHACK;
            TF_T_Damage(self, self, targ, self.health + 50, TF_TD_IGNOREARMOUR, TF_TD_OTHER);
            
            sound (self, CHAN_MISC, "effects/crunch.wav", 1, ATTN_NONE);

            return;
        }
        else if (!Teammate(targ.real_owner.team_no, self.team_no))
		{
			sprint(self, PRINT_HIGH, "You make a few adjustments...\n");
			if (hackThis == SCREWUP_ONE)
			{
				targ.is_malfunctioning = targ.is_malfunctioning | SCREWUP_ONE;
				if (targ.classname == "building_sentrygun") // 
					sprint(self, PRINT_HIGH, "The sentrygun is now incapacitated.\n");
				else if (targ.classname == "building_tesla")
					sprint(self, PRINT_HIGH, "The tesla won't shoot any more.\n");
				else if (targ.classname == "building_sensor")
					sprint(self, PRINT_HIGH, "Better when it doesn't make so much noise.\n");
				else if (targ.classname == "building_dispenser")
					sprint(self, PRINT_HIGH, "This is one dispenser that won't dispense any more.\n");
				else if (targ.classname == "building_camera")
					sprint(self, PRINT_HIGH, "The camera won't be reporting to its owner any longer, but to all outward appearances remains the same.\n");
				else if (targ.classname == "building_teleporter")
					sprint(self, PRINT_HIGH, "The teleporter will now strip the items off all who enter...\n");
				else if (targ.classname == "building_fieldgen")
				{
					sprint(self, PRINT_HIGH, "The field generator is now rigged to hurt teammates...\n");
					targ.martyr_enemy = self;
					if (targ.fieldgen_hasfield)
						targ.fieldgen_field.martyr_enemy = self;
				}
			}
			else if (hackThis == SCREWUP_TWO)
			{
				targ.is_malfunctioning = targ.is_malfunctioning | SCREWUP_TWO;
				if (targ.classname == "building_sentrygun")
					sprint(self, PRINT_HIGH, "The sentrygun's accuracy is now reduced.\n");
				else if (targ.classname == "building_tesla")
					sprint(self, PRINT_HIGH, "This tesla won't put out enough amperage to hurt a fly.\n");
				else if (targ.classname == "building_camera")
					sprint(self, PRINT_HIGH, "The camera is silenced.\n");
				else if (targ.classname == "building_sensor")
					sprint(self, PRINT_HIGH, "That glow was always pretty annoying anyway.\n");
				else if (targ.classname == "building_dispenser")
				{
					sprint(self, PRINT_HIGH, "The dispenser is now rigged to explode!\n");
					targ.martyr_enemy = self;
				}
				else if (targ.classname == "building_teleporter")
				{
					sprint(self, PRINT_HIGH, "Entering this teleporter could be unhealthy...\n");
					targ.martyr_enemy = self;
				}
                else if (targ.classname == "building_fieldgen")
				{
					sprint(self, PRINT_HIGH, "Better not use spanner on this one...\n");
					targ.martyr_enemy = self;
				}
			}
			else if (hackThis == SCREWUP_THREE)
			{
				targ.is_malfunctioning = targ.is_malfunctioning | SCREWUP_THREE;
				if (targ.classname == "building_sentrygun")
					sprint(self, PRINT_HIGH, "The sentrygun rocket launcher will now malfunction...\n");
				else if (targ.classname == "building_tesla")
					sprint(self, PRINT_HIGH, "The tesla may experience some technical difficulties the next time it fires...\n");
				else if (targ.classname == "building_camera")
					sprint(self, PRINT_HIGH, "This camera will be reading ghosts now...\n");
				else if (targ.classname == "building_dispenser")
					sprint(self, PRINT_HIGH, "The dispenser will no longer regenerate ammo.\n");
				else if (targ.classname == "building_teleporter")
					sprint(self, PRINT_HIGH, "The teleporter will now teleport directly to its builder!\n");
				else if (targ.classname == "building_sensor")
					sprint(self, PRINT_HIGH, "The sensor is now off.\n");
				else if (targ.classname == "building_fieldgen")
					sprint(self, PRINT_HIGH, "The field generator won't hurt too much now.\n");
			}
			else if (hackThis == SCREWUP_FOUR)
			{
                if (targ.classname != "building_dispenser" && targ.classname != "building_teleporter" && targ.classname != "building_fieldgen")
                {
                    local string st;
                    st=GetBuildingName(targ);

                    sprint(targ.real_owner, PRINT_HIGH,"You've lost the control of your ");
                    sprint(targ.real_owner, PRINT_HIGH, st);
                    sprint(targ.real_owner, PRINT_HIGH, "!!\n");

					sprint (self, PRINT_HIGH, "The ");
                    sprint (self, PRINT_HIGH, st);
                    sprint (self,PRINT_HIGH," is now yours!\n");	

                    teamprefixsprint(self.team_no,self);
                    teamsprint6(self,self.netname," hacked ",targ.real_owner.netname,"'s ",st,", now it's ours!\n");

                    teamprefixsprint(targ.real_owner.team_no,targ.real_owner);
                    teamsprint6(targ.real_owner,targ.real_owner.netname," has lost the control of his ",st,"!\n","","");

                    if (targ.classname == "building_sentrygun")
    				{
    					targ.real_owner.has_sentry = FALSE;
    					self.has_sentry = TRUE;
    				}
                    else if (targ.classname == "building_tesla")
    				{
                        targ.real_owner.has_tesla = FALSE;
    					self.has_tesla = TRUE;
    				}
                    else if (targ.classname == "building_camera")
    				{
                        targ.real_owner.has_camera = FALSE;
    					self.has_camera = TRUE;
    				}
                    else if (targ.classname == "building_sensor")
    				{
                        targ.real_owner.has_sensor = FALSE;
    					self.has_sensor = TRUE;
                    }

   					targ.real_owner = self;
                    targ.team_no = self.team_no;                
                }        
				else if (targ.classname == "building_fieldgen")
				{
					sprint(self, PRINT_HIGH, "The field generator is now disabled.\n");
					targ.is_malfunctioning = SCREWUP_FOUR;
				}
                else if (targ.classname == "building_teleporter")
				{
					sprint(self, PRINT_HIGH, "The teleporter is now broken.\n");
					targ.is_malfunctioning = SCREWUP_FOUR;
				}
				else if (targ.classname == "building_dispenser")
				{
					sprint(self, PRINT_HIGH, "The dispenser will explode when someone attempts to withdraw armour!\n");
					targ.martyr_enemy = self;
					targ.is_malfunctioning = SCREWUP_FOUR;
				}
			}
			else
			{
				sprint(self, PRINT_HIGH, "Your attempt at hacking fails.\n");
			}
		}
		else if (Teammate(targ.team_no,self.team_no) && hackThis == -1)
		{
			if (targ.is_malfunctioning)
            {
                targ.is_malfunctioning = 0;

			    sprint(self, PRINT_HIGH, "You correct the machine's malfunction.\n");
    			
                local string st;
                st=GetBuildingName(targ);

                if (self!=targ.real_owner)
                {                    
                    sprint(targ.real_owner, PRINT_HIGH, "your ");
                    sprint(targ.real_owner, PRINT_HIGH, st);
                    sprint(targ.real_owner, PRINT_HIGH," has been fixed by ");
                    sprint(targ.real_owner, PRINT_HIGH, self.netname);
                    sprint(targ.real_owner, PRINT_HIGH, "\n");

                    teamprefixsprintbi(self.team_no,self,targ.real_owner);
                    teamsprintbi(self,targ.real_owner,targ.real_owner.netname,"'s malfunctioning ",st," has been fixed by ",self.netname,"\n");
                }
                else
                {
                    teamprefixsprint(self.team_no,self);
                    teamsprint6(self,self.netname, " fixes his malfuntioning ",st,"\n","","");
                }
            }
            else
            {
                sprint(self, PRINT_HIGH, "There is nothing wrong with this machine.\n");
            }
		}
		else if (Teammate(targ.team_no,self.team_no))
		{
			//FRIENDLY IMPROVEMENTS
            targ.num_mines = targ.num_mines | hackThis;

            local string st;
            st=GetBuildingName(targ);

            sprint(self, PRINT_HIGH, "You make a few adjustments...\n");
			
            if (hackThis == IMPROVED_ONE)
            {
                if (targ.classname=="building_sensor")
                {
                    sprint(self, PRINT_HIGH, "The sensor has greater detection range now.\n");
                    
                    if (self != targ.real_owner)
                    {
                        sprint(targ.real_owner, PRINT_HIGH,"your motion sensor has greater detection range thanks to ");
                        sprint(targ.real_owner, PRINT_HIGH, self.netname);
                        sprint(targ.real_owner, PRINT_HIGH, ".\n");
                    }
                }
                else if (targ.classname=="building_camera")
                {
                    sprint(self, PRINT_HIGH, "The camera has greater range of view now.\n");
                    
                    if (self != targ.real_owner)
                    {
                        sprint(targ.real_owner, PRINT_HIGH, self.netname);
                        sprint(targ.real_owner, PRINT_HIGH," hacked your camera, it has better sensors now.\n");
                    }

                }
                else if (targ.classname=="building_tesla") 
                {
                    targ.maxammo_cells=targ.maxammo_cells*2;
                    sprint(self, PRINT_HIGH, "The tesla has extra cells capacity now.\n");
                    
                    if (self != targ.real_owner)
                    {
                        sprint(targ.real_owner, PRINT_HIGH, self.netname);
                        sprint(targ.real_owner, PRINT_HIGH," hacked your tesla, it has extra capacity for cells now.\n");
                    }


                }
                else if (targ.classname=="building_sentrygun")
                {                
                    targ.maxammo_shells=targ.maxammo_shells*2;
                    sprint(self, PRINT_HIGH, "The sentry gun has greater ammo capacity for shells now.\n");
                    
                    if (self != targ.real_owner)
                    {
                        sprint(targ.real_owner, PRINT_HIGH, self.netname);
                        sprint(targ.real_owner, PRINT_HIGH," hacked your sentry gun, it has extra capacity for shells now.\n");
                    }

                }
                else if (targ.classname=="building_dispenser")
                {                
                    sprint(self, PRINT_HIGH, "The dispenser capacity was increased.\n");
                    
                    if (self != targ.real_owner)
                    {
                        sprint(targ.real_owner, PRINT_HIGH, self.netname);
                        sprint(targ.real_owner, PRINT_HIGH," hacked your dispenser to increase its capacity.\n");
                    }

                }
                else if (targ.classname=="building_teleporter")
                {                
                    targ.maxammo_cells=targ.maxammo_cells*2;

                    sprint(self, PRINT_HIGH, "The teleporter cells capacity was increased.\n");
                    
                    if (self != targ.real_owner)
                    {
                        sprint(targ.real_owner, PRINT_HIGH, self.netname);
                        sprint(targ.real_owner, PRINT_HIGH," hacked your teleporter to increase its cells capacity.\n");
                    }

                }
                else if (targ.classname=="building_fieldgen")
                {                
                    targ.maxammo_cells=targ.maxammo_cells*2;

                    sprint(self, PRINT_HIGH, "The field generator cells capacity was increased.\n");
                    
                    if (self != targ.real_owner)
                    {
                        sprint(targ.real_owner, PRINT_HIGH, self.netname);
                        sprint(targ.real_owner, PRINT_HIGH," hacked your field generator to increase its cells capacity.\n");
                    }

                }


            }
            else if (hackThis == IMPROVED_TWO) //- ICE level 1
            {
                sprint(self, PRINT_HIGH, "You add a ìåöåì “ ICE to the ");
                sprint(self, PRINT_HIGH, st);
                sprint(self, PRINT_HIGH,".\n");

                if (self!=targ.real_owner)
                {
                    sprint(targ.real_owner, PRINT_HIGH, self.netname);
                    sprint(targ.real_owner, PRINT_HIGH," adds a ìåöåì “ ICE to your ");
                    sprint(targ.real_owner, PRINT_HIGH, st);
                    sprint(targ.real_owner, PRINT_HIGH, ".\n");
                }

            }
            else if (hackThis == IMPROVED_FIVE) //- ICE level 2
            {
                sprint(self, PRINT_HIGH, "You add a ìåöåì ” ICE to the ");
                sprint(self, PRINT_HIGH, st);
                sprint(self, PRINT_HIGH,".\n");

                if (self!=targ.real_owner)
                {
                    sprint(targ.real_owner, PRINT_HIGH, self.netname);
                    sprint(targ.real_owner, PRINT_HIGH," adds a ìåöåì ” ICE to your ");
                    sprint(targ.real_owner, PRINT_HIGH, st);
                    sprint(targ.real_owner, PRINT_HIGH, ".\n");
                }

            }
            else if (hackThis == IMPROVED_SIX) //- ICE level 3
            {
                sprint(self, PRINT_HIGH, "You add a ìåöåì • ICE to the ");
                sprint(self, PRINT_HIGH, st);
                sprint(self, PRINT_HIGH,".\n");

                if (self!=targ.real_owner)
                {
                    sprint(targ.real_owner, PRINT_HIGH, self.netname);
                    sprint(targ.real_owner, PRINT_HIGH," adds a ìåöåì • ICE to your ");
                    sprint(targ.real_owner, PRINT_HIGH, st);
                    sprint(targ.real_owner, PRINT_HIGH, ".\n");
                }

            }
            else if (hackThis == IMPROVED_THREE)
            {
                sprint(self, PRINT_HIGH, "You enhance the armour of the ");
                sprint(self, PRINT_HIGH, st);
                sprint(self, PRINT_HIGH,".\n");
                    
                if (self!=targ.real_owner)
                {
                    sprint(targ.real_owner, PRINT_HIGH, self.netname);
                    sprint(targ.real_owner, PRINT_HIGH," enhances the armour of your ");
                    sprint(targ.real_owner, PRINT_HIGH, st);
                    sprint(targ.real_owner, PRINT_HIGH, ".\n");
                }
                
                local float num;                
                
                num = targ.health / targ.max_health;
				if (num < 0) // this shouldn't happen, but I got a report that it did
					num = 0;
                targ.max_health = targ.max_health * 2;
                targ.health = num * targ.max_health;
                
            }
            else if (hackThis == IMPROVED_SEVEN)
            {
                if (targ.classname=="building_sensor")
                {
                    sprint(self, PRINT_HIGH, "The sensor will be able to uncover thieves now.\n");
                    
                    if (self!=targ.real_owner)
                    {
                        sprint(targ.real_owner, PRINT_HIGH, "your motion sensor can now uncover thieves after ");
                        sprint(targ.real_owner, PRINT_HIGH, self.netname);
                        sprint(targ.real_owner, PRINT_HIGH, "'s hack.\n");
                    }
                }
            }
            else if (hackThis == IMPROVED_FOUR)
            {
                if (targ.classname=="building_sensor")
                {
                    sprint(self, PRINT_HIGH, "The sensor will be able to uncover spies now.\n");
                    
                    if (self!=targ.real_owner)
                    {
                        sprint(targ.real_owner, PRINT_HIGH, "your motion sensor can now detect spies after ");
                        sprint(targ.real_owner, PRINT_HIGH, self.netname);
                        sprint(targ.real_owner, PRINT_HIGH, "'s hack.\n");
                    }
                }
                else if (targ.classname=="building_teleporter")
                {
                    sprint(self, PRINT_HIGH, "The teleporter had its range increased.\n");
                    
                    if (self!=targ.real_owner)
                    {
                        sprint(targ.real_owner, PRINT_HIGH, "your teleporter had its range increased by ");
                        sprint(targ.real_owner, PRINT_HIGH, self.netname);
                        sprint(targ.real_owner, PRINT_HIGH, "'s hack.\n");
                    }
                }
                else if (targ.classname=="building_fieldgen")
                {
                    sprint(self, PRINT_HIGH, "The field generator had its range increased.\n");
                    
                    if (self!=targ.real_owner)
                    {
                        sprint(targ.real_owner, PRINT_HIGH, "your field generator had its range increased by ");
                        sprint(targ.real_owner, PRINT_HIGH, self.netname);
                        sprint(targ.real_owner, PRINT_HIGH, "'s hack.\n");
                    }
                }
                else if (targ.classname=="building_tesla")
                {
                    sprint(self, PRINT_HIGH, "The tesla has a better chip-set now.\n");
                    
                    if (self!=targ.real_owner)
                    {
                        sprint(targ.real_owner, PRINT_HIGH, self.netname);
                        sprint(targ.real_owner, PRINT_HIGH, " enhances your tesla main circuits.\n");
                    }
                }
                else if (targ.classname=="building_sentrygun")
                {
                    sprint(self, PRINT_HIGH, "The sentry gun has a better chip-set now.\n");
                    
                    if (self!=targ.real_owner)
                    {
                        sprint(targ.real_owner, PRINT_HIGH, self.netname);
                        sprint(targ.real_owner, PRINT_HIGH, " enhances your sentry gun main circuits.\n");
                    }
                }
            }
            else
            {
                sprint(self, PRINT_HIGH, "OfteN: BUG! unknown hack value BUG! (wtf u hacked)\n");
                RPrint(self.netname);
                RPrint(" just made an unknown hack. (bug)");
            }
		}
	}
	
	//else
	//	sprint(self, PRINT_HIGH, "There is nothing there to hack!\n");
};

float(float input) IntToExp =
{
    if (input == 1) return 1;
    if (input == 2) return 2;
    if (input == 3) return 4;
    if (input == 4) return 8;
    if (input == 5) return 16;
    if (input == 6) return 32;
    if (input == 7) return 64;
    //if (input == 8) return 128;

    return 0;
};

float(entity hacked, float r) ReturnFHackDelay;

// SB hax0r tool - Cyber Interface
// OfN - Rewritten
void(float input) SBInitiateInterface =
{
	local entity te;

    if (!visible2x(self,self.demon_two))
    {
        sprint(self, PRINT_HIGH, "You are not connected to the target.\n");
        self.demon_two=NIL;
        return;
    }

    // DOUBLE CHECK, THIS ONE AFTER MENU, THE OTHER ON JOB_HACKER //
    if (self.is_feigning)
	{
		sprint(self, PRINT_HIGH, "You cannot hack while feigning.\n");
		return;
	}
	if (self.is_detpacking || self.is_toffingadet)
	{
		sprint(self, PRINT_HIGH, "You can't hack something while setting a detpack.\n");
		return;
	}
    if (self.is_building)
	{
		sprint(self, PRINT_HIGH, "You can't hack while building!\n");
		return;
	}
    // DOUBLE CHECK, THIS ONE AFTER MENU, THE OTHER ON JOB_HACKER //

    self.is_haxxxoring = 1;
    
    te = spawn();
    te.owner = self;
    te.classname = "timer";
    te.origin = self.demon_two.origin;
    te.nextthink = time + 1;
    
    te.has_holo = self.demon_two.team_no; // checked on think to break hacking if changes of team
    
    te.has_camera = IntToExp(input);
    
    if (!Teammate(self.demon_two.team_no,self.team_no))
    {            
        te.heat = ReturnHackDelay(self.demon_two, input);
        
        if (GetICELevel(self.demon_two)==1) // if it has a level1 ice add more delay to the hack
            te.heat=te.heat*2.5;

        local string st;
        st=GetBuildingName(self.demon_two);

        teamprefixsprint(self.team_no,self);
        teamsprint6(self,self.netname," started to hack ",self.demon_two.real_owner.netname,"'s ",st,"\n");

        local float dist;
        dist = vlen(self.origin - self.demon_two.origin);
        if (dist > HAX_UNSTABLEDIST)
        {
            sprint(self,PRINT_HIGH,"Connection unstable, it will take longer...");
            te.heat=te.heat*2;
        }
    }
    else
    {    
        te.heat = ReturnFHackDelay(self.demon_two, input);
        if (input==2 && self.demon_two.num_mines & IMPROVED_TWO)
        {
            te.has_camera=IMPROVED_FIVE;
            if (self.demon_two.num_mines & IMPROVED_FIVE)
                te.has_camera=IMPROVED_SIX;
        }

        if (input==8) te.has_camera=-1;
    }

    
    te.martyr_enemy = self.demon_two;
    te.think = SBHackDotTimerThink;
    
    self.tfstate = self.tfstate | TFSTATE_CANT_MOVE;
    TeamFortress_SetSpeed(self);
    sprint (self, PRINT_HIGH, "You immerse yourself in the cybernet...\n");
    makeImmune(self,time + te.heat); //- OfN - WORKS? yup

    te.ltime = te.heat;
    self.demon_two=te;
};

float (entity hacked) GetICELevel =
{
    local float retval;
    retval=0;

    if (hacked.num_mines & IMPROVED_TWO)
        retval=1;
    if (hacked.num_mines & IMPROVED_FIVE)
        retval=2;
    if (hacked.num_mines & IMPROVED_SIX)
        retval=3;
    
    return retval;
    
};

float(entity hacked, float r) ReturnHackDelay =
{
	if (hacked.classname == "player")
		return 5; // cyberaug hack
	else if (hacked.classname == "building_dispenser")
	{
		if (r == 1)
			return 3;
		else if (r == 2)
			return 6;
		else if (r == 3)
			return 3;
		else
			return 4;
	}
	else if (hacked.classname == "building_sentrygun")
	{
		if (r == 1)
			return 3;
		else if (r == 2)
			return 5;
		else if (r == 3)
			return 4;
		else
			return 12;
	}
	else if (hacked.classname == "building_tesla")
	{
		if (r == 1)
			return 8;
		else if (r == 2)
			return 6;
		else if (r == 3)
			return 7;
		else
			return 15;
	}
	else if (hacked.classname == "building_sensor")
		return 5;
	else if (hacked.classname == "building_camera")
	{
		if (r == 1)
			return 5;
		else if (r == 2)
			return 2;
		else if (r == 3)
			return 6;
		else
			return 5;
	}
	else if (hacked.classname == "building_teleporter")
	{
		if (r == 1)
			return 3;
		else if (r == 2)
			return 7;
		else if (r == 3)
			return 5;
		else
			return 2;
	}
    else if (hacked.classname == "building_fieldgen")
	{
		if (r == 1)
			return 3;
		else if (r == 2)
			return 7;
		else if (r == 3)
			return 5;
		else
			return 2;
	}
};

float(entity hacked, float r) ReturnFHackDelay =
{
	if (hacked.classname == "player")
		return 5; // cyberaug hack
    else if (r == 8) return 8; // repairing..
	else if (r == 2 && IsBuilding(hacked))
    {
        if (!(hacked.num_mines & IMPROVED_TWO))
            return 20; // level 1 ICE lasts for 20 seconds always
        if (!(hacked.num_mines & IMPROVED_FIVE))
            return 25; // level 2 ICE lasts for 25 seconds always
        if (!(hacked.num_mines & IMPROVED_SIX))
            return 30;    
    }
    else if (hacked.classname == "building_dispenser")
	{
		if (r == 1)
			return 15;
//		else if (r == 2)
//			return 30;
		else //if (r == 3)
			return 10;
		//else
		//	return 8;
	}
	else if (hacked.classname == "building_sentrygun")
	{
		if (r == 1)
			return 10;
//		else if (r == 2)
//			return 30;
		else if (r == 3)
			return 25;
		else
			return 30;
	}
	else if (hacked.classname == "building_tesla")
	{
		if (r == 1)
			return 10;
//		else if (r == 2)
//			return 30;
		else if (r == 3)
			return 25;
		else
			return 30;
	}
	else if (hacked.classname == "building_sensor")
	{
		if (r == 1)
			return 20;
//		else if (r == 2)
//			return 30;
		else if (r == 3)
			return 10;
		else //if (r == 4)
			return 25;
        //else
        //    return 8;
	}
	else if (hacked.classname == "building_camera")
	{
		if (r == 1)
			return 20;
//		else if (r == 2)
//			return 30;
		else // if (r == 3)
			return 20;
		//else
		//	return 8;
	}
	else if (hacked.classname == "building_teleporter")
	{
		if (r == 1)
			return 5;
//		else if (r == 2)
//			return 30;
		else if (r == 3)
			return 20;
		else// if (r == 4)
			return 30;
        //else
        //    return 8;
        
	}
    else if (hacked.classname == "building_fieldgen")
	{
		if (r == 1)
			return 10;
//		else if (r == 2)
//			return 30;
		else if (r == 3)
			return 15;
		else// if (r == 4)
			return 20;
        //else
        //    return 8;
        
	}

    return 999; // hehe, punishment to the bug generator :)
};

float() CheckHaxxx =
{
    local float retval;
    retval = TRUE;
        
    if (!self.martyr_enemy) // BUG!
        retval = FALSE;
    else if (!(IsBuilding(self.martyr_enemy)) && self.martyr_enemy.classname != "player") // BUG! GR what about cyberaug?
        retval = FALSE;
    else if (self.martyr_enemy.health <= 0)
    {
        sprint (self.owner, PRINT_HIGH, "Your target has been destroyed!\n");
        
        if (self.has_camera != -2)
        {
            deathmsg=DMSG_CYBERNET;
            TF_T_Damage(self.owner, self.owner, self.martyr_enemy, self.owner.health + 10, TF_TD_IGNOREARMOUR, TF_TD_OTHER);
            sound (self.owner, CHAN_MISC, "effects/crunch.wav", 1, ATTN_NONE);
        }

        retval = FALSE;
    }
    else if (self.martyr_enemy.team_no != self.has_holo) // target switched team? if so.. abort
    {
		sprint (self.owner, PRINT_HIGH, "The communication has been lost!\n");
        retval = FALSE;
    }
    else if (self.has_camera == -2)
    {
        retval = TRUE;
    }
    else if (Teammate(self.martyr_enemy.team_no,self.owner.team_no) && self.martyr_enemy.num_mines & self.has_camera && self.has_camera != -1)
    {
		sprint (self.owner, PRINT_HIGH, "Somebody improved that first.\n");
        retval = FALSE;
    }
    else if (!Teammate(self.martyr_enemy.team_no,self.owner.team_no) && self.martyr_enemy.is_malfunctioning & self.has_camera)
    {
		sprint (self.owner, PRINT_HIGH, "Somebody screwed that up first! heh\n");
        retval = FALSE;
    }

    if (!retval)
    {
		self.owner.is_haxxxoring = 0;
		self.owner.tfstate = self.tfstate - (self.tfstate & TFSTATE_CANT_MOVE);
        TeamFortress_SetSpeed(self.owner);
		self.think = SUB_Remove;
		self.nextthink = time + 0.1;
		dremove(self);
    }

    return retval;
};

void() SBHackDotTimerThink =
{
	if (CheckHaxxx() == FALSE) return;

    local vector org;    
  
    if (random() < 0.4) //-ofn was 0.3
	{
		org = self.martyr_enemy.origin;
		if (self.martyr_enemy.classname == "building_tesla" && self.martyr_enemy.tf_items & NIT_TURRET)
			org_z = org_z - 7; // - 32;
		else if (self.martyr_enemy.classname == "building_tesla")
			org_z = org_z + 7; // + 32;
		else if (self.martyr_enemy.classname == "building_sentrygun" && self.martyr_enemy.tf_items & NIT_TURRET)
			org_z = org_z - 16;
		else if (self.martyr_enemy.classname == "building_sentrygun")
			org_z = org_z + 16;
        else if (self.martyr_enemy.classname == "building_dispenser")
			org_z = org_z + 16;
	    else if (self.martyr_enemy.classname == "building_fieldgen")
			org_z = org_z + 32;

		WriteByte (MSG_MULTICAST, SVC_TEMPENTITY);
		WriteByte (MSG_MULTICAST, TE_GUNSHOT);
		WriteByte (MSG_MULTICAST, 3);
		WriteCoord (MSG_MULTICAST, org_x);
		WriteCoord (MSG_MULTICAST, org_y);
		WriteCoord (MSG_MULTICAST, org_z);
		multicast (org, MULTICAST_PVS);
	}
	
	self.heat = self.heat - 1;
	
	if (self.heat <= 0)
	{
		SBFireInterface();
		return;
	}
	
	self.nextthink = time + 1;
};

void() JobHacker =
{
	local vector source;
	
	if (self.is_haxxxoring)
	{		
        if (self.demon_two.has_camera == -2) return; // if we ralready aborting a hack...
        sprint(self, PRINT_HIGH, "Aborting hack...\n");
        self.demon_two.heat = 1 + 2 * random();
        self.demon_two.has_camera = -2;
		return;
	}
	if (self.is_feigning)
	{
		sprint(self, PRINT_HIGH, "You cannot hack while feigning.\n");
		return;
	}
	if (self.is_detpacking || self.is_toffingadet)
	{
		sprint(self, PRINT_HIGH, "You can't hack something while setting a detpack.\n");
		return;
	}
    if (self.is_building)
	{
		sprint(self, PRINT_HIGH, "You can't hack while building!\n");
		return;
	}
	
	source = self.origin + '0 0 16';

	traceline (source, source + v_forward*500, FALSE, self);
	
	if ( (IsBuilding(trace_ent) && trace_ent.classname != "building_sentrygun_base") || trace_ent.classname == "player")
	{
		
		if (!Teammate(trace_ent.team_no,self.team_no) && trace_ent.real_owner != self)
		{
		    if (trace_ent.is_malfunctioning == SCREWUP_ONE + SCREWUP_TWO + SCREWUP_THREE + SCREWUP_FOUR)
            {
                sprint(self, PRINT_HIGH, "You couldn't possibly screw that up more than it already is.\n");
                return;
            }
            else if (IsBuilding(trace_ent) && trace_ent.classname != "building_sentrygun_base")
            {
                self.current_menu = MENU_E_HACK;
                self.menu_count = MENU_REFRESH_RATE;
            }               
		}
        else if (IsBuilding(trace_ent) && trace_ent.classname != "building_sentrygun_base")
        {
            self.current_menu = MENU_F_HACK;
            self.menu_count = MENU_REFRESH_RATE;
        }


        self.demon_two = trace_ent;

        if (trace_ent.classname=="player")
        {
            if (!(trace_ent.cutf_items & CUTF_CYBERAUG))
        	{
                sprint(self, PRINT_HIGH, "You can't hack him.\n");
                ResetMenu();
                self.demon_two=NIL;
                return;
            }
        
            sprint (self, PRINT_HIGH, "\nScanning for cyberaug equipment...\n");
            SBInitiateInterface(0);
            ResetMenu();
        }
        else
        {
            sprint (self, PRINT_HIGH, "\nEstablishing connection...\n");
            
            local string st;

            st=GetBuildingName(self.demon_two);
            
            sprint (self, PRINT_HIGH, "Target ôùðå: ");
            sprint (self, PRINT_HIGH, st);
            sprint (self, PRINT_HIGH, "\nTarget ï÷îåò: ");        
            sprint (self, PRINT_HIGH, self.demon_two.real_owner.netname);
            
            if (Teammate(self.team_no,self.demon_two.team_no))
                sprint (self, PRINT_HIGH, "\nFriendly device.\n");
            else
                sprint (self, PRINT_HIGH, "\nÅîåíù device!\n");
        }
	}
    else
	{
		sprint (self, PRINT_HIGH, "There is nothing there to hack!\n");
		return;
	}
	
};

//==================================================================
// NEEDED?
//_--------------
// called on any DIE routine for buildings to ensure nobody 
// hacks unexistent machine, or eng tries to fix the building
// i think this can fix some strange crashes

/*
void(entity thebuilding) UpdateBuildingMenus = 
{
    local entity te;

    // find all players
    te = find(NIL, classname, "player");
    while (te)
	{
        if (te.job & JOB_HACKER) // a hacker?
        if (!te.is_haxxxoring) // currently hacking? if so.. do nothing, he could be killed by building
        if (te.demon_two == thebuilding) // this is our target?
        if (te.current_menu == MENU_E_HACK || te.current_menu == MENU_F_HACK) // and we have the hack menu?
        { // then reset his menu
            te.demon_two = NIL;
            if (te.StatusBarSize == 0)
                CenterPrint(te, "\n");
            else
                te.StatusRefreshTime = time + 0.1;
            te.menu_count = MENU_REFRESH_RATE;
            te.current_menu = MENU_DEFAULT;
        }
        
        if (te.building == thebuilding) // put the eng building to wolrd, and player_menu will reset it
            te.building = NIL;

		te = find(te, classname, "player");
	}
};
*/