Products Docs Help Store Discord

Random Battle

Showdown-style Random Battle with no team prep required.

What is Random Battle?

Random Battle (Randbats) is a Pokémon Showdown-style mode where you don’t bring your own team. The server generates a balanced, level-adjusted team for you every match. Just queue up and play.

  • No team prep. A fresh server-generated team every match.
  • 508 species, with moves, abilities, items, levels, and Tera types drawn from the official Showdown randbats data (gen9randombattle.json).
  • Playable in BOTH Casual and Ranked. Random Battle has its own separate rating and leaderboard, fully isolated from regular Singles/Doubles/Triples. Climbing the randbats ladder never touches your normal rank.
  • Singles, Doubles, and Triples are all available (RANDOM_SINGLES, RANDOM_DOUBLES, RANDOM_TRIPLES).

Adaptation is the whole game. You never know exactly what you’ll face, so reading the team sheet and planning on the fly is everything.

Randbats data loaded


How Teams Are Generated

Each player is given a 6-Pokémon team. For every species, a set is picked from the bundled randbats data: a fixed level, ability, item, four moves, and a Tera type.

  • Uneven levels. Stronger species come in at lower levels and weaker ones higher, so matches stay balanced even with very different base stat totals.
  • Random Poké Ball. Each Pokémon is held in a random ball variety (cosmetic only).
  • No duplicate species by default (Species Clause), and team composition is constrained for fairness — see below.

Stat Modes (statsMode)

How IVs/EVs/nature are assigned to each generated Pokémon. Configured in battle.yaml.

ModeIVsEVsNatureNotes
OFFICIAL (default)3185 in every statneutralShowdown Random Battle parity. Sets with no physical moves drop Attack EV/IV to 0; Trick Room / Gyro Ball sets drop Speed EV/IV to 0.
OPTIMIZED31HP 252 + attack stat 252 + others 4adamant / modestEvery Pokémon tuned to hit hard. Not official randbats behavior, but competitively tuned teams.
FLAT310neutralMinimal. Equivalent to the old optimizeStats: false.

OFFICIAL is the closest to a real Showdown Random Battle. Use OPTIMIZED if you want every Pokémon to feel tuned.

The legacy optimizeStats flag is still respected for backward compatibility: when statsMode is OPTIMIZED, optimizeStats: false is treated as FLAT. Setting statsMode explicitly always takes precedence.

Max PP (maxPP)

By default, every move on a generated Pokémon gets PP Max applied (Pokémon Showdown parity): max PP becomes base PP × 8/5 — e.g. Earthquake 10→16, Shadow Ball 15→24. Set maxPP: false in battle.yaml → randomBattle to keep Cobblemon’s default PP values.

Skip Lead Selection (skipLeadSelection)

Random Battle teams are server-generated, so some servers prefer to skip the lead-selection screen entirely. With skipLeadSelection: true, the shuffled team’s first member is sent out immediately and the battle starts faster. Default is false (show the lead-selection GUI as usual).


Team Composition Constraints (weighting)

By default, team composition is constrained for variety and fairness (matching Showdown). These live under battle.yaml -> randomBattle.weighting and can be tuned or disabled:

# battle.yaml
randomBattle:
  weighting:
    enabled: true
    multipliers: {}               # speciesId -> weight multiplier (boost/reduce appearance rate)
    exclusions: []                # speciesId list to exclude entirely
    speciesDuplication:
      enabled: true
      maxSameBaseSpecies: 1       # max team members sharing an evolution line
    typeDiversity:
      enabled: true
      maxPerType: 2               # max team members sharing each elemental type
    resistanceDiversity:
      enabled: true
      maxWeaknesses: 3            # max shared single weaknesses
      maxDoubleWeaknesses: 1      # max shared 4x weaknesses
  • Species duplication: caps how many team members can share an evolution root.
  • Type diversity: caps how many team members may share each elemental type (default max 2).
  • Resistance diversity: caps shared weaknesses across the team (default max 3 single, max 1 double).
  • Custom weighting: multipliers to boost/reduce specific species, exclusions to remove species from the pool.

If the constraints are too tight to fill a team, type and resistance rules relax automatically as a fallback.


Per-Season Pools

Random Battle can be enabled/disabled per format, per season in your season preset, and you can also whitelist or blacklist species per format:

# season_presets/default.yml
randomSingles:
  enabled: true                   # false = hide Random Singles this season
  sleepClause: true
  limitedSpecies: []              # whitelist: only these species appear (empty = all)
  excludedSpecies: []             # blacklist: these species never appear
  # Gimmicks available in random battles. No accessory (Tera Orb / Dynamax Band / etc.) is needed.
  megaEvolution: false
  zMoves: false
  dynamax: false
  terastallize: true              # Tera is on by default (Gen9 SV parity)

randomDoubles:
  enabled: true
  sleepClause: true
  limitedSpecies: []
  excludedSpecies: []
  megaEvolution: false
  zMoves: false
  dynamax: false
  terastallize: true

randomTriples:
  enabled: true
  sleepClause: true
  limitedSpecies: []
  excludedSpecies: []
  megaEvolution: false
  zMoves: false
  dynamax: false
  terastallize: true

This is in addition to the global weighting.exclusions in battle.yaml. Use limitedSpecies to run a themed season (e.g. Kanto-only randbats), or excludedSpecies to remove problem Pokémon.

Gimmick control (megaEvolution / zMoves / dynamax / terastallize)

Each random format lets you toggle the gimmicks players can use. These are independent of accessory items — players do not need a Tera Orb, Mega Stone, Z-Ring, or Dynamax Band equipped; the flags alone gate the mechanic.

  • terastallize: true (default) — Terastallizing is available.
  • megaEvolution, zMoves, dynamax — off by default. Enable to allow Mega Evolution, Z-Moves, or Dynamax respectively.

You can enable more than one, but a single gimmick per Pokémon is recommended to keep the gimmick button UI clean. Changes apply after a /rankedadmin reload.


Auto-Update

Optionally, the server can periodically fetch the latest randbats data from data.pkmn.cc and hot-reload it. Disabled by default.

# battle.yaml
randomBattle:
  autoUpdate:
    enabled: false
    intervalHours: 24
    sourceUrl: "https://data.pkmn.cc/randbats"
    battleServerOnly: true        # cross-server: only the battle server fetches (lobbies don't generate teams)
    backupDir: "randbats"         # previous data is backed up here before each update

On cross-server setups, only the battle server fetches — lobby servers don’t generate teams, so they skip the update.


Custom Sets (Local File or GitHub)

You can swap the randbats data with your own set file — either a local file placed on the server, or a file fetched from a URL. The active file is chosen by setsFile in battle.yaml, and changes take effect at runtime with /rankedadmin reload (no server restart needed).

Load order

When the server loads randbats data it checks these locations in order and uses the first match:

  1. Local custom fileconfig/cobbleranked/<localSetsDir>/<setsFile> (a file you place here)
  2. Auto-update backupconfig/cobbleranked/randbats/<setsFile> (the previous auto-update download)
  3. Bundled — the file shipped inside the mod jar (gen9randombattle.json by default)
  4. Fetch now — if none of the above exist and autoUpdate.enabled is true, the file is downloaded immediately from sourceUrl

Option A: Local file (easiest)

  1. Place your file at config/cobbleranked/random_battle/custom.json
  2. In battle.yaml, set setsFile: "custom.json"
  3. Run /rankedadmin reload
# battle.yaml
randomBattle:
  setsFile: "custom.json"
  localSetsDir: "random_battle"   # directory under config/cobbleranked/ for local set files

Option B: Switch between multiple files

Put several files in the local directory, then switch setsFile and /rankedadmin reload:

config/cobbleranked/random_battle/
  ├── gen9randombattle.json
  ├── gen8randombattle.json
  └── custom-theme.json
randomBattle:
  setsFile: "gen8randombattle.json"   # change this, then /rankedadmin reload

Option C: Fetch from a URL (GitHub)

Use auto-update to pull a file from a URL. sourceUrl is the base directory (not the file) — the mod appends / + setsFile to build the download URL.

randomBattle:
  setsFile: "gen9randombattle.json"
  autoUpdate:
    enabled: true
    sourceUrl: "https://raw.githubusercontent.com/<user>/<repo>/main/data"  # directory, not the file
    intervalHours: 24

sourceUrl must be the directory, not the full file URL. For GitHub, use raw.githubusercontent.com raw URLs.

Custom set file format

The file uses the Pokémon Showdown randbats compact format — each species maps to one or more weighted sets:

{
  "charizard": {
    "80,heavydutyboots,solarpower,fireblast,airslash,focusblast,roar,fire": 100,
    "80,lifeorb,solarpower,fireblast,airslash,focusblast,earthquake,dragon": 60
  }
}
  • key: level,item,ability,move1,move2,move3,move4,teraType (Showdown IDs)
  • value: weight (higher = more likely to be picked)

The server picks one set per Pokémon using weighted randomness.


Rating and Leaderboard

Random Battle formats are isolated from regular formats:

  • Each RANDOM_* format has its own rating, using the same rating system as normal (Pokémon Showdown or Glicko-2).
  • Each has its own leaderboard, separate from regular Singles/Doubles/Triples.
  • Matchmaking is skill-based, same as regular ranked — you’re matched by your Random Battle rating.
  • Your randbats rank has no effect on your normal rank, and vice versa.

Casual vs Ranked

Both queues are available:

  • Casual (/casual → Random button): rating doesn’t change. Good for learning the format.
  • Ranked (/ranked → Random button): rating changes, climbs the Random leaderboard, and counts toward season milestones/season-end rewards for that format.

Random Battle must be enabled in the active season preset for the ranked variant to show; the casual variant is available whenever randomBattle.enabled is true.


Enabling Random Battle

Two switches control availability:

  1. Global toggle in battle.yaml:
# battle.yaml
randomBattle:
  enabled: true
  teamSize: 6
  setsFile: "gen9randombattle.json"
  statsMode: "OFFICIAL"
  1. Per-format toggle in the active season preset (randomSingles / randomDoubles / randomTriples).

When both are on, the Casual and Ranked GUIs show the RANDOM_* format buttons.


GUI Customization

The Random Battle buttons in the Ranked and Casual menus are fully customizable — icon, slot, model data, and display name. See ranked_gui.yaml / casual_gui.yaml:

# gui/ranked_gui.yaml
format_buttons:
  random_singles:
    slot: 30
    material: "cobblemon:verdant_ball"
    custom_model_data: 0
    displayname: "ranked_gui_format_title"
  random_doubles:
    slot: 32
    material: "cobblemon:azure_ball"
    custom_model_data: 0
    displayname: "ranked_gui_format_title"
  random_triples:
    slot: 34
    material: "cobblemon:premier_ball"
    custom_model_data: 0
    displayname: "ranked_gui_format_title"

Related: Battle Formats | Battle Configuration | ELO System