Difference between revisions of "Matchmaking rules"

From Gladiabots Wiki
Jump to: navigation, search
(from discord)
(30 intermediate revisions by 4 users not shown)
Line 1: Line 1:
== Ranked ==
+
== Ghosts ==
  
The matchmaking system for ranked games in career works like this:
+
Every time you deploy a team, it 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.
  
# 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:
+
== Matchmaking ==
#* 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's 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 map pool (see below)
+
#*# Pick a random left/right side
+
#*# Create a new match using these parameters
+
  
== Unranked ==
+
Here's what happens when you start a new game:
  
The matchmaking system for unranked games in career works like this:
+
<span style="color: red">Rules in red only apply to ranked matches</span>
  
# 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
+
<span style="color: blue">Rules in blue only apply to unranked matches</span>
# Remove matches matching these conditions:
+
#* Opponent has already been played in the last 60 seconds
+
# At this point, there's 2 possible cases:
+
#* There are some matches remaining:
+
#** Sort the remaining matches using these comparison rules:
+
#**# Opponent with the closest XP level 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: 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 map pool (see below)
+
#*# Pick a random left/right side
+
#*# Create a new match using these parameters
+
  
== Map pool ==
+
# A new ghost is created with your ghost composition and AIs, your current league score (elo) and your XP level
 +
# The system lists the 200 most recent ghosts (only keeping the most recent ghost for each player) matching those conditions:
 +
#* <span style="color: red">League score between <your score -100> and <your score +100></span>
 +
#* <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.
 +
# Then it removes from this list the ghosts of players you already met during the last 30 minutes
 +
# At this point, there are 2 possible cases:
 +
#* Case 1 = the ghost list is empty:
 +
#*# <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>
 +
#*# <span style="color: blue">Your match is pending until someone else joins it</span>
 +
#* Case 2 = there are some ghosts remaining:
 +
#** Sort the list using these rules (ordered by priority):
 +
#**# Ghosts from pending matches first
 +
#**# <span style="color: red">Ghosts from the closest league first</span>
 +
#**# <span style="color: blue">Ghosts with closest score first</span>
 +
#**# Ghosts of players using a different IP first (anti-cheat measure)
 +
#**# Ghosts of players met the furthest in the past first (never met = the furthest possible)
 +
#**# <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
  
The map pool differs for each league and for unranked games:
+
== Example ==
  
{|class="wikitable sortable"
+
Here's an example of the ghost system in action:
!Map!!Bronze!!Silver!!Gold!!Platinum!!Diamond!!Master!!Grandmaster!!Unranked
+
(asuming the ghost list is initialy empty, all players are in the same league with a similar league score and a different IPs)
|-
+
 
|The seven wonders      ||align="center" style="background:#AFF79B"|X||align="center" style="background:#AFF79B"|X||align="center" style="background:#AFF79B"|X
+
; T = 0h00mn > P1 deploys G1:
|                          align="center" style="background:#AFF79B"|X||align="center" style="background:#AFF79B"|X||align="center" style="background:#AFF79B"|X
+
: no ghost available, match is pending
|                          align="center" style="background:#AFF79B"|X||align="center" style="background:#AFF79B"|X
+
: ghost list: G1
|-
+
; T = 0h01mn > P2 deploys G2:
|Set your priorities    ||                                          ||align="center" style="background:#AFF79B"|X||align="center" style="background:#AFF79B"|X
+
: matched against G1 (P1 will see the "new" flag on the match)
|                          align="center" style="background:#AFF79B"|X||align="center" style="background:#AFF79B"|X||align="center" style="background:#AFF79B"|X
+
: ghost list: G1, G2
|                          align="center" style="background:#AFF79B"|X||align="center" style="background:#AFF79B"|X
+
; T = 0h02mn > P3 deploys G3:
|-
+
: matched against G2 (most recent ghost)
|Meeting point          ||                                          ||                                          ||align="center" style="background:#AFF79B"|X
+
: ghost list: G1, G2, G3
|                          align="center" style="background:#AFF79B"|X||align="center" style="background:#AFF79B"|X||align="center" style="background:#AFF79B"|X
+
; T = 0h03mn > P3 deploys G3b:
|                          align="center" style="background:#AFF79B"|X||align="center" style="background:#AFF79B"|X
+
: matched against G1 (most recent ghost not already met in the last 30mn)
|-
+
: ghost list: G1, G2, G3, G3b
|Circle of Death        ||                                          ||                                          ||
+
; T = 0h04mn > P3 deploys G3c:
|                          align="center" style="background:#AFF79B"|X||align="center" style="background:#AFF79B"|X||align="center" style="background:#AFF79B"|X
+
: no ghost available (fought all the available ghosts in the last 30mn), match pending
|                          align="center" style="background:#AFF79B"|X||align="center" style="background:#AFF79B"|X
+
: ghost list: G1, G2, G3, G3b, G3c
|-
+
; T = 0h05mn > P1 deploys G1b:
|Split team              ||                                          ||                                          ||
+
: matched against G3c (most recent ghost)
|                                                                    ||align="center" style="background:#AFF79B"|X||align="center" style="background:#AFF79B"|X
+
: ghost list: G1, G2, G3, G3b, G3c, G1b
|                          align="center" style="background:#AFF79B"|X||align="center" style="background:#AFF79B"|X
+
; T = 0h06mn > P1 deploys G1c:
|-
+
: matched against G2 (most recent ghost not already met in the last 30mn)
|Kingmaker (Erik)       ||                                          ||                                          ||
+
: ghost list: G1, G2, G3, G3b, G3c, G1b, G1c
|                                                                    ||                                          ||align="center" style="background:#AFF79B"|X
+
...
|                          align="center" style="background:#AFF79B"|X||align="center" style="background:#AFF79B"|X
+
; T = 0h40mn > P1 deploys G1d:
|-
+
: matched against G3c (most recent ghost, met more than 30mn ago)
|Lake Rushtown (Mcompany)||                                          ||                                          ||
+
: ghost list: G1, G2, G3, G3b, G3c, G1b, G1c, G1d
|                                                                    ||                                          ||align="center" style="background:#AFF79B"|X
+
|                          align="center" style="background:#AFF79B"|X||align="center" style="background:#AFF79B"|X
+
|-
+
|Barred Spiral (radyjko8)||                                          ||                                          ||
+
|                                                                    ||                                          ||
+
|                          align="center" style="background:#AFF79B"|X||align="center" style="background:#AFF79B"|X
+
|-
+
|Mind Game (Sneaky/RC)  ||                                          ||                                          ||
+
|                                                                    ||                                          ||
+
|                                                                    ||align="center" style="background:#AFF79B"|X
+
|-
+
|Flanking (LuBeNo)      ||                                          ||                                          ||
+
|                                                                    ||                                          ||
+
|                                                                    ||align="center" style="background:#AFF79B"|X
+
|-
+
|Dominance (Revenge)     ||                                          ||                                          ||
+
|                                                                    ||                                          ||
+
|                                                                    ||align="center" style="background:#AFF79B"|X
+
|}
+

Revision as of 12:03, 31 January 2019

Ghosts

Every time you deploy a team, it 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