]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/server/g_world.qc
Merge branch 'master' into martin-t/limit
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / g_world.qc
index d365377c023cd70fead893d46013c59e5cda8d97..bf6fddf5cf3db2b75aa7b5be3baa1d05f9d22cb0 100644 (file)
@@ -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);
 
@@ -1746,39 +1744,36 @@ float WinningCondition_Scores(float limit, float leadlimit)
                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; // lowest significant bit
-
                        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;
@@ -1786,24 +1781,17 @@ float WinningCondition_Scores(float limit, float leadlimit)
                }
        }
 
-       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
        );
 }
@@ -1894,10 +1882,6 @@ Exit deathmatch games upon conditions
 */
 void CheckRules_World()
 {
-       float timelimit;
-       float fraglimit;
-       float leadlimit;
-
        VoteThink();
        MapVote_Think();
 
@@ -1912,9 +1896,10 @@ void CheckRules_World()
                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
        {
@@ -1939,11 +1924,6 @@ void CheckRules_World()
        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)