X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=data%2Fqcsrc%2Fserver%2Fbot%2Fhavocbot%2Fvore_ai.qc;h=1b58e1870fac96a48e29bb18a287e72726e70621;hb=bb41789b54177ebf9e1ae78d4518eb63e6c1716d;hp=2fdc0f9ff7bfded6c7b1c81a32e199cf2307e0ad;hpb=eb0a3e177cfebcdd07434d6d5ce142599142a0fa;p=voretournament%2Fvoretournament.git diff --git a/data/qcsrc/server/bot/havocbot/vore_ai.qc b/data/qcsrc/server/bot/havocbot/vore_ai.qc index 2fdc0f9f..1b58e187 100644 --- a/data/qcsrc/server/bot/havocbot/vore_ai.qc +++ b/data/qcsrc/server/bot/havocbot/vore_ai.qc @@ -18,7 +18,7 @@ void Vore_AI_Teamheal(entity prey) entity head; - if not(teams_matter && cvar("g_balance_vore_teamheal")) + if not(teams_matter && cvar("g_balance_vore_teamheal") && cvar("g_vore_teamvore")) return; if(self.deadflag != DEAD_NO || self.predator.classname == "player" || self.flagcarried || self.digesting) // a flag carrier can't waste time on team healing { @@ -69,6 +69,7 @@ void Vore_AI_Teamheal(entity prey) if(prey.health < cvar("g_balance_vore_teamheal_stable")) if not(prey.digesting) // if our team mate is digesting someone, he likely wouldn't want us ruining his frag if not(prey.flagcarried) // don't eat the flag carrier and ruin his job + if not(prey.BUTTON_ATCK || prey.BUTTON_ATCK2) // our team mate wouldn't want us eating him while he's firing self.BUTTON_ATCK = TRUE; // swallow the team mate } @@ -77,7 +78,9 @@ void Vore_AI() { // main vore AI code - if(cvar("bot_nofire") || !skill) + if(!cvar("g_vore")) // the vore system is disabled + return; + if(cvar("bot_nofire") || !skill || (g_rpg && cvar("g_rpg_botattack") < 1)) return; // -------------------------------- @@ -88,17 +91,22 @@ void Vore_AI() // aim toward the nearest possible victim. The greater the skill, the quicker the aim // this only does the aiming, checking and swallowing is handled below - entity scan; - scan = findradius(self.origin, cvar("g_balance_vore_swallow_range")); - if(Swallow_condition_check_bot(scan)) - bot_aimdir(scan.origin + scan.view_ofs - self.origin - self.view_ofs, -1); + entity head; + head = findradius(self.origin, cvar("g_balance_vore_swallow_range")); + while(head) + { + if(Swallow_condition_check_bot(head)) + bot_aimdir(head.origin + head.view_ofs - self.origin - self.view_ofs, -1); + head = head.chain; + } // now do the actual checking and swallowing entity prey; - float randomtry_pred, randomtry_prey; + float randomtry_pred, randomtry_prey, fear_pred; float decide_pred_time, decide_prey_time; prey = Swallow_player_check(); + fear_pred = 1; // check if we should run the Teamhealing AI rather than continuing with the normal vore AI Vore_AI_Teamheal(prey); @@ -107,23 +115,24 @@ void Vore_AI() randomtry_pred = randomtry_prey = random() * 10; // there are 10 bot skill steps if(prey.items & IT_STRENGTH) // avoid eating bots that have the Strenght powerup - randomtry_pred /= cvar("bot_ai_vore_fear") * self.bot_vorefear; + fear_pred += cvar("bot_ai_vore_fear") * self.bot_vorefear; if(prey.items & IT_INVINCIBLE) // avoid eating bots that have the Invincible powerup - randomtry_pred /= cvar("bot_ai_vore_fear") * self.bot_vorefear; - decide_pred_time = cvar("bot_ai_vore_decide_pred") / (skill * 2 + 1) / self.bot_vorethinkpred; - decide_prey_time = cvar("bot_ai_vore_decide_prey") / (skill * 2 + 1) / self.bot_vorethinkprey; + fear_pred += cvar("bot_ai_vore_fear") * self.bot_vorefear; + fear_pred += self.stomach_load; // the bigger our stomach, the less we want to put someone else in there + decide_pred_time = cvar("bot_ai_vore_decide_pred") / skill / self.bot_vorethinkpred; + decide_prey_time = cvar("bot_ai_vore_decide_prey") / skill / self.bot_vorethinkprey; if(time > self.decide_swallow) if(Swallow_condition_check_bot(prey)) { // the greater the skill, the higher the chance bots will swallow someone each attempt - if(skill >= randomtry_pred) + if(skill / fear_pred >= randomtry_pred) if not(teams_matter && prey.team == self.team) { self.BUTTON_ATCK = TRUE; // swallow self.decide_pred = time + decide_pred_time; // time before the bot decides what to do with their prey } - self.decide_swallow = time + cvar("bot_ai_vore_decide_swallow") / (skill + 1); + self.decide_swallow = time + cvar("bot_ai_vore_decide_swallow"); // this is needed to take a proper decision, otherwise the code would execute each frame and return TRUE pretty soon } // deciding what to do with a victim: @@ -138,6 +147,7 @@ void Vore_AI() else if(!self.digesting) { // the higher the skill, the faster bots will start to digest you + if not(g_rpg && cvar("g_rpg_botattack") < 2) if(skill >= randomtry_pred) self.BUTTON_DIGEST = TRUE; // digest @@ -153,6 +163,7 @@ void Vore_AI() if(self.predator.classname == "player" && time > self.decide_prey) { + if not(g_rpg && cvar("g_rpg_botattack") < 2) if not(teams_matter && self.team == self.predator.team) { // the higher the skill, the more the bot will kick in your stomack @@ -166,8 +177,11 @@ void Vore_AI() { if(self.predator.digesting) // our predator is digesting, so get out of him regardless of who he is self.BUTTON_JUMP = TRUE; // leave - else if not(teams_matter && self.team == self.predator.team && cvar("g_balance_vore_teamheal") && self.health < cvar("g_balance_vore_teamheal_stable")) // we are being team healed, don't leave - self.BUTTON_JUMP = TRUE; // leave + else if not(g_rpg && cvar("g_rpg_botattack") < 2) + { + if not(teams_matter && self.team == self.predator.team && cvar("g_balance_vore_teamheal") && self.health < cvar("g_balance_vore_teamheal_stable")) // we are being team healed, don't leave + self.BUTTON_JUMP = TRUE; // leave + } } self.decide_prey = time + decide_prey_time; // time before the bot decides what to do with their predator