From ef8f82bc9fb19aad4f4452949737d3bd86b85d6e Mon Sep 17 00:00:00 2001 From: Paul Scott Date: Sat, 4 Jun 2011 17:00:19 +1000 Subject: [PATCH] Implemented basic keepaway bot AI. --- qcsrc/server/bot/aim.qc | 4 ++ qcsrc/server/bot/havocbot/havocbot.qc | 1 + qcsrc/server/bot/havocbot/role_keepaway.qc | 82 ++++++++++++++++++++++ qcsrc/server/bot/havocbot/roles.qc | 23 ------ qcsrc/server/mutators/gamemode_keepaway.qc | 3 + 5 files changed, 90 insertions(+), 23 deletions(-) create mode 100644 qcsrc/server/bot/havocbot/role_keepaway.qc diff --git a/qcsrc/server/bot/aim.qc b/qcsrc/server/bot/aim.qc index 9ef109e2b..b682044ec 100644 --- a/qcsrc/server/bot/aim.qc +++ b/qcsrc/server/bot/aim.qc @@ -113,6 +113,10 @@ float bot_shouldattack(entity e) if(e.freezetag_frozen) return FALSE; + if (g_keepaway) + if (!e.ballcarried && !self.ballcarried) + return FALSE; + if(teams_matter) { if(e.team==0) diff --git a/qcsrc/server/bot/havocbot/havocbot.qc b/qcsrc/server/bot/havocbot/havocbot.qc index dd111d9f0..5da945c90 100644 --- a/qcsrc/server/bot/havocbot/havocbot.qc +++ b/qcsrc/server/bot/havocbot/havocbot.qc @@ -2,6 +2,7 @@ #include "role_ctf.qc" #include "role_onslaught.qc" #include "role_keyhunt.qc" +#include "role_keepaway.qc" #include "roles.qc" void havocbot_ai() diff --git a/qcsrc/server/bot/havocbot/role_keepaway.qc b/qcsrc/server/bot/havocbot/role_keepaway.qc new file mode 100644 index 000000000..30d96499a --- /dev/null +++ b/qcsrc/server/bot/havocbot/role_keepaway.qc @@ -0,0 +1,82 @@ +void() havocbot_role_ka_carrier; +void() havocbot_role_ka_collector; +void() havocbot_chooserole_ka; + +entity ka_ball; + +// Keepaway +// If you don't have the ball, get it; if you do, kill people. + +void havocbot_goalrating_ball(float ratingscale, vector org) +{ + local float t, distance; + local entity ball_owner; + ball_owner = ka_ball.owner; + + if (ball_owner == self) + return; + + // If ball is carried by player then hunt them down. + if (ball_owner) + { + t = (self.health + self.armorvalue) / (ball_owner.health + ball_owner.armorvalue); + navigation_routerating(ball_owner, t * ratingscale, 2000); + } + + // Ball has been dropped so collect. + navigation_routerating(ka_ball, ratingscale, 2000); +}; + +void havocbot_role_ka_carrier() +{ + if (self.deadflag != DEAD_NO) + return; + + if (time > self.bot_strategytime) + { + self.bot_strategytime = time + autocvar_bot_ai_strategyinterval; + + navigation_goalrating_start(); + havocbot_goalrating_items(10000, self.origin, 10000); + havocbot_goalrating_enemyplayers(20000, self.origin, 10000); + //havocbot_goalrating_waypoints(1, self.origin, 1000); + navigation_goalrating_end(); + } + + if (!self.ballcarried) + { + self.havocbot_role = havocbot_role_ka_collector; + self.bot_strategytime = 0; + } +}; + +void havocbot_role_ka_collector() +{ + if (self.deadflag != DEAD_NO) + return; + + if (time > self.bot_strategytime) + { + self.bot_strategytime = time + autocvar_bot_ai_strategyinterval; + + navigation_goalrating_start(); + havocbot_goalrating_items(10000, self.origin, 10000); + havocbot_goalrating_enemyplayers(1000, self.origin, 10000); + havocbot_goalrating_ball(20000, self.origin); + navigation_goalrating_end(); + } + + if (self.ballcarried) + { + self.havocbot_role = havocbot_role_ka_carrier; + self.bot_strategytime = 0; + } +}; + +void havocbot_chooserole_ka() +{ + if (self.ballcarried) + self.havocbot_role = havocbot_role_ka_carrier; + else + self.havocbot_role = havocbot_role_ka_collector; +}; diff --git a/qcsrc/server/bot/havocbot/roles.qc b/qcsrc/server/bot/havocbot/roles.qc index 514c364ac..6a6686003 100644 --- a/qcsrc/server/bot/havocbot/roles.qc +++ b/qcsrc/server/bot/havocbot/roles.qc @@ -274,24 +274,6 @@ void havocbot_role_race() } }; -// Keepaway -// If you don't have the ball, get it; if you do, kill people. -void havocbot_role_ka() -{ - if(self.deadflag != DEAD_NO) - return; - - if (self.bot_strategytime < time) - { - self.bot_strategytime = time + autocvar_bot_ai_strategyinterval; - navigation_goalrating_start(); - havocbot_goalrating_items(10000, self.origin, 10000); - havocbot_goalrating_enemyplayers(20000, self.origin, 10000); - //havocbot_goalrating_waypoints(1, self.origin, 1000); - navigation_goalrating_end(); - } -} - void havocbot_chooserole_dm() { self.havocbot_role = havocbot_role_dm; @@ -307,11 +289,6 @@ void havocbot_chooserole_dom() self.havocbot_role = havocbot_role_dom; }; -void havocbot_chooserole_ka() -{ - self.havocbot_role = havocbot_role_ka; -} - void havocbot_chooserole() { dprint("choosing a role...\n"); diff --git a/qcsrc/server/mutators/gamemode_keepaway.qc b/qcsrc/server/mutators/gamemode_keepaway.qc index 60c39d434..440652a48 100644 --- a/qcsrc/server/mutators/gamemode_keepaway.qc +++ b/qcsrc/server/mutators/gamemode_keepaway.qc @@ -4,6 +4,8 @@ void ka_RespawnBall(void); void ka_DropEvent(entity); void ka_TimeScoring(void); +entity ka_ball; + float ka_ballcarrier_waypointsprite_visible_for_player(entity); void ka_Initialize() // run at the start of a match, initiates game mode @@ -50,6 +52,7 @@ void ka_SpawnBall() // loads various values for the ball, runs only once at star e.reset = ka_Reset; e.touch = ka_TouchEvent; e.owner = world; + ka_ball = e; InitializeEntity(e, ka_RespawnBall, INITPRIO_SETLOCATION); // is this the right priority? Neh, I have no idea.. Well-- it works! So. } -- 2.39.2