]> git.rm.cloudns.org Git - voretournament/voretournament.git/commitdiff
Team healing AI is now finished. It might still be possible to improve, but it's...
authorMirceaKitsune <sonichedgehog_hyperblast00@yahoo.com>
Tue, 7 Sep 2010 16:54:20 +0000 (19:54 +0300)
committerMirceaKitsune <sonichedgehog_hyperblast00@yahoo.com>
Tue, 7 Sep 2010 16:54:20 +0000 (19:54 +0300)
data/qcsrc/server/bot/havocbot/vore_ai.qc

index 174c428029c7947cb64907608c89f02b93ce2bba..1ab66c73529b9286e285e8b94b493cfc305a294a 100644 (file)
@@ -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)