From 3d1c656634faa24118dcf4ccb85e39532ec42829 Mon Sep 17 00:00:00 2001 From: MirceaKitsune Date: Tue, 7 Sep 2010 19:54:20 +0300 Subject: [PATCH] Team healing AI is now finished. It might still be possible to improve, but it's working properly and as intended now --- data/qcsrc/server/bot/havocbot/vore_ai.qc | 56 +++++++++++++---------- 1 file changed, 31 insertions(+), 25 deletions(-) diff --git a/data/qcsrc/server/bot/havocbot/vore_ai.qc b/data/qcsrc/server/bot/havocbot/vore_ai.qc index 174c4280..1ab66c73 100644 --- a/data/qcsrc/server/bot/havocbot/vore_ai.qc +++ b/data/qcsrc/server/bot/havocbot/vore_ai.qc @@ -27,48 +27,52 @@ float Swallow_condition_check_bot(entity prey) void Vore_AI_Teamheal(entity prey) { - // allows bots to take advantage of the teamheal feature in team games, and use this feature to heal damaged team mates + // allows bots to take advantage of the teamheal feature, and use it to heal damaged team mates + + entity head; if not(teamplay) return; - - self.status_teamhealing = 1; // start from the premise we can teamheal until proven otherwise - if(self.deadflag != DEAD_NO || self.eater.classname == "player" || self.flagcarried) + if(self.deadflag != DEAD_NO || self.eater.classname == "player" || self.flagcarried || self.digesting) // a flag carrier can't waste time on team healing { self.status_teamhealing = 0; return; } - // if we are holding a team mate that's been healed to the max, we can release them - // also use this check to not go any further if someone from the enemy team is in our stomach - entity head; + // decide if we can teamheal or not if(self.stomach_load) { + self.status_teamhealing = 2; // consider a team mate is in our stomach and therefore we are teamhealing, until proven otherwise below + FOR_EACH_PLAYER(head) { - if(head.eater.classname == "player") + if(head.eater == self) + if(head.team != self.team) { - if(head.team == self.team) - { - self.status_teamhealing = 2; - if(head.health >= cvar("g_balance_vore_teamheal_stable")) - self.BUTTON_REGURGITATE = TRUE; // release the team mate - } - else - { - self.status_teamhealing = 0; // someone from the enemy team is in our belly, which means we can't be teamhealing any more - return; - } + self.status_teamhealing = 0; // there's a foe in our stomach, we can't teamheal now + return; } } } + else + self.status_teamhealing = 1; // if our stomach is empty, it means we can decide to teamheal + + // now that we're decided if we can teamheal or not, lets go ahead and do so: + + // if we are holding a team mate that's been healed to the maximum amount, we can release them + // not sure if this should be merged with the FOR_EACH_PLAYER check above. That would save an extra loop, but would be less correct + FOR_EACH_PLAYER(head) + { + if(head.eater == self) // head is automatically a team mate, or we wouldn't be reaching this part of the code + if(head.health >= cvar("g_balance_vore_teamheal_stable")) + self.BUTTON_REGURGITATE = TRUE; // release the team mate + } // check if we can heal a damaged team mate we came across, and if so swallow them - if(self.status_teamhealing) if(prey.classname == "player" && prey.team == self.team) + if(prey.health < cvar("g_balance_vore_teamheal_stable")) if not(prey.flagcarried) // don't eat the flag carrier and ruin his job if(Swallow_condition_check_bot(prey)) - if(prey.health < cvar("g_balance_vore_teamheal_stable")) self.BUTTON_ATCK = TRUE; // swallow } @@ -96,6 +100,12 @@ void Vore_AI() float decide_prey, decide_pred; prey = Swallow_distance_check_bot(self); + + // check if we should run the Teamhealing AI rather than continuing with the normal vore + Vore_AI_Teamheal(prey); + if(self.status_teamhealing > 1) // if we are teamhealing, there's nothing to do from here on + return; + random_try = random() * 10; // there are 10 bot skill steps if(prey.items & IT_STRENGTH) // avoid eating bots that have the Strenght powerup random_try /= cvar("bot_ai_vore_decide_fear"); @@ -117,10 +127,6 @@ void Vore_AI() self.swallow_retry = time + 0.5; // bots retry swallowing every 0.5 seconds, otherwise each frame would be random chance } - Vore_AI_Teamheal(prey); - if(self.status_teamhealing > 1) // if we are teamhealing, there's nothing to do from here on - return; - // deciding what to do with a victim: if(self.stomach_load > 0 && time > self.decide_delay1) -- 2.39.2