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