Merge branch 'master' into martin-t/limit
authorMartin Taibr <taibr.martin@gmail.com>
Thu, 26 Mar 2020 14:19:14 +0000 (15:19 +0100)
committerMartin Taibr <taibr.martin@gmail.com>
Thu, 26 Mar 2020 14:19:14 +0000 (15:19 +0100)
1  2 
qcsrc/server/defs.qh
qcsrc/server/g_world.qc

diff --combined qcsrc/server/defs.qh
index 910ea215fba139ca510ed535ef094f4102878c53,9036ee22219f46aa4baf8724c5d2faee709a818a..3b5acfbd0dbb57be9c6ba5d668ce1deea51c7d75
@@@ -51,6 -51,7 +51,7 @@@ float server_is_dedicated
  .float  crouch;       // Crouching or not?
  
  const .float superweapons_finished = _STAT(SUPERWEAPONS_FINISHED);
+ const .float air_finished_stat = _STAT(AIR_FINISHED);
  
  .float cnt; // used in too many places
  .float count;
@@@ -140,6 -141,7 +141,6 @@@ float blockSpectators; //if set, new o
  .float spectatortime; //point in time since the client is spectating or observing
  void checkSpectatorBlock(entity this);
  
 -float game_completion_ratio; // 0 at start, 1 near end
  .float winning;
  .float jointime; // time of connecting
  .float startplaytime; // time of switching from spectator to player
diff --combined qcsrc/server/g_world.qc
index b0cd43455a9eee6cfbfb8e10dbd717e97cdc5589,fd8631f31a8657e82d664149f6ba16c83b729b7d..bf6fddf5cf3db2b75aa7b5be3baa1d05f9d22cb0
@@@ -1710,6 -1710,8 +1710,6 @@@ float secondscore
  int fragsleft_last;
  float WinningCondition_Scores(float limit, float leadlimit)
  {
 -      float limitreached;
 -
        // TODO make everything use THIS winning condition (except LMS)
        WinningConditionHelper(NULL);
  
                limit = -limit;
        }
  
-       if(WinningConditionHelper_zeroisworst
-               || (!autocvar_leadlimit_and_fraglimit && limit && leadlimit >= fabs(limit)))
+       if(WinningConditionHelper_zeroisworst)
                leadlimit = 0; // not supported in this mode
  
        if(MUTATOR_CALLHOOK(Scores_CountFragsRemaining))
                if (leaderscore != WinningConditionHelper_topscore ||
                        secondscore != WinningConditionHelper_secondscore)
                {
-                       int fragsleft = 0;
+                       int fragsleft = 0, leadingfragsleft = 0;
  
                        leaderscore = WinningConditionHelper_topscore;
                        secondscore = WinningConditionHelper_secondscore;
  
                        if (limit)
+                               fragsleft = limit - leaderscore;
+                       if (leadlimit)
+                               leadingfragsleft = secondscore + leadlimit - leaderscore;
+                       if (autocvar_leadlimit_and_fraglimit && leadlimit)
                        {
-                               if (leaderscore == limit - 1)
-                                       fragsleft |= BIT(1);
-                               else if (leaderscore == limit - 2)
-                                       fragsleft |= BIT(2);
-                               else if (leaderscore == limit - 3)
-                                       fragsleft |= BIT(3);
+                               if (limit)
+                                       fragsleft = max(leadingfragsleft, fragsleft);
                        }
-                       if (leadlimit)
+                       else if (leadlimit)
                        {
-                               if (leaderscore == leadlimit + secondscore - 1)
-                                       fragsleft |= BIT(1);
-                               else if (leaderscore == leadlimit + secondscore - 2)
-                                       fragsleft |= BIT(2);
-                               else if (leaderscore == leadlimit + secondscore - 3)
-                                       fragsleft |= BIT(3);
+                               if (limit)
+                                       fragsleft = min(fragsleft, leadingfragsleft);
+                               else
+                                       fragsleft = leadingfragsleft;
                        }
  
-                       fragsleft = fragsleft & -fragsleft; // least significant bit where 1 is set
                        if (fragsleft_last != fragsleft) // do not announce same remaining frags multiple times
                        {
-                               if (fragsleft & BIT(1))
+                               if (fragsleft == 1)
                                        Send_Notification(NOTIF_ALL, NULL, MSG_ANNCE, ANNCE_REMAINING_FRAG_1);
-                               else if (fragsleft & BIT(2))
+                               else if (fragsleft == 2)
                                        Send_Notification(NOTIF_ALL, NULL, MSG_ANNCE, ANNCE_REMAINING_FRAG_2);
-                               else if (fragsleft & BIT(3))
+                               else if (fragsleft == 3)
                                        Send_Notification(NOTIF_ALL, NULL, MSG_ANNCE, ANNCE_REMAINING_FRAG_3);
  
                                fragsleft_last = fragsleft;
                }
        }
  
 -      limitreached = false;
 -      if (limit && WinningConditionHelper_topscore >= limit)
 -              limitreached = true;
 -      if(leadlimit)
 -      {
 -              float leadlimitreached;
 -              leadlimitreached = (WinningConditionHelper_topscore - WinningConditionHelper_secondscore >= leadlimit);
 -              if(autocvar_leadlimit_and_fraglimit)
 -                      limitreached = (limitreached && leadlimitreached);
 -              else
 -                      limitreached = (limitreached || leadlimitreached);
 -      }
 +      bool fraglimit_reached = (limit && WinningConditionHelper_topscore >= limit);
 +      bool leadlimit_reached = (WinningConditionHelper_topscore - WinningConditionHelper_secondscore >= leadlimit);
  
 -      if(limit)
 -              game_completion_ratio = max(game_completion_ratio, bound(0, WinningConditionHelper_topscore / limit, 1));
 +      bool limit_reached;
 +      if(autocvar_leadlimit_and_fraglimit)
 +              limit_reached = (fraglimit_reached && leadlimit_reached);
 +      else
 +              limit_reached = (fraglimit_reached || leadlimit_reached);
  
        return GetWinningCode(
 -              WinningConditionHelper_topscore && limitreached,
 +              WinningConditionHelper_topscore && limit_reached,
                WinningConditionHelper_equality
        );
  }
@@@ -1886,6 -1891,10 +1882,6 @@@ Exit deathmatch games upon condition
  */
  void CheckRules_World()
  {
 -      float timelimit;
 -      float fraglimit;
 -      float leadlimit;
 -
        VoteThink();
        MapVote_Think();
  
                return;
        }
  
 -      timelimit = autocvar_timelimit * 60;
 -      fraglimit = autocvar_fraglimit;
 -      leadlimit = autocvar_leadlimit;
 +      float timelimit = autocvar_timelimit * 60;
 +      float fraglimit = autocvar_fraglimit;
 +      float leadlimit = autocvar_leadlimit;
 +      if (leadlimit < 0) leadlimit = 0;
  
        if(warmup_stage || time <= game_starttime) // NOTE: this is <= to prevent problems in the very tic where the game starts
        {
        float wantovertime;
        wantovertime = 0;
  
 -      if(timelimit > game_starttime)
 -              game_completion_ratio = (time - game_starttime) / (timelimit - game_starttime);
 -      else
 -              game_completion_ratio = 0;
 -
        if(checkrules_suddendeathend)
        {
                if(!checkrules_suddendeathwarning)