Skip to content

Matchmaking

Frontier’s matchmaking queue pairs players by rating and progressively widens the search the longer someone waits. Tight matches when players are available, no indefinite waits when they’re not.

Here’s what happens from the moment a player hits “queue” to when the battle starts:

  1. Queue join — The player’s current rating is snapshotted. Their team is validated against the ladder’s format clauses. Validation failure? Can’t join.
  2. Queue processing — Every tickInterval ticks (default 20 = once per second), the queue runs:
    • Timed-out entries are removed (past defaultQueueTimeoutSeconds).
    • Remaining players are sorted by wait time, longest first.
    • Each player is checked against every other queued player for a valid match.
  3. Rating expansion — The longer a player waits, the wider their acceptable rating range grows (see below).
  4. Match condition — Two players match when both of their expanded ranges overlap each other’s rating.
  5. Anti-boost check — If blockSameIp = true, players on the same IP can’t match.
  6. Arena allocation — An available arena is assigned. No free arenas? The match enters a waiting queue.
  7. Team preview — If the format has teamPreview = true, both players see each other’s teams and select leads/picks.
  8. Battle start — Players teleport to the arena and the Cobblemon battle begins.
queue {
tickInterval = 20
maxRatingExpansionPerSecond = 10.0
maxRatingExpansionCap = 500.0
defaultQueueTimeoutSeconds = 600
}
FieldTypeDefaultDescription
tickIntervalInt20Queue processing frequency in ticks. 20 = once per second.
maxRatingExpansionPerSecondDouble10.0Rating points the search range expands per second of waiting.
maxRatingExpansionCapDouble500.0Maximum total expansion. At cap, a 1500-rated player matches anyone from 1000—2000.
defaultQueueTimeoutSecondsInt600Seconds before automatic queue removal (10 minutes).

Each player’s search range starts at exactly their rating and grows outward every second:

expansion = waitSeconds * maxRatingExpansionPerSecond

Capped at maxRatingExpansionCap. With the defaults (maxRatingExpansionPerSecond = 10.0, cap at 500), a player rated 1500 looks like this:

Wait TimeExpansionMatchable Range
0 seconds±01500 only
10 seconds±1001400 — 1600
30 seconds±3001200 — 1800
50 seconds±500 (cap)1000 — 2000
match {
teamPreviewSeconds = 30
turnTimerInitial = 150
turnTimerRegenPerTurn = 10
turnTimerMax = 180
declineQueueCooldownSeconds = 30
maxMatchDurationTicks = 36000
}
FieldTypeDefaultDescription
teamPreviewSecondsInt30Duration of the team preview phase in seconds.
turnTimerInitialInt150Starting turn timer in seconds (2.5 minutes).
turnTimerRegenPerTurnInt10Seconds added back to the timer after each turn.
turnTimerMaxInt180Maximum the timer can reach with regen (3 minutes).
declineQueueCooldownSecondsInt30Cooldown applied when a player declines a found match.
maxMatchDurationTicksInt36000Maximum match length in ticks (36000 = 30 minutes). 0 = no limit.

Each player gets a chess-clock style timer that ticks down only while it’s their turn to choose a move.

  1. Starts at turnTimerInitial seconds (default 150 — two and a half minutes).
  2. Counts down while the player is choosing.
  3. After each turn, turnTimerRegenPerTurn seconds are added back, up to turnTimerMax.
  4. Warnings fire at 60, 30, and 10 seconds remaining.
  5. When the timer hits 0, a random move is selected automatically.

Players can skip the queue entirely with direct challenges:

CommandWhat it does
/ranked challenge <player> <ladder>Send a challenge to another player on a specific ladder.
/ranked acceptAccept an incoming challenge.
/ranked denyDecline an incoming challenge.
/ranked togglechallengesToggle whether you receive challenge requests.

Challenges follow the same format rules and use the same arena system as queue matches. Team validation still applies. The one difference: challenges don’t affect anti-boost tracking windows, so repeated friendly matches won’t tank your rating gains on the ladder.

CommandWhat it does
/ranked queue <ladder>Join a queue for a specific ladder.
/ranked queue leaveLeave the queue.
/ranked queueShow your current queue status.
/ranked queue infoShow queue sizes for all ladders.
/ranked queue info <ladder>Show queue size for a specific ladder.