balancemode split_one_chevs (Version 2 In Progress) - jauggy/teiserver GitHub Wiki

I created this balance mode because I was frustrated with games where new players (one chevs) would be distributed unevenly, creating lopsided games.

How to run

You need to be boss to enable it. Type these commands in lobby:

!boss <yourname>
$balancemode split_one_chevs

From here on, whenever you press the balance button it will use my algo to balance players. You can also see what is the current algo in a lobby by the lobby command: $status. You can see logs after a balance by the lobby command: $explain.

Even if you unboss my balancer will remain. It will only reset to default when everyone leaves the lobby.

How do I know if it worked?

Visually the lobby won't appear any different. However, after you press balance, use lobby command: $explain to see the logs. Check to see that the one chevs were drafted last.

Details of the algo

In order to understand this algo, it's important to understand the default algo written by Teifion. Teifion's algo works like a draft. The team with the lowest total OS gets to pick from the list of unpicked players. It will simply consider the person with the highest OS to be the best player and choose that one.

My algo is also a draft. When it's your team's turn to pick, your team will try and pick a player based on these two criteria:

  1. Avoid one chevs if possible
  2. Higher Adjusted Rating is better. A player's Adjusted Rating starts at 0 then converges towards OS (their true match rating) over time. Once a player hits three chevrons, their Adjusted Rating just equals OS.

Which team that gets to pick is also determined slightly differently than Teifion's algo: The team that gets to pick is the one with the least amount of players and only if tied do we use lowest team OS to be the tie breaker. This ensures that one chevs are distributed evenly amongst teams.

Does it support parties?

No. In order to ensure even distribution of one chevs I could not support parties. However, in the future I plan to improve the code by making it call a balancer that does support parties when there are less than two 1Chevs in the lobby.

Details of Adjusted Rating

target_chevron_hours = 15 #The amount of chevron hours to hit 3 chevs
chevron_hours = 0.5 * spec_hours + playtime_hours
adjusted_rating = min(1, chevron_hours/target_chevron_hours ) * match_rating

Inspiration from Match Poker

The Adjusted Rating was inspired by MatchPoker (archived) which also uses OpenSkill. From their website:


Then further down there is this relevant information:


However, due to number of matches being difficult to code for, my Adjusted Rating uses chevron hours to act as a proxy for number of matches.

Why use chevron hours instead of number of matches?

I used chevron hours instead of number of matches for the following reasons:

  1. It requires a lot more code changes because we currently don't store number of matches in any tables. We would need to add a new column to one of our existing tables and have a function to update this column as matches are played.
  2. There is no visual indicator of number of matches. Typically with games that give a provisional rating, there is a visual indicator that someone is on their provisional rating. We do have a visual indicator of chevron hours and we have well identified changes to this visual indicator as players meet certain thresholds.

Long term we could move towards using number of matches so long as we can visually indicate to the user when they have transitioned from using a provisional rating to their true match rating.

Why not use uncertainty as a proxy for number of matches?

Using uncertainty as a proxy for number of matches also has similar challenges.

  1. There's no easy way to map uncertainty to number of matches. The amount uncertainty changes each match depends on tau (which can be changed) and other factors like team size and the uncertainty of other players.
  2. Your uncertainty doesn't change for all game modes even though there's lots of relevance between modes. Starting you at 0 for Team FFA doesn't make sense if you're an expert in Team games or FFA games.
  3. There's no visual indicator when a player reaches relevant uncertainty thresholds.

Sample Output


⚠️ ** Fallback** ⚠️