[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