Difference between revisions of "Matchmaking rules"

From Gladiabots Wiki
Jump to: navigation, search
(Ghosts)
 
(17 intermediate revisions by 4 users not shown)
Line 1: Line 1:
== Matchmaking Basics ==
+
== Ghosts ==
*Maps are selected randomly from a map pool; selection depends on league.
+
*Opponent's league has to be between your league - 1 and your league + 1 {<code>abs(your league score - opponents league score)</code>}
+
*At the end of 5 minutes, the player with more bots remaining is declared the winner.
+
*If all of a players bots are destroyed prior to the time limit, the match will immediately end, and the person with the remaining bots will be declared the winner.
+
  
== Ranked ==
+
Every time you play a multiplayer match, the team you deployed becomes a "ghost" that will be used by the matchmaking system.
 +
When a match result is known, the league score delta is applied to both the participating ghosts and the player(s) that manually created/joined the match.
 +
This way, ghosts score evolves depending on the opponents they meet.
 +
The more a ghost "plays", the more accurate its score is.
  
The matchmaking system for ranked games in career works like this:
+
== Matchmaking ==
  
# Determine the eligible map pool:
+
Here's what happens when you start a new game:
#* Take the {{#tip-text: player's league | The different ranked leagues use their own maps pools.}} [[Maps|map pool]]
+
#* Compute <code>X</code> as the {{#tip-text: half | rounded down to the nearest integer}} of the map pool size
+
#* Get the <code>X</code> last played maps
+
#* Remove those maps from the map pool
+
# Get the 100 {{#tip-text: oldest | The first entries when ordered by ascending creation time}} {{#tip-text: available | Not already joined by 2 players}} ranked matches matching these conditions:
+
#* Map is in the eligible map pool
+
#* Opponent's league has to be between <code>your league - 1</code> and <code>your league + 1</code>
+
#* If opponent's league is different than yours: {{#tip-text: league score delta | League score difference between the you and your opponent: <code>abs(your league score - opponents league score)</code>}} has to be lower than 100 points
+
# Remove matches matching these conditions:
+
#* Opponent has already been played in the last 5 minutes
+
# At this point, there are 2 possible cases:
+
#* There are some matches remaining:
+
#** Sort the remaining matches using these comparison rules:
+
#**# Opponent with the closest league first
+
#**# In case of equality: opponent using a different IP first
+
#**# In case of equality: opponent never met or met the furthest in the past first (considered equal under a 10 minutes delta)
+
#**# In case of equality: opponent with the closest league score first (considered equal under a 10 points delta)
+
#**# In case of equality: oldest match first
+
#** Take the first match of the sorted list and join it
+
#* There's no match remaining:
+
#*# Pick a random map from the eligible map pool
+
#*# Pick a random left/right side
+
#*# Create a new match using these parameters
+
  
== Unranked ==
+
<span style="color: red">Rules in red only apply to ranked matches</span>
  
The matchmaking system for unranked games in career works like this:
+
<span style="color: blue">Rules in blue only apply to unranked matches</span>
  
# Determine the eligible map pool:
+
# A new ghost is created with your ghost composition and AIs, your current league score (elo) and your XP level
#* Take the {{#tip-text: unranked | Unranked uses its own map pool.}} [[Maps|map pool]]
+
# The system lists the 200 most recent ghosts (only keeping the most recent ghost for each player) matching those conditions:
#* Compute <code>X</code> as the {{#tip-text: half | rounded down to the nearest integer}} of the map pool size
+
#* <span style="color: red">League score between <your score -100> and <your score +100></span>
#* Get the <code>X</code> last played maps
+
#* <span style="color: red">The score of the ghost is not lower than his original score minus 50 points</span>. Say a ghost was deployed at 1800. If the ghost goes down to under 1750 it gets disabled.
#* Remove those maps from the eligible map pool
+
# Then it removes from this list the ghosts of players you already met during the last 30 minutes
# Get the 100 {{#tip-text: oldest | The first entries when ordered by ascending creation time}} {{#tip-text: available | Not already joined by 2 players}} unranked matches matching these conditions:
+
#* Map is in the eligible map pool
+
# Remove matches matching these conditions:
+
#* Opponent has already been played in the last 60 seconds
+
 
# At this point, there are 2 possible cases:
 
# At this point, there are 2 possible cases:
#* There are some matches remaining:
+
#* Case 1 = the ghost list is empty:
#** Sort the remaining matches using these comparison rules:
+
#*# <span style="color: red">Retry with -200/+200, -300/+300 and -400/+400 score ranges until it finds at least one valid ghost, else match is pending until someone else joins it</span>
#**# Opponent with the closest XP level first
+
#*# <span style="color: blue">Your match is pending until someone else joins it</span>
#**# In case of equality: opponent using a different IP first
+
#* Case 2 = there are some ghosts remaining:
#**# In case of equality: opponent never met or met the furthest in the past first (considered equal under a 10 minutes delta)
+
#** Sort the list using these rules (ordered by priority):
#**# In case of equality: oldest match first
+
#**# Ghosts from pending matches first
#** Take the first match of the sorted list and join it
+
#**# <span style="color: red">Ghosts from the closest league first</span>
#* There's no match remaining:
+
#**# <span style="color: blue">Ghosts with closest score first</span>
#*# Pick a random map from the eligible map pool
+
#**# Ghosts of players using a different IP first (anti-cheat measure)
#*# Pick a random left/right side
+
#**# Ghosts of players met the furthest in the past first (never met = the furthest possible)
#*# Create a new match using these parameters
+
#**# <span style="color: red">Ghosts with the closest league score first</span>. <br />This list has 50% chances to keep "closest scores that are lower than the deploying player first", say the deploying player has a score of 1500, then only ghosts equal or under 1500 are picked, this even if a opponent has better ghosts in range. The remaining 50% chances are used to keep "closest scores that are higher than the deploying player first".
 +
#**# Most recent ghosts first
 +
#** Keep the 10 first of the sorted list (10 "best" ghosts)
 +
#** Then pick one of them randomly and join it
 +
 
 +
== Example ==
 +
 
 +
Here's an example of the ghost system in action:
 +
(asuming the ghost list is initialy empty, all players are in the same league with a similar league score and a different IPs)
 +
 
 +
; T = 0h00mn > P1 deploys G1:
 +
: no ghost available, match is pending
 +
: ghost list: G1
 +
; T = 0h01mn > P2 deploys G2:
 +
: matched against G1 (P1 will see the "new" flag on the match)
 +
: ghost list: G1, G2
 +
; T = 0h02mn > P3 deploys G3:
 +
: matched against G2 (most recent ghost)
 +
: ghost list: G1, G2, G3
 +
; T = 0h03mn > P3 deploys G3b:
 +
: matched against G1 (most recent ghost not already met in the last 30mn)
 +
: ghost list: G1, G2, G3, G3b
 +
; T = 0h04mn > P3 deploys G3c:
 +
: no ghost available (fought all the available ghosts in the last 30mn), match pending
 +
: ghost list: G1, G2, G3, G3b, G3c
 +
; T = 0h05mn > P1 deploys G1b:
 +
: matched against G3c (most recent ghost)
 +
: ghost list: G1, G2, G3, G3b, G3c, G1b
 +
; T = 0h06mn > P1 deploys G1c:
 +
: matched against G2 (most recent ghost not already met in the last 30mn)
 +
: ghost list: G1, G2, G3, G3b, G3c, G1b, G1c
 +
...
 +
; T = 0h40mn > P1 deploys G1d:
 +
: matched against G3c (most recent ghost, met more than 30mn ago)
 +
: ghost list: G1, G2, G3, G3b, G3c, G1b, G1c, G1d

Latest revision as of 10:19, 16 November 2019

Ghosts

Every time you play a multiplayer match, the team you deployed becomes a "ghost" that will be used by the matchmaking system. When a match result is known, the league score delta is applied to both the participating ghosts and the player(s) that manually created/joined the match. This way, ghosts score evolves depending on the opponents they meet. The more a ghost "plays", the more accurate its score is.

Matchmaking

Here's what happens when you start a new game:

Rules in red only apply to ranked matches

Rules in blue only apply to unranked matches

  1. A new ghost is created with your ghost composition and AIs, your current league score (elo) and your XP level
  2. The system lists the 200 most recent ghosts (only keeping the most recent ghost for each player) matching those conditions:
    • League score between <your score -100> and <your score +100>
    • The score of the ghost is not lower than his original score minus 50 points. Say a ghost was deployed at 1800. If the ghost goes down to under 1750 it gets disabled.
  3. Then it removes from this list the ghosts of players you already met during the last 30 minutes
  4. At this point, there are 2 possible cases:
    • Case 1 = the ghost list is empty:
      1. Retry with -200/+200, -300/+300 and -400/+400 score ranges until it finds at least one valid ghost, else match is pending until someone else joins it
      2. Your match is pending until someone else joins it
    • Case 2 = there are some ghosts remaining:
      • Sort the list using these rules (ordered by priority):
        1. Ghosts from pending matches first
        2. Ghosts from the closest league first
        3. Ghosts with closest score first
        4. Ghosts of players using a different IP first (anti-cheat measure)
        5. Ghosts of players met the furthest in the past first (never met = the furthest possible)
        6. Ghosts with the closest league score first.
          This list has 50% chances to keep "closest scores that are lower than the deploying player first", say the deploying player has a score of 1500, then only ghosts equal or under 1500 are picked, this even if a opponent has better ghosts in range. The remaining 50% chances are used to keep "closest scores that are higher than the deploying player first".
        7. Most recent ghosts first
      • Keep the 10 first of the sorted list (10 "best" ghosts)
      • Then pick one of them randomly and join it

Example

Here's an example of the ghost system in action: (asuming the ghost list is initialy empty, all players are in the same league with a similar league score and a different IPs)

T = 0h00mn > P1 deploys G1
no ghost available, match is pending
ghost list: G1
T = 0h01mn > P2 deploys G2
matched against G1 (P1 will see the "new" flag on the match)
ghost list: G1, G2
T = 0h02mn > P3 deploys G3
matched against G2 (most recent ghost)
ghost list: G1, G2, G3
T = 0h03mn > P3 deploys G3b
matched against G1 (most recent ghost not already met in the last 30mn)
ghost list: G1, G2, G3, G3b
T = 0h04mn > P3 deploys G3c
no ghost available (fought all the available ghosts in the last 30mn), match pending
ghost list: G1, G2, G3, G3b, G3c
T = 0h05mn > P1 deploys G1b
matched against G3c (most recent ghost)
ghost list: G1, G2, G3, G3b, G3c, G1b
T = 0h06mn > P1 deploys G1c
matched against G2 (most recent ghost not already met in the last 30mn)
ghost list: G1, G2, G3, G3b, G3c, G1b, G1c

...

T = 0h40mn > P1 deploys G1d
matched against G3c (most recent ghost, met more than 30mn ago)
ghost list: G1, G2, G3, G3b, G3c, G1b, G1c, G1d