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.
![]()
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.
| Mode | IVs | EVs | Nature | Notes |
|---|---|---|---|---|
OFFICIAL (default) | 31 | 85 in every stat | neutral | Showdown 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. |
OPTIMIZED | 31 | HP 252 + attack stat 252 + others 4 | adamant / modest | Every Pokémon tuned to hit hard. Not official randbats behavior, but competitively tuned teams. |
FLAT | 31 | 0 | neutral | Minimal. Equivalent to the old optimizeStats: false. |
OFFICIALis the closest to a real Showdown Random Battle. UseOPTIMIZEDif 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:
multipliersto boost/reduce specific species,exclusionsto 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).
Add Fakemon without writing JSON
If a Fakemon or another custom species is missing from the sets file, autoSets can build a playable set from that species’ registered Cobblemon data: its moves, abilities, and types.
To generate sets for selected species:
# battle.yaml
randomBattle:
autoSets:
enabled: true
species:
- "flarechu"
- "mrmime"
includeAllMissing: false
To include every registered species that is missing from the sets file:
randomBattle:
autoSets:
enabled: true
species: []
includeAllMissing: true
Species that already have a hand-written entry are never replaced. This lets you tune important species in JSON and automatically fill in the rest.
| Setting | Default | Description |
|---|---|---|
enabled | false | Turn automatic set generation on |
species | [] | Generate sets only for these missing species |
includeAllMissing | false | Generate sets for every registered species missing from the file |
excludedSpecies | [] | Never generate these species |
level | 100 | Level used by generated sets |
includeHiddenAbilities | false | Allow hidden abilities in the generated ability pool |
movePool | LEVEL_UP | Moves to consider: LEVEL_UP, TM, or ALL |
maxMovePool | 10 | Maximum candidate moves kept for each species |
items | [] | Possible Showdown item IDs; an empty list gives no item |
You can also run a format using generated sets only. Give that random format a file name that does not exist, then limit the format to the custom species you want:
# season_presets/default.yml
randomSingles:
enabled: true
setsFile: "generated-only.json"
limitedSpecies:
- "flarechu"
📝
autoSetsis shared by all Random Battle pools. Use each format’slimitedSpeciesorexcludedSpecieslist when different formats need different pools.
Load order
When the server loads randbats data it checks these locations in order and uses the first match:
- Local custom file —
config/cobbleranked/<localSetsDir>/<setsFile>(a file you place here) - Auto-update backup —
config/cobbleranked/randbats/<setsFile>(the previous auto-update download) - Bundled — the file shipped inside the mod jar (
gen9randombattle.jsonby default) - Fetch now — if none of the above exist and
autoUpdate.enabledis true, the file is downloaded immediately fromsourceUrl
Option A: Local file (easiest)
- Place your file at
config/cobbleranked/random_battle/custom.json - In
battle.yaml, setsetsFile: "custom.json" - 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
sourceUrlmust be the directory, not the full file URL. For GitHub, useraw.githubusercontent.comraw 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:
- Global toggle in
battle.yaml:
# battle.yaml
randomBattle:
enabled: true
teamSize: 6
setsFile: "gen9randombattle.json"
statsMode: "OFFICIAL"
- 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 | FAQ | Troubleshooting