tTies in GetNextShooter() are now broken by assigning each player a tiebreak value in chronological order (essentially increasing the time resolution of FightTimeout). - vaccinewars - be a doctor and try to vaccinate the world (HTM) git clone git://src.adamsgaard.dk/vaccinewars (DIR) Log (DIR) Files (DIR) Refs (DIR) README (DIR) LICENSE --- (DIR) commit 0e4935ee1c40122c71f4aedf8c1c7d111b87ea2c (DIR) parent cc1a291a6612b1827661efce49266aedff9fd15b (HTM) Author: Ben Webb <ben@salilab.org> Date: Fri, 26 Apr 2002 10:40:57 +0000 Ties in GetNextShooter() are now broken by assigning each player a tiebreak value in chronological order (essentially increasing the time resolution of FightTimeout). Diffstat: M src/dopewars.h | 1 + M src/serverside.c | 32 +++++++++++++++++++++++++------ 2 files changed, 27 insertions(+), 6 deletions(-) --- (DIR) diff --git a/src/dopewars.h b/src/dopewars.h t@@ -285,6 +285,7 @@ struct PLAYER_T { Inventory *Guns, *Drugs, Bitches; EventCode EventNum, ResyncNum; time_t FightTimeout, IdleTimeout, ConnectTimeout; + guint tiebreak; price_t DocPrice; DopeList SpyList, TipList; Player *OnBehalfOf; (DIR) diff --git a/src/serverside.c b/src/serverside.c t@@ -2789,28 +2789,30 @@ Player *GetNextShooter(Player *Play) { Player *MinPlay, *Defend; time_t MinTimeout; + guint mintie; guint ArrayInd; - gboolean Tie = FALSE; if (!FightTimeout) return NULL; MinPlay = NULL; MinTimeout = 0; + mintie = 0; for (ArrayInd = 0; ArrayInd < Play->FightArray->len; ArrayInd++) { Defend = (Player *)g_ptr_array_index(Play->FightArray, ArrayInd); if (Defend == Play) continue; if (Defend->FightTimeout == 0) return NULL; - if (MinTimeout == 0 || Defend->FightTimeout <= MinTimeout) { - Tie = (Defend->FightTimeout == MinTimeout); + if (MinTimeout == 0 || Defend->FightTimeout < MinTimeout + || (Defend->FightTimeout == MinTimeout && Defend->tiebreak < mintie)) { MinPlay = Defend; MinTimeout = Defend->FightTimeout; + mintie = Defend->tiebreak; } } - return (Tie ? NULL : MinPlay); + return MinPlay; } void ResolveTipoff(Player *Play) t@@ -3504,10 +3506,28 @@ int LoseBitch(Player *Play, Inventory *Guns, Inventory *Drugs) */ void SetFightTimeout(Player *Play) { - if (FightTimeout) + if (FightTimeout) { Play->FightTimeout = time(NULL) + (time_t) FightTimeout; - else + + /* Make sure we have a higher tiebreak value than any other player with + * the same fight timeout (since FightTimeout only has second resolution, + * and possibly only microseconds have elapsed) */ + Play->tiebreak = 0; + if (Play->FightTimeout) { + GSList *listpt; + + for (listpt = FirstServer; listpt; listpt = g_slist_next(listpt)) { + Player *listplay = (Player *)listpt->data; + + if (listplay && listplay != Play + && listplay->FightTimeout == Play->FightTimeout) { + Play->tiebreak = MAX(Play->tiebreak, listplay->tiebreak + 1); + } + } + } + } else { Play->FightTimeout = 0; + } } /*