Spaces:
Running
Running
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. | |