Xonotic QuakeC
The free, fast arena FPS with crisp movement and a wide array of weapons
scores.qh File Reference
#include <common/scores.qh>
Include dependency graph for scores.qh:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Macros

#define PlayerScore_Get(player, scorefield)
 Returns the player's score.
#define WINNINGCONDITIONHELPER_LOWERISBETTER_WORST   999999999

Functions

string GetPlayerScoreString (entity pl, float shortString)
 Returns score strings for eventlog etc.
string GetTeamScoreString (int tm, float shortString)
float PlayerScore_Add (entity player, PlayerScoreField scorefield, float score)
 Adds a score to the player's scores.
void PlayerScore_Attach (entity player)
 Attaches a PlayerScore entity to a player.
bool PlayerScore_Clear (entity player)
 Initialize the score of this player if needed.
void PlayerScore_Detach (entity player)
 Detaches a PlayerScore entity from the player.
float PlayerScore_Set (entity player, PlayerScoreField scorefield, float score)
 Sets the player's score to the score parameter.
entity PlayerScore_Sort (.float field, int teams, bool strict, bool nospectators)
 Sorts the players and stores their place in the given field, starting with.
float PlayerTeamScore_Add (entity player, PlayerScoreField pscorefield, float tscorefield, float score)
 Adds a score to both the player and the team.
void Score_ClearAll ()
 Clear ALL scores (for ready-restart).
void Score_NicePrint (entity to)
 Prints the scores to the console of a player.
void ScoreInfo_Init (int teams)
 Initialize the scores info for the given number of teams.
void ScoreInfo_SetLabel_PlayerScore (PlayerScoreField i, string label, float scoreflags)
 Set the label of a player score item, as well as the scoring flags.
void ScoreInfo_SetLabel_TeamScore (int i, string label, float scoreflags)
 Set the label of a team score item, as well as the scoring flags.
float TeamScore_Add (entity player, float scorefield, float score)
 Adds a score to the player's team's scores.
float TeamScore_AddToTeam (int t, float scorefield, float score)
 Adds a score to the given team.
float TeamScore_GetCompareValue (float t)
 Returns a value indicating the team score (and higher is better).
void WinningConditionHelper (entity this)
 Sets the following results for the current scores entities.

Variables

bool autocvar_g_full_getstatus_responses
entity scores_initialized
float WinningConditionHelper_equality
 we have no winner
float WinningConditionHelper_lowerisbetter
 lower is better, duh
entity WinningConditionHelper_second
 the second player, or NULL if none
float WinningConditionHelper_secondscore
 second highest score
float WinningConditionHelper_secondteam
 the color of the second team, or -1 if none
float WinningConditionHelper_topscore
 highest score
entity WinningConditionHelper_winner
 the winning player, or NULL if none
float WinningConditionHelper_winnerteam
 the color of the winning team, or -1 if none
float WinningConditionHelper_zeroisworst
 zero is worst, duh

Macro Definition Documentation

◆ PlayerScore_Get

#define PlayerScore_Get ( player,
scorefield )
Value:
PlayerScore_Add(player, scorefield, 0)
float PlayerScore_Add(entity player, PlayerScoreField scorefield, float score)
Adds a score to the player's scores.
Definition scores.qc:352

Returns the player's score.

Parameters
[in]playerPlayer to inspect.
[in]scorefieldField of the score.
Returns
Player's score.

Definition at line 42 of file scores.qh.

Referenced by DynamicHandicap_UpdateHandicap(), MayhemCalculatePlayerScore(), MUTATOR_HOOKFUNCTION(), and TeamBalance_GetPlayerForTeamSwitch().

◆ WINNINGCONDITIONHELPER_LOWERISBETTER_WORST

#define WINNINGCONDITIONHELPER_LOWERISBETTER_WORST   999999999

Definition at line 116 of file scores.qh.

Function Documentation

◆ GetPlayerScoreString()

string GetPlayerScoreString ( entity pl,
float shortString )

Returns score strings for eventlog etc.

When called with NULL, or 0, as argument, they return the labels in the same order. The strings are comma separated; labels that end with !! designate primary, labels that end with ! designate high priority. Labels get an appended < if the scores are better if smaller (e.g. deaths). High priorities always come first. Example label string: score!!,kills,deaths<,suicides< If shortString is set, only the sort keys are returned.

Definition at line 613 of file scores.qc.

614{
615 entity sk;
616 int fl;
617 string lbl;
618
619 string out = "";
620 if(!pl)
621 {
622 // label
623 FOREACH(Scores, true, {
625 {
626 fl = scores_flags(it);
627 lbl = scores_label(it);
628 out = strcat(out, GetScoreLogLabel(lbl, fl), ",");
629 }
630 });
631 if(shortString < 2)
632 FOREACH(Scores, true, {
634 {
635 fl = scores_flags(it);
636 lbl = scores_label(it);
637 out = strcat(out, GetScoreLogLabel(lbl, fl), ",");
638 }
639 });
640 if(shortString < 1)
641 FOREACH(Scores, true, {
644 {
645 fl = scores_flags(it);
646 lbl = scores_label(it);
647 out = strcat(out, GetScoreLogLabel(lbl, fl), ",");
648 }
649 });
650 out = substring(out, 0, strlen(out) - 1);
651 }
652 else if((sk = CS(pl).scorekeeper))
653 {
654 FOREACH(Scores, true, {
656 out = strcat(out, ftos(sk.(scores(it))), ",");
657 });
658 if(shortString < 2)
659 FOREACH(Scores, true, {
661 out = strcat(out, ftos(sk.(scores(it))), ",");
662 });
663 if(shortString < 1)
664 FOREACH(Scores, true, {
667 out = strcat(out, ftos(sk.(scores(it))), ",");
668 });
669 out = substring(out, 0, strlen(out) - 1);
670 }
671 return out;
672}
var entity(vector mins, vector maxs,.entity tofield) findbox_tofield_OrFallback
#define scores_label(this)
Definition scores.qh:146
#define scores_flags(this)
Definition scores.qh:147
const int SFL_SORT_PRIO_MASK
Definition scores.qh:135
const int SFL_SORT_PRIO_SECONDARY
Scoring priority (NOTE: PRIMARY is used for fraglimit) NOTE: SFL_SORT_PRIO_SECONDARY value must be lo...
Definition scores.qh:133
const int SFL_SORT_PRIO_PRIMARY
Definition scores.qh:134
#define strlen
#define FOREACH(list, cond, body)
Definition iter.qh:19
string substring(string s, float start, float length)
string ftos(float f)
strcat(_("^F4Countdown stopped!"), "\n^BG", _("Teams are too unbalanced."))
string GetScoreLogLabel(string label, float fl)
Definition scores.qc:602
entity scorekeeper
Definition scores.qc:19
ClientState CS(Client this)
Definition state.qh:47

References CS(), entity(), FOREACH, ftos(), GetScoreLogLabel(), scorekeeper, scores_flags, scores_label, SFL_SORT_PRIO_MASK, SFL_SORT_PRIO_PRIMARY, SFL_SORT_PRIO_SECONDARY, strcat(), strlen, and substring().

Referenced by DumpStats(), and WinningConditionHelper().

◆ GetTeamScoreString()

string GetTeamScoreString ( int tm,
float shortString )

Definition at line 674 of file scores.qc.

675{
676 entity sk;
677 int i, fl;
678 string lbl;
679
680 string out = "";
681 if(tm == 0)
682 {
683 // label
684 for(i = 0; i < MAX_TEAMSCORE; ++i)
686 {
687 fl = teamscores_flags(i);
688 lbl = teamscores_label(i);
689 out = strcat(out, GetScoreLogLabel(lbl, fl), ",");
690 }
691 if(shortString < 2)
692 for(i = 0; i < MAX_TEAMSCORE; ++i)
694 {
695 fl = teamscores_flags(i);
696 lbl = teamscores_label(i);
697 out = strcat(out, GetScoreLogLabel(lbl, fl), ",");
698 }
699 if(shortString < 1)
700 for(i = 0; i < MAX_TEAMSCORE; ++i)
703 {
704 fl = teamscores_flags(i);
705 lbl = teamscores_label(i);
706 out = strcat(out, GetScoreLogLabel(lbl, fl), ",");
707 }
708 out = substring(out, 0, strlen(out) - 1);
709 }
710 else if((sk = teamscorekeepers[tm - 1]))
711 {
712 for(i = 0; i < MAX_TEAMSCORE; ++i)
714 out = strcat(out, ftos(sk.(teamscores(i))), ",");
715 if(shortString < 2)
716 for(i = 0; i < MAX_TEAMSCORE; ++i)
718 out = strcat(out, ftos(sk.(teamscores(i))), ",");
719 if(shortString < 1)
720 for(i = 0; i < MAX_TEAMSCORE; ++i)
723 out = strcat(out, ftos(sk.(teamscores(i))), ",");
724 out = substring(out, 0, strlen(out) - 1);
725 }
726 return out;
727}
#define MAX_TEAMSCORE
Definition scores.qh:149
#define teamscores_flags(i)
Definition scores.qh:156
#define teamscores_label(i)
Definition scores.qh:154
entity teamscorekeepers[16]
Definition scores.qc:20

References entity(), ftos(), GetScoreLogLabel(), MAX_TEAMSCORE, SFL_SORT_PRIO_MASK, SFL_SORT_PRIO_PRIMARY, SFL_SORT_PRIO_SECONDARY, strcat(), strlen, substring(), teamscorekeepers, teamscores_flags, and teamscores_label.

Referenced by DumpStats(), and WinningConditionHelper().

◆ PlayerScore_Add()

float PlayerScore_Add ( entity player,
PlayerScoreField scorefield,
float score )

Adds a score to the player's scores.

NEVER call this if PlayerScore_Attach has not been called yet! Means: FIXME make players unable to join the game when not called ClientConnect yet. Returns the new score.

Definition at line 352 of file scores.qc.

353{
354 bool mutator_returnvalue = MUTATOR_CALLHOOK(AddPlayerScore, scorefield, score, player);
355 score = M_ARGV(1, float);
356
357 if(!mutator_returnvalue && game_stopped)
358 {
359 score = 0;
360 }
361
362 if(!scores_initialized) return 0; // FIXME remove this when everything uses this system
363 entity s = CS(player).scorekeeper;
364 if(!s)
365 {
366 if(game_stopped)
367 return 0;
368 LOG_WARN("Adding score to unknown player!");
369 return 0;
370 }
371 if(!score)
372 {
373 return s.(scores(scorefield));
374 }
375 if(scores_label(scorefield) != "")
376 s.SendFlags |= BIT(scorefield.m_id % 16);
377 if(!warmup_stage)
379 s.(scores(scorefield)) += score;
380 MUTATOR_CALLHOOK(AddedPlayerScore, scorefield, score, player);
381 return s.(scores(scorefield));
382}
#define MUTATOR_CALLHOOK(id,...)
Definition base.qh:143
#define BIT(n)
Only ever assign into the first 24 bits in QC (so max is BIT(23)).
Definition bits.qh:8
bool warmup_stage
Definition main.qh:120
#define M_ARGV(x, type)
Definition events.qh:17
float game_stopped
Definition stats.qh:81
#define LOG_WARN(...)
Definition log.qh:61
const string PLAYERSTATS_TOTAL
#define PlayerStats_GameReport_Event_Player(ent, eventid, val)
entity scores_initialized
Definition scores.qh:7

References BIT, CS(), entity(), game_stopped, LOG_WARN, M_ARGV, MUTATOR_CALLHOOK, PlayerStats_GameReport_Event_Player, PLAYERSTATS_TOTAL, scores_initialized, scores_label, strcat(), and warmup_stage.

Referenced by _GameRules_scoring_add_float2int(), and PlayerTeamScore_Add().

◆ PlayerScore_Attach()

void PlayerScore_Attach ( entity player)

Attaches a PlayerScore entity to a player.

Use that in ClientConnect. Remember to detach it in ClientDisconnect!

Definition at line 334 of file scores.qc.

335{
336 if(CS(player).scorekeeper)
337 error("player already has a scorekeeper");
339 sk.owner = player;
341 CS(player).scorekeeper = sk;
342}
void Net_LinkEntity(entity e, bool docull, float dt, bool(entity this, entity to, int sendflags) sendfunc)
Definition net.qh:123
#define new_pure(class)
purely logical entities (not linked to the area grid)
Definition oo.qh:67
#define error
Definition pre.qh:6
bool PlayerScore_SendEntity(entity this, entity to, float sendflags)
Definition scores.qc:257

◆ PlayerScore_Clear()

bool PlayerScore_Clear ( entity player)

Initialize the score of this player if needed.

Does nothing in teamplay. Use that when a spectator becomes a player. Returns whether clearing has been performed

Definition at line 285 of file scores.qc.

286{
287 entity sk;
288
290 return false;
291
292 if(MUTATOR_CALLHOOK(ForbidPlayerScore_Clear))
293 return false;
294
295 sk = CS(player).scorekeeper;
296 FOREACH(Scores, true, {
297 if(sk.(scores(it)) != 0 && scores_label(it) != "")
298 sk.SendFlags |= BIT(i % 16);
299 if(i != SP_SKILL.m_id)
300 sk.(scores(it)) = 0;
301 });
302
303 return true;
304}
int teamscores_entities_count
Definition scores.qc:21

References BIT, CS(), entity(), FOREACH, MUTATOR_CALLHOOK, scores_label, and teamscores_entities_count.

Referenced by PutPlayerInServer(), and SetPlayerTeam().

◆ PlayerScore_Detach()

void PlayerScore_Detach ( entity player)

Detaches a PlayerScore entity from the player.

Use that in ClientDisconnect.

Definition at line 344 of file scores.qc.

345{
346 if(!CS(player).scorekeeper)
347 error("player has no scorekeeper");
348 delete(CS(player).scorekeeper);
349 CS(player).scorekeeper = NULL;
350}
#define NULL
Definition post.qh:14

◆ PlayerScore_Set()

float PlayerScore_Set ( entity player,
PlayerScoreField scorefield,
float score )

Sets the player's score to the score parameter.

NEVER call this if PlayerScore_Attach has not been called yet! Means: FIXME make players unable to join the game when not called ClientConnect yet. Returns the new (or old if unchanged) score.

Definition at line 384 of file scores.qc.

385{
386 if(!scores_initialized) return 0; // FIXME remove this when everything uses this system
387 entity s = CS(player).scorekeeper;
388 if(!s)
389 {
390 if(game_stopped)
391 return 0;
392 LOG_WARN("Setting score of unknown player!");
393 return 0;
394 }
395
396 float oldscore = s.(scores(scorefield));
397 if(oldscore == score)
398 return oldscore;
399
400 if(scores_label(scorefield) != "")
401 s.SendFlags |= BIT(scorefield.m_id % 16);
402 s.(scores(scorefield)) = score;
403 return s.(scores(scorefield));
404}

References BIT, CS(), entity(), game_stopped, LOG_WARN, scores_initialized, and scores_label.

Referenced by NET_HANDLE().

◆ PlayerScore_Sort()

entity PlayerScore_Sort ( .float field,
int teams,
bool strict,
bool nospectators )

Sorts the players and stores their place in the given field, starting with.

  1. Non-players get 0 written into that field. Returns the beginning of a sorted chain of the non-spectators. teams: >0: sort by teams first (always strict ordering); <0: sort by teams only (respects strict flag) strict: return a strict ordering nospectators: exclude spectators

Definition at line 748 of file scores.qc.

749{
750 entity p, plist, pprev, pbest, pbestprev, pfirst, plast;
751
752 plist = NULL;
753
754 FOREACH_CLIENT(true, { it.(field) = 0; });
755
757 {
758 if(nospectators)
759 if(it.frags == FRAGS_SPECTATOR)
760 continue;
761
762 it.chain = plist;
763 plist = it;
764 });
765 // Now plist points to the whole list.
766
767 pfirst = plast = NULL;
768
769 int i = 0, j = 0;
770 while(plist)
771 {
772 pprev = pbestprev = NULL;
773 pbest = plist;
774 for(p = plist; (pprev = p), (p = p.chain); )
775 {
776 if(PlayerTeamScore_Compare(p, pbest, teams, strict) > 0)
777 {
778 pbest = p;
779 pbestprev = pprev;
780 }
781 }
782
783 // remove pbest out of the chain
784 if(pbestprev == NULL)
785 plist = pbest.chain;
786 else
787 pbestprev.chain = pbest.chain;
788 pbest.chain = NULL;
789
790 ++i;
791 if(!plast || PlayerTeamScore_Compare(plast, pbest, teams, strict))
792 j = i;
793
794 pbest.(field) = j;
795
796 if (!pfirst)
797 pfirst = pbest;
798 if(plast)
799 plast.chain = pbest;
800 plast = pbest;
801 }
802
803 return pfirst;
804}
entity teams
Definition main.qh:58
const int FRAGS_SPECTATOR
Definition constants.qh:4
int PlayerTeamScore_Compare(entity p1, entity p2, float teams, bool strict)
Definition scores.qc:730
#define FOREACH_CLIENT(cond, body)
Definition utils.qh:50

References CS(), entity(), FOREACH_CLIENT, FRAGS_SPECTATOR, NULL, PlayerTeamScore_Compare(), scorekeeper, and teams.

Referenced by MUTATOR_HOOKFUNCTION(), MUTATOR_HOOKFUNCTION(), PlayerStats_GameReport(), and Score_NicePrint().

◆ PlayerTeamScore_Add()

float PlayerTeamScore_Add ( entity player,
PlayerScoreField pscorefield,
float tscorefield,
float score )

Adds a score to both the player and the team.

Returns the team score if possible, otherwise the player score.

Definition at line 406 of file scores.qc.

407{
408 float r = PlayerScore_Add(player, pscorefield, score);
409 if(teamscores_entities_count) // only for teamplay
410 r = TeamScore_Add(player, tscorefield, score);
411 return r;
412}
float TeamScore_Add(entity player, float scorefield, float score)
Adds a score to the player's team's scores.
Definition scores.qc:134

References entity(), PlayerScore_Add(), TeamScore_Add(), and teamscores_entities_count.

Referenced by _GameRules_scoring_add_float2int().

◆ Score_ClearAll()

void Score_ClearAll ( )

Clear ALL scores (for ready-restart).

Definition at line 306 of file scores.qc.

307{
308 entity sk;
309 int t;
310 FOREACH_CLIENTSLOT(true, {
311 sk = CS(it).scorekeeper;
312 if (!sk) continue;
313 FOREACH(Scores, true, {
314 if(sk.(scores(it)) != 0 && scores_label(it) != "")
315 sk.SendFlags |= BIT(i % 16);
316 if(i != SP_SKILL.m_id)
317 sk.(scores(it)) = 0;
318 });
319 });
320 for(t = 0; t < 16; ++t)
321 {
322 sk = teamscorekeepers[t];
323 if(!sk)
324 continue;
325 for(int j = 0; j < MAX_TEAMSCORE; ++j)
326 {
327 if(sk.(teamscores(j)) != 0 && teamscores_label(j) != "")
328 sk.SendFlags |= BIT(j);
329 sk.(teamscores(j)) = 0;
330 }
331 }
332}
#define FOREACH_CLIENTSLOT(cond, body)
Definition utils.qh:40

References BIT, CS(), entity(), FOREACH, FOREACH_CLIENTSLOT, MAX_TEAMSCORE, scores_label, teamscorekeepers, and teamscores_label.

Referenced by reset_map().

◆ Score_NicePrint()

void Score_NicePrint ( entity to)

Prints the scores to the console of a player.

Definition at line 917 of file scores.qc.

918{
919 int t = 0;
920 FOREACH(Scores, true, {
921 if(scores_label(it) != "")
922 ++t;
923 });
924 int w = bound(6, floor(SCORESWIDTH / t - 1), 9);
925
926 entity p = PlayerScore_Sort(score_dummyfield, 1, true, false);
927 t = -1;
928
930 Score_NicePrint_Team(to, t, w);
931 while(p)
932 {
934 if(t != p.team)
935 Score_NicePrint_Team(to, p.team, w);
936 Score_NicePrint_Player(to, p, w);
937 t = p.team;
938 p = p.chain;
939 }
940
941 t = 0;
943 if (!t)
946 t = 1;
947 });
948}
#define IS_PLAYER(s)
Definition player.qh:243
float bound(float min, float value, float max)
float floor(float f)
void Score_NicePrint_Team(entity to, float t, float w)
Definition scores.qc:842
const float SCORESWIDTH
Definition scores.qc:830
void Score_NicePrint_Spectator(entity to, entity p)
Definition scores.qc:911
float score_dummyfield
Definition scores.qc:916
void Score_NicePrint_Player(entity to, entity p, float w)
Definition scores.qc:876
void Score_NicePrint_Spectators(entity to)
Definition scores.qc:906
entity PlayerScore_Sort(.float field, int teams, bool strict, bool nospectators)
Sorts the players and stores their place in the given field, starting with.
Definition scores.qc:748

References bound(), entity(), floor(), FOREACH, FOREACH_CLIENT, IS_PLAYER, PlayerScore_Sort(), score_dummyfield, Score_NicePrint_Player(), Score_NicePrint_Spectator(), Score_NicePrint_Spectators(), Score_NicePrint_Team(), scores_label, SCORESWIDTH, and teamscores_entities_count.

Referenced by CommonCommand_teamstatus(), MUTATOR_HOOKFUNCTION(), and MUTATOR_HOOKFUNCTION().

◆ ScoreInfo_Init()

void ScoreInfo_Init ( int teams)

Initialize the scores info for the given number of teams.

Set all labels right before this call.

Definition at line 232 of file scores.qc.

233{
235 {
236 scores_initialized.SendFlags |= 1; // force a resend
237 }
238 else
239 {
240 scores_initialized = new_pure(ent_client_scoreinfo);
242 }
243 if(teams & BIT(0))
245 if(teams & BIT(1))
247 if(teams & BIT(2))
248 TeamScore_Spawn(NUM_TEAM_3, "Yellow");
249 if(teams & BIT(3))
251}
void TeamScore_Spawn(float t, string name)
Definition scores.qc:96
bool ScoreInfo_SendEntity(entity this, entity to, int sf)
Definition scores.qc:204
const int NUM_TEAM_2
Definition teams.qh:14
const int NUM_TEAM_4
Definition teams.qh:16
const int NUM_TEAM_3
Definition teams.qh:15
const int NUM_TEAM_1
Definition teams.qh:13

References BIT, Net_LinkEntity(), new_pure, NUM_TEAM_1, NUM_TEAM_2, NUM_TEAM_3, NUM_TEAM_4, ScoreInfo_SendEntity(), scores_initialized, teams, and TeamScore_Spawn().

Referenced by ScoreRules_basics_end().

◆ ScoreInfo_SetLabel_PlayerScore()

void ScoreInfo_SetLabel_PlayerScore ( PlayerScoreField i,
string label,
float scoreflags )

Set the label of a player score item, as well as the scoring flags.

References entity(), and teams.

◆ ScoreInfo_SetLabel_TeamScore()

void ScoreInfo_SetLabel_TeamScore ( int i,
string label,
float scoreflags )

Set the label of a team score item, as well as the scoring flags.

◆ TeamScore_Add()

float TeamScore_Add ( entity player,
float scorefield,
float score )

Adds a score to the player's team's scores.

NEVER call this if team has not been set yet! Returns the new score.

Definition at line 134 of file scores.qc.

135{
136 return TeamScore_AddToTeam(player.team, scorefield, score);
137}
float TeamScore_AddToTeam(int t, float scorefield, float score)
Adds a score to the given team.
Definition scores.qc:107

References entity(), and TeamScore_AddToTeam().

Referenced by PlayerTeamScore_Add().

◆ TeamScore_AddToTeam()

float TeamScore_AddToTeam ( int t,
float scorefield,
float score )

Adds a score to the given team.

NEVER call this if team has not been set yet! Returns the new score.

Definition at line 107 of file scores.qc.

108{
109 entity s;
110
111 if(game_stopped)
112 score = 0;
113
114 if(!scores_initialized) return 0; // FIXME remove this when everything uses this system
115 if(t <= 0 || t >= 16)
116 {
117 if(game_stopped)
118 return 0;
119 error("Adding score to invalid team!");
120 }
121 s = teamscorekeepers[t - 1];
122 if(!s)
123 {
124 if(game_stopped)
125 return 0;
126 error("Adding score to unknown team!");
127 }
128 if(score)
129 if(teamscores_label(scorefield) != "")
130 s.SendFlags |= BIT(scorefield);
131 return (s.(teamscores(scorefield)) += score);
132}

References BIT, entity(), error, game_stopped, scores_initialized, teamscorekeepers, and teamscores_label.

Referenced by CA_CheckWinner(), ctf_Handle_Return(), Domination_CheckWinner(), dompointthink(), freezetag_CheckWinner(), GoalTouch(), Onslaught_CheckWinner(), TeamScore_Add(), WinningCondition_Assault(), and WinningCondition_RanOutOfSpawns().

◆ TeamScore_GetCompareValue()

float TeamScore_GetCompareValue ( float t)

Returns a value indicating the team score (and higher is better).

Definition at line 806 of file scores.qc.

807{
808 float s;
809
810 if(t <= 0 || t >= 16)
811 {
812 if(game_stopped)
813 return 0;
814 error("Reading score of invalid team!");
815 }
816
817 entity sk = teamscorekeepers[t - 1];
818 if (!sk)
819 return -999999999;
820 s = sk.teamscores_primary;
822 if(!s)
823 return -999999999;
825 s = -s;
826 return s;
827}
const int SFL_LOWER_IS_BETTER
Lower scores are better (e.g.
Definition scores.qh:102
#define SFL_ZERO_IS_WORST
Definition scores.qh:127
int teamscores_flags_primary
Definition scores.qc:25

References entity(), error, game_stopped, SFL_LOWER_IS_BETTER, SFL_ZERO_IS_WORST, teamscorekeepers, and teamscores_flags_primary.

Referenced by WinningCondition_Scores().

◆ WinningConditionHelper()

void WinningConditionHelper ( entity this)

Sets the following results for the current scores entities.

Definition at line 443 of file scores.qc.

444{
445 float c;
446 string s;
447 entity sk;
448
449 // format:
450 // gametype:P<pure>:S<slots>::plabel,plabel:tlabel,tlabel:teamid:tscore,tscore:teamid:tscore,tscore
451 // score labels always start with a symbol or with lower case
452 // so to match pure, match for :P0:
453 // to match full, match for :S0:
454
455 // NOTE can't use a single strcat because strcat concatenates max 8 strings
456 s = strcat(GetGametype(),
459 ":S", ftos(nJoinAllowed(NULL)));
460 s = strcat(s,
461 ":F", ftos(serverflags),
463 ":M", modname);
464 s = strcat(s,
466
467 entity winnerscorekeeper = NULL;
468 entity secondscorekeeper = NULL;
469
471 {
472 int t;
473
474 s = strcat(s, ":", GetTeamScoreString(0, 1));
475 for(t = 0; t < 16; ++t)
476 if(teamscorekeepers[t])
477 s = strcat(s, ":", ftos(t+1), ":", GetTeamScoreString(t+1, 1));
478
481 for(t = 0; t < 16; ++t)
482 {
483 sk = teamscorekeepers[t];
484 c = TeamScore_Compare(winnerscorekeeper, sk, true);
485 if(c < 0)
486 {
489 secondscorekeeper = winnerscorekeeper;
490 winnerscorekeeper = sk;
491 }
492 else
493 {
494 c = TeamScore_Compare(secondscorekeeper, sk, true);
495 if(c < 0)
496 {
498 secondscorekeeper = sk;
499 }
500 }
501 }
502
503 WinningConditionHelper_equality = (TeamScore_Compare(winnerscorekeeper, secondscorekeeper, false) == 0);
506
507 WinningConditionHelper_topscore = winnerscorekeeper.teamscores_primary;
508 WinningConditionHelper_secondscore = secondscorekeeper.teamscores_primary;
511
512 WinningConditionHelper_winner = NULL; // not supported in teamplay
513 WinningConditionHelper_second = NULL; // not supported in teamplay
514 }
515 else
516 {
520 sk = CS(it).scorekeeper;
521 c = PlayerScore_Compare(winnerscorekeeper, sk, true);
522 if(c < 0)
523 {
526 secondscorekeeper = winnerscorekeeper;
527 winnerscorekeeper = sk;
528 }
529 else
530 {
531 c = PlayerScore_Compare(secondscorekeeper, sk, true);
532 if(c < 0)
533 {
535 secondscorekeeper = sk;
536 }
537 }
538 });
539
540 WinningConditionHelper_equality = (PlayerScore_Compare(winnerscorekeeper, secondscorekeeper, false) == 0);
543
544 WinningConditionHelper_topscore = winnerscorekeeper.scores_primary;
545 WinningConditionHelper_secondscore = secondscorekeeper.scores_primary;
548
549 WinningConditionHelper_winnerteam = -1; // no teamplay
550 WinningConditionHelper_secondteam = -1; // no teamplay
551 }
552
554 {
556 {
559 else
561 }
562 if(player_count == 0) // special case: empty servers DO end the match at a 0:0 tie
564 }
565
567 {
569 {
572 else
574 }
575 }
576
577 if (s != worldstatus)
579
580 FOREACH_CLIENT(true, {
581 string s = "";
583 {
584 s = GetPlayerScoreString(it, 1);
585 s = strcat(s, IS_REAL_CLIENT(it) ? ":human" : ":bot");
586 if(!(IS_PLAYER(it) || INGAME_JOINED(it)))
587 s = strcat(s, ":spectator");
588 }
589 else
590 {
591 if (IS_PLAYER(it) || INGAME_JOINED(it))
592 s = GetPlayerScoreString(it, 2);
593 else
594 s = "-666";
595 }
596
597 if (s != it.clientstatus)
598 strcpy(it.clientstatus, s);
599 });
600}
int player_count
Definition api.qh:103
int serverflags
Definition main.qh:211
string worldstatus
string GetGametype()
string GetTeamScoreString(int tm, float shortString)
Definition scores.qc:674
int scores_flags_primary
Definition scores.qc:24
float PlayerScore_Compare(entity t1, entity t2, bool strict)
Definition scores.qc:415
int TeamScore_Compare(entity t1, entity t2, bool strict)
Definition scores.qc:140
string GetPlayerScoreString(entity pl, float shortString)
Returns score strings for eventlog etc.
Definition scores.qc:613
int nJoinAllowed(entity this)
Determines how many player slots are free.
Definition client.qc:2143
string autocvar_g_xonoticversion
Definition client.qh:46
float WinningConditionHelper_secondscore
second highest score
Definition scores.qh:108
entity WinningConditionHelper_second
the second player, or NULL if none
Definition scores.qh:113
float WinningConditionHelper_winnerteam
the color of the winning team, or -1 if none
Definition scores.qh:109
entity WinningConditionHelper_winner
the winning player, or NULL if none
Definition scores.qh:112
float WinningConditionHelper_topscore
highest score
Definition scores.qh:107
float WinningConditionHelper_equality
we have no winner
Definition scores.qh:111
bool autocvar_g_full_getstatus_responses
Definition scores.qh:5
float WinningConditionHelper_lowerisbetter
lower is better, duh
Definition scores.qh:114
float WinningConditionHelper_zeroisworst
zero is worst, duh
Definition scores.qh:115
float WinningConditionHelper_secondteam
the color of the second team, or -1 if none
Definition scores.qh:110
#define strcpy(this, s)
Definition string.qh:52
#define INGAME_JOINED(it)
Definition sv_rules.qh:25
#define IS_REAL_CLIENT(v)
Definition utils.qh:17
float cvar_purechanges_count
Definition world.qh:47
string modname
Definition world.qh:49
string sv_termsofservice_url_escaped
Definition world.qh:59

References autocvar_g_full_getstatus_responses, autocvar_g_xonoticversion, CS(), cvar_purechanges_count, entity(), FOREACH_CLIENT, ftos(), GetGametype(), GetPlayerScoreString(), GetTeamScoreString(), INGAME_JOINED, IS_PLAYER, IS_REAL_CLIENT, modname, nJoinAllowed(), NULL, player_count, PlayerScore_Compare(), scores_flags_primary, serverflags, SFL_LOWER_IS_BETTER, SFL_ZERO_IS_WORST, strcat(), strcpy, sv_termsofservice_url_escaped, TeamScore_Compare(), teamscorekeepers, teamscores_entities_count, teamscores_flags_primary, WinningConditionHelper_equality, WinningConditionHelper_lowerisbetter, WinningConditionHelper_second, WinningConditionHelper_secondscore, WinningConditionHelper_secondteam, WinningConditionHelper_topscore, WinningConditionHelper_winner, WinningConditionHelper_winnerteam, WinningConditionHelper_zeroisworst, and worldstatus.

Referenced by spawnfunc(), WinningCondition_Assault(), WinningCondition_Invasion(), WinningCondition_LMS(), and WinningCondition_Scores().

Variable Documentation

◆ autocvar_g_full_getstatus_responses

bool autocvar_g_full_getstatus_responses

Definition at line 5 of file scores.qh.

Referenced by WinningConditionHelper().

◆ scores_initialized

entity scores_initialized

◆ WinningConditionHelper_equality

float WinningConditionHelper_equality

we have no winner

Definition at line 111 of file scores.qh.

Referenced by WinningCondition_Scores(), and WinningConditionHelper().

◆ WinningConditionHelper_lowerisbetter

float WinningConditionHelper_lowerisbetter

lower is better, duh

Definition at line 114 of file scores.qh.

Referenced by WinningCondition_Scores(), and WinningConditionHelper().

◆ WinningConditionHelper_second

entity WinningConditionHelper_second

the second player, or NULL if none

Definition at line 113 of file scores.qh.

Referenced by WinningConditionHelper().

◆ WinningConditionHelper_secondscore

float WinningConditionHelper_secondscore

second highest score

Definition at line 108 of file scores.qh.

Referenced by WinningCondition_LMS(), WinningCondition_Scores(), and WinningConditionHelper().

◆ WinningConditionHelper_secondteam

float WinningConditionHelper_secondteam

the color of the second team, or -1 if none

Definition at line 110 of file scores.qh.

Referenced by WinningConditionHelper().

◆ WinningConditionHelper_topscore

float WinningConditionHelper_topscore

highest score

Definition at line 107 of file scores.qh.

Referenced by WinningCondition_LMS(), WinningCondition_Scores(), and WinningConditionHelper().

◆ WinningConditionHelper_winner

entity WinningConditionHelper_winner

the winning player, or NULL if none

Definition at line 112 of file scores.qh.

Referenced by WinningCondition_LMS(), WinningCondition_Scores(), and WinningConditionHelper().

◆ WinningConditionHelper_winnerteam

float WinningConditionHelper_winnerteam

the color of the winning team, or -1 if none

Definition at line 109 of file scores.qh.

Referenced by MatchEnd_RestoreSpectatorAndTeamStatus(), WinningCondition_Scores(), and WinningConditionHelper().

◆ WinningConditionHelper_zeroisworst

float WinningConditionHelper_zeroisworst

zero is worst, duh

Definition at line 115 of file scores.qh.

Referenced by WinningCondition_Scores(), and WinningConditionHelper().