float scores_flags_primary;
float teamscores_flags_primary;
-vector ScoreField_Compare(entity t1, entity t2, .float field, float fieldflags, vector previous) // returns: cmp value, best prio
+vector ScoreField_Compare(entity t1, entity t2, .float field, float fieldflags, vector previous, float strict) // returns: cmp value, best prio
{
- if(!(fieldflags & SFL_SORT_PRIO_MASK)) // column does not sort
+ if(!strict && !(fieldflags & SFL_SORT_PRIO_MASK)) // column does not sort
return previous;
if(fieldflags & SFL_SORT_PRIO_MASK < previous_y)
return previous;
return TeamScore_AddToTeam(player.team, scorefield, score);
}
-float TeamScore_Compare(entity t1, entity t2)
+float TeamScore_Compare(entity t1, entity t2, float strict)
{
if(!t1 || !t2) return (!t2) - !t1;
{
var .float f;
f = teamscores[i];
- result = ScoreField_Compare(t1, t2, f, teamscores_flags[i], result);
+ result = ScoreField_Compare(t1, t2, f, teamscores_flags[i], result, strict);
}
+
+ if (result_x == 0 && strict)
+ result_x = t1.team - t2.team;
+
return result_x;
}
return r;
}
-float PlayerScore_Compare(entity t1, entity t2)
+float PlayerScore_Compare(entity t1, entity t2, float strict)
{
if(!t1 || !t2) return (!t2) - !t1;
{
var .float f;
f = scores[i];
- result = ScoreField_Compare(t1, t2, f, scores_flags[i], result);
+ result = ScoreField_Compare(t1, t2, f, scores_flags[i], result, strict);
}
+
+ if (result_x == 0 && strict)
+ result_x = num_for_edict(t1.owner) - num_for_edict(t2.owner);
+
return result_x;
}
for(t = 0; t < 16; ++t)
{
sk = teamscorekeepers[t];
- c = TeamScore_Compare(winnerscorekeeper, sk);
+ c = TeamScore_Compare(winnerscorekeeper, sk, 1);
if(c < 0)
{
WinningConditionHelper_secondteam = WinningConditionHelper_winnerteam;
}
else
{
- c = TeamScore_Compare(secondscorekeeper, sk);
+ c = TeamScore_Compare(secondscorekeeper, sk, 1);
if(c < 0)
{
WinningConditionHelper_secondteam = t + 1;
}
}
- WinningConditionHelper_equality = (TeamScore_Compare(winnerscorekeeper, secondscorekeeper) == 0);
+ WinningConditionHelper_equality = (TeamScore_Compare(winnerscorekeeper, secondscorekeeper, 0) == 0);
if(WinningConditionHelper_equality)
WinningConditionHelper_winnerteam = WinningConditionHelper_secondteam = -1;
FOR_EACH_PLAYER(p)
{
sk = p.scorekeeper;
- c = PlayerScore_Compare(winnerscorekeeper, sk);
+ c = PlayerScore_Compare(winnerscorekeeper, sk, 1);
if(c < 0)
{
WinningConditionHelper_second = WinningConditionHelper_winner;
}
else
{
- c = PlayerScore_Compare(secondscorekeeper, sk);
+ c = PlayerScore_Compare(secondscorekeeper, sk, 1);
if(c < 0)
{
WinningConditionHelper_second = p;
}
}
- WinningConditionHelper_equality = (PlayerScore_Compare(winnerscorekeeper, secondscorekeeper) == 0);
+ WinningConditionHelper_equality = (PlayerScore_Compare(winnerscorekeeper, secondscorekeeper, 0) == 0);
if(WinningConditionHelper_equality)
WinningConditionHelper_winner = WinningConditionHelper_second = world;
return out;
}
-float PlayerTeamScore_Compare(entity p1, entity p2)
+float PlayerTeamScore_Compare(entity p1, entity p2, float strict)
{
if(teamscores_entities_count)
if(p1.team != p2.team)
float r;
t1 = teamscorekeepers[p1.team - 1];
t2 = teamscorekeepers[p2.team - 1];
- r = TeamScore_Compare(t1, t2);
- if(r == 0) // ensure a deterministic order
- r = p1.team - p2.team;
+ r = TeamScore_Compare(t1, t2, strict);
return r;
}
- return PlayerScore_Compare(p1.scorekeeper, p2.scorekeeper);
+ return PlayerScore_Compare(p1.scorekeeper, p2.scorekeeper, strict);
}
-entity PlayerScore_Sort(.float field)
+entity PlayerScore_Sort(.float field, float strict)
{
entity p, plist, pprev, pbest, pbestprev, pfirst, plast;
- float i;
+ float i, j;
plist = world;
pfirst = plast = world;
- i = 0;
+ i = j = 0;
while(plist)
{
pprev = pbestprev = world;
pbest = plist;
for(p = plist; (pprev = p), (p = p.chain); )
{
- if(PlayerTeamScore_Compare(p, pbest) > 0)
+ if(PlayerTeamScore_Compare(p, pbest, strict) > 0)
{
pbest = p;
pbestprev = pprev;
pbestprev.chain = pbest.chain;
pbest.chain = world;
+ ++i;
+ if(!plast || PlayerTeamScore_Compare(plast, pbest, 0))
+ j = i;
+
pbest.field = ++i;
if not(pfirst)
++t;
w = bound(6, floor(SCORESWIDTH / t - 1), 9);
- p = PlayerScore_Sort(score_dummyfield);
+ p = PlayerScore_Sort(score_dummyfield, 0);
t = -1;
if(!teamscores_entities_count)