add real ranks for LMS (with st, nd, rd, th)
[divverent/nexuiz.git] / data / qcsrc / server / scores_rules.qc
1 float c1, c2, c3, c4;
2 void CheckAllowedTeams (entity for_whom);
3
4 // NOTE: SP_ constants may not be >= MAX_SCORE; ST_constants may not be >= MAX_TEAMSCORE
5 // scores that should be in all modes:
6 void ScoreRules_basics(float teams, float sprio)
7 {
8         ScoreInfo_Init(teams);
9         if(sprio)
10                 ScoreInfo_SetLabel_TeamScore  (ST_SCORE,        "score",     sprio);
11         ScoreInfo_SetLabel_PlayerScore(SP_KILLS,        "kills",     0);
12         ScoreInfo_SetLabel_PlayerScore(SP_DEATHS,       "deaths",    SFL_LOWER_IS_BETTER);
13         ScoreInfo_SetLabel_PlayerScore(SP_SUICIDES,     "suicides",  SFL_LOWER_IS_BETTER);
14         if(sprio)
15                 ScoreInfo_SetLabel_PlayerScore(SP_SCORE,        "score",     sprio);
16 }
17 void ScoreRules_generic()
18 {
19         CheckAllowedTeams(world);
20         if(teamplay)
21         {
22                 CheckAllowedTeams(world);
23                 ScoreRules_basics(((c4>=0) ? 4 : (c3>=0) ? 3 : 2), SFL_SORT_PRIO_PRIMARY);
24         }
25         else
26                 ScoreRules_basics(0, SFL_SORT_PRIO_PRIMARY);
27 }
28
29 // g_ctf
30 #define ST_CTF_CAPS 1
31 #define SP_CTF_CAPS 4
32 #define SP_CTF_PICKUPS 5
33 #define SP_CTF_FCKILLS 6
34 #define SP_CTF_RETURNS 7
35 void ScoreRules_ctf()
36 {
37         float sp_score, sp_caps;
38         sp_score = sp_caps = 0;
39         switch(cvar("g_ctf_win_mode"))
40         {
41                 case 0: // caps only
42                         sp_caps = SFL_SORT_PRIO_PRIMARY;
43                         break;
44                 case 1: // caps, then score
45                         sp_caps = SFL_SORT_PRIO_PRIMARY;
46                         sp_score = SFL_SORT_PRIO_SECONDARY;
47                         break;
48                 case 2: // score only
49                 default:
50                         sp_score = SFL_SORT_PRIO_PRIMARY;
51                         sp_caps = SFL_SORT_PRIO_SECONDARY; // looks better ;)
52                         break;
53         }
54
55         CheckAllowedTeams(world);
56         ScoreRules_basics(2 + (c3>=0), sp_score); // NOTE this assumes that the rogue team is team 3
57         ScoreInfo_SetLabel_TeamScore  (ST_CTF_CAPS,     "caps",      sp_caps);
58         ScoreInfo_SetLabel_PlayerScore(SP_CTF_CAPS,     "caps",      sp_caps);
59         ScoreInfo_SetLabel_PlayerScore(SP_CTF_PICKUPS,  "pickups",   0);
60         ScoreInfo_SetLabel_PlayerScore(SP_CTF_FCKILLS,  "fckills",   0);
61         ScoreInfo_SetLabel_PlayerScore(SP_CTF_RETURNS,  "returns",   0);
62 }
63
64 // g_domination
65 #define ST_DOM_TICKS 1
66 #define SP_DOM_TICKS 4
67 #define SP_DOM_TAKES 5
68 void ScoreRules_dom()
69 {
70         float sp_domticks, sp_score;
71         sp_score = sp_domticks = 0;
72         if(cvar("g_domination_disable_frags"))
73                 sp_domticks = SFL_SORT_PRIO_PRIMARY;
74         else
75                 sp_score = SFL_SORT_PRIO_PRIMARY;
76         CheckAllowedTeams(world);
77         ScoreRules_basics(((c4>=0) ? 4 : (c3>=0) ? 3 : 2), sp_score);
78         ScoreInfo_SetLabel_TeamScore  (ST_DOM_TICKS,    "ticks",     sp_domticks);
79         ScoreInfo_SetLabel_PlayerScore(SP_DOM_TICKS,    "ticks",     sp_domticks);
80         ScoreInfo_SetLabel_PlayerScore(SP_DOM_TAKES,    "takes",     0);
81 }
82
83 // LMS stuff
84 #define SP_LMS_LIVES 4
85 #define SP_LMS_RANK 5
86 void ScoreRules_lms()
87 {
88         ScoreRules_basics(0, 0);
89         ScoreInfo_SetLabel_PlayerScore(SP_LMS_LIVES,    "lives",     SFL_SORT_PRIO_SECONDARY);
90         ScoreInfo_SetLabel_PlayerScore(SP_LMS_RANK,     "rank",      SFL_LOWER_IS_BETTER | SFL_RANK | SFL_SORT_PRIO_PRIMARY | SFL_ALLOW_HIDE);
91 }
92
93 // Key hunt stuff
94 #define ST_KH_CAPS 1
95 #define SP_KH_CAPS 4
96 #define SP_KH_PUSHES 5
97 #define SP_KH_DESTROYS 6
98 #define SP_KH_PICKUPS 7
99 #define SP_KH_KCKILLS 8
100 #define SP_KH_LOSSES 9
101 void ScoreRules_kh(float teams)
102 {
103         ScoreRules_basics(teams, SFL_SORT_PRIO_PRIMARY);
104         ScoreInfo_SetLabel_TeamScore  (ST_KH_CAPS,      "caps",      SFL_SORT_PRIO_SECONDARY);
105         ScoreInfo_SetLabel_PlayerScore(SP_KH_CAPS,      "caps",      SFL_SORT_PRIO_SECONDARY);
106         ScoreInfo_SetLabel_PlayerScore(SP_KH_PUSHES,    "pushes",    0);
107         ScoreInfo_SetLabel_PlayerScore(SP_KH_DESTROYS,  "destroyed", SFL_LOWER_IS_BETTER);
108         ScoreInfo_SetLabel_PlayerScore(SP_KH_PICKUPS,   "pickups",   0);
109         ScoreInfo_SetLabel_PlayerScore(SP_KH_KCKILLS,   "kckills",   0);
110         ScoreInfo_SetLabel_PlayerScore(SP_KH_LOSSES,    "losses",    SFL_LOWER_IS_BETTER);
111 }