r2449 - in trunk/data: . qcsrc/server

DONOTREPLY at icculus.org DONOTREPLY at icculus.org
Wed May 2 11:46:19 EDT 2007


Author: div0
Date: 2007-05-02 11:46:19 -0400 (Wed, 02 May 2007)
New Revision: 2449

Modified:
   trunk/data/default.cfg
   trunk/data/qcsrc/server/keyhunt.qc
   trunk/data/qcsrc/server/keyhunt.qh
   trunk/data/qcsrc/server/miscfunctions.qc
Log:
fix uneven scoring when key gets destroyed


Modified: trunk/data/default.cfg
===================================================================
--- trunk/data/default.cfg	2007-05-02 14:17:37 UTC (rev 2448)
+++ trunk/data/default.cfg	2007-05-02 15:46:19 UTC (rev 2449)
@@ -726,7 +726,6 @@
 set g_balance_keyhunt_maxdist 150
 set g_balance_keyhunt_score_collect 3
 set g_balance_keyhunt_score_carrierfrag 2
-set g_balance_keyhunt_score_dropkey 0
 set g_balance_keyhunt_score_capture 100
 set g_balance_keyhunt_score_push 60
 set g_balance_keyhunt_score_destroyed 50

Modified: trunk/data/qcsrc/server/keyhunt.qc
===================================================================
--- trunk/data/qcsrc/server/keyhunt.qc	2007-05-02 14:17:37 UTC (rev 2448)
+++ trunk/data/qcsrc/server/keyhunt.qc	2007-05-02 15:46:19 UTC (rev 2449)
@@ -83,26 +83,26 @@
 	self.nextthink = time + 1;
 }
 
-void kh_Log()
-{
-	string s;
-	if(!cvar("sv_eventlog"))
-		return;
-	// TODO ...
-	GameLogEcho(s, FALSE);
-}
-
 // frags f: take from cvar * f
 // frags 0: no frags
 void kh_Scores_Event(entity player, entity key, string what, float frags_player, float frags_owner)
 {
-	float basefrags;
-	basefrags = cvar(strcat("g_balance_keyhunt_score_", what));
-
+	string s;
 	if(frags_player)
-		player.frags = player.frags + floor(0.5 + basefrags * frags_player);
+		player.frags = player.frags + floor(0.5 + frags_player);
 	if(frags_owner)
-		key.owner.frags = key.owner.frags + floor(0.5 + basefrags * frags_owner);
+		key.owner.frags = key.owner.frags + floor(0.5 + frags_owner);
+	if(!cvar("sv_eventlog"))
+		return;
+	s = strcat(":keyhunt:", what, ":", ftos(player.playerid));
+	s = strcat(s, ":", frags_player);
+	if(key.owner)
+		s = strcat(s, ":", ftos(key.owner.playerid));
+	else
+		s = strcat(s, ":0");
+	s = strcat(s, ":", frags_owner);
+	s = strcat(s, ":", key.netname);
+	GameLogEcho(s, FALSE);
 }
 
 void kh_Key_Attach(entity key)
@@ -285,7 +285,7 @@
 {
 	sound(key, CHAN_AUTO, kh_sound_collect, 1, ATTN_NORM);
 
-	kh_Scores_Event(player, key, "collect", 1, 0);
+	kh_Scores_Event(player, key, "collect", cvar("g_balance_keyhunt_score_collect"), 0);
 	bprint(player.netname, "^7 collected the ", key.netname, "\n");
 	kh_Key_AssignTo(key, player);
 
@@ -406,13 +406,14 @@
 	float first;
 	entity key;
 	float score;
-	score = (kh_teams - 1) / kh_teams;
+	score = (kh_teams - 1) * cvar("g_balance_keyhunt_score_capture");
+	DistributeEvenly_Init(score, kh_teams);
 	// twice the score for 3 team games, three times the score for 4 team games!
 	// note: for a win by destroying the key, this should NOT be applied
 	first = TRUE;
 	FOR_EACH_KH_KEY(key)
 	{
-		kh_Scores_Event(key.owner, key, "capture", score, 0);
+		kh_Scores_Event(key.owner, key, "capture", DistributeEvenly_Get(1), 0);
 		if(key.owner.kh_next == key)
 		{
 			if(!first)
@@ -451,7 +452,6 @@
 	entity player, key, attacker;
 	float players;
 	float keys;
-	float score;
 
 	attacker = world;
 	if(lostkey.pusher)
@@ -469,6 +469,9 @@
 	}
 	else
 	{
+		float of, fragsleft, i, thisteam;
+		of = cvar("g_balance_keyhunt_score_destroyed_ownfactor");
+
 		FOR_EACH_PLAYER(player)
 			if(player.team != teem)
 				++players;
@@ -477,16 +480,32 @@
 			if(key.owner && key.team != teem)
 				++keys;
 
-		score = 1.0 / max(1, keys * cvar("g_balance_keyhunt_score_destroyed_ownfactor") + players);
+		DistributeEvenly_Init(cvar("g_balance_keyhunt_score_destroyed"), keys * of + players);
 
-		FOR_EACH_PLAYER(player)
-			if(player.team != teem)
-				kh_Scores_Event(player, world, "destroyed", score, 0);
-
 		FOR_EACH_KH_KEY(key)
 			if(key.owner && key.team != teem)
-				kh_Scores_Event(key.owner, world, "destroyed", score * cvar("g_balance_keyhunt_score_destroyed_ownfactor"), 0);
+				kh_Scores_Event(key.owner, world, "destroyed_holdingkey", DistributeEvenly_Get(of), 0);
 
+		fragsleft = DistributeEvenly_Get(players);
+
+		// Now distribute these among all other teams...
+		for(i = 0; i < kh_teams; ++i)
+		{
+			thisteam = kh_Team_ByID(i);
+			players = 0;
+			FOR_EACH_PLAYER(player)
+				if(player.team == thisteam)
+					++players;
+
+			DistributeEvenly_Init(fragsleft, kh_teams - i);
+			fragsleft = DistributeEvenly_Get(kh_teams - i - 1);
+			DistributeEvenly_Init(DistributeEvenly_Get(1), players);
+
+			FOR_EACH_PLAYER(player)
+				if(player.team == thisteam)
+					kh_Scores_Event(player, world, "destroyed", DistributeEvenly_Get(1), 0);
+		}
+
 		bprint("The ", ColoredTeamName(teem), "^7 could not take care of the ", lostkey.netname, "\n");
 	}
 	sound(world, CHAN_AUTO, kh_sound_destroy, 1, ATTN_NONE);
@@ -627,18 +646,14 @@
 
 float kh_HandleFrags(entity attacker, entity targ, float f)
 {
-	float newfrags;
-
 	if(f <= 0)
 		return f;
 	if(attacker == targ)
 		return f;
 
 	if(targ.kh_next)
-		f = f - 1 + cvar("g_balance_keyhunt_score_carrierfrag");
+		kh_Scores_Event(attacker, targ.kh_next, "carrierfrag", cvar("g_balance_keyhunt_score_carrierfrag")-1, 0);
 
-	if(newfrags)
-		f = f - 1 + newfrags;
 	return f;
 }
 

Modified: trunk/data/qcsrc/server/keyhunt.qh
===================================================================
--- trunk/data/qcsrc/server/keyhunt.qh	2007-05-02 14:17:37 UTC (rev 2448)
+++ trunk/data/qcsrc/server/keyhunt.qh	2007-05-02 15:46:19 UTC (rev 2449)
@@ -1,7 +1,6 @@
 float kh_teams;
 float kh_tracking_enabled;
 
-void kh_Log();
 void kh_Scores_Event(entity player, entity key, string what, float frags_player, float frags_owner);
 void kh_Key_Attach(entity key);
 void kh_Key_Detach(entity key);

Modified: trunk/data/qcsrc/server/miscfunctions.qc
===================================================================
--- trunk/data/qcsrc/server/miscfunctions.qc	2007-05-02 14:17:37 UTC (rev 2448)
+++ trunk/data/qcsrc/server/miscfunctions.qc	2007-05-02 15:46:19 UTC (rev 2449)
@@ -1,6 +1,29 @@
 void() info_player_deathmatch; // needed for the other spawnpoints
 string ColoredTeamName(float t);
 
+float DistributeEvenly_amount;
+float DistributeEvenly_totalweight;
+void DistributeEvenly_Init(float amount, float totalweight)
+{
+	if(DistributeEvenly_amount)
+	{
+		dprint("DistributeEvenly_Init: UNFINISHED DISTRIBUTION (", ftos(DistributeEvenly_amount), " for ");
+		dprint(ftos(DistributeEvenly_totalweight), "left!\n");
+	}
+	DistributeEvenly_amount = amount;
+	DistributeEvenly_totalweight = totalweight;
+}
+float DistributeEvenly_Get(float weight)
+{
+	float f;
+	if(weight <= 0)
+		return 0;
+	f = floor(0.5 + DistributeEvenly_amount * weight / DistributeEvenly_totalweight);
+	DistributeEvenly_totalweight -= weight;
+	DistributeEvenly_amount -= f;
+	return f;
+}
+
 void move_out_of_solid_expand(entity e, vector by)
 {
 	float eps = 0.0625;
@@ -495,10 +518,9 @@
 
 void DistributeFragsAmongTeam(entity p, float targetteam, float factor)
 {
-	float f;
-	float d;
 	float nTeam;
 	entity head;
+	float f;
 
 	if(!teams_matter)
 		return;
@@ -524,20 +546,12 @@
 	if(nTeam == 0)
 		return;
 
+	DistributeEvenly_Init(f, nTeam);
+
 	FOR_EACH_PLAYER(head)
 		if(head != p)
 			if(head.team == targetteam)
-			{
-				d = floor(f / nTeam);
-				head.frags = head.frags + d;
-				f = f - d;
-				nTeam = nTeam - 1;
-			}
-
-	if(nTeam != 0)
-		error("nPlayers in team changed!");
-	if(f != 0)
-		error(strcat("There were ", ftos(f), " frags left. BAD!"));
+				head.frags = head.frags + DistributeEvenly_Get(1);
 }
 
 string Team_ColorCode(float teamid)




More information about the nexuiz-commits mailing list