rendered paste bodydiff -u src/bzflag-orig/HUDRenderer.cxx src/bzflag/HUDRenderer.cxx
--- src/bzflag-orig/HUDRenderer.cxx 2005-04-08 13:28:30.000000000 -0400
+++ src/bzflag/HUDRenderer.cxx 2005-04-08 13:28:33.000000000 -0400
@@ -779,6 +779,27 @@
fm.drawString(x, y, 0, majorFontFace, majorFontSize, buffer);
}
+int HUDRenderer::tankTKRatioCompare(const void* _a, const void* _b)
+{
+ RemotePlayer* a = World::getWorld()->getPlayer(*(int*)_a);
+ RemotePlayer* b = World::getWorld()->getPlayer(*(int*)_b);
+
+ float a_ratio=a->getTKRatio();
+ float b_ratio=b->getTKRatio();
+
+ if ( a_ratio > b_ratio ) {
+ return -1;
+ } else if ( b_ratio > a_ratio ) {
+ return 1;
+ } else {
+ // fallback on reverse of tankScoreCompare
+ if (World::getWorld()->allowRabbit())
+ return a->getRabbitScore() - b->getRabbitScore();
+ else
+ return a->getScore() - b->getScore();
+ }
+}
+
int HUDRenderer::tankScoreCompare(const void* _a, const void* _b)
{
RemotePlayer* a = World::getWorld()->getPlayer(*(int*)_a);
@@ -896,7 +917,8 @@
}
}
- qsort(players, plrCount, sizeof(int), tankScoreCompare);
+ // qsort(players, plrCount, sizeof(int), tankScoreCompare);
+ qsort(players, plrCount, sizeof(int), tankTKRatioCompare);
// list player scores
bool drewMyScore = false;
diff -u src/bzflag-orig/HUDRenderer.h src/bzflag/HUDRenderer.h
--- src/bzflag-orig/HUDRenderer.h 2005-04-08 13:28:30.000000000 -0400
+++ src/bzflag/HUDRenderer.h 2005-04-08 13:28:33.000000000 -0400
@@ -140,6 +140,7 @@
void resize(bool firstTime);
static void resizeCallback(void*);
static int tankScoreCompare(const void* _a, const void* _b);
+ static int tankTKRatioCompare(const void* _a, const void* _b);
static int teamScoreCompare(const void* _a, const void* _b);
private:
diff -u src/bzflag-orig/Player.cxx src/bzflag/Player.cxx
--- src/bzflag-orig/Player.cxx 2005-04-08 13:28:30.000000000 -0400
+++ src/bzflag/Player.cxx 2005-04-08 13:28:33.000000000 -0400
@@ -166,6 +166,17 @@
}
+float Player::getTKRatio() const
+{
+ if ( wins == 0 ) {
+ // well, we have to return *something* if they have no wins
+ return (float)tks/1.0f;
+ } else {
+ return (float)tks/(float)wins;
+ }
+}
+
+
void Player::getMuzzle(float* m) const
{
// NOTE: like getRadius(), we only use dimensionsScale[0].
diff -u src/bzflag-orig/Player.h src/bzflag/Player.h
--- src/bzflag-orig/Player.h 2005-04-08 13:28:30.000000000 -0400
+++ src/bzflag/Player.h 2005-04-08 13:28:33.000000000 -0400
@@ -84,6 +84,7 @@
short getWins() const;
short getLosses() const;
short getTeamKills() const;
+ float getTKRatio() const;
short getScore() const;
const float* getDimensions() const;
short getRabbitScore() const;
diff -u src/bzflag-orig/playing.cxx src/bzflag/playing.cxx
--- src/bzflag-orig/playing.cxx 2005-04-08 13:28:30.000000000 -0400
+++ src/bzflag/playing.cxx 2005-04-08 13:28:33.000000000 -0400
@@ -584,15 +584,24 @@
// in case we don't find one
roamTrackWinner = 0;
}
- // FIXME find the current living winner alive
- int bestScore = -65536; // nobody should be this bad, should they?
+// // FIXME find the current living winner alive
+// int bestScore = -65536; // nobody should be this bad, should they?
+// for (int i = 0; i < curMaxPlayers; i++) {
+// if (player[i] && player[i]->isAlive() && player[i]->getScore() >= bestScore) {
+// roamTrackWinner = i;
+// bestScore = player[i]->getScore();
+// }
+// }
+// playerString = "Winner ";
+ // find the worst tk alive
+ float worstTKRatio = -1.0f;
for (int i = 0; i < curMaxPlayers; i++) {
- if (player[i] && player[i]->isAlive() && player[i]->getScore() >= bestScore) {
+ if (player[i] && player[i]->isAlive() && player[i]->getTKRatio() >= worstTKRatio) {
roamTrackWinner = i;
- bestScore = player[i]->getScore();
+ worstTKRatio = player[i]->getTKRatio();
}
}
- playerString = "Winner ";
+ playerString = "Worst TK ";
}
Player* tracked = player[roamTrackWinner];