diff -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];