Announce remaining frags for leadlimit, too.
authorpacker <packer@devfull.de>
Tue, 17 Mar 2020 17:47:13 +0000 (18:47 +0100)
committerpacker <packer@devfull.de>
Tue, 17 Mar 2020 17:47:13 +0000 (18:47 +0100)
qcsrc/server/g_world.qc

index 5ccfc97..7aa4698 100644 (file)
@@ -1258,7 +1258,7 @@ void Maplist_Init()
                                break;
                }
        }
-       
+
        if (i == Map_Count)
        {
                bprint( "Maplist contains no usable maps!  Resetting it to default map list.\n" );
@@ -1705,7 +1705,9 @@ void ShuffleMaplist()
        cvar_set("g_maplist", shufflewords(autocvar_g_maplist));
 }
 
-float leaderfrags;
+float leaderscore;
+float secondscore;
+int fragsleftlast;
 float WinningCondition_Scores(float limit, float leadlimit)
 {
        float limitreached;
@@ -1741,18 +1743,45 @@ float WinningCondition_Scores(float limit, float leadlimit)
        if(MUTATOR_CALLHOOK(Scores_CountFragsRemaining))
        // these modes always score in increments of 1, thus this makes sense
        {
-               if(leaderfrags != WinningConditionHelper_topscore)
+               if (leaderscore != WinningConditionHelper_topscore ||
+                       secondscore != WinningConditionHelper_secondscore)
                {
-                       leaderfrags = WinningConditionHelper_topscore;
+                       int fragsleft = 0;
+
+                       leaderscore = WinningConditionHelper_topscore;
+                       secondscore = WinningConditionHelper_secondscore;
 
                        if (limit)
                        {
-                               if (leaderfrags == limit - 1)
+                               if (leaderscore == limit - 1)
+                                       fragsleft |= BIT(1);
+                               else if (leaderscore == limit - 2)
+                                       fragsleft |= BIT(2);
+                               else if (leaderscore == limit - 3)
+                                       fragsleft |= BIT(3);
+                       }
+                       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);
+                       }
+
+                       fragsleft = fragsleft & -fragsleft; // lowest significant bit
+
+                       if (fragsleftlast != fragsleft) // do not announce same remaining frags multiple times
+                       {
+                               if (fragsleft & BIT(1))
                                        Send_Notification(NOTIF_ALL, NULL, MSG_ANNCE, ANNCE_REMAINING_FRAG_1);
-                               else if (leaderfrags == limit - 2)
+                               else if (fragsleft & BIT(2))
                                        Send_Notification(NOTIF_ALL, NULL, MSG_ANNCE, ANNCE_REMAINING_FRAG_2);
-                               else if (leaderfrags == limit - 3)
+                               else if (fragsleft & BIT(3))
                                        Send_Notification(NOTIF_ALL, NULL, MSG_ANNCE, ANNCE_REMAINING_FRAG_3);
+
+                               fragsleftlast = fragsleft;
                        }
                }
        }