2001-07-23 20:52:47 +00:00
# include "defs.qh"
# include "menu.qh"
# include "monsters.qh"
2001-07-17 05:58:10 +00:00
/*=======================================================//
// ARMY.QC - CustomTF 3.2.OfN - 30/1/2001 - //
// by Sergio Fuma<6D> 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 =
{
2001-07-23 20:52:47 +00:00
if ( self . current_menu = = MENU_ARMY & & self . job & JOB_DEMON_OUT )
2001-07-24 20:54:19 +00:00
{
if ( self . demon_one . is_haxxxoring = = 0 )
self . demon_one . is_haxxxoring = 1 ;
else
self . demon_one . is_haxxxoring = 0 ;
}
2001-07-17 05:58:10 +00:00
2001-07-23 20:52:47 +00:00
self . current_menu = MENU_ARMY ;
self . menu_count = MENU_REFRESH_RATE ;
2001-07-17 05:58:10 +00:00
} ;
void ( ) Menu_Army1 ;
void ( ) Menu_Army2 ;
void ( ) Menu_Army =
{
2001-07-23 20:52:47 +00:00
if ( self . job & JOB_DEMON_OUT )
2001-07-17 05:58:10 +00:00
{
if ( self . demon_one . is_haxxxoring = = 1 ) Menu_Army2 ( ) ;
else Menu_Army1 ( ) ;
}
else Menu_Army1 ( ) ;
} ;
void ( ) Menu_Army1 =
{
2001-08-12 22:31:50 +00:00
local string st ;
st = " " ;
2001-07-17 05:58:10 +00:00
2001-07-23 20:52:47 +00:00
if ( self . job & JOB_DEMON_OUT )
2001-07-17 05:58:10 +00:00
{
2001-08-12 22:31:50 +00:00
custom_demon_name ( self . demon_one ) ;
st + = self . demon_one . undercover_name ; // FIXME: blah, name includes the space
st + = self . demon_one . netname ;
st + = " \n \n " ;
2001-07-17 05:58:10 +00:00
2001-08-12 22:31:50 +00:00
if ( self . army_ready )
st + = " \ <Action \ >: \ ^(soldier waiting \ ^) \n \n " ;
else
st = " \ <Action \ >: \n \n " ;
2001-07-17 05:58:10 +00:00
2001-08-12 22:31:50 +00:00
if ( self . demon_one . martyr_enemy )
if ( visible2 ( self . demon_one , self . demon_one . martyr_enemy ) )
st + = " \x8b " ;
else
st + = " \x0b " ;
else
st + = " " ;
st + = " \x93 .. Set primary \ <waypoint \ > \n " ;
if ( self . demon_one . demon_two )
if ( visible2 ( self . demon_one , self . demon_one . demon_two ) )
st + = " \x8b " ;
else
st + = " \x0b " ;
else
st + = " " ;
st + = " \x94 .. Set secondary \ <waypoint \ > \n " ;
st + = self . demon_one . penance_time = = 1 ? " * " : " " ;
st + = " \x95 .. Follow me! \n " ;
st + = self . demon_one . penance_time = = 2 ? " * " : " " ;
st + = " \x96 .. Stay there! \n " ;
st + = self . demon_one . penance_time = = 3 ? " * " : " " ;
st + = " \x97 .. Use your waypoints! \n \n " ;
st + = " \x9a \ <.. \ > Detonate soldier brain \n " ;
st + = " \x9b .. Main Soldier Menu \n " ;
st + = " \x92 .. \ <Nothing \ > \n " ;
CenterPrint ( self , st ) ;
2001-07-17 05:58:10 +00:00
return ;
}
else
{
2001-07-23 20:52:47 +00:00
if ( self . army_ready = = TRUE )
2001-07-17 05:58:10 +00:00
{
2001-08-12 22:31:50 +00:00
st + = " \ <Action \ >: \n \n " ;
st + = " <EFBFBD> .. Teleport soldier \n \n " ;
st + = " <EFBFBD> .. \ <Nothing \ > \n \n \n " ;
st + = " Ready for teleporting! " ;
CenterPrint ( self , st ) ;
2001-07-17 05:58:10 +00:00
}
else
{
2001-08-12 22:31:50 +00:00
st + = " \ <Action \ >: \n \n \n \n " ;
st + = " <EFBFBD> .. \ <Nothing \ > \n \n \n " ;
st + = " Preparing teleporting... \n \n " ;
st + = " \ <Time \ > \ <left \ >: " ;
local float readytime = fabs ( floor ( GetArmyTimer ( self ) . nextthink - time ) ) ;
local float minutes = floor ( readytime / 60 ) ;
local float seconds = readytime % 60 ;
if ( minutes )
st + = ftos ( minutes ) + " minute " + ( minutes = = 1 ? " , " : " s, " ) ;
st + = ftos ( seconds ) + " second " + ( seconds = = 1 ? " . \n " : " s. \n " ) ;
CenterPrint ( self , st ) ;
2001-07-17 05:58:10 +00:00
}
}
2001-08-12 22:31:50 +00:00
} ;
2001-07-17 05:58:10 +00:00
2001-08-12 22:31:50 +00:00
/*
ideas :
2001-07-17 05:58:10 +00:00
2001-08-12 22:31:50 +00:00
( ( centered soldier status
2001-07-17 05:58:10 +00:00
// \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);
2001-08-12 22:31:50 +00:00
*/
2001-07-17 05:58:10 +00:00
void ( ) Menu_Army2 =
{
2001-08-12 22:31:50 +00:00
local string st ;
2001-07-17 05:58:10 +00:00
2001-08-12 22:31:50 +00:00
st = " " ;
st + = " \x9d \x9f \ <Soldier Status \ > \x9d \x9f \n \n " ;
if ( self . demon_one . enemy ! = world & & visible2 ( self . demon_one , self . demon_one . enemy ) )
st + = " Attacking " + GetEnemyName ( self . demon_one . enemy ) + " \n \n " ;
2001-07-17 05:58:10 +00:00
else if ( self . demon_one . enemy ! = world )
2001-08-12 22:31:50 +00:00
st + = " Seeking " + GetEnemyName ( self . demon_one . enemy ) + " \n \n " ;
else if ( self . demon_one . goalentity = = self )
st + = " Following You \n \n " ;
else if ( self . demon_one . goalentity = = world )
st + = " Standing \n \n " ;
else if ( self . demon_one . goalentity ! = world )
st + = " On Patrol \n \n " ;
st + = " \x93 .. Tactic Mode: " ;
if ( self . demon_one . is_malfunctioning = = 0 )
st + = " \ <normal \ > \n " ;
else if ( self . demon_one . is_malfunctioning = = 1 )
st + = " \ <seek \ > \n " ;
else if ( self . demon_one . is_malfunctioning = = 2 )
st + = " \ <static \ > \n " ;
st + = " \x94 .. Engage Enemy: " ;
if ( self . demon_one . is_detpacking )
st + = " \ <yes \ > \n " ;
else
st + = " \ <no \ > \n " ;
st + = " \x95 .. On Obstacle: " ;
if ( self . demon_one . is_toffingadet ) // FIXME: Eww, what a horrible variable name
st + = " \ <stop \ > \n " ;
else
st + = " \ <jump \ > \n " ;
if ( self . demon_one . is_malfunctioning = = 2 ) {
st + = " \x96 .. Static Range: " ;
if ( self . demon_one . army_ready = = 0 )
st + = " \ <none \ > \n " ;
else if ( self . demon_one . army_ready = = 1 )
2001-10-01 11:37:02 +00:00
st + = " \ <short \ > \n " ;
2001-08-12 22:31:50 +00:00
else if ( self . demon_one . army_ready = = 2 )
st + = " \ <medium \ > \n " ;
else if ( self . demon_one . army_ready = = 3 )
2001-10-01 11:37:02 +00:00
st + = " \ <long \ > \n " ;
2001-08-12 22:31:50 +00:00
}
st + = " \x98 .. Reports: " ;
if ( self . demon_one . num_mines = = 0 )
st + = " \ <all \ > \n " ;
else if ( self . demon_one . num_mines = = 1 )
st + = " \ <most \ > \n " ;
else if ( self . demon_one . num_mines = = 2 )
st + = " \ <some \ > \n " ;
2001-07-17 05:58:10 +00:00
else if ( self . demon_one . num_mines = = 3 )
2001-08-12 22:31:50 +00:00
st + = " \ <none \ > \n " ;
st + = " \x99 .. Inventory \n \n " ;
st + = " \x9b .. Main Soldier Menu \n " ;
st + = " \x92 .. \ <Nothing \ > \n \n " ;
st + = " \ <Max HP \ >: " ;
2001-07-17 05:58:10 +00:00
// "<22> .. Soldier inventory... "
2001-08-12 22:31:50 +00:00
st + = ftos ( floor ( self . demon_one . max_health ) ) ;
2001-07-17 05:58:10 +00:00
2001-08-12 22:31:50 +00:00
CenterPrint ( self , st ) ;
2001-07-17 05:58:10 +00:00
} ;
void ( float inp ) Menu_Army_Input1 ;
void ( float inp ) Menu_Army_Input2 ;
void ( float inp ) Menu_Army_Input =
{
2001-07-23 20:52:47 +00:00
if ( self . job & JOB_DEMON_OUT )
2001-07-17 05:58:10 +00:00
{
2001-08-12 22:31:50 +00:00
if ( self . demon_one . is_haxxxoring = = 1 )
Menu_Army_Input2 ( inp ) ;
else
Menu_Army_Input1 ( inp ) ;
2001-07-17 05:58:10 +00:00
}
2001-08-12 22:31:50 +00:00
else
Menu_Army_Input1 ( inp ) ;
2001-07-17 05:58:10 +00:00
} ;
void ( float inp ) Menu_Army_Input2 =
{
if ( inp = = 10 | | self . demon_one = = world ) // NOTHING
{
ResetMenu ( ) ;
self . impulse = 0 ;
2001-07-24 20:54:19 +00:00
self . demon_one . is_haxxxoring = 0 ; // go back to first menu
2001-07-17 05:58:10 +00:00
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 ;
2001-07-23 20:52:47 +00:00
self . demon_one . effects = self . demon_one . effects - ( self . demon_one . effects & EF_DIMLIGHT ) ;
2001-07-17 05:58:10 +00:00
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??
{
2001-08-12 22:31:50 +00:00
self . impulse = 0 ;
if ( self . demon_one . is_toffingadet = = 0 )
self . demon_one . is_toffingadet = 1 ;
else
self . demon_one . is_toffingadet = 0 ;
2001-07-17 05:58:10 +00:00
}
if ( inp = = 4 & & self . demon_one . is_malfunctioning = = 2 ) // static range, small mdeium or large
{
2001-08-12 22:31:50 +00:00
self . impulse = 0 ;
self . demon_one . army_ready + = 1 ;
2001-07-17 05:58:10 +00:00
2001-08-12 22:31:50 +00:00
if ( self . demon_one . army_ready > 3 )
self . demon_one . army_ready = 0 ;
return ;
}
2001-07-17 05:58:10 +00:00
if ( inp = = 6 )
{
2001-08-12 22:31:50 +00:00
self . impulse = 0 ;
self . demon_one . num_mines = self . demon_one . num_mines + 1 ;
2001-07-17 05:58:10 +00:00
2001-08-12 22:31:50 +00:00
if ( self . demon_one . num_mines > 3 )
self . demon_one . num_mines = 0 ;
self . demon_one . is_haxxxoring = 0 ;
2001-07-17 05:58:10 +00:00
return ;
}
else if ( inp = = 7 ) // Army info
{
2001-08-12 22:31:50 +00:00
local entity oself ;
2001-07-17 05:58:10 +00:00
ResetMenu ( ) ;
2001-08-12 22:31:50 +00:00
oself = self ;
self = self . demon_one ;
2001-07-17 05:58:10 +00:00
Grunty_StateInv ( ) ;
2001-08-12 22:31:50 +00:00
self = oself ;
2001-07-17 05:58:10 +00:00
self . impulse = 0 ;
return ;
}
2001-08-12 22:31:50 +00:00
if ( inp = = 9 ) {
self . current_menu = MENU_ARMY ;
self . menu_count = MENU_REFRESH_RATE ;
self . impulse = 0 ;
self . demon_one . is_haxxxoring = 0 ;
return ;
}
2001-07-17 05:58:10 +00:00
} ;
void ( float inp ) Menu_Army_Input1 =
{
//self.demon_choice = 0; // reset demon choice var
if ( inp = = 10 ) // NOTHING
{
ResetMenu ( ) ;
self . impulse = 0 ;
2001-07-23 20:52:47 +00:00
if ( self . army_ready = = FALSE & & ! ( self . job & JOB_DEMON_OUT ) )
2001-07-17 05:58:10 +00:00
{
2001-07-23 20:52:47 +00:00
sprint ( self , PRINT_HIGH , " Still " ) ;
2001-07-17 05:58:10 +00:00
PrintArmyTime ( self ) ;
2001-07-23 20:52:47 +00:00
sprint ( self , PRINT_HIGH , " time left until next teleporting \n " ) ;
2001-07-17 05:58:10 +00:00
self . job_finished = time + 0.5 ;
}
return ;
}
else if ( inp = = 1 & & self . demon_one = = world ) // Teleport it!
{
2001-07-23 20:52:47 +00:00
if ( self . army_ready = = TRUE & & self . demon_one = = world & & ! ( self . job & JOB_DEMON_OUT ) )
2001-07-17 05:58:10 +00:00
{
ResetMenu ( ) ;
//StartTeleArmy();
if ( TeleSoldier ( ) )
{
2001-07-23 20:52:47 +00:00
self . army_ready = FALSE ; // needed for setarmytimer
2001-07-17 05:58:10 +00:00
SetArmyTimer ( ) ; // prepare reserve soldier
2001-07-23 20:52:47 +00:00
self . job = self . job | JOB_DEMON_OUT ;
2001-07-17 05:58:10 +00:00
}
self . impulse = 0 ;
}
return ;
}
else if ( inp = = 8 ) // Kill it!
{
if ( self . demon_one ! = world )
{
ResetMenu ( ) ;
2001-07-23 20:52:47 +00:00
sprint ( self , PRINT_HIGH , " You detonate the micro-explosive implanted in his brain! \n " ) ;
2001-07-17 05:58:10 +00:00
//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 ;
}
2001-07-23 20:52:47 +00:00
// sprint(self,PRINT_HIGH,"You do not have a soldier in-battle currently\n");
2001-07-17 05:58:10 +00:00
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
2001-07-23 20:52:47 +00:00
self . demon_one . martyr_enemy = CreateWaypoint ( self . origin , WAYPOINT_LIFE , WAYPOINT_TYPE_PRIMARY ) ;
2001-07-17 05:58:10 +00:00
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);
2001-07-23 20:52:47 +00:00
self . demon_one . demon_two = CreateWaypoint ( self . origin , WAYPOINT_LIFE , WAYPOINT_TYPE_SECONDARY ) ;
2001-07-17 05:58:10 +00:00
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 ;
2001-07-23 20:52:47 +00:00
self . demon_one . effects = self . demon_one . effects - ( self . demon_one . effects & EF_DIMLIGHT ) ;
2001-07-17 05:58:10 +00:00
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 ;
2001-07-23 20:52:47 +00:00
self . demon_one . effects = self . demon_one . effects - ( self . demon_one . effects & EF_DIMLIGHT ) ;
2001-07-17 05:58:10 +00:00
}
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 ;
2001-07-23 20:52:47 +00:00
self . demon_one . effects = self . demon_one . effects - ( self . demon_one . effects & EF_DIMLIGHT ) ;
2001-07-17 05:58:10 +00:00
}
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 ;
2001-07-23 20:52:47 +00:00
self . demon_one . effects = self . demon_one . effects - ( self . demon_one . effects & EF_DIMLIGHT ) ;
2001-07-17 05:58:10 +00:00
ResetMenu ( ) ;
self . impulse = 0 ;
return ;
}
2001-09-15 23:54:08 +00:00
if ( inp = = 9 & & self . demon_one ! = world ) {
2001-08-12 22:31:50 +00:00
self . current_menu = MENU_ARMY ;
self . menu_count = MENU_REFRESH_RATE ;
self . impulse = 0 ;
self . demon_one . is_haxxxoring = 1 ;
return ;
}
2001-07-17 05:58:10 +00:00
} ;
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
2001-07-23 20:52:47 +00:00
sprint ( self , PRINT_HIGH , " Not enough room to teleport soldier! \n " ) ;
2001-07-17 05:58:10 +00:00
newmis . think = SUB_Remove ;
newmis . nextthink = time + 0.1 ;
2001-07-23 20:52:47 +00:00
return FALSE ;
2001-07-17 05:58:10 +00:00
}
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 ) ;
2001-07-23 20:52:47 +00:00
if ( newmis . flags & FL_ONGROUND )
newmis . flags = newmis . flags - FL_ONGROUND ;
2001-07-17 05:58:10 +00:00
2001-07-23 20:52:47 +00:00
newmis . movetype = MOVETYPE_TOSS ;
newmis . solid = SOLID_SLIDEBOX ;
newmis . takedamage = DAMAGE_AIM ;
2001-07-17 05:58:10 +00:00
2001-07-23 20:52:47 +00:00
newmis . health = GRUNTY_HP ;
2001-07-17 05:58:10 +00:00
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 ;
2001-08-13 15:39:14 +00:00
# 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
2001-07-17 05:58:10 +00:00
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 ;
2001-07-23 20:52:47 +00:00
newmis . current_weapon = WEAP_SHOTGUN ;
2001-07-17 05:58:10 +00:00
newmis . th_die = custom_grunt_die ;
newmis . think = walkmonster_start ;
newmis . nextthink = time + 1 ;
2001-07-23 20:52:47 +00:00
newmis . armorclass = 0 ; //- OfN none // AT_SAVESHOT; // kevlar
2001-07-17 05:58:10 +00:00
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 ;
2001-07-23 20:52:47 +00:00
sprint ( self , PRINT_HIGH , " You teleport your soldier. \n " ) ;
2001-07-17 05:58:10 +00:00
//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
2001-07-23 20:52:47 +00:00
return TRUE ;
2001-07-17 05:58:10 +00:00
} ;
//==============================================================//
void ( ) ArmyTimerThink ;
void ( ) SetArmyTimer =
{
2001-07-23 20:52:47 +00:00
if ( self . army_ready ! = FALSE | | self . job & JOB_DEMON_OUT ) return ;
2001-07-17 05:58:10 +00:00
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
2001-07-23 20:52:47 +00:00
self . army_ready = FALSE ;
2001-07-17 05:58:10 +00:00
} ;
void ( ) ArmyTimerThink =
{
//if (self.classname!="army_timer") return; not needed
//FIXME: This shouldnt be needed
2001-07-23 20:52:47 +00:00
if ( self . owner . has_disconnected | | ! ( self . owner . job & JOB_ARMY ) )
2001-07-17 05:58:10 +00:00
{
dremove ( self ) ;
return ;
}
if ( self . owner . demon_one ! = world )
{
2001-07-23 20:52:47 +00:00
sprint ( self . owner , PRINT_HIGH , " You have another soldier waiting! \n " ) ;
self . owner . army_ready = TRUE ;
2001-07-17 05:58:10 +00:00
dremove ( self ) ;
}
else
{
2001-07-23 20:52:47 +00:00
sprint ( self . owner , PRINT_HIGH , " Soldier is ready for teleporting! \n " ) ;
self . owner . army_ready = TRUE ;
2001-07-17 05:58:10 +00:00
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 =
{
2001-07-23 20:52:47 +00:00
if ( player . army_ready = = TRUE | | player . classname ! = " player " ) return ;
2001-07-17 05:58:10 +00:00
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 ) ;
2001-07-23 20:52:47 +00:00
sprint ( player , PRINT_HIGH , st ) ;
sprint ( player , PRINT_HIGH , " : " ) ;
2001-07-17 05:58:10 +00:00
fl2 = fabs ( fl - fl3 * 60 ) ;
st = Digitize ( fl2 ) ;
2001-07-23 20:52:47 +00:00
sprint ( player , PRINT_HIGH , st ) ;
2001-07-17 05:58:10 +00:00
} ;
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 ) ;
2001-07-23 20:52:47 +00:00
sprint ( player , PRINT_HIGH , sld . netname ) ;
sprint ( player , PRINT_HIGH , " <EFBFBD> " ) ;
sprint ( player , PRINT_HIGH , msg ) ;
2001-07-17 05:58:10 +00:00
} ;
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 " ;
2001-08-12 22:31:50 +00:00
else
return " lets destroy the enemy! \n " ;
2001-07-17 05:58:10 +00:00
//else return "Hope I don't crash the server\n";
} ;