MCPcopy Create free account
hub / github.com/assaultcube/AC / refillteams

Function refillteams

source/src/server.cpp:2242–2316  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

2240}
2241
2242bool refillteams(bool now, int ftr) // force only minimal amounts of players
2243{
2244 if(sg->mastermode == MM_MATCH) return false;
2245 static int lasttime_eventeams = 0;
2246 int teamsize[2] = {0, 0}, teamscore[2] = {0, 0}, moveable[2] = {0, 0};
2247 bool switched = false;
2248
2249 calcscores();
2250 loopv(clients) if(clients[i]->type!=ST_EMPTY) // playerlist stocktaking
2251 {
2252 client *c = clients[i];
2253 c->at3_dontmove = true;
2254 if(c->isauthed)
2255 {
2256 if(team_isactive(c->team)) // only active players count
2257 {
2258 teamsize[c->team]++;
2259 teamscore[c->team] += c->at3_score;
2260 if(clienthasflag(i) < 0)
2261 {
2262 c->at3_dontmove = false;
2263 moveable[c->team]++;
2264 }
2265 }
2266 }
2267 }
2268 int bigteam = teamsize[1] > teamsize[0];
2269 int allplayers = teamsize[0] + teamsize[1];
2270 int diffnum = teamsize[bigteam] - teamsize[!bigteam];
2271 int diffscore = teamscore[bigteam] - teamscore[!bigteam];
2272 if(lasttime_eventeams > sg->gamemillis) lasttime_eventeams = 0;
2273 if(diffnum > 1)
2274 {
2275 if(now || sg->gamemillis - lasttime_eventeams > 8000 + allplayers * 1000 || diffnum > 2 + allplayers / 10)
2276 {
2277 // time to even out teams
2278 loopv(clients) if(clients[i]->type!=ST_EMPTY && clients[i]->team != bigteam) clients[i]->at3_dontmove = true; // dont move small team players
2279 while(diffnum > 1 && moveable[bigteam] > 0)
2280 {
2281 // pick best fitting cn
2282 int pick = -1;
2283 int bestfit = 1000000000;
2284 int targetscore = diffscore / (diffnum & ~1);
2285 loopv(clients) if(clients[i]->type!=ST_EMPTY && !clients[i]->at3_dontmove) // try all still movable players
2286 {
2287 int fit = targetscore;
2288 if(fit < 0 ) fit = -(fit * 15) / 10; // avoid too good players
2289 int forcedelay = clients[i]->at3_lastforce ? (1000 - (sg->gamemillis - clients[i]->at3_lastforce) / (5 * 60)) : 0;
2290 if(forcedelay > 0) fit += (fit * forcedelay) / 600; // avoid lately forced players
2291 if(fit < bestfit + fit * rnd(100) / 400) // search 'almost' best fit
2292 {
2293 bestfit = fit;
2294 pick = i;
2295 }
2296 }
2297 if(pick < 0) break; // should really never happen
2298 // move picked player
2299 clients[pick]->at3_dontmove = true;

Callers 4

performMethod · 0.85
arenacheckFunction · 0.85
startgameFunction · 0.85
serversliceFunction · 0.85

Calls 4

calcscoresFunction · 0.85
clienthasflagFunction · 0.85
updateclientteamFunction · 0.85
loopvFunction · 0.70

Tested by

no test coverage detected