[nexuiz-commits] r7975 - in trunk/data/qcsrc/server/bot: . havocbot
DONOTREPLY at icculus.org
DONOTREPLY at icculus.org
Mon Sep 28 10:08:26 EDT 2009
Author: div0
Date: 2009-09-28 10:08:24 -0400 (Mon, 28 Sep 2009)
New Revision: 7975
Modified:
trunk/data/qcsrc/server/bot/aim.qc
trunk/data/qcsrc/server/bot/bot.qc
trunk/data/qcsrc/server/bot/bot.qh
trunk/data/qcsrc/server/bot/havocbot/havocbot.qc
Log:
improved bot personality system. Will commit personality file for it later. Without it, it works like before.
Modified: trunk/data/qcsrc/server/bot/aim.qc
===================================================================
--- trunk/data/qcsrc/server/bot/aim.qc 2009-09-28 12:21:44 UTC (rev 7974)
+++ trunk/data/qcsrc/server/bot/aim.qc 2009-09-28 14:08:24 UTC (rev 7975)
@@ -213,7 +213,7 @@
+ (self.bot_4th_order_aimfilter - self.bot_5th_order_aimfilter) * bound(0, cvar("bot_ai_aimskill_order_filter_5th"),1);
//blend = (bound(0,skill,10)*0.1)*pow(1-bound(0,skill,10)*0.05,2.5)*5.656854249; //Plot formule before changing !
- blend = bound(0,skill,10)*0.1;
+ blend = bound(0,skill+self.bot_aimskill,10)*0.1;
desiredang = desiredang + blend *
(
self.bot_1st_order_aimfilter * cvar("bot_ai_aimskill_order_mix_1st")
@@ -234,7 +234,7 @@
if (time >= self.bot_aimthinktime)
{
self.bot_aimthinktime = max(self.bot_aimthinktime + 0.5 - 0.05*(skill+self.bot_thinkskill), time);
- self.bot_mouseaim = self.bot_mouseaim + diffang * (1-random()*0.1*bound(1,10-skill,10));
+ self.bot_mouseaim = self.bot_mouseaim + diffang * (1-random()*0.1*bound(1,10-(skill+self.bot_thinkskill),10));
}
//self.v_angle = self.v_angle + diffang * bound(0, r * frametime * (skill * 0.5 + 2), 1);
@@ -291,8 +291,8 @@
// note the maxfiredeviation is in degrees so this has to convert to radians first
//if ((normalize(v) * shotdir) >= cos(maxfiredeviation * (3.14159265358979323846 / 180)))
if ((normalize(v) * shotdir) >= cos(maxfiredeviation * (3.14159265358979323846 / 180)))
- if (vlen(trace_endpos-shotorg) < 500+500*bound(0, skill, 10) || random()*random()>bound(0,skill*0.05,1))
- self.bot_firetimer = time + bound(0.1, 0.5-skill*0.05, 0.5);
+ if (vlen(trace_endpos-shotorg) < 500+500*bound(0, skill+self.bot_aggresskill, 10) || random()*random()>bound(0,(skill+self.bot_aggresskill)*0.05,1))
+ self.bot_firetimer = time + bound(0.1, 0.5-(skill+self.bot_aggresskill)*0.05, 0.5);
//traceline(shotorg,shotorg+shotdir*1000,FALSE,world);
//dprint(ftos(maxfiredeviation),"\n");
//dprint(" diff:", vtos(diffang), "\n");
Modified: trunk/data/qcsrc/server/bot/bot.qc
===================================================================
--- trunk/data/qcsrc/server/bot/bot.qc 2009-09-28 12:21:44 UTC (rev 7974)
+++ trunk/data/qcsrc/server/bot/bot.qc 2009-09-28 14:08:24 UTC (rev 7975)
@@ -36,7 +36,7 @@
if(cvar("bot_god"))
self.flags |= FL_GODMODE;
- self.bot_nextthink = self.bot_nextthink + cvar("bot_ai_thinkinterval");
+ self.bot_nextthink = self.bot_nextthink + cvar("bot_ai_thinkinterval") * pow(0.5, self.bot_aiskill);
//if (self.bot_painintensity > 0)
// self.bot_painintensity = self.bot_painintensity - (skill + 1) * 40 * frametime;
@@ -64,7 +64,7 @@
// (simulated network latency + naturally delayed reflexes)
//self.ping = 0.7 - bound(0, 0.05 * skill, 0.5); // moved the reflexes to bot_aimdir (under the name 'think')
// minimum ping 20+10 random
- self.ping = bound(0,0.07 - bound(0, skill * 0.005,0.05)+random()*0.01,0.65); // Now holds real lag to server, and higer skill players take a less laggy server
+ self.ping = bound(0,0.07 - bound(0, (skill + self.bot_pingskill) * 0.005,0.05)+random()*0.01,0.65); // Now holds real lag to server, and higer skill players take a less laggy server
// skill 10 = ping 0.2 (adrenaline)
// skill 0 = ping 0.7 (slightly drunk)
@@ -165,6 +165,28 @@
else bot_pants = ftos(floor(random() * 15));
self.bot_forced_team = stof(argv(5));
+
+ prio = 6;
+#define READSKILL(f,w,r) if(argv(prio) != "") self.f = stof(argv(prio)) * (w); else self.f = (!cvar("g_campaign")) * (2 * random() - 1) * (r) * (w); ++prio
+ //print(bot_name, ": ping=", argv(9), "\n");
+
+ READSKILL(havocbot_keyboardskill, 1, 0.5); // keyboards kill
+ READSKILL(bot_moveskill, 2, 0); // moves kill
+ READSKILL(bot_dodgeskill, 1, 0); // dodges kill
+
+ READSKILL(bot_pingskill, 0.5, 0); // pings kill
+
+ READSKILL(bot_weaponskill, 2, 0); // weapons kill
+ READSKILL(bot_aggresskill, 1, 0); // aggres kill
+ READSKILL(bot_rangepreference, 1, 0); // reads kill
+
+ READSKILL(bot_aimskill, 1, 0); // aims kill
+ READSKILL(bot_offsetskill, 2, 0.5); // offsets kill
+ READSKILL(bot_mouseskill, 0.5, 0.5); // mouses kill
+
+ READSKILL(bot_thinkskill, 0.5, 0.5); // thinks kill
+ READSKILL(bot_aiskill, 2, 0); // "ai"s kill
+
self.bot_config_loaded = TRUE;
// this is really only a default, JoinBestTeam is called later
@@ -349,10 +371,6 @@
JoinBestTeam(self, FALSE, TRUE);
havocbot_setupbot();
- self.bot_mouseskill=random()-0.5;
- self.bot_thinkskill=random()-0.5;
- self.bot_predictionskill=random()-0.5;
- self.bot_offsetskill=random()-0.5;
};
void bot_removefromlargestteam()
Modified: trunk/data/qcsrc/server/bot/bot.qh
===================================================================
--- trunk/data/qcsrc/server/bot/bot.qh 2009-09-28 12:21:44 UTC (rev 7974)
+++ trunk/data/qcsrc/server/bot/bot.qh 2009-09-28 14:08:24 UTC (rev 7975)
@@ -20,10 +20,24 @@
// Skill system
float skill;
float autoskill_nextthink;
-.float bot_thinkskill;
-.float bot_mouseskill;
-.float bot_predictionskill;
-.float bot_offsetskill;
+
+// havocbot_keyboardskill // keyboard movement
+.float bot_moveskill; // moving technique
+.float bot_dodgeskill; // dodging
+
+.float bot_pingskill; // ping offset
+
+.float bot_weaponskill; // weapon usage skill (combos, e.g.)
+.float bot_aggresskill; // aggressivity, controls "think before fire" behaviour
+.float bot_rangepreference; // weapon choice offset for range (>0 = prefer long range earlier "sniper", <0 = prefer short range "spammer")
+
+.float bot_aimskill; // aim accuracy
+.float bot_offsetskill; // aim breakage
+.float bot_mouseskill; // mouse "speed"
+
+.float bot_thinkskill; // target choice
+.float bot_aiskill; // strategy choice
+
.float totalfrags_lastcheck;
// Custom weapon priorities
Modified: trunk/data/qcsrc/server/bot/havocbot/havocbot.qc
===================================================================
--- trunk/data/qcsrc/server/bot/havocbot/havocbot.qc 2009-09-28 12:21:44 UTC (rev 7974)
+++ trunk/data/qcsrc/server/bot/havocbot/havocbot.qc 2009-09-28 14:08:24 UTC (rev 7975)
@@ -127,7 +127,7 @@
)
next = self.goalstack01.origin - (self.origin + self.view_ofs);
- skillblend=bound(0,(skill-2.5)*0.5,1); //lower skill player can't preturn
+ skillblend=bound(0,(skill+self.bot_moveskill-2.5)*0.5,1); //lower skill player can't preturn
distanceblend=bound(0,aimdistance/cvar("bot_ai_keyboard_distance"),1);
blend = skillblend * (1-distanceblend);
//v = (now * (distanceblend) + next * (1-distanceblend)) * (skillblend) + now * (1-skillblend);
@@ -150,7 +150,10 @@
{
local vector keyboard;
local float blend, maxspeed;
+ float sk;
+ sk = skill + self.bot_moveskill;
+
maxspeed = cvar("sv_maxspeed");
if (time < self.havocbot_keyboardtime)
@@ -159,13 +162,13 @@
self.havocbot_keyboardtime =
max(
self.havocbot_keyboardtime
- + bound(0,0.05/(skill+self.havocbot_keyboardskill),0.05)
+ + bound(0,0.05/(sk+self.havocbot_keyboardskill),0.05)
+random()*bound(0,0.025/(skill+self.havocbot_keyboardskill),100)
, time);
keyboard = self.movement * (1.0 / maxspeed);
local float trigger, trigger1;
- blend = bound(0,skill*0.1,1);
+ blend = bound(0,sk*0.1,1);
trigger = cvar("bot_ai_keyboard_treshold");
trigger1 = 0 - trigger;
@@ -177,22 +180,22 @@
if (keyboard_x > trigger)
{
keyboard_x = 1;
- if (skill < 2.5)
+ if (sk < 2.5)
keyboard_y = 0;
}
- else if (keyboard_x < trigger1 && skill > 1.5)
+ else if (keyboard_x < trigger1 && sk > 1.5)
{
keyboard_x = -1;
- if (skill < 4.5)
+ if (sk < 4.5)
keyboard_y = 0;
}
else
{
keyboard_x = 0;
- if (skill < 1.5)
+ if (sk < 1.5)
keyboard_y = 0;
}
- if (skill < 4.5)
+ if (sk < 4.5)
keyboard_z = 0;
if (keyboard_y > trigger)
@@ -765,11 +768,11 @@
}
dodge = havocbot_dodge();
- dodge = dodge * bound(0,3+skill*0.1,1);
- evadelava = evadelava * bound(1,3-skill,3); //Noobs fear lava a lot and take more distance from it
+ dodge = dodge * bound(0,0.5+(skill+self.bot_dodgeskill)*0.1,1);
+ evadelava = evadelava * bound(1,3-(skill+self.bot_dodgeskill),3); //Noobs fear lava a lot and take more distance from it
traceline(self.origin, self.enemy.origin, TRUE, world);
if(trace_ent.classname == "player")
- dir = dir * bound(0,skill/7,1);
+ dir = dir * bound(0,(skill+self.bot_dodgeskill)/7,1);
dir = normalize(dir + dodge + evadeobstacle + evadelava);
// self.bot_dodgevector = dir;
@@ -803,12 +806,12 @@
// Bunnyhop!
// if(self.aistatus & AI_STATUS_ROAMING)
- if(skill >= cvar("bot_ai_bunnyhop_skilloffset"))
+ if(skill+self.bot_moveskill >= cvar("bot_ai_bunnyhop_skilloffset"))
havocbot_bunnyhop(dir);
if ((dir * v_up) >= cvar("sv_jumpvelocity")*0.5 && (self.flags & FL_ONGROUND)) self.BUTTON_JUMP=1;
- if (((dodge * v_up) > 0) && random()*frametime >= 0.2*bound(0,(10-skill)*0.1,1)) self.BUTTON_JUMP=TRUE;
- if (((dodge * v_up) < 0) && random()*frametime >= 0.5*bound(0,(10-skill)*0.1,1)) self.havocbot_ducktime=time+0.3/bound(0.1,skill,10);
+ if (((dodge * v_up) > 0) && random()*frametime >= 0.2*bound(0,(10-skill-self.bot_dodgeskill)*0.1,1)) self.BUTTON_JUMP=TRUE;
+ if (((dodge * v_up) < 0) && random()*frametime >= 0.5*bound(0,(10-skill-self.bot_dodgeskill)*0.1,1)) self.havocbot_ducktime=time+0.3/bound(0.1,skill+self.bot_dodgeskill,10);
};
void havocbot_chooseenemy()
@@ -966,7 +969,7 @@
// Bots with no skill will be 4 times more slower than "godlike" bots when doing weapon combos
// Ideally this 4 should be calculated as longest_weapon_refire / bot_ai_weapon_combo_threshold
- combo_time = time + ct + (ct * ((-0.3*skill)+3));
+ combo_time = time + ct + (ct * ((-0.3*(skill+self.bot_weaponskill))+3));
combo = FALSE;
@@ -978,6 +981,8 @@
self.lastcombotime = time;
}
+ distance *= pow(2, self.bot_rangepreference);
+
// Custom weapon list based on distance to the enemy
if(bot_custom_weapon){
@@ -995,7 +1000,7 @@
}
// Choose weapons for mid distance
- if ( distance > bot_distance_close ) {
+ if ( distance > bot_distance_close) {
for(i=0; i < WEP_COUNT && bot_weapons_mid[i] != -1 ; ++i){
w = bot_weapons_mid[i];
if ( client_hasweapon(self, w, TRUE, FALSE) ){
@@ -1289,9 +1294,6 @@
self.cmd_moveto = havocbot_moveto;
self.cmd_resetgoal = havocbot_resetgoal;
- // will be updated by think code
- //Generate some random skill levels
- self.havocbot_keyboardskill = random() - 0.5;
havocbot_chooserole();
}
More information about the nexuiz-commits
mailing list