From 82b3d6151424f8cc50d9c05c52eb70981bf43ad7 Mon Sep 17 00:00:00 2001 From: Paul Scott Date: Sun, 22 May 2011 21:59:45 +1000 Subject: [PATCH] Starting to structure bot roles for freezetag gamemode. --- qcsrc/server/bot/havocbot/role_freezetag.qc | 199 ++++++++++++++++++++ 1 file changed, 199 insertions(+) create mode 100644 qcsrc/server/bot/havocbot/role_freezetag.qc diff --git a/qcsrc/server/bot/havocbot/role_freezetag.qc b/qcsrc/server/bot/havocbot/role_freezetag.qc new file mode 100644 index 000000000..bd9330eb3 --- /dev/null +++ b/qcsrc/server/bot/havocbot/role_freezetag.qc @@ -0,0 +1,199 @@ +void() havocbot_role_ft_freeing; +void() havocbot_role_ft_offense; + +void havocbot_goalrating_kh(float ratingscale_team, float ratingscale_dropped, float ratingscale_enemy) +{ + local entity head; + for (head = kh_worldkeylist; head; head = head.kh_worldkeynext) + { + if(head.owner == self) + continue; + if(!kh_tracking_enabled) + { + // 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 + } + } + 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() +{ + 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; + 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 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_end(); + } +}; + +void havocbot_role_kh_offense() +{ + 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; + } + 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(1, 10, 4); // prefer dropped keys + else + havocbot_goalrating_kh(0.1, 0.1, 10); // ATTACK ANYWAY + + navigation_goalrating_end(); + } +}; + +void havocbot_chooserole_ft() +{ + if(self.deadflag != DEAD_NO) + return; + + self.havocbot_role = havocbot_role_ft_offensive; +}; -- 2.39.2