mirror of
https://github.com/smogon/pokemon-showdown.git
synced 2026-04-26 10:48:53 -05:00
294 lines
8.8 KiB
Markdown
294 lines
8.8 KiB
Markdown
Teams
|
|
=====
|
|
|
|
Pokémon Showdown uses three teams formats:
|
|
|
|
1. Export format - for humans to read/write
|
|
2. JSON format - for computers to read/write
|
|
3. Packed format - compressed, for sending/saving/logging
|
|
|
|
Teams sent over a text format, such as the console command `/utm` or the command-line `./pokemon-showdown validate-team`, will usually used packed format. In addition, backups will automatically switch to packed format if you have enough teams.
|
|
|
|
Variables storing teams inside PS's codebase will generally be stored in JSON format. Because we use TypeScript, this will be pretty obvious; the type will be `PokemonSet[]` (for JSON format) rather than `string` (for packed format).
|
|
|
|
Export format is basically only used by the client, to show users.
|
|
|
|
|
|
Export format
|
|
-------------
|
|
|
|
Export format looks like this:
|
|
|
|
```
|
|
Articuno @ Leftovers
|
|
Ability: Pressure
|
|
EVs: 252 HP / 252 SpA / 4 SpD
|
|
Modest Nature
|
|
IVs: 30 SpA / 30 SpD
|
|
- Ice Beam
|
|
- Hurricane
|
|
- Substitute
|
|
- Roost
|
|
|
|
Ludicolo @ Life Orb
|
|
Ability: Swift Swim
|
|
EVs: 4 HP / 252 SpA / 252 Spe
|
|
Modest Nature
|
|
- Surf
|
|
- Giga Drain
|
|
- Ice Beam
|
|
- Rain Dance
|
|
|
|
Volbeat (M) @ Damp Rock
|
|
Ability: Prankster
|
|
EVs: 248 HP / 252 Def / 8 SpD
|
|
Bold Nature
|
|
- Tail Glow
|
|
- Baton Pass
|
|
- Encore
|
|
- Rain Dance
|
|
|
|
Seismitoad @ Life Orb
|
|
Ability: Swift Swim
|
|
EVs: 252 SpA / 4 SpD / 252 Spe
|
|
Modest Nature
|
|
- Hydro Pump
|
|
- Earth Power
|
|
- Stealth Rock
|
|
- Rain Dance
|
|
|
|
Alomomola @ Damp Rock
|
|
Ability: Regenerator
|
|
EVs: 252 HP / 252 Def / 4 SpD
|
|
Bold Nature
|
|
- Wish
|
|
- Protect
|
|
- Toxic
|
|
- Rain Dance
|
|
|
|
Armaldo @ Leftovers
|
|
Ability: Swift Swim
|
|
EVs: 128 HP / 252 Atk / 4 Def / 124 Spe
|
|
Adamant Nature
|
|
- X-Scissor
|
|
- Stone Edge
|
|
- Aqua Tail
|
|
- Rapid Spin
|
|
```
|
|
|
|
It's used for teambuilder import/export features, and not much else. But as a user, this is the only format you'll see.
|
|
|
|
|
|
JSON format
|
|
-----------
|
|
|
|
JSON format looks like this:
|
|
|
|
```json
|
|
[
|
|
{
|
|
"name": "",
|
|
"species": "Articuno",
|
|
"gender": "",
|
|
"item": "Leftovers",
|
|
"ability": "Pressure",
|
|
"evs": {"hp": 252, "atk": 0, "def": 0, "spa": 252, "spd": 4, "spe": 0},
|
|
"nature": "Modest",
|
|
"ivs": {"hp": 31, "atk": 31, "def": 31, "spa": 30, "spd": 30, "spe": 31},
|
|
"moves": ["Ice Beam", "Hurricane", "Substitute", "Roost"]
|
|
},
|
|
{
|
|
"name": "",
|
|
"species": "Ludicolo",
|
|
"gender": "",
|
|
"item": "Life Orb",
|
|
"ability": "Swift Swim",
|
|
"evs": {"hp": 4, "atk": 0, "def": 0, "spa": 252, "spd": 0, "spe": 252},
|
|
"nature": "Modest",
|
|
"moves": ["Surf", "Giga Drain", "Ice Beam", "Rain Dance"]
|
|
},
|
|
{
|
|
"name": "",
|
|
"species": "Volbeat",
|
|
"gender": "M",
|
|
"item": "Damp Rock",
|
|
"ability": "Prankster",
|
|
"evs": {"hp": 248, "atk": 0, "def": 252, "spa": 0, "spd": 8, "spe": 0},
|
|
"nature": "Bold",
|
|
"moves": ["Tail Glow", "Baton Pass", "Encore", "Rain Dance"]
|
|
},
|
|
{
|
|
"name": "",
|
|
"species": "Seismitoad",
|
|
"gender": "",
|
|
"item": "Life Orb",
|
|
"ability": "Swift Swim",
|
|
"evs": {"hp": 0, "atk": 0, "def": 0, "spa": 252, "spd": 4, "spe": 252},
|
|
"nature": "Modest",
|
|
"moves": ["Hydro Pump", "Earth Power", "Stealth Rock", "Rain Dance"]
|
|
},
|
|
{
|
|
"name": "",
|
|
"species": "Alomomola",
|
|
"gender": "",
|
|
"item": "Damp Rock",
|
|
"ability": "Regenerator",
|
|
"evs": {"hp": 252, "atk": 0, "def": 252, "spa": 0, "spd": 4, "spe": 0},
|
|
"nature": "Bold",
|
|
"moves": ["Wish", "Protect", "Toxic", "Rain Dance"]
|
|
},
|
|
{
|
|
"name": "",
|
|
"species": "Armaldo",
|
|
"gender": "",
|
|
"item": "Leftovers",
|
|
"ability": "Swift Swim",
|
|
"evs": {"hp": 128, "atk": 252, "def": 4, "spa": 0, "spd": 0, "spe": 124},
|
|
"nature": "Adamant",
|
|
"moves": ["X-Scissor", "Stone Edge", "Aqua Tail", "Rapid Spin"]
|
|
}
|
|
]
|
|
```
|
|
|
|
|
|
Packed format
|
|
-------------
|
|
|
|
Packed format looks like this:
|
|
|
|
```
|
|
Articuno||leftovers|pressure|icebeam,hurricane,substitute,roost|Modest|252,,,252,4,||,,,30,30,|||]
|
|
Ludicolo||lifeorb|swiftswim|surf,gigadrain,icebeam,raindance|Modest|4,,,252,,252|||||]
|
|
Volbeat||damprock|prankster|tailglow,batonpass,encore,raindance|Bold|248,,252,,8,|M||||]
|
|
Seismitoad||lifeorb|swiftswim|hydropump,earthpower,stealthrock,raindance|Modest|,,,252,4,252|||||]
|
|
Alomomola||damprock|regenerator|wish,protect,toxic,raindance|Bold|252,,252,,4,|||||]
|
|
Armaldo||leftovers|swiftswim|xscissor,stoneedge,aquatail,rapidspin|Adamant|128,252,4,,,124|||||
|
|
```
|
|
|
|
(Line breaks added for readability - this is all one line normally.)
|
|
|
|
The format is a list of pokemon delimited by `]`, where every Pokémon is:
|
|
|
|
```
|
|
NICKNAME|SPECIES|ITEM|ABILITY|MOVES|NATURE|EVS|GENDER|IVS|SHINY|LEVEL|HAPPINESS,POKEBALL,HIDDENPOWERTYPE,GIGANTAMAX,DYNAMAXLEVEL,TERATYPE
|
|
```
|
|
|
|
- `SPECIES` is left blank if it's identical to `NICKNAME`
|
|
|
|
- `ABILITY` is `0`, `1`, or `H` if it's the ability from the corresponding slot
|
|
for the Pokémon. It can also be an ability string, for Hackmons etc.
|
|
|
|
- `MOVES` is a comma-separated list of move IDs.
|
|
|
|
- `NATURE` left blank means Serious, except in Gen 1-2, where it means no Nature.
|
|
|
|
- `EVS` and `IVS` are comma-separated in standard order:
|
|
HP, Atk, Def, SpA, SpD, Spe. EVs left blank are 0, IVs left blank are 31.
|
|
If all EVs or IVs are blank, the commas can all be left off.
|
|
|
|
- `EVS` represent AVs in Pokémon Let's Go.
|
|
|
|
- `IVS` represent DVs in Gen 1-2. The IV will be divided by 2 and rounded down,
|
|
to become DVs (so the default of 31 IVs is converted to 15 DVs).
|
|
|
|
- `IVS` is post-hyper-training: pre-hyper-training IVs are represented in
|
|
`HIDDENPOWERTYPE`
|
|
|
|
- `SHINY` is `S` for shiny, and blank for non-shiny.
|
|
|
|
- `LEVEL` is left blank for level 100.
|
|
|
|
- `HAPPINESS` is left blank for 255.
|
|
|
|
- `POKEBALL` is left blank if it's a regular Poké Ball.
|
|
|
|
- `HIDDENPOWERTYPE` is left blank if the Pokémon is not Hyper Trained, if
|
|
Hyper Training doesn't affect IVs, or if it's represented by a move in
|
|
the moves list.
|
|
|
|
- `GIGANTAMAX` is `G` for Gmax, blank for non-Gmax.
|
|
|
|
- `DYNAMAXLEVEL` is left blank for 10.
|
|
|
|
- `TERATYPE` if left blank will default to the Pokémon's first type.
|
|
|
|
- If `POKEBALL`, `HIDDENPOWERTYPE`, `GIGANTAMAX`, `DYNAMAXLEVEL` and `TERATYPE`
|
|
are all blank, the commas will be left off.
|
|
|
|
|
|
Converting between formats
|
|
--------------------------
|
|
|
|
`Teams.unpack(packedTeam: string): PokemonSet[]`
|
|
|
|
- Converts a packed team to a JSON team
|
|
|
|
`Teams.pack(team: PokemonSet[]): string`
|
|
|
|
- Converts a JSON team to a packed team
|
|
|
|
`Teams.import(exportedTeam: string): PokemonSet[]`
|
|
|
|
- Converts a team in any string format (JSON, exported, or packed) to a JSON team
|
|
|
|
`Teams.export(team: PokemonSet[]): string`
|
|
|
|
- Converts a JSON team to an export team
|
|
|
|
`Teams.exportSet(set: PokemonSet): string`
|
|
|
|
- Converts a JSON set to export format
|
|
|
|
To convert from export to packed (or vice versa), just round-trip through PokemonSet: `Teams.export(Teams.unpack(packedTeam))` will produce an exported team.
|
|
|
|
Example use:
|
|
|
|
```js
|
|
const {Teams} = require('pokemon-showdown');
|
|
|
|
console.log(JSON.stringify(Teams.unpack(
|
|
`Articuno||leftovers|pressure|icebeam,hurricane,substitute,roost|Modest|252,,,252,4,||,,,30,30,|||]Ludicolo||lifeorb|swiftswim|surf,gigadrain,icebeam,raindance|Modest|4,,,252,,252|||||]Volbeat||damprock|prankster|tailglow,batonpass,encore,raindance|Bold|248,,252,,8,|M||||]Seismitoad||lifeorb|swiftswim|hydropump,earthpower,stealthrock,raindance|Modest|,,,252,4,252|||||]Alomomola||damprock|regenerator|wish,protect,toxic,raindance|Bold|252,,252,,4,|||||]Armaldo||leftovers|swiftswim|xscissor,stoneedge,aquatail,rapidspin|Adamant|128,252,4,,,124|||||`
|
|
)));
|
|
|
|
// will log the team to console in JSON format
|
|
|
|
```
|
|
|
|
|
|
Random team generator
|
|
---------------------
|
|
|
|
`Teams.generate(format: Format | string, options?: {seed: number[4]}): PokemonSet[]`
|
|
|
|
- Generate a team for a random format
|
|
|
|
|
|
Team validator
|
|
--------------
|
|
|
|
The team validator is separate from the simulator.
|
|
|
|
In JavaScript, it's available directly as a function:
|
|
|
|
```js
|
|
const {Teams, TeamValidator} = require('pokemon-showdown');
|
|
|
|
const validator = new TeamValidator('gen6nu');
|
|
|
|
const output = validator.validateTeam(
|
|
Teams.unpack(
|
|
`Articuno||leftovers|pressure|icebeam,hurricane,substitute,roost|Modest|252,,,252,4,||,,,30,30,|||]Ludicolo||lifeorb|swiftswim|surf,gigadrain,icebeam,raindance|Modest|4,,,252,,252|||||]Volbeat||damprock|prankster|tailglow,batonpass,encore,raindance|Bold|248,,252,,8,|M||||]Seismitoad||lifeorb|swiftswim|hydropump,earthpower,stealthrock,raindance|Modest|,,,252,4,252|||||]Alomomola||damprock|regenerator|wish,protect,toxic,raindance|Bold|252,,252,,4,|||||]Armaldo||leftovers|swiftswim|xscissor,stoneedge,aquatail,rapidspin|Adamant|128,252,4,,,124|||||`
|
|
)
|
|
);
|
|
```
|
|
|
|
`output` will be an array of problems, if it's not a legal team, or `null`, if it's a legal team.
|
|
|
|
|
|
Command-line API
|
|
----------------
|
|
|
|
If you're not using JavaScript, all of these APIs (conversion, generating random teams, validating teams) are available via the commandline API: [COMMANDLINE.md](./../COMMANDLINE.md).
|
|
|
|
They use standard IO, so any programming language supporting fork/exec should be able to call into them.
|