Skip to content

Tournaments

The tournament system provides fully automated competitive Pokemon tournaments with bracket management, team locking, NPC autofill, and rating integration. Tournaments progress through a strict lifecycle, handle registration and waitlists, and support both single and double elimination formats.

Tournaments progress through a strict state machine:

SCHEDULED -> REGISTRATION -> LOCKED -> ACTIVE -> PAUSED -> CONCLUDED
StateDescription
SCHEDULEDTournament is configured but registration has not yet opened.
REGISTRATIONPlayers may register and submit teams.
LOCKEDRegistration is closed; teams are frozen; bracket is being built.
ACTIVEMatches are being played.
PAUSEDTournament is temporarily suspended (admin action).
CONCLUDEDAll matches complete; results are final.

The tournament automatically transitions between states based on schedule times configured in the tournament config:

  • SCHEDULED -> REGISTRATION at registrationOpens.
  • REGISTRATION -> LOCKED at registrationCloses.
  • LOCKED -> ACTIVE at bracketStarts.
  1. Player submits a team for the tournament format.
  2. The team is validated against the tournament format rules (species, moves, items, clauses).
  3. If valid, the team is snapshot and stored in the database.
  4. If the tournament is full, the player is placed on a waitlist.
ResultDescription
SuccessPlayer successfully registered.
NotFoundTournament does not exist.
RegistrationClosedRegistration window has passed.
AlreadyRegisteredPlayer is already registered for this tournament.
InvalidTeamTeam does not pass format validation.
WaitlistedTournament is full; player added to waitlist.

When a registered player withdraws, the first player on the waitlist is automatically promoted to a registered slot.

Standard knockout bracket. Each loss eliminates the player. The bracket size is padded to the nearest power of two, with byes assigned to top seeds.

Players must lose twice to be eliminated. The bracket is divided into three sectors:

  • Winners Bracket — undefeated players.
  • Losers Bracket — players with one loss, competing for a second chance.
  • Grand Finals — winners bracket champion vs. losers bracket champion.

Each sector is viewable independently in the bracket UI.

Player teams are snapshot at the moment of registration and stored in the database. Once locked, players cannot modify their tournament team.

  • If rosterChangeBetweenGames is enabled, players may adjust their roster between individual games within a best-of series, but the overall team pool remains locked.
  • If revealFullBracket is enabled, other players can view registered teams.

NPC autofill fills empty bracket slots to reach a bracket-compatible player count (power of two for single elimination).

  • NPCs are assigned configurable AI skill levels (0-5).
  • NPCs use a specified NPC class for rendering.
  • Teams can come from a preset ID or be randomly generated.
  • Names are drawn from the configured namePool.
  • NPCs participate fully in the bracket, including best-of series.

See the NPC Autofill Config section for all available settings.

Each match in the bracket can be a best-of series rather than a single game.

  • bestOf.default sets the series length for all rounds (e.g., 3 for best-of-3).
  • bestOf.overrides allows per-round customization. Keys are round identifiers (e.g., "finals", "semifinals"), values are the best-of count.
bestOf {
default = 1
overrides {
semifinals = 3
finals = 5
}
}

Tournament results can optionally affect ladder ratings.

  • Set rating.affectsRating to true to enable.
  • rating.ladderReference specifies which ladder’s rating pool receives the rating changes (e.g., "gen9ou" to affect the Gen 9 OU ladder).

Rating changes are calculated using the same algorithm as ranked ladder matches.

Tournament events can trigger Discord webhook notifications. Supported events include registration opening, bracket generation, match results, and tournament conclusion.

CommandPermissionDescription
/tournament menufrontier.tournamentOpen the tournament hub GUI.
/tournament join <id>frontier.tournamentRegister for a tournament.
/tournament leave <id>frontier.tournamentUnregister from a tournament.
/tournament bracket <id>frontier.tournamentView the tournament bracket.
/tournament spectate <id>frontier.tournamentSpectate an ongoing tournament match.
/tournament spectate stopfrontier.tournamentStop spectating.
/tournament optout <id>frontier.tournamentOpt out of automatic spectating during finals.
CommandPermissionDescription
/tournament admin forcestart <id>frontier.tournament.adminForce-start a tournament (skip waiting for full bracket).
/tournament admin pause <id>frontier.tournament.adminPause a running tournament.
/tournament admin unpause <id>frontier.tournament.adminResume a paused tournament.
/tournament admin openregistration <id>frontier.tournament.adminOpen registration for a tournament.
/tournament admin restart <id> [round]frontier.tournament.adminRestart a tournament from a specific round.
/tournament admin resetstate <id>frontier.tournament.adminReset tournament state.
/tournament admin disqualify <player> <id>frontier.tournament.adminDisqualify a player from a tournament.
/tournament admin addnpc <id> <preset_or_class> [name] [skin]frontier.tournament.adminAdd an NPC participant to a tournament.
/tournament admin autofill <id> [count]frontier.tournament.adminAutofill empty slots with NPCs.
/tournament admin fakeregister <id> <count>frontier.tournament.adminAdd fake players for testing.
/tournament admin fakeclear <id>frontier.tournament.adminRemove fake players.