|
From: Pier D. <cy...@us...> - 2001-07-15 17:31:05
|
Update of /cvsroot/bzflag/bzflag/src/bzflag
In directory usw-pr-cvs1:/tmp/cvs-serv9022
Modified Files:
HUDRenderer.cxx
Log Message:
score bugfix
Index: HUDRenderer.cxx
===================================================================
RCS file: /cvsroot/bzflag/bzflag/src/bzflag/HUDRenderer.cxx,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -r1.13 -r1.14
--- HUDRenderer.cxx 2001/07/12 15:57:12 1.13
+++ HUDRenderer.cxx 2001/07/15 17:31:01 1.14
@@ -756,8 +756,14 @@
int HUDRenderer::tankScoreCompare(const void* _a, const void* _b)
{
+#if defined(PTR_SCORE_SORT)
LocalPlayer *a = (LocalPlayer *) _a;
LocalPlayer *b = (LocalPlayer *) _b;
+#else
+ // See below, alternative to buggy qsort
+ RemotePlayer* a = World::getWorld()->getPlayer(*(int*)_a);
+ RemotePlayer* b = World::getWorld()->getPlayer(*(int*)_b);
+#endif
return a->getScore() - b->getScore();
}
@@ -788,6 +794,11 @@
int plrCount = 0;
const int maxPlayers = World::getWorld()->getMaxPlayers();
// run a sort by score
+
+#if defined(PTR_SCORE_SORT)
+ // Bugged at least under Solaris gcc 2.95.2. The call to qsort() may
+ // invalidate the array. Might reveal a buffer overflow elsewhere?
+
RemotePlayer **players = (RemotePlayer **)alloca(maxPlayers * sizeof(RemotePlayer *));
for (j = 0; j < maxPlayers; j++) {
players[j] = World::getWorld()->getPlayer(j);
@@ -802,6 +813,24 @@
y -= (int)dy;
drawPlayerScore(player, x1, x2, x3, (float)y);
}
+#else
+ // Alternative: sort players indexes
+
+ int* players = new int[maxPlayers];
+
+ for (j = 0; j < maxPlayers; j++)
+ if (World::getWorld()->getPlayer(j))
+ players[plrCount++] = j;
+
+ qsort(players, plrCount, sizeof(int), tankScoreCompare);
+
+ for (i = 0; i < plrCount; i++) {
+ RemotePlayer* player = World::getWorld()->getPlayer(players[i]);
+ y -= (int)dy;
+ drawPlayerScore(player, x1, x2, x3, (float)y);
+ }
+ delete[] players;
+#endif
y -= (int)dy;
const int maxDeadPlayers = World::getWorld()->getMaxDeadPlayers();
|