prozac-qfcc/army.qc

907 lines
28 KiB
C++
Raw Normal View History

#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 =
{
if (self.current_menu == MENU_ARMY && self.job & JOB_DEMON_OUT)
2001-07-17 05:58:10 +00:00
{
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;
2001-07-17 05:58:10 +00:00
};
void() Menu_Army1;
void() Menu_Army2;
void() Menu_Army =
{
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 =
{
local float readytime,temp;
local string st,st2,st3;
if (self.army_ready==FALSE)
2001-07-17 05:58:10 +00:00
{
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)
2001-07-17 05:58:10 +00:00
{
/* if (self.demon_one.goalentity==self)
st="<EFBFBD>.. Stay there! ";
else
st="<EFBFBD>.. Follow me! ";*/
if (self.demon_one.martyr_enemy==world && self.demon_one.demon_two==world)
st3 = " <20>.. Set primary <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> \n <20>.. Set secondary <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ";
else if (self.demon_one.martyr_enemy!=world && self.demon_one.demon_two==world && visible2(self.demon_one,self.demon_one.martyr_enemy))
st3 = " <20>.. Set primary <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> \n <20>.. Set secondary <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ";
else if (self.demon_one.martyr_enemy!=world && self.demon_one.demon_two==world)
st3 = "<EFBFBD> <20>.. Set primary <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> \n <20>.. Set secondary <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ";
else if (self.demon_one.martyr_enemy==world && self.demon_one.demon_two!=world && visible2(self.demon_one,self.demon_one.demon_two))
st3 = " <20>.. Set primary <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> \n <20>.. Set secondary <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ";
else if (self.demon_one.martyr_enemy==world && self.demon_one.demon_two!=world)
st3 = " <20>.. Set primary <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> \n<EFBFBD> <20>.. Set secondary <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ";
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 = " <20>.. Set primary <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> \n <20>.. Set secondary <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ";
else if (self.demon_one.martyr_enemy!=world && self.demon_one.demon_two!=world && visible2(self.demon_one,self.demon_one.demon_two))
st3 = "<EFBFBD> <20>.. Set primary <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> \n <20>.. Set secondary <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ";
else if (self.demon_one.martyr_enemy!=world && self.demon_one.demon_two!=world && visible2(self.demon_one,self.demon_one.martyr_enemy))
st3 = " <20>.. Set primary <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> \n<EFBFBD> <20>.. Set secondary <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ";
else if (self.demon_one.martyr_enemy!=world && self.demon_one.demon_two!=world)
st3 = "<EFBFBD> <20>.. Set primary <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> \n<EFBFBD> <20>.. Set secondary <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ";
st2=" <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: \n\n";
if (self.army_ready == TRUE)
2001-07-17 05:58:10 +00:00
st2=" <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <20>soldier waiting<6E>\n\n";
custom_demon_name(self.demon_one);
//1 <20>
//2 <20>
//3 <20>
//4 <20>
//5 <20>
//CenterPrint5(self, self.demon_one.undercover_name, self.demon_one.netname,"\n\n", st2, "\n\n<>.. Soldier inventory \n\n<>.. Set primary <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> \n<>.. Set secondary <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\n<>.. Follow me! \n<>.. Stay there! \n\n<><6E><EFBFBD> Detonate soldier brain\n\n<>.. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> \n");
local string st4;
st4="\n<EFBFBD>.. Follow me! \n<EFBFBD>.. Stay there! \n<EFBFBD>.. Use your waypoints! ";
if (self.demon_one.penance_time==1)
st4="\n* <20>.. Follow me! \n<EFBFBD>.. Stay there! \n<EFBFBD>.. Use your waypoints! ";
else if (self.demon_one.penance_time==2)
st4="\n<EFBFBD>.. Follow me! \n* <20>.. Stay there! \n<EFBFBD>.. Use your waypoints! ";
else if (self.demon_one.penance_time==3)
st4="\n<EFBFBD>.. Follow me! \n<EFBFBD>.. Stay there! \n* <20>.. Use your waypoints! ";
CenterPrint7(self, self.demon_one.undercover_name, self.demon_one.netname,"\n\n", st2,
st3,st4,"\n\n<EFBFBD><EFBFBD><EFBFBD> Detonate soldier brain\n\n<EFBFBD>.. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> \n");
return;
}
else
{
if (self.army_ready==TRUE)
2001-07-17 05:58:10 +00:00
{
CenterPrint(self, " <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: \n\n<EFBFBD>.. Teleport soldier \n\n<EFBFBD>.. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> \n\n\nReady for teleporting!");
}
else
{
CenterPrint3(self, " <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: \n\n\n\n<EFBFBD>.. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> \n\n\nPreparing teleporting...\n\n<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>: ",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="<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>\n\nAttacking ";
st3=GetEnemyName(self.demon_one.enemy);
}
else if (self.demon_one.enemy!=world)
{
st2="<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>\n\nSeeking ";
st3=GetEnemyName(self.demon_one.enemy);
}
else if (self.demon_one.goalentity==self)
st2="<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>\n\nFollowing You";
else if (self.demon_one.goalentity==world)
st2="<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>\n\nStanding";
else if (self.demon_one.goalentity!=world)
st2="<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>\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<EFBFBD>.. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>: normal\n<EFBFBD>.. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>: no \n<EFBFBD>.. <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: stop \n";
else if (self.demon_one.is_detpacking==1 && self.demon_one.is_toffingadet==1)
st4="\n\n<EFBFBD>.. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>: normal\n<EFBFBD>.. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>: yes \n<EFBFBD>.. <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: stop \n";
else if (self.demon_one.is_detpacking==0 && self.demon_one.is_toffingadet==0)
st4="\n\n<EFBFBD>.. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>: normal\n<EFBFBD>.. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>: no \n<EFBFBD>.. <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: jump \n";
else if (self.demon_one.is_detpacking==1 && self.demon_one.is_toffingadet==0)
st4="\n\n<EFBFBD>.. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>: normal\n<EFBFBD>.. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>: yes \n<EFBFBD>.. <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: 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<EFBFBD>.. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>: seek \n<EFBFBD>.. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>: no \n<EFBFBD>.. <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: stop \n";
else if (self.demon_one.is_detpacking==1 && self.demon_one.is_toffingadet==1)
st4="\n\n<EFBFBD>.. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>: seek \n<EFBFBD>.. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>: yes \n<EFBFBD>.. <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: stop \n";
else if (self.demon_one.is_detpacking==0 && self.demon_one.is_toffingadet==0)
st4="\n\n<EFBFBD>.. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>: seek \n<EFBFBD>.. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>: no \n<EFBFBD>.. <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: jump \n";
else if (self.demon_one.is_detpacking==1 && self.demon_one.is_toffingadet==0)
st4="\n\n<EFBFBD>.. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>: seek \n<EFBFBD>.. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>: yes \n<EFBFBD>.. <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: jump \n";
}
else if (self.demon_one.is_malfunctioning==2)
{
if (self.demon_one.army_ready == 0)
st5="<EFBFBD>.. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>: none \n";
else if (self.demon_one.army_ready == 1)
st5="<EFBFBD>.. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>: small \n";
else if (self.demon_one.army_ready == 2)
st5="<EFBFBD>.. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>: medium\n";
else if (self.demon_one.army_ready == 3)
st5="<EFBFBD>.. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>: large \n";
if (self.demon_one.is_detpacking==0 && self.demon_one.is_toffingadet==1)
st4="\n\n<EFBFBD>.. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>: static\n<EFBFBD>.. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>: no \n<EFBFBD>.. <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: stop \n";
else if (self.demon_one.is_detpacking==1 && self.demon_one.is_toffingadet==1)
st4="\n\n<EFBFBD>.. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>: static\n<EFBFBD>.. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>: yes \n<EFBFBD>.. <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: stop \n";
else if (self.demon_one.is_detpacking==0 && self.demon_one.is_toffingadet==0)
st4="\n\n<EFBFBD>.. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>: static\n<EFBFBD>.. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>: no \n<EFBFBD>.. <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: jump \n";
else if (self.demon_one.is_detpacking==1 && self.demon_one.is_toffingadet==0)
st4="\n\n<EFBFBD>.. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>: static\n<EFBFBD>.. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>: yes \n<EFBFBD>.. <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: jump \n";
}
if (self.demon_one.num_mines==0)
st6="<EFBFBD>.. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: all \n\n<EFBFBD>.. Inventory <20>.. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\n\n<EFBFBD><EFBFBD><EFBFBD> <20><>: ";
else if (self.demon_one.num_mines==1)
st6="<EFBFBD>.. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: most \n\n<EFBFBD>.. Inventory <20>.. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\n\n<EFBFBD><EFBFBD><EFBFBD> <20><>: ";
else if (self.demon_one.num_mines==2)
st6="<EFBFBD>.. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: some \n\n<EFBFBD>.. Inventory <20>.. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\n\n<EFBFBD><EFBFBD><EFBFBD> <20><>: ";
else if (self.demon_one.num_mines==3)
st6="<EFBFBD>.. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: none \n\n<EFBFBD>.. Inventory <20>.. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\n\n<EFBFBD><EFBFBD><EFBFBD> <20><>: ";
// "<22>.. 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)
2001-07-17 05:58:10 +00:00
{
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;
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);
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??
{
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))
2001-07-17 05:58:10 +00:00
{
sprint(self,PRINT_HIGH,"Still ");
2001-07-17 05:58:10 +00:00
PrintArmyTime(self);
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!
{
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())
{
self.army_ready=FALSE; // needed for setarmytimer
2001-07-17 05:58:10 +00:00
SetArmyTimer(); // prepare reserve soldier
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();
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;
}
// 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
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);
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;
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;
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;
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;
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;
}
};
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");
2001-07-17 05:58:10 +00:00
newmis.think = SUB_Remove;
newmis.nextthink = time + 0.1;
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);
if (newmis.flags & FL_ONGROUND)
newmis.flags = newmis.flags - FL_ONGROUND;
2001-07-17 05:58:10 +00:00
newmis.movetype = MOVETYPE_TOSS;
newmis.solid = SOLID_SLIDEBOX;
newmis.takedamage = DAMAGE_AIM;
2001-07-17 05:58:10 +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;
//#ifdef GRUNTY_EXTRA_WEAPONS
//newmis.weapons_carried = WEAP_AXE + WEAP_SHOTGUN + WEAP_NAILGUN + GRUNTY_EXTRA_WEAPONS;
2001-07-17 05:58:10 +00:00
//#else
newmis.weapons_carried = WEAP_AXE + WEAP_SHOTGUN + WEAP_NAILGUN;
2001-07-17 05:58:10 +00:00
//#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;
2001-07-17 05:58:10 +00:00
newmis.th_die = custom_grunt_die;
newmis.think = walkmonster_start;
newmis.nextthink = time + 1;
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;
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
return TRUE;
2001-07-17 05:58:10 +00:00
};
//==============================================================//
void() ArmyTimerThink;
void() SetArmyTimer =
{
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
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
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)
{
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
{
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 =
{
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);
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);
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);
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";
else return "lets destroy the enemy!\n";
//else return "Hope I don't crash the server\n";
};