From b2e684804cc1ef0deb7bf426283e74d7b67aec00 Mon Sep 17 00:00:00 2001 From: Paul Scott Date: Wed, 25 May 2011 13:53:21 +1000 Subject: [PATCH] Rudimentary freezetag bot ai working. --- qcsrc/server/bot/havocbot/role_freezetag.qc | 175 ++++---------------- qcsrc/server/bot/havocbot/roles.qc | 3 + 2 files changed, 35 insertions(+), 143 deletions(-) diff --git a/qcsrc/server/bot/havocbot/role_freezetag.qc b/qcsrc/server/bot/havocbot/role_freezetag.qc index bd9330eb3..cc5332022 100644 --- a/qcsrc/server/bot/havocbot/role_freezetag.qc +++ b/qcsrc/server/bot/havocbot/role_freezetag.qc @@ -1,191 +1,77 @@ void() havocbot_role_ft_freeing; void() havocbot_role_ft_offense; -void havocbot_goalrating_kh(float ratingscale_team, float ratingscale_dropped, float ratingscale_enemy) +void havocbot_goalrating_freeplayers(float ratingscale, vector org, float sradius) { local entity head; - for (head = kh_worldkeylist; head; head = head.kh_worldkeynext) + float distance; + + FOR_EACH_PLAYER(head) { - if(head.owner == self) - continue; - if(!kh_tracking_enabled) + if ((head != self) && (head.team == self.team) && (head.freezetag_frozen)) { - // if it's carried by our team we know about it - // otherwise we have to see it to know about it - if(!head.owner || head.team != self.team) - { - traceline(self.origin + self.view_ofs, head.origin, MOVE_NOMONSTERS, self); - if (trace_fraction < 1 && trace_ent != head) - continue; // skip what I can't see - } + distance = vlen(head.origin - org); + if (distance > sradius) + continue; + navigation_routerating(head, ratingscale, 2000); } - if(!head.owner) - navigation_routerating(head, ratingscale_dropped * BOT_PICKUP_RATING_HIGH, 100000); - else if(head.team == self.team) - navigation_routerating(head.owner, ratingscale_team * BOT_PICKUP_RATING_HIGH, 100000); - else - navigation_routerating(head.owner, ratingscale_enemy * BOT_PICKUP_RATING_HIGH, 100000); } - - havocbot_goalrating_items(1, self.origin, 10000); }; -void havocbot_role_kh_carrier() +void havocbot_role_ft_offense() { if(self.deadflag != DEAD_NO) return; - if (!(self.kh_next)) - { - dprint("changing role to freelancer\n"); - self.havocbot_role = havocbot_role_kh_freelancer; - self.havocbot_role_timeout = 0; - return; - } - - if (self.bot_strategytime < time) - { - self.bot_strategytime = time + autocvar_bot_ai_strategyinterval; - navigation_goalrating_start(); - - if(kh_Key_AllOwnedByWhichTeam() == self.team) - havocbot_goalrating_kh(10, 0.1, 0.1); // bring home - else - havocbot_goalrating_kh(4, 4, 1); // play defensively - - navigation_goalrating_end(); - } -} - -void havocbot_role_kh_defense() -{ - if(self.deadflag != DEAD_NO) - return; - - if (self.kh_next) - { - dprint("changing role to carrier\n"); - self.havocbot_role = havocbot_role_kh_carrier; - self.havocbot_role_timeout = 0; - return; - } - if (!self.havocbot_role_timeout) self.havocbot_role_timeout = time + random() * 10 + 20; + if (time > self.havocbot_role_timeout) { - dprint("changing role to freelancer\n"); - self.havocbot_role = havocbot_role_kh_freelancer; + dprint("changing role to freeing\n"); + self.havocbot_role = havocbot_role_ft_freeing; self.havocbot_role_timeout = 0; return; } - if (self.bot_strategytime < time) + if (time > self.bot_strategytime) { - float key_owner_team; self.bot_strategytime = time + autocvar_bot_ai_strategyinterval; - navigation_goalrating_start(); - - key_owner_team = kh_Key_AllOwnedByWhichTeam(); - if(key_owner_team == self.team) - havocbot_goalrating_kh(10, 0.1, 0.1); // defend key carriers - else if(key_owner_team == -1) - havocbot_goalrating_kh(4, 1, 0.1); // play defensively - else - havocbot_goalrating_kh(0.1, 0.1, 10); // ATTACK ANYWAY + navigation_goalrating_start(); + havocbot_goalrating_items(10000, self.origin, 10000); + havocbot_goalrating_enemyplayers(20000, self.origin, 10000); + havocbot_goalrating_freeplayers(9000, self.origin, 10000); + //havocbot_goalrating_waypoints(1, self.origin, 1000); navigation_goalrating_end(); } }; -void havocbot_role_kh_offense() +void havocbot_role_ft_freeing() { if(self.deadflag != DEAD_NO) return; - if (self.kh_next) - { - dprint("changing role to carrier\n"); - self.havocbot_role = havocbot_role_kh_carrier; - self.havocbot_role_timeout = 0; - return; - } - if (!self.havocbot_role_timeout) self.havocbot_role_timeout = time + random() * 10 + 20; - if (time > self.havocbot_role_timeout) - { - dprint("changing role to freelancer\n"); - self.havocbot_role = havocbot_role_kh_freelancer; - self.havocbot_role_timeout = 0; - return; - } - if (self.bot_strategytime < time) - { - float key_owner_team; - - self.bot_strategytime = time + autocvar_bot_ai_strategyinterval; - navigation_goalrating_start(); - - key_owner_team = kh_Key_AllOwnedByWhichTeam(); - if(key_owner_team == self.team) - havocbot_goalrating_kh(10, 0.1, 0.1); // defend anyway - else if(key_owner_team == -1) - havocbot_goalrating_kh(0.1, 1, 4); // play offensively - else - havocbot_goalrating_kh(0.1, 0.1, 10); // ATTACK! EMERGENCY! - - navigation_goalrating_end(); - } -}; - -void havocbot_role_kh_freelancer() -{ - if(self.deadflag != DEAD_NO) - return; - - if (self.kh_next) - { - dprint("changing role to carrier\n"); - self.havocbot_role = havocbot_role_kh_carrier; - self.havocbot_role_timeout = 0; - return; - } - - if (!self.havocbot_role_timeout) - self.havocbot_role_timeout = time + random() * 10 + 10; if (time > self.havocbot_role_timeout) { - if (random() < 0.5) - { - dprint("changing role to offense\n"); - self.havocbot_role = havocbot_role_kh_offense; - } - else - { - dprint("changing role to defense\n"); - self.havocbot_role = havocbot_role_kh_defense; - } + dprint("changing role to offense\n"); + self.havocbot_role = havocbot_role_ft_offense; self.havocbot_role_timeout = 0; return; } - if (self.bot_strategytime < time) + if (time > self.bot_strategytime) { - float key_owner_team; - self.bot_strategytime = time + autocvar_bot_ai_strategyinterval; - navigation_goalrating_start(); - - key_owner_team = kh_Key_AllOwnedByWhichTeam(); - if(key_owner_team == self.team) - havocbot_goalrating_kh(10, 0.1, 0.1); // defend anyway - else if(key_owner_team == -1) - havocbot_goalrating_kh(1, 10, 4); // prefer dropped keys - else - havocbot_goalrating_kh(0.1, 0.1, 10); // ATTACK ANYWAY + navigation_goalrating_start(); + havocbot_goalrating_items(8000, self.origin, 10000); + havocbot_goalrating_enemyplayers(10000, self.origin, 10000); + havocbot_goalrating_freeplayers(20000, self.origin, 10000); + //havocbot_goalrating_waypoints(1, self.origin, 1000); navigation_goalrating_end(); } }; @@ -195,5 +81,8 @@ void havocbot_chooserole_ft() if(self.deadflag != DEAD_NO) return; - self.havocbot_role = havocbot_role_ft_offensive; + if (random() < 0.5) + self.havocbot_role = havocbot_role_ft_freeing; + else + self.havocbot_role = havocbot_role_ft_offense; }; diff --git a/qcsrc/server/bot/havocbot/roles.qc b/qcsrc/server/bot/havocbot/roles.qc index a428cf485..96c901f9e 100644 --- a/qcsrc/server/bot/havocbot/roles.qc +++ b/qcsrc/server/bot/havocbot/roles.qc @@ -168,6 +168,9 @@ void havocbot_goalrating_enemyplayers(float ratingscale, vector org, float sradi if (distance < 100 || distance > sradius) continue; + if (head.freezetag_frozen) + continue; + if(g_minstagib) if(head.items & IT_STRENGTH) continue; -- 2.39.2