int fragsleft_last;
float WinningCondition_Scores(float limit, float leadlimit)
{
- float limitreached;
-
// TODO make everything use THIS winning condition (except LMS)
WinningConditionHelper(NULL);
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;
}
}
- 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
);
}
*/
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)