From f769ae20f77a616148256b331101a93e54294186 Mon Sep 17 00:00:00 2001 From: lordhavoc Date: Mon, 29 May 2006 07:28:12 +0000 Subject: [PATCH] made bots play much worse on lower skill settings, part of this was fixing a bug that made them never fire unless they would directly hit their target (which broke shotleading and low skill settings) bots now do less damage to human players on low skill settings (50% at skill 0, 60% at skill 1... skill 5 or above is 100% damage) the fixed shotleading means that skill 10 bots are now even more vicious than before... git-svn-id: svn://svn.icculus.org/nexuiz/trunk@1455 f962a42d-fe04-0410-a3ab-8c8b0445ebaa --- data/default.cfg | 5 ++++- data/qcsrc/server/gamec/bots.c | 23 ++++++++++++++++++----- data/qcsrc/server/gamec/g_damage.c | 6 ++++++ 3 files changed, 28 insertions(+), 6 deletions(-) diff --git a/data/default.cfg b/data/default.cfg index 5865b6469..5021a1ea5 100644 --- a/data/default.cfg +++ b/data/default.cfg @@ -134,8 +134,11 @@ seta bot_suffix "" // general bot AI cvars set bot_ai_strategyinterval 2 set bot_ai_enemydetectioninterval 0.5 -set bot_ai_aimskill_blendrate 1 +set bot_ai_aimskill_blendrate 2 set bot_ai_aimskill_fixedrate 30 +set bot_ai_aimskill_firetolerance_distdegrees 180 +set bot_ai_aimskill_firetolerance_mindegrees 2 +set bot_ai_aimskill_firetolerance_maxdegrees 30 // waypoint editor enable set g_waypointeditor 0 set bot_ignore_bots 0 diff --git a/data/qcsrc/server/gamec/bots.c b/data/qcsrc/server/gamec/bots.c index 7f53990f0..85d38281f 100644 --- a/data/qcsrc/server/gamec/bots.c +++ b/data/qcsrc/server/gamec/bots.c @@ -1438,6 +1438,8 @@ void(float t, float f1, float f2, entity e1, vector v1, vector v2, vector v3, ve self.bot_canfire = 1; }; +.float bot_badaimtime; +.vector bot_badaimoffset; float(vector v, float maxfiredeviation) bot_aimdir = { /* @@ -1489,7 +1491,12 @@ float(vector v, float maxfiredeviation) bot_aimdir = //dprint(" at:", vtos(v)); v = normalize(v); //te_lightning2(world, self.origin + self.view_ofs, self.origin + self.view_ofs + v * 200); - desiredang = vectoangles(v); + if (time >= self.bot_badaimtime) + { + self.bot_badaimtime = max(self.bot_badaimtime + 0.3, time); + self.bot_badaimoffset = randomvec() * bound(0, 5 - 0.5 * skill, 5); + } + desiredang = vectoangles(v) + self.bot_badaimoffset; //dprint(" desired:", vtos(desiredang)); if (desiredang_x >= 180) desiredang_x = desiredang_x - 360; @@ -1524,7 +1531,7 @@ float(vector v, float maxfiredeviation) bot_aimdir = fixedrate = cvar("bot_ai_aimskill_fixedrate") / dist; blendrate = cvar("bot_ai_aimskill_blendrate"); r = max(fixedrate, blendrate); - self.v_angle = self.v_angle + diffang * bound(0, r * frametime * (skill + 1) * 0.5, 1); + self.v_angle = self.v_angle + diffang * bound(0, r * frametime * (skill * 0.5 + 2), 1); self.v_angle_z = 0; while (self.v_angle_y < -180) self.v_angle_y = self.v_angle_y + 360; @@ -1586,19 +1593,25 @@ float(float shotspeed, float shotspeedupward, float maxshottime, float applygrav shotorg = self.origin + self.view_ofs; shotdir = v_forward; v = bot_shotlead(self.bot_aimtargorigin, self.bot_aimtargvelocity, shotspeed, self.bot_aimlatency); - r = vlen(v - shotorg); + r = bound(cvar("bot_ai_aimskill_firetolerance_mindegrees"), cvar("bot_ai_aimskill_firetolerance_distdegrees") / ((vlen(v - shotorg) + 100) * (skill + 2)), cvar("bot_ai_aimskill_firetolerance_maxdegrees")); if (applygravity && self.bot_aimtarg) { if (!findtrajectorywithleading(shotorg, '0 0 0', '0 0 0', self.bot_aimtarg, shotspeed, shotspeedupward, maxshottime, 0, self)) return FALSE; - f = bot_aimdir(findtrajectory_velocity - shotspeedupward * '0 0 1', min(10, 720 / r)); + f = bot_aimdir(findtrajectory_velocity - shotspeedupward * '0 0 1', r); } else { - f = bot_aimdir(v - shotorg, min(10, 720 / r)); + f = bot_aimdir(v - shotorg, r); //dprint("AIM: ");dprint(vtos(self.bot_aimtargorigin));dprint(" + ");dprint(vtos(self.bot_aimtargvelocity));dprint(" * ");dprint(ftos(self.bot_aimlatency + vlen(self.bot_aimtargorigin - shotorg) / shotspeed));dprint(" = ");dprint(vtos(v));dprint(" : aimdir = ");dprint(vtos(normalize(v - shotorg)));dprint(" : ");dprint(vtos(shotdir));dprint("\n"); traceline(shotorg, shotorg + shotdir * 10000, FALSE, self); + if (trace_ent.takedamage) + if (trace_fraction < 1) + if (!bot_shouldattack(trace_ent)) + return FALSE; + traceline(shotorg, self.bot_aimtargorigin, FALSE, self); if (trace_fraction < 1) + if (trace_ent != self.enemy) if (!bot_shouldattack(trace_ent)) return FALSE; } diff --git a/data/qcsrc/server/gamec/g_damage.c b/data/qcsrc/server/gamec/g_damage.c index c55d64715..a7595a0d4 100644 --- a/data/qcsrc/server/gamec/g_damage.c +++ b/data/qcsrc/server/gamec/g_damage.c @@ -331,6 +331,12 @@ void Damage (entity targ, entity inflictor, entity attacker, float damage, float if (attacker.team == targ.team) if ((teamplay == 1 || teamplay == 3) && attacker != targ) damage = 0; + + if (targ.classname == "player") + if (attacker.classname == "player") + if (!targ.isbot) + if (attacker.isbot) + damage = damage * bound(0.1, (skill + 5) * 0.1, 1); if(cvar("g_lms")) if(targ.classname == "player") -- 2.39.2