| 2240 | } |
| 2241 | |
| 2242 | bool 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; |
no test coverage detected