Spaces:
Running
Running
Upload 4781 files
Browse filesThis view is limited to 50 files because it contains too many changes.
See raw diff
- ARCHITECTURE.md +56 -0
- CODEOWNERS +33 -0
- COMMANDLINE.md +138 -0
- CONTRIBUTING.md +330 -0
- LICENSE +20 -0
- PROTOCOL.md +504 -0
- Procfile +1 -0
- build +54 -0
- config/CUSTOM-RULES.md +347 -0
- config/avatars.json +1 -0
- config/avatars/README.md +5 -0
- config/chat-plugins/README.md +1 -0
- config/chat-plugins/mafia-logs.json +1 -0
- config/chat-plugins/sample-teams.json +1 -0
- config/chat-plugins/seasons.json +1 -0
- config/chat-plugins/the-studio.json +1 -0
- config/chat-plugins/youtube.json +1 -0
- config/chatrooms.json +4 -0
- config/config-example.js +748 -0
- config/config.js +748 -0
- config/custom-example.css +9 -0
- config/formats.ts +0 -0
- config/hosts.csv +124 -0
- config/ladders/README.md +3 -0
- config/proxies.csv +0 -0
- config/suspects.json +1 -0
- data/FORMES.md +197 -0
- data/abilities.ts +0 -0
- data/aliases.ts +2371 -0
- data/cg-team-data.ts +77 -0
- data/cg-teams.ts +1080 -0
- data/conditions.ts +891 -0
- data/formats-data.ts +6041 -0
- data/items.ts +0 -0
- data/learnsets.ts +0 -0
- data/mods/fullpotential/abilities.ts +22 -0
- data/mods/fullpotential/scripts.ts +135 -0
- data/mods/gen1/README.md +58 -0
- data/mods/gen1/conditions.ts +263 -0
- data/mods/gen1/formats-data.ts +459 -0
- data/mods/gen1/moves.ts +977 -0
- data/mods/gen1/pokedex.ts +612 -0
- data/mods/gen1/rulesets.ts +74 -0
- data/mods/gen1/scripts.ts +1022 -0
- data/mods/gen1/typechart.ts +137 -0
- data/mods/gen1jpn/README.md +14 -0
- data/mods/gen1jpn/conditions.ts +12 -0
- data/mods/gen1jpn/moves.ts +90 -0
- data/mods/gen1jpn/rulesets.ts +91 -0
- data/mods/gen1jpn/scripts.ts +4 -0
ARCHITECTURE.md
ADDED
@@ -0,0 +1,56 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
Pokemon Showdown architecture
|
2 |
+
=============================
|
3 |
+
|
4 |
+
At the highest level, PS is split into three parts:
|
5 |
+
|
6 |
+
- Game server (**[smogon/pokemon-showdown](https://github.com/smogon/pokemon-showdown)**)
|
7 |
+
- Client (**[smogon/pokemon-showdown-client](https://github.com/smogon/pokemon-showdown-client)**)
|
8 |
+
- Login server (**[smogon/pokemon-showdown-loginserver](https://github.com/smogon/pokemon-showdown-loginserver)**)
|
9 |
+
|
10 |
+
All three communicate directly with each other.
|
11 |
+
|
12 |
+
A user starts by visiting `https://play.pokemonshowdown.com/`. This is handled by an Apache server (in the Client), which serves mostly static files but uses some PHP (legacy, intended to be migrated to Loginserver).
|
13 |
+
|
14 |
+
The user's web browser (running Client code) will then communicate with the Login server (mounted at `https://play.pokemonshowdown.com/api/` to handle logins mostly, or otherwise interface with the Client databases one way or another).
|
15 |
+
|
16 |
+
The user's web browser will also connect to the Game server, through SockJS. The Game server handles the chat rooms, matchmaking, and actual battle simulation.
|
17 |
+
|
18 |
+
The Game server also communicates with the Login server, to handle replay uploads (and, for the main server, ladder updates).
|
19 |
+
|
20 |
+
|
21 |
+
Game server
|
22 |
+
-----------
|
23 |
+
|
24 |
+
The game server is written in TypeScript and runs on Node.js.
|
25 |
+
|
26 |
+
Its entry point is [server/index.ts](./server/index.ts), which launches several major components:
|
27 |
+
|
28 |
+
- [server/sockets.ts](./server/sockets.ts) sets up a SockJS (abstracted WebSocket) server to accept connections from clients
|
29 |
+
|
30 |
+
- [server/users.ts](./server/users.ts) sets up `Users`, which wraps the SockJS connections in a system that handles users
|
31 |
+
|
32 |
+
- [server/rooms.ts](./server/rooms.ts) sets up `Rooms`, which handles the individual chat rooms and battle rooms
|
33 |
+
|
34 |
+
- [server/chat.ts](./server/chat.ts) sets up `Chat`, which handles chat commands and messages coming in from users (all client-to-server commands are routed through there)
|
35 |
+
|
36 |
+
`Rooms` also includes support for battle rooms, which is where the server connects to the game simulator itself. Game simulation code is in [sim/](./sim/).
|
37 |
+
|
38 |
+
|
39 |
+
Client
|
40 |
+
------
|
41 |
+
|
42 |
+
The client is built in a mix of TypeScript and JavaScript, with a mostly hand-rolled framework built on Backbone. There’s a rewrite to migrate it to Preact but it’s very stalled.
|
43 |
+
|
44 |
+
Its entry point is [index.template.html](https://github.com/smogon/pokemon-showdown-client/blob/master/play.pokemonshowdown.com/index.template.html)
|
45 |
+
|
46 |
+
It was written long ago, so instead of a single JS entry point, it includes a lot of JS files. Everything important is launched from [js/client.js](https://github.com/smogon/pokemon-showdown-client/blob/master/play.pokemonshowdown.com/js/client.js)
|
47 |
+
|
48 |
+
|
49 |
+
Login server
|
50 |
+
------------
|
51 |
+
|
52 |
+
The client’s login server, which handles logins and most database interaction, is written in TypeScript. The backend is currently split between a MySQL InnoDB database (for users, ladder, and most other things) and a Postgres (technically Cockroach) database (for Replays).
|
53 |
+
|
54 |
+
Its entry point is [server.ts](https://github.com/smogon/pokemon-showdown-loginserver/blob/master/src/server.ts).
|
55 |
+
|
56 |
+
It's intended to replace all of the old PHP code in the Client, but that migration is only halfway done at the moment.
|
CODEOWNERS
ADDED
@@ -0,0 +1,33 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
config/formats.ts @KrisXV @Marty-D
|
2 |
+
data/mods/*/random-teams.ts @AnnikaCodes
|
3 |
+
data/mods/gen9ssb/ @HoeenCoder @HisuianZoroark @KrisXV
|
4 |
+
data/random-sets.json @MathyFurret @ACakeWearingAHat @livid-washed @adrivrie
|
5 |
+
data/random-teams.ts @AnnikaCodes @KrisXV @MathyFurret @ACakeWearingAHat @livid-washed @adrivrie
|
6 |
+
data/text/ @Marty-D
|
7 |
+
databases/ @monsanto
|
8 |
+
lib/sql.ts @mia-pi-git
|
9 |
+
server/artemis/* @mia-pi-git
|
10 |
+
server/chat-plugins/abuse-monitor.ts @mia-pi-git
|
11 |
+
server/chat-plugins/friends.ts @mia-pi-git
|
12 |
+
server/chat-plugins/github.ts @mia-pi-git
|
13 |
+
server/chat-plugins/hosts.ts @AnnikaCodes
|
14 |
+
server/chat-plugins/helptickets*.ts @mia-pi-git
|
15 |
+
server/chat-plugins/mafia.ts @HoeenCoder
|
16 |
+
server/chat-plugins/othermetas.ts @KrisXV
|
17 |
+
server/chat-plugins/permalocks.ts @mia-pi-git
|
18 |
+
server/chat-plugins/quotes.ts @mia-pi-git @KrisXV
|
19 |
+
server/chat-plugins/random-battles.ts @KrisXV @AnnikaCodes
|
20 |
+
server/chat-plugins/repeats.ts @AnnikaCodes
|
21 |
+
server/chat-plugins/responder.ts @mia-pi-git
|
22 |
+
server/chat-plugins/rock-paper-scissors.ts @mia-pi-git
|
23 |
+
server/chat-plugins/sample-teams.ts @KrisXV
|
24 |
+
server/chat-plugins/scavenger*.ts @xfix @sparkychildcharlie @PartMan7
|
25 |
+
sever/chat-plugins/teams.ts @mia-pi-git
|
26 |
+
server/chat-plugins/the-studio.ts @KrisXV
|
27 |
+
server/friends.ts @mia-pi-git
|
28 |
+
server/private-messages/* @mia-pi-git
|
29 |
+
server/chat-plugins/username-prefixes.ts @AnnikaCodes
|
30 |
+
server/chat-plugins/wifi.ts @KrisXV
|
31 |
+
server/friends.ts @mia-pi-git
|
32 |
+
server/modlog/* @monsanto @AnnikaCodes
|
33 |
+
test/random-battles/* @AnnikaCodes
|
COMMANDLINE.md
ADDED
@@ -0,0 +1,138 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
Pokémon Showdown command-line tools
|
2 |
+
===================================
|
3 |
+
|
4 |
+
Pokémon Showdown provides a command-line utility `pokemon-showdown`. You can access its help anytime with `pokemon-showdown -h`.
|
5 |
+
|
6 |
+
|
7 |
+
Setup
|
8 |
+
-----
|
9 |
+
|
10 |
+
Install Node.js, clone this repository and run `./build` from inside it. (Windows users should use `node build`, and replace all future mentions of `./` in this document with `node` followed by a space.)
|
11 |
+
|
12 |
+
Every time you update the code here (such as with `git pull`), run `./build` again. (If you get errors, try running `./build --force`.)
|
13 |
+
|
14 |
+
Afterwards, you can use any of the following commands:
|
15 |
+
|
16 |
+
|
17 |
+
Supported commands
|
18 |
+
------------------
|
19 |
+
|
20 |
+
Note: Commands that ask for a team want the team in [packed team format](./sim/TEAMS.md#packed-format) or JSON format. Teambuilder export format is not supported.
|
21 |
+
|
22 |
+
`./pokemon-showdown start [--skip-build] [PORT]`
|
23 |
+
|
24 |
+
- Starts a PS server on the specified port
|
25 |
+
(Defaults to the port setting in config/config.js)
|
26 |
+
(The port setting in config/config.js defaults to 8000)
|
27 |
+
|
28 |
+
Using Pokémon Showdown as a server is documented at:
|
29 |
+
[server/README.md](./server/README.md)
|
30 |
+
|
31 |
+
(You do not need to use `./build` when using PS as a server; it will
|
32 |
+
be run automatically for you unless you use `--skip-build`.)
|
33 |
+
|
34 |
+
`./pokemon-showdown generate-team [FORMAT-ID [RANDOM-SEED]]`
|
35 |
+
|
36 |
+
- Generates a random team, and writes it to stdout in packed team format
|
37 |
+
(Format defaults to the latest Random Battles format)
|
38 |
+
|
39 |
+
`./pokemon-showdown validate-team [FORMAT-ID]`
|
40 |
+
|
41 |
+
- Reads a team in any format from stdin, and validates it
|
42 |
+
- If valid: exits with code 0
|
43 |
+
- If invalid: writes errors to stderr, exits with code 1
|
44 |
+
|
45 |
+
`./pokemon-showdown simulate-battle`
|
46 |
+
|
47 |
+
- Simulates a battle, taking input to stdin and writing output to stdout
|
48 |
+
|
49 |
+
Using Pokémon Showdown as a command-line simulator is documented at:
|
50 |
+
[sim/README.md](./sim/README.md)
|
51 |
+
|
52 |
+
`./pokemon-showdown json-team`
|
53 |
+
|
54 |
+
- Reads a team in any format from stdin, writes the unpacked JSON to stdout
|
55 |
+
|
56 |
+
`./pokemon-showdown pack-team`
|
57 |
+
|
58 |
+
- Reads a team in any format from stdin, writes the packed team to stdout
|
59 |
+
|
60 |
+
`./pokemon-showdown export-team`
|
61 |
+
|
62 |
+
- Reads a team in any format from stdin, writes the exported (human-readable) team to stdout
|
63 |
+
|
64 |
+
`./pokemon-showdown help`
|
65 |
+
|
66 |
+
- Displays this reference
|
67 |
+
|
68 |
+
|
69 |
+
Piping
|
70 |
+
------
|
71 |
+
|
72 |
+
These commands are very unixy (using stdin and stdout), so you can of course pipe them together:
|
73 |
+
|
74 |
+
```
|
75 |
+
$ ./pokemon-showdown generate-team gen8randombattle | ./pokemon-showdown export-team
|
76 |
+
Kartana @ Choice Band
|
77 |
+
Ability: Beast Boost
|
78 |
+
Level: 74
|
79 |
+
EVs: 85 HP / 85 Atk / 85 Def / 85 SpA / 85 SpD / 85 Spe
|
80 |
+
- Smart Strike
|
81 |
+
- Sacred Sword
|
82 |
+
- Knock Off
|
83 |
+
- Leaf Blade
|
84 |
+
|
85 |
+
Rotom (Rotom-Heat) @ Heavy-Duty Boots
|
86 |
+
Ability: Levitate
|
87 |
+
Level: 82
|
88 |
+
EVs: 85 HP / 85 Def / 85 SpA / 85 SpD / 85 Spe
|
89 |
+
IVs: 0 Atk
|
90 |
+
- Defog
|
91 |
+
- Will-O-Wisp
|
92 |
+
- Thunderbolt
|
93 |
+
- Overheat
|
94 |
+
|
95 |
+
Kingler @ Life Orb
|
96 |
+
Ability: Sheer Force
|
97 |
+
Level: 84
|
98 |
+
EVs: 85 HP / 85 Atk / 85 Def / 85 SpA / 85 SpD / 85 Spe
|
99 |
+
- Liquidation
|
100 |
+
- X-Scissor
|
101 |
+
- Superpower
|
102 |
+
- Rock Slide
|
103 |
+
|
104 |
+
Abomasnow @ Light Clay
|
105 |
+
Ability: Snow Warning
|
106 |
+
Level: 82
|
107 |
+
EVs: 85 HP / 85 Atk / 85 Def / 85 SpA / 85 SpD / 85 Spe
|
108 |
+
- Ice Shard
|
109 |
+
- Aurora Veil
|
110 |
+
- Earthquake
|
111 |
+
- Blizzard
|
112 |
+
|
113 |
+
Goodra @ Assault Vest
|
114 |
+
Ability: Sap Sipper
|
115 |
+
Level: 82
|
116 |
+
EVs: 85 HP / 85 Atk / 85 Def / 85 SpA / 85 SpD / 85 Spe
|
117 |
+
- Earthquake
|
118 |
+
- Power Whip
|
119 |
+
- Draco Meteor
|
120 |
+
- Fire Blast
|
121 |
+
|
122 |
+
Raikou @ Choice Specs
|
123 |
+
Ability: Pressure
|
124 |
+
Level: 80
|
125 |
+
EVs: 85 HP / 85 Def / 85 SpA / 85 SpD / 85 Spe
|
126 |
+
IVs: 0 Atk
|
127 |
+
- Scald
|
128 |
+
- Aura Sphere
|
129 |
+
- Thunderbolt
|
130 |
+
- Volt Switch
|
131 |
+
```
|
132 |
+
|
133 |
+
```
|
134 |
+
$ ./pokemon-showdown generate-team gen8randombattle | ./pokemon-showdown validate-team gen8ou
|
135 |
+
Your set for Coalossal is flagged as Gigantamax, but Gigantamaxing is disallowed
|
136 |
+
(If this was a mistake, disable Gigantamaxing on the set.)
|
137 |
+
Octillery's ability Moody is banned.
|
138 |
+
```
|
CONTRIBUTING.md
ADDED
@@ -0,0 +1,330 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
Contributing to Pokémon Showdown
|
2 |
+
========================================================================
|
3 |
+
|
4 |
+
Building and running
|
5 |
+
------------------------------------------------------------------------
|
6 |
+
|
7 |
+
[README.md](./README.md) contains most of the relevant information here.
|
8 |
+
|
9 |
+
Our build script does most of the work here: You can mostly just run `./pokemon-showdown` to start a server. (Windows users will have to replace `./whatever` with `node whatever`, every time it appears)
|
10 |
+
|
11 |
+
If you are unable to access a local server due to your browser forcing you to use HTTPS, try disabling "DNS over HTTPS" (Firefox) or "Async DNS resolver" (Chrome, in chrome://flags on Windows and Linux). If the problem persists, you can file an issue.
|
12 |
+
|
13 |
+
PS has other useful command-line invocations, which you can investigate with `./pokemon-showdown help`.
|
14 |
+
|
15 |
+
Unit tests can be run with `npm test`. You can run specific unit tests with `npx mocha -g "text"`, which will run all unit tests whose name contains "text", or you can just edit the unit test from `it` to `it.only`.
|
16 |
+
|
17 |
+
Packaging for npm is done by running `./build decl && npm publish`. Only Zarel has the NPM credentials to do this, but feel free to request a new NPM package if you need something.
|
18 |
+
|
19 |
+
|
20 |
+
Contributing
|
21 |
+
------------------------------------------------------------------------
|
22 |
+
|
23 |
+
In general, we welcome pull requests that fix bugs.
|
24 |
+
|
25 |
+
For feature additions and large projects, please discuss with us at https://psim.us/development and/or https://psim.us/devdiscord first. We'd hate to have to reject a pull request that you spent a long time working on.
|
26 |
+
|
27 |
+
If you're looking for inspiration for something to do, the Ideas issue has some ideas: https://github.com/smogon/pokemon-showdown/issues/2444
|
28 |
+
|
29 |
+
Also useful is the Suggestions forum (you don't need to worry about approval if you take Approved suggestions): https://www.smogon.com/forums/forums/suggestions.517/
|
30 |
+
|
31 |
+
Also useful is the Mechanics Bugs kanban board: https://github.com/smogon/pokemon-showdown/projects/3
|
32 |
+
|
33 |
+
There's no need to worry about code standards too much (unit tests will automatically catch most of what we care about, we'll point out the rest if you make a pull request), but they're here if you want them.
|
34 |
+
|
35 |
+
We try to respond to pull requests within a few days, but feel free to bump yours if it seems like we forget about it. Sometimes we did, and sometimes there might be a miscommunication in terms of who is waiting for what.
|
36 |
+
|
37 |
+
|
38 |
+
License
|
39 |
+
------------------------------------------------------------------------
|
40 |
+
|
41 |
+
Your submitted code should be MIT licensed. The GitHub ToS (and the fact that your fork also contains our LICENSE file) ensures this, so we won't ask when you submit a pull request, but keep this in mind.
|
42 |
+
|
43 |
+
For simplicity (mostly to make relicensing easier), client code should be also be MIT licensed. The first time you make a client pull request, we'll ask you to explicitly state that you agree to MIT license it.
|
44 |
+
|
45 |
+
|
46 |
+
Design standards
|
47 |
+
------------------------------------------------------------------------
|
48 |
+
|
49 |
+
We strive to be maximally intuitive and accessible. Sure, "that's what they all say", but the currently-popular flat design trend straight-up sacrifices usability for aesthetics, and we try to take the other side of that trade-off.
|
50 |
+
|
51 |
+
Some principles we try to design by:
|
52 |
+
|
53 |
+
### D1. Less text is better
|
54 |
+
|
55 |
+
The fewer words you use, the less likely someone is to gloss over it, and the easier it is to find the important information. Compare "1234 battles" with "There are currently 1234 active battles being played on this server" - more words are usually only clutter that makes it hard to find the information you want.
|
56 |
+
|
57 |
+
### D2. Buttons should say what they do
|
58 |
+
|
59 |
+
Buttons and links that say "Click here" or "Look at this" are bad for a number of reasons, but the most important one is probably because it violates the principle that you shouldn't need to read outside the button to know what the button does. The way people use interfaces is by looking for buttons that do what they want, not by reading every word from beginning to end.
|
60 |
+
|
61 |
+
In addition, blind users in particular navigate by link text, so a blind user will have a much harder time figuring out where a link goes if it only says "click here".
|
62 |
+
|
63 |
+
For similar reasons, buttons should not say "Yes" or "No" or "Confirm". Instead of "Delete this file? [Yes] [No]", you should just use "[Delete] [Cancel]". This is especially important for complex questions where it could be easy to lose track of which side is "yes" and which side is "no".
|
64 |
+
|
65 |
+
### D3. Remove unnecessary clicks
|
66 |
+
|
67 |
+
Whenever you give a user a button to click, always think, "In what situations would a user want to click this? In what situations would a user not want to click this?" Dialogs like "Are you sure?" can often be replaced with just doing the thing with an "Undo" button. Buttons to show more details can often be replaced with simply showing more details by default.
|
68 |
+
|
69 |
+
### D4. Remove unnecessary scrolling and mouse movement
|
70 |
+
|
71 |
+
Similar to unnecessary clicks - if a user has a large screen and you show them a lot of text in a tiny scrollable region, that's incredibly user-hostile. Either the user wants to read the text or they don't: the perfect use-case for a "read more" or expand/collapse button.
|
72 |
+
|
73 |
+
### D5. Affordances are important
|
74 |
+
|
75 |
+
An affordance is a hint for what you're supposed to do. A button looking like a physical button you can click is an example of an affordance. Or a button you can't use not looking clickable.
|
76 |
+
|
77 |
+
This is why we depart from flat design: Years of UX research have taught us that it's important for buttons look like buttons. Making clickable things "look 3D and pressable" or underlining them is good practice. We can't always do this (dropdown menus would look pretty ugly if every item was beveled and embossed) but we do what we can.
|
78 |
+
|
79 |
+
### D6. Feedback is important
|
80 |
+
|
81 |
+
Users should be shown enough information not to be confused about what's going on.
|
82 |
+
|
83 |
+
If a button doesn't react instantly, it should be replaced with a "Loading" screen or some other indication that it's doing something. If something's failed, it should come with an error message so the user knows what's wrong.
|
84 |
+
|
85 |
+
There's a famous story of a CEO of a company who clicked the "email everyone" button, but it didn't react, so he clicked it a few more times, accidentally spamming a bunch of users and getting their company marked as spam by a bunch of email services.
|
86 |
+
|
87 |
+
This is why we notify for ignored messages once per session. If your friend sends you "here is the code for you to use" and you say "I never got it", there needs to be some way to understand what happened. Options can exist, but options that hide the fact that you turned them on should be avoided.
|
88 |
+
|
89 |
+
Part of this overlaps with D5 (buttons that shouldn't be clicked multiple times should be disabled after the first click), but part of this is about not hiding information if it would confuse users. This does conflict with D1 (less is better) a bit, so a useful rule is that if the user has trouble understanding what's going on (e.g. because you replaced some text with a confusing symbol), you've taken D1 too far.
|
90 |
+
|
91 |
+
|
92 |
+
Comment standards
|
93 |
+
------------------------------------------------------------------------
|
94 |
+
|
95 |
+
### C1. Don't teach JavaScript
|
96 |
+
|
97 |
+
The first rule of comments is that they should not document obvious language features.
|
98 |
+
|
99 |
+
A common mistake when starting out is to write something like this:
|
100 |
+
|
101 |
+
```ts
|
102 |
+
// Increase counter by 1.
|
103 |
+
counter++;
|
104 |
+
```
|
105 |
+
|
106 |
+
But this is a lot of visual clutter for someone who already knows JavaScript! Since nearly all of our developers already know JavaScript, this sort of commenting can slow down and distract developers, increasing the number of bugs.
|
107 |
+
|
108 |
+
### C2. Document in names if possible
|
109 |
+
|
110 |
+
By far the best way to document things is in variable and function names.
|
111 |
+
|
112 |
+
BAD:
|
113 |
+
|
114 |
+
```ts
|
115 |
+
/** move name */
|
116 |
+
let value = "Stealth Rock";
|
117 |
+
```
|
118 |
+
|
119 |
+
GOOD:
|
120 |
+
|
121 |
+
```ts
|
122 |
+
let moveName = "Stealth Rock";
|
123 |
+
```
|
124 |
+
|
125 |
+
Good variable and function names can massively increase readability, by much more than comments. Often, this means simply creating a variable so you can give it a name:
|
126 |
+
|
127 |
+
BAD:
|
128 |
+
|
129 |
+
```ts
|
130 |
+
// if ten seconds have passed and the user is staff
|
131 |
+
if (now > then + 10_000 && '~@%'.includes(user.tempGroup)) {
|
132 |
+
```
|
133 |
+
|
134 |
+
GOOD:
|
135 |
+
|
136 |
+
```ts
|
137 |
+
const tenSecondsPassed = now > then + 10_000;
|
138 |
+
const userIsStaff = '~@%'.includes(user.tempGroup);
|
139 |
+
if (tenSecondsPassed && userIsStaff) {
|
140 |
+
```
|
141 |
+
|
142 |
+
### C3. Doc comments
|
143 |
+
|
144 |
+
Sometimes, you have information about a variable/function (such as how and when to use it) that doesn't fit in its name. The best place to put this is in a doc comment, like this:
|
145 |
+
|
146 |
+
```ts
|
147 |
+
/** null = not accepting connections */
|
148 |
+
let numConnections: number | null = null;
|
149 |
+
```
|
150 |
+
|
151 |
+
Doc comments start with `/**` and end with `*/`. In VS Code, doc comments will show up when you hover your mouse over the variable/function name, anywhere it's used. If your information would be useful there, please put it in a doc comment.
|
152 |
+
|
153 |
+
### C4. Other comments
|
154 |
+
|
155 |
+
The main remaining use of comments is to document confusing code. If the code is doing something that requires understanding more than just JavaScript, it can be a good time for a comment:
|
156 |
+
|
157 |
+
```ts
|
158 |
+
// for some reason, Chrome won't update unless you do this
|
159 |
+
elem.innerHTML = elem.innerHTML;
|
160 |
+
```
|
161 |
+
|
162 |
+
Remember, the line isn't about whether something is "too obvious" for a comment. "Increase counter by 1" isn't bad because it's "too obvious", it's bad because it's trying to teach JavaScript rather than explain the code.
|
163 |
+
|
164 |
+
### C5. Jokes
|
165 |
+
|
166 |
+
We allow jokes in comments. You're always allowed to have fun!
|
167 |
+
|
168 |
+
```ts
|
169 |
+
// GET IT? BECAUSE WE DON'T KNOW WHAT SPECIES IT IS???
|
170 |
+
if (!species) species = 'Unown';
|
171 |
+
```
|
172 |
+
|
173 |
+
|
174 |
+
Commit message standards
|
175 |
+
------------------------------------------------------------------------
|
176 |
+
|
177 |
+
### CM1. What, not how
|
178 |
+
|
179 |
+
Commits should describe what the code _does_, not how it does it.
|
180 |
+
|
181 |
+
In other words:
|
182 |
+
|
183 |
+
- BAD: `Change Wonder Guard from onBeforeMove to onTryHit`
|
184 |
+
- GOOD: `Fix Mold Breaker Wonder Guard interaction`
|
185 |
+
|
186 |
+
The details of how you achieve the fix should be left for the second paragraph of the commit message.
|
187 |
+
|
188 |
+
If this is not possible because your code does not make any functionality changes, your commit summary should ideally start with the word "Refactor" (or at least contain it in some way).
|
189 |
+
|
190 |
+
### CM2. Imperative
|
191 |
+
|
192 |
+
Commits should usually start with a verb in imperative mood, such as "Add", "Fix", "Refactor", etc (if the verb is there, it should be imperative, but it doesn't have to be there).
|
193 |
+
|
194 |
+
- BAD: `Adding namefilter`
|
195 |
+
- BAD: `Adds namefilter`
|
196 |
+
- GOOD: `Add namefilter`
|
197 |
+
|
198 |
+
### CM3. Grammar
|
199 |
+
|
200 |
+
The first line of the commit summary should be under 50 characters long.
|
201 |
+
|
202 |
+
The first letter of a commit summary should be capitalized (unless the first word starts with a number or is case-sensitive, e.g. `ls`).
|
203 |
+
|
204 |
+
The commit summary should not end in a period.
|
205 |
+
|
206 |
+
- BAD: `refactor users to use classes`
|
207 |
+
- BAD: `Refactor Users to use classes.`
|
208 |
+
- GOOD: `Refactor Users to use classes`
|
209 |
+
|
210 |
+
### CM4. Tag
|
211 |
+
|
212 |
+
Your commit summary should make it clear what part of the code you're talking about. For instance, if you're editing the Trivia plugin, you might want to add "Trivia: " to the beginning of your commit summary so it's clear.
|
213 |
+
|
214 |
+
- BAD: `Ban Genesect`
|
215 |
+
- GOOD: `Monotype: Ban Genesect` (notice the uppercase "B")
|
216 |
+
|
217 |
+
### CM5. Squashing
|
218 |
+
|
219 |
+
OPTIONAL: If you make commits to fix commits in your pull request, you can squash/amend them into one commit. This is no longer required now that GitHub supports squash-merging.
|
220 |
+
|
221 |
+
- BAD: `Add /lock`, `Fix crash in /lock`, `Fix another crash in /lock` (if these are the same pullreq, they should be the same commit)
|
222 |
+
- GOOD: `Add /lock`
|
223 |
+
- GOOD: `Fix crash in /lock`
|
224 |
+
|
225 |
+
If you want to have more than one commit in Git master's history after merge (i.e. you want your pull request to be rebase-merged instead of squash-merged), your commits need to all make sense as separate commits, and none of your commits should be just fixing an earlier commit in your pull request (those need to be squashed/amended).
|
226 |
+
|
227 |
+
Here is a guide for squashing, if you need help with that: https://redew.github.io/rebaseguide/
|
228 |
+
|
229 |
+
If, while rebasing, you somehow unintentionally break your pull request, do not close it and make a new one to replace it. Instead, you can ask in the Development chatroom for help on trying to fix it; it can almost always be fixed.
|
230 |
+
|
231 |
+
|
232 |
+
Code standards
|
233 |
+
------------------------------------------------------------------------
|
234 |
+
|
235 |
+
We enforce most of our code standards through `eslint`. Just run `npm test` and it'll tell you if something's wrong.
|
236 |
+
|
237 |
+
Looking at your surrounding text is also a way to get a good idea of our coding style.
|
238 |
+
|
239 |
+
### Strings
|
240 |
+
|
241 |
+
The codebase currently uses a mix of `"` and `'` and `` ` `` for strings.
|
242 |
+
|
243 |
+
Our current quote convention is to use:
|
244 |
+
|
245 |
+
- `` ` `` as in `` `move-${move.id}` `` for any string that needs interpolation, otherwise:
|
246 |
+
- `` ` `` as in `` `<strong>Fire Blast</strong>` `` for code meant to be fed to an interpreter/tokenizer before being displayed to the user; i.e. protocol code and HTML
|
247 |
+
- `'` as in `'fireblast'` for any string not meant to be displayed to the user; i.e. IDs
|
248 |
+
- `"` as in `"Fire Blast"` for any string meant to be displayed verbatim to the user; i.e. names (i.e. usernames, move names, etc), most English text, and help entries of chat commands
|
249 |
+
|
250 |
+
As far as I know, we don't use strings for anything else, but if you need to use strings in a way that doesn't conform to the above three, ask Zarel in the Development chatroom to decide (and default to `` ` `` in lieu of a decision).
|
251 |
+
|
252 |
+
Unfortunately, since this is not a convention the linter can test for (and also because our older string standards predate PS), a lot of existing code is wrong on this, so you can't look at surrounding code to get an idea of what the convention should be. Refer to the above paragraph as the definitive rule.
|
253 |
+
|
254 |
+
### Optionals: `null` vs `undefined` vs `false`
|
255 |
+
|
256 |
+
PS convention is to use `null` for optionals. So a function that retrieves a possible `T` would return `T | null`.
|
257 |
+
|
258 |
+
Some old code returns `T | undefined` (our previous convention). This is a relatively common standard (ironically, TypeScript itself uses it). Feel free to convert to `T | null` where you see it.
|
259 |
+
|
260 |
+
Some even older code returns `T | false`. This is a very old PHP convention that has no place in modern PS code. Please convert to `T | null` if you see it.
|
261 |
+
|
262 |
+
### `false | null | undefined`
|
263 |
+
|
264 |
+
The simulator (code in `sim/` and `data/`) will often have functions with return signatures of the form `T | false | null | undefined`, especially in event handlers. These aren't optionals, they're different sentinel values.
|
265 |
+
|
266 |
+
Specifically:
|
267 |
+
|
268 |
+
* `false` means "this action failed"
|
269 |
+
* `null` means "this action failed silently; suppress any 'But it failed!' messages"
|
270 |
+
* `undefined` means "this action should be ignored, and treated as if nothing unexpected happened"
|
271 |
+
|
272 |
+
So, if Thunder Wave hits a Ground type, the immunity checker returns `false` to indicate the immunity.
|
273 |
+
|
274 |
+
If Volt Absorb absorbs Thunder Wave, Volt Absorb's TryHit handler shows the Volt Absorb message and returns `null` to indicate that no other failure message should be shown.
|
275 |
+
|
276 |
+
If Water Absorb doesn't absorb Thunder Wave, Water Absorb's TryHit handler returns `undefined`, to show that Water Absorb does not interact with Thunder Wave.
|
277 |
+
|
278 |
+
### `??` vs `||`
|
279 |
+
|
280 |
+
We prefer using `||` instead of `??` for fallback, for a few reasons:
|
281 |
+
|
282 |
+
- `sucrase` (our TypeScript to JavaScript compiler) makes `??` rather more complicated than ideal.
|
283 |
+
|
284 |
+
- We rarely treat `0` or `''` differently from `null` (the same reason we use `!foo` instead of `foo == null` for null checks)
|
285 |
+
|
286 |
+
- TypeScript does not actually allow us to have "non-empty strings" or "positive integers" as a type, so we have to deal with those cases no matter what.
|
287 |
+
|
288 |
+
If, at a future point, TypeScript does allow us to constrain types better, we might consider using `??` for clarity. But for now, I see no reason to use `??` except in very niche situations where the difference matters.
|
289 |
+
|
290 |
+
|
291 |
+
Modern JavaScript/TypeScript syntax convention
|
292 |
+
------------------------------------------------------------------------
|
293 |
+
|
294 |
+
We care a lot about performance, but also readability. Fortunately, recent versions of V8 usually have both, but here are some exceptions.
|
295 |
+
|
296 |
+
In general, we prefer modern ways of writing things as long as they're supported by the most recent LTS release of Node. For instance, we prefer `{...foo}` to `Object.assign({}, foo)`.
|
297 |
+
|
298 |
+
- `.forEach`: Don't use; we always prefer `for`...`of` for readability as well as perf (others like `map`/`filter` are fine, though)
|
299 |
+
|
300 |
+
- `.reduce`: we usually prefer `for`...`of` for readability, but you can use it in code that you code-own if you really want to
|
301 |
+
|
302 |
+
- Multiline template strings: A frequent source of bugs, so we prefer to explicitly use `\n` and concatenate over multiple lines.
|
303 |
+
|
304 |
+
- `async`/`await`: We prefer it for readability, but in certain cases we use raw Promises or even callbacks for performance. Don't worry about it too much; we usually won't nitpick code that uses any async implementation (although we might insist on `async`/`await` if the reability difference is huge).
|
305 |
+
|
306 |
+
- getters/setters/`Proxy`: We are generally very anti-magic. There are certain places in the code we do use magic where it's massively DRYer (or for historical reasons), but we prefer to explicitly mark that setting a variable is actually running a function with many and varied side effects. Please have a better reason than "`.foo` is less visual clutter than `.getFoo()`".
|
307 |
+
|
308 |
+
- Constant Enums: Don't use; we prefer constant union types, like `type Category = 'Physical' | 'Special' | 'Status'`
|
309 |
+
|
310 |
+
- Default Properties: Mediocre performance when compiled with `sucrase`. This is fine for objects that are rarely created, but prefer setting properties directly in a constructor, for objects created in inner loops.
|
311 |
+
|
312 |
+
|
313 |
+
Dependencies
|
314 |
+
------------------------------------------------------------------------
|
315 |
+
|
316 |
+
We oppose the usual JavaScript culture of casually adding dependencies from NPM.
|
317 |
+
|
318 |
+
There are, of course, a lot of libraries like SockJS doing valuable things that we shouldn't reimplement ourselves. However, most libraries on NPM have very different priorities than we do (not caring about performance or bugs in subdependencies).
|
319 |
+
|
320 |
+
A common reason given for preferring dependencies is because someone else is more likely to have encountered and fixed bugs. But in practice many dependencies are worse-maintained than Showdown. And many bugs come from misusing a dependency.
|
321 |
+
|
322 |
+
In practice, for any dependency we could reimplement in around 30 lines of code, we'll write it ourselves and maintain it in `lib/`. Such maintenance is usually worth avoiding a `left-pad` situation, and also is generally better for performance, and also helps us easily craft the API to be most convenient for our own use-case.
|
323 |
+
|
324 |
+
To be clear, we're not _opposed_ to new dependencies and will accept them where they make sense. But we try to avoid them more most than other Node projects do.
|
325 |
+
|
326 |
+
|
327 |
+
`package-lock.json`
|
328 |
+
------------------------------------------------------------------------
|
329 |
+
|
330 |
+
In the past, we didn't use `package-lock`. The reasons are historical. We do now. If you see a project without package-lock, feel free to add it.
|
LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
The MIT License (MIT)
|
2 |
+
|
3 |
+
Copyright (c) 2011-2024 Guangcong Luo and other contributors http://pokemonshowdown.com/
|
4 |
+
|
5 |
+
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
6 |
+
this software and associated documentation files (the "Software"), to deal in
|
7 |
+
the Software without restriction, including without limitation the rights to
|
8 |
+
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
9 |
+
the Software, and to permit persons to whom the Software is furnished to do so,
|
10 |
+
subject to the following conditions:
|
11 |
+
|
12 |
+
The above copyright notice and this permission notice shall be included in all
|
13 |
+
copies or substantial portions of the Software.
|
14 |
+
|
15 |
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16 |
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
17 |
+
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
18 |
+
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
19 |
+
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
20 |
+
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
PROTOCOL.md
ADDED
@@ -0,0 +1,504 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
Protocol
|
2 |
+
========
|
3 |
+
|
4 |
+
Pokémon Showdown's protocol is relatively simple.
|
5 |
+
|
6 |
+
Pokémon Showdown is implemented in SockJS. SockJS is a compatibility
|
7 |
+
layer over raw WebSocket, so you can actually connect to Pokémon
|
8 |
+
Showdown directly using WebSocket:
|
9 |
+
|
10 |
+
ws://sim.smogon.com:8000/showdown/websocket
|
11 |
+
or
|
12 |
+
wss://sim3.psim.us/showdown/websocket
|
13 |
+
|
14 |
+
Client implementations you might want to look at for reference include:
|
15 |
+
|
16 |
+
- Majeur's android client (Kotlin/Java) -
|
17 |
+
https://github.com/MajeurAndroid/Android-Unofficial-Showdown-Client
|
18 |
+
- pickdenis' chat bot (Ruby) -
|
19 |
+
https://github.com/pickdenis/ps-chatbot
|
20 |
+
- Quinella and TalkTakesTime's chat bot (Node.js) -
|
21 |
+
https://github.com/TalkTakesTime/Pokemon-Showdown-Bot
|
22 |
+
- Nixola's chat bot (Lua) -
|
23 |
+
https://github.com/Nixola/NixPSbot
|
24 |
+
- Morfent's chat bot (Perl 6) -
|
25 |
+
https://github.com/Kaiepi/p6-PSBot
|
26 |
+
- the official client (HTML5 + JavaScript) -
|
27 |
+
https://github.com/smogon/pokemon-showdown-client
|
28 |
+
|
29 |
+
The official client logs protocol messages in the JavaScript console,
|
30 |
+
so opening that (F12 in most browsers) can help tell you what's going
|
31 |
+
on.
|
32 |
+
|
33 |
+
|
34 |
+
Client-to-server messages
|
35 |
+
-------------------------
|
36 |
+
|
37 |
+
Messages from the user to the server are in the form:
|
38 |
+
|
39 |
+
ROOMID|TEXT
|
40 |
+
|
41 |
+
`ROOMID` can optionally be left blank if unneeded (commands like `/join lobby`
|
42 |
+
can be sent anywhere). Responses will be sent to a PM box with no username
|
43 |
+
(so `|/command` is equivalent to `|/pm ~, /command`).
|
44 |
+
|
45 |
+
`TEXT` can contain newlines, in which case it'll be treated the same
|
46 |
+
way as if each line were sent to the room separately.
|
47 |
+
|
48 |
+
A partial list of available commands can be found with `/help`.
|
49 |
+
|
50 |
+
To log in, look at the documentation for the `|challstr|` server message.
|
51 |
+
|
52 |
+
|
53 |
+
Server-to-client messages
|
54 |
+
-------------------------
|
55 |
+
|
56 |
+
Messages from the server to the user are in the form:
|
57 |
+
|
58 |
+
>ROOMID
|
59 |
+
MESSAGE
|
60 |
+
MESSAGE
|
61 |
+
MESSAGE
|
62 |
+
...
|
63 |
+
|
64 |
+
`>ROOMID` and the newline after it can be omitted if the room is lobby
|
65 |
+
or global. `MESSAGE` cannot start with `>`, so it's unambiguous whether
|
66 |
+
or not `>ROOMID` has been omitted.
|
67 |
+
|
68 |
+
As for the payload: it's made of any number of blocks of data
|
69 |
+
separated by newlines; empty lines should be ignored. In particular,
|
70 |
+
it should be treated the same way whether or not it ends in a
|
71 |
+
newline, and if the payload is empty, the entire message should be ignored.
|
72 |
+
|
73 |
+
If `MESSAGE` doesn't start with `|`, it should be shown directly in the
|
74 |
+
room's log. Otherwise, it will be in the form:
|
75 |
+
|
76 |
+
|TYPE|DATA
|
77 |
+
|
78 |
+
For example:
|
79 |
+
|
80 |
+
|j| Some dude
|
81 |
+
|c|@Moderator|hi!
|
82 |
+
|c| Some dude|you suck and i hate you!
|
83 |
+
Some dude was banned by Moderator.
|
84 |
+
|l| Some dude
|
85 |
+
|b|battle-ou-12| Cool guy|@Moderator
|
86 |
+
|
87 |
+
This might be displayed as:
|
88 |
+
|
89 |
+
Some dude joined.
|
90 |
+
@Moderator: hi!
|
91 |
+
Some dude: you suck and i hate you!
|
92 |
+
Some dude was banned by Moderator.
|
93 |
+
Some dude left.
|
94 |
+
OU battle started between Cool guy and Moderator
|
95 |
+
|
96 |
+
For bandwidth reasons, five of the message types - `chat`, `join`, `leave`,
|
97 |
+
`name`, and `battle` - are sometimes abbreviated to `c`, `j`, `l`, `n`,
|
98 |
+
and `b` respectively. All other message types are written out in full so they
|
99 |
+
should be easy to understand.
|
100 |
+
|
101 |
+
Four of these can be uppercase: `J`, `L`, `N`, and `B`, which are
|
102 |
+
the equivalent of their lowercase versions, but are recommended not to be
|
103 |
+
displayed inline because they happen too often. For instance, the main server
|
104 |
+
gets around 5 joins/leaves a second, and showing that inline with chat would
|
105 |
+
make it near-impossible to chat.
|
106 |
+
|
107 |
+
|
108 |
+
Server-to-client message types
|
109 |
+
------------------------------
|
110 |
+
|
111 |
+
`USER` = a user, the first character being their rank (users with no rank are
|
112 |
+
represented by a space), and the rest of the string being their username.
|
113 |
+
|
114 |
+
### Room initialization
|
115 |
+
|
116 |
+
`|init|ROOMTYPE`
|
117 |
+
|
118 |
+
> The first message received from a room when you join it. `ROOMTYPE` is
|
119 |
+
> one of: `chat` or `battle`
|
120 |
+
|
121 |
+
`|title|TITLE`
|
122 |
+
|
123 |
+
> `TITLE` is the title of the room. The title is _not_ guaranteed to resemble
|
124 |
+
> the room ID; for instance, room `battle-gen7uu-779767714` could have title
|
125 |
+
> `Alice vs. Bob`.
|
126 |
+
|
127 |
+
`|users|USERLIST`
|
128 |
+
|
129 |
+
> `USERLIST` is a comma-separated list of `USER`s, sent from chat rooms when
|
130 |
+
> they're joined. Optionally, a `USER` can end in `@` followed by a user status message.
|
131 |
+
> A `STATUS` starting in `!` indicates the user is away.
|
132 |
+
|
133 |
+
### Room messages
|
134 |
+
|
135 |
+
`||MESSAGE` or `MESSAGE`
|
136 |
+
|
137 |
+
> We received a message `MESSAGE`, which should be displayed directly in
|
138 |
+
> the room's log.
|
139 |
+
|
140 |
+
`|html|HTML`
|
141 |
+
|
142 |
+
> We received an HTML message, which should be sanitized and displayed
|
143 |
+
> directly in the room's log.
|
144 |
+
|
145 |
+
`|uhtml|NAME|HTML`
|
146 |
+
|
147 |
+
> We recieved an HTML message (NAME) that can change what it's displaying,
|
148 |
+
> this is used in things like our Polls system, for example.
|
149 |
+
|
150 |
+
`|uhtmlchange|NAME|HTML`
|
151 |
+
|
152 |
+
> Changes the HTML display of the `|uhtml|` message named (NAME).
|
153 |
+
|
154 |
+
`|join|USER`, `|j|USER`, or `|J|USER`
|
155 |
+
|
156 |
+
> `USER` joined the room. Optionally, `USER` may be appended with `@!` to
|
157 |
+
> indicate that the user is away or busy.
|
158 |
+
|
159 |
+
`|leave|USER`, `|l|USER`, or `|L|USER`
|
160 |
+
|
161 |
+
> `USER` left the room.
|
162 |
+
|
163 |
+
`|name|USER|OLDID`, `|n|USER|OLDID`, or `|N|USER|OLDID`
|
164 |
+
|
165 |
+
> A user changed name to `USER`, and their previous userid was `OLDID`.
|
166 |
+
> Optionally, `USER` may be appended with `@!` to indicate that the user is
|
167 |
+
> away or busy.
|
168 |
+
|
169 |
+
`|chat|USER|MESSAGE` or `|c|USER|MESSAGE`
|
170 |
+
|
171 |
+
> `USER` said `MESSAGE`. Note that `MESSAGE` can contain `|` characters,
|
172 |
+
> so you can't just split by `|` and take the fourth string.
|
173 |
+
>
|
174 |
+
> If `MESSAGE` starts with `/`, it is a special message. For instance,
|
175 |
+
> `/me TEXT` or `/announce TEXT` or `/uhtml HTML`. A lot of these message
|
176 |
+
> types are abused to embed protocol messages in PMs (for instance, `/uhtml`
|
177 |
+
> is a stopgap before the client is rewritten to support `|uhtml|` etc in
|
178 |
+
> PMs).
|
179 |
+
>
|
180 |
+
> If the server wants clients to actually render a message starting with
|
181 |
+
> `/`, it will send a message starting with `//` (exactly like how users
|
182 |
+
> need to send those messages).
|
183 |
+
|
184 |
+
`|notify|TITLE|MESSAGE`
|
185 |
+
|
186 |
+
> Send a notification with `TITLE` and `MESSAGE` (usually, `TITLE` will be
|
187 |
+
> bold, and `MESSAGE` is optional).
|
188 |
+
|
189 |
+
`|notify|TITLE|MESSAGE|HIGHLIGHTTOKEN`
|
190 |
+
|
191 |
+
> Send a notification as above, but only if the user would be notified
|
192 |
+
> by a chat message containing `HIGHLIGHTTOKEN` (i.e. if `HIGHLIGHTTOKEN`
|
193 |
+
> contains words added to `/highlight`, or their username by default.)
|
194 |
+
|
195 |
+
`|:|TIMESTAMP`
|
196 |
+
|
197 |
+
`|c:|TIMESTAMP|USER|MESSAGE`
|
198 |
+
|
199 |
+
> `c:` is pretty much the same as `c`, but also comes with a UNIX timestamp;
|
200 |
+
> (the number of seconds since 1970). This is used for accurate timestamps
|
201 |
+
> in chat logs.
|
202 |
+
>
|
203 |
+
> `:` is the current time according to the server, so that times can be
|
204 |
+
> adjusted and reported in the local time in the case of a discrepancy.
|
205 |
+
>
|
206 |
+
> The exact fate of this command is uncertain - it may or may not be
|
207 |
+
> replaced with a more generalized way to transmit timestamps at some point.
|
208 |
+
|
209 |
+
`|battle|ROOMID|USER1|USER2` or `|b|ROOMID|USER1|USER2`
|
210 |
+
|
211 |
+
> A battle started between `USER1` and `USER2`, and the battle room has
|
212 |
+
> ID `ROOMID`.
|
213 |
+
|
214 |
+
### Global messages
|
215 |
+
|
216 |
+
`|popup|MESSAGE`
|
217 |
+
|
218 |
+
> Show the user a popup containing `MESSAGE`. `||` denotes a newline in
|
219 |
+
> the popup.
|
220 |
+
|
221 |
+
`|pm|SENDER|RECEIVER|MESSAGE`
|
222 |
+
|
223 |
+
> A PM was sent from `SENDER` to `RECEIVER` containing the message
|
224 |
+
> `MESSAGE`.
|
225 |
+
|
226 |
+
`|usercount|USERCOUNT`
|
227 |
+
|
228 |
+
> `USERCOUNT` is the number of users on the server.
|
229 |
+
|
230 |
+
`|nametaken|USERNAME|MESSAGE`
|
231 |
+
|
232 |
+
> You tried to change your username to `USERNAME` but it failed for the
|
233 |
+
> reason described in `MESSAGE`.
|
234 |
+
|
235 |
+
`|challstr|CHALLSTR`
|
236 |
+
|
237 |
+
> You just connected to the server, and we're giving you some information you'll need to log in.
|
238 |
+
>
|
239 |
+
> If you're already logged in and have session cookies, you can make an HTTP GET request to
|
240 |
+
> `https://play.pokemonshowdown.com/api/upkeep?challstr=CHALLSTR`
|
241 |
+
>
|
242 |
+
> Otherwise, you'll need to make an HTTP POST request to `https://play.pokemonshowdown.com/api/login`
|
243 |
+
> with the data `name=USERNAME&pass=PASSWORD&challstr=CHALLSTR`
|
244 |
+
>
|
245 |
+
> `USERNAME` is your username and `PASSWORD` is your password, and `CHALLSTR`
|
246 |
+
> is the value you got from `|challstr|`. Note that `CHALLSTR` contains `|`
|
247 |
+
> characters. (Also feel free to make the request to `https://` if your client
|
248 |
+
> supports it.)
|
249 |
+
>
|
250 |
+
> Either way, the response will start with `]` and be followed by a JSON
|
251 |
+
> object which we'll call `data`.
|
252 |
+
>
|
253 |
+
> Finish logging in (or renaming) by sending: `/trn USERNAME,0,ASSERTION`
|
254 |
+
> where `USERNAME` is your desired username and `ASSERTION` is `data.assertion`.
|
255 |
+
|
256 |
+
`|updateuser|USER|NAMED|AVATAR|SETTINGS`
|
257 |
+
|
258 |
+
> Your name, avatar or settings were successfully changed. Your rank and
|
259 |
+
> username are now `USER`. Optionally, `USER` may be appended with `@!` to
|
260 |
+
> indicate that you are away or busy.`NAMED` will be `0` if you are a guest
|
261 |
+
> or `1` otherwise. Your avatar is now `AVATAR`. `SETTINGS` is a JSON object
|
262 |
+
> representing the current state of various user settings.
|
263 |
+
|
264 |
+
`|formats|FORMATSLIST`
|
265 |
+
|
266 |
+
> This server supports the formats specified in `FORMATSLIST`. `FORMATSLIST`
|
267 |
+
> is a `|`-separated list of `FORMAT`s. `FORMAT` is a format name with one or
|
268 |
+
> more of these suffixes: `,#` if the format uses random teams, `,,` if the
|
269 |
+
> format is only available for searching, and `,` if the format is only
|
270 |
+
> available for challenging.
|
271 |
+
> Sections are separated by two vertical bars with the number of the column of
|
272 |
+
> that section prefixed by `,` in it. After that follows the name of the
|
273 |
+
> section and another vertical bar.
|
274 |
+
|
275 |
+
`|updatesearch|JSON`
|
276 |
+
|
277 |
+
> `JSON` is a JSON object representing the current state of what battles the
|
278 |
+
> user is currently searching for.
|
279 |
+
|
280 |
+
`|updatechallenges|JSON`
|
281 |
+
|
282 |
+
> `JSON` is a JSON object representing the current state of who the user
|
283 |
+
> is challenging and who is challenging the user.
|
284 |
+
|
285 |
+
`|queryresponse|QUERYTYPE|JSON`
|
286 |
+
|
287 |
+
> `JSON` is a JSON object representing containing the data that was requested
|
288 |
+
> with `/query QUERYTYPE` or `/query QUERYTYPE DETAILS`.
|
289 |
+
>
|
290 |
+
> Possible queries include `/query roomlist` and `/query userdetails USERNAME`.
|
291 |
+
|
292 |
+
### Tournament messages
|
293 |
+
|
294 |
+
`|tournament|create|FORMAT|GENERATOR|PLAYERCAP`
|
295 |
+
|
296 |
+
> `FORMAT` is the name of the format in which each battle will be played.
|
297 |
+
> `GENERATOR` is either `Elimination` or `Round Robin` and describes the
|
298 |
+
> type of bracket that will be used. `Elimination` includes a prefix
|
299 |
+
> that denotes the number of times a player can lose before being
|
300 |
+
> eliminated (`Single`, `Double`, etc.). `Round Robin` includes the
|
301 |
+
> prefix `Double` if every matchup will battle twice.
|
302 |
+
> `PLAYERCAP` is a number representing the maximum amount of players
|
303 |
+
> that can join the tournament or `0` if no cap was specified.
|
304 |
+
|
305 |
+
`|tournament|update|JSON`
|
306 |
+
|
307 |
+
> `JSON` is a JSON object representing the changes in the tournament
|
308 |
+
> since the last update you recieved or the start of the tournament.
|
309 |
+
> These include:
|
310 |
+
>
|
311 |
+
format: the tournament's custom name or the format being used
|
312 |
+
teambuilderFormat: the format being used; sent if a custom name was set
|
313 |
+
isStarted: whether or not the tournament has started
|
314 |
+
isJoined: whether or not you have joined the tournament
|
315 |
+
generator: the type of bracket being used by the tournament
|
316 |
+
playerCap: the player cap that was set or 0 if it was removed
|
317 |
+
bracketData: an object representing the current state of the bracket
|
318 |
+
challenges: a list of opponents that you can currently challenge
|
319 |
+
challengeBys: a list of opponents that can currently challenge you
|
320 |
+
challenged: the name of the opponent that has challenged you
|
321 |
+
challenging: the name of the opponent that you are challenging
|
322 |
+
|
323 |
+
`|tournament|updateEnd`
|
324 |
+
|
325 |
+
> Signals the end of an update period.
|
326 |
+
|
327 |
+
`|tournament|error|ERROR`
|
328 |
+
|
329 |
+
> An error of type `ERROR` occurred.
|
330 |
+
|
331 |
+
`|tournament|forceend`
|
332 |
+
|
333 |
+
> The tournament was forcibly ended.
|
334 |
+
|
335 |
+
`|tournament|join|USER`
|
336 |
+
|
337 |
+
> `USER` joined the tournament.
|
338 |
+
|
339 |
+
`|tournament|leave|USER`
|
340 |
+
|
341 |
+
> `USER` left the tournament.
|
342 |
+
|
343 |
+
`|tournament|replace|OLD|NEW`
|
344 |
+
|
345 |
+
> The player `OLD` has been replaced with `NEW`
|
346 |
+
|
347 |
+
`|tournament|start|NUMPLAYERS`
|
348 |
+
|
349 |
+
> The tournament started with `NUMPLAYERS` participants.
|
350 |
+
|
351 |
+
`|tournament|replace|USER1|USER2`
|
352 |
+
|
353 |
+
> `USER1` was replaced by `USER2`.
|
354 |
+
|
355 |
+
`|tournament|disqualify|USER`
|
356 |
+
|
357 |
+
> `USER` was disqualified from the tournament.
|
358 |
+
|
359 |
+
`|tournament|battlestart|USER1|USER2|ROOMID`
|
360 |
+
|
361 |
+
> A tournament battle started between `USER1` and `USER2`, and the battle room
|
362 |
+
> has ID `ROOMID`.
|
363 |
+
|
364 |
+
`|tournament|battleend|USER1|USER2|RESULT|SCORE|RECORDED|ROOMID`
|
365 |
+
|
366 |
+
> The tournament battle between `USER1` and `USER2` in the battle room `ROOMID` ended.
|
367 |
+
> `RESULT` describes the outcome of the battle from `USER1`'s perspective
|
368 |
+
> (`win`, `loss`, or `draw`). `SCORE` is an array of length 2 that denotes the
|
369 |
+
> number of Pokemon `USER1` had left and the number of Pokemon `USER2` had left.
|
370 |
+
> `RECORDED` will be `fail` if the battle ended in a draw and the bracket type does
|
371 |
+
> not support draws. Otherwise, it will be `success`.
|
372 |
+
|
373 |
+
`|tournament|end|JSON`
|
374 |
+
|
375 |
+
> The tournament ended. `JSON` is a JSON object containing:
|
376 |
+
>
|
377 |
+
results: the name(s) of the winner(s) of the tournament
|
378 |
+
format: the tournament's custom name or the format that was used
|
379 |
+
generator: the type of bracket that was used by the tournament
|
380 |
+
bracketData: an object representing the final state of the bracket
|
381 |
+
|
382 |
+
`|tournament|scouting|SETTING`
|
383 |
+
|
384 |
+
> Players are now either allowed or not allowed to join other tournament
|
385 |
+
> battles based on `SETTING` (`allow` or `disallow`).
|
386 |
+
|
387 |
+
`|tournament|autostart|on|TIMEOUT`
|
388 |
+
|
389 |
+
> A timer was set for the tournament to auto-start in `TIMEOUT` seconds.
|
390 |
+
|
391 |
+
`|tournament|autostart|off`
|
392 |
+
|
393 |
+
> The timer for the tournament to auto-start was turned off.
|
394 |
+
|
395 |
+
`|tournament|autodq|on|TIMEOUT`
|
396 |
+
|
397 |
+
> A timer was set for the tournament to auto-disqualify inactive players
|
398 |
+
> every `TIMEOUT` seconds.
|
399 |
+
|
400 |
+
`|tournament|autodq|off`
|
401 |
+
|
402 |
+
> The timer for the tournament to auto-disqualify inactive players was
|
403 |
+
> turned off.
|
404 |
+
|
405 |
+
`|tournament|autodq|target|TIME`
|
406 |
+
|
407 |
+
> You have `TIME` seconds to make or accept a challenge, or else you will be
|
408 |
+
> disqualified for inactivity.
|
409 |
+
|
410 |
+
|
411 |
+
Battles
|
412 |
+
-------
|
413 |
+
|
414 |
+
### Playing battles
|
415 |
+
|
416 |
+
Battle rooms will have a mix of room messages and battle messages. [Battle
|
417 |
+
messages are documented in `SIM-PROTOCOL.md`][sim-protocol].
|
418 |
+
|
419 |
+
[sim-protocol]: ./sim/SIM-PROTOCOL.md
|
420 |
+
|
421 |
+
To make decisions in battle, players should use the `/choose` command,
|
422 |
+
[also documented in `SIM-PROTOCOL.md`][sending-decisions].
|
423 |
+
|
424 |
+
[sending-decisions]: ./sim/SIM-PROTOCOL.md#sending-decisions
|
425 |
+
|
426 |
+
### Starting battles through challenges
|
427 |
+
|
428 |
+
`|updatechallenges|JSON`
|
429 |
+
|
430 |
+
> `JSON` is a JSON object representing the current state of who the user
|
431 |
+
> is challenging and who is challenging the user. You'll get this whenever
|
432 |
+
> challenges update (when you challenge someone, when you receive a challenge,
|
433 |
+
> when you or someone you challenged accepts/rejects/cancels a challenge).
|
434 |
+
|
435 |
+
`JSON.challengesFrom` will be a `{userid: format}` table of received
|
436 |
+
challenges.
|
437 |
+
|
438 |
+
`JSON.challengeTo` will be a challenge if you're challenging someone, or `null`
|
439 |
+
if you haven't.
|
440 |
+
|
441 |
+
If you are challenging someone, `challengeTo` will be in the format:
|
442 |
+
`{"to":"player1","format":"gen7randombattle"}`.
|
443 |
+
|
444 |
+
To challenge someone, send:
|
445 |
+
|
446 |
+
/utm TEAM
|
447 |
+
/challenge USERNAME, FORMAT
|
448 |
+
|
449 |
+
To cancel a challenge you made to someone, send:
|
450 |
+
|
451 |
+
/cancelchallenge USERNAME
|
452 |
+
|
453 |
+
To reject a challenge you received from someone, send:
|
454 |
+
|
455 |
+
/reject USERNAME
|
456 |
+
|
457 |
+
To accept a challenge you received from someone, send:
|
458 |
+
|
459 |
+
/utm TEAM
|
460 |
+
/accept USERNAME
|
461 |
+
|
462 |
+
Teams are in [packed format](./sim/TEAMS.md#packed-format). `TEAM` can also be
|
463 |
+
`null`, if the format doesn't require user-built teams, such as Random Battle.
|
464 |
+
|
465 |
+
Invalid teams will send a `|popup|` with validation errors, and the `/accept`
|
466 |
+
or `/challenge` command won't take effect.
|
467 |
+
|
468 |
+
If the challenge is accepted, you will receive a room initialization message.
|
469 |
+
|
470 |
+
### Starting battles through laddering
|
471 |
+
|
472 |
+
`|updatesearch|JSON`
|
473 |
+
|
474 |
+
> `JSON` is a JSON object representing the current state of what battles the
|
475 |
+
> user is currently searching for. You'll get this whenever searches update
|
476 |
+
> (when you search, cancel a search, or you start or end a battle)
|
477 |
+
|
478 |
+
`JSON.searching` will be an array of format IDs you're currently searching for
|
479 |
+
games in.
|
480 |
+
|
481 |
+
`JSON.games` will be a `{roomid: title}` table of games you're currently in.
|
482 |
+
Note that this includes ALL games, so `|updatesearch|` will be sent when you
|
483 |
+
start/end challenge battles, and even non-Pokémon games like Mafia.
|
484 |
+
|
485 |
+
To search for a battle against a random opponent, send:
|
486 |
+
|
487 |
+
/utm TEAM
|
488 |
+
/search FORMAT
|
489 |
+
|
490 |
+
Teams are in packed format (see "Team format" below). `TEAM` can also be
|
491 |
+
`null`, if the format doesn't require user-built teams, such as Random Battle.
|
492 |
+
|
493 |
+
To cancel searching, send:
|
494 |
+
|
495 |
+
/cancelsearch
|
496 |
+
|
497 |
+
### Team format
|
498 |
+
|
499 |
+
Pokémon Showdown always sends teams over the protocol in packed format. For
|
500 |
+
details about how to convert and read this format, see [sim/TEAMS.md](./sim/TEAMS.md).
|
501 |
+
|
502 |
+
If you're not using JavaScript and don't want to reimplement these conversions,
|
503 |
+
[Pokémon Showdown's command-line client](./COMMANDLINE.md) can convert between
|
504 |
+
packed teams and JSON using standard IO.
|
Procfile
ADDED
@@ -0,0 +1 @@
|
|
|
|
|
1 |
+
web: node pokemon-showdown $PORT
|
build
ADDED
@@ -0,0 +1,54 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#!/usr/bin/env node
|
2 |
+
"use strict";
|
3 |
+
|
4 |
+
try {
|
5 |
+
// technically this was introduced in Node 17, but we'll ask for the most recent LTS with it to be safe
|
6 |
+
structuredClone({});
|
7 |
+
} catch (e) {
|
8 |
+
console.log("We require Node.js version 18 or later; you're using " + process.version);
|
9 |
+
process.exit(1);
|
10 |
+
}
|
11 |
+
|
12 |
+
var child_process = require('child_process');
|
13 |
+
var fs = require('fs');
|
14 |
+
var decl = ['--decl', 'decl'].includes(process.argv[2]);
|
15 |
+
var force = decl || ['--force', 'force', '--full', 'full'].includes(process.argv[2]);
|
16 |
+
|
17 |
+
process.chdir(__dirname);
|
18 |
+
|
19 |
+
function shell(cmd) {
|
20 |
+
child_process.execSync(cmd, {stdio: 'inherit'});
|
21 |
+
}
|
22 |
+
|
23 |
+
// Check to make sure the most recently added or updated dependency is installed at the correct version
|
24 |
+
try {
|
25 |
+
var version = require('esbuild').version.split('.');
|
26 |
+
if (parseInt(version[1]) < 16) {
|
27 |
+
throw new Error("esbuild version too old");
|
28 |
+
}
|
29 |
+
} catch (e) {
|
30 |
+
console.log('Installing dependencies...');
|
31 |
+
shell('npm install');
|
32 |
+
}
|
33 |
+
|
34 |
+
// Make sure config.js exists. If not, copy it over synchronously from
|
35 |
+
// config-example.js, since it's needed before we can start the server
|
36 |
+
try {
|
37 |
+
require.resolve('./config/config');
|
38 |
+
} catch (err) {
|
39 |
+
if (err.code !== 'MODULE_NOT_FOUND') throw err; // should never happen
|
40 |
+
|
41 |
+
console.log('config.js does not exist. Creating one with default settings...');
|
42 |
+
fs.writeFileSync(
|
43 |
+
'config/config.js',
|
44 |
+
fs.readFileSync('config/config-example.js')
|
45 |
+
);
|
46 |
+
}
|
47 |
+
|
48 |
+
// for some reason, esbuild won't be requirable until a tick has passed
|
49 |
+
// see https://stackoverflow.com/questions/53270058/node-cant-find-certain-modules-after-synchronous-install
|
50 |
+
setImmediate(() => {
|
51 |
+
// npm package, don't rebuild
|
52 |
+
if (process.argv[2] === 'postinstall' && fs.existsSync('dist')) return;
|
53 |
+
require('./tools/build-utils').transpile(force, decl);
|
54 |
+
});
|
config/CUSTOM-RULES.md
ADDED
@@ -0,0 +1,347 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
Custom Rules
|
2 |
+
============
|
3 |
+
|
4 |
+
Pokémon Showdown supports custom rules in three ways:
|
5 |
+
|
6 |
+
- Challenging another user, using the command `/challenge USERNAME, FORMAT @@@ RULES`
|
7 |
+
|
8 |
+
- Tournaments, using the command `/tour rules RULES` (see the [Tournament command help][tour-help])
|
9 |
+
|
10 |
+
- Custom formats on your side server, by editing `config/formats.ts`
|
11 |
+
|
12 |
+
[tour-help]: https://www.smogon.com/forums/threads/pok%C3%A9mon-showdown-forum-rules-resources-read-here-first.3570628/#post-6777489
|
13 |
+
|
14 |
+
|
15 |
+
Bans
|
16 |
+
----
|
17 |
+
|
18 |
+
Bans are just a `-` followed by the thing you want to ban.
|
19 |
+
|
20 |
+
### Individual bans
|
21 |
+
|
22 |
+
`- Arceus` - ban a Pokémon (including all formes)
|
23 |
+
|
24 |
+
`- Arceus-Flying` or `- Giratina-Altered` - ban a specific Pokémon forme
|
25 |
+
|
26 |
+
`- Giratina-Base` - ban only the base forme of a Pokémon (this always works, in case you forget it's called `- Giratina-Altered`)
|
27 |
+
|
28 |
+
`- Baton Pass` - ban a move
|
29 |
+
|
30 |
+
`- move: Metronome` - ban a move with an ambiguous name
|
31 |
+
|
32 |
+
`- Bright Powder` - ban an item
|
33 |
+
|
34 |
+
`- item: Metronome` - ban an item with an ambiguous name
|
35 |
+
|
36 |
+
### Group bans
|
37 |
+
|
38 |
+
`- OU` or `- DUU` - ban a tier
|
39 |
+
|
40 |
+
`- CAP` or `- Mega` - ban a pokemon category
|
41 |
+
|
42 |
+
`- LGPE` - ban things only available Let's Ge Pikachu/Eevee
|
43 |
+
|
44 |
+
`- Past` - ban things that only appear in a past generation (such as Berserk Gene in Gen 5, spiky-eared Pichu in Gen 5, or Unown in Gen 8)
|
45 |
+
|
46 |
+
`- Future` - ban things that only appears in a future generation (such as Arceus in Gen 1)
|
47 |
+
|
48 |
+
`- Custom` - ban made-up things other than CAP (such as Magikarp's Revenge, or Staff Bros moves)
|
49 |
+
|
50 |
+
`- Nonexistent` - catch-all to ban all nonexistent Pokémon, items, etc. Includes: `- CAP, - Past, - Future, - LGPE`
|
51 |
+
|
52 |
+
`- Unobtainable` - ban all things designed never to be released (Pokestars in Gen 5, Eternatus-E, Floette-E)
|
53 |
+
|
54 |
+
`- Unreleased` - ban all things that will probably be released eventually (Venusaur in Gen 8)
|
55 |
+
|
56 |
+
`- Mythical` - ban all Mythical Pokémon (such as Mew, Celebi)
|
57 |
+
|
58 |
+
`- Restricted Legendary` - ban all Restricted Legendary Pokémon (such as Zekrom, Eternatus)
|
59 |
+
|
60 |
+
`- all items` - ban all items
|
61 |
+
|
62 |
+
`- no item` - force every pokemon to hold an item (ban empty item slots)
|
63 |
+
|
64 |
+
`- all abilities, + No Ability` - ban all abilities (No Ability needs to be specifically allowed to allow Pokemon with no abilities)
|
65 |
+
|
66 |
+
### Complex bans
|
67 |
+
|
68 |
+
`- Blaziken + Speed Boost` - ban a combination of things in a single Pokemon (you can have a Blaziken, and you can have Speed Boost on the same team, but the Blaziken can't have Speed Boost)
|
69 |
+
|
70 |
+
`- Drizzle ++ Swift Swim` - ban a combination of things in a team (if any Pokémon on your team have Drizzle, no Pokémon can have Swift Swim)
|
71 |
+
|
72 |
+
|
73 |
+
Unbans
|
74 |
+
------
|
75 |
+
|
76 |
+
Unbans are just a `+` followed by the thing you want to unban.
|
77 |
+
|
78 |
+
Syntax is identical to bans, just replace `-` with `+`, like:
|
79 |
+
|
80 |
+
`+ Blaziken` - unban a Pokémon
|
81 |
+
|
82 |
+
`+ Past` - unban all past-generation-only things
|
83 |
+
|
84 |
+
More specific always trumps less specific:
|
85 |
+
|
86 |
+
`- all Pokemon, + Uber, - Giratina, + Giratina-Altered` - allow only Ubers other than Giratina-Origin
|
87 |
+
|
88 |
+
`- Nonexistent, + Necturna` - don't allow anything from outside the game, except the CAP Necturna
|
89 |
+
|
90 |
+
For equally specific rules, the last rule wins:
|
91 |
+
|
92 |
+
`- Pikachu, - Pikachu, + Pikachu` - allow Pikachu
|
93 |
+
|
94 |
+
`+ Pikachu, - Pikachu, + Pikachu, - Pikachu` - ban Pikachu
|
95 |
+
|
96 |
+
|
97 |
+
Restrictions
|
98 |
+
------------
|
99 |
+
|
100 |
+
Some rules act on restricted things, without entirely banning or unbanning them. `*` is used to mark something that is restricted (it will simultaneously be unbanned).
|
101 |
+
|
102 |
+
`* Uber, Limit One Restricted` - allow at most one Uber-tiered Pokémon on a team
|
103 |
+
|
104 |
+
`* Restricted Legendary, Limit Two Restricted` - allow at most two restricted legendaries on a team
|
105 |
+
|
106 |
+
Marking something as restricted with `*` does nothing by itself, you need to combine it with a rule that affects restricted things, such as `Limit One Restricted`.
|
107 |
+
|
108 |
+
Other examples include:
|
109 |
+
|
110 |
+
- Cross Evolution: Restricting a species prevents it from being the target of a cross evolution. (Ban a species to prevent it from being the base of a cross evolution.)
|
111 |
+
- Mix and Mega: Restricting a species prevents that Pokémon from holding a mega stone. (Ban a stone to prevent all Pokémon from holding it.)
|
112 |
+
- Inheritance: Restricting a species prevents it from being inherited from. (Ban a species to prevent it from inheriting from another species.)
|
113 |
+
- Trademarked: Restricting a move prevents it from being used as a trademark, but the move can still appear in a moveset.
|
114 |
+
|
115 |
+
Restriction rules are used to adjust the behaviour of the above metagames. The syntax is identical to bans, just replace `-` with `*`, like:
|
116 |
+
|
117 |
+
`* Blaziken` - restrict a Pokémon
|
118 |
+
|
119 |
+
`* Uber` - restrict a group of Pokémon
|
120 |
+
|
121 |
+
`* Baton Pass` - restrict a move
|
122 |
+
|
123 |
+
An unban (`+`) will remove a restriction.
|
124 |
+
|
125 |
+
|
126 |
+
Whitelisting
|
127 |
+
------------
|
128 |
+
|
129 |
+
Instead of a banlist, you can have a list of allowed things:
|
130 |
+
|
131 |
+
`- all Pokemon, + Charmander, + Squirtle, + Bulbasaur` - allow only Kanto starters
|
132 |
+
|
133 |
+
`- all moves, + move: Metronome` - allow only the move Metronome
|
134 |
+
|
135 |
+
`- all abilities, + No Ability` - ban all abilities
|
136 |
+
|
137 |
+
`- all items, + item: Metronome` - allow only the item Metronome
|
138 |
+
|
139 |
+
`- all items, - no item, + item: Metronome` - force all Pokémon to carry the item Metronome (unlike abilities, `- all items` does not include not carrying an item)
|
140 |
+
|
141 |
+
|
142 |
+
Legality rules
|
143 |
+
--------------
|
144 |
+
|
145 |
+
Custom rules can have more complicated behavior. They can also include other rules.
|
146 |
+
|
147 |
+
### Obtainability rules
|
148 |
+
|
149 |
+
`Obtainable` - allow only things you can actually get in the game without glitches or hacks. Includes: `Obtainable Moves, Obtainable Abilities, Obtainable Formes, Obtainable Misc, -Unreleased, -Unobtainable, -Nonexistent`.
|
150 |
+
|
151 |
+
`Obtainable Moves` - allow only moves a pokemon can legitimately learn
|
152 |
+
|
153 |
+
`Obtainable Abilities` - allow only abilities a pokemon can naturally get (by itself, does not check unreleased abilities! use `-Unreleased` for that)
|
154 |
+
|
155 |
+
`Obtainable Formes` - don't allow starting the battle with formes that normally require an in-battle transformation (like megas) (does not check unreleased/nonexistent formes; use `-Nonexistent` etc)
|
156 |
+
|
157 |
+
`Obtainable Misc` - allow only legal EVs, IVs, levels, genders, and Hidden Power types
|
158 |
+
|
159 |
+
### Pokedex rules
|
160 |
+
|
161 |
+
`Hoenn Pokedex` - allow only Pokémon in the Hoenn Pokédex (OR/AS)
|
162 |
+
|
163 |
+
`Sinnoh Pokedex` - allow only Pokémon in the Sinnoh Pokédex (Platinum)
|
164 |
+
|
165 |
+
`Old Unova Pokedex` - allow only Pokémon in the Old Unova Pokédex (B/W)
|
166 |
+
|
167 |
+
`New Unova Pokedex` - allow only Pokémon in the New Unova Pokédex (B2/W2)
|
168 |
+
|
169 |
+
`Kalos Pokedex` - allow only Pokémon in the Kalos Pokédex (X/Y)
|
170 |
+
|
171 |
+
`Alola Pokedex` - allow only Pokémon in the Alola Pokédex (US/UM)
|
172 |
+
|
173 |
+
`Galar Pokedex` - allow only Pokémon in the Galar Pokédex (SW/SH) [Ban Pokémon you can catch in the adventures but are not listed in the Pokédex like Ultra Beasts and Landorus]
|
174 |
+
|
175 |
+
### Clauses
|
176 |
+
|
177 |
+
`Species Clause` - limit one Pokémon per dex number
|
178 |
+
|
179 |
+
`Nickname Clause` - limit one Pokémon per nickname
|
180 |
+
|
181 |
+
`Item Clause` - no two Pokémon can have the same item
|
182 |
+
|
183 |
+
`2 Ability Clause` - limit two Pokémon with the same ability
|
184 |
+
|
185 |
+
`OHKO Clause` - ban one-hit KO moves (Fissure, Sheer Cold, etc)
|
186 |
+
|
187 |
+
`Evasion Moves Clause` - ban moves that directly boost evasion (Double Team, Minimize)
|
188 |
+
|
189 |
+
`Evasion Abilities Clause` - ban abilities that boost evasion (Sand Veil, Snow Cloak)
|
190 |
+
|
191 |
+
`Moody Clause` - ban the ability Moody
|
192 |
+
|
193 |
+
`Swagger Clause` - ban the move Swagger
|
194 |
+
|
195 |
+
`CFZ Clause` - ban the use of crystal-free Z-Moves (having moves like Devastating Drake hacked directly on the moveset in formats like Hackmons, instead of using Dragon Claw + Dragonium Z)
|
196 |
+
|
197 |
+
`Z-Move Clause` - ban Pokémon from holding Z-Crystals
|
198 |
+
|
199 |
+
`3 Baton Pass Clause` - prevent more than three Pokémon from having Baton Pass on a team
|
200 |
+
|
201 |
+
`Baton Pass Clause` - prevent more than one Pokémon from having Baton Pass, and prevent Pokémon from being capable of passing boosts in Speed and another stat at the same time.
|
202 |
+
|
203 |
+
`Accuracy Moves Clause` - ban moves that have a chance to lower the target's accuracy when used
|
204 |
+
|
205 |
+
`Same Type Clause` - force all Pokémon on a team to share a type with one another
|
206 |
+
|
207 |
+
`NFE Clause` - ban all Pokémon that are not fully evolved (Pokémon can be re-added manually by simply unbanning them)
|
208 |
+
|
209 |
+
`Forme Clause` - limit one of each forme of a Pokémon on a team (a team can have Zamazenta + Zamazenta-Crowned, but not Zamazenta + Zamazenta)
|
210 |
+
|
211 |
+
### Miscellaneous
|
212 |
+
|
213 |
+
`Allow AVs` - allow Pokémon to have their stats boosted by Awakening Values in Let's Go formats
|
214 |
+
|
215 |
+
`Allow Tradeback` - allow Pokémon in Gen 1 to have moves from their Gen 2 learnsets
|
216 |
+
|
217 |
+
`STABmons Move Legality` - allow Pokémon to have almost any move that matches their typing
|
218 |
+
|
219 |
+
`Little Cup` - allow only Pokémon that can evolve and aren't evolved
|
220 |
+
|
221 |
+
`Not Fully Evolved` - allow only Pokémon that aren't fully evolved
|
222 |
+
|
223 |
+
`Mimic Glitch` - allow Pokémon with access to Assist, Copycat, Metronome, Mimic, or Transform to gain access to almost any other move
|
224 |
+
|
225 |
+
|
226 |
+
Value rules
|
227 |
+
-----------
|
228 |
+
|
229 |
+
Certain rules can specify a value.
|
230 |
+
|
231 |
+
`Max Level = 50` - ban Pokémon above level 50
|
232 |
+
|
233 |
+
`Min Level = 10` - ban Pokémon below level 10
|
234 |
+
|
235 |
+
`Max Total Level = 200` - only allow Pokémon whose combined levels add up to 200 or below (if combined with `Picked Team Size`, only the picked team needs to be below that combined level)
|
236 |
+
|
237 |
+
`Max Move Count = 5` - you can bring Pokémon with up to 5 moves
|
238 |
+
|
239 |
+
`Max Team Size = 4` - you must bring a team with at most 4 pokemon (before Team Preview, in games with Team Preview)
|
240 |
+
|
241 |
+
`Min Team Size = 4` - you must bring a team with at least 4 pokemon (before Team Preview, in games with Team Preview)
|
242 |
+
|
243 |
+
`Picked Team Size = 4` - in Team Preview, you must pick exactly 4 pokemon (if this exists, `Min Team Size` will default to this number)
|
244 |
+
|
245 |
+
`Min Source Gen = 7` - only allow pokemon obtained in this generation or later
|
246 |
+
|
247 |
+
`Adjust Level = 50` - change all levels to 50, like in some in-game formats (unlike `Max Level`, this still allows moves learned above level 50)
|
248 |
+
|
249 |
+
`Adjust Level Down = 50` - change Pokémon with level above 50 to level 50 (but leave Pokémon below 50 alone), like in some in-game formats (unlike `Max Level`, this still allows moves learned above level 50)
|
250 |
+
|
251 |
+
`Force Monotype = Water` - require all Pokémon to be Water-type
|
252 |
+
|
253 |
+
`EV Limits = Atk 0-100 / Def 50-150` - require EVs to be in those ranges
|
254 |
+
|
255 |
+
|
256 |
+
In-battle rules
|
257 |
+
---------------
|
258 |
+
|
259 |
+
`Team Preview` - use Team Preview
|
260 |
+
|
261 |
+
`Blitz` - use the Blitz timer (30 second Team Preview, 10 seconds per turn)
|
262 |
+
|
263 |
+
`VGC Timer` - use the VGC timer (90 second Team Preview, 7 minutes Your Time, 1 minute per turn)
|
264 |
+
|
265 |
+
`Mega Rayquaza Clause` - prevent Rayquaza from Mega Evolving
|
266 |
+
|
267 |
+
`Sleep Clause Mod` - prevent Pokémon from falling asleep if they have sleeping allies
|
268 |
+
|
269 |
+
`Freeze Clause Mod` - prevent Pokémon from getting frozen if they have frozen allies
|
270 |
+
|
271 |
+
`Cancel Mod` - show the Cancel button and allow players to cancel their moves
|
272 |
+
|
273 |
+
`Inverse Mod` - inverse type effectiveness (like in Gen 6 Inverse Battles)
|
274 |
+
|
275 |
+
`Scalemons Mod` - Pokemon will have their base stats, barring HP, adjusted to make their BST as close to 600 as possible (in Gen 1, BSTs will be scaled to 500)
|
276 |
+
|
277 |
+
`Gen 8 Camomons` - Pokémon will change their typing to match their first two moveslots
|
278 |
+
|
279 |
+
`Gen 7 Tier Shift` - Pokémon will have higher base stats the lower their Gen 7 Smogon tier is
|
280 |
+
|
281 |
+
`Dynamax Clause` - prevent Pokémon from Dynamaxing during battle. Cannot be used to allow Dynamaxing in old gens
|
282 |
+
|
283 |
+
`Endless Battle Clause` - prevent battles from proceeding endlessly
|
284 |
+
|
285 |
+
`HP Percentage Mod` - Show the opposing Pokémon's HP rounded to the nearest percent, as opposed to a range of percentages based upon the health bar's size in-game
|
286 |
+
|
287 |
+
`Exact HP Mod` - Show all Pokémon's exact HP and max HP in the battle log
|
288 |
+
|
289 |
+
`Switch Priority Clause Mod` - make the fastest Pokémon switch first when more than one Pokémon switches out at once, unlike in Emerald link battles, where Player 1's Pokémon would switch first.
|
290 |
+
|
291 |
+
|
292 |
+
Standard Rulesets
|
293 |
+
-----------------
|
294 |
+
|
295 |
+
Note: Most formats already come with one standard ruleset. Removing and adding multiple standard rulesets in the same tournament is likely to have unintended results.
|
296 |
+
|
297 |
+
`Standard` - the standard ruleset for most Smogon singles formats. Includes the Evasion Moves Clause, Sleep Clause Mod, Species Clause, Nickname Clause, OHKO Clause, Endless Battle Clause, HP Percentage Mod, and Cancel Mod.
|
298 |
+
|
299 |
+
`Standard NEXT` - the standard ruleset for NEXT. Allows some unreleased Pokémon and includes the Evasion Moves Clause, Nickname Clause, Sleep Clause Mod, Species Clause, OHKO Clause, HP Percentage Mod, and Cancel Mod. Bans Soul Dew.
|
300 |
+
|
301 |
+
`Flat Rules` - the standard ruleset for in-game formats, such as Battle Spot. Includes Species Clause, Item Clause, Cancel Mod, Nickname Clause, and Team Preview. Bans mythical Pokémon and restricted legendaries (e.g. Zekrom, Reshiram, Zygarde, Eternatus)
|
302 |
+
|
303 |
+
`Standard NatDex` - the standard ruleset for National Dex formats. Allows the National Dex. Includes Nickname Clause, HP Percentage Mod, Cancel Mod, Endless Battle Clause.
|
304 |
+
|
305 |
+
`Standard Doubles` - the standard ruleset for most Smogon doubles formats. Includes Species Clause, Nickname Clause, OHKO Clause, Evasion Abilities Clause, Evasion Moves Clause, Endless Battle Clause, HP Percentage Mod, Cancel Mod.
|
306 |
+
|
307 |
+
|
308 |
+
Removing rules
|
309 |
+
--------------
|
310 |
+
|
311 |
+
Put `!` in front of a rule to remove it, like:
|
312 |
+
|
313 |
+
`! Team Preview` - do not use Team Preview
|
314 |
+
|
315 |
+
You can use this to remove individual parts of rules, like:
|
316 |
+
|
317 |
+
`Obtainable, ! Obtainable Moves` - require pokemon to be obtained legitimately, except for moves, which they can use whatever
|
318 |
+
|
319 |
+
For value rules, you just put `!` in front of the rule name, no `=`:
|
320 |
+
|
321 |
+
`Flat Rules, ! Picked Team Size` - use Flat Rules, but players can pick 6
|
322 |
+
|
323 |
+
To prevent mistakes, value rules can't be changed without being removed first. Use `!!` to remove and replace a value rule:
|
324 |
+
|
325 |
+
`Flat Rules, !! Picked Team Size = 5` - use Flat Rules, but players can pick 5
|
326 |
+
|
327 |
+
|
328 |
+
Multiple rules
|
329 |
+
--------------
|
330 |
+
|
331 |
+
In case you haven't figured it out from the rest of this page, you combine rules with a `,` (comma).
|
332 |
+
|
333 |
+
|
334 |
+
Tiers and Formats
|
335 |
+
-----------------
|
336 |
+
|
337 |
+
Any format (starting with `Gen [number]`) can be used as a rule, to add all rules from that format.
|
338 |
+
|
339 |
+
For example:
|
340 |
+
|
341 |
+
`Gen 8 OU` - add all clauses and bans from Gen 8 OU.
|
342 |
+
|
343 |
+
`Gen 8 Almost Any Ability` - add all clauses and bans from Gen 8 Almost Any Ability, allowing Pokémon to use almost any ability in the game.
|
344 |
+
|
345 |
+
People often use "tier" to mean "format", but in rulesets, the difference is important. A format is a list of rules for a game you can play, such as "Gen 8 OU". A tier is a list of Pokémon which can be banned or unbanned, such as "OU".
|
346 |
+
|
347 |
+
`- OU, + Ubers` - ban all Pokémon currently in OU and unban all Pokémon currently in Ubers
|
config/avatars.json
ADDED
@@ -0,0 +1 @@
|
|
|
|
|
1 |
+
{}
|
config/avatars/README.md
ADDED
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# Custom avatars directory
|
2 |
+
|
3 |
+
You can give your users custom avatars. Your server *must* be registered, or this won't work.
|
4 |
+
|
5 |
+
Put avatar files (80x80 PNG files) here, and then use the `/addavatar` command to give users access to them.
|
config/chat-plugins/README.md
ADDED
@@ -0,0 +1 @@
|
|
|
|
|
1 |
+
Chat plugin config files are stored in this directory.
|
config/chat-plugins/mafia-logs.json
ADDED
@@ -0,0 +1 @@
|
|
|
|
|
1 |
+
{"leaderboard":{"2/2025":{}},"mvps":{"2/2025":{}},"hosts":{"2/2025":{}},"plays":{"2/2025":{}},"leavers":{"2/2025":{}}}
|
config/chat-plugins/sample-teams.json
ADDED
@@ -0,0 +1 @@
|
|
|
|
|
1 |
+
{"whitelist":{},"teams":{}}
|
config/chat-plugins/seasons.json
ADDED
@@ -0,0 +1 @@
|
|
|
|
|
1 |
+
{"current":{"season":1,"year":2025,"formatsGeneratedAt":2025,"period":1},"formatSchedule":{"1":["randombattle","ou","ubers","pu","doublesou","monotype"],"2":["randombattle","ou","pu","uu","ru","doublesou"],"3":["randombattle","ou","nu","uu","lc","monotype"],"4":["randombattle","ou","lc","ru","nu","ubers"]},"badgeholders":{"1":{"gen9randombattle":{"gold":["reppalestine","wintersim","michaelderbeste2"],"silver":["horsearcherbrrr","paysa","jj09lie","therandomanno","ericjiang234","mylifeisdance","xoneshot7x","rampantasain","pokeblade101","woxihuanni","fazealecbaldwin","smokyaim","utahjasminefo","billgrahamcivic","hammy358","casualcynic","ruheim","gamer4905","norman2","moyagoku","whoistosay","cactuscrusader42","indeedeenerd","masteroden","marakiss","poly78xe","spoklegoat"],"bronze":["drifttrick","ptkmoekyuun","champfernape","emptybrackets","swagg1n","xox11108","ouffa","milotic2l","fillovcg","lechen","separation","fosdfo","driftchamber","pkvpokevin","folagoro19","chancechancechance","irongraf","guimd33","lupla","jaikido","shaky3","ventish12","portobellomushroom","sslimeyy","hallo15","honghoornstaart","bigbaz","nocomment3","lsylra","ghosty321","dunoks","revan2k01","100taka","ladywriter","bughouse","ampha","minhthuanpk","nashrock","yveltalnl","nickfang6","galacticwar","shynii21","zygarde12","applo","alwaysattack7g","pentav","doggoking104","xv196","bronzelmain","rofna","filippovcg","nickfang7","ggs1237","liet32120","lfc7","degamble","rnbellido","prime8","sebastiandingli","galak0","marrickchill","oldtoasterbread","ralilinsky","benji9292","owenscizor","clothlover","ducky1231","cfds","teresbahji","goundas05"]},"gen9ou":{"gold":["shikuleo","showdownfail","21bombs"],"silver":["landsharkjeff","volcanionisgrand","70to90gxe","outofeden","sayuzeinacut","irongender","aabbbee","posman","chenqt","jackreis","bbldrizzzy","crawmemaybe","mrbestww","meatthegrahams","smgs","johnnytots","fsstk2p46","wellthatdoesit","mhpb","setsustsna","miaotv","toowayrooney","sickovi","twolane","gt44","snakeprairie","ballerr"],"bronze":["2001civic","vosotrosustedes","connoreindustries","vouv","kmkmk3","metallowires","chicxulubcrater","duecesbiatch","uchiking","arrdamoin","k4ngr","gamer4905","losts0ulsmc","thehollo1","butts99999","monokommoo","pikasle","roaringmoonlight2","faronaan","itstetover","certifiedlovergirl","lightladdv2","gougingfan750","elpets","audiopeel","oughxuxa","tinkawer","yosaia","mydadsfavbastard","ounoob81","mcp3","bugfan5762","genauja","liliquu","freepalafine","nica4444","marklanders9","ganyunation","haihetian","2002falapin","lifewontchange","ejectingpack","bozodondozo","hyperpizza100","horsehunter","paternozzo","randomuser04","bvbjonas98","wintertorm","houndevourr","artistaaustriaco","asahisipper","omarip","hypervortex7","rbltryo","butterycrap","ashikaga","cerealgirl","bbutter","bizarman","miserablesong","youdecide","musicmakerz","quackborg","pannuracotta","namaenonaikaibutsu","goobiuscaesar","rathermoist","raindroppp","justifiedau"]},"gen9ubers":{"gold":["testaccount8","joyenfeu","tenbandschanel"],"silver":["drunbreaker","grindreamer","noguaplol","testaccount9","ringdongdang","vandoor","alt0408","434gdfg5","mrdarkcyber","decisiveexp","bob3701","willyng","arctozolt64","testaccount50","oyasumiawa","xiratina","skyiew","luvisrageyes","houndsoffate","maelizondo2","shadow1116","rarecandydrugger","coachjones6fifth","avantiwc","saralia","oreospeedruns","edggreen"],"bronze":["chanseyandlulu","default0","bernarduss","tukihime","lailafrizz","monopolee","arceusbugontop","katharsisofzeraph","perpetualfailures","pikleo","mesorotto","114514ww","lukeshawtism","kunvirgo","aipyuehua","hitmongigas","ochkan","ahhplayer","dgenerat","deslocacao","vonmjrn","liliou","astralgenesis","gbmeme","tehirami","xu9","sleepdumpling","rideintothesun","fc","libertyhaze","drbernarddd","aabbbee","the13thguy","lavaclaw","digitalillusions","darkshion","yh4611","jecolorfactory","ubdgpourquoi","aynelly","tootsiecutesie","funnyvalentine8","balancer11","ewlegendspam","honeycarwash","vertrip","skylaissofine","erfuac","leseawa","shivamz","austria2","blazingcloud","washuontop","mirrorsama","keyboardwasd","tokiwakano","suzuya","gabrielxd1023","trumpgaming420","mpikl","snowmiku2024","blazingsalamanders","eyeos","zerotti","suuuupercraig","louuol","ihaveaprobleme","qiyu9","anachron1sm","shawtylo"]},"gen9pu":{"gold":["olemunch","lambovino","35oo7"],"silver":["tiredofthistier","bpuff","darksauces","embassyfray","scantswindlers","calarguno","bettercallstaull","quietquitting","budgetplayer","dddreveal","trapkingrd","platum","understandabledad","pufferwish","bobbybobobnub","nuncaprecisei","losconosciuto","freeglowbro","stillinluv","lailai333","koopa003","half666","jonjonesmaia","malktyme","applethree","toraflora","yamaninzephyr"],"bronze":["whistling","torterrainpu","nogoldteeth","battlingprofessor","jumpingstep","theblobfishman8","smileinluv","jonjonmaia","amanemisa","blackerrenown","ghoulie264","orangepi","lebronjames2acheck","nakoruruxd","thelindomar","menphiz","esteb1n","ashytray","mcmanamanllc","djtillashaw","likeinsummer","dfogvxcl","clapashrimp","goofymissile","loud52","ugidus","cuminlinks","sneaseldiva","filletedaway","suzukaaa16","testingcoilxd","incompetentswine","bloodace","itsamemariooo","drdof","kinglercaptain","jaletee","yandaud","zeninclanleader","snossled","breakfastbiscuit","lobusarms","mrbeasttothetop","07l","folkloore","someidiot24","mercibercoo","anastasios77","worldsbiggestagent","rbltryo","jarid","volcanionisgrand","inc0980","massyclay","bugcheck","pippelino","ettubonnet","reverendbizarre","burststomach","enderlord88","jojsus","penstefani","dodonesparce","fraudulentfelons","flingnidoking","grindrinchat","lobuslobus","yelomelo","ohono","nostylenogracefune"]},"gen9doublesou":{"gold":["dontletmesleep","bagel","sakkuyaizayoi"],"silver":["dltzaciaora","apricotpeach","hththechef","testtrashing","mythicalrose","roseye","inioen","yaeschair","sumbomumbo","alolanhth","roadtoyour","iamaproplaya","sleepyhiphos","miotakamiya","badteamsgoodmemes","codeanish","shlok101","tomoyni","wandobando","dltzawarudo","roaringsylveon","actuarily","floorgle","dltzabloom","givrix","chimatsu","sunlightserenade"],"bronze":["tupapa247","tsimpouki","nephtyrix","orionlaunchpad","elshiavo","dltzalucaiaria63","hthtesting","quadmaster","charjabugfan","falinksmeta","dltzafangame10","lemurro","gdf5yhgh5hjh","gd5hgfhhh","trendybear5","dltzamalaman","greatcracker","cholena","skordopoutsoglou","captaingrungo","paperpanda","lonasil","dltzazasmokerxd420","madaraaaa","dltzanosignup","johncavalry","lunarr","bigboywally","mirzza","dltzabeans","thejohnnygoonsquad","sonnycribbd","trghnmj","jebbushreal","darthglacies","dltzabeagle","ralphdexter","horamir","thedoomdraogn","dltzapizza","dltzavigore","turtbrush","typostyty","arnoldcorner","darkman64","dltzagutierritos","lowkock","mattmandaman","penter","buttersweetsmcgee","dltzamn","sonnycribbs","dltzaladybathory","teddystertesttest","lewisbavin","yellowvelvetcake","genesis77","agenciesintern","dltzajinzo","thegenies","jzamudio","jintianzhouyi","bdogplatinum","christianfinity","hgf665565y","lejingang","dmarch","phileasdefog","icypenguin604","ultimathrash"]},"gen9monotype":{"gold":["dieuamphibien","frol1","themaverick"],"silver":["sawsc","quaglover","tannermckee","mazal","rindaokami","wadderrr","whitespaniard","mattandmello2","spitfirearcanine","oftdblue","cleanslateboy","juleocesar","oftdazul","rabzzz","oftdsoul","bxr8showl","vlarcheops","ceenodogs","nikkidoll","ubms6showl","tufftuff","redgravy","cptkraken","nitorikawaii","marisakawaii","vodoom","oftdfatman"],"bronze":["jerrygolley","soma","scbdshowl","qknjvhgf","somavlade","rofna","gfddclintsmith","scbddonkeykong","oftdshowl","kingchoco","bindido","packzick","railu2","kitealuluuu","marcothehunter","brifye","bestliliou","kaspi4n","doubledpawns","friendwithin","thewyvernking","arqueroazul2","sealder","etherealsword","oftdcaseyjones","tsarshin1228","sweethoneybuckin","wassermarsch","ceeoo","londig","pichu7","zicarus","staticreset","bouki","oftdraphael","carbinkraejepsen","rocketgruntkb","anotherdomination","royalreloaded","thebnl","naturesconqueror","tunderboltz456","khahara","cartwheellpcf","nebik","zeangs","frostbitedeluxe","clems1997","chocolatelab","pugzig9","rbltdaniolo7","toxtrix","speedworld","truegrape","smub","pengairxan","raichushiny","yabaisenpai","sidbvb","bobbyboolin","jessyboris2712","enteipaldea","scbdtuff","koopa003","scbdluigi","latios77","arqueroazul","ryanfigon","birderking","oftdknowmyname"]}}}}
|
config/chat-plugins/the-studio.json
ADDED
@@ -0,0 +1 @@
|
|
|
|
|
1 |
+
{"saved":[],"suggested":[]}
|
config/chat-plugins/youtube.json
ADDED
@@ -0,0 +1 @@
|
|
|
|
|
1 |
+
{"channels":{},"categories":[]}
|
config/chatrooms.json
ADDED
@@ -0,0 +1,4 @@
|
|
|
|
|
|
|
|
|
|
|
1 |
+
[
|
2 |
+
{"title":"Lobby","auth":{},"creationTime":1740588892198,"autojoin":true,"section":"official"},
|
3 |
+
{"title":"Staff","auth":{},"creationTime":1740588892198,"isPrivate":"hidden","modjoin":"%","autojoin":true}
|
4 |
+
]
|
config/config-example.js
ADDED
@@ -0,0 +1,748 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
'use strict';
|
2 |
+
|
3 |
+
/**
|
4 |
+
* The server port - the port to run Pokemon Showdown under
|
5 |
+
*
|
6 |
+
* @type {number}
|
7 |
+
*/
|
8 |
+
exports.port = 8000;
|
9 |
+
|
10 |
+
/**
|
11 |
+
* The server address - the address at which Pokemon Showdown should be hosting
|
12 |
+
* This should be kept set to 0.0.0.0 unless you know what you're doing.
|
13 |
+
*
|
14 |
+
* @type {string}
|
15 |
+
*/
|
16 |
+
exports.bindaddress = '0.0.0.0';
|
17 |
+
|
18 |
+
/**
|
19 |
+
* workers - the number of networking child processes to spawn
|
20 |
+
* This should be no greater than the number of threads available on your
|
21 |
+
* server's CPU. If you're not sure how many you have, you can check from a
|
22 |
+
* terminal by running:
|
23 |
+
*
|
24 |
+
* $ node -e "console.log(require('os').cpus().length)"
|
25 |
+
*
|
26 |
+
* Using more workers than there are available threads will cause performance
|
27 |
+
* issues. Keeping a couple threads available for use for OS-related work and
|
28 |
+
* other PS processes will likely give you the best performance, if your
|
29 |
+
* server's CPU is capable of multithreading. If you don't know what any of
|
30 |
+
* this means or you are unfamiliar with PS' networking code, leave this set
|
31 |
+
* to 1.
|
32 |
+
*/
|
33 |
+
exports.workers = 1;
|
34 |
+
|
35 |
+
/**
|
36 |
+
* wsdeflate - compresses WebSocket messages
|
37 |
+
* Toggles use of the Sec-WebSocket-Extension permessage-deflate extension.
|
38 |
+
* This compresses messages sent and received over a WebSocket connection
|
39 |
+
* using the zlib compression algorithm. As a caveat, message compression
|
40 |
+
* may make messages take longer to procress.
|
41 |
+
* @type {AnyObject?}
|
42 |
+
*/
|
43 |
+
exports.wsdeflate = null;
|
44 |
+
|
45 |
+
/*
|
46 |
+
// example:
|
47 |
+
exports.wsdeflate = {
|
48 |
+
level: 5,
|
49 |
+
memLevel: 8,
|
50 |
+
strategy: 0,
|
51 |
+
noContextTakeover: true,
|
52 |
+
requestNoContextTakeover: true,
|
53 |
+
maxWindowBits: 15,
|
54 |
+
requestMaxWindowBits: 15,
|
55 |
+
}; */
|
56 |
+
|
57 |
+
/**
|
58 |
+
* ssl - support WSS, allowing you to access through HTTPS
|
59 |
+
* The client requires port 443, so if you use a different port here,
|
60 |
+
* it will need to be forwarded to 443 through iptables rules or
|
61 |
+
* something.
|
62 |
+
* @type {{port: number, options: {key: string, cert: string}} | null}
|
63 |
+
*/
|
64 |
+
exports.ssl = null;
|
65 |
+
|
66 |
+
/*
|
67 |
+
// example:
|
68 |
+
exports.ssl = {
|
69 |
+
port: 443,
|
70 |
+
options: {
|
71 |
+
key: './config/ssl/privkey.pem',
|
72 |
+
cert: './config/ssl/fullchain.pem',
|
73 |
+
},
|
74 |
+
};
|
75 |
+
*/
|
76 |
+
|
77 |
+
/*
|
78 |
+
Main's SSL deploy script from Let's Encrypt looks like:
|
79 |
+
cp /etc/letsencrypt/live/sim.psim.us/privkey.pem ~user/Pokemon-Showdown/config/ssl/
|
80 |
+
cp /etc/letsencrypt/live/sim.psim.us/fullchain.pem ~user/Pokemon-Showdown/config/ssl/
|
81 |
+
chown user:user ~user/Pokemon-Showdown/config/ssl/privkey.pem
|
82 |
+
chown user:user ~user/Pokemon-Showdown/config/ssl/fullchain.pem
|
83 |
+
*/
|
84 |
+
|
85 |
+
/**
|
86 |
+
* proxyip - proxy IPs with trusted X-Forwarded-For headers
|
87 |
+
* This can be either false (meaning not to trust any proxies) or an array
|
88 |
+
* of strings. Each string should be either an IP address or a subnet given
|
89 |
+
* in CIDR notation. You should usually leave this as `false` unless you
|
90 |
+
* know what you are doing
|
91 |
+
* @type {false | string[]}.
|
92 |
+
*/
|
93 |
+
exports.proxyip = false;
|
94 |
+
|
95 |
+
/**
|
96 |
+
* Various debug options
|
97 |
+
*
|
98 |
+
* ofe[something]
|
99 |
+
* ============================================================================
|
100 |
+
*
|
101 |
+
* Write heapdumps if that processs run out of memory.
|
102 |
+
*
|
103 |
+
* If you wish to enable this, you will need to install node-oom-heapdump:
|
104 |
+
*
|
105 |
+
* $ npm install --no-save node-oom-heapdump
|
106 |
+
*
|
107 |
+
* We don't install it by default because it's super flaky and frequently
|
108 |
+
* crashes the installation process.
|
109 |
+
*
|
110 |
+
* You might also want to signal processes to put them in debug mode, for
|
111 |
+
* access to on-demand heapdumps.
|
112 |
+
*
|
113 |
+
* kill -s SIGUSR1 [pid]
|
114 |
+
*
|
115 |
+
* debug[something]processes
|
116 |
+
* ============================================================================
|
117 |
+
*
|
118 |
+
* Attach a `debug` property to `ProcessWrapper`, allowing you to see the last
|
119 |
+
* message it received before it hit an infinite loop.
|
120 |
+
*
|
121 |
+
* For example:
|
122 |
+
*
|
123 |
+
* >> ProcessManager.processManagers[4].processes[0].debug
|
124 |
+
* << "{"tar":"spe=60,all,!lc,!nfe","cmd":"dexsearch","canAll":true,"message":"/ds spe=60,all,!lc,!nfe"}"
|
125 |
+
*/
|
126 |
+
exports.ofemain = false;
|
127 |
+
exports.ofesockets = false;
|
128 |
+
exports.debugsimprocesses = true;
|
129 |
+
exports.debugvalidatorprocesses = true;
|
130 |
+
exports.debugdexsearchprocesses = true;
|
131 |
+
|
132 |
+
/**
|
133 |
+
* Pokemon of the Day - put a pokemon's name here to make it Pokemon of the Day
|
134 |
+
* The PotD will always be in the #2 slot (not #1 so it won't be a lead)
|
135 |
+
* in every Random Battle team.
|
136 |
+
*
|
137 |
+
* @type {ID}
|
138 |
+
*/
|
139 |
+
exports.potd = '';
|
140 |
+
|
141 |
+
/**
|
142 |
+
* crash guard - write errors to log file instead of crashing
|
143 |
+
* This is normally not recommended - if Node wants to crash, the
|
144 |
+
* server needs to be restarted
|
145 |
+
* However, most people want the server to stay online even if there is a
|
146 |
+
* crash, so this option is provided
|
147 |
+
*/
|
148 |
+
exports.crashguard = true;
|
149 |
+
|
150 |
+
/**
|
151 |
+
* login server data - don't forget the http:// and the trailing slash
|
152 |
+
* This is the URL of the user database and ladder mentioned earlier.
|
153 |
+
* Don't change this setting - there aren't any other login servers right now
|
154 |
+
*/
|
155 |
+
exports.loginserver = 'http://play.pokemonshowdown.com/';
|
156 |
+
exports.loginserverkeyalgo = "RSA-SHA1";
|
157 |
+
exports.loginserverpublickeyid = 4;
|
158 |
+
exports.loginserverpublickey = `-----BEGIN PUBLIC KEY-----
|
159 |
+
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAzfWKQXg2k8c92aiTyN37
|
160 |
+
dl76iW0aeAighgzeesdar4xZT1A9yzLpj2DgR8F8rh4R32/EVOPmX7DCf0bYWeh3
|
161 |
+
QttP0HVKKKfsncJZ9DdNtKj1vWdUTklH8oeoIZKs54dwWgnEFKzb9gxqu+z+FJoQ
|
162 |
+
vPnvfjCRUPA84O4kqKSuZT2qiWMFMWNQPXl87v+8Atb+br/WXvZRyiLqIFSG+ySn
|
163 |
+
Nwx6V1C8CA1lYqcPcTfmQs+2b4SzUa8Qwkr9c1tZnXlWIWj8dVvdYtlo0sZZBfAm
|
164 |
+
X71Rsp2vwEleSFKV69jj+IzAfNHRRw+SADe3z6xONtrJOrp+uC/qnLNuuCfuOAgL
|
165 |
+
dnUVFLX2aGH0Wb7ZkriVvarRd+3otV33A8ilNPIoPb8XyFylImYEnoviIQuv+0VW
|
166 |
+
RMmQlQ6RMZNr6sf9pYMDhh2UjU11++8aUxBaso8zeSXC9hhp7mAa7OTxts1t3X57
|
167 |
+
72LqtHHEzxoyLj/QDJAsIfDmUNAq0hpkiRaXb96wTh3IyfI/Lqh+XmyJuo+S5GSs
|
168 |
+
RhlSYTL4lXnj/eOa23yaqxRihS2MT9EZ7jNd3WVWlWgExIS2kVyZhL48VA6rXDqr
|
169 |
+
Ko0LaPAMhcfETxlFQFutoWBRcH415A/EMXJa4FqYa9oeXWABNtKkUW0zrQ194btg
|
170 |
+
Y929lRybWEiKUr+4Yw2O1W0CAwEAAQ==
|
171 |
+
-----END PUBLIC KEY-----
|
172 |
+
`;
|
173 |
+
|
174 |
+
/**
|
175 |
+
* routes - where Pokemon Showdown is hosted.
|
176 |
+
* Don't change this setting - there aren't any other options right now
|
177 |
+
*/
|
178 |
+
exports.routes = {
|
179 |
+
root: 'pokemonshowdown.com',
|
180 |
+
client: 'play.pokemonshowdown.com',
|
181 |
+
dex: 'dex.pokemonshowdown.com',
|
182 |
+
replays: 'replay.pokemonshowdown.com',
|
183 |
+
};
|
184 |
+
|
185 |
+
/**
|
186 |
+
* crashguardemail - if the server has been running for more than an hour
|
187 |
+
* and crashes, send an email using these settings, rather than locking down
|
188 |
+
* the server. Uncomment this definition if you want to use this feature;
|
189 |
+
* otherwise, all crashes will lock down the server. If you wish to enable
|
190 |
+
* this setting, you will need to install nodemailer, as it is not installed
|
191 |
+
* by default:
|
192 |
+
* $ npm install nodemailer
|
193 |
+
* @type {AnyObject?}
|
194 |
+
*/
|
195 |
+
exports.crashguardemail = null;
|
196 |
+
/* exports.crashguardemail = {
|
197 |
+
options: {
|
198 |
+
host: 'mail.example.com',
|
199 |
+
port: 465,
|
200 |
+
secure: true,
|
201 |
+
auth: {
|
202 |
+
user: '[email protected]',
|
203 |
+
pass: 'password'
|
204 |
+
}
|
205 |
+
},
|
206 |
+
from: '[email protected]',
|
207 |
+
to: '[email protected]',
|
208 |
+
subject: 'Pokemon Showdown has crashed!'
|
209 |
+
}; */
|
210 |
+
|
211 |
+
/**
|
212 |
+
* basic name filter - removes characters used for impersonation
|
213 |
+
* The basic name filter removes Unicode characters that can be used for impersonation,
|
214 |
+
* like the upside-down exclamation mark (looks like an i), the Greek omicron (looks
|
215 |
+
* like an o), etc. Disable only if you need one of the alphabets it disables, such as
|
216 |
+
* Greek or Cyrillic.
|
217 |
+
*/
|
218 |
+
exports.disablebasicnamefilter = false;
|
219 |
+
|
220 |
+
/**
|
221 |
+
* allowrequestingties - enables the use of `/offerdraw` and `/acceptdraw`
|
222 |
+
*/
|
223 |
+
exports.allowrequestingties = true;
|
224 |
+
|
225 |
+
/**
|
226 |
+
* report joins and leaves - shows messages like "<USERNAME> joined"
|
227 |
+
* Join and leave messages are small and consolidated, so there will never
|
228 |
+
* be more than one line of messages.
|
229 |
+
* If this setting is set to `true`, it will override the client-side
|
230 |
+
* /hidejoins configuration for users.
|
231 |
+
* This feature can lag larger servers - turn this off if your server is
|
232 |
+
* getting more than 80 or so users.
|
233 |
+
*/
|
234 |
+
exports.reportjoins = true;
|
235 |
+
|
236 |
+
/**
|
237 |
+
* report joins and leaves periodically - sends silent join and leave messages in batches
|
238 |
+
* This setting will only be effective if `reportjoins` is set to false, and users will
|
239 |
+
* only be able to see the messages if they have the /showjoins client-side setting enabled.
|
240 |
+
* Set this to a positive amount of milliseconds if you want to enable this feature.
|
241 |
+
*/
|
242 |
+
exports.reportjoinsperiod = 0;
|
243 |
+
|
244 |
+
/**
|
245 |
+
* report battles - shows messages like "OU battle started" in the lobby
|
246 |
+
* This feature can lag larger servers - turn this off if your server is
|
247 |
+
* getting more than 160 or so users.
|
248 |
+
* @type {boolean | string[] | string}
|
249 |
+
*/
|
250 |
+
exports.reportbattles = true;
|
251 |
+
|
252 |
+
/**
|
253 |
+
* report joins and leaves in battle - shows messages like "<USERNAME> joined" in battle
|
254 |
+
* Set this to false on large tournament servers where battles get a lot of joins and leaves.
|
255 |
+
* Note that the feature of turning this off is deprecated.
|
256 |
+
*/
|
257 |
+
exports.reportbattlejoins = true;
|
258 |
+
|
259 |
+
/**
|
260 |
+
* notify staff when users have a certain amount of room punishments.
|
261 |
+
* Setting this to a number greater than zero will notify staff for everyone with
|
262 |
+
* the required amount of room punishments.
|
263 |
+
* Set this to 0 to turn the monitor off.
|
264 |
+
*/
|
265 |
+
exports.monitorminpunishments = 3;
|
266 |
+
|
267 |
+
/**
|
268 |
+
* Turns off all time-based throttles - rename, challenges, laddering, etc.
|
269 |
+
*/
|
270 |
+
exports.nothrottle = false;
|
271 |
+
|
272 |
+
/**
|
273 |
+
* Removes all ip-based alt checking.
|
274 |
+
*/
|
275 |
+
exports.noipchecks = false;
|
276 |
+
|
277 |
+
/**
|
278 |
+
* controls the behavior of the /battlesearch command
|
279 |
+
*
|
280 |
+
* valid values are:
|
281 |
+
* - true: disables battlesearch entirely
|
282 |
+
* - false: enables the node.js /battlesearch
|
283 |
+
* (uses either node fs or ripgrep for searching)
|
284 |
+
* - 'psbattletools': defaults to the psbattletools /battlesearch (normally available as /alternatebattlesearch)
|
285 |
+
* (uses psbattletools, which must be installed, for searching)
|
286 |
+
*
|
287 |
+
* @type {boolean | 'psbattletools'}
|
288 |
+
*/
|
289 |
+
exports.nobattlesearch = false;
|
290 |
+
|
291 |
+
/**
|
292 |
+
* allow punishmentmonitor to lock users with multiple roombans.
|
293 |
+
* When set to `true`, this feature will automatically lock any users with three or more
|
294 |
+
* active roombans, and notify the staff room.
|
295 |
+
* Note that this requires punishmentmonitor to be enabled, and therefore requires the `monitorminpunishments`
|
296 |
+
* option to be set to a number greater than zero. If `monitorminpunishments` is set to a value greater than 3,
|
297 |
+
* the autolock will only apply to people who pass this threshold.
|
298 |
+
*/
|
299 |
+
exports.punishmentautolock = false;
|
300 |
+
|
301 |
+
/**
|
302 |
+
* restrict sending links to autoconfirmed users only.
|
303 |
+
* If this is set to `true`, only autoconfirmed users can send links to either chatrooms or other users, except for staff members.
|
304 |
+
* This option can be used if your server has trouble with spammers mass PMing links to users, or trolls sending malicious links.
|
305 |
+
*/
|
306 |
+
exports.restrictLinks = false;
|
307 |
+
|
308 |
+
/**
|
309 |
+
* whitelist - prevent users below a certain group from doing things
|
310 |
+
* For the modchat settings, false will allow any user to participate, while a string
|
311 |
+
* with a group symbol will restrict it to that group and above. The string
|
312 |
+
* 'autoconfirmed' is also supported for chatmodchat and battlemodchat, to restrict
|
313 |
+
* chat to autoconfirmed users.
|
314 |
+
* This is usually intended to be used as a whitelist feature - set these to '+' and
|
315 |
+
* voice every user you want whitelisted on the server.
|
316 |
+
|
317 |
+
/**
|
318 |
+
* chat modchat - default minimum group for speaking in chatrooms; changeable with /modchat
|
319 |
+
* @type {false | string}
|
320 |
+
*/
|
321 |
+
exports.chatmodchat = false;
|
322 |
+
/**
|
323 |
+
* battle modchat - default minimum group for speaking in battles; changeable with /modchat
|
324 |
+
* @type {false | AuthLevel}
|
325 |
+
*/
|
326 |
+
exports.battlemodchat = false;
|
327 |
+
/**
|
328 |
+
* PM modchat - minimum group for sending private messages or challenges to other users
|
329 |
+
* @type {false | AuthLevel}
|
330 |
+
*/
|
331 |
+
exports.pmmodchat = false;
|
332 |
+
/**
|
333 |
+
* ladder modchat - minimum group for laddering
|
334 |
+
* @type {false | GroupSymbol}
|
335 |
+
*/
|
336 |
+
exports.laddermodchat = false;
|
337 |
+
|
338 |
+
/**
|
339 |
+
* forced timer - force the timer on for all battles
|
340 |
+
* Players will be unable to turn it off.
|
341 |
+
* This setting can also be turned on with the command /forcetimer.
|
342 |
+
*
|
343 |
+
* @type {boolean}
|
344 |
+
*/
|
345 |
+
exports.forcetimer = false;
|
346 |
+
|
347 |
+
/**
|
348 |
+
* force register ELO - unregistered users cannot search for ladder battles
|
349 |
+
* in formats where their ELO is at or above this value.
|
350 |
+
* @type {false | number}
|
351 |
+
*/
|
352 |
+
exports.forceregisterelo = false;
|
353 |
+
|
354 |
+
/**
|
355 |
+
* backdoor - allows Pokemon Showdown system operators to provide technical
|
356 |
+
* support for your server
|
357 |
+
* This backdoor gives system operators (such as Zarel) console admin
|
358 |
+
* access to your server, which allow them to provide tech support. This
|
359 |
+
* can be useful in a variety of situations: if an attacker attacks your
|
360 |
+
* server and you are not online, if you need help setting up your server,
|
361 |
+
* etc. If you do not trust Pokemon Showdown with admin access, you should
|
362 |
+
* disable this feature.
|
363 |
+
*/
|
364 |
+
exports.backdoor = true;
|
365 |
+
|
366 |
+
/**
|
367 |
+
* List of IPs and user IDs with dev console (>> and >>>) access.
|
368 |
+
* The console is incredibly powerful because it allows the execution of
|
369 |
+
* arbitrary commands on the local computer (as the user running the
|
370 |
+
* server). If an account with the console permission were compromised,
|
371 |
+
* it could possibly be used to take over the server computer. As such,
|
372 |
+
* you should only specify a small range of trusted IPs and users here,
|
373 |
+
* or none at all. By default, only localhost can use the dev console.
|
374 |
+
* In addition to connecting from a valid IP, a user must *also* have
|
375 |
+
* the `console` permission in order to use the dev console.
|
376 |
+
* Setting this to an empty array ([]) will disable the dev console.
|
377 |
+
*/
|
378 |
+
exports.consoleips = ['127.0.0.1'];
|
379 |
+
|
380 |
+
/**
|
381 |
+
* Whether to watch the config file for changes. If this is enabled,
|
382 |
+
* then the config.js file will be reloaded when it is changed.
|
383 |
+
* This can be used to change some settings using a text editor on
|
384 |
+
* the server.
|
385 |
+
*/
|
386 |
+
exports.watchconfig = true;
|
387 |
+
|
388 |
+
/**
|
389 |
+
* logchat - whether to log chat rooms.
|
390 |
+
*/
|
391 |
+
exports.logchat = false;
|
392 |
+
|
393 |
+
/**
|
394 |
+
* logchallenges - whether to log challenge battles. Useful for tournament servers.
|
395 |
+
*/
|
396 |
+
exports.logchallenges = false;
|
397 |
+
|
398 |
+
/**
|
399 |
+
* loguserstats - how often (in milliseconds) to write user stats to the
|
400 |
+
* lobby log. This has no effect if `logchat` is disabled.
|
401 |
+
*/
|
402 |
+
exports.loguserstats = 1000 * 60 * 10; // 10 minutes
|
403 |
+
|
404 |
+
/**
|
405 |
+
* validatorprocesses - the number of processes to use for validating teams
|
406 |
+
* simulatorprocesses - the number of processes to use for handling battles
|
407 |
+
* You should leave both of these at 1 unless your server has a very large
|
408 |
+
* amount of traffic (i.e. hundreds of concurrent battles).
|
409 |
+
*/
|
410 |
+
exports.validatorprocesses = 1;
|
411 |
+
exports.simulatorprocesses = 1;
|
412 |
+
|
413 |
+
/**
|
414 |
+
* inactiveuserthreshold - how long a user must be inactive before being pruned
|
415 |
+
* from the `users` array. The default is 1 hour.
|
416 |
+
*/
|
417 |
+
exports.inactiveuserthreshold = 1000 * 60 * 60;
|
418 |
+
|
419 |
+
/**
|
420 |
+
* autolockdown - whether or not to automatically kill the server when it is
|
421 |
+
* in lockdown mode and the final battle finishes. This is potentially useful
|
422 |
+
* to prevent forgetting to restart after a lockdown where battles are finished.
|
423 |
+
*
|
424 |
+
* @type {boolean}
|
425 |
+
*/
|
426 |
+
exports.autolockdown = true;
|
427 |
+
|
428 |
+
/**
|
429 |
+
* noguestsecurity - purely for development servers: allows logging in without
|
430 |
+
* a signed token: simply send `/trn [USERNAME]`. This allows using PS without
|
431 |
+
* a login server.
|
432 |
+
*
|
433 |
+
* Logging in this way will make you considered an unregistered user and grant
|
434 |
+
* no authority. You cannot log into a trusted (g+/r%) user account this way.
|
435 |
+
*/
|
436 |
+
exports.noguestsecurity = false;
|
437 |
+
|
438 |
+
/**
|
439 |
+
* tourroom - specify a room to receive tournament announcements (defaults to
|
440 |
+
* the room 'tournaments').
|
441 |
+
* tourannouncements - announcements are only allowed in these rooms
|
442 |
+
* tourdefaultplayercap - a set cap of how many players can be in a tournament
|
443 |
+
* ratedtours - toggles tournaments being ladder rated (true) or not (false)
|
444 |
+
*/
|
445 |
+
exports.tourroom = '';
|
446 |
+
/** @type {string[]} */
|
447 |
+
exports.tourannouncements = [/* roomids */];
|
448 |
+
exports.tourdefaultplayercap = 0;
|
449 |
+
exports.ratedtours = false;
|
450 |
+
|
451 |
+
/**
|
452 |
+
* appealurl - specify a URL containing information on how users can appeal
|
453 |
+
* disciplinary actions on your section. You can also leave this blank, in
|
454 |
+
* which case users won't be given any information on how to appeal.
|
455 |
+
*/
|
456 |
+
exports.appealurl = '';
|
457 |
+
|
458 |
+
/**
|
459 |
+
* repl - whether repl sockets are enabled or not
|
460 |
+
* replsocketprefix - the prefix for the repl sockets to be listening on
|
461 |
+
* replsocketmode - the file mode bits to use for the repl sockets
|
462 |
+
*/
|
463 |
+
exports.repl = true;
|
464 |
+
exports.replsocketprefix = './logs/repl/';
|
465 |
+
exports.replsocketmode = 0o600;
|
466 |
+
|
467 |
+
/**
|
468 |
+
* disablehotpatchall - disables `/hotpatch all`. Generally speaking, there's a
|
469 |
+
* pretty big need for /hotpatch all - convenience. The only advantage any hotpatch
|
470 |
+
* forms other than all is lower RAM use (which is only a problem for Main because
|
471 |
+
* Main is huge), and to do pinpoint hotpatching (like /nohotpatch).
|
472 |
+
*/
|
473 |
+
exports.disablehotpatchall = false;
|
474 |
+
|
475 |
+
/**
|
476 |
+
* forcedpublicprefixes - user ID prefixes which will be forced to battle publicly.
|
477 |
+
* Battles involving user IDs which begin with one of the prefixes configured here
|
478 |
+
* will be unaffected by various battle privacy commands such as /modjoin, /hideroom
|
479 |
+
* or /ionext.
|
480 |
+
* @type {string[] | undefined}
|
481 |
+
*/
|
482 |
+
exports.forcedpublicprefixes = [];
|
483 |
+
|
484 |
+
/**
|
485 |
+
* startuphook - function to call when the server is fully initialized and ready
|
486 |
+
* to serve requests.
|
487 |
+
*/
|
488 |
+
exports.startuphook = function () {};
|
489 |
+
|
490 |
+
/**
|
491 |
+
* lastfmkey - the API key to let users use the last.fm commands from The Studio's
|
492 |
+
* chat plugin.
|
493 |
+
*/
|
494 |
+
exports.lastfmkey = '';
|
495 |
+
|
496 |
+
/**
|
497 |
+
* chatlogreader - the search method used for searching chatlogs.
|
498 |
+
* @type {'ripgrep' | 'fs'}
|
499 |
+
*/
|
500 |
+
exports.chatlogreader = 'fs';
|
501 |
+
/**
|
502 |
+
* permissions and groups:
|
503 |
+
* Each entry in `grouplist` is a seperate group. Some of the members are "special"
|
504 |
+
* while the rest is just a normal permission.
|
505 |
+
* The order of the groups determines their ranking.
|
506 |
+
* The special members are as follows:
|
507 |
+
* - symbol: Specifies the symbol of the group (as shown in front of the username)
|
508 |
+
* - id: Specifies an id for the group.
|
509 |
+
* - name: Specifies the human-readable name for the group.
|
510 |
+
* - root: If this is true, the group can do anything.
|
511 |
+
* - inherit: The group uses the group specified's permissions if it cannot
|
512 |
+
* find the permission in the current group. Never make the graph
|
513 |
+
* produced using this member have any cycles, or the server won't run.
|
514 |
+
* - jurisdiction: The default jurisdiction for targeted permissions where one isn't
|
515 |
+
* explictly specified. "Targeted permissions" are permissions
|
516 |
+
* that might affect another user, such as `ban' or `promote'.
|
517 |
+
* 's' is a special group where it means the user itself only
|
518 |
+
* and 'u' is another special group where it means all groups
|
519 |
+
* lower in rank than the current group.
|
520 |
+
* - roomonly: forces the group to be a per-room moderation rank only.
|
521 |
+
* - globalonly: forces the group to be a global rank only.
|
522 |
+
* All the possible permissions are as follows:
|
523 |
+
* - console: Developer console (>>).
|
524 |
+
* - lockdown: /lockdown and /endlockdown commands.
|
525 |
+
* - hotpatch: /hotpatch, /crashfixed and /savelearnsets commands.
|
526 |
+
* - ignorelimits: Ignore limits such as chat message length.
|
527 |
+
* - promote: Promoting and demoting. Will only work if the target user's current
|
528 |
+
* group and target group are both in jurisdiction.
|
529 |
+
* - room<rank>: /roompromote to <rank> (eg. roomvoice)
|
530 |
+
* - makeroom: Create/delete chatrooms, and set modjoin/roomdesc/privacy
|
531 |
+
* - editroom: Editing properties of rooms
|
532 |
+
* - editprivacy: Set modjoin/privacy only for battles
|
533 |
+
* - globalban: Banning and unbanning from the entire server.
|
534 |
+
* - ban: Banning and unbanning in rooms.
|
535 |
+
* - mute: Muting and unmuting.
|
536 |
+
* - lock: locking (ipmute) and unlocking.
|
537 |
+
* - receivemutedpms: Receive PMs from muted users.
|
538 |
+
* - forcerename: /fr command.
|
539 |
+
* - ip: IP checking.
|
540 |
+
* - alts: Alt checking.
|
541 |
+
* - modlog: view the moderator logs.
|
542 |
+
* - show: Show command output to other users.
|
543 |
+
* - showmedia: Show images and videos to other users.
|
544 |
+
* - declare: /declare command.
|
545 |
+
* - announce: /announce command.
|
546 |
+
* - modchat: Set modchat.
|
547 |
+
* - potd: Set PotD.
|
548 |
+
* - forcewin: /forcewin command.
|
549 |
+
* - battlemessage: /a command.
|
550 |
+
* - tournaments: creating tournaments (/tour new, settype etc.)
|
551 |
+
* - gamemoderation: /tour dq, autodq, end etc.
|
552 |
+
* - gamemanagement: enable/disable games, minigames, and tournaments.
|
553 |
+
* - minigame: make minigames (hangman, polls, etc.).
|
554 |
+
* - game: make games.
|
555 |
+
*/
|
556 |
+
exports.grouplist = [
|
557 |
+
{
|
558 |
+
symbol: '~',
|
559 |
+
id: "admin",
|
560 |
+
name: "Administrator",
|
561 |
+
inherit: '@',
|
562 |
+
jurisdiction: 'u',
|
563 |
+
globalonly: true,
|
564 |
+
|
565 |
+
console: true,
|
566 |
+
bypassall: true,
|
567 |
+
lockdown: true,
|
568 |
+
promote: '~u',
|
569 |
+
roomowner: true,
|
570 |
+
roombot: true,
|
571 |
+
roommod: true,
|
572 |
+
roomdriver: true,
|
573 |
+
forcewin: true,
|
574 |
+
declare: true,
|
575 |
+
addhtml: true,
|
576 |
+
rangeban: true,
|
577 |
+
makeroom: true,
|
578 |
+
editroom: true,
|
579 |
+
editprivacy: true,
|
580 |
+
potd: true,
|
581 |
+
disableladder: true,
|
582 |
+
gdeclare: true,
|
583 |
+
gamemanagement: true,
|
584 |
+
exportinputlog: true,
|
585 |
+
tournaments: true,
|
586 |
+
},
|
587 |
+
{
|
588 |
+
symbol: '#',
|
589 |
+
id: "owner",
|
590 |
+
name: "Room Owner",
|
591 |
+
inherit: '@',
|
592 |
+
jurisdiction: 'u',
|
593 |
+
roomonly: true,
|
594 |
+
|
595 |
+
roombot: true,
|
596 |
+
roommod: true,
|
597 |
+
roomdriver: true,
|
598 |
+
roomprizewinner: true,
|
599 |
+
editroom: true,
|
600 |
+
declare: true,
|
601 |
+
addhtml: true,
|
602 |
+
gamemanagement: true,
|
603 |
+
tournaments: true,
|
604 |
+
},
|
605 |
+
{
|
606 |
+
symbol: '\u2605',
|
607 |
+
id: "host",
|
608 |
+
name: "Host",
|
609 |
+
inherit: '@',
|
610 |
+
jurisdiction: 'u',
|
611 |
+
roomonly: true,
|
612 |
+
|
613 |
+
declare: true,
|
614 |
+
modchat: 'a',
|
615 |
+
gamemanagement: true,
|
616 |
+
forcewin: true,
|
617 |
+
tournaments: true,
|
618 |
+
joinbattle: true,
|
619 |
+
},
|
620 |
+
{
|
621 |
+
symbol: '@',
|
622 |
+
id: "mod",
|
623 |
+
name: "Moderator",
|
624 |
+
inherit: '%',
|
625 |
+
jurisdiction: 'u',
|
626 |
+
|
627 |
+
globalban: true,
|
628 |
+
ban: true,
|
629 |
+
modchat: 'a',
|
630 |
+
roomvoice: true,
|
631 |
+
roomwhitelist: true,
|
632 |
+
forcerename: true,
|
633 |
+
ip: true,
|
634 |
+
alts: '@u',
|
635 |
+
game: true,
|
636 |
+
},
|
637 |
+
{
|
638 |
+
symbol: '%',
|
639 |
+
id: "driver",
|
640 |
+
name: "Driver",
|
641 |
+
inherit: '+',
|
642 |
+
jurisdiction: 'u',
|
643 |
+
globalGroupInPersonalRoom: '@',
|
644 |
+
|
645 |
+
announce: true,
|
646 |
+
warn: '\u2605u',
|
647 |
+
kick: true,
|
648 |
+
mute: '\u2605u',
|
649 |
+
lock: true,
|
650 |
+
forcerename: true,
|
651 |
+
timer: true,
|
652 |
+
modlog: true,
|
653 |
+
alts: '%u',
|
654 |
+
bypassblocks: 'u%@~',
|
655 |
+
receiveauthmessages: true,
|
656 |
+
gamemoderation: true,
|
657 |
+
jeopardy: true,
|
658 |
+
joinbattle: true,
|
659 |
+
minigame: true,
|
660 |
+
modchat: true,
|
661 |
+
hiderank: true,
|
662 |
+
},
|
663 |
+
{
|
664 |
+
// Bots are ranked below Driver/Mod so that Global Bots can be kept out
|
665 |
+
// of modjoin % rooms (namely, Staff).
|
666 |
+
// (They were previously above Driver/Mod so they can have game management
|
667 |
+
// permissions drivers don't, but these permissions can be manually given.)
|
668 |
+
symbol: '*',
|
669 |
+
id: "bot",
|
670 |
+
name: "Bot",
|
671 |
+
inherit: '%',
|
672 |
+
jurisdiction: 'u',
|
673 |
+
|
674 |
+
addhtml: true,
|
675 |
+
tournaments: true,
|
676 |
+
declare: true,
|
677 |
+
bypassafktimer: true,
|
678 |
+
gamemanagement: true,
|
679 |
+
|
680 |
+
ip: false,
|
681 |
+
globalban: false,
|
682 |
+
lock: false,
|
683 |
+
forcerename: false,
|
684 |
+
alts: false,
|
685 |
+
},
|
686 |
+
{
|
687 |
+
symbol: '\u2606',
|
688 |
+
id: "player",
|
689 |
+
name: "Player",
|
690 |
+
inherit: '+',
|
691 |
+
battleonly: true,
|
692 |
+
|
693 |
+
roomvoice: true,
|
694 |
+
modchat: true,
|
695 |
+
editprivacy: true,
|
696 |
+
gamemanagement: true,
|
697 |
+
joinbattle: true,
|
698 |
+
nooverride: true,
|
699 |
+
},
|
700 |
+
{
|
701 |
+
symbol: '+',
|
702 |
+
id: "voice",
|
703 |
+
name: "Voice",
|
704 |
+
inherit: ' ',
|
705 |
+
|
706 |
+
altsself: true,
|
707 |
+
makegroupchat: true,
|
708 |
+
joinbattle: true,
|
709 |
+
show: true,
|
710 |
+
showmedia: true,
|
711 |
+
exportinputlog: true,
|
712 |
+
importinputlog: true,
|
713 |
+
},
|
714 |
+
{
|
715 |
+
symbol: '^',
|
716 |
+
id: "prizewinner",
|
717 |
+
name: "Prize Winner",
|
718 |
+
roomonly: true,
|
719 |
+
},
|
720 |
+
{
|
721 |
+
symbol: 'whitelist',
|
722 |
+
id: "whitelist",
|
723 |
+
name: "Whitelist",
|
724 |
+
inherit: ' ',
|
725 |
+
roomonly: true,
|
726 |
+
altsself: true,
|
727 |
+
show: true,
|
728 |
+
showmedia: true,
|
729 |
+
exportinputlog: true,
|
730 |
+
importinputlog: true,
|
731 |
+
},
|
732 |
+
{
|
733 |
+
symbol: ' ',
|
734 |
+
ipself: true,
|
735 |
+
},
|
736 |
+
{
|
737 |
+
name: 'Locked',
|
738 |
+
id: 'locked',
|
739 |
+
symbol: '\u203d',
|
740 |
+
punishgroup: 'LOCK',
|
741 |
+
},
|
742 |
+
{
|
743 |
+
name: 'Muted',
|
744 |
+
id: 'muted',
|
745 |
+
symbol: '!',
|
746 |
+
punishgroup: 'MUTE',
|
747 |
+
},
|
748 |
+
];
|
config/config.js
ADDED
@@ -0,0 +1,748 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
'use strict';
|
2 |
+
|
3 |
+
/**
|
4 |
+
* The server port - the port to run Pokemon Showdown under
|
5 |
+
*
|
6 |
+
* @type {number}
|
7 |
+
*/
|
8 |
+
exports.port = 8000;
|
9 |
+
|
10 |
+
/**
|
11 |
+
* The server address - the address at which Pokemon Showdown should be hosting
|
12 |
+
* This should be kept set to 0.0.0.0 unless you know what you're doing.
|
13 |
+
*
|
14 |
+
* @type {string}
|
15 |
+
*/
|
16 |
+
exports.bindaddress = '0.0.0.0';
|
17 |
+
|
18 |
+
/**
|
19 |
+
* workers - the number of networking child processes to spawn
|
20 |
+
* This should be no greater than the number of threads available on your
|
21 |
+
* server's CPU. If you're not sure how many you have, you can check from a
|
22 |
+
* terminal by running:
|
23 |
+
*
|
24 |
+
* $ node -e "console.log(require('os').cpus().length)"
|
25 |
+
*
|
26 |
+
* Using more workers than there are available threads will cause performance
|
27 |
+
* issues. Keeping a couple threads available for use for OS-related work and
|
28 |
+
* other PS processes will likely give you the best performance, if your
|
29 |
+
* server's CPU is capable of multithreading. If you don't know what any of
|
30 |
+
* this means or you are unfamiliar with PS' networking code, leave this set
|
31 |
+
* to 1.
|
32 |
+
*/
|
33 |
+
exports.workers = 1;
|
34 |
+
|
35 |
+
/**
|
36 |
+
* wsdeflate - compresses WebSocket messages
|
37 |
+
* Toggles use of the Sec-WebSocket-Extension permessage-deflate extension.
|
38 |
+
* This compresses messages sent and received over a WebSocket connection
|
39 |
+
* using the zlib compression algorithm. As a caveat, message compression
|
40 |
+
* may make messages take longer to procress.
|
41 |
+
* @type {AnyObject?}
|
42 |
+
*/
|
43 |
+
exports.wsdeflate = null;
|
44 |
+
|
45 |
+
/*
|
46 |
+
// example:
|
47 |
+
exports.wsdeflate = {
|
48 |
+
level: 5,
|
49 |
+
memLevel: 8,
|
50 |
+
strategy: 0,
|
51 |
+
noContextTakeover: true,
|
52 |
+
requestNoContextTakeover: true,
|
53 |
+
maxWindowBits: 15,
|
54 |
+
requestMaxWindowBits: 15,
|
55 |
+
}; */
|
56 |
+
|
57 |
+
/**
|
58 |
+
* ssl - support WSS, allowing you to access through HTTPS
|
59 |
+
* The client requires port 443, so if you use a different port here,
|
60 |
+
* it will need to be forwarded to 443 through iptables rules or
|
61 |
+
* something.
|
62 |
+
* @type {{port: number, options: {key: string, cert: string}} | null}
|
63 |
+
*/
|
64 |
+
exports.ssl = null;
|
65 |
+
|
66 |
+
/*
|
67 |
+
// example:
|
68 |
+
exports.ssl = {
|
69 |
+
port: 443,
|
70 |
+
options: {
|
71 |
+
key: './config/ssl/privkey.pem',
|
72 |
+
cert: './config/ssl/fullchain.pem',
|
73 |
+
},
|
74 |
+
};
|
75 |
+
*/
|
76 |
+
|
77 |
+
/*
|
78 |
+
Main's SSL deploy script from Let's Encrypt looks like:
|
79 |
+
cp /etc/letsencrypt/live/sim.psim.us/privkey.pem ~user/Pokemon-Showdown/config/ssl/
|
80 |
+
cp /etc/letsencrypt/live/sim.psim.us/fullchain.pem ~user/Pokemon-Showdown/config/ssl/
|
81 |
+
chown user:user ~user/Pokemon-Showdown/config/ssl/privkey.pem
|
82 |
+
chown user:user ~user/Pokemon-Showdown/config/ssl/fullchain.pem
|
83 |
+
*/
|
84 |
+
|
85 |
+
/**
|
86 |
+
* proxyip - proxy IPs with trusted X-Forwarded-For headers
|
87 |
+
* This can be either false (meaning not to trust any proxies) or an array
|
88 |
+
* of strings. Each string should be either an IP address or a subnet given
|
89 |
+
* in CIDR notation. You should usually leave this as `false` unless you
|
90 |
+
* know what you are doing
|
91 |
+
* @type {false | string[]}.
|
92 |
+
*/
|
93 |
+
exports.proxyip = false;
|
94 |
+
|
95 |
+
/**
|
96 |
+
* Various debug options
|
97 |
+
*
|
98 |
+
* ofe[something]
|
99 |
+
* ============================================================================
|
100 |
+
*
|
101 |
+
* Write heapdumps if that processs run out of memory.
|
102 |
+
*
|
103 |
+
* If you wish to enable this, you will need to install node-oom-heapdump:
|
104 |
+
*
|
105 |
+
* $ npm install --no-save node-oom-heapdump
|
106 |
+
*
|
107 |
+
* We don't install it by default because it's super flaky and frequently
|
108 |
+
* crashes the installation process.
|
109 |
+
*
|
110 |
+
* You might also want to signal processes to put them in debug mode, for
|
111 |
+
* access to on-demand heapdumps.
|
112 |
+
*
|
113 |
+
* kill -s SIGUSR1 [pid]
|
114 |
+
*
|
115 |
+
* debug[something]processes
|
116 |
+
* ============================================================================
|
117 |
+
*
|
118 |
+
* Attach a `debug` property to `ProcessWrapper`, allowing you to see the last
|
119 |
+
* message it received before it hit an infinite loop.
|
120 |
+
*
|
121 |
+
* For example:
|
122 |
+
*
|
123 |
+
* >> ProcessManager.processManagers[4].processes[0].debug
|
124 |
+
* << "{"tar":"spe=60,all,!lc,!nfe","cmd":"dexsearch","canAll":true,"message":"/ds spe=60,all,!lc,!nfe"}"
|
125 |
+
*/
|
126 |
+
exports.ofemain = false;
|
127 |
+
exports.ofesockets = false;
|
128 |
+
exports.debugsimprocesses = true;
|
129 |
+
exports.debugvalidatorprocesses = true;
|
130 |
+
exports.debugdexsearchprocesses = true;
|
131 |
+
|
132 |
+
/**
|
133 |
+
* Pokemon of the Day - put a pokemon's name here to make it Pokemon of the Day
|
134 |
+
* The PotD will always be in the #2 slot (not #1 so it won't be a lead)
|
135 |
+
* in every Random Battle team.
|
136 |
+
*
|
137 |
+
* @type {ID}
|
138 |
+
*/
|
139 |
+
exports.potd = '';
|
140 |
+
|
141 |
+
/**
|
142 |
+
* crash guard - write errors to log file instead of crashing
|
143 |
+
* This is normally not recommended - if Node wants to crash, the
|
144 |
+
* server needs to be restarted
|
145 |
+
* However, most people want the server to stay online even if there is a
|
146 |
+
* crash, so this option is provided
|
147 |
+
*/
|
148 |
+
exports.crashguard = true;
|
149 |
+
|
150 |
+
/**
|
151 |
+
* login server data - don't forget the http:// and the trailing slash
|
152 |
+
* This is the URL of the user database and ladder mentioned earlier.
|
153 |
+
* Don't change this setting - there aren't any other login servers right now
|
154 |
+
*/
|
155 |
+
exports.loginserver = 'http://play.pokemonshowdown.com/';
|
156 |
+
exports.loginserverkeyalgo = "RSA-SHA1";
|
157 |
+
exports.loginserverpublickeyid = 4;
|
158 |
+
exports.loginserverpublickey = `-----BEGIN PUBLIC KEY-----
|
159 |
+
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAzfWKQXg2k8c92aiTyN37
|
160 |
+
dl76iW0aeAighgzeesdar4xZT1A9yzLpj2DgR8F8rh4R32/EVOPmX7DCf0bYWeh3
|
161 |
+
QttP0HVKKKfsncJZ9DdNtKj1vWdUTklH8oeoIZKs54dwWgnEFKzb9gxqu+z+FJoQ
|
162 |
+
vPnvfjCRUPA84O4kqKSuZT2qiWMFMWNQPXl87v+8Atb+br/WXvZRyiLqIFSG+ySn
|
163 |
+
Nwx6V1C8CA1lYqcPcTfmQs+2b4SzUa8Qwkr9c1tZnXlWIWj8dVvdYtlo0sZZBfAm
|
164 |
+
X71Rsp2vwEleSFKV69jj+IzAfNHRRw+SADe3z6xONtrJOrp+uC/qnLNuuCfuOAgL
|
165 |
+
dnUVFLX2aGH0Wb7ZkriVvarRd+3otV33A8ilNPIoPb8XyFylImYEnoviIQuv+0VW
|
166 |
+
RMmQlQ6RMZNr6sf9pYMDhh2UjU11++8aUxBaso8zeSXC9hhp7mAa7OTxts1t3X57
|
167 |
+
72LqtHHEzxoyLj/QDJAsIfDmUNAq0hpkiRaXb96wTh3IyfI/Lqh+XmyJuo+S5GSs
|
168 |
+
RhlSYTL4lXnj/eOa23yaqxRihS2MT9EZ7jNd3WVWlWgExIS2kVyZhL48VA6rXDqr
|
169 |
+
Ko0LaPAMhcfETxlFQFutoWBRcH415A/EMXJa4FqYa9oeXWABNtKkUW0zrQ194btg
|
170 |
+
Y929lRybWEiKUr+4Yw2O1W0CAwEAAQ==
|
171 |
+
-----END PUBLIC KEY-----
|
172 |
+
`;
|
173 |
+
|
174 |
+
/**
|
175 |
+
* routes - where Pokemon Showdown is hosted.
|
176 |
+
* Don't change this setting - there aren't any other options right now
|
177 |
+
*/
|
178 |
+
exports.routes = {
|
179 |
+
root: 'pokemonshowdown.com',
|
180 |
+
client: 'play.pokemonshowdown.com',
|
181 |
+
dex: 'dex.pokemonshowdown.com',
|
182 |
+
replays: 'replay.pokemonshowdown.com',
|
183 |
+
};
|
184 |
+
|
185 |
+
/**
|
186 |
+
* crashguardemail - if the server has been running for more than an hour
|
187 |
+
* and crashes, send an email using these settings, rather than locking down
|
188 |
+
* the server. Uncomment this definition if you want to use this feature;
|
189 |
+
* otherwise, all crashes will lock down the server. If you wish to enable
|
190 |
+
* this setting, you will need to install nodemailer, as it is not installed
|
191 |
+
* by default:
|
192 |
+
* $ npm install nodemailer
|
193 |
+
* @type {AnyObject?}
|
194 |
+
*/
|
195 |
+
exports.crashguardemail = null;
|
196 |
+
/* exports.crashguardemail = {
|
197 |
+
options: {
|
198 |
+
host: 'mail.example.com',
|
199 |
+
port: 465,
|
200 |
+
secure: true,
|
201 |
+
auth: {
|
202 |
+
user: '[email protected]',
|
203 |
+
pass: 'password'
|
204 |
+
}
|
205 |
+
},
|
206 |
+
from: '[email protected]',
|
207 |
+
to: '[email protected]',
|
208 |
+
subject: 'Pokemon Showdown has crashed!'
|
209 |
+
}; */
|
210 |
+
|
211 |
+
/**
|
212 |
+
* basic name filter - removes characters used for impersonation
|
213 |
+
* The basic name filter removes Unicode characters that can be used for impersonation,
|
214 |
+
* like the upside-down exclamation mark (looks like an i), the Greek omicron (looks
|
215 |
+
* like an o), etc. Disable only if you need one of the alphabets it disables, such as
|
216 |
+
* Greek or Cyrillic.
|
217 |
+
*/
|
218 |
+
exports.disablebasicnamefilter = false;
|
219 |
+
|
220 |
+
/**
|
221 |
+
* allowrequestingties - enables the use of `/offerdraw` and `/acceptdraw`
|
222 |
+
*/
|
223 |
+
exports.allowrequestingties = true;
|
224 |
+
|
225 |
+
/**
|
226 |
+
* report joins and leaves - shows messages like "<USERNAME> joined"
|
227 |
+
* Join and leave messages are small and consolidated, so there will never
|
228 |
+
* be more than one line of messages.
|
229 |
+
* If this setting is set to `true`, it will override the client-side
|
230 |
+
* /hidejoins configuration for users.
|
231 |
+
* This feature can lag larger servers - turn this off if your server is
|
232 |
+
* getting more than 80 or so users.
|
233 |
+
*/
|
234 |
+
exports.reportjoins = true;
|
235 |
+
|
236 |
+
/**
|
237 |
+
* report joins and leaves periodically - sends silent join and leave messages in batches
|
238 |
+
* This setting will only be effective if `reportjoins` is set to false, and users will
|
239 |
+
* only be able to see the messages if they have the /showjoins client-side setting enabled.
|
240 |
+
* Set this to a positive amount of milliseconds if you want to enable this feature.
|
241 |
+
*/
|
242 |
+
exports.reportjoinsperiod = 0;
|
243 |
+
|
244 |
+
/**
|
245 |
+
* report battles - shows messages like "OU battle started" in the lobby
|
246 |
+
* This feature can lag larger servers - turn this off if your server is
|
247 |
+
* getting more than 160 or so users.
|
248 |
+
* @type {boolean | string[] | string}
|
249 |
+
*/
|
250 |
+
exports.reportbattles = true;
|
251 |
+
|
252 |
+
/**
|
253 |
+
* report joins and leaves in battle - shows messages like "<USERNAME> joined" in battle
|
254 |
+
* Set this to false on large tournament servers where battles get a lot of joins and leaves.
|
255 |
+
* Note that the feature of turning this off is deprecated.
|
256 |
+
*/
|
257 |
+
exports.reportbattlejoins = true;
|
258 |
+
|
259 |
+
/**
|
260 |
+
* notify staff when users have a certain amount of room punishments.
|
261 |
+
* Setting this to a number greater than zero will notify staff for everyone with
|
262 |
+
* the required amount of room punishments.
|
263 |
+
* Set this to 0 to turn the monitor off.
|
264 |
+
*/
|
265 |
+
exports.monitorminpunishments = 3;
|
266 |
+
|
267 |
+
/**
|
268 |
+
* Turns off all time-based throttles - rename, challenges, laddering, etc.
|
269 |
+
*/
|
270 |
+
exports.nothrottle = false;
|
271 |
+
|
272 |
+
/**
|
273 |
+
* Removes all ip-based alt checking.
|
274 |
+
*/
|
275 |
+
exports.noipchecks = false;
|
276 |
+
|
277 |
+
/**
|
278 |
+
* controls the behavior of the /battlesearch command
|
279 |
+
*
|
280 |
+
* valid values are:
|
281 |
+
* - true: disables battlesearch entirely
|
282 |
+
* - false: enables the node.js /battlesearch
|
283 |
+
* (uses either node fs or ripgrep for searching)
|
284 |
+
* - 'psbattletools': defaults to the psbattletools /battlesearch (normally available as /alternatebattlesearch)
|
285 |
+
* (uses psbattletools, which must be installed, for searching)
|
286 |
+
*
|
287 |
+
* @type {boolean | 'psbattletools'}
|
288 |
+
*/
|
289 |
+
exports.nobattlesearch = false;
|
290 |
+
|
291 |
+
/**
|
292 |
+
* allow punishmentmonitor to lock users with multiple roombans.
|
293 |
+
* When set to `true`, this feature will automatically lock any users with three or more
|
294 |
+
* active roombans, and notify the staff room.
|
295 |
+
* Note that this requires punishmentmonitor to be enabled, and therefore requires the `monitorminpunishments`
|
296 |
+
* option to be set to a number greater than zero. If `monitorminpunishments` is set to a value greater than 3,
|
297 |
+
* the autolock will only apply to people who pass this threshold.
|
298 |
+
*/
|
299 |
+
exports.punishmentautolock = false;
|
300 |
+
|
301 |
+
/**
|
302 |
+
* restrict sending links to autoconfirmed users only.
|
303 |
+
* If this is set to `true`, only autoconfirmed users can send links to either chatrooms or other users, except for staff members.
|
304 |
+
* This option can be used if your server has trouble with spammers mass PMing links to users, or trolls sending malicious links.
|
305 |
+
*/
|
306 |
+
exports.restrictLinks = false;
|
307 |
+
|
308 |
+
/**
|
309 |
+
* whitelist - prevent users below a certain group from doing things
|
310 |
+
* For the modchat settings, false will allow any user to participate, while a string
|
311 |
+
* with a group symbol will restrict it to that group and above. The string
|
312 |
+
* 'autoconfirmed' is also supported for chatmodchat and battlemodchat, to restrict
|
313 |
+
* chat to autoconfirmed users.
|
314 |
+
* This is usually intended to be used as a whitelist feature - set these to '+' and
|
315 |
+
* voice every user you want whitelisted on the server.
|
316 |
+
|
317 |
+
/**
|
318 |
+
* chat modchat - default minimum group for speaking in chatrooms; changeable with /modchat
|
319 |
+
* @type {false | string}
|
320 |
+
*/
|
321 |
+
exports.chatmodchat = false;
|
322 |
+
/**
|
323 |
+
* battle modchat - default minimum group for speaking in battles; changeable with /modchat
|
324 |
+
* @type {false | AuthLevel}
|
325 |
+
*/
|
326 |
+
exports.battlemodchat = false;
|
327 |
+
/**
|
328 |
+
* PM modchat - minimum group for sending private messages or challenges to other users
|
329 |
+
* @type {false | AuthLevel}
|
330 |
+
*/
|
331 |
+
exports.pmmodchat = false;
|
332 |
+
/**
|
333 |
+
* ladder modchat - minimum group for laddering
|
334 |
+
* @type {false | GroupSymbol}
|
335 |
+
*/
|
336 |
+
exports.laddermodchat = false;
|
337 |
+
|
338 |
+
/**
|
339 |
+
* forced timer - force the timer on for all battles
|
340 |
+
* Players will be unable to turn it off.
|
341 |
+
* This setting can also be turned on with the command /forcetimer.
|
342 |
+
*
|
343 |
+
* @type {boolean}
|
344 |
+
*/
|
345 |
+
exports.forcetimer = false;
|
346 |
+
|
347 |
+
/**
|
348 |
+
* force register ELO - unregistered users cannot search for ladder battles
|
349 |
+
* in formats where their ELO is at or above this value.
|
350 |
+
* @type {false | number}
|
351 |
+
*/
|
352 |
+
exports.forceregisterelo = false;
|
353 |
+
|
354 |
+
/**
|
355 |
+
* backdoor - allows Pokemon Showdown system operators to provide technical
|
356 |
+
* support for your server
|
357 |
+
* This backdoor gives system operators (such as Zarel) console admin
|
358 |
+
* access to your server, which allow them to provide tech support. This
|
359 |
+
* can be useful in a variety of situations: if an attacker attacks your
|
360 |
+
* server and you are not online, if you need help setting up your server,
|
361 |
+
* etc. If you do not trust Pokemon Showdown with admin access, you should
|
362 |
+
* disable this feature.
|
363 |
+
*/
|
364 |
+
exports.backdoor = true;
|
365 |
+
|
366 |
+
/**
|
367 |
+
* List of IPs and user IDs with dev console (>> and >>>) access.
|
368 |
+
* The console is incredibly powerful because it allows the execution of
|
369 |
+
* arbitrary commands on the local computer (as the user running the
|
370 |
+
* server). If an account with the console permission were compromised,
|
371 |
+
* it could possibly be used to take over the server computer. As such,
|
372 |
+
* you should only specify a small range of trusted IPs and users here,
|
373 |
+
* or none at all. By default, only localhost can use the dev console.
|
374 |
+
* In addition to connecting from a valid IP, a user must *also* have
|
375 |
+
* the `console` permission in order to use the dev console.
|
376 |
+
* Setting this to an empty array ([]) will disable the dev console.
|
377 |
+
*/
|
378 |
+
exports.consoleips = ['127.0.0.1'];
|
379 |
+
|
380 |
+
/**
|
381 |
+
* Whether to watch the config file for changes. If this is enabled,
|
382 |
+
* then the config.js file will be reloaded when it is changed.
|
383 |
+
* This can be used to change some settings using a text editor on
|
384 |
+
* the server.
|
385 |
+
*/
|
386 |
+
exports.watchconfig = true;
|
387 |
+
|
388 |
+
/**
|
389 |
+
* logchat - whether to log chat rooms.
|
390 |
+
*/
|
391 |
+
exports.logchat = false;
|
392 |
+
|
393 |
+
/**
|
394 |
+
* logchallenges - whether to log challenge battles. Useful for tournament servers.
|
395 |
+
*/
|
396 |
+
exports.logchallenges = false;
|
397 |
+
|
398 |
+
/**
|
399 |
+
* loguserstats - how often (in milliseconds) to write user stats to the
|
400 |
+
* lobby log. This has no effect if `logchat` is disabled.
|
401 |
+
*/
|
402 |
+
exports.loguserstats = 1000 * 60 * 10; // 10 minutes
|
403 |
+
|
404 |
+
/**
|
405 |
+
* validatorprocesses - the number of processes to use for validating teams
|
406 |
+
* simulatorprocesses - the number of processes to use for handling battles
|
407 |
+
* You should leave both of these at 1 unless your server has a very large
|
408 |
+
* amount of traffic (i.e. hundreds of concurrent battles).
|
409 |
+
*/
|
410 |
+
exports.validatorprocesses = 1;
|
411 |
+
exports.simulatorprocesses = 1;
|
412 |
+
|
413 |
+
/**
|
414 |
+
* inactiveuserthreshold - how long a user must be inactive before being pruned
|
415 |
+
* from the `users` array. The default is 1 hour.
|
416 |
+
*/
|
417 |
+
exports.inactiveuserthreshold = 1000 * 60 * 60;
|
418 |
+
|
419 |
+
/**
|
420 |
+
* autolockdown - whether or not to automatically kill the server when it is
|
421 |
+
* in lockdown mode and the final battle finishes. This is potentially useful
|
422 |
+
* to prevent forgetting to restart after a lockdown where battles are finished.
|
423 |
+
*
|
424 |
+
* @type {boolean}
|
425 |
+
*/
|
426 |
+
exports.autolockdown = true;
|
427 |
+
|
428 |
+
/**
|
429 |
+
* noguestsecurity - purely for development servers: allows logging in without
|
430 |
+
* a signed token: simply send `/trn [USERNAME]`. This allows using PS without
|
431 |
+
* a login server.
|
432 |
+
*
|
433 |
+
* Logging in this way will make you considered an unregistered user and grant
|
434 |
+
* no authority. You cannot log into a trusted (g+/r%) user account this way.
|
435 |
+
*/
|
436 |
+
exports.noguestsecurity = false;
|
437 |
+
|
438 |
+
/**
|
439 |
+
* tourroom - specify a room to receive tournament announcements (defaults to
|
440 |
+
* the room 'tournaments').
|
441 |
+
* tourannouncements - announcements are only allowed in these rooms
|
442 |
+
* tourdefaultplayercap - a set cap of how many players can be in a tournament
|
443 |
+
* ratedtours - toggles tournaments being ladder rated (true) or not (false)
|
444 |
+
*/
|
445 |
+
exports.tourroom = '';
|
446 |
+
/** @type {string[]} */
|
447 |
+
exports.tourannouncements = [/* roomids */];
|
448 |
+
exports.tourdefaultplayercap = 0;
|
449 |
+
exports.ratedtours = false;
|
450 |
+
|
451 |
+
/**
|
452 |
+
* appealurl - specify a URL containing information on how users can appeal
|
453 |
+
* disciplinary actions on your section. You can also leave this blank, in
|
454 |
+
* which case users won't be given any information on how to appeal.
|
455 |
+
*/
|
456 |
+
exports.appealurl = '';
|
457 |
+
|
458 |
+
/**
|
459 |
+
* repl - whether repl sockets are enabled or not
|
460 |
+
* replsocketprefix - the prefix for the repl sockets to be listening on
|
461 |
+
* replsocketmode - the file mode bits to use for the repl sockets
|
462 |
+
*/
|
463 |
+
exports.repl = true;
|
464 |
+
exports.replsocketprefix = './logs/repl/';
|
465 |
+
exports.replsocketmode = 0o600;
|
466 |
+
|
467 |
+
/**
|
468 |
+
* disablehotpatchall - disables `/hotpatch all`. Generally speaking, there's a
|
469 |
+
* pretty big need for /hotpatch all - convenience. The only advantage any hotpatch
|
470 |
+
* forms other than all is lower RAM use (which is only a problem for Main because
|
471 |
+
* Main is huge), and to do pinpoint hotpatching (like /nohotpatch).
|
472 |
+
*/
|
473 |
+
exports.disablehotpatchall = false;
|
474 |
+
|
475 |
+
/**
|
476 |
+
* forcedpublicprefixes - user ID prefixes which will be forced to battle publicly.
|
477 |
+
* Battles involving user IDs which begin with one of the prefixes configured here
|
478 |
+
* will be unaffected by various battle privacy commands such as /modjoin, /hideroom
|
479 |
+
* or /ionext.
|
480 |
+
* @type {string[] | undefined}
|
481 |
+
*/
|
482 |
+
exports.forcedpublicprefixes = [];
|
483 |
+
|
484 |
+
/**
|
485 |
+
* startuphook - function to call when the server is fully initialized and ready
|
486 |
+
* to serve requests.
|
487 |
+
*/
|
488 |
+
exports.startuphook = function () {};
|
489 |
+
|
490 |
+
/**
|
491 |
+
* lastfmkey - the API key to let users use the last.fm commands from The Studio's
|
492 |
+
* chat plugin.
|
493 |
+
*/
|
494 |
+
exports.lastfmkey = '';
|
495 |
+
|
496 |
+
/**
|
497 |
+
* chatlogreader - the search method used for searching chatlogs.
|
498 |
+
* @type {'ripgrep' | 'fs'}
|
499 |
+
*/
|
500 |
+
exports.chatlogreader = 'fs';
|
501 |
+
/**
|
502 |
+
* permissions and groups:
|
503 |
+
* Each entry in `grouplist` is a seperate group. Some of the members are "special"
|
504 |
+
* while the rest is just a normal permission.
|
505 |
+
* The order of the groups determines their ranking.
|
506 |
+
* The special members are as follows:
|
507 |
+
* - symbol: Specifies the symbol of the group (as shown in front of the username)
|
508 |
+
* - id: Specifies an id for the group.
|
509 |
+
* - name: Specifies the human-readable name for the group.
|
510 |
+
* - root: If this is true, the group can do anything.
|
511 |
+
* - inherit: The group uses the group specified's permissions if it cannot
|
512 |
+
* find the permission in the current group. Never make the graph
|
513 |
+
* produced using this member have any cycles, or the server won't run.
|
514 |
+
* - jurisdiction: The default jurisdiction for targeted permissions where one isn't
|
515 |
+
* explictly specified. "Targeted permissions" are permissions
|
516 |
+
* that might affect another user, such as `ban' or `promote'.
|
517 |
+
* 's' is a special group where it means the user itself only
|
518 |
+
* and 'u' is another special group where it means all groups
|
519 |
+
* lower in rank than the current group.
|
520 |
+
* - roomonly: forces the group to be a per-room moderation rank only.
|
521 |
+
* - globalonly: forces the group to be a global rank only.
|
522 |
+
* All the possible permissions are as follows:
|
523 |
+
* - console: Developer console (>>).
|
524 |
+
* - lockdown: /lockdown and /endlockdown commands.
|
525 |
+
* - hotpatch: /hotpatch, /crashfixed and /savelearnsets commands.
|
526 |
+
* - ignorelimits: Ignore limits such as chat message length.
|
527 |
+
* - promote: Promoting and demoting. Will only work if the target user's current
|
528 |
+
* group and target group are both in jurisdiction.
|
529 |
+
* - room<rank>: /roompromote to <rank> (eg. roomvoice)
|
530 |
+
* - makeroom: Create/delete chatrooms, and set modjoin/roomdesc/privacy
|
531 |
+
* - editroom: Editing properties of rooms
|
532 |
+
* - editprivacy: Set modjoin/privacy only for battles
|
533 |
+
* - globalban: Banning and unbanning from the entire server.
|
534 |
+
* - ban: Banning and unbanning in rooms.
|
535 |
+
* - mute: Muting and unmuting.
|
536 |
+
* - lock: locking (ipmute) and unlocking.
|
537 |
+
* - receivemutedpms: Receive PMs from muted users.
|
538 |
+
* - forcerename: /fr command.
|
539 |
+
* - ip: IP checking.
|
540 |
+
* - alts: Alt checking.
|
541 |
+
* - modlog: view the moderator logs.
|
542 |
+
* - show: Show command output to other users.
|
543 |
+
* - showmedia: Show images and videos to other users.
|
544 |
+
* - declare: /declare command.
|
545 |
+
* - announce: /announce command.
|
546 |
+
* - modchat: Set modchat.
|
547 |
+
* - potd: Set PotD.
|
548 |
+
* - forcewin: /forcewin command.
|
549 |
+
* - battlemessage: /a command.
|
550 |
+
* - tournaments: creating tournaments (/tour new, settype etc.)
|
551 |
+
* - gamemoderation: /tour dq, autodq, end etc.
|
552 |
+
* - gamemanagement: enable/disable games, minigames, and tournaments.
|
553 |
+
* - minigame: make minigames (hangman, polls, etc.).
|
554 |
+
* - game: make games.
|
555 |
+
*/
|
556 |
+
exports.grouplist = [
|
557 |
+
{
|
558 |
+
symbol: '~',
|
559 |
+
id: "admin",
|
560 |
+
name: "Administrator",
|
561 |
+
inherit: '@',
|
562 |
+
jurisdiction: 'u',
|
563 |
+
globalonly: true,
|
564 |
+
|
565 |
+
console: true,
|
566 |
+
bypassall: true,
|
567 |
+
lockdown: true,
|
568 |
+
promote: '~u',
|
569 |
+
roomowner: true,
|
570 |
+
roombot: true,
|
571 |
+
roommod: true,
|
572 |
+
roomdriver: true,
|
573 |
+
forcewin: true,
|
574 |
+
declare: true,
|
575 |
+
addhtml: true,
|
576 |
+
rangeban: true,
|
577 |
+
makeroom: true,
|
578 |
+
editroom: true,
|
579 |
+
editprivacy: true,
|
580 |
+
potd: true,
|
581 |
+
disableladder: true,
|
582 |
+
gdeclare: true,
|
583 |
+
gamemanagement: true,
|
584 |
+
exportinputlog: true,
|
585 |
+
tournaments: true,
|
586 |
+
},
|
587 |
+
{
|
588 |
+
symbol: '#',
|
589 |
+
id: "owner",
|
590 |
+
name: "Room Owner",
|
591 |
+
inherit: '@',
|
592 |
+
jurisdiction: 'u',
|
593 |
+
roomonly: true,
|
594 |
+
|
595 |
+
roombot: true,
|
596 |
+
roommod: true,
|
597 |
+
roomdriver: true,
|
598 |
+
roomprizewinner: true,
|
599 |
+
editroom: true,
|
600 |
+
declare: true,
|
601 |
+
addhtml: true,
|
602 |
+
gamemanagement: true,
|
603 |
+
tournaments: true,
|
604 |
+
},
|
605 |
+
{
|
606 |
+
symbol: '\u2605',
|
607 |
+
id: "host",
|
608 |
+
name: "Host",
|
609 |
+
inherit: '@',
|
610 |
+
jurisdiction: 'u',
|
611 |
+
roomonly: true,
|
612 |
+
|
613 |
+
declare: true,
|
614 |
+
modchat: 'a',
|
615 |
+
gamemanagement: true,
|
616 |
+
forcewin: true,
|
617 |
+
tournaments: true,
|
618 |
+
joinbattle: true,
|
619 |
+
},
|
620 |
+
{
|
621 |
+
symbol: '@',
|
622 |
+
id: "mod",
|
623 |
+
name: "Moderator",
|
624 |
+
inherit: '%',
|
625 |
+
jurisdiction: 'u',
|
626 |
+
|
627 |
+
globalban: true,
|
628 |
+
ban: true,
|
629 |
+
modchat: 'a',
|
630 |
+
roomvoice: true,
|
631 |
+
roomwhitelist: true,
|
632 |
+
forcerename: true,
|
633 |
+
ip: true,
|
634 |
+
alts: '@u',
|
635 |
+
game: true,
|
636 |
+
},
|
637 |
+
{
|
638 |
+
symbol: '%',
|
639 |
+
id: "driver",
|
640 |
+
name: "Driver",
|
641 |
+
inherit: '+',
|
642 |
+
jurisdiction: 'u',
|
643 |
+
globalGroupInPersonalRoom: '@',
|
644 |
+
|
645 |
+
announce: true,
|
646 |
+
warn: '\u2605u',
|
647 |
+
kick: true,
|
648 |
+
mute: '\u2605u',
|
649 |
+
lock: true,
|
650 |
+
forcerename: true,
|
651 |
+
timer: true,
|
652 |
+
modlog: true,
|
653 |
+
alts: '%u',
|
654 |
+
bypassblocks: 'u%@~',
|
655 |
+
receiveauthmessages: true,
|
656 |
+
gamemoderation: true,
|
657 |
+
jeopardy: true,
|
658 |
+
joinbattle: true,
|
659 |
+
minigame: true,
|
660 |
+
modchat: true,
|
661 |
+
hiderank: true,
|
662 |
+
},
|
663 |
+
{
|
664 |
+
// Bots are ranked below Driver/Mod so that Global Bots can be kept out
|
665 |
+
// of modjoin % rooms (namely, Staff).
|
666 |
+
// (They were previously above Driver/Mod so they can have game management
|
667 |
+
// permissions drivers don't, but these permissions can be manually given.)
|
668 |
+
symbol: '*',
|
669 |
+
id: "bot",
|
670 |
+
name: "Bot",
|
671 |
+
inherit: '%',
|
672 |
+
jurisdiction: 'u',
|
673 |
+
|
674 |
+
addhtml: true,
|
675 |
+
tournaments: true,
|
676 |
+
declare: true,
|
677 |
+
bypassafktimer: true,
|
678 |
+
gamemanagement: true,
|
679 |
+
|
680 |
+
ip: false,
|
681 |
+
globalban: false,
|
682 |
+
lock: false,
|
683 |
+
forcerename: false,
|
684 |
+
alts: false,
|
685 |
+
},
|
686 |
+
{
|
687 |
+
symbol: '\u2606',
|
688 |
+
id: "player",
|
689 |
+
name: "Player",
|
690 |
+
inherit: '+',
|
691 |
+
battleonly: true,
|
692 |
+
|
693 |
+
roomvoice: true,
|
694 |
+
modchat: true,
|
695 |
+
editprivacy: true,
|
696 |
+
gamemanagement: true,
|
697 |
+
joinbattle: true,
|
698 |
+
nooverride: true,
|
699 |
+
},
|
700 |
+
{
|
701 |
+
symbol: '+',
|
702 |
+
id: "voice",
|
703 |
+
name: "Voice",
|
704 |
+
inherit: ' ',
|
705 |
+
|
706 |
+
altsself: true,
|
707 |
+
makegroupchat: true,
|
708 |
+
joinbattle: true,
|
709 |
+
show: true,
|
710 |
+
showmedia: true,
|
711 |
+
exportinputlog: true,
|
712 |
+
importinputlog: true,
|
713 |
+
},
|
714 |
+
{
|
715 |
+
symbol: '^',
|
716 |
+
id: "prizewinner",
|
717 |
+
name: "Prize Winner",
|
718 |
+
roomonly: true,
|
719 |
+
},
|
720 |
+
{
|
721 |
+
symbol: 'whitelist',
|
722 |
+
id: "whitelist",
|
723 |
+
name: "Whitelist",
|
724 |
+
inherit: ' ',
|
725 |
+
roomonly: true,
|
726 |
+
altsself: true,
|
727 |
+
show: true,
|
728 |
+
showmedia: true,
|
729 |
+
exportinputlog: true,
|
730 |
+
importinputlog: true,
|
731 |
+
},
|
732 |
+
{
|
733 |
+
symbol: ' ',
|
734 |
+
ipself: true,
|
735 |
+
},
|
736 |
+
{
|
737 |
+
name: 'Locked',
|
738 |
+
id: 'locked',
|
739 |
+
symbol: '\u203d',
|
740 |
+
punishgroup: 'LOCK',
|
741 |
+
},
|
742 |
+
{
|
743 |
+
name: 'Muted',
|
744 |
+
id: 'muted',
|
745 |
+
symbol: '!',
|
746 |
+
punishgroup: 'MUTE',
|
747 |
+
},
|
748 |
+
];
|
config/custom-example.css
ADDED
@@ -0,0 +1,9 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/**
|
2 |
+
* Custom CSS declarations
|
3 |
+
*
|
4 |
+
* If your server is registered, you can create a file named `custom.css`
|
5 |
+
* in the `config` directory and populate it with CSS rules to override the
|
6 |
+
* normal client styles, when the client is connected to your server. In
|
7 |
+
* other words, you can use this facility to introduce a custom theme for
|
8 |
+
* your server.
|
9 |
+
*/
|
config/formats.ts
ADDED
The diff for this file is too large to render.
See raw diff
|
|
config/hosts.csv
ADDED
@@ -0,0 +1,124 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
RESIDENTIAL,bell.ca
|
2 |
+
RESIDENTIAL,bellmts.net
|
3 |
+
RESIDENTIAL,bellsouth.net
|
4 |
+
RESIDENTIAL,cgocable.net
|
5 |
+
RESIDENTIAL,charter.com
|
6 |
+
RESIDENTIAL,comcast.net
|
7 |
+
RESIDENTIAL,comcast.net?/res
|
8 |
+
RESIDENTIAL,comcastbusiness.net
|
9 |
+
RESIDENTIAL,cornell.edu
|
10 |
+
RESIDENTIAL,cox.net
|
11 |
+
RESIDENTIAL,embarqhsd.net
|
12 |
+
RESIDENTIAL,frontiernet.net
|
13 |
+
RESIDENTIAL,hargray.net
|
14 |
+
RESIDENTIAL,itctel.com
|
15 |
+
RESIDENTIAL,mlgc.com
|
16 |
+
RESIDENTIAL,netins.net
|
17 |
+
RESIDENTIAL,optonline.net
|
18 |
+
RESIDENTIAL,odu.edu
|
19 |
+
RESIDENTIAL,osu.edu
|
20 |
+
RESIDENTIAL,qwest.net
|
21 |
+
RESIDENTIAL,rogers.com
|
22 |
+
RESIDENTIAL,rr.com
|
23 |
+
RESIDENTIAL,sbcglobal.net
|
24 |
+
RESIDENTIAL,shawcable.net
|
25 |
+
RESIDENTIAL,sonic.net
|
26 |
+
RESIDENTIAL,sourcecable.net
|
27 |
+
RESIDENTIAL,unc.edu
|
28 |
+
RESIDENTIAL,verizon.net
|
29 |
+
RESIDENTIAL,videotron.ca
|
30 |
+
RESIDENTIAL,virginmobile.ca
|
31 |
+
RESIDENTIAL,vt.edu
|
32 |
+
RESIDENTIAL,wayport.net
|
33 |
+
RESIDENTIAL,windstream.net
|
34 |
+
RESIDENTIAL,spectrum.com
|
35 |
+
RESIDENTIAL,rcncustomer.com
|
36 |
+
RESIDENTIAL,eircom.net
|
37 |
+
RESIDENTIAL,bhn.net
|
38 |
+
RESIDENTIAL,suddenlink.net
|
39 |
+
RESIDENTIAL,xplornet.com
|
40 |
+
MOBILE,myvzw.com
|
41 |
+
MOBILE,mycingular.net
|
42 |
+
MOBILE,spcsdns.net
|
43 |
+
MOBILE,tmodns.net
|
44 |
+
MOBILE,tmobile?/mobile
|
45 |
+
MOBILE,tele2.se
|
46 |
+
MOBILE,ideacellular?/mobile
|
47 |
+
MOBILE,att.net
|
48 |
+
MOBILE,telus.com
|
49 |
+
MOBILE,sfr.net
|
50 |
+
RANGE,1.187.0.0,1.187.255.255,ideacellular?/mobile
|
51 |
+
RANGE,27.97.0.0,27.97.255.255,ideacellular?/mobile
|
52 |
+
RANGE,27.111.64.0,27.111.71.255,edu.au?/res
|
53 |
+
RANGE,27.125.128.0,27.125.191.255,starhub.com?/mobile
|
54 |
+
RANGE,47.15.0.0,47.15.255.255,ril.com?/mobile
|
55 |
+
RANGE,49.14.0.0,49.15.255.255,ideacellular?/mobile
|
56 |
+
RANGE,58.96.192.0,58.96.255.255,starhub.com?/mobile
|
57 |
+
RANGE,64.150.0.0,64.150.255.255,illinois.net?/res
|
58 |
+
RANGE,78.111.200.0,78.111.203.255,sure.com?/res
|
59 |
+
RANGE,88.81.128.0,88.81.146.255,sure.com?/res
|
60 |
+
RANGE,89.35.82.0,89.35.83.255,sure.com?/res
|
61 |
+
RANGE,89.42.115.0,89.42.115.255,sure.com?/res
|
62 |
+
RANGE,91.190.160.0,91.190.163.255,sure.com?/res
|
63 |
+
RANGE,92.184.116.0,92.184.117.255,orange.com?/mobile
|
64 |
+
RANGE,93.187.144.0,93.187.147.255,sure.com?/res
|
65 |
+
RANGE,96.31.192.0,96.31.207.255,psci.net?/res
|
66 |
+
RANGE,101.127.0.0,101.127.127.255,starhub.com?/mobile
|
67 |
+
RANGE,104.249.64.0,104.249.127.255,ocde.us?/res
|
68 |
+
RANGE,106.76.0.0,106.79.255.255,ideacellular?/mobile
|
69 |
+
RANGE,107.224.0.0,107.255.255.255,att.com?/mobile
|
70 |
+
RANGE,109.190.0.0,109.190.63.255,ovh.fr?/res
|
71 |
+
RANGE,109.190.64.0,109.190.127.255,ovh.fr?/res
|
72 |
+
RANGE,109.190.128.0,109.190.191.255,ovh.fr?/res
|
73 |
+
RANGE,109.190.192.0,109.190.255.255,ovh.fr?/res
|
74 |
+
RANGE,112.110.0.0,112.110.255.255,ideacellular?/mobile
|
75 |
+
RANGE,112.198.0.0,112.198.255.255,globe.com.ph?/mobile
|
76 |
+
RANGE,114.0.0.0,114.15.255.255,indosat.com?/mobile
|
77 |
+
RANGE,116.88.0.0,116.88.127.255,starhub.com?/mobile
|
78 |
+
RANGE,119.56.64.0,119.56.127.255,m1.com.sg?/mobile
|
79 |
+
RANGE,121.54.0.0,121.54.255.255,smart.com.ph?/mobile
|
80 |
+
RANGE,122.11.192.0,122.11.255.255,starhub.com?/mobile
|
81 |
+
RANGE,127.0.0.1,127.0.0.1,localhost
|
82 |
+
RANGE,136.24.0.0,136.31.255.255,webpass.com?/res
|
83 |
+
RANGE,147.129.0.0,147.129.255.255,ithaca.edu?/res
|
84 |
+
RANGE,149.254.0.0,149.254.255.255,tmobile?/mobile
|
85 |
+
RANGE,151.3.0.0,151.79.255.255,wind.it?/res
|
86 |
+
RANGE,151.80.228.0,151.80.228.255,ovh.fr?/res
|
87 |
+
RANGE,151.81.0.0,151.84.255.255,wind.it?/res
|
88 |
+
RANGE,151.93.0.0,151.93.255.255,wind.it?/res
|
89 |
+
RANGE,151.95.0.0,151.95.255.255,wind.it?/res
|
90 |
+
RANGE,153.107.0.0,153.107.255.255,edu.au?/res
|
91 |
+
RANGE,172.32.0.0,172.63.255.255,tmobile?/mobile
|
92 |
+
RANGE,172.242.0.0,172.243.255.255,viasat.com?/mobile
|
93 |
+
RANGE,176.206.0.0,176.207.255.255,wind.it?/res
|
94 |
+
RANGE,178.32.37.0,178.32.37.255,ovh.fr?/res
|
95 |
+
RANGE,178.33.101.0,178.33.101.255,ovh.fr?/res
|
96 |
+
RANGE,179.7.0.0,179.7.255.255,claro.com.pe?/mobile
|
97 |
+
RANGE,179.52.0.0,179.53.255.255,codetel.net.do?/mobile
|
98 |
+
RANGE,180.95.40.0,180.95.47.255,edu.au?/res
|
99 |
+
RANGE,180.191.0.0,180.191.255.255,globe.com.ph?/mobile
|
100 |
+
RANGE,181.64.0.0,181.65.255.255,telefonica.net.pe?/mobile
|
101 |
+
RANGE,182.19.128.0,182.19.255.255,starhub.com?/mobile
|
102 |
+
RANGE,182.55.0.0,182.55.255.255,starhub.com?/mobile
|
103 |
+
RANGE,183.90.0.0,183.90.127.255,starhub.com?/mobile
|
104 |
+
RANGE,185.15.68.0,185.15.69.255,ovh.fr?/res
|
105 |
+
RANGE,185.15.70.0,185.15.71.255,ovh.fr?/res
|
106 |
+
RANGE,189.204.0.0,189.204.255.255,bestel.com.mx?/res
|
107 |
+
RANGE,190.235.0.0,190.235.127.255,telefonica.net.pe?/mobile
|
108 |
+
RANGE,191.104.0.0,191.111.255.255,movistar.co?/mobile
|
109 |
+
RANGE,191.128.0.0,191.143.255.255,tim.com.br?/mobile
|
110 |
+
RANGE,199.8.0.0,199.8.255.255,iu.edu?/res
|
111 |
+
RANGE,200.10.75.128,200.10.75.191,telefonica.net.pe?/mobile
|
112 |
+
RANGE,200.37.0.0,200.37.255.255,telefonica.net.pe?/mobile
|
113 |
+
RANGE,200.48.0.0,200.48.255.255,telefonica.net.pe?/mobile
|
114 |
+
RANGE,200.60.128.0,200.60.191.255,telefonica.net.pe?/mobile
|
115 |
+
RANGE,201.141.0.0,201.141.255.255,cablevision.net.mx?/mobile
|
116 |
+
RANGE,202.12.94.0,202.12.95.255,nyp.edu.sg?/res
|
117 |
+
RANGE,203.104.0.0,203.104.15.255,edu.au?/res
|
118 |
+
RANGE,203.116.122.0,203.116.123.255,starhub.com?/mobile
|
119 |
+
RANGE,209.52.0.0,209.52.255.255,telus.com?/mobile
|
120 |
+
RANGE,209.232.144.0,209.232.159.255,ocde.us?/res
|
121 |
+
RANGE,209.239.96.0,209.239.111.255,psci.net?/res
|
122 |
+
RANGE,216.49.96.0,216.49.127.255,psci.net?/res
|
123 |
+
RANGE,216.100.88.0,216.100.95.255,ocde.us?/res
|
124 |
+
RANGE,218.188.0.0,218.189.255.255,hgc.com.hk?/mobile
|
config/ladders/README.md
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
Ladders are stored here in files named `FORMATID.tsv`.
|
2 |
+
|
3 |
+
TSV files are spreadsheets and are best opened with spreadsheet programs such as Excel. Text editors can also handle them, although not as easily.
|
config/proxies.csv
ADDED
The diff for this file is too large to render.
See raw diff
|
|
config/suspects.json
ADDED
@@ -0,0 +1 @@
|
|
|
|
|
1 |
+
{"whitelist":[],"suspects":{}}
|
data/FORMES.md
ADDED
@@ -0,0 +1,197 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
Pokémon formes
|
2 |
+
==============
|
3 |
+
|
4 |
+
Officially, in media from The Pokémon Company, "form" (_sugata_ in Japanese) usually refers to same-species variants of non-legendary Pokémon, and "forme" (_foomu_ in Japanese) usually refers to same-species variants of legendary Pokémon. A number of variations are not called anything at all.
|
5 |
+
|
6 |
+
The fandom is inconsistent about what it calls these variations, and because we need _some_ word as an umbrella term for all of them, PS chooses to call all these variations "forme".
|
7 |
+
|
8 |
+
In code, an instance of `Species` refers to a specific forme, which can be accessed with `species.forme`.
|
9 |
+
|
10 |
+
|
11 |
+
"Regular" formes
|
12 |
+
----------------
|
13 |
+
|
14 |
+
At its most simplest, a forme is like a different species, just with the same species name and dex number. You can't convert between formes, they can have their own learnset, type, Abilities, etc.
|
15 |
+
|
16 |
+
A good example of this would be Wormadam-Plant vs Wormadam-Sandy.
|
17 |
+
|
18 |
+
In PS's data files, we designate one of these formes as "the base forme", to be used when you try to access the species without specifying the forme.
|
19 |
+
|
20 |
+
So Wormadam-Plant would be:
|
21 |
+
|
22 |
+
`{name: "Wormadam", forme: "", baseForme: "Plant", baseSpecies: "Wormadam", otherFormes: ["wormadamsandy", "wormadamtrash"]}`
|
23 |
+
|
24 |
+
And then Wormadam-Sandy would be:
|
25 |
+
|
26 |
+
`{name: "Wormadam-Sandy", forme: "Sandy", baseForme: "", baseSpecies: "Wormadam", otherFormes: null}`
|
27 |
+
|
28 |
+
Note that `otherFormes` only exists on the dex entry for the _base_ forme.
|
29 |
+
|
30 |
+
Examples include:
|
31 |
+
|
32 |
+
- Wormadam
|
33 |
+
- all Galarian and Alolan regional formes
|
34 |
+
|
35 |
+
|
36 |
+
Cosmetic formes
|
37 |
+
---------------
|
38 |
+
|
39 |
+
Cosmetic formes have no competitive difference from their base forme whatsoever, besides appearance. They are identical in stats, types, learnable moves, ability, and everything else besides appearance.
|
40 |
+
|
41 |
+
These include:
|
42 |
+
|
43 |
+
- Unown
|
44 |
+
- Vivillon (patterns) (except Poké Ball Pattern and Fancy Pattern)
|
45 |
+
- Deerling/Sawsbuck
|
46 |
+
- Gastrodon
|
47 |
+
- Flabébé, Floette (except Eternal Flower), Florges
|
48 |
+
- Minior (colors)
|
49 |
+
|
50 |
+
Cosmetic formes are not listed in the `otherFormes` array, only in the `cosmeticFormes` array.
|
51 |
+
|
52 |
+
`{name: "Gastrodon", baseForme: "West", cosmeticFormes: ["gastodoneast"]}`
|
53 |
+
|
54 |
+
You will still be able to get a data entry for a cosmetic forme with `Dex.species.get` as normal, though, such as `Dex.species.get('gastrodon-east')`:
|
55 |
+
|
56 |
+
`{name: "Gastrodon-East", forme: "East", baseSpecies: "Gastrodon"}`
|
57 |
+
|
58 |
+
|
59 |
+
Visual formes
|
60 |
+
-------------
|
61 |
+
|
62 |
+
Some formes are _nearly_ cosmetic formes, but they have differences in what moves they can learn (or whether they can be shiny) due to the existence of events that only distribute one visual forme.
|
63 |
+
|
64 |
+
Other formes are nearly cosmetic formes, but require a specific held item to attain that forme.
|
65 |
+
|
66 |
+
The games themselves consider them the same as cosmetic formes, but PS considers them non-cosmetic because they affect move legality and team validation.
|
67 |
+
|
68 |
+
Polteageist (Antique Form) is considered a visual forme, but with some special treatment planned to make it a visually indistinguishable forme.
|
69 |
+
|
70 |
+
Learnset-based visual formes include:
|
71 |
+
|
72 |
+
- Polteageist
|
73 |
+
- Vivillon (Fancy Pattern)
|
74 |
+
- Vivillon (Poké Ball Pattern)
|
75 |
+
- Keldeo (Resolute Forme)
|
76 |
+
- all totems
|
77 |
+
|
78 |
+
Item-based visual formes include:
|
79 |
+
|
80 |
+
- Genesect
|
81 |
+
- Arceus
|
82 |
+
|
83 |
+
Arceus formes are listed as having the type enforced by Multitype. For instance, Arceus-Flying is listed to have Flying type, rather than Normal type. This is purely a convenience to display the type a user would expect: its actual type is still Normal type because it's a visual forme of Arceus-Normal (it having Flying-type in-game is an effect of the Multitype ability, not a property of the forme).
|
84 |
+
|
85 |
+
Visual formes in PS are implemented as regular formes.
|
86 |
+
|
87 |
+
|
88 |
+
Formes changeable out-of-battle
|
89 |
+
-------------------------------
|
90 |
+
|
91 |
+
Some Pokémon can change forme out-of-battle. These include:
|
92 |
+
|
93 |
+
- Rotom
|
94 |
+
- Arceus
|
95 |
+
- Genesect
|
96 |
+
- Giratina
|
97 |
+
|
98 |
+
PS establishes one of their formes as the "original forme", and gives the others a `changesFrom` property pointing to the original forme.
|
99 |
+
|
100 |
+
If a held item is required for a Pokémon to start battle with that forme, the `requiredItem` property will track this.
|
101 |
+
|
102 |
+
`{name: "Giratina-Origin", forme: "Origin", baseSpecies: "Giratina", changesFrom: "Giratina", requiredItem: "Griseous Orb"}`
|
103 |
+
|
104 |
+
Some changeable formes (like Arceus) are visual formes. See "Visual formes" above for more information.
|
105 |
+
|
106 |
+
Changeable formes are otherwise treated identically to regular formes.
|
107 |
+
|
108 |
+
|
109 |
+
In-battle formes
|
110 |
+
----------------
|
111 |
+
|
112 |
+
Some Pokémon change forme in the middle of a battle. These forme changes do reset stats and type.
|
113 |
+
|
114 |
+
List of all in-battle forme changes:
|
115 |
+
|
116 |
+
- Ash-Greninja (Battle Bond)
|
117 |
+
- Mimikyu (Disguise)
|
118 |
+
- Cherrim (Flower Gift)
|
119 |
+
- Castform (Forecast)
|
120 |
+
- Cramorant (Gulp Missile)
|
121 |
+
- Morpeko (Hunger Switch)
|
122 |
+
- Eiscue (Ice Face)
|
123 |
+
- Zygarde (Power Construct)
|
124 |
+
- Wishiwashi (Schooling)
|
125 |
+
- Minior (Shields Down)
|
126 |
+
- Aegislash (Stance Change)
|
127 |
+
- Darmanitan (Zen Mode)
|
128 |
+
- Meloetta (Relic Song)
|
129 |
+
- Shaymin-Sky (Frozen status)
|
130 |
+
- Mega evolutions
|
131 |
+
- Primal reversions
|
132 |
+
- Ultra Burst
|
133 |
+
|
134 |
+
PS treats these identically to regular formes, but gives them a `battleOnly` property noting what forme they would be in at the start of battle:
|
135 |
+
|
136 |
+
`{name: "Meloetta-Pirouette", forme: "Pirouette", battleOnly: "Meloetta", requiredMove: "Relic Song"}`
|
137 |
+
|
138 |
+
These may or may not also have a `requiredItem`, `requiredAbility`, or `requiredMove` property, which notes anything required for the in-battle forme transformation.
|
139 |
+
|
140 |
+
|
141 |
+
Visual in-battle formes
|
142 |
+
-----------------------
|
143 |
+
|
144 |
+
Some Pokémon change their appearance mid-battle, but not in a way that changes their base stats, Ability, or type. These include:
|
145 |
+
|
146 |
+
- Cherrim
|
147 |
+
- Cramorant
|
148 |
+
- Mimikyu
|
149 |
+
|
150 |
+
PS treats these like regular in-battle formes.
|
151 |
+
|
152 |
+
|
153 |
+
"Fake" visual in-battle formes
|
154 |
+
------------------------------
|
155 |
+
|
156 |
+
Dynamax/Gigantamax can be thought of as visual in-battle formes, but they're different in one major way: They're not considered "real" forme changes, so the change doesn't reset types and stats changed by Reflect Type, Power Split, Power Trick, etc.
|
157 |
+
|
158 |
+
These include:
|
159 |
+
|
160 |
+
- all Dynamax and Gigantamax changes
|
161 |
+
|
162 |
+
PS has dex entries for Gigantamax Pokémon (to make their sprites easier to access) but not Dynamax Pokémon.
|
163 |
+
|
164 |
+
|
165 |
+
Event-only Ability formes
|
166 |
+
-------------------------
|
167 |
+
|
168 |
+
Some Pokémon have have separate forme in the game code, purely to support having an event-only Ability. These formes look identical to their base forme, and have the same type, stats, and level-up/TM/tutor moves. The only difference is their Ability and which events you can get them from.
|
169 |
+
|
170 |
+
These include:
|
171 |
+
|
172 |
+
- Rockruff (with Own Tempo)
|
173 |
+
- Greninja (with Battle Bond)
|
174 |
+
- Zygarde (10% Forme) (with Power Construct)
|
175 |
+
- Zygarde (50% Forme) (with Power Construct)
|
176 |
+
|
177 |
+
Greninja in the game code has three formes: regular, Battle Bond, and Ash-Greninja. Battle Bond is an event-only ability forme, and Ash-Greninja is an in-battle forme of the the event-only ability forme.
|
178 |
+
|
179 |
+
Zygarde works the same way, with five formes: regular 50% Zygarde, event-only Power Construct 50% Zygarde, regular 10% Zygarde, event-only Power Construct 10% Zygarde, Zygarde Complete being an in-battle only forme of either event-only Power Construct 10% Zygarde or event-only Power Construct 50% Zygarde.
|
180 |
+
|
181 |
+
PS's current implementation of this is weird and will be changed in a few days; do not rely on its current implementation.
|
182 |
+
|
183 |
+
|
184 |
+
Not formes
|
185 |
+
----------
|
186 |
+
|
187 |
+
Alcremie garnishes and Spinda spot patterns aren't considered formes by the games themselves. PS doesn't support them at all.
|
188 |
+
|
189 |
+
Dynamax and Gigantamax are not considered formes by the games themselves. PS implements them correctly in the simulator as volatile statuses, but does have dex entries for Gigantamax Pokémon (treating them as in-battle formes) to make their sprites easier to access, and to make Gigantamax-capable Pokémon easier to select in the teambuilder.
|
190 |
+
|
191 |
+
|
192 |
+
`pokedex.js`
|
193 |
+
------------
|
194 |
+
|
195 |
+
All the data shown here is information available from `Dex.species.get`. Data in `pokedex.js` will not necessarily contain the same information.
|
196 |
+
|
197 |
+
Most importantly, note that cosmetic formes are not listed in `pokedex.js`, but generated automatically from their base forme entry.
|
data/abilities.ts
ADDED
The diff for this file is too large to render.
See raw diff
|
|
data/aliases.ts
ADDED
@@ -0,0 +1,2371 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
export const Aliases: import('../sim/dex').AliasesTable = {
|
2 |
+
// formats
|
3 |
+
randbats: "[Gen 9] Random Battle",
|
4 |
+
uber: "[Gen 9] Ubers",
|
5 |
+
anythinggoes: "[Gen 9] Anything Goes",
|
6 |
+
ubers: "[Gen 9] Ubers",
|
7 |
+
uubers: "[Gen 9] Ubers UU",
|
8 |
+
overused: "[Gen 9] OU",
|
9 |
+
underused: "[Gen 9] UU",
|
10 |
+
rarelyused: "[Gen 9] RU",
|
11 |
+
neverused: "[Gen 9] NU",
|
12 |
+
pu: "[Gen 9] PU",
|
13 |
+
zu: "[Gen 9] ZU",
|
14 |
+
zeroused: "[Gen 9] ZU",
|
15 |
+
mono: "[Gen 9] Monotype",
|
16 |
+
ag: "[Gen 9] Anything Goes",
|
17 |
+
bss: "[Gen 9] Battle Stadium Singles Series 2",
|
18 |
+
vgc: "[Gen 9] VGC 2023 Series 2",
|
19 |
+
bsd: "[Gen 9] VGC 2023 Series 2",
|
20 |
+
randdubs: "[Gen 9] Random Doubles Battle",
|
21 |
+
doubles: "[Gen 9] Doubles OU",
|
22 |
+
dou: "[Gen 9] Doubles OU",
|
23 |
+
dubs: "[Gen 9] Doubles OU",
|
24 |
+
dubers: "[Gen 9] Doubles Ubers",
|
25 |
+
duu: "[Gen 9] Doubles UU",
|
26 |
+
"2v2": "[Gen 9] 2v2 Doubles",
|
27 |
+
natdex: "[Gen 9] National Dex",
|
28 |
+
nd: "[Gen 9] National Dex",
|
29 |
+
ndou: "[Gen 9] National Dex",
|
30 |
+
gen8natdex: "[Gen 8] National Dex",
|
31 |
+
gen8nd: "[Gen 8] National Dex",
|
32 |
+
gen8ndou: "[Gen 8] National Dex",
|
33 |
+
natdexubers: "[Gen 9] National Dex Ubers",
|
34 |
+
ndubers: "[Gen 9] National Dex Ubers",
|
35 |
+
natdexuu: "[Gen 9] National Dex UU",
|
36 |
+
nduu: "[Gen 9] National Dex UU",
|
37 |
+
natdexru: "[Gen 9] National Dex RU",
|
38 |
+
ndru: "[Gen 9] National Dex RU",
|
39 |
+
natdexmonotype: "[Gen 8] National Dex Monotype",
|
40 |
+
natdexmono: "[Gen 8] National Dex Monotype",
|
41 |
+
ndmono: "[Gen 8] National Dex Monotype",
|
42 |
+
natdexag: "[Gen 9] National Dex AG",
|
43 |
+
ndag: "[Gen 9] National Dex AG",
|
44 |
+
natdexbh: "[Gen 9] National Dex BH",
|
45 |
+
ndbh: "[Gen 9] National Dex BH",
|
46 |
+
bh: "[Gen 9] Balanced Hackmons",
|
47 |
+
mnm: "[Gen 9] Mix and Mega",
|
48 |
+
aaa: "[Gen 9] Almost Any Ability",
|
49 |
+
aaauu: "[Gen 9] Almost Any Ability UU",
|
50 |
+
stab: "[Gen 9] STABmons",
|
51 |
+
gg: "[Gen 9] Godly Gift",
|
52 |
+
pic: "[Gen 9] Partners in Crime",
|
53 |
+
camo: "[Gen 9] Camomons",
|
54 |
+
revmons: "[Gen 9] Revelationmons",
|
55 |
+
tcg: "[Gen 9] The Card Game",
|
56 |
+
fotf: "[Gen 9] Force of the Fallen",
|
57 |
+
ffa: "[Gen 9] Free-For-All",
|
58 |
+
ph: "[Gen 9] Pure Hackmons",
|
59 |
+
hackmons: "[Gen 9] Pure Hackmons",
|
60 |
+
gen6ph: "[Gen 6] Pure Hackmons",
|
61 |
+
gen6hackmons: "[Gen 6] Pure Hackmons",
|
62 |
+
cc1v1: "[Gen 9] Challenge Cup 1v1",
|
63 |
+
cc2v2: "[Gen 9] Challenge Cup 2v2",
|
64 |
+
cgt: "[Gen 9] Computer-Generated Teams",
|
65 |
+
compgen: "[Gen 9] Computer-Generated Teams",
|
66 |
+
hc: "[Gen 9] Hackmons Cup",
|
67 |
+
monorandom: "[Gen 8] Monotype Random Battle",
|
68 |
+
bf: "[Gen 8] Battle Factory",
|
69 |
+
bssf: "[Gen 9] BSS Factory",
|
70 |
+
ssb: "[Gen 9] Super Staff Bros Ultimate",
|
71 |
+
ssbu: "[Gen 9] Super Staff Bros Ultimate",
|
72 |
+
lgrandom: "[Gen 7] Let's Go Random Battle",
|
73 |
+
gen6bf: "[Gen 6] Battle Factory",
|
74 |
+
gen7mono: "[Gen 7] Monotype",
|
75 |
+
gen7ag: "[Gen 7] Anything Goes",
|
76 |
+
gen7bf: "[Gen 7] Battle Factory",
|
77 |
+
gen7bss: "[Gen 7] Battle Spot Singles",
|
78 |
+
gen7bssf: "[Gen 7] BSS Factory",
|
79 |
+
gen8bssf: "[Gen 8] BSS Factory",
|
80 |
+
lgpeou: "[Gen 7 Let's Go] OU",
|
81 |
+
lgou: "[Gen 7 Let's Go] Let's Go OU",
|
82 |
+
lgdou: "[Gen 7 Let's Go] Doubles OU",
|
83 |
+
lgpedou: "[Gen 7 Let's Go] OU",
|
84 |
+
vgc20: "[Gen 8] VGC 2020",
|
85 |
+
vgc19: "[Gen 7] VGC 2019",
|
86 |
+
vgc18: "[Gen 7] VGC 2018",
|
87 |
+
vgc17: "[Gen 7] VGC 2017",
|
88 |
+
gen7bsd: "[Gen 7] Battle Spot Doubles",
|
89 |
+
gen6mono: "[Gen 6] Monotype",
|
90 |
+
gen6ag: "[Gen 6] Anything Goes",
|
91 |
+
crossevo: "[Gen 9] Cross Evolution",
|
92 |
+
mayhem: "[Gen 9] Random Battle Mayhem",
|
93 |
+
omotm: "[Gen 9] Alphabet Cup",
|
94 |
+
lcotm: "[Gen 9] 1-2 Switch",
|
95 |
+
|
96 |
+
// mega evos
|
97 |
+
fabio: "Ampharos-Mega",
|
98 |
+
maero: "Aerodactyl-Mega",
|
99 |
+
megabunny: "Lopunny-Mega",
|
100 |
+
megabro: "Slowbro-Mega",
|
101 |
+
megacharizard: "Charizard-Mega-Y",
|
102 |
+
megacharizardx: "Charizard-Mega-X",
|
103 |
+
megacharizardy: "Charizard-Mega-Y",
|
104 |
+
megadoom: "Houndoom-Mega",
|
105 |
+
megadrill: "Beedrill-Mega",
|
106 |
+
megagard: "Gardevoir-Mega",
|
107 |
+
megacross: "Heracross-Mega",
|
108 |
+
megakhan: "Kangaskhan-Mega",
|
109 |
+
megalop: "Lopunny-Mega",
|
110 |
+
megaluc: "Lucario-Mega",
|
111 |
+
megamaw: "Mawile-Mega",
|
112 |
+
megamedi: "Medicham-Mega",
|
113 |
+
megamewtwo: "Mewtwo-Mega-Y",
|
114 |
+
megamewtwox: "Mewtwo-Mega-X",
|
115 |
+
megamewtwoy: "Mewtwo-Mega-Y",
|
116 |
+
mewtwox: "Mewtwo-Mega-X",
|
117 |
+
mewtwoy: "Mewtwo-Mega-Y",
|
118 |
+
megasnow: "Abomasnow-Mega",
|
119 |
+
megashark: "Sharpedo-Mega",
|
120 |
+
megasaur: "Venusaur-Mega",
|
121 |
+
mmx: "Mewtwo-Mega-X",
|
122 |
+
mmy: "Mewtwo-Mega-Y",
|
123 |
+
zardx: "Charizard-Mega-X",
|
124 |
+
zardy: "Charizard-Mega-Y",
|
125 |
+
|
126 |
+
// Pokéstar Studios
|
127 |
+
blackdoor: "Pokestar Black-Door",
|
128 |
+
brycen: "Brycen-Man",
|
129 |
+
brycenman: "Pokestar Brycen-Man",
|
130 |
+
f00: "Pokestar F00",
|
131 |
+
f002: "Pokestar F002",
|
132 |
+
giant: "Pokestar Giant",
|
133 |
+
mt: "Pokestar MT",
|
134 |
+
mt2: "Pokestar MT2",
|
135 |
+
majin: "Spirit",
|
136 |
+
mechatyranitar: "MT",
|
137 |
+
mechatyranitar2: "MT2",
|
138 |
+
monica: "Giant",
|
139 |
+
spirit: "Pokestar Spirit",
|
140 |
+
transport: "Pokestar Transport",
|
141 |
+
ufo: "Pokestar UFO",
|
142 |
+
ufo2: "Pokestar UFO-2",
|
143 |
+
whitedoor: "Pokestar White-Door",
|
144 |
+
|
145 |
+
// formes
|
146 |
+
bugceus: "Arceus-Bug",
|
147 |
+
darkceus: "Arceus-Dark",
|
148 |
+
dragonceus: "Arceus-Dragon",
|
149 |
+
eleceus: "Arceus-Electric",
|
150 |
+
fairyceus: "Arceus-Fairy",
|
151 |
+
fightceus: "Arceus-Fighting",
|
152 |
+
fireceus: "Arceus-Fire",
|
153 |
+
flyceus: "Arceus-Flying",
|
154 |
+
ghostceus: "Arceus-Ghost",
|
155 |
+
grassceus: "Arceus-Grass",
|
156 |
+
groundceus: "Arceus-Ground",
|
157 |
+
iceceus: "Arceus-Ice",
|
158 |
+
poisonceus: "Arceus-Poison",
|
159 |
+
psyceus: "Arceus-Psychic",
|
160 |
+
rockceus: "Arceus-Rock",
|
161 |
+
steelceus: "Arceus-Steel",
|
162 |
+
waterceus: "Arceus-Water",
|
163 |
+
arcbug: "Arceus-Bug",
|
164 |
+
arcdark: "Arceus-Dark",
|
165 |
+
arcdragon: "Arceus-Dragon",
|
166 |
+
arcelectric: "Arceus-Electric",
|
167 |
+
arcfairy: "Arceus-Fairy",
|
168 |
+
arcfighting: "Arceus-Fighting",
|
169 |
+
arcfire: "Arceus-Fire",
|
170 |
+
arcflying: "Arceus-Flying",
|
171 |
+
arcghost: "Arceus-Ghost",
|
172 |
+
arcgrass: "Arceus-Grass",
|
173 |
+
arcground: "Arceus-Ground",
|
174 |
+
arcice: "Arceus-Ice",
|
175 |
+
arcpoison: "Arceus-Poison",
|
176 |
+
arcpsychic: "Arceus-Psychic",
|
177 |
+
arcrock: "Arceus-Rock",
|
178 |
+
arcsteel: "Arceus-Steel",
|
179 |
+
arcwater: "Arceus-Water",
|
180 |
+
basculegionm: "Basculegion",
|
181 |
+
basculinb: "Basculin-Blue-Striped",
|
182 |
+
basculinblue: "Basculin-Blue-Striped",
|
183 |
+
basculinbluestripe: "Basculin-Blue-Striped",
|
184 |
+
basculinw: "Basculin-White-Striped",
|
185 |
+
basculinwhite: "Basculin-White-Striped",
|
186 |
+
basculinwhitestripe: "Basculin-White-Striped",
|
187 |
+
castformh: "Castform-Snowy",
|
188 |
+
castformice: "Castform-Snowy",
|
189 |
+
castformr: "Castform-Rainy",
|
190 |
+
castformwater: "Castform-Rainy",
|
191 |
+
castforms: "Castform-Sunny",
|
192 |
+
castformfire: "Castform-Sunny",
|
193 |
+
cherrims: "Cherrim-Sunshine",
|
194 |
+
cherrimsunny: "Cherrim-Sunshine",
|
195 |
+
darmanitanz: "Darmanitan-Zen",
|
196 |
+
darmanitanzenmode: "Darmanitan-Zen",
|
197 |
+
darmanitanzengalar: "Darmanitan-Galar-Zen",
|
198 |
+
darmgz: "Darmanitan-Galar-Zen",
|
199 |
+
deoxysnormal: "Deoxys",
|
200 |
+
deon: "Deoxys",
|
201 |
+
deoxysa: "Deoxys-Attack",
|
202 |
+
deoa: "Deoxys-Attack",
|
203 |
+
deoxysd: "Deoxys-Defense",
|
204 |
+
deoxysdefence: "Deoxys-Defense",
|
205 |
+
deod: "Deoxys-Defense",
|
206 |
+
deoxyss: "Deoxys-Speed",
|
207 |
+
deos: "Deoxys-Speed",
|
208 |
+
eiscuen: "Eiscue-Noice",
|
209 |
+
eternalfloette: "Floette-Eternal",
|
210 |
+
eternamax: "Eternatus-Eternamax",
|
211 |
+
genesectwater: "Genesect-Douse",
|
212 |
+
genesectelectric: "Genesect-Shock",
|
213 |
+
genesectfire: "Genesect-Burn",
|
214 |
+
genesectice: "Genesect-Chill",
|
215 |
+
girao: "Giratina-Origin",
|
216 |
+
giratinao: "Giratina-Origin",
|
217 |
+
gourgeists: "Gourgeist-Small",
|
218 |
+
gourgeistl: "Gourgeist-Large",
|
219 |
+
gourgeistxl: "Gourgeist-Super",
|
220 |
+
gourgeisth: "Gourgeist-Super",
|
221 |
+
gourgeisthuge: "Gourgeist-Super",
|
222 |
+
hoopau: "Hoopa-Unbound",
|
223 |
+
keldeor: "Keldeo-Resolute",
|
224 |
+
keldeoresolution: "Keldeo-Resolute",
|
225 |
+
kyuremb: "Kyurem-Black",
|
226 |
+
kyuremw: "Kyurem-White",
|
227 |
+
landorust: "Landorus-Therian",
|
228 |
+
meloettap: "Meloetta-Pirouette",
|
229 |
+
meloettas: "Meloetta-Pirouette",
|
230 |
+
meloettastep: "Meloetta-Pirouette",
|
231 |
+
meowsticfemale: "Meowstic-F",
|
232 |
+
morpekoh: "Morpeko-Hangry",
|
233 |
+
pumpkaboohuge: "Pumpkaboo-Super",
|
234 |
+
rotomc: "Rotom-Mow",
|
235 |
+
rotomcut: "Rotom-Mow",
|
236 |
+
rotomf: "Rotom-Frost",
|
237 |
+
fridge: "Rotom-Frost",
|
238 |
+
rotomh: "Rotom-Heat",
|
239 |
+
rotoms: "Rotom-Fan",
|
240 |
+
rotomspin: "Rotom-Fan",
|
241 |
+
rotomw: "Rotom-Wash",
|
242 |
+
wash: "Rotom-Wash",
|
243 |
+
shaymins: "Shaymin-Sky",
|
244 |
+
skymin: "Shaymin-Sky",
|
245 |
+
thundurust: "Thundurus-Therian",
|
246 |
+
thundyt: "Thundurus-Therian",
|
247 |
+
tornadust: "Tornadus-Therian",
|
248 |
+
tornt: "Tornadus-Therian",
|
249 |
+
toxtricityl: "Toxtricity-Low-Key",
|
250 |
+
toxtricitylk: "Toxtricity-Low-Key",
|
251 |
+
wormadamg: "Wormadam-Sandy",
|
252 |
+
wormadamground: "Wormadam-Sandy",
|
253 |
+
wormadamsandycloak: "Wormadam-Sandy",
|
254 |
+
wormadams: "Wormadam-Trash",
|
255 |
+
wormadamsteel: "Wormadam-Trash",
|
256 |
+
wormadamtrashcloak: "Wormadam-Trash",
|
257 |
+
floettee: "Floette-Eternal",
|
258 |
+
floetteeternalflower: "Floette-Eternal",
|
259 |
+
ashgreninja: "Greninja-Ash",
|
260 |
+
zydog: "Zygarde-10%",
|
261 |
+
zydoge: "Zygarde-10%",
|
262 |
+
zygardedog: "Zygarde-10%",
|
263 |
+
zygarde50: "Zygarde",
|
264 |
+
zyc: "Zygarde-Complete",
|
265 |
+
zygarde100: "Zygarde-Complete",
|
266 |
+
zygardec: "Zygarde-Complete",
|
267 |
+
zygardefull: "Zygarde-Complete",
|
268 |
+
zygod: "Zygarde-Complete",
|
269 |
+
perfectzygarde: "Zygarde-Complete",
|
270 |
+
oricoriob: "Oricorio",
|
271 |
+
oricoriobaile: "Oricorio",
|
272 |
+
oricoriof: "Oricorio",
|
273 |
+
oricoriofire: "Oricorio",
|
274 |
+
oricorioe: "Oricorio-Pom-Pom",
|
275 |
+
oricorioelectric: "Oricorio-Pom-Pom",
|
276 |
+
oricoriog: "Oricorio-Sensu",
|
277 |
+
oricorioghost: "Oricorio-Sensu",
|
278 |
+
oricorios: "Oricorio-Sensu",
|
279 |
+
oricoriop: "Oricorio-Pa'u",
|
280 |
+
oricoriopsychic: "Oricorio-Pa'u",
|
281 |
+
lycanrocmidday: "Lycanroc",
|
282 |
+
lycanrocday: "Lycanroc",
|
283 |
+
lycanm: "Lycanroc-Midnight",
|
284 |
+
lycanrocn: "Lycanroc-Midnight",
|
285 |
+
lycanrocnight: "Lycanroc-Midnight",
|
286 |
+
lycand: "Lycanroc-Dusk",
|
287 |
+
lycanrocd: "Lycanroc-Dusk",
|
288 |
+
alomuk: "Muk-Alola",
|
289 |
+
alowak: "Marowak-Alola",
|
290 |
+
snowslash: "Sandslash-Alola",
|
291 |
+
alotales: "Ninetales-Alola",
|
292 |
+
alolatales: "Ninetales-Alola",
|
293 |
+
alolem: "Golem-Alola",
|
294 |
+
neckboy: "Exeggutor-Alola",
|
295 |
+
alosian: "Persian-Alola",
|
296 |
+
ndm: "Necrozma-Dusk-Mane",
|
297 |
+
ndw: "Necrozma-Dawn-Wings",
|
298 |
+
necrozmadm: "Necrozma-Dusk-Mane",
|
299 |
+
necrozmadusk: "Necrozma-Dusk-Mane",
|
300 |
+
duskmane: "Necrozma-Dusk-Mane",
|
301 |
+
duskmanenecrozma: "Necrozma-Dusk-Mane",
|
302 |
+
necrozmadw: "Necrozma-Dawn-Wings",
|
303 |
+
necrozmadawn: "Necrozma-Dawn-Wings",
|
304 |
+
dawnwings: "Necrozma-Dawn-Wings",
|
305 |
+
dawnwingsnecrozma: "Necrozma-Dawn-Wings",
|
306 |
+
necrozmau: "Necrozma-Ultra",
|
307 |
+
ultranecrozma: "Necrozma-Ultra",
|
308 |
+
unecro: "Necrozma-Ultra",
|
309 |
+
ufop: "Pokestar UFO-2",
|
310 |
+
ufopsychic: "Pokestar UFO-2",
|
311 |
+
goon: "Obstagoon",
|
312 |
+
rime: "Mr. Rime",
|
313 |
+
gweez: "Weezing-Galar",
|
314 |
+
gorse: "Rapidash-Galar",
|
315 |
+
galardash: "Rapidash-Galar",
|
316 |
+
nddf: "Indeedee-F",
|
317 |
+
zacianc: "Zacian-Crowned",
|
318 |
+
zacianh: "Zacian",
|
319 |
+
zacianhero: "Zacian",
|
320 |
+
zamazentac: "Zamazenta-Crowned",
|
321 |
+
zamazentah: "Zamazenta",
|
322 |
+
zamazentahero: "Zamazenta",
|
323 |
+
glowbro: "Slowbro-Galar",
|
324 |
+
gbro: "Slowbro-Galar",
|
325 |
+
glowking: "Slowking-Galar",
|
326 |
+
gking: "Slowking-Galar",
|
327 |
+
gapdos: "Zapdos-Galar",
|
328 |
+
goltres: "Moltres-Galar",
|
329 |
+
gmolt: "Moltres-Galar",
|
330 |
+
urshifuss: "Urshifu",
|
331 |
+
urshifusingle: "Urshifu",
|
332 |
+
urshifusinglestrike: "Urshifu",
|
333 |
+
urshifurs: "Urshifu-Rapid-Strike",
|
334 |
+
urshifurapid: "Urshifu-Rapid-Strike",
|
335 |
+
calyrexicerider: "Calyrex-Ice",
|
336 |
+
calyrexir: "Calyrex-Ice",
|
337 |
+
calyi: "Calyrex-Ice",
|
338 |
+
calyice: "Calyrex-Ice",
|
339 |
+
calyrexshadowrider: "Calyrex-Shadow",
|
340 |
+
calyrexsr: "Calyrex-Shadow",
|
341 |
+
calys: "Calyrex-Shadow",
|
342 |
+
calyshadow: "Calyrex-Shadow",
|
343 |
+
taurospaldea: "Tauros-Paldea-Combat",
|
344 |
+
taurospaldeafire: "Tauros-Paldea-Blaze",
|
345 |
+
taurospaldeawater: "Tauros-Paldea-Aqua",
|
346 |
+
redbull: "Tauros-Paldea-Blaze",
|
347 |
+
wetbull: "Tauros-Paldea-Aqua",
|
348 |
+
ham: "Samurott-Hisui",
|
349 |
+
hamurott: "Samurott-Hisui",
|
350 |
+
decidh: "Decidueye-Hisui",
|
351 |
+
typhh: "Typhlosion-Hisui",
|
352 |
+
hqwil: "Qwilfish-Hisui",
|
353 |
+
hlil: "Lilligant-Hisui",
|
354 |
+
hisuigant: "Lilligant-Hisui",
|
355 |
+
hoodra: "Goodra-Hisui",
|
356 |
+
hzoro: "Zoroark-Hisui",
|
357 |
+
harc: "Arcanine-Hisui",
|
358 |
+
palkiao: "Palkia-Origin",
|
359 |
+
horsepalkia: "Palkia-Origin",
|
360 |
+
dialgao: "Dialga-Origin",
|
361 |
+
enamorust: "Enamorus-Therian",
|
362 |
+
enamt: "Enamorus-Therian",
|
363 |
+
squawkabillyb: "Squawkabilly-Blue",
|
364 |
+
squawkabillyw: "Squawkabilly-White",
|
365 |
+
squawkabillyy: "Squawkabilly-Yellow",
|
366 |
+
ursalunab: "Ursaluna-Bloodmoon",
|
367 |
+
woger: "Ogerpon-Wellspring",
|
368 |
+
cornerpon: "Ogerpon-Cornerstone",
|
369 |
+
waterpon: "Ogerpon-Wellspring",
|
370 |
+
rockpon: "Ogerpon-Cornerstone",
|
371 |
+
firepon: "Ogerpon-Hearthflame",
|
372 |
+
ogerw: "Ogerpon-Wellspring",
|
373 |
+
ogerc: "Ogerpon-Cornerstone",
|
374 |
+
ogerh: "Ogerpon-Hearthflame",
|
375 |
+
ogerponw: "Ogerpon-Wellspring",
|
376 |
+
ogerponc: "Ogerpon-Cornerstone",
|
377 |
+
ogerponh: "Ogerpon-Hearthflame",
|
378 |
+
ogerponwater: "Ogerpon-Wellspring",
|
379 |
+
ogerponrock: "Ogerpon-Cornerstone",
|
380 |
+
ogerponfire: "Ogerpon-Hearthflame",
|
381 |
+
ogerponwellspringmask: "Ogerpon-Wellspring",
|
382 |
+
ogerponcornerstonemask: "Ogerpon-Cornerstone",
|
383 |
+
ogerponhearthflamemask: "Ogerpon-Hearthflame",
|
384 |
+
terapagoss: "Terapagos-Stellar",
|
385 |
+
terapagost: "Terapagos-Terastal",
|
386 |
+
|
387 |
+
// base formes
|
388 |
+
nidoranfemale: "Nidoran-F",
|
389 |
+
nidoranmale: "Nidoran-M",
|
390 |
+
wormadamgrass: "Wormadam",
|
391 |
+
wormadamp: "Wormadam",
|
392 |
+
wormadamplant: "Wormadam",
|
393 |
+
wormadamplantcloak: "Wormadam",
|
394 |
+
cherrimo: "Cherrim",
|
395 |
+
cherrimovercast: "Cherrim",
|
396 |
+
furfrounatural: "Furfrou",
|
397 |
+
giratinaa: "Giratina",
|
398 |
+
giratinaaltered: "Giratina",
|
399 |
+
shayminl: "Shaymin",
|
400 |
+
shayminland: "Shaymin",
|
401 |
+
basculinr: "Basculin",
|
402 |
+
basculinred: "Basculin",
|
403 |
+
basculinredstripe: "Basculin",
|
404 |
+
basculinredstriped: "Basculin",
|
405 |
+
darmanitans: "Darmanitan",
|
406 |
+
darmanitanstandard: "Darmanitan",
|
407 |
+
darmanitanstandardmode: "Darmanitan",
|
408 |
+
tornadusi: "Tornadus",
|
409 |
+
tornadusincarnate: "Tornadus",
|
410 |
+
tornadusincarnation: "Tornadus",
|
411 |
+
thundurusi: "Thundurus",
|
412 |
+
thundurusincarnate: "Thundurus",
|
413 |
+
thundurusincarnation: "Thundurus",
|
414 |
+
landorusi: "Landorus",
|
415 |
+
landorusincarnate: "Landorus",
|
416 |
+
landorusincarnation: "Landorus",
|
417 |
+
keldeoo: "Keldeo",
|
418 |
+
keldeoordinary: "Keldeo",
|
419 |
+
meloettaa: "Meloetta",
|
420 |
+
meloettaaria: "Meloetta",
|
421 |
+
meloettavoice: "Meloetta",
|
422 |
+
meowsticm: "Meowstic",
|
423 |
+
meowsticmale: "Meowstic",
|
424 |
+
mimikyudisguised: "Mimikyu",
|
425 |
+
aegislashs: "Aegislash",
|
426 |
+
aegislashshield: "Aegislash",
|
427 |
+
pumpkabooaverage: "Pumpkaboo",
|
428 |
+
gourgeistaverage: "Gourgeist",
|
429 |
+
hoopac: "Hoopa",
|
430 |
+
hoopaconfined: "Hoopa",
|
431 |
+
wishiwashisolo: "Wishiwashi",
|
432 |
+
pokestarufof: "Pokestar UFO",
|
433 |
+
pokestarufoflying: "Pokestar UFO",
|
434 |
+
toxtricitya: "Toxtricity",
|
435 |
+
toxtricityamped: "Toxtricity",
|
436 |
+
ufof: "Pokestar UFO",
|
437 |
+
ufoflying: "Pokestar UFO",
|
438 |
+
vivillonmeadow: "Vivillon",
|
439 |
+
xerneasactive: "Xerneas",
|
440 |
+
indeedeem: "Indeedee",
|
441 |
+
polteageistphony: "Polteageist",
|
442 |
+
rockruffmidday: "Rockruff",
|
443 |
+
sinisteaphony: "Sinistea",
|
444 |
+
dudunsparcetwosegment: "Dudunsparce",
|
445 |
+
enamorusi: "Enamorus",
|
446 |
+
enamorusincarnate: "Enamorus",
|
447 |
+
enamorusincarnation: "Enamorus",
|
448 |
+
gimmighoulchest: "Gimmighoul",
|
449 |
+
mausholdthree: "Maushold",
|
450 |
+
oinkolognem: "Oinkologne",
|
451 |
+
palafinzero: "Palafin",
|
452 |
+
poltchageistcounterfeit: "Poltchageist",
|
453 |
+
sinistchaunremarkable: "Sinistcha",
|
454 |
+
squawkabillygreen: "Squawkabilly",
|
455 |
+
squawkabillyg: "Squawkabilly",
|
456 |
+
tealpon: "Ogerpon",
|
457 |
+
grasspon: "Ogerpon",
|
458 |
+
ogerpont: "Ogerpon",
|
459 |
+
ogerponteal: "Ogerpon",
|
460 |
+
ogerpontealmask: "Ogerpon",
|
461 |
+
terapagosbaby: "Terapagos",
|
462 |
+
|
463 |
+
// totem formes
|
464 |
+
raticatet: "Raticate-Alola-Totem",
|
465 |
+
totemalolanraticate: "Raticate-Alola-Totem",
|
466 |
+
totemraticate: "Raticate-Alola-Totem",
|
467 |
+
totemraticatea: "Raticate-Alola-Totem",
|
468 |
+
totemraticatealola: "Raticate-Alola-Totem",
|
469 |
+
marowakt: "Marowak-Alola-Totem",
|
470 |
+
totemalolanmarowak: "Marowak-Alola-Totem",
|
471 |
+
totemmarowak: "Marowak-Alola-Totem",
|
472 |
+
totemmarowaka: "Marowak-Alola-Totem",
|
473 |
+
totemmarowakalola: "Marowak-Alola-Totem",
|
474 |
+
gumshoost: "Gumshoos-Totem",
|
475 |
+
totemgumshoos: "Gumshoos-Totem",
|
476 |
+
totemvikavolt: "Vikavolt-Totem",
|
477 |
+
vikavoltt: "Vikavolt-Totem",
|
478 |
+
ribombeet: "Ribombee-Totem",
|
479 |
+
totemribombee: "Ribombee-Totem",
|
480 |
+
araquanidt: "Araquanid-Totem",
|
481 |
+
totemaraquanid: "Araquanid-Totem",
|
482 |
+
lurantist: "Lurantis-Totem",
|
483 |
+
totemlurantis: "Lurantis-Totem",
|
484 |
+
salazzlet: "Salazzle-Totem",
|
485 |
+
totemsalazzle: "Salazzle-Totem",
|
486 |
+
mimikyut: "Mimikyu-Totem",
|
487 |
+
totemmimikyu: "Mimikyu-Totem",
|
488 |
+
kommoot: "Kommo-o-Totem",
|
489 |
+
totemkommoo: "Kommo-o-Totem",
|
490 |
+
|
491 |
+
// Paradox Pokemon
|
492 |
+
grusk: "Great Tusk",
|
493 |
+
gtusk: "Great Tusk",
|
494 |
+
tusk: "Great Tusk",
|
495 |
+
stail: "Scream Tail",
|
496 |
+
flutter: "Flutter Mane",
|
497 |
+
fmane: "Flutter Mane",
|
498 |
+
slither: "Slither Wing",
|
499 |
+
swing: "Slither Wing",
|
500 |
+
sandy: "Sandy Shocks",
|
501 |
+
shocks: "Sandy Shocks",
|
502 |
+
bonnet: "Brute Bonnet",
|
503 |
+
rmoon: "Roaring Moon",
|
504 |
+
moon: "Roaring Moon",
|
505 |
+
wake: "Walking Wake",
|
506 |
+
ww: "Walking Wake",
|
507 |
+
bolt: "Raging Bolt",
|
508 |
+
greatneck: "Raging Bolt",
|
509 |
+
neck: "Raging Bolt",
|
510 |
+
raging: "Raging Bolt",
|
511 |
+
gfire: "Gouging Fire",
|
512 |
+
goug: "Gouging Fire",
|
513 |
+
gouging: "Gouging Fire",
|
514 |
+
treads: "Iron Treads",
|
515 |
+
moth: "Iron Moth",
|
516 |
+
hands: "Iron Hands",
|
517 |
+
thorns: "Iron Thorns",
|
518 |
+
jug: "Iron Jugulis",
|
519 |
+
jugulis: "Iron Jugulis",
|
520 |
+
bundle: "Iron Bundle",
|
521 |
+
bundlechan: "Iron Bundle",
|
522 |
+
val: "Iron Valiant",
|
523 |
+
ival: "Iron Valiant",
|
524 |
+
valiant: "Iron Valiant",
|
525 |
+
ileaves: "Iron Leaves",
|
526 |
+
leaves: "Iron Leaves",
|
527 |
+
boulder: "Iron Boulder",
|
528 |
+
crown: "Iron Crown",
|
529 |
+
icrown: "Iron Crown",
|
530 |
+
|
531 |
+
// cosmetic formes
|
532 |
+
alcremievanillacream: "Alcremie",
|
533 |
+
alcremierubycream: "Alcremie",
|
534 |
+
alcremiematchacream: "Alcremie",
|
535 |
+
alcremiemintcream: "Alcremie",
|
536 |
+
alcremielemoncream: "Alcremie",
|
537 |
+
alcremiesaltedcream: "Alcremie",
|
538 |
+
alcremierubyswirl: "Alcremie",
|
539 |
+
alcremiecaramelswirl: "Alcremie",
|
540 |
+
alcremierainbowswirl: "Alcremie",
|
541 |
+
burmygrass: "Burmy",
|
542 |
+
burmyplant: "Burmy",
|
543 |
+
burmysandy: "Burmy",
|
544 |
+
burmytrash: "Burmy",
|
545 |
+
shelloseast: "Shellos",
|
546 |
+
shelloswest: "Shellos",
|
547 |
+
gastrodone: "Gastrodon",
|
548 |
+
gastrodoneast: "Gastrodon",
|
549 |
+
gastrodoneastsea: "Gastrodon",
|
550 |
+
gastrodonw: "Gastrodon",
|
551 |
+
gastrodonwest: "Gastrodon",
|
552 |
+
gastrodonwestsea: "Gastrodon",
|
553 |
+
deerlingspring: "Deerling",
|
554 |
+
deerlingsummer: "Deerling",
|
555 |
+
deerlingautumn: "Deerling",
|
556 |
+
deerlingwinter: "Deerling",
|
557 |
+
sawsbuckspring: "Sawsbuck",
|
558 |
+
sawsbucksummer: "Sawsbuck",
|
559 |
+
sawsbuckautumn: "Sawsbuck",
|
560 |
+
sawsbuckwinter: "Sawsbuck",
|
561 |
+
vivillonarchipelago: "Vivillon",
|
562 |
+
vivilloncontinental: "Vivillon",
|
563 |
+
vivillonelegant: "Vivillon",
|
564 |
+
vivillongarden: "Vivillon",
|
565 |
+
vivillonhighplains: "Vivillon",
|
566 |
+
vivillonicysnow: "Vivillon",
|
567 |
+
vivillonjungle: "Vivillon",
|
568 |
+
vivillonmarine: "Vivillon",
|
569 |
+
vivillonmodern: "Vivillon",
|
570 |
+
vivillonmonsoon: "Vivillon",
|
571 |
+
vivillonocean: "Vivillon",
|
572 |
+
vivillonpolar: "Vivillon",
|
573 |
+
vivillonriver: "Vivillon",
|
574 |
+
vivillonsandstorm: "Vivillon",
|
575 |
+
vivillonsavanna: "Vivillon",
|
576 |
+
vivillonsun: "Vivillon",
|
577 |
+
vivillontundra: "Vivillon",
|
578 |
+
flabb: "Flabebe",
|
579 |
+
flabebered: "Flabebe",
|
580 |
+
flabebeblue: "Flabebe",
|
581 |
+
flabebeorange: "Flabebe",
|
582 |
+
flabebewhite: "Flabebe",
|
583 |
+
flabebeyellow: "Flabebe",
|
584 |
+
flabbred: "Flabebe",
|
585 |
+
flabbblue: "Flabebe",
|
586 |
+
flabborange: "Flabebe",
|
587 |
+
flabbwhite: "Flabebe",
|
588 |
+
flabbyellow: "Flabebe",
|
589 |
+
floettered: "Floette",
|
590 |
+
floetteblue: "Floette",
|
591 |
+
floetteorange: "Floette",
|
592 |
+
floettewhite: "Floette",
|
593 |
+
floetteyellow: "Floette",
|
594 |
+
florgesred: "Florges",
|
595 |
+
florgesblue: "Florges",
|
596 |
+
florgesorange: "Florges",
|
597 |
+
florgeswhite: "Florges",
|
598 |
+
florgesyellow: "Florges",
|
599 |
+
furfroudandy: "Furfrou",
|
600 |
+
furfroudebutante: "Furfrou",
|
601 |
+
furfroudiamond: "Furfrou",
|
602 |
+
furfrouheart: "Furfrou",
|
603 |
+
furfroukabuki: "Furfrou",
|
604 |
+
furfroulareine: "Furfrou",
|
605 |
+
furfroumatron: "Furfrou",
|
606 |
+
furfroupharaoh: "Furfrou",
|
607 |
+
furfroustar: "Furfrou",
|
608 |
+
miniorred: "Minior",
|
609 |
+
miniororange: "Minior",
|
610 |
+
minioryellow: "Minior",
|
611 |
+
miniorgreen: "Minior",
|
612 |
+
miniorblue: "Minior",
|
613 |
+
miniorindigo: "Minior",
|
614 |
+
miniorviolet: "Minior",
|
615 |
+
unowna: "Unown",
|
616 |
+
unownb: "Unown",
|
617 |
+
unownc: "Unown",
|
618 |
+
unownd: "Unown",
|
619 |
+
unowne: "Unown",
|
620 |
+
unownf: "Unown",
|
621 |
+
unowng: "Unown",
|
622 |
+
unownh: "Unown",
|
623 |
+
unowni: "Unown",
|
624 |
+
unownj: "Unown",
|
625 |
+
unownk: "Unown",
|
626 |
+
unownl: "Unown",
|
627 |
+
unownm: "Unown",
|
628 |
+
unownn: "Unown",
|
629 |
+
unowno: "Unown",
|
630 |
+
unownp: "Unown",
|
631 |
+
unownq: "Unown",
|
632 |
+
unownr: "Unown",
|
633 |
+
unowns: "Unown",
|
634 |
+
unownt: "Unown",
|
635 |
+
unownu: "Unown",
|
636 |
+
unownv: "Unown",
|
637 |
+
unownw: "Unown",
|
638 |
+
unownx: "Unown",
|
639 |
+
unowny: "Unown",
|
640 |
+
unownz: "Unown",
|
641 |
+
unownexclamation: "Unown",
|
642 |
+
unownquestion: "Unown",
|
643 |
+
tatsugiricurly: "Tatsugiri",
|
644 |
+
tatsugiridroopy: "Tatsugiri",
|
645 |
+
tatsugiristretchy: "Tatsugiri",
|
646 |
+
|
647 |
+
pokestargiant2: "Pokestar Giant",
|
648 |
+
pokestarmonica2: "Pokestar Giant",
|
649 |
+
pokestarufopropu1: "Pokestar UFO",
|
650 |
+
pokestarpropu1: "Pokestar UFO",
|
651 |
+
pokestarpropu2: "Pokestar UFO-2",
|
652 |
+
pokestarbrycenmanprop: "Pokestar Brycen-Man",
|
653 |
+
pokestarproph1: "Pokestar Brycen-Man",
|
654 |
+
pokestarmtprop: "Pokestar MT",
|
655 |
+
pokestarpropm1: "Pokestar MT",
|
656 |
+
pokestarmt2prop: "Pokestar MT2",
|
657 |
+
pokestarpropm2: "Pokestar MT2",
|
658 |
+
pokestartransportprop: "Pokestar Transport",
|
659 |
+
pokestarpropt1: "Pokestar Transport",
|
660 |
+
pokestargiantpropo1: "Pokestar Giant",
|
661 |
+
pokestarpropo1: "Pokestar Giant",
|
662 |
+
pokestargiantpropo2: "Pokestar Giant",
|
663 |
+
pokestarpropo2: "Pokestar Giant",
|
664 |
+
pokestarhumanoidprop: "Pokestar Humanoid",
|
665 |
+
pokestarpropc1: "Pokestar Humanoid",
|
666 |
+
pokestarmonsterprop: "Pokestar Monster",
|
667 |
+
pokestarpropc2: "Pokestar Monster",
|
668 |
+
pokestarspiritprop: "Pokestar Spirit",
|
669 |
+
pokestarpropg1: "Pokestar Spirit",
|
670 |
+
pokestarblackdoorprop: "Pokestar Black Door",
|
671 |
+
pokestarpropw1: "Pokestar Black Door",
|
672 |
+
pokestarwhitedoorprop: "Pokestar White Door",
|
673 |
+
pokestarpropw2: "Pokestar White Door",
|
674 |
+
pokestarf00prop: "Pokestar F-00",
|
675 |
+
pokestarpropr1: "Pokestar F-00",
|
676 |
+
pokestarf002prop: "Pokestar F-002",
|
677 |
+
pokestarpropr2: "Pokestar F-002",
|
678 |
+
pokestarblackbeltprop: "Pokestar Black Belt",
|
679 |
+
pokestarpropk1: "Pokestar Black Belt",
|
680 |
+
giant2: "Pokestar Giant",
|
681 |
+
monica2: "Pokestar Giant",
|
682 |
+
ufopropu1: "Pokestar UFO",
|
683 |
+
propu1: "Pokestar UFO",
|
684 |
+
ufopropu2: "Pokestar UFO-2",
|
685 |
+
propu2: "Pokestar UFO-2",
|
686 |
+
brycenmanprop: "Pokestar Brycen-Man",
|
687 |
+
proph1: "Pokestar Brycen-Man",
|
688 |
+
mtprop: "Pokestar MT",
|
689 |
+
propm1: "Pokestar MT",
|
690 |
+
mt2prop: "Pokestar MT2",
|
691 |
+
propm2: "Pokestar MT2",
|
692 |
+
transportprop: "Pokestar Transport",
|
693 |
+
propt1: "Pokestar Transport",
|
694 |
+
giantpropo1: "Pokestar Giant",
|
695 |
+
propo1: "Pokestar Giant",
|
696 |
+
giantpropo2: "Pokestar Giant",
|
697 |
+
propo2: "Pokestar Giant",
|
698 |
+
humanoidprop: "Pokestar Humanoid",
|
699 |
+
propc1: "Pokestar Humanoid",
|
700 |
+
monsterprop: "Pokestar Monster",
|
701 |
+
propc2: "Pokestar Monster",
|
702 |
+
spiritprop: "Pokestar Spirit",
|
703 |
+
propg1: "Pokestar Spirit",
|
704 |
+
blackdoorprop: "Pokestar Black Door",
|
705 |
+
propw1: "Pokestar Black Door",
|
706 |
+
whitedoorprop: "Pokestar White Door",
|
707 |
+
propw2: "Pokestar White Door",
|
708 |
+
f00prop: "Pokestar F00",
|
709 |
+
propr1: "Pokestar F00",
|
710 |
+
f002prop: "Pokestar F002",
|
711 |
+
propr2: "Pokestar F002",
|
712 |
+
blackbeltprop: "Pokestar Black Belt",
|
713 |
+
propk1: "Pokestar Black Belt",
|
714 |
+
|
715 |
+
// abilities
|
716 |
+
emorph: "Electromorphosis",
|
717 |
+
hadron: "Hadron Engine",
|
718 |
+
intim: "Intimidate",
|
719 |
+
mg: "Magic Guard",
|
720 |
+
ngas: "Neutralizing Gas",
|
721 |
+
pheal: "Poison Heal",
|
722 |
+
proto: "Protosynthesis",
|
723 |
+
regen: "Regenerator",
|
724 |
+
sf: "Sheer Force",
|
725 |
+
so: "Supreme Overlord",
|
726 |
+
stag: "Shadow Tag",
|
727 |
+
|
728 |
+
// items
|
729 |
+
amulet: "Clear Amulet",
|
730 |
+
assvest: "Assault Vest",
|
731 |
+
av: "Assault Vest",
|
732 |
+
balloon: "Air Balloon",
|
733 |
+
band: "Choice Band",
|
734 |
+
booster: "Booster Energy",
|
735 |
+
boots: "Heavy-Duty Boots",
|
736 |
+
cb: "Choice Band",
|
737 |
+
clam: "Clear Amulet",
|
738 |
+
cloak: "Covert Cloak",
|
739 |
+
dice: "Loaded Dice",
|
740 |
+
ebelt: "Expert Belt",
|
741 |
+
fightgem: "Fighting Gem",
|
742 |
+
flightgem: "Flying Gem",
|
743 |
+
goggles: "Safety Goggles",
|
744 |
+
hdb: "Heavy-Duty Boots",
|
745 |
+
helmet: "Rocky Helmet",
|
746 |
+
lefties: "Leftovers",
|
747 |
+
lo: "Life Orb",
|
748 |
+
lorb: "Life Orb",
|
749 |
+
nmi: "Never-Melt Ice",
|
750 |
+
sash: "Focus Sash",
|
751 |
+
scarf: "Choice Scarf",
|
752 |
+
specs: "Choice Specs",
|
753 |
+
tr00swordsdance: "TR00",
|
754 |
+
tr01bodyslam: "TR01",
|
755 |
+
tr02flamethrower: "TR02",
|
756 |
+
tr03hydropump: "TR03",
|
757 |
+
tr04surf: "TR04",
|
758 |
+
tr05icebeam: "TR05",
|
759 |
+
tr06blizzard: "TR06",
|
760 |
+
tr07lowkick: "TR07",
|
761 |
+
tr08thunderbolt: "TR08",
|
762 |
+
tr09thunder: "TR09",
|
763 |
+
tr10earthquake: "TR10",
|
764 |
+
tr11psychic: "TR11",
|
765 |
+
tr12agility: "TR12",
|
766 |
+
tr13focusenergy: "TR13",
|
767 |
+
tr14metronome: "TR14",
|
768 |
+
tr15fireblast: "TR15",
|
769 |
+
tr16waterfall: "TR16",
|
770 |
+
tr17amnesia: "TR17",
|
771 |
+
tr18leechlife: "TR18",
|
772 |
+
tr19triattack: "TR19",
|
773 |
+
tr20substitute: "TR20",
|
774 |
+
tr21reversal: "TR21",
|
775 |
+
tr22sludgebomb: "TR22",
|
776 |
+
tr23spikes: "TR23",
|
777 |
+
tr24outrage: "TR24",
|
778 |
+
tr25psyshock: "TR25",
|
779 |
+
tr26endure: "TR26",
|
780 |
+
tr27sleeptalk: "TR27",
|
781 |
+
tr28megahorn: "TR28",
|
782 |
+
tr29batonpass: "TR29",
|
783 |
+
tr30encore: "TR30",
|
784 |
+
tr31irontail: "TR31",
|
785 |
+
tr32crunch: "TR32",
|
786 |
+
tr33shadowball: "TR33",
|
787 |
+
tr34futuresight: "TR34",
|
788 |
+
tr35uproar: "TR35",
|
789 |
+
tr36heatwave: "TR36",
|
790 |
+
tr37taunt: "TR37",
|
791 |
+
tr38trick: "TR38",
|
792 |
+
tr39superpower: "TR39",
|
793 |
+
tr40skillswap: "TR40",
|
794 |
+
tr41blazekick: "TR41",
|
795 |
+
tr42hypervoice: "TR42",
|
796 |
+
tr43overheat: "TR43",
|
797 |
+
tr44cosmicpower: "TR44",
|
798 |
+
tr45muddywater: "TR45",
|
799 |
+
tr46irondefense: "TR46",
|
800 |
+
tr47dragonclaw: "TR47",
|
801 |
+
tr48bulkup: "TR48",
|
802 |
+
tr49calmmind: "TR49",
|
803 |
+
tr50leafblade: "TR50",
|
804 |
+
tr51dragondance: "TR51",
|
805 |
+
tr52gyroball: "TR52",
|
806 |
+
tr53closecombat: "TR53",
|
807 |
+
tr54toxicspikes: "TR54",
|
808 |
+
tr55flareblitz: "TR55",
|
809 |
+
tr56aurasphere: "TR56",
|
810 |
+
tr57poisonjab: "TR57",
|
811 |
+
tr58darkpulse: "TR58",
|
812 |
+
tr59seedbomb: "TR59",
|
813 |
+
tr60xscissor: "TR60",
|
814 |
+
tr61bugbuzz: "TR61",
|
815 |
+
tr62dragonpulse: "TR62",
|
816 |
+
tr63powergem: "TR63",
|
817 |
+
tr64focusblast: "TR64",
|
818 |
+
tr65energyball: "TR65",
|
819 |
+
tr66bravebird: "TR66",
|
820 |
+
tr67earthpower: "TR67",
|
821 |
+
tr68nastyplot: "TR68",
|
822 |
+
tr69zenheadbutt: "TR69",
|
823 |
+
tr70flashcannon: "TR70",
|
824 |
+
tr71leafstorm: "TR71",
|
825 |
+
tr72powerwhip: "TR72",
|
826 |
+
tr73gunkshot: "TR73",
|
827 |
+
tr74ironhead: "TR74",
|
828 |
+
tr75stoneedge: "TR75",
|
829 |
+
tr76stealthrock: "TR76",
|
830 |
+
tr77grassknot: "TR77",
|
831 |
+
tr78sludgewave: "TR78",
|
832 |
+
tr79heavyslam: "TR79",
|
833 |
+
tr80electroball: "TR80",
|
834 |
+
tr81foulplay: "TR81",
|
835 |
+
tr82storedpower: "TR82",
|
836 |
+
tr83allyswitch: "TR83",
|
837 |
+
tr84scald: "TR84",
|
838 |
+
tr85workup: "TR85",
|
839 |
+
tr86wildcharge: "TR86",
|
840 |
+
tr87drillrun: "TR87",
|
841 |
+
tr88heatcrash: "TR88",
|
842 |
+
tr89hurricane: "TR89",
|
843 |
+
tr90playrough: "TR90",
|
844 |
+
tr91venomdrench: "TR91",
|
845 |
+
tr92dazzlinggleam: "TR92",
|
846 |
+
tr93darkestlariat: "TR93",
|
847 |
+
tr94highhorsepower: "TR94",
|
848 |
+
tr95throatchop: "TR95",
|
849 |
+
tr96pollenpuff: "TR96",
|
850 |
+
tr97psychicfangs: "TR97",
|
851 |
+
tr98liquidation: "TR98",
|
852 |
+
tr99bodypress: "TR99",
|
853 |
+
umbrella: "Utility Umbrella",
|
854 |
+
wp: "Weakness Policy",
|
855 |
+
|
856 |
+
// pokemon
|
857 |
+
aboma: "Abomasnow",
|
858 |
+
ace: "Cinderace",
|
859 |
+
aegi: "Aegislash",
|
860 |
+
aegiblade: "Aegislash-Blade",
|
861 |
+
aegis: "Aegislash",
|
862 |
+
aero: "Aerodactyl",
|
863 |
+
alo: "Alomomola",
|
864 |
+
amoon: "Amoonguss",
|
865 |
+
amph: "Ampharos",
|
866 |
+
araq: "Araquanid",
|
867 |
+
arc: "Arceus",
|
868 |
+
arceusnormal: "Arceus",
|
869 |
+
arch: "Archaludon",
|
870 |
+
ashgren: "Greninja-Ash",
|
871 |
+
azu: "Azumarill",
|
872 |
+
bax: "Baxcalibur",
|
873 |
+
bdrill: "Beedrill",
|
874 |
+
bee: "Beedrill",
|
875 |
+
belli: "Bellibolt",
|
876 |
+
bigsharp: "Kingambit",
|
877 |
+
billy: "Squawkabilly",
|
878 |
+
birdjesus: "Pidgeot",
|
879 |
+
bish: "Bisharp",
|
880 |
+
blace: "Blacephalon",
|
881 |
+
bliss: "Blissey",
|
882 |
+
bomb: "Bombirdier",
|
883 |
+
bramble: "Brambleghast",
|
884 |
+
bull: "Tauros",
|
885 |
+
bulu: "Tapu Bulu",
|
886 |
+
camel: "Camerupt",
|
887 |
+
cathy: "Trevenant",
|
888 |
+
chandy: "Chandelure",
|
889 |
+
chomp: "Garchomp",
|
890 |
+
cind: "Cinderace",
|
891 |
+
clanger: "Kommo-o",
|
892 |
+
clef: "Clefable",
|
893 |
+
clod: "Clodsire",
|
894 |
+
cloy: "Cloyster",
|
895 |
+
coba: "Cobalion",
|
896 |
+
cofag: "Cofagrigus",
|
897 |
+
conk: "Conkeldurr",
|
898 |
+
copper: "Copperajah",
|
899 |
+
corv: "Corviknight",
|
900 |
+
cress: "Cresselia",
|
901 |
+
croak: "Toxicroak",
|
902 |
+
cruel: "Tentacruel",
|
903 |
+
cube: "Kyurem-Black",
|
904 |
+
cune: "Suicune",
|
905 |
+
cuno: "Articuno",
|
906 |
+
darm: "Darmanitan",
|
907 |
+
dirge: "Skeledirge",
|
908 |
+
dnite: "Dragonite",
|
909 |
+
dogars: "Koffing",
|
910 |
+
don: "Groudon",
|
911 |
+
doom: "Houndoom",
|
912 |
+
dozo: "Dondozo",
|
913 |
+
drill: "Excadrill",
|
914 |
+
driller: "Excadrill",
|
915 |
+
dudun: "Dudunsparce",
|
916 |
+
dug: "Dugtrio",
|
917 |
+
duggy: "Dugtrio",
|
918 |
+
ekiller: "Arceus",
|
919 |
+
empo: "Empoleon",
|
920 |
+
enam: "Enamorus",
|
921 |
+
esca: "Escavalier",
|
922 |
+
ferro: "Ferrothorn",
|
923 |
+
fez: "Fezandipiti",
|
924 |
+
fini: "Tapu Fini",
|
925 |
+
florg: "Florges",
|
926 |
+
forry: "Forretress",
|
927 |
+
fug: "Rayquaza",
|
928 |
+
galv: "Galvantula",
|
929 |
+
gambit: "Kingambit",
|
930 |
+
gar: "Gengar",
|
931 |
+
garde: "Gardevoir",
|
932 |
+
garg: "Garganacl",
|
933 |
+
gastro: "Gastrodon",
|
934 |
+
gatr: "Feraligatr",
|
935 |
+
gene: "Genesect",
|
936 |
+
ghold: "Gholdengo",
|
937 |
+
gira: "Giratina",
|
938 |
+
glimm: "Glimmora",
|
939 |
+
glisc: "Gliscor",
|
940 |
+
gren: "Greninja",
|
941 |
+
gross: "Metagross",
|
942 |
+
gyara: "Gyarados",
|
943 |
+
hatt: "Hatterene",
|
944 |
+
hera: "Heracross",
|
945 |
+
hippo: "Hippowdon",
|
946 |
+
honch: "Honchkrow",
|
947 |
+
honse: "Spectrier",
|
948 |
+
incin: "Incineroar",
|
949 |
+
intel: "Inteleon",
|
950 |
+
kanga: "Kangaskhan",
|
951 |
+
karp: "Magikarp",
|
952 |
+
kart: "Kartana",
|
953 |
+
keld: "Keldeo",
|
954 |
+
keys: "Klefki",
|
955 |
+
kix: "Lokix",
|
956 |
+
klef: "Klefki",
|
957 |
+
koko: "Tapu Koko",
|
958 |
+
kommo: "Kommo-o",
|
959 |
+
kou: "Raikou",
|
960 |
+
krook: "Krookodile",
|
961 |
+
kyu: "Kyurem",
|
962 |
+
kyub: "Kyurem-Black",
|
963 |
+
kyuw: "Kyurem-White",
|
964 |
+
lando: "Landorus",
|
965 |
+
landoi: "Landorus",
|
966 |
+
landot: "Landorus-Therian",
|
967 |
+
legion: "Basculegion",
|
968 |
+
legionf: "Basculegion-F",
|
969 |
+
lego: "Nihilego",
|
970 |
+
lele: "Tapu Lele",
|
971 |
+
linda: "Fletchinder",
|
972 |
+
luc: "Lucario",
|
973 |
+
luke: "Lucario",
|
974 |
+
lurk: "Golurk",
|
975 |
+
lycan: "Lycanroc",
|
976 |
+
m2: "Mewtwo",
|
977 |
+
mage: "Magearna",
|
978 |
+
mamo: "Mamoswine",
|
979 |
+
mandi: "Mandibuzz",
|
980 |
+
maus: "Maushold",
|
981 |
+
mence: "Salamence",
|
982 |
+
meow: "Meowscarada",
|
983 |
+
milo: "Milotic",
|
984 |
+
mmq: "Mimikyu",
|
985 |
+
mola: "Alomomola",
|
986 |
+
molt: "Moltres",
|
987 |
+
morfentshusbando: "Gengar",
|
988 |
+
munki: "Munkidori",
|
989 |
+
naga: "Naganadel",
|
990 |
+
nape: "Infernape",
|
991 |
+
ndd: "Indeedee",
|
992 |
+
nebby: "Cosmog",
|
993 |
+
nidok: "Nidoking",
|
994 |
+
nidoq: "Nidoqueen",
|
995 |
+
obama: "Abomasnow",
|
996 |
+
oger: "Ogerpon",
|
997 |
+
ogre: "Kyogre",
|
998 |
+
p2: "Porygon2",
|
999 |
+
pao: "Chien-Pao",
|
1000 |
+
pato: "Psyduck",
|
1001 |
+
peli: "Pelipper",
|
1002 |
+
pert: "Swampert",
|
1003 |
+
pex: "Toxapex",
|
1004 |
+
phero: "Pheromosa",
|
1005 |
+
pika: "Pikachu",
|
1006 |
+
pikablu: "Marill",
|
1007 |
+
plume: "Vileplume",
|
1008 |
+
pory2: "Porygon2",
|
1009 |
+
poryz: "Porygon-Z",
|
1010 |
+
prim: "Primarina",
|
1011 |
+
pult: "Dragapult",
|
1012 |
+
pyuku: "Pyukumuku",
|
1013 |
+
pz: "Porygon-Z",
|
1014 |
+
quag: "Quagsire",
|
1015 |
+
quaq: "Quaquaval",
|
1016 |
+
queen: "Nidoqueen",
|
1017 |
+
rachi: "Jirachi",
|
1018 |
+
rai: "Darkrai",
|
1019 |
+
raj: "Copperajah",
|
1020 |
+
rank: "Reuniclus",
|
1021 |
+
ray: "Rayquaza",
|
1022 |
+
reuni: "Reuniclus",
|
1023 |
+
rhyp: "Rhyperior",
|
1024 |
+
ribo: "Ribombee",
|
1025 |
+
rilla: "Rillaboom",
|
1026 |
+
sab: "Sableye",
|
1027 |
+
sable: "Sableye",
|
1028 |
+
scept: "Sceptile",
|
1029 |
+
sciz: "Scizor",
|
1030 |
+
scoli: "Scolipede",
|
1031 |
+
seejong: "Sealeo",
|
1032 |
+
serp: "Serperior",
|
1033 |
+
shao: "Mienshao",
|
1034 |
+
skarm: "Skarmory",
|
1035 |
+
smogon: "Koffing",
|
1036 |
+
smogonbird: "Talonflame",
|
1037 |
+
snips: "Drapion",
|
1038 |
+
squawk: "Squawkabilly",
|
1039 |
+
staka: "Stakataka",
|
1040 |
+
steela: "Celesteela",
|
1041 |
+
sui: "Suicune",
|
1042 |
+
swole: "Buzzwole",
|
1043 |
+
sylv: "Sylveon",
|
1044 |
+
talon: "Talonflame",
|
1045 |
+
tang: "Tangrowth",
|
1046 |
+
tent: "Tentacruel",
|
1047 |
+
terra: "Terrakion",
|
1048 |
+
tflame: "Talonflame",
|
1049 |
+
thundy: "Thundurus",
|
1050 |
+
ting: "Ting-Lu",
|
1051 |
+
toed: "Politoed",
|
1052 |
+
tomb: "Spiritomb",
|
1053 |
+
torn: "Tornadus",
|
1054 |
+
tran: "Heatran",
|
1055 |
+
tsar: "Tsareena",
|
1056 |
+
ttar: "Tyranitar",
|
1057 |
+
typh: "Typhlosion",
|
1058 |
+
venu: "Venusaur",
|
1059 |
+
viriz: "Virizion",
|
1060 |
+
watershifu: "Urshifu-Rapid-Strike",
|
1061 |
+
weav: "Weavile",
|
1062 |
+
whimsi: "Whimsicott",
|
1063 |
+
worm: "Orthworm",
|
1064 |
+
xern: "Xerneas",
|
1065 |
+
xurk: "Xurkitree",
|
1066 |
+
ygod: "Yveltal",
|
1067 |
+
zac: "Zacian",
|
1068 |
+
zaci: "Zacian",
|
1069 |
+
zam: "Alakazam",
|
1070 |
+
zama: "Zamazenta",
|
1071 |
+
zard: "Charizard",
|
1072 |
+
zone: "Magnezone",
|
1073 |
+
zong: "Bronzong",
|
1074 |
+
zor: "Scizor",
|
1075 |
+
zyg: "Zygarde",
|
1076 |
+
|
1077 |
+
// ultra beast codenames
|
1078 |
+
ub01: "Nihilego",
|
1079 |
+
ub02a: "Buzzwole",
|
1080 |
+
ub02b: "Pheromosa",
|
1081 |
+
ub03: "Xurkitree",
|
1082 |
+
ub04blade: "Kartana",
|
1083 |
+
ub04blaster: "Celesteela",
|
1084 |
+
ub05: "Guzzlord",
|
1085 |
+
ubburst: "Blacephalon",
|
1086 |
+
ubassembly: "Stakataka",
|
1087 |
+
ubadhesive: "Poipole",
|
1088 |
+
|
1089 |
+
// moves
|
1090 |
+
bb: "Brave Bird",
|
1091 |
+
bd: "Belly Drum",
|
1092 |
+
bde: "Baby-Doll Eyes",
|
1093 |
+
blades: "Precipice Blades",
|
1094 |
+
bpass: "Baton Pass",
|
1095 |
+
bpress: "Body Press",
|
1096 |
+
bp: "Baton Pass",
|
1097 |
+
cane: "Hurricane",
|
1098 |
+
cc: "Close Combat",
|
1099 |
+
cm: "Calm Mind",
|
1100 |
+
dbond: "Destiny Bond",
|
1101 |
+
dd: "Dragon Dance",
|
1102 |
+
dib: "Double Iron Bash",
|
1103 |
+
dv: "Dark Void",
|
1104 |
+
dw: "Dual Wingbeat",
|
1105 |
+
dwb: "Dual Wingbeat",
|
1106 |
+
edge: "Stone Edge",
|
1107 |
+
eq: "Earthquake",
|
1108 |
+
espeed: "ExtremeSpeed",
|
1109 |
+
eterrain: "Electric Terrain",
|
1110 |
+
faintattack: "Feint Attack",
|
1111 |
+
glance: "Glacial Lance",
|
1112 |
+
glowpunch: "Power-up Punch",
|
1113 |
+
gterrain: "Grassy Terrain",
|
1114 |
+
hhp: "High Horsepower",
|
1115 |
+
hp: "Hidden Power",
|
1116 |
+
hpbug: "Hidden Power Bug",
|
1117 |
+
hpdark: "Hidden Power Dark",
|
1118 |
+
hpdragon: "Hidden Power Dragon",
|
1119 |
+
hpelectric: "Hidden Power electric",
|
1120 |
+
hpfighting: "Hidden Power Fighting",
|
1121 |
+
hpfire: "Hidden Power Fire",
|
1122 |
+
hpflying: "Hidden Power Flying",
|
1123 |
+
hpghost: "Hidden Power Ghost",
|
1124 |
+
hpgrass: "Hidden Power Grass",
|
1125 |
+
hpground: "Hidden Power Ground",
|
1126 |
+
hpice: "Hidden Power Ice",
|
1127 |
+
hppoison: "Hidden Power Poison",
|
1128 |
+
hppsychic: "Hidden Power Psychic",
|
1129 |
+
hprock: "Hidden Power Rock",
|
1130 |
+
hpsteel: "Hidden Power Steel",
|
1131 |
+
hpwater: "Hidden Power Water",
|
1132 |
+
hjk: "High Jump Kick",
|
1133 |
+
hijumpkick: "High Jump Kick",
|
1134 |
+
knock: "Knock Off",
|
1135 |
+
lr: "Last Respects",
|
1136 |
+
mir: "Make It Rain",
|
1137 |
+
mterrain: "Misty Terrain",
|
1138 |
+
np: "Nasty Plot",
|
1139 |
+
pblades: "Precipice Blades",
|
1140 |
+
pfists: "Plasma Fists",
|
1141 |
+
playaround: "Play Rough",
|
1142 |
+
polter: "Poltergeist",
|
1143 |
+
popbomb: "Population Bomb",
|
1144 |
+
press: "Body Press",
|
1145 |
+
psynoise: "Psychic Noise",
|
1146 |
+
pterrain: "Psychic Terrain",
|
1147 |
+
pup: "Power-up Punch",
|
1148 |
+
qd: "Quiver Dance",
|
1149 |
+
rocks: "Stealth Rock",
|
1150 |
+
sd: "Swords Dance",
|
1151 |
+
se: "Stone Edge",
|
1152 |
+
sideshellarm: "Shell Side Arm",
|
1153 |
+
spin: "Rapid Spin",
|
1154 |
+
sr: "Stealth Rock",
|
1155 |
+
ssa: "Shell Side Arm",
|
1156 |
+
sub: "Substitute",
|
1157 |
+
tarrows: "Thousand Arrows",
|
1158 |
+
taxel: "Triple Axel",
|
1159 |
+
tr: "Trick Room",
|
1160 |
+
troom: "Trick Room",
|
1161 |
+
tbolt: "Thunderbolt",
|
1162 |
+
tspikes: "Toxic Spikes",
|
1163 |
+
twave: "Thunder Wave",
|
1164 |
+
twaves: "Thousand Waves",
|
1165 |
+
vicegrip: "Vise Grip",
|
1166 |
+
web: "Sticky Web",
|
1167 |
+
webs: "Sticky Web",
|
1168 |
+
wisp: "Will-O-Wisp",
|
1169 |
+
wow: "Will-O-Wisp",
|
1170 |
+
|
1171 |
+
// z-moves
|
1172 |
+
"10mv": "10,000,000 Volt Thunderbolt",
|
1173 |
+
"10mvt": "10,000,000 Volt Thunderbolt",
|
1174 |
+
clangorous: "Clangorous Soulblaze",
|
1175 |
+
cs: "Clangorous Soulblaze",
|
1176 |
+
ee: "Extreme Evoboost",
|
1177 |
+
extreme: "Extreme Evoboost",
|
1178 |
+
genesis: "Genesis Supernova",
|
1179 |
+
goa: "Guardian of Alola",
|
1180 |
+
gs: "Genesis Supernova",
|
1181 |
+
guardian: "Guardian of Alola",
|
1182 |
+
lets: "Let's Snuggle Forever",
|
1183 |
+
light: "Light That Burns the Sky",
|
1184 |
+
lsf: "Let's Snuggle Forever",
|
1185 |
+
ltbts: "Light That Burns the Sky",
|
1186 |
+
malicious: "Malicious Moonsault",
|
1187 |
+
menacing: "Menacing Moonraze Maelstrom",
|
1188 |
+
mmm: "Menacing Moonraze Maelstrom",
|
1189 |
+
moonsault: "Malicious Moonsault",
|
1190 |
+
oceanic: "Oceanic Operetta",
|
1191 |
+
oo: "Oceanic Operetta",
|
1192 |
+
pp: "Pulverizing Pancake",
|
1193 |
+
pulverizing: "Pulverizing Pancake",
|
1194 |
+
sar: "Sinister Arrow Raid",
|
1195 |
+
searing: "Searing Sunraze Smash",
|
1196 |
+
sinister: "Sinister Arrow Raid",
|
1197 |
+
ss: "Stoked Sparksurfer",
|
1198 |
+
sss: "Searing Sunraze Smash",
|
1199 |
+
sssss: "Soul-Stealing 7-Star Strike",
|
1200 |
+
ss7ss: "Soul-Stealing 7-Star Strike",
|
1201 |
+
soul: "Soul-Stealing 7-Star Strike",
|
1202 |
+
soulstealingsevenstarstrike: "Soul-Stealing 7-Star Strike",
|
1203 |
+
splintered: "Splintered Stormshards",
|
1204 |
+
stoked: "Stoked Sparksurfer",
|
1205 |
+
stormshards: "Splintered Stormshards",
|
1206 |
+
zbug: "Savage Spin-Out",
|
1207 |
+
zclangingscales: "Clangorous Soulblaze",
|
1208 |
+
zdark: "Black Hole Eclipse",
|
1209 |
+
zdarkestlariat: "Malicious Moonsault",
|
1210 |
+
zdawnwingsnecrozma: "Menacing Moonraze Maelstrom",
|
1211 |
+
zdecidueye: "Sinister Arrow Raid",
|
1212 |
+
zdragon: "Devastating Drake",
|
1213 |
+
zduskmanenecrozma: "Searing Sunraze Smash",
|
1214 |
+
zelectric: "Gigavolt Havoc",
|
1215 |
+
zeevee: "Extreme Evoboost",
|
1216 |
+
zevo: "Extreme Evoboost",
|
1217 |
+
zfairy: "Twinkle Tackle",
|
1218 |
+
zflying: "Supersonic Skystrike",
|
1219 |
+
zfighting: "All-Out Pummeling",
|
1220 |
+
zfire: "Inferno Overdrive",
|
1221 |
+
zghost: "Never-Ending Nightmare",
|
1222 |
+
zgigaimpact: "Pulverizing Pancake",
|
1223 |
+
zgrass: "Bloom Doom",
|
1224 |
+
zground: "Tectonic Rage",
|
1225 |
+
zice: "Subzero Slammer",
|
1226 |
+
zincineroar: "Malicious Moonsault",
|
1227 |
+
zkommoo: "Clangorous Soulblaze",
|
1228 |
+
zlastresort: "Extreme Evoboost",
|
1229 |
+
zlunala: "Menacing Moonraze Maelstrom",
|
1230 |
+
zlycanroc: "Splintered Stormshards",
|
1231 |
+
znaturesmadness: "Guardian of Alola",
|
1232 |
+
zmarshadow: "Soul-Stealing 7-Star Strike",
|
1233 |
+
zmew: "Genesis Supernova",
|
1234 |
+
zmimikyu: "Let's Snuggle Forever",
|
1235 |
+
zmoongeistbeam: "Menacing Moonraze Maelstrom",
|
1236 |
+
znecrozma: "Light That Burns the Sky",
|
1237 |
+
znormal: "Breakneck Blitz",
|
1238 |
+
zrock: "Continental Crush",
|
1239 |
+
zphotongeyser: "Light That Burns the Sky",
|
1240 |
+
zpikachu: "Catastropika",
|
1241 |
+
zpikachucap: "10,000,000 Volt Thunderbolt",
|
1242 |
+
zplayrough: "Let's Snuggle Forever",
|
1243 |
+
zpoison: "Acid Downpour",
|
1244 |
+
zprimarina: "Oceanic Operetta",
|
1245 |
+
zpsychic: "Shattered Psyche",
|
1246 |
+
zraichu: "Stoked Sparksurfer",
|
1247 |
+
zsnorlax: "Pulverizing Pancake",
|
1248 |
+
zsolgaleo: "Searing Sunraze Smash",
|
1249 |
+
zsparklingaria: "Oceanic Operetta",
|
1250 |
+
zspectralthief: "Soul-Stealing 7-Star Strike",
|
1251 |
+
zspiritshackle: "Sinister Arrow Raid",
|
1252 |
+
zsunsteelstrike: "Searing Sunraze Smash",
|
1253 |
+
zsteel: "Corkscrew Crash",
|
1254 |
+
zstoneedge: "Splintered Stormshards",
|
1255 |
+
ztapu: "Guardian of Alola",
|
1256 |
+
zthunderbolt: "10,000,000 Volt Thunderbolt",
|
1257 |
+
zultranecrozma: "Light That Burns the Sky",
|
1258 |
+
zvolttackle: "Catastropika",
|
1259 |
+
zwater: "Hydro Vortex",
|
1260 |
+
|
1261 |
+
// Max moves
|
1262 |
+
maxbug: "Max Flutterby",
|
1263 |
+
maxdark: "Max Darkness",
|
1264 |
+
maxdragon: "Max Wyrmwind",
|
1265 |
+
maxelectric: "Max Lightning",
|
1266 |
+
maxfairy: "Max Starfall",
|
1267 |
+
maxfighting: "Max Knuckle",
|
1268 |
+
maxfire: "Max Flare",
|
1269 |
+
maxflying: "Max Airstream",
|
1270 |
+
maxghost: "Max Phantasm",
|
1271 |
+
maxgrass: "Max Overgrowth",
|
1272 |
+
maxground: "Max Quake",
|
1273 |
+
maxice: "Max Hailstorm",
|
1274 |
+
maxnormal: "Max Strike",
|
1275 |
+
maxpoison: "Max Ooze",
|
1276 |
+
maxpsychic: "Max Mindstorm",
|
1277 |
+
maxrock: "Max Rockfall",
|
1278 |
+
maxsteel: "Max Steelspike",
|
1279 |
+
maxwater: "Max Geyser",
|
1280 |
+
maxstatus: "Max Guard",
|
1281 |
+
maxprotect: "Max Guard",
|
1282 |
+
|
1283 |
+
// G-Max Moves
|
1284 |
+
befuddle: "G-Max Befuddle",
|
1285 |
+
cannonade: "G-Max Cannonade",
|
1286 |
+
centiferno: "G-Max Centiferno",
|
1287 |
+
chistrike: "G-Max Chi Strike",
|
1288 |
+
cuddle: "G-Max Cuddle",
|
1289 |
+
depletion: "G-Max Depletion",
|
1290 |
+
drumsolo: "G-Max Drum Solo",
|
1291 |
+
finale: "G-Max Finale",
|
1292 |
+
fireball: "G-Max Fireball",
|
1293 |
+
foamburst: "G-Max Foam Burst",
|
1294 |
+
goldrush: "G-Max Gold Rush",
|
1295 |
+
gravitas: "G-Max Gravitas",
|
1296 |
+
hydrosnipe: "G-Max Hydrosnipe",
|
1297 |
+
malodor: "G-Max Malodor",
|
1298 |
+
meltdown: "G-Max Meltdown",
|
1299 |
+
oneblow: "G-Max One Blow",
|
1300 |
+
rapidflow: "G-Max Rapid Flow",
|
1301 |
+
replenish: "G-Max Replenish",
|
1302 |
+
resonance: "G-Max Resonance",
|
1303 |
+
sandblast: "G-Max Sandblast",
|
1304 |
+
smite: "G-Max Smite",
|
1305 |
+
snooze: "G-Max Snooze",
|
1306 |
+
steelsurge: "G-Max Steelsurge",
|
1307 |
+
stonesurge: "G-Max Stonesurge",
|
1308 |
+
stunshock: "G-Max Stun Shock",
|
1309 |
+
sweetness: "G-Max Sweetness",
|
1310 |
+
tartness: "G-Max Tartness",
|
1311 |
+
terror: "G-Max Terror",
|
1312 |
+
vinelash: "G-Max Vine Lash",
|
1313 |
+
volcalith: "G-Max Volcalith",
|
1314 |
+
voltcrash: "G-Max Volt Crash",
|
1315 |
+
wildfire: "G-Max Wildfire",
|
1316 |
+
windrage: "G-Max Wind Rage",
|
1317 |
+
|
1318 |
+
// Japanese names
|
1319 |
+
fushigidane: "Bulbasaur",
|
1320 |
+
fushigisou: "Ivysaur",
|
1321 |
+
fushigibana: "Venusaur",
|
1322 |
+
hitokage: "Charmander",
|
1323 |
+
rizaado: "Charmeleon",
|
1324 |
+
rizaadon: "Charizard",
|
1325 |
+
zenigame: "Squirtle",
|
1326 |
+
kameeru: "Wartortle",
|
1327 |
+
kamekkusu: "Blastoise",
|
1328 |
+
kyatapii: "Caterpie",
|
1329 |
+
toranseru: "Metapod",
|
1330 |
+
batafurii: "Butterfree",
|
1331 |
+
biidoru: "Weedle",
|
1332 |
+
kokuun: "Kakuna",
|
1333 |
+
supiaa: "Beedrill",
|
1334 |
+
poppo: "Pidgey",
|
1335 |
+
pijon: "Pidgeotto",
|
1336 |
+
pijotto: "Pidgeot",
|
1337 |
+
koratta: "Rattata",
|
1338 |
+
ratta: "Raticate",
|
1339 |
+
onisuzume: "Spearow",
|
1340 |
+
onidoriru: "Fearow",
|
1341 |
+
aabo: "Ekans",
|
1342 |
+
aabokku: "Arbok",
|
1343 |
+
pikachuu: "Pikachu",
|
1344 |
+
raichuu: "Raichu",
|
1345 |
+
sando: "Sandshrew",
|
1346 |
+
sandopan: "Sandslash",
|
1347 |
+
nidoranmesu: "Nidoran-F",
|
1348 |
+
nidoriina: "Nidorina",
|
1349 |
+
nidokuin: "Nidoqueen",
|
1350 |
+
nidoranosu: "Nidoran-M",
|
1351 |
+
nidoriino: "Nidorino",
|
1352 |
+
nidokingu: "Nidoking",
|
1353 |
+
pippi: "Clefairy",
|
1354 |
+
pikushii: "Clefable",
|
1355 |
+
rokon: "Vulpix",
|
1356 |
+
kyuukon: "Ninetales",
|
1357 |
+
purin: "Jigglypuff",
|
1358 |
+
pukurin: "Wigglytuff",
|
1359 |
+
zubatto: "Zubat",
|
1360 |
+
gorubatto: "Golbat",
|
1361 |
+
nazonokusa: "Oddish",
|
1362 |
+
kusaihana: "Gloom",
|
1363 |
+
rafureshia: "Vileplume",
|
1364 |
+
parasu: "Paras",
|
1365 |
+
parasekuto: "Parasect",
|
1366 |
+
konpan: "Venonat",
|
1367 |
+
morufon: "Venomoth",
|
1368 |
+
diguda: "Diglett",
|
1369 |
+
dagutorio: "Dugtrio",
|
1370 |
+
nyaasu: "Meowth",
|
1371 |
+
perushian: "Persian",
|
1372 |
+
kodakku: "Psyduck",
|
1373 |
+
gorudakku: "Golduck",
|
1374 |
+
mankii: "Mankey",
|
1375 |
+
okorizaru: "Primeape",
|
1376 |
+
gaadi: "Growlithe",
|
1377 |
+
uindi: "Arcanine",
|
1378 |
+
nyoromo: "Poliwag",
|
1379 |
+
nyorozo: "Poliwhirl",
|
1380 |
+
nyorobon: "Poliwrath",
|
1381 |
+
keeshy: "Abra",
|
1382 |
+
yungeraa: "Kadabra",
|
1383 |
+
fuudin: "Alakazam",
|
1384 |
+
wanrikii: "Machop",
|
1385 |
+
goorikii: "Machoke",
|
1386 |
+
kairikii: "Machamp",
|
1387 |
+
madatsubomi: "Bellsprout",
|
1388 |
+
utsudon: "Weepinbell",
|
1389 |
+
utsubotto: "Victreebel",
|
1390 |
+
menokurage: "Tentacool",
|
1391 |
+
dokukurage: "Tentacruel",
|
1392 |
+
ishitsubute: "Geodude",
|
1393 |
+
goroon: "Graveler",
|
1394 |
+
goroonya: "Golem",
|
1395 |
+
poniita: "Ponyta",
|
1396 |
+
gyaroppu: "Rapidash",
|
1397 |
+
yadon: "Slowpoke",
|
1398 |
+
yadoran: "Slowbro",
|
1399 |
+
koiru: "Magnemite",
|
1400 |
+
reakoiru: "Magneton",
|
1401 |
+
kamonegi: "Farfetch'd",
|
1402 |
+
doodoo: "Doduo",
|
1403 |
+
doodorio: "Dodrio",
|
1404 |
+
pauwau: "Seel",
|
1405 |
+
jugon: "Dewgong",
|
1406 |
+
betobetaa: "Grimer",
|
1407 |
+
betobeton: "Muk",
|
1408 |
+
sherudaa: "Shellder",
|
1409 |
+
parushen: "Cloyster",
|
1410 |
+
goosu: "Gastly",
|
1411 |
+
goosuto: "Haunter",
|
1412 |
+
gengaa: "Gengar",
|
1413 |
+
iwaaku: "Onix",
|
1414 |
+
suriipu: "Drowzee",
|
1415 |
+
suriipaa: "Hypno",
|
1416 |
+
kurabu: "Krabby",
|
1417 |
+
kinguraa: "Kingler",
|
1418 |
+
biriridama: "Voltorb",
|
1419 |
+
marumain: "Electrode",
|
1420 |
+
tamatama: "Exeggcute",
|
1421 |
+
nasshii: "Exeggutor",
|
1422 |
+
karakara: "Cubone",
|
1423 |
+
garagara: "Marowak",
|
1424 |
+
sawamuraa: "Hitmonlee",
|
1425 |
+
ebiwaraa: "Hitmonchan",
|
1426 |
+
beroringa: "Lickitung",
|
1427 |
+
dogaasu: "Koffing",
|
1428 |
+
matadogasu: "Weezing",
|
1429 |
+
saihoon: "Rhyhorn",
|
1430 |
+
saidon: "Rhydon",
|
1431 |
+
rakkii: "Chansey",
|
1432 |
+
monjara: "Tangela",
|
1433 |
+
garuura: "Kangaskhan",
|
1434 |
+
tattsuu: "Horsea",
|
1435 |
+
shiidora: "Seadra",
|
1436 |
+
tosakinto: "Goldeen",
|
1437 |
+
azumaou: "Seaking",
|
1438 |
+
hitodeman: "Staryu",
|
1439 |
+
sutaamii: "Starmie",
|
1440 |
+
bariyaado: "Mr. Mime",
|
1441 |
+
sutoraiku: "Scyther",
|
1442 |
+
ruujura: "Jynx",
|
1443 |
+
erebuu: "Electabuzz",
|
1444 |
+
buubaa: "Magmar",
|
1445 |
+
kairosu: "Pinsir",
|
1446 |
+
kentarosu: "Tauros",
|
1447 |
+
koikingu: "Magikarp",
|
1448 |
+
gyaradosu: "Gyarados",
|
1449 |
+
rapurasu: "Lapras",
|
1450 |
+
metamon: "Ditto",
|
1451 |
+
iibui: "Eevee",
|
1452 |
+
shawaazu: "Vaporeon",
|
1453 |
+
sandaasu: "Jolteon",
|
1454 |
+
buusutaa: "Flareon",
|
1455 |
+
porigon: "Porygon",
|
1456 |
+
omunaito: "Omanyte",
|
1457 |
+
omusutaa: "Omastar",
|
1458 |
+
kabutopusu: "Kabutops",
|
1459 |
+
putera: "Aerodactyl",
|
1460 |
+
kabigon: "Snorlax",
|
1461 |
+
furiizaa: "Articuno",
|
1462 |
+
sandaa: "Zapdos",
|
1463 |
+
faiyaa: "Moltres",
|
1464 |
+
miniryuu: "Dratini",
|
1465 |
+
hakuryuu: "Dragonair",
|
1466 |
+
kairyuu: "Dragonite",
|
1467 |
+
myuutsuu: "Mewtwo",
|
1468 |
+
myuu: "Mew",
|
1469 |
+
chikoriita: "Chikorita",
|
1470 |
+
beiriifu: "Bayleef",
|
1471 |
+
meganiumu: "Meganium",
|
1472 |
+
hinoarashi: "Cyndaquil",
|
1473 |
+
magumarashi: "Quilava",
|
1474 |
+
bakufuun: "Typhlosion",
|
1475 |
+
waninoko: "Totodile",
|
1476 |
+
arigeitsu: "Croconaw",
|
1477 |
+
oodairu: "Feraligatr",
|
1478 |
+
otachi: "Sentret",
|
1479 |
+
ootachi: "Furret",
|
1480 |
+
hoohoo: "Hoothoot",
|
1481 |
+
yorunozuku: "Noctowl",
|
1482 |
+
rediba: "Ledyba",
|
1483 |
+
redian: "Ledian",
|
1484 |
+
itomaru: "Spinarak",
|
1485 |
+
ariadosu: "Ariados",
|
1486 |
+
kurobatto: "Crobat",
|
1487 |
+
chonchii: "Chinchou",
|
1488 |
+
rantaan: "Lanturn",
|
1489 |
+
pichuu: "Pichu",
|
1490 |
+
py: "Cleffa",
|
1491 |
+
pupurin: "Igglybuff",
|
1492 |
+
togepii: "Togepi",
|
1493 |
+
togechikku: "Togetic",
|
1494 |
+
neitei: "Natu",
|
1495 |
+
neiteio: "Xatu",
|
1496 |
+
meriipu: "Mareep",
|
1497 |
+
mokoko: "Flaaffy",
|
1498 |
+
denryuu: "Ampharos",
|
1499 |
+
kireihana: "Bellossom",
|
1500 |
+
mariru: "Marill",
|
1501 |
+
mariruri: "Azumarill",
|
1502 |
+
usokkii: "Sudowoodo",
|
1503 |
+
nyorotono: "Politoed",
|
1504 |
+
hanekko: "Hoppip",
|
1505 |
+
popokko: "Skiploom",
|
1506 |
+
watakko: "Jumpluff",
|
1507 |
+
eipamu: "Aipom",
|
1508 |
+
himanattsu: "Sunkern",
|
1509 |
+
kimawari: "Sunflora",
|
1510 |
+
yanyanma: "Yanma",
|
1511 |
+
upaa: "Wooper",
|
1512 |
+
nuoo: "Quagsire",
|
1513 |
+
eefi: "Espeon",
|
1514 |
+
burakkii: "Umbreon",
|
1515 |
+
yamikarasu: "Murkrow",
|
1516 |
+
yadokingu: "Slowking",
|
1517 |
+
muuma: "Misdreavus",
|
1518 |
+
annoon: "Unown",
|
1519 |
+
soonansu: "Wobbuffet",
|
1520 |
+
kirinriki: "Girafarig",
|
1521 |
+
kunugidama: "Pineco",
|
1522 |
+
foretosu: "Forretress",
|
1523 |
+
nokotchi: "Dunsparce",
|
1524 |
+
guraigaa: "Gligar",
|
1525 |
+
haganeeru: "Steelix",
|
1526 |
+
buruu: "Snubbull",
|
1527 |
+
guranburu: "Granbull",
|
1528 |
+
hariisen: "Qwilfish",
|
1529 |
+
hassamu: "Scizor",
|
1530 |
+
tsubotsubo: "Shuckle",
|
1531 |
+
herakurosu: "Heracross",
|
1532 |
+
nyuura: "Sneasel",
|
1533 |
+
himeguma: "Teddiursa",
|
1534 |
+
ringuma: "Ursaring",
|
1535 |
+
magumaggu: "Slugma",
|
1536 |
+
magukarugo: "Magcargo",
|
1537 |
+
urimuu: "Swinub",
|
1538 |
+
inomuu: "Piloswine",
|
1539 |
+
saniigo: "Corsola",
|
1540 |
+
teppouo: "Remoraid",
|
1541 |
+
okutan: "Octillery",
|
1542 |
+
deribaado: "Delibird",
|
1543 |
+
mantain: "Mantine",
|
1544 |
+
eaamudo: "Skarmory",
|
1545 |
+
derubiru: "Houndour",
|
1546 |
+
herugaa: "Houndoom",
|
1547 |
+
kingudora: "Kingdra",
|
1548 |
+
gomazou: "Phanpy",
|
1549 |
+
donfan: "Donphan",
|
1550 |
+
porigon2: "Porygon2",
|
1551 |
+
odoshishi: "Stantler",
|
1552 |
+
dooburu: "Smeargle",
|
1553 |
+
barukii: "Tyrogue",
|
1554 |
+
kapoeraa: "Hitmontop",
|
1555 |
+
muchuuru: "Smoochum",
|
1556 |
+
erekiddo: "Elekid",
|
1557 |
+
buby: "Magby",
|
1558 |
+
mirutanku: "Miltank",
|
1559 |
+
hapinasu: "Blissey",
|
1560 |
+
suikun: "Suicune",
|
1561 |
+
yoogirasu: "Larvitar",
|
1562 |
+
sanagirasu: "Pupitar",
|
1563 |
+
bangirasu: "Tyranitar",
|
1564 |
+
rugia: "Lugia",
|
1565 |
+
houou: "Ho-Oh",
|
1566 |
+
sereby: "Celebi",
|
1567 |
+
kimori: "Treecko",
|
1568 |
+
juputoru: "Grovyle",
|
1569 |
+
jukain: "Sceptile",
|
1570 |
+
achamo: "Torchic",
|
1571 |
+
wakashamo: "Combusken",
|
1572 |
+
bashaamo: "Blaziken",
|
1573 |
+
mizugorou: "Mudkip",
|
1574 |
+
numakuroo: "Marshtomp",
|
1575 |
+
raguraaji: "Swampert",
|
1576 |
+
pochiena: "Poochyena",
|
1577 |
+
guraena: "Mightyena",
|
1578 |
+
jiguzaguma: "Zigzagoon",
|
1579 |
+
massuguma: "Linoone",
|
1580 |
+
kemusso: "Wurmple",
|
1581 |
+
karasarisu: "Silcoon",
|
1582 |
+
agehanto: "Beautifly",
|
1583 |
+
mayurudo: "Cascoon",
|
1584 |
+
dokukeiru: "Dustox",
|
1585 |
+
hasuboo: "Lotad",
|
1586 |
+
hasuburero: "Lombre",
|
1587 |
+
runpappa: "Ludicolo",
|
1588 |
+
taneboo: "Seedot",
|
1589 |
+
konohana: "Nuzleaf",
|
1590 |
+
daatengu: "Shiftry",
|
1591 |
+
subame: "Taillow",
|
1592 |
+
oosubame: "Swellow",
|
1593 |
+
kyamome: "Wingull",
|
1594 |
+
perippaa: "Pelipper",
|
1595 |
+
rarutosu: "Ralts",
|
1596 |
+
kiruria: "Kirlia",
|
1597 |
+
saanaito: "Gardevoir",
|
1598 |
+
ametama: "Surskit",
|
1599 |
+
amemoosu: "Masquerain",
|
1600 |
+
kinokoko: "Shroomish",
|
1601 |
+
kinogassa: "Breloom",
|
1602 |
+
namakero: "Slakoth",
|
1603 |
+
yarukimono: "Vigoroth",
|
1604 |
+
kekkingu: "Slaking",
|
1605 |
+
tsuchinin: "Nincada",
|
1606 |
+
tekkanin: "Ninjask",
|
1607 |
+
nukenin: "Shedinja",
|
1608 |
+
gonyonyo: "Whismur",
|
1609 |
+
dogoomu: "Loudred",
|
1610 |
+
bakuongu: "Exploud",
|
1611 |
+
makunoshita: "Makuhita",
|
1612 |
+
hariteyama: "Hariyama",
|
1613 |
+
ruriri: "Azurill",
|
1614 |
+
nozupasu: "Nosepass",
|
1615 |
+
eneko: "Skitty",
|
1616 |
+
enekororo: "Delcatty",
|
1617 |
+
yamirami: "Sableye",
|
1618 |
+
kuchiito: "Mawile",
|
1619 |
+
kokodora: "Aron",
|
1620 |
+
kodora: "Lairon",
|
1621 |
+
bosugodora: "Aggron",
|
1622 |
+
asanan: "Meditite",
|
1623 |
+
chaaremu: "Medicham",
|
1624 |
+
rakurai: "Electrike",
|
1625 |
+
raiboruto: "Manectric",
|
1626 |
+
purasuru: "Plusle",
|
1627 |
+
mainan: "Minun",
|
1628 |
+
barubiito: "Volbeat",
|
1629 |
+
irumiize: "Illumise",
|
1630 |
+
rozeria: "Roselia",
|
1631 |
+
gokurin: "Gulpin",
|
1632 |
+
marunoomu: "Swalot",
|
1633 |
+
kibania: "Carvanha",
|
1634 |
+
samehadaa: "Sharpedo",
|
1635 |
+
hoeruko: "Wailmer",
|
1636 |
+
hoeruoo: "Wailord",
|
1637 |
+
donmeru: "Numel",
|
1638 |
+
bakuuda: "Camerupt",
|
1639 |
+
kootasu: "Torkoal",
|
1640 |
+
banebuu: "Spoink",
|
1641 |
+
buupiggu: "Grumpig",
|
1642 |
+
patchiiru: "Spinda",
|
1643 |
+
nakkuraa: "Trapinch",
|
1644 |
+
biburaaba: "Vibrava",
|
1645 |
+
furaigon: "Flygon",
|
1646 |
+
sabonea: "Cacnea",
|
1647 |
+
nokutasu: "Cacturne",
|
1648 |
+
chirutto: "Swablu",
|
1649 |
+
chirutarisu: "Altaria",
|
1650 |
+
zanguusu: "Zangoose",
|
1651 |
+
habuneeku: "Seviper",
|
1652 |
+
runatoon: "Lunatone",
|
1653 |
+
sorurokku: "Solrock",
|
1654 |
+
dojotchi: "Barboach",
|
1655 |
+
namazun: "Whiscash",
|
1656 |
+
heigani: "Corphish",
|
1657 |
+
shizarigaa: "Crawdaunt",
|
1658 |
+
yajiron: "Baltoy",
|
1659 |
+
nendooru: "Claydol",
|
1660 |
+
ririira: "Lileep",
|
1661 |
+
yureidoru: "Cradily",
|
1662 |
+
anopusu: "Anorith",
|
1663 |
+
aamarudo: "Armaldo",
|
1664 |
+
hinbasu: "Feebas",
|
1665 |
+
mirokarosu: "Milotic",
|
1666 |
+
powarun: "Castform",
|
1667 |
+
kakureon: "Kecleon",
|
1668 |
+
kagebouzu: "Shuppet",
|
1669 |
+
jupetta: "Banette",
|
1670 |
+
yomawaru: "Duskull",
|
1671 |
+
samayooru: "Dusclops",
|
1672 |
+
toropiusu: "Tropius",
|
1673 |
+
chiriin: "Chimecho",
|
1674 |
+
abusoru: "Absol",
|
1675 |
+
soonano: "Wynaut",
|
1676 |
+
yukiwarashi: "Snorunt",
|
1677 |
+
onigoori: "Glalie",
|
1678 |
+
tamazarashi: "Spheal",
|
1679 |
+
todoguraa: "Sealeo",
|
1680 |
+
todozeruga: "Walrein",
|
1681 |
+
paaruru: "Clamperl",
|
1682 |
+
hanteeru: "Huntail",
|
1683 |
+
sakurabisu: "Gorebyss",
|
1684 |
+
jiiransu: "Relicanth",
|
1685 |
+
rabukasu: "Luvdisc",
|
1686 |
+
tatsubei: "Bagon",
|
1687 |
+
komoruu: "Shelgon",
|
1688 |
+
boomanda: "Salamence",
|
1689 |
+
danbaru: "Beldum",
|
1690 |
+
metangu: "Metang",
|
1691 |
+
metagurosu: "Metagross",
|
1692 |
+
rejirokku: "Regirock",
|
1693 |
+
rejiaisu: "Regice",
|
1694 |
+
rejisuchiru: "Registeel",
|
1695 |
+
rateiasu: "Latias",
|
1696 |
+
rateiosu: "Latios",
|
1697 |
+
kaiooga: "Kyogre",
|
1698 |
+
guraadon: "Groudon",
|
1699 |
+
rekkuuza: "Rayquaza",
|
1700 |
+
jiraachi: "Jirachi",
|
1701 |
+
deokishisu: "Deoxys",
|
1702 |
+
naetoru: "Turtwig",
|
1703 |
+
hayashigame: "Grotle",
|
1704 |
+
dodaitosu: "Torterra",
|
1705 |
+
hikozaru: "Chimchar",
|
1706 |
+
moukazaru: "Monferno",
|
1707 |
+
goukazaru: "Infernape",
|
1708 |
+
potchama: "Piplup",
|
1709 |
+
pottaishi: "Prinplup",
|
1710 |
+
enperuto: "Empoleon",
|
1711 |
+
mukkuru: "Starly",
|
1712 |
+
mukubaado: "Staravia",
|
1713 |
+
mukuhooku: "Staraptor",
|
1714 |
+
bippa: "Bidoof",
|
1715 |
+
biidaru: "Bibarel",
|
1716 |
+
korobooshi: "Kricketot",
|
1717 |
+
korotokku: "Kricketune",
|
1718 |
+
korinku: "Shinx",
|
1719 |
+
rukushio: "Luxio",
|
1720 |
+
rentoraa: "Luxray",
|
1721 |
+
subomii: "Budew",
|
1722 |
+
rozureido: "Roserade",
|
1723 |
+
zugaidosu: "Cranidos",
|
1724 |
+
ramuparudo: "Rampardos",
|
1725 |
+
tatetopusu: "Shieldon",
|
1726 |
+
toridepusu: "Bastiodon",
|
1727 |
+
minomutchi: "Burmy",
|
1728 |
+
minomadamu: "Wormadam",
|
1729 |
+
gaameiru: "Mothim",
|
1730 |
+
mitsuhanii: "Combee",
|
1731 |
+
biikuin: "Vespiquen",
|
1732 |
+
buizeru: "Buizel",
|
1733 |
+
furoozeru: "Floatzel",
|
1734 |
+
cherinbo: "Cherubi",
|
1735 |
+
cherimu: "Cherrim",
|
1736 |
+
karanakushi: "Shellos",
|
1737 |
+
toritodon: "Gastrodon",
|
1738 |
+
eteboosu: "Ambipom",
|
1739 |
+
fuwante: "Drifloon",
|
1740 |
+
fuwaraido: "Drifblim",
|
1741 |
+
mimiroru: "Buneary",
|
1742 |
+
mimiroppu: "Lopunny",
|
1743 |
+
muumaaji: "Mismagius",
|
1744 |
+
donkarasu: "Honchkrow",
|
1745 |
+
nyarumaa: "Glameow",
|
1746 |
+
bunyatto: "Purugly",
|
1747 |
+
riishan: "Chingling",
|
1748 |
+
sukanpuu: "Stunky",
|
1749 |
+
sukatanku: "Skuntank",
|
1750 |
+
doomiraa: "Bronzor",
|
1751 |
+
dootakun: "Bronzong",
|
1752 |
+
usohachi: "Bonsly",
|
1753 |
+
manene: "Mime Jr.",
|
1754 |
+
pinpuku: "Happiny",
|
1755 |
+
perappu: "Chatot",
|
1756 |
+
mikaruge: "Spiritomb",
|
1757 |
+
fukamaru: "Gible",
|
1758 |
+
gabaito: "Gabite",
|
1759 |
+
gaburiasu: "Garchomp",
|
1760 |
+
gonbe: "Munchlax",
|
1761 |
+
rioru: "Riolu",
|
1762 |
+
rukario: "Lucario",
|
1763 |
+
hipopotasu: "Hippopotas",
|
1764 |
+
kabarudon: "Hippowdon",
|
1765 |
+
sukorupi: "Skorupi",
|
1766 |
+
dorapion: "Drapion",
|
1767 |
+
guregguru: "Croagunk",
|
1768 |
+
dokuroggu: "Toxicroak",
|
1769 |
+
masukippa: "Carnivine",
|
1770 |
+
keikouo: "Finneon",
|
1771 |
+
neoranto: "Lumineon",
|
1772 |
+
tamanta: "Mantyke",
|
1773 |
+
yukikaburi: "Snover",
|
1774 |
+
yukinooo: "Abomasnow",
|
1775 |
+
manyuura: "Weavile",
|
1776 |
+
jibakoiru: "Magnezone",
|
1777 |
+
beroberuto: "Lickilicky",
|
1778 |
+
dosaidon: "Rhyperior",
|
1779 |
+
mojanbo: "Tangrowth",
|
1780 |
+
erekiburu: "Electivire",
|
1781 |
+
buubaan: "Magmortar",
|
1782 |
+
togekissu: "Togekiss",
|
1783 |
+
megayanma: "Yanmega",
|
1784 |
+
riifia: "Leafeon",
|
1785 |
+
gureishia: "Glaceon",
|
1786 |
+
guraion: "Gliscor",
|
1787 |
+
manmuu: "Mamoswine",
|
1788 |
+
porigonz: "Porygon-Z",
|
1789 |
+
erureido: "Gallade",
|
1790 |
+
dainoozu: "Probopass",
|
1791 |
+
yonowaaru: "Dusknoir",
|
1792 |
+
yukimenoko: "Froslass",
|
1793 |
+
rotomu: "Rotom",
|
1794 |
+
yukushii: "Uxie",
|
1795 |
+
emuritto: "Mesprit",
|
1796 |
+
agunomu: "Azelf",
|
1797 |
+
diaruga: "Dialga",
|
1798 |
+
parukia: "Palkia",
|
1799 |
+
hiidoran: "Heatran",
|
1800 |
+
rejigigasu: "Regigigas",
|
1801 |
+
girateina: "Giratina",
|
1802 |
+
kureseria: "Cresselia",
|
1803 |
+
fione: "Phione",
|
1804 |
+
manafi: "Manaphy",
|
1805 |
+
daakurai: "Darkrai",
|
1806 |
+
sheimi: "Shaymin",
|
1807 |
+
aruseusu: "Arceus",
|
1808 |
+
bikuteini: "Victini",
|
1809 |
+
tsutaaja: "Snivy",
|
1810 |
+
janobii: "Servine",
|
1811 |
+
jarooda: "Serperior",
|
1812 |
+
pokabu: "Tepig",
|
1813 |
+
chaobuu: "Pignite",
|
1814 |
+
enbuoo: "Emboar",
|
1815 |
+
mijumaru: "Oshawott",
|
1816 |
+
futachimaru: "Dewott",
|
1817 |
+
daikenki: "Samurott",
|
1818 |
+
minezumi: "Patrat",
|
1819 |
+
miruhoggu: "Watchog",
|
1820 |
+
yooterii: "Lillipup",
|
1821 |
+
haaderia: "Herdier",
|
1822 |
+
muurando: "Stoutland",
|
1823 |
+
choroneko: "Purrloin",
|
1824 |
+
reparudasu: "Liepard",
|
1825 |
+
yanappu: "Pansage",
|
1826 |
+
yanakkii: "Simisage",
|
1827 |
+
baoppu: "Pansear",
|
1828 |
+
baokkii: "Simisear",
|
1829 |
+
hiyappu: "Panpour",
|
1830 |
+
hiyakkii: "Simipour",
|
1831 |
+
mushaana: "Musharna",
|
1832 |
+
mamepato: "Pidove",
|
1833 |
+
hatooboo: "Tranquill",
|
1834 |
+
kenhorou: "Unfezant",
|
1835 |
+
shimama: "Blitzle",
|
1836 |
+
zeburaika: "Zebstrika",
|
1837 |
+
dangoro: "Roggenrola",
|
1838 |
+
gantoru: "Boldore",
|
1839 |
+
gigaiasu: "Gigalith",
|
1840 |
+
koromori: "Woobat",
|
1841 |
+
kokoromori: "Swoobat",
|
1842 |
+
moguryuu: "Drilbur",
|
1843 |
+
doryuuzu: "Excadrill",
|
1844 |
+
tabunne: "Audino",
|
1845 |
+
dokkoraa: "Timburr",
|
1846 |
+
dotekkotsu: "Gurdurr",
|
1847 |
+
roobushin: "Conkeldurr",
|
1848 |
+
otamaro: "Tympole",
|
1849 |
+
gamagaru: "Palpitoad",
|
1850 |
+
gamageroge: "Seismitoad",
|
1851 |
+
nageki: "Throh",
|
1852 |
+
dageki: "Sawk",
|
1853 |
+
kurumiru: "Sewaddle",
|
1854 |
+
kurumayu: "Swadloon",
|
1855 |
+
hahakomori: "Leavanny",
|
1856 |
+
fushide: "Venipede",
|
1857 |
+
hoiiga: "Whirlipede",
|
1858 |
+
pendoraa: "Scolipede",
|
1859 |
+
monmen: "Cottonee",
|
1860 |
+
erufuun: "Whimsicott",
|
1861 |
+
churine: "Petilil",
|
1862 |
+
doredia: "Lilligant",
|
1863 |
+
basurao: "Basculin",
|
1864 |
+
meguroko: "Sandile",
|
1865 |
+
warubiru: "Krokorok",
|
1866 |
+
warubiaru: "Krookodile",
|
1867 |
+
darumakka: "Darumaka",
|
1868 |
+
hihidaruma: "Darmanitan",
|
1869 |
+
marakatchi: "Maractus",
|
1870 |
+
ishizumai: "Dwebble",
|
1871 |
+
iwaparesu: "Crustle",
|
1872 |
+
zuruggu: "Scraggy",
|
1873 |
+
zuruzukin: "Scrafty",
|
1874 |
+
shinboraa: "Sigilyph",
|
1875 |
+
desumasu: "Yamask",
|
1876 |
+
desukaan: "Cofagrigus",
|
1877 |
+
purotooga: "Tirtouga",
|
1878 |
+
abagoora: "Carracosta",
|
1879 |
+
aaken: "Archen",
|
1880 |
+
aakeosu: "Archeops",
|
1881 |
+
yabukuron: "Trubbish",
|
1882 |
+
dasutodasu: "Garbodor",
|
1883 |
+
zoroa: "Zorua",
|
1884 |
+
zoroaaku: "Zoroark",
|
1885 |
+
chiraamy: "Minccino",
|
1886 |
+
chirachiino: "Cinccino",
|
1887 |
+
gochimu: "Gothita",
|
1888 |
+
gochimiru: "Gothorita",
|
1889 |
+
gochiruzeru: "Gothitelle",
|
1890 |
+
yuniran: "Solosis",
|
1891 |
+
daburan: "Duosion",
|
1892 |
+
rankurusu: "Reuniclus",
|
1893 |
+
koaruhii: "Ducklett",
|
1894 |
+
suwanna: "Swanna",
|
1895 |
+
baniputchi: "Vanillite",
|
1896 |
+
baniritchi: "Vanillish",
|
1897 |
+
baibanira: "Vanilluxe",
|
1898 |
+
shikijika: "Deerling",
|
1899 |
+
mebukijika: "Sawsbuck",
|
1900 |
+
emonga: "Emolga",
|
1901 |
+
kaburumo: "Karrablast",
|
1902 |
+
shubarugo: "Escavalier",
|
1903 |
+
tamagetake: "Foongus",
|
1904 |
+
morobareru: "Amoonguss",
|
1905 |
+
pururiru: "Frillish",
|
1906 |
+
burungeru: "Jellicent",
|
1907 |
+
mamanbou: "Alomomola",
|
1908 |
+
bachuru: "Joltik",
|
1909 |
+
denchura: "Galvantula",
|
1910 |
+
tesshiido: "Ferroseed",
|
1911 |
+
nattorei: "Ferrothorn",
|
1912 |
+
giaru: "Klink",
|
1913 |
+
gigiaru: "Klang",
|
1914 |
+
gigigiaru: "Klinklang",
|
1915 |
+
shibishirasu: "Tynamo",
|
1916 |
+
shibibiiru: "Eelektrik",
|
1917 |
+
shibirudon: "Eelektross",
|
1918 |
+
riguree: "Elgyem",
|
1919 |
+
oobemu: "Beheeyem",
|
1920 |
+
hitomoshi: "Litwick",
|
1921 |
+
ranpuraa: "Lampent",
|
1922 |
+
shandera: "Chandelure",
|
1923 |
+
kibago: "Axew",
|
1924 |
+
onondo: "Fraxure",
|
1925 |
+
ononokusu: "Haxorus",
|
1926 |
+
kumashun: "Cubchoo",
|
1927 |
+
tsunbeaa: "Beartic",
|
1928 |
+
furiijio: "Cryogonal",
|
1929 |
+
chobomaki: "Shelmet",
|
1930 |
+
agirudaa: "Accelgor",
|
1931 |
+
maggyo: "Stunfisk",
|
1932 |
+
kojofuu: "Mienfoo",
|
1933 |
+
kojondo: "Mienshao",
|
1934 |
+
kurimugan: "Druddigon",
|
1935 |
+
gobitto: "Golett",
|
1936 |
+
goruugu: "Golurk",
|
1937 |
+
komatana: "Pawniard",
|
1938 |
+
kirikizan: "Bisharp",
|
1939 |
+
baffuron: "Bouffalant",
|
1940 |
+
washibon: "Rufflet",
|
1941 |
+
uooguru: "Braviary",
|
1942 |
+
baruchai: "Vullaby",
|
1943 |
+
barujiina: "Mandibuzz",
|
1944 |
+
kuitaran: "Heatmor",
|
1945 |
+
aianto: "Durant",
|
1946 |
+
monozu: "Deino",
|
1947 |
+
jiheddo: "Zweilous",
|
1948 |
+
sazandora: "Hydreigon",
|
1949 |
+
meraruba: "Larvesta",
|
1950 |
+
urugamosu: "Volcarona",
|
1951 |
+
kobaruon: "Cobalion",
|
1952 |
+
terakion: "Terrakion",
|
1953 |
+
birijion: "Virizion",
|
1954 |
+
torunerosu: "Tornadus",
|
1955 |
+
borutorosu: "Thundurus",
|
1956 |
+
reshiramu: "Reshiram",
|
1957 |
+
zekuromu: "Zekrom",
|
1958 |
+
randorosu: "Landorus",
|
1959 |
+
kyuremu: "Kyurem",
|
1960 |
+
kerudio: "Keldeo",
|
1961 |
+
meroetta: "Meloetta",
|
1962 |
+
genosekuto: "Genesect",
|
1963 |
+
harimaron: "Chespin",
|
1964 |
+
hariboogu: "Quilladin",
|
1965 |
+
burigaron: "Chesnaught",
|
1966 |
+
fokko: "Fennekin",
|
1967 |
+
teerunaa: "Braixen",
|
1968 |
+
mafokushii: "Delphox",
|
1969 |
+
keromatsu: "Froakie",
|
1970 |
+
gekogashira: "Frogadier",
|
1971 |
+
gekkouga: "Greninja",
|
1972 |
+
gekkougasatoshi: "Greninja-Ash",
|
1973 |
+
satoshigekkouga: "Greninja-Ash",
|
1974 |
+
horubii: "Bunnelby",
|
1975 |
+
horuudo: "Diggersby",
|
1976 |
+
yayakoma: "Fletchling",
|
1977 |
+
hinoyakoma: "Fletchinder",
|
1978 |
+
faiaroo: "Talonflame",
|
1979 |
+
kofukimushi: "Scatterbug",
|
1980 |
+
kofuurai: "Spewpa",
|
1981 |
+
bibiyon: "Vivillon",
|
1982 |
+
shishiko: "Litleo",
|
1983 |
+
kaenjishi: "Pyroar",
|
1984 |
+
furabebe: "Flabébé",
|
1985 |
+
furaette: "Floette",
|
1986 |
+
furaajesu: "Florges",
|
1987 |
+
meeekuru: "Skiddo",
|
1988 |
+
googooto: "Gogoat",
|
1989 |
+
yanchamu: "Pancham",
|
1990 |
+
goronda: "Pangoro",
|
1991 |
+
torimian: "Furfrou",
|
1992 |
+
nyasupaa: "Espurr",
|
1993 |
+
nyaonikusu: "Meowstic",
|
1994 |
+
hitotsuki: "Honedge",
|
1995 |
+
nidangiru: "Doublade",
|
1996 |
+
girugarudo: "Aegislash",
|
1997 |
+
shushupu: "Spritzee",
|
1998 |
+
furefuwan: "Aromatisse",
|
1999 |
+
peroppafu: "Swirlix",
|
2000 |
+
peroriimu: "Slurpuff",
|
2001 |
+
maaiika: "Inkay",
|
2002 |
+
karamanero: "Malamar",
|
2003 |
+
kametete: "Binacle",
|
2004 |
+
gamenodesu: "Barbaracle",
|
2005 |
+
kuzumoo: "Skrelp",
|
2006 |
+
doramidoro: "Dragalge",
|
2007 |
+
udeppou: "Clauncher",
|
2008 |
+
burosutaa: "Clawitzer",
|
2009 |
+
erikiteru: "Helioptile",
|
2010 |
+
erezaado: "Heliolisk",
|
2011 |
+
chigorasu: "Tyrunt",
|
2012 |
+
gachigorasu: "Tyrantrum",
|
2013 |
+
amarusu: "Amaura",
|
2014 |
+
amaruruga: "Aurorus",
|
2015 |
+
ninfia: "Sylveon",
|
2016 |
+
ruchaburu: "Hawlucha",
|
2017 |
+
mereshii: "Carbink",
|
2018 |
+
numera: "Goomy",
|
2019 |
+
numeiru: "Sliggoo",
|
2020 |
+
numerugon: "Goodra",
|
2021 |
+
kureffi: "Klefki",
|
2022 |
+
bokuree: "Phantump",
|
2023 |
+
oorotto: "Trevenant",
|
2024 |
+
baketcha: "Pumpkaboo",
|
2025 |
+
panpujin: "Gourgeist",
|
2026 |
+
kachikooru: "Bergmite",
|
2027 |
+
kurebeesu: "Avalugg",
|
2028 |
+
onbatto: "Noibat",
|
2029 |
+
onbaan: "Noivern",
|
2030 |
+
zeruneasu: "Xerneas",
|
2031 |
+
iberutaru: "Yveltal",
|
2032 |
+
jigarude: "Zygarde",
|
2033 |
+
dianshii: "Diancie",
|
2034 |
+
fuupa: "Hoopa",
|
2035 |
+
borukenion: "Volcanion",
|
2036 |
+
mokuroo: "Rowlet",
|
2037 |
+
fukusuroo: "Dartrix",
|
2038 |
+
junaipaa: "Decidueye",
|
2039 |
+
nyabii: "Litten",
|
2040 |
+
nyahiito: "Torracat",
|
2041 |
+
gaogaen: "Incineroar",
|
2042 |
+
ashimari: "Popplio",
|
2043 |
+
oshamari: "Brionne",
|
2044 |
+
ashireenu: "Primarina",
|
2045 |
+
tsutsukera: "Pikipek",
|
2046 |
+
kerarappa: "Trumbeak",
|
2047 |
+
dodekabashi: "Toucannon",
|
2048 |
+
yanguusu: "Yungoos",
|
2049 |
+
dekaguusu: "Gumshoos",
|
2050 |
+
agojimushi: "Grubbin",
|
2051 |
+
denjimushi: "Charjabug",
|
2052 |
+
kuwaganon: "Vikavolt",
|
2053 |
+
makenkani: "Crabrawler",
|
2054 |
+
kekenkani: "Crabominable",
|
2055 |
+
odoridori: "Oricorio",
|
2056 |
+
aburii: "Cutiefly",
|
2057 |
+
aburibon: "Ribombee",
|
2058 |
+
iwanko: "Rockruff",
|
2059 |
+
rugarugan: "Lycanroc",
|
2060 |
+
yowashi: "Wishiwashi",
|
2061 |
+
hidoide: "Mareanie",
|
2062 |
+
dohidoide: "Toxapex",
|
2063 |
+
dorobanko: "Mudbray",
|
2064 |
+
banbadoro: "Mudsdale",
|
2065 |
+
shizukumo: "Dewpider",
|
2066 |
+
onishizukumo: "Araquanid",
|
2067 |
+
karikiri: "Fomantis",
|
2068 |
+
rarantesu: "Lurantis",
|
2069 |
+
nemashu: "Morelull",
|
2070 |
+
masheedo: "Shiinotic",
|
2071 |
+
yatoumori: "Salandit",
|
2072 |
+
ennyuuto: "Salazzle",
|
2073 |
+
nuikoguma: "Stufful",
|
2074 |
+
kiteruguma: "Bewear",
|
2075 |
+
amakaji: "Bounsweet",
|
2076 |
+
amamaiko: "Steenee",
|
2077 |
+
amaajo: "Tsareena",
|
2078 |
+
kyuwawaa: "Comfey",
|
2079 |
+
yareyuutan: "Oranguru",
|
2080 |
+
nagetsukesaru: "Passimian",
|
2081 |
+
kosokumushi: "Wimpod",
|
2082 |
+
gusokumusha: "Golisopod",
|
2083 |
+
sunabaa: "Sandygast",
|
2084 |
+
shirodesuna: "Palossand",
|
2085 |
+
namakobushi: "Pyukumuku",
|
2086 |
+
taipunuru: "Type: Null",
|
2087 |
+
shiruvuadi: "Silvally",
|
2088 |
+
meteno: "Minior",
|
2089 |
+
nekkoara: "Komala",
|
2090 |
+
bakugamesu: "Turtonator",
|
2091 |
+
mimikkyu: "Mimikyu",
|
2092 |
+
hagigishiri: "Bruxish",
|
2093 |
+
jijiiron: "Drampa",
|
2094 |
+
dadarin: "Dhelmise",
|
2095 |
+
jarako: "Jangmo-o",
|
2096 |
+
jarango: "Hakamo-o",
|
2097 |
+
jararanga: "Kommo-o",
|
2098 |
+
kapukokeko: "Tapu Koko",
|
2099 |
+
kaputetefu: "Tapu Lele",
|
2100 |
+
kapubururu: "Tapu Bulu",
|
2101 |
+
kapurehire: "Tapu Fini",
|
2102 |
+
kosumoggu: "Cosmog",
|
2103 |
+
kosumoumu: "Cosmoem",
|
2104 |
+
sorugareo: "Solgaleo",
|
2105 |
+
runaaara: "Lunala",
|
2106 |
+
utsuroido: "Nihilego",
|
2107 |
+
masshibuun: "Buzzwole",
|
2108 |
+
fierooche: "Pheromosa",
|
2109 |
+
denjumoku: "Xurkitree",
|
2110 |
+
tekkaguya: "Celesteela",
|
2111 |
+
kamitsurugi: "Kartana",
|
2112 |
+
akujikingu: "Guzzlord",
|
2113 |
+
nekurozuma: "Necrozma",
|
2114 |
+
magiana: "Magearna",
|
2115 |
+
maashadoo: "Marshadow",
|
2116 |
+
bebenomu: "Poipole",
|
2117 |
+
aagoyon: "Naganadel",
|
2118 |
+
tsundetsunde: "Stakataka",
|
2119 |
+
zugadoon: "Blacephalon",
|
2120 |
+
merutan: "Meltan",
|
2121 |
+
merumetaru: "Melmetal",
|
2122 |
+
sarunori: "Grookey",
|
2123 |
+
bachinkii: "Thwackey",
|
2124 |
+
gorirandaa: "Rillaboom",
|
2125 |
+
hibanii: "Scorbunny",
|
2126 |
+
rabifutto: "Raboot",
|
2127 |
+
eesubaan: "Cinderace",
|
2128 |
+
messon: "Sobble",
|
2129 |
+
jimereon: "Drizzile",
|
2130 |
+
intereon: "Inteleon",
|
2131 |
+
hoshigarisu: "Skwovet",
|
2132 |
+
yokubarisu: "Greedent",
|
2133 |
+
kokogara: "Rookidee",
|
2134 |
+
aogarasu: "Corvisquire",
|
2135 |
+
aamaagaa: "Corviknight",
|
2136 |
+
satchimushi: "Blipbug",
|
2137 |
+
redoomushi: "Dottler",
|
2138 |
+
iorubu: "Orbeetle",
|
2139 |
+
kusune: "Nickit",
|
2140 |
+
fokusurai: "Thievul",
|
2141 |
+
himenka: "Gossifleur",
|
2142 |
+
watashiraga: "Eldegoss",
|
2143 |
+
uuruu: "Wooloo",
|
2144 |
+
baiuuruu: "Dubwool",
|
2145 |
+
kamukame: "Chewtle",
|
2146 |
+
kajirigame: "Drednaw",
|
2147 |
+
wanpachi: "Yamper",
|
2148 |
+
parusuwan: "Boltund",
|
2149 |
+
tandon: "Rolycoly",
|
2150 |
+
toroggon: "Carkol",
|
2151 |
+
sekitanzan: "Coalossal",
|
2152 |
+
kajitchu: "Applin",
|
2153 |
+
appuryuu: "Flapple",
|
2154 |
+
taruppuru: "Appletun",
|
2155 |
+
sunahebi: "Silicobra",
|
2156 |
+
sadaija: "Sandaconda",
|
2157 |
+
utsuu: "Cramorant",
|
2158 |
+
sashikamasu: "Arrokuda",
|
2159 |
+
kamasujoo: "Barraskewda",
|
2160 |
+
erezun: "Toxel",
|
2161 |
+
sutorindaa: "Toxtricity",
|
2162 |
+
yakude: "Sizzlipede",
|
2163 |
+
maruyakude: "Centiskorch",
|
2164 |
+
tatakko: "Clobbopus",
|
2165 |
+
otosupasu: "Grapploct",
|
2166 |
+
yabacha: "Sinistea",
|
2167 |
+
pottodesu: "Polteageist",
|
2168 |
+
miburimu: "Hatenna",
|
2169 |
+
teburimu: "Hattrem",
|
2170 |
+
burimuon: "Hatterene",
|
2171 |
+
berobaa: "Impidimp",
|
2172 |
+
gimoo: "Morgrem",
|
2173 |
+
ooronge: "Grimmsnarl",
|
2174 |
+
tachifusaguma: "Obstagoon",
|
2175 |
+
nyaikingu: "Perrserker",
|
2176 |
+
sanigoon: "Cursola",
|
2177 |
+
negiganaito: "Sirfetch'd",
|
2178 |
+
barikooru: "Mr. Rime",
|
2179 |
+
desubaan: "Runerigus",
|
2180 |
+
mahomiru: "Milcery",
|
2181 |
+
mahoippu: "Alcremie",
|
2182 |
+
taireetsu: "Falinks",
|
2183 |
+
bachinuni: "Pincurchin",
|
2184 |
+
yukihami: "Snom",
|
2185 |
+
mosunou: "Frosmoth",
|
2186 |
+
ishihenjin: "Stonjourner",
|
2187 |
+
koorippo: "Eiscue",
|
2188 |
+
iessan: "Indeedee",
|
2189 |
+
morupeko: "Morpeko",
|
2190 |
+
zoudou: "Cufant",
|
2191 |
+
daioudou: "Copperajah",
|
2192 |
+
patchiragon: "Dracozolt",
|
2193 |
+
patchirudon: "Arctozolt",
|
2194 |
+
uonoragon: "Dracovish",
|
2195 |
+
uochirudon: "Arctovish",
|
2196 |
+
jurarudon: "Duraludon",
|
2197 |
+
dorameshiya: "Dreepy",
|
2198 |
+
doronchi: "Drakloak",
|
2199 |
+
doraparuto: "Dragapult",
|
2200 |
+
zashian: "Zacian",
|
2201 |
+
mugendaina: "Eternatus",
|
2202 |
+
dakuma: "Kubfu",
|
2203 |
+
uuraosu: "Urshifu",
|
2204 |
+
zaruudo: "Zarude",
|
2205 |
+
rejiereki: "Regieleki",
|
2206 |
+
rejidorago: "Regidrago",
|
2207 |
+
burizaposu: "Glastrier",
|
2208 |
+
reisuposu: "Spectrier",
|
2209 |
+
badorekkusu: "Calyrex",
|
2210 |
+
ayashishi: "Wyrdeer",
|
2211 |
+
basagiri: "Kleavor",
|
2212 |
+
gachiguma: "Ursaluna",
|
2213 |
+
idaitou: "Basculegion",
|
2214 |
+
oonyuura: "Sneasler",
|
2215 |
+
hariiman: "Overqwil",
|
2216 |
+
rabutorosu: "Enamorus",
|
2217 |
+
nyaoha: "Sprigatito",
|
2218 |
+
nyaroote: "Floragato",
|
2219 |
+
masukaanya: "Meowscarada",
|
2220 |
+
hogeeta: "Fuecoco",
|
2221 |
+
achigeeta: "Crocalor",
|
2222 |
+
raudoboon: "Skeledirge",
|
2223 |
+
kuwassu: "Quaxly",
|
2224 |
+
uerukamo: "Quaxwell",
|
2225 |
+
ueenibaru: "Quaquaval",
|
2226 |
+
guruton: "Lechonk",
|
2227 |
+
pafuyuuton: "Oinkologne",
|
2228 |
+
tamanchura: "Tarountula",
|
2229 |
+
wanaidaa: "Spidops",
|
2230 |
+
mamebatta: "Nymble",
|
2231 |
+
ekusureggu: "Lokix",
|
2232 |
+
pamo: "Pawmi",
|
2233 |
+
pamotto: "Pawmo",
|
2234 |
+
paamotto: "Pawmot",
|
2235 |
+
wakkanezumi: "Tandemaus",
|
2236 |
+
ikkanezumi: "Maushold",
|
2237 |
+
papimotchi: "Fidough",
|
2238 |
+
bauttsueru: "Dachsbun",
|
2239 |
+
miniibu: "Smoliv",
|
2240 |
+
oriinyo: "Dolliv",
|
2241 |
+
oriiva: "Arboliva",
|
2242 |
+
ikirinko: "Squawkabilly",
|
2243 |
+
kojio: "Nacli",
|
2244 |
+
jiozumu: "Naclstack",
|
2245 |
+
kyojioon: "Garganacl",
|
2246 |
+
karubou: "Charcadet",
|
2247 |
+
gurenaruma: "Armarouge",
|
2248 |
+
soubureizu: "Ceruledge",
|
2249 |
+
zupika: "Tadbulb",
|
2250 |
+
harabarii: "Bellibolt",
|
2251 |
+
kaiden: "Wattrel",
|
2252 |
+
taikaiden: "Kilowattrel",
|
2253 |
+
orachifu: "Maschiff",
|
2254 |
+
mafiteifu: "Mabosstiff",
|
2255 |
+
shirushuruu: "Shroodle",
|
2256 |
+
taginguru: "Grafaiai",
|
2257 |
+
anokusa: "Bramblin",
|
2258 |
+
anohoragusa: "Brambleghast",
|
2259 |
+
nonokurage: "Toedscool",
|
2260 |
+
rikukurage: "Toedscruel",
|
2261 |
+
gakegani: "Klawf",
|
2262 |
+
kapusaiji: "Capsakid",
|
2263 |
+
sukoviran: "Scovillain",
|
2264 |
+
shigaroko: "Rellor",
|
2265 |
+
berakasu: "Rabsca",
|
2266 |
+
hirahina: "Flittle",
|
2267 |
+
kuesupatora: "Espathra",
|
2268 |
+
kanuchan: "Tinkatink",
|
2269 |
+
nakanuchan: "Tinkatuff",
|
2270 |
+
dekanuchan: "Tinkaton",
|
2271 |
+
umidiguda: "Wiglett",
|
2272 |
+
umitorio: "Wugtrio",
|
2273 |
+
otoshidori: "Bombirdier",
|
2274 |
+
namiiruka: "Finizen",
|
2275 |
+
irukaman: "Palafin",
|
2276 |
+
buroron: "Varoom",
|
2277 |
+
burororoomu: "Revavroom",
|
2278 |
+
mototokage: "Cyclizar",
|
2279 |
+
mimizuzu: "Orthworm",
|
2280 |
+
kiraame: "Glimmet",
|
2281 |
+
kirafuroru: "Glimmora",
|
2282 |
+
bochi: "Greavard",
|
2283 |
+
hakadoggu: "Houndstone",
|
2284 |
+
karamingo: "Flamigo",
|
2285 |
+
arukujira: "Cetoddle",
|
2286 |
+
harukujira: "Cetitan",
|
2287 |
+
migaruusa: "Veluza",
|
2288 |
+
heirassha: "Dondozo",
|
2289 |
+
sharitatsu: "Tatsugiri",
|
2290 |
+
konoyozaru: "Annihilape",
|
2291 |
+
dooo: "Clodsire",
|
2292 |
+
rikikirin: "Farigiraf",
|
2293 |
+
nokokotchi: "Dudunsparce",
|
2294 |
+
dodogezan: "Kingambit",
|
2295 |
+
idainakiba: "Great Tusk",
|
2296 |
+
sakebushippo: "Scream Tail",
|
2297 |
+
araburutake: "Brute Bonnet",
|
2298 |
+
habatakukami: "Flutter Mane",
|
2299 |
+
chiwohauhane: "Slither Wing",
|
2300 |
+
sunanokegawa: "Sandy Shocks",
|
2301 |
+
tetsunowadachi: "Iron Treads",
|
2302 |
+
tetsunotsutsumi: "Iron Bundle",
|
2303 |
+
tetsunokaina: "Iron Hands",
|
2304 |
+
tetsunokoube: "Iron Jugulis",
|
2305 |
+
tetsunodokuga: "Iron Moth",
|
2306 |
+
tetsunoibara: "Iron Thorns",
|
2307 |
+
sebie: "Frigibax",
|
2308 |
+
segooru: "Arctibax",
|
2309 |
+
segureibu: "Baxcalibur",
|
2310 |
+
korekuree: "Gimmighoul",
|
2311 |
+
saafugoo: "Gholdengo",
|
2312 |
+
chionjien: "Wo-Chien",
|
2313 |
+
paojian: "Chien-Pao",
|
2314 |
+
dinruu: "Ting-Lu",
|
2315 |
+
iiyui: "Chi-Yu",
|
2316 |
+
todorokutsuki: "Roaring Moon",
|
2317 |
+
tetsunobujin: "Iron Valiant",
|
2318 |
+
uneruminamo: "Walking Wake",
|
2319 |
+
tetsunoisaha: "Iron Leaves",
|
2320 |
+
kamitchu: "Dipplin",
|
2321 |
+
chadesu: "Poltchageist",
|
2322 |
+
yabasocha: "Sinistcha",
|
2323 |
+
iineinu: "Okidogi",
|
2324 |
+
mashimashira: "Munkidori",
|
2325 |
+
kichikigisu: "Fezandipiti",
|
2326 |
+
oogapon: "Ogerpon",
|
2327 |
+
burijurasu: "Archaludon",
|
2328 |
+
kamitsuorochi: "Hydrapple",
|
2329 |
+
ugatsuhomura: "Gouging Fire",
|
2330 |
+
takeruraiko: "Raging Bolt",
|
2331 |
+
tetsunoiwao: "Iron Boulder",
|
2332 |
+
tetsunokashira: "Iron Crown",
|
2333 |
+
terapagosu: "Terapagos",
|
2334 |
+
momowarou: "Pecharunt",
|
2335 |
+
|
2336 |
+
// CAP
|
2337 |
+
arg: "Arghonaut",
|
2338 |
+
astro: "Astrolotl",
|
2339 |
+
auru: "Aurumoth",
|
2340 |
+
cari: "Caribolt",
|
2341 |
+
cawm: "Cawmodore",
|
2342 |
+
colo: "Colossoil",
|
2343 |
+
chrom: "Chromera",
|
2344 |
+
chugg: "Chuggalong",
|
2345 |
+
clohm: "Cyclohm",
|
2346 |
+
cruci: "Crucibelle",
|
2347 |
+
ebook: "Venomicon-Epilogue",
|
2348 |
+
hemo: "Hemogoblin",
|
2349 |
+
kerf: "Kerfluffle",
|
2350 |
+
kit: "Kitsunoh",
|
2351 |
+
krilo: "Krilowatt",
|
2352 |
+
libra: "Equilibra",
|
2353 |
+
mala: "Malaconda",
|
2354 |
+
maw: "Miasmaw",
|
2355 |
+
megacruci: "Crucibelle-Mega",
|
2356 |
+
navi: "Naviathan",
|
2357 |
+
nect: "Necturna",
|
2358 |
+
ohmagod: "Plasmanta",
|
2359 |
+
plas: "Plasmanta",
|
2360 |
+
raja: "Saharaja",
|
2361 |
+
rev: "Revenankh",
|
2362 |
+
roak: "pyroak",
|
2363 |
+
smoko: "Smokomodo",
|
2364 |
+
snael: "Snaelstrom",
|
2365 |
+
strata: "Stratagem",
|
2366 |
+
train: "Chuggalong",
|
2367 |
+
venomicone: "Venomicon-Epilogue",
|
2368 |
+
venomiconp: "Venomicon",
|
2369 |
+
venomiconprologue: "Venomicon",
|
2370 |
+
volk: "Volkraken",
|
2371 |
+
};
|
data/cg-team-data.ts
ADDED
@@ -0,0 +1,77 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
// Data for computer-generated teams
|
2 |
+
|
3 |
+
export const MOVE_PAIRINGS: { [moveID: IDEntry]: IDEntry } = {
|
4 |
+
rest: 'sleeptalk',
|
5 |
+
sleeptalk: 'rest',
|
6 |
+
};
|
7 |
+
|
8 |
+
// Bonuses to move ratings by ability
|
9 |
+
export const ABILITY_MOVE_BONUSES: { [abilityID: IDEntry]: { [moveID: IDEntry]: number } } = {
|
10 |
+
drought: { sunnyday: 0.2, solarbeam: 2 },
|
11 |
+
contrary: { terablast: 2 },
|
12 |
+
};
|
13 |
+
// Bonuses to move ratings by move type
|
14 |
+
export const ABILITY_MOVE_TYPE_BONUSES: { [abilityID: IDEntry]: { [typeName: string]: number } } = {
|
15 |
+
darkaura: { Dark: 1.33 },
|
16 |
+
dragonsmaw: { Dragon: 1.5 },
|
17 |
+
fairyaura: { Fairy: 1.33 },
|
18 |
+
steelworker: { Steel: 1.5 },
|
19 |
+
steelyspirit: { Steel: 1.5 },
|
20 |
+
transistor: { Electric: 1.3 },
|
21 |
+
|
22 |
+
// -ate moves
|
23 |
+
pixilate: { Normal: 1.5 * 1.2 },
|
24 |
+
refrigerate: { Normal: 1.5 * 1.2 },
|
25 |
+
aerilate: { Normal: 1.5 * 1.2 },
|
26 |
+
normalize: { Normal: 1.2 },
|
27 |
+
|
28 |
+
// weather
|
29 |
+
drizzle: { Water: 1.4, Fire: 0.6 },
|
30 |
+
drought: { Fire: 1.4, Water: 0.6 },
|
31 |
+
};
|
32 |
+
// For moves whose quality isn't obvious from data
|
33 |
+
// USE SPARINGLY!
|
34 |
+
export const HARDCODED_MOVE_WEIGHTS: { [moveID: IDEntry]: number } = {
|
35 |
+
// Fails unless user is asleep
|
36 |
+
snore: 0,
|
37 |
+
// Hard to use
|
38 |
+
lastresort: 0.1, dreameater: 0.1,
|
39 |
+
// Useless without Berry + sucks even then
|
40 |
+
belch: 0.2,
|
41 |
+
|
42 |
+
// Power increases in conditions out of our control that may occur
|
43 |
+
avalanche: 1.2,
|
44 |
+
ficklebeam: 1.3,
|
45 |
+
hex: 1.2,
|
46 |
+
stompingtantrum: 1.2,
|
47 |
+
temperflare: 1.2,
|
48 |
+
|
49 |
+
// Attacks that set hazards on hit
|
50 |
+
// We REALLY like hazards
|
51 |
+
stoneaxe: 16,
|
52 |
+
ceaselessedge: 16,
|
53 |
+
|
54 |
+
// screens
|
55 |
+
lightscreen: 3, reflect: 3, auroraveil: 3, // TODO: make sure AVeil always gets Snow?
|
56 |
+
tailwind: 2,
|
57 |
+
|
58 |
+
// mess with the opponent
|
59 |
+
taunt: 2, disable: 2, encore: 3,
|
60 |
+
|
61 |
+
// healing moves
|
62 |
+
// TODO: should healing moves be more common on bulkier pokemon?
|
63 |
+
// 25%
|
64 |
+
junglehealing: 3, lifedew: 3,
|
65 |
+
// 50%
|
66 |
+
milkdrink: 5, moonlight: 5, morningsun: 5, recover: 5, roost: 5,
|
67 |
+
shoreup: 5, slackoff: 5, softboiled: 5, synthesis: 5,
|
68 |
+
// delayed/consequence
|
69 |
+
rest: 3, // has sleeptalk potential
|
70 |
+
wish: 2,
|
71 |
+
|
72 |
+
// requires terrain
|
73 |
+
steelroller: 0.1,
|
74 |
+
};
|
75 |
+
|
76 |
+
export const WEIGHT_BASED_MOVES = ['heatcrash', 'heavyslam', 'lowkick', 'grassknot'];
|
77 |
+
export const TARGET_HP_BASED_MOVES = ['crushgrip', 'hardpress'];
|
data/cg-teams.ts
ADDED
@@ -0,0 +1,1080 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/**
|
2 |
+
* Computer-Generated Teams
|
3 |
+
*
|
4 |
+
* Generates teams based on heuristics, most of which carry over across generations.
|
5 |
+
* Teams generated will not always be competitively great, but they will have variety
|
6 |
+
* and be fun to play (i.e., tries to avoid awful sets).
|
7 |
+
*
|
8 |
+
* The [Gen 9] Computer-Generated Teams format is personally maintained by Annika,
|
9 |
+
* and is not part of any official Smogon or PS format selection. If you enjoy playing
|
10 |
+
* with teams you didn't make yourself, you may want to check out Random Battles, Battle Factory,
|
11 |
+
* and/or the sample teams for usage-based formats like OU.
|
12 |
+
*
|
13 |
+
* The core of the generator is the weightedRandomPick function, which chooses from an array
|
14 |
+
* of options based on a weight associated with each option. This way, better/stronger/more useful options
|
15 |
+
* are more likely to be chosen, but there's still an opportunity for weaker, more situational,
|
16 |
+
* or higher-risk/higher-reward options to be chosen. However, for moves, the 'worst' moves are excluded
|
17 |
+
* altogether, both to reduce the likelihood of a bad moveset and improve generator performance.
|
18 |
+
*
|
19 |
+
* Certain less-relevant aspects of the set are not randomized at all, such as:
|
20 |
+
* - IVs (all 31s, with 0 Attack IV if the Pokémon has no Physical moves in case of Confusion)
|
21 |
+
* - EVs (84 per stat, for +21 to each)
|
22 |
+
* - Nature (always Quirky, which has no effect)
|
23 |
+
* - Happiness (there are no Happiness-based moves in Gen IX)
|
24 |
+
*
|
25 |
+
* Currently, leveling is based on a Pokémon's position within Smogon's usage-based tiers,
|
26 |
+
* but an automatic leveling system is planned for the future. This would involve storing win and loss
|
27 |
+
* data by Pokémon species in a database, and increasing and decreasing the levels of Pokémon species
|
28 |
+
* each day based on their win/loss ratio. For example, if 60% of matches with a Pokémon species are wins,
|
29 |
+
* the species is probably overleveled!
|
30 |
+
*
|
31 |
+
* Other aspects of the team generator that may be worth implementing in the future include:
|
32 |
+
* - Explicit support for weather-oriented teams (boosting moves and typings that synergize with that weather)
|
33 |
+
* - Tracking type coverage to make it more likely that a moveset can hit every type
|
34 |
+
*/
|
35 |
+
|
36 |
+
import { Dex, PRNG, SQL } from '../sim';
|
37 |
+
import type { EventMethods } from '../sim/dex-conditions';
|
38 |
+
import {
|
39 |
+
ABILITY_MOVE_BONUSES,
|
40 |
+
ABILITY_MOVE_TYPE_BONUSES,
|
41 |
+
HARDCODED_MOVE_WEIGHTS,
|
42 |
+
MOVE_PAIRINGS,
|
43 |
+
TARGET_HP_BASED_MOVES,
|
44 |
+
WEIGHT_BASED_MOVES,
|
45 |
+
} from './cg-team-data';
|
46 |
+
|
47 |
+
interface TeamStats {
|
48 |
+
hazardSetters: { [moveid: string]: number };
|
49 |
+
typeWeaknesses: { [type: string]: number };
|
50 |
+
hazardRemovers: number;
|
51 |
+
}
|
52 |
+
interface MovesStats {
|
53 |
+
attackTypes: { [type: string]: number };
|
54 |
+
setup: { atk: number, def: number, spa: number, spd: number, spe: number };
|
55 |
+
noSleepTalk: number;
|
56 |
+
hazards: number;
|
57 |
+
stallingMoves: number;
|
58 |
+
nonStatusMoves: number;
|
59 |
+
healing: number;
|
60 |
+
}
|
61 |
+
|
62 |
+
// We put a limit on the number of Pokémon on a team that can be weak to a given type.
|
63 |
+
const MAX_WEAK_TO_SAME_TYPE = 3;
|
64 |
+
/** An estimate of the highest raw speed in the metagame */
|
65 |
+
const TOP_SPEED = 300;
|
66 |
+
|
67 |
+
const levelOverride: { [speciesID: string]: number } = {};
|
68 |
+
export let levelUpdateInterval: NodeJS.Timeout | null = null;
|
69 |
+
|
70 |
+
// can't import the function cg-teams-leveling.ts uses to this context for some reason
|
71 |
+
const useBaseSpecies = [
|
72 |
+
'Pikachu',
|
73 |
+
'Gastrodon',
|
74 |
+
'Magearna',
|
75 |
+
'Dudunsparce',
|
76 |
+
'Maushold',
|
77 |
+
'Keldeo',
|
78 |
+
'Zarude',
|
79 |
+
'Polteageist',
|
80 |
+
'Sinistcha',
|
81 |
+
'Sawsbuck',
|
82 |
+
'Vivillon',
|
83 |
+
'Florges',
|
84 |
+
'Minior',
|
85 |
+
'Toxtricity',
|
86 |
+
'Tatsugiri',
|
87 |
+
'Alcremie',
|
88 |
+
];
|
89 |
+
|
90 |
+
async function updateLevels(database: SQL.DatabaseManager) {
|
91 |
+
const updateSpecies = await database.prepare(
|
92 |
+
'UPDATE gen9computergeneratedteams SET wins = 0, losses = 0, level = ? WHERE species_id = ?'
|
93 |
+
);
|
94 |
+
const updateHistory = await database.prepare(
|
95 |
+
`INSERT INTO gen9_historical_levels (level, species_id, timestamp) VALUES (?, ?, ${Date.now()})`
|
96 |
+
);
|
97 |
+
const data = await database.all('SELECT species_id, wins, losses, level FROM gen9computergeneratedteams');
|
98 |
+
for (let { species_id, wins, losses, level } of data) {
|
99 |
+
const total = wins + losses;
|
100 |
+
|
101 |
+
if (total > 10) {
|
102 |
+
if (wins / total >= 0.55) level--;
|
103 |
+
if (wins / total <= 0.45) level++;
|
104 |
+
level = Math.max(1, Math.min(100, level));
|
105 |
+
await updateSpecies?.run([level, species_id]);
|
106 |
+
await updateHistory?.run([level, species_id]);
|
107 |
+
}
|
108 |
+
|
109 |
+
levelOverride[species_id] = level;
|
110 |
+
}
|
111 |
+
}
|
112 |
+
|
113 |
+
if (global.Config && Config.usesqlite && Config.usesqliteleveling) {
|
114 |
+
const database = SQL(module, { file: './databases/battlestats.db' });
|
115 |
+
|
116 |
+
// update every 2 hours
|
117 |
+
void updateLevels(database);
|
118 |
+
levelUpdateInterval = setInterval(() => void updateLevels(database), 1000 * 60 * 60 * 2);
|
119 |
+
}
|
120 |
+
|
121 |
+
export default class TeamGenerator {
|
122 |
+
dex: ModdedDex;
|
123 |
+
format: Format;
|
124 |
+
teamSize: number;
|
125 |
+
forceLevel?: number;
|
126 |
+
prng: PRNG;
|
127 |
+
itemPool: Item[];
|
128 |
+
specialItems: { [pokemon: string]: string };
|
129 |
+
|
130 |
+
constructor(format: Format | string, seed: PRNG | PRNGSeed | null) {
|
131 |
+
this.dex = Dex.forFormat(format);
|
132 |
+
this.format = Dex.formats.get(format);
|
133 |
+
this.teamSize = this.format.ruleTable?.maxTeamSize || 6;
|
134 |
+
this.prng = PRNG.get(seed);
|
135 |
+
this.itemPool = this.dex.items.all().filter(i => i.exists && i.isNonstandard !== 'Past' && !i.isPokeball);
|
136 |
+
this.specialItems = {};
|
137 |
+
for (const i of this.itemPool) {
|
138 |
+
if (i.itemUser && !i.isNonstandard) {
|
139 |
+
for (const user of i.itemUser) {
|
140 |
+
if (Dex.species.get(user).requiredItems?.[0] !== i.name) this.specialItems[user] = i.id;
|
141 |
+
}
|
142 |
+
}
|
143 |
+
}
|
144 |
+
|
145 |
+
const rules = Dex.formats.getRuleTable(this.format);
|
146 |
+
if (rules.adjustLevel) this.forceLevel = rules.adjustLevel;
|
147 |
+
}
|
148 |
+
|
149 |
+
getTeam(): PokemonSet[] {
|
150 |
+
let speciesPool = this.dex.species.all().filter(s => {
|
151 |
+
if (!s.exists) return false;
|
152 |
+
if (s.isNonstandard || s.isNonstandard === 'Unobtainable') return false;
|
153 |
+
if (s.nfe) return false;
|
154 |
+
if (s.battleOnly && (!s.requiredItems?.length || s.name.endsWith('-Tera'))) return false;
|
155 |
+
|
156 |
+
return true;
|
157 |
+
});
|
158 |
+
const teamStats: TeamStats = {
|
159 |
+
hazardSetters: {},
|
160 |
+
typeWeaknesses: {},
|
161 |
+
hazardRemovers: 0,
|
162 |
+
};
|
163 |
+
|
164 |
+
const team: PokemonSet[] = [];
|
165 |
+
while (team.length < this.teamSize && speciesPool.length) {
|
166 |
+
const species = this.prng.sample(speciesPool);
|
167 |
+
|
168 |
+
const haveRoomToReject = speciesPool.length >= (this.teamSize - team.length);
|
169 |
+
const isGoodFit = this.speciesIsGoodFit(species, teamStats);
|
170 |
+
if (haveRoomToReject && !isGoodFit) continue;
|
171 |
+
|
172 |
+
speciesPool = speciesPool.filter(s => s.baseSpecies !== species.baseSpecies);
|
173 |
+
team.push(this.makeSet(species, teamStats));
|
174 |
+
}
|
175 |
+
|
176 |
+
return team;
|
177 |
+
}
|
178 |
+
|
179 |
+
protected makeSet(species: Species, teamStats: TeamStats): PokemonSet {
|
180 |
+
const abilityPool: string[] = Object.values(species.abilities);
|
181 |
+
const abilityWeights = abilityPool.map(a => this.getAbilityWeight(this.dex.abilities.get(a)));
|
182 |
+
const ability = this.weightedRandomPick(abilityPool, abilityWeights);
|
183 |
+
const level = this.forceLevel || TeamGenerator.getLevel(species);
|
184 |
+
|
185 |
+
const moves: Move[] = [];
|
186 |
+
let movesStats: MovesStats = {
|
187 |
+
setup: { atk: 0, def: 0, spa: 0, spd: 0, spe: 0 },
|
188 |
+
attackTypes: {},
|
189 |
+
noSleepTalk: 0,
|
190 |
+
hazards: 0,
|
191 |
+
stallingMoves: 0,
|
192 |
+
healing: 0,
|
193 |
+
nonStatusMoves: 0,
|
194 |
+
};
|
195 |
+
|
196 |
+
let movePool: IDEntry[] = [...this.dex.species.getMovePool(species.id)];
|
197 |
+
if (!movePool.length) throw new Error(`No moves for ${species.id}`);
|
198 |
+
|
199 |
+
// Consider either the top 15 moves or top 30% of moves, whichever is greater.
|
200 |
+
const numberOfMovesToConsider = Math.min(movePool.length, Math.max(15, Math.trunc(movePool.length * 0.3)));
|
201 |
+
let movePoolIsTrimmed = false;
|
202 |
+
// Many moves' weights, such as Swords Dance, are dependent on having other moves in the moveset already
|
203 |
+
// and end up very low when calculated with no moves chosen. This makes it difficult to add these moves without
|
204 |
+
// weighing every move 4 times, and trimming once after the initial weighing makes them impossible for most Pokemon.
|
205 |
+
// To get around this, after weighing against an empty moveset, trimming, and adding three moves, we weigh ALL
|
206 |
+
// moves again against the populated moveset, then put the chosen 3 moves back into the pool with their
|
207 |
+
// original empty-set weights, trim the pool again, and start over. This process results in about 15% fewer calls
|
208 |
+
// to getMoveWeight than considering every move every time does.
|
209 |
+
let isRound2 = false;
|
210 |
+
// this is just a second reference the array because movePool gets set to point to a new array before the old one
|
211 |
+
// gets mutated
|
212 |
+
const movePoolCopy = movePool;
|
213 |
+
let interimMovePool: { move: IDEntry, weight: number }[] = [];
|
214 |
+
while (moves.length < 4 && movePool.length) {
|
215 |
+
let weights;
|
216 |
+
if (!movePoolIsTrimmed) {
|
217 |
+
if (!isRound2) {
|
218 |
+
for (const moveID of movePool) {
|
219 |
+
const move = this.dex.moves.get(moveID);
|
220 |
+
const weight = this.getMoveWeight(move, teamStats, species, moves, movesStats, ability, level);
|
221 |
+
interimMovePool.push({ move: moveID, weight });
|
222 |
+
}
|
223 |
+
|
224 |
+
interimMovePool.sort((a, b) => b.weight - a.weight);
|
225 |
+
} else {
|
226 |
+
const originalWeights: typeof interimMovePool = [];
|
227 |
+
for (const move of moves) {
|
228 |
+
originalWeights.push(interimMovePool.find(m => m.move === move.id)!);
|
229 |
+
}
|
230 |
+
interimMovePool = originalWeights;
|
231 |
+
|
232 |
+
for (const moveID of movePoolCopy) {
|
233 |
+
const move = this.dex.moves.get(moveID);
|
234 |
+
if (moves.includes(move)) continue;
|
235 |
+
const weight = this.getMoveWeight(move, teamStats, species, moves, movesStats, ability, level);
|
236 |
+
interimMovePool.push({ move: moveID, weight });
|
237 |
+
}
|
238 |
+
|
239 |
+
interimMovePool.sort((a, b) => b.weight - a.weight);
|
240 |
+
moves.splice(0);
|
241 |
+
movesStats = {
|
242 |
+
setup: { atk: 0, def: 0, spa: 0, spd: 0, spe: 0 },
|
243 |
+
attackTypes: {},
|
244 |
+
noSleepTalk: 0,
|
245 |
+
hazards: 0,
|
246 |
+
stallingMoves: 0,
|
247 |
+
healing: 0,
|
248 |
+
nonStatusMoves: 0,
|
249 |
+
};
|
250 |
+
}
|
251 |
+
movePool = [];
|
252 |
+
weights = [];
|
253 |
+
|
254 |
+
for (let i = 0; i < numberOfMovesToConsider; i++) {
|
255 |
+
movePool.push(interimMovePool[i].move);
|
256 |
+
weights.push(interimMovePool[i].weight);
|
257 |
+
}
|
258 |
+
movePoolIsTrimmed = true;
|
259 |
+
} else {
|
260 |
+
weights = movePool.map(
|
261 |
+
m => this.getMoveWeight(this.dex.moves.get(m), teamStats, species, moves, movesStats, ability, level)
|
262 |
+
);
|
263 |
+
}
|
264 |
+
|
265 |
+
const moveID = this.weightedRandomPick(movePool, weights, { remove: true });
|
266 |
+
|
267 |
+
const move = this.dex.moves.get(moveID);
|
268 |
+
moves.push(move);
|
269 |
+
if (TeamGenerator.moveIsHazard(moves[moves.length - 1])) {
|
270 |
+
teamStats.hazardSetters[moveID] = (teamStats.hazardSetters[moveID] || 0) + 1;
|
271 |
+
movesStats.hazards++;
|
272 |
+
}
|
273 |
+
if (['defog', 'courtchange', 'tidyup', 'rapidspin', 'mortalspin'].includes(moveID)) teamStats.hazardRemovers++;
|
274 |
+
const boosts = move.boosts || move.self?.boosts || move.selfBoost?.boosts ||
|
275 |
+
ability !== 'Sheer Force' && move.secondary?.self?.boosts;
|
276 |
+
if (move.category === 'Status') {
|
277 |
+
if (boosts) {
|
278 |
+
for (const stat in boosts) {
|
279 |
+
const chance = Math.min(100, move.secondary?.chance || 100 * (ability === 'Serene Grace' ? 2 : 1));
|
280 |
+
const boost = (boosts[stat as StatIDExceptHP] || 0) * chance / 100;
|
281 |
+
if (boost) {
|
282 |
+
if (movesStats.setup[stat as StatIDExceptHP] < 0 && boost > 0) {
|
283 |
+
movesStats.setup[stat as StatIDExceptHP] = boost;
|
284 |
+
} else {
|
285 |
+
movesStats.setup[stat as StatIDExceptHP] += boost;
|
286 |
+
}
|
287 |
+
if (boost > 1) movesStats.noSleepTalk++;
|
288 |
+
}
|
289 |
+
}
|
290 |
+
} else {
|
291 |
+
movesStats.noSleepTalk++;
|
292 |
+
}
|
293 |
+
if (move.heal) movesStats.healing++;
|
294 |
+
if (move.stallingMove) movesStats.stallingMoves++;
|
295 |
+
} else {
|
296 |
+
movesStats.nonStatusMoves++;
|
297 |
+
const bp = +move.basePower;
|
298 |
+
const moveType = TeamGenerator.moveType(move, species);
|
299 |
+
if (movesStats.attackTypes[moveType] < bp) movesStats.attackTypes[moveType] = bp;
|
300 |
+
}
|
301 |
+
|
302 |
+
if (!isRound2 && moves.length === 3) {
|
303 |
+
isRound2 = true;
|
304 |
+
movePoolIsTrimmed = false;
|
305 |
+
continue;
|
306 |
+
}
|
307 |
+
|
308 |
+
// add paired moves, like RestTalk
|
309 |
+
const pairedMove = MOVE_PAIRINGS[moveID];
|
310 |
+
const alreadyHavePairedMove = moves.some(m => m.id === pairedMove);
|
311 |
+
if (
|
312 |
+
moves.length < 4 &&
|
313 |
+
pairedMove &&
|
314 |
+
!(pairedMove === 'sleeptalk' && movesStats.noSleepTalk) &&
|
315 |
+
!alreadyHavePairedMove &&
|
316 |
+
// We don't check movePool because sometimes paired moves are bad.
|
317 |
+
this.dex.species.getLearnsetData(species.id).learnset?.[pairedMove]
|
318 |
+
) {
|
319 |
+
moves.push(this.dex.moves.get(pairedMove));
|
320 |
+
const pairedMoveIndex = movePool.indexOf(pairedMove);
|
321 |
+
if (pairedMoveIndex > -1) movePool.splice(pairedMoveIndex, 1);
|
322 |
+
}
|
323 |
+
}
|
324 |
+
|
325 |
+
let item = '';
|
326 |
+
const nonStatusMoves = moves.filter(m => this.dex.moves.get(m).category !== 'Status');
|
327 |
+
if (species.requiredItem) {
|
328 |
+
item = species.requiredItem;
|
329 |
+
} else if (species.requiredItems) {
|
330 |
+
item = this.prng.sample(species.requiredItems.filter(i => !this.dex.items.get(i).isNonstandard));
|
331 |
+
} else if (this.specialItems[species.name] && nonStatusMoves.length) {
|
332 |
+
// If the species has a special item, we should use it.
|
333 |
+
item = this.specialItems[species.name];
|
334 |
+
} else if (moves.every(m => m.id !== 'acrobatics')) { // Don't assign an item if the set includes Acrobatics...
|
335 |
+
const weights = [];
|
336 |
+
const items = [];
|
337 |
+
for (const i of this.itemPool) {
|
338 |
+
const weight = this.getItemWeight(i, teamStats, species, moves, ability, level);
|
339 |
+
if (weight !== 0) {
|
340 |
+
weights.push(weight);
|
341 |
+
items.push(i.name);
|
342 |
+
}
|
343 |
+
}
|
344 |
+
if (!item) item = this.weightedRandomPick(items, weights);
|
345 |
+
} else if (['Quark Drive', 'Protosynthesis'].includes(ability)) {
|
346 |
+
// ...unless the Pokemon can use Booster Energy
|
347 |
+
item = 'Booster Energy';
|
348 |
+
}
|
349 |
+
|
350 |
+
const ivs: PokemonSet['ivs'] = {
|
351 |
+
hp: 31,
|
352 |
+
atk: moves.some(move => this.dex.moves.get(move).category === 'Physical') ? 31 : 0,
|
353 |
+
def: 31,
|
354 |
+
spa: 31,
|
355 |
+
spd: 31,
|
356 |
+
spe: 31,
|
357 |
+
};
|
358 |
+
|
359 |
+
// For Tera Type, we just pick a random type if it's got Tera Blast, Revelation Dance, or no attacking moves,
|
360 |
+
// and the type of one of its attacking moves otherwise (so it can take advantage of the boosts).
|
361 |
+
// Pokemon with 3 or more attack types and Pokemon with both Tera Blast and Contrary can also get Stellar type
|
362 |
+
// but Pokemon with Adaptability never get Stellar because Tera Stellar makes Adaptability have no effect
|
363 |
+
// Ogerpon's formes are forced to the Tera type that matches their forme
|
364 |
+
// Terapagos is forced to Stellar type
|
365 |
+
// Pokemon with Black Sludge don't generally want to tera to a type other than Poison
|
366 |
+
const hasTeraBlast = moves.some(m => m.id === 'terablast');
|
367 |
+
const hasRevelationDance = moves.some(m => m.id === 'revelationdance');
|
368 |
+
let teraType;
|
369 |
+
if (species.forceTeraType) {
|
370 |
+
teraType = species.forceTeraType;
|
371 |
+
} else if (item === 'blacksludge' && this.prng.randomChance(2, 3)) {
|
372 |
+
teraType = 'Poison';
|
373 |
+
} else if (hasTeraBlast && ability === 'Contrary' && this.prng.randomChance(2, 3)) {
|
374 |
+
teraType = 'Stellar';
|
375 |
+
} else {
|
376 |
+
let types = nonStatusMoves.map(m => TeamGenerator.moveType(this.dex.moves.get(m), species));
|
377 |
+
const noStellar = ability === 'Adaptability' || new Set(types).size < 3;
|
378 |
+
if (hasTeraBlast || hasRevelationDance || !nonStatusMoves.length) {
|
379 |
+
types = [...this.dex.types.names()];
|
380 |
+
if (noStellar) types.splice(types.indexOf('Stellar'));
|
381 |
+
} else {
|
382 |
+
if (!noStellar) types.push('Stellar');
|
383 |
+
}
|
384 |
+
teraType = this.prng.sample(types);
|
385 |
+
}
|
386 |
+
|
387 |
+
return {
|
388 |
+
name: species.name,
|
389 |
+
species: species.name,
|
390 |
+
item,
|
391 |
+
ability,
|
392 |
+
moves: moves.map(m => m.name),
|
393 |
+
nature: 'Quirky',
|
394 |
+
gender: species.gender,
|
395 |
+
evs: { hp: 84, atk: 84, def: 84, spa: 84, spd: 84, spe: 84 },
|
396 |
+
ivs,
|
397 |
+
level,
|
398 |
+
teraType,
|
399 |
+
shiny: this.prng.randomChance(1, 1024),
|
400 |
+
happiness: 255,
|
401 |
+
};
|
402 |
+
}
|
403 |
+
|
404 |
+
/**
|
405 |
+
* @returns true if the Pokémon is a good fit for the team so far, and no otherwise
|
406 |
+
*/
|
407 |
+
protected speciesIsGoodFit(species: Species, stats: TeamStats): boolean {
|
408 |
+
// type check
|
409 |
+
for (const typeName of this.dex.types.names()) {
|
410 |
+
const effectiveness = this.dex.getEffectiveness(typeName, species.types);
|
411 |
+
if (effectiveness === 1) { // WEAKNESS!
|
412 |
+
if (stats.typeWeaknesses[typeName] === undefined) {
|
413 |
+
stats.typeWeaknesses[typeName] = 0;
|
414 |
+
}
|
415 |
+
if (stats.typeWeaknesses[typeName] >= MAX_WEAK_TO_SAME_TYPE) {
|
416 |
+
// too many weaknesses to this type
|
417 |
+
return false;
|
418 |
+
}
|
419 |
+
}
|
420 |
+
}
|
421 |
+
// species passes; increment counters
|
422 |
+
for (const typeName of this.dex.types.names()) {
|
423 |
+
const effectiveness = this.dex.getEffectiveness(typeName, species.types);
|
424 |
+
if (effectiveness === 1) {
|
425 |
+
stats.typeWeaknesses[typeName]++;
|
426 |
+
}
|
427 |
+
}
|
428 |
+
return true;
|
429 |
+
}
|
430 |
+
|
431 |
+
/**
|
432 |
+
* @returns A weighting for the Pokémon's ability.
|
433 |
+
*/
|
434 |
+
protected getAbilityWeight(ability: Ability): number {
|
435 |
+
return ability.rating + 1; // Some ability ratings are -1
|
436 |
+
}
|
437 |
+
|
438 |
+
protected static moveIsHazard(move: Move): boolean {
|
439 |
+
return !!(move.sideCondition && move.target === 'foeSide') || ['stoneaxe', 'ceaselessedge'].includes(move.id);
|
440 |
+
}
|
441 |
+
|
442 |
+
/**
|
443 |
+
* @returns A weight for a given move on a given Pokémon.
|
444 |
+
*/
|
445 |
+
protected getMoveWeight(
|
446 |
+
move: Move,
|
447 |
+
teamStats: TeamStats,
|
448 |
+
species: Species,
|
449 |
+
movesSoFar: Move[],
|
450 |
+
movesStats: MovesStats,
|
451 |
+
ability: string,
|
452 |
+
level: number,
|
453 |
+
): number {
|
454 |
+
if (!move.exists) return 0;
|
455 |
+
// this is NOT doubles, so there will be no adjacent ally
|
456 |
+
if (move.target === 'adjacentAlly') return 0;
|
457 |
+
|
458 |
+
// There's an argument to be made for using Terapagos-Stellar's stats instead
|
459 |
+
// but the important thing is to not use Terapagos-Base's stats since it never battles in that forme
|
460 |
+
if (ability === 'Tera Shift') species = this.dex.species.get('Terapagos-Terastal');
|
461 |
+
|
462 |
+
// Attack and Special Attack are scaled by level^2 because in addition to stats themselves being scaled by level,
|
463 |
+
// damage dealt by attacks is also scaled by the user's level
|
464 |
+
const adjustedStats: StatsTable = {
|
465 |
+
hp: species.baseStats.hp * level / 100 + level,
|
466 |
+
atk: species.baseStats.atk * level * level / 10000,
|
467 |
+
def: species.baseStats.def * level / 100,
|
468 |
+
spa: species.baseStats.spa * level * level / 10000,
|
469 |
+
spd: species.baseStats.spd * level / 100,
|
470 |
+
spe: species.baseStats.spe * level / 100,
|
471 |
+
};
|
472 |
+
|
473 |
+
if (move.category === 'Status') {
|
474 |
+
// The initial value of this weight determines how valuable status moves are vs. attacking moves.
|
475 |
+
// You can raise it to make random status moves more valuable or lower it and increase multipliers
|
476 |
+
// to make only CERTAIN status moves valuable.
|
477 |
+
let weight = 2400;
|
478 |
+
|
479 |
+
// inflicts status
|
480 |
+
if (move.status) weight *= TeamGenerator.statusWeight(move.status) * 2;
|
481 |
+
|
482 |
+
// hazard setters: very important, but we don't need 2 pokemon to set the same hazard on a team
|
483 |
+
if (TeamGenerator.moveIsHazard(move) && (teamStats.hazardSetters[move.id] || 0) < 1) {
|
484 |
+
weight *= move.id === 'spikes' ? 12 : 16;
|
485 |
+
|
486 |
+
// if we are ALREADY setting hazards, setting MORE is really good
|
487 |
+
if (movesStats.hazards) weight *= 2;
|
488 |
+
}
|
489 |
+
|
490 |
+
// hazard removers: even more important than hazard setters, since they remove everything at once
|
491 |
+
// we still don't need too many on one team, though
|
492 |
+
if (['defog', 'courtchange', 'tidyup'].includes(move.id) && !teamStats.hazardRemovers) {
|
493 |
+
weight *= 32;
|
494 |
+
|
495 |
+
// these moves can also lessen the effectiveness of the user's team's own hazards
|
496 |
+
weight *= 0.8 ** Object.values(teamStats.hazardSetters).reduce((total, num) => total + num, 0);
|
497 |
+
}
|
498 |
+
|
499 |
+
// boosts
|
500 |
+
weight *= this.boostWeight(move, movesSoFar, species, ability, level);
|
501 |
+
weight *= this.opponentDebuffWeight(move);
|
502 |
+
|
503 |
+
// nonstandard boosting moves
|
504 |
+
if (move.id === 'focusenergy' && ability !== 'Super Luck') {
|
505 |
+
const highCritMoves = movesSoFar.filter(m => m.critRatio && m.critRatio > 1);
|
506 |
+
weight *= 1 + highCritMoves.length * (ability === 'Sniper' ? 2 : 1);
|
507 |
+
} else if (move.id === 'tailwind' && ability === 'Wind Rider' && movesSoFar.some(m => m.category === 'Physical')) {
|
508 |
+
weight *= 2.5; // grants +1 attack, but isn't spammable
|
509 |
+
}
|
510 |
+
|
511 |
+
// protection moves - useful for bulky/stally pokemon
|
512 |
+
if (!movesStats.stallingMoves) {
|
513 |
+
if (adjustedStats.def >= 80 || adjustedStats.spd >= 80 || adjustedStats.hp >= 80) {
|
514 |
+
switch (move.volatileStatus) {
|
515 |
+
case 'endure':
|
516 |
+
weight *= 2;
|
517 |
+
break;
|
518 |
+
case 'protect':
|
519 |
+
weight *= 3;
|
520 |
+
break;
|
521 |
+
case 'kingsshield': case 'silktrap':
|
522 |
+
weight *= 4;
|
523 |
+
break;
|
524 |
+
case 'banefulbunker': case 'burningbulwark': case 'spikyshield':
|
525 |
+
weight *= 5;
|
526 |
+
break;
|
527 |
+
default:
|
528 |
+
break;
|
529 |
+
}
|
530 |
+
}
|
531 |
+
}
|
532 |
+
|
533 |
+
// Hardcoded boosts
|
534 |
+
if (move.id in HARDCODED_MOVE_WEIGHTS) weight *= HARDCODED_MOVE_WEIGHTS[move.id];
|
535 |
+
|
536 |
+
// Rest and Sleep Talk are pretty bad on Pokemon that can't fall asleep
|
537 |
+
const sleepImmunities = [
|
538 |
+
'Comatose',
|
539 |
+
'Purifying Salt',
|
540 |
+
'Shields Down',
|
541 |
+
'Insomnia',
|
542 |
+
'Vital Spirit',
|
543 |
+
'Sweet Veil',
|
544 |
+
'Misty Surge',
|
545 |
+
'Electric Surge',
|
546 |
+
'Hadron Engine',
|
547 |
+
];
|
548 |
+
if (['sleeptalk', 'rest'].includes(move.id) && sleepImmunities.includes(ability)) return 0;
|
549 |
+
|
550 |
+
// Sleep Talk is bad with moves that can't be used repeatedly, a.k.a. most status moves
|
551 |
+
// the exceptions allowed here are moves which boost a stat by exactly 1 and moves that wake the user up
|
552 |
+
if (move.id === 'sleeptalk') {
|
553 |
+
if (movesStats.noSleepTalk) weight *= 0.1;
|
554 |
+
} else if (movesSoFar.some(m => m.id === 'sleeptalk')) {
|
555 |
+
let sleepTalkSpammable = ['takeheart', 'junglehealing', 'healbell'].includes(move.id);
|
556 |
+
if (move.boosts) {
|
557 |
+
for (const stat in move.boosts) {
|
558 |
+
if (move.boosts[stat as StatIDExceptHP] === 1) {
|
559 |
+
sleepTalkSpammable = true;
|
560 |
+
break;
|
561 |
+
}
|
562 |
+
}
|
563 |
+
}
|
564 |
+
if (!sleepTalkSpammable) weight *= 0.1;
|
565 |
+
}
|
566 |
+
|
567 |
+
// Pokémon with high Attack and Special Attack stats shouldn't have too many status moves,
|
568 |
+
// but on bulkier Pokémon it's more likely to be worth it.
|
569 |
+
const goodAttacker = adjustedStats.atk > 65 || adjustedStats.spa > 65;
|
570 |
+
if (goodAttacker && movesStats.nonStatusMoves < 2) {
|
571 |
+
weight *= 0.3;
|
572 |
+
}
|
573 |
+
|
574 |
+
if (movesSoFar.length === 3 && movesStats.nonStatusMoves === 0) {
|
575 |
+
// uh oh
|
576 |
+
weight *= 0.6;
|
577 |
+
for (const stat in movesStats.setup) {
|
578 |
+
if (movesStats.setup[stat as StatIDExceptHP] > 0) {
|
579 |
+
// having no attacks is bad; having setup but no attacks is REALLY bad
|
580 |
+
weight *= 0.6;
|
581 |
+
}
|
582 |
+
}
|
583 |
+
}
|
584 |
+
|
585 |
+
// don't need 2 healing moves
|
586 |
+
if (move.heal && movesStats.healing) weight *= 0.5;
|
587 |
+
|
588 |
+
return weight;
|
589 |
+
}
|
590 |
+
|
591 |
+
let basePower = move.basePower;
|
592 |
+
// For Grass Knot and friends, let's just assume they average out to around 60 base power.
|
593 |
+
// Same with Crush Grip and Hard Press
|
594 |
+
if (WEIGHT_BASED_MOVES.includes(move.id) || TARGET_HP_BASED_MOVES.includes(move.id)) basePower = 60;
|
595 |
+
/** A value from 0 to 1, where 0 is the fastest and 1 is the slowest */
|
596 |
+
const slownessRating = Math.max(0, TOP_SPEED - adjustedStats.spe) / TOP_SPEED;
|
597 |
+
// not how this calc works but it should be close enough
|
598 |
+
if (move.id === 'gyroball') basePower = 150 * slownessRating * slownessRating;
|
599 |
+
if (move.id === 'electroball') basePower = 150 * (1 - slownessRating) * (1 - slownessRating);
|
600 |
+
|
601 |
+
let baseStat = move.category === 'Physical' ? adjustedStats.atk : adjustedStats.spa;
|
602 |
+
if (move.id === 'foulplay') baseStat = adjustedStats.spe * level / 100;
|
603 |
+
if (move.id === 'bodypress') baseStat = adjustedStats.def * level / 100;
|
604 |
+
// 10% bonus for never-miss moves
|
605 |
+
let accuracy = move.accuracy === true || ability === 'No Guard' ? 110 : move.accuracy;
|
606 |
+
if (accuracy < 100) {
|
607 |
+
if (ability === 'Compound Eyes') accuracy = Math.min(100, Math.round(accuracy * 1.3));
|
608 |
+
if (ability === 'Victory Star') accuracy = Math.min(100, Math.round(accuracy * 1.1));
|
609 |
+
}
|
610 |
+
accuracy /= 100;
|
611 |
+
|
612 |
+
const moveType = TeamGenerator.moveType(move, species);
|
613 |
+
|
614 |
+
let powerEstimate = basePower * baseStat * accuracy;
|
615 |
+
// STAB
|
616 |
+
if (species.types.includes(moveType)) powerEstimate *= ability === 'Adaptability' ? 2 : 1.5;
|
617 |
+
if (ability === 'Technician' && move.basePower <= 60) powerEstimate *= 1.5;
|
618 |
+
if (ability === 'Sheer Force' && (move.secondary || move.secondaries)) powerEstimate *= 1.3;
|
619 |
+
const numberOfHits = Array.isArray(move.multihit) ?
|
620 |
+
(ability === 'Skill Link' ? move.multihit[1] : (move.multihit[0] + move.multihit[1]) / 2) :
|
621 |
+
move.multihit || 1;
|
622 |
+
powerEstimate *= numberOfHits;
|
623 |
+
|
624 |
+
if (species.requiredItems) {
|
625 |
+
const item: Item & EventMethods = this.dex.items.get(this.specialItems[species.name]);
|
626 |
+
if (item.onBasePower && (species.types.includes(moveType) || item.name.endsWith('Mask'))) powerEstimate *= 1.2;
|
627 |
+
} else if (this.specialItems[species.name]) {
|
628 |
+
const item: Item & EventMethods = this.dex.items.get(this.specialItems[species.name]);
|
629 |
+
if (item.onBasePower && species.types.includes(moveType)) powerEstimate *= 1.2;
|
630 |
+
if (item.id === 'lightball') powerEstimate *= 2;
|
631 |
+
}
|
632 |
+
|
633 |
+
// If it uses the attacking stat that we don't boost, it's less useful!
|
634 |
+
const specialSetup = movesStats.setup.spa;
|
635 |
+
const physicalSetup = movesStats.setup.atk;
|
636 |
+
if (move.category === 'Physical' && !['bodypress', 'foulplay'].includes(move.id)) {
|
637 |
+
powerEstimate *= Math.max(0.5, 1 + physicalSetup) / Math.max(0.5, 1 + specialSetup);
|
638 |
+
}
|
639 |
+
if (move.category === 'Special') powerEstimate *= Math.max(0.5, 1 + specialSetup) / Math.max(0.5, 1 + physicalSetup);
|
640 |
+
|
641 |
+
const abilityBonus = (
|
642 |
+
(ABILITY_MOVE_BONUSES[this.dex.toID(ability)]?.[move.id] || 1) *
|
643 |
+
(ABILITY_MOVE_TYPE_BONUSES[this.dex.toID(ability)]?.[moveType] || 1)
|
644 |
+
);
|
645 |
+
|
646 |
+
let weight = powerEstimate * abilityBonus;
|
647 |
+
if (move.id in HARDCODED_MOVE_WEIGHTS) weight *= HARDCODED_MOVE_WEIGHTS[move.id];
|
648 |
+
// semi-hardcoded move weights that depend on having control over the item
|
649 |
+
if (!this.specialItems[species.name] && !species.requiredItem) {
|
650 |
+
if (move.id === 'acrobatics') weight *= 1.75;
|
651 |
+
if (move.id === 'facade') {
|
652 |
+
if (!['Comatose', 'Purifying Salt', 'Shields Down', 'Natural Cure', 'Misty Surge'].includes(ability)) weight *= 1.5;
|
653 |
+
}
|
654 |
+
}
|
655 |
+
|
656 |
+
// priority is more useful when you're slower
|
657 |
+
// except Upper Hand, which is anti-priority and thus better on faster Pokemon
|
658 |
+
// TODO: make weight scale with priority
|
659 |
+
if (move.priority > 0 && move.id !== 'upperhand') weight *= (Math.max(105 - adjustedStats.spe, 0) / 105) * 0.5 + 1;
|
660 |
+
if (move.priority < 0 || move.id === 'upperhand') weight *= Math.min((1 / adjustedStats.spe) * 25, 1);
|
661 |
+
|
662 |
+
// flags
|
663 |
+
if (move.flags.charge || (move.flags.recharge && ability !== 'Truant')) weight *= 0.5;
|
664 |
+
if (move.flags.contact) {
|
665 |
+
if (ability === 'Tough Claws') weight *= 1.3;
|
666 |
+
if (ability === 'Unseen Fist') weight *= 1.1;
|
667 |
+
if (ability === 'Poison Touch') weight *= TeamGenerator.statusWeight('psn', 1 - (0.7 ** numberOfHits));
|
668 |
+
}
|
669 |
+
if (move.flags.bite && ability === 'Strong Jaw') weight *= 1.5;
|
670 |
+
// 5% boost for ability to break subs
|
671 |
+
if (move.flags.bypasssub) weight *= 1.05;
|
672 |
+
if (move.flags.pulse && ability === 'Mega Launcher') weight *= 1.5;
|
673 |
+
if (move.flags.punch && ability === 'Iron Fist') weight *= 1.2;
|
674 |
+
if (!move.flags.protect) weight *= 1.05;
|
675 |
+
if (move.flags.slicing && ability === 'Sharpness') weight *= 1.5;
|
676 |
+
if (move.flags.sound && ability === 'Punk Rock') weight *= 1.3;
|
677 |
+
|
678 |
+
// boosts/secondaries
|
679 |
+
// TODO: consider more possible secondaries
|
680 |
+
weight *= this.boostWeight(move, movesSoFar, species, ability, level);
|
681 |
+
const secondaryChance = Math.min((move.secondary?.chance || 100) * (ability === 'Serene Grace' ? 2 : 1) / 100, 100);
|
682 |
+
if (move.secondary || move.secondaries) {
|
683 |
+
if (ability === 'Sheer Force') {
|
684 |
+
weight *= 1.3;
|
685 |
+
} else {
|
686 |
+
const secondaries = move.secondaries || [move.secondary!];
|
687 |
+
for (const secondary of secondaries) {
|
688 |
+
if (secondary.status) {
|
689 |
+
weight *= TeamGenerator.statusWeight(secondary.status, secondaryChance, slownessRating);
|
690 |
+
if (ability === 'Poison Puppeteer' && ['psn', 'tox'].includes(secondary.status)) {
|
691 |
+
weight *= TeamGenerator.statusWeight('confusion', secondaryChance);
|
692 |
+
}
|
693 |
+
}
|
694 |
+
if (secondary.volatileStatus) {
|
695 |
+
weight *= TeamGenerator.statusWeight(secondary.volatileStatus, secondaryChance, slownessRating);
|
696 |
+
}
|
697 |
+
}
|
698 |
+
}
|
699 |
+
}
|
700 |
+
if (ability === 'Toxic Chain') weight *= TeamGenerator.statusWeight('tox', 1 - (0.7 ** numberOfHits));
|
701 |
+
|
702 |
+
// Special effect if something special happened earlier in the turn
|
703 |
+
// More useful on slower Pokemon
|
704 |
+
if (move.id === 'lashout') weight *= 1 + 0.2 * slownessRating;
|
705 |
+
if (move.id === 'burningjealousy') weight *= TeamGenerator.statusWeight('brn', 0.2 * slownessRating);
|
706 |
+
if (move.id === 'alluringvoice') weight *= TeamGenerator.statusWeight('confusion', 0.2 * slownessRating);
|
707 |
+
|
708 |
+
// self-inflicted confusion or locking yourself in
|
709 |
+
if (move.self?.volatileStatus) weight *= 0.8;
|
710 |
+
|
711 |
+
// downweight moves if we already have an attacking move of the same type
|
712 |
+
if ((movesStats.attackTypes[moveType] || 0) > 60) weight *= 0.3;
|
713 |
+
|
714 |
+
if (move.selfdestruct) weight *= 0.3;
|
715 |
+
if (move.recoil && ability !== 'Rock Head' && ability !== 'Magic Guard') {
|
716 |
+
weight *= 1 - (move.recoil[0] / move.recoil[1]);
|
717 |
+
if (ability === 'Reckless') weight *= 1.2;
|
718 |
+
}
|
719 |
+
if (move.hasCrashDamage && ability !== 'Magic Guard') {
|
720 |
+
weight *= 1 - 0.75 * (1.2 - accuracy);
|
721 |
+
if (ability === 'Reckless') weight *= 1.2;
|
722 |
+
}
|
723 |
+
if (move.mindBlownRecoil) weight *= 0.25;
|
724 |
+
if (move.flags['futuremove']) weight *= 0.3;
|
725 |
+
|
726 |
+
let critRate = move.willCrit ? 4 : move.critRatio || 1;
|
727 |
+
if (ability === 'Super Luck') critRate++;
|
728 |
+
if (movesSoFar.some(m => m.id === 'focusenergy')) {
|
729 |
+
critRate += 2;
|
730 |
+
weight *= 0.9; // a penalty the extra turn of setup
|
731 |
+
}
|
732 |
+
if (critRate > 4) critRate = 4;
|
733 |
+
weight *= 1 + [0, 1 / 24, 1 / 8, 1 / 2, 1][critRate] * (ability === 'Sniper' ? 1 : 0.5);
|
734 |
+
|
735 |
+
// these two hazard removers don't clear hazards on the opponent's field, but can be blocked by type immunities
|
736 |
+
if (['rapidspin', 'mortalspin'].includes(move.id)) {
|
737 |
+
weight *= 1 + 20 * (0.25 ** teamStats.hazardRemovers);
|
738 |
+
}
|
739 |
+
|
740 |
+
// these moves have a hard-coded 16x bonus
|
741 |
+
if (move.id === 'stoneaxe' && teamStats.hazardSetters.stealthrock) weight /= 4;
|
742 |
+
if (move.id === 'ceaselessedge' && teamStats.hazardSetters.spikes) weight /= 2;
|
743 |
+
|
744 |
+
if (move.drain) {
|
745 |
+
const drainedFraction = move.drain[0] / move.drain[1];
|
746 |
+
weight *= 1 + (drainedFraction * 0.5);
|
747 |
+
}
|
748 |
+
|
749 |
+
// Oricorio should rarely get Tera Blast, as Revelation Dance is strictly better
|
750 |
+
// Tera Blast is also bad on species with forced Tera types, a.k.a. Ogerpon and Terapagos
|
751 |
+
if (move.id === 'terablast' && (species.baseSpecies === 'Oricorio' || species.forceTeraType)) weight *= 0.5;
|
752 |
+
|
753 |
+
return weight;
|
754 |
+
}
|
755 |
+
|
756 |
+
/**
|
757 |
+
* @returns The effective type of moves with variable types such as Judgment
|
758 |
+
*/
|
759 |
+
protected static moveType(move: Move, species: Species) {
|
760 |
+
switch (move.id) {
|
761 |
+
case 'ivycudgel':
|
762 |
+
case 'ragingbull':
|
763 |
+
if (species.types.length > 1) return species.types[1];
|
764 |
+
// falls through for Ogerpon and Tauros's respective base formes
|
765 |
+
case 'judgment':
|
766 |
+
case 'revelationdance':
|
767 |
+
return species.types[0];
|
768 |
+
}
|
769 |
+
return move.type;
|
770 |
+
}
|
771 |
+
|
772 |
+
protected static moveIsPhysical(move: Move, species: Species) {
|
773 |
+
if (move.category === 'Physical') {
|
774 |
+
return !(move.damageCallback || move.damage);
|
775 |
+
} else if (['terablast', 'terastarstorm', 'photongeyser', 'shellsidearm'].includes(move.id)) {
|
776 |
+
return species.baseStats.atk > species.baseStats.spa;
|
777 |
+
} else {
|
778 |
+
return false;
|
779 |
+
}
|
780 |
+
}
|
781 |
+
|
782 |
+
protected static moveIsSpecial(move: Move, species: Species) {
|
783 |
+
if (move.category === 'Special') {
|
784 |
+
return !(move.damageCallback || move.damage);
|
785 |
+
} else if (['terablast', 'terastarstorm', 'photongeyser', 'shellsidearm'].includes(move.id)) {
|
786 |
+
return species.baseStats.atk <= species.baseStats.spa;
|
787 |
+
} else {
|
788 |
+
return false;
|
789 |
+
}
|
790 |
+
}
|
791 |
+
|
792 |
+
/**
|
793 |
+
* @returns A multiplier to a move weighting based on the status it inflicts.
|
794 |
+
*/
|
795 |
+
protected static statusWeight(status: string, chance = 1, slownessRating?: number): number {
|
796 |
+
if (chance !== 1) return 1 + (TeamGenerator.statusWeight(status) - 1) * chance;
|
797 |
+
|
798 |
+
switch (status) {
|
799 |
+
case 'brn': return 2;
|
800 |
+
case 'frz': return 5;
|
801 |
+
// paralysis is especially valuable on slow pokemon that can become faster than an opponent by paralyzing it
|
802 |
+
// but some pokemon are so slow that most paralyzed pokemon would still outspeed them anyway
|
803 |
+
case 'par': return slownessRating && slownessRating > 0.25 ? 2 + slownessRating : 2;
|
804 |
+
case 'psn': return 1.75;
|
805 |
+
case 'tox': return 4;
|
806 |
+
case 'slp': return 4;
|
807 |
+
case 'confusion': return 1.5;
|
808 |
+
case 'healblock': return 1.75;
|
809 |
+
case 'flinch': return slownessRating ? slownessRating * 3 : 1;
|
810 |
+
case 'saltcure': return 2;
|
811 |
+
case 'sparklingaria': return 0.95;
|
812 |
+
case 'syrupbomb': return 1.5;
|
813 |
+
}
|
814 |
+
return 1;
|
815 |
+
}
|
816 |
+
|
817 |
+
/**
|
818 |
+
* @returns A multiplier to a move weighting based on the boosts it produces for the user.
|
819 |
+
*/
|
820 |
+
protected boostWeight(move: Move, movesSoFar: Move[], species: Species, ability: string, level: number): number {
|
821 |
+
const physicalIsRelevant = (
|
822 |
+
TeamGenerator.moveIsPhysical(move, species) ||
|
823 |
+
movesSoFar.some(
|
824 |
+
m => TeamGenerator.moveIsPhysical(m, species) && !m.overrideOffensiveStat && !m.overrideOffensivePokemon
|
825 |
+
)
|
826 |
+
);
|
827 |
+
const specialIsRelevant = (
|
828 |
+
TeamGenerator.moveIsSpecial(move, species) ||
|
829 |
+
movesSoFar.some(m => TeamGenerator.moveIsSpecial(m, species))
|
830 |
+
);
|
831 |
+
|
832 |
+
const adjustedStats: StatsTable = {
|
833 |
+
hp: species.baseStats.hp * level / 100 + level,
|
834 |
+
atk: species.baseStats.atk * level * level / 10000,
|
835 |
+
def: species.baseStats.def * level / 100,
|
836 |
+
spa: species.baseStats.spa * level * level / 10000,
|
837 |
+
spd: species.baseStats.spd * level / 100,
|
838 |
+
spe: species.baseStats.spe * level / 100,
|
839 |
+
};
|
840 |
+
|
841 |
+
let weight = 0;
|
842 |
+
const accuracy = move.accuracy === true ? 100 : move.accuracy / 100;
|
843 |
+
const secondaryChance = move.secondary && ability !== 'Sheer Force' ?
|
844 |
+
Math.min(((move.secondary.chance || 100) * (ability === 'Serene Grace' ? 2 : 1) / 100), 100) * accuracy : 0;
|
845 |
+
const abilityMod = ability === 'Simple' ? 2 : ability === 'Contrary' ? -1 : 1;
|
846 |
+
const bodyPressMod = movesSoFar.some(m => m.id === 'bodyPress') ? 2 : 1;
|
847 |
+
const electroBallMod = movesSoFar.some(m => m.id === 'electroball') ? 2 : 1;
|
848 |
+
for (const { chance, boosts } of [
|
849 |
+
{ chance: 1, boosts: move.boosts },
|
850 |
+
{ chance: 1, boosts: move.self?.boosts },
|
851 |
+
{ chance: 1, boosts: move.selfBoost?.boosts },
|
852 |
+
{
|
853 |
+
chance: secondaryChance,
|
854 |
+
boosts: move.secondary?.self?.boosts,
|
855 |
+
},
|
856 |
+
]) {
|
857 |
+
if (!boosts || chance === 0) continue;
|
858 |
+
const statusMod = move.category === 'Status' ? 1 : 0.5;
|
859 |
+
|
860 |
+
if (boosts.atk && physicalIsRelevant) weight += chance * boosts.atk * abilityMod * 2 * statusMod;
|
861 |
+
if (boosts.spa && specialIsRelevant) weight += chance * boosts.spa * abilityMod * 2 * statusMod;
|
862 |
+
|
863 |
+
// TODO: should these scale by base stat magnitude instead of using ternaries?
|
864 |
+
// defense/special defense boost is less useful if we have some bulk to start with
|
865 |
+
if (boosts.def) {
|
866 |
+
weight += chance * boosts.def * abilityMod * bodyPressMod * (adjustedStats.def > 60 ? 0.5 : 1) * statusMod;
|
867 |
+
}
|
868 |
+
if (boosts.spd) weight += chance * boosts.spd * abilityMod * (adjustedStats.spd > 60 ? 0.5 : 1) * statusMod;
|
869 |
+
|
870 |
+
// speed boost is less useful for fast pokemon
|
871 |
+
if (boosts.spe) {
|
872 |
+
weight += chance * boosts.spe * abilityMod * electroBallMod * (adjustedStats.spe > 95 ? 0.5 : 1) * statusMod;
|
873 |
+
}
|
874 |
+
}
|
875 |
+
|
876 |
+
return weight >= 0 ? 1 + weight : 1 / (1 - weight);
|
877 |
+
}
|
878 |
+
|
879 |
+
/**
|
880 |
+
* @returns A weight for a move based on how much it will reduce the opponent's stats.
|
881 |
+
*/
|
882 |
+
protected opponentDebuffWeight(move: Move): number {
|
883 |
+
if (!['allAdjacentFoes', 'allAdjacent', 'foeSide', 'normal'].includes(move.target)) return 1;
|
884 |
+
|
885 |
+
let averageNumberOfDebuffs = 0;
|
886 |
+
for (const { chance, boosts } of [
|
887 |
+
{ chance: 1, boosts: move.boosts },
|
888 |
+
{
|
889 |
+
chance: move.secondary ? ((move.secondary.chance || 100) / 100) : 0,
|
890 |
+
boosts: move.secondary?.boosts,
|
891 |
+
},
|
892 |
+
]) {
|
893 |
+
if (!boosts || chance === 0) continue;
|
894 |
+
|
895 |
+
const numBoosts = Object.values(boosts).filter(x => x < 0).length;
|
896 |
+
averageNumberOfDebuffs += chance * numBoosts;
|
897 |
+
}
|
898 |
+
|
899 |
+
return 1 + (0.5 * averageNumberOfDebuffs);
|
900 |
+
}
|
901 |
+
|
902 |
+
/**
|
903 |
+
* @returns A weight for an item.
|
904 |
+
*/
|
905 |
+
protected getItemWeight(
|
906 |
+
item: Item, teamStats: TeamStats, species: Species, moves: Move[], ability: string, level: number
|
907 |
+
): number {
|
908 |
+
const adjustedStats: StatsTable = {
|
909 |
+
hp: species.baseStats.hp * level / 100 + level,
|
910 |
+
atk: species.baseStats.atk * level * level / 10000,
|
911 |
+
def: species.baseStats.def * level / 100,
|
912 |
+
spa: species.baseStats.spa * level * level / 10000,
|
913 |
+
spd: species.baseStats.spd * level / 100,
|
914 |
+
spe: species.baseStats.spe * level / 100,
|
915 |
+
};
|
916 |
+
const statusImmunities = ['Comatose', 'Purifying Salt', 'Shields Down', 'Natural Cure', 'Misty Surge'];
|
917 |
+
|
918 |
+
let weight;
|
919 |
+
switch (item.id) {
|
920 |
+
// Choice Items
|
921 |
+
case 'choiceband':
|
922 |
+
return moves.every(x => TeamGenerator.moveIsPhysical(x, species)) ? 50 : 0;
|
923 |
+
case 'choicespecs':
|
924 |
+
return moves.every(x => TeamGenerator.moveIsSpecial(x, species)) ? 50 : 0;
|
925 |
+
case 'choicescarf':
|
926 |
+
if (moves.some(x => x.category === 'Status' || x.secondary?.self?.boosts?.spe)) return 0;
|
927 |
+
if (adjustedStats.spe > 50 && adjustedStats.spe < 120) return 50;
|
928 |
+
return 10;
|
929 |
+
|
930 |
+
// Generally Decent Items
|
931 |
+
case 'lifeorb':
|
932 |
+
return moves.filter(x => x.category !== 'Status' && !x.damage && !x.damageCallback).length * 8;
|
933 |
+
case 'focussash':
|
934 |
+
if (ability === 'Sturdy') return 0;
|
935 |
+
// frail
|
936 |
+
if (adjustedStats.hp < 65 && adjustedStats.def < 65 && adjustedStats.spd < 65) return 35;
|
937 |
+
return 10;
|
938 |
+
case 'heavydutyboots':
|
939 |
+
switch (this.dex.getEffectiveness('Rock', species)) {
|
940 |
+
case 1: return 30; // super effective
|
941 |
+
case 0: return 10; // neutral
|
942 |
+
}
|
943 |
+
return 5; // not very effective/other
|
944 |
+
case 'assaultvest':
|
945 |
+
if (moves.some(x => x.category === 'Status')) return 0;
|
946 |
+
return 30;
|
947 |
+
case 'scopelens':
|
948 |
+
const attacks = moves.filter(x => x.category !== 'Status' && !x.damage && !x.damageCallback && !x.willCrit);
|
949 |
+
if (moves.some(m => m.id === 'focusenergy')) {
|
950 |
+
if (ability === 'Super Luck') return 0; // we're already lucky enough, thank you
|
951 |
+
return attacks.length * (ability === 'Sniper' ? 16 : 12);
|
952 |
+
} else if (attacks.filter(x => (x.critRatio || 1) > 1).length || ability === 'Super Luck') {
|
953 |
+
return attacks.reduce((total, x) => {
|
954 |
+
let ratio = ability === 'Super Luck' ? 2 : 1;
|
955 |
+
if ((x.critRatio || 1) > 1) ratio++;
|
956 |
+
return total + [0, 3, 6, 12][ratio] * (ability === 'Sniper' ? 4 / 3 : 1);
|
957 |
+
}, 0);
|
958 |
+
}
|
959 |
+
return 0;
|
960 |
+
case 'eviolite':
|
961 |
+
return species.nfe || species.id === 'dipplin' ? 100 : 0;
|
962 |
+
|
963 |
+
// status
|
964 |
+
case 'flameorb':
|
965 |
+
if (species.types.includes('Fire')) return 0;
|
966 |
+
if (statusImmunities.includes(ability)) return 0;
|
967 |
+
if (['Thermal Exchange', 'Water Bubble', 'Water Veil'].includes(ability)) return 0;
|
968 |
+
weight = ['Guts', 'Flare Boost'].includes(ability) ? 30 : 0;
|
969 |
+
if (moves.some(m => m.id === 'facade')) {
|
970 |
+
if (!weight && !moves.some(m => TeamGenerator.moveIsPhysical(m, species) && m.id !== 'facade')) {
|
971 |
+
weight = 30;
|
972 |
+
} else {
|
973 |
+
weight *= 2;
|
974 |
+
}
|
975 |
+
}
|
976 |
+
return weight;
|
977 |
+
case 'toxicorb':
|
978 |
+
if (species.types.includes('Poison') || species.types.includes('Steel')) return 0;
|
979 |
+
if (statusImmunities.includes(ability)) return 0;
|
980 |
+
if (ability === 'Immunity') return 0;
|
981 |
+
// If facade is our only physical attack, Flame Orb is preferred
|
982 |
+
if (!moves.some(m => TeamGenerator.moveIsPhysical(m, species) && m.id !== 'facade') &&
|
983 |
+
!species.types.includes('Fire') && ['Thermal Exchange', 'Water Bubble', 'Water Veil'].includes(ability)
|
984 |
+
) return 0;
|
985 |
+
|
986 |
+
weight = 0;
|
987 |
+
if (['Poison Heal', 'Toxic Boost'].includes('ability')) weight += 25;
|
988 |
+
if (moves.some(m => m.id === 'facade')) weight += 25;
|
989 |
+
|
990 |
+
return weight;
|
991 |
+
|
992 |
+
// Healing
|
993 |
+
case 'leftovers':
|
994 |
+
return moves.some(m => m.stallingMove) ? 40 : 20;
|
995 |
+
case 'blacksludge':
|
996 |
+
// Even poison types don't really like Black Sludge in Gen 9 because it discourages them from terastallizing
|
997 |
+
// to a type other than Poison, and thus reveals their Tera type when it activates
|
998 |
+
return species.types.includes('Poison') ? moves.some(m => m.stallingMove) ? 20 : 10 : 0;
|
999 |
+
|
1000 |
+
// berries
|
1001 |
+
case 'sitrusberry': case 'magoberry':
|
1002 |
+
return 20;
|
1003 |
+
|
1004 |
+
case 'throatspray':
|
1005 |
+
if (moves.some(m => m.flags.sound) && moves.some(m => m.category === 'Special')) return 30;
|
1006 |
+
return 0;
|
1007 |
+
|
1008 |
+
default:
|
1009 |
+
// probably not a very good item
|
1010 |
+
return 0;
|
1011 |
+
}
|
1012 |
+
}
|
1013 |
+
|
1014 |
+
/**
|
1015 |
+
* @returns The level a Pokémon should be.
|
1016 |
+
*/
|
1017 |
+
protected static getLevel(species: Species): number {
|
1018 |
+
if (['Zacian', 'Zamazenta'].includes(species.name)) {
|
1019 |
+
species = Dex.species.get(species.otherFormes![0]);
|
1020 |
+
} else if (species.baseSpecies === 'Squawkabilly') {
|
1021 |
+
if (['Yellow', 'White'].includes(species.forme)) {
|
1022 |
+
species = Dex.species.get('Squawkabilly-Yellow');
|
1023 |
+
} else {
|
1024 |
+
species = Dex.species.get('Squawkabilly');
|
1025 |
+
}
|
1026 |
+
} else if (useBaseSpecies.includes(species.baseSpecies)) {
|
1027 |
+
species = Dex.species.get(species.baseSpecies);
|
1028 |
+
}
|
1029 |
+
if (levelOverride[species.id]) return levelOverride[species.id];
|
1030 |
+
|
1031 |
+
switch (species.tier) {
|
1032 |
+
case 'AG': return 60;
|
1033 |
+
case 'Uber': return 70;
|
1034 |
+
case 'OU': case 'Unreleased': return 80;
|
1035 |
+
case 'UU': return 90;
|
1036 |
+
case 'LC': case 'NFE': return 100;
|
1037 |
+
}
|
1038 |
+
|
1039 |
+
return 100;
|
1040 |
+
}
|
1041 |
+
|
1042 |
+
/**
|
1043 |
+
* Picks a choice from `choices` based on the weights in `weights`.
|
1044 |
+
* `weights` must be the same length as `choices`.
|
1045 |
+
*/
|
1046 |
+
weightedRandomPick<T>(
|
1047 |
+
choices: T[],
|
1048 |
+
weights: number[],
|
1049 |
+
options?: { remove?: boolean }
|
1050 |
+
) {
|
1051 |
+
if (!choices.length) throw new Error(`Can't pick from an empty list`);
|
1052 |
+
if (choices.length !== weights.length) throw new Error(`Choices and weights must be the same length`);
|
1053 |
+
|
1054 |
+
/* console.log(choices.reduce((acc, element, index) => {
|
1055 |
+
return {
|
1056 |
+
...acc,
|
1057 |
+
[element as string]: weights[index],
|
1058 |
+
};
|
1059 |
+
}, {})) */
|
1060 |
+
|
1061 |
+
const totalWeight = weights.reduce((a, b) => a + b, 0);
|
1062 |
+
|
1063 |
+
let randomWeight = this.prng.random(0, totalWeight);
|
1064 |
+
for (let i = 0; i < choices.length; i++) {
|
1065 |
+
randomWeight -= weights[i];
|
1066 |
+
if (randomWeight < 0) {
|
1067 |
+
const choice = choices[i];
|
1068 |
+
if (options?.remove) choices.splice(i, 1);
|
1069 |
+
return choice;
|
1070 |
+
}
|
1071 |
+
}
|
1072 |
+
|
1073 |
+
if (options?.remove && choices.length) return choices.pop()!;
|
1074 |
+
return choices[choices.length - 1];
|
1075 |
+
}
|
1076 |
+
|
1077 |
+
setSeed(seed: PRNGSeed) {
|
1078 |
+
this.prng.setSeed(seed);
|
1079 |
+
}
|
1080 |
+
}
|
data/conditions.ts
ADDED
@@ -0,0 +1,891 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
export const Conditions: import('../sim/dex-conditions').ConditionDataTable = {
|
2 |
+
brn: {
|
3 |
+
name: 'brn',
|
4 |
+
effectType: 'Status',
|
5 |
+
onStart(target, source, sourceEffect) {
|
6 |
+
if (sourceEffect && sourceEffect.id === 'flameorb') {
|
7 |
+
this.add('-status', target, 'brn', '[from] item: Flame Orb');
|
8 |
+
} else if (sourceEffect && sourceEffect.effectType === 'Ability') {
|
9 |
+
this.add('-status', target, 'brn', '[from] ability: ' + sourceEffect.name, `[of] ${source}`);
|
10 |
+
} else {
|
11 |
+
this.add('-status', target, 'brn');
|
12 |
+
}
|
13 |
+
},
|
14 |
+
// Damage reduction is handled directly in the sim/battle.js damage function
|
15 |
+
onResidualOrder: 10,
|
16 |
+
onResidual(pokemon) {
|
17 |
+
this.damage(pokemon.baseMaxhp / 16);
|
18 |
+
},
|
19 |
+
},
|
20 |
+
par: {
|
21 |
+
name: 'par',
|
22 |
+
effectType: 'Status',
|
23 |
+
onStart(target, source, sourceEffect) {
|
24 |
+
if (sourceEffect && sourceEffect.effectType === 'Ability') {
|
25 |
+
this.add('-status', target, 'par', '[from] ability: ' + sourceEffect.name, `[of] ${source}`);
|
26 |
+
} else {
|
27 |
+
this.add('-status', target, 'par');
|
28 |
+
}
|
29 |
+
},
|
30 |
+
onModifySpePriority: -101,
|
31 |
+
onModifySpe(spe, pokemon) {
|
32 |
+
// Paralysis occurs after all other Speed modifiers, so evaluate all modifiers up to this point first
|
33 |
+
spe = this.finalModify(spe);
|
34 |
+
if (!pokemon.hasAbility('quickfeet')) {
|
35 |
+
spe = Math.floor(spe * 50 / 100);
|
36 |
+
}
|
37 |
+
return spe;
|
38 |
+
},
|
39 |
+
onBeforeMovePriority: 1,
|
40 |
+
onBeforeMove(pokemon) {
|
41 |
+
if (this.randomChance(1, 4)) {
|
42 |
+
this.add('cant', pokemon, 'par');
|
43 |
+
return false;
|
44 |
+
}
|
45 |
+
},
|
46 |
+
},
|
47 |
+
slp: {
|
48 |
+
name: 'slp',
|
49 |
+
effectType: 'Status',
|
50 |
+
onStart(target, source, sourceEffect) {
|
51 |
+
if (sourceEffect && sourceEffect.effectType === 'Ability') {
|
52 |
+
this.add('-status', target, 'slp', '[from] ability: ' + sourceEffect.name, `[of] ${source}`);
|
53 |
+
} else if (sourceEffect && sourceEffect.effectType === 'Move') {
|
54 |
+
this.add('-status', target, 'slp', `[from] move: ${sourceEffect.name}`);
|
55 |
+
} else {
|
56 |
+
this.add('-status', target, 'slp');
|
57 |
+
}
|
58 |
+
// 1-3 turns
|
59 |
+
this.effectState.startTime = this.random(2, 5);
|
60 |
+
this.effectState.time = this.effectState.startTime;
|
61 |
+
|
62 |
+
if (target.removeVolatile('nightmare')) {
|
63 |
+
this.add('-end', target, 'Nightmare', '[silent]');
|
64 |
+
}
|
65 |
+
},
|
66 |
+
onBeforeMovePriority: 10,
|
67 |
+
onBeforeMove(pokemon, target, move) {
|
68 |
+
if (pokemon.hasAbility('earlybird')) {
|
69 |
+
pokemon.statusState.time--;
|
70 |
+
}
|
71 |
+
pokemon.statusState.time--;
|
72 |
+
if (pokemon.statusState.time <= 0) {
|
73 |
+
pokemon.cureStatus();
|
74 |
+
return;
|
75 |
+
}
|
76 |
+
this.add('cant', pokemon, 'slp');
|
77 |
+
if (move.sleepUsable) {
|
78 |
+
return;
|
79 |
+
}
|
80 |
+
return false;
|
81 |
+
},
|
82 |
+
},
|
83 |
+
frz: {
|
84 |
+
name: 'frz',
|
85 |
+
effectType: 'Status',
|
86 |
+
onStart(target, source, sourceEffect) {
|
87 |
+
if (sourceEffect && sourceEffect.effectType === 'Ability') {
|
88 |
+
this.add('-status', target, 'frz', '[from] ability: ' + sourceEffect.name, `[of] ${source}`);
|
89 |
+
} else {
|
90 |
+
this.add('-status', target, 'frz');
|
91 |
+
}
|
92 |
+
if (target.species.name === 'Shaymin-Sky' && target.baseSpecies.baseSpecies === 'Shaymin') {
|
93 |
+
target.formeChange('Shaymin', this.effect, true);
|
94 |
+
target.regressionForme = false;
|
95 |
+
}
|
96 |
+
},
|
97 |
+
onBeforeMovePriority: 10,
|
98 |
+
onBeforeMove(pokemon, target, move) {
|
99 |
+
if (move.flags['defrost']) return;
|
100 |
+
if (this.randomChance(1, 5)) {
|
101 |
+
pokemon.cureStatus();
|
102 |
+
return;
|
103 |
+
}
|
104 |
+
this.add('cant', pokemon, 'frz');
|
105 |
+
return false;
|
106 |
+
},
|
107 |
+
onModifyMove(move, pokemon) {
|
108 |
+
if (move.flags['defrost']) {
|
109 |
+
this.add('-curestatus', pokemon, 'frz', `[from] move: ${move}`);
|
110 |
+
pokemon.clearStatus();
|
111 |
+
}
|
112 |
+
},
|
113 |
+
onAfterMoveSecondary(target, source, move) {
|
114 |
+
if (move.thawsTarget) {
|
115 |
+
target.cureStatus();
|
116 |
+
}
|
117 |
+
},
|
118 |
+
onDamagingHit(damage, target, source, move) {
|
119 |
+
if (move.type === 'Fire' && move.category !== 'Status') {
|
120 |
+
target.cureStatus();
|
121 |
+
}
|
122 |
+
},
|
123 |
+
},
|
124 |
+
psn: {
|
125 |
+
name: 'psn',
|
126 |
+
effectType: 'Status',
|
127 |
+
onStart(target, source, sourceEffect) {
|
128 |
+
if (sourceEffect && sourceEffect.effectType === 'Ability') {
|
129 |
+
this.add('-status', target, 'psn', '[from] ability: ' + sourceEffect.name, `[of] ${source}`);
|
130 |
+
} else {
|
131 |
+
this.add('-status', target, 'psn');
|
132 |
+
}
|
133 |
+
},
|
134 |
+
onResidualOrder: 9,
|
135 |
+
onResidual(pokemon) {
|
136 |
+
this.damage(pokemon.baseMaxhp / 8);
|
137 |
+
},
|
138 |
+
},
|
139 |
+
tox: {
|
140 |
+
name: 'tox',
|
141 |
+
effectType: 'Status',
|
142 |
+
onStart(target, source, sourceEffect) {
|
143 |
+
this.effectState.stage = 0;
|
144 |
+
if (sourceEffect && sourceEffect.id === 'toxicorb') {
|
145 |
+
this.add('-status', target, 'tox', '[from] item: Toxic Orb');
|
146 |
+
} else if (sourceEffect && sourceEffect.effectType === 'Ability') {
|
147 |
+
this.add('-status', target, 'tox', '[from] ability: ' + sourceEffect.name, `[of] ${source}`);
|
148 |
+
} else {
|
149 |
+
this.add('-status', target, 'tox');
|
150 |
+
}
|
151 |
+
},
|
152 |
+
onSwitchIn() {
|
153 |
+
this.effectState.stage = 0;
|
154 |
+
},
|
155 |
+
onResidualOrder: 9,
|
156 |
+
onResidual(pokemon) {
|
157 |
+
if (this.effectState.stage < 15) {
|
158 |
+
this.effectState.stage++;
|
159 |
+
}
|
160 |
+
this.damage(this.clampIntRange(pokemon.baseMaxhp / 16, 1) * this.effectState.stage);
|
161 |
+
},
|
162 |
+
},
|
163 |
+
confusion: {
|
164 |
+
name: 'confusion',
|
165 |
+
// this is a volatile status
|
166 |
+
onStart(target, source, sourceEffect) {
|
167 |
+
if (sourceEffect?.id === 'lockedmove') {
|
168 |
+
this.add('-start', target, 'confusion', '[fatigue]');
|
169 |
+
} else if (sourceEffect?.effectType === 'Ability') {
|
170 |
+
this.add('-start', target, 'confusion', '[from] ability: ' + sourceEffect.name, `[of] ${source}`);
|
171 |
+
} else {
|
172 |
+
this.add('-start', target, 'confusion');
|
173 |
+
}
|
174 |
+
const min = sourceEffect?.id === 'axekick' ? 3 : 2;
|
175 |
+
this.effectState.time = this.random(min, 6);
|
176 |
+
},
|
177 |
+
onEnd(target) {
|
178 |
+
this.add('-end', target, 'confusion');
|
179 |
+
},
|
180 |
+
onBeforeMovePriority: 3,
|
181 |
+
onBeforeMove(pokemon) {
|
182 |
+
pokemon.volatiles['confusion'].time--;
|
183 |
+
if (!pokemon.volatiles['confusion'].time) {
|
184 |
+
pokemon.removeVolatile('confusion');
|
185 |
+
return;
|
186 |
+
}
|
187 |
+
this.add('-activate', pokemon, 'confusion');
|
188 |
+
if (!this.randomChance(33, 100)) {
|
189 |
+
return;
|
190 |
+
}
|
191 |
+
this.activeTarget = pokemon;
|
192 |
+
const damage = this.actions.getConfusionDamage(pokemon, 40);
|
193 |
+
if (typeof damage !== 'number') throw new Error("Confusion damage not dealt");
|
194 |
+
const activeMove = { id: this.toID('confused'), effectType: 'Move', type: '???' };
|
195 |
+
this.damage(damage, pokemon, pokemon, activeMove as ActiveMove);
|
196 |
+
return false;
|
197 |
+
},
|
198 |
+
},
|
199 |
+
flinch: {
|
200 |
+
name: 'flinch',
|
201 |
+
duration: 1,
|
202 |
+
onBeforeMovePriority: 8,
|
203 |
+
onBeforeMove(pokemon) {
|
204 |
+
this.add('cant', pokemon, 'flinch');
|
205 |
+
this.runEvent('Flinch', pokemon);
|
206 |
+
return false;
|
207 |
+
},
|
208 |
+
},
|
209 |
+
trapped: {
|
210 |
+
name: 'trapped',
|
211 |
+
noCopy: true,
|
212 |
+
onTrapPokemon(pokemon) {
|
213 |
+
pokemon.tryTrap();
|
214 |
+
},
|
215 |
+
onStart(target) {
|
216 |
+
this.add('-activate', target, 'trapped');
|
217 |
+
},
|
218 |
+
},
|
219 |
+
trapper: {
|
220 |
+
name: 'trapper',
|
221 |
+
noCopy: true,
|
222 |
+
},
|
223 |
+
partiallytrapped: {
|
224 |
+
name: 'partiallytrapped',
|
225 |
+
duration: 5,
|
226 |
+
durationCallback(target, source) {
|
227 |
+
if (source?.hasItem('gripclaw')) return 8;
|
228 |
+
return this.random(5, 7);
|
229 |
+
},
|
230 |
+
onStart(pokemon, source) {
|
231 |
+
this.add('-activate', pokemon, 'move: ' + this.effectState.sourceEffect, `[of] ${source}`);
|
232 |
+
this.effectState.boundDivisor = source.hasItem('bindingband') ? 6 : 8;
|
233 |
+
},
|
234 |
+
onResidualOrder: 13,
|
235 |
+
onResidual(pokemon) {
|
236 |
+
const source = this.effectState.source;
|
237 |
+
// G-Max Centiferno and G-Max Sandblast continue even after the user leaves the field
|
238 |
+
const gmaxEffect = ['gmaxcentiferno', 'gmaxsandblast'].includes(this.effectState.sourceEffect.id);
|
239 |
+
if (source && (!source.isActive || source.hp <= 0 || !source.activeTurns) && !gmaxEffect) {
|
240 |
+
delete pokemon.volatiles['partiallytrapped'];
|
241 |
+
this.add('-end', pokemon, this.effectState.sourceEffect, '[partiallytrapped]', '[silent]');
|
242 |
+
return;
|
243 |
+
}
|
244 |
+
this.damage(pokemon.baseMaxhp / this.effectState.boundDivisor);
|
245 |
+
},
|
246 |
+
onEnd(pokemon) {
|
247 |
+
this.add('-end', pokemon, this.effectState.sourceEffect, '[partiallytrapped]');
|
248 |
+
},
|
249 |
+
onTrapPokemon(pokemon) {
|
250 |
+
const gmaxEffect = ['gmaxcentiferno', 'gmaxsandblast'].includes(this.effectState.sourceEffect.id);
|
251 |
+
if (this.effectState.source?.isActive || gmaxEffect) pokemon.tryTrap();
|
252 |
+
},
|
253 |
+
},
|
254 |
+
lockedmove: {
|
255 |
+
// Outrage, Thrash, Petal Dance...
|
256 |
+
name: 'lockedmove',
|
257 |
+
duration: 2,
|
258 |
+
onResidual(target) {
|
259 |
+
if (target.status === 'slp') {
|
260 |
+
// don't lock, and bypass confusion for calming
|
261 |
+
delete target.volatiles['lockedmove'];
|
262 |
+
}
|
263 |
+
this.effectState.trueDuration--;
|
264 |
+
},
|
265 |
+
onStart(target, source, effect) {
|
266 |
+
this.effectState.trueDuration = this.random(2, 4);
|
267 |
+
this.effectState.move = effect.id;
|
268 |
+
},
|
269 |
+
onRestart() {
|
270 |
+
if (this.effectState.trueDuration >= 2) {
|
271 |
+
this.effectState.duration = 2;
|
272 |
+
}
|
273 |
+
},
|
274 |
+
onEnd(target) {
|
275 |
+
if (this.effectState.trueDuration > 1) return;
|
276 |
+
target.addVolatile('confusion');
|
277 |
+
},
|
278 |
+
onLockMove(pokemon) {
|
279 |
+
if (pokemon.volatiles['dynamax']) return;
|
280 |
+
return this.effectState.move;
|
281 |
+
},
|
282 |
+
},
|
283 |
+
twoturnmove: {
|
284 |
+
// Skull Bash, SolarBeam, Sky Drop...
|
285 |
+
name: 'twoturnmove',
|
286 |
+
duration: 2,
|
287 |
+
onStart(attacker, defender, effect) {
|
288 |
+
// ("attacker" is the Pokemon using the two turn move and the Pokemon this condition is being applied to)
|
289 |
+
this.effectState.move = effect.id;
|
290 |
+
attacker.addVolatile(effect.id);
|
291 |
+
// lastMoveTargetLoc is the location of the originally targeted slot before any redirection
|
292 |
+
// note that this is not updated for moves called by other moves
|
293 |
+
// i.e. if Dig is called by Metronome, lastMoveTargetLoc will still be the user's location
|
294 |
+
let moveTargetLoc: number = attacker.lastMoveTargetLoc!;
|
295 |
+
if (effect.sourceEffect && this.dex.moves.get(effect.id).target !== 'self') {
|
296 |
+
// this move was called by another move such as Metronome
|
297 |
+
// and needs a random target to be determined this turn
|
298 |
+
// it will already have one by now if there is any valid target
|
299 |
+
// but if there isn't one we need to choose a random slot now
|
300 |
+
if (defender.fainted) {
|
301 |
+
defender = this.sample(attacker.foes(true));
|
302 |
+
}
|
303 |
+
moveTargetLoc = attacker.getLocOf(defender);
|
304 |
+
}
|
305 |
+
attacker.volatiles[effect.id].targetLoc = moveTargetLoc;
|
306 |
+
this.attrLastMove('[still]');
|
307 |
+
// Run side-effects normally associated with hitting (e.g., Protean, Libero)
|
308 |
+
this.runEvent('PrepareHit', attacker, defender, effect);
|
309 |
+
},
|
310 |
+
onEnd(target) {
|
311 |
+
target.removeVolatile(this.effectState.move);
|
312 |
+
},
|
313 |
+
onLockMove() {
|
314 |
+
return this.effectState.move;
|
315 |
+
},
|
316 |
+
onMoveAborted(pokemon) {
|
317 |
+
pokemon.removeVolatile('twoturnmove');
|
318 |
+
},
|
319 |
+
},
|
320 |
+
choicelock: {
|
321 |
+
name: 'choicelock',
|
322 |
+
noCopy: true,
|
323 |
+
onStart(pokemon) {
|
324 |
+
if (!this.activeMove) throw new Error("Battle.activeMove is null");
|
325 |
+
if (!this.activeMove.id || this.activeMove.hasBounced || this.activeMove.sourceEffect === 'snatch') return false;
|
326 |
+
this.effectState.move = this.activeMove.id;
|
327 |
+
},
|
328 |
+
onBeforeMove(pokemon, target, move) {
|
329 |
+
if (!pokemon.getItem().isChoice) {
|
330 |
+
pokemon.removeVolatile('choicelock');
|
331 |
+
return;
|
332 |
+
}
|
333 |
+
if (
|
334 |
+
!pokemon.ignoringItem() && !pokemon.volatiles['dynamax'] &&
|
335 |
+
move.id !== this.effectState.move && move.id !== 'struggle'
|
336 |
+
) {
|
337 |
+
// Fails unless the Choice item is being ignored, and no PP is lost
|
338 |
+
this.addMove('move', pokemon, move.name);
|
339 |
+
this.attrLastMove('[still]');
|
340 |
+
this.debug("Disabled by Choice item lock");
|
341 |
+
this.add('-fail', pokemon);
|
342 |
+
return false;
|
343 |
+
}
|
344 |
+
},
|
345 |
+
onDisableMove(pokemon) {
|
346 |
+
if (!pokemon.getItem().isChoice || !pokemon.hasMove(this.effectState.move)) {
|
347 |
+
pokemon.removeVolatile('choicelock');
|
348 |
+
return;
|
349 |
+
}
|
350 |
+
if (pokemon.ignoringItem() || pokemon.volatiles['dynamax']) {
|
351 |
+
return;
|
352 |
+
}
|
353 |
+
for (const moveSlot of pokemon.moveSlots) {
|
354 |
+
if (moveSlot.id !== this.effectState.move) {
|
355 |
+
pokemon.disableMove(moveSlot.id, false, this.effectState.sourceEffect);
|
356 |
+
}
|
357 |
+
}
|
358 |
+
},
|
359 |
+
},
|
360 |
+
mustrecharge: {
|
361 |
+
name: 'mustrecharge',
|
362 |
+
duration: 2,
|
363 |
+
onBeforeMovePriority: 11,
|
364 |
+
onBeforeMove(pokemon) {
|
365 |
+
this.add('cant', pokemon, 'recharge');
|
366 |
+
pokemon.removeVolatile('mustrecharge');
|
367 |
+
pokemon.removeVolatile('truant');
|
368 |
+
return null;
|
369 |
+
},
|
370 |
+
onStart(pokemon) {
|
371 |
+
this.add('-mustrecharge', pokemon);
|
372 |
+
},
|
373 |
+
onLockMove: 'recharge',
|
374 |
+
},
|
375 |
+
futuremove: {
|
376 |
+
// this is a slot condition
|
377 |
+
name: 'futuremove',
|
378 |
+
onStart(target) {
|
379 |
+
this.effectState.targetSlot = target.getSlot();
|
380 |
+
this.effectState.endingTurn = (this.turn - 1) + 2;
|
381 |
+
if (this.effectState.endingTurn >= 254) {
|
382 |
+
this.hint(`In Gen 8+, Future attacks will never resolve when used on the 255th turn or later.`);
|
383 |
+
}
|
384 |
+
},
|
385 |
+
onResidualOrder: 3,
|
386 |
+
onResidual(target: Pokemon) {
|
387 |
+
if (this.getOverflowedTurnCount() < this.effectState.endingTurn) return;
|
388 |
+
target.side.removeSlotCondition(this.getAtSlot(this.effectState.targetSlot), 'futuremove');
|
389 |
+
},
|
390 |
+
onEnd(target) {
|
391 |
+
const data = this.effectState;
|
392 |
+
// time's up; time to hit! :D
|
393 |
+
const move = this.dex.moves.get(data.move);
|
394 |
+
if (target.fainted || target === data.source) {
|
395 |
+
this.hint(`${move.name} did not hit because the target is ${(target.fainted ? 'fainted' : 'the user')}.`);
|
396 |
+
return;
|
397 |
+
}
|
398 |
+
|
399 |
+
this.add('-end', target, 'move: ' + move.name);
|
400 |
+
target.removeVolatile('Protect');
|
401 |
+
target.removeVolatile('Endure');
|
402 |
+
|
403 |
+
if (data.source.hasAbility('infiltrator') && this.gen >= 6) {
|
404 |
+
data.moveData.infiltrates = true;
|
405 |
+
}
|
406 |
+
if (data.source.hasAbility('normalize') && this.gen >= 6) {
|
407 |
+
data.moveData.type = 'Normal';
|
408 |
+
}
|
409 |
+
const hitMove = new this.dex.Move(data.moveData) as ActiveMove;
|
410 |
+
|
411 |
+
this.actions.trySpreadMoveHit([target], data.source, hitMove, true);
|
412 |
+
if (data.source.isActive && data.source.hasItem('lifeorb') && this.gen >= 5) {
|
413 |
+
this.singleEvent('AfterMoveSecondarySelf', data.source.getItem(), data.source.itemState, data.source, target, data.source.getItem());
|
414 |
+
}
|
415 |
+
this.activeMove = null;
|
416 |
+
|
417 |
+
this.checkWin();
|
418 |
+
},
|
419 |
+
},
|
420 |
+
healreplacement: {
|
421 |
+
// this is a slot condition
|
422 |
+
name: 'healreplacement',
|
423 |
+
onStart(target, source, sourceEffect) {
|
424 |
+
this.effectState.sourceEffect = sourceEffect;
|
425 |
+
this.add('-activate', source, 'healreplacement');
|
426 |
+
},
|
427 |
+
onSwitchIn(target) {
|
428 |
+
if (!target.fainted) {
|
429 |
+
target.heal(target.maxhp);
|
430 |
+
this.add('-heal', target, target.getHealth, '[from] move: ' + this.effectState.sourceEffect, '[zeffect]');
|
431 |
+
target.side.removeSlotCondition(target, 'healreplacement');
|
432 |
+
}
|
433 |
+
},
|
434 |
+
},
|
435 |
+
stall: {
|
436 |
+
// Protect, Detect, Endure counter
|
437 |
+
name: 'stall',
|
438 |
+
duration: 2,
|
439 |
+
counterMax: 729,
|
440 |
+
onStart() {
|
441 |
+
this.effectState.counter = 3;
|
442 |
+
},
|
443 |
+
onStallMove(pokemon) {
|
444 |
+
// this.effectState.counter should never be undefined here.
|
445 |
+
// However, just in case, use 1 if it is undefined.
|
446 |
+
const counter = this.effectState.counter || 1;
|
447 |
+
this.debug(`Success chance: ${Math.round(100 / counter)}%`);
|
448 |
+
const success = this.randomChance(1, counter);
|
449 |
+
if (!success) delete pokemon.volatiles['stall'];
|
450 |
+
return success;
|
451 |
+
},
|
452 |
+
onRestart() {
|
453 |
+
if (this.effectState.counter < (this.effect as Condition).counterMax!) {
|
454 |
+
this.effectState.counter *= 3;
|
455 |
+
}
|
456 |
+
this.effectState.duration = 2;
|
457 |
+
},
|
458 |
+
},
|
459 |
+
gem: {
|
460 |
+
name: 'gem',
|
461 |
+
duration: 1,
|
462 |
+
affectsFainted: true,
|
463 |
+
onBasePowerPriority: 14,
|
464 |
+
onBasePower(basePower, user, target, move) {
|
465 |
+
this.debug('Gem Boost');
|
466 |
+
return this.chainModify([5325, 4096]);
|
467 |
+
},
|
468 |
+
},
|
469 |
+
|
470 |
+
// weather is implemented here since it's so important to the game
|
471 |
+
|
472 |
+
raindance: {
|
473 |
+
name: 'RainDance',
|
474 |
+
effectType: 'Weather',
|
475 |
+
duration: 5,
|
476 |
+
durationCallback(source, effect) {
|
477 |
+
if (source?.hasItem('damprock')) {
|
478 |
+
return 8;
|
479 |
+
}
|
480 |
+
return 5;
|
481 |
+
},
|
482 |
+
onWeatherModifyDamage(damage, attacker, defender, move) {
|
483 |
+
if (defender.hasItem('utilityumbrella')) return;
|
484 |
+
if (move.type === 'Water') {
|
485 |
+
this.debug('rain water boost');
|
486 |
+
return this.chainModify(1.5);
|
487 |
+
}
|
488 |
+
if (move.type === 'Fire') {
|
489 |
+
this.debug('rain fire suppress');
|
490 |
+
return this.chainModify(0.5);
|
491 |
+
}
|
492 |
+
},
|
493 |
+
onFieldStart(field, source, effect) {
|
494 |
+
if (effect?.effectType === 'Ability') {
|
495 |
+
if (this.gen <= 5) this.effectState.duration = 0;
|
496 |
+
this.add('-weather', 'RainDance', '[from] ability: ' + effect.name, `[of] ${source}`);
|
497 |
+
} else {
|
498 |
+
this.add('-weather', 'RainDance');
|
499 |
+
}
|
500 |
+
},
|
501 |
+
onFieldResidualOrder: 1,
|
502 |
+
onFieldResidual() {
|
503 |
+
this.add('-weather', 'RainDance', '[upkeep]');
|
504 |
+
this.eachEvent('Weather');
|
505 |
+
},
|
506 |
+
onFieldEnd() {
|
507 |
+
this.add('-weather', 'none');
|
508 |
+
},
|
509 |
+
},
|
510 |
+
primordialsea: {
|
511 |
+
name: 'PrimordialSea',
|
512 |
+
effectType: 'Weather',
|
513 |
+
duration: 0,
|
514 |
+
onTryMovePriority: 1,
|
515 |
+
onTryMove(attacker, defender, move) {
|
516 |
+
if (move.type === 'Fire' && move.category !== 'Status') {
|
517 |
+
this.debug('Primordial Sea fire suppress');
|
518 |
+
this.add('-fail', attacker, move, '[from] Primordial Sea');
|
519 |
+
this.attrLastMove('[still]');
|
520 |
+
return null;
|
521 |
+
}
|
522 |
+
},
|
523 |
+
onWeatherModifyDamage(damage, attacker, defender, move) {
|
524 |
+
if (defender.hasItem('utilityumbrella')) return;
|
525 |
+
if (move.type === 'Water') {
|
526 |
+
this.debug('Rain water boost');
|
527 |
+
return this.chainModify(1.5);
|
528 |
+
}
|
529 |
+
},
|
530 |
+
onFieldStart(field, source, effect) {
|
531 |
+
this.add('-weather', 'PrimordialSea', '[from] ability: ' + effect.name, `[of] ${source}`);
|
532 |
+
},
|
533 |
+
onFieldResidualOrder: 1,
|
534 |
+
onFieldResidual() {
|
535 |
+
this.add('-weather', 'PrimordialSea', '[upkeep]');
|
536 |
+
this.eachEvent('Weather');
|
537 |
+
},
|
538 |
+
onFieldEnd() {
|
539 |
+
this.add('-weather', 'none');
|
540 |
+
},
|
541 |
+
},
|
542 |
+
sunnyday: {
|
543 |
+
name: 'SunnyDay',
|
544 |
+
effectType: 'Weather',
|
545 |
+
duration: 5,
|
546 |
+
durationCallback(source, effect) {
|
547 |
+
if (source?.hasItem('heatrock')) {
|
548 |
+
return 8;
|
549 |
+
}
|
550 |
+
return 5;
|
551 |
+
},
|
552 |
+
onWeatherModifyDamage(damage, attacker, defender, move) {
|
553 |
+
if (move.id === 'hydrosteam' && !attacker.hasItem('utilityumbrella')) {
|
554 |
+
this.debug('Sunny Day Hydro Steam boost');
|
555 |
+
return this.chainModify(1.5);
|
556 |
+
}
|
557 |
+
if (defender.hasItem('utilityumbrella')) return;
|
558 |
+
if (move.type === 'Fire') {
|
559 |
+
this.debug('Sunny Day fire boost');
|
560 |
+
return this.chainModify(1.5);
|
561 |
+
}
|
562 |
+
if (move.type === 'Water') {
|
563 |
+
this.debug('Sunny Day water suppress');
|
564 |
+
return this.chainModify(0.5);
|
565 |
+
}
|
566 |
+
},
|
567 |
+
onFieldStart(battle, source, effect) {
|
568 |
+
if (effect?.effectType === 'Ability') {
|
569 |
+
if (this.gen <= 5) this.effectState.duration = 0;
|
570 |
+
this.add('-weather', 'SunnyDay', '[from] ability: ' + effect.name, `[of] ${source}`);
|
571 |
+
} else {
|
572 |
+
this.add('-weather', 'SunnyDay');
|
573 |
+
}
|
574 |
+
},
|
575 |
+
onImmunity(type, pokemon) {
|
576 |
+
if (pokemon.hasItem('utilityumbrella')) return;
|
577 |
+
if (type === 'frz') return false;
|
578 |
+
},
|
579 |
+
onFieldResidualOrder: 1,
|
580 |
+
onFieldResidual() {
|
581 |
+
this.add('-weather', 'SunnyDay', '[upkeep]');
|
582 |
+
this.eachEvent('Weather');
|
583 |
+
},
|
584 |
+
onFieldEnd() {
|
585 |
+
this.add('-weather', 'none');
|
586 |
+
},
|
587 |
+
},
|
588 |
+
desolateland: {
|
589 |
+
name: 'DesolateLand',
|
590 |
+
effectType: 'Weather',
|
591 |
+
duration: 0,
|
592 |
+
onTryMovePriority: 1,
|
593 |
+
onTryMove(attacker, defender, move) {
|
594 |
+
if (move.type === 'Water' && move.category !== 'Status') {
|
595 |
+
this.debug('Desolate Land water suppress');
|
596 |
+
this.add('-fail', attacker, move, '[from] Desolate Land');
|
597 |
+
this.attrLastMove('[still]');
|
598 |
+
return null;
|
599 |
+
}
|
600 |
+
},
|
601 |
+
onWeatherModifyDamage(damage, attacker, defender, move) {
|
602 |
+
if (defender.hasItem('utilityumbrella')) return;
|
603 |
+
if (move.type === 'Fire') {
|
604 |
+
this.debug('Sunny Day fire boost');
|
605 |
+
return this.chainModify(1.5);
|
606 |
+
}
|
607 |
+
},
|
608 |
+
onFieldStart(field, source, effect) {
|
609 |
+
this.add('-weather', 'DesolateLand', '[from] ability: ' + effect.name, `[of] ${source}`);
|
610 |
+
},
|
611 |
+
onImmunity(type, pokemon) {
|
612 |
+
if (pokemon.hasItem('utilityumbrella')) return;
|
613 |
+
if (type === 'frz') return false;
|
614 |
+
},
|
615 |
+
onFieldResidualOrder: 1,
|
616 |
+
onFieldResidual() {
|
617 |
+
this.add('-weather', 'DesolateLand', '[upkeep]');
|
618 |
+
this.eachEvent('Weather');
|
619 |
+
},
|
620 |
+
onFieldEnd() {
|
621 |
+
this.add('-weather', 'none');
|
622 |
+
},
|
623 |
+
},
|
624 |
+
sandstorm: {
|
625 |
+
name: 'Sandstorm',
|
626 |
+
effectType: 'Weather',
|
627 |
+
duration: 5,
|
628 |
+
durationCallback(source, effect) {
|
629 |
+
if (source?.hasItem('smoothrock')) {
|
630 |
+
return 8;
|
631 |
+
}
|
632 |
+
return 5;
|
633 |
+
},
|
634 |
+
// This should be applied directly to the stat before any of the other modifiers are chained
|
635 |
+
// So we give it increased priority.
|
636 |
+
onModifySpDPriority: 10,
|
637 |
+
onModifySpD(spd, pokemon) {
|
638 |
+
if (pokemon.hasType('Rock') && this.field.isWeather('sandstorm')) {
|
639 |
+
return this.modify(spd, 1.5);
|
640 |
+
}
|
641 |
+
},
|
642 |
+
onFieldStart(field, source, effect) {
|
643 |
+
if (effect?.effectType === 'Ability') {
|
644 |
+
if (this.gen <= 5) this.effectState.duration = 0;
|
645 |
+
this.add('-weather', 'Sandstorm', '[from] ability: ' + effect.name, `[of] ${source}`);
|
646 |
+
} else {
|
647 |
+
this.add('-weather', 'Sandstorm');
|
648 |
+
}
|
649 |
+
},
|
650 |
+
onFieldResidualOrder: 1,
|
651 |
+
onFieldResidual() {
|
652 |
+
this.add('-weather', 'Sandstorm', '[upkeep]');
|
653 |
+
if (this.field.isWeather('sandstorm')) this.eachEvent('Weather');
|
654 |
+
},
|
655 |
+
onWeather(target) {
|
656 |
+
this.damage(target.baseMaxhp / 16);
|
657 |
+
},
|
658 |
+
onFieldEnd() {
|
659 |
+
this.add('-weather', 'none');
|
660 |
+
},
|
661 |
+
},
|
662 |
+
hail: {
|
663 |
+
name: 'Hail',
|
664 |
+
effectType: 'Weather',
|
665 |
+
duration: 5,
|
666 |
+
durationCallback(source, effect) {
|
667 |
+
if (source?.hasItem('icyrock')) {
|
668 |
+
return 8;
|
669 |
+
}
|
670 |
+
return 5;
|
671 |
+
},
|
672 |
+
onFieldStart(field, source, effect) {
|
673 |
+
if (effect?.effectType === 'Ability') {
|
674 |
+
if (this.gen <= 5) this.effectState.duration = 0;
|
675 |
+
this.add('-weather', 'Hail', '[from] ability: ' + effect.name, `[of] ${source}`);
|
676 |
+
} else {
|
677 |
+
this.add('-weather', 'Hail');
|
678 |
+
}
|
679 |
+
},
|
680 |
+
onFieldResidualOrder: 1,
|
681 |
+
onFieldResidual() {
|
682 |
+
this.add('-weather', 'Hail', '[upkeep]');
|
683 |
+
if (this.field.isWeather('hail')) this.eachEvent('Weather');
|
684 |
+
},
|
685 |
+
onWeather(target) {
|
686 |
+
this.damage(target.baseMaxhp / 16);
|
687 |
+
},
|
688 |
+
onFieldEnd() {
|
689 |
+
this.add('-weather', 'none');
|
690 |
+
},
|
691 |
+
},
|
692 |
+
snowscape: {
|
693 |
+
name: 'Snowscape',
|
694 |
+
effectType: 'Weather',
|
695 |
+
duration: 5,
|
696 |
+
durationCallback(source, effect) {
|
697 |
+
if (source?.hasItem('icyrock')) {
|
698 |
+
return 8;
|
699 |
+
}
|
700 |
+
return 5;
|
701 |
+
},
|
702 |
+
onModifyDefPriority: 10,
|
703 |
+
onModifyDef(def, pokemon) {
|
704 |
+
if (pokemon.hasType('Ice') && this.field.isWeather('snowscape')) {
|
705 |
+
return this.modify(def, 1.5);
|
706 |
+
}
|
707 |
+
},
|
708 |
+
onFieldStart(field, source, effect) {
|
709 |
+
if (effect?.effectType === 'Ability') {
|
710 |
+
if (this.gen <= 5) this.effectState.duration = 0;
|
711 |
+
this.add('-weather', 'Snowscape', '[from] ability: ' + effect.name, `[of] ${source}`);
|
712 |
+
} else {
|
713 |
+
this.add('-weather', 'Snowscape');
|
714 |
+
}
|
715 |
+
},
|
716 |
+
onFieldResidualOrder: 1,
|
717 |
+
onFieldResidual() {
|
718 |
+
this.add('-weather', 'Snowscape', '[upkeep]');
|
719 |
+
if (this.field.isWeather('snowscape')) this.eachEvent('Weather');
|
720 |
+
},
|
721 |
+
onFieldEnd() {
|
722 |
+
this.add('-weather', 'none');
|
723 |
+
},
|
724 |
+
},
|
725 |
+
deltastream: {
|
726 |
+
name: 'DeltaStream',
|
727 |
+
effectType: 'Weather',
|
728 |
+
duration: 0,
|
729 |
+
onEffectivenessPriority: -1,
|
730 |
+
onEffectiveness(typeMod, target, type, move) {
|
731 |
+
if (move && move.effectType === 'Move' && move.category !== 'Status' && type === 'Flying' && typeMod > 0) {
|
732 |
+
this.add('-fieldactivate', 'Delta Stream');
|
733 |
+
return 0;
|
734 |
+
}
|
735 |
+
},
|
736 |
+
onFieldStart(field, source, effect) {
|
737 |
+
this.add('-weather', 'DeltaStream', '[from] ability: ' + effect.name, `[of] ${source}`);
|
738 |
+
},
|
739 |
+
onFieldResidualOrder: 1,
|
740 |
+
onFieldResidual() {
|
741 |
+
this.add('-weather', 'DeltaStream', '[upkeep]');
|
742 |
+
this.eachEvent('Weather');
|
743 |
+
},
|
744 |
+
onFieldEnd() {
|
745 |
+
this.add('-weather', 'none');
|
746 |
+
},
|
747 |
+
},
|
748 |
+
|
749 |
+
dynamax: {
|
750 |
+
name: 'Dynamax',
|
751 |
+
noCopy: true,
|
752 |
+
onStart(pokemon) {
|
753 |
+
this.effectState.turns = 0;
|
754 |
+
pokemon.removeVolatile('minimize');
|
755 |
+
pokemon.removeVolatile('substitute');
|
756 |
+
if (pokemon.volatiles['torment']) {
|
757 |
+
delete pokemon.volatiles['torment'];
|
758 |
+
this.add('-end', pokemon, 'Torment', '[silent]');
|
759 |
+
}
|
760 |
+
if (['cramorantgulping', 'cramorantgorging'].includes(pokemon.species.id) && !pokemon.transformed) {
|
761 |
+
pokemon.formeChange('cramorant');
|
762 |
+
}
|
763 |
+
this.add('-start', pokemon, 'Dynamax', pokemon.gigantamax ? 'Gmax' : '');
|
764 |
+
if (pokemon.baseSpecies.name === 'Shedinja') return;
|
765 |
+
|
766 |
+
// Changes based on dynamax level, 2 is max (at LVL 10)
|
767 |
+
const ratio = 1.5 + (pokemon.dynamaxLevel * 0.05);
|
768 |
+
|
769 |
+
pokemon.maxhp = Math.floor(pokemon.maxhp * ratio);
|
770 |
+
pokemon.hp = Math.floor(pokemon.hp * ratio);
|
771 |
+
this.add('-heal', pokemon, pokemon.getHealth, '[silent]');
|
772 |
+
},
|
773 |
+
onTryAddVolatile(status, pokemon) {
|
774 |
+
if (status.id === 'flinch') return null;
|
775 |
+
},
|
776 |
+
onBeforeSwitchOutPriority: -1,
|
777 |
+
onBeforeSwitchOut(pokemon) {
|
778 |
+
pokemon.removeVolatile('dynamax');
|
779 |
+
},
|
780 |
+
onSourceModifyDamage(damage, source, target, move) {
|
781 |
+
if (move.id === 'behemothbash' || move.id === 'behemothblade' || move.id === 'dynamaxcannon') {
|
782 |
+
return this.chainModify(2);
|
783 |
+
}
|
784 |
+
},
|
785 |
+
onDragOutPriority: 2,
|
786 |
+
onDragOut(pokemon) {
|
787 |
+
this.add('-block', pokemon, 'Dynamax');
|
788 |
+
return null;
|
789 |
+
},
|
790 |
+
onResidualPriority: -100,
|
791 |
+
onResidual() {
|
792 |
+
this.effectState.turns++;
|
793 |
+
},
|
794 |
+
onEnd(pokemon) {
|
795 |
+
this.add('-end', pokemon, 'Dynamax');
|
796 |
+
if (pokemon.baseSpecies.name === 'Shedinja') return;
|
797 |
+
pokemon.hp = pokemon.getUndynamaxedHP();
|
798 |
+
pokemon.maxhp = pokemon.baseMaxhp;
|
799 |
+
this.add('-heal', pokemon, pokemon.getHealth, '[silent]');
|
800 |
+
},
|
801 |
+
},
|
802 |
+
|
803 |
+
// Commander needs two conditions so they are implemented here
|
804 |
+
// Dondozo
|
805 |
+
commanded: {
|
806 |
+
name: "Commanded",
|
807 |
+
noCopy: true,
|
808 |
+
onStart(pokemon) {
|
809 |
+
this.boost({ atk: 2, spa: 2, spe: 2, def: 2, spd: 2 }, pokemon);
|
810 |
+
},
|
811 |
+
onDragOutPriority: 2,
|
812 |
+
onDragOut() {
|
813 |
+
return false;
|
814 |
+
},
|
815 |
+
// Prevents Shed Shell allowing a swap
|
816 |
+
onTrapPokemonPriority: -11,
|
817 |
+
onTrapPokemon(pokemon) {
|
818 |
+
pokemon.trapped = true;
|
819 |
+
},
|
820 |
+
},
|
821 |
+
// Tatsugiri
|
822 |
+
commanding: {
|
823 |
+
name: "Commanding",
|
824 |
+
noCopy: true,
|
825 |
+
onDragOutPriority: 2,
|
826 |
+
onDragOut() {
|
827 |
+
return false;
|
828 |
+
},
|
829 |
+
// Prevents Shed Shell allowing a swap
|
830 |
+
onTrapPokemonPriority: -11,
|
831 |
+
onTrapPokemon(pokemon) {
|
832 |
+
pokemon.trapped = true;
|
833 |
+
},
|
834 |
+
// Dodging moves is handled in BattleActions#hitStepInvulnerabilityEvent
|
835 |
+
// This is here for moves that manually call this event like Perish Song
|
836 |
+
onInvulnerability: false,
|
837 |
+
onBeforeTurn(pokemon) {
|
838 |
+
this.queue.cancelAction(pokemon);
|
839 |
+
},
|
840 |
+
},
|
841 |
+
|
842 |
+
// Arceus and Silvally's actual typing is implemented here.
|
843 |
+
// Their true typing for all their formes is Normal, and it's only
|
844 |
+
// Multitype and RKS System, respectively, that changes their type,
|
845 |
+
// but their formes are specified to be their corresponding type
|
846 |
+
// in the Pokedex, so that needs to be overridden.
|
847 |
+
// This is mainly relevant for Hackmons Cup and Balanced Hackmons.
|
848 |
+
arceus: {
|
849 |
+
name: 'Arceus',
|
850 |
+
onTypePriority: 1,
|
851 |
+
onType(types, pokemon) {
|
852 |
+
if (pokemon.transformed || pokemon.ability !== 'multitype' && this.gen >= 8) return types;
|
853 |
+
let type: string | undefined = 'Normal';
|
854 |
+
if (pokemon.ability === 'multitype') {
|
855 |
+
type = pokemon.getItem().onPlate;
|
856 |
+
if (!type) {
|
857 |
+
type = 'Normal';
|
858 |
+
}
|
859 |
+
}
|
860 |
+
return [type];
|
861 |
+
},
|
862 |
+
},
|
863 |
+
silvally: {
|
864 |
+
name: 'Silvally',
|
865 |
+
onTypePriority: 1,
|
866 |
+
onType(types, pokemon) {
|
867 |
+
if (pokemon.transformed || pokemon.ability !== 'rkssystem' && this.gen >= 8) return types;
|
868 |
+
let type: string | undefined = 'Normal';
|
869 |
+
if (pokemon.ability === 'rkssystem') {
|
870 |
+
type = pokemon.getItem().onMemory;
|
871 |
+
if (!type) {
|
872 |
+
type = 'Normal';
|
873 |
+
}
|
874 |
+
}
|
875 |
+
return [type];
|
876 |
+
},
|
877 |
+
},
|
878 |
+
rolloutstorage: {
|
879 |
+
name: 'rolloutstorage',
|
880 |
+
duration: 2,
|
881 |
+
onBasePower(relayVar, source, target, move) {
|
882 |
+
let bp = Math.max(1, move.basePower);
|
883 |
+
bp *= 2 ** source.volatiles['rolloutstorage'].contactHitCount;
|
884 |
+
if (source.volatiles['defensecurl']) {
|
885 |
+
bp *= 2;
|
886 |
+
}
|
887 |
+
source.removeVolatile('rolloutstorage');
|
888 |
+
return bp;
|
889 |
+
},
|
890 |
+
},
|
891 |
+
};
|
data/formats-data.ts
ADDED
@@ -0,0 +1,6041 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable = {
|
2 |
+
bulbasaur: {
|
3 |
+
tier: "LC",
|
4 |
+
},
|
5 |
+
ivysaur: {
|
6 |
+
tier: "NFE",
|
7 |
+
},
|
8 |
+
venusaur: {
|
9 |
+
tier: "PU",
|
10 |
+
doublesTier: "(DUU)",
|
11 |
+
natDexTier: "RU",
|
12 |
+
},
|
13 |
+
venusaurmega: {
|
14 |
+
isNonstandard: "Past",
|
15 |
+
tier: "Illegal",
|
16 |
+
natDexTier: "UU",
|
17 |
+
},
|
18 |
+
venusaurgmax: {
|
19 |
+
isNonstandard: "Past",
|
20 |
+
tier: "Illegal",
|
21 |
+
},
|
22 |
+
charmander: {
|
23 |
+
tier: "LC",
|
24 |
+
},
|
25 |
+
charmeleon: {
|
26 |
+
tier: "NFE",
|
27 |
+
},
|
28 |
+
charizard: {
|
29 |
+
tier: "ZU",
|
30 |
+
doublesTier: "(DUU)",
|
31 |
+
natDexTier: "RU",
|
32 |
+
},
|
33 |
+
charizardmegax: {
|
34 |
+
isNonstandard: "Past",
|
35 |
+
tier: "Illegal",
|
36 |
+
natDexTier: "UUBL",
|
37 |
+
},
|
38 |
+
charizardmegay: {
|
39 |
+
isNonstandard: "Past",
|
40 |
+
tier: "Illegal",
|
41 |
+
natDexTier: "OU",
|
42 |
+
},
|
43 |
+
charizardgmax: {
|
44 |
+
isNonstandard: "Past",
|
45 |
+
tier: "Illegal",
|
46 |
+
},
|
47 |
+
squirtle: {
|
48 |
+
tier: "LC",
|
49 |
+
},
|
50 |
+
wartortle: {
|
51 |
+
tier: "NFE",
|
52 |
+
},
|
53 |
+
blastoise: {
|
54 |
+
tier: "RUBL",
|
55 |
+
doublesTier: "(DUU)",
|
56 |
+
natDexTier: "RU",
|
57 |
+
},
|
58 |
+
blastoisemega: {
|
59 |
+
isNonstandard: "Past",
|
60 |
+
tier: "Illegal",
|
61 |
+
natDexTier: "Uber",
|
62 |
+
},
|
63 |
+
blastoisegmax: {
|
64 |
+
isNonstandard: "Past",
|
65 |
+
tier: "Illegal",
|
66 |
+
},
|
67 |
+
caterpie: {
|
68 |
+
isNonstandard: "Past",
|
69 |
+
tier: "Illegal",
|
70 |
+
natDexTier: "LC",
|
71 |
+
},
|
72 |
+
metapod: {
|
73 |
+
isNonstandard: "Past",
|
74 |
+
tier: "Illegal",
|
75 |
+
natDexTier: "NFE",
|
76 |
+
},
|
77 |
+
butterfree: {
|
78 |
+
isNonstandard: "Past",
|
79 |
+
tier: "Illegal",
|
80 |
+
natDexTier: "RU",
|
81 |
+
},
|
82 |
+
butterfreegmax: {
|
83 |
+
isNonstandard: "Past",
|
84 |
+
tier: "Illegal",
|
85 |
+
},
|
86 |
+
weedle: {
|
87 |
+
isNonstandard: "Past",
|
88 |
+
tier: "Illegal",
|
89 |
+
natDexTier: "LC",
|
90 |
+
},
|
91 |
+
kakuna: {
|
92 |
+
isNonstandard: "Past",
|
93 |
+
tier: "Illegal",
|
94 |
+
natDexTier: "NFE",
|
95 |
+
},
|
96 |
+
beedrill: {
|
97 |
+
isNonstandard: "Past",
|
98 |
+
tier: "Illegal",
|
99 |
+
natDexTier: "RU",
|
100 |
+
},
|
101 |
+
beedrillmega: {
|
102 |
+
isNonstandard: "Past",
|
103 |
+
tier: "Illegal",
|
104 |
+
natDexTier: "UU",
|
105 |
+
},
|
106 |
+
pidgey: {
|
107 |
+
isNonstandard: "Past",
|
108 |
+
tier: "Illegal",
|
109 |
+
natDexTier: "LC",
|
110 |
+
},
|
111 |
+
pidgeotto: {
|
112 |
+
isNonstandard: "Past",
|
113 |
+
tier: "Illegal",
|
114 |
+
natDexTier: "NFE",
|
115 |
+
},
|
116 |
+
pidgeot: {
|
117 |
+
isNonstandard: "Past",
|
118 |
+
tier: "Illegal",
|
119 |
+
natDexTier: "RU",
|
120 |
+
},
|
121 |
+
pidgeotmega: {
|
122 |
+
isNonstandard: "Past",
|
123 |
+
tier: "Illegal",
|
124 |
+
natDexTier: "RU",
|
125 |
+
},
|
126 |
+
rattata: {
|
127 |
+
isNonstandard: "Past",
|
128 |
+
tier: "Illegal",
|
129 |
+
natDexTier: "LC",
|
130 |
+
},
|
131 |
+
rattataalola: {
|
132 |
+
isNonstandard: "Past",
|
133 |
+
tier: "Illegal",
|
134 |
+
natDexTier: "LC",
|
135 |
+
},
|
136 |
+
raticate: {
|
137 |
+
isNonstandard: "Past",
|
138 |
+
tier: "Illegal",
|
139 |
+
natDexTier: "RU",
|
140 |
+
},
|
141 |
+
raticatealola: {
|
142 |
+
isNonstandard: "Past",
|
143 |
+
tier: "Illegal",
|
144 |
+
natDexTier: "RU",
|
145 |
+
},
|
146 |
+
raticatealolatotem: {
|
147 |
+
isNonstandard: "Past",
|
148 |
+
tier: "Illegal",
|
149 |
+
},
|
150 |
+
spearow: {
|
151 |
+
isNonstandard: "Past",
|
152 |
+
tier: "Illegal",
|
153 |
+
natDexTier: "LC",
|
154 |
+
},
|
155 |
+
fearow: {
|
156 |
+
isNonstandard: "Past",
|
157 |
+
tier: "Illegal",
|
158 |
+
natDexTier: "RU",
|
159 |
+
},
|
160 |
+
ekans: {
|
161 |
+
tier: "LC",
|
162 |
+
},
|
163 |
+
arbok: {
|
164 |
+
tier: "ZU",
|
165 |
+
doublesTier: "(DUU)",
|
166 |
+
natDexTier: "RU",
|
167 |
+
},
|
168 |
+
pichu: {
|
169 |
+
tier: "LC",
|
170 |
+
},
|
171 |
+
pichuspikyeared: {
|
172 |
+
isNonstandard: "Past",
|
173 |
+
tier: "Illegal",
|
174 |
+
},
|
175 |
+
pikachu: {
|
176 |
+
tier: "ZU",
|
177 |
+
doublesTier: "(DUU)",
|
178 |
+
natDexTier: "RU",
|
179 |
+
},
|
180 |
+
pikachucosplay: {
|
181 |
+
isNonstandard: "Past",
|
182 |
+
tier: "Illegal",
|
183 |
+
},
|
184 |
+
pikachurockstar: {
|
185 |
+
isNonstandard: "Past",
|
186 |
+
tier: "Illegal",
|
187 |
+
},
|
188 |
+
pikachubelle: {
|
189 |
+
isNonstandard: "Past",
|
190 |
+
tier: "Illegal",
|
191 |
+
},
|
192 |
+
pikachupopstar: {
|
193 |
+
isNonstandard: "Past",
|
194 |
+
tier: "Illegal",
|
195 |
+
},
|
196 |
+
pikachuphd: {
|
197 |
+
isNonstandard: "Past",
|
198 |
+
tier: "Illegal",
|
199 |
+
},
|
200 |
+
pikachulibre: {
|
201 |
+
isNonstandard: "Past",
|
202 |
+
tier: "Illegal",
|
203 |
+
},
|
204 |
+
pikachuoriginal: {
|
205 |
+
tier: "ZU",
|
206 |
+
doublesTier: "(DUU)",
|
207 |
+
natDexTier: "RU",
|
208 |
+
},
|
209 |
+
pikachuhoenn: {
|
210 |
+
tier: "ZU",
|
211 |
+
doublesTier: "(DUU)",
|
212 |
+
natDexTier: "RU",
|
213 |
+
},
|
214 |
+
pikachusinnoh: {
|
215 |
+
tier: "ZU",
|
216 |
+
doublesTier: "(DUU)",
|
217 |
+
natDexTier: "RU",
|
218 |
+
},
|
219 |
+
pikachuunova: {
|
220 |
+
tier: "ZU",
|
221 |
+
doublesTier: "(DUU)",
|
222 |
+
natDexTier: "RU",
|
223 |
+
},
|
224 |
+
pikachukalos: {
|
225 |
+
tier: "ZU",
|
226 |
+
doublesTier: "(DUU)",
|
227 |
+
natDexTier: "RU",
|
228 |
+
},
|
229 |
+
pikachualola: {
|
230 |
+
tier: "ZU",
|
231 |
+
doublesTier: "(DUU)",
|
232 |
+
natDexTier: "RU",
|
233 |
+
},
|
234 |
+
pikachupartner: {
|
235 |
+
tier: "ZU",
|
236 |
+
doublesTier: "(DUU)",
|
237 |
+
natDexTier: "RU",
|
238 |
+
},
|
239 |
+
pikachustarter: {
|
240 |
+
isNonstandard: "LGPE",
|
241 |
+
tier: "Illegal",
|
242 |
+
},
|
243 |
+
pikachugmax: {
|
244 |
+
isNonstandard: "Past",
|
245 |
+
tier: "Illegal",
|
246 |
+
},
|
247 |
+
pikachuworld: {
|
248 |
+
tier: "ZU",
|
249 |
+
doublesTier: "(DUU)",
|
250 |
+
natDexTier: "RU",
|
251 |
+
},
|
252 |
+
raichu: {
|
253 |
+
tier: "ZU",
|
254 |
+
doublesTier: "(DUU)",
|
255 |
+
natDexTier: "RU",
|
256 |
+
},
|
257 |
+
raichualola: {
|
258 |
+
tier: "ZU",
|
259 |
+
doublesTier: "(DUU)",
|
260 |
+
natDexTier: "RU",
|
261 |
+
},
|
262 |
+
sandshrew: {
|
263 |
+
tier: "LC",
|
264 |
+
},
|
265 |
+
sandshrewalola: {
|
266 |
+
tier: "LC",
|
267 |
+
},
|
268 |
+
sandslash: {
|
269 |
+
tier: "ZU",
|
270 |
+
doublesTier: "(DUU)",
|
271 |
+
natDexTier: "RU",
|
272 |
+
},
|
273 |
+
sandslashalola: {
|
274 |
+
tier: "PU",
|
275 |
+
doublesTier: "(DUU)",
|
276 |
+
natDexTier: "RU",
|
277 |
+
},
|
278 |
+
nidoranf: {
|
279 |
+
isNonstandard: "Past",
|
280 |
+
tier: "Illegal",
|
281 |
+
natDexTier: "LC",
|
282 |
+
},
|
283 |
+
nidorina: {
|
284 |
+
isNonstandard: "Past",
|
285 |
+
tier: "Illegal",
|
286 |
+
natDexTier: "NFE",
|
287 |
+
},
|
288 |
+
nidoqueen: {
|
289 |
+
isNonstandard: "Past",
|
290 |
+
tier: "Illegal",
|
291 |
+
natDexTier: "RU",
|
292 |
+
},
|
293 |
+
nidoranm: {
|
294 |
+
isNonstandard: "Past",
|
295 |
+
tier: "Illegal",
|
296 |
+
natDexTier: "LC",
|
297 |
+
},
|
298 |
+
nidorino: {
|
299 |
+
isNonstandard: "Past",
|
300 |
+
tier: "Illegal",
|
301 |
+
natDexTier: "NFE",
|
302 |
+
},
|
303 |
+
nidoking: {
|
304 |
+
isNonstandard: "Past",
|
305 |
+
tier: "Illegal",
|
306 |
+
natDexTier: "RU",
|
307 |
+
},
|
308 |
+
cleffa: {
|
309 |
+
tier: "LC",
|
310 |
+
},
|
311 |
+
clefairy: {
|
312 |
+
tier: "NFE",
|
313 |
+
doublesTier: "DUU",
|
314 |
+
natDexTier: "NFE",
|
315 |
+
},
|
316 |
+
clefable: {
|
317 |
+
tier: "OU",
|
318 |
+
doublesTier: "(DUU)",
|
319 |
+
natDexTier: "UU",
|
320 |
+
},
|
321 |
+
vulpix: {
|
322 |
+
tier: "NFE",
|
323 |
+
doublesTier: "NFE",
|
324 |
+
natDexTier: "LC",
|
325 |
+
},
|
326 |
+
vulpixalola: {
|
327 |
+
tier: "NFE",
|
328 |
+
},
|
329 |
+
ninetales: {
|
330 |
+
tier: "ZU",
|
331 |
+
doublesTier: "DUU",
|
332 |
+
natDexTier: "RU",
|
333 |
+
},
|
334 |
+
ninetalesalola: {
|
335 |
+
tier: "NU",
|
336 |
+
doublesTier: "DOU",
|
337 |
+
natDexTier: "RU",
|
338 |
+
},
|
339 |
+
igglybuff: {
|
340 |
+
tier: "LC",
|
341 |
+
},
|
342 |
+
jigglypuff: {
|
343 |
+
tier: "NFE",
|
344 |
+
},
|
345 |
+
wigglytuff: {
|
346 |
+
tier: "ZU",
|
347 |
+
doublesTier: "(DUU)",
|
348 |
+
natDexTier: "RU",
|
349 |
+
},
|
350 |
+
zubat: {
|
351 |
+
isNonstandard: "Past",
|
352 |
+
tier: "Illegal",
|
353 |
+
natDexTier: "LC",
|
354 |
+
},
|
355 |
+
golbat: {
|
356 |
+
isNonstandard: "Past",
|
357 |
+
tier: "Illegal",
|
358 |
+
natDexTier: "NFE",
|
359 |
+
},
|
360 |
+
crobat: {
|
361 |
+
isNonstandard: "Past",
|
362 |
+
tier: "Illegal",
|
363 |
+
natDexTier: "RU",
|
364 |
+
},
|
365 |
+
oddish: {
|
366 |
+
tier: "LC",
|
367 |
+
},
|
368 |
+
gloom: {
|
369 |
+
tier: "NFE",
|
370 |
+
},
|
371 |
+
vileplume: {
|
372 |
+
tier: "NU",
|
373 |
+
doublesTier: "(DUU)",
|
374 |
+
natDexTier: "RU",
|
375 |
+
},
|
376 |
+
bellossom: {
|
377 |
+
tier: "ZU",
|
378 |
+
doublesTier: "(DUU)",
|
379 |
+
natDexTier: "RU",
|
380 |
+
},
|
381 |
+
paras: {
|
382 |
+
isNonstandard: "Past",
|
383 |
+
tier: "Illegal",
|
384 |
+
natDexTier: "LC",
|
385 |
+
},
|
386 |
+
parasect: {
|
387 |
+
isNonstandard: "Past",
|
388 |
+
tier: "Illegal",
|
389 |
+
natDexTier: "RU",
|
390 |
+
},
|
391 |
+
venonat: {
|
392 |
+
tier: "LC",
|
393 |
+
},
|
394 |
+
venomoth: {
|
395 |
+
tier: "ZU",
|
396 |
+
doublesTier: "(DUU)",
|
397 |
+
natDexTier: "RU",
|
398 |
+
},
|
399 |
+
diglett: {
|
400 |
+
tier: "NFE",
|
401 |
+
},
|
402 |
+
diglettalola: {
|
403 |
+
tier: "LC",
|
404 |
+
},
|
405 |
+
dugtrio: {
|
406 |
+
tier: "ZU",
|
407 |
+
doublesTier: "(DUU)",
|
408 |
+
natDexTier: "RU",
|
409 |
+
},
|
410 |
+
dugtrioalola: {
|
411 |
+
tier: "ZU",
|
412 |
+
doublesTier: "(DUU)",
|
413 |
+
natDexTier: "RU",
|
414 |
+
},
|
415 |
+
meowth: {
|
416 |
+
tier: "LC",
|
417 |
+
},
|
418 |
+
meowthalola: {
|
419 |
+
tier: "LC",
|
420 |
+
},
|
421 |
+
meowthgalar: {
|
422 |
+
tier: "LC",
|
423 |
+
},
|
424 |
+
meowthgmax: {
|
425 |
+
isNonstandard: "Past",
|
426 |
+
tier: "Illegal",
|
427 |
+
},
|
428 |
+
persian: {
|
429 |
+
tier: "ZU",
|
430 |
+
doublesTier: "(DUU)",
|
431 |
+
natDexTier: "RU",
|
432 |
+
},
|
433 |
+
persianalola: {
|
434 |
+
tier: "ZU",
|
435 |
+
doublesTier: "(DUU)",
|
436 |
+
natDexTier: "RU",
|
437 |
+
},
|
438 |
+
perrserker: {
|
439 |
+
tier: "ZU",
|
440 |
+
doublesTier: "(DUU)",
|
441 |
+
natDexTier: "RU",
|
442 |
+
},
|
443 |
+
psyduck: {
|
444 |
+
tier: "LC",
|
445 |
+
},
|
446 |
+
golduck: {
|
447 |
+
tier: "ZU",
|
448 |
+
doublesTier: "(DUU)",
|
449 |
+
natDexTier: "RU",
|
450 |
+
},
|
451 |
+
mankey: {
|
452 |
+
tier: "LC",
|
453 |
+
},
|
454 |
+
primeape: {
|
455 |
+
tier: "ZU",
|
456 |
+
doublesTier: "NFE",
|
457 |
+
natDexTier: "NFE",
|
458 |
+
},
|
459 |
+
growlithe: {
|
460 |
+
tier: "LC",
|
461 |
+
},
|
462 |
+
growlithehisui: {
|
463 |
+
tier: "LC",
|
464 |
+
},
|
465 |
+
arcanine: {
|
466 |
+
tier: "PU",
|
467 |
+
doublesTier: "DUU",
|
468 |
+
natDexTier: "RU",
|
469 |
+
},
|
470 |
+
arcaninehisui: {
|
471 |
+
tier: "UU",
|
472 |
+
doublesTier: "DUU",
|
473 |
+
natDexTier: "RU",
|
474 |
+
},
|
475 |
+
poliwag: {
|
476 |
+
tier: "LC",
|
477 |
+
},
|
478 |
+
poliwhirl: {
|
479 |
+
tier: "NFE",
|
480 |
+
},
|
481 |
+
poliwrath: {
|
482 |
+
tier: "ZU",
|
483 |
+
doublesTier: "(DUU)",
|
484 |
+
natDexTier: "RU",
|
485 |
+
},
|
486 |
+
politoed: {
|
487 |
+
tier: "RU",
|
488 |
+
doublesTier: "DUU",
|
489 |
+
natDexTier: "RU",
|
490 |
+
},
|
491 |
+
abra: {
|
492 |
+
isNonstandard: "Past",
|
493 |
+
tier: "Illegal",
|
494 |
+
natDexTier: "LC",
|
495 |
+
},
|
496 |
+
kadabra: {
|
497 |
+
isNonstandard: "Past",
|
498 |
+
tier: "Illegal",
|
499 |
+
natDexTier: "NFE",
|
500 |
+
},
|
501 |
+
alakazam: {
|
502 |
+
isNonstandard: "Past",
|
503 |
+
tier: "Illegal",
|
504 |
+
natDexTier: "RUBL",
|
505 |
+
},
|
506 |
+
alakazammega: {
|
507 |
+
isNonstandard: "Past",
|
508 |
+
tier: "Illegal",
|
509 |
+
natDexTier: "Uber",
|
510 |
+
},
|
511 |
+
machop: {
|
512 |
+
isNonstandard: "Past",
|
513 |
+
tier: "Illegal",
|
514 |
+
natDexTier: "LC",
|
515 |
+
},
|
516 |
+
machoke: {
|
517 |
+
isNonstandard: "Past",
|
518 |
+
tier: "Illegal",
|
519 |
+
natDexTier: "NFE",
|
520 |
+
},
|
521 |
+
machamp: {
|
522 |
+
isNonstandard: "Past",
|
523 |
+
tier: "Illegal",
|
524 |
+
natDexTier: "RU",
|
525 |
+
},
|
526 |
+
machampgmax: {
|
527 |
+
isNonstandard: "Past",
|
528 |
+
tier: "Illegal",
|
529 |
+
},
|
530 |
+
bellsprout: {
|
531 |
+
tier: "LC",
|
532 |
+
},
|
533 |
+
weepinbell: {
|
534 |
+
tier: "NFE",
|
535 |
+
},
|
536 |
+
victreebel: {
|
537 |
+
tier: "ZU",
|
538 |
+
doublesTier: "(DUU)",
|
539 |
+
natDexTier: "RU",
|
540 |
+
},
|
541 |
+
tentacool: {
|
542 |
+
tier: "LC",
|
543 |
+
},
|
544 |
+
tentacruel: {
|
545 |
+
tier: "NU",
|
546 |
+
doublesTier: "(DUU)",
|
547 |
+
natDexTier: "RU",
|
548 |
+
},
|
549 |
+
geodude: {
|
550 |
+
tier: "LC",
|
551 |
+
},
|
552 |
+
geodudealola: {
|
553 |
+
tier: "LC",
|
554 |
+
},
|
555 |
+
graveler: {
|
556 |
+
tier: "NFE",
|
557 |
+
},
|
558 |
+
graveleralola: {
|
559 |
+
tier: "NFE",
|
560 |
+
},
|
561 |
+
golem: {
|
562 |
+
tier: "ZU",
|
563 |
+
doublesTier: "(DUU)",
|
564 |
+
natDexTier: "RU",
|
565 |
+
},
|
566 |
+
golemalola: {
|
567 |
+
tier: "ZU",
|
568 |
+
doublesTier: "(DUU)",
|
569 |
+
natDexTier: "RU",
|
570 |
+
},
|
571 |
+
ponyta: {
|
572 |
+
isNonstandard: "Past",
|
573 |
+
tier: "Illegal",
|
574 |
+
natDexTier: "LC",
|
575 |
+
},
|
576 |
+
ponytagalar: {
|
577 |
+
isNonstandard: "Past",
|
578 |
+
tier: "Illegal",
|
579 |
+
natDexTier: "LC",
|
580 |
+
},
|
581 |
+
rapidash: {
|
582 |
+
isNonstandard: "Past",
|
583 |
+
tier: "Illegal",
|
584 |
+
natDexTier: "RU",
|
585 |
+
},
|
586 |
+
rapidashgalar: {
|
587 |
+
isNonstandard: "Past",
|
588 |
+
tier: "Illegal",
|
589 |
+
natDexTier: "RU",
|
590 |
+
},
|
591 |
+
slowpoke: {
|
592 |
+
tier: "LC",
|
593 |
+
},
|
594 |
+
slowpokegalar: {
|
595 |
+
tier: "LC",
|
596 |
+
},
|
597 |
+
slowbro: {
|
598 |
+
tier: "RU",
|
599 |
+
doublesTier: "(DUU)",
|
600 |
+
natDexTier: "UU",
|
601 |
+
},
|
602 |
+
slowbromega: {
|
603 |
+
isNonstandard: "Past",
|
604 |
+
tier: "Illegal",
|
605 |
+
natDexTier: "RU",
|
606 |
+
},
|
607 |
+
slowbrogalar: {
|
608 |
+
tier: "NU",
|
609 |
+
doublesTier: "(DUU)",
|
610 |
+
natDexTier: "RU",
|
611 |
+
},
|
612 |
+
slowking: {
|
613 |
+
tier: "UU",
|
614 |
+
doublesTier: "(DUU)",
|
615 |
+
natDexTier: "RU",
|
616 |
+
},
|
617 |
+
slowkinggalar: {
|
618 |
+
tier: "OU",
|
619 |
+
doublesTier: "(DUU)",
|
620 |
+
natDexTier: "OU",
|
621 |
+
},
|
622 |
+
magnemite: {
|
623 |
+
tier: "LC",
|
624 |
+
},
|
625 |
+
magneton: {
|
626 |
+
tier: "ZU",
|
627 |
+
doublesTier: "NFE",
|
628 |
+
natDexTier: "NFE",
|
629 |
+
},
|
630 |
+
magnezone: {
|
631 |
+
tier: "RU",
|
632 |
+
doublesTier: "(DUU)",
|
633 |
+
natDexTier: "UU",
|
634 |
+
},
|
635 |
+
farfetchd: {
|
636 |
+
isNonstandard: "Past",
|
637 |
+
tier: "Illegal",
|
638 |
+
natDexTier: "RU",
|
639 |
+
},
|
640 |
+
farfetchdgalar: {
|
641 |
+
isNonstandard: "Past",
|
642 |
+
tier: "Illegal",
|
643 |
+
natDexTier: "LC",
|
644 |
+
},
|
645 |
+
sirfetchd: {
|
646 |
+
isNonstandard: "Past",
|
647 |
+
tier: "Illegal",
|
648 |
+
natDexTier: "RU",
|
649 |
+
},
|
650 |
+
doduo: {
|
651 |
+
tier: "LC",
|
652 |
+
},
|
653 |
+
dodrio: {
|
654 |
+
tier: "ZU",
|
655 |
+
doublesTier: "(DUU)",
|
656 |
+
natDexTier: "RU",
|
657 |
+
},
|
658 |
+
seel: {
|
659 |
+
tier: "LC",
|
660 |
+
},
|
661 |
+
dewgong: {
|
662 |
+
tier: "ZU",
|
663 |
+
doublesTier: "(DUU)",
|
664 |
+
natDexTier: "RU",
|
665 |
+
},
|
666 |
+
grimer: {
|
667 |
+
tier: "LC",
|
668 |
+
},
|
669 |
+
grimeralola: {
|
670 |
+
tier: "LC",
|
671 |
+
},
|
672 |
+
muk: {
|
673 |
+
tier: "ZU",
|
674 |
+
doublesTier: "(DUU)",
|
675 |
+
natDexTier: "RU",
|
676 |
+
},
|
677 |
+
mukalola: {
|
678 |
+
tier: "NU",
|
679 |
+
doublesTier: "(DUU)",
|
680 |
+
natDexTier: "RU",
|
681 |
+
},
|
682 |
+
shellder: {
|
683 |
+
tier: "LC",
|
684 |
+
},
|
685 |
+
cloyster: {
|
686 |
+
tier: "NUBL",
|
687 |
+
doublesTier: "(DUU)",
|
688 |
+
natDexTier: "RU",
|
689 |
+
},
|
690 |
+
gastly: {
|
691 |
+
tier: "NFE",
|
692 |
+
},
|
693 |
+
haunter: {
|
694 |
+
tier: "NFE",
|
695 |
+
},
|
696 |
+
gengar: {
|
697 |
+
tier: "RU",
|
698 |
+
doublesTier: "(DUU)",
|
699 |
+
natDexTier: "RUBL",
|
700 |
+
},
|
701 |
+
gengarmega: {
|
702 |
+
isNonstandard: "Past",
|
703 |
+
tier: "Illegal",
|
704 |
+
natDexTier: "AG",
|
705 |
+
},
|
706 |
+
gengargmax: {
|
707 |
+
isNonstandard: "Past",
|
708 |
+
tier: "Illegal",
|
709 |
+
},
|
710 |
+
onix: {
|
711 |
+
isNonstandard: "Past",
|
712 |
+
tier: "Illegal",
|
713 |
+
natDexTier: "LC",
|
714 |
+
},
|
715 |
+
steelix: {
|
716 |
+
isNonstandard: "Past",
|
717 |
+
tier: "Illegal",
|
718 |
+
natDexTier: "RU",
|
719 |
+
},
|
720 |
+
steelixmega: {
|
721 |
+
isNonstandard: "Past",
|
722 |
+
tier: "Illegal",
|
723 |
+
natDexTier: "RU",
|
724 |
+
},
|
725 |
+
drowzee: {
|
726 |
+
tier: "LC",
|
727 |
+
},
|
728 |
+
hypno: {
|
729 |
+
tier: "ZU",
|
730 |
+
doublesTier: "(DUU)",
|
731 |
+
natDexTier: "RU",
|
732 |
+
},
|
733 |
+
krabby: {
|
734 |
+
isNonstandard: "Past",
|
735 |
+
tier: "Illegal",
|
736 |
+
natDexTier: "LC",
|
737 |
+
},
|
738 |
+
kingler: {
|
739 |
+
isNonstandard: "Past",
|
740 |
+
tier: "Illegal",
|
741 |
+
natDexTier: "RU",
|
742 |
+
},
|
743 |
+
kinglergmax: {
|
744 |
+
isNonstandard: "Past",
|
745 |
+
tier: "Illegal",
|
746 |
+
},
|
747 |
+
voltorb: {
|
748 |
+
tier: "LC",
|
749 |
+
},
|
750 |
+
voltorbhisui: {
|
751 |
+
tier: "NFE",
|
752 |
+
doublesTier: "LC",
|
753 |
+
natDexTier: "LC",
|
754 |
+
},
|
755 |
+
electrode: {
|
756 |
+
tier: "ZU",
|
757 |
+
doublesTier: "(DUU)",
|
758 |
+
natDexTier: "RU",
|
759 |
+
},
|
760 |
+
electrodehisui: {
|
761 |
+
tier: "ZUBL",
|
762 |
+
doublesTier: "(DUU)",
|
763 |
+
natDexTier: "RU",
|
764 |
+
},
|
765 |
+
exeggcute: {
|
766 |
+
tier: "LC",
|
767 |
+
},
|
768 |
+
exeggutor: {
|
769 |
+
tier: "ZU",
|
770 |
+
doublesTier: "(DUU)",
|
771 |
+
natDexTier: "RU",
|
772 |
+
},
|
773 |
+
exeggutoralola: {
|
774 |
+
tier: "ZU",
|
775 |
+
doublesTier: "(DUU)",
|
776 |
+
natDexTier: "RU",
|
777 |
+
},
|
778 |
+
cubone: {
|
779 |
+
isNonstandard: "Past",
|
780 |
+
tier: "Illegal",
|
781 |
+
natDexTier: "LC",
|
782 |
+
},
|
783 |
+
marowak: {
|
784 |
+
isNonstandard: "Past",
|
785 |
+
tier: "Illegal",
|
786 |
+
natDexTier: "RU",
|
787 |
+
},
|
788 |
+
marowakalola: {
|
789 |
+
isNonstandard: "Past",
|
790 |
+
tier: "Illegal",
|
791 |
+
natDexTier: "RU",
|
792 |
+
},
|
793 |
+
marowakalolatotem: {
|
794 |
+
isNonstandard: "Past",
|
795 |
+
tier: "Illegal",
|
796 |
+
},
|
797 |
+
tyrogue: {
|
798 |
+
tier: "LC",
|
799 |
+
},
|
800 |
+
hitmonlee: {
|
801 |
+
tier: "ZU",
|
802 |
+
doublesTier: "(DUU)",
|
803 |
+
natDexTier: "RU",
|
804 |
+
},
|
805 |
+
hitmonchan: {
|
806 |
+
tier: "ZU",
|
807 |
+
doublesTier: "(DUU)",
|
808 |
+
natDexTier: "RU",
|
809 |
+
},
|
810 |
+
hitmontop: {
|
811 |
+
tier: "ZU",
|
812 |
+
doublesTier: "(DUU)",
|
813 |
+
natDexTier: "RU",
|
814 |
+
},
|
815 |
+
lickitung: {
|
816 |
+
isNonstandard: "Past",
|
817 |
+
tier: "Illegal",
|
818 |
+
natDexTier: "LC",
|
819 |
+
},
|
820 |
+
lickilicky: {
|
821 |
+
isNonstandard: "Past",
|
822 |
+
tier: "Illegal",
|
823 |
+
natDexTier: "RU",
|
824 |
+
},
|
825 |
+
koffing: {
|
826 |
+
tier: "LC",
|
827 |
+
},
|
828 |
+
weezing: {
|
829 |
+
tier: "ZU",
|
830 |
+
doublesTier: "(DUU)",
|
831 |
+
natDexTier: "RU",
|
832 |
+
},
|
833 |
+
weezinggalar: {
|
834 |
+
tier: "RU",
|
835 |
+
doublesTier: "(DUU)",
|
836 |
+
natDexTier: "RU",
|
837 |
+
},
|
838 |
+
rhyhorn: {
|
839 |
+
tier: "LC",
|
840 |
+
},
|
841 |
+
rhydon: {
|
842 |
+
tier: "PU",
|
843 |
+
doublesTier: "NFE",
|
844 |
+
natDexTier: "NFE",
|
845 |
+
},
|
846 |
+
rhyperior: {
|
847 |
+
tier: "RU",
|
848 |
+
doublesTier: "(DUU)",
|
849 |
+
natDexTier: "RU",
|
850 |
+
},
|
851 |
+
happiny: {
|
852 |
+
tier: "LC",
|
853 |
+
},
|
854 |
+
chansey: {
|
855 |
+
tier: "RU",
|
856 |
+
doublesTier: "NFE",
|
857 |
+
natDexTier: "UU",
|
858 |
+
},
|
859 |
+
blissey: {
|
860 |
+
tier: "OU",
|
861 |
+
doublesTier: "(DUU)",
|
862 |
+
natDexTier: "RU",
|
863 |
+
},
|
864 |
+
tangela: {
|
865 |
+
isNonstandard: "Past",
|
866 |
+
tier: "Illegal",
|
867 |
+
natDexTier: "NFE",
|
868 |
+
},
|
869 |
+
tangrowth: {
|
870 |
+
isNonstandard: "Past",
|
871 |
+
tier: "Illegal",
|
872 |
+
natDexTier: "RU",
|
873 |
+
},
|
874 |
+
kangaskhan: {
|
875 |
+
isNonstandard: "Past",
|
876 |
+
tier: "Illegal",
|
877 |
+
natDexTier: "RU",
|
878 |
+
},
|
879 |
+
kangaskhanmega: {
|
880 |
+
isNonstandard: "Past",
|
881 |
+
tier: "Illegal",
|
882 |
+
natDexTier: "Uber",
|
883 |
+
},
|
884 |
+
horsea: {
|
885 |
+
tier: "LC",
|
886 |
+
},
|
887 |
+
seadra: {
|
888 |
+
tier: "NFE",
|
889 |
+
},
|
890 |
+
kingdra: {
|
891 |
+
tier: "ZUBL",
|
892 |
+
doublesTier: "(DUU)",
|
893 |
+
natDexTier: "RU",
|
894 |
+
},
|
895 |
+
goldeen: {
|
896 |
+
isNonstandard: "Past",
|
897 |
+
tier: "Illegal",
|
898 |
+
natDexTier: "LC",
|
899 |
+
},
|
900 |
+
seaking: {
|
901 |
+
isNonstandard: "Past",
|
902 |
+
tier: "Illegal",
|
903 |
+
natDexTier: "RU",
|
904 |
+
},
|
905 |
+
staryu: {
|
906 |
+
isNonstandard: "Past",
|
907 |
+
tier: "Illegal",
|
908 |
+
natDexTier: "LC",
|
909 |
+
},
|
910 |
+
starmie: {
|
911 |
+
isNonstandard: "Past",
|
912 |
+
tier: "Illegal",
|
913 |
+
natDexTier: "RU",
|
914 |
+
},
|
915 |
+
mimejr: {
|
916 |
+
isNonstandard: "Past",
|
917 |
+
tier: "Illegal",
|
918 |
+
natDexTier: "LC",
|
919 |
+
},
|
920 |
+
mrmime: {
|
921 |
+
isNonstandard: "Past",
|
922 |
+
tier: "Illegal",
|
923 |
+
natDexTier: "RU",
|
924 |
+
},
|
925 |
+
mrmimegalar: {
|
926 |
+
isNonstandard: "Past",
|
927 |
+
tier: "Illegal",
|
928 |
+
natDexTier: "NFE",
|
929 |
+
},
|
930 |
+
mrrime: {
|
931 |
+
isNonstandard: "Past",
|
932 |
+
tier: "Illegal",
|
933 |
+
natDexTier: "RU",
|
934 |
+
},
|
935 |
+
scyther: {
|
936 |
+
tier: "NU",
|
937 |
+
doublesTier: "NFE",
|
938 |
+
natDexTier: "NFE",
|
939 |
+
},
|
940 |
+
scizor: {
|
941 |
+
tier: "UU",
|
942 |
+
doublesTier: "DUU",
|
943 |
+
natDexTier: "UU",
|
944 |
+
},
|
945 |
+
scizormega: {
|
946 |
+
isNonstandard: "Past",
|
947 |
+
tier: "Illegal",
|
948 |
+
natDexTier: "OU",
|
949 |
+
},
|
950 |
+
kleavor: {
|
951 |
+
tier: "RU",
|
952 |
+
doublesTier: "(DUU)",
|
953 |
+
natDexTier: "RU",
|
954 |
+
},
|
955 |
+
smoochum: {
|
956 |
+
isNonstandard: "Past",
|
957 |
+
tier: "Illegal",
|
958 |
+
natDexTier: "LC",
|
959 |
+
},
|
960 |
+
jynx: {
|
961 |
+
isNonstandard: "Past",
|
962 |
+
tier: "Illegal",
|
963 |
+
natDexTier: "RU",
|
964 |
+
},
|
965 |
+
elekid: {
|
966 |
+
tier: "LC",
|
967 |
+
},
|
968 |
+
electabuzz: {
|
969 |
+
tier: "NFE",
|
970 |
+
},
|
971 |
+
electivire: {
|
972 |
+
tier: "ZU",
|
973 |
+
doublesTier: "(DUU)",
|
974 |
+
natDexTier: "RU",
|
975 |
+
},
|
976 |
+
magby: {
|
977 |
+
tier: "LC",
|
978 |
+
},
|
979 |
+
magmar: {
|
980 |
+
tier: "NFE",
|
981 |
+
},
|
982 |
+
magmortar: {
|
983 |
+
tier: "ZU",
|
984 |
+
doublesTier: "(DUU)",
|
985 |
+
natDexTier: "RU",
|
986 |
+
},
|
987 |
+
pinsir: {
|
988 |
+
isNonstandard: "Past",
|
989 |
+
tier: "Illegal",
|
990 |
+
natDexTier: "RU",
|
991 |
+
},
|
992 |
+
pinsirmega: {
|
993 |
+
isNonstandard: "Past",
|
994 |
+
tier: "Illegal",
|
995 |
+
natDexTier: "UUBL",
|
996 |
+
},
|
997 |
+
tauros: {
|
998 |
+
tier: "ZU",
|
999 |
+
doublesTier: "(DUU)",
|
1000 |
+
natDexTier: "RU",
|
1001 |
+
},
|
1002 |
+
taurospaldeacombat: {
|
1003 |
+
tier: "ZU",
|
1004 |
+
doublesTier: "(DUU)",
|
1005 |
+
natDexTier: "RU",
|
1006 |
+
},
|
1007 |
+
taurospaldeablaze: {
|
1008 |
+
tier: "PU",
|
1009 |
+
doublesTier: "(DUU)",
|
1010 |
+
natDexTier: "RU",
|
1011 |
+
},
|
1012 |
+
taurospaldeaaqua: {
|
1013 |
+
tier: "NU",
|
1014 |
+
doublesTier: "(DUU)",
|
1015 |
+
natDexTier: "RU",
|
1016 |
+
},
|
1017 |
+
magikarp: {
|
1018 |
+
tier: "LC",
|
1019 |
+
},
|
1020 |
+
gyarados: {
|
1021 |
+
tier: "NUBL",
|
1022 |
+
doublesTier: "DUU",
|
1023 |
+
natDexTier: "UUBL",
|
1024 |
+
},
|
1025 |
+
gyaradosmega: {
|
1026 |
+
isNonstandard: "Past",
|
1027 |
+
tier: "Illegal",
|
1028 |
+
natDexTier: "UUBL",
|
1029 |
+
},
|
1030 |
+
lapras: {
|
1031 |
+
tier: "ZU",
|
1032 |
+
doublesTier: "(DUU)",
|
1033 |
+
natDexTier: "RU",
|
1034 |
+
},
|
1035 |
+
laprasgmax: {
|
1036 |
+
isNonstandard: "Past",
|
1037 |
+
tier: "Illegal",
|
1038 |
+
},
|
1039 |
+
ditto: {
|
1040 |
+
tier: "ZU",
|
1041 |
+
doublesTier: "(DUU)",
|
1042 |
+
natDexTier: "RU",
|
1043 |
+
},
|
1044 |
+
eevee: {
|
1045 |
+
tier: "LC",
|
1046 |
+
},
|
1047 |
+
eeveestarter: {
|
1048 |
+
isNonstandard: "LGPE",
|
1049 |
+
tier: "Illegal",
|
1050 |
+
},
|
1051 |
+
eeveegmax: {
|
1052 |
+
isNonstandard: "Past",
|
1053 |
+
tier: "Illegal",
|
1054 |
+
},
|
1055 |
+
vaporeon: {
|
1056 |
+
tier: "NU",
|
1057 |
+
doublesTier: "(DUU)",
|
1058 |
+
natDexTier: "RU",
|
1059 |
+
},
|
1060 |
+
jolteon: {
|
1061 |
+
tier: "ZU",
|
1062 |
+
doublesTier: "(DUU)",
|
1063 |
+
natDexTier: "RU",
|
1064 |
+
},
|
1065 |
+
flareon: {
|
1066 |
+
tier: "ZU",
|
1067 |
+
doublesTier: "(DUU)",
|
1068 |
+
natDexTier: "RU",
|
1069 |
+
},
|
1070 |
+
espeon: {
|
1071 |
+
tier: "NU",
|
1072 |
+
doublesTier: "(DUU)",
|
1073 |
+
natDexTier: "RU",
|
1074 |
+
},
|
1075 |
+
umbreon: {
|
1076 |
+
tier: "RU",
|
1077 |
+
doublesTier: "(DUU)",
|
1078 |
+
natDexTier: "RU",
|
1079 |
+
},
|
1080 |
+
leafeon: {
|
1081 |
+
tier: "ZU",
|
1082 |
+
doublesTier: "(DUU)",
|
1083 |
+
natDexTier: "RU",
|
1084 |
+
},
|
1085 |
+
glaceon: {
|
1086 |
+
tier: "ZU",
|
1087 |
+
doublesTier: "(DUU)",
|
1088 |
+
natDexTier: "RU",
|
1089 |
+
},
|
1090 |
+
sylveon: {
|
1091 |
+
tier: "NU",
|
1092 |
+
doublesTier: "(DUU)",
|
1093 |
+
natDexTier: "RU",
|
1094 |
+
},
|
1095 |
+
porygon: {
|
1096 |
+
tier: "NFE",
|
1097 |
+
},
|
1098 |
+
porygon2: {
|
1099 |
+
tier: "NFE",
|
1100 |
+
doublesTier: "DUU",
|
1101 |
+
natDexTier: "NFE",
|
1102 |
+
},
|
1103 |
+
porygonz: {
|
1104 |
+
tier: "NU",
|
1105 |
+
doublesTier: "(DUU)",
|
1106 |
+
natDexTier: "RUBL",
|
1107 |
+
},
|
1108 |
+
omanyte: {
|
1109 |
+
isNonstandard: "Past",
|
1110 |
+
tier: "Illegal",
|
1111 |
+
natDexTier: "LC",
|
1112 |
+
},
|
1113 |
+
omastar: {
|
1114 |
+
isNonstandard: "Past",
|
1115 |
+
tier: "Illegal",
|
1116 |
+
natDexTier: "RU",
|
1117 |
+
},
|
1118 |
+
kabuto: {
|
1119 |
+
isNonstandard: "Past",
|
1120 |
+
tier: "Illegal",
|
1121 |
+
natDexTier: "LC",
|
1122 |
+
},
|
1123 |
+
kabutops: {
|
1124 |
+
isNonstandard: "Past",
|
1125 |
+
tier: "Illegal",
|
1126 |
+
natDexTier: "RU",
|
1127 |
+
},
|
1128 |
+
aerodactyl: {
|
1129 |
+
isNonstandard: "Past",
|
1130 |
+
tier: "Illegal",
|
1131 |
+
natDexTier: "RU",
|
1132 |
+
},
|
1133 |
+
aerodactylmega: {
|
1134 |
+
isNonstandard: "Past",
|
1135 |
+
tier: "Illegal",
|
1136 |
+
natDexTier: "UU",
|
1137 |
+
},
|
1138 |
+
munchlax: {
|
1139 |
+
tier: "LC",
|
1140 |
+
},
|
1141 |
+
snorlax: {
|
1142 |
+
tier: "ZU",
|
1143 |
+
doublesTier: "(DUU)",
|
1144 |
+
natDexTier: "RU",
|
1145 |
+
},
|
1146 |
+
snorlaxgmax: {
|
1147 |
+
isNonstandard: "Past",
|
1148 |
+
tier: "Illegal",
|
1149 |
+
},
|
1150 |
+
articuno: {
|
1151 |
+
tier: "ZU",
|
1152 |
+
doublesTier: "(DUU)",
|
1153 |
+
natDexTier: "RU",
|
1154 |
+
},
|
1155 |
+
articunogalar: {
|
1156 |
+
tier: "PU",
|
1157 |
+
doublesTier: "(DUU)",
|
1158 |
+
natDexTier: "RU",
|
1159 |
+
},
|
1160 |
+
zapdos: {
|
1161 |
+
tier: "OU",
|
1162 |
+
doublesTier: "(DUU)",
|
1163 |
+
natDexTier: "OU",
|
1164 |
+
},
|
1165 |
+
zapdosgalar: {
|
1166 |
+
tier: "RU",
|
1167 |
+
doublesTier: "(DUU)",
|
1168 |
+
natDexTier: "UUBL",
|
1169 |
+
},
|
1170 |
+
moltres: {
|
1171 |
+
tier: "OU",
|
1172 |
+
doublesTier: "(DUU)",
|
1173 |
+
natDexTier: "OU",
|
1174 |
+
},
|
1175 |
+
moltresgalar: {
|
1176 |
+
tier: "UUBL",
|
1177 |
+
doublesTier: "DUU",
|
1178 |
+
natDexTier: "RUBL",
|
1179 |
+
},
|
1180 |
+
dratini: {
|
1181 |
+
tier: "LC",
|
1182 |
+
},
|
1183 |
+
dragonair: {
|
1184 |
+
tier: "NFE",
|
1185 |
+
},
|
1186 |
+
dragonite: {
|
1187 |
+
tier: "OU",
|
1188 |
+
doublesTier: "DOU",
|
1189 |
+
natDexTier: "OU",
|
1190 |
+
},
|
1191 |
+
mewtwo: {
|
1192 |
+
tier: "Uber",
|
1193 |
+
doublesTier: "DUber",
|
1194 |
+
natDexTier: "Uber",
|
1195 |
+
},
|
1196 |
+
mewtwomegax: {
|
1197 |
+
isNonstandard: "Past",
|
1198 |
+
tier: "Illegal",
|
1199 |
+
natDexTier: "Uber",
|
1200 |
+
},
|
1201 |
+
mewtwomegay: {
|
1202 |
+
isNonstandard: "Past",
|
1203 |
+
tier: "Illegal",
|
1204 |
+
natDexTier: "Uber",
|
1205 |
+
},
|
1206 |
+
mew: {
|
1207 |
+
tier: "UU",
|
1208 |
+
doublesTier: "DUU",
|
1209 |
+
natDexTier: "RUBL",
|
1210 |
+
},
|
1211 |
+
chikorita: {
|
1212 |
+
tier: "LC",
|
1213 |
+
},
|
1214 |
+
bayleef: {
|
1215 |
+
tier: "NFE",
|
1216 |
+
},
|
1217 |
+
meganium: {
|
1218 |
+
tier: "ZU",
|
1219 |
+
doublesTier: "(DUU)",
|
1220 |
+
natDexTier: "RU",
|
1221 |
+
},
|
1222 |
+
cyndaquil: {
|
1223 |
+
tier: "LC",
|
1224 |
+
},
|
1225 |
+
quilava: {
|
1226 |
+
tier: "NFE",
|
1227 |
+
},
|
1228 |
+
typhlosion: {
|
1229 |
+
tier: "ZU",
|
1230 |
+
doublesTier: "(DUU)",
|
1231 |
+
natDexTier: "RU",
|
1232 |
+
},
|
1233 |
+
typhlosionhisui: {
|
1234 |
+
tier: "NU",
|
1235 |
+
doublesTier: "DUU",
|
1236 |
+
natDexTier: "RU",
|
1237 |
+
},
|
1238 |
+
totodile: {
|
1239 |
+
tier: "LC",
|
1240 |
+
},
|
1241 |
+
croconaw: {
|
1242 |
+
tier: "NFE",
|
1243 |
+
},
|
1244 |
+
feraligatr: {
|
1245 |
+
tier: "NUBL",
|
1246 |
+
doublesTier: "(DUU)",
|
1247 |
+
natDexTier: "RU",
|
1248 |
+
},
|
1249 |
+
sentret: {
|
1250 |
+
tier: "LC",
|
1251 |
+
},
|
1252 |
+
furret: {
|
1253 |
+
tier: "ZU",
|
1254 |
+
doublesTier: "(DUU)",
|
1255 |
+
natDexTier: "RU",
|
1256 |
+
},
|
1257 |
+
hoothoot: {
|
1258 |
+
tier: "LC",
|
1259 |
+
},
|
1260 |
+
noctowl: {
|
1261 |
+
tier: "ZU",
|
1262 |
+
doublesTier: "(DUU)",
|
1263 |
+
natDexTier: "RU",
|
1264 |
+
},
|
1265 |
+
ledyba: {
|
1266 |
+
isNonstandard: "Past",
|
1267 |
+
tier: "Illegal",
|
1268 |
+
natDexTier: "LC",
|
1269 |
+
},
|
1270 |
+
ledian: {
|
1271 |
+
isNonstandard: "Past",
|
1272 |
+
tier: "Illegal",
|
1273 |
+
natDexTier: "RU",
|
1274 |
+
},
|
1275 |
+
spinarak: {
|
1276 |
+
tier: "LC",
|
1277 |
+
},
|
1278 |
+
ariados: {
|
1279 |
+
tier: "ZU",
|
1280 |
+
doublesTier: "(DUU)",
|
1281 |
+
natDexTier: "RU",
|
1282 |
+
},
|
1283 |
+
chinchou: {
|
1284 |
+
tier: "LC",
|
1285 |
+
},
|
1286 |
+
lanturn: {
|
1287 |
+
tier: "ZU",
|
1288 |
+
doublesTier: "(DUU)",
|
1289 |
+
natDexTier: "RU",
|
1290 |
+
},
|
1291 |
+
togepi: {
|
1292 |
+
isNonstandard: "Past",
|
1293 |
+
tier: "Illegal",
|
1294 |
+
natDexTier: "LC",
|
1295 |
+
},
|
1296 |
+
togetic: {
|
1297 |
+
isNonstandard: "Past",
|
1298 |
+
tier: "Illegal",
|
1299 |
+
natDexTier: "NFE",
|
1300 |
+
},
|
1301 |
+
togekiss: {
|
1302 |
+
isNonstandard: "Past",
|
1303 |
+
tier: "Illegal",
|
1304 |
+
natDexTier: "RU",
|
1305 |
+
},
|
1306 |
+
natu: {
|
1307 |
+
isNonstandard: "Past",
|
1308 |
+
tier: "Illegal",
|
1309 |
+
natDexTier: "LC",
|
1310 |
+
},
|
1311 |
+
xatu: {
|
1312 |
+
isNonstandard: "Past",
|
1313 |
+
tier: "Illegal",
|
1314 |
+
natDexTier: "RU",
|
1315 |
+
},
|
1316 |
+
mareep: {
|
1317 |
+
tier: "LC",
|
1318 |
+
},
|
1319 |
+
flaaffy: {
|
1320 |
+
tier: "NFE",
|
1321 |
+
},
|
1322 |
+
ampharos: {
|
1323 |
+
tier: "ZU",
|
1324 |
+
doublesTier: "(DUU)",
|
1325 |
+
natDexTier: "RU",
|
1326 |
+
},
|
1327 |
+
ampharosmega: {
|
1328 |
+
isNonstandard: "Past",
|
1329 |
+
tier: "Illegal",
|
1330 |
+
natDexTier: "RU",
|
1331 |
+
},
|
1332 |
+
azurill: {
|
1333 |
+
tier: "LC",
|
1334 |
+
},
|
1335 |
+
marill: {
|
1336 |
+
tier: "NFE",
|
1337 |
+
},
|
1338 |
+
azumarill: {
|
1339 |
+
tier: "UU",
|
1340 |
+
doublesTier: "(DUU)",
|
1341 |
+
natDexTier: "UU",
|
1342 |
+
},
|
1343 |
+
bonsly: {
|
1344 |
+
tier: "LC",
|
1345 |
+
},
|
1346 |
+
sudowoodo: {
|
1347 |
+
tier: "ZU",
|
1348 |
+
doublesTier: "(DUU)",
|
1349 |
+
natDexTier: "RU",
|
1350 |
+
},
|
1351 |
+
hoppip: {
|
1352 |
+
tier: "LC",
|
1353 |
+
},
|
1354 |
+
skiploom: {
|
1355 |
+
tier: "NFE",
|
1356 |
+
},
|
1357 |
+
jumpluff: {
|
1358 |
+
tier: "ZU",
|
1359 |
+
doublesTier: "(DUU)",
|
1360 |
+
natDexTier: "RU",
|
1361 |
+
},
|
1362 |
+
aipom: {
|
1363 |
+
tier: "NFE",
|
1364 |
+
},
|
1365 |
+
ambipom: {
|
1366 |
+
tier: "PU",
|
1367 |
+
doublesTier: "(DUU)",
|
1368 |
+
natDexTier: "RU",
|
1369 |
+
},
|
1370 |
+
sunkern: {
|
1371 |
+
tier: "LC",
|
1372 |
+
},
|
1373 |
+
sunflora: {
|
1374 |
+
tier: "ZU",
|
1375 |
+
doublesTier: "(DUU)",
|
1376 |
+
natDexTier: "RU",
|
1377 |
+
},
|
1378 |
+
yanma: {
|
1379 |
+
tier: "NFE",
|
1380 |
+
},
|
1381 |
+
yanmega: {
|
1382 |
+
tier: "RUBL",
|
1383 |
+
doublesTier: "(DUU)",
|
1384 |
+
natDexTier: "RU",
|
1385 |
+
},
|
1386 |
+
wooper: {
|
1387 |
+
tier: "LC",
|
1388 |
+
},
|
1389 |
+
wooperpaldea: {
|
1390 |
+
tier: "LC",
|
1391 |
+
},
|
1392 |
+
quagsire: {
|
1393 |
+
tier: "RU",
|
1394 |
+
doublesTier: "(DUU)",
|
1395 |
+
natDexTier: "RU",
|
1396 |
+
},
|
1397 |
+
murkrow: {
|
1398 |
+
tier: "NFE",
|
1399 |
+
doublesTier: "DUU",
|
1400 |
+
},
|
1401 |
+
honchkrow: {
|
1402 |
+
tier: "ZU",
|
1403 |
+
doublesTier: "(DUU)",
|
1404 |
+
natDexTier: "RU",
|
1405 |
+
},
|
1406 |
+
misdreavus: {
|
1407 |
+
tier: "NFE",
|
1408 |
+
},
|
1409 |
+
mismagius: {
|
1410 |
+
tier: "ZU",
|
1411 |
+
doublesTier: "(DUU)",
|
1412 |
+
natDexTier: "RU",
|
1413 |
+
},
|
1414 |
+
unown: {
|
1415 |
+
isNonstandard: "Past",
|
1416 |
+
tier: "Illegal",
|
1417 |
+
natDexTier: "RU",
|
1418 |
+
},
|
1419 |
+
wynaut: {
|
1420 |
+
isNonstandard: "Past",
|
1421 |
+
tier: "Illegal",
|
1422 |
+
natDexTier: "LC",
|
1423 |
+
},
|
1424 |
+
wobbuffet: {
|
1425 |
+
isNonstandard: "Past",
|
1426 |
+
tier: "Illegal",
|
1427 |
+
natDexTier: "RU",
|
1428 |
+
},
|
1429 |
+
girafarig: {
|
1430 |
+
tier: "NFE",
|
1431 |
+
},
|
1432 |
+
farigiraf: {
|
1433 |
+
tier: "ZU",
|
1434 |
+
doublesTier: "DOU",
|
1435 |
+
natDexTier: "RU",
|
1436 |
+
},
|
1437 |
+
pineco: {
|
1438 |
+
tier: "LC",
|
1439 |
+
},
|
1440 |
+
forretress: {
|
1441 |
+
tier: "RU",
|
1442 |
+
doublesTier: "(DUU)",
|
1443 |
+
natDexTier: "RU",
|
1444 |
+
},
|
1445 |
+
dunsparce: {
|
1446 |
+
tier: "NFE",
|
1447 |
+
},
|
1448 |
+
dudunsparce: {
|
1449 |
+
tier: "ZUBL",
|
1450 |
+
doublesTier: "(DUU)",
|
1451 |
+
natDexTier: "RU",
|
1452 |
+
},
|
1453 |
+
gligar: {
|
1454 |
+
tier: "NU",
|
1455 |
+
doublesTier: "NFE",
|
1456 |
+
natDexTier: "NFE",
|
1457 |
+
},
|
1458 |
+
gliscor: {
|
1459 |
+
tier: "OU",
|
1460 |
+
doublesTier: "DUU",
|
1461 |
+
natDexTier: "OU",
|
1462 |
+
},
|
1463 |
+
snubbull: {
|
1464 |
+
tier: "LC",
|
1465 |
+
},
|
1466 |
+
granbull: {
|
1467 |
+
tier: "ZU",
|
1468 |
+
doublesTier: "(DUU)",
|
1469 |
+
natDexTier: "RU",
|
1470 |
+
},
|
1471 |
+
qwilfish: {
|
1472 |
+
tier: "ZU",
|
1473 |
+
doublesTier: "(DUU)",
|
1474 |
+
natDexTier: "RU",
|
1475 |
+
},
|
1476 |
+
qwilfishhisui: {
|
1477 |
+
tier: "ZU",
|
1478 |
+
doublesTier: "NFE",
|
1479 |
+
natDexTier: "NFE",
|
1480 |
+
},
|
1481 |
+
overqwil: {
|
1482 |
+
tier: "NU",
|
1483 |
+
doublesTier: "(DUU)",
|
1484 |
+
natDexTier: "RU",
|
1485 |
+
},
|
1486 |
+
shuckle: {
|
1487 |
+
isNonstandard: "Past",
|
1488 |
+
tier: "Illegal",
|
1489 |
+
natDexTier: "RU",
|
1490 |
+
},
|
1491 |
+
heracross: {
|
1492 |
+
tier: "NU",
|
1493 |
+
doublesTier: "(DUU)",
|
1494 |
+
natDexTier: "RU",
|
1495 |
+
},
|
1496 |
+
heracrossmega: {
|
1497 |
+
isNonstandard: "Past",
|
1498 |
+
tier: "Illegal",
|
1499 |
+
natDexTier: "UU",
|
1500 |
+
},
|
1501 |
+
sneasel: {
|
1502 |
+
tier: "ZU",
|
1503 |
+
doublesTier: "NFE",
|
1504 |
+
natDexTier: "NFE",
|
1505 |
+
},
|
1506 |
+
sneaselhisui: {
|
1507 |
+
tier: "NFE",
|
1508 |
+
},
|
1509 |
+
weavile: {
|
1510 |
+
tier: "UU",
|
1511 |
+
doublesTier: "(DUU)",
|
1512 |
+
natDexTier: "UUBL",
|
1513 |
+
},
|
1514 |
+
sneasler: {
|
1515 |
+
tier: "Uber",
|
1516 |
+
doublesTier: "DUU",
|
1517 |
+
natDexTier: "Uber",
|
1518 |
+
},
|
1519 |
+
teddiursa: {
|
1520 |
+
tier: "LC",
|
1521 |
+
},
|
1522 |
+
ursaring: {
|
1523 |
+
tier: "NFE",
|
1524 |
+
},
|
1525 |
+
ursaluna: {
|
1526 |
+
tier: "UUBL",
|
1527 |
+
doublesTier: "DOU",
|
1528 |
+
natDexTier: "UU",
|
1529 |
+
},
|
1530 |
+
ursalunabloodmoon: {
|
1531 |
+
tier: "Uber",
|
1532 |
+
doublesTier: "DOU",
|
1533 |
+
natDexTier: "Uber",
|
1534 |
+
},
|
1535 |
+
slugma: {
|
1536 |
+
tier: "LC",
|
1537 |
+
},
|
1538 |
+
magcargo: {
|
1539 |
+
tier: "ZU",
|
1540 |
+
doublesTier: "(DUU)",
|
1541 |
+
natDexTier: "RU",
|
1542 |
+
},
|
1543 |
+
swinub: {
|
1544 |
+
tier: "LC",
|
1545 |
+
},
|
1546 |
+
piloswine: {
|
1547 |
+
tier: "NFE",
|
1548 |
+
},
|
1549 |
+
mamoswine: {
|
1550 |
+
tier: "RU",
|
1551 |
+
doublesTier: "(DUU)",
|
1552 |
+
natDexTier: "UU",
|
1553 |
+
},
|
1554 |
+
corsola: {
|
1555 |
+
isNonstandard: "Past",
|
1556 |
+
tier: "Illegal",
|
1557 |
+
natDexTier: "RU",
|
1558 |
+
},
|
1559 |
+
corsolagalar: {
|
1560 |
+
isNonstandard: "Past",
|
1561 |
+
tier: "Illegal",
|
1562 |
+
natDexTier: "NFE",
|
1563 |
+
},
|
1564 |
+
cursola: {
|
1565 |
+
isNonstandard: "Past",
|
1566 |
+
tier: "Illegal",
|
1567 |
+
natDexTier: "RU",
|
1568 |
+
},
|
1569 |
+
remoraid: {
|
1570 |
+
isNonstandard: "Past",
|
1571 |
+
tier: "Illegal",
|
1572 |
+
natDexTier: "LC",
|
1573 |
+
},
|
1574 |
+
octillery: {
|
1575 |
+
isNonstandard: "Past",
|
1576 |
+
tier: "Illegal",
|
1577 |
+
natDexTier: "RU",
|
1578 |
+
},
|
1579 |
+
delibird: {
|
1580 |
+
tier: "ZU",
|
1581 |
+
doublesTier: "(DUU)",
|
1582 |
+
natDexTier: "RU",
|
1583 |
+
},
|
1584 |
+
mantyke: {
|
1585 |
+
isNonstandard: "Past",
|
1586 |
+
tier: "Illegal",
|
1587 |
+
natDexTier: "LC",
|
1588 |
+
},
|
1589 |
+
mantine: {
|
1590 |
+
isNonstandard: "Past",
|
1591 |
+
tier: "Illegal",
|
1592 |
+
natDexTier: "RU",
|
1593 |
+
},
|
1594 |
+
skarmory: {
|
1595 |
+
tier: "UU",
|
1596 |
+
doublesTier: "(DUU)",
|
1597 |
+
natDexTier: "UU",
|
1598 |
+
},
|
1599 |
+
houndour: {
|
1600 |
+
tier: "LC",
|
1601 |
+
},
|
1602 |
+
houndoom: {
|
1603 |
+
tier: "ZU",
|
1604 |
+
doublesTier: "(DUU)",
|
1605 |
+
natDexTier: "RU",
|
1606 |
+
},
|
1607 |
+
houndoommega: {
|
1608 |
+
isNonstandard: "Past",
|
1609 |
+
tier: "Illegal",
|
1610 |
+
natDexTier: "RU",
|
1611 |
+
},
|
1612 |
+
phanpy: {
|
1613 |
+
tier: "LC",
|
1614 |
+
},
|
1615 |
+
donphan: {
|
1616 |
+
tier: "UU",
|
1617 |
+
doublesTier: "(DUU)",
|
1618 |
+
natDexTier: "RU",
|
1619 |
+
},
|
1620 |
+
stantler: {
|
1621 |
+
tier: "NFE",
|
1622 |
+
},
|
1623 |
+
wyrdeer: {
|
1624 |
+
tier: "ZU",
|
1625 |
+
doublesTier: "(DUU)",
|
1626 |
+
natDexTier: "RU",
|
1627 |
+
},
|
1628 |
+
smeargle: {
|
1629 |
+
tier: "ZU",
|
1630 |
+
doublesTier: "(DUU)",
|
1631 |
+
natDexTier: "RU",
|
1632 |
+
},
|
1633 |
+
miltank: {
|
1634 |
+
isNonstandard: "Past",
|
1635 |
+
tier: "Illegal",
|
1636 |
+
natDexTier: "RU",
|
1637 |
+
},
|
1638 |
+
raikou: {
|
1639 |
+
tier: "NU",
|
1640 |
+
doublesTier: "(DUU)",
|
1641 |
+
natDexTier: "RU",
|
1642 |
+
},
|
1643 |
+
entei: {
|
1644 |
+
tier: "RU",
|
1645 |
+
doublesTier: "(DUU)",
|
1646 |
+
natDexTier: "RU",
|
1647 |
+
},
|
1648 |
+
suicune: {
|
1649 |
+
tier: "RU",
|
1650 |
+
doublesTier: "(DUU)",
|
1651 |
+
natDexTier: "RU",
|
1652 |
+
},
|
1653 |
+
larvitar: {
|
1654 |
+
tier: "LC",
|
1655 |
+
},
|
1656 |
+
pupitar: {
|
1657 |
+
tier: "NFE",
|
1658 |
+
},
|
1659 |
+
tyranitar: {
|
1660 |
+
tier: "UU",
|
1661 |
+
doublesTier: "DOU",
|
1662 |
+
natDexTier: "UU",
|
1663 |
+
},
|
1664 |
+
tyranitarmega: {
|
1665 |
+
isNonstandard: "Past",
|
1666 |
+
tier: "Illegal",
|
1667 |
+
natDexTier: "OU",
|
1668 |
+
},
|
1669 |
+
lugia: {
|
1670 |
+
tier: "Uber",
|
1671 |
+
doublesTier: "DUber",
|
1672 |
+
natDexTier: "Uber",
|
1673 |
+
},
|
1674 |
+
hooh: {
|
1675 |
+
tier: "Uber",
|
1676 |
+
doublesTier: "DUber",
|
1677 |
+
natDexTier: "Uber",
|
1678 |
+
},
|
1679 |
+
celebi: {
|
1680 |
+
isNonstandard: "Past",
|
1681 |
+
tier: "Illegal",
|
1682 |
+
natDexTier: "RU",
|
1683 |
+
},
|
1684 |
+
treecko: {
|
1685 |
+
tier: "LC",
|
1686 |
+
},
|
1687 |
+
grovyle: {
|
1688 |
+
tier: "NFE",
|
1689 |
+
},
|
1690 |
+
sceptile: {
|
1691 |
+
tier: "ZU",
|
1692 |
+
doublesTier: "(DUU)",
|
1693 |
+
natDexTier: "RU",
|
1694 |
+
},
|
1695 |
+
sceptilemega: {
|
1696 |
+
isNonstandard: "Past",
|
1697 |
+
tier: "Illegal",
|
1698 |
+
natDexTier: "RU",
|
1699 |
+
},
|
1700 |
+
torchic: {
|
1701 |
+
tier: "LC",
|
1702 |
+
},
|
1703 |
+
combusken: {
|
1704 |
+
tier: "NFE",
|
1705 |
+
},
|
1706 |
+
blaziken: {
|
1707 |
+
tier: "UUBL",
|
1708 |
+
doublesTier: "(DUU)",
|
1709 |
+
natDexTier: "UUBL",
|
1710 |
+
},
|
1711 |
+
blazikenmega: {
|
1712 |
+
isNonstandard: "Past",
|
1713 |
+
tier: "Illegal",
|
1714 |
+
natDexTier: "Uber",
|
1715 |
+
},
|
1716 |
+
mudkip: {
|
1717 |
+
tier: "LC",
|
1718 |
+
},
|
1719 |
+
marshtomp: {
|
1720 |
+
tier: "NFE",
|
1721 |
+
},
|
1722 |
+
swampert: {
|
1723 |
+
tier: "NU",
|
1724 |
+
doublesTier: "(DUU)",
|
1725 |
+
natDexTier: "RU",
|
1726 |
+
},
|
1727 |
+
swampertmega: {
|
1728 |
+
isNonstandard: "Past",
|
1729 |
+
tier: "Illegal",
|
1730 |
+
natDexTier: "RU",
|
1731 |
+
},
|
1732 |
+
poochyena: {
|
1733 |
+
tier: "LC",
|
1734 |
+
},
|
1735 |
+
mightyena: {
|
1736 |
+
tier: "ZU",
|
1737 |
+
doublesTier: "(DUU)",
|
1738 |
+
natDexTier: "RU",
|
1739 |
+
},
|
1740 |
+
zigzagoon: {
|
1741 |
+
isNonstandard: "Past",
|
1742 |
+
tier: "Illegal",
|
1743 |
+
natDexTier: "NFE",
|
1744 |
+
},
|
1745 |
+
zigzagoongalar: {
|
1746 |
+
isNonstandard: "Past",
|
1747 |
+
tier: "Illegal",
|
1748 |
+
natDexTier: "LC",
|
1749 |
+
},
|
1750 |
+
linoone: {
|
1751 |
+
isNonstandard: "Past",
|
1752 |
+
tier: "Illegal",
|
1753 |
+
natDexTier: "RU",
|
1754 |
+
},
|
1755 |
+
linoonegalar: {
|
1756 |
+
isNonstandard: "Past",
|
1757 |
+
tier: "Illegal",
|
1758 |
+
natDexTier: "NFE",
|
1759 |
+
},
|
1760 |
+
obstagoon: {
|
1761 |
+
isNonstandard: "Past",
|
1762 |
+
tier: "Illegal",
|
1763 |
+
natDexTier: "RU",
|
1764 |
+
},
|
1765 |
+
wurmple: {
|
1766 |
+
isNonstandard: "Past",
|
1767 |
+
tier: "Illegal",
|
1768 |
+
natDexTier: "LC",
|
1769 |
+
},
|
1770 |
+
silcoon: {
|
1771 |
+
isNonstandard: "Past",
|
1772 |
+
tier: "Illegal",
|
1773 |
+
natDexTier: "NFE",
|
1774 |
+
},
|
1775 |
+
beautifly: {
|
1776 |
+
isNonstandard: "Past",
|
1777 |
+
tier: "Illegal",
|
1778 |
+
natDexTier: "RU",
|
1779 |
+
},
|
1780 |
+
cascoon: {
|
1781 |
+
isNonstandard: "Past",
|
1782 |
+
tier: "Illegal",
|
1783 |
+
natDexTier: "NFE",
|
1784 |
+
},
|
1785 |
+
dustox: {
|
1786 |
+
isNonstandard: "Past",
|
1787 |
+
tier: "Illegal",
|
1788 |
+
natDexTier: "RU",
|
1789 |
+
},
|
1790 |
+
lotad: {
|
1791 |
+
tier: "LC",
|
1792 |
+
},
|
1793 |
+
lombre: {
|
1794 |
+
tier: "NFE",
|
1795 |
+
},
|
1796 |
+
ludicolo: {
|
1797 |
+
tier: "ZU",
|
1798 |
+
doublesTier: "(DUU)",
|
1799 |
+
natDexTier: "RU",
|
1800 |
+
},
|
1801 |
+
seedot: {
|
1802 |
+
tier: "LC",
|
1803 |
+
},
|
1804 |
+
nuzleaf: {
|
1805 |
+
tier: "NFE",
|
1806 |
+
},
|
1807 |
+
shiftry: {
|
1808 |
+
tier: "ZU",
|
1809 |
+
doublesTier: "(DUU)",
|
1810 |
+
natDexTier: "RU",
|
1811 |
+
},
|
1812 |
+
taillow: {
|
1813 |
+
isNonstandard: "Past",
|
1814 |
+
tier: "Illegal",
|
1815 |
+
natDexTier: "LC",
|
1816 |
+
},
|
1817 |
+
swellow: {
|
1818 |
+
isNonstandard: "Past",
|
1819 |
+
tier: "Illegal",
|
1820 |
+
natDexTier: "RU",
|
1821 |
+
},
|
1822 |
+
wingull: {
|
1823 |
+
tier: "LC",
|
1824 |
+
},
|
1825 |
+
pelipper: {
|
1826 |
+
tier: "UUBL",
|
1827 |
+
doublesTier: "DOU",
|
1828 |
+
natDexTier: "OU",
|
1829 |
+
},
|
1830 |
+
ralts: {
|
1831 |
+
tier: "LC",
|
1832 |
+
},
|
1833 |
+
kirlia: {
|
1834 |
+
tier: "NFE",
|
1835 |
+
},
|
1836 |
+
gardevoir: {
|
1837 |
+
tier: "RU",
|
1838 |
+
doublesTier: "(DUU)",
|
1839 |
+
natDexTier: "RU",
|
1840 |
+
},
|
1841 |
+
gardevoirmega: {
|
1842 |
+
isNonstandard: "Past",
|
1843 |
+
tier: "Illegal",
|
1844 |
+
natDexTier: "UU",
|
1845 |
+
},
|
1846 |
+
gallade: {
|
1847 |
+
tier: "NUBL",
|
1848 |
+
doublesTier: "(DUU)",
|
1849 |
+
natDexTier: "RU",
|
1850 |
+
},
|
1851 |
+
gallademega: {
|
1852 |
+
isNonstandard: "Past",
|
1853 |
+
tier: "Illegal",
|
1854 |
+
natDexTier: "UU",
|
1855 |
+
},
|
1856 |
+
surskit: {
|
1857 |
+
tier: "LC",
|
1858 |
+
},
|
1859 |
+
masquerain: {
|
1860 |
+
tier: "ZU",
|
1861 |
+
doublesTier: "(DUU)",
|
1862 |
+
natDexTier: "RU",
|
1863 |
+
},
|
1864 |
+
shroomish: {
|
1865 |
+
tier: "LC",
|
1866 |
+
},
|
1867 |
+
breloom: {
|
1868 |
+
tier: "NU",
|
1869 |
+
doublesTier: "(DUU)",
|
1870 |
+
natDexTier: "RU",
|
1871 |
+
},
|
1872 |
+
slakoth: {
|
1873 |
+
tier: "LC",
|
1874 |
+
},
|
1875 |
+
vigoroth: {
|
1876 |
+
tier: "NFE",
|
1877 |
+
},
|
1878 |
+
slaking: {
|
1879 |
+
tier: "ZU",
|
1880 |
+
doublesTier: "(DUU)",
|
1881 |
+
natDexTier: "RU",
|
1882 |
+
},
|
1883 |
+
nincada: {
|
1884 |
+
isNonstandard: "Past",
|
1885 |
+
tier: "Illegal",
|
1886 |
+
natDexTier: "LC",
|
1887 |
+
},
|
1888 |
+
ninjask: {
|
1889 |
+
isNonstandard: "Past",
|
1890 |
+
tier: "Illegal",
|
1891 |
+
natDexTier: "RU",
|
1892 |
+
},
|
1893 |
+
shedinja: {
|
1894 |
+
isNonstandard: "Past",
|
1895 |
+
tier: "Illegal",
|
1896 |
+
natDexTier: "RU",
|
1897 |
+
},
|
1898 |
+
whismur: {
|
1899 |
+
isNonstandard: "Past",
|
1900 |
+
tier: "Illegal",
|
1901 |
+
natDexTier: "LC",
|
1902 |
+
},
|
1903 |
+
loudred: {
|
1904 |
+
isNonstandard: "Past",
|
1905 |
+
tier: "Illegal",
|
1906 |
+
natDexTier: "NFE",
|
1907 |
+
},
|
1908 |
+
exploud: {
|
1909 |
+
isNonstandard: "Past",
|
1910 |
+
tier: "Illegal",
|
1911 |
+
natDexTier: "RU",
|
1912 |
+
},
|
1913 |
+
makuhita: {
|
1914 |
+
tier: "LC",
|
1915 |
+
},
|
1916 |
+
hariyama: {
|
1917 |
+
tier: "ZUBL",
|
1918 |
+
doublesTier: "(DUU)",
|
1919 |
+
natDexTier: "RU",
|
1920 |
+
},
|
1921 |
+
nosepass: {
|
1922 |
+
tier: "LC",
|
1923 |
+
},
|
1924 |
+
probopass: {
|
1925 |
+
tier: "ZU",
|
1926 |
+
doublesTier: "(DUU)",
|
1927 |
+
natDexTier: "RU",
|
1928 |
+
},
|
1929 |
+
skitty: {
|
1930 |
+
isNonstandard: "Past",
|
1931 |
+
tier: "Illegal",
|
1932 |
+
natDexTier: "LC",
|
1933 |
+
},
|
1934 |
+
delcatty: {
|
1935 |
+
isNonstandard: "Past",
|
1936 |
+
tier: "Illegal",
|
1937 |
+
natDexTier: "RU",
|
1938 |
+
},
|
1939 |
+
sableye: {
|
1940 |
+
tier: "ZU",
|
1941 |
+
doublesTier: "DUU",
|
1942 |
+
natDexTier: "RU",
|
1943 |
+
},
|
1944 |
+
sableyemega: {
|
1945 |
+
isNonstandard: "Past",
|
1946 |
+
tier: "Illegal",
|
1947 |
+
natDexTier: "RUBL",
|
1948 |
+
},
|
1949 |
+
mawile: {
|
1950 |
+
isNonstandard: "Past",
|
1951 |
+
tier: "Illegal",
|
1952 |
+
natDexTier: "RU",
|
1953 |
+
},
|
1954 |
+
mawilemega: {
|
1955 |
+
isNonstandard: "Past",
|
1956 |
+
tier: "Illegal",
|
1957 |
+
natDexTier: "UUBL",
|
1958 |
+
},
|
1959 |
+
aron: {
|
1960 |
+
isNonstandard: "Past",
|
1961 |
+
tier: "Illegal",
|
1962 |
+
natDexTier: "LC",
|
1963 |
+
},
|
1964 |
+
lairon: {
|
1965 |
+
isNonstandard: "Past",
|
1966 |
+
tier: "Illegal",
|
1967 |
+
natDexTier: "NFE",
|
1968 |
+
},
|
1969 |
+
aggron: {
|
1970 |
+
isNonstandard: "Past",
|
1971 |
+
tier: "Illegal",
|
1972 |
+
natDexTier: "RU",
|
1973 |
+
},
|
1974 |
+
aggronmega: {
|
1975 |
+
isNonstandard: "Past",
|
1976 |
+
tier: "Illegal",
|
1977 |
+
natDexTier: "RU",
|
1978 |
+
},
|
1979 |
+
meditite: {
|
1980 |
+
tier: "NFE",
|
1981 |
+
},
|
1982 |
+
medicham: {
|
1983 |
+
tier: "ZU",
|
1984 |
+
doublesTier: "(DUU)",
|
1985 |
+
natDexTier: "RU",
|
1986 |
+
},
|
1987 |
+
medichammega: {
|
1988 |
+
isNonstandard: "Past",
|
1989 |
+
tier: "Illegal",
|
1990 |
+
natDexTier: "UUBL",
|
1991 |
+
},
|
1992 |
+
electrike: {
|
1993 |
+
isNonstandard: "Past",
|
1994 |
+
tier: "Illegal",
|
1995 |
+
natDexTier: "LC",
|
1996 |
+
},
|
1997 |
+
manectric: {
|
1998 |
+
isNonstandard: "Past",
|
1999 |
+
tier: "Illegal",
|
2000 |
+
natDexTier: "RU",
|
2001 |
+
},
|
2002 |
+
manectricmega: {
|
2003 |
+
isNonstandard: "Past",
|
2004 |
+
tier: "Illegal",
|
2005 |
+
natDexTier: "RU",
|
2006 |
+
},
|
2007 |
+
plusle: {
|
2008 |
+
tier: "ZU",
|
2009 |
+
doublesTier: "(DUU)",
|
2010 |
+
natDexTier: "RU",
|
2011 |
+
},
|
2012 |
+
minun: {
|
2013 |
+
tier: "ZU",
|
2014 |
+
doublesTier: "(DUU)",
|
2015 |
+
natDexTier: "RU",
|
2016 |
+
},
|
2017 |
+
volbeat: {
|
2018 |
+
tier: "ZU",
|
2019 |
+
doublesTier: "(DUU)",
|
2020 |
+
natDexTier: "RU",
|
2021 |
+
},
|
2022 |
+
illumise: {
|
2023 |
+
tier: "ZU",
|
2024 |
+
doublesTier: "(DUU)",
|
2025 |
+
natDexTier: "RU",
|
2026 |
+
},
|
2027 |
+
budew: {
|
2028 |
+
isNonstandard: "Past",
|
2029 |
+
tier: "Illegal",
|
2030 |
+
natDexTier: "LC",
|
2031 |
+
},
|
2032 |
+
roselia: {
|
2033 |
+
isNonstandard: "Past",
|
2034 |
+
tier: "Illegal",
|
2035 |
+
natDexTier: "NFE",
|
2036 |
+
},
|
2037 |
+
roserade: {
|
2038 |
+
isNonstandard: "Past",
|
2039 |
+
tier: "Illegal",
|
2040 |
+
natDexTier: "RU",
|
2041 |
+
},
|
2042 |
+
gulpin: {
|
2043 |
+
tier: "LC",
|
2044 |
+
},
|
2045 |
+
swalot: {
|
2046 |
+
tier: "ZU",
|
2047 |
+
doublesTier: "(DUU)",
|
2048 |
+
natDexTier: "RU",
|
2049 |
+
},
|
2050 |
+
carvanha: {
|
2051 |
+
isNonstandard: "Past",
|
2052 |
+
tier: "Illegal",
|
2053 |
+
natDexTier: "LC",
|
2054 |
+
},
|
2055 |
+
sharpedo: {
|
2056 |
+
isNonstandard: "Past",
|
2057 |
+
tier: "Illegal",
|
2058 |
+
natDexTier: "RU",
|
2059 |
+
},
|
2060 |
+
sharpedomega: {
|
2061 |
+
isNonstandard: "Past",
|
2062 |
+
tier: "Illegal",
|
2063 |
+
natDexTier: "RU",
|
2064 |
+
},
|
2065 |
+
wailmer: {
|
2066 |
+
isNonstandard: "Past",
|
2067 |
+
tier: "Illegal",
|
2068 |
+
natDexTier: "LC",
|
2069 |
+
},
|
2070 |
+
wailord: {
|
2071 |
+
isNonstandard: "Past",
|
2072 |
+
tier: "Illegal",
|
2073 |
+
natDexTier: "RU",
|
2074 |
+
},
|
2075 |
+
numel: {
|
2076 |
+
tier: "LC",
|
2077 |
+
},
|
2078 |
+
camerupt: {
|
2079 |
+
tier: "ZU",
|
2080 |
+
doublesTier: "(DUU)",
|
2081 |
+
natDexTier: "RU",
|
2082 |
+
},
|
2083 |
+
cameruptmega: {
|
2084 |
+
isNonstandard: "Past",
|
2085 |
+
tier: "Illegal",
|
2086 |
+
natDexTier: "RU",
|
2087 |
+
},
|
2088 |
+
torkoal: {
|
2089 |
+
tier: "PU",
|
2090 |
+
doublesTier: "DOU",
|
2091 |
+
natDexTier: "RU",
|
2092 |
+
},
|
2093 |
+
spoink: {
|
2094 |
+
tier: "LC",
|
2095 |
+
},
|
2096 |
+
grumpig: {
|
2097 |
+
tier: "ZU",
|
2098 |
+
doublesTier: "(DUU)",
|
2099 |
+
natDexTier: "RU",
|
2100 |
+
},
|
2101 |
+
spinda: {
|
2102 |
+
isNonstandard: "Past",
|
2103 |
+
tier: "Illegal",
|
2104 |
+
natDexTier: "RU",
|
2105 |
+
},
|
2106 |
+
trapinch: {
|
2107 |
+
tier: "LC",
|
2108 |
+
},
|
2109 |
+
vibrava: {
|
2110 |
+
tier: "NFE",
|
2111 |
+
},
|
2112 |
+
flygon: {
|
2113 |
+
tier: "NU",
|
2114 |
+
doublesTier: "(DUU)",
|
2115 |
+
natDexTier: "RU",
|
2116 |
+
},
|
2117 |
+
cacnea: {
|
2118 |
+
tier: "LC",
|
2119 |
+
},
|
2120 |
+
cacturne: {
|
2121 |
+
tier: "ZU",
|
2122 |
+
doublesTier: "(DUU)",
|
2123 |
+
natDexTier: "RU",
|
2124 |
+
},
|
2125 |
+
swablu: {
|
2126 |
+
tier: "LC",
|
2127 |
+
},
|
2128 |
+
altaria: {
|
2129 |
+
tier: "PU",
|
2130 |
+
doublesTier: "(DUU)",
|
2131 |
+
natDexTier: "RU",
|
2132 |
+
},
|
2133 |
+
altariamega: {
|
2134 |
+
isNonstandard: "Past",
|
2135 |
+
tier: "Illegal",
|
2136 |
+
natDexTier: "RUBL",
|
2137 |
+
},
|
2138 |
+
zangoose: {
|
2139 |
+
tier: "ZU",
|
2140 |
+
doublesTier: "(DUU)",
|
2141 |
+
natDexTier: "RU",
|
2142 |
+
},
|
2143 |
+
seviper: {
|
2144 |
+
tier: "ZU",
|
2145 |
+
doublesTier: "(DUU)",
|
2146 |
+
natDexTier: "RU",
|
2147 |
+
},
|
2148 |
+
lunatone: {
|
2149 |
+
isNonstandard: "Past",
|
2150 |
+
tier: "Illegal",
|
2151 |
+
natDexTier: "RU",
|
2152 |
+
},
|
2153 |
+
solrock: {
|
2154 |
+
isNonstandard: "Past",
|
2155 |
+
tier: "Illegal",
|
2156 |
+
natDexTier: "RU",
|
2157 |
+
},
|
2158 |
+
barboach: {
|
2159 |
+
tier: "LC",
|
2160 |
+
},
|
2161 |
+
whiscash: {
|
2162 |
+
tier: "ZU",
|
2163 |
+
doublesTier: "(DUU)",
|
2164 |
+
natDexTier: "RU",
|
2165 |
+
},
|
2166 |
+
corphish: {
|
2167 |
+
tier: "LC",
|
2168 |
+
},
|
2169 |
+
crawdaunt: {
|
2170 |
+
tier: "RU",
|
2171 |
+
doublesTier: "(DUU)",
|
2172 |
+
natDexTier: "RU",
|
2173 |
+
},
|
2174 |
+
baltoy: {
|
2175 |
+
isNonstandard: "Past",
|
2176 |
+
tier: "Illegal",
|
2177 |
+
natDexTier: "LC",
|
2178 |
+
},
|
2179 |
+
claydol: {
|
2180 |
+
isNonstandard: "Past",
|
2181 |
+
tier: "Illegal",
|
2182 |
+
natDexTier: "RU",
|
2183 |
+
},
|
2184 |
+
lileep: {
|
2185 |
+
isNonstandard: "Past",
|
2186 |
+
tier: "Illegal",
|
2187 |
+
natDexTier: "LC",
|
2188 |
+
},
|
2189 |
+
cradily: {
|
2190 |
+
isNonstandard: "Past",
|
2191 |
+
tier: "Illegal",
|
2192 |
+
natDexTier: "RU",
|
2193 |
+
},
|
2194 |
+
anorith: {
|
2195 |
+
isNonstandard: "Past",
|
2196 |
+
tier: "Illegal",
|
2197 |
+
natDexTier: "LC",
|
2198 |
+
},
|
2199 |
+
armaldo: {
|
2200 |
+
isNonstandard: "Past",
|
2201 |
+
tier: "Illegal",
|
2202 |
+
natDexTier: "RU",
|
2203 |
+
},
|
2204 |
+
feebas: {
|
2205 |
+
tier: "LC",
|
2206 |
+
},
|
2207 |
+
milotic: {
|
2208 |
+
tier: "NU",
|
2209 |
+
doublesTier: "DUU",
|
2210 |
+
natDexTier: "RU",
|
2211 |
+
},
|
2212 |
+
castform: {
|
2213 |
+
isNonstandard: "Past",
|
2214 |
+
tier: "Illegal",
|
2215 |
+
natDexTier: "RU",
|
2216 |
+
},
|
2217 |
+
castformsunny: {
|
2218 |
+
isNonstandard: "Past",
|
2219 |
+
},
|
2220 |
+
castformrainy: {
|
2221 |
+
isNonstandard: "Past",
|
2222 |
+
},
|
2223 |
+
castformsnowy: {
|
2224 |
+
isNonstandard: "Past",
|
2225 |
+
},
|
2226 |
+
kecleon: {
|
2227 |
+
isNonstandard: "Past",
|
2228 |
+
tier: "Illegal",
|
2229 |
+
natDexTier: "RU",
|
2230 |
+
},
|
2231 |
+
shuppet: {
|
2232 |
+
tier: "LC",
|
2233 |
+
},
|
2234 |
+
banette: {
|
2235 |
+
tier: "ZU",
|
2236 |
+
doublesTier: "(DUU)",
|
2237 |
+
natDexTier: "RU",
|
2238 |
+
},
|
2239 |
+
banettemega: {
|
2240 |
+
isNonstandard: "Past",
|
2241 |
+
tier: "Illegal",
|
2242 |
+
natDexTier: "UU",
|
2243 |
+
},
|
2244 |
+
duskull: {
|
2245 |
+
tier: "LC",
|
2246 |
+
},
|
2247 |
+
dusclops: {
|
2248 |
+
tier: "NFE",
|
2249 |
+
},
|
2250 |
+
dusknoir: {
|
2251 |
+
tier: "ZU",
|
2252 |
+
doublesTier: "(DUU)",
|
2253 |
+
natDexTier: "RU",
|
2254 |
+
},
|
2255 |
+
tropius: {
|
2256 |
+
tier: "ZU",
|
2257 |
+
doublesTier: "(DUU)",
|
2258 |
+
natDexTier: "RU",
|
2259 |
+
},
|
2260 |
+
chingling: {
|
2261 |
+
tier: "LC",
|
2262 |
+
},
|
2263 |
+
chimecho: {
|
2264 |
+
tier: "ZU",
|
2265 |
+
doublesTier: "(DUU)",
|
2266 |
+
natDexTier: "RU",
|
2267 |
+
},
|
2268 |
+
absol: {
|
2269 |
+
isNonstandard: "Past",
|
2270 |
+
tier: "Illegal",
|
2271 |
+
natDexTier: "RU",
|
2272 |
+
},
|
2273 |
+
absolmega: {
|
2274 |
+
isNonstandard: "Past",
|
2275 |
+
tier: "Illegal",
|
2276 |
+
natDexTier: "RU",
|
2277 |
+
},
|
2278 |
+
snorunt: {
|
2279 |
+
tier: "LC",
|
2280 |
+
},
|
2281 |
+
glalie: {
|
2282 |
+
tier: "ZU",
|
2283 |
+
doublesTier: "(DUU)",
|
2284 |
+
natDexTier: "RU",
|
2285 |
+
},
|
2286 |
+
glaliemega: {
|
2287 |
+
isNonstandard: "Past",
|
2288 |
+
tier: "Illegal",
|
2289 |
+
natDexTier: "RU",
|
2290 |
+
},
|
2291 |
+
froslass: {
|
2292 |
+
tier: "ZU",
|
2293 |
+
doublesTier: "(DUU)",
|
2294 |
+
natDexTier: "RU",
|
2295 |
+
},
|
2296 |
+
spheal: {
|
2297 |
+
isNonstandard: "Past",
|
2298 |
+
tier: "Illegal",
|
2299 |
+
natDexTier: "LC",
|
2300 |
+
},
|
2301 |
+
sealeo: {
|
2302 |
+
isNonstandard: "Past",
|
2303 |
+
tier: "Illegal",
|
2304 |
+
natDexTier: "NFE",
|
2305 |
+
},
|
2306 |
+
walrein: {
|
2307 |
+
isNonstandard: "Past",
|
2308 |
+
tier: "Illegal",
|
2309 |
+
natDexTier: "RU",
|
2310 |
+
},
|
2311 |
+
clamperl: {
|
2312 |
+
isNonstandard: "Past",
|
2313 |
+
tier: "Illegal",
|
2314 |
+
natDexTier: "NFE",
|
2315 |
+
},
|
2316 |
+
huntail: {
|
2317 |
+
isNonstandard: "Past",
|
2318 |
+
tier: "Illegal",
|
2319 |
+
natDexTier: "RU",
|
2320 |
+
},
|
2321 |
+
gorebyss: {
|
2322 |
+
isNonstandard: "Past",
|
2323 |
+
tier: "Illegal",
|
2324 |
+
natDexTier: "RU",
|
2325 |
+
},
|
2326 |
+
relicanth: {
|
2327 |
+
isNonstandard: "Past",
|
2328 |
+
tier: "Illegal",
|
2329 |
+
natDexTier: "RU",
|
2330 |
+
},
|
2331 |
+
luvdisc: {
|
2332 |
+
tier: "ZU",
|
2333 |
+
doublesTier: "(DUU)",
|
2334 |
+
natDexTier: "RU",
|
2335 |
+
},
|
2336 |
+
bagon: {
|
2337 |
+
tier: "LC",
|
2338 |
+
},
|
2339 |
+
shelgon: {
|
2340 |
+
tier: "NFE",
|
2341 |
+
},
|
2342 |
+
salamence: {
|
2343 |
+
tier: "RU",
|
2344 |
+
doublesTier: "(DUU)",
|
2345 |
+
natDexTier: "RUBL",
|
2346 |
+
},
|
2347 |
+
salamencemega: {
|
2348 |
+
isNonstandard: "Past",
|
2349 |
+
tier: "Illegal",
|
2350 |
+
natDexTier: "Uber",
|
2351 |
+
},
|
2352 |
+
beldum: {
|
2353 |
+
tier: "LC",
|
2354 |
+
},
|
2355 |
+
metang: {
|
2356 |
+
tier: "NFE",
|
2357 |
+
},
|
2358 |
+
metagross: {
|
2359 |
+
tier: "UU",
|
2360 |
+
doublesTier: "DUU",
|
2361 |
+
natDexTier: "RU",
|
2362 |
+
},
|
2363 |
+
metagrossmega: {
|
2364 |
+
isNonstandard: "Past",
|
2365 |
+
tier: "Illegal",
|
2366 |
+
natDexTier: "Uber",
|
2367 |
+
},
|
2368 |
+
regirock: {
|
2369 |
+
tier: "ZU",
|
2370 |
+
doublesTier: "(DUU)",
|
2371 |
+
natDexTier: "RU",
|
2372 |
+
},
|
2373 |
+
regice: {
|
2374 |
+
tier: "ZU",
|
2375 |
+
doublesTier: "(DUU)",
|
2376 |
+
natDexTier: "RU",
|
2377 |
+
},
|
2378 |
+
registeel: {
|
2379 |
+
tier: "NU",
|
2380 |
+
doublesTier: "(DUU)",
|
2381 |
+
natDexTier: "RU",
|
2382 |
+
},
|
2383 |
+
latias: {
|
2384 |
+
tier: "UUBL",
|
2385 |
+
doublesTier: "(DUU)",
|
2386 |
+
natDexTier: "RU",
|
2387 |
+
},
|
2388 |
+
latiasmega: {
|
2389 |
+
isNonstandard: "Past",
|
2390 |
+
tier: "Illegal",
|
2391 |
+
natDexTier: "UU",
|
2392 |
+
},
|
2393 |
+
latios: {
|
2394 |
+
tier: "UU",
|
2395 |
+
doublesTier: "(DUU)",
|
2396 |
+
natDexTier: "UUBL",
|
2397 |
+
},
|
2398 |
+
latiosmega: {
|
2399 |
+
isNonstandard: "Past",
|
2400 |
+
tier: "Illegal",
|
2401 |
+
natDexTier: "UUBL",
|
2402 |
+
},
|
2403 |
+
kyogre: {
|
2404 |
+
tier: "Uber",
|
2405 |
+
doublesTier: "DUber",
|
2406 |
+
natDexTier: "Uber",
|
2407 |
+
},
|
2408 |
+
kyogreprimal: {
|
2409 |
+
isNonstandard: "Past",
|
2410 |
+
tier: "Illegal",
|
2411 |
+
natDexTier: "Uber",
|
2412 |
+
},
|
2413 |
+
groudon: {
|
2414 |
+
tier: "Uber",
|
2415 |
+
doublesTier: "DUber",
|
2416 |
+
natDexTier: "Uber",
|
2417 |
+
},
|
2418 |
+
groudonprimal: {
|
2419 |
+
isNonstandard: "Past",
|
2420 |
+
tier: "Illegal",
|
2421 |
+
natDexTier: "Uber",
|
2422 |
+
},
|
2423 |
+
rayquaza: {
|
2424 |
+
tier: "Uber",
|
2425 |
+
doublesTier: "DUber",
|
2426 |
+
natDexTier: "Uber",
|
2427 |
+
},
|
2428 |
+
rayquazamega: {
|
2429 |
+
isNonstandard: "Past",
|
2430 |
+
tier: "Illegal",
|
2431 |
+
natDexTier: "AG",
|
2432 |
+
},
|
2433 |
+
jirachi: {
|
2434 |
+
tier: "RU",
|
2435 |
+
doublesTier: "(DUU)",
|
2436 |
+
natDexTier: "RUBL",
|
2437 |
+
},
|
2438 |
+
deoxys: {
|
2439 |
+
tier: "Uber",
|
2440 |
+
doublesTier: "DUU",
|
2441 |
+
natDexTier: "Uber",
|
2442 |
+
},
|
2443 |
+
deoxysattack: {
|
2444 |
+
tier: "Uber",
|
2445 |
+
doublesTier: "DUber",
|
2446 |
+
natDexTier: "Uber",
|
2447 |
+
},
|
2448 |
+
deoxysdefense: {
|
2449 |
+
tier: "NUBL",
|
2450 |
+
doublesTier: "(DUU)",
|
2451 |
+
natDexTier: "RU",
|
2452 |
+
},
|
2453 |
+
deoxysspeed: {
|
2454 |
+
tier: "UU",
|
2455 |
+
doublesTier: "(DUU)",
|
2456 |
+
natDexTier: "Uber",
|
2457 |
+
},
|
2458 |
+
turtwig: {
|
2459 |
+
tier: "LC",
|
2460 |
+
},
|
2461 |
+
grotle: {
|
2462 |
+
tier: "NFE",
|
2463 |
+
},
|
2464 |
+
torterra: {
|
2465 |
+
tier: "PUBL",
|
2466 |
+
doublesTier: "(DUU)",
|
2467 |
+
natDexTier: "RU",
|
2468 |
+
},
|
2469 |
+
chimchar: {
|
2470 |
+
tier: "LC",
|
2471 |
+
},
|
2472 |
+
monferno: {
|
2473 |
+
tier: "NFE",
|
2474 |
+
},
|
2475 |
+
infernape: {
|
2476 |
+
tier: "NU",
|
2477 |
+
doublesTier: "(DUU)",
|
2478 |
+
natDexTier: "RU",
|
2479 |
+
},
|
2480 |
+
piplup: {
|
2481 |
+
tier: "LC",
|
2482 |
+
},
|
2483 |
+
prinplup: {
|
2484 |
+
tier: "NFE",
|
2485 |
+
},
|
2486 |
+
empoleon: {
|
2487 |
+
tier: "RU",
|
2488 |
+
doublesTier: "(DUU)",
|
2489 |
+
natDexTier: "RU",
|
2490 |
+
},
|
2491 |
+
starly: {
|
2492 |
+
tier: "LC",
|
2493 |
+
},
|
2494 |
+
staravia: {
|
2495 |
+
tier: "NFE",
|
2496 |
+
},
|
2497 |
+
staraptor: {
|
2498 |
+
tier: "NU",
|
2499 |
+
doublesTier: "(DUU)",
|
2500 |
+
natDexTier: "RU",
|
2501 |
+
},
|
2502 |
+
bidoof: {
|
2503 |
+
isNonstandard: "Past",
|
2504 |
+
tier: "Illegal",
|
2505 |
+
natDexTier: "LC",
|
2506 |
+
},
|
2507 |
+
bibarel: {
|
2508 |
+
isNonstandard: "Past",
|
2509 |
+
tier: "Illegal",
|
2510 |
+
natDexTier: "RU",
|
2511 |
+
},
|
2512 |
+
kricketot: {
|
2513 |
+
tier: "LC",
|
2514 |
+
},
|
2515 |
+
kricketune: {
|
2516 |
+
tier: "ZU",
|
2517 |
+
doublesTier: "(DUU)",
|
2518 |
+
natDexTier: "RU",
|
2519 |
+
},
|
2520 |
+
shinx: {
|
2521 |
+
tier: "LC",
|
2522 |
+
},
|
2523 |
+
luxio: {
|
2524 |
+
tier: "NFE",
|
2525 |
+
},
|
2526 |
+
luxray: {
|
2527 |
+
tier: "ZU",
|
2528 |
+
doublesTier: "(DUU)",
|
2529 |
+
natDexTier: "RU",
|
2530 |
+
},
|
2531 |
+
cranidos: {
|
2532 |
+
tier: "LC",
|
2533 |
+
},
|
2534 |
+
rampardos: {
|
2535 |
+
tier: "ZU",
|
2536 |
+
doublesTier: "(DUU)",
|
2537 |
+
natDexTier: "RU",
|
2538 |
+
},
|
2539 |
+
shieldon: {
|
2540 |
+
tier: "LC",
|
2541 |
+
},
|
2542 |
+
bastiodon: {
|
2543 |
+
tier: "ZU",
|
2544 |
+
doublesTier: "(DUU)",
|
2545 |
+
natDexTier: "RU",
|
2546 |
+
},
|
2547 |
+
burmy: {
|
2548 |
+
isNonstandard: "Past",
|
2549 |
+
tier: "Illegal",
|
2550 |
+
natDexTier: "LC",
|
2551 |
+
},
|
2552 |
+
wormadam: {
|
2553 |
+
isNonstandard: "Past",
|
2554 |
+
tier: "Illegal",
|
2555 |
+
natDexTier: "RU",
|
2556 |
+
},
|
2557 |
+
wormadamsandy: {
|
2558 |
+
isNonstandard: "Past",
|
2559 |
+
tier: "Illegal",
|
2560 |
+
natDexTier: "RU",
|
2561 |
+
},
|
2562 |
+
wormadamtrash: {
|
2563 |
+
isNonstandard: "Past",
|
2564 |
+
tier: "Illegal",
|
2565 |
+
natDexTier: "RU",
|
2566 |
+
},
|
2567 |
+
mothim: {
|
2568 |
+
isNonstandard: "Past",
|
2569 |
+
tier: "Illegal",
|
2570 |
+
natDexTier: "RU",
|
2571 |
+
},
|
2572 |
+
combee: {
|
2573 |
+
tier: "LC",
|
2574 |
+
},
|
2575 |
+
vespiquen: {
|
2576 |
+
tier: "ZU",
|
2577 |
+
doublesTier: "(DUU)",
|
2578 |
+
natDexTier: "RU",
|
2579 |
+
},
|
2580 |
+
pachirisu: {
|
2581 |
+
tier: "ZU",
|
2582 |
+
doublesTier: "(DUU)",
|
2583 |
+
natDexTier: "RU",
|
2584 |
+
},
|
2585 |
+
buizel: {
|
2586 |
+
tier: "LC",
|
2587 |
+
},
|
2588 |
+
floatzel: {
|
2589 |
+
tier: "ZU",
|
2590 |
+
doublesTier: "(DUU)",
|
2591 |
+
natDexTier: "RU",
|
2592 |
+
},
|
2593 |
+
cherubi: {
|
2594 |
+
isNonstandard: "Past",
|
2595 |
+
tier: "Illegal",
|
2596 |
+
natDexTier: "LC",
|
2597 |
+
},
|
2598 |
+
cherrim: {
|
2599 |
+
isNonstandard: "Past",
|
2600 |
+
tier: "Illegal",
|
2601 |
+
natDexTier: "RU",
|
2602 |
+
},
|
2603 |
+
cherrimsunshine: {
|
2604 |
+
isNonstandard: "Past",
|
2605 |
+
},
|
2606 |
+
shellos: {
|
2607 |
+
tier: "LC",
|
2608 |
+
},
|
2609 |
+
gastrodon: {
|
2610 |
+
tier: "NU",
|
2611 |
+
doublesTier: "(DUU)",
|
2612 |
+
natDexTier: "RU",
|
2613 |
+
},
|
2614 |
+
drifloon: {
|
2615 |
+
tier: "LC",
|
2616 |
+
natDexTier: "NFE",
|
2617 |
+
},
|
2618 |
+
drifblim: {
|
2619 |
+
tier: "ZU",
|
2620 |
+
doublesTier: "(DUU)",
|
2621 |
+
natDexTier: "RU",
|
2622 |
+
},
|
2623 |
+
buneary: {
|
2624 |
+
isNonstandard: "Past",
|
2625 |
+
tier: "Illegal",
|
2626 |
+
natDexTier: "LC",
|
2627 |
+
},
|
2628 |
+
lopunny: {
|
2629 |
+
isNonstandard: "Past",
|
2630 |
+
tier: "Illegal",
|
2631 |
+
natDexTier: "RU",
|
2632 |
+
},
|
2633 |
+
lopunnymega: {
|
2634 |
+
isNonstandard: "Past",
|
2635 |
+
tier: "Illegal",
|
2636 |
+
natDexTier: "OU",
|
2637 |
+
},
|
2638 |
+
glameow: {
|
2639 |
+
isNonstandard: "Past",
|
2640 |
+
tier: "Illegal",
|
2641 |
+
natDexTier: "LC",
|
2642 |
+
},
|
2643 |
+
purugly: {
|
2644 |
+
isNonstandard: "Past",
|
2645 |
+
tier: "Illegal",
|
2646 |
+
natDexTier: "RU",
|
2647 |
+
},
|
2648 |
+
stunky: {
|
2649 |
+
tier: "LC",
|
2650 |
+
},
|
2651 |
+
skuntank: {
|
2652 |
+
tier: "PU",
|
2653 |
+
doublesTier: "(DUU)",
|
2654 |
+
natDexTier: "RU",
|
2655 |
+
},
|
2656 |
+
bronzor: {
|
2657 |
+
tier: "LC",
|
2658 |
+
},
|
2659 |
+
bronzong: {
|
2660 |
+
tier: "NU",
|
2661 |
+
doublesTier: "(DUU)",
|
2662 |
+
natDexTier: "RU",
|
2663 |
+
},
|
2664 |
+
chatot: {
|
2665 |
+
isNonstandard: "Past",
|
2666 |
+
tier: "Illegal",
|
2667 |
+
natDexTier: "RU",
|
2668 |
+
},
|
2669 |
+
spiritomb: {
|
2670 |
+
tier: "ZU",
|
2671 |
+
doublesTier: "(DUU)",
|
2672 |
+
natDexTier: "RU",
|
2673 |
+
},
|
2674 |
+
gible: {
|
2675 |
+
tier: "LC",
|
2676 |
+
},
|
2677 |
+
gabite: {
|
2678 |
+
tier: "NFE",
|
2679 |
+
},
|
2680 |
+
garchomp: {
|
2681 |
+
tier: "UUBL",
|
2682 |
+
doublesTier: "DUU",
|
2683 |
+
natDexTier: "OU",
|
2684 |
+
},
|
2685 |
+
garchompmega: {
|
2686 |
+
isNonstandard: "Past",
|
2687 |
+
tier: "Illegal",
|
2688 |
+
natDexTier: "(OU)",
|
2689 |
+
},
|
2690 |
+
riolu: {
|
2691 |
+
tier: "LC",
|
2692 |
+
},
|
2693 |
+
lucario: {
|
2694 |
+
tier: "NUBL",
|
2695 |
+
doublesTier: "(DUU)",
|
2696 |
+
natDexTier: "RU",
|
2697 |
+
},
|
2698 |
+
lucariomega: {
|
2699 |
+
isNonstandard: "Past",
|
2700 |
+
tier: "Illegal",
|
2701 |
+
natDexTier: "Uber",
|
2702 |
+
},
|
2703 |
+
hippopotas: {
|
2704 |
+
tier: "LC",
|
2705 |
+
},
|
2706 |
+
hippowdon: {
|
2707 |
+
tier: "RU",
|
2708 |
+
doublesTier: "DUU",
|
2709 |
+
natDexTier: "UU",
|
2710 |
+
},
|
2711 |
+
skorupi: {
|
2712 |
+
isNonstandard: "Past",
|
2713 |
+
tier: "Illegal",
|
2714 |
+
natDexTier: "LC",
|
2715 |
+
},
|
2716 |
+
drapion: {
|
2717 |
+
isNonstandard: "Past",
|
2718 |
+
tier: "Illegal",
|
2719 |
+
natDexTier: "RU",
|
2720 |
+
},
|
2721 |
+
croagunk: {
|
2722 |
+
tier: "LC",
|
2723 |
+
},
|
2724 |
+
toxicroak: {
|
2725 |
+
tier: "NU",
|
2726 |
+
doublesTier: "(DUU)",
|
2727 |
+
natDexTier: "RU",
|
2728 |
+
},
|
2729 |
+
carnivine: {
|
2730 |
+
isNonstandard: "Past",
|
2731 |
+
tier: "Illegal",
|
2732 |
+
natDexTier: "RU",
|
2733 |
+
},
|
2734 |
+
finneon: {
|
2735 |
+
tier: "LC",
|
2736 |
+
},
|
2737 |
+
lumineon: {
|
2738 |
+
tier: "ZU",
|
2739 |
+
doublesTier: "(DUU)",
|
2740 |
+
natDexTier: "RU",
|
2741 |
+
},
|
2742 |
+
snover: {
|
2743 |
+
tier: "LC",
|
2744 |
+
},
|
2745 |
+
abomasnow: {
|
2746 |
+
tier: "ZU",
|
2747 |
+
doublesTier: "DUU",
|
2748 |
+
natDexTier: "RU",
|
2749 |
+
},
|
2750 |
+
abomasnowmega: {
|
2751 |
+
isNonstandard: "Past",
|
2752 |
+
tier: "Illegal",
|
2753 |
+
natDexTier: "RU",
|
2754 |
+
},
|
2755 |
+
rotom: {
|
2756 |
+
tier: "ZU",
|
2757 |
+
doublesTier: "(DUU)",
|
2758 |
+
natDexTier: "RU",
|
2759 |
+
},
|
2760 |
+
rotomheat: {
|
2761 |
+
tier: "PU",
|
2762 |
+
doublesTier: "(DUU)",
|
2763 |
+
natDexTier: "RU",
|
2764 |
+
},
|
2765 |
+
rotomwash: {
|
2766 |
+
tier: "UU",
|
2767 |
+
doublesTier: "(DUU)",
|
2768 |
+
natDexTier: "UU",
|
2769 |
+
},
|
2770 |
+
rotomfrost: {
|
2771 |
+
tier: "ZU",
|
2772 |
+
doublesTier: "(DUU)",
|
2773 |
+
natDexTier: "RU",
|
2774 |
+
},
|
2775 |
+
rotomfan: {
|
2776 |
+
tier: "ZU",
|
2777 |
+
doublesTier: "(DUU)",
|
2778 |
+
natDexTier: "RU",
|
2779 |
+
},
|
2780 |
+
rotommow: {
|
2781 |
+
tier: "ZU",
|
2782 |
+
doublesTier: "(DUU)",
|
2783 |
+
natDexTier: "RU",
|
2784 |
+
},
|
2785 |
+
uxie: {
|
2786 |
+
tier: "PU",
|
2787 |
+
doublesTier: "(DUU)",
|
2788 |
+
natDexTier: "RU",
|
2789 |
+
},
|
2790 |
+
mesprit: {
|
2791 |
+
tier: "ZU",
|
2792 |
+
doublesTier: "(DUU)",
|
2793 |
+
natDexTier: "RU",
|
2794 |
+
},
|
2795 |
+
azelf: {
|
2796 |
+
tier: "RU",
|
2797 |
+
doublesTier: "(DUU)",
|
2798 |
+
natDexTier: "RU",
|
2799 |
+
},
|
2800 |
+
dialga: {
|
2801 |
+
tier: "Uber",
|
2802 |
+
doublesTier: "DUber",
|
2803 |
+
natDexTier: "Uber",
|
2804 |
+
},
|
2805 |
+
dialgaorigin: {
|
2806 |
+
tier: "Uber",
|
2807 |
+
doublesTier: "DUber",
|
2808 |
+
natDexTier: "Uber",
|
2809 |
+
},
|
2810 |
+
palkia: {
|
2811 |
+
tier: "Uber",
|
2812 |
+
doublesTier: "DUber",
|
2813 |
+
natDexTier: "Uber",
|
2814 |
+
},
|
2815 |
+
palkiaorigin: {
|
2816 |
+
tier: "Uber",
|
2817 |
+
doublesTier: "DUber",
|
2818 |
+
natDexTier: "Uber",
|
2819 |
+
},
|
2820 |
+
heatran: {
|
2821 |
+
tier: "UU",
|
2822 |
+
doublesTier: "DUU",
|
2823 |
+
natDexTier: "OU",
|
2824 |
+
},
|
2825 |
+
regigigas: {
|
2826 |
+
tier: "ZU",
|
2827 |
+
doublesTier: "(DUU)",
|
2828 |
+
natDexTier: "RU",
|
2829 |
+
},
|
2830 |
+
giratina: {
|
2831 |
+
tier: "Uber",
|
2832 |
+
doublesTier: "DUber",
|
2833 |
+
natDexTier: "Uber",
|
2834 |
+
},
|
2835 |
+
giratinaorigin: {
|
2836 |
+
tier: "Uber",
|
2837 |
+
doublesTier: "DUber",
|
2838 |
+
natDexTier: "Uber",
|
2839 |
+
},
|
2840 |
+
cresselia: {
|
2841 |
+
tier: "NUBL",
|
2842 |
+
doublesTier: "DOU",
|
2843 |
+
natDexTier: "RU",
|
2844 |
+
},
|
2845 |
+
phione: {
|
2846 |
+
tier: "ZU",
|
2847 |
+
doublesTier: "(DUU)",
|
2848 |
+
natDexTier: "RU",
|
2849 |
+
},
|
2850 |
+
manaphy: {
|
2851 |
+
tier: "RUBL",
|
2852 |
+
doublesTier: "(DUU)",
|
2853 |
+
natDexTier: "UUBL",
|
2854 |
+
},
|
2855 |
+
darkrai: {
|
2856 |
+
tier: "OU",
|
2857 |
+
doublesTier: "DUber",
|
2858 |
+
natDexTier: "Uber",
|
2859 |
+
},
|
2860 |
+
shaymin: {
|
2861 |
+
tier: "ZU",
|
2862 |
+
doublesTier: "(DUU)",
|
2863 |
+
natDexTier: "RU",
|
2864 |
+
},
|
2865 |
+
shayminsky: {
|
2866 |
+
tier: "Uber",
|
2867 |
+
doublesTier: "(DUU)",
|
2868 |
+
natDexTier: "Uber",
|
2869 |
+
},
|
2870 |
+
arceus: {
|
2871 |
+
tier: "Uber",
|
2872 |
+
doublesTier: "DUber",
|
2873 |
+
natDexTier: "Uber",
|
2874 |
+
},
|
2875 |
+
victini: {
|
2876 |
+
isNonstandard: "Past",
|
2877 |
+
tier: "Illegal",
|
2878 |
+
natDexTier: "UU",
|
2879 |
+
},
|
2880 |
+
snivy: {
|
2881 |
+
tier: "NFE",
|
2882 |
+
},
|
2883 |
+
servine: {
|
2884 |
+
tier: "NFE",
|
2885 |
+
},
|
2886 |
+
serperior: {
|
2887 |
+
tier: "UU",
|
2888 |
+
doublesTier: "(DUU)",
|
2889 |
+
natDexTier: "UU",
|
2890 |
+
},
|
2891 |
+
tepig: {
|
2892 |
+
tier: "LC",
|
2893 |
+
},
|
2894 |
+
pignite: {
|
2895 |
+
tier: "NFE",
|
2896 |
+
},
|
2897 |
+
emboar: {
|
2898 |
+
tier: "ZUBL",
|
2899 |
+
doublesTier: "(DUU)",
|
2900 |
+
natDexTier: "RU",
|
2901 |
+
},
|
2902 |
+
oshawott: {
|
2903 |
+
tier: "LC",
|
2904 |
+
},
|
2905 |
+
dewott: {
|
2906 |
+
tier: "NFE",
|
2907 |
+
},
|
2908 |
+
samurott: {
|
2909 |
+
tier: "ZU",
|
2910 |
+
doublesTier: "(DUU)",
|
2911 |
+
natDexTier: "RU",
|
2912 |
+
},
|
2913 |
+
samurotthisui: {
|
2914 |
+
tier: "OU",
|
2915 |
+
doublesTier: "(DUU)",
|
2916 |
+
natDexTier: "OU",
|
2917 |
+
},
|
2918 |
+
patrat: {
|
2919 |
+
isNonstandard: "Past",
|
2920 |
+
tier: "Illegal",
|
2921 |
+
natDexTier: "LC",
|
2922 |
+
},
|
2923 |
+
watchog: {
|
2924 |
+
isNonstandard: "Past",
|
2925 |
+
tier: "Illegal",
|
2926 |
+
natDexTier: "RU",
|
2927 |
+
},
|
2928 |
+
lillipup: {
|
2929 |
+
isNonstandard: "Past",
|
2930 |
+
tier: "Illegal",
|
2931 |
+
natDexTier: "LC",
|
2932 |
+
},
|
2933 |
+
herdier: {
|
2934 |
+
isNonstandard: "Past",
|
2935 |
+
tier: "Illegal",
|
2936 |
+
natDexTier: "NFE",
|
2937 |
+
},
|
2938 |
+
stoutland: {
|
2939 |
+
isNonstandard: "Past",
|
2940 |
+
tier: "Illegal",
|
2941 |
+
natDexTier: "RU",
|
2942 |
+
},
|
2943 |
+
purrloin: {
|
2944 |
+
isNonstandard: "Past",
|
2945 |
+
tier: "Illegal",
|
2946 |
+
natDexTier: "LC",
|
2947 |
+
},
|
2948 |
+
liepard: {
|
2949 |
+
isNonstandard: "Past",
|
2950 |
+
tier: "Illegal",
|
2951 |
+
natDexTier: "RU",
|
2952 |
+
},
|
2953 |
+
pansage: {
|
2954 |
+
isNonstandard: "Past",
|
2955 |
+
tier: "Illegal",
|
2956 |
+
natDexTier: "LC",
|
2957 |
+
},
|
2958 |
+
simisage: {
|
2959 |
+
isNonstandard: "Past",
|
2960 |
+
tier: "Illegal",
|
2961 |
+
natDexTier: "RU",
|
2962 |
+
},
|
2963 |
+
pansear: {
|
2964 |
+
isNonstandard: "Past",
|
2965 |
+
tier: "Illegal",
|
2966 |
+
natDexTier: "LC",
|
2967 |
+
},
|
2968 |
+
simisear: {
|
2969 |
+
isNonstandard: "Past",
|
2970 |
+
tier: "Illegal",
|
2971 |
+
natDexTier: "RU",
|
2972 |
+
},
|
2973 |
+
panpour: {
|
2974 |
+
isNonstandard: "Past",
|
2975 |
+
tier: "Illegal",
|
2976 |
+
natDexTier: "LC",
|
2977 |
+
},
|
2978 |
+
simipour: {
|
2979 |
+
isNonstandard: "Past",
|
2980 |
+
tier: "Illegal",
|
2981 |
+
natDexTier: "RU",
|
2982 |
+
},
|
2983 |
+
munna: {
|
2984 |
+
isNonstandard: "Past",
|
2985 |
+
tier: "Illegal",
|
2986 |
+
natDexTier: "LC",
|
2987 |
+
},
|
2988 |
+
musharna: {
|
2989 |
+
isNonstandard: "Past",
|
2990 |
+
tier: "Illegal",
|
2991 |
+
natDexTier: "RU",
|
2992 |
+
},
|
2993 |
+
pidove: {
|
2994 |
+
isNonstandard: "Past",
|
2995 |
+
tier: "Illegal",
|
2996 |
+
natDexTier: "LC",
|
2997 |
+
},
|
2998 |
+
tranquill: {
|
2999 |
+
isNonstandard: "Past",
|
3000 |
+
tier: "Illegal",
|
3001 |
+
natDexTier: "NFE",
|
3002 |
+
},
|
3003 |
+
unfezant: {
|
3004 |
+
isNonstandard: "Past",
|
3005 |
+
tier: "Illegal",
|
3006 |
+
natDexTier: "RU",
|
3007 |
+
},
|
3008 |
+
blitzle: {
|
3009 |
+
tier: "LC",
|
3010 |
+
},
|
3011 |
+
zebstrika: {
|
3012 |
+
tier: "ZU",
|
3013 |
+
doublesTier: "(DUU)",
|
3014 |
+
natDexTier: "RU",
|
3015 |
+
},
|
3016 |
+
roggenrola: {
|
3017 |
+
isNonstandard: "Past",
|
3018 |
+
tier: "Illegal",
|
3019 |
+
natDexTier: "LC",
|
3020 |
+
},
|
3021 |
+
boldore: {
|
3022 |
+
isNonstandard: "Past",
|
3023 |
+
tier: "Illegal",
|
3024 |
+
natDexTier: "NFE",
|
3025 |
+
},
|
3026 |
+
gigalith: {
|
3027 |
+
isNonstandard: "Past",
|
3028 |
+
tier: "Illegal",
|
3029 |
+
natDexTier: "RU",
|
3030 |
+
},
|
3031 |
+
woobat: {
|
3032 |
+
isNonstandard: "Past",
|
3033 |
+
tier: "Illegal",
|
3034 |
+
natDexTier: "NFE",
|
3035 |
+
},
|
3036 |
+
swoobat: {
|
3037 |
+
isNonstandard: "Past",
|
3038 |
+
tier: "Illegal",
|
3039 |
+
natDexTier: "RU",
|
3040 |
+
},
|
3041 |
+
drilbur: {
|
3042 |
+
tier: "LC",
|
3043 |
+
},
|
3044 |
+
excadrill: {
|
3045 |
+
tier: "UU",
|
3046 |
+
doublesTier: "(DUU)",
|
3047 |
+
natDexTier: "UU",
|
3048 |
+
},
|
3049 |
+
audino: {
|
3050 |
+
isNonstandard: "Past",
|
3051 |
+
tier: "Illegal",
|
3052 |
+
natDexTier: "RU",
|
3053 |
+
},
|
3054 |
+
audinomega: {
|
3055 |
+
isNonstandard: "Past",
|
3056 |
+
tier: "Illegal",
|
3057 |
+
natDexTier: "RU",
|
3058 |
+
},
|
3059 |
+
timburr: {
|
3060 |
+
tier: "LC",
|
3061 |
+
},
|
3062 |
+
gurdurr: {
|
3063 |
+
tier: "NFE",
|
3064 |
+
},
|
3065 |
+
conkeldurr: {
|
3066 |
+
tier: "UU",
|
3067 |
+
doublesTier: "(DUU)",
|
3068 |
+
natDexTier: "RUBL",
|
3069 |
+
},
|
3070 |
+
tympole: {
|
3071 |
+
isNonstandard: "Past",
|
3072 |
+
tier: "Illegal",
|
3073 |
+
natDexTier: "LC",
|
3074 |
+
},
|
3075 |
+
palpitoad: {
|
3076 |
+
isNonstandard: "Past",
|
3077 |
+
tier: "Illegal",
|
3078 |
+
natDexTier: "NFE",
|
3079 |
+
},
|
3080 |
+
seismitoad: {
|
3081 |
+
isNonstandard: "Past",
|
3082 |
+
tier: "Illegal",
|
3083 |
+
natDexTier: "RU",
|
3084 |
+
},
|
3085 |
+
throh: {
|
3086 |
+
isNonstandard: "Past",
|
3087 |
+
tier: "Illegal",
|
3088 |
+
natDexTier: "RU",
|
3089 |
+
},
|
3090 |
+
sawk: {
|
3091 |
+
isNonstandard: "Past",
|
3092 |
+
tier: "Illegal",
|
3093 |
+
natDexTier: "RU",
|
3094 |
+
},
|
3095 |
+
sewaddle: {
|
3096 |
+
tier: "LC",
|
3097 |
+
},
|
3098 |
+
swadloon: {
|
3099 |
+
tier: "NFE",
|
3100 |
+
},
|
3101 |
+
leavanny: {
|
3102 |
+
tier: "ZU",
|
3103 |
+
doublesTier: "(DUU)",
|
3104 |
+
natDexTier: "RU",
|
3105 |
+
},
|
3106 |
+
venipede: {
|
3107 |
+
isNonstandard: "Past",
|
3108 |
+
tier: "Illegal",
|
3109 |
+
natDexTier: "LC",
|
3110 |
+
},
|
3111 |
+
whirlipede: {
|
3112 |
+
isNonstandard: "Past",
|
3113 |
+
tier: "Illegal",
|
3114 |
+
natDexTier: "NFE",
|
3115 |
+
},
|
3116 |
+
scolipede: {
|
3117 |
+
isNonstandard: "Past",
|
3118 |
+
tier: "Illegal",
|
3119 |
+
natDexTier: "RUBL",
|
3120 |
+
},
|
3121 |
+
cottonee: {
|
3122 |
+
tier: "LC",
|
3123 |
+
},
|
3124 |
+
whimsicott: {
|
3125 |
+
tier: "ZU",
|
3126 |
+
doublesTier: "DOU",
|
3127 |
+
natDexTier: "RU",
|
3128 |
+
},
|
3129 |
+
petilil: {
|
3130 |
+
tier: "LC",
|
3131 |
+
},
|
3132 |
+
lilligant: {
|
3133 |
+
tier: "ZU",
|
3134 |
+
doublesTier: "(DUU)",
|
3135 |
+
natDexTier: "RU",
|
3136 |
+
},
|
3137 |
+
lilliganthisui: {
|
3138 |
+
tier: "NUBL",
|
3139 |
+
doublesTier: "(DUU)",
|
3140 |
+
natDexTier: "RUBL",
|
3141 |
+
},
|
3142 |
+
basculin: {
|
3143 |
+
tier: "ZU",
|
3144 |
+
doublesTier: "(DUU)",
|
3145 |
+
natDexTier: "RU",
|
3146 |
+
},
|
3147 |
+
basculegion: {
|
3148 |
+
tier: "NU",
|
3149 |
+
doublesTier: "DUber",
|
3150 |
+
natDexTier: "RU",
|
3151 |
+
},
|
3152 |
+
basculegionf: {
|
3153 |
+
tier: "RU",
|
3154 |
+
doublesTier: "DUU",
|
3155 |
+
natDexTier: "RU",
|
3156 |
+
},
|
3157 |
+
sandile: {
|
3158 |
+
tier: "LC",
|
3159 |
+
},
|
3160 |
+
krokorok: {
|
3161 |
+
tier: "NFE",
|
3162 |
+
},
|
3163 |
+
krookodile: {
|
3164 |
+
tier: "RU",
|
3165 |
+
doublesTier: "(DUU)",
|
3166 |
+
natDexTier: "RU",
|
3167 |
+
},
|
3168 |
+
darumaka: {
|
3169 |
+
isNonstandard: "Past",
|
3170 |
+
tier: "Illegal",
|
3171 |
+
natDexTier: "LC",
|
3172 |
+
},
|
3173 |
+
darumakagalar: {
|
3174 |
+
isNonstandard: "Past",
|
3175 |
+
tier: "Illegal",
|
3176 |
+
natDexTier: "LC",
|
3177 |
+
},
|
3178 |
+
darmanitan: {
|
3179 |
+
isNonstandard: "Past",
|
3180 |
+
tier: "Illegal",
|
3181 |
+
natDexTier: "RU",
|
3182 |
+
},
|
3183 |
+
darmanitanzen: {
|
3184 |
+
isNonstandard: "Past",
|
3185 |
+
},
|
3186 |
+
darmanitangalar: {
|
3187 |
+
isNonstandard: "Past",
|
3188 |
+
tier: "Illegal",
|
3189 |
+
natDexTier: "Uber",
|
3190 |
+
},
|
3191 |
+
darmanitangalarzen: {
|
3192 |
+
isNonstandard: "Past",
|
3193 |
+
},
|
3194 |
+
maractus: {
|
3195 |
+
isNonstandard: "Past",
|
3196 |
+
tier: "Illegal",
|
3197 |
+
natDexTier: "RU",
|
3198 |
+
},
|
3199 |
+
dwebble: {
|
3200 |
+
isNonstandard: "Past",
|
3201 |
+
tier: "Illegal",
|
3202 |
+
natDexTier: "LC",
|
3203 |
+
},
|
3204 |
+
crustle: {
|
3205 |
+
isNonstandard: "Past",
|
3206 |
+
tier: "Illegal",
|
3207 |
+
natDexTier: "RU",
|
3208 |
+
},
|
3209 |
+
scraggy: {
|
3210 |
+
tier: "NFE",
|
3211 |
+
},
|
3212 |
+
scrafty: {
|
3213 |
+
tier: "PU",
|
3214 |
+
doublesTier: "(DUU)",
|
3215 |
+
natDexTier: "RU",
|
3216 |
+
},
|
3217 |
+
sigilyph: {
|
3218 |
+
isNonstandard: "Past",
|
3219 |
+
tier: "Illegal",
|
3220 |
+
natDexTier: "RU",
|
3221 |
+
},
|
3222 |
+
yamask: {
|
3223 |
+
isNonstandard: "Past",
|
3224 |
+
tier: "Illegal",
|
3225 |
+
natDexTier: "LC",
|
3226 |
+
},
|
3227 |
+
yamaskgalar: {
|
3228 |
+
isNonstandard: "Past",
|
3229 |
+
tier: "Illegal",
|
3230 |
+
natDexTier: "LC",
|
3231 |
+
},
|
3232 |
+
cofagrigus: {
|
3233 |
+
isNonstandard: "Past",
|
3234 |
+
tier: "Illegal",
|
3235 |
+
natDexTier: "RU",
|
3236 |
+
},
|
3237 |
+
runerigus: {
|
3238 |
+
isNonstandard: "Past",
|
3239 |
+
tier: "Illegal",
|
3240 |
+
natDexTier: "RU",
|
3241 |
+
},
|
3242 |
+
tirtouga: {
|
3243 |
+
isNonstandard: "Past",
|
3244 |
+
tier: "Illegal",
|
3245 |
+
natDexTier: "LC",
|
3246 |
+
},
|
3247 |
+
carracosta: {
|
3248 |
+
isNonstandard: "Past",
|
3249 |
+
tier: "Illegal",
|
3250 |
+
natDexTier: "RU",
|
3251 |
+
},
|
3252 |
+
archen: {
|
3253 |
+
isNonstandard: "Past",
|
3254 |
+
tier: "Illegal",
|
3255 |
+
natDexTier: "LC",
|
3256 |
+
},
|
3257 |
+
archeops: {
|
3258 |
+
isNonstandard: "Past",
|
3259 |
+
tier: "Illegal",
|
3260 |
+
natDexTier: "RU",
|
3261 |
+
},
|
3262 |
+
trubbish: {
|
3263 |
+
isNonstandard: "Past",
|
3264 |
+
tier: "Illegal",
|
3265 |
+
natDexTier: "LC",
|
3266 |
+
},
|
3267 |
+
garbodor: {
|
3268 |
+
isNonstandard: "Past",
|
3269 |
+
tier: "Illegal",
|
3270 |
+
natDexTier: "RU",
|
3271 |
+
},
|
3272 |
+
garbodorgmax: {
|
3273 |
+
isNonstandard: "Past",
|
3274 |
+
tier: "Illegal",
|
3275 |
+
},
|
3276 |
+
zorua: {
|
3277 |
+
tier: "LC",
|
3278 |
+
},
|
3279 |
+
zoruahisui: {
|
3280 |
+
tier: "LC",
|
3281 |
+
},
|
3282 |
+
zoroark: {
|
3283 |
+
tier: "PU",
|
3284 |
+
doublesTier: "(DUU)",
|
3285 |
+
natDexTier: "RU",
|
3286 |
+
},
|
3287 |
+
zoroarkhisui: {
|
3288 |
+
tier: "RU",
|
3289 |
+
doublesTier: "(DUU)",
|
3290 |
+
natDexTier: "RUBL",
|
3291 |
+
},
|
3292 |
+
minccino: {
|
3293 |
+
tier: "LC",
|
3294 |
+
},
|
3295 |
+
cinccino: {
|
3296 |
+
tier: "NU",
|
3297 |
+
doublesTier: "(DUU)",
|
3298 |
+
natDexTier: "RU",
|
3299 |
+
},
|
3300 |
+
gothita: {
|
3301 |
+
tier: "LC",
|
3302 |
+
},
|
3303 |
+
gothorita: {
|
3304 |
+
tier: "NFE",
|
3305 |
+
},
|
3306 |
+
gothitelle: {
|
3307 |
+
tier: "ZU",
|
3308 |
+
doublesTier: "(DUU)",
|
3309 |
+
natDexTier: "RU",
|
3310 |
+
},
|
3311 |
+
solosis: {
|
3312 |
+
tier: "LC",
|
3313 |
+
},
|
3314 |
+
duosion: {
|
3315 |
+
tier: "NFE",
|
3316 |
+
},
|
3317 |
+
reuniclus: {
|
3318 |
+
tier: "RU",
|
3319 |
+
doublesTier: "(DUU)",
|
3320 |
+
natDexTier: "RU",
|
3321 |
+
},
|
3322 |
+
ducklett: {
|
3323 |
+
tier: "LC",
|
3324 |
+
},
|
3325 |
+
swanna: {
|
3326 |
+
tier: "ZU",
|
3327 |
+
doublesTier: "(DUU)",
|
3328 |
+
natDexTier: "RU",
|
3329 |
+
},
|
3330 |
+
vanillite: {
|
3331 |
+
isNonstandard: "Past",
|
3332 |
+
tier: "Illegal",
|
3333 |
+
natDexTier: "LC",
|
3334 |
+
},
|
3335 |
+
vanillish: {
|
3336 |
+
isNonstandard: "Past",
|
3337 |
+
tier: "Illegal",
|
3338 |
+
natDexTier: "NFE",
|
3339 |
+
},
|
3340 |
+
vanilluxe: {
|
3341 |
+
isNonstandard: "Past",
|
3342 |
+
tier: "Illegal",
|
3343 |
+
natDexTier: "RU",
|
3344 |
+
},
|
3345 |
+
deerling: {
|
3346 |
+
tier: "LC",
|
3347 |
+
},
|
3348 |
+
sawsbuck: {
|
3349 |
+
tier: "ZU",
|
3350 |
+
doublesTier: "(DUU)",
|
3351 |
+
natDexTier: "RU",
|
3352 |
+
},
|
3353 |
+
emolga: {
|
3354 |
+
isNonstandard: "Past",
|
3355 |
+
tier: "Illegal",
|
3356 |
+
natDexTier: "RU",
|
3357 |
+
},
|
3358 |
+
karrablast: {
|
3359 |
+
isNonstandard: "Past",
|
3360 |
+
tier: "Illegal",
|
3361 |
+
natDexTier: "LC",
|
3362 |
+
},
|
3363 |
+
escavalier: {
|
3364 |
+
isNonstandard: "Past",
|
3365 |
+
tier: "Illegal",
|
3366 |
+
natDexTier: "RU",
|
3367 |
+
},
|
3368 |
+
foongus: {
|
3369 |
+
tier: "LC",
|
3370 |
+
},
|
3371 |
+
amoonguss: {
|
3372 |
+
tier: "NU",
|
3373 |
+
doublesTier: "DOU",
|
3374 |
+
natDexTier: "RU",
|
3375 |
+
},
|
3376 |
+
frillish: {
|
3377 |
+
isNonstandard: "Past",
|
3378 |
+
tier: "Illegal",
|
3379 |
+
natDexTier: "LC",
|
3380 |
+
},
|
3381 |
+
jellicent: {
|
3382 |
+
isNonstandard: "Past",
|
3383 |
+
tier: "Illegal",
|
3384 |
+
natDexTier: "RU",
|
3385 |
+
},
|
3386 |
+
alomomola: {
|
3387 |
+
tier: "OU",
|
3388 |
+
doublesTier: "(DUU)",
|
3389 |
+
natDexTier: "OU",
|
3390 |
+
},
|
3391 |
+
joltik: {
|
3392 |
+
tier: "LC",
|
3393 |
+
},
|
3394 |
+
galvantula: {
|
3395 |
+
tier: "NU",
|
3396 |
+
doublesTier: "(DUU)",
|
3397 |
+
natDexTier: "RU",
|
3398 |
+
},
|
3399 |
+
ferroseed: {
|
3400 |
+
isNonstandard: "Past",
|
3401 |
+
tier: "Illegal",
|
3402 |
+
natDexTier: "LC",
|
3403 |
+
},
|
3404 |
+
ferrothorn: {
|
3405 |
+
isNonstandard: "Past",
|
3406 |
+
tier: "Illegal",
|
3407 |
+
natDexTier: "OU",
|
3408 |
+
},
|
3409 |
+
klink: {
|
3410 |
+
isNonstandard: "Past",
|
3411 |
+
tier: "Illegal",
|
3412 |
+
natDexTier: "LC",
|
3413 |
+
},
|
3414 |
+
klang: {
|
3415 |
+
isNonstandard: "Past",
|
3416 |
+
tier: "Illegal",
|
3417 |
+
natDexTier: "NFE",
|
3418 |
+
},
|
3419 |
+
klinklang: {
|
3420 |
+
isNonstandard: "Past",
|
3421 |
+
tier: "Illegal",
|
3422 |
+
natDexTier: "RU",
|
3423 |
+
},
|
3424 |
+
tynamo: {
|
3425 |
+
tier: "LC",
|
3426 |
+
},
|
3427 |
+
eelektrik: {
|
3428 |
+
tier: "NFE",
|
3429 |
+
},
|
3430 |
+
eelektross: {
|
3431 |
+
tier: "ZU",
|
3432 |
+
doublesTier: "(DUU)",
|
3433 |
+
natDexTier: "RU",
|
3434 |
+
},
|
3435 |
+
elgyem: {
|
3436 |
+
isNonstandard: "Past",
|
3437 |
+
tier: "Illegal",
|
3438 |
+
natDexTier: "LC",
|
3439 |
+
},
|
3440 |
+
beheeyem: {
|
3441 |
+
isNonstandard: "Past",
|
3442 |
+
tier: "Illegal",
|
3443 |
+
natDexTier: "RU",
|
3444 |
+
},
|
3445 |
+
litwick: {
|
3446 |
+
tier: "LC",
|
3447 |
+
},
|
3448 |
+
lampent: {
|
3449 |
+
tier: "NFE",
|
3450 |
+
},
|
3451 |
+
chandelure: {
|
3452 |
+
tier: "NU",
|
3453 |
+
doublesTier: "(DUU)",
|
3454 |
+
natDexTier: "RU",
|
3455 |
+
},
|
3456 |
+
axew: {
|
3457 |
+
tier: "LC",
|
3458 |
+
},
|
3459 |
+
fraxure: {
|
3460 |
+
tier: "NFE",
|
3461 |
+
},
|
3462 |
+
haxorus: {
|
3463 |
+
tier: "RUBL",
|
3464 |
+
doublesTier: "(DUU)",
|
3465 |
+
natDexTier: "RUBL",
|
3466 |
+
},
|
3467 |
+
cubchoo: {
|
3468 |
+
tier: "LC",
|
3469 |
+
},
|
3470 |
+
beartic: {
|
3471 |
+
tier: "ZU",
|
3472 |
+
doublesTier: "(DUU)",
|
3473 |
+
natDexTier: "RU",
|
3474 |
+
},
|
3475 |
+
cryogonal: {
|
3476 |
+
tier: "ZU",
|
3477 |
+
doublesTier: "(DUU)",
|
3478 |
+
natDexTier: "RU",
|
3479 |
+
},
|
3480 |
+
shelmet: {
|
3481 |
+
isNonstandard: "Past",
|
3482 |
+
tier: "Illegal",
|
3483 |
+
natDexTier: "LC",
|
3484 |
+
},
|
3485 |
+
accelgor: {
|
3486 |
+
isNonstandard: "Past",
|
3487 |
+
tier: "Illegal",
|
3488 |
+
natDexTier: "RU",
|
3489 |
+
},
|
3490 |
+
stunfisk: {
|
3491 |
+
isNonstandard: "Past",
|
3492 |
+
tier: "Illegal",
|
3493 |
+
natDexTier: "RU",
|
3494 |
+
},
|
3495 |
+
stunfiskgalar: {
|
3496 |
+
isNonstandard: "Past",
|
3497 |
+
tier: "Illegal",
|
3498 |
+
natDexTier: "RU",
|
3499 |
+
},
|
3500 |
+
mienfoo: {
|
3501 |
+
tier: "LC",
|
3502 |
+
},
|
3503 |
+
mienshao: {
|
3504 |
+
tier: "NUBL",
|
3505 |
+
doublesTier: "(DUU)",
|
3506 |
+
natDexTier: "UU",
|
3507 |
+
},
|
3508 |
+
druddigon: {
|
3509 |
+
isNonstandard: "Past",
|
3510 |
+
tier: "Illegal",
|
3511 |
+
natDexTier: "RU",
|
3512 |
+
},
|
3513 |
+
golett: {
|
3514 |
+
tier: "LC",
|
3515 |
+
},
|
3516 |
+
golurk: {
|
3517 |
+
tier: "PU",
|
3518 |
+
doublesTier: "(DUU)",
|
3519 |
+
natDexTier: "RU",
|
3520 |
+
},
|
3521 |
+
pawniard: {
|
3522 |
+
tier: "LC",
|
3523 |
+
},
|
3524 |
+
bisharp: {
|
3525 |
+
tier: "RU",
|
3526 |
+
doublesTier: "NFE",
|
3527 |
+
natDexTier: "UU",
|
3528 |
+
},
|
3529 |
+
bouffalant: {
|
3530 |
+
isNonstandard: "Past",
|
3531 |
+
tier: "Illegal",
|
3532 |
+
natDexTier: "RU",
|
3533 |
+
},
|
3534 |
+
rufflet: {
|
3535 |
+
tier: "NFE",
|
3536 |
+
},
|
3537 |
+
braviary: {
|
3538 |
+
tier: "ZU",
|
3539 |
+
doublesTier: "(DUU)",
|
3540 |
+
natDexTier: "RU",
|
3541 |
+
},
|
3542 |
+
braviaryhisui: {
|
3543 |
+
tier: "PU",
|
3544 |
+
doublesTier: "(DUU)",
|
3545 |
+
natDexTier: "RU",
|
3546 |
+
},
|
3547 |
+
vullaby: {
|
3548 |
+
tier: "LC",
|
3549 |
+
},
|
3550 |
+
mandibuzz: {
|
3551 |
+
tier: "UU",
|
3552 |
+
doublesTier: "(DUU)",
|
3553 |
+
natDexTier: "RU",
|
3554 |
+
},
|
3555 |
+
heatmor: {
|
3556 |
+
isNonstandard: "Past",
|
3557 |
+
tier: "Illegal",
|
3558 |
+
natDexTier: "RU",
|
3559 |
+
},
|
3560 |
+
durant: {
|
3561 |
+
isNonstandard: "Past",
|
3562 |
+
tier: "Illegal",
|
3563 |
+
natDexTier: "RU",
|
3564 |
+
},
|
3565 |
+
deino: {
|
3566 |
+
tier: "LC",
|
3567 |
+
},
|
3568 |
+
zweilous: {
|
3569 |
+
tier: "NFE",
|
3570 |
+
},
|
3571 |
+
hydreigon: {
|
3572 |
+
tier: "RUBL",
|
3573 |
+
doublesTier: "(DUU)",
|
3574 |
+
natDexTier: "UU",
|
3575 |
+
},
|
3576 |
+
larvesta: {
|
3577 |
+
tier: "LC",
|
3578 |
+
},
|
3579 |
+
volcarona: {
|
3580 |
+
tier: "Uber",
|
3581 |
+
doublesTier: "(DUU)",
|
3582 |
+
natDexTier: "OU",
|
3583 |
+
},
|
3584 |
+
cobalion: {
|
3585 |
+
tier: "UU",
|
3586 |
+
doublesTier: "(DUU)",
|
3587 |
+
natDexTier: "RU",
|
3588 |
+
},
|
3589 |
+
terrakion: {
|
3590 |
+
tier: "RU",
|
3591 |
+
doublesTier: "(DUU)",
|
3592 |
+
natDexTier: "RUBL",
|
3593 |
+
},
|
3594 |
+
virizion: {
|
3595 |
+
tier: "ZU",
|
3596 |
+
doublesTier: "(DUU)",
|
3597 |
+
natDexTier: "RU",
|
3598 |
+
},
|
3599 |
+
tornadus: {
|
3600 |
+
tier: "NU",
|
3601 |
+
doublesTier: "DOU",
|
3602 |
+
natDexTier: "RU",
|
3603 |
+
},
|
3604 |
+
tornadustherian: {
|
3605 |
+
tier: "UU",
|
3606 |
+
doublesTier: "(DUU)",
|
3607 |
+
natDexTier: "UUBL",
|
3608 |
+
},
|
3609 |
+
thundurus: {
|
3610 |
+
tier: "RUBL",
|
3611 |
+
doublesTier: "DUU",
|
3612 |
+
natDexTier: "RU",
|
3613 |
+
},
|
3614 |
+
thundurustherian: {
|
3615 |
+
tier: "UU",
|
3616 |
+
doublesTier: "(DUU)",
|
3617 |
+
natDexTier: "UUBL",
|
3618 |
+
},
|
3619 |
+
reshiram: {
|
3620 |
+
tier: "Uber",
|
3621 |
+
doublesTier: "DUber",
|
3622 |
+
natDexTier: "Uber",
|
3623 |
+
},
|
3624 |
+
zekrom: {
|
3625 |
+
tier: "Uber",
|
3626 |
+
doublesTier: "DUber",
|
3627 |
+
natDexTier: "Uber",
|
3628 |
+
},
|
3629 |
+
landorus: {
|
3630 |
+
tier: "Uber",
|
3631 |
+
doublesTier: "DOU",
|
3632 |
+
natDexTier: "Uber",
|
3633 |
+
},
|
3634 |
+
landorustherian: {
|
3635 |
+
tier: "OU",
|
3636 |
+
doublesTier: "DOU",
|
3637 |
+
natDexTier: "OU",
|
3638 |
+
},
|
3639 |
+
kyurem: {
|
3640 |
+
tier: "OU",
|
3641 |
+
doublesTier: "DOU",
|
3642 |
+
natDexTier: "OU",
|
3643 |
+
},
|
3644 |
+
kyuremblack: {
|
3645 |
+
tier: "Uber",
|
3646 |
+
doublesTier: "DUber",
|
3647 |
+
natDexTier: "Uber",
|
3648 |
+
},
|
3649 |
+
kyuremwhite: {
|
3650 |
+
tier: "Uber",
|
3651 |
+
doublesTier: "DUber",
|
3652 |
+
natDexTier: "Uber",
|
3653 |
+
},
|
3654 |
+
keldeo: {
|
3655 |
+
tier: "UU",
|
3656 |
+
doublesTier: "(DUU)",
|
3657 |
+
natDexTier: "UU",
|
3658 |
+
},
|
3659 |
+
meloetta: {
|
3660 |
+
tier: "NU",
|
3661 |
+
doublesTier: "(DUU)",
|
3662 |
+
natDexTier: "RU",
|
3663 |
+
},
|
3664 |
+
genesect: {
|
3665 |
+
isNonstandard: "Past",
|
3666 |
+
tier: "Illegal",
|
3667 |
+
natDexTier: "Uber",
|
3668 |
+
},
|
3669 |
+
genesectburn: {
|
3670 |
+
isNonstandard: "Past",
|
3671 |
+
tier: "Illegal",
|
3672 |
+
natDexTier: "Uber",
|
3673 |
+
},
|
3674 |
+
genesectchill: {
|
3675 |
+
isNonstandard: "Past",
|
3676 |
+
tier: "Illegal",
|
3677 |
+
natDexTier: "Uber",
|
3678 |
+
},
|
3679 |
+
genesectdouse: {
|
3680 |
+
isNonstandard: "Past",
|
3681 |
+
tier: "Illegal",
|
3682 |
+
natDexTier: "Uber",
|
3683 |
+
},
|
3684 |
+
genesectshock: {
|
3685 |
+
isNonstandard: "Past",
|
3686 |
+
tier: "Illegal",
|
3687 |
+
natDexTier: "Uber",
|
3688 |
+
},
|
3689 |
+
chespin: {
|
3690 |
+
tier: "LC",
|
3691 |
+
},
|
3692 |
+
quilladin: {
|
3693 |
+
tier: "NFE",
|
3694 |
+
},
|
3695 |
+
chesnaught: {
|
3696 |
+
tier: "RU",
|
3697 |
+
doublesTier: "(DUU)",
|
3698 |
+
natDexTier: "RU",
|
3699 |
+
},
|
3700 |
+
fennekin: {
|
3701 |
+
tier: "LC",
|
3702 |
+
},
|
3703 |
+
braixen: {
|
3704 |
+
tier: "NFE",
|
3705 |
+
},
|
3706 |
+
delphox: {
|
3707 |
+
tier: "PU",
|
3708 |
+
doublesTier: "(DUU)",
|
3709 |
+
natDexTier: "RU",
|
3710 |
+
},
|
3711 |
+
froakie: {
|
3712 |
+
tier: "LC",
|
3713 |
+
},
|
3714 |
+
frogadier: {
|
3715 |
+
tier: "NFE",
|
3716 |
+
},
|
3717 |
+
greninja: {
|
3718 |
+
tier: "UU",
|
3719 |
+
doublesTier: "(DUU)",
|
3720 |
+
natDexTier: "UUBL",
|
3721 |
+
},
|
3722 |
+
greninjaash: {
|
3723 |
+
isNonstandard: "Past",
|
3724 |
+
tier: "Illegal",
|
3725 |
+
},
|
3726 |
+
bunnelby: {
|
3727 |
+
isNonstandard: "Past",
|
3728 |
+
tier: "Illegal",
|
3729 |
+
natDexTier: "LC",
|
3730 |
+
},
|
3731 |
+
diggersby: {
|
3732 |
+
isNonstandard: "Past",
|
3733 |
+
tier: "Illegal",
|
3734 |
+
natDexTier: "RU",
|
3735 |
+
},
|
3736 |
+
fletchling: {
|
3737 |
+
tier: "LC",
|
3738 |
+
},
|
3739 |
+
fletchinder: {
|
3740 |
+
tier: "NFE",
|
3741 |
+
},
|
3742 |
+
talonflame: {
|
3743 |
+
tier: "RU",
|
3744 |
+
doublesTier: "DUU",
|
3745 |
+
natDexTier: "UU",
|
3746 |
+
},
|
3747 |
+
scatterbug: {
|
3748 |
+
tier: "LC",
|
3749 |
+
},
|
3750 |
+
spewpa: {
|
3751 |
+
tier: "NFE",
|
3752 |
+
},
|
3753 |
+
vivillon: {
|
3754 |
+
tier: "ZU",
|
3755 |
+
doublesTier: "(DUU)",
|
3756 |
+
natDexTier: "RU",
|
3757 |
+
},
|
3758 |
+
litleo: {
|
3759 |
+
tier: "LC",
|
3760 |
+
},
|
3761 |
+
pyroar: {
|
3762 |
+
tier: "ZU",
|
3763 |
+
doublesTier: "(DUU)",
|
3764 |
+
natDexTier: "RU",
|
3765 |
+
},
|
3766 |
+
flabebe: {
|
3767 |
+
tier: "LC",
|
3768 |
+
},
|
3769 |
+
floette: {
|
3770 |
+
tier: "NFE",
|
3771 |
+
},
|
3772 |
+
floetteeternal: {
|
3773 |
+
isNonstandard: "Past",
|
3774 |
+
tier: "Illegal",
|
3775 |
+
},
|
3776 |
+
florges: {
|
3777 |
+
tier: "PU",
|
3778 |
+
doublesTier: "(DUU)",
|
3779 |
+
natDexTier: "RU",
|
3780 |
+
},
|
3781 |
+
skiddo: {
|
3782 |
+
tier: "LC",
|
3783 |
+
},
|
3784 |
+
gogoat: {
|
3785 |
+
tier: "ZU",
|
3786 |
+
doublesTier: "(DUU)",
|
3787 |
+
natDexTier: "RU",
|
3788 |
+
},
|
3789 |
+
pancham: {
|
3790 |
+
isNonstandard: "Past",
|
3791 |
+
tier: "Illegal",
|
3792 |
+
natDexTier: "LC",
|
3793 |
+
},
|
3794 |
+
pangoro: {
|
3795 |
+
isNonstandard: "Past",
|
3796 |
+
tier: "Illegal",
|
3797 |
+
natDexTier: "RU",
|
3798 |
+
},
|
3799 |
+
furfrou: {
|
3800 |
+
isNonstandard: "Past",
|
3801 |
+
tier: "Illegal",
|
3802 |
+
natDexTier: "RU",
|
3803 |
+
},
|
3804 |
+
espurr: {
|
3805 |
+
tier: "LC",
|
3806 |
+
},
|
3807 |
+
meowstic: {
|
3808 |
+
tier: "ZU",
|
3809 |
+
doublesTier: "(DUU)",
|
3810 |
+
natDexTier: "RU",
|
3811 |
+
},
|
3812 |
+
honedge: {
|
3813 |
+
isNonstandard: "Past",
|
3814 |
+
tier: "Illegal",
|
3815 |
+
natDexTier: "LC",
|
3816 |
+
},
|
3817 |
+
doublade: {
|
3818 |
+
isNonstandard: "Past",
|
3819 |
+
tier: "Illegal",
|
3820 |
+
natDexTier: "NFE",
|
3821 |
+
},
|
3822 |
+
aegislash: {
|
3823 |
+
isNonstandard: "Past",
|
3824 |
+
tier: "Illegal",
|
3825 |
+
natDexTier: "UU",
|
3826 |
+
},
|
3827 |
+
aegislashblade: {
|
3828 |
+
isNonstandard: "Past",
|
3829 |
+
},
|
3830 |
+
spritzee: {
|
3831 |
+
isNonstandard: "Past",
|
3832 |
+
tier: "Illegal",
|
3833 |
+
natDexTier: "LC",
|
3834 |
+
},
|
3835 |
+
aromatisse: {
|
3836 |
+
isNonstandard: "Past",
|
3837 |
+
tier: "Illegal",
|
3838 |
+
natDexTier: "RU",
|
3839 |
+
},
|
3840 |
+
swirlix: {
|
3841 |
+
isNonstandard: "Past",
|
3842 |
+
tier: "Illegal",
|
3843 |
+
natDexTier: "NFE",
|
3844 |
+
},
|
3845 |
+
slurpuff: {
|
3846 |
+
isNonstandard: "Past",
|
3847 |
+
tier: "Illegal",
|
3848 |
+
natDexTier: "RU",
|
3849 |
+
},
|
3850 |
+
inkay: {
|
3851 |
+
tier: "LC",
|
3852 |
+
},
|
3853 |
+
malamar: {
|
3854 |
+
tier: "ZU",
|
3855 |
+
doublesTier: "(DUU)",
|
3856 |
+
natDexTier: "RU",
|
3857 |
+
},
|
3858 |
+
binacle: {
|
3859 |
+
isNonstandard: "Past",
|
3860 |
+
tier: "Illegal",
|
3861 |
+
natDexTier: "LC",
|
3862 |
+
},
|
3863 |
+
barbaracle: {
|
3864 |
+
isNonstandard: "Past",
|
3865 |
+
tier: "Illegal",
|
3866 |
+
natDexTier: "RU",
|
3867 |
+
},
|
3868 |
+
skrelp: {
|
3869 |
+
tier: "LC",
|
3870 |
+
},
|
3871 |
+
dragalge: {
|
3872 |
+
tier: "NU",
|
3873 |
+
doublesTier: "(DUU)",
|
3874 |
+
natDexTier: "RU",
|
3875 |
+
},
|
3876 |
+
clauncher: {
|
3877 |
+
tier: "LC",
|
3878 |
+
},
|
3879 |
+
clawitzer: {
|
3880 |
+
tier: "ZU",
|
3881 |
+
doublesTier: "(DUU)",
|
3882 |
+
natDexTier: "RU",
|
3883 |
+
},
|
3884 |
+
helioptile: {
|
3885 |
+
isNonstandard: "Past",
|
3886 |
+
tier: "Illegal",
|
3887 |
+
natDexTier: "LC",
|
3888 |
+
},
|
3889 |
+
heliolisk: {
|
3890 |
+
isNonstandard: "Past",
|
3891 |
+
tier: "Illegal",
|
3892 |
+
natDexTier: "RU",
|
3893 |
+
},
|
3894 |
+
tyrunt: {
|
3895 |
+
isNonstandard: "Past",
|
3896 |
+
tier: "Illegal",
|
3897 |
+
natDexTier: "LC",
|
3898 |
+
},
|
3899 |
+
tyrantrum: {
|
3900 |
+
isNonstandard: "Past",
|
3901 |
+
tier: "Illegal",
|
3902 |
+
natDexTier: "RU",
|
3903 |
+
},
|
3904 |
+
amaura: {
|
3905 |
+
isNonstandard: "Past",
|
3906 |
+
tier: "Illegal",
|
3907 |
+
natDexTier: "LC",
|
3908 |
+
},
|
3909 |
+
aurorus: {
|
3910 |
+
isNonstandard: "Past",
|
3911 |
+
tier: "Illegal",
|
3912 |
+
natDexTier: "RU",
|
3913 |
+
},
|
3914 |
+
hawlucha: {
|
3915 |
+
tier: "UU",
|
3916 |
+
doublesTier: "(DUU)",
|
3917 |
+
natDexTier: "RUBL",
|
3918 |
+
},
|
3919 |
+
dedenne: {
|
3920 |
+
tier: "ZU",
|
3921 |
+
doublesTier: "(DUU)",
|
3922 |
+
natDexTier: "RU",
|
3923 |
+
},
|
3924 |
+
carbink: {
|
3925 |
+
tier: "ZU",
|
3926 |
+
doublesTier: "(DUU)",
|
3927 |
+
natDexTier: "RU",
|
3928 |
+
},
|
3929 |
+
goomy: {
|
3930 |
+
tier: "LC",
|
3931 |
+
},
|
3932 |
+
sliggoo: {
|
3933 |
+
tier: "NFE",
|
3934 |
+
},
|
3935 |
+
sliggoohisui: {
|
3936 |
+
tier: "NFE",
|
3937 |
+
},
|
3938 |
+
goodra: {
|
3939 |
+
tier: "PU",
|
3940 |
+
doublesTier: "(DUU)",
|
3941 |
+
natDexTier: "RU",
|
3942 |
+
},
|
3943 |
+
goodrahisui: {
|
3944 |
+
tier: "RU",
|
3945 |
+
doublesTier: "(DUU)",
|
3946 |
+
natDexTier: "RU",
|
3947 |
+
},
|
3948 |
+
klefki: {
|
3949 |
+
tier: "NU",
|
3950 |
+
doublesTier: "(DUU)",
|
3951 |
+
natDexTier: "RU",
|
3952 |
+
},
|
3953 |
+
phantump: {
|
3954 |
+
tier: "LC",
|
3955 |
+
},
|
3956 |
+
trevenant: {
|
3957 |
+
tier: "ZU",
|
3958 |
+
doublesTier: "(DUU)",
|
3959 |
+
natDexTier: "RU",
|
3960 |
+
},
|
3961 |
+
pumpkaboo: {
|
3962 |
+
isNonstandard: "Past",
|
3963 |
+
tier: "Illegal",
|
3964 |
+
natDexTier: "LC",
|
3965 |
+
},
|
3966 |
+
pumpkaboosmall: {
|
3967 |
+
isNonstandard: "Past",
|
3968 |
+
},
|
3969 |
+
pumpkaboolarge: {
|
3970 |
+
isNonstandard: "Past",
|
3971 |
+
},
|
3972 |
+
pumpkaboosuper: {
|
3973 |
+
isNonstandard: "Past",
|
3974 |
+
},
|
3975 |
+
gourgeist: {
|
3976 |
+
isNonstandard: "Past",
|
3977 |
+
tier: "Illegal",
|
3978 |
+
natDexTier: "RU",
|
3979 |
+
},
|
3980 |
+
gourgeistsmall: {
|
3981 |
+
isNonstandard: "Past",
|
3982 |
+
},
|
3983 |
+
gourgeistlarge: {
|
3984 |
+
isNonstandard: "Past",
|
3985 |
+
},
|
3986 |
+
gourgeistsuper: {
|
3987 |
+
isNonstandard: "Past",
|
3988 |
+
},
|
3989 |
+
bergmite: {
|
3990 |
+
tier: "LC",
|
3991 |
+
},
|
3992 |
+
avalugg: {
|
3993 |
+
tier: "NU",
|
3994 |
+
doublesTier: "(DUU)",
|
3995 |
+
natDexTier: "RU",
|
3996 |
+
},
|
3997 |
+
avalugghisui: {
|
3998 |
+
tier: "ZU",
|
3999 |
+
doublesTier: "(DUU)",
|
4000 |
+
natDexTier: "RU",
|
4001 |
+
},
|
4002 |
+
noibat: {
|
4003 |
+
tier: "LC",
|
4004 |
+
},
|
4005 |
+
noivern: {
|
4006 |
+
tier: "RU",
|
4007 |
+
doublesTier: "(DUU)",
|
4008 |
+
natDexTier: "RU",
|
4009 |
+
},
|
4010 |
+
xerneas: {
|
4011 |
+
isNonstandard: "Past",
|
4012 |
+
tier: "Illegal",
|
4013 |
+
natDexTier: "AG",
|
4014 |
+
},
|
4015 |
+
xerneasneutral: {
|
4016 |
+
isNonstandard: "Custom", // can't be used in battle
|
4017 |
+
tier: "Illegal",
|
4018 |
+
},
|
4019 |
+
yveltal: {
|
4020 |
+
isNonstandard: "Past",
|
4021 |
+
tier: "Illegal",
|
4022 |
+
natDexTier: "Uber",
|
4023 |
+
},
|
4024 |
+
zygarde: {
|
4025 |
+
isNonstandard: "Past",
|
4026 |
+
tier: "Illegal",
|
4027 |
+
natDexTier: "Uber",
|
4028 |
+
},
|
4029 |
+
zygarde10: {
|
4030 |
+
isNonstandard: "Past",
|
4031 |
+
tier: "Illegal",
|
4032 |
+
natDexTier: "RU",
|
4033 |
+
},
|
4034 |
+
zygardecomplete: {
|
4035 |
+
isNonstandard: "Past",
|
4036 |
+
tier: "Illegal",
|
4037 |
+
natDexTier: "Uber",
|
4038 |
+
},
|
4039 |
+
diancie: {
|
4040 |
+
tier: "NU",
|
4041 |
+
doublesTier: "DOU",
|
4042 |
+
natDexTier: "RU",
|
4043 |
+
},
|
4044 |
+
dianciemega: {
|
4045 |
+
isNonstandard: "Past",
|
4046 |
+
tier: "Illegal",
|
4047 |
+
natDexTier: "OU",
|
4048 |
+
},
|
4049 |
+
hoopa: {
|
4050 |
+
tier: "PU",
|
4051 |
+
doublesTier: "(DUU)",
|
4052 |
+
natDexTier: "RU",
|
4053 |
+
},
|
4054 |
+
hoopaunbound: {
|
4055 |
+
tier: "UUBL",
|
4056 |
+
doublesTier: "(DUU)",
|
4057 |
+
natDexTier: "UUBL",
|
4058 |
+
},
|
4059 |
+
volcanion: {
|
4060 |
+
tier: "RU",
|
4061 |
+
doublesTier: "DOU",
|
4062 |
+
natDexTier: "RU",
|
4063 |
+
},
|
4064 |
+
rowlet: {
|
4065 |
+
tier: "LC",
|
4066 |
+
},
|
4067 |
+
dartrix: {
|
4068 |
+
tier: "NFE",
|
4069 |
+
},
|
4070 |
+
decidueye: {
|
4071 |
+
tier: "NU",
|
4072 |
+
doublesTier: "(DUU)",
|
4073 |
+
natDexTier: "RU",
|
4074 |
+
},
|
4075 |
+
decidueyehisui: {
|
4076 |
+
tier: "PU",
|
4077 |
+
doublesTier: "(DUU)",
|
4078 |
+
natDexTier: "RU",
|
4079 |
+
},
|
4080 |
+
litten: {
|
4081 |
+
tier: "LC",
|
4082 |
+
},
|
4083 |
+
torracat: {
|
4084 |
+
tier: "NFE",
|
4085 |
+
},
|
4086 |
+
incineroar: {
|
4087 |
+
tier: "NU",
|
4088 |
+
doublesTier: "DOU",
|
4089 |
+
natDexTier: "RU",
|
4090 |
+
},
|
4091 |
+
popplio: {
|
4092 |
+
tier: "LC",
|
4093 |
+
},
|
4094 |
+
brionne: {
|
4095 |
+
tier: "NFE",
|
4096 |
+
},
|
4097 |
+
primarina: {
|
4098 |
+
tier: "OU",
|
4099 |
+
doublesTier: "(DUU)",
|
4100 |
+
natDexTier: "RU",
|
4101 |
+
},
|
4102 |
+
pikipek: {
|
4103 |
+
tier: "LC",
|
4104 |
+
},
|
4105 |
+
trumbeak: {
|
4106 |
+
tier: "NFE",
|
4107 |
+
},
|
4108 |
+
toucannon: {
|
4109 |
+
tier: "ZU",
|
4110 |
+
doublesTier: "(DUU)",
|
4111 |
+
natDexTier: "RU",
|
4112 |
+
},
|
4113 |
+
yungoos: {
|
4114 |
+
tier: "LC",
|
4115 |
+
},
|
4116 |
+
gumshoos: {
|
4117 |
+
tier: "ZU",
|
4118 |
+
doublesTier: "(DUU)",
|
4119 |
+
natDexTier: "RU",
|
4120 |
+
},
|
4121 |
+
gumshoostotem: {
|
4122 |
+
isNonstandard: "Past",
|
4123 |
+
tier: "Illegal",
|
4124 |
+
},
|
4125 |
+
grubbin: {
|
4126 |
+
tier: "LC",
|
4127 |
+
},
|
4128 |
+
charjabug: {
|
4129 |
+
tier: "NFE",
|
4130 |
+
},
|
4131 |
+
vikavolt: {
|
4132 |
+
tier: "ZU",
|
4133 |
+
doublesTier: "(DUU)",
|
4134 |
+
natDexTier: "RU",
|
4135 |
+
},
|
4136 |
+
vikavolttotem: {
|
4137 |
+
isNonstandard: "Past",
|
4138 |
+
tier: "Illegal",
|
4139 |
+
},
|
4140 |
+
crabrawler: {
|
4141 |
+
tier: "LC",
|
4142 |
+
},
|
4143 |
+
crabominable: {
|
4144 |
+
tier: "ZU",
|
4145 |
+
doublesTier: "(DUU)",
|
4146 |
+
natDexTier: "RU",
|
4147 |
+
},
|
4148 |
+
oricorio: {
|
4149 |
+
tier: "ZU",
|
4150 |
+
doublesTier: "(DUU)",
|
4151 |
+
natDexTier: "RU",
|
4152 |
+
},
|
4153 |
+
oricoriopompom: {
|
4154 |
+
tier: "NUBL",
|
4155 |
+
doublesTier: "(DUU)",
|
4156 |
+
natDexTier: "RU",
|
4157 |
+
},
|
4158 |
+
oricoriopau: {
|
4159 |
+
tier: "ZU",
|
4160 |
+
doublesTier: "(DUU)",
|
4161 |
+
natDexTier: "RU",
|
4162 |
+
},
|
4163 |
+
oricoriosensu: {
|
4164 |
+
tier: "NUBL",
|
4165 |
+
doublesTier: "(DUU)",
|
4166 |
+
natDexTier: "RU",
|
4167 |
+
},
|
4168 |
+
cutiefly: {
|
4169 |
+
tier: "NFE",
|
4170 |
+
},
|
4171 |
+
ribombee: {
|
4172 |
+
tier: "RU",
|
4173 |
+
doublesTier: "(DUU)",
|
4174 |
+
natDexTier: "RU",
|
4175 |
+
},
|
4176 |
+
ribombeetotem: {
|
4177 |
+
isNonstandard: "Past",
|
4178 |
+
tier: "Illegal",
|
4179 |
+
},
|
4180 |
+
rockruff: {
|
4181 |
+
tier: "LC",
|
4182 |
+
},
|
4183 |
+
rockruffdusk: {
|
4184 |
+
tier: "LC",
|
4185 |
+
},
|
4186 |
+
lycanroc: {
|
4187 |
+
tier: "PU",
|
4188 |
+
doublesTier: "(DUU)",
|
4189 |
+
natDexTier: "RU",
|
4190 |
+
},
|
4191 |
+
lycanrocmidnight: {
|
4192 |
+
tier: "ZU",
|
4193 |
+
doublesTier: "(DUU)",
|
4194 |
+
natDexTier: "RU",
|
4195 |
+
},
|
4196 |
+
lycanrocdusk: {
|
4197 |
+
tier: "NUBL",
|
4198 |
+
doublesTier: "(DUU)",
|
4199 |
+
natDexTier: "RU",
|
4200 |
+
},
|
4201 |
+
wishiwashi: {
|
4202 |
+
isNonstandard: "Past",
|
4203 |
+
tier: "Illegal",
|
4204 |
+
natDexTier: "RU",
|
4205 |
+
},
|
4206 |
+
wishiwashischool: {
|
4207 |
+
isNonstandard: "Past",
|
4208 |
+
},
|
4209 |
+
mareanie: {
|
4210 |
+
tier: "LC",
|
4211 |
+
},
|
4212 |
+
toxapex: {
|
4213 |
+
tier: "UU",
|
4214 |
+
doublesTier: "(DUU)",
|
4215 |
+
natDexTier: "OU",
|
4216 |
+
},
|
4217 |
+
mudbray: {
|
4218 |
+
tier: "LC",
|
4219 |
+
},
|
4220 |
+
mudsdale: {
|
4221 |
+
tier: "PU",
|
4222 |
+
doublesTier: "(DUU)",
|
4223 |
+
natDexTier: "RU",
|
4224 |
+
},
|
4225 |
+
dewpider: {
|
4226 |
+
tier: "LC",
|
4227 |
+
},
|
4228 |
+
araquanid: {
|
4229 |
+
tier: "OU",
|
4230 |
+
doublesTier: "DUU",
|
4231 |
+
natDexTier: "RU",
|
4232 |
+
},
|
4233 |
+
araquanidtotem: {
|
4234 |
+
isNonstandard: "Past",
|
4235 |
+
tier: "Illegal",
|
4236 |
+
},
|
4237 |
+
fomantis: {
|
4238 |
+
tier: "LC",
|
4239 |
+
},
|
4240 |
+
lurantis: {
|
4241 |
+
tier: "ZU",
|
4242 |
+
doublesTier: "(DUU)",
|
4243 |
+
natDexTier: "RU",
|
4244 |
+
},
|
4245 |
+
lurantistotem: {
|
4246 |
+
isNonstandard: "Past",
|
4247 |
+
tier: "Illegal",
|
4248 |
+
},
|
4249 |
+
morelull: {
|
4250 |
+
isNonstandard: "Past",
|
4251 |
+
tier: "Illegal",
|
4252 |
+
natDexTier: "LC",
|
4253 |
+
},
|
4254 |
+
shiinotic: {
|
4255 |
+
isNonstandard: "Past",
|
4256 |
+
tier: "Illegal",
|
4257 |
+
natDexTier: "RU",
|
4258 |
+
},
|
4259 |
+
salandit: {
|
4260 |
+
tier: "LC",
|
4261 |
+
},
|
4262 |
+
salazzle: {
|
4263 |
+
tier: "PU",
|
4264 |
+
doublesTier: "(DUU)",
|
4265 |
+
natDexTier: "RU",
|
4266 |
+
},
|
4267 |
+
salazzletotem: {
|
4268 |
+
isNonstandard: "Past",
|
4269 |
+
tier: "Illegal",
|
4270 |
+
},
|
4271 |
+
stufful: {
|
4272 |
+
isNonstandard: "Past",
|
4273 |
+
tier: "Illegal",
|
4274 |
+
natDexTier: "LC",
|
4275 |
+
},
|
4276 |
+
bewear: {
|
4277 |
+
isNonstandard: "Past",
|
4278 |
+
tier: "Illegal",
|
4279 |
+
natDexTier: "RU",
|
4280 |
+
},
|
4281 |
+
bounsweet: {
|
4282 |
+
tier: "LC",
|
4283 |
+
},
|
4284 |
+
steenee: {
|
4285 |
+
tier: "NFE",
|
4286 |
+
},
|
4287 |
+
tsareena: {
|
4288 |
+
tier: "NU",
|
4289 |
+
doublesTier: "(DUU)",
|
4290 |
+
natDexTier: "RU",
|
4291 |
+
},
|
4292 |
+
comfey: {
|
4293 |
+
tier: "UU",
|
4294 |
+
doublesTier: "DUU",
|
4295 |
+
natDexTier: "RU",
|
4296 |
+
},
|
4297 |
+
oranguru: {
|
4298 |
+
tier: "ZU",
|
4299 |
+
doublesTier: "(DUU)",
|
4300 |
+
natDexTier: "RU",
|
4301 |
+
},
|
4302 |
+
passimian: {
|
4303 |
+
tier: "ZU",
|
4304 |
+
doublesTier: "(DUU)",
|
4305 |
+
natDexTier: "RU",
|
4306 |
+
},
|
4307 |
+
wimpod: {
|
4308 |
+
isNonstandard: "Past",
|
4309 |
+
tier: "Illegal",
|
4310 |
+
natDexTier: "LC",
|
4311 |
+
},
|
4312 |
+
golisopod: {
|
4313 |
+
isNonstandard: "Past",
|
4314 |
+
tier: "Illegal",
|
4315 |
+
natDexTier: "UU",
|
4316 |
+
},
|
4317 |
+
sandygast: {
|
4318 |
+
tier: "LC",
|
4319 |
+
},
|
4320 |
+
palossand: {
|
4321 |
+
tier: "ZU",
|
4322 |
+
doublesTier: "(DUU)",
|
4323 |
+
natDexTier: "RU",
|
4324 |
+
},
|
4325 |
+
pyukumuku: {
|
4326 |
+
isNonstandard: "Past",
|
4327 |
+
tier: "Illegal",
|
4328 |
+
natDexTier: "RU",
|
4329 |
+
},
|
4330 |
+
typenull: {
|
4331 |
+
isNonstandard: "Past",
|
4332 |
+
tier: "Illegal",
|
4333 |
+
natDexTier: "NFE",
|
4334 |
+
},
|
4335 |
+
silvally: {
|
4336 |
+
isNonstandard: "Past",
|
4337 |
+
tier: "Illegal",
|
4338 |
+
natDexTier: "RU",
|
4339 |
+
},
|
4340 |
+
silvallybug: {
|
4341 |
+
isNonstandard: "Past",
|
4342 |
+
tier: "Illegal",
|
4343 |
+
natDexTier: "RU",
|
4344 |
+
},
|
4345 |
+
silvallydark: {
|
4346 |
+
isNonstandard: "Past",
|
4347 |
+
tier: "Illegal",
|
4348 |
+
natDexTier: "RU",
|
4349 |
+
},
|
4350 |
+
silvallydragon: {
|
4351 |
+
isNonstandard: "Past",
|
4352 |
+
tier: "Illegal",
|
4353 |
+
natDexTier: "RU",
|
4354 |
+
},
|
4355 |
+
silvallyelectric: {
|
4356 |
+
isNonstandard: "Past",
|
4357 |
+
tier: "Illegal",
|
4358 |
+
natDexTier: "RU",
|
4359 |
+
},
|
4360 |
+
silvallyfairy: {
|
4361 |
+
isNonstandard: "Past",
|
4362 |
+
tier: "Illegal",
|
4363 |
+
natDexTier: "RU",
|
4364 |
+
},
|
4365 |
+
silvallyfighting: {
|
4366 |
+
isNonstandard: "Past",
|
4367 |
+
tier: "Illegal",
|
4368 |
+
natDexTier: "RU",
|
4369 |
+
},
|
4370 |
+
silvallyfire: {
|
4371 |
+
isNonstandard: "Past",
|
4372 |
+
tier: "Illegal",
|
4373 |
+
natDexTier: "RU",
|
4374 |
+
},
|
4375 |
+
silvallyflying: {
|
4376 |
+
isNonstandard: "Past",
|
4377 |
+
tier: "Illegal",
|
4378 |
+
natDexTier: "RU",
|
4379 |
+
},
|
4380 |
+
silvallyghost: {
|
4381 |
+
isNonstandard: "Past",
|
4382 |
+
tier: "Illegal",
|
4383 |
+
natDexTier: "RU",
|
4384 |
+
},
|
4385 |
+
silvallygrass: {
|
4386 |
+
isNonstandard: "Past",
|
4387 |
+
tier: "Illegal",
|
4388 |
+
natDexTier: "RU",
|
4389 |
+
},
|
4390 |
+
silvallyground: {
|
4391 |
+
isNonstandard: "Past",
|
4392 |
+
tier: "Illegal",
|
4393 |
+
natDexTier: "RU",
|
4394 |
+
},
|
4395 |
+
silvallyice: {
|
4396 |
+
isNonstandard: "Past",
|
4397 |
+
tier: "Illegal",
|
4398 |
+
natDexTier: "RU",
|
4399 |
+
},
|
4400 |
+
silvallypoison: {
|
4401 |
+
isNonstandard: "Past",
|
4402 |
+
tier: "Illegal",
|
4403 |
+
natDexTier: "RU",
|
4404 |
+
},
|
4405 |
+
silvallypsychic: {
|
4406 |
+
isNonstandard: "Past",
|
4407 |
+
tier: "Illegal",
|
4408 |
+
natDexTier: "RU",
|
4409 |
+
},
|
4410 |
+
silvallyrock: {
|
4411 |
+
isNonstandard: "Past",
|
4412 |
+
tier: "Illegal",
|
4413 |
+
natDexTier: "RU",
|
4414 |
+
},
|
4415 |
+
silvallysteel: {
|
4416 |
+
isNonstandard: "Past",
|
4417 |
+
tier: "Illegal",
|
4418 |
+
natDexTier: "RU",
|
4419 |
+
},
|
4420 |
+
silvallywater: {
|
4421 |
+
isNonstandard: "Past",
|
4422 |
+
tier: "Illegal",
|
4423 |
+
natDexTier: "RU",
|
4424 |
+
},
|
4425 |
+
minior: {
|
4426 |
+
tier: "PU",
|
4427 |
+
doublesTier: "(DUU)",
|
4428 |
+
natDexTier: "RU",
|
4429 |
+
},
|
4430 |
+
komala: {
|
4431 |
+
tier: "ZU",
|
4432 |
+
doublesTier: "(DUU)",
|
4433 |
+
natDexTier: "RU",
|
4434 |
+
},
|
4435 |
+
turtonator: {
|
4436 |
+
isNonstandard: "Past",
|
4437 |
+
tier: "Illegal",
|
4438 |
+
natDexTier: "RU",
|
4439 |
+
},
|
4440 |
+
togedemaru: {
|
4441 |
+
isNonstandard: "Past",
|
4442 |
+
tier: "Illegal",
|
4443 |
+
natDexTier: "RU",
|
4444 |
+
},
|
4445 |
+
togedemarutotem: {
|
4446 |
+
isNonstandard: "Past",
|
4447 |
+
tier: "Illegal",
|
4448 |
+
},
|
4449 |
+
mimikyu: {
|
4450 |
+
tier: "RU",
|
4451 |
+
doublesTier: "(DUU)",
|
4452 |
+
natDexTier: "RU",
|
4453 |
+
},
|
4454 |
+
mimikyutotem: {
|
4455 |
+
isNonstandard: "Past",
|
4456 |
+
tier: "Illegal",
|
4457 |
+
},
|
4458 |
+
mimikyubustedtotem: {
|
4459 |
+
isNonstandard: "Past",
|
4460 |
+
tier: "Illegal",
|
4461 |
+
},
|
4462 |
+
bruxish: {
|
4463 |
+
tier: "ZUBL",
|
4464 |
+
doublesTier: "(DUU)",
|
4465 |
+
natDexTier: "RU",
|
4466 |
+
},
|
4467 |
+
drampa: {
|
4468 |
+
isNonstandard: "Past",
|
4469 |
+
tier: "Illegal",
|
4470 |
+
natDexTier: "RU",
|
4471 |
+
},
|
4472 |
+
dhelmise: {
|
4473 |
+
isNonstandard: "Past",
|
4474 |
+
tier: "Illegal",
|
4475 |
+
natDexTier: "RU",
|
4476 |
+
},
|
4477 |
+
jangmoo: {
|
4478 |
+
tier: "LC",
|
4479 |
+
},
|
4480 |
+
hakamoo: {
|
4481 |
+
tier: "NFE",
|
4482 |
+
},
|
4483 |
+
kommoo: {
|
4484 |
+
tier: "UUBL",
|
4485 |
+
doublesTier: "(DUU)",
|
4486 |
+
natDexTier: "UUBL",
|
4487 |
+
},
|
4488 |
+
kommoototem: {
|
4489 |
+
isNonstandard: "Past",
|
4490 |
+
tier: "Illegal",
|
4491 |
+
},
|
4492 |
+
tapukoko: {
|
4493 |
+
isNonstandard: "Past",
|
4494 |
+
tier: "Illegal",
|
4495 |
+
natDexTier: "OU",
|
4496 |
+
},
|
4497 |
+
tapulele: {
|
4498 |
+
isNonstandard: "Past",
|
4499 |
+
tier: "Illegal",
|
4500 |
+
natDexTier: "OU",
|
4501 |
+
},
|
4502 |
+
tapubulu: {
|
4503 |
+
isNonstandard: "Past",
|
4504 |
+
tier: "Illegal",
|
4505 |
+
natDexTier: "RU",
|
4506 |
+
},
|
4507 |
+
tapufini: {
|
4508 |
+
isNonstandard: "Past",
|
4509 |
+
tier: "Illegal",
|
4510 |
+
natDexTier: "UU",
|
4511 |
+
},
|
4512 |
+
cosmog: {
|
4513 |
+
tier: "LC",
|
4514 |
+
},
|
4515 |
+
cosmoem: {
|
4516 |
+
tier: "NFE",
|
4517 |
+
},
|
4518 |
+
solgaleo: {
|
4519 |
+
tier: "Uber",
|
4520 |
+
doublesTier: "DUber",
|
4521 |
+
natDexTier: "Uber",
|
4522 |
+
},
|
4523 |
+
lunala: {
|
4524 |
+
tier: "Uber",
|
4525 |
+
doublesTier: "DUber",
|
4526 |
+
natDexTier: "Uber",
|
4527 |
+
},
|
4528 |
+
nihilego: {
|
4529 |
+
isNonstandard: "Past",
|
4530 |
+
tier: "Illegal",
|
4531 |
+
natDexTier: "RU",
|
4532 |
+
},
|
4533 |
+
buzzwole: {
|
4534 |
+
isNonstandard: "Past",
|
4535 |
+
tier: "Illegal",
|
4536 |
+
natDexTier: "RUBL",
|
4537 |
+
},
|
4538 |
+
pheromosa: {
|
4539 |
+
isNonstandard: "Past",
|
4540 |
+
tier: "Illegal",
|
4541 |
+
natDexTier: "Uber",
|
4542 |
+
},
|
4543 |
+
xurkitree: {
|
4544 |
+
isNonstandard: "Past",
|
4545 |
+
tier: "Illegal",
|
4546 |
+
natDexTier: "UUBL",
|
4547 |
+
},
|
4548 |
+
celesteela: {
|
4549 |
+
isNonstandard: "Past",
|
4550 |
+
tier: "Illegal",
|
4551 |
+
natDexTier: "UU",
|
4552 |
+
},
|
4553 |
+
kartana: {
|
4554 |
+
isNonstandard: "Past",
|
4555 |
+
tier: "Illegal",
|
4556 |
+
natDexTier: "OU",
|
4557 |
+
},
|
4558 |
+
guzzlord: {
|
4559 |
+
isNonstandard: "Past",
|
4560 |
+
tier: "Illegal",
|
4561 |
+
natDexTier: "RU",
|
4562 |
+
},
|
4563 |
+
necrozma: {
|
4564 |
+
tier: "NUBL",
|
4565 |
+
doublesTier: "(DUU)",
|
4566 |
+
natDexTier: "RU",
|
4567 |
+
},
|
4568 |
+
necrozmaduskmane: {
|
4569 |
+
tier: "Uber",
|
4570 |
+
doublesTier: "DUber",
|
4571 |
+
natDexTier: "Uber",
|
4572 |
+
},
|
4573 |
+
necrozmadawnwings: {
|
4574 |
+
tier: "Uber",
|
4575 |
+
doublesTier: "DUber",
|
4576 |
+
natDexTier: "Uber",
|
4577 |
+
},
|
4578 |
+
necrozmaultra: {
|
4579 |
+
isNonstandard: "Past",
|
4580 |
+
tier: "Illegal",
|
4581 |
+
natDexTier: "Uber",
|
4582 |
+
},
|
4583 |
+
magearna: {
|
4584 |
+
tier: "Uber",
|
4585 |
+
doublesTier: "DUber",
|
4586 |
+
natDexTier: "Uber",
|
4587 |
+
},
|
4588 |
+
marshadow: {
|
4589 |
+
isNonstandard: "Past",
|
4590 |
+
tier: "Illegal",
|
4591 |
+
natDexTier: "Uber",
|
4592 |
+
},
|
4593 |
+
poipole: {
|
4594 |
+
isNonstandard: "Past",
|
4595 |
+
tier: "Illegal",
|
4596 |
+
natDexTier: "NFE",
|
4597 |
+
},
|
4598 |
+
naganadel: {
|
4599 |
+
isNonstandard: "Past",
|
4600 |
+
tier: "Illegal",
|
4601 |
+
natDexTier: "Uber",
|
4602 |
+
},
|
4603 |
+
stakataka: {
|
4604 |
+
isNonstandard: "Past",
|
4605 |
+
tier: "Illegal",
|
4606 |
+
natDexTier: "RU",
|
4607 |
+
},
|
4608 |
+
blacephalon: {
|
4609 |
+
isNonstandard: "Past",
|
4610 |
+
tier: "Illegal",
|
4611 |
+
natDexTier: "RUBL",
|
4612 |
+
},
|
4613 |
+
zeraora: {
|
4614 |
+
isNonstandard: "Past",
|
4615 |
+
tier: "Illegal",
|
4616 |
+
natDexTier: "UU",
|
4617 |
+
},
|
4618 |
+
meltan: {
|
4619 |
+
isNonstandard: "Past",
|
4620 |
+
tier: "Illegal",
|
4621 |
+
natDexTier: "RU",
|
4622 |
+
},
|
4623 |
+
melmetal: {
|
4624 |
+
isNonstandard: "Past",
|
4625 |
+
tier: "Illegal",
|
4626 |
+
natDexTier: "OU",
|
4627 |
+
},
|
4628 |
+
melmetalgmax: {
|
4629 |
+
isNonstandard: "Past",
|
4630 |
+
tier: "Illegal",
|
4631 |
+
},
|
4632 |
+
grookey: {
|
4633 |
+
tier: "LC",
|
4634 |
+
},
|
4635 |
+
thwackey: {
|
4636 |
+
tier: "NFE",
|
4637 |
+
},
|
4638 |
+
rillaboom: {
|
4639 |
+
tier: "OU",
|
4640 |
+
doublesTier: "DOU",
|
4641 |
+
natDexTier: "OU",
|
4642 |
+
},
|
4643 |
+
rillaboomgmax: {
|
4644 |
+
isNonstandard: "Past",
|
4645 |
+
tier: "Illegal",
|
4646 |
+
},
|
4647 |
+
scorbunny: {
|
4648 |
+
tier: "LC",
|
4649 |
+
},
|
4650 |
+
raboot: {
|
4651 |
+
tier: "NFE",
|
4652 |
+
},
|
4653 |
+
cinderace: {
|
4654 |
+
tier: "OU",
|
4655 |
+
doublesTier: "(DUU)",
|
4656 |
+
natDexTier: "UUBL",
|
4657 |
+
},
|
4658 |
+
cinderacegmax: {
|
4659 |
+
isNonstandard: "Past",
|
4660 |
+
tier: "Illegal",
|
4661 |
+
},
|
4662 |
+
sobble: {
|
4663 |
+
tier: "LC",
|
4664 |
+
},
|
4665 |
+
drizzile: {
|
4666 |
+
tier: "NFE",
|
4667 |
+
},
|
4668 |
+
inteleon: {
|
4669 |
+
tier: "NU",
|
4670 |
+
doublesTier: "(DUU)",
|
4671 |
+
natDexTier: "RU",
|
4672 |
+
},
|
4673 |
+
inteleongmax: {
|
4674 |
+
isNonstandard: "Past",
|
4675 |
+
tier: "Illegal",
|
4676 |
+
},
|
4677 |
+
skwovet: {
|
4678 |
+
tier: "LC",
|
4679 |
+
},
|
4680 |
+
greedent: {
|
4681 |
+
tier: "ZU",
|
4682 |
+
doublesTier: "(DUU)",
|
4683 |
+
natDexTier: "RU",
|
4684 |
+
},
|
4685 |
+
rookidee: {
|
4686 |
+
tier: "LC",
|
4687 |
+
},
|
4688 |
+
corvisquire: {
|
4689 |
+
tier: "NFE",
|
4690 |
+
},
|
4691 |
+
corviknight: {
|
4692 |
+
tier: "OU",
|
4693 |
+
doublesTier: "(DUU)",
|
4694 |
+
natDexTier: "OU",
|
4695 |
+
},
|
4696 |
+
corviknightgmax: {
|
4697 |
+
isNonstandard: "Past",
|
4698 |
+
tier: "Illegal",
|
4699 |
+
},
|
4700 |
+
blipbug: {
|
4701 |
+
isNonstandard: "Past",
|
4702 |
+
tier: "Illegal",
|
4703 |
+
natDexTier: "LC",
|
4704 |
+
},
|
4705 |
+
dottler: {
|
4706 |
+
isNonstandard: "Past",
|
4707 |
+
tier: "Illegal",
|
4708 |
+
natDexTier: "NFE",
|
4709 |
+
},
|
4710 |
+
orbeetle: {
|
4711 |
+
isNonstandard: "Past",
|
4712 |
+
tier: "Illegal",
|
4713 |
+
natDexTier: "RU",
|
4714 |
+
},
|
4715 |
+
orbeetlegmax: {
|
4716 |
+
isNonstandard: "Past",
|
4717 |
+
tier: "Illegal",
|
4718 |
+
},
|
4719 |
+
nickit: {
|
4720 |
+
isNonstandard: "Past",
|
4721 |
+
tier: "Illegal",
|
4722 |
+
natDexTier: "LC",
|
4723 |
+
},
|
4724 |
+
thievul: {
|
4725 |
+
isNonstandard: "Past",
|
4726 |
+
tier: "Illegal",
|
4727 |
+
natDexTier: "RU",
|
4728 |
+
},
|
4729 |
+
gossifleur: {
|
4730 |
+
isNonstandard: "Past",
|
4731 |
+
tier: "Illegal",
|
4732 |
+
natDexTier: "LC",
|
4733 |
+
},
|
4734 |
+
eldegoss: {
|
4735 |
+
isNonstandard: "Past",
|
4736 |
+
tier: "Illegal",
|
4737 |
+
natDexTier: "RU",
|
4738 |
+
},
|
4739 |
+
wooloo: {
|
4740 |
+
isNonstandard: "Past",
|
4741 |
+
tier: "Illegal",
|
4742 |
+
natDexTier: "LC",
|
4743 |
+
},
|
4744 |
+
dubwool: {
|
4745 |
+
isNonstandard: "Past",
|
4746 |
+
tier: "Illegal",
|
4747 |
+
natDexTier: "RU",
|
4748 |
+
},
|
4749 |
+
chewtle: {
|
4750 |
+
tier: "LC",
|
4751 |
+
},
|
4752 |
+
drednaw: {
|
4753 |
+
tier: "PUBL",
|
4754 |
+
doublesTier: "(DUU)",
|
4755 |
+
natDexTier: "RU",
|
4756 |
+
},
|
4757 |
+
drednawgmax: {
|
4758 |
+
isNonstandard: "Past",
|
4759 |
+
tier: "Illegal",
|
4760 |
+
},
|
4761 |
+
yamper: {
|
4762 |
+
isNonstandard: "Past",
|
4763 |
+
tier: "Illegal",
|
4764 |
+
natDexTier: "LC",
|
4765 |
+
},
|
4766 |
+
boltund: {
|
4767 |
+
isNonstandard: "Past",
|
4768 |
+
tier: "Illegal",
|
4769 |
+
natDexTier: "RU",
|
4770 |
+
},
|
4771 |
+
rolycoly: {
|
4772 |
+
tier: "LC",
|
4773 |
+
},
|
4774 |
+
carkol: {
|
4775 |
+
tier: "NFE",
|
4776 |
+
},
|
4777 |
+
coalossal: {
|
4778 |
+
tier: "PU",
|
4779 |
+
doublesTier: "(DUU)",
|
4780 |
+
natDexTier: "RU",
|
4781 |
+
},
|
4782 |
+
coalossalgmax: {
|
4783 |
+
isNonstandard: "Past",
|
4784 |
+
tier: "Illegal",
|
4785 |
+
},
|
4786 |
+
applin: {
|
4787 |
+
tier: "LC",
|
4788 |
+
},
|
4789 |
+
flapple: {
|
4790 |
+
tier: "ZU",
|
4791 |
+
doublesTier: "(DUU)",
|
4792 |
+
natDexTier: "RU",
|
4793 |
+
},
|
4794 |
+
flapplegmax: {
|
4795 |
+
isNonstandard: "Past",
|
4796 |
+
tier: "Illegal",
|
4797 |
+
},
|
4798 |
+
appletun: {
|
4799 |
+
tier: "ZU",
|
4800 |
+
doublesTier: "(DUU)",
|
4801 |
+
natDexTier: "RU",
|
4802 |
+
},
|
4803 |
+
appletungmax: {
|
4804 |
+
isNonstandard: "Past",
|
4805 |
+
tier: "Illegal",
|
4806 |
+
},
|
4807 |
+
dipplin: {
|
4808 |
+
tier: "ZU",
|
4809 |
+
doublesTier: "(DUU)",
|
4810 |
+
natDexTier: "RU",
|
4811 |
+
},
|
4812 |
+
silicobra: {
|
4813 |
+
tier: "LC",
|
4814 |
+
},
|
4815 |
+
sandaconda: {
|
4816 |
+
tier: "ZU",
|
4817 |
+
doublesTier: "(DUU)",
|
4818 |
+
natDexTier: "RU",
|
4819 |
+
},
|
4820 |
+
sandacondagmax: {
|
4821 |
+
isNonstandard: "Past",
|
4822 |
+
tier: "Illegal",
|
4823 |
+
},
|
4824 |
+
cramorant: {
|
4825 |
+
tier: "PU",
|
4826 |
+
doublesTier: "(DUU)",
|
4827 |
+
natDexTier: "RU",
|
4828 |
+
},
|
4829 |
+
arrokuda: {
|
4830 |
+
tier: "LC",
|
4831 |
+
},
|
4832 |
+
barraskewda: {
|
4833 |
+
tier: "RU",
|
4834 |
+
doublesTier: "(DUU)",
|
4835 |
+
natDexTier: "RU",
|
4836 |
+
},
|
4837 |
+
toxel: {
|
4838 |
+
tier: "LC",
|
4839 |
+
},
|
4840 |
+
toxtricity: {
|
4841 |
+
tier: "PU",
|
4842 |
+
doublesTier: "(DUU)",
|
4843 |
+
natDexTier: "RU",
|
4844 |
+
},
|
4845 |
+
toxtricitygmax: {
|
4846 |
+
isNonstandard: "Past",
|
4847 |
+
tier: "Illegal",
|
4848 |
+
},
|
4849 |
+
toxtricitylowkeygmax: {
|
4850 |
+
isNonstandard: "Past",
|
4851 |
+
tier: "Illegal",
|
4852 |
+
},
|
4853 |
+
sizzlipede: {
|
4854 |
+
isNonstandard: "Past",
|
4855 |
+
tier: "Illegal",
|
4856 |
+
natDexTier: "LC",
|
4857 |
+
},
|
4858 |
+
centiskorch: {
|
4859 |
+
isNonstandard: "Past",
|
4860 |
+
tier: "Illegal",
|
4861 |
+
natDexTier: "RU",
|
4862 |
+
},
|
4863 |
+
centiskorchgmax: {
|
4864 |
+
isNonstandard: "Past",
|
4865 |
+
tier: "Illegal",
|
4866 |
+
},
|
4867 |
+
clobbopus: {
|
4868 |
+
isNonstandard: "Past",
|
4869 |
+
tier: "Illegal",
|
4870 |
+
natDexTier: "LC",
|
4871 |
+
},
|
4872 |
+
grapploct: {
|
4873 |
+
isNonstandard: "Past",
|
4874 |
+
tier: "Illegal",
|
4875 |
+
natDexTier: "RU",
|
4876 |
+
},
|
4877 |
+
sinistea: {
|
4878 |
+
tier: "LC",
|
4879 |
+
},
|
4880 |
+
polteageist: {
|
4881 |
+
tier: "UUBL",
|
4882 |
+
doublesTier: "(DUU)",
|
4883 |
+
natDexTier: "RU",
|
4884 |
+
},
|
4885 |
+
hatenna: {
|
4886 |
+
tier: "LC",
|
4887 |
+
},
|
4888 |
+
hattrem: {
|
4889 |
+
tier: "NFE",
|
4890 |
+
},
|
4891 |
+
hatterene: {
|
4892 |
+
tier: "OU",
|
4893 |
+
doublesTier: "DOU",
|
4894 |
+
natDexTier: "OU",
|
4895 |
+
},
|
4896 |
+
hatterenegmax: {
|
4897 |
+
isNonstandard: "Past",
|
4898 |
+
tier: "Illegal",
|
4899 |
+
},
|
4900 |
+
impidimp: {
|
4901 |
+
tier: "LC",
|
4902 |
+
},
|
4903 |
+
morgrem: {
|
4904 |
+
tier: "NFE",
|
4905 |
+
},
|
4906 |
+
grimmsnarl: {
|
4907 |
+
tier: "PU",
|
4908 |
+
doublesTier: "DOU",
|
4909 |
+
natDexTier: "UU",
|
4910 |
+
},
|
4911 |
+
grimmsnarlgmax: {
|
4912 |
+
isNonstandard: "Past",
|
4913 |
+
tier: "Illegal",
|
4914 |
+
},
|
4915 |
+
milcery: {
|
4916 |
+
tier: "LC",
|
4917 |
+
},
|
4918 |
+
alcremie: {
|
4919 |
+
tier: "ZUBL",
|
4920 |
+
doublesTier: "(DUU)",
|
4921 |
+
natDexTier: "RU",
|
4922 |
+
},
|
4923 |
+
alcremiegmax: {
|
4924 |
+
isNonstandard: "Past",
|
4925 |
+
tier: "Illegal",
|
4926 |
+
},
|
4927 |
+
falinks: {
|
4928 |
+
tier: "ZU",
|
4929 |
+
doublesTier: "(DUU)",
|
4930 |
+
natDexTier: "RU",
|
4931 |
+
},
|
4932 |
+
pincurchin: {
|
4933 |
+
tier: "ZU",
|
4934 |
+
doublesTier: "(DUU)",
|
4935 |
+
natDexTier: "RU",
|
4936 |
+
},
|
4937 |
+
snom: {
|
4938 |
+
tier: "LC",
|
4939 |
+
},
|
4940 |
+
frosmoth: {
|
4941 |
+
tier: "PU",
|
4942 |
+
doublesTier: "(DUU)",
|
4943 |
+
natDexTier: "RU",
|
4944 |
+
},
|
4945 |
+
stonjourner: {
|
4946 |
+
tier: "ZU",
|
4947 |
+
doublesTier: "(DUU)",
|
4948 |
+
natDexTier: "RU",
|
4949 |
+
},
|
4950 |
+
eiscue: {
|
4951 |
+
tier: "ZU",
|
4952 |
+
doublesTier: "(DUU)",
|
4953 |
+
natDexTier: "RU",
|
4954 |
+
},
|
4955 |
+
indeedee: {
|
4956 |
+
tier: "PUBL",
|
4957 |
+
doublesTier: "DUU",
|
4958 |
+
natDexTier: "RU",
|
4959 |
+
},
|
4960 |
+
indeedeef: {
|
4961 |
+
tier: "ZU",
|
4962 |
+
doublesTier: "DOU",
|
4963 |
+
natDexTier: "RU",
|
4964 |
+
},
|
4965 |
+
morpeko: {
|
4966 |
+
tier: "ZU",
|
4967 |
+
doublesTier: "(DUU)",
|
4968 |
+
natDexTier: "RU",
|
4969 |
+
},
|
4970 |
+
cufant: {
|
4971 |
+
tier: "LC",
|
4972 |
+
},
|
4973 |
+
copperajah: {
|
4974 |
+
tier: "PU",
|
4975 |
+
doublesTier: "(DUU)",
|
4976 |
+
natDexTier: "RU",
|
4977 |
+
},
|
4978 |
+
copperajahgmax: {
|
4979 |
+
isNonstandard: "Past",
|
4980 |
+
tier: "Illegal",
|
4981 |
+
},
|
4982 |
+
dracozolt: {
|
4983 |
+
isNonstandard: "Past",
|
4984 |
+
tier: "Illegal",
|
4985 |
+
natDexTier: "RU",
|
4986 |
+
},
|
4987 |
+
arctozolt: {
|
4988 |
+
isNonstandard: "Past",
|
4989 |
+
tier: "Illegal",
|
4990 |
+
natDexTier: "RU",
|
4991 |
+
},
|
4992 |
+
dracovish: {
|
4993 |
+
isNonstandard: "Past",
|
4994 |
+
tier: "Illegal",
|
4995 |
+
natDexTier: "Uber",
|
4996 |
+
},
|
4997 |
+
arctovish: {
|
4998 |
+
isNonstandard: "Past",
|
4999 |
+
tier: "Illegal",
|
5000 |
+
natDexTier: "RU",
|
5001 |
+
},
|
5002 |
+
duraludon: {
|
5003 |
+
tier: "PUBL",
|
5004 |
+
doublesTier: "NFE",
|
5005 |
+
natDexTier: "RU",
|
5006 |
+
},
|
5007 |
+
duraludongmax: {
|
5008 |
+
isNonstandard: "Past",
|
5009 |
+
tier: "Illegal",
|
5010 |
+
},
|
5011 |
+
dreepy: {
|
5012 |
+
tier: "LC",
|
5013 |
+
},
|
5014 |
+
drakloak: {
|
5015 |
+
tier: "NFE",
|
5016 |
+
},
|
5017 |
+
dragapult: {
|
5018 |
+
tier: "OU",
|
5019 |
+
doublesTier: "DUU",
|
5020 |
+
natDexTier: "OU",
|
5021 |
+
},
|
5022 |
+
zacian: {
|
5023 |
+
tier: "Uber",
|
5024 |
+
doublesTier: "DUber",
|
5025 |
+
natDexTier: "Uber",
|
5026 |
+
},
|
5027 |
+
zaciancrowned: {
|
5028 |
+
tier: "Uber",
|
5029 |
+
doublesTier: "DUber",
|
5030 |
+
natDexTier: "Uber",
|
5031 |
+
},
|
5032 |
+
zamazenta: {
|
5033 |
+
tier: "OU",
|
5034 |
+
doublesTier: "DUber",
|
5035 |
+
natDexTier: "OU",
|
5036 |
+
},
|
5037 |
+
zamazentacrowned: {
|
5038 |
+
tier: "Uber",
|
5039 |
+
doublesTier: "DUber",
|
5040 |
+
natDexTier: "Uber",
|
5041 |
+
},
|
5042 |
+
eternatus: {
|
5043 |
+
tier: "Uber",
|
5044 |
+
doublesTier: "DUber",
|
5045 |
+
natDexTier: "Uber",
|
5046 |
+
},
|
5047 |
+
eternatuseternamax: {
|
5048 |
+
isNonstandard: "Past",
|
5049 |
+
tier: "Illegal",
|
5050 |
+
},
|
5051 |
+
kubfu: {
|
5052 |
+
tier: "NFE",
|
5053 |
+
},
|
5054 |
+
urshifu: {
|
5055 |
+
tier: "Uber",
|
5056 |
+
doublesTier: "DUber",
|
5057 |
+
natDexTier: "Uber",
|
5058 |
+
},
|
5059 |
+
urshifurapidstrike: {
|
5060 |
+
tier: "Uber",
|
5061 |
+
doublesTier: "DUber",
|
5062 |
+
natDexTier: "OU",
|
5063 |
+
},
|
5064 |
+
urshifugmax: {
|
5065 |
+
isNonstandard: "Past",
|
5066 |
+
tier: "Illegal",
|
5067 |
+
},
|
5068 |
+
urshifurapidstrikegmax: {
|
5069 |
+
isNonstandard: "Past",
|
5070 |
+
tier: "Illegal",
|
5071 |
+
},
|
5072 |
+
zarude: {
|
5073 |
+
tier: "UU",
|
5074 |
+
doublesTier: "(DUU)",
|
5075 |
+
natDexTier: "RU",
|
5076 |
+
},
|
5077 |
+
regieleki: {
|
5078 |
+
tier: "Uber",
|
5079 |
+
doublesTier: "DUU",
|
5080 |
+
natDexTier: "UU",
|
5081 |
+
},
|
5082 |
+
regidrago: {
|
5083 |
+
tier: "NUBL",
|
5084 |
+
doublesTier: "DOU",
|
5085 |
+
natDexTier: "RU",
|
5086 |
+
},
|
5087 |
+
glastrier: {
|
5088 |
+
tier: "ZU",
|
5089 |
+
doublesTier: "(DUU)",
|
5090 |
+
natDexTier: "RU",
|
5091 |
+
},
|
5092 |
+
spectrier: {
|
5093 |
+
tier: "Uber",
|
5094 |
+
doublesTier: "(DUU)",
|
5095 |
+
natDexTier: "Uber",
|
5096 |
+
},
|
5097 |
+
calyrex: {
|
5098 |
+
tier: "ZU",
|
5099 |
+
doublesTier: "(DUU)",
|
5100 |
+
natDexTier: "RU",
|
5101 |
+
},
|
5102 |
+
calyrexice: {
|
5103 |
+
tier: "Uber",
|
5104 |
+
doublesTier: "DUber",
|
5105 |
+
natDexTier: "Uber",
|
5106 |
+
},
|
5107 |
+
calyrexshadow: {
|
5108 |
+
tier: "AG",
|
5109 |
+
doublesTier: "DUber",
|
5110 |
+
natDexTier: "AG",
|
5111 |
+
},
|
5112 |
+
enamorus: {
|
5113 |
+
tier: "OU",
|
5114 |
+
doublesTier: "DUU",
|
5115 |
+
natDexTier: "UU",
|
5116 |
+
},
|
5117 |
+
enamorustherian: {
|
5118 |
+
tier: "RUBL",
|
5119 |
+
doublesTier: "(DUU)",
|
5120 |
+
natDexTier: "RU",
|
5121 |
+
},
|
5122 |
+
sprigatito: {
|
5123 |
+
tier: "LC",
|
5124 |
+
},
|
5125 |
+
floragato: {
|
5126 |
+
tier: "NFE",
|
5127 |
+
},
|
5128 |
+
meowscarada: {
|
5129 |
+
tier: "OU",
|
5130 |
+
doublesTier: "DUU",
|
5131 |
+
natDexTier: "UUBL",
|
5132 |
+
},
|
5133 |
+
fuecoco: {
|
5134 |
+
tier: "LC",
|
5135 |
+
},
|
5136 |
+
crocalor: {
|
5137 |
+
tier: "NFE",
|
5138 |
+
},
|
5139 |
+
skeledirge: {
|
5140 |
+
tier: "UU",
|
5141 |
+
doublesTier: "(DUU)",
|
5142 |
+
natDexTier: "UU",
|
5143 |
+
},
|
5144 |
+
quaxly: {
|
5145 |
+
tier: "LC",
|
5146 |
+
},
|
5147 |
+
quaxwell: {
|
5148 |
+
tier: "NFE",
|
5149 |
+
},
|
5150 |
+
quaquaval: {
|
5151 |
+
tier: "UU",
|
5152 |
+
doublesTier: "(DUU)",
|
5153 |
+
natDexTier: "UU",
|
5154 |
+
},
|
5155 |
+
lechonk: {
|
5156 |
+
tier: "LC",
|
5157 |
+
},
|
5158 |
+
oinkologne: {
|
5159 |
+
tier: "ZU",
|
5160 |
+
doublesTier: "(DUU)",
|
5161 |
+
natDexTier: "RU",
|
5162 |
+
},
|
5163 |
+
oinkolognef: {
|
5164 |
+
tier: "ZU",
|
5165 |
+
doublesTier: "(DUU)",
|
5166 |
+
natDexTier: "RU",
|
5167 |
+
},
|
5168 |
+
tarountula: {
|
5169 |
+
tier: "LC",
|
5170 |
+
},
|
5171 |
+
spidops: {
|
5172 |
+
tier: "ZU",
|
5173 |
+
doublesTier: "(DUU)",
|
5174 |
+
natDexTier: "RU",
|
5175 |
+
},
|
5176 |
+
nymble: {
|
5177 |
+
tier: "LC",
|
5178 |
+
},
|
5179 |
+
lokix: {
|
5180 |
+
tier: "UU",
|
5181 |
+
doublesTier: "(DUU)",
|
5182 |
+
natDexTier: "RU",
|
5183 |
+
},
|
5184 |
+
rellor: {
|
5185 |
+
tier: "LC",
|
5186 |
+
},
|
5187 |
+
rabsca: {
|
5188 |
+
tier: "ZU",
|
5189 |
+
doublesTier: "(DUU)",
|
5190 |
+
natDexTier: "RU",
|
5191 |
+
},
|
5192 |
+
greavard: {
|
5193 |
+
tier: "LC",
|
5194 |
+
},
|
5195 |
+
houndstone: {
|
5196 |
+
tier: "PU",
|
5197 |
+
doublesTier: "DUU",
|
5198 |
+
natDexTier: "RU",
|
5199 |
+
},
|
5200 |
+
flittle: {
|
5201 |
+
tier: "NFE",
|
5202 |
+
},
|
5203 |
+
espathra: {
|
5204 |
+
tier: "Uber",
|
5205 |
+
doublesTier: "(DUU)",
|
5206 |
+
natDexTier: "Uber",
|
5207 |
+
},
|
5208 |
+
wiglett: {
|
5209 |
+
tier: "LC",
|
5210 |
+
},
|
5211 |
+
wugtrio: {
|
5212 |
+
tier: "ZU",
|
5213 |
+
doublesTier: "(DUU)",
|
5214 |
+
natDexTier: "RU",
|
5215 |
+
},
|
5216 |
+
dondozo: {
|
5217 |
+
tier: "OU",
|
5218 |
+
doublesTier: "(DUU)",
|
5219 |
+
natDexTier: "UUBL",
|
5220 |
+
},
|
5221 |
+
veluza: {
|
5222 |
+
tier: "ZU",
|
5223 |
+
doublesTier: "(DUU)",
|
5224 |
+
natDexTier: "RU",
|
5225 |
+
},
|
5226 |
+
finizen: {
|
5227 |
+
tier: "LC",
|
5228 |
+
},
|
5229 |
+
palafin: {
|
5230 |
+
tier: "Uber",
|
5231 |
+
doublesTier: "(DUU)",
|
5232 |
+
natDexTier: "Uber",
|
5233 |
+
},
|
5234 |
+
smoliv: {
|
5235 |
+
tier: "LC",
|
5236 |
+
},
|
5237 |
+
dolliv: {
|
5238 |
+
tier: "NFE",
|
5239 |
+
},
|
5240 |
+
arboliva: {
|
5241 |
+
tier: "ZU",
|
5242 |
+
doublesTier: "(DUU)",
|
5243 |
+
natDexTier: "RU",
|
5244 |
+
},
|
5245 |
+
capsakid: {
|
5246 |
+
tier: "LC",
|
5247 |
+
},
|
5248 |
+
scovillain: {
|
5249 |
+
tier: "ZU",
|
5250 |
+
doublesTier: "(DUU)",
|
5251 |
+
natDexTier: "RU",
|
5252 |
+
},
|
5253 |
+
tadbulb: {
|
5254 |
+
tier: "LC",
|
5255 |
+
},
|
5256 |
+
bellibolt: {
|
5257 |
+
tier: "PU",
|
5258 |
+
doublesTier: "(DUU)",
|
5259 |
+
natDexTier: "RU",
|
5260 |
+
},
|
5261 |
+
varoom: {
|
5262 |
+
tier: "LC",
|
5263 |
+
},
|
5264 |
+
revavroom: {
|
5265 |
+
tier: "UU",
|
5266 |
+
doublesTier: "(DUU)",
|
5267 |
+
natDexTier: "RU",
|
5268 |
+
},
|
5269 |
+
orthworm: {
|
5270 |
+
tier: "ZU",
|
5271 |
+
doublesTier: "(DUU)",
|
5272 |
+
natDexTier: "RU",
|
5273 |
+
},
|
5274 |
+
tandemaus: {
|
5275 |
+
tier: "LC",
|
5276 |
+
},
|
5277 |
+
maushold: {
|
5278 |
+
tier: "RU",
|
5279 |
+
doublesTier: "DUU",
|
5280 |
+
natDexTier: "RU",
|
5281 |
+
},
|
5282 |
+
cetoddle: {
|
5283 |
+
tier: "LC",
|
5284 |
+
},
|
5285 |
+
cetitan: {
|
5286 |
+
tier: "NUBL",
|
5287 |
+
doublesTier: "(DUU)",
|
5288 |
+
natDexTier: "RU",
|
5289 |
+
},
|
5290 |
+
frigibax: {
|
5291 |
+
tier: "LC",
|
5292 |
+
},
|
5293 |
+
arctibax: {
|
5294 |
+
tier: "NFE",
|
5295 |
+
},
|
5296 |
+
baxcalibur: {
|
5297 |
+
tier: "Uber",
|
5298 |
+
doublesTier: "(DUU)",
|
5299 |
+
natDexTier: "Uber",
|
5300 |
+
},
|
5301 |
+
tatsugiri: {
|
5302 |
+
tier: "PU",
|
5303 |
+
doublesTier: "DUber",
|
5304 |
+
natDexTier: "RU",
|
5305 |
+
},
|
5306 |
+
cyclizar: {
|
5307 |
+
tier: "RU",
|
5308 |
+
doublesTier: "(DUU)",
|
5309 |
+
natDexTier: "RU",
|
5310 |
+
},
|
5311 |
+
pawmi: {
|
5312 |
+
tier: "LC",
|
5313 |
+
},
|
5314 |
+
pawmo: {
|
5315 |
+
tier: "NFE",
|
5316 |
+
},
|
5317 |
+
pawmot: {
|
5318 |
+
tier: "PU",
|
5319 |
+
doublesTier: "(DUU)",
|
5320 |
+
natDexTier: "RU",
|
5321 |
+
},
|
5322 |
+
wattrel: {
|
5323 |
+
tier: "LC",
|
5324 |
+
},
|
5325 |
+
kilowattrel: {
|
5326 |
+
tier: "NU",
|
5327 |
+
doublesTier: "(DUU)",
|
5328 |
+
natDexTier: "RU",
|
5329 |
+
},
|
5330 |
+
bombirdier: {
|
5331 |
+
tier: "PU",
|
5332 |
+
doublesTier: "(DUU)",
|
5333 |
+
natDexTier: "RU",
|
5334 |
+
},
|
5335 |
+
squawkabilly: {
|
5336 |
+
tier: "ZU",
|
5337 |
+
doublesTier: "(DUU)",
|
5338 |
+
natDexTier: "RU",
|
5339 |
+
},
|
5340 |
+
flamigo: {
|
5341 |
+
tier: "PUBL",
|
5342 |
+
doublesTier: "(DUU)",
|
5343 |
+
natDexTier: "RU",
|
5344 |
+
},
|
5345 |
+
klawf: {
|
5346 |
+
tier: "ZU",
|
5347 |
+
doublesTier: "(DUU)",
|
5348 |
+
natDexTier: "RU",
|
5349 |
+
},
|
5350 |
+
nacli: {
|
5351 |
+
tier: "LC",
|
5352 |
+
},
|
5353 |
+
naclstack: {
|
5354 |
+
tier: "NFE",
|
5355 |
+
},
|
5356 |
+
garganacl: {
|
5357 |
+
tier: "OU",
|
5358 |
+
doublesTier: "DUU",
|
5359 |
+
natDexTier: "UUBL",
|
5360 |
+
},
|
5361 |
+
glimmet: {
|
5362 |
+
tier: "LC",
|
5363 |
+
},
|
5364 |
+
glimmora: {
|
5365 |
+
tier: "OU",
|
5366 |
+
doublesTier: "DOU",
|
5367 |
+
natDexTier: "OU",
|
5368 |
+
},
|
5369 |
+
shroodle: {
|
5370 |
+
tier: "LC",
|
5371 |
+
},
|
5372 |
+
grafaiai: {
|
5373 |
+
tier: "ZU",
|
5374 |
+
doublesTier: "(DUU)",
|
5375 |
+
natDexTier: "UU",
|
5376 |
+
},
|
5377 |
+
fidough: {
|
5378 |
+
tier: "LC",
|
5379 |
+
},
|
5380 |
+
dachsbun: {
|
5381 |
+
tier: "ZU",
|
5382 |
+
doublesTier: "(DUU)",
|
5383 |
+
natDexTier: "RU",
|
5384 |
+
},
|
5385 |
+
maschiff: {
|
5386 |
+
tier: "LC",
|
5387 |
+
},
|
5388 |
+
mabosstiff: {
|
5389 |
+
tier: "ZU",
|
5390 |
+
doublesTier: "(DUU)",
|
5391 |
+
natDexTier: "RU",
|
5392 |
+
},
|
5393 |
+
bramblin: {
|
5394 |
+
tier: "LC",
|
5395 |
+
},
|
5396 |
+
brambleghast: {
|
5397 |
+
tier: "NU",
|
5398 |
+
doublesTier: "(DUU)",
|
5399 |
+
natDexTier: "RU",
|
5400 |
+
},
|
5401 |
+
gimmighoul: {
|
5402 |
+
tier: "LC",
|
5403 |
+
},
|
5404 |
+
gimmighoulroaming: {
|
5405 |
+
tier: "LC",
|
5406 |
+
},
|
5407 |
+
gholdengo: {
|
5408 |
+
tier: "OU",
|
5409 |
+
doublesTier: "DOU",
|
5410 |
+
natDexTier: "OU",
|
5411 |
+
},
|
5412 |
+
greattusk: {
|
5413 |
+
tier: "OU",
|
5414 |
+
doublesTier: "(DUU)",
|
5415 |
+
natDexTier: "OU",
|
5416 |
+
},
|
5417 |
+
brutebonnet: {
|
5418 |
+
tier: "ZU",
|
5419 |
+
doublesTier: "DUU",
|
5420 |
+
natDexTier: "RU",
|
5421 |
+
},
|
5422 |
+
sandyshocks: {
|
5423 |
+
tier: "UU",
|
5424 |
+
doublesTier: "(DUU)",
|
5425 |
+
natDexTier: "RU",
|
5426 |
+
},
|
5427 |
+
screamtail: {
|
5428 |
+
tier: "NU",
|
5429 |
+
doublesTier: "(DUU)",
|
5430 |
+
natDexTier: "RU",
|
5431 |
+
},
|
5432 |
+
fluttermane: {
|
5433 |
+
tier: "Uber",
|
5434 |
+
doublesTier: "DUber",
|
5435 |
+
natDexTier: "Uber",
|
5436 |
+
},
|
5437 |
+
slitherwing: {
|
5438 |
+
tier: "RU",
|
5439 |
+
doublesTier: "(DUU)",
|
5440 |
+
natDexTier: "RU",
|
5441 |
+
},
|
5442 |
+
roaringmoon: {
|
5443 |
+
tier: "OU",
|
5444 |
+
doublesTier: "DOU",
|
5445 |
+
natDexTier: "OU",
|
5446 |
+
},
|
5447 |
+
irontreads: {
|
5448 |
+
tier: "OU",
|
5449 |
+
doublesTier: "(DUU)",
|
5450 |
+
natDexTier: "OU",
|
5451 |
+
},
|
5452 |
+
ironmoth: {
|
5453 |
+
tier: "OU",
|
5454 |
+
doublesTier: "(DUU)",
|
5455 |
+
natDexTier: "UU",
|
5456 |
+
},
|
5457 |
+
ironhands: {
|
5458 |
+
tier: "UUBL",
|
5459 |
+
doublesTier: "DOU",
|
5460 |
+
natDexTier: "UUBL",
|
5461 |
+
},
|
5462 |
+
ironjugulis: {
|
5463 |
+
tier: "RUBL",
|
5464 |
+
doublesTier: "DUU",
|
5465 |
+
natDexTier: "RU",
|
5466 |
+
},
|
5467 |
+
ironthorns: {
|
5468 |
+
tier: "NUBL",
|
5469 |
+
doublesTier: "(DUU)",
|
5470 |
+
natDexTier: "RU",
|
5471 |
+
},
|
5472 |
+
ironbundle: {
|
5473 |
+
tier: "Uber",
|
5474 |
+
doublesTier: "DUU",
|
5475 |
+
natDexTier: "Uber",
|
5476 |
+
},
|
5477 |
+
ironvaliant: {
|
5478 |
+
tier: "OU",
|
5479 |
+
doublesTier: "(DUU)",
|
5480 |
+
natDexTier: "OU",
|
5481 |
+
},
|
5482 |
+
tinglu: {
|
5483 |
+
tier: "OU",
|
5484 |
+
doublesTier: "DOU",
|
5485 |
+
natDexTier: "UU",
|
5486 |
+
},
|
5487 |
+
chienpao: {
|
5488 |
+
tier: "Uber",
|
5489 |
+
doublesTier: "DOU",
|
5490 |
+
natDexTier: "Uber",
|
5491 |
+
},
|
5492 |
+
wochien: {
|
5493 |
+
tier: "PU",
|
5494 |
+
doublesTier: "(DUU)",
|
5495 |
+
natDexTier: "RU",
|
5496 |
+
},
|
5497 |
+
chiyu: {
|
5498 |
+
tier: "Uber",
|
5499 |
+
doublesTier: "DOU",
|
5500 |
+
natDexTier: "Uber",
|
5501 |
+
},
|
5502 |
+
koraidon: {
|
5503 |
+
tier: "Uber",
|
5504 |
+
doublesTier: "DUber",
|
5505 |
+
natDexTier: "AG",
|
5506 |
+
},
|
5507 |
+
miraidon: {
|
5508 |
+
tier: "AG",
|
5509 |
+
doublesTier: "DUber",
|
5510 |
+
natDexTier: "AG",
|
5511 |
+
},
|
5512 |
+
tinkatink: {
|
5513 |
+
tier: "LC",
|
5514 |
+
},
|
5515 |
+
tinkatuff: {
|
5516 |
+
tier: "NFE",
|
5517 |
+
},
|
5518 |
+
tinkaton: {
|
5519 |
+
tier: "UU",
|
5520 |
+
doublesTier: "(DUU)",
|
5521 |
+
natDexTier: "RU",
|
5522 |
+
},
|
5523 |
+
charcadet: {
|
5524 |
+
tier: "LC",
|
5525 |
+
},
|
5526 |
+
armarouge: {
|
5527 |
+
tier: "RU",
|
5528 |
+
doublesTier: "DUU",
|
5529 |
+
natDexTier: "RU",
|
5530 |
+
},
|
5531 |
+
ceruledge: {
|
5532 |
+
tier: "UUBL",
|
5533 |
+
doublesTier: "(DUU)",
|
5534 |
+
natDexTier: "UUBL",
|
5535 |
+
},
|
5536 |
+
toedscool: {
|
5537 |
+
tier: "LC",
|
5538 |
+
},
|
5539 |
+
toedscruel: {
|
5540 |
+
tier: "ZU",
|
5541 |
+
doublesTier: "(DUU)",
|
5542 |
+
natDexTier: "RU",
|
5543 |
+
},
|
5544 |
+
kingambit: {
|
5545 |
+
tier: "OU",
|
5546 |
+
doublesTier: "DOU",
|
5547 |
+
natDexTier: "OU",
|
5548 |
+
},
|
5549 |
+
clodsire: {
|
5550 |
+
tier: "UU",
|
5551 |
+
doublesTier: "(DUU)",
|
5552 |
+
natDexTier: "OU",
|
5553 |
+
},
|
5554 |
+
annihilape: {
|
5555 |
+
tier: "Uber",
|
5556 |
+
doublesTier: "DUber",
|
5557 |
+
natDexTier: "Uber",
|
5558 |
+
},
|
5559 |
+
walkingwake: {
|
5560 |
+
tier: "OU",
|
5561 |
+
doublesTier: "DOU",
|
5562 |
+
natDexTier: "Uber",
|
5563 |
+
},
|
5564 |
+
ironleaves: {
|
5565 |
+
tier: "RUBL",
|
5566 |
+
doublesTier: "(DUU)",
|
5567 |
+
natDexTier: "RUBL",
|
5568 |
+
},
|
5569 |
+
poltchageist: {
|
5570 |
+
tier: "LC",
|
5571 |
+
},
|
5572 |
+
sinistcha: {
|
5573 |
+
tier: "UU",
|
5574 |
+
doublesTier: "DOU",
|
5575 |
+
natDexTier: "RU",
|
5576 |
+
},
|
5577 |
+
okidogi: {
|
5578 |
+
tier: "UUBL",
|
5579 |
+
doublesTier: "(DUU)",
|
5580 |
+
natDexTier: "RU",
|
5581 |
+
},
|
5582 |
+
munkidori: {
|
5583 |
+
tier: "NU",
|
5584 |
+
doublesTier: "(DUU)",
|
5585 |
+
natDexTier: "RU",
|
5586 |
+
},
|
5587 |
+
fezandipiti: {
|
5588 |
+
tier: "RU",
|
5589 |
+
doublesTier: "(DUU)",
|
5590 |
+
natDexTier: "RU",
|
5591 |
+
},
|
5592 |
+
ogerpon: {
|
5593 |
+
tier: "UU",
|
5594 |
+
doublesTier: "(DUU)",
|
5595 |
+
natDexTier: "RU",
|
5596 |
+
},
|
5597 |
+
ogerponwellspring: {
|
5598 |
+
tier: "OU",
|
5599 |
+
doublesTier: "DOU",
|
5600 |
+
natDexTier: "OU",
|
5601 |
+
},
|
5602 |
+
ogerponhearthflame: {
|
5603 |
+
tier: "Uber",
|
5604 |
+
doublesTier: "DOU",
|
5605 |
+
natDexTier: "Uber",
|
5606 |
+
},
|
5607 |
+
ogerponcornerstone: {
|
5608 |
+
tier: "UU",
|
5609 |
+
doublesTier: "DUU",
|
5610 |
+
natDexTier: "UUBL",
|
5611 |
+
},
|
5612 |
+
archaludon: {
|
5613 |
+
tier: "Uber",
|
5614 |
+
doublesTier: "DUber",
|
5615 |
+
natDexTier: "UU",
|
5616 |
+
},
|
5617 |
+
hydrapple: {
|
5618 |
+
tier: "UU",
|
5619 |
+
doublesTier: "(DUU)",
|
5620 |
+
natDexTier: "UU",
|
5621 |
+
},
|
5622 |
+
gougingfire: {
|
5623 |
+
tier: "Uber",
|
5624 |
+
doublesTier: "DOU",
|
5625 |
+
natDexTier: "Uber",
|
5626 |
+
},
|
5627 |
+
ragingbolt: {
|
5628 |
+
tier: "OU",
|
5629 |
+
doublesTier: "DOU",
|
5630 |
+
natDexTier: "OU",
|
5631 |
+
},
|
5632 |
+
ironboulder: {
|
5633 |
+
tier: "UUBL",
|
5634 |
+
doublesTier: "(DUU)",
|
5635 |
+
natDexTier: "UU",
|
5636 |
+
},
|
5637 |
+
ironcrown: {
|
5638 |
+
tier: "OU",
|
5639 |
+
doublesTier: "DUU",
|
5640 |
+
natDexTier: "OU",
|
5641 |
+
},
|
5642 |
+
terapagos: {
|
5643 |
+
tier: "Uber",
|
5644 |
+
doublesTier: "DUber",
|
5645 |
+
natDexTier: "OU",
|
5646 |
+
},
|
5647 |
+
terapagosstellar: {
|
5648 |
+
tier: "Uber",
|
5649 |
+
doublesTier: "DUber",
|
5650 |
+
natDexTier: "Uber",
|
5651 |
+
},
|
5652 |
+
pecharunt: {
|
5653 |
+
tier: "OU",
|
5654 |
+
doublesTier: "(DUU)",
|
5655 |
+
natDexTier: "RUBL",
|
5656 |
+
},
|
5657 |
+
missingno: {
|
5658 |
+
isNonstandard: "Custom",
|
5659 |
+
tier: "Illegal",
|
5660 |
+
},
|
5661 |
+
syclar: {
|
5662 |
+
isNonstandard: "CAP",
|
5663 |
+
tier: "CAP LC",
|
5664 |
+
},
|
5665 |
+
syclant: {
|
5666 |
+
isNonstandard: "CAP",
|
5667 |
+
tier: "CAP",
|
5668 |
+
},
|
5669 |
+
revenankh: {
|
5670 |
+
isNonstandard: "CAP",
|
5671 |
+
tier: "CAP",
|
5672 |
+
},
|
5673 |
+
embirch: {
|
5674 |
+
isNonstandard: "CAP",
|
5675 |
+
tier: "CAP LC",
|
5676 |
+
},
|
5677 |
+
flarelm: {
|
5678 |
+
isNonstandard: "CAP",
|
5679 |
+
tier: "CAP NFE",
|
5680 |
+
},
|
5681 |
+
pyroak: {
|
5682 |
+
isNonstandard: "CAP",
|
5683 |
+
tier: "CAP",
|
5684 |
+
},
|
5685 |
+
breezi: {
|
5686 |
+
isNonstandard: "CAP",
|
5687 |
+
tier: "CAP LC",
|
5688 |
+
},
|
5689 |
+
fidgit: {
|
5690 |
+
isNonstandard: "CAP",
|
5691 |
+
tier: "CAP",
|
5692 |
+
},
|
5693 |
+
rebble: {
|
5694 |
+
isNonstandard: "CAP",
|
5695 |
+
tier: "CAP LC",
|
5696 |
+
},
|
5697 |
+
tactite: {
|
5698 |
+
isNonstandard: "CAP",
|
5699 |
+
tier: "CAP NFE",
|
5700 |
+
},
|
5701 |
+
stratagem: {
|
5702 |
+
isNonstandard: "CAP",
|
5703 |
+
tier: "CAP",
|
5704 |
+
},
|
5705 |
+
privatyke: {
|
5706 |
+
isNonstandard: "CAP",
|
5707 |
+
tier: "CAP LC",
|
5708 |
+
},
|
5709 |
+
arghonaut: {
|
5710 |
+
isNonstandard: "CAP",
|
5711 |
+
tier: "CAP",
|
5712 |
+
},
|
5713 |
+
nohface: {
|
5714 |
+
isNonstandard: "CAP",
|
5715 |
+
tier: "CAP LC",
|
5716 |
+
},
|
5717 |
+
kitsunoh: {
|
5718 |
+
isNonstandard: "CAP",
|
5719 |
+
tier: "CAP",
|
5720 |
+
},
|
5721 |
+
monohm: {
|
5722 |
+
isNonstandard: "CAP",
|
5723 |
+
tier: "CAP LC",
|
5724 |
+
},
|
5725 |
+
duohm: {
|
5726 |
+
isNonstandard: "CAP",
|
5727 |
+
tier: "CAP NFE",
|
5728 |
+
},
|
5729 |
+
cyclohm: {
|
5730 |
+
isNonstandard: "CAP",
|
5731 |
+
tier: "CAP",
|
5732 |
+
},
|
5733 |
+
dorsoil: {
|
5734 |
+
isNonstandard: "CAP",
|
5735 |
+
tier: "CAP LC",
|
5736 |
+
},
|
5737 |
+
colossoil: {
|
5738 |
+
isNonstandard: "CAP",
|
5739 |
+
tier: "CAP",
|
5740 |
+
},
|
5741 |
+
protowatt: {
|
5742 |
+
isNonstandard: "CAP",
|
5743 |
+
tier: "CAP LC",
|
5744 |
+
},
|
5745 |
+
krilowatt: {
|
5746 |
+
isNonstandard: "CAP",
|
5747 |
+
tier: "CAP",
|
5748 |
+
},
|
5749 |
+
voodoll: {
|
5750 |
+
isNonstandard: "CAP",
|
5751 |
+
tier: "CAP LC",
|
5752 |
+
},
|
5753 |
+
voodoom: {
|
5754 |
+
isNonstandard: "CAP",
|
5755 |
+
tier: "CAP",
|
5756 |
+
},
|
5757 |
+
scratchet: {
|
5758 |
+
isNonstandard: "CAP",
|
5759 |
+
tier: "CAP LC",
|
5760 |
+
},
|
5761 |
+
tomohawk: {
|
5762 |
+
isNonstandard: "CAP",
|
5763 |
+
tier: "CAP",
|
5764 |
+
},
|
5765 |
+
necturine: {
|
5766 |
+
isNonstandard: "CAP",
|
5767 |
+
tier: "CAP LC",
|
5768 |
+
},
|
5769 |
+
necturna: {
|
5770 |
+
isNonstandard: "CAP",
|
5771 |
+
tier: "CAP",
|
5772 |
+
},
|
5773 |
+
mollux: {
|
5774 |
+
isNonstandard: "CAP",
|
5775 |
+
tier: "CAP",
|
5776 |
+
},
|
5777 |
+
cupra: {
|
5778 |
+
isNonstandard: "CAP",
|
5779 |
+
tier: "CAP LC",
|
5780 |
+
},
|
5781 |
+
argalis: {
|
5782 |
+
isNonstandard: "CAP",
|
5783 |
+
tier: "CAP NFE",
|
5784 |
+
},
|
5785 |
+
aurumoth: {
|
5786 |
+
isNonstandard: "CAP",
|
5787 |
+
tier: "CAP",
|
5788 |
+
},
|
5789 |
+
brattler: {
|
5790 |
+
isNonstandard: "CAP",
|
5791 |
+
tier: "CAP LC",
|
5792 |
+
},
|
5793 |
+
malaconda: {
|
5794 |
+
isNonstandard: "CAP",
|
5795 |
+
tier: "CAP",
|
5796 |
+
},
|
5797 |
+
cawdet: {
|
5798 |
+
isNonstandard: "CAP",
|
5799 |
+
tier: "CAP LC",
|
5800 |
+
},
|
5801 |
+
cawmodore: {
|
5802 |
+
isNonstandard: "CAP",
|
5803 |
+
tier: "CAP",
|
5804 |
+
},
|
5805 |
+
volkritter: {
|
5806 |
+
isNonstandard: "CAP",
|
5807 |
+
tier: "CAP LC",
|
5808 |
+
},
|
5809 |
+
volkraken: {
|
5810 |
+
isNonstandard: "CAP",
|
5811 |
+
tier: "CAP",
|
5812 |
+
},
|
5813 |
+
snugglow: {
|
5814 |
+
isNonstandard: "CAP",
|
5815 |
+
tier: "CAP LC",
|
5816 |
+
},
|
5817 |
+
plasmanta: {
|
5818 |
+
isNonstandard: "CAP",
|
5819 |
+
tier: "CAP",
|
5820 |
+
},
|
5821 |
+
floatoy: {
|
5822 |
+
isNonstandard: "CAP",
|
5823 |
+
tier: "CAP LC",
|
5824 |
+
},
|
5825 |
+
caimanoe: {
|
5826 |
+
isNonstandard: "CAP",
|
5827 |
+
tier: "CAP NFE",
|
5828 |
+
},
|
5829 |
+
naviathan: {
|
5830 |
+
isNonstandard: "CAP",
|
5831 |
+
tier: "CAP",
|
5832 |
+
},
|
5833 |
+
crucibelle: {
|
5834 |
+
isNonstandard: "CAP",
|
5835 |
+
tier: "CAP",
|
5836 |
+
},
|
5837 |
+
crucibellemega: {
|
5838 |
+
isNonstandard: "CAP",
|
5839 |
+
tier: "CAP",
|
5840 |
+
},
|
5841 |
+
pluffle: {
|
5842 |
+
isNonstandard: "CAP",
|
5843 |
+
tier: "CAP LC",
|
5844 |
+
},
|
5845 |
+
kerfluffle: {
|
5846 |
+
isNonstandard: "CAP",
|
5847 |
+
tier: "CAP",
|
5848 |
+
},
|
5849 |
+
pajantom: {
|
5850 |
+
isNonstandard: "CAP",
|
5851 |
+
tier: "CAP",
|
5852 |
+
},
|
5853 |
+
mumbao: {
|
5854 |
+
isNonstandard: "CAP",
|
5855 |
+
tier: "CAP LC",
|
5856 |
+
},
|
5857 |
+
jumbao: {
|
5858 |
+
isNonstandard: "CAP",
|
5859 |
+
tier: "CAP",
|
5860 |
+
},
|
5861 |
+
fawnifer: {
|
5862 |
+
isNonstandard: "CAP",
|
5863 |
+
tier: "CAP LC",
|
5864 |
+
},
|
5865 |
+
electrelk: {
|
5866 |
+
isNonstandard: "CAP",
|
5867 |
+
tier: "CAP NFE",
|
5868 |
+
},
|
5869 |
+
caribolt: {
|
5870 |
+
isNonstandard: "CAP",
|
5871 |
+
tier: "CAP",
|
5872 |
+
},
|
5873 |
+
smogecko: {
|
5874 |
+
isNonstandard: "CAP",
|
5875 |
+
tier: "CAP LC",
|
5876 |
+
},
|
5877 |
+
smoguana: {
|
5878 |
+
isNonstandard: "CAP",
|
5879 |
+
tier: "CAP NFE",
|
5880 |
+
},
|
5881 |
+
smokomodo: {
|
5882 |
+
isNonstandard: "CAP",
|
5883 |
+
tier: "CAP",
|
5884 |
+
},
|
5885 |
+
swirlpool: {
|
5886 |
+
isNonstandard: "CAP",
|
5887 |
+
tier: "CAP LC",
|
5888 |
+
},
|
5889 |
+
coribalis: {
|
5890 |
+
isNonstandard: "CAP",
|
5891 |
+
tier: "CAP NFE",
|
5892 |
+
},
|
5893 |
+
snaelstrom: {
|
5894 |
+
isNonstandard: "CAP",
|
5895 |
+
tier: "CAP",
|
5896 |
+
},
|
5897 |
+
justyke: {
|
5898 |
+
isNonstandard: "CAP",
|
5899 |
+
tier: "CAP LC",
|
5900 |
+
},
|
5901 |
+
equilibra: {
|
5902 |
+
isNonstandard: "CAP",
|
5903 |
+
tier: "CAP",
|
5904 |
+
},
|
5905 |
+
solotl: {
|
5906 |
+
isNonstandard: "CAP",
|
5907 |
+
tier: "CAP LC",
|
5908 |
+
},
|
5909 |
+
astrolotl: {
|
5910 |
+
isNonstandard: "CAP",
|
5911 |
+
tier: "CAP",
|
5912 |
+
},
|
5913 |
+
miasmite: {
|
5914 |
+
isNonstandard: "CAP",
|
5915 |
+
tier: "CAP LC",
|
5916 |
+
},
|
5917 |
+
miasmaw: {
|
5918 |
+
isNonstandard: "CAP",
|
5919 |
+
tier: "CAP",
|
5920 |
+
},
|
5921 |
+
chromera: {
|
5922 |
+
isNonstandard: "CAP",
|
5923 |
+
tier: "CAP",
|
5924 |
+
},
|
5925 |
+
venomicon: {
|
5926 |
+
isNonstandard: "CAP",
|
5927 |
+
tier: "CAP",
|
5928 |
+
},
|
5929 |
+
venomiconepilogue: {
|
5930 |
+
isNonstandard: "CAP",
|
5931 |
+
tier: "CAP",
|
5932 |
+
},
|
5933 |
+
saharascal: {
|
5934 |
+
isNonstandard: "CAP",
|
5935 |
+
tier: "CAP LC",
|
5936 |
+
},
|
5937 |
+
saharaja: {
|
5938 |
+
isNonstandard: "CAP",
|
5939 |
+
tier: "CAP",
|
5940 |
+
},
|
5941 |
+
ababo: {
|
5942 |
+
isNonstandard: "CAP",
|
5943 |
+
tier: "CAP LC",
|
5944 |
+
},
|
5945 |
+
scattervein: {
|
5946 |
+
isNonstandard: "CAP",
|
5947 |
+
tier: "CAP NFE",
|
5948 |
+
},
|
5949 |
+
hemogoblin: {
|
5950 |
+
isNonstandard: "CAP",
|
5951 |
+
tier: "CAP",
|
5952 |
+
},
|
5953 |
+
cresceidon: {
|
5954 |
+
isNonstandard: "CAP",
|
5955 |
+
tier: "CAP",
|
5956 |
+
},
|
5957 |
+
chuggon: {
|
5958 |
+
isNonstandard: "CAP",
|
5959 |
+
tier: "CAP LC",
|
5960 |
+
},
|
5961 |
+
draggalong: {
|
5962 |
+
isNonstandard: "CAP",
|
5963 |
+
tier: "CAP NFE",
|
5964 |
+
},
|
5965 |
+
chuggalong: {
|
5966 |
+
isNonstandard: "CAP",
|
5967 |
+
tier: "CAP",
|
5968 |
+
},
|
5969 |
+
shox: {
|
5970 |
+
isNonstandard: "CAP",
|
5971 |
+
tier: "CAP",
|
5972 |
+
},
|
5973 |
+
pokestarsmeargle: {
|
5974 |
+
isNonstandard: "Custom",
|
5975 |
+
tier: "Illegal",
|
5976 |
+
},
|
5977 |
+
pokestarufo: {
|
5978 |
+
isNonstandard: "Custom",
|
5979 |
+
tier: "Illegal",
|
5980 |
+
},
|
5981 |
+
pokestarufo2: {
|
5982 |
+
isNonstandard: "Custom",
|
5983 |
+
tier: "Illegal",
|
5984 |
+
},
|
5985 |
+
pokestarbrycenman: {
|
5986 |
+
isNonstandard: "Custom",
|
5987 |
+
tier: "Illegal",
|
5988 |
+
},
|
5989 |
+
pokestarmt: {
|
5990 |
+
isNonstandard: "Custom",
|
5991 |
+
tier: "Illegal",
|
5992 |
+
},
|
5993 |
+
pokestarmt2: {
|
5994 |
+
isNonstandard: "Custom",
|
5995 |
+
tier: "Illegal",
|
5996 |
+
},
|
5997 |
+
pokestartransport: {
|
5998 |
+
isNonstandard: "Custom",
|
5999 |
+
tier: "Illegal",
|
6000 |
+
},
|
6001 |
+
pokestargiant: {
|
6002 |
+
isNonstandard: "Custom",
|
6003 |
+
tier: "Illegal",
|
6004 |
+
},
|
6005 |
+
pokestarhumanoid: {
|
6006 |
+
isNonstandard: "Custom",
|
6007 |
+
tier: "Illegal",
|
6008 |
+
},
|
6009 |
+
pokestarmonster: {
|
6010 |
+
isNonstandard: "Custom",
|
6011 |
+
tier: "Illegal",
|
6012 |
+
},
|
6013 |
+
pokestarf00: {
|
6014 |
+
isNonstandard: "Custom",
|
6015 |
+
tier: "Illegal",
|
6016 |
+
},
|
6017 |
+
pokestarf002: {
|
6018 |
+
isNonstandard: "Custom",
|
6019 |
+
tier: "Illegal",
|
6020 |
+
},
|
6021 |
+
pokestarspirit: {
|
6022 |
+
isNonstandard: "Custom",
|
6023 |
+
tier: "Illegal",
|
6024 |
+
},
|
6025 |
+
pokestarblackdoor: {
|
6026 |
+
isNonstandard: "Custom",
|
6027 |
+
tier: "Illegal",
|
6028 |
+
},
|
6029 |
+
pokestarwhitedoor: {
|
6030 |
+
isNonstandard: "Custom",
|
6031 |
+
tier: "Illegal",
|
6032 |
+
},
|
6033 |
+
pokestarblackbelt: {
|
6034 |
+
isNonstandard: "Custom",
|
6035 |
+
tier: "Illegal",
|
6036 |
+
},
|
6037 |
+
pokestarufopropu2: {
|
6038 |
+
isNonstandard: "Custom",
|
6039 |
+
tier: "Illegal",
|
6040 |
+
},
|
6041 |
+
};
|
data/items.ts
ADDED
The diff for this file is too large to render.
See raw diff
|
|
data/learnsets.ts
ADDED
The diff for this file is too large to render.
See raw diff
|
|
data/mods/fullpotential/abilities.ts
ADDED
@@ -0,0 +1,22 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTable = {
|
2 |
+
unaware: {
|
3 |
+
inherit: true,
|
4 |
+
onAnyModifyBoost(boosts, pokemon) {
|
5 |
+
const unawareUser = this.effectState.target;
|
6 |
+
if (unawareUser === pokemon) return;
|
7 |
+
if (unawareUser === this.activePokemon && pokemon === this.activeTarget) {
|
8 |
+
boosts['def'] = 0;
|
9 |
+
boosts['spd'] = 0;
|
10 |
+
boosts['evasion'] = 0;
|
11 |
+
}
|
12 |
+
if (pokemon === this.activePokemon && unawareUser === this.activeTarget) {
|
13 |
+
boosts['atk'] = 0;
|
14 |
+
boosts['def'] = 0;
|
15 |
+
boosts['spa'] = 0;
|
16 |
+
boosts['spd'] = 0;
|
17 |
+
boosts['spe'] = 0;
|
18 |
+
boosts['accuracy'] = 0;
|
19 |
+
}
|
20 |
+
},
|
21 |
+
},
|
22 |
+
};
|
data/mods/fullpotential/scripts.ts
ADDED
@@ -0,0 +1,135 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
export const Scripts: ModdedBattleScriptsData = {
|
2 |
+
gen: 9,
|
3 |
+
actions: {
|
4 |
+
getDamage(source, target, move, suppressMessages) {
|
5 |
+
if (typeof move === 'string') move = this.dex.getActiveMove(move);
|
6 |
+
|
7 |
+
if (typeof move === 'number') {
|
8 |
+
const basePower = move;
|
9 |
+
move = new Dex.Move({
|
10 |
+
basePower,
|
11 |
+
type: '???',
|
12 |
+
category: 'Physical',
|
13 |
+
willCrit: false,
|
14 |
+
}) as ActiveMove;
|
15 |
+
move.hit = 0;
|
16 |
+
}
|
17 |
+
|
18 |
+
if (!move.ignoreImmunity || (move.ignoreImmunity !== true && !move.ignoreImmunity[move.type])) {
|
19 |
+
if (!target.runImmunity(move.type, !suppressMessages)) {
|
20 |
+
return false;
|
21 |
+
}
|
22 |
+
}
|
23 |
+
|
24 |
+
if (move.ohko) return target.maxhp;
|
25 |
+
if (move.damageCallback) return move.damageCallback.call(this.battle, source, target);
|
26 |
+
if (move.damage === 'level') {
|
27 |
+
return source.level;
|
28 |
+
} else if (move.damage) {
|
29 |
+
return move.damage;
|
30 |
+
}
|
31 |
+
|
32 |
+
let basePower: number | false | null = move.basePower;
|
33 |
+
if (move.basePowerCallback) {
|
34 |
+
basePower = move.basePowerCallback.call(this.battle, source, target, move);
|
35 |
+
}
|
36 |
+
if (!basePower) return basePower === 0 ? undefined : basePower;
|
37 |
+
basePower = this.battle.clampIntRange(basePower, 1);
|
38 |
+
|
39 |
+
let critMult;
|
40 |
+
let critRatio = this.battle.runEvent('ModifyCritRatio', source, target, move, move.critRatio || 0);
|
41 |
+
if (this.battle.gen <= 5) {
|
42 |
+
critRatio = this.battle.clampIntRange(critRatio, 0, 5);
|
43 |
+
critMult = [0, 16, 8, 4, 3, 2];
|
44 |
+
} else {
|
45 |
+
critRatio = this.battle.clampIntRange(critRatio, 0, 4);
|
46 |
+
if (this.battle.gen === 6) {
|
47 |
+
critMult = [0, 16, 8, 2, 1];
|
48 |
+
} else {
|
49 |
+
critMult = [0, 24, 8, 2, 1];
|
50 |
+
}
|
51 |
+
}
|
52 |
+
|
53 |
+
const moveHit = target.getMoveHitData(move);
|
54 |
+
moveHit.crit = move.willCrit || false;
|
55 |
+
if (move.willCrit === undefined) {
|
56 |
+
if (critRatio) {
|
57 |
+
moveHit.crit = this.battle.randomChance(1, critMult[critRatio]);
|
58 |
+
}
|
59 |
+
}
|
60 |
+
|
61 |
+
if (moveHit.crit) {
|
62 |
+
moveHit.crit = this.battle.runEvent('CriticalHit', target, null, move);
|
63 |
+
}
|
64 |
+
|
65 |
+
// happens after crit calculation
|
66 |
+
basePower = this.battle.runEvent('BasePower', source, target, move, basePower, true);
|
67 |
+
|
68 |
+
if (!basePower) return 0;
|
69 |
+
basePower = this.battle.clampIntRange(basePower, 1);
|
70 |
+
// Hacked Max Moves have 0 base power, even if you Dynamax
|
71 |
+
if ((!source.volatiles['dynamax'] && move.isMax) || (move.isMax && this.dex.moves.get(move.baseMove).isMax)) {
|
72 |
+
basePower = 0;
|
73 |
+
}
|
74 |
+
|
75 |
+
const level = source.level;
|
76 |
+
|
77 |
+
const attacker = move.overrideOffensivePokemon === 'target' ? target : source;
|
78 |
+
const defender = move.overrideDefensivePokemon === 'source' ? source : target;
|
79 |
+
|
80 |
+
const isPhysical = move.category === 'Physical';
|
81 |
+
const defenseStat: StatIDExceptHP = move.overrideDefensiveStat || (isPhysical ? 'def' : 'spd');
|
82 |
+
|
83 |
+
const statTable: { [k in StatIDExceptHP]: string } = { atk: 'Atk', def: 'Def', spa: 'SpA', spd: 'SpD', spe: 'Spe' };
|
84 |
+
|
85 |
+
let maxAttack = 0;
|
86 |
+
|
87 |
+
let defBoosts = defender.boosts[defenseStat];
|
88 |
+
|
89 |
+
let ignoreNegativeOffensive = !!move.ignoreNegativeOffensive;
|
90 |
+
let ignorePositiveDefensive = !!move.ignorePositiveDefensive;
|
91 |
+
|
92 |
+
if (moveHit.crit) {
|
93 |
+
ignoreNegativeOffensive = true;
|
94 |
+
ignorePositiveDefensive = true;
|
95 |
+
}
|
96 |
+
|
97 |
+
const ignoreDefensive = !!(move.ignoreDefensive || (ignorePositiveDefensive && defBoosts > 0));
|
98 |
+
if (ignoreDefensive) {
|
99 |
+
this.battle.debug('Negating (sp)def boost/penalty.');
|
100 |
+
defBoosts = 0;
|
101 |
+
}
|
102 |
+
|
103 |
+
let attack = 0;
|
104 |
+
|
105 |
+
for (const attackStat in statTable) {
|
106 |
+
let atkBoosts = attacker.boosts[attackStat as keyof BoostsTable];
|
107 |
+
const ignoreOffensive = !!(move.ignoreOffensive || (ignoreNegativeOffensive && atkBoosts < 0));
|
108 |
+
if (ignoreOffensive) {
|
109 |
+
this.battle.debug('Negating (sp)atk boost/penalty.');
|
110 |
+
atkBoosts = 0;
|
111 |
+
}
|
112 |
+
attack = attacker.calculateStat(attackStat as any, atkBoosts, 1, source);
|
113 |
+
attack = this.battle.runEvent('Modify' + (statTable as any)[attackStat], source, target, move, attack);
|
114 |
+
if (attack > maxAttack) maxAttack = attack;
|
115 |
+
}
|
116 |
+
|
117 |
+
let defense = defender.calculateStat(defenseStat, defBoosts, 1, target);
|
118 |
+
|
119 |
+
// Apply Stat Modifiers
|
120 |
+
defense = this.battle.runEvent('Modify' + statTable[defenseStat], target, source, move, defense);
|
121 |
+
|
122 |
+
if (this.battle.gen <= 4 && ['explosion', 'selfdestruct'].includes(move.id) && defenseStat === 'def') {
|
123 |
+
defense = this.battle.clampIntRange(Math.floor(defense / 2), 1);
|
124 |
+
}
|
125 |
+
|
126 |
+
const tr = this.battle.trunc;
|
127 |
+
|
128 |
+
// int(int(int(2 * L / 5 + 2) * A * P / D) / 50);
|
129 |
+
const baseDamage = tr(tr(tr(tr(2 * level / 5 + 2) * basePower * maxAttack) / defense) / 50);
|
130 |
+
|
131 |
+
// Calculate damage modifiers separately (order differs between generations)
|
132 |
+
return this.modifyDamage(baseDamage, source, target, move, suppressMessages);
|
133 |
+
},
|
134 |
+
},
|
135 |
+
};
|
data/mods/gen1/README.md
ADDED
@@ -0,0 +1,58 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
Gen 1, the beginning
|
2 |
+
====================
|
3 |
+
|
4 |
+
Introduction
|
5 |
+
------------
|
6 |
+
Generation 1 includes the original japanese Green and Red, Blue, and Yellow games.
|
7 |
+
It was very different than the game we get to know today, and it was, in fact, very different to Gen 2 as well.
|
8 |
+
The mechanics were very different, and the game was quite glitched, but most glitches were important parts of the metagame.
|
9 |
+
There were only 151 Pokémon plus MissingNo, just a handful of moves, no abilities, no items, all stats were
|
10 |
+
EVd to the max and we had some kind of different IVs, which maxed at 15 and every point gave 2 to the stat, so in
|
11 |
+
a similar fashion, Pokes used to have 30 IVs on each stat.
|
12 |
+
|
13 |
+
The following sources have been used and extremly useful when developing this mod:
|
14 |
+
https://raw.github.com/po-devs/pokemon-online/master/bin/database/rby-stuff.txt
|
15 |
+
https://www.smogon.com/rb/articles/differences
|
16 |
+
https://www.smogon.com/forums/threads/past-gens-research-thread.3506992/#post-5878612
|
17 |
+
|
18 |
+
Special Stat
|
19 |
+
------------
|
20 |
+
Back then, there weren't Special Defense and Special Attack stats. It was just "Special", and moves raised and lowered it.
|
21 |
+
That's why Special walls were so OP in Gen 1.
|
22 |
+
|
23 |
+
In order to achieve a similar effect without heavily changing other scripts rather than just the mod, the mod's Pokedex
|
24 |
+
and the mod's moves have been edited in order to emulate it, making all Pokémon have the old special stat in both SpA and
|
25 |
+
SpD and making moves raise and lower both SpA and SpD at the same time.
|
26 |
+
|
27 |
+
Critical Hits
|
28 |
+
-------------
|
29 |
+
Critical hits in Gen 1 work with Speed. The faster you are, the more you crit.
|
30 |
+
This is the regular critical hit formula:
|
31 |
+
CH% = BaseSpeed * 100 / 512.
|
32 |
+
This is the high critical hit moves formula:
|
33 |
+
CH% = BaseSpeed * 100 / 64.
|
34 |
+
That means that a Persian with Slash is going to crit. This made the metagame adapt so OU prefers all the faster Pokémon
|
35 |
+
in the game.
|
36 |
+
|
37 |
+
However, if you used Focus Energy, your crit rate was ruined instead of increased, so if you were slower than your
|
38 |
+
opponent you couldn't crit at all.
|
39 |
+
|
40 |
+
Status
|
41 |
+
------
|
42 |
+
Freeze never thaws unless hit by a Fire-type attack or by Haze.
|
43 |
+
Sleep lasts 1-7 turns and you wake up at the end of the turn.
|
44 |
+
|
45 |
+
1/256 miss
|
46 |
+
----------
|
47 |
+
All moves but Swift and Bide (while on duration, not first hit) have a 1/256 chance to miss.
|
48 |
+
|
49 |
+
Partial Trapping Moves
|
50 |
+
----------------------
|
51 |
+
Partial trapping moves let either Pokémon switch but target will be unable to move for its duration.
|
52 |
+
|
53 |
+
TODO. Glitches not implemented
|
54 |
+
------------------------------
|
55 |
+
There are a couple of divisions by zero in the original game in the cartridge. Those have not been implemented.
|
56 |
+
|
57 |
+
If a Pokemon has its sleep or freeze status healed by Haze, it will not be able to move on that turn (skip turn glitch).
|
58 |
+
This also applies to a frozen Pokemon that has just been thawed by a fire type move.
|
data/mods/gen1/conditions.ts
ADDED
@@ -0,0 +1,263 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/**
|
2 |
+
* Status worked very differently in Gen 1.
|
3 |
+
* - Sleep lasted longer, had no reset on switch and took a whole turn to wake up.
|
4 |
+
* - Frozen only thaws when hit by fire or Haze.
|
5 |
+
*
|
6 |
+
* Stat boosts (-speed, -atk) also worked differently, so they are
|
7 |
+
* separated as volatile statuses that are applied on switch in, removed
|
8 |
+
* under certain conditions and re-applied under other conditions.
|
9 |
+
*/
|
10 |
+
|
11 |
+
export const Conditions: import('../../../sim/dex-conditions').ModdedConditionDataTable = {
|
12 |
+
brn: {
|
13 |
+
name: 'brn',
|
14 |
+
effectType: 'Status',
|
15 |
+
onStart(target) {
|
16 |
+
this.add('-status', target, 'brn');
|
17 |
+
},
|
18 |
+
onAfterMoveSelfPriority: 2,
|
19 |
+
onAfterMoveSelf(pokemon) {
|
20 |
+
const toxicCounter = pokemon.volatiles['residualdmg'] ? pokemon.volatiles['residualdmg'].counter : 1;
|
21 |
+
this.damage(this.clampIntRange(Math.floor(pokemon.maxhp / 16), 1) * toxicCounter, pokemon);
|
22 |
+
if (pokemon.volatiles['residualdmg']) {
|
23 |
+
this.hint("In Gen 1, Toxic's counter is retained after Rest and applies to PSN/BRN.", true);
|
24 |
+
}
|
25 |
+
},
|
26 |
+
onAfterSwitchInSelf(pokemon) {
|
27 |
+
this.damage(this.clampIntRange(Math.floor(pokemon.maxhp / 16), 1));
|
28 |
+
},
|
29 |
+
},
|
30 |
+
par: {
|
31 |
+
name: 'par',
|
32 |
+
effectType: 'Status',
|
33 |
+
onStart(target) {
|
34 |
+
this.add('-status', target, 'par');
|
35 |
+
},
|
36 |
+
onBeforeMovePriority: 2,
|
37 |
+
onBeforeMove(pokemon) {
|
38 |
+
if (this.randomChance(63, 256)) {
|
39 |
+
this.add('cant', pokemon, 'par');
|
40 |
+
pokemon.removeVolatile('bide');
|
41 |
+
if (pokemon.removeVolatile('twoturnmove')) {
|
42 |
+
if (pokemon.volatiles['invulnerability']) {
|
43 |
+
this.hint(`In Gen 1, when a Dig/Fly user is fully paralyzed while semi-invulnerable, ` +
|
44 |
+
`it will remain semi-invulnerable until it switches out or fully executes Dig/Fly`, true);
|
45 |
+
}
|
46 |
+
}
|
47 |
+
pokemon.removeVolatile('partialtrappinglock');
|
48 |
+
pokemon.removeVolatile('lockedmove');
|
49 |
+
return false;
|
50 |
+
}
|
51 |
+
},
|
52 |
+
},
|
53 |
+
slp: {
|
54 |
+
name: 'slp',
|
55 |
+
effectType: 'Status',
|
56 |
+
onStart(target, source, sourceEffect) {
|
57 |
+
if (sourceEffect && sourceEffect.effectType === 'Move') {
|
58 |
+
this.add('-status', target, 'slp', `[from] move: ${sourceEffect.name}`);
|
59 |
+
} else {
|
60 |
+
this.add('-status', target, 'slp');
|
61 |
+
}
|
62 |
+
// 1-7 turns
|
63 |
+
this.effectState.startTime = this.random(1, 8);
|
64 |
+
this.effectState.time = this.effectState.startTime;
|
65 |
+
|
66 |
+
if (target.removeVolatile('nightmare')) {
|
67 |
+
this.add('-end', target, 'Nightmare', '[silent]');
|
68 |
+
}
|
69 |
+
},
|
70 |
+
onBeforeMovePriority: 10,
|
71 |
+
onBeforeMove(pokemon, target, move) {
|
72 |
+
pokemon.statusState.time--;
|
73 |
+
if (pokemon.statusState.time > 0) {
|
74 |
+
this.add('cant', pokemon, 'slp');
|
75 |
+
}
|
76 |
+
pokemon.lastMove = null;
|
77 |
+
return false;
|
78 |
+
},
|
79 |
+
onAfterMoveSelfPriority: 3,
|
80 |
+
onAfterMoveSelf(pokemon) {
|
81 |
+
if (pokemon.statusState.time <= 0) pokemon.cureStatus();
|
82 |
+
},
|
83 |
+
},
|
84 |
+
frz: {
|
85 |
+
name: 'frz',
|
86 |
+
effectType: 'Status',
|
87 |
+
onStart(target) {
|
88 |
+
this.add('-status', target, 'frz');
|
89 |
+
},
|
90 |
+
onBeforeMovePriority: 12,
|
91 |
+
onBeforeMove(pokemon, target, move) {
|
92 |
+
this.add('cant', pokemon, 'frz');
|
93 |
+
pokemon.lastMove = null;
|
94 |
+
return false;
|
95 |
+
},
|
96 |
+
onAfterMoveSecondary(target, source, move) {
|
97 |
+
if (move.secondary && move.secondary.status === 'brn') {
|
98 |
+
target.cureStatus();
|
99 |
+
}
|
100 |
+
},
|
101 |
+
},
|
102 |
+
psn: {
|
103 |
+
name: 'psn',
|
104 |
+
effectType: 'Status',
|
105 |
+
onStart(target) {
|
106 |
+
this.add('-status', target, 'psn');
|
107 |
+
},
|
108 |
+
onAfterMoveSelfPriority: 2,
|
109 |
+
onAfterMoveSelf(pokemon) {
|
110 |
+
const toxicCounter = pokemon.volatiles['residualdmg'] ? pokemon.volatiles['residualdmg'].counter : 1;
|
111 |
+
this.damage(this.clampIntRange(Math.floor(pokemon.maxhp / 16), 1) * toxicCounter, pokemon);
|
112 |
+
if (pokemon.volatiles['residualdmg']) {
|
113 |
+
this.hint("In Gen 1, Toxic's counter is retained after Rest and applies to PSN/BRN.", true);
|
114 |
+
}
|
115 |
+
},
|
116 |
+
onAfterSwitchInSelf(pokemon) {
|
117 |
+
this.damage(this.clampIntRange(Math.floor(pokemon.maxhp / 16), 1));
|
118 |
+
},
|
119 |
+
},
|
120 |
+
tox: {
|
121 |
+
inherit: true,
|
122 |
+
onAfterMoveSelfPriority: 2,
|
123 |
+
},
|
124 |
+
confusion: {
|
125 |
+
name: 'confusion',
|
126 |
+
// this is a volatile status
|
127 |
+
onStart(target, source, sourceEffect) {
|
128 |
+
if (sourceEffect && sourceEffect.id === 'lockedmove') {
|
129 |
+
this.add('-start', target, 'confusion', '[silent]');
|
130 |
+
} else {
|
131 |
+
this.add('-start', target, 'confusion');
|
132 |
+
}
|
133 |
+
this.effectState.time = this.random(2, 6);
|
134 |
+
},
|
135 |
+
onEnd(target) {
|
136 |
+
this.add('-end', target, 'confusion');
|
137 |
+
},
|
138 |
+
onBeforeMovePriority: 3,
|
139 |
+
onBeforeMove(pokemon, target) {
|
140 |
+
pokemon.volatiles['confusion'].time--;
|
141 |
+
if (!pokemon.volatiles['confusion'].time) {
|
142 |
+
pokemon.removeVolatile('confusion');
|
143 |
+
return;
|
144 |
+
}
|
145 |
+
this.add('-activate', pokemon, 'confusion');
|
146 |
+
if (!this.randomChance(128, 256)) {
|
147 |
+
const damage = Math.floor(Math.floor((
|
148 |
+
(Math.floor(2 * pokemon.level / 5) + 2) * pokemon.getStat('atk') * 40
|
149 |
+
) / pokemon.getStat('def', false)) / 50) + 2;
|
150 |
+
this.directDamage(damage, pokemon, target);
|
151 |
+
pokemon.removeVolatile('bide');
|
152 |
+
pokemon.removeVolatile('twoturnmove');
|
153 |
+
pokemon.removeVolatile('invulnerability');
|
154 |
+
pokemon.removeVolatile('partialtrappinglock');
|
155 |
+
pokemon.removeVolatile('lockedmove');
|
156 |
+
return false;
|
157 |
+
}
|
158 |
+
},
|
159 |
+
},
|
160 |
+
flinch: {
|
161 |
+
name: 'flinch',
|
162 |
+
duration: 1,
|
163 |
+
onStart(target) {
|
164 |
+
target.removeVolatile('mustrecharge');
|
165 |
+
},
|
166 |
+
onBeforeMovePriority: 8,
|
167 |
+
onBeforeMove(pokemon) {
|
168 |
+
if (!this.runEvent('Flinch', pokemon)) {
|
169 |
+
return;
|
170 |
+
}
|
171 |
+
this.add('cant', pokemon, 'flinch');
|
172 |
+
return false;
|
173 |
+
},
|
174 |
+
},
|
175 |
+
trapped: {
|
176 |
+
name: 'trapped',
|
177 |
+
noCopy: true,
|
178 |
+
onTrapPokemon(pokemon) {
|
179 |
+
if (!this.effectState.source?.isActive) {
|
180 |
+
delete pokemon.volatiles['trapped'];
|
181 |
+
return;
|
182 |
+
}
|
183 |
+
pokemon.trapped = true;
|
184 |
+
},
|
185 |
+
},
|
186 |
+
partiallytrapped: {
|
187 |
+
name: 'partiallytrapped',
|
188 |
+
duration: 2,
|
189 |
+
onBeforeMovePriority: 9,
|
190 |
+
onBeforeMove(pokemon) {
|
191 |
+
this.add('cant', pokemon, 'partiallytrapped');
|
192 |
+
return false;
|
193 |
+
},
|
194 |
+
},
|
195 |
+
partialtrappinglock: {
|
196 |
+
name: 'partialtrappinglock',
|
197 |
+
durationCallback() {
|
198 |
+
const duration = this.sample([2, 2, 2, 3, 3, 3, 4, 5]);
|
199 |
+
return duration;
|
200 |
+
},
|
201 |
+
onStart(target, source, effect) {
|
202 |
+
this.effectState.move = effect.id;
|
203 |
+
},
|
204 |
+
onDisableMove(pokemon) {
|
205 |
+
if (!pokemon.hasMove(this.effectState.move)) {
|
206 |
+
return;
|
207 |
+
}
|
208 |
+
for (const moveSlot of pokemon.moveSlots) {
|
209 |
+
if (moveSlot.id !== this.effectState.move) {
|
210 |
+
pokemon.disableMove(moveSlot.id);
|
211 |
+
}
|
212 |
+
}
|
213 |
+
},
|
214 |
+
},
|
215 |
+
mustrecharge: {
|
216 |
+
inherit: true,
|
217 |
+
duration: 0,
|
218 |
+
onBeforeMovePriority: 7,
|
219 |
+
onStart() {},
|
220 |
+
},
|
221 |
+
lockedmove: {
|
222 |
+
// Thrash and Petal Dance.
|
223 |
+
name: 'lockedmove',
|
224 |
+
onStart(target, source, effect) {
|
225 |
+
this.effectState.move = effect.id;
|
226 |
+
this.effectState.time = this.random(2, 4);
|
227 |
+
this.effectState.accuracy = 255;
|
228 |
+
},
|
229 |
+
onLockMove() {
|
230 |
+
return this.effectState.move;
|
231 |
+
},
|
232 |
+
onBeforeTurn(pokemon) {
|
233 |
+
const move = this.dex.moves.get(this.effectState.move);
|
234 |
+
if (move.id) {
|
235 |
+
this.debug('Forcing into ' + move.id);
|
236 |
+
this.queue.changeAction(pokemon, { choice: 'move', moveid: move.id });
|
237 |
+
}
|
238 |
+
},
|
239 |
+
},
|
240 |
+
twoturnmove: {
|
241 |
+
// Skull Bash, Solar Beam, ...
|
242 |
+
name: 'twoturnmove',
|
243 |
+
onStart(attacker, defender, effect) {
|
244 |
+
// ("attacker" is the Pokemon using the two turn move and the Pokemon this condition is being applied to)
|
245 |
+
this.effectState.move = effect.id;
|
246 |
+
this.effectState.sourceEffect = effect.sourceEffect;
|
247 |
+
this.attrLastMove('[still]');
|
248 |
+
},
|
249 |
+
onLockMove() {
|
250 |
+
return this.effectState.move;
|
251 |
+
},
|
252 |
+
},
|
253 |
+
invulnerability: {
|
254 |
+
// Dig/Fly
|
255 |
+
name: 'invulnerability',
|
256 |
+
onInvulnerability(target, source, move) {
|
257 |
+
if (target === source) return true;
|
258 |
+
if (move.id === 'swift' || move.id === 'transform') return true;
|
259 |
+
this.add('-message', 'The foe ' + target.name + ' can\'t be hit while invulnerable!');
|
260 |
+
return false;
|
261 |
+
},
|
262 |
+
},
|
263 |
+
};
|
data/mods/gen1/formats-data.ts
ADDED
@@ -0,0 +1,459 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormatsDataTable = {
|
2 |
+
bulbasaur: {
|
3 |
+
tier: "LC",
|
4 |
+
},
|
5 |
+
ivysaur: {
|
6 |
+
tier: "NFE",
|
7 |
+
},
|
8 |
+
venusaur: {
|
9 |
+
tier: "PU",
|
10 |
+
},
|
11 |
+
charmander: {
|
12 |
+
tier: "LC",
|
13 |
+
},
|
14 |
+
charmeleon: {
|
15 |
+
tier: "NFE",
|
16 |
+
},
|
17 |
+
charizard: {
|
18 |
+
tier: "NU",
|
19 |
+
},
|
20 |
+
squirtle: {
|
21 |
+
tier: "LC",
|
22 |
+
},
|
23 |
+
wartortle: {
|
24 |
+
tier: "ZU",
|
25 |
+
},
|
26 |
+
blastoise: {
|
27 |
+
tier: "NU",
|
28 |
+
},
|
29 |
+
caterpie: {
|
30 |
+
tier: "LC",
|
31 |
+
},
|
32 |
+
metapod: {
|
33 |
+
tier: "NFE",
|
34 |
+
},
|
35 |
+
butterfree: {
|
36 |
+
tier: "ZU",
|
37 |
+
},
|
38 |
+
weedle: {
|
39 |
+
tier: "LC",
|
40 |
+
},
|
41 |
+
kakuna: {
|
42 |
+
tier: "NFE",
|
43 |
+
},
|
44 |
+
beedrill: {
|
45 |
+
tier: "ZU",
|
46 |
+
},
|
47 |
+
pidgey: {
|
48 |
+
tier: "LC",
|
49 |
+
},
|
50 |
+
pidgeotto: {
|
51 |
+
tier: "NFE",
|
52 |
+
},
|
53 |
+
pidgeot: {
|
54 |
+
tier: "ZU",
|
55 |
+
},
|
56 |
+
rattata: {
|
57 |
+
tier: "LC",
|
58 |
+
},
|
59 |
+
raticate: {
|
60 |
+
tier: "NU",
|
61 |
+
},
|
62 |
+
spearow: {
|
63 |
+
tier: "LC",
|
64 |
+
},
|
65 |
+
fearow: {
|
66 |
+
tier: "NU",
|
67 |
+
},
|
68 |
+
ekans: {
|
69 |
+
tier: "LC",
|
70 |
+
},
|
71 |
+
arbok: {
|
72 |
+
tier: "ZU",
|
73 |
+
},
|
74 |
+
pikachu: {
|
75 |
+
tier: "LC",
|
76 |
+
},
|
77 |
+
raichu: {
|
78 |
+
tier: "UU",
|
79 |
+
},
|
80 |
+
sandshrew: {
|
81 |
+
tier: "LC",
|
82 |
+
},
|
83 |
+
sandslash: {
|
84 |
+
tier: "ZU",
|
85 |
+
},
|
86 |
+
nidoranf: {
|
87 |
+
tier: "LC",
|
88 |
+
},
|
89 |
+
nidorina: {
|
90 |
+
tier: "NFE",
|
91 |
+
},
|
92 |
+
nidoqueen: {
|
93 |
+
tier: "PU",
|
94 |
+
},
|
95 |
+
nidoranm: {
|
96 |
+
tier: "LC",
|
97 |
+
},
|
98 |
+
nidorino: {
|
99 |
+
tier: "NFE",
|
100 |
+
},
|
101 |
+
nidoking: {
|
102 |
+
tier: "PU",
|
103 |
+
},
|
104 |
+
clefairy: {
|
105 |
+
tier: "LC",
|
106 |
+
},
|
107 |
+
clefable: {
|
108 |
+
tier: "UU",
|
109 |
+
},
|
110 |
+
vulpix: {
|
111 |
+
tier: "LC",
|
112 |
+
},
|
113 |
+
ninetales: {
|
114 |
+
tier: "UU",
|
115 |
+
},
|
116 |
+
jigglypuff: {
|
117 |
+
tier: "LC",
|
118 |
+
},
|
119 |
+
wigglytuff: {
|
120 |
+
tier: "PU",
|
121 |
+
},
|
122 |
+
zubat: {
|
123 |
+
tier: "LC",
|
124 |
+
},
|
125 |
+
golbat: {
|
126 |
+
tier: "ZU",
|
127 |
+
},
|
128 |
+
oddish: {
|
129 |
+
tier: "LC",
|
130 |
+
},
|
131 |
+
gloom: {
|
132 |
+
tier: "NFE",
|
133 |
+
},
|
134 |
+
vileplume: {
|
135 |
+
tier: "PU",
|
136 |
+
},
|
137 |
+
paras: {
|
138 |
+
tier: "LC",
|
139 |
+
},
|
140 |
+
parasect: {
|
141 |
+
tier: "ZU",
|
142 |
+
},
|
143 |
+
venonat: {
|
144 |
+
tier: "LC",
|
145 |
+
},
|
146 |
+
venomoth: {
|
147 |
+
tier: "NU",
|
148 |
+
},
|
149 |
+
diglett: {
|
150 |
+
tier: "LC",
|
151 |
+
},
|
152 |
+
dugtrio: {
|
153 |
+
tier: "UU",
|
154 |
+
},
|
155 |
+
meowth: {
|
156 |
+
tier: "LC",
|
157 |
+
},
|
158 |
+
persian: {
|
159 |
+
tier: "UU",
|
160 |
+
},
|
161 |
+
psyduck: {
|
162 |
+
tier: "LC",
|
163 |
+
},
|
164 |
+
golduck: {
|
165 |
+
tier: "PU",
|
166 |
+
},
|
167 |
+
mankey: {
|
168 |
+
tier: "LC",
|
169 |
+
},
|
170 |
+
primeape: {
|
171 |
+
tier: "ZU",
|
172 |
+
},
|
173 |
+
growlithe: {
|
174 |
+
tier: "LC",
|
175 |
+
},
|
176 |
+
arcanine: {
|
177 |
+
tier: "NU",
|
178 |
+
},
|
179 |
+
poliwag: {
|
180 |
+
tier: "ZU",
|
181 |
+
},
|
182 |
+
poliwhirl: {
|
183 |
+
tier: "NU",
|
184 |
+
},
|
185 |
+
poliwrath: {
|
186 |
+
tier: "NU",
|
187 |
+
},
|
188 |
+
abra: {
|
189 |
+
tier: "PU",
|
190 |
+
},
|
191 |
+
kadabra: {
|
192 |
+
tier: "UU",
|
193 |
+
},
|
194 |
+
alakazam: {
|
195 |
+
tier: "OU",
|
196 |
+
},
|
197 |
+
machop: {
|
198 |
+
tier: "LC",
|
199 |
+
},
|
200 |
+
machoke: {
|
201 |
+
tier: "NFE",
|
202 |
+
},
|
203 |
+
machamp: {
|
204 |
+
tier: "PU",
|
205 |
+
},
|
206 |
+
bellsprout: {
|
207 |
+
tier: "LC",
|
208 |
+
},
|
209 |
+
weepinbell: {
|
210 |
+
tier: "NFE",
|
211 |
+
},
|
212 |
+
victreebel: {
|
213 |
+
tier: "OU",
|
214 |
+
},
|
215 |
+
tentacool: {
|
216 |
+
tier: "ZU",
|
217 |
+
},
|
218 |
+
tentacruel: {
|
219 |
+
tier: "UU",
|
220 |
+
},
|
221 |
+
geodude: {
|
222 |
+
tier: "LC",
|
223 |
+
},
|
224 |
+
graveler: {
|
225 |
+
tier: "PU",
|
226 |
+
},
|
227 |
+
golem: {
|
228 |
+
tier: "UU",
|
229 |
+
},
|
230 |
+
ponyta: {
|
231 |
+
tier: "ZU",
|
232 |
+
},
|
233 |
+
rapidash: {
|
234 |
+
tier: "PU",
|
235 |
+
},
|
236 |
+
slowpoke: {
|
237 |
+
tier: "ZU",
|
238 |
+
},
|
239 |
+
slowbro: {
|
240 |
+
tier: "OU",
|
241 |
+
},
|
242 |
+
magnemite: {
|
243 |
+
tier: "LC",
|
244 |
+
},
|
245 |
+
magneton: {
|
246 |
+
tier: "NU",
|
247 |
+
},
|
248 |
+
farfetchd: {
|
249 |
+
tier: "ZU",
|
250 |
+
},
|
251 |
+
doduo: {
|
252 |
+
tier: "LC",
|
253 |
+
},
|
254 |
+
dodrio: {
|
255 |
+
tier: "UU",
|
256 |
+
},
|
257 |
+
seel: {
|
258 |
+
tier: "LC",
|
259 |
+
},
|
260 |
+
dewgong: {
|
261 |
+
tier: "UU",
|
262 |
+
},
|
263 |
+
grimer: {
|
264 |
+
tier: "LC",
|
265 |
+
},
|
266 |
+
muk: {
|
267 |
+
tier: "ZU",
|
268 |
+
},
|
269 |
+
shellder: {
|
270 |
+
tier: "LC",
|
271 |
+
},
|
272 |
+
cloyster: {
|
273 |
+
tier: "OU",
|
274 |
+
},
|
275 |
+
gastly: {
|
276 |
+
tier: "PU",
|
277 |
+
},
|
278 |
+
haunter: {
|
279 |
+
tier: "UU",
|
280 |
+
},
|
281 |
+
gengar: {
|
282 |
+
tier: "OU",
|
283 |
+
},
|
284 |
+
onix: {
|
285 |
+
tier: "ZU",
|
286 |
+
},
|
287 |
+
drowzee: {
|
288 |
+
tier: "ZU",
|
289 |
+
},
|
290 |
+
hypno: {
|
291 |
+
tier: "UUBL",
|
292 |
+
},
|
293 |
+
krabby: {
|
294 |
+
tier: "LC",
|
295 |
+
},
|
296 |
+
kingler: {
|
297 |
+
tier: "PU",
|
298 |
+
},
|
299 |
+
voltorb: {
|
300 |
+
tier: "LC",
|
301 |
+
},
|
302 |
+
electrode: {
|
303 |
+
tier: "UU",
|
304 |
+
},
|
305 |
+
exeggcute: {
|
306 |
+
tier: "PU",
|
307 |
+
},
|
308 |
+
exeggutor: {
|
309 |
+
tier: "OU",
|
310 |
+
},
|
311 |
+
cubone: {
|
312 |
+
tier: "LC",
|
313 |
+
},
|
314 |
+
marowak: {
|
315 |
+
tier: "ZU",
|
316 |
+
},
|
317 |
+
hitmonlee: {
|
318 |
+
tier: "ZU",
|
319 |
+
},
|
320 |
+
hitmonchan: {
|
321 |
+
tier: "ZU",
|
322 |
+
},
|
323 |
+
lickitung: {
|
324 |
+
tier: "ZU",
|
325 |
+
},
|
326 |
+
koffing: {
|
327 |
+
tier: "LC",
|
328 |
+
},
|
329 |
+
weezing: {
|
330 |
+
tier: "ZU",
|
331 |
+
},
|
332 |
+
rhyhorn: {
|
333 |
+
tier: "LC",
|
334 |
+
},
|
335 |
+
rhydon: {
|
336 |
+
tier: "OU",
|
337 |
+
},
|
338 |
+
chansey: {
|
339 |
+
tier: "OU",
|
340 |
+
},
|
341 |
+
tangela: {
|
342 |
+
tier: "UU",
|
343 |
+
},
|
344 |
+
kangaskhan: {
|
345 |
+
tier: "UU",
|
346 |
+
},
|
347 |
+
horsea: {
|
348 |
+
tier: "LC",
|
349 |
+
},
|
350 |
+
seadra: {
|
351 |
+
tier: "NU",
|
352 |
+
},
|
353 |
+
goldeen: {
|
354 |
+
tier: "LC",
|
355 |
+
},
|
356 |
+
seaking: {
|
357 |
+
tier: "PU",
|
358 |
+
},
|
359 |
+
staryu: {
|
360 |
+
tier: "PU",
|
361 |
+
},
|
362 |
+
starmie: {
|
363 |
+
tier: "OU",
|
364 |
+
},
|
365 |
+
mrmime: {
|
366 |
+
tier: "NU",
|
367 |
+
},
|
368 |
+
scyther: {
|
369 |
+
tier: "ZU",
|
370 |
+
},
|
371 |
+
jynx: {
|
372 |
+
tier: "OU",
|
373 |
+
},
|
374 |
+
electabuzz: {
|
375 |
+
tier: "UU",
|
376 |
+
},
|
377 |
+
magmar: {
|
378 |
+
tier: "ZU",
|
379 |
+
},
|
380 |
+
pinsir: {
|
381 |
+
tier: "PU",
|
382 |
+
},
|
383 |
+
tauros: {
|
384 |
+
tier: "OU",
|
385 |
+
},
|
386 |
+
magikarp: {
|
387 |
+
tier: "LC",
|
388 |
+
},
|
389 |
+
gyarados: {
|
390 |
+
tier: "UU",
|
391 |
+
},
|
392 |
+
lapras: {
|
393 |
+
tier: "UUBL",
|
394 |
+
},
|
395 |
+
ditto: {
|
396 |
+
tier: "ZU",
|
397 |
+
},
|
398 |
+
eevee: {
|
399 |
+
tier: "LC",
|
400 |
+
},
|
401 |
+
vaporeon: {
|
402 |
+
tier: "UU",
|
403 |
+
},
|
404 |
+
jolteon: {
|
405 |
+
tier: "OU",
|
406 |
+
},
|
407 |
+
flareon: {
|
408 |
+
tier: "ZU",
|
409 |
+
},
|
410 |
+
porygon: {
|
411 |
+
tier: "PU",
|
412 |
+
},
|
413 |
+
omanyte: {
|
414 |
+
tier: "ZU",
|
415 |
+
},
|
416 |
+
omastar: {
|
417 |
+
tier: "UU",
|
418 |
+
},
|
419 |
+
kabuto: {
|
420 |
+
tier: "LC",
|
421 |
+
},
|
422 |
+
kabutops: {
|
423 |
+
tier: "NU",
|
424 |
+
},
|
425 |
+
aerodactyl: {
|
426 |
+
tier: "NU",
|
427 |
+
},
|
428 |
+
snorlax: {
|
429 |
+
tier: "OU",
|
430 |
+
},
|
431 |
+
articuno: {
|
432 |
+
tier: "UUBL",
|
433 |
+
},
|
434 |
+
zapdos: {
|
435 |
+
tier: "OU",
|
436 |
+
},
|
437 |
+
moltres: {
|
438 |
+
tier: "NU",
|
439 |
+
},
|
440 |
+
dratini: {
|
441 |
+
tier: "LC",
|
442 |
+
},
|
443 |
+
dragonair: {
|
444 |
+
tier: "ZU",
|
445 |
+
},
|
446 |
+
dragonite: {
|
447 |
+
tier: "UU",
|
448 |
+
},
|
449 |
+
mewtwo: {
|
450 |
+
tier: "Uber",
|
451 |
+
},
|
452 |
+
mew: {
|
453 |
+
tier: "Uber",
|
454 |
+
},
|
455 |
+
missingno: {
|
456 |
+
isNonstandard: "Unobtainable",
|
457 |
+
tier: "Illegal",
|
458 |
+
},
|
459 |
+
};
|
data/mods/gen1/moves.ts
ADDED
@@ -0,0 +1,977 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/**
|
2 |
+
* A lot of Gen 1 moves have to be updated due to different mechanics.
|
3 |
+
* Some moves have had major changes, such as Bite's typing.
|
4 |
+
*/
|
5 |
+
|
6 |
+
export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = {
|
7 |
+
acid: {
|
8 |
+
inherit: true,
|
9 |
+
secondary: {
|
10 |
+
chance: 33,
|
11 |
+
boosts: {
|
12 |
+
def: -1,
|
13 |
+
},
|
14 |
+
},
|
15 |
+
target: "normal",
|
16 |
+
},
|
17 |
+
amnesia: {
|
18 |
+
inherit: true,
|
19 |
+
boosts: {
|
20 |
+
spa: 2,
|
21 |
+
spd: 2,
|
22 |
+
},
|
23 |
+
},
|
24 |
+
aurorabeam: {
|
25 |
+
inherit: true,
|
26 |
+
secondary: {
|
27 |
+
chance: 33,
|
28 |
+
boosts: {
|
29 |
+
atk: -1,
|
30 |
+
},
|
31 |
+
},
|
32 |
+
},
|
33 |
+
bide: {
|
34 |
+
inherit: true,
|
35 |
+
priority: 0,
|
36 |
+
accuracy: true,
|
37 |
+
condition: {
|
38 |
+
onStart(pokemon) {
|
39 |
+
this.effectState.damage = 0;
|
40 |
+
this.effectState.time = this.random(2, 4);
|
41 |
+
this.add('-start', pokemon, 'Bide');
|
42 |
+
},
|
43 |
+
onBeforeMove(pokemon, t, move) {
|
44 |
+
const currentMove = this.dex.getActiveMove('bide');
|
45 |
+
this.effectState.damage += this.lastDamage;
|
46 |
+
this.effectState.time--;
|
47 |
+
if (!this.effectState.time) {
|
48 |
+
this.add('-end', pokemon, currentMove);
|
49 |
+
if (!this.effectState.damage) {
|
50 |
+
this.debug("Bide failed because no damage was stored");
|
51 |
+
this.add('-fail', pokemon);
|
52 |
+
pokemon.removeVolatile('bide');
|
53 |
+
return false;
|
54 |
+
}
|
55 |
+
const target = this.getRandomTarget(pokemon, 'Pound');
|
56 |
+
this.actions.moveHit(target, pokemon, currentMove, { damage: this.effectState.damage * 2 } as ActiveMove);
|
57 |
+
pokemon.removeVolatile('bide');
|
58 |
+
return false;
|
59 |
+
}
|
60 |
+
this.add('-activate', pokemon, 'Bide');
|
61 |
+
return false;
|
62 |
+
},
|
63 |
+
onDisableMove(pokemon) {
|
64 |
+
if (!pokemon.hasMove('bide')) {
|
65 |
+
return;
|
66 |
+
}
|
67 |
+
for (const moveSlot of pokemon.moveSlots) {
|
68 |
+
if (moveSlot.id !== 'bide') {
|
69 |
+
pokemon.disableMove(moveSlot.id);
|
70 |
+
}
|
71 |
+
}
|
72 |
+
},
|
73 |
+
},
|
74 |
+
type: "???", // Will look as Normal but it's STAB-less
|
75 |
+
},
|
76 |
+
bind: {
|
77 |
+
inherit: true,
|
78 |
+
ignoreImmunity: true,
|
79 |
+
volatileStatus: 'partiallytrapped',
|
80 |
+
self: {
|
81 |
+
volatileStatus: 'partialtrappinglock',
|
82 |
+
},
|
83 |
+
onTryMove(source, target) {
|
84 |
+
if (target.volatiles['mustrecharge']) {
|
85 |
+
target.removeVolatile('mustrecharge');
|
86 |
+
this.hint("In Gen 1, partial trapping moves negate the recharge turn of Hyper Beam, even if they miss.", true);
|
87 |
+
}
|
88 |
+
},
|
89 |
+
onHit(target, source) {
|
90 |
+
/**
|
91 |
+
* The duration of the partially trapped must be always renewed to 2
|
92 |
+
* so target doesn't move on trapper switch out as happens in gen 1.
|
93 |
+
* However, this won't happen if there's no switch and the trapper is
|
94 |
+
* about to end its partial trapping.
|
95 |
+
**/
|
96 |
+
if (target.volatiles['partiallytrapped']) {
|
97 |
+
if (source.volatiles['partialtrappinglock'] && source.volatiles['partialtrappinglock'].duration! > 1) {
|
98 |
+
target.volatiles['partiallytrapped'].duration = 2;
|
99 |
+
}
|
100 |
+
}
|
101 |
+
},
|
102 |
+
},
|
103 |
+
bite: {
|
104 |
+
inherit: true,
|
105 |
+
category: "Physical",
|
106 |
+
secondary: {
|
107 |
+
chance: 10,
|
108 |
+
volatileStatus: 'flinch',
|
109 |
+
},
|
110 |
+
type: "Normal",
|
111 |
+
},
|
112 |
+
blizzard: {
|
113 |
+
inherit: true,
|
114 |
+
accuracy: 90,
|
115 |
+
target: "normal",
|
116 |
+
},
|
117 |
+
bubble: {
|
118 |
+
inherit: true,
|
119 |
+
secondary: {
|
120 |
+
chance: 33,
|
121 |
+
boosts: {
|
122 |
+
spe: -1,
|
123 |
+
},
|
124 |
+
},
|
125 |
+
target: "normal",
|
126 |
+
},
|
127 |
+
bubblebeam: {
|
128 |
+
inherit: true,
|
129 |
+
secondary: {
|
130 |
+
chance: 33,
|
131 |
+
boosts: {
|
132 |
+
spe: -1,
|
133 |
+
},
|
134 |
+
},
|
135 |
+
},
|
136 |
+
clamp: {
|
137 |
+
inherit: true,
|
138 |
+
accuracy: 75,
|
139 |
+
pp: 10,
|
140 |
+
volatileStatus: 'partiallytrapped',
|
141 |
+
self: {
|
142 |
+
volatileStatus: 'partialtrappinglock',
|
143 |
+
},
|
144 |
+
onTryMove(source, target) {
|
145 |
+
if (target.volatiles['mustrecharge']) {
|
146 |
+
target.removeVolatile('mustrecharge');
|
147 |
+
this.hint("In Gen 1, partial trapping moves negate the recharge turn of Hyper Beam, even if they miss.", true);
|
148 |
+
}
|
149 |
+
},
|
150 |
+
onHit(target, source) {
|
151 |
+
/**
|
152 |
+
* The duration of the partially trapped must be always renewed to 2
|
153 |
+
* so target doesn't move on trapper switch out as happens in gen 1.
|
154 |
+
* However, this won't happen if there's no switch and the trapper is
|
155 |
+
* about to end its partial trapping.
|
156 |
+
**/
|
157 |
+
if (target.volatiles['partiallytrapped']) {
|
158 |
+
if (source.volatiles['partialtrappinglock'] && source.volatiles['partialtrappinglock'].duration! > 1) {
|
159 |
+
target.volatiles['partiallytrapped'].duration = 2;
|
160 |
+
}
|
161 |
+
}
|
162 |
+
},
|
163 |
+
},
|
164 |
+
constrict: {
|
165 |
+
inherit: true,
|
166 |
+
secondary: {
|
167 |
+
chance: 33,
|
168 |
+
boosts: {
|
169 |
+
spe: -1,
|
170 |
+
},
|
171 |
+
},
|
172 |
+
},
|
173 |
+
conversion: {
|
174 |
+
inherit: true,
|
175 |
+
target: "normal",
|
176 |
+
onHit(target, source) {
|
177 |
+
source.setType(target.getTypes(true));
|
178 |
+
this.add('-start', source, 'typechange', source.types.join('/'), '[from] move: Conversion', `[of] ${target}`);
|
179 |
+
},
|
180 |
+
},
|
181 |
+
counter: {
|
182 |
+
inherit: true,
|
183 |
+
ignoreImmunity: true,
|
184 |
+
willCrit: false,
|
185 |
+
basePower: 1,
|
186 |
+
damageCallback(pokemon, target) {
|
187 |
+
// Counter mechanics in gen 1:
|
188 |
+
// - a move is Counterable if it is Normal or Fighting type, has nonzero Base Power, and is not Counter
|
189 |
+
// - if Counter is used by the player, it will succeed if the opponent's last used move is Counterable
|
190 |
+
// - if Counter is used by the opponent, it will succeed if the player's last selected move is Counterable
|
191 |
+
// - (Counter will thus desync if the target's last used move is not as counterable as the target's last selected move)
|
192 |
+
// - if Counter succeeds it will deal twice the last move damage dealt in battle (even if it's from a different pokemon because of a switch)
|
193 |
+
|
194 |
+
const lastMove = target.side.lastMove && this.dex.moves.get(target.side.lastMove.id);
|
195 |
+
const lastMoveIsCounterable = lastMove && lastMove.basePower > 0 &&
|
196 |
+
['Normal', 'Fighting'].includes(lastMove.type) && lastMove.id !== 'counter';
|
197 |
+
|
198 |
+
const lastSelectedMove = target.side.lastSelectedMove && this.dex.moves.get(target.side.lastSelectedMove);
|
199 |
+
const lastSelectedMoveIsCounterable = lastSelectedMove && lastSelectedMove.basePower > 0 &&
|
200 |
+
['Normal', 'Fighting'].includes(lastSelectedMove.type) && lastSelectedMove.id !== 'counter';
|
201 |
+
|
202 |
+
if (!lastMoveIsCounterable && !lastSelectedMoveIsCounterable) {
|
203 |
+
this.debug("Gen 1 Counter: last move was not Counterable");
|
204 |
+
this.add('-fail', pokemon);
|
205 |
+
return false;
|
206 |
+
}
|
207 |
+
if (this.lastDamage <= 0) {
|
208 |
+
this.debug("Gen 1 Counter: no previous damage exists");
|
209 |
+
this.add('-fail', pokemon);
|
210 |
+
return false;
|
211 |
+
}
|
212 |
+
if (!lastMoveIsCounterable || !lastSelectedMoveIsCounterable) {
|
213 |
+
this.hint("Desync Clause Mod activated!");
|
214 |
+
this.add('-fail', pokemon);
|
215 |
+
return false;
|
216 |
+
}
|
217 |
+
|
218 |
+
return 2 * this.lastDamage;
|
219 |
+
},
|
220 |
+
flags: { contact: 1, protect: 1, metronome: 1 },
|
221 |
+
},
|
222 |
+
crabhammer: {
|
223 |
+
inherit: true,
|
224 |
+
critRatio: 2,
|
225 |
+
},
|
226 |
+
dig: {
|
227 |
+
inherit: true,
|
228 |
+
basePower: 100,
|
229 |
+
condition: {},
|
230 |
+
onTryMove(attacker, defender, move) {
|
231 |
+
if (attacker.removeVolatile('twoturnmove')) {
|
232 |
+
attacker.removeVolatile('invulnerability');
|
233 |
+
return;
|
234 |
+
}
|
235 |
+
this.add('-prepare', attacker, move.name);
|
236 |
+
attacker.addVolatile('twoturnmove', defender);
|
237 |
+
attacker.addVolatile('invulnerability', defender);
|
238 |
+
return null;
|
239 |
+
},
|
240 |
+
},
|
241 |
+
disable: {
|
242 |
+
num: 50,
|
243 |
+
accuracy: 55,
|
244 |
+
basePower: 0,
|
245 |
+
category: "Status",
|
246 |
+
name: "Disable",
|
247 |
+
pp: 20,
|
248 |
+
priority: 0,
|
249 |
+
flags: { protect: 1, mirror: 1, bypasssub: 1, metronome: 1 },
|
250 |
+
volatileStatus: 'disable',
|
251 |
+
onTryHit(target) {
|
252 |
+
// This function should not return if the checks are met. Adding && undefined ensures this happens.
|
253 |
+
return target.moveSlots.some(ms => ms.pp > 0) &&
|
254 |
+
!('disable' in target.volatiles) &&
|
255 |
+
undefined;
|
256 |
+
},
|
257 |
+
condition: {
|
258 |
+
onStart(pokemon) {
|
259 |
+
// disable can only select moves that have pp > 0, hence the onTryHit modification
|
260 |
+
const moveSlot = this.sample(pokemon.moveSlots.filter(ms => ms.pp > 0));
|
261 |
+
this.add('-start', pokemon, 'Disable', moveSlot.move);
|
262 |
+
this.effectState.move = moveSlot.id;
|
263 |
+
// 1-8 turns (which will in effect translate to 0-7 missed turns for the target)
|
264 |
+
this.effectState.time = this.random(1, 9);
|
265 |
+
},
|
266 |
+
onEnd(pokemon) {
|
267 |
+
this.add('-end', pokemon, 'Disable');
|
268 |
+
},
|
269 |
+
onBeforeMovePriority: 6,
|
270 |
+
onBeforeMove(pokemon, target, move) {
|
271 |
+
pokemon.volatiles['disable'].time--;
|
272 |
+
if (!pokemon.volatiles['disable'].time) {
|
273 |
+
pokemon.removeVolatile('disable');
|
274 |
+
return;
|
275 |
+
}
|
276 |
+
if (pokemon.volatiles['bide']) move = this.dex.getActiveMove('bide');
|
277 |
+
if (move.id === this.effectState.move) {
|
278 |
+
this.add('cant', pokemon, 'Disable', move);
|
279 |
+
pokemon.removeVolatile('twoturnmove');
|
280 |
+
return false;
|
281 |
+
}
|
282 |
+
},
|
283 |
+
onDisableMove(pokemon) {
|
284 |
+
for (const moveSlot of pokemon.moveSlots) {
|
285 |
+
if (moveSlot.id === this.effectState.move) {
|
286 |
+
pokemon.disableMove(moveSlot.id);
|
287 |
+
}
|
288 |
+
}
|
289 |
+
},
|
290 |
+
},
|
291 |
+
secondary: null,
|
292 |
+
target: "normal",
|
293 |
+
type: "Normal",
|
294 |
+
},
|
295 |
+
dizzypunch: {
|
296 |
+
inherit: true,
|
297 |
+
secondary: null,
|
298 |
+
},
|
299 |
+
doubleedge: {
|
300 |
+
inherit: true,
|
301 |
+
basePower: 100,
|
302 |
+
},
|
303 |
+
dragonrage: {
|
304 |
+
inherit: true,
|
305 |
+
basePower: 1,
|
306 |
+
},
|
307 |
+
explosion: {
|
308 |
+
inherit: true,
|
309 |
+
basePower: 170,
|
310 |
+
target: "normal",
|
311 |
+
},
|
312 |
+
fireblast: {
|
313 |
+
inherit: true,
|
314 |
+
secondary: {
|
315 |
+
chance: 30,
|
316 |
+
status: 'brn',
|
317 |
+
},
|
318 |
+
},
|
319 |
+
firespin: {
|
320 |
+
inherit: true,
|
321 |
+
accuracy: 70,
|
322 |
+
basePower: 15,
|
323 |
+
volatileStatus: 'partiallytrapped',
|
324 |
+
self: {
|
325 |
+
volatileStatus: 'partialtrappinglock',
|
326 |
+
},
|
327 |
+
onTryMove(source, target) {
|
328 |
+
if (target.volatiles['mustrecharge']) {
|
329 |
+
target.removeVolatile('mustrecharge');
|
330 |
+
this.hint("In Gen 1, partial trapping moves negate the recharge turn of Hyper Beam, even if they miss.", true);
|
331 |
+
}
|
332 |
+
},
|
333 |
+
onHit(target, source) {
|
334 |
+
/**
|
335 |
+
* The duration of the partially trapped must be always renewed to 2
|
336 |
+
* so target doesn't move on trapper switch out as happens in gen 1.
|
337 |
+
* However, this won't happen if there's no switch and the trapper is
|
338 |
+
* about to end its partial trapping.
|
339 |
+
**/
|
340 |
+
if (target.volatiles['partiallytrapped']) {
|
341 |
+
if (source.volatiles['partialtrappinglock'] && source.volatiles['partialtrappinglock'].duration! > 1) {
|
342 |
+
target.volatiles['partiallytrapped'].duration = 2;
|
343 |
+
}
|
344 |
+
}
|
345 |
+
},
|
346 |
+
},
|
347 |
+
fly: {
|
348 |
+
inherit: true,
|
349 |
+
condition: {},
|
350 |
+
onTryMove(attacker, defender, move) {
|
351 |
+
if (attacker.removeVolatile('twoturnmove')) {
|
352 |
+
attacker.removeVolatile('invulnerability');
|
353 |
+
return;
|
354 |
+
}
|
355 |
+
this.add('-prepare', attacker, move.name);
|
356 |
+
attacker.addVolatile('twoturnmove', defender);
|
357 |
+
attacker.addVolatile('invulnerability', defender);
|
358 |
+
return null;
|
359 |
+
},
|
360 |
+
},
|
361 |
+
focusenergy: {
|
362 |
+
inherit: true,
|
363 |
+
condition: {
|
364 |
+
onStart(pokemon) {
|
365 |
+
this.add('-start', pokemon, 'move: Focus Energy');
|
366 |
+
},
|
367 |
+
// This does nothing as it's dealt with on critical hit calculation.
|
368 |
+
onModifyMove() {},
|
369 |
+
},
|
370 |
+
},
|
371 |
+
glare: {
|
372 |
+
inherit: true,
|
373 |
+
ignoreImmunity: true,
|
374 |
+
},
|
375 |
+
growth: {
|
376 |
+
inherit: true,
|
377 |
+
boosts: {
|
378 |
+
spa: 1,
|
379 |
+
spd: 1,
|
380 |
+
},
|
381 |
+
},
|
382 |
+
gust: {
|
383 |
+
inherit: true,
|
384 |
+
type: "Normal",
|
385 |
+
},
|
386 |
+
haze: {
|
387 |
+
inherit: true,
|
388 |
+
onHit(target, source) {
|
389 |
+
this.add('-activate', target, 'move: Haze');
|
390 |
+
this.add('-clearallboost', '[silent]');
|
391 |
+
for (const pokemon of this.getAllActive()) {
|
392 |
+
pokemon.clearBoosts();
|
393 |
+
if (pokemon !== source) {
|
394 |
+
pokemon.cureStatus(true);
|
395 |
+
}
|
396 |
+
if (pokemon.status === 'tox') {
|
397 |
+
pokemon.setStatus('psn', null, null, true);
|
398 |
+
}
|
399 |
+
pokemon.updateSpeed();
|
400 |
+
// should only clear a specific set of volatiles
|
401 |
+
// while technically the toxic counter shouldn't be cleared, the preserved toxic counter is never used again
|
402 |
+
// in-game, so it is equivalent to just clear it.
|
403 |
+
const silentHack = '|[silent]';
|
404 |
+
const silentHackVolatiles = ['disable', 'confusion'];
|
405 |
+
const hazeVolatiles: { [key: string]: string } = {
|
406 |
+
'disable': '',
|
407 |
+
'confusion': '',
|
408 |
+
'mist': 'Mist',
|
409 |
+
'focusenergy': 'move: Focus Energy',
|
410 |
+
'leechseed': 'move: Leech Seed',
|
411 |
+
'lightscreen': 'Light Screen',
|
412 |
+
'reflect': 'Reflect',
|
413 |
+
'residualdmg': 'Toxic counter',
|
414 |
+
};
|
415 |
+
for (const v in hazeVolatiles) {
|
416 |
+
if (!pokemon.removeVolatile(v)) {
|
417 |
+
continue;
|
418 |
+
}
|
419 |
+
if (silentHackVolatiles.includes(v)) {
|
420 |
+
// these volatiles have their own onEnd method that prints, so to avoid
|
421 |
+
// double printing and ensure they are still silent, we need to tack on a
|
422 |
+
// silent attribute at the end
|
423 |
+
this.log[this.log.length - 1] += silentHack;
|
424 |
+
} else {
|
425 |
+
this.add('-end', pokemon, hazeVolatiles[v], '[silent]');
|
426 |
+
}
|
427 |
+
}
|
428 |
+
}
|
429 |
+
},
|
430 |
+
target: "self",
|
431 |
+
},
|
432 |
+
highjumpkick: {
|
433 |
+
inherit: true,
|
434 |
+
onMoveFail(target, source, move) {
|
435 |
+
this.directDamage(1, source, target);
|
436 |
+
},
|
437 |
+
},
|
438 |
+
jumpkick: {
|
439 |
+
inherit: true,
|
440 |
+
onMoveFail(target, source, move) {
|
441 |
+
this.directDamage(1, source, target);
|
442 |
+
},
|
443 |
+
},
|
444 |
+
karatechop: {
|
445 |
+
inherit: true,
|
446 |
+
critRatio: 2,
|
447 |
+
type: "Normal",
|
448 |
+
},
|
449 |
+
leechseed: {
|
450 |
+
inherit: true,
|
451 |
+
onHit() {},
|
452 |
+
condition: {
|
453 |
+
onStart(target) {
|
454 |
+
this.add('-start', target, 'move: Leech Seed');
|
455 |
+
},
|
456 |
+
onAfterMoveSelfPriority: 1,
|
457 |
+
onAfterMoveSelf(pokemon) {
|
458 |
+
const leecher = this.getAtSlot(pokemon.volatiles['leechseed'].sourceSlot);
|
459 |
+
if (!leecher || leecher.fainted || leecher.hp <= 0) {
|
460 |
+
this.debug('Nothing to leech into');
|
461 |
+
return;
|
462 |
+
}
|
463 |
+
// We check if leeched Pokémon has Toxic to increase leeched damage.
|
464 |
+
let toxicCounter = 1;
|
465 |
+
const residualdmg = pokemon.volatiles['residualdmg'];
|
466 |
+
if (residualdmg) {
|
467 |
+
residualdmg.counter++;
|
468 |
+
toxicCounter = residualdmg.counter;
|
469 |
+
}
|
470 |
+
const toLeech = this.clampIntRange(Math.floor(pokemon.baseMaxhp / 16), 1) * toxicCounter;
|
471 |
+
const damage = this.damage(toLeech, pokemon, leecher);
|
472 |
+
if (residualdmg) this.hint("In Gen 1, Leech Seed's damage is affected by Toxic's counter.", true);
|
473 |
+
if (!damage || toLeech > damage) {
|
474 |
+
this.hint("In Gen 1, Leech Seed recovery is not limited by the remaining HP of the seeded Pokemon.", true);
|
475 |
+
}
|
476 |
+
this.heal(toLeech, leecher, pokemon);
|
477 |
+
},
|
478 |
+
},
|
479 |
+
},
|
480 |
+
lightscreen: {
|
481 |
+
num: 113,
|
482 |
+
accuracy: true,
|
483 |
+
basePower: 0,
|
484 |
+
category: "Status",
|
485 |
+
name: "Light Screen",
|
486 |
+
pp: 30,
|
487 |
+
priority: 0,
|
488 |
+
flags: { metronome: 1 },
|
489 |
+
volatileStatus: 'lightscreen',
|
490 |
+
onTryHit(pokemon) {
|
491 |
+
if (pokemon.volatiles['lightscreen']) {
|
492 |
+
return false;
|
493 |
+
}
|
494 |
+
},
|
495 |
+
condition: {
|
496 |
+
onStart(pokemon) {
|
497 |
+
this.add('-start', pokemon, 'Light Screen');
|
498 |
+
},
|
499 |
+
},
|
500 |
+
target: "self",
|
501 |
+
type: "Psychic",
|
502 |
+
},
|
503 |
+
mimic: {
|
504 |
+
inherit: true,
|
505 |
+
flags: { protect: 1, bypasssub: 1, metronome: 1 },
|
506 |
+
onHit(target, source) {
|
507 |
+
const moveslot = source.moves.indexOf('mimic');
|
508 |
+
if (moveslot < 0) return false;
|
509 |
+
const moves = target.moves;
|
510 |
+
const moveid = this.sample(moves);
|
511 |
+
if (!moveid) return false;
|
512 |
+
const move = this.dex.moves.get(moveid);
|
513 |
+
source.moveSlots[moveslot] = {
|
514 |
+
move: move.name,
|
515 |
+
id: move.id,
|
516 |
+
pp: source.moveSlots[moveslot].pp,
|
517 |
+
maxpp: move.pp * 8 / 5,
|
518 |
+
target: move.target,
|
519 |
+
disabled: false,
|
520 |
+
used: false,
|
521 |
+
virtual: true,
|
522 |
+
};
|
523 |
+
this.add('-start', source, 'Mimic', move.name);
|
524 |
+
},
|
525 |
+
},
|
526 |
+
mirrormove: {
|
527 |
+
inherit: true,
|
528 |
+
onHit(pokemon) {
|
529 |
+
const foe = pokemon.side.foe.active[0];
|
530 |
+
if (!foe?.lastMove || foe.lastMove.id === 'mirrormove') {
|
531 |
+
return false;
|
532 |
+
}
|
533 |
+
pokemon.side.lastSelectedMove = foe.lastMove.id;
|
534 |
+
this.actions.useMove(foe.lastMove.id, pokemon);
|
535 |
+
},
|
536 |
+
},
|
537 |
+
mist: {
|
538 |
+
inherit: true,
|
539 |
+
condition: {
|
540 |
+
onStart(pokemon) {
|
541 |
+
this.add('-start', pokemon, 'Mist');
|
542 |
+
},
|
543 |
+
onTryBoost(boost, target, source, effect) {
|
544 |
+
if (effect.effectType === 'Move' && effect.category !== 'Status') return;
|
545 |
+
if (source && target !== source) {
|
546 |
+
let showMsg = false;
|
547 |
+
let i: BoostID;
|
548 |
+
for (i in boost) {
|
549 |
+
if (boost[i]! < 0) {
|
550 |
+
delete boost[i];
|
551 |
+
showMsg = true;
|
552 |
+
}
|
553 |
+
}
|
554 |
+
if (showMsg && !(effect as ActiveMove).secondaries) {
|
555 |
+
this.add('-activate', target, 'move: Mist');
|
556 |
+
}
|
557 |
+
}
|
558 |
+
},
|
559 |
+
},
|
560 |
+
},
|
561 |
+
nightshade: {
|
562 |
+
inherit: true,
|
563 |
+
ignoreImmunity: true,
|
564 |
+
basePower: 1,
|
565 |
+
},
|
566 |
+
petaldance: {
|
567 |
+
inherit: true,
|
568 |
+
onMoveFail() {},
|
569 |
+
},
|
570 |
+
poisonsting: {
|
571 |
+
inherit: true,
|
572 |
+
secondary: {
|
573 |
+
chance: 20,
|
574 |
+
status: 'psn',
|
575 |
+
},
|
576 |
+
},
|
577 |
+
psychic: {
|
578 |
+
inherit: true,
|
579 |
+
secondary: {
|
580 |
+
chance: 33,
|
581 |
+
boosts: {
|
582 |
+
spa: -1,
|
583 |
+
spd: -1,
|
584 |
+
},
|
585 |
+
},
|
586 |
+
},
|
587 |
+
psywave: {
|
588 |
+
inherit: true,
|
589 |
+
basePower: 1,
|
590 |
+
damageCallback(pokemon) {
|
591 |
+
const psywaveDamage = (this.random(0, this.trunc(1.5 * pokemon.level)));
|
592 |
+
if (psywaveDamage <= 0) {
|
593 |
+
this.hint("Desync Clause Mod activated!");
|
594 |
+
return false;
|
595 |
+
}
|
596 |
+
return psywaveDamage;
|
597 |
+
},
|
598 |
+
},
|
599 |
+
rage: {
|
600 |
+
inherit: true,
|
601 |
+
self: {
|
602 |
+
volatileStatus: 'rage',
|
603 |
+
},
|
604 |
+
condition: {
|
605 |
+
// Rage lock
|
606 |
+
onStart(target, source, effect) {
|
607 |
+
this.effectState.move = 'rage';
|
608 |
+
this.effectState.accuracy = 255;
|
609 |
+
},
|
610 |
+
onLockMove: 'rage',
|
611 |
+
onHit(target, source, move) {
|
612 |
+
// Disable and exploding moves boost Rage even if they miss/fail, so they are dealt with separately.
|
613 |
+
if (target.boosts.atk < 6 && (move.category !== 'Status' && !move.selfdestruct)) {
|
614 |
+
this.boost({ atk: 1 });
|
615 |
+
}
|
616 |
+
},
|
617 |
+
},
|
618 |
+
},
|
619 |
+
razorleaf: {
|
620 |
+
inherit: true,
|
621 |
+
critRatio: 2,
|
622 |
+
target: "normal",
|
623 |
+
},
|
624 |
+
razorwind: {
|
625 |
+
inherit: true,
|
626 |
+
critRatio: 1,
|
627 |
+
target: "normal",
|
628 |
+
onTryMove(attacker, defender, move) {
|
629 |
+
if (attacker.removeVolatile('twoturnmove')) {
|
630 |
+
attacker.removeVolatile('invulnerability');
|
631 |
+
return;
|
632 |
+
}
|
633 |
+
this.add('-prepare', attacker, move.name);
|
634 |
+
attacker.addVolatile('twoturnmove', defender);
|
635 |
+
return null;
|
636 |
+
},
|
637 |
+
},
|
638 |
+
recover: {
|
639 |
+
inherit: true,
|
640 |
+
heal: null,
|
641 |
+
onHit(target) {
|
642 |
+
if (target.hp === target.maxhp) return false;
|
643 |
+
// Fail when health is 255 or 511 less than max, unless it is divisible by 256
|
644 |
+
if (
|
645 |
+
target.hp === target.maxhp ||
|
646 |
+
((target.hp === (target.maxhp - 255) || target.hp === (target.maxhp - 511)) && target.hp % 256 !== 0)
|
647 |
+
) {
|
648 |
+
this.hint(
|
649 |
+
"In Gen 1, recovery moves fail if (user's maximum HP - user's current HP + 1) is divisible by 256, " +
|
650 |
+
"unless the current hp is also divisible by 256."
|
651 |
+
);
|
652 |
+
return false;
|
653 |
+
}
|
654 |
+
this.heal(Math.floor(target.maxhp / 2), target, target);
|
655 |
+
},
|
656 |
+
},
|
657 |
+
reflect: {
|
658 |
+
num: 115,
|
659 |
+
accuracy: true,
|
660 |
+
basePower: 0,
|
661 |
+
category: "Status",
|
662 |
+
name: "Reflect",
|
663 |
+
pp: 20,
|
664 |
+
priority: 0,
|
665 |
+
flags: { metronome: 1 },
|
666 |
+
volatileStatus: 'reflect',
|
667 |
+
onTryHit(pokemon) {
|
668 |
+
if (pokemon.volatiles['reflect']) {
|
669 |
+
return false;
|
670 |
+
}
|
671 |
+
},
|
672 |
+
condition: {
|
673 |
+
onStart(pokemon) {
|
674 |
+
this.add('-start', pokemon, 'Reflect');
|
675 |
+
},
|
676 |
+
},
|
677 |
+
secondary: null,
|
678 |
+
target: "self",
|
679 |
+
type: "Psychic",
|
680 |
+
},
|
681 |
+
rest: {
|
682 |
+
inherit: true,
|
683 |
+
onTry() {},
|
684 |
+
onHit(target, source, move) {
|
685 |
+
if (target.hp === target.maxhp) return false;
|
686 |
+
// Fail when health is 255 or 511 less than max, unless it is divisible by 256
|
687 |
+
if (
|
688 |
+
target.hp === target.maxhp ||
|
689 |
+
((target.hp === (target.maxhp - 255) || target.hp === (target.maxhp - 511)) && target.hp % 256 !== 0)
|
690 |
+
) {
|
691 |
+
this.hint(
|
692 |
+
"In Gen 1, recovery moves fail if (user's maximum HP - user's current HP + 1) is divisible by 256, " +
|
693 |
+
"unless the current hp is also divisible by 256."
|
694 |
+
);
|
695 |
+
return false;
|
696 |
+
}
|
697 |
+
if (!target.setStatus('slp', source, move)) return false;
|
698 |
+
target.statusState.time = 2;
|
699 |
+
target.statusState.startTime = 2;
|
700 |
+
this.heal(target.maxhp); // Aesthetic only as the healing happens after you fall asleep in-game
|
701 |
+
},
|
702 |
+
},
|
703 |
+
roar: {
|
704 |
+
inherit: true,
|
705 |
+
forceSwitch: false,
|
706 |
+
onTryHit() {},
|
707 |
+
priority: 0,
|
708 |
+
},
|
709 |
+
rockslide: {
|
710 |
+
inherit: true,
|
711 |
+
secondary: null,
|
712 |
+
target: "normal",
|
713 |
+
},
|
714 |
+
rockthrow: {
|
715 |
+
inherit: true,
|
716 |
+
accuracy: 65,
|
717 |
+
},
|
718 |
+
sandattack: {
|
719 |
+
inherit: true,
|
720 |
+
ignoreImmunity: true,
|
721 |
+
type: "Normal",
|
722 |
+
},
|
723 |
+
seismictoss: {
|
724 |
+
inherit: true,
|
725 |
+
ignoreImmunity: true,
|
726 |
+
basePower: 1,
|
727 |
+
},
|
728 |
+
selfdestruct: {
|
729 |
+
inherit: true,
|
730 |
+
basePower: 130,
|
731 |
+
target: "normal",
|
732 |
+
},
|
733 |
+
skullbash: {
|
734 |
+
inherit: true,
|
735 |
+
onTryMove(attacker, defender, move) {
|
736 |
+
if (attacker.removeVolatile('twoturnmove')) {
|
737 |
+
attacker.removeVolatile('invulnerability');
|
738 |
+
return;
|
739 |
+
}
|
740 |
+
this.add('-prepare', attacker, move.name);
|
741 |
+
attacker.addVolatile('twoturnmove', defender);
|
742 |
+
return null;
|
743 |
+
},
|
744 |
+
},
|
745 |
+
skyattack: {
|
746 |
+
inherit: true,
|
747 |
+
onTryMove(attacker, defender, move) {
|
748 |
+
if (attacker.removeVolatile('twoturnmove')) {
|
749 |
+
attacker.removeVolatile('invulnerability');
|
750 |
+
return;
|
751 |
+
}
|
752 |
+
this.add('-prepare', attacker, move.name);
|
753 |
+
attacker.addVolatile('twoturnmove', defender);
|
754 |
+
return null;
|
755 |
+
},
|
756 |
+
},
|
757 |
+
slash: {
|
758 |
+
inherit: true,
|
759 |
+
critRatio: 2,
|
760 |
+
},
|
761 |
+
sludge: {
|
762 |
+
inherit: true,
|
763 |
+
secondary: {
|
764 |
+
chance: 40,
|
765 |
+
status: 'psn',
|
766 |
+
},
|
767 |
+
},
|
768 |
+
solarbeam: {
|
769 |
+
inherit: true,
|
770 |
+
onTryMove(attacker, defender, move) {
|
771 |
+
if (attacker.removeVolatile('twoturnmove')) {
|
772 |
+
attacker.removeVolatile('invulnerability');
|
773 |
+
return;
|
774 |
+
}
|
775 |
+
this.add('-prepare', attacker, move.name);
|
776 |
+
attacker.addVolatile('twoturnmove', defender);
|
777 |
+
return null;
|
778 |
+
},
|
779 |
+
},
|
780 |
+
sonicboom: {
|
781 |
+
inherit: true,
|
782 |
+
ignoreImmunity: true,
|
783 |
+
basePower: 1,
|
784 |
+
},
|
785 |
+
softboiled: {
|
786 |
+
inherit: true,
|
787 |
+
heal: null,
|
788 |
+
onHit(target) {
|
789 |
+
if (target.hp === target.maxhp) return false;
|
790 |
+
// Fail when health is 255 or 511 less than max, unless it is divisible by 256
|
791 |
+
if (
|
792 |
+
target.hp === target.maxhp ||
|
793 |
+
((target.hp === (target.maxhp - 255) || target.hp === (target.maxhp - 511)) && target.hp % 256 !== 0)
|
794 |
+
) {
|
795 |
+
this.hint(
|
796 |
+
"In Gen 1, recovery moves fail if (user's maximum HP - user's current HP + 1) is divisible by 256, " +
|
797 |
+
"unless the current hp is also divisible by 256."
|
798 |
+
);
|
799 |
+
return false;
|
800 |
+
}
|
801 |
+
this.heal(Math.floor(target.maxhp / 2), target, target);
|
802 |
+
},
|
803 |
+
},
|
804 |
+
struggle: {
|
805 |
+
inherit: true,
|
806 |
+
pp: 10,
|
807 |
+
recoil: [1, 2],
|
808 |
+
onModifyMove() {},
|
809 |
+
},
|
810 |
+
substitute: {
|
811 |
+
num: 164,
|
812 |
+
accuracy: true,
|
813 |
+
basePower: 0,
|
814 |
+
category: "Status",
|
815 |
+
name: "Substitute",
|
816 |
+
pp: 10,
|
817 |
+
priority: 0,
|
818 |
+
flags: { metronome: 1 },
|
819 |
+
volatileStatus: 'substitute',
|
820 |
+
onTryHit(target) {
|
821 |
+
if (target.volatiles['substitute']) {
|
822 |
+
this.add('-fail', target, 'move: Substitute');
|
823 |
+
return null;
|
824 |
+
}
|
825 |
+
// We only prevent when hp is less than one quarter.
|
826 |
+
// If you use substitute at exactly one quarter, you faint.
|
827 |
+
if (target.hp < target.maxhp / 4) {
|
828 |
+
this.add('-fail', target, 'move: Substitute', '[weak]');
|
829 |
+
return null;
|
830 |
+
}
|
831 |
+
},
|
832 |
+
onHit(target) {
|
833 |
+
// If max HP is 3 or less substitute makes no damage
|
834 |
+
if (target.maxhp > 3) {
|
835 |
+
this.directDamage(target.maxhp / 4, target, target);
|
836 |
+
}
|
837 |
+
},
|
838 |
+
condition: {
|
839 |
+
onStart(target) {
|
840 |
+
this.add('-start', target, 'Substitute');
|
841 |
+
this.effectState.hp = Math.floor(target.maxhp / 4) + 1;
|
842 |
+
delete target.volatiles['partiallytrapped'];
|
843 |
+
},
|
844 |
+
onTryHitPriority: -1,
|
845 |
+
onTryHit(target, source, move) {
|
846 |
+
if (move.category === 'Status') {
|
847 |
+
// In gen 1 it only blocks:
|
848 |
+
// poison, confusion, secondary effect confusion, stat reducing moves and Leech Seed.
|
849 |
+
const SubBlocked = ['lockon', 'meanlook', 'mindreader', 'nightmare'];
|
850 |
+
if (
|
851 |
+
move.status === 'psn' || move.status === 'tox' || (move.boosts && target !== source) ||
|
852 |
+
move.volatileStatus === 'confusion' || SubBlocked.includes(move.id)
|
853 |
+
) {
|
854 |
+
return false;
|
855 |
+
}
|
856 |
+
return;
|
857 |
+
}
|
858 |
+
if (move.volatileStatus && target === source) return;
|
859 |
+
// NOTE: In future generations the damage is capped to the remaining HP of the
|
860 |
+
// Substitute, here we deliberately use the uncapped damage when tracking lastDamage etc.
|
861 |
+
// Also, multi-hit moves must always deal the same damage as the first hit for any subsequent hits
|
862 |
+
let uncappedDamage = move.hit > 1 ? this.lastDamage : this.actions.getDamage(source, target, move);
|
863 |
+
if (move.id === 'bide') uncappedDamage = source.volatiles['bide'].damage * 2;
|
864 |
+
if (!uncappedDamage && uncappedDamage !== 0) return null;
|
865 |
+
uncappedDamage = this.runEvent('SubDamage', target, source, move, uncappedDamage);
|
866 |
+
if (!uncappedDamage && uncappedDamage !== 0) return uncappedDamage;
|
867 |
+
this.lastDamage = uncappedDamage;
|
868 |
+
target.volatiles['substitute'].hp -= uncappedDamage > target.volatiles['substitute'].hp ?
|
869 |
+
target.volatiles['substitute'].hp : uncappedDamage;
|
870 |
+
if (target.volatiles['substitute'].hp <= 0) {
|
871 |
+
target.removeVolatile('substitute');
|
872 |
+
target.subFainted = true;
|
873 |
+
} else {
|
874 |
+
this.add('-activate', target, 'Substitute', '[damage]');
|
875 |
+
}
|
876 |
+
// Drain/recoil/secondary effect confusion do not happen if the substitute breaks
|
877 |
+
if (target.volatiles['substitute']) {
|
878 |
+
if (move.recoil) {
|
879 |
+
this.damage(this.clampIntRange(Math.floor(uncappedDamage * move.recoil[0] / move.recoil[1]), 1),
|
880 |
+
source, target, 'recoil');
|
881 |
+
}
|
882 |
+
if (move.drain) {
|
883 |
+
const amount = this.clampIntRange(Math.floor(uncappedDamage * move.drain[0] / move.drain[1]), 1);
|
884 |
+
this.lastDamage = amount;
|
885 |
+
this.heal(amount, source, target, 'drain');
|
886 |
+
}
|
887 |
+
if (move.secondary?.volatileStatus === 'confusion') {
|
888 |
+
const secondary = move.secondary;
|
889 |
+
if (secondary.chance === undefined || this.randomChance(Math.ceil(secondary.chance * 256 / 100) - 1, 256)) {
|
890 |
+
target.addVolatile(move.secondary.volatileStatus, source, move);
|
891 |
+
this.hint(
|
892 |
+
"In Gen 1, moves that inflict confusion as a secondary effect can confuse targets with a Substitute, " +
|
893 |
+
"as long as the move does not break the Substitute."
|
894 |
+
);
|
895 |
+
}
|
896 |
+
}
|
897 |
+
}
|
898 |
+
this.runEvent('AfterSubDamage', target, source, move, uncappedDamage);
|
899 |
+
// Add here counter damage
|
900 |
+
const lastAttackedBy = target.getLastAttackedBy();
|
901 |
+
if (!lastAttackedBy) {
|
902 |
+
target.attackedBy.push({ source, move: move.id, damage: uncappedDamage, slot: source.getSlot(), thisTurn: true });
|
903 |
+
} else {
|
904 |
+
lastAttackedBy.move = move.id;
|
905 |
+
lastAttackedBy.damage = uncappedDamage;
|
906 |
+
}
|
907 |
+
return 0;
|
908 |
+
},
|
909 |
+
onEnd(target) {
|
910 |
+
this.add('-end', target, 'Substitute');
|
911 |
+
},
|
912 |
+
},
|
913 |
+
secondary: null,
|
914 |
+
target: "self",
|
915 |
+
type: "Normal",
|
916 |
+
},
|
917 |
+
superfang: {
|
918 |
+
inherit: true,
|
919 |
+
ignoreImmunity: true,
|
920 |
+
basePower: 1,
|
921 |
+
},
|
922 |
+
thrash: {
|
923 |
+
inherit: true,
|
924 |
+
onMoveFail() {},
|
925 |
+
},
|
926 |
+
thunder: {
|
927 |
+
inherit: true,
|
928 |
+
secondary: {
|
929 |
+
chance: 10,
|
930 |
+
status: 'par',
|
931 |
+
},
|
932 |
+
},
|
933 |
+
triattack: {
|
934 |
+
inherit: true,
|
935 |
+
onHit() {},
|
936 |
+
secondary: null,
|
937 |
+
},
|
938 |
+
whirlwind: {
|
939 |
+
inherit: true,
|
940 |
+
accuracy: 85,
|
941 |
+
forceSwitch: false,
|
942 |
+
onTryHit() {},
|
943 |
+
priority: 0,
|
944 |
+
},
|
945 |
+
wingattack: {
|
946 |
+
inherit: true,
|
947 |
+
basePower: 35,
|
948 |
+
},
|
949 |
+
wrap: {
|
950 |
+
inherit: true,
|
951 |
+
accuracy: 85,
|
952 |
+
ignoreImmunity: true,
|
953 |
+
volatileStatus: 'partiallytrapped',
|
954 |
+
self: {
|
955 |
+
volatileStatus: 'partialtrappinglock',
|
956 |
+
},
|
957 |
+
onTryMove(source, target) {
|
958 |
+
if (target.volatiles['mustrecharge']) {
|
959 |
+
target.removeVolatile('mustrecharge');
|
960 |
+
this.hint("In Gen 1, partial trapping moves negate the recharge turn of Hyper Beam, even if they miss.", true);
|
961 |
+
}
|
962 |
+
},
|
963 |
+
onHit(target, source) {
|
964 |
+
/**
|
965 |
+
* The duration of the partially trapped must be always renewed to 2
|
966 |
+
* so target doesn't move on trapper switch out as happens in gen 1.
|
967 |
+
* However, this won't happen if there's no switch and the trapper is
|
968 |
+
* about to end its partial trapping.
|
969 |
+
**/
|
970 |
+
if (target.volatiles['partiallytrapped']) {
|
971 |
+
if (source.volatiles['partialtrappinglock'] && source.volatiles['partialtrappinglock'].duration! > 1) {
|
972 |
+
target.volatiles['partiallytrapped'].duration = 2;
|
973 |
+
}
|
974 |
+
}
|
975 |
+
},
|
976 |
+
},
|
977 |
+
};
|
data/mods/gen1/pokedex.ts
ADDED
@@ -0,0 +1,612 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
export const Pokedex: import('../../../sim/dex-species').ModdedSpeciesDataTable = {
|
2 |
+
missingno: {
|
3 |
+
inherit: true,
|
4 |
+
baseStats: { hp: 33, atk: 136, def: 0, spa: 6, spd: 6, spe: 29 },
|
5 |
+
},
|
6 |
+
bulbasaur: {
|
7 |
+
inherit: true,
|
8 |
+
baseStats: { hp: 45, atk: 49, def: 49, spa: 65, spd: 65, spe: 45 },
|
9 |
+
},
|
10 |
+
ivysaur: {
|
11 |
+
inherit: true,
|
12 |
+
baseStats: { hp: 60, atk: 62, def: 63, spa: 80, spd: 80, spe: 60 },
|
13 |
+
},
|
14 |
+
venusaur: {
|
15 |
+
inherit: true,
|
16 |
+
baseStats: { hp: 80, atk: 82, def: 83, spa: 100, spd: 100, spe: 80 },
|
17 |
+
},
|
18 |
+
charmander: {
|
19 |
+
inherit: true,
|
20 |
+
baseStats: { hp: 39, atk: 52, def: 43, spa: 50, spd: 50, spe: 65 },
|
21 |
+
},
|
22 |
+
charmeleon: {
|
23 |
+
inherit: true,
|
24 |
+
baseStats: { hp: 58, atk: 64, def: 58, spa: 65, spd: 65, spe: 80 },
|
25 |
+
},
|
26 |
+
charizard: {
|
27 |
+
inherit: true,
|
28 |
+
baseStats: { hp: 78, atk: 84, def: 78, spa: 85, spd: 85, spe: 100 },
|
29 |
+
},
|
30 |
+
squirtle: {
|
31 |
+
inherit: true,
|
32 |
+
baseStats: { hp: 44, atk: 48, def: 65, spa: 50, spd: 50, spe: 43 },
|
33 |
+
},
|
34 |
+
wartortle: {
|
35 |
+
inherit: true,
|
36 |
+
baseStats: { hp: 59, atk: 63, def: 80, spa: 65, spd: 65, spe: 58 },
|
37 |
+
},
|
38 |
+
blastoise: {
|
39 |
+
inherit: true,
|
40 |
+
baseStats: { hp: 79, atk: 83, def: 100, spa: 85, spd: 85, spe: 78 },
|
41 |
+
},
|
42 |
+
caterpie: {
|
43 |
+
inherit: true,
|
44 |
+
baseStats: { hp: 45, atk: 30, def: 35, spa: 20, spd: 20, spe: 45 },
|
45 |
+
},
|
46 |
+
metapod: {
|
47 |
+
inherit: true,
|
48 |
+
baseStats: { hp: 50, atk: 20, def: 55, spa: 25, spd: 25, spe: 30 },
|
49 |
+
},
|
50 |
+
butterfree: {
|
51 |
+
inherit: true,
|
52 |
+
baseStats: { hp: 60, atk: 45, def: 50, spa: 80, spd: 80, spe: 70 },
|
53 |
+
},
|
54 |
+
weedle: {
|
55 |
+
inherit: true,
|
56 |
+
baseStats: { hp: 40, atk: 35, def: 30, spa: 20, spd: 20, spe: 50 },
|
57 |
+
},
|
58 |
+
kakuna: {
|
59 |
+
inherit: true,
|
60 |
+
baseStats: { hp: 45, atk: 25, def: 50, spa: 25, spd: 25, spe: 35 },
|
61 |
+
},
|
62 |
+
beedrill: {
|
63 |
+
inherit: true,
|
64 |
+
baseStats: { hp: 65, atk: 80, def: 40, spa: 45, spd: 45, spe: 75 },
|
65 |
+
},
|
66 |
+
pidgey: {
|
67 |
+
inherit: true,
|
68 |
+
baseStats: { hp: 40, atk: 45, def: 40, spa: 35, spd: 35, spe: 56 },
|
69 |
+
},
|
70 |
+
pidgeotto: {
|
71 |
+
inherit: true,
|
72 |
+
baseStats: { hp: 63, atk: 60, def: 55, spa: 50, spd: 50, spe: 71 },
|
73 |
+
},
|
74 |
+
pidgeot: {
|
75 |
+
inherit: true,
|
76 |
+
baseStats: { hp: 83, atk: 80, def: 75, spa: 70, spd: 70, spe: 91 },
|
77 |
+
},
|
78 |
+
rattata: {
|
79 |
+
inherit: true,
|
80 |
+
baseStats: { hp: 30, atk: 56, def: 35, spa: 25, spd: 25, spe: 72 },
|
81 |
+
},
|
82 |
+
raticate: {
|
83 |
+
inherit: true,
|
84 |
+
baseStats: { hp: 55, atk: 81, def: 60, spa: 50, spd: 50, spe: 97 },
|
85 |
+
},
|
86 |
+
spearow: {
|
87 |
+
inherit: true,
|
88 |
+
baseStats: { hp: 40, atk: 60, def: 30, spa: 31, spd: 31, spe: 70 },
|
89 |
+
},
|
90 |
+
fearow: {
|
91 |
+
inherit: true,
|
92 |
+
baseStats: { hp: 65, atk: 90, def: 65, spa: 61, spd: 61, spe: 100 },
|
93 |
+
},
|
94 |
+
ekans: {
|
95 |
+
inherit: true,
|
96 |
+
baseStats: { hp: 35, atk: 60, def: 44, spa: 40, spd: 40, spe: 55 },
|
97 |
+
},
|
98 |
+
arbok: {
|
99 |
+
inherit: true,
|
100 |
+
baseStats: { hp: 60, atk: 85, def: 69, spa: 65, spd: 65, spe: 80 },
|
101 |
+
},
|
102 |
+
pikachu: {
|
103 |
+
inherit: true,
|
104 |
+
baseStats: { hp: 35, atk: 55, def: 30, spa: 50, spd: 50, spe: 90 },
|
105 |
+
},
|
106 |
+
raichu: {
|
107 |
+
inherit: true,
|
108 |
+
baseStats: { hp: 60, atk: 90, def: 55, spa: 90, spd: 90, spe: 100 },
|
109 |
+
},
|
110 |
+
sandshrew: {
|
111 |
+
inherit: true,
|
112 |
+
baseStats: { hp: 50, atk: 75, def: 85, spa: 30, spd: 30, spe: 40 },
|
113 |
+
},
|
114 |
+
sandslash: {
|
115 |
+
inherit: true,
|
116 |
+
baseStats: { hp: 75, atk: 100, def: 110, spa: 55, spd: 55, spe: 65 },
|
117 |
+
},
|
118 |
+
nidoranf: {
|
119 |
+
inherit: true,
|
120 |
+
baseStats: { hp: 55, atk: 47, def: 52, spa: 40, spd: 40, spe: 41 },
|
121 |
+
},
|
122 |
+
nidorina: {
|
123 |
+
inherit: true,
|
124 |
+
baseStats: { hp: 70, atk: 62, def: 67, spa: 55, spd: 55, spe: 56 },
|
125 |
+
},
|
126 |
+
nidoqueen: {
|
127 |
+
inherit: true,
|
128 |
+
baseStats: { hp: 90, atk: 82, def: 87, spa: 75, spd: 75, spe: 76 },
|
129 |
+
},
|
130 |
+
nidoranm: {
|
131 |
+
inherit: true,
|
132 |
+
baseStats: { hp: 46, atk: 57, def: 40, spa: 40, spd: 40, spe: 50 },
|
133 |
+
},
|
134 |
+
nidorino: {
|
135 |
+
inherit: true,
|
136 |
+
baseStats: { hp: 61, atk: 72, def: 57, spa: 55, spd: 55, spe: 65 },
|
137 |
+
},
|
138 |
+
nidoking: {
|
139 |
+
inherit: true,
|
140 |
+
baseStats: { hp: 81, atk: 92, def: 77, spa: 75, spd: 75, spe: 85 },
|
141 |
+
},
|
142 |
+
clefairy: {
|
143 |
+
inherit: true,
|
144 |
+
baseStats: { hp: 70, atk: 45, def: 48, spa: 60, spd: 60, spe: 35 },
|
145 |
+
},
|
146 |
+
clefable: {
|
147 |
+
inherit: true,
|
148 |
+
baseStats: { hp: 95, atk: 70, def: 73, spa: 85, spd: 85, spe: 60 },
|
149 |
+
},
|
150 |
+
vulpix: {
|
151 |
+
inherit: true,
|
152 |
+
baseStats: { hp: 38, atk: 41, def: 40, spa: 65, spd: 65, spe: 65 },
|
153 |
+
},
|
154 |
+
ninetales: {
|
155 |
+
inherit: true,
|
156 |
+
baseStats: { hp: 73, atk: 76, def: 75, spa: 100, spd: 100, spe: 100 },
|
157 |
+
},
|
158 |
+
jigglypuff: {
|
159 |
+
inherit: true,
|
160 |
+
baseStats: { hp: 115, atk: 45, def: 20, spa: 25, spd: 25, spe: 20 },
|
161 |
+
},
|
162 |
+
wigglytuff: {
|
163 |
+
inherit: true,
|
164 |
+
baseStats: { hp: 140, atk: 70, def: 45, spa: 50, spd: 50, spe: 45 },
|
165 |
+
},
|
166 |
+
zubat: {
|
167 |
+
inherit: true,
|
168 |
+
baseStats: { hp: 40, atk: 45, def: 35, spa: 40, spd: 40, spe: 55 },
|
169 |
+
},
|
170 |
+
golbat: {
|
171 |
+
inherit: true,
|
172 |
+
baseStats: { hp: 75, atk: 80, def: 70, spa: 75, spd: 75, spe: 90 },
|
173 |
+
},
|
174 |
+
oddish: {
|
175 |
+
inherit: true,
|
176 |
+
baseStats: { hp: 45, atk: 50, def: 55, spa: 75, spd: 75, spe: 30 },
|
177 |
+
},
|
178 |
+
gloom: {
|
179 |
+
inherit: true,
|
180 |
+
baseStats: { hp: 60, atk: 65, def: 70, spa: 85, spd: 85, spe: 40 },
|
181 |
+
},
|
182 |
+
vileplume: {
|
183 |
+
inherit: true,
|
184 |
+
baseStats: { hp: 75, atk: 80, def: 85, spa: 100, spd: 100, spe: 50 },
|
185 |
+
},
|
186 |
+
paras: {
|
187 |
+
inherit: true,
|
188 |
+
baseStats: { hp: 35, atk: 70, def: 55, spa: 55, spd: 55, spe: 25 },
|
189 |
+
},
|
190 |
+
parasect: {
|
191 |
+
inherit: true,
|
192 |
+
baseStats: { hp: 60, atk: 95, def: 80, spa: 80, spd: 80, spe: 30 },
|
193 |
+
},
|
194 |
+
venonat: {
|
195 |
+
inherit: true,
|
196 |
+
baseStats: { hp: 60, atk: 55, def: 50, spa: 40, spd: 40, spe: 45 },
|
197 |
+
},
|
198 |
+
venomoth: {
|
199 |
+
inherit: true,
|
200 |
+
baseStats: { hp: 70, atk: 65, def: 60, spa: 90, spd: 90, spe: 90 },
|
201 |
+
},
|
202 |
+
diglett: {
|
203 |
+
inherit: true,
|
204 |
+
baseStats: { hp: 10, atk: 55, def: 25, spa: 45, spd: 45, spe: 95 },
|
205 |
+
},
|
206 |
+
dugtrio: {
|
207 |
+
inherit: true,
|
208 |
+
baseStats: { hp: 35, atk: 80, def: 50, spa: 70, spd: 70, spe: 120 },
|
209 |
+
},
|
210 |
+
meowth: {
|
211 |
+
inherit: true,
|
212 |
+
baseStats: { hp: 40, atk: 45, def: 35, spa: 40, spd: 40, spe: 90 },
|
213 |
+
},
|
214 |
+
persian: {
|
215 |
+
inherit: true,
|
216 |
+
baseStats: { hp: 65, atk: 70, def: 60, spa: 65, spd: 65, spe: 115 },
|
217 |
+
},
|
218 |
+
psyduck: {
|
219 |
+
inherit: true,
|
220 |
+
baseStats: { hp: 50, atk: 52, def: 48, spa: 50, spd: 50, spe: 55 },
|
221 |
+
},
|
222 |
+
golduck: {
|
223 |
+
inherit: true,
|
224 |
+
baseStats: { hp: 80, atk: 82, def: 78, spa: 80, spd: 80, spe: 85 },
|
225 |
+
},
|
226 |
+
mankey: {
|
227 |
+
inherit: true,
|
228 |
+
baseStats: { hp: 40, atk: 80, def: 35, spa: 35, spd: 35, spe: 70 },
|
229 |
+
},
|
230 |
+
primeape: {
|
231 |
+
inherit: true,
|
232 |
+
baseStats: { hp: 65, atk: 105, def: 60, spa: 60, spd: 60, spe: 95 },
|
233 |
+
},
|
234 |
+
growlithe: {
|
235 |
+
inherit: true,
|
236 |
+
baseStats: { hp: 55, atk: 70, def: 45, spa: 50, spd: 50, spe: 60 },
|
237 |
+
},
|
238 |
+
arcanine: {
|
239 |
+
inherit: true,
|
240 |
+
baseStats: { hp: 90, atk: 110, def: 80, spa: 80, spd: 80, spe: 95 },
|
241 |
+
},
|
242 |
+
poliwag: {
|
243 |
+
inherit: true,
|
244 |
+
baseStats: { hp: 40, atk: 50, def: 40, spa: 40, spd: 40, spe: 90 },
|
245 |
+
},
|
246 |
+
poliwhirl: {
|
247 |
+
inherit: true,
|
248 |
+
baseStats: { hp: 65, atk: 65, def: 65, spa: 50, spd: 50, spe: 90 },
|
249 |
+
},
|
250 |
+
poliwrath: {
|
251 |
+
inherit: true,
|
252 |
+
baseStats: { hp: 90, atk: 85, def: 95, spa: 70, spd: 70, spe: 70 },
|
253 |
+
},
|
254 |
+
abra: {
|
255 |
+
inherit: true,
|
256 |
+
baseStats: { hp: 25, atk: 20, def: 15, spa: 105, spd: 105, spe: 90 },
|
257 |
+
},
|
258 |
+
kadabra: {
|
259 |
+
inherit: true,
|
260 |
+
baseStats: { hp: 40, atk: 35, def: 30, spa: 120, spd: 120, spe: 105 },
|
261 |
+
},
|
262 |
+
alakazam: {
|
263 |
+
inherit: true,
|
264 |
+
baseStats: { hp: 55, atk: 50, def: 45, spa: 135, spd: 135, spe: 120 },
|
265 |
+
},
|
266 |
+
machop: {
|
267 |
+
inherit: true,
|
268 |
+
baseStats: { hp: 70, atk: 80, def: 50, spa: 35, spd: 35, spe: 35 },
|
269 |
+
},
|
270 |
+
machoke: {
|
271 |
+
inherit: true,
|
272 |
+
baseStats: { hp: 80, atk: 100, def: 70, spa: 50, spd: 50, spe: 45 },
|
273 |
+
},
|
274 |
+
machamp: {
|
275 |
+
inherit: true,
|
276 |
+
baseStats: { hp: 90, atk: 130, def: 80, spa: 65, spd: 65, spe: 55 },
|
277 |
+
},
|
278 |
+
bellsprout: {
|
279 |
+
inherit: true,
|
280 |
+
baseStats: { hp: 50, atk: 75, def: 35, spa: 70, spd: 70, spe: 40 },
|
281 |
+
},
|
282 |
+
weepinbell: {
|
283 |
+
inherit: true,
|
284 |
+
baseStats: { hp: 65, atk: 90, def: 50, spa: 85, spd: 85, spe: 55 },
|
285 |
+
},
|
286 |
+
victreebel: {
|
287 |
+
inherit: true,
|
288 |
+
baseStats: { hp: 80, atk: 105, def: 65, spa: 100, spd: 100, spe: 70 },
|
289 |
+
},
|
290 |
+
tentacool: {
|
291 |
+
inherit: true,
|
292 |
+
baseStats: { hp: 40, atk: 40, def: 35, spa: 100, spd: 100, spe: 70 },
|
293 |
+
},
|
294 |
+
tentacruel: {
|
295 |
+
inherit: true,
|
296 |
+
baseStats: { hp: 80, atk: 70, def: 65, spa: 120, spd: 120, spe: 100 },
|
297 |
+
},
|
298 |
+
geodude: {
|
299 |
+
inherit: true,
|
300 |
+
baseStats: { hp: 40, atk: 80, def: 100, spa: 30, spd: 30, spe: 20 },
|
301 |
+
},
|
302 |
+
graveler: {
|
303 |
+
inherit: true,
|
304 |
+
baseStats: { hp: 55, atk: 95, def: 115, spa: 45, spd: 45, spe: 35 },
|
305 |
+
},
|
306 |
+
golem: {
|
307 |
+
inherit: true,
|
308 |
+
baseStats: { hp: 80, atk: 110, def: 130, spa: 55, spd: 55, spe: 45 },
|
309 |
+
},
|
310 |
+
ponyta: {
|
311 |
+
inherit: true,
|
312 |
+
baseStats: { hp: 50, atk: 85, def: 55, spa: 65, spd: 65, spe: 90 },
|
313 |
+
},
|
314 |
+
rapidash: {
|
315 |
+
inherit: true,
|
316 |
+
baseStats: { hp: 65, atk: 100, def: 70, spa: 80, spd: 80, spe: 105 },
|
317 |
+
},
|
318 |
+
slowpoke: {
|
319 |
+
inherit: true,
|
320 |
+
baseStats: { hp: 90, atk: 65, def: 65, spa: 40, spd: 40, spe: 15 },
|
321 |
+
},
|
322 |
+
slowbro: {
|
323 |
+
inherit: true,
|
324 |
+
baseStats: { hp: 95, atk: 75, def: 110, spa: 80, spd: 80, spe: 30 },
|
325 |
+
},
|
326 |
+
magnemite: {
|
327 |
+
inherit: true,
|
328 |
+
types: ["Electric"],
|
329 |
+
baseStats: { hp: 25, atk: 35, def: 70, spa: 95, spd: 95, spe: 45 },
|
330 |
+
},
|
331 |
+
magneton: {
|
332 |
+
inherit: true,
|
333 |
+
types: ["Electric"],
|
334 |
+
baseStats: { hp: 50, atk: 60, def: 95, spa: 120, spd: 120, spe: 70 },
|
335 |
+
},
|
336 |
+
farfetchd: {
|
337 |
+
inherit: true,
|
338 |
+
baseStats: { hp: 52, atk: 65, def: 55, spa: 58, spd: 58, spe: 60 },
|
339 |
+
},
|
340 |
+
doduo: {
|
341 |
+
inherit: true,
|
342 |
+
baseStats: { hp: 35, atk: 85, def: 45, spa: 35, spd: 35, spe: 75 },
|
343 |
+
},
|
344 |
+
dodrio: {
|
345 |
+
inherit: true,
|
346 |
+
baseStats: { hp: 60, atk: 110, def: 70, spa: 60, spd: 60, spe: 100 },
|
347 |
+
},
|
348 |
+
seel: {
|
349 |
+
inherit: true,
|
350 |
+
baseStats: { hp: 65, atk: 45, def: 55, spa: 70, spd: 70, spe: 45 },
|
351 |
+
},
|
352 |
+
dewgong: {
|
353 |
+
inherit: true,
|
354 |
+
baseStats: { hp: 90, atk: 70, def: 80, spa: 95, spd: 95, spe: 70 },
|
355 |
+
},
|
356 |
+
grimer: {
|
357 |
+
inherit: true,
|
358 |
+
baseStats: { hp: 80, atk: 80, def: 50, spa: 40, spd: 40, spe: 25 },
|
359 |
+
},
|
360 |
+
muk: {
|
361 |
+
inherit: true,
|
362 |
+
baseStats: { hp: 105, atk: 105, def: 75, spa: 65, spd: 65, spe: 50 },
|
363 |
+
},
|
364 |
+
shellder: {
|
365 |
+
inherit: true,
|
366 |
+
baseStats: { hp: 30, atk: 65, def: 100, spa: 45, spd: 45, spe: 40 },
|
367 |
+
},
|
368 |
+
cloyster: {
|
369 |
+
inherit: true,
|
370 |
+
baseStats: { hp: 50, atk: 95, def: 180, spa: 85, spd: 85, spe: 70 },
|
371 |
+
},
|
372 |
+
gastly: {
|
373 |
+
inherit: true,
|
374 |
+
baseStats: { hp: 30, atk: 35, def: 30, spa: 100, spd: 100, spe: 80 },
|
375 |
+
},
|
376 |
+
haunter: {
|
377 |
+
inherit: true,
|
378 |
+
baseStats: { hp: 45, atk: 50, def: 45, spa: 115, spd: 115, spe: 95 },
|
379 |
+
},
|
380 |
+
gengar: {
|
381 |
+
inherit: true,
|
382 |
+
baseStats: { hp: 60, atk: 65, def: 60, spa: 130, spd: 130, spe: 110 },
|
383 |
+
},
|
384 |
+
onix: {
|
385 |
+
inherit: true,
|
386 |
+
baseStats: { hp: 35, atk: 45, def: 160, spa: 30, spd: 30, spe: 70 },
|
387 |
+
},
|
388 |
+
drowzee: {
|
389 |
+
inherit: true,
|
390 |
+
baseStats: { hp: 60, atk: 48, def: 45, spa: 90, spd: 90, spe: 42 },
|
391 |
+
},
|
392 |
+
hypno: {
|
393 |
+
inherit: true,
|
394 |
+
baseStats: { hp: 85, atk: 73, def: 70, spa: 115, spd: 115, spe: 67 },
|
395 |
+
},
|
396 |
+
krabby: {
|
397 |
+
inherit: true,
|
398 |
+
baseStats: { hp: 30, atk: 105, def: 90, spa: 25, spd: 25, spe: 50 },
|
399 |
+
},
|
400 |
+
kingler: {
|
401 |
+
inherit: true,
|
402 |
+
baseStats: { hp: 55, atk: 130, def: 115, spa: 50, spd: 50, spe: 75 },
|
403 |
+
},
|
404 |
+
voltorb: {
|
405 |
+
inherit: true,
|
406 |
+
baseStats: { hp: 40, atk: 30, def: 50, spa: 55, spd: 55, spe: 100 },
|
407 |
+
},
|
408 |
+
electrode: {
|
409 |
+
inherit: true,
|
410 |
+
baseStats: { hp: 60, atk: 50, def: 70, spa: 80, spd: 80, spe: 140 },
|
411 |
+
},
|
412 |
+
exeggcute: {
|
413 |
+
inherit: true,
|
414 |
+
baseStats: { hp: 60, atk: 40, def: 80, spa: 60, spd: 60, spe: 40 },
|
415 |
+
},
|
416 |
+
exeggutor: {
|
417 |
+
inherit: true,
|
418 |
+
baseStats: { hp: 95, atk: 95, def: 85, spa: 125, spd: 125, spe: 55 },
|
419 |
+
},
|
420 |
+
cubone: {
|
421 |
+
inherit: true,
|
422 |
+
baseStats: { hp: 50, atk: 50, def: 95, spa: 40, spd: 40, spe: 35 },
|
423 |
+
},
|
424 |
+
marowak: {
|
425 |
+
inherit: true,
|
426 |
+
baseStats: { hp: 60, atk: 80, def: 110, spa: 50, spd: 50, spe: 45 },
|
427 |
+
},
|
428 |
+
hitmonlee: {
|
429 |
+
inherit: true,
|
430 |
+
baseStats: { hp: 50, atk: 120, def: 53, spa: 35, spd: 35, spe: 87 },
|
431 |
+
},
|
432 |
+
hitmonchan: {
|
433 |
+
inherit: true,
|
434 |
+
baseStats: { hp: 50, atk: 105, def: 79, spa: 35, spd: 35, spe: 76 },
|
435 |
+
},
|
436 |
+
lickitung: {
|
437 |
+
inherit: true,
|
438 |
+
baseStats: { hp: 90, atk: 55, def: 75, spa: 60, spd: 60, spe: 30 },
|
439 |
+
},
|
440 |
+
koffing: {
|
441 |
+
inherit: true,
|
442 |
+
baseStats: { hp: 40, atk: 65, def: 95, spa: 60, spd: 60, spe: 35 },
|
443 |
+
},
|
444 |
+
weezing: {
|
445 |
+
inherit: true,
|
446 |
+
baseStats: { hp: 65, atk: 90, def: 120, spa: 85, spd: 85, spe: 60 },
|
447 |
+
},
|
448 |
+
rhyhorn: {
|
449 |
+
inherit: true,
|
450 |
+
baseStats: { hp: 80, atk: 85, def: 95, spa: 30, spd: 30, spe: 25 },
|
451 |
+
},
|
452 |
+
rhydon: {
|
453 |
+
inherit: true,
|
454 |
+
baseStats: { hp: 105, atk: 130, def: 120, spa: 45, spd: 45, spe: 40 },
|
455 |
+
},
|
456 |
+
chansey: {
|
457 |
+
inherit: true,
|
458 |
+
baseStats: { hp: 250, atk: 5, def: 5, spa: 105, spd: 105, spe: 50 },
|
459 |
+
},
|
460 |
+
tangela: {
|
461 |
+
inherit: true,
|
462 |
+
baseStats: { hp: 65, atk: 55, def: 115, spa: 100, spd: 100, spe: 60 },
|
463 |
+
},
|
464 |
+
kangaskhan: {
|
465 |
+
inherit: true,
|
466 |
+
baseStats: { hp: 105, atk: 95, def: 80, spa: 40, spd: 40, spe: 90 },
|
467 |
+
},
|
468 |
+
horsea: {
|
469 |
+
inherit: true,
|
470 |
+
baseStats: { hp: 30, atk: 40, def: 70, spa: 70, spd: 70, spe: 60 },
|
471 |
+
},
|
472 |
+
seadra: {
|
473 |
+
inherit: true,
|
474 |
+
baseStats: { hp: 55, atk: 65, def: 95, spa: 95, spd: 95, spe: 85 },
|
475 |
+
},
|
476 |
+
goldeen: {
|
477 |
+
inherit: true,
|
478 |
+
baseStats: { hp: 45, atk: 67, def: 60, spa: 50, spd: 50, spe: 63 },
|
479 |
+
},
|
480 |
+
seaking: {
|
481 |
+
inherit: true,
|
482 |
+
baseStats: { hp: 80, atk: 92, def: 65, spa: 80, spd: 80, spe: 68 },
|
483 |
+
},
|
484 |
+
staryu: {
|
485 |
+
inherit: true,
|
486 |
+
baseStats: { hp: 30, atk: 45, def: 55, spa: 70, spd: 70, spe: 85 },
|
487 |
+
},
|
488 |
+
starmie: {
|
489 |
+
inherit: true,
|
490 |
+
baseStats: { hp: 60, atk: 75, def: 85, spa: 100, spd: 100, spe: 115 },
|
491 |
+
},
|
492 |
+
mrmime: {
|
493 |
+
inherit: true,
|
494 |
+
baseStats: { hp: 40, atk: 45, def: 65, spa: 100, spd: 100, spe: 90 },
|
495 |
+
},
|
496 |
+
scyther: {
|
497 |
+
inherit: true,
|
498 |
+
baseStats: { hp: 70, atk: 110, def: 80, spa: 55, spd: 55, spe: 105 },
|
499 |
+
},
|
500 |
+
jynx: {
|
501 |
+
inherit: true,
|
502 |
+
baseStats: { hp: 65, atk: 50, def: 35, spa: 95, spd: 95, spe: 95 },
|
503 |
+
},
|
504 |
+
electabuzz: {
|
505 |
+
inherit: true,
|
506 |
+
baseStats: { hp: 65, atk: 83, def: 57, spa: 85, spd: 85, spe: 105 },
|
507 |
+
},
|
508 |
+
magmar: {
|
509 |
+
inherit: true,
|
510 |
+
baseStats: { hp: 65, atk: 95, def: 57, spa: 85, spd: 85, spe: 93 },
|
511 |
+
},
|
512 |
+
pinsir: {
|
513 |
+
inherit: true,
|
514 |
+
baseStats: { hp: 65, atk: 125, def: 100, spa: 55, spd: 55, spe: 85 },
|
515 |
+
},
|
516 |
+
tauros: {
|
517 |
+
inherit: true,
|
518 |
+
baseStats: { hp: 75, atk: 100, def: 95, spa: 70, spd: 70, spe: 110 },
|
519 |
+
},
|
520 |
+
magikarp: {
|
521 |
+
inherit: true,
|
522 |
+
baseStats: { hp: 20, atk: 10, def: 55, spa: 20, spd: 20, spe: 80 },
|
523 |
+
},
|
524 |
+
gyarados: {
|
525 |
+
inherit: true,
|
526 |
+
baseStats: { hp: 95, atk: 125, def: 79, spa: 100, spd: 100, spe: 81 },
|
527 |
+
},
|
528 |
+
lapras: {
|
529 |
+
inherit: true,
|
530 |
+
baseStats: { hp: 130, atk: 85, def: 80, spa: 95, spd: 95, spe: 60 },
|
531 |
+
},
|
532 |
+
ditto: {
|
533 |
+
inherit: true,
|
534 |
+
baseStats: { hp: 48, atk: 48, def: 48, spa: 48, spd: 48, spe: 48 },
|
535 |
+
},
|
536 |
+
eevee: {
|
537 |
+
inherit: true,
|
538 |
+
baseStats: { hp: 55, atk: 55, def: 50, spa: 65, spd: 65, spe: 55 },
|
539 |
+
},
|
540 |
+
vaporeon: {
|
541 |
+
inherit: true,
|
542 |
+
baseStats: { hp: 130, atk: 65, def: 60, spa: 110, spd: 110, spe: 65 },
|
543 |
+
},
|
544 |
+
jolteon: {
|
545 |
+
inherit: true,
|
546 |
+
baseStats: { hp: 65, atk: 65, def: 60, spa: 110, spd: 110, spe: 130 },
|
547 |
+
},
|
548 |
+
flareon: {
|
549 |
+
inherit: true,
|
550 |
+
baseStats: { hp: 65, atk: 130, def: 60, spa: 110, spd: 110, spe: 65 },
|
551 |
+
},
|
552 |
+
porygon: {
|
553 |
+
inherit: true,
|
554 |
+
baseStats: { hp: 65, atk: 60, def: 70, spa: 75, spd: 75, spe: 40 },
|
555 |
+
},
|
556 |
+
omanyte: {
|
557 |
+
inherit: true,
|
558 |
+
baseStats: { hp: 35, atk: 40, def: 100, spa: 90, spd: 90, spe: 35 },
|
559 |
+
},
|
560 |
+
omastar: {
|
561 |
+
inherit: true,
|
562 |
+
baseStats: { hp: 70, atk: 60, def: 125, spa: 115, spd: 115, spe: 55 },
|
563 |
+
},
|
564 |
+
kabuto: {
|
565 |
+
inherit: true,
|
566 |
+
baseStats: { hp: 30, atk: 80, def: 90, spa: 45, spd: 45, spe: 55 },
|
567 |
+
},
|
568 |
+
kabutops: {
|
569 |
+
inherit: true,
|
570 |
+
baseStats: { hp: 60, atk: 115, def: 105, spa: 70, spd: 70, spe: 80 },
|
571 |
+
},
|
572 |
+
aerodactyl: {
|
573 |
+
inherit: true,
|
574 |
+
baseStats: { hp: 80, atk: 105, def: 65, spa: 60, spd: 60, spe: 130 },
|
575 |
+
},
|
576 |
+
snorlax: {
|
577 |
+
inherit: true,
|
578 |
+
baseStats: { hp: 160, atk: 110, def: 65, spa: 65, spd: 65, spe: 30 },
|
579 |
+
},
|
580 |
+
articuno: {
|
581 |
+
inherit: true,
|
582 |
+
baseStats: { hp: 90, atk: 85, def: 100, spa: 125, spd: 125, spe: 85 },
|
583 |
+
},
|
584 |
+
zapdos: {
|
585 |
+
inherit: true,
|
586 |
+
baseStats: { hp: 90, atk: 90, def: 85, spa: 125, spd: 125, spe: 100 },
|
587 |
+
},
|
588 |
+
moltres: {
|
589 |
+
inherit: true,
|
590 |
+
baseStats: { hp: 90, atk: 100, def: 90, spa: 125, spd: 125, spe: 90 },
|
591 |
+
},
|
592 |
+
dratini: {
|
593 |
+
inherit: true,
|
594 |
+
baseStats: { hp: 41, atk: 64, def: 45, spa: 50, spd: 50, spe: 50 },
|
595 |
+
},
|
596 |
+
dragonair: {
|
597 |
+
inherit: true,
|
598 |
+
baseStats: { hp: 61, atk: 84, def: 65, spa: 70, spd: 70, spe: 70 },
|
599 |
+
},
|
600 |
+
dragonite: {
|
601 |
+
inherit: true,
|
602 |
+
baseStats: { hp: 91, atk: 134, def: 95, spa: 100, spd: 100, spe: 80 },
|
603 |
+
},
|
604 |
+
mewtwo: {
|
605 |
+
inherit: true,
|
606 |
+
baseStats: { hp: 106, atk: 110, def: 90, spa: 154, spd: 154, spe: 130 },
|
607 |
+
},
|
608 |
+
mew: {
|
609 |
+
inherit: true,
|
610 |
+
baseStats: { hp: 100, atk: 100, def: 100, spa: 100, spd: 100, spe: 100 },
|
611 |
+
},
|
612 |
+
};
|
data/mods/gen1/rulesets.ts
ADDED
@@ -0,0 +1,74 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
export const Rulesets: import('../../../sim/dex-formats').ModdedFormatDataTable = {
|
2 |
+
standard: {
|
3 |
+
effectType: 'ValidatorRule',
|
4 |
+
name: 'Standard',
|
5 |
+
ruleset: ['Obtainable', 'Desync Clause Mod', 'Sleep Clause Mod', 'Freeze Clause Mod', 'Species Clause', 'Nickname Clause', 'OHKO Clause', 'Evasion Moves Clause', 'Endless Battle Clause', 'HP Percentage Mod', 'Cancel Mod'],
|
6 |
+
banlist: ['Dig', 'Fly'],
|
7 |
+
},
|
8 |
+
'350cupmod': {
|
9 |
+
effectType: 'Rule',
|
10 |
+
name: '350 Cup Mod',
|
11 |
+
desc: "If a Pokémon's BST is 350 or lower, all of its stats get doubled.",
|
12 |
+
onBegin() {
|
13 |
+
this.add('rule', '350 Cup Mod: If a Pokemon\'s BST is 350 or lower, all of its stats get doubled.');
|
14 |
+
},
|
15 |
+
onModifySpecies(species) {
|
16 |
+
const newSpecies = this.dex.deepClone(species);
|
17 |
+
const bst = newSpecies.bst;
|
18 |
+
if (bst <= 350) {
|
19 |
+
newSpecies.bst = 0;
|
20 |
+
for (const stat in newSpecies.baseStats) {
|
21 |
+
if (stat === 'spd') continue;
|
22 |
+
newSpecies.baseStats[stat] = this.clampIntRange(newSpecies.baseStats[stat] * 2, 1, 255);
|
23 |
+
newSpecies.bst += newSpecies.baseStats[stat];
|
24 |
+
}
|
25 |
+
newSpecies.baseStats['spd'] = newSpecies.baseStats['spa'];
|
26 |
+
}
|
27 |
+
return newSpecies;
|
28 |
+
},
|
29 |
+
},
|
30 |
+
flippedmod: {
|
31 |
+
effectType: 'Rule',
|
32 |
+
name: 'Flipped Mod',
|
33 |
+
desc: "Every Pokémon's stats are reversed. HP becomes Spe, Atk becomes Spc, Def stays the same.",
|
34 |
+
onBegin() {
|
35 |
+
this.add('rule', 'Pokemon have their stats flipped (HP becomes Spe, vice versa).');
|
36 |
+
},
|
37 |
+
onModifySpecies(species) {
|
38 |
+
const newSpecies = this.dex.deepClone(species);
|
39 |
+
const stats: { [k: string]: number } = {
|
40 |
+
hp: newSpecies.baseStats.spe,
|
41 |
+
atk: newSpecies.baseStats.spa,
|
42 |
+
def: newSpecies.baseStats.def,
|
43 |
+
spa: newSpecies.baseStats.atk,
|
44 |
+
spd: newSpecies.baseStats.atk,
|
45 |
+
spe: newSpecies.baseStats.hp,
|
46 |
+
};
|
47 |
+
for (const i in newSpecies.baseStats) {
|
48 |
+
newSpecies.baseStats[i] = stats[i];
|
49 |
+
}
|
50 |
+
return newSpecies;
|
51 |
+
},
|
52 |
+
},
|
53 |
+
scalemonsmod: {
|
54 |
+
effectType: 'Rule',
|
55 |
+
name: 'Scalemons Mod',
|
56 |
+
desc: "Every Pokémon's stats, barring HP, are scaled to give them a BST as close to 500 as possible",
|
57 |
+
onBegin() {
|
58 |
+
this.add('rule', 'Scalemons Mod: Every Pokemon\'s stats, barring HP, are scaled to come as close to a BST of 500 as possible');
|
59 |
+
},
|
60 |
+
onModifySpecies(species, target, source) {
|
61 |
+
const newSpecies = this.dex.deepClone(species);
|
62 |
+
const pst: number = newSpecies.bst - newSpecies.baseStats['hp'];
|
63 |
+
const scale = 500 - newSpecies.baseStats['hp'];
|
64 |
+
newSpecies.bst = newSpecies.baseStats['hp'];
|
65 |
+
for (const stat in newSpecies.baseStats) {
|
66 |
+
if (stat === 'hp' || stat === 'spd') continue;
|
67 |
+
newSpecies.baseStats[stat] = this.clampIntRange(newSpecies.baseStats[stat] * scale / pst, 1, 255);
|
68 |
+
newSpecies.bst += newSpecies.baseStats[stat];
|
69 |
+
}
|
70 |
+
newSpecies.baseStats['spd'] = newSpecies.baseStats['spa'];
|
71 |
+
return newSpecies;
|
72 |
+
},
|
73 |
+
},
|
74 |
+
};
|
data/mods/gen1/scripts.ts
ADDED
@@ -0,0 +1,1022 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/**
|
2 |
+
* Gen 1 mechanics are fairly different to those we know on current gen.
|
3 |
+
* Therefor we need to make a lot of changes to the battle engine for this game simulation.
|
4 |
+
* This generation inherits all the changes from older generations, that must be taken into account when editing code.
|
5 |
+
*/
|
6 |
+
|
7 |
+
const SKIP_LASTDAMAGE = new Set([
|
8 |
+
'confuseray', 'conversion', 'counter', 'focusenergy', 'glare', 'haze', 'leechseed', 'lightscreen',
|
9 |
+
'mimic', 'mist', 'poisongas', 'poisonpowder', 'recover', 'reflect', 'rest', 'softboiled',
|
10 |
+
'splash', 'stunspore', 'substitute', 'supersonic', 'teleport', 'thunderwave', 'toxic', 'transform',
|
11 |
+
]);
|
12 |
+
|
13 |
+
const TWO_TURN_MOVES = ['dig', 'fly', 'razorwind', 'skullbash', 'skyattack', 'solarbeam'];
|
14 |
+
|
15 |
+
export const Scripts: ModdedBattleScriptsData = {
|
16 |
+
inherit: 'gen2',
|
17 |
+
gen: 1,
|
18 |
+
init() {
|
19 |
+
for (const i in this.data.Pokedex) {
|
20 |
+
const poke = this.modData('Pokedex', i);
|
21 |
+
poke.gender = 'N';
|
22 |
+
poke.eggGroups = null;
|
23 |
+
}
|
24 |
+
},
|
25 |
+
// BattlePokemon scripts.
|
26 |
+
pokemon: {
|
27 |
+
inherit: true,
|
28 |
+
getStat(statName, unmodified) {
|
29 |
+
// @ts-expect-error type checking prevents 'hp' from being passed, but we're paranoid
|
30 |
+
if (statName === 'hp') throw new Error("Please read `maxhp` directly");
|
31 |
+
if (unmodified) return this.baseStoredStats[statName];
|
32 |
+
return this.modifiedStats![statName];
|
33 |
+
},
|
34 |
+
// Gen 1 function to apply a stat modification that is only active until the stat is recalculated or mon switched.
|
35 |
+
modifyStat(statName, modifier) {
|
36 |
+
if (!(statName in this.storedStats)) throw new Error("Invalid `statName` passed to `modifyStat`");
|
37 |
+
const modifiedStats = this.battle.clampIntRange(Math.floor(this.modifiedStats![statName] * modifier), 1);
|
38 |
+
this.modifiedStats![statName] = modifiedStats;
|
39 |
+
},
|
40 |
+
// In generation 1, boosting function increases the stored modified stat and checks for opponent's status.
|
41 |
+
boostBy(boost) {
|
42 |
+
let changed: boolean | number = false;
|
43 |
+
let i: BoostID;
|
44 |
+
for (i in boost) {
|
45 |
+
const delta = boost[i];
|
46 |
+
if (delta === undefined) continue;
|
47 |
+
if (delta > 0 && this.boosts[i] >= 6) continue;
|
48 |
+
if (delta < 0 && this.boosts[i] <= -6) continue;
|
49 |
+
if (i === 'evasion' || i === 'accuracy') {
|
50 |
+
this.boosts[i] += delta;
|
51 |
+
if (this.boosts[i] > 6) {
|
52 |
+
this.boosts[i] = 6;
|
53 |
+
}
|
54 |
+
if (this.boosts[i] < -6) {
|
55 |
+
this.boosts[i] = -6;
|
56 |
+
}
|
57 |
+
changed = true;
|
58 |
+
continue;
|
59 |
+
}
|
60 |
+
// Stat being modified is not evasion or accuracy, so change modifiedStats.
|
61 |
+
if (delta > 0) {
|
62 |
+
if (this.modifiedStats![i] === 999) {
|
63 |
+
// Intended max stat value
|
64 |
+
this.boosts[i] += delta;
|
65 |
+
if (this.boosts[i] > 6) {
|
66 |
+
this.boosts[i] = 6;
|
67 |
+
}
|
68 |
+
this.boosts[i]--;
|
69 |
+
// changed = 0 corresponds to increasing stats at 999 (or decreasing at 1).
|
70 |
+
changed = 0;
|
71 |
+
} else {
|
72 |
+
this.boosts[i] += delta;
|
73 |
+
if (this.boosts[i] > 6) {
|
74 |
+
this.boosts[i] = 6;
|
75 |
+
}
|
76 |
+
changed = true;
|
77 |
+
}
|
78 |
+
}
|
79 |
+
if (delta < 0) {
|
80 |
+
if (this.modifiedStats![i] === 1) {
|
81 |
+
// Minimum stat value
|
82 |
+
this.boosts[i] += delta;
|
83 |
+
if (this.boosts[i] < -6) {
|
84 |
+
this.boosts[i] = -6;
|
85 |
+
}
|
86 |
+
this.boosts[i]++;
|
87 |
+
// changed = 0 corresponds to increasing stats at 999 (or decreasing at 1).
|
88 |
+
changed = 0;
|
89 |
+
} else {
|
90 |
+
this.boosts[i] += delta;
|
91 |
+
if (this.boosts[i] < -6) {
|
92 |
+
this.boosts[i] = -6;
|
93 |
+
}
|
94 |
+
changed = true;
|
95 |
+
}
|
96 |
+
}
|
97 |
+
if (changed) {
|
98 |
+
// Recalculate the modified stat
|
99 |
+
this.modifiedStats![i] = this.storedStats[i];
|
100 |
+
if (this.boosts[i] >= 0) {
|
101 |
+
this.modifyStat!(i, [1, 1.5, 2, 2.5, 3, 3.5, 4][this.boosts[i]]);
|
102 |
+
} else {
|
103 |
+
this.modifyStat!(i, [100, 66, 50, 40, 33, 28, 25][-this.boosts[i]] / 100);
|
104 |
+
}
|
105 |
+
if (delta > 0 && this.modifiedStats![i] > 999) {
|
106 |
+
// Cap the stat at 999
|
107 |
+
this.modifiedStats![i] = 999;
|
108 |
+
}
|
109 |
+
}
|
110 |
+
}
|
111 |
+
return changed;
|
112 |
+
},
|
113 |
+
clearBoosts() {
|
114 |
+
let i: BoostID;
|
115 |
+
for (i in this.boosts) {
|
116 |
+
this.boosts[i] = 0;
|
117 |
+
// Recalculate the modified stat
|
118 |
+
if (i === 'evasion' || i === 'accuracy') continue;
|
119 |
+
this.modifiedStats![i] = this.storedStats[i];
|
120 |
+
}
|
121 |
+
},
|
122 |
+
},
|
123 |
+
actions: {
|
124 |
+
inherit: true,
|
125 |
+
// This function is the main one when running a move.
|
126 |
+
// It deals with the beforeMove event.
|
127 |
+
// It also deals with how PP reduction works on gen 1.
|
128 |
+
runMove(moveOrMoveName, pokemon, targetLoc, options) {
|
129 |
+
let sourceEffect = options?.sourceEffect;
|
130 |
+
const target = this.battle.getTarget(pokemon, moveOrMoveName, targetLoc);
|
131 |
+
let move = this.battle.dex.getActiveMove(moveOrMoveName);
|
132 |
+
|
133 |
+
// If a faster partial trapping move misses against a user of Hyper Beam during a recharge turn,
|
134 |
+
// the user of Hyper Beam will automatically use Hyper Beam during that turn.
|
135 |
+
const autoHyperBeam = (
|
136 |
+
move.id === 'recharge' && !pokemon.volatiles['mustrecharge'] && !pokemon.volatiles['partiallytrapped']
|
137 |
+
);
|
138 |
+
if (autoHyperBeam) {
|
139 |
+
move = this.battle.dex.getActiveMove('hyperbeam');
|
140 |
+
this.battle.hint(`In Gen 1, If a faster partial trapping move misses against a user of Hyper Beam during a recharge turn, ` +
|
141 |
+
`the user of Hyper Beam will automatically use Hyper Beam during that turn.`, true);
|
142 |
+
}
|
143 |
+
|
144 |
+
if (target?.subFainted) target.subFainted = null;
|
145 |
+
|
146 |
+
this.battle.setActiveMove(move, pokemon, target);
|
147 |
+
|
148 |
+
if (pokemon.moveThisTurn || !this.battle.runEvent('BeforeMove', pokemon, target, move)) {
|
149 |
+
this.battle.clearActiveMove(true);
|
150 |
+
// This is only run for sleep.
|
151 |
+
this.battle.runEvent('AfterMoveSelf', pokemon, target, move);
|
152 |
+
return;
|
153 |
+
}
|
154 |
+
if (move.beforeMoveCallback) {
|
155 |
+
if (move.beforeMoveCallback.call(this.battle, pokemon, target, move)) {
|
156 |
+
this.battle.clearActiveMove(true);
|
157 |
+
return;
|
158 |
+
}
|
159 |
+
}
|
160 |
+
let lockedMove = this.battle.runEvent('LockMove', pokemon);
|
161 |
+
if (lockedMove === true) lockedMove = false;
|
162 |
+
if (
|
163 |
+
!lockedMove &&
|
164 |
+
(!pokemon.volatiles['partialtrappinglock'] || pokemon.volatiles['partialtrappinglock'].locked !== target)
|
165 |
+
) {
|
166 |
+
pokemon.deductPP(move, null, target);
|
167 |
+
} else {
|
168 |
+
sourceEffect = move;
|
169 |
+
if (pokemon.volatiles['twoturnmove']) {
|
170 |
+
// Two-turn moves like Sky Attack deduct PP on their second turn.
|
171 |
+
pokemon.deductPP(pokemon.volatiles['twoturnmove'].originalMove, null, target);
|
172 |
+
}
|
173 |
+
}
|
174 |
+
if (
|
175 |
+
(pokemon.volatiles['partialtrappinglock'] && target !== pokemon.volatiles['partialtrappinglock'].locked) ||
|
176 |
+
autoHyperBeam
|
177 |
+
) {
|
178 |
+
const moveSlot = pokemon.moveSlots.find(ms => ms.id === move.id);
|
179 |
+
if (moveSlot && moveSlot.pp < 0) {
|
180 |
+
moveSlot.pp = 63;
|
181 |
+
this.battle.hint("In Gen 1, if a player is forced to use a move with 0 PP, the move will underflow to have 63 PP.");
|
182 |
+
}
|
183 |
+
}
|
184 |
+
this.useMove(move, pokemon, { target, sourceEffect });
|
185 |
+
// Restore PP if the move is the first turn of a charging move. Save the move from which PP should be deducted if the move succeeds.
|
186 |
+
if (pokemon.volatiles['twoturnmove']) {
|
187 |
+
pokemon.deductPP(move, -1, target);
|
188 |
+
pokemon.volatiles['twoturnmove'].originalMove = move.id;
|
189 |
+
}
|
190 |
+
},
|
191 |
+
// This function deals with AfterMoveSelf events.
|
192 |
+
// This leads with partial trapping moves shenanigans after the move has been used.
|
193 |
+
useMove(moveOrMoveName, pokemon, options) {
|
194 |
+
let sourceEffect = options?.sourceEffect;
|
195 |
+
let target = options?.target;
|
196 |
+
if (!sourceEffect && this.battle.effect.id) sourceEffect = this.battle.effect;
|
197 |
+
const baseMove = this.battle.dex.moves.get(moveOrMoveName);
|
198 |
+
let move = this.battle.dex.getActiveMove(baseMove);
|
199 |
+
if (target === undefined) target = this.battle.getRandomTarget(pokemon, move);
|
200 |
+
if (move.target === 'self') {
|
201 |
+
target = pokemon;
|
202 |
+
}
|
203 |
+
if (sourceEffect) move.sourceEffect = sourceEffect.id;
|
204 |
+
|
205 |
+
this.battle.singleEvent('ModifyMove', move, null, pokemon, target, move, move);
|
206 |
+
if (baseMove.target !== move.target) {
|
207 |
+
// Target changed in ModifyMove, so we must adjust it here
|
208 |
+
target = this.battle.getRandomTarget(pokemon, move);
|
209 |
+
}
|
210 |
+
move = this.battle.runEvent('ModifyMove', pokemon, target, move, move);
|
211 |
+
if (baseMove.target !== move.target) {
|
212 |
+
// Check again, this shouldn't ever happen on Gen 1.
|
213 |
+
target = this.battle.getRandomTarget(pokemon, move);
|
214 |
+
}
|
215 |
+
// The charging turn of a two-turn move does not update pokemon.lastMove
|
216 |
+
if (!TWO_TURN_MOVES.includes(move.id) || pokemon.volatiles['twoturnmove']) pokemon.lastMove = move;
|
217 |
+
|
218 |
+
const moveResult = this.useMoveInner(moveOrMoveName, pokemon, { target, sourceEffect });
|
219 |
+
|
220 |
+
if (move.id !== 'metronome') {
|
221 |
+
if (move.id !== 'mirrormove' ||
|
222 |
+
(!pokemon.side.foe.active[0]?.lastMove || pokemon.side.foe.active[0].lastMove?.id === 'mirrormove')) {
|
223 |
+
// The move is our 'final' move (a failed Mirror Move, or any move that isn't Metronome or Mirror Move).
|
224 |
+
pokemon.side.lastMove = move;
|
225 |
+
|
226 |
+
if (pokemon.volatiles['lockedmove']?.time <= 0) pokemon.removeVolatile('lockedmove');
|
227 |
+
|
228 |
+
// If target fainted
|
229 |
+
if (target && target.hp <= 0) {
|
230 |
+
// We remove recharge
|
231 |
+
if (pokemon.volatiles['mustrecharge']) pokemon.removeVolatile('mustrecharge');
|
232 |
+
delete pokemon.volatiles['partialtrappinglock'];
|
233 |
+
} else {
|
234 |
+
if (pokemon.volatiles['mustrecharge']) this.battle.add('-mustrecharge', pokemon);
|
235 |
+
if (pokemon.hp) this.battle.runEvent('AfterMoveSelf', pokemon, target, move);
|
236 |
+
}
|
237 |
+
|
238 |
+
// For partial trapping moves, we are saving the target
|
239 |
+
if (move.volatileStatus === 'partiallytrapped' && target && target.hp > 0) {
|
240 |
+
// Let's check if the lock exists
|
241 |
+
if (pokemon.volatiles['partialtrappinglock'] && target.volatiles['partiallytrapped']) {
|
242 |
+
// Here the partialtrappinglock volatile has been already applied
|
243 |
+
const sourceVolatile = pokemon.volatiles['partialtrappinglock'];
|
244 |
+
const targetVolatile = target.volatiles['partiallytrapped'];
|
245 |
+
if (!sourceVolatile.locked) {
|
246 |
+
// If it's the first hit, we save the target
|
247 |
+
sourceVolatile.locked = target;
|
248 |
+
} else if (target !== pokemon && target !== sourceVolatile.locked) {
|
249 |
+
// Our target switched out! Re-roll the duration, damage, and accuracy.
|
250 |
+
const duration = this.battle.sample([2, 2, 2, 3, 3, 3, 4, 5]);
|
251 |
+
sourceVolatile.duration = duration;
|
252 |
+
sourceVolatile.locked = target;
|
253 |
+
// Duration reset thus partially trapped at 2 always.
|
254 |
+
targetVolatile.duration = 2;
|
255 |
+
}
|
256 |
+
} // If we move to here, the move failed and there's no partial trapping lock.
|
257 |
+
}
|
258 |
+
}
|
259 |
+
}
|
260 |
+
return moveResult;
|
261 |
+
},
|
262 |
+
// This is the function that actually uses the move, running ModifyMove events.
|
263 |
+
// It uses the move and then deals with the effects after the move.
|
264 |
+
useMoveInner(moveOrMoveName, pokemon, options) {
|
265 |
+
let sourceEffect = options?.sourceEffect;
|
266 |
+
let target = options?.target;
|
267 |
+
if (!sourceEffect && this.battle.effect.id) sourceEffect = this.battle.effect;
|
268 |
+
const baseMove = this.battle.dex.moves.get(moveOrMoveName);
|
269 |
+
let move = this.battle.dex.getActiveMove(baseMove);
|
270 |
+
if (target === undefined) target = this.battle.getRandomTarget(pokemon, move);
|
271 |
+
if (move.target === 'self') {
|
272 |
+
target = pokemon;
|
273 |
+
}
|
274 |
+
if (sourceEffect) move.sourceEffect = sourceEffect.id;
|
275 |
+
|
276 |
+
this.battle.setActiveMove(move, pokemon, target);
|
277 |
+
|
278 |
+
this.battle.singleEvent('ModifyMove', move, null, pokemon, target, move, move);
|
279 |
+
if (baseMove.target !== move.target) {
|
280 |
+
// Target changed in ModifyMove, so we must adjust it here
|
281 |
+
target = this.battle.getRandomTarget(pokemon, move);
|
282 |
+
}
|
283 |
+
move = this.battle.runEvent('ModifyMove', pokemon, target, move, move);
|
284 |
+
if (baseMove.target !== move.target) {
|
285 |
+
// Check again, this shouldn't ever happen on Gen 1.
|
286 |
+
target = this.battle.getRandomTarget(pokemon, move);
|
287 |
+
this.battle.debug('not a gen 1 mechanic');
|
288 |
+
}
|
289 |
+
if (!move) return false;
|
290 |
+
|
291 |
+
let attrs = '';
|
292 |
+
if (pokemon.fainted) {
|
293 |
+
return false;
|
294 |
+
}
|
295 |
+
|
296 |
+
if (sourceEffect) attrs += `|[from]${this.battle.dex.conditions.get(sourceEffect)}`;
|
297 |
+
this.battle.addMove('move', pokemon, move.name, `${target}${attrs}`);
|
298 |
+
|
299 |
+
if (!this.battle.singleEvent('Try', move, null, pokemon, target, move)) {
|
300 |
+
return true;
|
301 |
+
}
|
302 |
+
if (!this.battle.singleEvent('TryMove', move, null, pokemon, target, move) ||
|
303 |
+
!this.battle.runEvent('TryMove', pokemon, target, move)) {
|
304 |
+
return true;
|
305 |
+
}
|
306 |
+
|
307 |
+
if (move.ignoreImmunity === undefined) {
|
308 |
+
move.ignoreImmunity = (move.category === 'Status');
|
309 |
+
}
|
310 |
+
|
311 |
+
let damage: number | undefined | false | '' = false;
|
312 |
+
if (!target || target.fainted) {
|
313 |
+
this.battle.attrLastMove('[notarget]');
|
314 |
+
this.battle.add('-notarget');
|
315 |
+
return true;
|
316 |
+
}
|
317 |
+
// Store 0 damage for last damage if the move is not in the array.
|
318 |
+
if (!SKIP_LASTDAMAGE.has(move.id)) this.battle.lastDamage = 0;
|
319 |
+
|
320 |
+
damage = this.tryMoveHit(target, pokemon, move);
|
321 |
+
|
322 |
+
// Disable and Selfdestruct/Explosion boost rage, regardless of whether they miss/fail.
|
323 |
+
if (target.boosts.atk < 6 && (move.selfdestruct || move.id === 'disable') && target.volatiles['rage']) {
|
324 |
+
this.battle.boost({ atk: 1 }, target, pokemon, this.dex.conditions.get('rage'));
|
325 |
+
this.battle.hint(`In Gen 1, using ${move.name} causes the target to build Rage, ` +
|
326 |
+
`even if it misses or fails`, true);
|
327 |
+
}
|
328 |
+
|
329 |
+
// Go ahead with results of the used move.
|
330 |
+
if (damage === false) {
|
331 |
+
this.battle.singleEvent('MoveFail', move, null, target, pokemon, move);
|
332 |
+
return true;
|
333 |
+
}
|
334 |
+
|
335 |
+
if (!move.negateSecondary) {
|
336 |
+
this.battle.singleEvent('AfterMoveSecondarySelf', move, null, pokemon, target, move);
|
337 |
+
this.battle.runEvent('AfterMoveSecondarySelf', pokemon, target, move);
|
338 |
+
}
|
339 |
+
return true;
|
340 |
+
},
|
341 |
+
// This function attempts a move hit and returns the attempt result before the actual hit happens.
|
342 |
+
// It deals with partial trapping weirdness and accuracy bugs as well.
|
343 |
+
tryMoveHit(target, pokemon, move) {
|
344 |
+
let damage: number | false | undefined = 0;
|
345 |
+
|
346 |
+
// Add Thrashing effect before the move does damage, or add confusion if Thrash effect is ending
|
347 |
+
if (move?.self?.volatileStatus === 'lockedmove') {
|
348 |
+
if (pokemon.volatiles['lockedmove']) {
|
349 |
+
pokemon.volatiles['lockedmove'].time--;
|
350 |
+
if (!pokemon.volatiles['lockedmove'].time) {
|
351 |
+
// Confusion begins even if already confused.
|
352 |
+
// Remove lockedmove volatile when dealing with after move effects.
|
353 |
+
delete pokemon.volatiles['confusion'];
|
354 |
+
pokemon.addVolatile('confusion', pokemon, this.dex.conditions.get('lockedmove'));
|
355 |
+
}
|
356 |
+
} else {
|
357 |
+
pokemon.addVolatile('lockedmove', pokemon, move);
|
358 |
+
}
|
359 |
+
}
|
360 |
+
|
361 |
+
// First, check if the target is semi-invulnerable
|
362 |
+
let hitResult = this.battle.runEvent('Invulnerability', target, pokemon, move);
|
363 |
+
if (hitResult === false) {
|
364 |
+
this.battle.attrLastMove('[miss]');
|
365 |
+
this.battle.add('-miss', pokemon);
|
366 |
+
if (move.selfdestruct) {
|
367 |
+
this.battle.faint(pokemon, pokemon, move);
|
368 |
+
}
|
369 |
+
return false;
|
370 |
+
}
|
371 |
+
|
372 |
+
// Then, check if the Pokémon is immune to this move.
|
373 |
+
if (
|
374 |
+
(!move.ignoreImmunity || (move.ignoreImmunity !== true && !move.ignoreImmunity[move.type])) &&
|
375 |
+
!target.runImmunity(move.type, true)
|
376 |
+
) {
|
377 |
+
if (move.selfdestruct) {
|
378 |
+
this.battle.faint(pokemon, pokemon, move);
|
379 |
+
}
|
380 |
+
return false;
|
381 |
+
}
|
382 |
+
hitResult = this.battle.singleEvent('TryImmunity', move, null, target, pokemon, move);
|
383 |
+
if (hitResult === false) {
|
384 |
+
this.battle.add('-immune', target);
|
385 |
+
return false;
|
386 |
+
}
|
387 |
+
|
388 |
+
// Now, let's calculate the accuracy.
|
389 |
+
let accuracy = move.accuracy;
|
390 |
+
|
391 |
+
// Partial trapping moves: true accuracy while it lasts
|
392 |
+
if (move.volatileStatus === 'partiallytrapped' && target === pokemon.volatiles['partialtrappinglock']?.locked) {
|
393 |
+
accuracy = true;
|
394 |
+
}
|
395 |
+
|
396 |
+
// If a sleep inducing move is used while the user is recharging, the accuracy is true.
|
397 |
+
if (move.status === 'slp' && target?.volatiles['mustrecharge']) {
|
398 |
+
accuracy = true;
|
399 |
+
}
|
400 |
+
|
401 |
+
// OHKO moves only have a chance to hit if the user is at least as fast as the target
|
402 |
+
if (move.ohko) {
|
403 |
+
if (target.getStat('spe') > pokemon.getStat('spe')) {
|
404 |
+
this.battle.add('-immune', target, '[ohko]');
|
405 |
+
return false;
|
406 |
+
}
|
407 |
+
}
|
408 |
+
|
409 |
+
// Calculate true accuracy for gen 1, which uses 0-255.
|
410 |
+
// Gen 1 uses the same boost table for accuracy and evasiveness as every other stat
|
411 |
+
const boostTable = [25, 28, 33, 40, 50, 66, 100, 150, 200, 250, 300, 350, 400];
|
412 |
+
if (accuracy !== true) {
|
413 |
+
accuracy = Math.floor(accuracy * 255 / 100);
|
414 |
+
// Rage and Thrash/Petal Dance accuracy bug
|
415 |
+
if (pokemon.volatiles['lockedmove']) accuracy = pokemon.volatiles['lockedmove'].accuracy;
|
416 |
+
if (pokemon.volatiles['rage']) accuracy = pokemon.volatiles['rage'].accuracy;
|
417 |
+
|
418 |
+
// This line is just to satisfy TypeScript, accuracy should never be true at this point
|
419 |
+
if (accuracy !== true) {
|
420 |
+
// Check also for accuracy modifiers.
|
421 |
+
if (!move.ignoreAccuracy) {
|
422 |
+
accuracy = Math.floor(accuracy * (boostTable[pokemon.boosts.accuracy + 6] / 100));
|
423 |
+
}
|
424 |
+
if (!move.ignoreEvasion) {
|
425 |
+
accuracy = Math.floor(accuracy * (boostTable[-target.boosts.evasion + 6] / 100));
|
426 |
+
}
|
427 |
+
accuracy = this.battle.clampIntRange(accuracy, 1, 255);
|
428 |
+
}
|
429 |
+
if (pokemon.volatiles['lockedmove']) pokemon.volatiles['lockedmove'].accuracy = accuracy;
|
430 |
+
if (pokemon.volatiles['rage']) pokemon.volatiles['rage'].accuracy = accuracy;
|
431 |
+
}
|
432 |
+
accuracy = this.battle.runEvent('Accuracy', target, pokemon, move, accuracy);
|
433 |
+
// Moves that target the user do not suffer from the 1/256 miss chance.
|
434 |
+
if (move.target === 'self' && accuracy !== true) accuracy++;
|
435 |
+
// 1/256 chance of missing always, no matter what. Besides the aforementioned exceptions.
|
436 |
+
if (accuracy !== true && !this.battle.randomChance(accuracy, 256)) {
|
437 |
+
this.battle.attrLastMove('[miss]');
|
438 |
+
this.battle.add('-miss', pokemon);
|
439 |
+
if (accuracy === 255) this.battle.hint("In Gen 1, moves with 100% accuracy can still miss 1/256 of the time.");
|
440 |
+
damage = false;
|
441 |
+
this.battle.lastDamage = 0;
|
442 |
+
}
|
443 |
+
|
444 |
+
// If damage is 0 and not false it means it didn't miss, let's calc.
|
445 |
+
if (damage !== false) {
|
446 |
+
if (move.multihit) {
|
447 |
+
let hits = move.multihit;
|
448 |
+
if (Array.isArray(hits)) {
|
449 |
+
// Yes, it's hardcoded... meh
|
450 |
+
if (hits[0] === 2 && hits[1] === 5) {
|
451 |
+
hits = this.battle.sample([2, 2, 2, 3, 3, 3, 4, 5]);
|
452 |
+
} else {
|
453 |
+
hits = this.battle.random(hits[0], hits[1] + 1);
|
454 |
+
}
|
455 |
+
}
|
456 |
+
hits = Math.floor(hits);
|
457 |
+
// In gen 1, all the hits have the same damage for multihits move
|
458 |
+
let moveDamage: number | undefined | false = 0;
|
459 |
+
let i: number;
|
460 |
+
for (i = 0; i < hits && target.hp && pokemon.hp; i++) {
|
461 |
+
move.hit = i + 1;
|
462 |
+
if (move.hit === hits) move.lastHit = true;
|
463 |
+
moveDamage = this.moveHit(target, pokemon, move);
|
464 |
+
if (moveDamage === false) break;
|
465 |
+
damage = (moveDamage || 0);
|
466 |
+
// Move damage is fixed to be the first move's damage
|
467 |
+
if (i === 0) move.damage = damage;
|
468 |
+
if (target.subFainted) {
|
469 |
+
i++;
|
470 |
+
break;
|
471 |
+
}
|
472 |
+
}
|
473 |
+
move.damage = null;
|
474 |
+
if (i === 0) return 1;
|
475 |
+
this.battle.add('-hitcount', target, i);
|
476 |
+
} else {
|
477 |
+
damage = this.moveHit(target, pokemon, move);
|
478 |
+
}
|
479 |
+
}
|
480 |
+
|
481 |
+
if (move.category !== 'Status') {
|
482 |
+
target.gotAttacked(move, damage, pokemon);
|
483 |
+
}
|
484 |
+
|
485 |
+
if (move.selfdestruct) {
|
486 |
+
if (!target.subFainted) {
|
487 |
+
this.battle.faint(pokemon, pokemon, move);
|
488 |
+
} else {
|
489 |
+
this.battle.hint(`In Gen 1, the user of ${move.name} will not take damage if it breaks a Substitute.`);
|
490 |
+
}
|
491 |
+
}
|
492 |
+
|
493 |
+
// The move missed.
|
494 |
+
if (damage === false) {
|
495 |
+
// Delete the partial trap lock if necessary.
|
496 |
+
delete pokemon.volatiles['partialtrappinglock'];
|
497 |
+
return false;
|
498 |
+
}
|
499 |
+
|
500 |
+
if (move.ohko) this.battle.add('-ohko');
|
501 |
+
|
502 |
+
if (!move.negateSecondary) {
|
503 |
+
this.battle.singleEvent('AfterMoveSecondary', move, null, target, pokemon, move);
|
504 |
+
this.battle.runEvent('AfterMoveSecondary', target, pokemon, move);
|
505 |
+
}
|
506 |
+
|
507 |
+
return damage;
|
508 |
+
},
|
509 |
+
// It deals with the actual move hit, as the name indicates, dealing damage and/or effects.
|
510 |
+
// This function also deals with the Gen 1 Substitute behaviour on the hitting process.
|
511 |
+
moveHit(target, pokemon, move, moveData, isSecondary, isSelf) {
|
512 |
+
let damage: number | false | null | undefined = 0;
|
513 |
+
|
514 |
+
if (!isSecondary && !isSelf) this.battle.setActiveMove(move, pokemon, target);
|
515 |
+
let hitResult: number | boolean = true;
|
516 |
+
if (!moveData) moveData = move;
|
517 |
+
|
518 |
+
if (move.ignoreImmunity === undefined) {
|
519 |
+
move.ignoreImmunity = (move.category === 'Status');
|
520 |
+
}
|
521 |
+
|
522 |
+
// We get the sub to the target to see if it existed
|
523 |
+
const targetSub = (target) ? target.volatiles['substitute'] : false;
|
524 |
+
const targetHadSub = (targetSub !== null && targetSub !== false && (typeof targetSub !== 'undefined'));
|
525 |
+
let targetHasSub: boolean | undefined = undefined;
|
526 |
+
|
527 |
+
if (target) {
|
528 |
+
hitResult = this.battle.singleEvent('TryHit', moveData, {}, target, pokemon, move);
|
529 |
+
|
530 |
+
// Handle here the applying of partial trapping moves to Pokémon with Substitute
|
531 |
+
if (targetSub && moveData.volatileStatus && moveData.volatileStatus === 'partiallytrapped') {
|
532 |
+
target.addVolatile(moveData.volatileStatus, pokemon, move);
|
533 |
+
if (!pokemon.volatiles['partialtrappinglock'] || pokemon.volatiles['partialtrappinglock'].duration! > 1) {
|
534 |
+
target.volatiles[moveData.volatileStatus].duration = 2;
|
535 |
+
}
|
536 |
+
}
|
537 |
+
|
538 |
+
if (!hitResult) {
|
539 |
+
if (hitResult === false) this.battle.add('-fail', target);
|
540 |
+
return false;
|
541 |
+
}
|
542 |
+
|
543 |
+
// Only run the hit events for the hit itself, not the secondary or self hits
|
544 |
+
if (!isSelf && !isSecondary) {
|
545 |
+
hitResult = this.battle.runEvent('TryHit', target, pokemon, move);
|
546 |
+
if (!hitResult) {
|
547 |
+
if (hitResult === false) this.battle.add('-fail', target);
|
548 |
+
// Special Substitute hit flag
|
549 |
+
if (hitResult !== 0) {
|
550 |
+
return false;
|
551 |
+
}
|
552 |
+
}
|
553 |
+
if (!this.battle.runEvent('TryFieldHit', target, pokemon, move)) {
|
554 |
+
return false;
|
555 |
+
}
|
556 |
+
} else if (isSecondary && !moveData.self) {
|
557 |
+
hitResult = this.battle.runEvent('TrySecondaryHit', target, pokemon, moveData);
|
558 |
+
}
|
559 |
+
|
560 |
+
if (hitResult === 0) {
|
561 |
+
targetHasSub = !!(target?.volatiles['substitute']);
|
562 |
+
target = null;
|
563 |
+
} else if (!hitResult) {
|
564 |
+
if (hitResult === false) this.battle.add('-fail', target);
|
565 |
+
return false;
|
566 |
+
}
|
567 |
+
}
|
568 |
+
|
569 |
+
if (target) {
|
570 |
+
let didSomething = false;
|
571 |
+
|
572 |
+
damage = this.getDamage(pokemon, target, moveData);
|
573 |
+
|
574 |
+
// getDamage has several possible return values:
|
575 |
+
//
|
576 |
+
// a number:
|
577 |
+
// means that much damage is dealt (0 damage still counts as dealing
|
578 |
+
// damage for the purposes of things like Static)
|
579 |
+
// false:
|
580 |
+
// gives error message: "But it failed!" and move ends
|
581 |
+
// null:
|
582 |
+
// the move ends, with no message (usually, a custom fail message
|
583 |
+
// was already output by an event handler)
|
584 |
+
// undefined:
|
585 |
+
// means no damage is dealt and the move continues
|
586 |
+
//
|
587 |
+
// basically, these values have the same meanings as they do for event
|
588 |
+
// handlers.
|
589 |
+
|
590 |
+
if (damage && damage > target.hp) {
|
591 |
+
damage = target.hp;
|
592 |
+
}
|
593 |
+
if ((damage || damage === 0) && !target.fainted) {
|
594 |
+
damage = this.battle.damage(damage, target, pokemon, move);
|
595 |
+
if (!(damage || damage === 0)) return false;
|
596 |
+
didSomething = true;
|
597 |
+
} else if (damage === false && typeof hitResult === 'undefined') {
|
598 |
+
this.battle.add('-fail', target);
|
599 |
+
}
|
600 |
+
if (damage === false || damage === null) {
|
601 |
+
return false;
|
602 |
+
}
|
603 |
+
if (moveData.boosts && target.hp) {
|
604 |
+
const willBoost = this.battle.boost(moveData.boosts, target, pokemon, move);
|
605 |
+
if (!willBoost) {
|
606 |
+
this.battle.add('-fail', target);
|
607 |
+
return false;
|
608 |
+
}
|
609 |
+
didSomething = true;
|
610 |
+
// Check the status of the Pokémon whose turn is not.
|
611 |
+
// When a move that affects stat levels is used, if the Pokémon whose turn it is not right now is paralyzed or
|
612 |
+
// burned, the correspoding stat penalties will be applied again to that Pokémon.
|
613 |
+
if (pokemon.side.foe.active[0].status) {
|
614 |
+
// If it's paralysed, quarter its speed.
|
615 |
+
if (pokemon.side.foe.active[0].status === 'par') {
|
616 |
+
pokemon.side.foe.active[0].modifyStat!('spe', 0.25);
|
617 |
+
}
|
618 |
+
// If it's burned, halve its attack.
|
619 |
+
if (pokemon.side.foe.active[0].status === 'brn') {
|
620 |
+
pokemon.side.foe.active[0].modifyStat!('atk', 0.5);
|
621 |
+
}
|
622 |
+
}
|
623 |
+
}
|
624 |
+
if (moveData.heal && !target.fainted) {
|
625 |
+
const d = target.heal(Math.floor(target.maxhp * moveData.heal[0] / moveData.heal[1]));
|
626 |
+
if (!d) {
|
627 |
+
this.battle.add('-fail', target);
|
628 |
+
return false;
|
629 |
+
}
|
630 |
+
this.battle.add('-heal', target, target.getHealth);
|
631 |
+
didSomething = true;
|
632 |
+
}
|
633 |
+
if (moveData.status) {
|
634 |
+
// Gen 1 bug: If the target has just used hyperbeam and must recharge, its status will be ignored and put to sleep.
|
635 |
+
// This does NOT revert the paralyse speed drop or the burn attack drop.
|
636 |
+
// Also, being put to sleep clears the recharge condition.
|
637 |
+
if (moveData.status === 'slp' && target.volatiles['mustrecharge']) {
|
638 |
+
// The sleep move is guaranteed to hit in this situation, unless Sleep Clause activates.
|
639 |
+
// Do not clear recharge in that case.
|
640 |
+
if (target.setStatus(moveData.status, pokemon, move)) {
|
641 |
+
target.removeVolatile('mustrecharge');
|
642 |
+
this.battle.hint(
|
643 |
+
"In Gen 1, if a Pokémon that has just used Hyper Beam and has yet to recharge is targeted with a sleep inducing move, " +
|
644 |
+
"any other status it may already have will be ignored and sleep will be induced regardless."
|
645 |
+
);
|
646 |
+
}
|
647 |
+
} else if (!target.status) {
|
648 |
+
if (target.setStatus(moveData.status, pokemon, move)) {
|
649 |
+
// Gen 1 mechanics: The burn attack drop and the paralyse speed drop are applied here directly on stat modifiers.
|
650 |
+
if (moveData.status === 'brn') target.modifyStat!('atk', 0.5);
|
651 |
+
if (moveData.status === 'par') target.modifyStat!('spe', 0.25);
|
652 |
+
}
|
653 |
+
} else if (!isSecondary) {
|
654 |
+
if (target.status === moveData.status) {
|
655 |
+
this.battle.add('-fail', target, target.status);
|
656 |
+
} else {
|
657 |
+
this.battle.add('-fail', target);
|
658 |
+
}
|
659 |
+
}
|
660 |
+
didSomething = true;
|
661 |
+
}
|
662 |
+
if (moveData.forceStatus) {
|
663 |
+
if (target.setStatus(moveData.forceStatus, pokemon, move)) {
|
664 |
+
if (moveData.forceStatus === 'brn') target.modifyStat!('atk', 0.5);
|
665 |
+
if (moveData.forceStatus === 'par') target.modifyStat!('spe', 0.25);
|
666 |
+
didSomething = true;
|
667 |
+
}
|
668 |
+
}
|
669 |
+
if (moveData.volatileStatus) {
|
670 |
+
if (target.addVolatile(moveData.volatileStatus, pokemon, move)) {
|
671 |
+
didSomething = true;
|
672 |
+
}
|
673 |
+
}
|
674 |
+
if (moveData.sideCondition) {
|
675 |
+
if (target.side.addSideCondition(moveData.sideCondition, pokemon, move)) {
|
676 |
+
didSomething = true;
|
677 |
+
}
|
678 |
+
}
|
679 |
+
if (moveData.pseudoWeather) {
|
680 |
+
if (this.battle.field.addPseudoWeather(moveData.pseudoWeather, pokemon, move)) {
|
681 |
+
didSomething = true;
|
682 |
+
}
|
683 |
+
}
|
684 |
+
// Hit events
|
685 |
+
hitResult = this.battle.singleEvent('Hit', moveData, {}, target, pokemon, move);
|
686 |
+
if (!isSelf && !isSecondary) {
|
687 |
+
this.battle.runEvent('Hit', target, pokemon, move);
|
688 |
+
}
|
689 |
+
if (!hitResult && !didSomething) {
|
690 |
+
if (hitResult === false) this.battle.add('-fail', target);
|
691 |
+
return false;
|
692 |
+
}
|
693 |
+
}
|
694 |
+
if (targetHasSub === undefined) targetHasSub = !!(target?.volatiles['substitute']);
|
695 |
+
|
696 |
+
// Here's where self effects are applied.
|
697 |
+
const doSelf = (targetHadSub && targetHasSub) || !targetHadSub;
|
698 |
+
if (moveData.self && (moveData.self.volatileStatus !== 'lockedmove') &&
|
699 |
+
(doSelf || moveData.self.volatileStatus === 'partialtrappinglock')) {
|
700 |
+
this.moveHit(pokemon, pokemon, move, moveData.self, isSecondary, true);
|
701 |
+
}
|
702 |
+
|
703 |
+
// Now we can save the partial trapping damage.
|
704 |
+
if (pokemon.volatiles['partialtrappinglock']) {
|
705 |
+
pokemon.volatiles['partialtrappinglock'].damage = this.battle.lastDamage;
|
706 |
+
}
|
707 |
+
|
708 |
+
// Apply move secondaries.
|
709 |
+
if (moveData.secondaries && target && target.hp > 0) {
|
710 |
+
for (const secondary of moveData.secondaries) {
|
711 |
+
// Multi-hit moves only roll for status once
|
712 |
+
if (!move.multihit || move.lastHit) {
|
713 |
+
// We check here whether to negate the probable secondary status if it's para, burn, or freeze.
|
714 |
+
// In the game, this is checked and if true, the random number generator is not called.
|
715 |
+
// That means that a move that does not share the type of the target can status it.
|
716 |
+
// If a move that was not fire-type would exist on Gen 1, it could burn a Pokémon.
|
717 |
+
if (!(secondary.status && ['par', 'brn', 'frz'].includes(secondary.status) && target.hasType(move.type))) {
|
718 |
+
if (secondary.chance === undefined) {
|
719 |
+
this.moveHit(target, pokemon, move, secondary, true, isSelf);
|
720 |
+
} else {
|
721 |
+
let secondaryChance = Math.ceil(secondary.chance * 256 / 100);
|
722 |
+
// If the secondary effect is confusion, the numerator should be decreased by 1 (10% = 25/256 not 26/256).
|
723 |
+
if (secondary?.volatileStatus === 'confusion') secondaryChance--;
|
724 |
+
if (this.battle.randomChance(secondaryChance, 256)) {
|
725 |
+
this.moveHit(target, pokemon, move, secondary, true, isSelf);
|
726 |
+
}
|
727 |
+
}
|
728 |
+
}
|
729 |
+
}
|
730 |
+
}
|
731 |
+
}
|
732 |
+
if (move.selfSwitch && pokemon.hp) {
|
733 |
+
pokemon.switchFlag = move.selfSwitch === true ? true : this.dex.toID(move.selfSwitch);
|
734 |
+
}
|
735 |
+
|
736 |
+
return damage;
|
737 |
+
},
|
738 |
+
// This calculates the damage pokemon does to target with move.
|
739 |
+
getDamage(source, target, move, suppressMessages) {
|
740 |
+
// First of all, we get the move.
|
741 |
+
if (typeof move === 'string') {
|
742 |
+
move = this.battle.dex.getActiveMove(move);
|
743 |
+
} else if (typeof move === 'number') {
|
744 |
+
move = {
|
745 |
+
basePower: move,
|
746 |
+
type: '???',
|
747 |
+
category: 'Physical',
|
748 |
+
willCrit: false,
|
749 |
+
flags: {},
|
750 |
+
} as ActiveMove;
|
751 |
+
}
|
752 |
+
|
753 |
+
// Let's see if the target is immune to the move.
|
754 |
+
if (!move.ignoreImmunity || (move.ignoreImmunity !== true && !move.ignoreImmunity[move.type])) {
|
755 |
+
if (!target.runImmunity(move.type, true)) {
|
756 |
+
return false;
|
757 |
+
}
|
758 |
+
}
|
759 |
+
|
760 |
+
// Is it an OHKO move?
|
761 |
+
if (move.ohko) {
|
762 |
+
return 65535;
|
763 |
+
}
|
764 |
+
|
765 |
+
// We edit the damage through move's damage callback if necessary.
|
766 |
+
if (move.damageCallback) {
|
767 |
+
return move.damageCallback.call(this.battle, source, target);
|
768 |
+
}
|
769 |
+
|
770 |
+
// We take damage from damage=level moves (seismic toss).
|
771 |
+
if (move.damage === 'level') {
|
772 |
+
return source.level;
|
773 |
+
}
|
774 |
+
|
775 |
+
// If there's a fix move damage, we return that.
|
776 |
+
if (move.damage || move.damage === 0) {
|
777 |
+
return move.damage;
|
778 |
+
}
|
779 |
+
|
780 |
+
// If it's the first hit on a Normal-type partially trap move, it hits Ghosts anyways but damage is 0.
|
781 |
+
if (move.volatileStatus === 'partiallytrapped' && move.type === 'Normal' && target.hasType('Ghost')) {
|
782 |
+
return 0;
|
783 |
+
}
|
784 |
+
|
785 |
+
// Let's check if we are in middle of a partial trap sequence to return the previous damage.
|
786 |
+
if (source.volatiles['partialtrappinglock'] && (target === source.volatiles['partialtrappinglock'].locked)) {
|
787 |
+
return source.volatiles['partialtrappinglock'].damage;
|
788 |
+
}
|
789 |
+
|
790 |
+
// We check the category and typing to calculate later on the damage.
|
791 |
+
if (!move.category) move.category = 'Physical';
|
792 |
+
// '???' is typeless damage: used for Struggle and Confusion etc
|
793 |
+
if (!move.type) move.type = '???';
|
794 |
+
const type = move.type;
|
795 |
+
|
796 |
+
// We get the base power and apply basePowerCallback if necessary.
|
797 |
+
let basePower: number | false | null = move.basePower;
|
798 |
+
if (move.basePowerCallback) {
|
799 |
+
basePower = move.basePowerCallback.call(this.battle, source, target, move);
|
800 |
+
}
|
801 |
+
if (!basePower) {
|
802 |
+
return basePower === 0 ? undefined : basePower;
|
803 |
+
}
|
804 |
+
basePower = this.battle.clampIntRange(basePower, 1);
|
805 |
+
|
806 |
+
// Checking for the move's Critical Hit possibility. We check if it's a 100% crit move, otherwise we calculate the chance.
|
807 |
+
let isCrit = move.willCrit || false;
|
808 |
+
if (!isCrit) {
|
809 |
+
// In gen 1, the critical chance is based on speed.
|
810 |
+
// First, we get the base speed, divide it by 2 and floor it. This is our current crit chance.
|
811 |
+
let critChance = Math.floor(this.dex.species.get(source.set.species).baseStats['spe'] / 2);
|
812 |
+
|
813 |
+
// Now we check for focus energy volatile.
|
814 |
+
if (source.volatiles['focusenergy']) {
|
815 |
+
// If it exists, crit chance is divided by 2 again and floored.
|
816 |
+
critChance = Math.floor(critChance / 2);
|
817 |
+
} else {
|
818 |
+
// Normally, without focus energy, crit chance is multiplied by 2 and capped at 255 here.
|
819 |
+
critChance = this.battle.clampIntRange(critChance * 2, 1, 255);
|
820 |
+
}
|
821 |
+
|
822 |
+
// Now we check for the move's critical hit ratio.
|
823 |
+
if (move.critRatio === 1) {
|
824 |
+
// Normal hit ratio, we divide the crit chance by 2 and floor the result again.
|
825 |
+
critChance = Math.floor(critChance / 2);
|
826 |
+
} else if (move.critRatio === 2) {
|
827 |
+
// High crit ratio, we multiply the result so far by 4 and cap it at 255.
|
828 |
+
critChance = this.battle.clampIntRange(critChance * 4, 1, 255);
|
829 |
+
}
|
830 |
+
|
831 |
+
// Last, we check deppending on ratio if the move critical hits or not.
|
832 |
+
// We compare our critical hit chance against a random number between 0 and 255.
|
833 |
+
// If the random number is lower, we get a critical hit. This means there is always a 1/255 chance of not hitting critically.
|
834 |
+
if (critChance > 0) {
|
835 |
+
isCrit = this.battle.randomChance(critChance, 256);
|
836 |
+
}
|
837 |
+
}
|
838 |
+
if (isCrit) target.getMoveHitData(move).crit = true;
|
839 |
+
|
840 |
+
// Happens after crit calculation.
|
841 |
+
if (basePower) {
|
842 |
+
basePower = this.battle.runEvent('BasePower', source, target, move, basePower);
|
843 |
+
if (basePower && move.basePowerModifier) {
|
844 |
+
basePower *= move.basePowerModifier;
|
845 |
+
}
|
846 |
+
}
|
847 |
+
if (!basePower) return 0;
|
848 |
+
basePower = this.battle.clampIntRange(basePower, 1);
|
849 |
+
|
850 |
+
// We now check attacker's and defender's stats.
|
851 |
+
let level = source.level;
|
852 |
+
const attacker = move.overrideOffensivePokemon === 'target' ? target : source;
|
853 |
+
const defender = move.overrideDefensivePokemon === 'source' ? source : target;
|
854 |
+
|
855 |
+
const isPhysical = move.category === 'Physical';
|
856 |
+
const atkType: StatIDExceptHP = move.overrideOffensiveStat || (isPhysical ? 'atk' : 'spa');
|
857 |
+
const defType: StatIDExceptHP = move.overrideDefensiveStat || (isPhysical ? 'def' : 'spd');
|
858 |
+
|
859 |
+
let attack = attacker.getStat(atkType);
|
860 |
+
let defense = defender.getStat(defType);
|
861 |
+
|
862 |
+
// In gen 1, screen effect is applied here.
|
863 |
+
if ((defType === 'def' && defender.volatiles['reflect']) || (defType === 'spd' && defender.volatiles['lightscreen'])) {
|
864 |
+
this.battle.debug('Screen doubling (Sp)Def');
|
865 |
+
defense *= 2;
|
866 |
+
}
|
867 |
+
|
868 |
+
// In the event of a critical hit, the offense and defense changes are ignored.
|
869 |
+
// This includes both boosts and screens.
|
870 |
+
// Also, level is doubled in damage calculation.
|
871 |
+
if (isCrit) {
|
872 |
+
move.ignoreOffensive = true;
|
873 |
+
move.ignoreDefensive = true;
|
874 |
+
level *= 2;
|
875 |
+
if (!suppressMessages) this.battle.add('-crit', target);
|
876 |
+
}
|
877 |
+
|
878 |
+
if (move.ignoreOffensive) {
|
879 |
+
this.battle.debug('Negating (sp)atk boost/penalty.');
|
880 |
+
attack = attacker.getStat(atkType, true);
|
881 |
+
}
|
882 |
+
|
883 |
+
if (move.ignoreDefensive) {
|
884 |
+
this.battle.debug('Negating (sp)def boost/penalty.');
|
885 |
+
// No screens
|
886 |
+
defense = target.getStat(defType, true);
|
887 |
+
}
|
888 |
+
|
889 |
+
// When either attack or defense are higher than 256, both are divided by 4.
|
890 |
+
// If that's still over 256, it rolls over (%256), which is what causes rollover bugs.
|
891 |
+
if (attack >= 256 || defense >= 256) {
|
892 |
+
if (attack >= 1024 || defense >= 1024) {
|
893 |
+
this.battle.hint("In Gen 1, a stat will roll over to a small number if it is larger than 1024.");
|
894 |
+
}
|
895 |
+
attack = this.battle.clampIntRange(Math.floor(attack / 4) % 256, 1);
|
896 |
+
// Defense isn't checked on the cartridge, but we don't want those / 0 bugs on the sim.
|
897 |
+
defense = Math.floor(defense / 4) % 256;
|
898 |
+
if (defense === 0) {
|
899 |
+
this.battle.hint('Pokemon Showdown avoids division by zero by rounding defense up to 1. ' +
|
900 |
+
'In game, the battle would have crashed.');
|
901 |
+
defense = 1;
|
902 |
+
}
|
903 |
+
}
|
904 |
+
|
905 |
+
// Self destruct moves halve defense at this point.
|
906 |
+
if (move.selfdestruct && defType === 'def') {
|
907 |
+
defense = this.battle.clampIntRange(Math.floor(defense / 2), 1);
|
908 |
+
}
|
909 |
+
|
910 |
+
// Let's go with the calculation now that we have what we need.
|
911 |
+
// We do it step by step just like the game does.
|
912 |
+
let damage = level * 2;
|
913 |
+
damage = Math.floor(damage / 5);
|
914 |
+
damage += 2;
|
915 |
+
damage *= basePower;
|
916 |
+
damage *= attack;
|
917 |
+
damage = Math.floor(damage / defense);
|
918 |
+
damage = this.battle.clampIntRange(Math.floor(damage / 50), 0, 997);
|
919 |
+
damage += 2;
|
920 |
+
|
921 |
+
// STAB damage bonus, the "???" type never gets STAB
|
922 |
+
if (type !== '???' && source.hasType(type)) {
|
923 |
+
damage += Math.floor(damage / 2);
|
924 |
+
}
|
925 |
+
|
926 |
+
// Type effectiveness.
|
927 |
+
// In Gen 1, type effectiveness is applied against each of the target's types.
|
928 |
+
for (const targetType of target.types) {
|
929 |
+
let typeMod = this.battle.dex.getEffectiveness(type, targetType);
|
930 |
+
typeMod = this.battle.runEvent('Effectiveness', this.battle, targetType, move, typeMod);
|
931 |
+
if (typeMod > 0) {
|
932 |
+
// Super effective against targetType
|
933 |
+
damage *= 20;
|
934 |
+
damage = Math.floor(damage / 10);
|
935 |
+
}
|
936 |
+
if (typeMod < 0) {
|
937 |
+
// Not very effective against targetType
|
938 |
+
damage *= 5;
|
939 |
+
damage = Math.floor(damage / 10);
|
940 |
+
}
|
941 |
+
}
|
942 |
+
const totalTypeMod = target.runEffectiveness(move);
|
943 |
+
if (totalTypeMod > 0) {
|
944 |
+
if (!suppressMessages) this.battle.add('-supereffective', target);
|
945 |
+
}
|
946 |
+
if (totalTypeMod < 0) {
|
947 |
+
if (!suppressMessages) this.battle.add('-resisted', target);
|
948 |
+
}
|
949 |
+
|
950 |
+
// If damage becomes 0, the move is made to miss.
|
951 |
+
// This occurs when damage was either 2 or 3 prior to applying STAB/Type matchup, and target is 4x resistant to the move.
|
952 |
+
if (damage === 0) return damage;
|
953 |
+
|
954 |
+
// Apply random factor if damage is greater than 1
|
955 |
+
if (damage > 1) {
|
956 |
+
damage *= this.battle.random(217, 256);
|
957 |
+
damage = Math.floor(damage / 255);
|
958 |
+
}
|
959 |
+
|
960 |
+
// And we are done.
|
961 |
+
return Math.floor(damage);
|
962 |
+
},
|
963 |
+
},
|
964 |
+
// deals with Pokémon stat boosting.
|
965 |
+
boost(boost, target, source = null, effect = null) {
|
966 |
+
if (this.event) {
|
967 |
+
if (!target) target = this.event.target;
|
968 |
+
if (!source) source = this.event.source;
|
969 |
+
if (!effect) effect = this.effect;
|
970 |
+
}
|
971 |
+
if (typeof effect === 'string') effect = this.dex.conditions.get(effect);
|
972 |
+
if (!target?.hp) return 0;
|
973 |
+
let success = null;
|
974 |
+
boost = this.runEvent('TryBoost', target, source, effect, { ...boost });
|
975 |
+
let i: BoostID;
|
976 |
+
for (i in boost) {
|
977 |
+
const currentBoost: SparseBoostsTable = {};
|
978 |
+
currentBoost[i] = boost[i];
|
979 |
+
if (boost[i] !== 0) {
|
980 |
+
const boostResult = target.boostBy(currentBoost);
|
981 |
+
if (boostResult) {
|
982 |
+
success = true;
|
983 |
+
let msg = '-boost';
|
984 |
+
if (boost[i]! < 0) {
|
985 |
+
msg = '-unboost';
|
986 |
+
boost[i] = -boost[i]!;
|
987 |
+
}
|
988 |
+
if (!effect || effect.effectType === 'Move') {
|
989 |
+
this.add(msg, target, i, boost[i]);
|
990 |
+
} else {
|
991 |
+
this.add(msg, target, i, boost[i], '[from] ' + effect.fullname);
|
992 |
+
}
|
993 |
+
this.runEvent('AfterEachBoost', target, source, effect, currentBoost);
|
994 |
+
}
|
995 |
+
// Tried to boost at 999 or unboost at 1. This does not count as a success: par/brn effects are not applied afterwards.
|
996 |
+
if (boostResult === 0) {
|
997 |
+
let msg = '-boost';
|
998 |
+
let secondmsg = '-unboost';
|
999 |
+
if (boost[i]! < 0) {
|
1000 |
+
msg = '-unboost';
|
1001 |
+
secondmsg = '-boost';
|
1002 |
+
boost[i] = -boost[i]!;
|
1003 |
+
}
|
1004 |
+
if (!effect || effect.effectType === 'Move') {
|
1005 |
+
this.add(msg, target, i, boost[i]);
|
1006 |
+
} else {
|
1007 |
+
this.add(msg, target, i, boost[i], '[from] ' + effect.fullname);
|
1008 |
+
}
|
1009 |
+
this.add(secondmsg, target, i, 1);
|
1010 |
+
if (msg === '-boost') {
|
1011 |
+
this.hint(`In Gen 1, boosting a stat at 999 will apply a -1 drop afterwards, and the stat remains at 999.`, true);
|
1012 |
+
} else {
|
1013 |
+
this.hint(`In Gen 1, dropping a stat at 1 will apply a +1 boost afterwards, and the stat remains at 1.`, true);
|
1014 |
+
}
|
1015 |
+
this.runEvent('AfterEachBoost', target, source, effect, currentBoost);
|
1016 |
+
}
|
1017 |
+
}
|
1018 |
+
}
|
1019 |
+
this.runEvent('AfterBoost', target, source, effect, boost);
|
1020 |
+
return success;
|
1021 |
+
},
|
1022 |
+
};
|
data/mods/gen1/typechart.ts
ADDED
@@ -0,0 +1,137 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/**
|
2 |
+
* Types were different on Gen 1.
|
3 |
+
* We had no steel nor dark types and there were a couple of important differences:
|
4 |
+
* Bug and Poison were weak to eachother
|
5 |
+
* Ice was neutral to fire
|
6 |
+
* Psychic was immune to ghost
|
7 |
+
*/
|
8 |
+
|
9 |
+
export const TypeChart: import('../../../sim/dex-data').ModdedTypeDataTable = {
|
10 |
+
bug: {
|
11 |
+
damageTaken: {
|
12 |
+
Bug: 0,
|
13 |
+
Dragon: 0,
|
14 |
+
Electric: 0,
|
15 |
+
Fighting: 2,
|
16 |
+
Fire: 1,
|
17 |
+
Flying: 1,
|
18 |
+
Ghost: 0,
|
19 |
+
Grass: 2,
|
20 |
+
Ground: 2,
|
21 |
+
Ice: 0,
|
22 |
+
Normal: 0,
|
23 |
+
Poison: 1,
|
24 |
+
Psychic: 0,
|
25 |
+
Rock: 1,
|
26 |
+
Water: 0,
|
27 |
+
},
|
28 |
+
},
|
29 |
+
fire: {
|
30 |
+
damageTaken: {
|
31 |
+
Bug: 2,
|
32 |
+
Dragon: 0,
|
33 |
+
Electric: 0,
|
34 |
+
Fighting: 0,
|
35 |
+
Fire: 2,
|
36 |
+
Flying: 0,
|
37 |
+
Ghost: 0,
|
38 |
+
Grass: 2,
|
39 |
+
Ground: 1,
|
40 |
+
Ice: 0,
|
41 |
+
Normal: 0,
|
42 |
+
Poison: 0,
|
43 |
+
Psychic: 0,
|
44 |
+
Rock: 1,
|
45 |
+
Water: 1,
|
46 |
+
},
|
47 |
+
},
|
48 |
+
ghost: {
|
49 |
+
damageTaken: {
|
50 |
+
Bug: 2,
|
51 |
+
Dragon: 0,
|
52 |
+
Electric: 0,
|
53 |
+
Fighting: 3,
|
54 |
+
Fire: 0,
|
55 |
+
Flying: 0,
|
56 |
+
Ghost: 1,
|
57 |
+
Grass: 0,
|
58 |
+
Ground: 0,
|
59 |
+
Ice: 0,
|
60 |
+
Normal: 3,
|
61 |
+
Poison: 2,
|
62 |
+
Psychic: 0,
|
63 |
+
Rock: 0,
|
64 |
+
Water: 0,
|
65 |
+
},
|
66 |
+
},
|
67 |
+
ice: {
|
68 |
+
damageTaken: {
|
69 |
+
Bug: 0,
|
70 |
+
Dark: 0,
|
71 |
+
Dragon: 0,
|
72 |
+
Electric: 0,
|
73 |
+
Fairy: 0,
|
74 |
+
Fighting: 1,
|
75 |
+
Fire: 1,
|
76 |
+
Flying: 0,
|
77 |
+
Ghost: 0,
|
78 |
+
Grass: 0,
|
79 |
+
Ground: 0,
|
80 |
+
Ice: 2,
|
81 |
+
Normal: 0,
|
82 |
+
Poison: 0,
|
83 |
+
Psychic: 0,
|
84 |
+
Rock: 1,
|
85 |
+
Steel: 1,
|
86 |
+
Water: 0,
|
87 |
+
},
|
88 |
+
},
|
89 |
+
poison: {
|
90 |
+
damageTaken: {
|
91 |
+
psn: 3,
|
92 |
+
tox: 3,
|
93 |
+
Bug: 1,
|
94 |
+
Dragon: 0,
|
95 |
+
Electric: 0,
|
96 |
+
Fighting: 2,
|
97 |
+
Fire: 0,
|
98 |
+
Flying: 0,
|
99 |
+
Ghost: 0,
|
100 |
+
Grass: 2,
|
101 |
+
Ground: 1,
|
102 |
+
Ice: 0,
|
103 |
+
Normal: 0,
|
104 |
+
Poison: 2,
|
105 |
+
Psychic: 1,
|
106 |
+
Rock: 0,
|
107 |
+
Water: 0,
|
108 |
+
},
|
109 |
+
},
|
110 |
+
psychic: {
|
111 |
+
damageTaken: {
|
112 |
+
Bug: 1,
|
113 |
+
Dragon: 0,
|
114 |
+
Electric: 0,
|
115 |
+
Fighting: 2,
|
116 |
+
Fire: 0,
|
117 |
+
Flying: 0,
|
118 |
+
Ghost: 3,
|
119 |
+
Grass: 0,
|
120 |
+
Ground: 0,
|
121 |
+
Ice: 0,
|
122 |
+
Normal: 0,
|
123 |
+
Poison: 0,
|
124 |
+
Psychic: 2,
|
125 |
+
Rock: 0,
|
126 |
+
Water: 0,
|
127 |
+
},
|
128 |
+
},
|
129 |
+
dark: {
|
130 |
+
inherit: true,
|
131 |
+
isNonstandard: 'Future',
|
132 |
+
},
|
133 |
+
steel: {
|
134 |
+
inherit: true,
|
135 |
+
isNonstandard: 'Future',
|
136 |
+
},
|
137 |
+
};
|
data/mods/gen1jpn/README.md
ADDED
@@ -0,0 +1,14 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
Gen 1, Japanese Releases
|
2 |
+
====================
|
3 |
+
|
4 |
+
Introduction
|
5 |
+
------------
|
6 |
+
The Generation 1 mechanics most players know is already very different mechanically from the later generations of Pokemon.
|
7 |
+
However, up until Generation 5, Pokemon Games initially released in Japan before releasing to the rest of the world, usually with glitches patched
|
8 |
+
or changes to moves to balance the game. The first generation of Pokemon has examples of both, though only a handful of changes actually affect battles
|
9 |
+
between players, these differences are as follows.
|
10 |
+
- Blizzard Freezes its target 30.1% of the time.
|
11 |
+
- Swift does not ignore accuracy checks except against substitutes.
|
12 |
+
- Draining moves, such as Absorb or Mega Drain, fail on substitutes. Funnily enough, Draining moves not failing against Substitutes was a glitch introduced when the games were
|
13 |
+
internationally released which eventually became a feature of later generations.
|
14 |
+
- Some Pokemon for access to Japanese event-only moves such as Pikachu with Fly and Fearow with Pay Day.
|
data/mods/gen1jpn/conditions.ts
ADDED
@@ -0,0 +1,12 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
export const Conditions: import('../../../sim/dex-conditions').ModdedConditionDataTable = {
|
2 |
+
invulnerability: {
|
3 |
+
// Dig/Fly
|
4 |
+
name: 'invulnerability',
|
5 |
+
onInvulnerability(target, source, move) {
|
6 |
+
if (target === source) return true;
|
7 |
+
if ((move.id === 'swift' && target.volatiles['substitute']) || move.id === 'transform') return true;
|
8 |
+
this.add('-message', 'The foe ' + target.name + ' can\'t be hit while invulnerable!');
|
9 |
+
return false;
|
10 |
+
},
|
11 |
+
},
|
12 |
+
};
|
data/mods/gen1jpn/moves.ts
ADDED
@@ -0,0 +1,90 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/**
|
2 |
+
* The japanese version of Blizzard in Gen 1 had a 30% chance to freeze
|
3 |
+
*/
|
4 |
+
|
5 |
+
export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = {
|
6 |
+
blizzard: {
|
7 |
+
inherit: true,
|
8 |
+
secondary: {
|
9 |
+
chance: 30,
|
10 |
+
status: 'frz',
|
11 |
+
},
|
12 |
+
},
|
13 |
+
substitute: {
|
14 |
+
inherit: true,
|
15 |
+
condition: {
|
16 |
+
onStart(target) {
|
17 |
+
this.add('-start', target, 'Substitute');
|
18 |
+
this.effectState.hp = Math.floor(target.maxhp / 4) + 1;
|
19 |
+
delete target.volatiles['partiallytrapped'];
|
20 |
+
},
|
21 |
+
onTryHitPriority: -1,
|
22 |
+
onTryHit(target, source, move) {
|
23 |
+
if (move.drain) {
|
24 |
+
this.add('-miss', source);
|
25 |
+
this.hint("In the Japanese versions of Gen 1, draining moves always miss against substitutes.");
|
26 |
+
return null;
|
27 |
+
}
|
28 |
+
if (move.category === 'Status') {
|
29 |
+
// In gen 1 it only blocks:
|
30 |
+
// poison, confusion, secondary effect confusion, stat reducing moves and Leech Seed.
|
31 |
+
const subBlocked = ['lockon', 'meanlook', 'mindreader', 'nightmare'];
|
32 |
+
if ((move.status && ['psn', 'tox'].includes(move.status)) || (move.boosts && target !== source) ||
|
33 |
+
move.volatileStatus === 'confusion' || subBlocked.includes(move.id)) {
|
34 |
+
return false;
|
35 |
+
}
|
36 |
+
return;
|
37 |
+
}
|
38 |
+
if (move.volatileStatus && target === source) return;
|
39 |
+
// NOTE: In future generations the damage is capped to the remaining HP of the
|
40 |
+
// Substitute, here we deliberately use the uncapped damage when tracking lastDamage etc.
|
41 |
+
// Also, multi-hit moves must always deal the same damage as the first hit for any subsequent hits
|
42 |
+
let uncappedDamage = move.hit > 1 ? this.lastDamage : this.actions.getDamage(source, target, move);
|
43 |
+
if (!uncappedDamage && uncappedDamage !== 0) return null;
|
44 |
+
uncappedDamage = this.runEvent('SubDamage', target, source, move, uncappedDamage);
|
45 |
+
if (!uncappedDamage && uncappedDamage !== 0) return uncappedDamage;
|
46 |
+
this.lastDamage = uncappedDamage;
|
47 |
+
target.volatiles['substitute'].hp -= uncappedDamage > target.volatiles['substitute'].hp ?
|
48 |
+
target.volatiles['substitute'].hp : uncappedDamage;
|
49 |
+
if (target.volatiles['substitute'].hp <= 0) {
|
50 |
+
target.removeVolatile('substitute');
|
51 |
+
target.subFainted = true;
|
52 |
+
} else {
|
53 |
+
this.add('-activate', target, 'Substitute', '[damage]');
|
54 |
+
}
|
55 |
+
// Drain/recoil does not happen if the substitute breaks
|
56 |
+
if (target.volatiles['substitute']) {
|
57 |
+
if (move.recoil) {
|
58 |
+
this.damage(Math.round(uncappedDamage * move.recoil[0] / move.recoil[1]), source, target, 'recoil');
|
59 |
+
}
|
60 |
+
if (move.drain) {
|
61 |
+
this.heal(Math.ceil(uncappedDamage * move.drain[0] / move.drain[1]), source, target, 'drain');
|
62 |
+
}
|
63 |
+
}
|
64 |
+
this.runEvent('AfterSubDamage', target, source, move, uncappedDamage);
|
65 |
+
// Add here counter damage
|
66 |
+
const lastAttackedBy = target.getLastAttackedBy();
|
67 |
+
if (!lastAttackedBy) {
|
68 |
+
target.attackedBy.push({ source, move: move.id, damage: uncappedDamage, thisTurn: true, slot: source.getSlot() });
|
69 |
+
} else {
|
70 |
+
lastAttackedBy.move = move.id;
|
71 |
+
lastAttackedBy.damage = uncappedDamage;
|
72 |
+
}
|
73 |
+
return 0;
|
74 |
+
},
|
75 |
+
onAccuracy(accuracy, target, source, move) {
|
76 |
+
if (move.id === 'swift') {
|
77 |
+
return true;
|
78 |
+
}
|
79 |
+
return accuracy;
|
80 |
+
},
|
81 |
+
onEnd(target) {
|
82 |
+
this.add('-end', target, 'Substitute');
|
83 |
+
},
|
84 |
+
},
|
85 |
+
},
|
86 |
+
swift: {
|
87 |
+
inherit: true,
|
88 |
+
accuracy: 100,
|
89 |
+
},
|
90 |
+
};
|
data/mods/gen1jpn/rulesets.ts
ADDED
@@ -0,0 +1,91 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
export const Rulesets: import('../../../sim/dex-formats').ModdedFormatDataTable = {
|
2 |
+
standard: {
|
3 |
+
effectType: 'ValidatorRule',
|
4 |
+
name: 'Standard',
|
5 |
+
ruleset: ['Obtainable', 'Desync Clause Mod', 'Sleep Clause Mod', 'Freeze Clause Mod', 'Species Clause', 'Nickname Clause', 'OHKO Clause', 'Evasion Moves Clause', 'Endless Battle Clause', 'HP Percentage Mod', 'Cancel Mod'],
|
6 |
+
banlist: ['Dig', 'Fly'],
|
7 |
+
},
|
8 |
+
nc1997movelegality: {
|
9 |
+
effectType: 'ValidatorRule',
|
10 |
+
name: 'NC 1997 Move Legality',
|
11 |
+
desc: "Bans move combinations on Pok\u00e9mon that would only be obtainable in Pok\u00e9mon Yellow.",
|
12 |
+
banlist: [
|
13 |
+
// https://www.smogon.com/forums/threads/rby-and-gsc-illegal-movesets.78638/
|
14 |
+
// https://www.smogon.com/forums/threads/rby-tradebacks-bug-report-thread.3524844/post-9235903
|
15 |
+
// Due to Yellow learnset modifications not applying, there are a few more incompatibilities than usual.
|
16 |
+
'Nidoking + Fury Attack + Thrash', 'Nidoking + Double Kick + Thrash',
|
17 |
+
'Butterfree + Tackle + Harden', 'Butterfree + String Shot + Harden',
|
18 |
+
'Exeggutor + Poison Powder + Stomp', 'Exeggutor + Sleep Powder + Stomp', 'Exeggutor + Stun Spore + Stomp',
|
19 |
+
'Eevee + Tackle + Growl',
|
20 |
+
'Vaporeon + Tackle + Growl',
|
21 |
+
'Jolteon + Tackle + Growl', 'Jolteon + Focus Energy + Thunder Shock',
|
22 |
+
'Flareon + Tackle + Growl', 'Flareon + Focus Energy + Ember',
|
23 |
+
],
|
24 |
+
onValidateSet(set) {
|
25 |
+
const rgb97Legality: { [speciesid: string]: { [moveid: string]: 'illegal' | number } } = {
|
26 |
+
charizard: { fly: 'illegal' },
|
27 |
+
butterfree: {
|
28 |
+
confusion: 12, poisonpowder: 15, stunspore: 16, sleeppowder: 17, supersonic: 21,
|
29 |
+
psybeam: 34, flash: 'illegal', gust: 'illegal',
|
30 |
+
},
|
31 |
+
fearow: { payday: 'illegal' },
|
32 |
+
pikachu: { quickattack: 16, tailwhip: 'illegal', slam: 'illegal', lightscreen: 'illegal' },
|
33 |
+
raichu: { quickattack: 16, tailwhip: 'illegal', slam: 'illegal', lightscreen: 'illegal' },
|
34 |
+
nidoranf: { doublekick: 43 },
|
35 |
+
nidorina: { doublekick: 43 },
|
36 |
+
nidoqueen: { doublekick: 43 },
|
37 |
+
nidoranm: { doublekick: 43 },
|
38 |
+
nidorino: { doublekick: 43 },
|
39 |
+
nidoking: { doublekick: 43 },
|
40 |
+
venonat: { poisonpowder: 24, supersonic: 'illegal', confusion: 'illegal' },
|
41 |
+
venomoth: { poisonpowder: 24, supersonic: 'illegal' },
|
42 |
+
diglett: { cut: 'illegal' },
|
43 |
+
dugtrio: { cut: 'illegal' },
|
44 |
+
psyduck: { amnesia: 'illegal' },
|
45 |
+
golduck: { amnesia: 'illegal' },
|
46 |
+
mankey: { lowkick: 'illegal', screech: 'illegal' },
|
47 |
+
primeape: { lowkick: 'illegal', screech: 'illegal' },
|
48 |
+
kadabra: { kinesis: 'illegal' },
|
49 |
+
alakazam: { kinesis: 'illegal' },
|
50 |
+
rapidash: { payday: 'illegal' },
|
51 |
+
cubone: { tailwhip: 'illegal', headbutt: 'illegal' },
|
52 |
+
marowak: { tailwhip: 'illegal', headbutt: 'illegal' },
|
53 |
+
chansey: { tailwhip: 'illegal' },
|
54 |
+
tangela: { absorb: 29, growth: 49, vinewhip: 'illegal' },
|
55 |
+
scyther: { wingattack: 'illegal' },
|
56 |
+
pinsir: { bind: 'illegal' },
|
57 |
+
magikarp: { dragonrage: 'illegal' },
|
58 |
+
eevee: { quickattack: 27, tailwhip: 31, bite: 37, growl: 'illegal', focusenergy: 'illegal' },
|
59 |
+
vaporeon: {
|
60 |
+
quickattack: 27, tailwhip: 31, watergun: 31, bite: 37, acidarmor: 42, haze: 44, mist: 48, hydropump: 54,
|
61 |
+
growl: 'illegal', focusenergy: 'illegal', aurorabeam: 'illegal',
|
62 |
+
},
|
63 |
+
jolteon: {
|
64 |
+
quickattack: 27, tailwhip: 31, thundershock: 31, bite: 37, doublekick: 42, agility: 44,
|
65 |
+
pinmissile: 48, growl: 'illegal', focusenergy: 'illegal',
|
66 |
+
},
|
67 |
+
flareon: {
|
68 |
+
quickattack: 27, tailwhip: 31, ember: 31, bite: 37, leer: 42, firespin: 44, flamethrower: 54,
|
69 |
+
growl: 'illegal', focusenergy: 'illegal', smog: 'illegal',
|
70 |
+
},
|
71 |
+
};
|
72 |
+
const species = this.dex.species.get(set.species || set.name);
|
73 |
+
const legalityList = rgb97Legality[species.id];
|
74 |
+
if (!legalityList) return;
|
75 |
+
const problems = [];
|
76 |
+
if (set.moves) {
|
77 |
+
for (const moveid of set.moves.map(this.toID)) {
|
78 |
+
const legality = legalityList[moveid];
|
79 |
+
if (legality) {
|
80 |
+
if (legality === 'illegal') {
|
81 |
+
problems.push(`${set.species} can't learn ${this.dex.moves.get(moveid).name} in 1997.`);
|
82 |
+
} else if (set.level < legality) {
|
83 |
+
problems.push(`${set.species} can't learn ${this.dex.moves.get(moveid).name} before level ${legalityList[moveid]} in 1997.`);
|
84 |
+
}
|
85 |
+
}
|
86 |
+
}
|
87 |
+
}
|
88 |
+
return problems;
|
89 |
+
},
|
90 |
+
},
|
91 |
+
};
|
data/mods/gen1jpn/scripts.ts
ADDED
@@ -0,0 +1,4 @@
|
|
|
|
|
|
|
|
|
|
|
1 |
+
export const Scripts: ModdedBattleScriptsData = {
|
2 |
+
inherit: 'gen1',
|
3 |
+
gen: 1,
|
4 |
+
};
|