2 entity teamscorekeepers[16];
3 string scores_label[MAX_SCORE];
4 float scores_flags[MAX_SCORE];
5 string teamscores_label[MAX_TEAMSCORE];
6 float teamscores_flags[MAX_TEAMSCORE];
7 float teamscores_entities_count;
8 var .float scores_primary;
9 var .float teamscores_primary;
12 .float(entity to) SendEntity;
14 vector ScoreField_Compare(entity t1, entity t2, .float field, float fieldflags, vector previous) // returns: cmp value, best prio
16 if(fieldflags & SFL_SORT_PRIO_MASK < previous_y)
18 if(t1.field == t2.field)
21 previous_y = fieldflags & SFL_SORT_PRIO_MASK;
23 if(fieldflags & SFL_DECREASING)
24 previous_x = (t1.field - t2.field);
26 previous_x = (t2.field - t1.field);
35 void TeamScore_SendEntity(entity to)
39 WriteByte(MSG_ENTITY, ENT_CLIENT_TEAMSCORES);
40 WriteByte(MSG_ENTITY, self.team);
41 for(i = 0; i < MAX_TEAMSCORE; ++i)
42 WriteShort(MSG_ENTITY, self.teamscores[i]);
45 void TeamScore_Spawn(float t, string name)
49 ts.classname = "csqc_score_team";
50 ts.SendEntity = TeamScore_SendEntity;
51 ts.netname = name; // not used yet, FIXME
52 ts.Version = 1; // immediately send, so csqc knows about the team
53 teamscorekeepers[t] = ts;
54 ++teamscores_entities_count;
57 void TeamScore_Add(entity player, float scorefield, float score)
60 s = teamscorekeepers[player.team];
62 error("Adding score to unknown team!");
63 s.(teamscores[scorefield]) += score;
67 float TeamScore_Compare(entity t1, entity t2)
69 if(!t1 || !t2) return (!t2) - !t1;
73 for(i = 0; i < MAX_TEAMSCORE; ++i)
74 result = ScoreField_Compare(t1, t2, teamscores[i], teamscores_flags[i], result);
79 * the scoreinfo entity
82 void ScoreInfo_SetLabel_PlayerScore(float i, string label, float scoreflags)
84 scores_label[i] = label;
85 scores_flags[i] = scoreflags;
86 if(scoreflags & SFL_SORT_PRIO_MASK == SFL_SORT_PRIO_PRIMARY)
87 scores_primary = scores[i];
90 void ScoreInfo_SetLabel_TeamScore(float i, string label, float scoreflags)
92 teamscores_label[i] = label;
93 teamscores_flags[i] = scoreflags;
94 if(scoreflags & SFL_SORT_PRIO_MASK == SFL_SORT_PRIO_PRIMARY)
95 teamscores_primary = teamscores[i];
98 void ScoreInfo_SendEntity(entity to)
100 WriteByte(MSG_ENTITY, ENT_CLIENT_SCORES_INFO);
102 for(i = 0; i < MAX_SCORE; ++i)
104 WriteString(MSG_ENTITY, scores_label[i]);
105 WriteByte(MSG_ENTITY, scores_flags[i]);
107 for(i = 0; i < MAX_TEAMSCORE; ++i)
109 WriteString(MSG_ENTITY, teamscores_label[i]);
110 WriteByte(MSG_ENTITY, teamscores_flags[i]);
114 void ScoreInfo_Init(float teams)
117 TeamScore_Spawn(COLOR_TEAM1, "Red");
119 TeamScore_Spawn(COLOR_TEAM2, "Blue");
121 TeamScore_Spawn(COLOR_TEAM3, "Yellow");
123 TeamScore_Spawn(COLOR_TEAM4, "Pink");
126 si.classname = "csqc_score_info";
127 si.SendEntity = ScoreInfo_SendEntity;
132 * per-player score entities
135 void PlayerScore_SendEntity()
139 WriteByte(MSG_ENTITY, ENT_CLIENT_SCORES);
140 WriteByte(MSG_ENTITY, num_for_edict(self.owner));
141 for(i = 0; i < MAX_SCORE; ++i)
142 WriteShort(MSG_ENTITY, self.scores[i]);
145 void PlayerScore_Clear(entity player)
150 if(!teamscores_entities_count)
152 sk = player.scorekeeper;
153 for(i = 0; i < MAX_SCORE; ++i)
159 void PlayerScore_Attach(entity player)
162 if(player.scorekeeper)
163 error("player already has a scorekeeper");
166 sk.SendEntity = PlayerScore_SendEntity;
167 player.scorekeeper = sk;
170 void PlayerScore_Detach(entity player)
172 if(!player.scorekeeper)
173 error("player has no scorekeeper");
174 remove(player.scorekeeper);
175 player.scorekeeper = world;
178 void PlayerScore_Add(entity player, float scorefield, float score)
181 s = player.scorekeeper;
183 error("Adding score to unknown player!");
184 s.(scores[scorefield]) += score;
188 float PlayerScore_Compare(entity t1, entity t2)
190 if(!t1 || !t2) return (!t2) - !t1;
194 for(i = 0; i < MAX_TEAMSCORE; ++i)
195 result = ScoreField_Compare(t1, t2, scores[i], scores_flags[i], result);
199 void WinningConditionHelper()
202 if(teamscores_entities_count)
205 WinningConditionHelper_equality = 1;
206 WinningConditionHelper_winnerteam = 0;
207 for(t = 1; t < 16; ++t)
209 c = TeamScore_Compare(teamscorekeepers[WinningConditionHelper_winnerteam], teamscorekeepers[t]);
211 WinningConditionHelper_equality = 1;
214 WinningConditionHelper_equality = 0;
215 WinningConditionHelper_winnerteam = t;
219 WinningConditionHelper_topscore = teamscorekeepers[WinningConditionHelper_winnerteam].teamscores_primary;
221 WinningConditionHelper_winner = world;
222 if(WinningConditionHelper_equality)
223 WinningConditionHelper_winnerteam = -1;
228 WinningConditionHelper_equality = 1;
229 WinningConditionHelper_winner = world;
232 c = PlayerScore_Compare(WinningConditionHelper_winner.scorekeeper, p.scorekeeper);
234 WinningConditionHelper_equality = 1;
237 WinningConditionHelper_equality = 0;
238 WinningConditionHelper_winner = p;
242 WinningConditionHelper_topscore = WinningConditionHelper_winner.scorekeeper.scores_primary;
244 if(WinningConditionHelper_equality)
245 WinningConditionHelper_winner = world;
246 WinningConditionHelper_winnerteam = -1;