From 676bcc8b10df66c41a4af731b379f23ee98de3be Mon Sep 17 00:00:00 2001 From: Valerie Date: Wed, 2 Apr 2025 22:57:51 -0400 Subject: [PATCH] Add Cogs --- dictionary/README.rst | 64 + dictionary/locales/de-DE.po | 32 + dictionary/locales/el-GR.po | 32 + dictionary/locales/es-ES.po | 32 + dictionary/locales/fi-FI.po | 32 + dictionary/locales/fr-FR.po | 32 + dictionary/locales/it-IT.po | 32 + dictionary/locales/ja-JP.po | 32 + dictionary/locales/messages.pot | 31 + dictionary/locales/nl-NL.po | 32 + dictionary/locales/pl-PL.po | 32 + dictionary/locales/pt-BR.po | 32 + dictionary/locales/pt-PT.po | 32 + dictionary/locales/ro-RO.po | 32 + dictionary/locales/ru-RU.po | 32 + dictionary/locales/tr-TR.po | 32 + dictionary/locales/uk-UA.po | 32 + dictionary/types.py | 60 + dictionary/utils_version.json | 1 + dictionary/view.py | 120 + fakemod/__init__.py | 37 + fakemod/converters.py | 34 + fakemod/fakemod.py | 239 + fakemod/info.json | 14 + ip/README.rst | 82 + ip/__init__.py | 46 + ip/dashboard_integration.py | 12 + ip/info.json | 15 + ip/ip.py | 84 + ip/locales/de-DE.po | 42 + ip/locales/el-GR.po | 42 + ip/locales/es-ES.po | 42 + ip/locales/fi-FI.po | 42 + ip/locales/fr-FR.po | 42 + ip/locales/it-IT.po | 42 + ip/locales/ja-JP.po | 42 + ip/locales/messages.pot | 35 + ip/locales/nl-NL.po | 42 + ip/locales/pl-PL.po | 42 + ip/locales/pt-BR.po | 42 + ip/locales/pt-PT.po | 42 + ip/locales/ro-RO.po | 42 + ip/locales/ru-RU.po | 42 + ip/locales/tr-TR.po | 42 + ip/locales/uk-UA.po | 42 + ip/utils_version.json | 1 + lock/LICENSE.md | 373 + lock/README.rst | 89 + lock/__init__.py | 10 + lock/info.json | 9 + lock/lock.py | 196 + minecraft/README.rst | 88 + minecraft/__init__.py | 46 + minecraft/info.json | 16 + minecraft/locales/de-DE.po | 140 + minecraft/locales/el-GR.po | 140 + minecraft/locales/es-ES.po | 140 + minecraft/locales/fi-FI.po | 140 + minecraft/locales/fr-FR.po | 140 + minecraft/locales/it-IT.po | 140 + minecraft/locales/ja-JP.po | 140 + minecraft/locales/messages.pot | 139 + minecraft/locales/nl-NL.po | 140 + minecraft/locales/pl-PL.po | 140 + minecraft/locales/pt-BR.po | 140 + minecraft/locales/pt-PT.po | 140 + minecraft/locales/ro-RO.po | 140 + minecraft/locales/ru-RU.po | 140 + minecraft/locales/tr-TR.po | 140 + minecraft/locales/uk-UA.po | 140 + minecraft/minecraft.py | 451 + minecraft/utils_version.json | 1 + mod/__init__.py | 13 + mod/_tagscript.py | 59 + mod/info.json | 18 + mod/mod.py | 836 + onetrueslash/__init__.py | 48 + onetrueslash/channel.py | 43 + onetrueslash/commands.py | 141 + onetrueslash/context.py | 163 + onetrueslash/events.py | 44 + onetrueslash/info.json | 19 + onetrueslash/message.py | 132 + onetrueslash/utils.py | 59 + onthisday/README.rst | 80 + onthisday/__init__.py | 309 + onthisday/info.json | 24 + pokemonduel/__init__.py | 6 + pokemonduel/battle.py | 491 + pokemonduel/buttons.py | 377 + pokemonduel/commands.py | 483 + pokemonduel/data.py | 107 + pokemonduel/data/abilities.json | 2222 +++ pokemonduel/data/forms.json | 19728 +++++++++++++++++++ pokemonduel/data/items.json | 8118 ++++++++ pokemonduel/data/moves.json | 15319 +++++++++++++++ pokemonduel/data/natures.json | 227 + pokemonduel/data/pfile.json | 21762 +++++++++++++++++++++ pokemonduel/data/poke_abilities.json | 16950 ++++++++++++++++ pokemonduel/data/pokemon_stats.json | 14104 +++++++++++++ pokemonduel/data/ptypes.json | 8420 ++++++++ pokemonduel/data/stat_types.json | 58 + pokemonduel/data/type_effectiveness.json | 1712 ++ pokemonduel/enums.py | 369 + pokemonduel/info.json | 12 + pokemonduel/misc.py | 853 + pokemonduel/move.py | 3752 ++++ pokemonduel/pokemon.py | 2666 +++ pokemonduel/trainer.py | 251 + rolehistory/__init__.py | 7 + rolehistory/info.json | 16 + rolehistory/rolehistory.py | 104 + simpleembed/__init__.py | 6 + simpleembed/info.json | 12 + simpleembed/simpleembed.py | 41 + stickbugged/__init__.py | 5 + stickbugged/converters.py | 77 + stickbugged/info.json | 18 + stickbugged/stickbugged.py | 95 + theme/__init__.py | 10 + theme/info.json | 16 + theme/theme.py | 166 + tickettool/README.rst | 205 + tickettool/__init__.py | 46 + tickettool/dashboard_integration.py | 39 + tickettool/info.json | 15 + tickettool/locales/de-DE.po | 584 + tickettool/locales/el-GR.po | 584 + tickettool/locales/es-ES.po | 584 + tickettool/locales/fi-FI.po | 584 + tickettool/locales/fr-FR.po | 584 + tickettool/locales/it-IT.po | 586 + tickettool/locales/ja-JP.po | 584 + tickettool/locales/messages.pot | 637 + tickettool/locales/nl-NL.po | 586 + tickettool/locales/pl-PL.po | 584 + tickettool/locales/pt-BR.po | 584 + tickettool/locales/pt-PT.po | 584 + tickettool/locales/ro-RO.po | 584 + tickettool/locales/ru-RU.po | 584 + tickettool/locales/tr-TR.po | 584 + tickettool/locales/uk-UA.po | 584 + tickettool/settings.py | 204 + tickettool/ticket.py | 1232 ++ tickettool/tickettool.py | 1862 ++ tickettool/utils.py | 270 + tickettool/utils_version.json | 1 + viewpermissions/README.rst | 64 + viewpermissions/__init__.py | 46 + viewpermissions/info.json | 16 + viewpermissions/locales/de-DE.po | 64 + viewpermissions/locales/el-GR.po | 64 + viewpermissions/locales/es-ES.po | 64 + viewpermissions/locales/fi-FI.po | 64 + viewpermissions/locales/fr-FR.po | 64 + viewpermissions/locales/it-IT.po | 64 + viewpermissions/locales/ja-JP.po | 64 + viewpermissions/locales/messages.pot | 63 + viewpermissions/locales/nl-NL.po | 64 + viewpermissions/locales/pl-PL.po | 64 + viewpermissions/locales/pt-BR.po | 64 + viewpermissions/locales/pt-PT.po | 64 + viewpermissions/locales/ro-RO.po | 64 + viewpermissions/locales/ru-RU.po | 64 + viewpermissions/locales/tr-TR.po | 64 + viewpermissions/locales/uk-UA.po | 64 + viewpermissions/types.py | 100 + viewpermissions/utils_version.json | 1 + viewpermissions/view.py | 228 + viewpermissions/viewpermissions.py | 362 + 170 files changed, 141166 insertions(+) create mode 100644 dictionary/README.rst create mode 100644 dictionary/locales/de-DE.po create mode 100644 dictionary/locales/el-GR.po create mode 100644 dictionary/locales/es-ES.po create mode 100644 dictionary/locales/fi-FI.po create mode 100644 dictionary/locales/fr-FR.po create mode 100644 dictionary/locales/it-IT.po create mode 100644 dictionary/locales/ja-JP.po create mode 100644 dictionary/locales/messages.pot create mode 100644 dictionary/locales/nl-NL.po create mode 100644 dictionary/locales/pl-PL.po create mode 100644 dictionary/locales/pt-BR.po create mode 100644 dictionary/locales/pt-PT.po create mode 100644 dictionary/locales/ro-RO.po create mode 100644 dictionary/locales/ru-RU.po create mode 100644 dictionary/locales/tr-TR.po create mode 100644 dictionary/locales/uk-UA.po create mode 100644 dictionary/types.py create mode 100644 dictionary/utils_version.json create mode 100644 dictionary/view.py create mode 100644 fakemod/__init__.py create mode 100644 fakemod/converters.py create mode 100644 fakemod/fakemod.py create mode 100644 fakemod/info.json create mode 100644 ip/README.rst create mode 100644 ip/__init__.py create mode 100644 ip/dashboard_integration.py create mode 100644 ip/info.json create mode 100644 ip/ip.py create mode 100644 ip/locales/de-DE.po create mode 100644 ip/locales/el-GR.po create mode 100644 ip/locales/es-ES.po create mode 100644 ip/locales/fi-FI.po create mode 100644 ip/locales/fr-FR.po create mode 100644 ip/locales/it-IT.po create mode 100644 ip/locales/ja-JP.po create mode 100644 ip/locales/messages.pot create mode 100644 ip/locales/nl-NL.po create mode 100644 ip/locales/pl-PL.po create mode 100644 ip/locales/pt-BR.po create mode 100644 ip/locales/pt-PT.po create mode 100644 ip/locales/ro-RO.po create mode 100644 ip/locales/ru-RU.po create mode 100644 ip/locales/tr-TR.po create mode 100644 ip/locales/uk-UA.po create mode 100644 ip/utils_version.json create mode 100644 lock/LICENSE.md create mode 100644 lock/README.rst create mode 100644 lock/__init__.py create mode 100644 lock/info.json create mode 100644 lock/lock.py create mode 100644 minecraft/README.rst create mode 100644 minecraft/__init__.py create mode 100644 minecraft/info.json create mode 100644 minecraft/locales/de-DE.po create mode 100644 minecraft/locales/el-GR.po create mode 100644 minecraft/locales/es-ES.po create mode 100644 minecraft/locales/fi-FI.po create mode 100644 minecraft/locales/fr-FR.po create mode 100644 minecraft/locales/it-IT.po create mode 100644 minecraft/locales/ja-JP.po create mode 100644 minecraft/locales/messages.pot create mode 100644 minecraft/locales/nl-NL.po create mode 100644 minecraft/locales/pl-PL.po create mode 100644 minecraft/locales/pt-BR.po create mode 100644 minecraft/locales/pt-PT.po create mode 100644 minecraft/locales/ro-RO.po create mode 100644 minecraft/locales/ru-RU.po create mode 100644 minecraft/locales/tr-TR.po create mode 100644 minecraft/locales/uk-UA.po create mode 100644 minecraft/minecraft.py create mode 100644 minecraft/utils_version.json create mode 100644 mod/__init__.py create mode 100644 mod/_tagscript.py create mode 100644 mod/info.json create mode 100644 mod/mod.py create mode 100644 onetrueslash/__init__.py create mode 100644 onetrueslash/channel.py create mode 100644 onetrueslash/commands.py create mode 100644 onetrueslash/context.py create mode 100644 onetrueslash/events.py create mode 100644 onetrueslash/info.json create mode 100644 onetrueslash/message.py create mode 100644 onetrueslash/utils.py create mode 100644 onthisday/README.rst create mode 100644 onthisday/__init__.py create mode 100644 onthisday/info.json create mode 100644 pokemonduel/__init__.py create mode 100644 pokemonduel/battle.py create mode 100644 pokemonduel/buttons.py create mode 100644 pokemonduel/commands.py create mode 100644 pokemonduel/data.py create mode 100644 pokemonduel/data/abilities.json create mode 100644 pokemonduel/data/forms.json create mode 100644 pokemonduel/data/items.json create mode 100644 pokemonduel/data/moves.json create mode 100644 pokemonduel/data/natures.json create mode 100644 pokemonduel/data/pfile.json create mode 100644 pokemonduel/data/poke_abilities.json create mode 100644 pokemonduel/data/pokemon_stats.json create mode 100644 pokemonduel/data/ptypes.json create mode 100644 pokemonduel/data/stat_types.json create mode 100644 pokemonduel/data/type_effectiveness.json create mode 100644 pokemonduel/enums.py create mode 100644 pokemonduel/info.json create mode 100644 pokemonduel/misc.py create mode 100644 pokemonduel/move.py create mode 100644 pokemonduel/pokemon.py create mode 100644 pokemonduel/trainer.py create mode 100644 rolehistory/__init__.py create mode 100644 rolehistory/info.json create mode 100644 rolehistory/rolehistory.py create mode 100644 simpleembed/__init__.py create mode 100644 simpleembed/info.json create mode 100644 simpleembed/simpleembed.py create mode 100644 stickbugged/__init__.py create mode 100644 stickbugged/converters.py create mode 100644 stickbugged/info.json create mode 100644 stickbugged/stickbugged.py create mode 100644 theme/__init__.py create mode 100644 theme/info.json create mode 100644 theme/theme.py create mode 100644 tickettool/README.rst create mode 100644 tickettool/__init__.py create mode 100644 tickettool/dashboard_integration.py create mode 100644 tickettool/info.json create mode 100644 tickettool/locales/de-DE.po create mode 100644 tickettool/locales/el-GR.po create mode 100644 tickettool/locales/es-ES.po create mode 100644 tickettool/locales/fi-FI.po create mode 100644 tickettool/locales/fr-FR.po create mode 100644 tickettool/locales/it-IT.po create mode 100644 tickettool/locales/ja-JP.po create mode 100644 tickettool/locales/messages.pot create mode 100644 tickettool/locales/nl-NL.po create mode 100644 tickettool/locales/pl-PL.po create mode 100644 tickettool/locales/pt-BR.po create mode 100644 tickettool/locales/pt-PT.po create mode 100644 tickettool/locales/ro-RO.po create mode 100644 tickettool/locales/ru-RU.po create mode 100644 tickettool/locales/tr-TR.po create mode 100644 tickettool/locales/uk-UA.po create mode 100644 tickettool/settings.py create mode 100644 tickettool/ticket.py create mode 100644 tickettool/tickettool.py create mode 100644 tickettool/utils.py create mode 100644 tickettool/utils_version.json create mode 100644 viewpermissions/README.rst create mode 100644 viewpermissions/__init__.py create mode 100644 viewpermissions/info.json create mode 100644 viewpermissions/locales/de-DE.po create mode 100644 viewpermissions/locales/el-GR.po create mode 100644 viewpermissions/locales/es-ES.po create mode 100644 viewpermissions/locales/fi-FI.po create mode 100644 viewpermissions/locales/fr-FR.po create mode 100644 viewpermissions/locales/it-IT.po create mode 100644 viewpermissions/locales/ja-JP.po create mode 100644 viewpermissions/locales/messages.pot create mode 100644 viewpermissions/locales/nl-NL.po create mode 100644 viewpermissions/locales/pl-PL.po create mode 100644 viewpermissions/locales/pt-BR.po create mode 100644 viewpermissions/locales/pt-PT.po create mode 100644 viewpermissions/locales/ro-RO.po create mode 100644 viewpermissions/locales/ru-RU.po create mode 100644 viewpermissions/locales/tr-TR.po create mode 100644 viewpermissions/locales/uk-UA.po create mode 100644 viewpermissions/types.py create mode 100644 viewpermissions/utils_version.json create mode 100644 viewpermissions/view.py create mode 100644 viewpermissions/viewpermissions.py diff --git a/dictionary/README.rst b/dictionary/README.rst new file mode 100644 index 0000000..9d4a49c --- /dev/null +++ b/dictionary/README.rst @@ -0,0 +1,64 @@ +.. _dictionary: +========== +Dictionary +========== + +This is the cog guide for the ``Dictionary`` cog. This guide contains the collection of commands which you can use in the cog. +Through this guide, ``[p]`` will always represent your prefix. Replace ``[p]`` with your own prefix when you use these commands in Discord. + +.. note:: + + Ensure that you are up to date by running ``[p]cog update dictionary``. + If there is something missing, or something that needs improving in this documentation, feel free to create an issue `here `_. + This documentation is generated everytime this cog receives an update. + +--------------- +About this cog: +--------------- + +A cog to search an english term/word in the dictionary! Synonyms, antonyms, phonetics (with audio)... + +--------- +Commands: +--------- + +Here are all the commands included in this cog (1): + +* ``[p]dictionary `` + Search a word in the english dictionnary. + +------------ +Installation +------------ + +If you haven't added my repo before, lets add it first. We'll call it "AAA3A-cogs" here. + +.. code-block:: ini + + [p]repo add AAA3A-cogs https://github.com/AAA3A-AAA3A/AAA3A-cogs + +Now, we can install Dictionary. + +.. code-block:: ini + + [p]cog install AAA3A-cogs dictionary + +Once it's installed, it is not loaded by default. Load it by running the following command: + +.. code-block:: ini + + [p]load dictionary + +---------------- +Further Support: +---------------- + +Check out my docs `here `_. +Mention me in the #support_other-cogs in the `cog support server `_ if you need any help. +Additionally, feel free to open an issue or pull request to this repo. + +-------- +Credits: +-------- + +Thanks to Kreusada for the Python code to automatically generate this documentation! \ No newline at end of file diff --git a/dictionary/locales/de-DE.po b/dictionary/locales/de-DE.po new file mode 100644 index 0000000..2723b32 --- /dev/null +++ b/dictionary/locales/de-DE.po @@ -0,0 +1,32 @@ +msgid "" +msgstr "" +"Project-Id-Version: aaa3a-cogs\n" +"POT-Creation-Date: 2024-07-20 22:14+0200\n" +"PO-Revision-Date: 2024-07-20 20:23\n" +"Last-Translator: \n" +"Language-Team: German\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: redgettext 3.4.2\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Crowdin-Project: aaa3a-cogs\n" +"X-Crowdin-Project-ID: 531090\n" +"X-Crowdin-Language: de\n" +"X-Crowdin-File: /[AAA3A-AAA3A.AAA3A-cogs] main/dictionary/locales/messages.pot\n" +"X-Crowdin-File-ID: 229\n" +"Language: de_DE\n" + +#: dictionary\dictionary.py:23 +#, docstring +msgid "A cog to search an english term/word in the dictionary! Synonyms, antonyms, phonetics (with audio)..." +msgstr "Ein Zahnrad, um einen englischen Begriff/Wort im Wörterbuch zu suchen! Synonyme, Antonyme, Phonetik (mit Audio)..." + +#: dictionary\dictionary.py:86 +msgid "Word not found in English dictionary." +msgstr "Wort nicht im englischen Wörterbuch gefunden." + +#: dictionary\view.py:33 +msgid "View the source" +msgstr "Quelle anzeigen" + diff --git a/dictionary/locales/el-GR.po b/dictionary/locales/el-GR.po new file mode 100644 index 0000000..e3de6d6 --- /dev/null +++ b/dictionary/locales/el-GR.po @@ -0,0 +1,32 @@ +msgid "" +msgstr "" +"Project-Id-Version: aaa3a-cogs\n" +"POT-Creation-Date: 2024-07-20 22:14+0200\n" +"PO-Revision-Date: 2024-07-20 20:23\n" +"Last-Translator: \n" +"Language-Team: Greek\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: redgettext 3.4.2\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Crowdin-Project: aaa3a-cogs\n" +"X-Crowdin-Project-ID: 531090\n" +"X-Crowdin-Language: el\n" +"X-Crowdin-File: /[AAA3A-AAA3A.AAA3A-cogs] main/dictionary/locales/messages.pot\n" +"X-Crowdin-File-ID: 229\n" +"Language: el_GR\n" + +#: dictionary\dictionary.py:23 +#, docstring +msgid "A cog to search an english term/word in the dictionary! Synonyms, antonyms, phonetics (with audio)..." +msgstr "Ένα γρανάζι για την αναζήτηση ενός αγγλικού όρου/λέξης στο λεξικό! Συνώνυμα, αντώνυμα, φωνητική (με ήχο)..." + +#: dictionary\dictionary.py:86 +msgid "Word not found in English dictionary." +msgstr "Λέξη που δεν υπάρχει στο αγγλικό λεξικό." + +#: dictionary\view.py:33 +msgid "View the source" +msgstr "Δείτε την πηγή" + diff --git a/dictionary/locales/es-ES.po b/dictionary/locales/es-ES.po new file mode 100644 index 0000000..6c64c4f --- /dev/null +++ b/dictionary/locales/es-ES.po @@ -0,0 +1,32 @@ +msgid "" +msgstr "" +"Project-Id-Version: aaa3a-cogs\n" +"POT-Creation-Date: 2024-07-20 22:14+0200\n" +"PO-Revision-Date: 2024-07-20 20:23\n" +"Last-Translator: \n" +"Language-Team: Spanish\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: redgettext 3.4.2\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Crowdin-Project: aaa3a-cogs\n" +"X-Crowdin-Project-ID: 531090\n" +"X-Crowdin-Language: es-ES\n" +"X-Crowdin-File: /[AAA3A-AAA3A.AAA3A-cogs] main/dictionary/locales/messages.pot\n" +"X-Crowdin-File-ID: 229\n" +"Language: es_ES\n" + +#: dictionary\dictionary.py:23 +#, docstring +msgid "A cog to search an english term/word in the dictionary! Synonyms, antonyms, phonetics (with audio)..." +msgstr "Un engranaje para buscar un término/palabra en inglés en el diccionario. Sinónimos, antónimos, fonética (con audio)..." + +#: dictionary\dictionary.py:86 +msgid "Word not found in English dictionary." +msgstr "Palabra no encontrada en el diccionario inglés." + +#: dictionary\view.py:33 +msgid "View the source" +msgstr "Ver la fuente" + diff --git a/dictionary/locales/fi-FI.po b/dictionary/locales/fi-FI.po new file mode 100644 index 0000000..3dc9faa --- /dev/null +++ b/dictionary/locales/fi-FI.po @@ -0,0 +1,32 @@ +msgid "" +msgstr "" +"Project-Id-Version: aaa3a-cogs\n" +"POT-Creation-Date: 2024-07-20 22:14+0200\n" +"PO-Revision-Date: 2024-07-20 20:23\n" +"Last-Translator: \n" +"Language-Team: Finnish\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: redgettext 3.4.2\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Crowdin-Project: aaa3a-cogs\n" +"X-Crowdin-Project-ID: 531090\n" +"X-Crowdin-Language: fi\n" +"X-Crowdin-File: /[AAA3A-AAA3A.AAA3A-cogs] main/dictionary/locales/messages.pot\n" +"X-Crowdin-File-ID: 229\n" +"Language: fi_FI\n" + +#: dictionary\dictionary.py:23 +#, docstring +msgid "A cog to search an english term/word in the dictionary! Synonyms, antonyms, phonetics (with audio)..." +msgstr "Hammasratas, jolla voi etsiä englanninkielistä termiä/sanaa sanakirjasta! Synonyymit, antonyymit, fonetiikka (äänen kanssa)..." + +#: dictionary\dictionary.py:86 +msgid "Word not found in English dictionary." +msgstr "Sanaa ei löydy englannin sanakirjasta." + +#: dictionary\view.py:33 +msgid "View the source" +msgstr "Katso lähde" + diff --git a/dictionary/locales/fr-FR.po b/dictionary/locales/fr-FR.po new file mode 100644 index 0000000..97b5540 --- /dev/null +++ b/dictionary/locales/fr-FR.po @@ -0,0 +1,32 @@ +msgid "" +msgstr "" +"Project-Id-Version: aaa3a-cogs\n" +"POT-Creation-Date: 2024-07-20 22:14+0200\n" +"PO-Revision-Date: 2024-07-20 20:23\n" +"Last-Translator: \n" +"Language-Team: French\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: redgettext 3.4.2\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"X-Crowdin-Project: aaa3a-cogs\n" +"X-Crowdin-Project-ID: 531090\n" +"X-Crowdin-Language: fr\n" +"X-Crowdin-File: /[AAA3A-AAA3A.AAA3A-cogs] main/dictionary/locales/messages.pot\n" +"X-Crowdin-File-ID: 229\n" +"Language: fr_FR\n" + +#: dictionary\dictionary.py:23 +#, docstring +msgid "A cog to search an english term/word in the dictionary! Synonyms, antonyms, phonetics (with audio)..." +msgstr "Un rouage pour rechercher un terme/mot anglais dans le dictionnaire ! Synonymes, antonymes, phonétique (avec audio)..." + +#: dictionary\dictionary.py:86 +msgid "Word not found in English dictionary." +msgstr "Mot non trouvé dans le dictionnaire anglais." + +#: dictionary\view.py:33 +msgid "View the source" +msgstr "Voir la source" + diff --git a/dictionary/locales/it-IT.po b/dictionary/locales/it-IT.po new file mode 100644 index 0000000..c7b13cd --- /dev/null +++ b/dictionary/locales/it-IT.po @@ -0,0 +1,32 @@ +msgid "" +msgstr "" +"Project-Id-Version: aaa3a-cogs\n" +"POT-Creation-Date: 2024-07-20 22:14+0200\n" +"PO-Revision-Date: 2024-07-20 20:23\n" +"Last-Translator: \n" +"Language-Team: Italian\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: redgettext 3.4.2\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Crowdin-Project: aaa3a-cogs\n" +"X-Crowdin-Project-ID: 531090\n" +"X-Crowdin-Language: it\n" +"X-Crowdin-File: /[AAA3A-AAA3A.AAA3A-cogs] main/dictionary/locales/messages.pot\n" +"X-Crowdin-File-ID: 229\n" +"Language: it_IT\n" + +#: dictionary\dictionary.py:23 +#, docstring +msgid "A cog to search an english term/word in the dictionary! Synonyms, antonyms, phonetics (with audio)..." +msgstr "Un ingranaggio per cercare un termine/parola inglese nel dizionario! Sinonimi, contrari, fonetica (con audio)..." + +#: dictionary\dictionary.py:86 +msgid "Word not found in English dictionary." +msgstr "Parola non trovata nel dizionario inglese." + +#: dictionary\view.py:33 +msgid "View the source" +msgstr "Visualizza la fonte" + diff --git a/dictionary/locales/ja-JP.po b/dictionary/locales/ja-JP.po new file mode 100644 index 0000000..ba46b60 --- /dev/null +++ b/dictionary/locales/ja-JP.po @@ -0,0 +1,32 @@ +msgid "" +msgstr "" +"Project-Id-Version: aaa3a-cogs\n" +"POT-Creation-Date: 2024-07-20 22:14+0200\n" +"PO-Revision-Date: 2024-07-20 20:23\n" +"Last-Translator: \n" +"Language-Team: Japanese\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: redgettext 3.4.2\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Crowdin-Project: aaa3a-cogs\n" +"X-Crowdin-Project-ID: 531090\n" +"X-Crowdin-Language: ja\n" +"X-Crowdin-File: /[AAA3A-AAA3A.AAA3A-cogs] main/dictionary/locales/messages.pot\n" +"X-Crowdin-File-ID: 229\n" +"Language: ja_JP\n" + +#: dictionary\dictionary.py:23 +#, docstring +msgid "A cog to search an english term/word in the dictionary! Synonyms, antonyms, phonetics (with audio)..." +msgstr "辞書で英単語を検索するための歯車です!類義語、反意語、音声(音声付き)...。" + +#: dictionary\dictionary.py:86 +msgid "Word not found in English dictionary." +msgstr "英語の辞書に載っていない単語。" + +#: dictionary\view.py:33 +msgid "View the source" +msgstr "ソースを見る" + diff --git a/dictionary/locales/messages.pot b/dictionary/locales/messages.pot new file mode 100644 index 0000000..9c61ad5 --- /dev/null +++ b/dictionary/locales/messages.pot @@ -0,0 +1,31 @@ +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2025-03-15 23:04+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: redgettext 3.4.2\n" + +#: dictionary\dictionary.py:23 +#, docstring +msgid "" +"A cog to search an english term/word in the dictionary! Synonyms, antonyms, " +"phonetics (with audio)..." +msgstr "" + +#: dictionary\dictionary.py:87 +msgid "Word not found in English dictionary." +msgstr "" + +#: dictionary\view.py:33 +msgid "View the source" +msgstr "" + +#: dictionary\view.py:46 +msgid "You are not allowed to use this interaction." +msgstr "" diff --git a/dictionary/locales/nl-NL.po b/dictionary/locales/nl-NL.po new file mode 100644 index 0000000..21fa5b8 --- /dev/null +++ b/dictionary/locales/nl-NL.po @@ -0,0 +1,32 @@ +msgid "" +msgstr "" +"Project-Id-Version: aaa3a-cogs\n" +"POT-Creation-Date: 2024-07-20 22:14+0200\n" +"PO-Revision-Date: 2024-07-20 20:23\n" +"Last-Translator: \n" +"Language-Team: Dutch\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: redgettext 3.4.2\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Crowdin-Project: aaa3a-cogs\n" +"X-Crowdin-Project-ID: 531090\n" +"X-Crowdin-Language: nl\n" +"X-Crowdin-File: /[AAA3A-AAA3A.AAA3A-cogs] main/dictionary/locales/messages.pot\n" +"X-Crowdin-File-ID: 229\n" +"Language: nl_NL\n" + +#: dictionary\dictionary.py:23 +#, docstring +msgid "A cog to search an english term/word in the dictionary! Synonyms, antonyms, phonetics (with audio)..." +msgstr "Een radertje om een Engelse term/woord te zoeken in het woordenboek! Synoniemen, antoniemen, fonetiek (met audio)..." + +#: dictionary\dictionary.py:86 +msgid "Word not found in English dictionary." +msgstr "Woord niet gevonden in Engels woordenboek." + +#: dictionary\view.py:33 +msgid "View the source" +msgstr "Bekijk de bron" + diff --git a/dictionary/locales/pl-PL.po b/dictionary/locales/pl-PL.po new file mode 100644 index 0000000..40da3ba --- /dev/null +++ b/dictionary/locales/pl-PL.po @@ -0,0 +1,32 @@ +msgid "" +msgstr "" +"Project-Id-Version: aaa3a-cogs\n" +"POT-Creation-Date: 2024-07-20 22:14+0200\n" +"PO-Revision-Date: 2024-07-20 20:23\n" +"Last-Translator: \n" +"Language-Team: Polish\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: redgettext 3.4.2\n" +"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n" +"X-Crowdin-Project: aaa3a-cogs\n" +"X-Crowdin-Project-ID: 531090\n" +"X-Crowdin-Language: pl\n" +"X-Crowdin-File: /[AAA3A-AAA3A.AAA3A-cogs] main/dictionary/locales/messages.pot\n" +"X-Crowdin-File-ID: 229\n" +"Language: pl_PL\n" + +#: dictionary\dictionary.py:23 +#, docstring +msgid "A cog to search an english term/word in the dictionary! Synonyms, antonyms, phonetics (with audio)..." +msgstr "Trybik do wyszukiwania angielskiego terminu/słowa w słowniku! Synonimy, antonimy, fonetyka (z dźwiękiem)..." + +#: dictionary\dictionary.py:86 +msgid "Word not found in English dictionary." +msgstr "Słowo nie występujące w słowniku języka angielskiego." + +#: dictionary\view.py:33 +msgid "View the source" +msgstr "Zobacz źródło" + diff --git a/dictionary/locales/pt-BR.po b/dictionary/locales/pt-BR.po new file mode 100644 index 0000000..d3b8f92 --- /dev/null +++ b/dictionary/locales/pt-BR.po @@ -0,0 +1,32 @@ +msgid "" +msgstr "" +"Project-Id-Version: aaa3a-cogs\n" +"POT-Creation-Date: 2024-07-20 22:14+0200\n" +"PO-Revision-Date: 2024-07-20 20:23\n" +"Last-Translator: \n" +"Language-Team: Portuguese, Brazilian\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: redgettext 3.4.2\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Crowdin-Project: aaa3a-cogs\n" +"X-Crowdin-Project-ID: 531090\n" +"X-Crowdin-Language: pt-BR\n" +"X-Crowdin-File: /[AAA3A-AAA3A.AAA3A-cogs] main/dictionary/locales/messages.pot\n" +"X-Crowdin-File-ID: 229\n" +"Language: pt_BR\n" + +#: dictionary\dictionary.py:23 +#, docstring +msgid "A cog to search an english term/word in the dictionary! Synonyms, antonyms, phonetics (with audio)..." +msgstr "Uma engrenagem para procurar um termo/palavra inglesa no dicionário! Sinónimos, antónimos, fonética (com áudio)..." + +#: dictionary\dictionary.py:86 +msgid "Word not found in English dictionary." +msgstr "Palavra não encontrada no dicionário de inglês." + +#: dictionary\view.py:33 +msgid "View the source" +msgstr "Ver a fonte" + diff --git a/dictionary/locales/pt-PT.po b/dictionary/locales/pt-PT.po new file mode 100644 index 0000000..55f3f0a --- /dev/null +++ b/dictionary/locales/pt-PT.po @@ -0,0 +1,32 @@ +msgid "" +msgstr "" +"Project-Id-Version: aaa3a-cogs\n" +"POT-Creation-Date: 2024-07-20 22:14+0200\n" +"PO-Revision-Date: 2024-07-20 20:23\n" +"Last-Translator: \n" +"Language-Team: Portuguese\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: redgettext 3.4.2\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Crowdin-Project: aaa3a-cogs\n" +"X-Crowdin-Project-ID: 531090\n" +"X-Crowdin-Language: pt-PT\n" +"X-Crowdin-File: /[AAA3A-AAA3A.AAA3A-cogs] main/dictionary/locales/messages.pot\n" +"X-Crowdin-File-ID: 229\n" +"Language: pt_PT\n" + +#: dictionary\dictionary.py:23 +#, docstring +msgid "A cog to search an english term/word in the dictionary! Synonyms, antonyms, phonetics (with audio)..." +msgstr "Uma engrenagem para procurar um termo/palavra inglesa no dicionário! Sinónimos, antónimos, fonética (com áudio)..." + +#: dictionary\dictionary.py:86 +msgid "Word not found in English dictionary." +msgstr "Palavra não encontrada no dicionário de inglês." + +#: dictionary\view.py:33 +msgid "View the source" +msgstr "Ver a fonte" + diff --git a/dictionary/locales/ro-RO.po b/dictionary/locales/ro-RO.po new file mode 100644 index 0000000..3711ac2 --- /dev/null +++ b/dictionary/locales/ro-RO.po @@ -0,0 +1,32 @@ +msgid "" +msgstr "" +"Project-Id-Version: aaa3a-cogs\n" +"POT-Creation-Date: 2024-07-20 22:14+0200\n" +"PO-Revision-Date: 2024-07-20 20:23\n" +"Last-Translator: \n" +"Language-Team: Romanian\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: redgettext 3.4.2\n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100>0 && n%100<20)) ? 1 : 2);\n" +"X-Crowdin-Project: aaa3a-cogs\n" +"X-Crowdin-Project-ID: 531090\n" +"X-Crowdin-Language: ro\n" +"X-Crowdin-File: /[AAA3A-AAA3A.AAA3A-cogs] main/dictionary/locales/messages.pot\n" +"X-Crowdin-File-ID: 229\n" +"Language: ro_RO\n" + +#: dictionary\dictionary.py:23 +#, docstring +msgid "A cog to search an english term/word in the dictionary! Synonyms, antonyms, phonetics (with audio)..." +msgstr "O rotiță pentru a căuta un termen/cuvânt englezesc în dicționar! Sinonime, antonime, fonetică (cu audio)..." + +#: dictionary\dictionary.py:86 +msgid "Word not found in English dictionary." +msgstr "Cuvânt care nu se găsește în dicționarul englez." + +#: dictionary\view.py:33 +msgid "View the source" +msgstr "Vezi sursa" + diff --git a/dictionary/locales/ru-RU.po b/dictionary/locales/ru-RU.po new file mode 100644 index 0000000..588eb34 --- /dev/null +++ b/dictionary/locales/ru-RU.po @@ -0,0 +1,32 @@ +msgid "" +msgstr "" +"Project-Id-Version: aaa3a-cogs\n" +"POT-Creation-Date: 2024-07-20 22:14+0200\n" +"PO-Revision-Date: 2024-07-20 20:23\n" +"Last-Translator: \n" +"Language-Team: Russian\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: redgettext 3.4.2\n" +"Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n" +"X-Crowdin-Project: aaa3a-cogs\n" +"X-Crowdin-Project-ID: 531090\n" +"X-Crowdin-Language: ru\n" +"X-Crowdin-File: /[AAA3A-AAA3A.AAA3A-cogs] main/dictionary/locales/messages.pot\n" +"X-Crowdin-File-ID: 229\n" +"Language: ru_RU\n" + +#: dictionary\dictionary.py:23 +#, docstring +msgid "A cog to search an english term/word in the dictionary! Synonyms, antonyms, phonetics (with audio)..." +msgstr "Коготь для поиска английского термина/слова в словаре! Синонимы, антонимы, фонетика (с аудио)..." + +#: dictionary\dictionary.py:86 +msgid "Word not found in English dictionary." +msgstr "Слово не найдено в английском словаре." + +#: dictionary\view.py:33 +msgid "View the source" +msgstr "Просмотреть источник" + diff --git a/dictionary/locales/tr-TR.po b/dictionary/locales/tr-TR.po new file mode 100644 index 0000000..58edca8 --- /dev/null +++ b/dictionary/locales/tr-TR.po @@ -0,0 +1,32 @@ +msgid "" +msgstr "" +"Project-Id-Version: aaa3a-cogs\n" +"POT-Creation-Date: 2024-07-20 22:14+0200\n" +"PO-Revision-Date: 2024-07-21 13:27\n" +"Last-Translator: \n" +"Language-Team: Turkish\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: redgettext 3.4.2\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Crowdin-Project: aaa3a-cogs\n" +"X-Crowdin-Project-ID: 531090\n" +"X-Crowdin-Language: tr\n" +"X-Crowdin-File: /[AAA3A-AAA3A.AAA3A-cogs] main/dictionary/locales/messages.pot\n" +"X-Crowdin-File-ID: 229\n" +"Language: tr_TR\n" + +#: dictionary\dictionary.py:23 +#, docstring +msgid "A cog to search an english term/word in the dictionary! Synonyms, antonyms, phonetics (with audio)..." +msgstr "İngilizce bir terimi/kelimeyi sözlükte aramak için bir cog! Eşanlamlılar, zıt anlamlılar, fonetik (sesli)..." + +#: dictionary\dictionary.py:86 +msgid "Word not found in English dictionary." +msgstr "Kelime İngilizce sözlükte bulunamadı." + +#: dictionary\view.py:33 +msgid "View the source" +msgstr "Kaynağı görüntüle" + diff --git a/dictionary/locales/uk-UA.po b/dictionary/locales/uk-UA.po new file mode 100644 index 0000000..587d645 --- /dev/null +++ b/dictionary/locales/uk-UA.po @@ -0,0 +1,32 @@ +msgid "" +msgstr "" +"Project-Id-Version: aaa3a-cogs\n" +"POT-Creation-Date: 2024-07-20 22:14+0200\n" +"PO-Revision-Date: 2024-07-20 20:23\n" +"Last-Translator: \n" +"Language-Team: Ukrainian\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: redgettext 3.4.2\n" +"Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n" +"X-Crowdin-Project: aaa3a-cogs\n" +"X-Crowdin-Project-ID: 531090\n" +"X-Crowdin-Language: uk\n" +"X-Crowdin-File: /[AAA3A-AAA3A.AAA3A-cogs] main/dictionary/locales/messages.pot\n" +"X-Crowdin-File-ID: 229\n" +"Language: uk_UA\n" + +#: dictionary\dictionary.py:23 +#, docstring +msgid "A cog to search an english term/word in the dictionary! Synonyms, antonyms, phonetics (with audio)..." +msgstr "Гвинтик для пошуку англійського терміну/слова у словнику! Синоніми, антоніми, фонетика (з аудіо)..." + +#: dictionary\dictionary.py:86 +msgid "Word not found in English dictionary." +msgstr "Слово не знайдено в англійському словнику." + +#: dictionary\view.py:33 +msgid "View the source" +msgstr "Переглянути джерело" + diff --git a/dictionary/types.py b/dictionary/types.py new file mode 100644 index 0000000..238363d --- /dev/null +++ b/dictionary/types.py @@ -0,0 +1,60 @@ +import discord # isort:skip +import typing # isort:skip + +from dataclasses import dataclass + +from redbot.core.utils.chat_formatting import humanize_list + + +@dataclass(frozen=True) +class Word: + url: str + source_url: str + word: str + phonetics: typing.List[typing.Dict[str, typing.Optional[str]]] + meanings: typing.Dict[ + str, + typing.Dict[ + str, + typing.List[typing.Dict[str, typing.Optional[typing.Union[str, typing.List[str]]]]], + ], + ] + + def to_json(self) -> typing.Dict[str, typing.Any]: + return { + v: getattr(self, v) + for v in dir(self) + if not v.startswith("_") and v != "to_json" and v != "to_embed" + } + + def to_embed(self, embed_color: discord.Color = discord.Color.green()) -> discord.Embed: + embed: discord.Embed = discord.Embed( + title=f'Dictionary - "{self.word}"', url=self.source_url, color=embed_color + ) + for meaning in self.meanings: + if len(embed.fields) >= 10: + break + value = "\n\n".join( + [ + (f"**{n}.** " if len(self.meanings[meaning]) > 1 else "") + + f"{definition['definition']}" + + ( + f"\n- Synonyms: {humanize_list(definition['synonyms'])}" + if definition["synonyms"] + else "" + ) + + ( + f"\n- Antonyms: {humanize_list(definition['antonyms'])}" + if definition["antonyms"] + else "" + ) + + (f"\n> Example: {definition['example']}" if definition["example"] else "") + for n, definition in enumerate(self.meanings[meaning], start=1) + ] + ) + embed.add_field( + name=meaning.capitalize(), + value=value if len(value) <= 1024 else f"{value[:1020]}\n...", + inline=False, + ) + return embed diff --git a/dictionary/utils_version.json b/dictionary/utils_version.json new file mode 100644 index 0000000..bfab002 --- /dev/null +++ b/dictionary/utils_version.json @@ -0,0 +1 @@ +{"needed_utils_version": 7.0} \ No newline at end of file diff --git a/dictionary/view.py b/dictionary/view.py new file mode 100644 index 0000000..2e312e7 --- /dev/null +++ b/dictionary/view.py @@ -0,0 +1,120 @@ +from AAA3A_utils import Menu, CogsUtils # isort:skip +from redbot.core import commands # isort:skip +from redbot.core.i18n import Translator # isort:skip +import discord # isort:skip + +import asyncio +from io import BytesIO + +import aiohttp + +from .types import Word + +_: Translator = Translator("Dictionary", __file__) + + +class DictionaryView(discord.ui.View): + def __init__(self, cog: commands.Cog, word: Word) -> None: + super().__init__(timeout=180) + self.cog: commands.Cog = cog + self.ctx: commands.Context = None + + self.word: Word = word + + self._message: discord.Message = None + self._ready: asyncio.Event = asyncio.Event() + + async def start(self, ctx: commands.Context) -> discord.Message: + self.ctx: commands.Context = ctx + embed = self.word.to_embed(embed_color=await ctx.embed_color()) + if self.word.source_url: + self.add_item( + discord.ui.Button( + label=_("View the source"), + url=self.word.source_url, + style=discord.ButtonStyle.url, + ) + ) + self._message: discord.Message = await self.ctx.send(embed=embed, view=self) + self.cog.views[self._message] = self + await self._ready.wait() + return self._message + + async def interaction_check(self, interaction: discord.Interaction) -> bool: + if interaction.user.id not in [self.ctx.author.id] + list(self.ctx.bot.owner_ids): + await interaction.response.send_message( + _("You are not allowed to use this interaction."), ephemeral=True + ) + return False + return True + + async def on_timeout(self) -> None: + for child in self.children: + child: discord.ui.Item + if hasattr(child, "disabled") and not ( + isinstance(child, discord.ui.Button) and child.style == discord.ButtonStyle.url + ): + child.disabled = True + try: + await self._message.edit(view=self) + except discord.HTTPException: + pass + self._ready.set() + + @discord.ui.button(style=discord.ButtonStyle.danger, emoji="✖️", custom_id="close_page") + async def close_page( + self, interaction: discord.Interaction, button: discord.ui.Button + ) -> None: + try: + await interaction.response.defer() + except discord.errors.NotFound: + pass + self.stop() + await CogsUtils.delete_message(self._message) + self._ready.set() + + @discord.ui.button( + label="Phonetics", custom_id="show_phonetics", style=discord.ButtonStyle.secondary + ) + async def show_phonetics( + self, interaction: discord.Interaction, button: discord.ui.Button + ) -> None: + await interaction.response.defer() + embed: discord.Embed = discord.Embed(title="Phonetics", color=await self.ctx.embed_color()) + embed.description = "\n".join( + [ + ( + ( + f"**•** [**`{phonetic['text'] or 'Name not provided'}`**]({phonetic['audio_url']})" + + ( + f" ({phonetic['audio_url'].split('/')[-1]})" + if phonetic["audio_url"] + else "" + ) + ) + if phonetic["audio_url"] + else f"**•** **`{phonetic['text']}`**" + ) + for phonetic in self.word.phonetics + ] + ) + files = [] + if self.ctx.bot_permissions.attach_files: + for phonetic in self.word.phonetics: + if phonetic["audio_url"] is None: + continue + if phonetic["audio_file"] is not None: + files.append(phonetic["audio_file"]) + continue + try: + async with self.cog._session.get( + phonetic["audio_url"], raise_for_status=True + ) as r: + file = discord.File( + BytesIO(await r.read()), filename=phonetic["audio_url"].split("/")[-1] + ) + except (aiohttp.InvalidURL, aiohttp.ClientResponseError): + continue + phonetic["audio_file"] = file + files.append(file) + await Menu(pages=[{"embed": embed, "files": files}]).start(self.ctx) diff --git a/fakemod/__init__.py b/fakemod/__init__.py new file mode 100644 index 0000000..2a573f4 --- /dev/null +++ b/fakemod/__init__.py @@ -0,0 +1,37 @@ +""" +MIT License + +Copyright (c) 2021-present Kuro-Rui + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +""" + +import json +from pathlib import Path + +from redbot.core.bot import Red + +from .fakemod import FakeMod + +with open(Path(__file__).parent / "info.json") as fp: + __red_end_user_data_statement__ = json.load(fp)["end_user_data_statement"] + + +async def setup(bot: Red): + await bot.add_cog(FakeMod(bot)) diff --git a/fakemod/converters.py b/fakemod/converters.py new file mode 100644 index 0000000..94f4205 --- /dev/null +++ b/fakemod/converters.py @@ -0,0 +1,34 @@ +""" +MIT License + +Copyright (c) 2021-present Kuro-Rui + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +""" + +from redbot.core.commands import BadArgument, Context, Converter + + +class Action(Converter): + async def convert(self, ctx: Context, argument): + if argument.lower() not in ["warn", "mute", "kick", "ban"]: + raise BadArgument( + "I can't find that action. You can choose either `warn`, `mute`, `kick`, and `ban`." + ) + return argument.lower() diff --git a/fakemod/fakemod.py b/fakemod/fakemod.py new file mode 100644 index 0000000..843802f --- /dev/null +++ b/fakemod/fakemod.py @@ -0,0 +1,239 @@ +""" +MIT License + +Copyright (c) 2021-present Kuro-Rui + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +""" + +import asyncio +from typing import Literal, Optional + +import discord +import kuroutils +from kuroutils.converters import Emoji +from redbot.core import Config, commands +from redbot.core.bot import Red +from redbot.core.utils.predicates import MessagePredicate + +from .converters import Action + + +# Inspired by Jeff (https://github.com/Noa-DiscordBot/Noa-Cogs/blob/main/fakemod/fakemod.py) +class FakeMod(kuroutils.Cog): + """Fake moderation tools to prank your friends!""" + + __author__ = ["Kuro"] + __version__ = "0.1.1" + + def __init__(self, bot: Red): + super().__init__(bot) + self._config = Config.get_conf(self, 9863948134, True) + self._config.register_guild( + channel=None, + case_id=1, + warn_emoji="\N{HEAVY HEART EXCLAMATION MARK ORNAMENT}\N{VARIATION SELECTOR-16}", + mute_emoji="\N{FACE WITH FINGER COVERING CLOSED LIPS}", + kick_emoji="\N{HIGH-HEELED SHOE}", + ban_emoji="\N{COLLISION SYMBOL}", + ) + + @commands.guild_only() + @commands.admin_or_permissions(manage_guild=True) + @commands.group() + async def fakemodlogset(self, ctx: commands.Context): + """Manage fake modlog settings.""" + pass + + @fakemodlogset.command(aliases=["channel"]) + async def modlog(self, ctx: commands.Context, channel: discord.TextChannel = None): + """ + Set a channel as the fake modlog. + + Omit [channel] to disable the fake modlog. + """ + if channel: + if ctx.channel.permissions_for(channel.guild.me).send_messages: + await self._config.guild(ctx.guild).channel.set(channel.id) + await ctx.send(f"Fake mod events will be sent to {channel.mention}.") + else: + await ctx.send("Please grant me permission to send message in that channel first.") + else: + await self._config.guild(ctx.guild).channel.clear() + await ctx.send("Fake mod log deactivated.") + + @fakemodlogset.command() + async def emoji(self, ctx: commands.Context, action: Action = None, emoji: Emoji = None): + """ + Set an emoji for a fake mod action. + + The `action` should be either `warn`, `mute`, `kick`, or `ban`. + """ + + config = await self._config.guild(ctx.guild).all() + if not action: + await ctx.send( + ( + f"**__Current Settings__:**\n" + f"`Fake Warn :` {config['warn_emoji']}\n" + f"`Fake Mute :` {config['mute_emoji']}\n" + f"`Fake Kick :` {config['kick_emoji']}\n" + f"`Fake Ban :` {config['ban_emoji']}" + ) + ) + return + async with self._config.guild(ctx.guild).all() as guild_settings: + guild_settings[f"{action}_emoji"] = str(emoji) if emoji else None + if not emoji: + await ctx.send(f"The emoji for `fake {action}` has been reset.") + return + await ctx.send(f"Emoji for `fake {action}` has been set to {emoji}.") + + @fakemodlogset.command() + async def resetcases(self, ctx: commands.Context): + """Reset all fake modlog cases in this server.""" + await ctx.send("Would you like to reset all fake modlog cases in this server? (yes/no)") + try: + check = MessagePredicate.yes_or_no(ctx, user=ctx.author) + await ctx.bot.wait_for("message", check=check, timeout=30) + except asyncio.TimeoutError: + await ctx.send("You took too long to respond.") + return + if check.result: + await self._config.guild(ctx.guild).case_id.set(1) + await ctx.send("Cases have been reset.") + else: + await ctx.send("No changes have been made.") + + async def send_fake_modlog( + self, + guild: discord.Guild, + action: Literal["warn", "unwarn", "mute", "unmute", "kick", "ban", "unban"], + member: discord.Member, + moderator: discord.Member, + reason: Optional[str], + ): + config = await self._config.guild(guild).all() + if config["channel"] and (fake_modlog := self.bot.get_channel(config["channel"])): + case_id: int = config["case_id"] + await self._config.guild(guild).case_id.set(case_id + 1) + action = action.replace("un", "") + emoji = config[f"{action}_emoji"] + reason = reason or "Not provided." + embed = discord.Embed( + title=f"Case #{case_id} | {action.capitalize()} {emoji}", + description=f"**Reason:** {reason}", + timestamp=discord.utils.utcnow(), + ) + embed.set_author(name=f"{member} ({member.id})") + embed.add_field(name="Moderator", value=f"{moderator} ({moderator.id})") + embed.set_footer(text="just kidding lol") + await fake_modlog.send(embed=embed) + + @commands.guild_only() + @commands.command(name="worn") + async def fake_warn( + self, ctx: commands.Context, member: discord.Member, *, reason: str = None + ): + """Fake warn a member for the specified reason.""" + if member == ctx.me: + await ctx.send("You can't warn me.") + return + if member == ctx.author: + await ctx.send("You can't warn yourself.") + return + await ctx.send(f"**{member}** has been warned.") + await self.send_fake_modlog(ctx.guild, "warn", member, ctx.author, reason) + + @commands.guild_only() + @commands.command(name="unworn") + async def fake_unwarn( + self, ctx: commands.Context, member: discord.Member, *, reason: str = None + ): + """Fake unwarn a member for the specified reason.""" + if member == ctx.author: + await ctx.send("You can't unwarn yourself.") + return + await ctx.send(f"**{member}** has been unwarned.") + await self.send_fake_modlog(ctx.guild, "unwarn", member, ctx.author, reason) + + @commands.guild_only() + @commands.command(name="myut", aliases=["moot"]) + async def fake_mute( + self, ctx: commands.Context, member: discord.Member, *, reason: str = None + ): + """Fake mute a member.""" + if member == ctx.me: + await ctx.send("You can't mute me.") + return + if member == ctx.author: + await ctx.send("You can't mute yourself.") + return + await ctx.send(f"**{member}** has been muted in this server.") + await self.send_fake_modlog(ctx.guild, "mute", member, ctx.author, reason) + + @commands.guild_only() + @commands.command(name="unmyut", aliases=["unmoot"]) + async def fake_unmute( + self, ctx: commands.Context, member: discord.Member, *, reason: str = None + ): + """Fake unmute a member.""" + if member == ctx.author: + await ctx.send("You can't unmute yourself.") + return + await ctx.send(f"**{member}** has been unmuted in this server.") + await self.send_fake_modlog(ctx.guild, "unmute", member, ctx.author, reason) + + @commands.guild_only() + @commands.command(name="kik", aliases=["kek", "keck"]) + async def fake_kick( + self, ctx: commands.Context, member: discord.Member, *, reason: str = None + ): + """Fake kick a member.""" + if member == ctx.me: + await ctx.send("You can't kick me.") + return + if member == ctx.author: + await ctx.send("You can't kick yourself.") + return + await ctx.send(f"**{member}** has been kicked from the server.") + await self.send_fake_modlog(ctx.guild, "kick", member, ctx.author, reason) + + @commands.guild_only() + @commands.command(name="ben", aliases=["bam", "bon", "beam", "bean"]) + async def fake_ban(self, ctx: commands.Context, user: discord.User, *, reason: str = None): + """Fake ban a user.""" + if user == ctx.me: + await ctx.send("You can't ban me.") + return + if user == ctx.author: + await ctx.send("You can't ban yourself.") + return + await ctx.send(f"**{user}** has been banned from the server.") + await self.send_fake_modlog(ctx.guild, "ban", user, ctx.author, reason) + + @commands.guild_only() + @commands.command(name="unben", aliases=["unbam", "unbon", "unbeam", "unbean"]) + async def fake_unban(self, ctx: commands.Context, user: discord.User, *, reason: str = None): + """Fake unban a user.""" + if user == ctx.author: + await ctx.send("You can't unban yourself.") + return + await ctx.send(f"**{user}** has been unbanned from the server.") + await self.send_fake_modlog(ctx.guild, "unban", user, ctx.author, reason) diff --git a/fakemod/info.json b/fakemod/info.json new file mode 100644 index 0000000..6d8910b --- /dev/null +++ b/fakemod/info.json @@ -0,0 +1,14 @@ +{ + "author": ["Kuro"], + "description": "Fake moderation commands for fun!", + "disabled": false, + "end_user_data_statement": "This cog does not store any end user data.", + "hidden": false, + "install_msg": "Thanks for installing `FakeMod`! Get started with `[p]help FakeMod`.\nThis cog has docs! Check it out at .", + "min_bot_version": "3.5.0", + "name": "FakeMod", + "requirements": ["git+https://github.com/Kuro-Rui/Kuro-Utils"], + "short": "Fake moderation commands.", + "tags": ["ben", "fake", "fakemod", "kik", "myut", "worn"], + "type": "COG" +} \ No newline at end of file diff --git a/ip/README.rst b/ip/README.rst new file mode 100644 index 0000000..6176f5a --- /dev/null +++ b/ip/README.rst @@ -0,0 +1,82 @@ +.. _ip: +== +Ip +== + +This is the cog guide for the ``Ip`` cog. This guide contains the collection of commands which you can use in the cog. +Through this guide, ``[p]`` will always represent your prefix. Replace ``[p]`` with your own prefix when you use these commands in Discord. + +.. note:: + + Ensure that you are up to date by running ``[p]cog update ip``. + If there is something missing, or something that needs improving in this documentation, feel free to create an issue `here `_. + This documentation is generated everytime this cog receives an update. + +--------------- +About this cog: +--------------- + +A cog to get the ip address of the bot's host machine! + +--------- +Commands: +--------- + +Here are all the commands included in this cog (7): + +* ``[p]ip`` + Commands group for Ip. + +* ``[p]ip ip`` + Get the ip address of the bot's host machine. + +* ``[p]ip modalconfig [confirmation=False]`` + Set all settings for the cog with a Discord Modal. + +* ``[p]ip port `` + Set the port. + +* ``[p]ip resetsetting `` + Reset a setting. + +* ``[p]ip showsettings [with_dev=False]`` + Show all settings for the cog with defaults and values. + +* ``[p]ip website`` + Get the ip address website of the bot's host machine. + +------------ +Installation +------------ + +If you haven't added my repo before, lets add it first. We'll call it "AAA3A-cogs" here. + +.. code-block:: ini + + [p]repo add AAA3A-cogs https://github.com/AAA3A-AAA3A/AAA3A-cogs + +Now, we can install Ip. + +.. code-block:: ini + + [p]cog install AAA3A-cogs ip + +Once it's installed, it is not loaded by default. Load it by running the following command: + +.. code-block:: ini + + [p]load ip + +---------------- +Further Support: +---------------- + +Check out my docs `here `_. +Mention me in the #support_other-cogs in the `cog support server `_ if you need any help. +Additionally, feel free to open an issue or pull request to this repo. + +-------- +Credits: +-------- + +Thanks to Kreusada for the Python code to automatically generate this documentation! \ No newline at end of file diff --git a/ip/__init__.py b/ip/__init__.py new file mode 100644 index 0000000..bb59785 --- /dev/null +++ b/ip/__init__.py @@ -0,0 +1,46 @@ +from redbot.core import errors # isort:skip +import importlib +import sys + +try: + import AAA3A_utils +except ModuleNotFoundError: + raise errors.CogLoadError( + "The needed utils to run the cog were not found. Please execute the command `[p]pipinstall git+https://github.com/AAA3A-AAA3A/AAA3A_utils.git`. A restart of the bot isn't necessary." + ) +modules = sorted( + [module for module in sys.modules if module.split(".")[0] == "AAA3A_utils"], reverse=True +) +for module in modules: + try: + importlib.reload(sys.modules[module]) + except ModuleNotFoundError: + pass +del AAA3A_utils +# import AAA3A_utils +# import json +# import os +# __version__ = AAA3A_utils.__version__ +# with open(os.path.join(os.path.dirname(__file__), "utils_version.json"), mode="r") as f: +# data = json.load(f) +# needed_utils_version = data["needed_utils_version"] +# if __version__ > needed_utils_version: +# raise errors.CogLoadError( +# "The needed utils to run the cog has a higher version than the one supported by this version of the cog. Please update the cogs of the `AAA3A-cogs` repo." +# ) +# elif __version__ < needed_utils_version: +# raise errors.CogLoadError( +# "The needed utils to run the cog has a lower version than the one supported by this version of the cog. Please execute the command `[p]pipinstall --upgrade git+https://github.com/AAA3A-AAA3A/AAA3A_utils.git`. A restart of the bot isn't necessary." +# ) + +from redbot.core.bot import Red # isort:skip +from redbot.core.utils import get_end_user_data_statement + +from .ip import Ip + +__red_end_user_data_statement__ = get_end_user_data_statement(file=__file__) + + +async def setup(bot: Red) -> None: + cog = Ip(bot) + await bot.add_cog(cog) diff --git a/ip/dashboard_integration.py b/ip/dashboard_integration.py new file mode 100644 index 0000000..443e378 --- /dev/null +++ b/ip/dashboard_integration.py @@ -0,0 +1,12 @@ +from redbot.core import commands # isort:skip +from redbot.core.bot import Red # isort:skip + + +class DashboardIntegration: + bot: Red + + @commands.Cog.listener() + async def on_dashboard_cog_add(self, dashboard_cog: commands.Cog) -> None: + if hasattr(self, "settings") and hasattr(self.settings, "commands_added"): + await self.settings.commands_added.wait() + dashboard_cog.rpc.third_parties_handler.add_third_party(self) diff --git a/ip/info.json b/ip/info.json new file mode 100644 index 0000000..abf8b33 --- /dev/null +++ b/ip/info.json @@ -0,0 +1,15 @@ +{ + "author": ["AAA3A"], + "name": "Ip", + "install_msg": "This cog allows you to obtain the ip of the bot's host machine with the command `[p]ip`.", + "short": "A cog to get the ip address of the bot's host machine!", + "description": "A cog to get the ip address of the bot's host machine!", + "tags": [ + "ip", + "host", + "machine" + ], + "requirements": ["git+https://github.com/AAA3A-AAA3A/AAA3A_utils.git"], + "min_bot_version": "3.5.0", + "end_user_data_statement": "This cog does not persistently store data or metadata about users." +} diff --git a/ip/ip.py b/ip/ip.py new file mode 100644 index 0000000..c53f529 --- /dev/null +++ b/ip/ip.py @@ -0,0 +1,84 @@ +from AAA3A_utils import Cog, Settings # isort:skip +from redbot.core import commands, Config # isort:skip +from redbot.core.bot import Red # isort:skip +from redbot.core.i18n import Translator, cog_i18n # isort:skip +import typing # isort:skip + +import aiohttp + +from .dashboard_integration import DashboardIntegration + +# import socket + +# Credits: +# General repo credits. +# Thanks to @AverageGamer on Discord for the cog idea and the code to find the external ip! +# Thanks to @Flanisch on GitHub for the use of Wikipedia headers instead of the site found before (https://github.com/AAA3A-AAA3A/AAA3A-cogs/pull/)! + +_: Translator = Translator("Ip", __file__) + + +@cog_i18n(_) +class Ip(DashboardIntegration, Cog): + """A cog to get the ip address of the bot's host machine!""" + + def __init__(self, bot: Red) -> None: + super().__init__(bot=bot) + + self.config: Config = Config.get_conf( + self, + identifier=205192943327321000143939875896557571750, # 969369062738 + force_registration=True, + ) + self.config.register_global(port="0000") + + _settings: typing.Dict[ + str, typing.Dict[str, typing.Union[typing.List[str], bool, str]] + ] = { + "port": { + "converter": commands.Range[str, 4, 4], + "description": "Set the port.", + }, + } + self.settings: Settings = Settings( + bot=self.bot, + cog=self, + config=self.config, + group=self.config.GLOBAL, + settings=_settings, + global_path=[], + use_profiles_system=False, + can_edit=True, + commands_group=self.ip_group, + ) + + async def cog_load(self) -> None: + await super().cog_load() + await self.settings.add_commands() + + @commands.is_owner() + @commands.hybrid_group(name="ip") + async def ip_group(self, ctx: commands.Context) -> None: + """Commands group for Ip.""" + pass + + @ip_group.command() + async def ip(self, ctx: commands.Context) -> None: + """Get the ip address of the bot's host machine.""" + # hostname = socket.gethostname() + async with aiohttp.ClientSession() as session: + async with session.get("https://www.wikipedia.org", timeout=3) as r: + ip = r.headers["X-Client-IP"] # Gives the "public IP" of the Bot client PC + await ctx.send(_("The ip address of your bot is `{ip}`.").format(ip=ip)) + + @ip_group.command() + async def website(self, ctx: commands.Context) -> None: + """Get the ip address website of the bot's host machine.""" + # hostname = socket.gethostname() + async with aiohttp.ClientSession() as session: + async with session.get("https://www.wikipedia.org", timeout=3) as r: + ip = r.headers["X-Client-IP"] # Gives the "public IP" of the Bot client PC + port = await self.config.port() + await ctx.send( + _("The Administrator Panel website is http://{ip}:{port}/.").format(ip=ip, port=port) + ) diff --git a/ip/locales/de-DE.po b/ip/locales/de-DE.po new file mode 100644 index 0000000..82a8b2f --- /dev/null +++ b/ip/locales/de-DE.po @@ -0,0 +1,42 @@ +msgid "" +msgstr "" +"Project-Id-Version: aaa3a-cogs\n" +"POT-Creation-Date: 2024-07-20 22:14+0200\n" +"PO-Revision-Date: 2024-07-20 20:19\n" +"Last-Translator: \n" +"Language-Team: German\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: redgettext 3.4.2\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Crowdin-Project: aaa3a-cogs\n" +"X-Crowdin-Project-ID: 531090\n" +"X-Crowdin-Language: de\n" +"X-Crowdin-File: /[AAA3A-AAA3A.AAA3A-cogs] main/ip/locales/messages.pot\n" +"X-Crowdin-File-ID: 88\n" +"Language: de_DE\n" + +#: ip\ip.py:23 +#, docstring +msgid "A cog to get the ip address of the bot's host machine!" +msgstr "Ein Zahnrad, um die IP-Adresse des Host-Rechners des Bots zu erhalten!" + +#: ip\ip.py:67 +#, docstring +msgid "Get the ip address of the bot's host machine." +msgstr "Ermittelt die IP-Adresse des Host-Rechners des Bots." + +#: ip\ip.py:72 +msgid "The ip address of your bot is `{ip}`." +msgstr "Die IP-Adresse deines Bots lautet `{ip}`." + +#: ip\ip.py:76 +#, docstring +msgid "Get the ip address website of the bot's host machine." +msgstr "Ermitteln Sie die IP-Adresse des Host-Rechners des Bots." + +#: ip\ip.py:83 +msgid "The Administrator Panel website is http://{ip}:{port}/." +msgstr "Die Website des Administrationspanels ist http://{ip}:{port}/." + diff --git a/ip/locales/el-GR.po b/ip/locales/el-GR.po new file mode 100644 index 0000000..58d4b3d --- /dev/null +++ b/ip/locales/el-GR.po @@ -0,0 +1,42 @@ +msgid "" +msgstr "" +"Project-Id-Version: aaa3a-cogs\n" +"POT-Creation-Date: 2024-07-20 22:14+0200\n" +"PO-Revision-Date: 2024-07-20 20:19\n" +"Last-Translator: \n" +"Language-Team: Greek\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: redgettext 3.4.2\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Crowdin-Project: aaa3a-cogs\n" +"X-Crowdin-Project-ID: 531090\n" +"X-Crowdin-Language: el\n" +"X-Crowdin-File: /[AAA3A-AAA3A.AAA3A-cogs] main/ip/locales/messages.pot\n" +"X-Crowdin-File-ID: 88\n" +"Language: el_GR\n" + +#: ip\ip.py:23 +#, docstring +msgid "A cog to get the ip address of the bot's host machine!" +msgstr "Ένα γρανάζι για να λαμβάνετε τη διεύθυνση ip του υπολογιστή-ξενιστή του bot!" + +#: ip\ip.py:67 +#, docstring +msgid "Get the ip address of the bot's host machine." +msgstr "Λαμβάνετε τη διεύθυνση ip του κεντρικού υπολογιστή του bot." + +#: ip\ip.py:72 +msgid "The ip address of your bot is `{ip}`." +msgstr "Η διεύθυνση ip του bot σας είναι \"{ip}\"." + +#: ip\ip.py:76 +#, docstring +msgid "Get the ip address website of the bot's host machine." +msgstr "Λάβετε τον ιστότοπο με τη διεύθυνση ip του μηχανήματος υποδοχής του bot." + +#: ip\ip.py:83 +msgid "The Administrator Panel website is http://{ip}:{port}/." +msgstr "Ο δικτυακός τόπος του πίνακα διαχειριστών είναι http://{ip}:{port}/." + diff --git a/ip/locales/es-ES.po b/ip/locales/es-ES.po new file mode 100644 index 0000000..061058a --- /dev/null +++ b/ip/locales/es-ES.po @@ -0,0 +1,42 @@ +msgid "" +msgstr "" +"Project-Id-Version: aaa3a-cogs\n" +"POT-Creation-Date: 2024-07-20 22:14+0200\n" +"PO-Revision-Date: 2024-07-20 20:19\n" +"Last-Translator: \n" +"Language-Team: Spanish\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: redgettext 3.4.2\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Crowdin-Project: aaa3a-cogs\n" +"X-Crowdin-Project-ID: 531090\n" +"X-Crowdin-Language: es-ES\n" +"X-Crowdin-File: /[AAA3A-AAA3A.AAA3A-cogs] main/ip/locales/messages.pot\n" +"X-Crowdin-File-ID: 88\n" +"Language: es_ES\n" + +#: ip\ip.py:23 +#, docstring +msgid "A cog to get the ip address of the bot's host machine!" +msgstr "Un engranaje para obtener la dirección ip de la máquina anfitriona del bot!" + +#: ip\ip.py:67 +#, docstring +msgid "Get the ip address of the bot's host machine." +msgstr "Obtener la dirección IP de la máquina host del bot." + +#: ip\ip.py:72 +msgid "The ip address of your bot is `{ip}`." +msgstr "La dirección IP de tu bot es `{ip}`." + +#: ip\ip.py:76 +#, docstring +msgid "Get the ip address website of the bot's host machine." +msgstr "Obtén la dirección IP de la máquina anfitriona del bot." + +#: ip\ip.py:83 +msgid "The Administrator Panel website is http://{ip}:{port}/." +msgstr "El sitio web del Panel del Administrador es http://{ip}:{port}/." + diff --git a/ip/locales/fi-FI.po b/ip/locales/fi-FI.po new file mode 100644 index 0000000..f5e7f74 --- /dev/null +++ b/ip/locales/fi-FI.po @@ -0,0 +1,42 @@ +msgid "" +msgstr "" +"Project-Id-Version: aaa3a-cogs\n" +"POT-Creation-Date: 2024-07-20 22:14+0200\n" +"PO-Revision-Date: 2024-07-20 20:19\n" +"Last-Translator: \n" +"Language-Team: Finnish\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: redgettext 3.4.2\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Crowdin-Project: aaa3a-cogs\n" +"X-Crowdin-Project-ID: 531090\n" +"X-Crowdin-Language: fi\n" +"X-Crowdin-File: /[AAA3A-AAA3A.AAA3A-cogs] main/ip/locales/messages.pot\n" +"X-Crowdin-File-ID: 88\n" +"Language: fi_FI\n" + +#: ip\ip.py:23 +#, docstring +msgid "A cog to get the ip address of the bot's host machine!" +msgstr "Hammasratas, jolla saat botin isäntäkoneen ip-osoitteen!" + +#: ip\ip.py:67 +#, docstring +msgid "Get the ip address of the bot's host machine." +msgstr "Hae botin isäntäkoneen ip-osoite." + +#: ip\ip.py:72 +msgid "The ip address of your bot is `{ip}`." +msgstr "Botin ip-osoite on `{ip}`." + +#: ip\ip.py:76 +#, docstring +msgid "Get the ip address website of the bot's host machine." +msgstr "Hanki botin isäntäkoneen ip-osoite." + +#: ip\ip.py:83 +msgid "The Administrator Panel website is http://{ip}:{port}/." +msgstr "Hallintopaneelin verkkosivusto on http://{ip}:{port}/." + diff --git a/ip/locales/fr-FR.po b/ip/locales/fr-FR.po new file mode 100644 index 0000000..8a39b82 --- /dev/null +++ b/ip/locales/fr-FR.po @@ -0,0 +1,42 @@ +msgid "" +msgstr "" +"Project-Id-Version: aaa3a-cogs\n" +"POT-Creation-Date: 2024-07-20 22:14+0200\n" +"PO-Revision-Date: 2024-07-20 20:19\n" +"Last-Translator: \n" +"Language-Team: French\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: redgettext 3.4.2\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"X-Crowdin-Project: aaa3a-cogs\n" +"X-Crowdin-Project-ID: 531090\n" +"X-Crowdin-Language: fr\n" +"X-Crowdin-File: /[AAA3A-AAA3A.AAA3A-cogs] main/ip/locales/messages.pot\n" +"X-Crowdin-File-ID: 88\n" +"Language: fr_FR\n" + +#: ip\ip.py:23 +#, docstring +msgid "A cog to get the ip address of the bot's host machine!" +msgstr "Un rouage pour obtenir l'adresse IP de la machine hôte du bot !" + +#: ip\ip.py:67 +#, docstring +msgid "Get the ip address of the bot's host machine." +msgstr "Obtenir l'adresse IP de la machine hôte du bot." + +#: ip\ip.py:72 +msgid "The ip address of your bot is `{ip}`." +msgstr "L'adresse IP de votre bot est `{ip}`." + +#: ip\ip.py:76 +#, docstring +msgid "Get the ip address website of the bot's host machine." +msgstr "Obtenir l'adresse IP du site web de la machine hôte du bot." + +#: ip\ip.py:83 +msgid "The Administrator Panel website is http://{ip}:{port}/." +msgstr "Le site web du Panel des administrateurs est le suivant : http://{ip}:{port}/." + diff --git a/ip/locales/it-IT.po b/ip/locales/it-IT.po new file mode 100644 index 0000000..f465035 --- /dev/null +++ b/ip/locales/it-IT.po @@ -0,0 +1,42 @@ +msgid "" +msgstr "" +"Project-Id-Version: aaa3a-cogs\n" +"POT-Creation-Date: 2024-07-20 22:14+0200\n" +"PO-Revision-Date: 2024-07-20 20:19\n" +"Last-Translator: \n" +"Language-Team: Italian\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: redgettext 3.4.2\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Crowdin-Project: aaa3a-cogs\n" +"X-Crowdin-Project-ID: 531090\n" +"X-Crowdin-Language: it\n" +"X-Crowdin-File: /[AAA3A-AAA3A.AAA3A-cogs] main/ip/locales/messages.pot\n" +"X-Crowdin-File-ID: 88\n" +"Language: it_IT\n" + +#: ip\ip.py:23 +#, docstring +msgid "A cog to get the ip address of the bot's host machine!" +msgstr "Un ingranaggio per ottenere l'indirizzo ip della macchina host del bot!" + +#: ip\ip.py:67 +#, docstring +msgid "Get the ip address of the bot's host machine." +msgstr "Ottenere l'indirizzo IP del computer host del bot." + +#: ip\ip.py:72 +msgid "The ip address of your bot is `{ip}`." +msgstr "L'indirizzo ip del bot è `{ip}`." + +#: ip\ip.py:76 +#, docstring +msgid "Get the ip address website of the bot's host machine." +msgstr "Ottenere l'indirizzo IP del sito web del computer host del bot." + +#: ip\ip.py:83 +msgid "The Administrator Panel website is http://{ip}:{port}/." +msgstr "Il sito web del Pannello di amministrazione è http://{ip}:{port}/." + diff --git a/ip/locales/ja-JP.po b/ip/locales/ja-JP.po new file mode 100644 index 0000000..8cc937e --- /dev/null +++ b/ip/locales/ja-JP.po @@ -0,0 +1,42 @@ +msgid "" +msgstr "" +"Project-Id-Version: aaa3a-cogs\n" +"POT-Creation-Date: 2024-07-20 22:14+0200\n" +"PO-Revision-Date: 2024-07-20 20:19\n" +"Last-Translator: \n" +"Language-Team: Japanese\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: redgettext 3.4.2\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Crowdin-Project: aaa3a-cogs\n" +"X-Crowdin-Project-ID: 531090\n" +"X-Crowdin-Language: ja\n" +"X-Crowdin-File: /[AAA3A-AAA3A.AAA3A-cogs] main/ip/locales/messages.pot\n" +"X-Crowdin-File-ID: 88\n" +"Language: ja_JP\n" + +#: ip\ip.py:23 +#, docstring +msgid "A cog to get the ip address of the bot's host machine!" +msgstr "ボットのホストマシンのipアドレスを取得するためのコグです!" + +#: ip\ip.py:67 +#, docstring +msgid "Get the ip address of the bot's host machine." +msgstr "ボットのホストマシンのipアドレスを取得します。" + +#: ip\ip.py:72 +msgid "The ip address of your bot is `{ip}`." +msgstr "あなたのボットのipアドレスは `{ip}` です。" + +#: ip\ip.py:76 +#, docstring +msgid "Get the ip address website of the bot's host machine." +msgstr "ボットのホストマシンのipアドレスのサイトを取得します。" + +#: ip\ip.py:83 +msgid "The Administrator Panel website is http://{ip}:{port}/." +msgstr "Administrator Panelのサイトは、http://{ip}:{port}/ です。" + diff --git a/ip/locales/messages.pot b/ip/locales/messages.pot new file mode 100644 index 0000000..0c314f6 --- /dev/null +++ b/ip/locales/messages.pot @@ -0,0 +1,35 @@ +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2024-12-29 10:43+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: redgettext 3.4.2\n" + +#: ip\ip.py:23 +#, docstring +msgid "A cog to get the ip address of the bot's host machine!" +msgstr "" + +#: ip\ip.py:67 +#, docstring +msgid "Get the ip address of the bot's host machine." +msgstr "" + +#: ip\ip.py:72 +msgid "The ip address of your bot is `{ip}`." +msgstr "" + +#: ip\ip.py:76 +#, docstring +msgid "Get the ip address website of the bot's host machine." +msgstr "" + +#: ip\ip.py:83 +msgid "The Administrator Panel website is http://{ip}:{port}/." +msgstr "" diff --git a/ip/locales/nl-NL.po b/ip/locales/nl-NL.po new file mode 100644 index 0000000..750c3d3 --- /dev/null +++ b/ip/locales/nl-NL.po @@ -0,0 +1,42 @@ +msgid "" +msgstr "" +"Project-Id-Version: aaa3a-cogs\n" +"POT-Creation-Date: 2024-07-20 22:14+0200\n" +"PO-Revision-Date: 2024-07-20 20:19\n" +"Last-Translator: \n" +"Language-Team: Dutch\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: redgettext 3.4.2\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Crowdin-Project: aaa3a-cogs\n" +"X-Crowdin-Project-ID: 531090\n" +"X-Crowdin-Language: nl\n" +"X-Crowdin-File: /[AAA3A-AAA3A.AAA3A-cogs] main/ip/locales/messages.pot\n" +"X-Crowdin-File-ID: 88\n" +"Language: nl_NL\n" + +#: ip\ip.py:23 +#, docstring +msgid "A cog to get the ip address of the bot's host machine!" +msgstr "Een tandwiel om het ip-adres van de hostmachine van de bot te krijgen!" + +#: ip\ip.py:67 +#, docstring +msgid "Get the ip address of the bot's host machine." +msgstr "Verkrijg het ip-adres van de hostmachine van de bot." + +#: ip\ip.py:72 +msgid "The ip address of your bot is `{ip}`." +msgstr "Het ip-adres van je bot is `{ip}`." + +#: ip\ip.py:76 +#, docstring +msgid "Get the ip address website of the bot's host machine." +msgstr "Verkrijg de ip-adreswebsite van de hostmachine van de bot." + +#: ip\ip.py:83 +msgid "The Administrator Panel website is http://{ip}:{port}/." +msgstr "De website van het beheerderspaneel is http://{ip}:{port}/." + diff --git a/ip/locales/pl-PL.po b/ip/locales/pl-PL.po new file mode 100644 index 0000000..7d5eb97 --- /dev/null +++ b/ip/locales/pl-PL.po @@ -0,0 +1,42 @@ +msgid "" +msgstr "" +"Project-Id-Version: aaa3a-cogs\n" +"POT-Creation-Date: 2024-07-20 22:14+0200\n" +"PO-Revision-Date: 2024-07-20 20:19\n" +"Last-Translator: \n" +"Language-Team: Polish\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: redgettext 3.4.2\n" +"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n" +"X-Crowdin-Project: aaa3a-cogs\n" +"X-Crowdin-Project-ID: 531090\n" +"X-Crowdin-Language: pl\n" +"X-Crowdin-File: /[AAA3A-AAA3A.AAA3A-cogs] main/ip/locales/messages.pot\n" +"X-Crowdin-File-ID: 88\n" +"Language: pl_PL\n" + +#: ip\ip.py:23 +#, docstring +msgid "A cog to get the ip address of the bot's host machine!" +msgstr "Tryb umożliwiający uzyskanie adresu IP komputera hosta bota!" + +#: ip\ip.py:67 +#, docstring +msgid "Get the ip address of the bot's host machine." +msgstr "Pobiera adres IP komputera hosta bota." + +#: ip\ip.py:72 +msgid "The ip address of your bot is `{ip}`." +msgstr "Adres ip twojego bota to `{ip}`." + +#: ip\ip.py:76 +#, docstring +msgid "Get the ip address website of the bot's host machine." +msgstr "Uzyskaj adres IP strony internetowej komputera hosta bota." + +#: ip\ip.py:83 +msgid "The Administrator Panel website is http://{ip}:{port}/." +msgstr "Strona internetowa Panelu Administratora to http://{ip}:{port}/." + diff --git a/ip/locales/pt-BR.po b/ip/locales/pt-BR.po new file mode 100644 index 0000000..b2b81f4 --- /dev/null +++ b/ip/locales/pt-BR.po @@ -0,0 +1,42 @@ +msgid "" +msgstr "" +"Project-Id-Version: aaa3a-cogs\n" +"POT-Creation-Date: 2024-07-20 22:14+0200\n" +"PO-Revision-Date: 2024-07-20 20:19\n" +"Last-Translator: \n" +"Language-Team: Portuguese, Brazilian\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: redgettext 3.4.2\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Crowdin-Project: aaa3a-cogs\n" +"X-Crowdin-Project-ID: 531090\n" +"X-Crowdin-Language: pt-BR\n" +"X-Crowdin-File: /[AAA3A-AAA3A.AAA3A-cogs] main/ip/locales/messages.pot\n" +"X-Crowdin-File-ID: 88\n" +"Language: pt_BR\n" + +#: ip\ip.py:23 +#, docstring +msgid "A cog to get the ip address of the bot's host machine!" +msgstr "Uma engrenagem para obter o endereço IP da máquina anfitriã do bot!" + +#: ip\ip.py:67 +#, docstring +msgid "Get the ip address of the bot's host machine." +msgstr "Obtém o endereço IP da máquina anfitriã do bot." + +#: ip\ip.py:72 +msgid "The ip address of your bot is `{ip}`." +msgstr "O endereço ip do seu bot é `{ip}`." + +#: ip\ip.py:76 +#, docstring +msgid "Get the ip address website of the bot's host machine." +msgstr "Obter o endereço IP do site da máquina anfitriã do bot." + +#: ip\ip.py:83 +msgid "The Administrator Panel website is http://{ip}:{port}/." +msgstr "O website do Painel de Administrador é{port}{ip}: /." + diff --git a/ip/locales/pt-PT.po b/ip/locales/pt-PT.po new file mode 100644 index 0000000..f03f0e3 --- /dev/null +++ b/ip/locales/pt-PT.po @@ -0,0 +1,42 @@ +msgid "" +msgstr "" +"Project-Id-Version: aaa3a-cogs\n" +"POT-Creation-Date: 2024-07-20 22:14+0200\n" +"PO-Revision-Date: 2024-07-20 20:19\n" +"Last-Translator: \n" +"Language-Team: Portuguese\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: redgettext 3.4.2\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Crowdin-Project: aaa3a-cogs\n" +"X-Crowdin-Project-ID: 531090\n" +"X-Crowdin-Language: pt-PT\n" +"X-Crowdin-File: /[AAA3A-AAA3A.AAA3A-cogs] main/ip/locales/messages.pot\n" +"X-Crowdin-File-ID: 88\n" +"Language: pt_PT\n" + +#: ip\ip.py:23 +#, docstring +msgid "A cog to get the ip address of the bot's host machine!" +msgstr "Uma engrenagem para obter o endereço IP da máquina anfitriã do bot!" + +#: ip\ip.py:67 +#, docstring +msgid "Get the ip address of the bot's host machine." +msgstr "Obtém o endereço IP da máquina anfitriã do bot." + +#: ip\ip.py:72 +msgid "The ip address of your bot is `{ip}`." +msgstr "O endereço ip do seu bot é `{ip}`." + +#: ip\ip.py:76 +#, docstring +msgid "Get the ip address website of the bot's host machine." +msgstr "Obter o endereço IP do site da máquina anfitriã do bot." + +#: ip\ip.py:83 +msgid "The Administrator Panel website is http://{ip}:{port}/." +msgstr "O website do Painel de Administrador é{ip}:{port}/." + diff --git a/ip/locales/ro-RO.po b/ip/locales/ro-RO.po new file mode 100644 index 0000000..4d68e55 --- /dev/null +++ b/ip/locales/ro-RO.po @@ -0,0 +1,42 @@ +msgid "" +msgstr "" +"Project-Id-Version: aaa3a-cogs\n" +"POT-Creation-Date: 2024-07-20 22:14+0200\n" +"PO-Revision-Date: 2024-07-20 20:19\n" +"Last-Translator: \n" +"Language-Team: Romanian\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: redgettext 3.4.2\n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100>0 && n%100<20)) ? 1 : 2);\n" +"X-Crowdin-Project: aaa3a-cogs\n" +"X-Crowdin-Project-ID: 531090\n" +"X-Crowdin-Language: ro\n" +"X-Crowdin-File: /[AAA3A-AAA3A.AAA3A-cogs] main/ip/locales/messages.pot\n" +"X-Crowdin-File-ID: 88\n" +"Language: ro_RO\n" + +#: ip\ip.py:23 +#, docstring +msgid "A cog to get the ip address of the bot's host machine!" +msgstr "O rotiță pentru a obține adresa ip a mașinii gazdă a bot-ului!" + +#: ip\ip.py:67 +#, docstring +msgid "Get the ip address of the bot's host machine." +msgstr "Obține adresa IP a mașinii gazdă a robotului." + +#: ip\ip.py:72 +msgid "The ip address of your bot is `{ip}`." +msgstr "Adresa IP a robotului tău este `{ip}`." + +#: ip\ip.py:76 +#, docstring +msgid "Get the ip address website of the bot's host machine." +msgstr "Obțineți adresa IP a site-ului web al mașinii gazdă a robotului." + +#: ip\ip.py:83 +msgid "The Administrator Panel website is http://{ip}:{port}/." +msgstr "Site-ul web al panoului de administrare este http://{ip}:{port}/." + diff --git a/ip/locales/ru-RU.po b/ip/locales/ru-RU.po new file mode 100644 index 0000000..b4376f8 --- /dev/null +++ b/ip/locales/ru-RU.po @@ -0,0 +1,42 @@ +msgid "" +msgstr "" +"Project-Id-Version: aaa3a-cogs\n" +"POT-Creation-Date: 2024-07-20 22:14+0200\n" +"PO-Revision-Date: 2024-07-20 20:19\n" +"Last-Translator: \n" +"Language-Team: Russian\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: redgettext 3.4.2\n" +"Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n" +"X-Crowdin-Project: aaa3a-cogs\n" +"X-Crowdin-Project-ID: 531090\n" +"X-Crowdin-Language: ru\n" +"X-Crowdin-File: /[AAA3A-AAA3A.AAA3A-cogs] main/ip/locales/messages.pot\n" +"X-Crowdin-File-ID: 88\n" +"Language: ru_RU\n" + +#: ip\ip.py:23 +#, docstring +msgid "A cog to get the ip address of the bot's host machine!" +msgstr "Зубец для получения ip-адреса хост-машины бота!" + +#: ip\ip.py:67 +#, docstring +msgid "Get the ip address of the bot's host machine." +msgstr "Получите ip-адрес хост-машины бота." + +#: ip\ip.py:72 +msgid "The ip address of your bot is `{ip}`." +msgstr "ip-адрес вашего бота - `{ip}`." + +#: ip\ip.py:76 +#, docstring +msgid "Get the ip address website of the bot's host machine." +msgstr "Получите ip-адрес сайта хост-машины бота." + +#: ip\ip.py:83 +msgid "The Administrator Panel website is http://{ip}:{port}/." +msgstr "Веб-сайт панели администратора: http://{ip}:{port}/." + diff --git a/ip/locales/tr-TR.po b/ip/locales/tr-TR.po new file mode 100644 index 0000000..1e315e8 --- /dev/null +++ b/ip/locales/tr-TR.po @@ -0,0 +1,42 @@ +msgid "" +msgstr "" +"Project-Id-Version: aaa3a-cogs\n" +"POT-Creation-Date: 2024-07-20 22:14+0200\n" +"PO-Revision-Date: 2024-07-21 13:27\n" +"Last-Translator: \n" +"Language-Team: Turkish\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: redgettext 3.4.2\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Crowdin-Project: aaa3a-cogs\n" +"X-Crowdin-Project-ID: 531090\n" +"X-Crowdin-Language: tr\n" +"X-Crowdin-File: /[AAA3A-AAA3A.AAA3A-cogs] main/ip/locales/messages.pot\n" +"X-Crowdin-File-ID: 88\n" +"Language: tr_TR\n" + +#: ip\ip.py:23 +#, docstring +msgid "A cog to get the ip address of the bot's host machine!" +msgstr "Botun ana makinesinin ip adresini almak için bir cog!" + +#: ip\ip.py:67 +#, docstring +msgid "Get the ip address of the bot's host machine." +msgstr "Botun barındırıldığı makinenin IP adresini alın." + +#: ip\ip.py:72 +msgid "The ip address of your bot is `{ip}`." +msgstr "Botunuzun IP adresi `{ip}`." + +#: ip\ip.py:76 +#, docstring +msgid "Get the ip address website of the bot's host machine." +msgstr "Botun barındırıldığı makinenin IP adresi web sitesini alın." + +#: ip\ip.py:83 +msgid "The Administrator Panel website is http://{ip}:{port}/." +msgstr "Yönetici Paneli web sitesi http://{ip}:{port}/." + diff --git a/ip/locales/uk-UA.po b/ip/locales/uk-UA.po new file mode 100644 index 0000000..d38becc --- /dev/null +++ b/ip/locales/uk-UA.po @@ -0,0 +1,42 @@ +msgid "" +msgstr "" +"Project-Id-Version: aaa3a-cogs\n" +"POT-Creation-Date: 2024-07-20 22:14+0200\n" +"PO-Revision-Date: 2024-07-20 20:19\n" +"Last-Translator: \n" +"Language-Team: Ukrainian\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: redgettext 3.4.2\n" +"Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n" +"X-Crowdin-Project: aaa3a-cogs\n" +"X-Crowdin-Project-ID: 531090\n" +"X-Crowdin-Language: uk\n" +"X-Crowdin-File: /[AAA3A-AAA3A.AAA3A-cogs] main/ip/locales/messages.pot\n" +"X-Crowdin-File-ID: 88\n" +"Language: uk_UA\n" + +#: ip\ip.py:23 +#, docstring +msgid "A cog to get the ip address of the bot's host machine!" +msgstr "Гвинтик для отримання ip-адреси хост-машини бота!" + +#: ip\ip.py:67 +#, docstring +msgid "Get the ip address of the bot's host machine." +msgstr "Отримайте ip-адресу хост-машини бота." + +#: ip\ip.py:72 +msgid "The ip address of your bot is `{ip}`." +msgstr "IP-адреса вашого бота - `{ip}`." + +#: ip\ip.py:76 +#, docstring +msgid "Get the ip address website of the bot's host machine." +msgstr "Отримайте ip-адресу веб-сайту, на якому працює бот." + +#: ip\ip.py:83 +msgid "The Administrator Panel website is http://{ip}:{port}/." +msgstr "Веб-сторінка Панелі адміністратора знаходиться за адресою http://{ip}:{port}/." + diff --git a/ip/utils_version.json b/ip/utils_version.json new file mode 100644 index 0000000..bfab002 --- /dev/null +++ b/ip/utils_version.json @@ -0,0 +1 @@ +{"needed_utils_version": 7.0} \ No newline at end of file diff --git a/lock/LICENSE.md b/lock/LICENSE.md new file mode 100644 index 0000000..fa0086a --- /dev/null +++ b/lock/LICENSE.md @@ -0,0 +1,373 @@ +Mozilla Public License Version 2.0 +================================== + +1. Definitions +-------------- + +1.1. "Contributor" + means each individual or legal entity that creates, contributes to + the creation of, or owns Covered Software. + +1.2. "Contributor Version" + means the combination of the Contributions of others (if any) used + by a Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + means Source Code Form to which the initial Contributor has attached + the notice in Exhibit A, the Executable Form of such Source Code + Form, and Modifications of such Source Code Form, in each case + including portions thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + (a) that the initial Contributor has attached the notice described + in Exhibit B to the Covered Software; or + + (b) that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the + terms of a Secondary License. + +1.6. "Executable Form" + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + means a work that combines Covered Software with other material, in + a separate file or files, that is not Covered Software. + +1.8. "License" + means this document. + +1.9. "Licensable" + means having the right to grant, to the maximum extent possible, + whether at the time of the initial grant or subsequently, any and + all of the rights conveyed by this License. + +1.10. "Modifications" + means any of the following: + + (a) any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered + Software; or + + (b) any new file in Source Code Form that contains any Covered + Software. + +1.11. "Patent Claims" of a Contributor + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the + License, by the making, using, selling, offering for sale, having + made, import, or transfer of either its Contributions or its + Contributor Version. + +1.12. "Secondary License" + means either the GNU General Public License, Version 2.0, the GNU + Lesser General Public License, Version 2.1, the GNU Affero General + Public License, Version 3.0, or any later versions of those + licenses. + +1.13. "Source Code Form" + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that + controls, is controlled by, or is under common control with You. For + purposes of this definition, "control" means (a) the power, direct + or indirect, to cause the direction or management of such entity, + whether by contract or otherwise, or (b) ownership of more than + fifty percent (50%) of the outstanding shares or beneficial + ownership of such entity. + +2. License Grants and Conditions +-------------------------------- + +2.1. Grants + +Each Contributor hereby grants You a world-wide, royalty-free, +non-exclusive license: + +(a) under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + +(b) under Patent Claims of such Contributor to make, use, sell, offer + for sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + +The licenses granted in Section 2.1 with respect to any Contribution +become effective for each Contribution on the date the Contributor first +distributes such Contribution. + +2.3. Limitations on Grant Scope + +The licenses granted in this Section 2 are the only rights granted under +this License. No additional rights or licenses will be implied from the +distribution or licensing of Covered Software under this License. +Notwithstanding Section 2.1(b) above, no patent license is granted by a +Contributor: + +(a) for any code that a Contributor has removed from Covered Software; + or + +(b) for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + +(c) under Patent Claims infringed by Covered Software in the absence of + its Contributions. + +This License does not grant any rights in the trademarks, service marks, +or logos of any Contributor (except as may be necessary to comply with +the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + +No Contributor makes additional grants as a result of Your choice to +distribute the Covered Software under a subsequent version of this +License (see Section 10.2) or under the terms of a Secondary License (if +permitted under the terms of Section 3.3). + +2.5. Representation + +Each Contributor represents that the Contributor believes its +Contributions are its original creation(s) or it has sufficient rights +to grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + +This License is not intended to limit any rights You have under +applicable copyright doctrines of fair use, fair dealing, or other +equivalents. + +2.7. Conditions + +Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted +in Section 2.1. + +3. Responsibilities +------------------- + +3.1. Distribution of Source Form + +All distribution of Covered Software in Source Code Form, including any +Modifications that You create or to which You contribute, must be under +the terms of this License. You must inform recipients that the Source +Code Form of the Covered Software is governed by the terms of this +License, and how they can obtain a copy of this License. You may not +attempt to alter or restrict the recipients' rights in the Source Code +Form. + +3.2. Distribution of Executable Form + +If You distribute Covered Software in Executable Form then: + +(a) such Covered Software must also be made available in Source Code + Form, as described in Section 3.1, and You must inform recipients of + the Executable Form how they can obtain a copy of such Source Code + Form by reasonable means in a timely manner, at a charge no more + than the cost of distribution to the recipient; and + +(b) You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter + the recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + +You may create and distribute a Larger Work under terms of Your choice, +provided that You also comply with the requirements of this License for +the Covered Software. If the Larger Work is a combination of Covered +Software with a work governed by one or more Secondary Licenses, and the +Covered Software is not Incompatible With Secondary Licenses, this +License permits You to additionally distribute such Covered Software +under the terms of such Secondary License(s), so that the recipient of +the Larger Work may, at their option, further distribute the Covered +Software under the terms of either this License or such Secondary +License(s). + +3.4. Notices + +You may not remove or alter the substance of any license notices +(including copyright notices, patent notices, disclaimers of warranty, +or limitations of liability) contained within the Source Code Form of +the Covered Software, except that You may alter any license notices to +the extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + +You may choose to offer, and to charge a fee for, warranty, support, +indemnity or liability obligations to one or more recipients of Covered +Software. However, You may do so only on Your own behalf, and not on +behalf of any Contributor. You must make it absolutely clear that any +such warranty, support, indemnity, or liability obligation is offered by +You alone, and You hereby agree to indemnify every Contributor for any +liability incurred by such Contributor as a result of warranty, support, +indemnity or liability terms You offer. You may include additional +disclaimers of warranty and limitations of liability specific to any +jurisdiction. + +4. Inability to Comply Due to Statute or Regulation +--------------------------------------------------- + +If it is impossible for You to comply with any of the terms of this +License with respect to some or all of the Covered Software due to +statute, judicial order, or regulation then You must: (a) comply with +the terms of this License to the maximum extent possible; and (b) +describe the limitations and the code they affect. Such description must +be placed in a text file included with all distributions of the Covered +Software under this License. Except to the extent prohibited by statute +or regulation, such description must be sufficiently detailed for a +recipient of ordinary skill to be able to understand it. + +5. Termination +-------------- + +5.1. The rights granted under this License will terminate automatically +if You fail to comply with any of its terms. However, if You become +compliant, then the rights granted under this License from a particular +Contributor are reinstated (a) provisionally, unless and until such +Contributor explicitly and finally terminates Your grants, and (b) on an +ongoing basis, if such Contributor fails to notify You of the +non-compliance by some reasonable means prior to 60 days after You have +come back into compliance. Moreover, Your grants from a particular +Contributor are reinstated on an ongoing basis if such Contributor +notifies You of the non-compliance by some reasonable means, this is the +first time You have received notice of non-compliance with this License +from such Contributor, and You become compliant prior to 30 days after +Your receipt of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent +infringement claim (excluding declaratory judgment actions, +counter-claims, and cross-claims) alleging that a Contributor Version +directly or indirectly infringes any patent, then the rights granted to +You by any and all Contributors for the Covered Software under Section +2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all +end user license agreements (excluding distributors and resellers) which +have been validly granted by You or Your distributors under this License +prior to termination shall survive termination. + +************************************************************************ +* * +* 6. Disclaimer of Warranty * +* ------------------------- * +* * +* Covered Software is provided under this License on an "as is" * +* basis, without warranty of any kind, either expressed, implied, or * +* statutory, including, without limitation, warranties that the * +* Covered Software is free of defects, merchantable, fit for a * +* particular purpose or non-infringing. The entire risk as to the * +* quality and performance of the Covered Software is with You. * +* Should any Covered Software prove defective in any respect, You * +* (not any Contributor) assume the cost of any necessary servicing, * +* repair, or correction. This disclaimer of warranty constitutes an * +* essential part of this License. No use of any Covered Software is * +* authorized under this License except under this disclaimer. * +* * +************************************************************************ + +************************************************************************ +* * +* 7. Limitation of Liability * +* -------------------------- * +* * +* Under no circumstances and under no legal theory, whether tort * +* (including negligence), contract, or otherwise, shall any * +* Contributor, or anyone who distributes Covered Software as * +* permitted above, be liable to You for any direct, indirect, * +* special, incidental, or consequential damages of any character * +* including, without limitation, damages for lost profits, loss of * +* goodwill, work stoppage, computer failure or malfunction, or any * +* and all other commercial damages or losses, even if such party * +* shall have been informed of the possibility of such damages. This * +* limitation of liability shall not apply to liability for death or * +* personal injury resulting from such party's negligence to the * +* extent applicable law prohibits such limitation. Some * +* jurisdictions do not allow the exclusion or limitation of * +* incidental or consequential damages, so this exclusion and * +* limitation may not apply to You. * +* * +************************************************************************ + +8. Litigation +------------- + +Any litigation relating to this License may be brought only in the +courts of a jurisdiction where the defendant maintains its principal +place of business and such litigation shall be governed by laws of that +jurisdiction, without reference to its conflict-of-law provisions. +Nothing in this Section shall prevent a party's ability to bring +cross-claims or counter-claims. + +9. Miscellaneous +---------------- + +This License represents the complete agreement concerning the subject +matter hereof. If any provision of this License is held to be +unenforceable, such provision shall be reformed only to the extent +necessary to make it enforceable. Any law or regulation which provides +that the language of a contract shall be construed against the drafter +shall not be used to construe this License against a Contributor. + +10. Versions of the License +--------------------------- + +10.1. New Versions + +Mozilla Foundation is the license steward. Except as provided in Section +10.3, no one other than the license steward has the right to modify or +publish new versions of this License. Each version will be given a +distinguishing version number. + +10.2. Effect of New Versions + +You may distribute the Covered Software under the terms of the version +of the License under which You originally received the Covered Software, +or under the terms of any subsequent version published by the license +steward. + +10.3. Modified Versions + +If you create software not governed by this License, and you want to +create a new license for such software, you may create and use a +modified version of this License if you rename the license and remove +any references to the name of the license steward (except to note that +such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary +Licenses + +If You choose to distribute Source Code Form that is Incompatible With +Secondary Licenses under the terms of this version of the License, the +notice described in Exhibit B of this License must be attached. + +Exhibit A - Source Code Form License Notice +------------------------------------------- + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular +file, then You may include the notice in a location (such as a LICENSE +file in a relevant directory) where a recipient would be likely to look +for such a notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice +--------------------------------------------------------- + + This Source Code Form is "Incompatible With Secondary Licenses", as + defined by the Mozilla Public License, v. 2.0. \ No newline at end of file diff --git a/lock/README.rst b/lock/README.rst new file mode 100644 index 0000000..7217fc0 --- /dev/null +++ b/lock/README.rst @@ -0,0 +1,89 @@ +.. _lock: + +==== +Lock +==== + +This is the cog guide for the 'Lock' cog. This guide +contains the collection of commands which you can use in the cog. + +Through this guide, ``[p]`` will always represent your prefix. Replace +``[p]`` with your own prefix when you use these commands in Discord. + +.. note:: + + This guide was last updated for version 2.0.1. Ensure + that you are up to date by running ``[p]cog update lock``. + + If there is something missing, or something that needs improving + in this documentation, feel free to create an issue `here `_. + + This documentation is auto-generated everytime this cog receives an update. + +-------------- +About this cog +-------------- + +Lock `@everyone` from sending messages in channels or the entire guild, and only allow Moderators to talk. + +-------- +Commands +-------- + +Here are all the commands included in this cog (10): + ++-------------------------+--------------------------------------------------------------+ +| Command | Help | ++=========================+==============================================================+ +| ``[p]lock`` | Lock `@everyone` from sending messages. | ++-------------------------+--------------------------------------------------------------+ +| ``[p]lock server`` | Lock `@everyone` from sending messages in the entire server. | ++-------------------------+--------------------------------------------------------------+ +| ``[p]lockset`` | Various Lock settings. | ++-------------------------+--------------------------------------------------------------+ +| ``[p]lockset ignore`` | Ignore a channel during server lock. | ++-------------------------+--------------------------------------------------------------+ +| ``[p]lockset perms`` | Set if you use roles to access channels. | ++-------------------------+--------------------------------------------------------------+ +| ``[p]lockset role`` | Set role that can lock channels. | ++-------------------------+--------------------------------------------------------------+ +| ``[p]lockset settings`` | See current settings. | ++-------------------------+--------------------------------------------------------------+ +| ``[p]lockset unignore`` | Remove channels from the ignored list. | ++-------------------------+--------------------------------------------------------------+ +| ``[p]unlock`` | Unlock the channel for `@everyone`. | ++-------------------------+--------------------------------------------------------------+ +| ``[p]unlock server`` | Unlock the entire server for `@everyone` | ++-------------------------+--------------------------------------------------------------+ + +------------ +Installation +------------ + +If you haven't added my repo before, lets add it first. We'll call it +"kreusada-cogs" here. + +.. code-block:: ini + + [p]repo add kreusada-cogs https://github.com/Kreusada/Kreusada-Cogs + +Now, we can install Lock. + +.. code-block:: ini + + [p]cog install kreusada-cogs lock + +Once it's installed, it is not loaded by default. Load it by running the following +command: + +.. code-block:: ini + + [p]load lock + +--------------- +Further Support +--------------- + +For more support, head over to the `cog support server `_, +I have my own channel over there at #support_kreusada-cogs. Feel free to join my +`personal server `_ whilst you're here. diff --git a/lock/__init__.py b/lock/__init__.py new file mode 100644 index 0000000..c15e522 --- /dev/null +++ b/lock/__init__.py @@ -0,0 +1,10 @@ +from redbot.core.bot import Red +from redbot.core.utils import get_end_user_data_statement + +from .lock import Lock + +__red_end_user_data_statement__ = get_end_user_data_statement(__file__) + + +async def setup(bot: Red): + await bot.add_cog(Lock(bot)) diff --git a/lock/info.json b/lock/info.json new file mode 100644 index 0000000..696dfe5 --- /dev/null +++ b/lock/info.json @@ -0,0 +1,9 @@ +{ + "author" : ["saurichable", "Kreusada"], + "install_msg": "Thanks for installing, have fun. Please refer to my docs if you need any help: https://kreusadacogs.readthedocs.io/en/latest/cog_lock.html", + "name" : "Lock", + "short" : "Lock `@everyone` from sending messages.", + "description" : "Lock `@everyone` from sending messages in channels or the entire guild, and only allow Moderators to talk.", + "tags" : ["lockdown", "lock"], + "end_user_data_statement": "This cog does not store any user data." +} diff --git a/lock/lock.py b/lock/lock.py new file mode 100644 index 0000000..4369009 --- /dev/null +++ b/lock/lock.py @@ -0,0 +1,196 @@ +import datetime +import typing + +import discord +from redbot.core import Config, commands +from redbot.core.bot import Red +from redbot.core.utils.chat_formatting import humanize_list + + +class Lock(commands.Cog): + """ + Lock `@everyone` from sending messages in channels or the entire guild, and only allow Moderators to talk. + """ + + __version__ = "2.0.1" + __author__ = "saurichable, Kreusada" + + def __init__(self, bot: Red): + self.bot = bot + self.config = Config.get_conf(self, identifier=36546565165464, force_registration=True) + + self.config.register_guild(moderator=None, everyone=True, ignore=[]) + + async def red_delete_data_for_user(self, *, requester, user_id): + # nothing to delete + return + + def format_help_for_context(self, ctx: commands.Context) -> str: + context = super().format_help_for_context(ctx) + return f"{context}\n\nVersion: {self.__version__}\nAuthors : {self.__author__}" + + @commands.group(autohelp=True) + @commands.guild_only() + @commands.admin() + async def lockset(self, ctx: commands.Context): + """Various Lock settings.""" + + @lockset.command(name="role") + async def lockset_role(self, ctx: commands.Context, role: discord.Role): + """Set role that can lock channels.""" + await self.config.guild(ctx.guild).moderator.set(role.id) + await ctx.tick() + + @lockset.command(name="perms") + async def lockset_perms(self, ctx: commands.Context, everyone: bool): + """Set if you use roles to access channels.""" + await self.config.guild(ctx.guild).everyone.set(not everyone) + await ctx.tick() + + @lockset.command(name="ignore") + async def lockset_ignore(self, ctx: commands.Context, channel: discord.TextChannel): + """Ignore a channel during server lock.""" + if channel.id not in await self.config.guild(ctx.guild).ignore(): + async with self.config.guild(ctx.guild).ignore() as ignore: + ignore.append(channel.id) + return await ctx.send( + f"{channel.mention} has been added into the ignored channels list." + ) + await ctx.send(f"{channel.mention} is already in the ignored channels list.") + + @lockset.command(name="unignore") + async def lockset_unignore(self, ctx: commands.Context, channel: discord.TextChannel): + """Remove channels from the ignored list.""" + if channel.id not in await self.config.guild(ctx.guild).ignore(): + return await ctx.send(f"{channel.mention} already isn't in the ignored channels list.") + async with self.config.guild(ctx.guild).ignore() as ignore: + ignore.remove(channel.id) + await ctx.send(f"{channel.mention} has been removed from the ignored channels list.") + + @lockset.command(name="settings") + async def lockset_settings(self, ctx: commands.Context): + """See current settings.""" + data = await self.config.guild(ctx.guild).all() + mods = ctx.guild.get_role(data["moderator"]) + mods = "None" if not mods else mods.name + + channels = data["ignore"] + c_text = list() + if channels == []: + c_text = "None" + else: + for channel in channels: + c = ctx.guild.get_channel(channel) + if c: + c_text.append(c.mention) + c_text = humanize_list(c_text) + + embed = discord.Embed(colour=await ctx.embed_colour(), timestamp=datetime.datetime.now()) + embed.set_author(name=ctx.guild.name, icon_url=ctx.guild.icon.url if ctx.guild.icon else None) + embed.title = "**__Lock settings:__**" + embed.set_footer(text="*required to function properly") + + embed.add_field(name="Role that can type after locking*:", value=mods, inline=False) + embed.add_field( + name="Using roles to access servers:*:", + value=str(not data["everyone"]), + inline=False, + ) + embed.add_field(name="Ignored channels:", value=c_text, inline=False) + + await ctx.send(embed=embed) + + @commands.mod() + @commands.bot_has_permissions(manage_channels=True) + @commands.guild_only() + @commands.group(invoke_without_command=True) + async def lock(self, ctx: commands.Context): + """Lock `@everyone` from sending messages.""" + mods = ctx.guild.get_role(await self.config.guild(ctx.guild).moderator()) + which = await self.config.guild(ctx.guild).everyone() + + if not mods: + return await ctx.send("Uh oh. Looks like your Admins haven't setup this yet.") + if which: + await ctx.channel.set_permissions( + ctx.guild.default_role, read_messages=True, send_messages=False + ) + else: + await ctx.channel.set_permissions( + ctx.guild.default_role, read_messages=False, send_messages=False + ) + await ctx.channel.set_permissions(mods, read_messages=True, send_messages=True) + await ctx.send(":lock: Channel locked. Only Moderators can type.") + + @lock.command(name="server") + async def lock_server(self, ctx: commands.Context, confirmation: typing.Optional[bool]): + """Lock `@everyone` from sending messages in the entire server.""" + if not confirmation: + return await ctx.send( + "This will overwrite every channel's permissions.\n" + f"If you're sure, type `{ctx.clean_prefix}lockserver yes` (you can set an alias for this so I don't ask you every time)." + ) + async with ctx.typing(): + mods = ctx.guild.get_role(await self.config.guild(ctx.guild).moderator()) + which = await self.config.guild(ctx.guild).everyone() + ignore = await self.config.guild(ctx.guild).ignore() + + if not mods: + return await ctx.send("Uh oh. Looks like your Admins haven't setup this yet.") + for channel in ctx.guild.text_channels: + if channel.id in ignore: + continue + if which: + await channel.set_permissions( + ctx.guild.default_role, read_messages=True, send_messages=False + ) + else: + await channel.set_permissions( + ctx.guild.default_role, read_messages=False, send_messages=False + ) + await channel.set_permissions(mods, read_messages=True, send_messages=True) + await ctx.send(":lock: Server locked. Only Moderators can type.") + + @commands.mod() + @commands.bot_has_permissions(manage_channels=True) + @commands.guild_only() + @commands.group(invoke_without_command=True) + async def unlock(self, ctx: commands.Context): + """Unlock the channel for `@everyone`.""" + mods = ctx.guild.get_role(await self.config.guild(ctx.guild).moderator()) + which = await self.config.guild(ctx.guild).everyone() + + if not mods: + return await ctx.send("Uh oh. Looks like your Admins haven't setup this yet.") + if which: + await ctx.channel.set_permissions( + ctx.guild.default_role, read_messages=True, send_messages=True + ) + else: + await ctx.channel.set_permissions( + ctx.guild.default_role, read_messages=False, send_messages=True + ) + await ctx.send(":unlock: Channel unlocked.") + + @unlock.command(name="server") + async def unlock_server(self, ctx: commands.Context): + """Unlock the entire server for `@everyone`""" + async with ctx.typing(): + mods = ctx.guild.get_role(await self.config.guild(ctx.guild).moderator()) + which = await self.config.guild(ctx.guild).everyone() + ignore = await self.config.guild(ctx.guild).ignore() + + if not mods: + return await ctx.send("Uh oh. Looks like your Admins haven't setup this yet.") + for channel in ctx.guild.text_channels: + if channel.id in ignore: + continue + if which: + await channel.set_permissions( + ctx.guild.default_role, read_messages=True, send_messages=True + ) + else: + await channel.set_permissions( + ctx.guild.default_role, read_messages=False, send_messages=True + ) + await ctx.send(":unlock: Server unlocked.") diff --git a/minecraft/README.rst b/minecraft/README.rst new file mode 100644 index 0000000..d505347 --- /dev/null +++ b/minecraft/README.rst @@ -0,0 +1,88 @@ +.. _minecraft: +========= +Minecraft +========= + +This is the cog guide for the ``Minecraft`` cog. This guide contains the collection of commands which you can use in the cog. +Through this guide, ``[p]`` will always represent your prefix. Replace ``[p]`` with your own prefix when you use these commands in Discord. + +.. note:: + + Ensure that you are up to date by running ``[p]cog update minecraft``. + If there is something missing, or something that needs improving in this documentation, feel free to create an issue `here `_. + This documentation is generated everytime this cog receives an update. + +--------------- +About this cog: +--------------- + +A cog to display informations about Minecraft Java users and servers, and notify for each change of a server! + +--------- +Commands: +--------- + +Here are all the commands included in this cog (9): + +* ``[p]minecraft`` + Get informations about Minecraft Java. + +* ``[p]minecraft addserver [channel] `` + Add a Minecraft Java server in Config to get automatically new status. + +* ``[p]minecraft checkplayers [channel] `` + Include players joining or leaving the server in notifications. + +* ``[p]minecraft editlastmessage [channel] `` + Edit the last message sent for changes. + +* ``[p]minecraft forcecheck`` + Force check Minecraft Java servers in Config. + +* ``[p]minecraft getdebugloopsstatus`` + Get an embed for check loop status. + +* ``[p]minecraft getplayerskin [overlay=False]`` + Get Minecraft Java player skin by name. + +* ``[p]minecraft getserver `` + Get informations about a Minecraft Java server. + +* ``[p]minecraft removeserver [channel] `` + Remove a Minecraft Java server in Config. + +------------ +Installation +------------ + +If you haven't added my repo before, lets add it first. We'll call it "AAA3A-cogs" here. + +.. code-block:: ini + + [p]repo add AAA3A-cogs https://github.com/AAA3A-AAA3A/AAA3A-cogs + +Now, we can install Minecraft. + +.. code-block:: ini + + [p]cog install AAA3A-cogs minecraft + +Once it's installed, it is not loaded by default. Load it by running the following command: + +.. code-block:: ini + + [p]load minecraft + +---------------- +Further Support: +---------------- + +Check out my docs `here `_. +Mention me in the #support_other-cogs in the `cog support server `_ if you need any help. +Additionally, feel free to open an issue or pull request to this repo. + +-------- +Credits: +-------- + +Thanks to Kreusada for the Python code to automatically generate this documentation! \ No newline at end of file diff --git a/minecraft/__init__.py b/minecraft/__init__.py new file mode 100644 index 0000000..e6403e5 --- /dev/null +++ b/minecraft/__init__.py @@ -0,0 +1,46 @@ +from redbot.core import errors # isort:skip +import importlib +import sys + +try: + import AAA3A_utils +except ModuleNotFoundError: + raise errors.CogLoadError( + "The needed utils to run the cog were not found. Please execute the command `[p]pipinstall git+https://github.com/AAA3A-AAA3A/AAA3A_utils.git`. A restart of the bot isn't necessary." + ) +modules = sorted( + [module for module in sys.modules if module.split(".")[0] == "AAA3A_utils"], reverse=True +) +for module in modules: + try: + importlib.reload(sys.modules[module]) + except ModuleNotFoundError: + pass +del AAA3A_utils +# import AAA3A_utils +# import json +# import os +# __version__ = AAA3A_utils.__version__ +# with open(os.path.join(os.path.dirname(__file__), "utils_version.json"), mode="r") as f: +# data = json.load(f) +# needed_utils_version = data["needed_utils_version"] +# if __version__ > needed_utils_version: +# raise errors.CogLoadError( +# "The needed utils to run the cog has a higher version than the one supported by this version of the cog. Please update the cogs of the `AAA3A-cogs` repo." +# ) +# elif __version__ < needed_utils_version: +# raise errors.CogLoadError( +# "The needed utils to run the cog has a lower version than the one supported by this version of the cog. Please execute the command `[p]pipinstall --upgrade git+https://github.com/AAA3A-AAA3A/AAA3A_utils.git`. A restart of the bot isn't necessary." +# ) + +from redbot.core.bot import Red # isort:skip +from redbot.core.utils import get_end_user_data_statement + +from .minecraft import Minecraft + +__red_end_user_data_statement__ = get_end_user_data_statement(file=__file__) + + +async def setup(bot: Red) -> None: + cog = Minecraft(bot) + await bot.add_cog(cog) diff --git a/minecraft/info.json b/minecraft/info.json new file mode 100644 index 0000000..4acfa6a --- /dev/null +++ b/minecraft/info.json @@ -0,0 +1,16 @@ +{ + "author": ["AAA3A"], + "name": "Minecraft", + "install_msg": "Thank you for installing this cog!\nDo `[p]help CogName` to get the list of commands and their description. If you enjoy my work, please consider donating on [Buy Me a Coffee]() or [Ko-Fi]()!", + "short": "A cog to display informations about Minecraft Java users and servers, and notify for each change of a server!", + "description": "A cog to display informations about Minecraft Java users and servers, and notify for each change of a server!", + "tags": [ + "minecraft", + "game", + "server", + "notifications" + ], + "requirements": ["git+https://github.com/AAA3A-AAA3A/AAA3A_utils.git", "mcstatus>=9.3.1"], + "min_bot_version": "3.5.0", + "end_user_data_statement": "This cog does not persistently store data or metadata about users." +} \ No newline at end of file diff --git a/minecraft/locales/de-DE.po b/minecraft/locales/de-DE.po new file mode 100644 index 0000000..2f94952 --- /dev/null +++ b/minecraft/locales/de-DE.po @@ -0,0 +1,140 @@ +msgid "" +msgstr "" +"Project-Id-Version: aaa3a-cogs\n" +"POT-Creation-Date: 2024-07-20 22:15+0200\n" +"PO-Revision-Date: 2024-07-20 20:23\n" +"Last-Translator: \n" +"Language-Team: German\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: redgettext 3.4.2\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Crowdin-Project: aaa3a-cogs\n" +"X-Crowdin-Project-ID: 531090\n" +"X-Crowdin-Language: de\n" +"X-Crowdin-File: /[AAA3A-AAA3A.AAA3A-cogs] main/minecraft/locales/messages.pot\n" +"X-Crowdin-File-ID: 235\n" +"Language: de_DE\n" + +#: minecraft\minecraft.py:48 +msgid "Unable to get data from Minecraft API: {e.message}." +msgstr "Es können keine Daten von der Minecraft API abgerufen werden: {e.message}." + +#: minecraft\minecraft.py:52 +msgid "{argument} not found on Mojang servers." +msgstr "{argument} nicht auf den Mojang-Servern gefunden." + +#: minecraft\minecraft.py:60 +msgid "{argument} is found, but has incorrect UUID." +msgstr "{argument} wird gefunden, hat aber eine falsche UUID." + +#: minecraft\minecraft.py:66 +#, docstring +msgid "A cog to display informations about Minecraft Java users and servers, and notify for each change of a server!" +msgstr "Ein Cog, das Informationen über Minecraft Java Benutzer und Server anzeigt, und über jede Änderung eines Servers informiert!" + +#: minecraft\minecraft.py:187 +msgid "Latency" +msgstr "Latenzzeit" + +#: minecraft\minecraft.py:189 +msgid "Players" +msgstr "Spieler" + +#: minecraft\minecraft.py:207 +msgid "Version" +msgstr "Version" + +#: minecraft\minecraft.py:247 +#, docstring +msgid "Get Minecraft Java player skin by name." +msgstr "Minecraft Java-Spieler-Skin nach Name abrufen." + +#: minecraft\minecraft.py:270 +msgid "Unable to get data from Crafatar: {}" +msgstr "Daten von Crafatar können nicht abgerufen werden: {}" + +#: minecraft\minecraft.py:282 +msgid "Provided by Crafatar." +msgstr "Zur Verfügung gestellt von Crafatar." + +#: minecraft\minecraft.py:288 +#, docstring +msgid "Get informations about a Minecraft Java server." +msgstr "Erhalten Sie Informationen über einen Minecraft Java Server." + +#: minecraft\minecraft.py:294 minecraft\minecraft.py:329 +msgid "No data found for this Minecraft server. Maybe it doesn't exist or its data are temporarily unavailable." +msgstr "Für diesen Minecraft-Server wurden keine Daten gefunden. Vielleicht existiert er nicht oder seine Daten sind vorübergehend nicht verfügbar." + +#: minecraft\minecraft.py:306 +#, docstring +msgid "Add a Minecraft Java server in Config to get automatically new status." +msgstr "Fügen Sie einen Minecraft Java Server in Config hinzu, um automatisch einen neuen Status zu erhalten." + +#: minecraft\minecraft.py:317 +msgid "I don't have sufficient permissions in this channel to send messages with embeds." +msgstr "Ich habe keine ausreichenden Berechtigungen in diesem Kanal, um Nachrichten mit Einbettungen zu senden." + +#: minecraft\minecraft.py:323 +msgid "This server has already been added." +msgstr "Dieser Server ist bereits hinzugefügt worden." + +#: minecraft\minecraft.py:337 +msgid "Server added to this channel." +msgstr "Server zu diesem Kanal hinzugefügt." + +#: minecraft\minecraft.py:344 +#, docstring +msgid "Remove a Minecraft Java server in Config." +msgstr "Entfernen Sie einen Minecraft-Java-Server in Config." + +#: minecraft\minecraft.py:349 +msgid "This server isn't in the Config." +msgstr "Dieser Server befindet sich nicht in der Config." + +#: minecraft\minecraft.py:354 +msgid "Server removed from this channel." +msgstr "Server aus diesem Channel entfernt." + +#: minecraft\minecraft.py:361 +#, docstring +msgid "Include players joining or leaving the server in notifications." +msgstr "Spieler, die dem Server beitreten oder ihn verlassen, werden in die Benachrichtigungen aufgenommen." + +#: minecraft\minecraft.py:368 +msgid "I will not check players for the notifications." +msgstr "Ich werde die Spieler nicht auf die Benachrichtigungen überprüfen." + +#: minecraft\minecraft.py:370 +msgid "I will check players for the notifications." +msgstr "Ich werde die Spieler auf die Benachrichtigungen hin überprüfen." + +#: minecraft\minecraft.py:377 +#, docstring +msgid "Edit the last message sent for changes." +msgstr "Bearbeiten Sie die zuletzt gesendete Nachricht auf Änderungen." + +#: minecraft\minecraft.py:382 +msgid "I will not edit my last message for the notifications." +msgstr "Ich werde meine letzte Nachricht wegen der Benachrichtigungen nicht bearbeiten." + +#: minecraft\minecraft.py:384 +msgid "I will edit my last message for the notifications." +msgstr "Ich werde meine letzte Nachricht für die Benachrichtigungen bearbeiten." + +#: minecraft\minecraft.py:389 +#, docstring +msgid "Force check Minecraft Java servers in Config." +msgstr "Erzwinge die Überprüfung von Minecraft-Java-Servern in Config." + +#: minecraft\minecraft.py:391 +msgid "Servers checked." +msgstr "Server überprüft." + +#: minecraft\minecraft.py:397 +#, docstring +msgid "Get an embed for check loop status." +msgstr "Holen Sie sich eine Einbettung zur Überprüfung des Schleifenstatus." + diff --git a/minecraft/locales/el-GR.po b/minecraft/locales/el-GR.po new file mode 100644 index 0000000..5522c94 --- /dev/null +++ b/minecraft/locales/el-GR.po @@ -0,0 +1,140 @@ +msgid "" +msgstr "" +"Project-Id-Version: aaa3a-cogs\n" +"POT-Creation-Date: 2024-07-20 22:15+0200\n" +"PO-Revision-Date: 2024-07-20 20:23\n" +"Last-Translator: \n" +"Language-Team: Greek\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: redgettext 3.4.2\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Crowdin-Project: aaa3a-cogs\n" +"X-Crowdin-Project-ID: 531090\n" +"X-Crowdin-Language: el\n" +"X-Crowdin-File: /[AAA3A-AAA3A.AAA3A-cogs] main/minecraft/locales/messages.pot\n" +"X-Crowdin-File-ID: 235\n" +"Language: el_GR\n" + +#: minecraft\minecraft.py:48 +msgid "Unable to get data from Minecraft API: {e.message}." +msgstr "Δεν είναι δυνατή η λήψη δεδομένων από το Minecraft API: {e.message}." + +#: minecraft\minecraft.py:52 +msgid "{argument} not found on Mojang servers." +msgstr "{argument} δεν βρέθηκε στους διακομιστές της Mojang." + +#: minecraft\minecraft.py:60 +msgid "{argument} is found, but has incorrect UUID." +msgstr "{argument} βρέθηκε, αλλά έχει λανθασμένο UUID." + +#: minecraft\minecraft.py:66 +#, docstring +msgid "A cog to display informations about Minecraft Java users and servers, and notify for each change of a server!" +msgstr "Ένα γρανάζι για να εμφανίζει πληροφορίες σχετικά με τους χρήστες και τους διακομιστές του Minecraft Java και να ειδοποιεί για κάθε αλλαγή ενός διακομιστή!" + +#: minecraft\minecraft.py:187 +msgid "Latency" +msgstr "Καθυστέρηση" + +#: minecraft\minecraft.py:189 +msgid "Players" +msgstr "Παίκτες" + +#: minecraft\minecraft.py:207 +msgid "Version" +msgstr "Έκδοση" + +#: minecraft\minecraft.py:247 +#, docstring +msgid "Get Minecraft Java player skin by name." +msgstr "Βρείτε το δέρμα παίκτη Minecraft Java με βάση το όνομα." + +#: minecraft\minecraft.py:270 +msgid "Unable to get data from Crafatar: {}" +msgstr "Αδυναμία λήψης δεδομένων από το Crafatar: {}" + +#: minecraft\minecraft.py:282 +msgid "Provided by Crafatar." +msgstr "Παρέχεται από το Crafatar." + +#: minecraft\minecraft.py:288 +#, docstring +msgid "Get informations about a Minecraft Java server." +msgstr "Λάβετε πληροφορίες σχετικά με έναν διακομιστή Minecraft Java." + +#: minecraft\minecraft.py:294 minecraft\minecraft.py:329 +msgid "No data found for this Minecraft server. Maybe it doesn't exist or its data are temporarily unavailable." +msgstr "Δεν βρέθηκαν δεδομένα για αυτόν τον διακομιστή Minecraft. Ίσως δεν υπάρχει ή τα δεδομένα του δεν είναι προσωρινά διαθέσιμα." + +#: minecraft\minecraft.py:306 +#, docstring +msgid "Add a Minecraft Java server in Config to get automatically new status." +msgstr "Προσθέστε έναν διακομιστή Minecraft Java στο Config για να λάβετε αυτόματα νέα κατάσταση." + +#: minecraft\minecraft.py:317 +msgid "I don't have sufficient permissions in this channel to send messages with embeds." +msgstr "Δεν έχω επαρκή δικαιώματα σε αυτό το κανάλι για να στέλνω μηνύματα με ενσωματώσεις." + +#: minecraft\minecraft.py:323 +msgid "This server has already been added." +msgstr "Αυτός ο διακομιστής έχει ήδη προστεθεί." + +#: minecraft\minecraft.py:337 +msgid "Server added to this channel." +msgstr "Ο διακομιστής προστέθηκε σε αυτό το κανάλι." + +#: minecraft\minecraft.py:344 +#, docstring +msgid "Remove a Minecraft Java server in Config." +msgstr "Κατάργηση ενός διακομιστή Java του Minecraft στο Config." + +#: minecraft\minecraft.py:349 +msgid "This server isn't in the Config." +msgstr "Αυτός ο διακομιστής δεν βρίσκεται στο Config." + +#: minecraft\minecraft.py:354 +msgid "Server removed from this channel." +msgstr "Ο διακομιστής αφαιρέθηκε από αυτό το κανάλι." + +#: minecraft\minecraft.py:361 +#, docstring +msgid "Include players joining or leaving the server in notifications." +msgstr "Συμπεριλάβετε τους παίκτες που προσχωρούν ή αποχωρούν από τον διακομιστή στις ειδοποιήσεις." + +#: minecraft\minecraft.py:368 +msgid "I will not check players for the notifications." +msgstr "Δεν θα ελέγχω τους παίκτες για τις ειδοποιήσεις." + +#: minecraft\minecraft.py:370 +msgid "I will check players for the notifications." +msgstr "Θα ελέγξω τους παίκτες για τις ειδοποιήσεις." + +#: minecraft\minecraft.py:377 +#, docstring +msgid "Edit the last message sent for changes." +msgstr "Επεξεργαστείτε το τελευταίο μήνυμα που εστάλη για αλλαγές." + +#: minecraft\minecraft.py:382 +msgid "I will not edit my last message for the notifications." +msgstr "Δεν θα επεξεργαστώ το τελευταίο μου μήνυμα για τις ειδοποιήσεις." + +#: minecraft\minecraft.py:384 +msgid "I will edit my last message for the notifications." +msgstr "Θα επεξεργαστώ το τελευταίο μου μήνυμα για τις ειδοποιήσεις." + +#: minecraft\minecraft.py:389 +#, docstring +msgid "Force check Minecraft Java servers in Config." +msgstr "Αναγκαστικός έλεγχος των διακομιστών Minecraft Java στο Config." + +#: minecraft\minecraft.py:391 +msgid "Servers checked." +msgstr "Οι διακομιστές ελέγχθηκαν." + +#: minecraft\minecraft.py:397 +#, docstring +msgid "Get an embed for check loop status." +msgstr "Λάβετε μια ενσωμάτωση για την κατάσταση του βρόχου ελέγχου." + diff --git a/minecraft/locales/es-ES.po b/minecraft/locales/es-ES.po new file mode 100644 index 0000000..c8a2071 --- /dev/null +++ b/minecraft/locales/es-ES.po @@ -0,0 +1,140 @@ +msgid "" +msgstr "" +"Project-Id-Version: aaa3a-cogs\n" +"POT-Creation-Date: 2024-07-20 22:15+0200\n" +"PO-Revision-Date: 2024-07-20 20:23\n" +"Last-Translator: \n" +"Language-Team: Spanish\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: redgettext 3.4.2\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Crowdin-Project: aaa3a-cogs\n" +"X-Crowdin-Project-ID: 531090\n" +"X-Crowdin-Language: es-ES\n" +"X-Crowdin-File: /[AAA3A-AAA3A.AAA3A-cogs] main/minecraft/locales/messages.pot\n" +"X-Crowdin-File-ID: 235\n" +"Language: es_ES\n" + +#: minecraft\minecraft.py:48 +msgid "Unable to get data from Minecraft API: {e.message}." +msgstr "No se pueden obtener datos de la API de Minecraft: {e.message}." + +#: minecraft\minecraft.py:52 +msgid "{argument} not found on Mojang servers." +msgstr "{argument} no se encuentra en los servidores de Mojang." + +#: minecraft\minecraft.py:60 +msgid "{argument} is found, but has incorrect UUID." +msgstr "{argument} pero tiene un UUID incorrecto." + +#: minecraft\minecraft.py:66 +#, docstring +msgid "A cog to display informations about Minecraft Java users and servers, and notify for each change of a server!" +msgstr "Un engranaje para mostrar información sobre los usuarios y servidores de Minecraft Java, y notificar cada cambio de un servidor!" + +#: minecraft\minecraft.py:187 +msgid "Latency" +msgstr "Latencia" + +#: minecraft\minecraft.py:189 +msgid "Players" +msgstr "Jugadores" + +#: minecraft\minecraft.py:207 +msgid "Version" +msgstr "Versión" + +#: minecraft\minecraft.py:247 +#, docstring +msgid "Get Minecraft Java player skin by name." +msgstr "Obtener Minecraft Java jugador de la piel por su nombre." + +#: minecraft\minecraft.py:270 +msgid "Unable to get data from Crafatar: {}" +msgstr "No se pueden obtener datos de Crafatar: {}" + +#: minecraft\minecraft.py:282 +msgid "Provided by Crafatar." +msgstr "Proporcionado por Crafatar." + +#: minecraft\minecraft.py:288 +#, docstring +msgid "Get informations about a Minecraft Java server." +msgstr "Obtén información sobre un servidor Java de Minecraft." + +#: minecraft\minecraft.py:294 minecraft\minecraft.py:329 +msgid "No data found for this Minecraft server. Maybe it doesn't exist or its data are temporarily unavailable." +msgstr "No se han encontrado datos para este servidor. Puede que no exista o los datos no están disponibles temporalmente." + +#: minecraft\minecraft.py:306 +#, docstring +msgid "Add a Minecraft Java server in Config to get automatically new status." +msgstr "Añade un servidor Java Minecraft en Config para obtener automáticamente un nuevo estado." + +#: minecraft\minecraft.py:317 +msgid "I don't have sufficient permissions in this channel to send messages with embeds." +msgstr "No tengo suficientes permisos en este canal para enviar mensajes con incrustados." + +#: minecraft\minecraft.py:323 +msgid "This server has already been added." +msgstr "Este servidor ya ha sido añadido." + +#: minecraft\minecraft.py:337 +msgid "Server added to this channel." +msgstr "Servidor añadido a este canal." + +#: minecraft\minecraft.py:344 +#, docstring +msgid "Remove a Minecraft Java server in Config." +msgstr "Eliminar un servidor Java de Minecraft en Config." + +#: minecraft\minecraft.py:349 +msgid "This server isn't in the Config." +msgstr "Este servidor no está en el Config." + +#: minecraft\minecraft.py:354 +msgid "Server removed from this channel." +msgstr "Servidor eliminado de este canal." + +#: minecraft\minecraft.py:361 +#, docstring +msgid "Include players joining or leaving the server in notifications." +msgstr "Incluye jugadores entrando y saliendo del servidor en las notificaciones." + +#: minecraft\minecraft.py:368 +msgid "I will not check players for the notifications." +msgstr "No comprobaré jugadores para las notificaciones." + +#: minecraft\minecraft.py:370 +msgid "I will check players for the notifications." +msgstr "Comprobaré jugadores para las notificaciones." + +#: minecraft\minecraft.py:377 +#, docstring +msgid "Edit the last message sent for changes." +msgstr "Edita el último mensaje enviado por cambios." + +#: minecraft\minecraft.py:382 +msgid "I will not edit my last message for the notifications." +msgstr "No editaré mi último mensaje para las notificaciones." + +#: minecraft\minecraft.py:384 +msgid "I will edit my last message for the notifications." +msgstr "Editaré mi último mensaje para las notificaciones." + +#: minecraft\minecraft.py:389 +#, docstring +msgid "Force check Minecraft Java servers in Config." +msgstr "Forzar la comprobación de los servidores Java de Minecraft en Config." + +#: minecraft\minecraft.py:391 +msgid "Servers checked." +msgstr "Servidores comprobados." + +#: minecraft\minecraft.py:397 +#, docstring +msgid "Get an embed for check loop status." +msgstr "Obtener un embed para comprobar el estado del bucle." + diff --git a/minecraft/locales/fi-FI.po b/minecraft/locales/fi-FI.po new file mode 100644 index 0000000..1c0e546 --- /dev/null +++ b/minecraft/locales/fi-FI.po @@ -0,0 +1,140 @@ +msgid "" +msgstr "" +"Project-Id-Version: aaa3a-cogs\n" +"POT-Creation-Date: 2024-07-20 22:15+0200\n" +"PO-Revision-Date: 2024-07-20 20:23\n" +"Last-Translator: \n" +"Language-Team: Finnish\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: redgettext 3.4.2\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Crowdin-Project: aaa3a-cogs\n" +"X-Crowdin-Project-ID: 531090\n" +"X-Crowdin-Language: fi\n" +"X-Crowdin-File: /[AAA3A-AAA3A.AAA3A-cogs] main/minecraft/locales/messages.pot\n" +"X-Crowdin-File-ID: 235\n" +"Language: fi_FI\n" + +#: minecraft\minecraft.py:48 +msgid "Unable to get data from Minecraft API: {e.message}." +msgstr "Tietoja ei saada Minecraft API:sta: {e.message}." + +#: minecraft\minecraft.py:52 +msgid "{argument} not found on Mojang servers." +msgstr "{argument} ei löydy Mojangin palvelimilta." + +#: minecraft\minecraft.py:60 +msgid "{argument} is found, but has incorrect UUID." +msgstr "{argument} löytyy, mutta sen UUID-tunnus on väärä." + +#: minecraft\minecraft.py:66 +#, docstring +msgid "A cog to display informations about Minecraft Java users and servers, and notify for each change of a server!" +msgstr "Tietojen näyttämiseen Minecraft Java -käyttäjistä ja palvelimista, ja ilmoittaa jokaisesta palvelimen muutoksesta!" + +#: minecraft\minecraft.py:187 +msgid "Latency" +msgstr "Viive" + +#: minecraft\minecraft.py:189 +msgid "Players" +msgstr "Pelaajat" + +#: minecraft\minecraft.py:207 +msgid "Version" +msgstr "Versio" + +#: minecraft\minecraft.py:247 +#, docstring +msgid "Get Minecraft Java player skin by name." +msgstr "Hae Minecraftin Java-pelaajan iho nimen perusteella." + +#: minecraft\minecraft.py:270 +msgid "Unable to get data from Crafatar: {}" +msgstr "Tietoja ei saada Crafatarista: {}" + +#: minecraft\minecraft.py:282 +msgid "Provided by Crafatar." +msgstr "Toimittanut Crafatar." + +#: minecraft\minecraft.py:288 +#, docstring +msgid "Get informations about a Minecraft Java server." +msgstr "Hanki tietoa Minecraft Java -palvelimesta." + +#: minecraft\minecraft.py:294 minecraft\minecraft.py:329 +msgid "No data found for this Minecraft server. Maybe it doesn't exist or its data are temporarily unavailable." +msgstr "Tästä Minecraft-palvelimesta ei löytynyt tietoja. Ehkä sitä ei ole olemassa tai sen tiedot eivät ole tilapäisesti saatavilla." + +#: minecraft\minecraft.py:306 +#, docstring +msgid "Add a Minecraft Java server in Config to get automatically new status." +msgstr "Lisää Minecraft Java -palvelin Configiin saadaksesi automaattisesti uuden tilan." + +#: minecraft\minecraft.py:317 +msgid "I don't have sufficient permissions in this channel to send messages with embeds." +msgstr "Minulla ei ole riittäviä oikeuksia tällä kanavalla lähettää viestejä, joissa on upotuksia." + +#: minecraft\minecraft.py:323 +msgid "This server has already been added." +msgstr "Tämä palvelin on jo lisätty." + +#: minecraft\minecraft.py:337 +msgid "Server added to this channel." +msgstr "Palvelin lisätty tälle kanavalle." + +#: minecraft\minecraft.py:344 +#, docstring +msgid "Remove a Minecraft Java server in Config." +msgstr "Poista Minecraftin Java-palvelin Configissa." + +#: minecraft\minecraft.py:349 +msgid "This server isn't in the Config." +msgstr "Tämä palvelin ei ole Configissa." + +#: minecraft\minecraft.py:354 +msgid "Server removed from this channel." +msgstr "Palvelin poistettu tältä kanavalta." + +#: minecraft\minecraft.py:361 +#, docstring +msgid "Include players joining or leaving the server in notifications." +msgstr "Sisällytä palvelimelle liittyvät tai palvelimelta lähtevät pelaajat ilmoituksiin." + +#: minecraft\minecraft.py:368 +msgid "I will not check players for the notifications." +msgstr "En tarkista pelaajien ilmoituksia." + +#: minecraft\minecraft.py:370 +msgid "I will check players for the notifications." +msgstr "Tarkistan pelaajien ilmoitukset." + +#: minecraft\minecraft.py:377 +#, docstring +msgid "Edit the last message sent for changes." +msgstr "Muokkaa viimeksi lähetettyä viestiä muutoksia varten." + +#: minecraft\minecraft.py:382 +msgid "I will not edit my last message for the notifications." +msgstr "En muokkaa viimeistä viestiäni ilmoitusten vuoksi." + +#: minecraft\minecraft.py:384 +msgid "I will edit my last message for the notifications." +msgstr "Muokkaan viimeistä viestiäni ilmoitusten osalta." + +#: minecraft\minecraft.py:389 +#, docstring +msgid "Force check Minecraft Java servers in Config." +msgstr "Pakota tarkistamaan Minecraft Java -palvelimet Configissa." + +#: minecraft\minecraft.py:391 +msgid "Servers checked." +msgstr "Palvelimet tarkistettu." + +#: minecraft\minecraft.py:397 +#, docstring +msgid "Get an embed for check loop status." +msgstr "Hae upotus silmukan tilan tarkistamista varten." + diff --git a/minecraft/locales/fr-FR.po b/minecraft/locales/fr-FR.po new file mode 100644 index 0000000..e01126e --- /dev/null +++ b/minecraft/locales/fr-FR.po @@ -0,0 +1,140 @@ +msgid "" +msgstr "" +"Project-Id-Version: aaa3a-cogs\n" +"POT-Creation-Date: 2024-07-20 22:15+0200\n" +"PO-Revision-Date: 2024-07-20 20:23\n" +"Last-Translator: \n" +"Language-Team: French\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: redgettext 3.4.2\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"X-Crowdin-Project: aaa3a-cogs\n" +"X-Crowdin-Project-ID: 531090\n" +"X-Crowdin-Language: fr\n" +"X-Crowdin-File: /[AAA3A-AAA3A.AAA3A-cogs] main/minecraft/locales/messages.pot\n" +"X-Crowdin-File-ID: 235\n" +"Language: fr_FR\n" + +#: minecraft\minecraft.py:48 +msgid "Unable to get data from Minecraft API: {e.message}." +msgstr "Impossible d'obtenir des données de l'API Minecraft : {e.message}." + +#: minecraft\minecraft.py:52 +msgid "{argument} not found on Mojang servers." +msgstr "{argument} introuvable sur les serveurs de Mojang." + +#: minecraft\minecraft.py:60 +msgid "{argument} is found, but has incorrect UUID." +msgstr "{argument} est trouvé, mais son UUID est incorrect." + +#: minecraft\minecraft.py:66 +#, docstring +msgid "A cog to display informations about Minecraft Java users and servers, and notify for each change of a server!" +msgstr "Un cog pour afficher des informations sur les utilisateurs et les serveurs de Minecraft Java, et notifier chaque changement de serveur !" + +#: minecraft\minecraft.py:187 +msgid "Latency" +msgstr "Temps de latence" + +#: minecraft\minecraft.py:189 +msgid "Players" +msgstr "Joueurs" + +#: minecraft\minecraft.py:207 +msgid "Version" +msgstr "Version" + +#: minecraft\minecraft.py:247 +#, docstring +msgid "Get Minecraft Java player skin by name." +msgstr "Obtenir le skin du joueur Java de Minecraft par nom." + +#: minecraft\minecraft.py:270 +msgid "Unable to get data from Crafatar: {}" +msgstr "Impossible d'obtenir des données de Crafatar : {}" + +#: minecraft\minecraft.py:282 +msgid "Provided by Crafatar." +msgstr "Fourni par Crafatar." + +#: minecraft\minecraft.py:288 +#, docstring +msgid "Get informations about a Minecraft Java server." +msgstr "Obtenir des informations sur un serveur Java Minecraft." + +#: minecraft\minecraft.py:294 minecraft\minecraft.py:329 +msgid "No data found for this Minecraft server. Maybe it doesn't exist or its data are temporarily unavailable." +msgstr "Aucune donnée n'a été trouvée pour ce serveur Minecraft. Peut-être qu'il n'existe pas ou que ses données sont temporairement indisponibles." + +#: minecraft\minecraft.py:306 +#, docstring +msgid "Add a Minecraft Java server in Config to get automatically new status." +msgstr "Ajoutez un serveur Minecraft Java dans Config pour obtenir automatiquement un nouveau statut." + +#: minecraft\minecraft.py:317 +msgid "I don't have sufficient permissions in this channel to send messages with embeds." +msgstr "Je n'ai pas les autorisations suffisantes dans ce canal pour envoyer des messages avec des liens." + +#: minecraft\minecraft.py:323 +msgid "This server has already been added." +msgstr "Ce serveur a déjà été ajouté." + +#: minecraft\minecraft.py:337 +msgid "Server added to this channel." +msgstr "Serveur ajouté à ce canal." + +#: minecraft\minecraft.py:344 +#, docstring +msgid "Remove a Minecraft Java server in Config." +msgstr "Supprimer un serveur Java Minecraft dans Config." + +#: minecraft\minecraft.py:349 +msgid "This server isn't in the Config." +msgstr "Ce serveur n'est pas dans la Config." + +#: minecraft\minecraft.py:354 +msgid "Server removed from this channel." +msgstr "Serveur retiré de ce canal." + +#: minecraft\minecraft.py:361 +#, docstring +msgid "Include players joining or leaving the server in notifications." +msgstr "Inclure les joueurs qui rejoignent ou quittent le serveur dans les notifications." + +#: minecraft\minecraft.py:368 +msgid "I will not check players for the notifications." +msgstr "Je ne vérifierai pas les joueurs pour les notifications." + +#: minecraft\minecraft.py:370 +msgid "I will check players for the notifications." +msgstr "Je consulterai les lecteurs pour les notifications." + +#: minecraft\minecraft.py:377 +#, docstring +msgid "Edit the last message sent for changes." +msgstr "Modifier le dernier message envoyé pour y apporter des changements." + +#: minecraft\minecraft.py:382 +msgid "I will not edit my last message for the notifications." +msgstr "Je ne modifierai pas mon dernier message pour les notifications." + +#: minecraft\minecraft.py:384 +msgid "I will edit my last message for the notifications." +msgstr "Je modifierai mon dernier message pour les notifications." + +#: minecraft\minecraft.py:389 +#, docstring +msgid "Force check Minecraft Java servers in Config." +msgstr "Forcer la vérification des serveurs Java Minecraft dans Config." + +#: minecraft\minecraft.py:391 +msgid "Servers checked." +msgstr "Serveurs vérifiés." + +#: minecraft\minecraft.py:397 +#, docstring +msgid "Get an embed for check loop status." +msgstr "Obtenir un embed pour vérifier l'état de la boucle." + diff --git a/minecraft/locales/it-IT.po b/minecraft/locales/it-IT.po new file mode 100644 index 0000000..78a2820 --- /dev/null +++ b/minecraft/locales/it-IT.po @@ -0,0 +1,140 @@ +msgid "" +msgstr "" +"Project-Id-Version: aaa3a-cogs\n" +"POT-Creation-Date: 2024-07-20 22:15+0200\n" +"PO-Revision-Date: 2024-07-20 20:23\n" +"Last-Translator: \n" +"Language-Team: Italian\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: redgettext 3.4.2\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Crowdin-Project: aaa3a-cogs\n" +"X-Crowdin-Project-ID: 531090\n" +"X-Crowdin-Language: it\n" +"X-Crowdin-File: /[AAA3A-AAA3A.AAA3A-cogs] main/minecraft/locales/messages.pot\n" +"X-Crowdin-File-ID: 235\n" +"Language: it_IT\n" + +#: minecraft\minecraft.py:48 +msgid "Unable to get data from Minecraft API: {e.message}." +msgstr "Impossibile ottenere dati da Minecraft API: {e.message}." + +#: minecraft\minecraft.py:52 +msgid "{argument} not found on Mojang servers." +msgstr "{argument} non trovato sui server Mojang." + +#: minecraft\minecraft.py:60 +msgid "{argument} is found, but has incorrect UUID." +msgstr "{argument} è stato trovato, ma ha un UUID non corretto." + +#: minecraft\minecraft.py:66 +#, docstring +msgid "A cog to display informations about Minecraft Java users and servers, and notify for each change of a server!" +msgstr "Un modulo per visualizzare le informazioni sugli utenti e sui server di Minecraft Java, e notificare ogni cambiamento di un server!" + +#: minecraft\minecraft.py:187 +msgid "Latency" +msgstr "Latenza" + +#: minecraft\minecraft.py:189 +msgid "Players" +msgstr "Giocatori" + +#: minecraft\minecraft.py:207 +msgid "Version" +msgstr "Versione" + +#: minecraft\minecraft.py:247 +#, docstring +msgid "Get Minecraft Java player skin by name." +msgstr "Ottenere la skin del giocatore Java di Minecraft per nome." + +#: minecraft\minecraft.py:270 +msgid "Unable to get data from Crafatar: {}" +msgstr "Impossibile ottenere i dati da Crafatar: {}" + +#: minecraft\minecraft.py:282 +msgid "Provided by Crafatar." +msgstr "Fornito da Crafatar." + +#: minecraft\minecraft.py:288 +#, docstring +msgid "Get informations about a Minecraft Java server." +msgstr "Ottenere informazioni su un server Java di Minecraft." + +#: minecraft\minecraft.py:294 minecraft\minecraft.py:329 +msgid "No data found for this Minecraft server. Maybe it doesn't exist or its data are temporarily unavailable." +msgstr "Non sono stati trovati dati per questo server Minecraft. Forse non esiste o i suoi dati non sono temporaneamente disponibili." + +#: minecraft\minecraft.py:306 +#, docstring +msgid "Add a Minecraft Java server in Config to get automatically new status." +msgstr "Aggiungere un server Minecraft Java in Config per ottenere automaticamente un nuovo stato." + +#: minecraft\minecraft.py:317 +msgid "I don't have sufficient permissions in this channel to send messages with embeds." +msgstr "Non ho i permessi sufficienti in questo canale per inviare messaggi con embed." + +#: minecraft\minecraft.py:323 +msgid "This server has already been added." +msgstr "Questo server è già stato aggiunto." + +#: minecraft\minecraft.py:337 +msgid "Server added to this channel." +msgstr "Server aggiunto a questo canale." + +#: minecraft\minecraft.py:344 +#, docstring +msgid "Remove a Minecraft Java server in Config." +msgstr "Rimuovere un server Minecraft Java in Config." + +#: minecraft\minecraft.py:349 +msgid "This server isn't in the Config." +msgstr "Questo server non è nella configurazione." + +#: minecraft\minecraft.py:354 +msgid "Server removed from this channel." +msgstr "Server rimosso da questo canale." + +#: minecraft\minecraft.py:361 +#, docstring +msgid "Include players joining or leaving the server in notifications." +msgstr "Includere nelle notifiche i giocatori che si uniscono o lasciano il server." + +#: minecraft\minecraft.py:368 +msgid "I will not check players for the notifications." +msgstr "Non controllerò i giocatori per le notifiche." + +#: minecraft\minecraft.py:370 +msgid "I will check players for the notifications." +msgstr "Controllerò i giocatori per le notifiche." + +#: minecraft\minecraft.py:377 +#, docstring +msgid "Edit the last message sent for changes." +msgstr "Modificare l'ultimo messaggio inviato per apportare modifiche." + +#: minecraft\minecraft.py:382 +msgid "I will not edit my last message for the notifications." +msgstr "Non modificherò il mio ultimo messaggio per le notifiche." + +#: minecraft\minecraft.py:384 +msgid "I will edit my last message for the notifications." +msgstr "Modificherò il mio ultimo messaggio per le notifiche." + +#: minecraft\minecraft.py:389 +#, docstring +msgid "Force check Minecraft Java servers in Config." +msgstr "Forza il controllo dei server Java di Minecraft in Config." + +#: minecraft\minecraft.py:391 +msgid "Servers checked." +msgstr "Server controllati." + +#: minecraft\minecraft.py:397 +#, docstring +msgid "Get an embed for check loop status." +msgstr "Ottenere un embed per controllare lo stato del ciclo." + diff --git a/minecraft/locales/ja-JP.po b/minecraft/locales/ja-JP.po new file mode 100644 index 0000000..2979025 --- /dev/null +++ b/minecraft/locales/ja-JP.po @@ -0,0 +1,140 @@ +msgid "" +msgstr "" +"Project-Id-Version: aaa3a-cogs\n" +"POT-Creation-Date: 2024-07-20 22:15+0200\n" +"PO-Revision-Date: 2024-07-20 20:23\n" +"Last-Translator: \n" +"Language-Team: Japanese\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: redgettext 3.4.2\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Crowdin-Project: aaa3a-cogs\n" +"X-Crowdin-Project-ID: 531090\n" +"X-Crowdin-Language: ja\n" +"X-Crowdin-File: /[AAA3A-AAA3A.AAA3A-cogs] main/minecraft/locales/messages.pot\n" +"X-Crowdin-File-ID: 235\n" +"Language: ja_JP\n" + +#: minecraft\minecraft.py:48 +msgid "Unable to get data from Minecraft API: {e.message}." +msgstr "Minecraft APIからデータを取得できません: {e.message}." + +#: minecraft\minecraft.py:52 +msgid "{argument} not found on Mojang servers." +msgstr "{argument} は、Mojangのサーバーで見つかりませんでした。" + +#: minecraft\minecraft.py:60 +msgid "{argument} is found, but has incorrect UUID." +msgstr "{argument} が見つかりましたが、UUIDが不正確です。" + +#: minecraft\minecraft.py:66 +#, docstring +msgid "A cog to display informations about Minecraft Java users and servers, and notify for each change of a server!" +msgstr "Minecraft Java のユーザーやサーバーの情報を表示し、サーバーの変更などを通知するための歯車です!" + +#: minecraft\minecraft.py:187 +msgid "Latency" +msgstr "レイテンシー" + +#: minecraft\minecraft.py:189 +msgid "Players" +msgstr "プレーヤーズ" + +#: minecraft\minecraft.py:207 +msgid "Version" +msgstr "バージョン" + +#: minecraft\minecraft.py:247 +#, docstring +msgid "Get Minecraft Java player skin by name." +msgstr "Minecraft Javaプレーヤースキンを名前で取得します。" + +#: minecraft\minecraft.py:270 +msgid "Unable to get data from Crafatar: {}" +msgstr "Crafatarからデータを取得できない: {}。" + +#: minecraft\minecraft.py:282 +msgid "Provided by Crafatar." +msgstr "Crafatarの提供です。" + +#: minecraft\minecraft.py:288 +#, docstring +msgid "Get informations about a Minecraft Java server." +msgstr "MinecraftのJavaサーバーに関する情報を得ることができます。" + +#: minecraft\minecraft.py:294 minecraft\minecraft.py:329 +msgid "No data found for this Minecraft server. Maybe it doesn't exist or its data are temporarily unavailable." +msgstr "このMinecraftサーバーのデータが見つかりません。存在しないか、データが一時的に利用できないのかもしれません。" + +#: minecraft\minecraft.py:306 +#, docstring +msgid "Add a Minecraft Java server in Config to get automatically new status." +msgstr "MinecraftのJavaサーバーをConfigに追加すると、自動的に新しいステータスを取得します。" + +#: minecraft\minecraft.py:317 +msgid "I don't have sufficient permissions in this channel to send messages with embeds." +msgstr "このチャンネルでは、埋め込みメッセージを送信するのに十分な権限がありません。" + +#: minecraft\minecraft.py:323 +msgid "This server has already been added." +msgstr "このサーバーはすでに追加されています。" + +#: minecraft\minecraft.py:337 +msgid "Server added to this channel." +msgstr "このチャンネルにサーバーが追加されました。" + +#: minecraft\minecraft.py:344 +#, docstring +msgid "Remove a Minecraft Java server in Config." +msgstr "ConfigでMinecraft Javaサーバーを削除する。" + +#: minecraft\minecraft.py:349 +msgid "This server isn't in the Config." +msgstr "このサーバーはConfigにないんです。" + +#: minecraft\minecraft.py:354 +msgid "Server removed from this channel." +msgstr "このチャンネルからサーバーが削除された。" + +#: minecraft\minecraft.py:361 +#, docstring +msgid "Include players joining or leaving the server in notifications." +msgstr "サーバーに参加または退会するプレーヤーを通知に含める。" + +#: minecraft\minecraft.py:368 +msgid "I will not check players for the notifications." +msgstr "私は通知で選手をチェックすることはない。" + +#: minecraft\minecraft.py:370 +msgid "I will check players for the notifications." +msgstr "選手への通知はチェックしておく。" + +#: minecraft\minecraft.py:377 +#, docstring +msgid "Edit the last message sent for changes." +msgstr "最後に送信されたメッセージの変更を編集する。" + +#: minecraft\minecraft.py:382 +msgid "I will not edit my last message for the notifications." +msgstr "通知のために前回のメッセージを編集するつもりはない。" + +#: minecraft\minecraft.py:384 +msgid "I will edit my last message for the notifications." +msgstr "前回のメッセージを編集してお知らせします。" + +#: minecraft\minecraft.py:389 +#, docstring +msgid "Force check Minecraft Java servers in Config." +msgstr "ConfigでMinecraftのJavaサーバーを強制的にチェックするようにしました。" + +#: minecraft\minecraft.py:391 +msgid "Servers checked." +msgstr "サーバーをチェックした。" + +#: minecraft\minecraft.py:397 +#, docstring +msgid "Get an embed for check loop status." +msgstr "ループの状態を確認するためのエンベデッドを取得します。" + diff --git a/minecraft/locales/messages.pot b/minecraft/locales/messages.pot new file mode 100644 index 0000000..374f9be --- /dev/null +++ b/minecraft/locales/messages.pot @@ -0,0 +1,139 @@ +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2025-03-15 23:04+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: redgettext 3.4.2\n" + +#: minecraft\minecraft.py:48 +msgid "Unable to get data from Minecraft API: {e.message}." +msgstr "" + +#: minecraft\minecraft.py:52 +msgid "{argument} not found on Mojang servers." +msgstr "" + +#: minecraft\minecraft.py:60 +msgid "{argument} is found, but has incorrect UUID." +msgstr "" + +#: minecraft\minecraft.py:66 +#, docstring +msgid "" +"A cog to display informations about Minecraft Java users and servers, and " +"notify for each change of a server!" +msgstr "" + +#: minecraft\minecraft.py:189 +msgid "Latency" +msgstr "" + +#: minecraft\minecraft.py:191 +msgid "Players" +msgstr "" + +#: minecraft\minecraft.py:211 +msgid "Version" +msgstr "" + +#: minecraft\minecraft.py:251 +#, docstring +msgid "Get Minecraft Java player skin by name." +msgstr "" + +#: minecraft\minecraft.py:274 +msgid "Unable to get data from Crafatar: {}" +msgstr "" + +#: minecraft\minecraft.py:286 +msgid "Provided by Crafatar." +msgstr "" + +#: minecraft\minecraft.py:292 +#, docstring +msgid "Get informations about a Minecraft Java server." +msgstr "" + +#: minecraft\minecraft.py:298 minecraft\minecraft.py:333 +msgid "" +"No data found for this Minecraft server. Maybe it doesn't exist or its data " +"are temporarily unavailable." +msgstr "" + +#: minecraft\minecraft.py:310 +#, docstring +msgid "Add a Minecraft Java server in Config to get automatically new status." +msgstr "" + +#: minecraft\minecraft.py:321 +msgid "" +"I don't have sufficient permissions in this channel to send messages with " +"embeds." +msgstr "" + +#: minecraft\minecraft.py:327 +msgid "This server has already been added." +msgstr "" + +#: minecraft\minecraft.py:341 +msgid "Server added to this channel." +msgstr "" + +#: minecraft\minecraft.py:348 +#, docstring +msgid "Remove a Minecraft Java server in Config." +msgstr "" + +#: minecraft\minecraft.py:353 +msgid "This server isn't in the Config." +msgstr "" + +#: minecraft\minecraft.py:358 +msgid "Server removed from this channel." +msgstr "" + +#: minecraft\minecraft.py:365 +#, docstring +msgid "Include players joining or leaving the server in notifications." +msgstr "" + +#: minecraft\minecraft.py:372 +msgid "I will not check players for the notifications." +msgstr "" + +#: minecraft\minecraft.py:374 +msgid "I will check players for the notifications." +msgstr "" + +#: minecraft\minecraft.py:381 +#, docstring +msgid "Edit the last message sent for changes." +msgstr "" + +#: minecraft\minecraft.py:386 +msgid "I will not edit my last message for the notifications." +msgstr "" + +#: minecraft\minecraft.py:388 +msgid "I will edit my last message for the notifications." +msgstr "" + +#: minecraft\minecraft.py:393 +#, docstring +msgid "Force check Minecraft Java servers in Config." +msgstr "" + +#: minecraft\minecraft.py:395 +msgid "Servers checked." +msgstr "" + +#: minecraft\minecraft.py:401 +#, docstring +msgid "Get an embed for check loop status." +msgstr "" diff --git a/minecraft/locales/nl-NL.po b/minecraft/locales/nl-NL.po new file mode 100644 index 0000000..67c7fa6 --- /dev/null +++ b/minecraft/locales/nl-NL.po @@ -0,0 +1,140 @@ +msgid "" +msgstr "" +"Project-Id-Version: aaa3a-cogs\n" +"POT-Creation-Date: 2024-07-20 22:15+0200\n" +"PO-Revision-Date: 2024-07-20 20:23\n" +"Last-Translator: \n" +"Language-Team: Dutch\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: redgettext 3.4.2\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Crowdin-Project: aaa3a-cogs\n" +"X-Crowdin-Project-ID: 531090\n" +"X-Crowdin-Language: nl\n" +"X-Crowdin-File: /[AAA3A-AAA3A.AAA3A-cogs] main/minecraft/locales/messages.pot\n" +"X-Crowdin-File-ID: 235\n" +"Language: nl_NL\n" + +#: minecraft\minecraft.py:48 +msgid "Unable to get data from Minecraft API: {e.message}." +msgstr "Kan geen gegevens ophalen uit Minecraft API: {e.message}." + +#: minecraft\minecraft.py:52 +msgid "{argument} not found on Mojang servers." +msgstr "{argument} niet gevonden op Mojang-servers." + +#: minecraft\minecraft.py:60 +msgid "{argument} is found, but has incorrect UUID." +msgstr "{argument} is gevonden, maar heeft een onjuiste UUID." + +#: minecraft\minecraft.py:66 +#, docstring +msgid "A cog to display informations about Minecraft Java users and servers, and notify for each change of a server!" +msgstr "Een tandwiel om informatie weer te geven over Minecraft Java gebruikers en servers, en te waarschuwen voor elke verandering van een server!" + +#: minecraft\minecraft.py:187 +msgid "Latency" +msgstr "Latency" + +#: minecraft\minecraft.py:189 +msgid "Players" +msgstr "Spelers" + +#: minecraft\minecraft.py:207 +msgid "Version" +msgstr "Versie" + +#: minecraft\minecraft.py:247 +#, docstring +msgid "Get Minecraft Java player skin by name." +msgstr "Haal Minecraft Java speler skin op naam." + +#: minecraft\minecraft.py:270 +msgid "Unable to get data from Crafatar: {}" +msgstr "Kan geen gegevens ophalen uit Crafatar: {}" + +#: minecraft\minecraft.py:282 +msgid "Provided by Crafatar." +msgstr "Geleverd door Crafatar." + +#: minecraft\minecraft.py:288 +#, docstring +msgid "Get informations about a Minecraft Java server." +msgstr "Krijg informatie over een Minecraft Java server." + +#: minecraft\minecraft.py:294 minecraft\minecraft.py:329 +msgid "No data found for this Minecraft server. Maybe it doesn't exist or its data are temporarily unavailable." +msgstr "Geen gegevens gevonden voor deze Minecraft server. Misschien bestaat hij niet of zijn de gegevens tijdelijk niet beschikbaar." + +#: minecraft\minecraft.py:306 +#, docstring +msgid "Add a Minecraft Java server in Config to get automatically new status." +msgstr "Voeg een Minecraft Java-server toe in Config om automatisch een nieuwe status te krijgen." + +#: minecraft\minecraft.py:317 +msgid "I don't have sufficient permissions in this channel to send messages with embeds." +msgstr "Ik heb niet voldoende rechten in dit kanaal om berichten met embeds te versturen." + +#: minecraft\minecraft.py:323 +msgid "This server has already been added." +msgstr "Deze server is al toegevoegd." + +#: minecraft\minecraft.py:337 +msgid "Server added to this channel." +msgstr "Server toegevoegd aan dit kanaal." + +#: minecraft\minecraft.py:344 +#, docstring +msgid "Remove a Minecraft Java server in Config." +msgstr "Verwijder een Minecraft Java-server in Config." + +#: minecraft\minecraft.py:349 +msgid "This server isn't in the Config." +msgstr "Deze server staat niet in de Config." + +#: minecraft\minecraft.py:354 +msgid "Server removed from this channel." +msgstr "Server verwijderd van dit kanaal." + +#: minecraft\minecraft.py:361 +#, docstring +msgid "Include players joining or leaving the server in notifications." +msgstr "Neem spelers die de server betreden of verlaten op in meldingen." + +#: minecraft\minecraft.py:368 +msgid "I will not check players for the notifications." +msgstr "Ik zal spelers niet controleren op de meldingen." + +#: minecraft\minecraft.py:370 +msgid "I will check players for the notifications." +msgstr "Ik zal spelers controleren op de meldingen." + +#: minecraft\minecraft.py:377 +#, docstring +msgid "Edit the last message sent for changes." +msgstr "Bewerk het laatst verzonden bericht voor wijzigingen." + +#: minecraft\minecraft.py:382 +msgid "I will not edit my last message for the notifications." +msgstr "Ik zal mijn laatste bericht niet bewerken voor de meldingen." + +#: minecraft\minecraft.py:384 +msgid "I will edit my last message for the notifications." +msgstr "Ik zal mijn laatste bericht bewerken voor de meldingen." + +#: minecraft\minecraft.py:389 +#, docstring +msgid "Force check Minecraft Java servers in Config." +msgstr "Forceer het controleren van Minecraft Java-servers in Config." + +#: minecraft\minecraft.py:391 +msgid "Servers checked." +msgstr "Servers gecontroleerd." + +#: minecraft\minecraft.py:397 +#, docstring +msgid "Get an embed for check loop status." +msgstr "Een insluiting krijgen om de lusstatus te controleren." + diff --git a/minecraft/locales/pl-PL.po b/minecraft/locales/pl-PL.po new file mode 100644 index 0000000..e876fbf --- /dev/null +++ b/minecraft/locales/pl-PL.po @@ -0,0 +1,140 @@ +msgid "" +msgstr "" +"Project-Id-Version: aaa3a-cogs\n" +"POT-Creation-Date: 2024-07-20 22:15+0200\n" +"PO-Revision-Date: 2024-07-20 20:24\n" +"Last-Translator: \n" +"Language-Team: Polish\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: redgettext 3.4.2\n" +"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n" +"X-Crowdin-Project: aaa3a-cogs\n" +"X-Crowdin-Project-ID: 531090\n" +"X-Crowdin-Language: pl\n" +"X-Crowdin-File: /[AAA3A-AAA3A.AAA3A-cogs] main/minecraft/locales/messages.pot\n" +"X-Crowdin-File-ID: 235\n" +"Language: pl_PL\n" + +#: minecraft\minecraft.py:48 +msgid "Unable to get data from Minecraft API: {e.message}." +msgstr "Nie można pobrać danych z interfejsu API Minecraft: {e.message}." + +#: minecraft\minecraft.py:52 +msgid "{argument} not found on Mojang servers." +msgstr "{argument} nie znaleziono na serwerach Mojang." + +#: minecraft\minecraft.py:60 +msgid "{argument} is found, but has incorrect UUID." +msgstr "{argument} został znaleziony, ale ma nieprawidłowy identyfikator UUID." + +#: minecraft\minecraft.py:66 +#, docstring +msgid "A cog to display informations about Minecraft Java users and servers, and notify for each change of a server!" +msgstr "Tryb do wyświetlania informacji o użytkownikach i serwerach Minecraft Java oraz powiadamiania o każdej zmianie serwera!" + +#: minecraft\minecraft.py:187 +msgid "Latency" +msgstr "Opóźnienie" + +#: minecraft\minecraft.py:189 +msgid "Players" +msgstr "Gracze" + +#: minecraft\minecraft.py:207 +msgid "Version" +msgstr "Wersja" + +#: minecraft\minecraft.py:247 +#, docstring +msgid "Get Minecraft Java player skin by name." +msgstr "Pobierz skórkę gracza Minecraft Java według nazwy." + +#: minecraft\minecraft.py:270 +msgid "Unable to get data from Crafatar: {}" +msgstr "Nie można pobrać danych z Crafatar: {}" + +#: minecraft\minecraft.py:282 +msgid "Provided by Crafatar." +msgstr "Dostarczone przez Crafatar." + +#: minecraft\minecraft.py:288 +#, docstring +msgid "Get informations about a Minecraft Java server." +msgstr "Uzyskaj informacje o serwerze Minecraft Java." + +#: minecraft\minecraft.py:294 minecraft\minecraft.py:329 +msgid "No data found for this Minecraft server. Maybe it doesn't exist or its data are temporarily unavailable." +msgstr "Nie znaleziono danych dla tego serwera Minecraft. Być może nie istnieje lub jego dane są tymczasowo niedostępne." + +#: minecraft\minecraft.py:306 +#, docstring +msgid "Add a Minecraft Java server in Config to get automatically new status." +msgstr "Dodaj serwer Minecraft Java w Config, aby automatycznie uzyskać nowy status." + +#: minecraft\minecraft.py:317 +msgid "I don't have sufficient permissions in this channel to send messages with embeds." +msgstr "Nie mam wystarczających uprawnień na tym kanale, aby wysyłać wiadomości z osadzonymi elementami." + +#: minecraft\minecraft.py:323 +msgid "This server has already been added." +msgstr "Ten serwer został już dodany." + +#: minecraft\minecraft.py:337 +msgid "Server added to this channel." +msgstr "Serwer dodany do tego kanału." + +#: minecraft\minecraft.py:344 +#, docstring +msgid "Remove a Minecraft Java server in Config." +msgstr "Usunięcie serwera Minecraft Java w Config." + +#: minecraft\minecraft.py:349 +msgid "This server isn't in the Config." +msgstr "Ten serwer nie znajduje się w konfiguracji." + +#: minecraft\minecraft.py:354 +msgid "Server removed from this channel." +msgstr "Serwer usunięty z tego kanału." + +#: minecraft\minecraft.py:361 +#, docstring +msgid "Include players joining or leaving the server in notifications." +msgstr "Uwzględnianie graczy dołączających do serwera lub opuszczających go w powiadomieniach." + +#: minecraft\minecraft.py:368 +msgid "I will not check players for the notifications." +msgstr "Nie będę sprawdzał graczy pod kątem powiadomień." + +#: minecraft\minecraft.py:370 +msgid "I will check players for the notifications." +msgstr "Sprawdzę graczy pod kątem powiadomień." + +#: minecraft\minecraft.py:377 +#, docstring +msgid "Edit the last message sent for changes." +msgstr "Edycja ostatnio wysłanej wiadomości w celu wprowadzenia zmian." + +#: minecraft\minecraft.py:382 +msgid "I will not edit my last message for the notifications." +msgstr "Nie będę edytował ostatniej wiadomości dla powiadomień." + +#: minecraft\minecraft.py:384 +msgid "I will edit my last message for the notifications." +msgstr "Zedytuję moją ostatnią wiadomość dla powiadomień." + +#: minecraft\minecraft.py:389 +#, docstring +msgid "Force check Minecraft Java servers in Config." +msgstr "Wymuś sprawdzenie serwerów Minecraft Java w konfiguracji." + +#: minecraft\minecraft.py:391 +msgid "Servers checked." +msgstr "Serwery sprawdzone." + +#: minecraft\minecraft.py:397 +#, docstring +msgid "Get an embed for check loop status." +msgstr "Uzyskaj embed do sprawdzenia stanu pętli." + diff --git a/minecraft/locales/pt-BR.po b/minecraft/locales/pt-BR.po new file mode 100644 index 0000000..ee2e299 --- /dev/null +++ b/minecraft/locales/pt-BR.po @@ -0,0 +1,140 @@ +msgid "" +msgstr "" +"Project-Id-Version: aaa3a-cogs\n" +"POT-Creation-Date: 2024-07-20 22:15+0200\n" +"PO-Revision-Date: 2024-07-20 20:24\n" +"Last-Translator: \n" +"Language-Team: Portuguese, Brazilian\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: redgettext 3.4.2\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Crowdin-Project: aaa3a-cogs\n" +"X-Crowdin-Project-ID: 531090\n" +"X-Crowdin-Language: pt-BR\n" +"X-Crowdin-File: /[AAA3A-AAA3A.AAA3A-cogs] main/minecraft/locales/messages.pot\n" +"X-Crowdin-File-ID: 235\n" +"Language: pt_BR\n" + +#: minecraft\minecraft.py:48 +msgid "Unable to get data from Minecraft API: {e.message}." +msgstr "Não é possível obter dados da API do Minecraft: {e.message}." + +#: minecraft\minecraft.py:52 +msgid "{argument} not found on Mojang servers." +msgstr "{argument} não encontrado nos servidores da Mojang." + +#: minecraft\minecraft.py:60 +msgid "{argument} is found, but has incorrect UUID." +msgstr "{argument} é encontrado, mas tem um UUID incorrecto." + +#: minecraft\minecraft.py:66 +#, docstring +msgid "A cog to display informations about Minecraft Java users and servers, and notify for each change of a server!" +msgstr "Uma engrenagem para mostrar informações sobre os utilizadores e servidores do Minecraft Java, e notificar cada mudança de um servidor!" + +#: minecraft\minecraft.py:187 +msgid "Latency" +msgstr "Latência" + +#: minecraft\minecraft.py:189 +msgid "Players" +msgstr "Jogadores" + +#: minecraft\minecraft.py:207 +msgid "Version" +msgstr "Versão" + +#: minecraft\minecraft.py:247 +#, docstring +msgid "Get Minecraft Java player skin by name." +msgstr "Obter a skin do jogador Java do Minecraft por nome." + +#: minecraft\minecraft.py:270 +msgid "Unable to get data from Crafatar: {}" +msgstr "Não é possível obter dados do Crafatar: {}" + +#: minecraft\minecraft.py:282 +msgid "Provided by Crafatar." +msgstr "Fornecido por Crafatar." + +#: minecraft\minecraft.py:288 +#, docstring +msgid "Get informations about a Minecraft Java server." +msgstr "Obter informações sobre um servidor Java do Minecraft." + +#: minecraft\minecraft.py:294 minecraft\minecraft.py:329 +msgid "No data found for this Minecraft server. Maybe it doesn't exist or its data are temporarily unavailable." +msgstr "Não foram encontrados dados para este servidor do Minecraft. Talvez não exista ou os seus dados estejam temporariamente indisponíveis." + +#: minecraft\minecraft.py:306 +#, docstring +msgid "Add a Minecraft Java server in Config to get automatically new status." +msgstr "Adicione um servidor Java do Minecraft no Config para obter automaticamente um novo estado." + +#: minecraft\minecraft.py:317 +msgid "I don't have sufficient permissions in this channel to send messages with embeds." +msgstr "Não tenho permissões suficientes neste canal para enviar mensagens com incorporações." + +#: minecraft\minecraft.py:323 +msgid "This server has already been added." +msgstr "Este servidor já foi adicionado." + +#: minecraft\minecraft.py:337 +msgid "Server added to this channel." +msgstr "Servidor adicionado a este canal." + +#: minecraft\minecraft.py:344 +#, docstring +msgid "Remove a Minecraft Java server in Config." +msgstr "Remover um servidor Java do Minecraft no Config." + +#: minecraft\minecraft.py:349 +msgid "This server isn't in the Config." +msgstr "Este servidor não está na Configuração." + +#: minecraft\minecraft.py:354 +msgid "Server removed from this channel." +msgstr "Servidor removido deste canal." + +#: minecraft\minecraft.py:361 +#, docstring +msgid "Include players joining or leaving the server in notifications." +msgstr "Incluir nas notificações os jogadores que entram ou saem do servidor." + +#: minecraft\minecraft.py:368 +msgid "I will not check players for the notifications." +msgstr "Não vou verificar as notificações dos jogadores." + +#: minecraft\minecraft.py:370 +msgid "I will check players for the notifications." +msgstr "Vou verificar as notificações dos jogadores." + +#: minecraft\minecraft.py:377 +#, docstring +msgid "Edit the last message sent for changes." +msgstr "Editar a última mensagem enviada para efetuar alterações." + +#: minecraft\minecraft.py:382 +msgid "I will not edit my last message for the notifications." +msgstr "Não vou editar a minha última mensagem para as notificações." + +#: minecraft\minecraft.py:384 +msgid "I will edit my last message for the notifications." +msgstr "Vou editar a minha última mensagem para as notificações." + +#: minecraft\minecraft.py:389 +#, docstring +msgid "Force check Minecraft Java servers in Config." +msgstr "Forçar a verificação dos servidores Java do Minecraft no Config." + +#: minecraft\minecraft.py:391 +msgid "Servers checked." +msgstr "Servidores verificados." + +#: minecraft\minecraft.py:397 +#, docstring +msgid "Get an embed for check loop status." +msgstr "Obter uma incorporação para verificar o estado do laço." + diff --git a/minecraft/locales/pt-PT.po b/minecraft/locales/pt-PT.po new file mode 100644 index 0000000..2bc1fcc --- /dev/null +++ b/minecraft/locales/pt-PT.po @@ -0,0 +1,140 @@ +msgid "" +msgstr "" +"Project-Id-Version: aaa3a-cogs\n" +"POT-Creation-Date: 2024-07-20 22:15+0200\n" +"PO-Revision-Date: 2024-07-20 20:24\n" +"Last-Translator: \n" +"Language-Team: Portuguese\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: redgettext 3.4.2\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Crowdin-Project: aaa3a-cogs\n" +"X-Crowdin-Project-ID: 531090\n" +"X-Crowdin-Language: pt-PT\n" +"X-Crowdin-File: /[AAA3A-AAA3A.AAA3A-cogs] main/minecraft/locales/messages.pot\n" +"X-Crowdin-File-ID: 235\n" +"Language: pt_PT\n" + +#: minecraft\minecraft.py:48 +msgid "Unable to get data from Minecraft API: {e.message}." +msgstr "Não é possível obter dados da API do Minecraft: {e.message}." + +#: minecraft\minecraft.py:52 +msgid "{argument} not found on Mojang servers." +msgstr "{argument} não encontrado nos servidores da Mojang." + +#: minecraft\minecraft.py:60 +msgid "{argument} is found, but has incorrect UUID." +msgstr "{argument} é encontrado, mas tem um UUID incorrecto." + +#: minecraft\minecraft.py:66 +#, docstring +msgid "A cog to display informations about Minecraft Java users and servers, and notify for each change of a server!" +msgstr "Uma engrenagem para mostrar informações sobre os utilizadores e servidores do Minecraft Java, e notificar cada mudança de um servidor!" + +#: minecraft\minecraft.py:187 +msgid "Latency" +msgstr "Latência" + +#: minecraft\minecraft.py:189 +msgid "Players" +msgstr "Jogadores" + +#: minecraft\minecraft.py:207 +msgid "Version" +msgstr "Versão" + +#: minecraft\minecraft.py:247 +#, docstring +msgid "Get Minecraft Java player skin by name." +msgstr "Obter a skin do jogador Java do Minecraft por nome." + +#: minecraft\minecraft.py:270 +msgid "Unable to get data from Crafatar: {}" +msgstr "Não é possível obter dados do Crafatar: {}" + +#: minecraft\minecraft.py:282 +msgid "Provided by Crafatar." +msgstr "Fornecido por Crafatar." + +#: minecraft\minecraft.py:288 +#, docstring +msgid "Get informations about a Minecraft Java server." +msgstr "Obter informações sobre um servidor Java do Minecraft." + +#: minecraft\minecraft.py:294 minecraft\minecraft.py:329 +msgid "No data found for this Minecraft server. Maybe it doesn't exist or its data are temporarily unavailable." +msgstr "Não foram encontrados dados para este servidor do Minecraft. Talvez não exista ou os seus dados estejam temporariamente indisponíveis." + +#: minecraft\minecraft.py:306 +#, docstring +msgid "Add a Minecraft Java server in Config to get automatically new status." +msgstr "Adicione um servidor Java do Minecraft no Config para obter automaticamente um novo estado." + +#: minecraft\minecraft.py:317 +msgid "I don't have sufficient permissions in this channel to send messages with embeds." +msgstr "Não tenho permissões suficientes neste canal para enviar mensagens com incorporações." + +#: minecraft\minecraft.py:323 +msgid "This server has already been added." +msgstr "Este servidor já foi adicionado." + +#: minecraft\minecraft.py:337 +msgid "Server added to this channel." +msgstr "Servidor adicionado a este canal." + +#: minecraft\minecraft.py:344 +#, docstring +msgid "Remove a Minecraft Java server in Config." +msgstr "Remover um servidor Java do Minecraft no Config." + +#: minecraft\minecraft.py:349 +msgid "This server isn't in the Config." +msgstr "Este servidor não está na Configuração." + +#: minecraft\minecraft.py:354 +msgid "Server removed from this channel." +msgstr "Servidor removido deste canal." + +#: minecraft\minecraft.py:361 +#, docstring +msgid "Include players joining or leaving the server in notifications." +msgstr "Incluir nas notificações os jogadores que entram ou saem do servidor." + +#: minecraft\minecraft.py:368 +msgid "I will not check players for the notifications." +msgstr "Não vou verificar as notificações dos jogadores." + +#: minecraft\minecraft.py:370 +msgid "I will check players for the notifications." +msgstr "Vou verificar as notificações dos jogadores." + +#: minecraft\minecraft.py:377 +#, docstring +msgid "Edit the last message sent for changes." +msgstr "Editar a última mensagem enviada para efetuar alterações." + +#: minecraft\minecraft.py:382 +msgid "I will not edit my last message for the notifications." +msgstr "Não vou editar a minha última mensagem para as notificações." + +#: minecraft\minecraft.py:384 +msgid "I will edit my last message for the notifications." +msgstr "Vou editar a minha última mensagem para as notificações." + +#: minecraft\minecraft.py:389 +#, docstring +msgid "Force check Minecraft Java servers in Config." +msgstr "Forçar a verificação dos servidores Java do Minecraft no Config." + +#: minecraft\minecraft.py:391 +msgid "Servers checked." +msgstr "Servidores verificados." + +#: minecraft\minecraft.py:397 +#, docstring +msgid "Get an embed for check loop status." +msgstr "Obter uma incorporação para verificar o estado do laço." + diff --git a/minecraft/locales/ro-RO.po b/minecraft/locales/ro-RO.po new file mode 100644 index 0000000..0d1923c --- /dev/null +++ b/minecraft/locales/ro-RO.po @@ -0,0 +1,140 @@ +msgid "" +msgstr "" +"Project-Id-Version: aaa3a-cogs\n" +"POT-Creation-Date: 2024-07-20 22:15+0200\n" +"PO-Revision-Date: 2024-07-20 20:23\n" +"Last-Translator: \n" +"Language-Team: Romanian\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: redgettext 3.4.2\n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100>0 && n%100<20)) ? 1 : 2);\n" +"X-Crowdin-Project: aaa3a-cogs\n" +"X-Crowdin-Project-ID: 531090\n" +"X-Crowdin-Language: ro\n" +"X-Crowdin-File: /[AAA3A-AAA3A.AAA3A-cogs] main/minecraft/locales/messages.pot\n" +"X-Crowdin-File-ID: 235\n" +"Language: ro_RO\n" + +#: minecraft\minecraft.py:48 +msgid "Unable to get data from Minecraft API: {e.message}." +msgstr "Nu se poate obține date de la Minecraft API: {e.message}." + +#: minecraft\minecraft.py:52 +msgid "{argument} not found on Mojang servers." +msgstr "{argument} nu se găsește pe serverele Mojang." + +#: minecraft\minecraft.py:60 +msgid "{argument} is found, but has incorrect UUID." +msgstr "{argument} este găsit, dar are un UUID incorect." + +#: minecraft\minecraft.py:66 +#, docstring +msgid "A cog to display informations about Minecraft Java users and servers, and notify for each change of a server!" +msgstr "O rotiță pentru a afișa informații despre utilizatorii și serverele Minecraft Java și pentru a notifica fiecare schimbare a unui server!" + +#: minecraft\minecraft.py:187 +msgid "Latency" +msgstr "Latență" + +#: minecraft\minecraft.py:189 +msgid "Players" +msgstr "Jucători" + +#: minecraft\minecraft.py:207 +msgid "Version" +msgstr "Versiunea" + +#: minecraft\minecraft.py:247 +#, docstring +msgid "Get Minecraft Java player skin by name." +msgstr "Obțineți skin-ul jucătorului Java Minecraft după nume." + +#: minecraft\minecraft.py:270 +msgid "Unable to get data from Crafatar: {}" +msgstr "Imposibil de a obține date de la Crafatar: {}" + +#: minecraft\minecraft.py:282 +msgid "Provided by Crafatar." +msgstr "Furnizat de Crafatar." + +#: minecraft\minecraft.py:288 +#, docstring +msgid "Get informations about a Minecraft Java server." +msgstr "Obțineți informații despre un server Java Minecraft." + +#: minecraft\minecraft.py:294 minecraft\minecraft.py:329 +msgid "No data found for this Minecraft server. Maybe it doesn't exist or its data are temporarily unavailable." +msgstr "Nu s-au găsit date pentru acest server Minecraft. Poate că nu există sau datele sale sunt temporar indisponibile." + +#: minecraft\minecraft.py:306 +#, docstring +msgid "Add a Minecraft Java server in Config to get automatically new status." +msgstr "Adăugați un server Java Minecraft în Config pentru a obține automat un nou statut." + +#: minecraft\minecraft.py:317 +msgid "I don't have sufficient permissions in this channel to send messages with embeds." +msgstr "Nu am suficiente permisiuni în acest canal pentru a trimite mesaje cu inserții." + +#: minecraft\minecraft.py:323 +msgid "This server has already been added." +msgstr "Acest server a fost deja adăugat." + +#: minecraft\minecraft.py:337 +msgid "Server added to this channel." +msgstr "Server adăugat la acest canal." + +#: minecraft\minecraft.py:344 +#, docstring +msgid "Remove a Minecraft Java server in Config." +msgstr "Îndepărtați un server Java Minecraft în Config." + +#: minecraft\minecraft.py:349 +msgid "This server isn't in the Config." +msgstr "Acest server nu se află în configurare." + +#: minecraft\minecraft.py:354 +msgid "Server removed from this channel." +msgstr "Server eliminat de pe acest canal." + +#: minecraft\minecraft.py:361 +#, docstring +msgid "Include players joining or leaving the server in notifications." +msgstr "Includeți jucătorii care se alătură sau părăsesc serverul în notificări." + +#: minecraft\minecraft.py:368 +msgid "I will not check players for the notifications." +msgstr "Nu voi verifica jucătorii pentru notificări." + +#: minecraft\minecraft.py:370 +msgid "I will check players for the notifications." +msgstr "Voi verifica jucătorii pentru notificări." + +#: minecraft\minecraft.py:377 +#, docstring +msgid "Edit the last message sent for changes." +msgstr "Editați ultimul mesaj trimis pentru modificări." + +#: minecraft\minecraft.py:382 +msgid "I will not edit my last message for the notifications." +msgstr "Nu voi modifica ultimul meu mesaj pentru notificări." + +#: minecraft\minecraft.py:384 +msgid "I will edit my last message for the notifications." +msgstr "Voi edita ultimul meu mesaj pentru notificări." + +#: minecraft\minecraft.py:389 +#, docstring +msgid "Force check Minecraft Java servers in Config." +msgstr "Forțați verificarea serverelor Minecraft Java în Config." + +#: minecraft\minecraft.py:391 +msgid "Servers checked." +msgstr "Serverele au fost verificate." + +#: minecraft\minecraft.py:397 +#, docstring +msgid "Get an embed for check loop status." +msgstr "Obține o inserție pentru verificarea stării buclei." + diff --git a/minecraft/locales/ru-RU.po b/minecraft/locales/ru-RU.po new file mode 100644 index 0000000..98b9674 --- /dev/null +++ b/minecraft/locales/ru-RU.po @@ -0,0 +1,140 @@ +msgid "" +msgstr "" +"Project-Id-Version: aaa3a-cogs\n" +"POT-Creation-Date: 2024-07-20 22:15+0200\n" +"PO-Revision-Date: 2024-07-20 20:24\n" +"Last-Translator: \n" +"Language-Team: Russian\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: redgettext 3.4.2\n" +"Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n" +"X-Crowdin-Project: aaa3a-cogs\n" +"X-Crowdin-Project-ID: 531090\n" +"X-Crowdin-Language: ru\n" +"X-Crowdin-File: /[AAA3A-AAA3A.AAA3A-cogs] main/minecraft/locales/messages.pot\n" +"X-Crowdin-File-ID: 235\n" +"Language: ru_RU\n" + +#: minecraft\minecraft.py:48 +msgid "Unable to get data from Minecraft API: {e.message}." +msgstr "Невозможно получить данные из API Minecraft: {e.message}." + +#: minecraft\minecraft.py:52 +msgid "{argument} not found on Mojang servers." +msgstr "{argument} не найдена на серверах Mojang." + +#: minecraft\minecraft.py:60 +msgid "{argument} is found, but has incorrect UUID." +msgstr "{argument} найден, но имеет неправильный UUID." + +#: minecraft\minecraft.py:66 +#, docstring +msgid "A cog to display informations about Minecraft Java users and servers, and notify for each change of a server!" +msgstr "Коготь для отображения информации о пользователях и серверах Minecraft Java, а также уведомление о каждом изменении сервера!" + +#: minecraft\minecraft.py:187 +msgid "Latency" +msgstr "Латентность" + +#: minecraft\minecraft.py:189 +msgid "Players" +msgstr "Игроки" + +#: minecraft\minecraft.py:207 +msgid "Version" +msgstr "Версия" + +#: minecraft\minecraft.py:247 +#, docstring +msgid "Get Minecraft Java player skin by name." +msgstr "Получить скин игрока Minecraft Java по имени." + +#: minecraft\minecraft.py:270 +msgid "Unable to get data from Crafatar: {}" +msgstr "Невозможно получить данные из Crafatar: {}" + +#: minecraft\minecraft.py:282 +msgid "Provided by Crafatar." +msgstr "Предоставлено компанией Crafatar." + +#: minecraft\minecraft.py:288 +#, docstring +msgid "Get informations about a Minecraft Java server." +msgstr "Получите информацию о Java-сервере Minecraft." + +#: minecraft\minecraft.py:294 minecraft\minecraft.py:329 +msgid "No data found for this Minecraft server. Maybe it doesn't exist or its data are temporarily unavailable." +msgstr "Для этого сервера Minecraft не найдено никаких данных. Возможно, он не существует или его данные временно недоступны." + +#: minecraft\minecraft.py:306 +#, docstring +msgid "Add a Minecraft Java server in Config to get automatically new status." +msgstr "Добавьте Java-сервер Minecraft в Config, чтобы автоматически получить новый статус." + +#: minecraft\minecraft.py:317 +msgid "I don't have sufficient permissions in this channel to send messages with embeds." +msgstr "У меня нет достаточных прав в этом канале для отправки сообщений с вставками." + +#: minecraft\minecraft.py:323 +msgid "This server has already been added." +msgstr "Этот сервер уже добавлен." + +#: minecraft\minecraft.py:337 +msgid "Server added to this channel." +msgstr "Сервер добавлен в этот канал." + +#: minecraft\minecraft.py:344 +#, docstring +msgid "Remove a Minecraft Java server in Config." +msgstr "Удалите Java-сервер Minecraft в Config." + +#: minecraft\minecraft.py:349 +msgid "This server isn't in the Config." +msgstr "Этого сервера нет в конфиге." + +#: minecraft\minecraft.py:354 +msgid "Server removed from this channel." +msgstr "Сервер удален из этого канала." + +#: minecraft\minecraft.py:361 +#, docstring +msgid "Include players joining or leaving the server in notifications." +msgstr "Включите в уведомления игроков, присоединяющихся к серверу или покидающих его." + +#: minecraft\minecraft.py:368 +msgid "I will not check players for the notifications." +msgstr "Я не буду проверять игроков на наличие уведомлений." + +#: minecraft\minecraft.py:370 +msgid "I will check players for the notifications." +msgstr "Я проверю игроков на наличие уведомлений." + +#: minecraft\minecraft.py:377 +#, docstring +msgid "Edit the last message sent for changes." +msgstr "Редактирование последнего отправленного сообщения для внесения изменений." + +#: minecraft\minecraft.py:382 +msgid "I will not edit my last message for the notifications." +msgstr "Я не буду редактировать свое последнее сообщение из-за уведомлений." + +#: minecraft\minecraft.py:384 +msgid "I will edit my last message for the notifications." +msgstr "Я отредактирую свое последнее сообщение для уведомлений." + +#: minecraft\minecraft.py:389 +#, docstring +msgid "Force check Minecraft Java servers in Config." +msgstr "Принудительная проверка Java-серверов Minecraft в Config." + +#: minecraft\minecraft.py:391 +msgid "Servers checked." +msgstr "Серверы проверены." + +#: minecraft\minecraft.py:397 +#, docstring +msgid "Get an embed for check loop status." +msgstr "Получить эмбед для проверки состояния цикла." + diff --git a/minecraft/locales/tr-TR.po b/minecraft/locales/tr-TR.po new file mode 100644 index 0000000..1022420 --- /dev/null +++ b/minecraft/locales/tr-TR.po @@ -0,0 +1,140 @@ +msgid "" +msgstr "" +"Project-Id-Version: aaa3a-cogs\n" +"POT-Creation-Date: 2024-07-20 22:15+0200\n" +"PO-Revision-Date: 2024-07-21 13:27\n" +"Last-Translator: \n" +"Language-Team: Turkish\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: redgettext 3.4.2\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Crowdin-Project: aaa3a-cogs\n" +"X-Crowdin-Project-ID: 531090\n" +"X-Crowdin-Language: tr\n" +"X-Crowdin-File: /[AAA3A-AAA3A.AAA3A-cogs] main/minecraft/locales/messages.pot\n" +"X-Crowdin-File-ID: 235\n" +"Language: tr_TR\n" + +#: minecraft\minecraft.py:48 +msgid "Unable to get data from Minecraft API: {e.message}." +msgstr "Minecraft API'sinden veri alınamadı: {e.message}." + +#: minecraft\minecraft.py:52 +msgid "{argument} not found on Mojang servers." +msgstr "{argument} Mojang sunucularında bulunamadı." + +#: minecraft\minecraft.py:60 +msgid "{argument} is found, but has incorrect UUID." +msgstr "{argument} bulundu, ancak hatalı bir UUID'ye sahip." + +#: minecraft\minecraft.py:66 +#, docstring +msgid "A cog to display informations about Minecraft Java users and servers, and notify for each change of a server!" +msgstr "Minecraft Java kullanıcıları ve sunucuları hakkında bilgi görüntülemek ve her sunucu değişikliğinde bildirim yapmak için bir cog!" + +#: minecraft\minecraft.py:187 +msgid "Latency" +msgstr "Gecikme" + +#: minecraft\minecraft.py:189 +msgid "Players" +msgstr "Oyuncular" + +#: minecraft\minecraft.py:207 +msgid "Version" +msgstr "Versiyon" + +#: minecraft\minecraft.py:247 +#, docstring +msgid "Get Minecraft Java player skin by name." +msgstr "Minecraft Java oyuncu görünümünü isme göre alın." + +#: minecraft\minecraft.py:270 +msgid "Unable to get data from Crafatar: {}" +msgstr "Crafatar'dan veri alınamadı: {}" + +#: minecraft\minecraft.py:282 +msgid "Provided by Crafatar." +msgstr "Crafatar tarafından sağlanmıştır." + +#: minecraft\minecraft.py:288 +#, docstring +msgid "Get informations about a Minecraft Java server." +msgstr "Bir Minecraft Java sunucusu hakkında bilgi alın." + +#: minecraft\minecraft.py:294 minecraft\minecraft.py:329 +msgid "No data found for this Minecraft server. Maybe it doesn't exist or its data are temporarily unavailable." +msgstr "Bu Minecraft sunucusu için veri bulunamadı. Belki de mevcut değil veya verileri geçici olarak kullanılamıyor." + +#: minecraft\minecraft.py:306 +#, docstring +msgid "Add a Minecraft Java server in Config to get automatically new status." +msgstr "Yeni durumu otomatik olarak almak için Config'e bir Minecraft Java sunucusu ekleyin." + +#: minecraft\minecraft.py:317 +msgid "I don't have sufficient permissions in this channel to send messages with embeds." +msgstr "Bu kanalda gömülü mesajlar göndermek için yeterli iznim yok." + +#: minecraft\minecraft.py:323 +msgid "This server has already been added." +msgstr "Bu sunucu zaten eklenmiş." + +#: minecraft\minecraft.py:337 +msgid "Server added to this channel." +msgstr "Sunucu bu kanala eklendi." + +#: minecraft\minecraft.py:344 +#, docstring +msgid "Remove a Minecraft Java server in Config." +msgstr "Config'deki bir Minecraft Java sunucusunu kaldırın." + +#: minecraft\minecraft.py:349 +msgid "This server isn't in the Config." +msgstr "Bu sunucu Config'de değil." + +#: minecraft\minecraft.py:354 +msgid "Server removed from this channel." +msgstr "Sunucu bu kanaldan kaldırıldı." + +#: minecraft\minecraft.py:361 +#, docstring +msgid "Include players joining or leaving the server in notifications." +msgstr "Bildirimlere sunucuya katılan veya sunucudan ayrılan oyuncuları dahil edin." + +#: minecraft\minecraft.py:368 +msgid "I will not check players for the notifications." +msgstr "Bildirimler için oyuncuları kontrol etmeyeceğim." + +#: minecraft\minecraft.py:370 +msgid "I will check players for the notifications." +msgstr "Bildirimler için oyuncuları kontrol edeceğim." + +#: minecraft\minecraft.py:377 +#, docstring +msgid "Edit the last message sent for changes." +msgstr "Değişiklikler için gönderilen son mesajı düzenleyin." + +#: minecraft\minecraft.py:382 +msgid "I will not edit my last message for the notifications." +msgstr "Bildirimler için son mesajımı düzenlemeyeceğim." + +#: minecraft\minecraft.py:384 +msgid "I will edit my last message for the notifications." +msgstr "Bildirimler için son mesajımı düzenleyeceğim." + +#: minecraft\minecraft.py:389 +#, docstring +msgid "Force check Minecraft Java servers in Config." +msgstr "Config'deki Minecraft Java sunucularını zorla kontrol edin." + +#: minecraft\minecraft.py:391 +msgid "Servers checked." +msgstr "Sunucular kontrol edildi." + +#: minecraft\minecraft.py:397 +#, docstring +msgid "Get an embed for check loop status." +msgstr "Döngü durumunu kontrol etmek için bir gömme alın." + diff --git a/minecraft/locales/uk-UA.po b/minecraft/locales/uk-UA.po new file mode 100644 index 0000000..1905d10 --- /dev/null +++ b/minecraft/locales/uk-UA.po @@ -0,0 +1,140 @@ +msgid "" +msgstr "" +"Project-Id-Version: aaa3a-cogs\n" +"POT-Creation-Date: 2024-07-20 22:15+0200\n" +"PO-Revision-Date: 2024-07-20 20:24\n" +"Last-Translator: \n" +"Language-Team: Ukrainian\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: redgettext 3.4.2\n" +"Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n" +"X-Crowdin-Project: aaa3a-cogs\n" +"X-Crowdin-Project-ID: 531090\n" +"X-Crowdin-Language: uk\n" +"X-Crowdin-File: /[AAA3A-AAA3A.AAA3A-cogs] main/minecraft/locales/messages.pot\n" +"X-Crowdin-File-ID: 235\n" +"Language: uk_UA\n" + +#: minecraft\minecraft.py:48 +msgid "Unable to get data from Minecraft API: {e.message}." +msgstr "Не вдається отримати дані з API Minecraft: {e.message}." + +#: minecraft\minecraft.py:52 +msgid "{argument} not found on Mojang servers." +msgstr "{argument} не знайдено на серверах Mojang." + +#: minecraft\minecraft.py:60 +msgid "{argument} is found, but has incorrect UUID." +msgstr "{argument} знайдено, але він має неправильний UUID." + +#: minecraft\minecraft.py:66 +#, docstring +msgid "A cog to display informations about Minecraft Java users and servers, and notify for each change of a server!" +msgstr "Гвинтик для відображення інформації про користувачів та сервери Minecraft Java, а також сповіщення про кожну зміну сервера!" + +#: minecraft\minecraft.py:187 +msgid "Latency" +msgstr "Затримка" + +#: minecraft\minecraft.py:189 +msgid "Players" +msgstr "Гравці" + +#: minecraft\minecraft.py:207 +msgid "Version" +msgstr "Версія" + +#: minecraft\minecraft.py:247 +#, docstring +msgid "Get Minecraft Java player skin by name." +msgstr "Отримати скін Minecraft Java-програвача за назвою." + +#: minecraft\minecraft.py:270 +msgid "Unable to get data from Crafatar: {}" +msgstr "Не вдалося отримати дані від Crafatar: {}" + +#: minecraft\minecraft.py:282 +msgid "Provided by Crafatar." +msgstr "Надано Crafatar." + +#: minecraft\minecraft.py:288 +#, docstring +msgid "Get informations about a Minecraft Java server." +msgstr "Отримайте інформацію про Java-сервер Minecraft." + +#: minecraft\minecraft.py:294 minecraft\minecraft.py:329 +msgid "No data found for this Minecraft server. Maybe it doesn't exist or its data are temporarily unavailable." +msgstr "Для цього сервера Minecraft даних не знайдено. Можливо, він не існує або його дані тимчасово недоступні." + +#: minecraft\minecraft.py:306 +#, docstring +msgid "Add a Minecraft Java server in Config to get automatically new status." +msgstr "Додайте Java-сервер Minecraft у конфігурацію, щоб автоматично отримати новий статус." + +#: minecraft\minecraft.py:317 +msgid "I don't have sufficient permissions in this channel to send messages with embeds." +msgstr "Я не маю достатніх прав у цьому каналі, щоб надсилати повідомлення з вбудовуваннями." + +#: minecraft\minecraft.py:323 +msgid "This server has already been added." +msgstr "Цей сервер вже додано." + +#: minecraft\minecraft.py:337 +msgid "Server added to this channel." +msgstr "Сервер додано до цього каналу." + +#: minecraft\minecraft.py:344 +#, docstring +msgid "Remove a Minecraft Java server in Config." +msgstr "Видаліть Java-сервер Minecraft у налаштуваннях." + +#: minecraft\minecraft.py:349 +msgid "This server isn't in the Config." +msgstr "Цього сервера немає в конфігурації." + +#: minecraft\minecraft.py:354 +msgid "Server removed from this channel." +msgstr "Сервер видалено з цього каналу." + +#: minecraft\minecraft.py:361 +#, docstring +msgid "Include players joining or leaving the server in notifications." +msgstr "Включати гравців, які приєднуються до сервера або залишають його, у сповіщення." + +#: minecraft\minecraft.py:368 +msgid "I will not check players for the notifications." +msgstr "Я не буду перевіряти гравців на наявність сповіщень." + +#: minecraft\minecraft.py:370 +msgid "I will check players for the notifications." +msgstr "Я перевірю гравців на наявність сповіщень." + +#: minecraft\minecraft.py:377 +#, docstring +msgid "Edit the last message sent for changes." +msgstr "Відредагуйте останнє надіслане повідомлення для внесення змін." + +#: minecraft\minecraft.py:382 +msgid "I will not edit my last message for the notifications." +msgstr "Я не буду редагувати своє останнє повідомлення для сповіщень." + +#: minecraft\minecraft.py:384 +msgid "I will edit my last message for the notifications." +msgstr "Я відредагую своє останнє повідомлення для сповіщень." + +#: minecraft\minecraft.py:389 +#, docstring +msgid "Force check Minecraft Java servers in Config." +msgstr "Примусова перевірка Java-серверів Minecraft у налаштуваннях." + +#: minecraft\minecraft.py:391 +msgid "Servers checked." +msgstr "Сервери перевірено." + +#: minecraft\minecraft.py:397 +#, docstring +msgid "Get an embed for check loop status." +msgstr "Отримайте вбудовування для перевірки стану циклу." + diff --git a/minecraft/minecraft.py b/minecraft/minecraft.py new file mode 100644 index 0000000..042b4d7 --- /dev/null +++ b/minecraft/minecraft.py @@ -0,0 +1,451 @@ +from AAA3A_utils import Cog, Loop, Menu # isort:skip +from redbot.core import commands, Config # isort:skip +from redbot.core.bot import Red # isort:skip +from redbot.core.i18n import Translator, cog_i18n # isort:skip +import discord # isort:skip +import typing # isort:skip +import typing_extensions # isort:skip + +import asyncio +import base64 +import re +from io import BytesIO +from uuid import UUID + +import aiohttp +from mcstatus import JavaServer +from redbot.core.utils.chat_formatting import box, pagify + +# Credits: +# General repo credits. +# Thanks to Fixator for the code to get informations about Minecraft servers (https://github.com/fixator10/Fixator10-Cogs/blob/V3/minecraftdata/minecraftdata.py)! + +_: Translator = Translator("Minecraft", __file__) + + +class MCPlayer: + def __init__(self, name: str, uuid: str) -> None: + self.name: str = name + self.uuid: str = uuid + self.dashed_uuid: str = str(UUID(self.uuid)) + + def __str__(self) -> str: + return self.name + + @classmethod + async def convert(cls, ctx: commands.Context, argument: str) -> typing_extensions.Self: + cog = ctx.bot.get_cog("Minecraft") + try: + async with cog._session.get( + f"https://api.mojang.com/users/profiles/minecraft/{argument}", + raise_for_status=True, + ) as r: + response_data = await r.json() + except aiohttp.ContentTypeError: + response_data = None + except aiohttp.ClientResponseError as e: + raise commands.BadArgument( + _("Unable to get data from Minecraft API: {e.message}.").format(e=e) + ) + if response_data is None or "id" not in response_data: + raise commands.BadArgument( + _("{argument} not found on Mojang servers.").format(argument=argument) + ) + uuid = str(response_data["id"]) + name = str(response_data["name"]) + try: + return cls(name=name, uuid=uuid) + except ValueError: + raise commands.BadArgument( + _("{argument} is found, but has incorrect UUID.").format(argument=argument) + ) + + +@cog_i18n(_) +class Minecraft(Cog): + """A cog to display informations about Minecraft Java users and servers, and notify for each change of a server!""" + + def __init__(self, bot: Red) -> None: + super().__init__(bot=bot) + + self._session: aiohttp.ClientSession = None + self.cache: typing.Dict[int, typing.Dict[str, dict]] = {} + + self.config: Config = Config.get_conf( + self, + identifier=205192943327321000143939875896557571750, + force_registration=True, + ) + self.config.register_channel( + servers={}, + check_players=False, + edit_last_message=False, + ) + + async def cog_load(self) -> None: + await super().cog_load() + self._session: aiohttp.ClientSession = aiohttp.ClientSession() + self.loops.append( + Loop( + cog=self, + name="Check Minecraft Servers", + function=self.check_servers, + minutes=1, + ) + ) + + async def cog_unload(self) -> None: + await self._session.close() + await super().cog_unload() + + async def check_servers(self) -> None: + all_channels = await self.config.all_channels() + for channel_id in all_channels: + channel = self.bot.get_channel(channel_id) + if channel is None: + continue + if channel.id not in self.cache: + self.cache[channel.id] = {} + servers = all_channels[channel_id]["servers"] + check_players = all_channels[channel_id]["check_players"] + for server_url in servers: + try: + server: JavaServer = await JavaServer.async_lookup(address=server_url.lower()) + status = await server.async_status() + except (asyncio.CancelledError, TimeoutError): + continue + except Exception as e: + self.logger.error( + f"No data found for {server_url} server in {channel.id} channel in {channel.guild.id} guild.", + exc_info=e, + ) + continue + if check_players and "sample" in status.raw["players"]: + players = {player["id"]: player for player in status.raw["players"]["sample"]} + players = [players[_id] for _id in set(list(players.keys()))] + else: + players = {} + status.raw["players"]["sample"] = players + if server_url not in self.cache[channel.id]: + self.cache[channel.id][server_url] = {"server": server, "status": status} + continue + if status.raw != self.cache[channel.id][server_url]["status"].raw: + if "This server is offline." in ( + await self.clear_mcformatting(status.description) + ) and "This server is offline." in ( + await self.clear_mcformatting( + self.cache[channel.id][server_url]["status"].description + ) + ): # Minecraft ADS + continue + embed, icon = await self.get_embed(server, status) + servers = await self.config.channel(channel).servers() + if isinstance(servers, typing.List): + servers = {server: None for server in servers} + if ( + await self.config.channel(channel).edit_last_message() + and servers[server_url] is not None + ): + try: + message = await channel.get_partial_message(servers[server_url]).edit( + embed=embed, attachments=[icon] + ) + except discord.HTTPException: + message = await channel.send(embed=embed, file=icon) + else: + message = await channel.send(embed=embed, file=icon) + servers[server_url] = message.id + await self.config.channel(channel).servers.set(servers) + self.cache[channel.id][server_url] = {"server": server, "status": status} + + async def get_embed(self, server: JavaServer, status) -> discord.Embed: + server_description = await self.clear_mcformatting(status.description) + embed: discord.Embed = discord.Embed( + title=f"{server.address.host}:{server.address.port}", + description=box(server_description), + ) + embed.color = ( + discord.Color.red() + if "This server is offline." in server_description + else ( + discord.Color.orange() + if "This server is currently stopping." in server_description + else discord.Color.green() + ) + ) + icon_file = None + icon = ( + discord.File( + icon_file := BytesIO( + base64.b64decode(status.icon.removeprefix("data:image/png;base64,")) + ), + filename="icon.png", + ) + if status.icon + else None + ) + if icon: + embed.set_thumbnail(url="attachment://icon.png") + embed.add_field(name=_("Latency"), value=f"{status.latency:.2f} ms") + embed.add_field( + name=_("Players"), + value="{status.players.online}/{status.players.max}\n{players_list}".format( + status=status, + players_list=( + box( + list( + pagify( + await self.clear_mcformatting( + "\n".join([p.name for p in status.players.sample]) + ), + page_length=992, + ) + )[0] + ) + if status.players.sample + else "" + ), + ), + ) + embed.add_field( + name=_("Version"), + value=f"{status.version.name}\nProtocol: {status.version.protocol}", + ) + if icon_file is not None: + icon_file.close() + return embed, icon + + async def clear_mcformatting(self, formatted_str) -> str: + """Remove Minecraft-formatting""" + if not isinstance(formatted_str, dict): + return re.sub(r"\xA7[0-9A-FK-OR]", "", formatted_str, flags=re.IGNORECASE) + clean = "" + async for text in self.gen_dict_extract("text", formatted_str): + clean += text + return re.sub(r"\xA7[0-9A-FK-OR]", "", clean, flags=re.IGNORECASE) + + async def gen_dict_extract(self, key: str, var: dict) -> str: + if not hasattr(var, "items"): + return + for k, v in var.items(): + if k == key: + yield v + if isinstance(v, typing.Dict): + async for result in self.gen_dict_extract(key, v): + yield result + elif isinstance(v, typing.List): + for d in v: + async for result in self.gen_dict_extract(key, d): + yield result + + @commands.hybrid_group() + async def minecraft(self, ctx: commands.Context): + """Get informations about Minecraft Java.""" + pass + + @commands.bot_has_permissions(attach_files=True, embed_links=True) + @minecraft.command() + async def getplayerskin( + self, ctx: commands.Context, player: MCPlayer, overlay: bool = False + ) -> None: + """Get Minecraft Java player skin by name.""" + uuid = player.uuid + stripname = player.name.strip("_") + files = [] + try: + async with self._session.get( + f"https://crafatar.com/renders/head/{uuid}", + params="overlay" if overlay else None, + ) as s: + files.append( + discord.File(BytesIO(await s.read()), filename=f"{stripname}_head.png") + ) + async with self._session.get(f"https://crafatar.com/skins/{uuid}") as s: + files.append(discord.File(BytesIO(await s.read()), filename=f"{stripname}.png")) + async with self._session.get( + f"https://crafatar.com/renders/body/{uuid}.png", + params="overlay" if overlay else None, + ) as s: + files.append( + discord.File(BytesIO(await s.read()), filename=f"{stripname}_body.png") + ) + except aiohttp.ClientResponseError as e: + raise commands.UserFeedbackCheckFailure( + _("Unable to get data from Crafatar: {}").format(e.message) + ) + embed: discord.Embed = discord.Embed( + timestamp=ctx.message.created_at, color=await ctx.embed_color() + ) + embed.set_author( + name=player.name, + icon_url=f"attachment://{stripname}_head.png", + url=f"https://crafatar.com/skins/{uuid}", + ) + embed.set_thumbnail(url=f"attachment://{stripname}.png") + embed.set_image(url=f"attachment://{stripname}_body.png") + embed.set_footer(text=_("Provided by Crafatar."), icon_url="https://crafatar.com/logo.png") + await ctx.send(embed=embed, files=files) + + @commands.bot_has_permissions(attach_files=True, embed_links=True) + @minecraft.command() + async def getserver(self, ctx: commands.Context, server_url: str) -> None: + """Get informations about a Minecraft Java server.""" + try: + server: JavaServer = await JavaServer.async_lookup(address=server_url.lower()) + status = await server.async_status() + except Exception: + raise commands.UserFeedbackCheckFailure( + _( + "No data found for this Minecraft server. Maybe it doesn't exist or its data are temporarily unavailable." + ) + ) + embed, icon = await self.get_embed(server, status) + await ctx.send(embed=embed, file=icon) + + @commands.admin_or_permissions(manage_guild=True) + @minecraft.command(aliases=["add", "+"]) + async def addserver( + self, ctx: commands.Context, channel: typing.Optional[discord.TextChannel], server_url: str + ) -> None: + """Add a Minecraft Java server in Config to get automatically new status.""" + if channel is None: + channel = ctx.channel + channel_permissions = channel.permissions_for(ctx.me) + if ( + not channel_permissions.view_channel + or not channel_permissions.read_messages + or not channel_permissions.read_message_history + or not channel_permissions.embed_links + ): + raise commands.UserFeedbackCheckFailure( + _( + "I don't have sufficient permissions in this channel to send messages with embeds." + ) + ) + servers = await self.config.channel(channel).servers() + if server_url.lower() in servers: + raise commands.UserFeedbackCheckFailure(_("This server has already been added.")) + try: + server: JavaServer = await JavaServer.async_lookup(address=server_url.lower()) + await server.async_status() + except Exception: + raise commands.UserFeedbackCheckFailure( + _( + "No data found for this Minecraft server. Maybe it doesn't exist or its data are temporarily unavailable." + ) + ) + if isinstance(servers, typing.List): + servers = {server: None for server in servers} + servers[server_url.lower()] = None # last message + await self.config.channel(channel).servers.set(servers) + await ctx.send(_("Server added to this channel.")) + + @commands.admin_or_permissions(manage_guild=True) + @minecraft.command(aliases=["remove", "-"]) + async def removeserver( + self, ctx: commands.Context, channel: typing.Optional[discord.TextChannel], server_url: str + ) -> None: + """Remove a Minecraft Java server in Config.""" + if channel is None: + channel = ctx.channel + servers = await self.config.channel(channel).servers() + if server_url.lower() not in servers: + raise commands.UserFeedbackCheckFailure(_("This server isn't in the Config.")) + if isinstance(servers, typing.List): + servers = {server: None for server in servers} + del servers[server_url.lower()] + await self.config.channel(channel).servers.set(servers) + await ctx.send(_("Server removed from this channel.")) + + @commands.admin_or_permissions(manage_guild=True) + @minecraft.command() + async def checkplayers( + self, ctx: commands.Context, channel: typing.Optional[discord.TextChannel], state: bool + ) -> None: + """Include players joining or leaving the server in notifications.""" + if channel is None: + channel = ctx.channel + await self.config.channel(channel).check_players.set(state) + if not state: + for server_url in self.cache[channel.id]: + self.cache[channel.id][server_url]["status"].raw["players"]["sample"] = {} + await ctx.send(_("I will not check players for the notifications.")) + else: + await ctx.send(_("I will check players for the notifications.")) + + @commands.admin_or_permissions(manage_guild=True) + @minecraft.command() + async def editlastmessage( + self, ctx: commands.Context, channel: typing.Optional[discord.TextChannel], state: bool + ) -> None: + """Edit the last message sent for changes.""" + if channel is None: + channel = ctx.channel + await self.config.channel(channel).edit_last_message.set(state) + if not state: + await ctx.send(_("I will not edit my last message for the notifications.")) + else: + await ctx.send(_("I will edit my last message for the notifications.")) + + @commands.is_owner() + @minecraft.command(hidden=True) + async def forcecheck(self, ctx: commands.Context) -> None: + """Force check Minecraft Java servers in Config.""" + await self.check_servers() + await ctx.send(_("Servers checked.")) + + @commands.is_owner() + @commands.bot_has_permissions(embed_links=True) + @minecraft.command(hidden=True) + async def getdebugloopsstatus(self, ctx: commands.Context): + """Get an embed for check loop status.""" + embeds = [loop.get_debug_embed() for loop in self.loops] + await Menu(pages=embeds).start(ctx) + + @commands.Cog.listener() + async def on_assistant_cog_add( + self, assistant_cog: typing.Optional[commands.Cog] = None + ) -> None: # Vert's Assistant integration/third party. + if assistant_cog is None: + return self.get_minecraft_java_server_for_assistant + schema = { + "name": "get_minecraft_java_server_for_assistant", + "description": "Get informations about a Minecraft Java server.", + "parameters": { + "type": "object", + "properties": { + "server_url": { + "type": "string", + "description": "The URL of the Minecraft Java server.", + }, + }, + "required": ["server_url"], + }, + } + await assistant_cog.register_function(cog_name=self.qualified_name, schema=schema) + + async def get_minecraft_java_server_for_assistant(self, server_url: str, *args, **kwargs): + try: + server: JavaServer = await JavaServer.async_lookup(address=server_url.lower()) + status = await server.async_status() + except Exception: + return "No data found for this Minecraft Java server." + server_description = await self.clear_mcformatting(status.description) + data = { + "Host & Port": f"{server.address.host}:{server.address.port}", + "Description": box(server_description), + "Status": ( + "Offline." + if "This server is offline." in server_description + else ( + "Currently stopping." + if "This server is currently stopping." in server_description + else "Online." + ) + ), + "Latency": f"{status.latency:.2f} ms", + "Players": f"{status.players.online}/{status.players.max}", + "Version": status.version.name, + "Protocol": status.version.protocol, + } + return [f"{key}: {value}\n" for key, value in data.items() if value is not None] diff --git a/minecraft/utils_version.json b/minecraft/utils_version.json new file mode 100644 index 0000000..bfab002 --- /dev/null +++ b/minecraft/utils_version.json @@ -0,0 +1 @@ +{"needed_utils_version": 7.0} \ No newline at end of file diff --git a/mod/__init__.py b/mod/__init__.py new file mode 100644 index 0000000..fb6867f --- /dev/null +++ b/mod/__init__.py @@ -0,0 +1,13 @@ +from .mod import Mod + +__red_end_user_data_statement__ = ( + "This cog stores user data to actively maintain server moderation.\n" + "It will not respect data deletion by end users as the data kept is the minimum " + "needed for operation of an anti-abuse measure, nor can end users request " + "their data from this cog since it only stores a discord ID.\n" +) + + +async def setup(bot): + cog = Mod(bot) + await bot.add_cog(cog) diff --git a/mod/_tagscript.py b/mod/_tagscript.py new file mode 100644 index 0000000..3a61c0d --- /dev/null +++ b/mod/_tagscript.py @@ -0,0 +1,59 @@ +from typing import Any, Dict, List + +import TagScriptEngine as tse +from redbot.core import commands +from redbot.core.utils.chat_formatting import humanize_number + +kick_message: str = "Done. That felt good." +ban_message: str = "Done. That felt good." +tempban_message: str = "Done. Enough chaos for now." +unban_message: str = "Unbanned the user from this server." + +TAGSCRIPT_LIMIT: int = 10_000 + +blocks: List[tse.Block] = [ + tse.LooseVariableGetterBlock(), + tse.AssignmentBlock(), + tse.EmbedBlock(), +] + +tagscript_engine: tse.Interpreter = tse.Interpreter(blocks) + + +def process_tagscript(content: str, seed_variables: Dict[str, tse.Adapter] = {}) -> Dict[str, Any]: + output: tse.Response = tagscript_engine.process(content, seed_variables) + kwargs: Dict[str, Any] = {} + if output.body: + kwargs["content"] = output.body[:2000] + if embed := output.actions.get("embed"): + kwargs["embed"] = embed + return kwargs + + +def validate_tagscript(tagscript: str) -> bool: + length = len(tagscript) + if length > TAGSCRIPT_LIMIT: + raise TagCharacterLimitReached(TAGSCRIPT_LIMIT, length) + return True + + +class TagError(Exception): + """Base exception class.""" + + +class TagCharacterLimitReached(TagError): + """Taised when the Tagscript character limit is reached.""" + + def __init__(self, limit: int, length: int): + super().__init__( + f"Tagscript cannot be longer than {humanize_number(limit)} (**{humanize_number(length)}**)." + ) + + +class TagScriptConverter(commands.Converter[str]): + async def convert(self, ctx: commands.Context, argument: str) -> str: + try: + validate_tagscript(argument) + except TagError as e: + raise commands.BadArgument(str(e)) + return argument diff --git a/mod/info.json b/mod/info.json new file mode 100644 index 0000000..0767258 --- /dev/null +++ b/mod/info.json @@ -0,0 +1,18 @@ +{ + "author": [ + "flare(flare#0001)" + ], + "install_msg": "This cog subclasses core Mod. It may be finicky so be warned. This cog implements the features of Red#5532 until it is merged into core Red.", + "name": "Mod", + "disabled": false, + "short": "Mod with custom messages.", + "description": "Core mod with the inclusion of custom messages for banning, kicking and unbanning.", + "tags": [ + "mod" + ], + "requirements": [ + "AdvancedTagScriptEngine" + ], + "min_bot_version": "3.5.0", + "hidden": false +} diff --git a/mod/mod.py b/mod/mod.py new file mode 100644 index 0000000..5272c3d --- /dev/null +++ b/mod/mod.py @@ -0,0 +1,836 @@ +import contextlib +import logging +import re +from datetime import datetime, timedelta, timezone +from typing import Literal, Optional, Tuple, Union + +import discord +import TagScriptEngine as tse +from redbot.cogs.mod.mod import Mod as ModClass +from redbot.cogs.mod.utils import is_allowed_by_hierarchy +from redbot.core import Config, app_commands, checks, commands, modlog +from redbot.core.bot import Red +from redbot.core.utils.chat_formatting import bold, box, humanize_timedelta +from redbot.core.utils.mod import get_audit_reason + +from ._tagscript import ( + TagScriptConverter, + ban_message, + kick_message, + process_tagscript, + tempban_message, + unban_message, +) + +log = logging.getLogger("red.flarecogs.mod") + +from discord.ext import commands as dpy_commands +from discord.ext.commands import BadArgument + +ID_REGEX = re.compile(r"([0-9]{15,20})") +USER_MENTION_REGEX = re.compile(r"<@!?([0-9]{15,21})>$") + + +# https://github.com/flaree/Red-DiscordBot/blob/FR-custom-bankick-msgs/redbot/core/commands/converter.py#L207 +class RawUserIdConverter(dpy_commands.Converter): + """ + Converts ID or user mention to an `int`. + Useful for commands like ``[p]ban`` or ``[p]unban`` where the bot is not necessarily + going to share any servers with the user that a moderator wants to ban/unban. + This converter doesn't check if the ID/mention points to an actual user + but it won't match IDs and mentions that couldn't possibly be valid. + For example, the converter will not match on "123" because the number doesn't have + enough digits to be valid ID but, it will match on "12345678901234567" even though + there is no user with such ID. + """ + + async def convert(self, ctx, argument: str) -> int: + # This is for the hackban and unban commands, where we receive IDs that + # are most likely not in the guild. + # Mentions are supported, but most likely won't ever be in cache. + + if match := ID_REGEX.match(argument) or USER_MENTION_REGEX.match(argument): + return int(match.group(1)) + + raise BadArgument(("'{input}' doesn't look like a valid user ID.").format(input=argument)) + + +class Mod(ModClass): + """Mod with custom messages.""" + + modset = ModClass.modset.copy() + + __version__ = "1.3.0" + + def format_help_for_context(self, ctx: commands.Context): + pre_processed = super().format_help_for_context(ctx) + return f"{pre_processed}\nCog Version: {self.__version__}" + + def __init__(self, bot: Red): + super().__init__(bot) + self.bot: Red = bot + self._config: Config = Config.get_conf(self, 95932766180343808, force_registration=True) + self._config.register_guild( + **{ + "kick_message": kick_message, + "ban_message": ban_message, + "tempban_message": tempban_message, + "unban_message": unban_message, + "require_reason": False, + } + ) + + async def red_get_data_for_user(self, *, user_id: int): + # this cog does not story any data + return {} + + async def red_delete_data_for_user( + self, + *, + requester: Literal["discord_deleted_user", "owner", "user", "user_strict"], + user_id: int, + ): + return None + + @modset.command() + @commands.guild_only() + async def kickmessage(self, ctx: commands.Context, *, message: TagScriptConverter): + """Set the message sent when a user is kicked. + + **Blocks:** + - [Assignment Block](https://seina-cogs.readthedocs.io/en/latest/tags/tse_blocks.html#assignment-block) + - [Embed Block](https://seina-cogs.readthedocs.io/en/latest/tags/parsing_blocks.html#embed-block) + + **Variables:** + - `{user}`: [member that was kicked.](https://seina-cogs.readthedocs.io/en/latest/tags/default_variables.html#author-block) + - `{moderator}`: [modrator that kicked the member.](https://seina-cogs.readthedocs.io/en/latest/tags/default_variables.html#author-block) + - `{reason}`: reason for the kick. + - `{guild}`: [server](https://seina-cogs.readthedocs.io/en/latest/tags/default_variables.html#server-block) + """ + guild = ctx.guild + await self._config.guild(guild).kick_message.set(message) + await ctx.send("Kick message updated:\n{}".format(box(str(message), lang="json"))) + + @modset.command() + @commands.guild_only() + async def banmessage(self, ctx: commands.Context, *, message: TagScriptConverter): + """Set the message sent when a user is banned. + + **Blocks:** + - [Assignment Block](https://seina-cogs.readthedocs.io/en/latest/tags/tse_blocks.html#assignment-block) + - [Embed Block](https://seina-cogs.readthedocs.io/en/latest/tags/parsing_blocks.html#embed-block) + + **Variables:** + - `{user}`: [member that was banned.](https://seina-cogs.readthedocs.io/en/latest/tags/default_variables.html#author-block) + - `{moderator}`: [modrator that banned the member.](https://seina-cogs.readthedocs.io/en/latest/tags/default_variables.html#author-block) + - `{reason}`: reason for the ban. + - `{guild}`: [server](https://seina-cogs.readthedocs.io/en/latest/tags/default_variables.html#server-block) + - `{days}`: number of days of messages deleted. + """ + guild = ctx.guild + await self._config.guild(guild).ban_message.set(message) + await ctx.send("Ban message updated:\n{}".format(box(str(message), lang="json"))) + + @modset.command() + @commands.guild_only() + async def tempbanmessage(self, ctx: commands.Context, *, message: TagScriptConverter): + """Set the message sent when a user is tempbanned. + + **Blocks:** + - [Assignment Block](https://seina-cogs.readthedocs.io/en/latest/tags/tse_blocks.html#assignment-block) + - [Embed Block](https://seina-cogs.readthedocs.io/en/latest/tags/parsing_blocks.html#embed-block) + + **Variables:** + - `{user}`: [member that was tempbanned.](https://seina-cogs.readthedocs.io/en/latest/tags/default_variables.html#author-block) + - `{moderator}`: [modrator that tempbanned the member.](https://seina-cogs.readthedocs.io/en/latest/tags/default_variables.html#author-block) + - `{reason}`: reason for the tempban. + - `{guild}`: [server](https://seina-cogs.readthedocs.io/en/latest/tags/default_variables.html#server-block) + - `{days}`: number of days of messages deleted. + - `{duration}`: duration of the tempban. + """ + guild = ctx.guild + await self._config.guild(guild).tempban_message.set(message) + await ctx.send("Tempban message updated:\n{}".format(box(str(message), lang="json"))) + + @modset.command() + @commands.guild_only() + async def unbanmessage(self, ctx: commands.Context, *, message: TagScriptConverter): + """Set the message sent when a user is unbanned. + + **Blocks:** + - [Assignment Block](https://seina-cogs.readthedocs.io/en/latest/tags/tse_blocks.html#assignment-block) + - [Embed Block](https://seina-cogs.readthedocs.io/en/latest/tags/parsing_blocks.html#embed-block) + + **Variables:** + - `{user}`: [member that was tempbanned.](https://seina-cogs.readthedocs.io/en/latest/tags/default_variables.html#author-block) + - `{moderator}`: [modrator that tempbanned the member.](https://seina-cogs.readthedocs.io/en/latest/tags/default_variables.html#author-block) + - `{reason}`: reason for the tempban. + - `{guild}`: [server](https://seina-cogs.readthedocs.io/en/latest/tags/default_variables.html#server-block) + """ + guild = ctx.guild + await self._config.guild(guild).unban_message.set(message) + await ctx.send("Unban message updated:\n{}".format(box(str(message), lang="json"))) + + @modset.command(name="showmessages") + async def modset_showmessages(self, ctx: commands.Context): + """Show the current messages for moderation commands.""" + messageData = await self._config.guild(ctx.guild).all() + msg = "Kick Message: {kick_message}\n".format(kick_message=messageData["kick_message"]) + msg += "Ban Message: {ban_message}\n".format(ban_message=messageData["ban_message"]) + msg += "Tempban Message: {tempban_message}\n".format( + tempban_message=messageData["tempban_message"] + ) + msg += "Unban Message: {unban_message}\n".format( + unban_message=messageData["unban_message"] + ) + await ctx.send(box(msg)) + + @modset.command(name="reasons") + async def modset_require_reason(self, ctx: commands.Context, value: bool): + """Set whether a reason is required for moderation actions.""" + await self._config.guild(ctx.guild).require_reason.set(value) + await ctx.send(f"Reason requirement set to {value}") + + kick = None + + @commands.hybrid_command() + @app_commands.describe(member="The member to kick.", reason="The reason for kicking the user.") + @commands.guild_only() + @commands.bot_has_permissions(kick_members=True) + @checks.admin_or_permissions(kick_members=True) + async def kick(self, ctx: commands.Context, member: discord.Member, *, reason: str = None): + """ + Kick a user. + Examples: + - `[p]kick 428675506947227648 wanted to be kicked.` + This will kick the user with ID 428675506947227648 from the server. + - `[p]kick @Twentysix wanted to be kicked.` + This will kick Twentysix from the server. + If a reason is specified, it will be the reason that shows up + in the audit log. + """ + require_reason = await self._config.guild(ctx.guild).require_reason() + if require_reason and reason is None: + await ctx.send("You must provide a reason for this action.") + return + author = ctx.author + guild = ctx.guild + + if author == member: + await ctx.send( + ("I cannot let you do that. Self-harm is bad {emoji}").format( + emoji="\N{PENSIVE FACE}" + ) + ) + return + elif not await is_allowed_by_hierarchy(self.bot, self.config, guild, author, member): + await ctx.send( + ( + "I cannot let you do that. You are " + "not higher than the user in the role " + "hierarchy." + ) + ) + return + elif ctx.guild.me.top_role <= member.top_role or member == ctx.guild.owner: + await ctx.send(("I cannot do that due to Discord hierarchy rules.")) + return + audit_reason = get_audit_reason(author, reason, shorten=True) + toggle = await self.config.guild(guild).dm_on_kickban() + if toggle: + with contextlib.suppress(discord.HTTPException): + em = discord.Embed( + title=bold(("You have been kicked from {guild}.").format(guild=guild)), + color=await self.bot.get_embed_color(member), + ) + em.add_field( + name=("**Reason**"), + value=reason if reason is not None else ("No reason was given."), + inline=False, + ) + await member.send(embed=em) + try: + await guild.kick(member, reason=audit_reason) + log.info("{}({}) kicked {}({})".format(author.name, author.id, member.name, member.id)) + except discord.errors.Forbidden: + await ctx.send("I'm not allowed to do that.") + except Exception: + log.exception( + "{}({}) attempted to kick {}({}), but an error occurred.".format( + author.name, author.id, member.name, member.id + ) + ) + else: + await modlog.create_case( + self.bot, + guild, + ctx.message.created_at, + "kick", + member, + author, + reason, + until=None, + channel=None, + ) + message = await self._config.guild(ctx.guild).kick_message() + kwargs = process_tagscript( + message, + { + "user": tse.MemberAdapter(member), + "moderator": tse.MemberAdapter(author), + "reason": tse.StringAdapter(str(reason)), + "guild": tse.GuildAdapter(guild), + }, + ) + if not kwargs: + await self._config.guild(ctx.guild).kick_message.clear() + kwargs = process_tagscript( + kick_message, + { + "user": tse.MemberAdapter(member), + "moderator": tse.MemberAdapter(author), + "reason": tse.StringAdapter(str(reason)), + "guild": tse.GuildAdapter(guild), + }, + ) + await ctx.send(**kwargs) + + tempban = None + + @commands.hybrid_command() + @app_commands.describe( + member="The member to tempban.", + reason="The reason for tempbanning the user.", + duration="The duration of the tempban.", + days="The number of days of messages to delete.", + ) + @commands.guild_only() + @commands.bot_has_permissions(ban_members=True) + @checks.admin_or_permissions(ban_members=True) + async def tempban( + self, + ctx: commands.Context, + member: discord.Member, + duration: Optional[commands.TimedeltaConverter] = None, + days: Optional[int] = None, + *, + reason: str = None, + ): + """Temporarily ban a user from this server. + `duration` is the amount of time the user should be banned for. + `days` is the amount of days of messages to cleanup on tempban. + Examples: + - `[p]tempban @Twentysix Because I say so` + This will ban Twentysix for the default amount of time set by an administrator. + - `[p]tempban @Twentysix 15m You need a timeout` + This will ban Twentysix for 15 minutes. + - `[p]tempban 428675506947227648 1d2h15m 5 Evil person` + This will ban the user with ID 428675506947227648 for 1 day 2 hours 15 minutes and will delete the last 5 days of their messages. + """ + require_reason = await self._config.guild(ctx.guild).require_reason() + if require_reason and reason is None: + await ctx.send("You must provide a reason for this action.") + return + guild = ctx.guild + author = ctx.author + + if author == member: + await ctx.send( + ("I cannot let you do that. Self-harm is bad {}").format("\N{PENSIVE FACE}") + ) + return + elif not await is_allowed_by_hierarchy(self.bot, self.config, guild, author, member): + await ctx.send( + ( + "I cannot let you do that. You are " + "not higher than the user in the role " + "hierarchy." + ) + ) + return + elif guild.me.top_role <= member.top_role or member == guild.owner: + await ctx.send(("I cannot do that due to Discord hierarchy rules.")) + return + + guild_data = await self.config.guild(guild).all() + + if duration is None: + duration = timedelta(seconds=guild_data["default_tempban_duration"]) + unban_time = datetime.now(timezone.utc) + duration + + if days is None: + days = guild_data["default_days"] + + if not (0 <= days <= 7): + await ctx.send(("Invalid days. Must be between 0 and 7.")) + return + invite = await self.get_invite_for_reinvite(ctx, int(duration.total_seconds() + 86400)) + + await self.config.member(member).banned_until.set(unban_time.timestamp()) + async with self.config.guild(guild).current_tempbans() as current_tempbans: + current_tempbans.append(member.id) + + with contextlib.suppress(discord.HTTPException): + # We don't want blocked DMs preventing us from banning + msg = ("You have been temporarily banned from {server_name} until {date}.").format( + server_name=guild.name, date=discord.utils.format_dt(unban_time) + ) + if guild_data["dm_on_kickban"] and reason: + msg += ("\n\n**Reason:** {reason}").format(reason=reason) + if invite: + msg += ("\n\nHere is an invite for when your ban expires: {invite_link}").format( + invite_link=invite + ) + await member.send(msg) + + audit_reason = get_audit_reason(author, reason, shorten=True) + + try: + await guild.ban(member, reason=audit_reason, delete_message_days=days) + except discord.Forbidden: + await ctx.send(("I can't do that for some reason.")) + except discord.HTTPException: + await ctx.send(("Something went wrong while banning.")) + else: + await modlog.create_case( + self.bot, + guild, + ctx.message.created_at, + "tempban", + member, + author, + reason, + unban_time, + ) + message = await self._config.guild(ctx.guild).tempban_message() + humanized_duration = humanize_timedelta(timedelta=duration) + kwargs = process_tagscript( + message, + { + "user": tse.MemberAdapter(member), + "moderator": tse.MemberAdapter(author), + "reason": tse.StringAdapter(str(reason)), + "guild": tse.GuildAdapter(guild), + "duration": tse.StringAdapter(humanized_duration), + "days": tse.IntAdapter(days), + }, + ) + if not kwargs: + await self._config.guild(ctx.guild).tempban_message.clear() + kwargs = process_tagscript( + tempban_message, + { + "user": tse.MemberAdapter(member), + "moderator": tse.MemberAdapter(author), + "reason": tse.StringAdapter(str(reason)), + "guild": tse.GuildAdapter(guild), + "duration": tse.StringAdapter(humanized_duration), + "days": tse.IntAdapter(days), + }, + ) + await ctx.send(**kwargs) + + softban = None + + @commands.hybrid_command() + @app_commands.describe( + member="The member to softban.", reason="The reason for softbanning the user." + ) + @commands.guild_only() + @commands.bot_has_permissions(ban_members=True) + @checks.admin_or_permissions(ban_members=True) + async def softban(self, ctx: commands.Context, member: discord.Member, *, reason: str = None): + """Kick a user and delete 1 day's worth of their messages.""" + require_reason = await self._config.guild(ctx.guild).require_reason() + if require_reason and reason is None: + await ctx.send("You must provide a reason for this action.") + return + guild = ctx.guild + author = ctx.author + + if author == member: + await ctx.send( + ("I cannot let you do that. Self-harm is bad {emoji}").format( + emoji="\N{PENSIVE FACE}" + ) + ) + return + elif not await is_allowed_by_hierarchy(self.bot, self.config, guild, author, member): + await ctx.send( + ( + "I cannot let you do that. You are " + "not higher than the user in the role " + "hierarchy." + ) + ) + return + + audit_reason = get_audit_reason(author, reason, shorten=True) + + invite = await self.get_invite_for_reinvite(ctx) + + try: # We don't want blocked DMs preventing us from banning + msg = await member.send( + ( + "You have been banned and " + "then unbanned as a quick way to delete your messages.\n" + "You can now join the server again. {invite_link}" + ).format(invite_link=invite) + ) + except discord.HTTPException: + msg = None + try: + await guild.ban(member, reason=audit_reason, delete_message_days=1) + except discord.errors.Forbidden: + await ctx.send(("My role is not high enough to softban that user.")) + if msg is not None: + await msg.delete() + return + except discord.HTTPException: + log.exception( + "{}({}) attempted to softban {}({}), but an error occurred trying to ban them.".format( + author.name, author.id, member.name, member.id + ) + ) + return + try: + await guild.unban(member) + except discord.HTTPException: + log.exception( + "{}({}) attempted to softban {}({}), but an error occurred trying to unban them.".format( + author.name, author.id, member.name, member.id + ) + ) + return + else: + log.info( + "{}({}) softbanned {}({}), deleting 1 day worth " + "of messages.".format(author.name, author.id, member.name, member.id) + ) + await modlog.create_case( + self.bot, + guild, + ctx.message.created_at, + "softban", + member, + author, + reason, + until=None, + channel=None, + ) + message = await self._config.guild(ctx.guild).kick_message() + kwargs = process_tagscript( + message, + { + "user": tse.MemberAdapter(member), + "moderator": tse.MemberAdapter(author), + "reason": tse.StringAdapter(str(reason)), + "guild": tse.GuildAdapter(guild), + }, + ) + if not kwargs: + await self._config.guild(ctx.guild).kick_message.clear() + kwargs = process_tagscript( + kick_message, + { + "user": tse.MemberAdapter(member), + "moderator": tse.MemberAdapter(author), + "reason": tse.StringAdapter(str(reason)), + "guild": tse.GuildAdapter(guild), + }, + ) + await ctx.send(**kwargs) + + @commands.hybrid_command() + @app_commands.describe( + user="The member to ban.", + reason="The reason for banning the user.", + days="The number of days of messages to delete.", + ) + @commands.guild_only() + @commands.bot_has_permissions(ban_members=True) + @commands.admin_or_permissions(ban_members=True) + async def ban( + self, + ctx: commands.Context, + user: discord.Member, + days: Optional[int] = None, + *, + reason: str = None, + ): + """Ban a user from this server and optionally delete days of messages. + + `days` is the amount of days of messages to cleanup on ban. + + Examples: + - `[p]ban 428675506947227648 7 Continued to spam after told to stop.` + This will ban the user with ID 428675506947227648 and it will delete 7 days worth of messages. + - `[p]ban @Twentysix 7 Continued to spam after told to stop.` + This will ban Twentysix and it will delete 7 days worth of messages. + + A user ID should be provided if the user is not a member of this server. + If days is not a number, it's treated as the first word of the reason. + Minimum 0 days, maximum 7. If not specified, the defaultdays setting will be used instead. + """ + require_reason = await self._config.guild(ctx.guild).require_reason() + if require_reason and reason is None: + await ctx.send("You must provide a reason for this action.") + return + guild = ctx.guild + if days is None: + days = await self.config.guild(guild).default_days() + if isinstance(user, int): + user = self.bot.get_user(user) or discord.Object(id=user) + + success, message = await self.ban_user( + user=user, ctx=ctx, days=days, reason=reason, create_modlog_case=True + ) + + if not success: + await ctx.send(message) + return + + kwargs = process_tagscript( + message, + { + "user": tse.MemberAdapter(user), + "moderator": tse.MemberAdapter(ctx.author), + "reason": tse.StringAdapter(str(reason)), + "guild": tse.GuildAdapter(guild), + "days": tse.IntAdapter(int(days)), + }, + ) + if not kwargs: + await self._config.guild(ctx.guild).ban_message.clear() + kwargs = process_tagscript( + ban_message, + { + "user": tse.MemberAdapter(user), + "moderator": tse.MemberAdapter(ctx.author), + "reason": tse.StringAdapter(str(reason)), + "guild": tse.GuildAdapter(guild), + "days": tse.IntAdapter(int(days)), + }, + ) + + await ctx.send(**kwargs) + + ban_user = None + + async def ban_user( + self, + user: Union[discord.Member, discord.User, discord.Object], + ctx: commands.Context, + days: int = 0, + reason: str = None, + create_modlog_case=False, + ) -> Tuple[bool, str]: + author = ctx.author + guild = ctx.guild + + removed_temp = False + + if not (0 <= days <= 7): + return False, ("Invalid days. Must be between 0 and 7.") + + if isinstance(user, discord.Member): + if author == user: + return ( + False, + ("I cannot let you do that. Self-harm is bad {}").format("\N{PENSIVE FACE}"), + ) + elif not await is_allowed_by_hierarchy(self.bot, self.config, guild, author, user): + return ( + False, + ( + "I cannot let you do that. You are " + "not higher than the user in the role " + "hierarchy." + ), + ) + elif guild.me.top_role <= user.top_role or user == guild.owner: + return False, ("I cannot do that due to Discord hierarchy rules.") + + toggle = await self.config.guild(guild).dm_on_kickban() + if toggle: + with contextlib.suppress(discord.HTTPException): + em = discord.Embed( + title=bold(("You have been banned from {guild}.").format(guild=guild)), + color=await self.bot.get_embed_color(user), + ) + em.add_field( + name=("**Reason**"), + value=reason if reason is not None else ("No reason was given."), + inline=False, + ) + await user.send(embed=em) + + ban_type = "ban" + else: + tempbans = await self.config.guild(guild).current_tempbans() + + try: + await guild.fetch_ban(user) + except discord.NotFound: + pass + else: + if user.id in tempbans: + async with self.config.guild(guild).current_tempbans() as tempbans: + tempbans.remove(user.id) + removed_temp = True + else: + return ( + False, + ("User with ID {user_id} is already banned.").format(user_id=user.id), + ) + + ban_type = "hackban" + + audit_reason = get_audit_reason(author, reason, shorten=True) + + if removed_temp: + log.info( + "{}({}) upgraded the tempban for {} to a permaban.".format( + author.name, author.id, user.id + ) + ) + success_message = ( + "User with ID {user(id)} was upgraded from a temporary to a permanent ban." + ) + else: + username = user.name if hasattr(user, "name") else "Unknown" + try: + await guild.ban(user, reason=audit_reason, delete_message_days=days) + log.info( + "{}({}) {}ned {}({}), deleting {} days worth of messages.".format( + author.name, author.id, ban_type, username, user.id, str(days) + ) + ) + success_message = await self._config.guild(ctx.guild).ban_message() + except discord.Forbidden: + return False, ("I'm not allowed to do that.") + except discord.NotFound: + return False, ("User with ID {user_id} not found").format(user_id=user.id) + except Exception: + log.exception( + "{}({}) attempted to {} {}({}), but an error occurred.".format( + author.name, author.id, ban_type, username, user.id + ) + ) + return False, ("An unexpected error occurred.") + if create_modlog_case: + await modlog.create_case( + self.bot, + guild, + ctx.message.created_at, + ban_type, + user, + author, + reason, + until=None, + channel=None, + ) + + return True, success_message + + unban = None + + @commands.hybrid_command() + @app_commands.describe( + user_id="The ID of the user to unban.", reason="The reason for unbanning the user." + ) + @commands.guild_only() + @commands.bot_has_permissions(ban_members=True) + @checks.admin_or_permissions(ban_members=True) + async def unban( + self, ctx: commands.Context, user_id: RawUserIdConverter, *, reason: str = None + ): + """Unban a user from this server. + Requires specifying the target user's ID. To find this, you may either: + 1. Copy it from the mod log case (if one was created), or + 2. enable developer mode, go to Bans in this server's settings, right- + click the user and select 'Copy ID'.""" + require_reason = await self._config.guild(ctx.guild).require_reason() + if require_reason and reason is None: + await ctx.send("You must provide a reason for this action.") + return + guild = ctx.guild + author = ctx.author + audit_reason = get_audit_reason(ctx.author, reason, shorten=True) + try: + ban_entry = await guild.fetch_ban(discord.Object(user_id)) + except discord.NotFound: + await ctx.send(("It seems that user isn't banned!")) + return + try: + await guild.unban(ban_entry.user, reason=audit_reason) + except discord.HTTPException: + await ctx.send(("Something went wrong while attempting to unban that user.")) + return + else: + await modlog.create_case( + self.bot, + guild, + ctx.message.created_at, + "unban", + ban_entry.user, + author, + reason, + until=None, + channel=None, + ) + message = await self._config.guild(ctx.guild).unban_message() + kwargs = process_tagscript( + message, + { + "user": tse.MemberAdapter(ban_entry.user), + "moderator": tse.MemberAdapter(author), + "reason": tse.StringAdapter(str(reason)), + "guild": tse.GuildAdapter(guild), + }, + ) + if not kwargs: + await self._config.guild(ctx.guild).unban_message.clear() + kwargs = process_tagscript( + ban_message, + { + "user": tse.MemberAdapter(user), + "moderator": tse.MemberAdapter(ctx.author), + "reason": tse.StringAdapter(str(reason)), + "guild": tse.GuildAdapter(guild), + }, + ) + await ctx.send(**kwargs) + + if await self.config.guild(guild).reinvite_on_unban(): + user = ctx.bot.get_user(user_id) + if not user: + await ctx.send( + ("I don't share another server with this user. I can't reinvite them.") + ) + return + + invite = await self.get_invite_for_reinvite(ctx) + if invite: + try: + await user.send( + ( + "You've been unbanned from {server}.\n" + "Here is an invite for that server: {invite_link}" + ).format(server=guild.name, invite_link=invite) + ) + except discord.Forbidden: + await ctx.send( + ( + "I failed to send an invite to that user. " + "Perhaps you may be able to send it for me?\n" + "Here's the invite link: {invite_link}" + ).format(invite_link=invite) + ) + except discord.HTTPException: + await ctx.send( + ( + "Something went wrong when attempting to send that user " + "an invite. Here's the link so you can try: {invite_link}" + ).format(invite_link=invite) + ) diff --git a/onetrueslash/__init__.py b/onetrueslash/__init__.py new file mode 100644 index 0000000..0eb76bf --- /dev/null +++ b/onetrueslash/__init__.py @@ -0,0 +1,48 @@ +import asyncio +import logging + +from redbot.core import app_commands +from redbot.core.bot import Red +from redbot.core.errors import CogLoadError +from redbot.core.utils import get_end_user_data_statement_or_raise + +__red_end_user_data_statement__ = get_end_user_data_statement_or_raise(__file__) + +from .commands import onetrueslash +from .events import before_hook, on_user_update +from .utils import valid_app_name + +LOG = logging.getLogger("red.fluffy.onetrueslash") + + +async def setup(bot: Red) -> None: + bot.before_invoke(before_hook) + bot.add_listener(on_user_update) + bot.add_dev_env_value("interaction", lambda ctx: getattr(ctx, "interaction", None)) + asyncio.create_task(_setup(bot)) # noqa: RUF006 + + +async def _setup(bot: Red): + await bot.wait_until_red_ready() + assert bot.user + try: + onetrueslash.name = valid_app_name(bot.user.name) + bot.tree.add_command(onetrueslash, guild=None) + except ValueError: + await bot.send_to_owners( + f"`onetrueslash` was unable to make the name {bot.user.name!r} " + "into a valid slash command name. The command name was left unchanged." + ) + except app_commands.CommandAlreadyRegistered: + raise CogLoadError( + f"A slash command named {onetrueslash.name} is already registered." + ) from None + except app_commands.CommandLimitReached: + raise CogLoadError( + f"{bot.user.name} has already reached the maximum of 100 global slash commands." + ) from None + + +async def teardown(bot: Red): + bot.remove_before_invoke_hook(before_hook) + bot.remove_dev_env_value("interaction") diff --git a/onetrueslash/channel.py b/onetrueslash/channel.py new file mode 100644 index 0000000..f75689f --- /dev/null +++ b/onetrueslash/channel.py @@ -0,0 +1,43 @@ +from typing import TYPE_CHECKING, Union, cast + +import discord + +from .utils import Thinking, contexts + +if TYPE_CHECKING: + from discord.context_managers import Typing + + Base = discord.abc.Messageable +else: + Base = object + + +class InterChannel(Base): + __slots__ = () + + def permissions_for( + self, obj: Union[discord.abc.User, discord.Role], / + ) -> discord.Permissions: + try: + ctx = contexts.get() + except LookupError: + pass + else: + interaction = ctx._interaction + bot_user = cast(discord.ClientUser, ctx.bot.user) + if obj.id == interaction.user.id: + return ctx.permissions + elif obj.id == bot_user.id: + return ctx.bot_permissions + return super().permissions_for(obj) # type: ignore + + def send(self, *args, **kwargs): + return contexts.get(super()).send(*args, **kwargs) + + def typing(self) -> Union[Thinking, "Typing"]: + try: + ctx = contexts.get() + except LookupError: + return super().typing() + else: + return Thinking(ctx) diff --git a/onetrueslash/commands.py b/onetrueslash/commands.py new file mode 100644 index 0000000..dd60799 --- /dev/null +++ b/onetrueslash/commands.py @@ -0,0 +1,141 @@ +import asyncio +import functools +import heapq +import operator +from copy import copy +from typing import Awaitable, Callable, Dict, List, Optional, Tuple, cast + +import discord +from rapidfuzz import fuzz +from redbot.core import app_commands, commands +from redbot.core.bot import Red +from redbot.core.commands.help import HelpSettings +from redbot.core.i18n import set_contextual_locale + +from .context import InterContext +from .utils import walk_aliases + + +@app_commands.command(extras={"red_force_enable": True}) +async def onetrueslash( + interaction: discord.Interaction, + command: str, + arguments: Optional[str] = None, + attachment: Optional[discord.Attachment] = None, +) -> None: + """ + The one true slash command. + + Parameters + ----------- + command: str + The text-based command to run. + arguments: Optional[str] + The arguments to provide to the command, if any. + attachment: Optional[Attachment] + The attached file to provide to the command, if any. + """ + assert isinstance(interaction.client, Red) + set_contextual_locale(str(interaction.guild_locale or interaction.locale)) + actual = interaction.client.get_command(command) + ctx = await InterContext.from_interaction(interaction, recreate_message=True) + error = None + if command == "help": + ctx._deferring = True + # Moving ctx._interaction can cause check errors with some hybrid commands + # see https://github.com/Zephyrkul/FluffyCogs/issues/75 for details + # ctx.interaction = interaction + await interaction.response.defer(ephemeral=True) + actual = None + if arguments: + actual = interaction.client.get_command(arguments) + if actual and (signature := actual.signature): + actual = copy(actual) + actual.usage = f"arguments:{signature}" + await interaction.client.send_help_for( + ctx, actual or interaction.client, from_help_command=True + ) + else: + ferror: asyncio.Task[Tuple[InterContext, commands.CommandError]] = asyncio.create_task( + interaction.client.wait_for("command_error", check=lambda c, _: c is ctx) + ) + ferror.add_done_callback(lambda _: setattr(ctx, "interaction", interaction)) + await interaction.client.invoke(ctx) + if not interaction.response.is_done(): + ctx._deferring = True + await interaction.response.defer(ephemeral=True) + if ferror.done(): + error = ferror.exception() or ferror.result()[1] + ferror.cancel() + if ctx._deferring and not interaction.is_expired(): + if error is None: + if ctx._ticked: + await interaction.followup.send(ctx._ticked, ephemeral=True) + else: + await interaction.delete_original_response() + elif isinstance(error, commands.CommandNotFound): + await interaction.followup.send( + f"❌ Command `{command}` was not found.", ephemeral=True + ) + elif isinstance(error, commands.CheckFailure): + await interaction.followup.send( + f"❌ You don't have permission to run `{command}`.", ephemeral=True + ) + + +@onetrueslash.autocomplete("command") +async def onetrueslash_command_autocomplete( + interaction: discord.Interaction, current: str +) -> List[app_commands.Choice[str]]: + assert isinstance(interaction.client, Red) + + if not await interaction.client.allowed_by_whitelist_blacklist(interaction.user): + return [] + + ctx = await InterContext.from_interaction(interaction) + if not await interaction.client.message_eligible_as_command(ctx.message): + return [] + + help_settings = await HelpSettings.from_context(ctx) + if current: + extracted = cast( + List[str], + await asyncio.get_event_loop().run_in_executor( + None, + heapq.nlargest, + 6, + walk_aliases(interaction.client, show_hidden=help_settings.show_hidden), + functools.partial(fuzz.token_sort_ratio, current), + ), + ) + extracted.append("help") + else: + extracted = ["help"] + _filter: Callable[[commands.Command], Awaitable[bool]] = operator.methodcaller( + "can_run" if help_settings.show_hidden else "can_see", ctx + ) + matches: Dict[commands.Command, str] = {} + for name in extracted: + command = interaction.client.get_command(name) + if not command or command in matches: + continue + try: + if name == "help" and await command.can_run(ctx) or await _filter(command): + if len(name) > 100: + name = name[:99] + "\N{HORIZONTAL ELLIPSIS}" + matches[command] = name + except commands.CommandError: + pass + return [app_commands.Choice(name=name, value=name) for name in matches.values()] + + +@onetrueslash.error +async def onetrueslash_error(interaction: discord.Interaction, error: Exception): + assert isinstance(interaction.client, Red) + if isinstance(error, app_commands.CommandInvokeError): + error = error.original + error = getattr(error, "original", error) + await interaction.client.on_command_error( + await InterContext.from_interaction(interaction, recreate_message=True), + commands.CommandInvokeError(error), + ) diff --git a/onetrueslash/context.py b/onetrueslash/context.py new file mode 100644 index 0000000..44d7489 --- /dev/null +++ b/onetrueslash/context.py @@ -0,0 +1,163 @@ +import inspect +import types +from copy import copy +from typing import Optional, Type, Union + +import discord +from discord.ext.commands.view import StringView +from redbot.core import commands +from redbot.core.bot import Red + +from .message import InterMessage +from .utils import Thinking, contexts + +INCOMPATABLE_PARAMETERS_DISCARD = tuple( + k + for k in inspect.signature(discord.abc.Messageable.send).parameters + if k not in inspect.signature(discord.Webhook.send).parameters +) + + +class InterContext(commands.Context): + _deferring: bool = False + _ticked: Optional[str] = None + _interaction: discord.Interaction[Red] + message: InterMessage + + @classmethod + def _get_type(cls, bot: Red) -> Type["InterContext"]: + default = bot.get_context.__kwdefaults__.get("cls", None) + if not isinstance(default, type) or default in cls.__mro__: + return cls + try: + return types.new_class(cls.__name__, (cls, default)) + except Exception: + return cls + + @classmethod + async def from_interaction( + cls: Type["InterContext"], + interaction: discord.Interaction[Red], + *, + recreate_message: bool = False, + ) -> "InterContext": + prefix = f" command:" + try: + self = contexts.get() + if recreate_message: + assert self.prefix is not None + self.message._recreate_from_interaction(interaction, prefix) + view = self.view = StringView(self.message.content) + view.skip_string(self.prefix) + invoker = view.get_word() + self.invoked_with = invoker + self.command = interaction.client.all_commands.get(invoker) + return self + except LookupError: + pass + message = InterMessage._from_interaction(interaction, prefix) + view = StringView(message.content) + view.skip_string(prefix) + invoker = view.get_word() + self = cls._get_type(interaction.client)( + message=message, + prefix=prefix, + bot=interaction.client, + view=view, + invoked_with=invoker, + command=interaction.client.all_commands.get(invoker), + ) + # don't set self.interaction so make d.py parses commands the old way + self._interaction = interaction + interaction._baton = self + contexts.set(self) + return self + + @property + def clean_prefix(self) -> str: + return f"/{self._interaction.data['name']} command:" + + async def tick(self, *, message: Optional[str] = None) -> bool: + return await super().tick(message="Done." if message is None else message) + + async def react_quietly( + self, + reaction: Union[discord.Emoji, discord.Reaction, discord.PartialEmoji, str], + *, + message: Optional[str] = None, + ) -> bool: + self._ticked = f"{reaction} {message}" if message else str(reaction) + return False + + async def send(self, *args, **kwargs): + interaction = self._interaction + if interaction.is_expired(): + assert interaction.channel + return await interaction.channel.send(*args, **kwargs) # type: ignore + await self.typing(ephemeral=True) + self._deferring = False + delete_after = kwargs.pop("delete_after", None) + for key in INCOMPATABLE_PARAMETERS_DISCARD: + kwargs.pop(key, None) + m = await interaction.followup.send(*args, **kwargs) + if delete_after: + await m.delete(delay=delete_after) + return m + + def typing(self, *, ephemeral: bool = False) -> Thinking: + return Thinking(self, ephemeral=ephemeral) + + async def defer(self, *, ephemeral: bool = False) -> None: + await self._interaction.response.defer(ephemeral=ephemeral) + + async def send_help( + self, command: Optional[Union[commands.Command, commands.GroupMixin, str]] = None + ): + command = command or self.command + if isinstance(command, str): + command = self.bot.get_command(command) or command + signature: str + if signature := getattr(command, "signature", ""): + assert not isinstance(command, str) + command = copy(command) + command.usage = f"arguments:{signature}" + return await super().send_help(command) + + def _apply_implicit_permissions( + self, user: discord.abc.User, base: discord.Permissions + ) -> discord.Permissions: + if base.administrator or (self.guild and self.guild.owner_id == user.id): + return discord.Permissions.all() + + base = copy(base) + if not base.send_messages: + base.send_tts_messages = False + base.mention_everyone = False + base.embed_links = False + base.attach_files = False + + if not base.read_messages: + base &= ~discord.Permissions.all_channel() + + channel_type = self.channel.type + if channel_type in (discord.ChannelType.voice, discord.ChannelType.stage_voice): + if not base.connect: + denied = discord.Permissions.voice() + denied.update(manage_channels=True, manage_roles=True) + base &= ~denied + else: + base &= ~discord.Permissions.voice() + + return base + + @discord.utils.cached_property + def permissions(self): + if self._interaction._permissions == 0: + return discord.Permissions._dm_permissions() # type: ignore + return self._apply_implicit_permissions(self.author, self._interaction.permissions) + + @discord.utils.cached_property + def bot_permissions(self): + return self._apply_implicit_permissions( + self.me, self._interaction.app_permissions + ) | discord.Permissions(send_messages=True, attach_files=True, embed_links=True) diff --git a/onetrueslash/events.py b/onetrueslash/events.py new file mode 100644 index 0000000..201f23a --- /dev/null +++ b/onetrueslash/events.py @@ -0,0 +1,44 @@ +from typing import Optional + +import discord +from redbot.core import commands as red_commands +from redbot.core.bot import Red + +from .commands import onetrueslash +from .utils import valid_app_name + + +async def before_hook(ctx: red_commands.Context): + interaction: Optional[discord.Interaction] = getattr(ctx, "_interaction", None) + if not interaction or getattr(ctx.command, "__commands_is_hybrid__", False): + return + ctx.interaction = interaction + if not interaction.response.is_done(): + ctx._deferring = True # type: ignore + await interaction.response.defer(ephemeral=False) + + +async def on_user_update(before: discord.User, after: discord.User): + bot: Red = after._state._get_client() # type: ignore # DEP-WARN + assert bot.user + if after.id != bot.user.id: + return + if before.name == after.name: + return + old_name = onetrueslash.name + try: + onetrueslash.name = valid_app_name(after.name) + except ValueError: + await bot.send_to_owners( + f"`onetrueslash` was unable to make the name {after.name!r} " + "into a valid slash command name. The command name was left unchanged." + ) + return + bot.tree.remove_command(old_name) + bot.tree.add_command(onetrueslash, guild=None) + await bot.send_to_owners( + "The bot's username has changed. `onetrueslash`'s slash command has been updated to reflect this.\n" + "**You will need to re-sync the command tree yourself to see this change.**\n" + "It is recommended not to change the bot's name too often with this cog, as this can potentially " + "create confusion for users as well as ratelimiting issues for the bot." + ) diff --git a/onetrueslash/info.json b/onetrueslash/info.json new file mode 100644 index 0000000..d31d87a --- /dev/null +++ b/onetrueslash/info.json @@ -0,0 +1,19 @@ +{ + "author": [ + "Zephyrkul (Zephyrkul#1089)" + ], + "install_msg": "Thanks for loading OneTrueSlash! Your one and only slash command will show in all servers your bot has applications.commands permission for within an hour after syncing.\nNote that you will have to sync the associated command on your own, using `[p]slash sync`.\nThis cog has no commands beyond the one true slash command.\nDue to the necessary work to force text commands to work via slash, commands won't necessarily work correctly. No warranty is provided for any damage this cog may cause.", + "name": "OneTrueSlash", + "short": "Add the one and only slash command you will ever need to your bot!", + "description": "Add the one and only slash command you will ever need to your bot!", + "min_bot_version": "3.5.0", + "tags": [ + "slash", + "dpy2", + "utility" + ], + "requirements": [ + "rapidfuzz" + ], + "end_user_data_statement": "This cog does not persistently store any data or metadata about users." +} diff --git a/onetrueslash/message.py b/onetrueslash/message.py new file mode 100644 index 0000000..124f60f --- /dev/null +++ b/onetrueslash/message.py @@ -0,0 +1,132 @@ +import asyncio +from copy import copy +from typing import TypeVar + +import discord + +from .channel import InterChannel + +_TT = TypeVar("_TT", bound=type) + + +def __step(*args, **kwargs): + # ensure the coro still yields to the event loop + return asyncio.sleep(0) + + +def neuter_coros(cls: _TT) -> _TT: + for name in dir(cls): + if name in cls.__dict__: + continue + if (attr := getattr(cls, name, None)) is None: + continue + if asyncio.iscoroutinefunction(attr): + setattr(cls, name, property(lambda self: __step)) + return cls + + +@neuter_coros +class InterMessage(discord.Message): + __slots__ = () + + def __init__(self, **kwargs) -> None: + raise RuntimeError + + @classmethod + def _from_interaction(cls, interaction: discord.Interaction, prefix: str) -> "InterMessage": + assert interaction.data + assert interaction.client.user + + self = InterMessage.__new__(InterMessage) + self._state = interaction._state + self._edited_timestamp = None + + self.tts = False + self.webhook_id = None + self.mention_everyone = False + self.embeds = [] + self.role_mentions = [] + self.id = interaction.id + self.nonce = None + self.pinned = False + self.type = discord.MessageType.default + self.flags = discord.MessageFlags() + self.reactions = [] + self.reference = None + self.application = None + self.activity = None + self.stickers = [] + self.components = [] + self.role_subscription = None + self.application_id = None + self.position = None + + channel = interaction.channel + if not channel: + raise RuntimeError("Interaction channel is missing, maybe a Discord bug") + + self.guild = interaction.guild + if interaction.guild_id and not interaction.guild: + # act as if this is a DMChannel + assert isinstance(interaction.user, discord.Member) + self.author = interaction.user._user + channel = discord.DMChannel( + me=interaction.client.user, + state=interaction._state, + data={ + "id": channel.id, + "name": str(channel), + "type": 1, + "last_message_id": None, + "recipients": [ + self.author._to_minimal_user_json(), + interaction.client.user._to_minimal_user_json(), + ], + }, # type: ignore + ) + else: + self.author = interaction.user + channel = copy(channel) + + channel.__class__ = type( + InterChannel.__name__, (InterChannel, channel.__class__), {"__slots__": ()} + ) + self.channel = channel # type: ignore + + self._recreate_from_interaction(interaction, prefix) + return self + + def _recreate_from_interaction(self, interaction: discord.Interaction, prefix: str): + assert interaction.data and interaction.client.user + + self.content = f"{prefix}{interaction.namespace.command}" + if interaction.namespace.arguments: + self.content = f"{self.content} {interaction.namespace.arguments}" + if interaction.namespace.attachment: + self.attachments = [interaction.namespace.attachment] + else: + self.attachments = [] + + resolved = interaction.data.get("resolved", {}) + if self.guild: + self.mentions = [ + discord.Member(data=user_data, guild=self.guild, state=self._state) + for user_data in resolved.get("members", {}).values() + ] + else: + self.mentions = [ + discord.User(data=user_data, state=self._state) + for user_data in resolved.get("users", {}).values() + ] + + def to_reference(self, *, fail_if_not_exists: bool = True): + return None + + def to_message_reference_dict(self): + return discord.utils.MISSING + + async def reply(self, *args, **kwargs): + return await self.channel.send(*args, **kwargs) + + def edit(self, *args, **kwargs): + return asyncio.sleep(0, self) diff --git a/onetrueslash/utils.py b/onetrueslash/utils.py new file mode 100644 index 0000000..89e0684 --- /dev/null +++ b/onetrueslash/utils.py @@ -0,0 +1,59 @@ +from contextvars import ContextVar +from typing import TYPE_CHECKING, Any, Generator, Optional + +# discord.ext.commands.GroupMixin has easier typehints to work with +from discord.ext.commands import GroupMixin +from redbot.core import commands + +if TYPE_CHECKING: + from .context import InterContext + + +try: + import regex as re +except ImportError: + import re + + +contexts = ContextVar["InterContext"]("contexts") + + +def valid_app_name(name: str) -> str: + from discord.app_commands.commands import VALID_SLASH_COMMAND_NAME, validate_name + + name = "_".join(re.findall(VALID_SLASH_COMMAND_NAME.pattern.strip("^$"), name.lower())) + return validate_name(name[:32]) + + +class Thinking: + def __init__(self, ctx: "InterContext", *, ephemeral: bool = False): + self.ctx = ctx + self.ephemeral = ephemeral + + def __await__(self) -> Generator[Any, Any, None]: + ctx = self.ctx + interaction = ctx._interaction + if not ctx._deferring and not interaction.response.is_done(): + # yield from is necessary here to force this function to be a generator + # even in the negative case + ctx._deferring = True + return (yield from interaction.response.defer(ephemeral=self.ephemeral).__await__()) + + async def __aenter__(self): + await self + + async def __aexit__(self, *args): + pass + + +def walk_aliases( + group: GroupMixin[Any], /, *, parent: Optional[str] = "", show_hidden: bool = False +) -> Generator[str, None, None]: + for name, command in group.all_commands.items(): + if command.qualified_name == "help": + continue + if not command.enabled or (not show_hidden and command.hidden): + continue + yield f"{parent}{name}" + if isinstance(command, commands.GroupMixin): + yield from walk_aliases(command, parent=f"{parent}{name} ", show_hidden=show_hidden) diff --git a/onthisday/README.rst b/onthisday/README.rst new file mode 100644 index 0000000..b8d3210 --- /dev/null +++ b/onthisday/README.rst @@ -0,0 +1,80 @@ +.. _onthisday: + +========= +OnThisDay +========= + +This is the cog guide for the 'OnThisDay' cog. This guide +contains the collection of commands which you can use in the cog. + +Through this guide, ``[p]`` will always represent your prefix. Replace +``[p]`` with your own prefix when you use these commands in Discord. + +.. note:: + + This guide was last updated for version 2.0.0. Ensure + that you are up to date by running ``[p]cog update onthisday``. + + If there is something missing, or something that needs improving + in this documentation, feel free to create an issue `here `_. + + This documentation is auto-generated everytime this cog receives an update. + +-------------- +About this cog +-------------- + +Find out what happened on a certain day, in multiple different years in history. + +-------- +Commands +-------- + +Here are all the commands included in this cog (2): + ++-------------------------+--------------------------------------------------------------------------+ +| Command | Help | ++=========================+==========================================================================+ +| ``[p]onthisday`` | Find out what happened on this day, in various different years! | +| | | +| | If you want to specify your own date, you can do so by using | +| | `[p]onthisday [date]`. | +| | You can also receive a random year by using `[p]onthisday random [day]`. | ++-------------------------+--------------------------------------------------------------------------+ +| ``[p]onthisday random`` | Find out what happened on this day, in a random year. | +| | | +| | If you want to specify your own date, you can do so by using | +| | `[p]onthisday [date]`. | ++-------------------------+--------------------------------------------------------------------------+ + +------------ +Installation +------------ + +If you haven't added my repo before, lets add it first. We'll call it +"kreusada-cogs" here. + +.. code-block:: + + [p]repo add kreusada-cogs https://github.com/Kreusada/Kreusada-Cogs + +Now, we can install OnThisDay. + +.. code-block:: + + [p]cog install kreusada-cogs onthisday + +Once it's installed, it is not loaded by default. Load it by running the following +command: + +.. code-block:: + + [p]load onthisday + +--------------- +Further Support +--------------- + +For more support, head over to the `cog support server `_, +I have my own channel over there at #support_kreusada-cogs. Feel free to join my +`personal server `_ whilst you're here. diff --git a/onthisday/__init__.py b/onthisday/__init__.py new file mode 100644 index 0000000..f18d0a4 --- /dev/null +++ b/onthisday/__init__.py @@ -0,0 +1,309 @@ +"""The OnThisDay module. Find out what happened on a certain day, in multiple different years in history.""" + +import asyncio +import datetime +import re +from random import choice +from typing import Dict, Iterable, Optional, Union + +import aiohttp +import dateparser +import discord +from redbot.core import commands +from redbot.core.bot import Red +from redbot.core.commands import BadArgument, Context, Converter +from redbot.core.utils import get_end_user_data_statement +from redbot.core.utils.chat_formatting import inline, warning + +__red_end_user_data_statement__ = get_end_user_data_statement(__file__) + +ENDPOINT = "https://byabbe.se/on-this-day/{}/events.json" + +DEFAULT_DESCRIPTION = """ +Please send a valid year from the list of years below. +These are the most significant years for events occuring +on this day. Only years above 0 are included. +""" + +MONTH_MAPPING = { + "1": "january", + "2": "february", + "3": "march", + "4": "april", + "5": "may", + "6": "june", + "7": "july", + "8": "august", + "9": "september", + "10": "october", + "11": "november", + "12": "december", +} + + +def highlight_numerical_data(string): + return re.sub(r"(([\d{1}],?)+)", r"**\1**", string) + + +def retrieve_above_0(year): + return year.strip().isdigit() + + +def columns(years): + m = f"{chr(12644)}\n" # padding + f = lambda s: inline(s.zfill(4)) + for x in range(6, len(years), 6): + m += "\n" + (" " * 5).join(map(f, years[x - 6 : x])) + return m + + +def date_suffix(number) -> str: + number = int(number) + suffixes = {0: "th", 1: "st", 2: "nd", 3: "rd"} + for i in range(4, 10): + suffixes[i] = "th" + return str(number) + suffixes[int(str(number)[-1])] + + +def now() -> datetime.datetime: + return datetime.datetime.now() + + +def current_year() -> int: + return datetime.date.today().year + + +def yield_chunks(l, n): + for i in range(0, len(l), n): + yield l[i : i + n] + + +class DateConverter(Converter): + """Date converter which uses dateparser.parse().""" + + async def convert(self, ctx: Context, arg: str) -> datetime.datetime: + parsed = dateparser.parse(arg) + if parsed is None: + raise BadArgument("Unrecognized date/time.") + if parsed.strftime("%Y") != str(now().strftime("%Y")): + raise BadArgument("Please do not specify a year.") + return parsed + + +class YearDropdown(discord.ui.Select): + def __init__(self, otd: "OnThisDay", /): + self.otd = otd + cy = current_year() + options = [ + discord.SelectOption( + label=year, + description=f"On this day, {cy - int(year)} years ago", + emoji="\N{CLOCK FACE THREE OCLOCK}", + ) + for year in self.otd.year_data + if int(year) in self.otd.year_range + ] + + super().__init__(placeholder="Choose a year...", options=options) + + async def callback(self, interaction: discord.Interaction): + await self.otd.display_events( + interaction, + year=self.values[0], + ) + + +class YearDropdownView(discord.ui.View): + def __init__(self, otd: "OnThisDay"): + super().__init__() + self.add_item(YearDropdown(otd)) + + +class YearRangeDropdown(discord.ui.Select): + """This exists because the number of years dispatched always + exceeds the Select options cap of 25. + """ + + YEAR_RANGES = [ + range(1901), + range(1901, 1951), + range(1951, 2001), + range(2001, current_year() + 1), + ] + + YEAR_RANGES_HUMANIZED = ["0 - 1900", "1901 - 1950", "1951 - 2000", "2001 - present"] + + def __init__(self, otd: "OnThisDay", /): + self.otd = otd + + emojis = [ + "\N{LARGE RED CIRCLE}", + "\N{LARGE ORANGE CIRCLE}", + "\N{LARGE YELLOW CIRCLE}", + "\N{LARGE GREEN CIRCLE}", + ] + + options = [ + discord.SelectOption( + label=self.YEAR_RANGES_HUMANIZED[i], + value=i, + description=f"Get choice from {self.YEAR_RANGES_HUMANIZED[i].replace('-', 'to')}", + emoji=emojis[i], + ) + for i in range(4) + ] + + super().__init__(placeholder="Choose a year range...", options=options) + + async def callback(self, interaction: discord.Interaction): + self.otd.year_range = self.YEAR_RANGES[int(self.values[0])] + await interaction.response.edit_message( + content=f"Selected year range: **{self.YEAR_RANGES_HUMANIZED[int(self.values[0])]}**\nSelect a year from the list of available years.", + view=YearDropdownView(self.otd), + ) + + +class YearRangeDropdownView(discord.ui.View): + def __init__(self, otd: "OnThisDay"): + super().__init__() + self.add_item(YearRangeDropdown(otd)) + + +class ButtonView(discord.ui.View): + def __init__(self, buttons: dict[str, str]): + super().__init__() + for label, url in buttons.items(): + self.add_item(discord.ui.Button(label=label, url=url)) + + +class OnThisDay(commands.Cog): + """Find out what happened on a certain day, in multiple different years in history.""" + + __version__ = "2.0.0" + __author__ = "Kreusada" + + def __init__(self, bot: Red): + self.bot = bot + self.session = aiohttp.ClientSession() + self.date_number: Optional[str] = None + self.month_number: Optional[str] = None + self.year: Optional[str] = None + self.year_data = {} + self.year_range: Optional[range] = None + self.date_wiki: Optional[str] = None + + def format_help_for_context(self, ctx: commands.Context) -> str: + context = super().format_help_for_context(ctx) + return f"{context}\n\nAuthor: {self.__author__}\nVersion: {self.__version__}" + + async def red_delete_data_for_user(self, **kwargs): + """Nothing to delete""" + return + + async def cog_unload(self) -> None: + await self.session.close() + + async def display_events( + self, + ctx: Union[commands.Context, discord.Interaction], + *, + year: str, + ): + event = self.year_data[year] + years_ago = int(self.year) - int("".join(filter(str.isdigit, year))) + content = ( + event["content"] + + "\n\n" + + f"This event occured on the __{date_suffix(self.date_number)} of {MONTH_MAPPING[self.month_number].capitalize()}, {year}__." + ) + embed = discord.Embed( + title=f"On this day, {years_ago} years ago...", + description=highlight_numerical_data(content), + color=await self.bot.get_embed_colour(ctx.channel), + ) + embed.set_footer(text="See the below links for related wikipedia articles") + _d = { + f"The year '{year}'": "https://en.wikipedia.org/wiki/" + year, + f"The date '{self.date_number.zfill(2)}/{self.month_number.zfill(2)}'": self.date_wiki, + } + embed.add_field( + name="Other significant events", + value="\n".join(f"- [{k}]({v})" for k, v in _d.items()), + inline=False, + ) + wiki_dict = {w["title"]: w["wikipedia"] for w in event["wikipedia"]} + if isinstance(ctx, discord.Interaction): + send_method = ctx.response.edit_message + else: + send_method = ctx.send + await send_method(content=None, embed=embed, view=ButtonView(wiki_dict)) + + async def run_otd( + self, + ctx: commands.Context, + date: Optional[datetime.datetime], + random: bool = False, + ): + self.cache_date(date) + try: + async with self.session.get( + ENDPOINT.format(f"{self.month_number}/{self.date_number}") + ) as session: + if session.status != 200: + return await ctx.maybe_send_embed( + warning("An error occured whilst retrieving information for this day.") + ) + content = await session.json() + except aiohttp.ClientError: + return await ctx.maybe_send_embed( + warning("An error occured whilst retrieving information for this day.") + ) + else: + self.date_wiki = content["wikipedia"] + events = filter(lambda x: retrieve_above_0(x["year"]), content["events"]) + data = { + e["year"]: {"content": e["description"], "wikipedia": e["wikipedia"]} + for e in events + } + self.year_data = data + if random: + await self.display_events(ctx, year=choice(list(data.keys()))) + else: + await ctx.send( + "Choose a year range to select from:", + view=YearRangeDropdownView(self), + ) + + def cache_date(self, date: Optional[datetime.datetime], /) -> Dict[str, int]: + if date is None: + date = now() + + self.month_number = date.strftime(r"%m").lstrip("0") + self.date_number = date.strftime(r"%d").lstrip("0") + self.year = date.strftime(r"%Y") + + @commands.has_permissions(embed_links=True) + @commands.group(invoke_without_command=True, aliases=["otd"]) + async def onthisday(self, ctx: commands.Context, *, date: DateConverter = None): + """Find out what happened on this day, in various different years! + + If you want to specify your own date, you can do so by using + `[p]onthisday [date]`. + You can also receive a random year by using `[p]onthisday random [day]`. + """ + await ctx.typing() + await self.run_otd(ctx, date=date, random=False) + + @onthisday.command() + async def random(self, ctx: commands.Context, *, date: DateConverter = None): + """Find out what happened on this day, in a random year. + + If you want to specify your own date, you can do so by using + `[p]onthisday [date]`. + """ + await ctx.typing() + await self.run_otd(ctx, date=date, random=True) + + +async def setup(bot: Red): + await bot.add_cog(OnThisDay(bot)) diff --git a/onthisday/info.json b/onthisday/info.json new file mode 100644 index 0000000..a117abf --- /dev/null +++ b/onthisday/info.json @@ -0,0 +1,24 @@ +{ + "author": [ + "Kreusada" + ], + "description": "Find out what happened today, in multiple different years in history.", + "disabled": false, + "end_user_data_statement": "This cog does not persistently store data or metadata about users.", + "hidden": false, + "install_msg": "Thanks for installing, have fun. Please refer to my docs if you need any help: https://kreusadacogs.readthedocs.io/en/latest/cog_onthisday.html", + "name": "OnThisDay", + "required_cogs": {}, + "requirements": [ + "dateparser" + ], + "short": "Find out what happened today, in multiple different years in history.", + "tags": [ + "On This Day", + "History", + "Year", + "Time", + "Date" + ], + "type": "COG" +} diff --git a/pokemonduel/__init__.py b/pokemonduel/__init__.py new file mode 100644 index 0000000..3dbde07 --- /dev/null +++ b/pokemonduel/__init__.py @@ -0,0 +1,6 @@ +from .commands import PokemonDuel + +__red_end_user_data_statement__ = "This cog stores user ids in order to track your party of pokemon." + +async def setup(bot): + await bot.add_cog(PokemonDuel(bot)) diff --git a/pokemonduel/battle.py b/pokemonduel/battle.py new file mode 100644 index 0000000..b8a7214 --- /dev/null +++ b/pokemonduel/battle.py @@ -0,0 +1,491 @@ +import asyncio +import random +from .buttons import SwapPromptView +from .data import generate_main_battle_message, generate_text_battle_message, find +from .enums import Ability, DamageClass +from .misc import ExpiringEffect, Weather, Terrain + + +class Battle(): + """ + Represents a battle between two trainers and their pokemon. + + This object holds all necessary information for a battle & runs the battle. + """ + def __init__(self, ctx, channel, trainer1, trainer2, *, inverse_battle=False): + self.ctx = ctx + self.channel = channel + self.trainer1 = trainer1 + for poke in trainer1.party: + poke.held_item.battle = self + self.trainer2 = trainer2 + for poke in trainer2.party: + poke.held_item.battle = self + self.bg_num = random.randint(1, 4) + self.trick_room = ExpiringEffect(0) + self.magic_room = ExpiringEffect(0) + self.wonder_room = ExpiringEffect(0) + self.gravity = ExpiringEffect(0) + self.weather = Weather(self) + self.terrain = Terrain(self) + self.plasma_fists = False + self.turn = 0 + self.last_move_effect = None + self.metronome_moves_raw = [] + #(AttackerType, DefenderType): Effectiveness + self.type_effectiveness = {} + self.inverse_battle = inverse_battle + self.msg = "" + + async def run(self): + """Runs the duel.""" + self.msg = "" + # Moves which are immune to metronome + immune_ids = [ + 68, 102, 119, 144, 165, 166, 168, 173, 182, 194, 197, 203, 214, 243, 264, 266, + 267, 270, 271, 274, 289, 343, 364, 382, 383, 415, 448, 469, 476, 495, 501, 511, + 516, 546, 547, 548, 553, 554, 555, 557, 561, 562, 578, 588, 591, 592, 593, 596, + 606, 607, 614, 615, 617, 621, 661, 671, 689, 690, 704, 705, 712, 720, 721, 722 + ] + # Moves which are not coded in the bot + uncoded_ids = [ + 266, 270, 476, 495, 502, 511, 597, 602, 603, 607, 622, 623, 624, 625, 626, 627, + 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, + 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, 671, + 695, 696, 697, 698, 699, 700, 701, 702, 703, 719, 723, 724, 725, 726, 727, 728, + 811, 10001, 10002, 10003, 10004, 10005, 10006, 10007, 10008, 10009, 10010, 10011, + 10012, 10013, 10014, 10015, 10016, 10017, 10018 + ] + ignored_ids = list(set(immune_ids) | set(uncoded_ids)) + self.metronome_moves_raw = await find(self.ctx, "moves", {"id": {"$nin": ignored_ids}}) + for te in await find(self.ctx, "type_effectiveness", {}): + self.type_effectiveness[(te["damage_type_id"], te["target_type_id"])] = te["damage_factor"] + #This calculation only uses the primative speed attr as the pokes have not been fully initiaized yet. + if self.trainer1.current_pokemon.get_raw_speed() > self.trainer2.current_pokemon.get_raw_speed(): + self.msg += self.trainer1.current_pokemon.send_out(self.trainer2.current_pokemon, self) + self.msg += self.trainer2.current_pokemon.send_out(self.trainer1.current_pokemon, self) + else: + self.msg += self.trainer2.current_pokemon.send_out(self.trainer1.current_pokemon, self) + self.msg += self.trainer1.current_pokemon.send_out(self.trainer2.current_pokemon, self) + await self.send_msg() + winner = None + while True: + # Swap pokes for any users w/o an active poke + while self.trainer1.current_pokemon is None or self.trainer2.current_pokemon is None: + swapped1 = False + swapped2 = False + + if self.trainer1.current_pokemon is None: + swapped1 = True + winner = await self.run_swap(self.trainer1, self.trainer2) + if winner: + break + + if self.trainer2.current_pokemon is None: + swapped2 = True + winner = await self.run_swap(self.trainer2, self.trainer1) + if winner: + break + + # Send out the pokes that were just swapped to + if swapped1 and swapped2: + if self.trainer1.current_pokemon.get_raw_speed() > self.trainer2.current_pokemon.get_raw_speed(): + self.msg += self.trainer1.current_pokemon.send_out(self.trainer2.current_pokemon, self) + if not self.trainer1.has_alive_pokemon(): + self.msg += f"{self.trainer2.name} wins!\n" + winner = self.trainer2 + break + self.msg += self.trainer2.current_pokemon.send_out(self.trainer1.current_pokemon, self) + if not self.trainer2.has_alive_pokemon(): + self.msg += f"{self.trainer1.name} wins!\n" + winner = self.trainer1 + break + else: + self.msg += self.trainer2.current_pokemon.send_out(self.trainer1.current_pokemon, self) + if not self.trainer2.has_alive_pokemon(): + self.msg += f"{self.trainer1.name} wins!\n" + winner = self.trainer1 + break + self.msg += self.trainer1.current_pokemon.send_out(self.trainer2.current_pokemon, self) + if not self.trainer1.has_alive_pokemon(): + self.msg += f"{self.trainer2.name} wins!\n" + winner = self.trainer2 + break + elif swapped1: + self.msg += self.trainer1.current_pokemon.send_out(self.trainer2.current_pokemon, self) + if not self.trainer1.has_alive_pokemon(): + self.msg += f"{self.trainer2.name} wins!\n" + winner = self.trainer2 + break + elif swapped2: + self.msg += self.trainer2.current_pokemon.send_out(self.trainer1.current_pokemon, self) + if not self.trainer2.has_alive_pokemon(): + self.msg += f"{self.trainer1.name} wins!\n" + winner = self.trainer1 + break + # Handle breaking out of the main game loop when a winner happens in the poke select loop + if winner: + break + + # Get trainer actions + await self.send_msg() + + self.trainer1.event.clear() + self.trainer2.event.clear() + if not self.trainer1.is_human(): + self.trainer1.move(self.trainer2.current_pokemon, self) + if not self.trainer2.is_human(): + self.trainer2.move(self.trainer1.current_pokemon, self) + + battle_view = await generate_main_battle_message(self) + await self.trainer1.event.wait() + await self.trainer2.event.wait() + battle_view.stop() + + # Check for forfeits + if self.trainer1.selected_action is None and self.trainer2.selected_action is None: + await self.channel.send("Both players forfeited...") + return #TODO: ??? + if self.trainer1.selected_action is None: + self.msg += f"{self.trainer1.name} forfeited, {self.trainer2.name} wins!\n" + winner = self.trainer2 + break + if self.trainer2.selected_action is None: + self.msg += f"{self.trainer2.name} forfeited, {self.trainer1.name} wins!\n" + winner = self.trainer1 + break + + # Run setup for both pokemon + t1, t2 = self.who_first() + if t1.current_pokemon is not None and t2.current_pokemon is not None: + if not isinstance(t1.selected_action, int): + self.msg += t1.selected_action.setup(t1.current_pokemon, t2.current_pokemon, self) + if not t1.has_alive_pokemon(): + self.msg += f"{t2.name} wins!\n" + winner = t2 + break + if not t2.has_alive_pokemon(): + self.msg += f"{t1.name} wins!\n" + winner = t1 + break + if t1.current_pokemon is not None and t2.current_pokemon is not None: + if not isinstance(t2.selected_action, int): + self.msg += t2.selected_action.setup(t2.current_pokemon, t1.current_pokemon, self) + if not t2.has_alive_pokemon(): + self.msg += f"{t1.name} wins!\n" + winner = t1 + break + if not t1.has_alive_pokemon(): + self.msg += f"{t2.name} wins!\n" + winner = t2 + break + + # Run moves for both pokemon + # Trainer 1's move + ran_megas = False + if not isinstance(t1.selected_action, int): + self.handle_megas(t1, t2) + ran_megas = True + + if t1.current_pokemon is not None and t2.current_pokemon is not None: + if isinstance(t1.selected_action, int): + self.msg += t1.current_pokemon.remove(self) + t1.switch_poke(t1.selected_action, mid_turn=True) + self.msg += t1.current_pokemon.send_out(t2.current_pokemon, self) + if t1.current_pokemon is not None: + t1.current_pokemon.has_moved = True + else: + self.msg += t1.selected_action.use(t1.current_pokemon, t2.current_pokemon, self) + if not t1.has_alive_pokemon(): + self.msg += f"{t2.name} wins!\n" + winner = t2 + break + if not t2.has_alive_pokemon(): + self.msg += f"{t1.name} wins!\n" + winner = t1 + break + + # Pokes who die do NOT get attacked, but pokes who retreat *do* + if t1.mid_turn_remove: + winner = await self.run_swap(t1, t2, mid_turn=True) + if winner: + break + + # EDGE CASE - Moves that DO NOT target the opponent (and swapping) SHOULD run + # even if there is no other poke on the field. Right now everything is hardcoded + # to require two pokes to work, on a rewrite the `use` function should be the + # one handling the job of checking if the attacked poke is `None` before using a + # move that targets opponents. + if ( + t1.current_pokemon is None and t2.current_pokemon is not None + and (isinstance(t2.selected_action, int) or not t2.selected_action.targets_opponent()) + ): + winner = await self.run_swap(t1, t2, mid_turn=True) + if winner: + break + + self.msg += "\n" + + # Trainer 2's move + if not ran_megas and not isinstance(t2.selected_action, int): + self.handle_megas(t1, t2) + ran_megas = True + + if t1.current_pokemon is not None and t2.current_pokemon is not None: + if isinstance(t2.selected_action, int): + self.msg += t2.current_pokemon.remove(self) + t2.switch_poke(t2.selected_action, mid_turn=True) + self.msg += t2.current_pokemon.send_out(t1.current_pokemon, self) + if t2.current_pokemon is not None: + t2.current_pokemon.has_moved = True + else: + self.msg += t2.selected_action.use(t2.current_pokemon, t1.current_pokemon, self) + if not t2.has_alive_pokemon(): + self.msg += f"{t1.name} wins!\n" + winner = t1 + break + if not t1.has_alive_pokemon(): + self.msg += f"{t2.name} wins!\n" + winner = t2 + break + + self.msg += "\n" + if t2.mid_turn_remove: + # This DOES need to be here, otherwise end of turn effects aren't handled right + winner = await self.run_swap(t2, t1, mid_turn=True) + if winner: + break + + if not t2.has_alive_pokemon(): + self.msg += f"{t1.name} wins!\n" + winner = t1 + break + if not t1.has_alive_pokemon(): + self.msg += f"{t2.name} wins!\n" + winner = t2 + break + + if not ran_megas: + self.handle_megas(t1, t2) + + #Progress turns + self.turn += 1 + self.plasma_fists = False + if self.weather.next_turn(): + self.msg += "The weather cleared!\n" + if self.terrain.next_turn(): + self.msg += "The terrain cleared!\n" + self.last_move_effect = None + t1, t2 = self.who_first(False) + self.msg += t1.next_turn(self) + if t1.current_pokemon is not None: + self.msg += t1.current_pokemon.next_turn(t2.current_pokemon, self) + if not t1.has_alive_pokemon(): + self.msg += f"{t2.name} wins!\n" + winner = t2 + break + if not t2.has_alive_pokemon(): + self.msg += f"{t1.name} wins!\n" + winner = t1 + break + self.msg += t2.next_turn(self) + if t2.current_pokemon is not None: + self.msg += t2.current_pokemon.next_turn(t1.current_pokemon, self) + if not t2.has_alive_pokemon(): + self.msg += f"{t1.name} wins!\n" + winner = t1 + break + if not t1.has_alive_pokemon(): + self.msg += f"{t2.name} wins!\n" + winner = t2 + break + if self.trick_room.next_turn(): + self.msg += "The Dimensions returned back to normal!\n" + if self.gravity.next_turn(): + self.msg += "Gravity returns to normal!\n" + if self.magic_room.next_turn(): + self.msg += "The room returns to normal, and held items regain their effect!\n" + if self.wonder_room.next_turn(): + self.msg += "The room returns to normal, and stats swap back to what they were before!\n" + + #The game is over, and we broke out before sending, send the remaining cache + await self.send_msg() + return winner + + def who_first(self, check_move=True): + """ + Determines which move should go. + + Returns the two trainers and their moves, in the order they should go. + """ + T1FIRST = (self.trainer1, self.trainer2) + T2FIRST = (self.trainer2, self.trainer1) + + if self.trainer1.current_pokemon is None or self.trainer2.current_pokemon is None: + return T1FIRST + + speed1 = self.trainer1.current_pokemon.get_speed(self) + speed2 = self.trainer2.current_pokemon.get_speed(self) + + #Pokes that are switching go before pokes making other moves + if check_move: + if isinstance(self.trainer1.selected_action, int) and isinstance(self.trainer2.selected_action, int): + if self.trainer1.current_pokemon.get_raw_speed() > self.trainer2.current_pokemon.get_raw_speed(): + return T1FIRST + return T2FIRST + if isinstance(self.trainer1.selected_action, int): + return T1FIRST + if isinstance(self.trainer2.selected_action, int): + return T2FIRST + + #Priority brackets & abilities + if check_move: + prio1 = self.trainer1.selected_action.get_priority(self.trainer1.current_pokemon, self.trainer2.current_pokemon, self) + prio2 = self.trainer2.selected_action.get_priority(self.trainer2.current_pokemon, self.trainer1.current_pokemon, self) + if prio1 > prio2: + return T1FIRST + if prio2 > prio1: + return T2FIRST + t1_quick = False + t2_quick = False + # Quick draw/claw + if ( + self.trainer1.current_pokemon.ability() == Ability.QUICK_DRAW + and self.trainer1.selected_action.damage_class != DamageClass.STATUS + and random.randint(1, 100) <= 30 + ): + t1_quick = True + if ( + self.trainer2.current_pokemon.ability() == Ability.QUICK_DRAW + and self.trainer2.selected_action.damage_class != DamageClass.STATUS + and random.randint(1, 100) <= 30 + ): + t2_quick = True + if ( + self.trainer1.current_pokemon.held_item == "quick-claw" + and random.randint(1, 100) <= 20 + ): + t1_quick = True + if ( + self.trainer2.current_pokemon.held_item == "quick-claw" + and random.randint(1, 100) <= 20 + ): + t2_quick = True + #if both pokemon activate a quick, priority bracket proceeds as normal + if t1_quick and not t2_quick: + return T1FIRST + if t2_quick and not t1_quick: + return T2FIRST + # Move last in prio bracket + t1_slow = False + t2_slow = False + if self.trainer1.current_pokemon.ability() == Ability.STALL: + t1_slow = True + if ( + self.trainer1.current_pokemon.ability() == Ability.MYCELIUM_MIGHT + and self.trainer1.selected_action.damage_class == DamageClass.STATUS + ): + t1_slow = True + if self.trainer2.current_pokemon.ability() == Ability.STALL: + t2_slow = True + if ( + self.trainer2.current_pokemon.ability() == Ability.MYCELIUM_MIGHT + and self.trainer2.selected_action.damage_class == DamageClass.STATUS + ): + t2_slow = True + if t1_slow and t2_slow: + if speed1 == speed2: + return random.choice([T1FIRST, T2FIRST]) + if speed1 > speed2: + return T2FIRST + return T1FIRST + if t1_slow: + return T2FIRST + if t2_slow: + return T1FIRST + + #Equal speed + if speed1 == speed2: + return random.choice([T1FIRST, T2FIRST]) + + #Trick room + if self.trick_room.active(): + if speed1 > speed2: + return T2FIRST + return T1FIRST + + #Default handling + if speed1 > speed2: + return T1FIRST + return T2FIRST + + async def send_msg(self): + """ + Send the msg in a boilerplate embed. + + Handles the message being too long. + """ + await generate_text_battle_message(self) + + async def run_swap(self, swapper, othertrainer, *, mid_turn=False): + """ + Called when swapper does not have a pokemon selected, and needs a new one. + + Prompts the swapper to pick a pokemon. + If mid_turn is set to True, the pokemon is being swapped in the middle of a turn (NOT at the start of a turn). + Returns None if the trainer swapped, and the trainer that won if they did not. + """ + await self.send_msg() + + swapper.event.clear() + if swapper.is_human(): + swap_view = SwapPromptView(swapper, othertrainer, self, mid_turn=mid_turn) + await self.channel.send( + f"{swapper.name}, pick a pokemon to swap to!", + view=swap_view + ) + else: + swapper.swap(othertrainer, self, mid_turn=mid_turn) + + try: + await swapper.event.wait() + except asyncio.TimeoutError: + self.msg += f"{swapper.name} did not select a poke, {othertrainer.name} wins!\n" + return othertrainer + + if swapper.is_human(): + swap_view.stop() + + if swapper.current_pokemon is None: + self.msg += f"{swapper.name} did not select a poke, {othertrainer.name} wins!\n" + return othertrainer + + if mid_turn: + self.msg += swapper.current_pokemon.send_out(othertrainer.current_pokemon, self) + if swapper.current_pokemon is not None: + swapper.current_pokemon.has_moved = True + + return None + + def handle_megas(self, t1, t2): + """Handle mega evolving pokemon who mega evolve this turn.""" + for at, dt in ((t1, t2), (t2, t1)): + if at.current_pokemon is not None and at.current_pokemon.should_mega_evolve: + # Bit of a hack, since it is in its mega form and dashes are removed from `name`, it will show as " mega evolved!". + if (at.current_pokemon.held_item == "mega-stone" or at.current_pokemon._name == "Rayquaza") and at.current_pokemon.form(at.current_pokemon._name + "-mega"): + self.msg += f"{at.current_pokemon.name} evolved!\n" + elif at.current_pokemon.held_item == "mega-stone-x" and at.current_pokemon.form(at.current_pokemon._name + "-mega-x"): + self.msg += f"{at.current_pokemon.name} evolved!\n" + elif at.current_pokemon.held_item == "mega-stone-y" and at.current_pokemon.form(at.current_pokemon._name + "-mega-y"): + self.msg += f"{at.current_pokemon.name} evolved!\n" + else: + raise ValueError("expected to mega evolve but no valid mega condition") + at.current_pokemon.ability_id = at.current_pokemon.mega_ability_id + at.current_pokemon.starting_ability_id = at.current_pokemon.mega_ability_id + at.current_pokemon.type_ids = at.current_pokemon.mega_type_ids.copy() + at.current_pokemon.starting_type_ids = at.current_pokemon.mega_type_ids.copy() + self.msg += at.current_pokemon.send_out_ability(dt.current_pokemon, self) + at.has_mega_evolved = True + + def __repr__(self): + return f"Battle(trainer1={self.trainer1!r}, trainer2={self.trainer2!r})" diff --git a/pokemonduel/buttons.py b/pokemonduel/buttons.py new file mode 100644 index 0000000..9de8f35 --- /dev/null +++ b/pokemonduel/buttons.py @@ -0,0 +1,377 @@ +import discord +import asyncio +from .move import Move + +# pylint: disable=C0116,W0613,W0221 +BUTTON_TIMEOUT = 60 + + +class DuelAcceptView(discord.ui.View): + """View to accept a duel.""" + def __init__(self, ctx: "commands.Context", opponent: discord.Member): + super().__init__(timeout=BUTTON_TIMEOUT) + self.ctx = ctx + self.confirm = False + self.event = asyncio.Event() + self.opponent = opponent + + @discord.ui.button(label="Accept", style=discord.ButtonStyle.green) + async def accept(self, interaction, button): + self.confirm = True + await interaction.response.edit_message(view=None) + self.stop() + + @discord.ui.button(label="Reject", style=discord.ButtonStyle.red) + async def reject(self, interaction, button): + await interaction.response.edit_message(view=None) + self.stop() + + async def interaction_check(self, interaction): + if interaction.user.id != self.opponent.id: + await interaction.response.send_message(content="You are not allowed to interact with this button.", ephemeral=True) + return False + return True + + async def on_timeout(self): + await self.message.edit(view=None) + self.stop() + + async def on_error(self, interaction, error, item): + await self.ctx.cog.log.error("Exception in a button.", exc_info=error) + + +class PreviewPromptView(discord.ui.View): + """Prompts a user to select their lead pokemon when previewing both player's parties.""" + def __init__(self, battle): + super().__init__(timeout=BUTTON_TIMEOUT) + self.battle = battle + self.child_views = [] + + @discord.ui.button(label="Select a lead pokemon", style=discord.ButtonStyle.primary) + async def actions(self, interaction, button): + if interaction.user.id == self.battle.trainer1.id: + trainer = self.battle.trainer1 + else: + trainer = self.battle.trainer2 + view = LeadView(trainer, self.battle) + self.child_views.append(view) + await interaction.response.send_message(content="Pick a pokemon to lead with:", view=view, ephemeral=True) + + async def interaction_check(self, interaction): + if interaction.user.id == self.battle.trainer1.id: + if self.battle.trainer1.event.is_set(): + await interaction.response.send_message(content="You have already selected a lead.", ephemeral=True) + return False + return True + if interaction.user.id == self.battle.trainer2.id: + if self.battle.trainer2.event.is_set(): + await interaction.response.send_message(content="You have already selected a lead.", ephemeral=True) + return False + return True + return False + + async def on_timeout(self): + self.battle.trainer1.event.set() + self.battle.trainer2.event.set() + + async def on_error(self, interaction, error, item): + self.battle.ctx.cog.log.error("Exception in a button.", exc_info=error) + + def stop(self): + """Override to stop child views when this view is stopped.""" + for view in self.child_views: + view.stop() + super().stop() + + +class LeadView(discord.ui.View): + """Shows the user their pokemon, allowing them to click one to make their lead to.""" + def __init__(self, trainer, battle): + super().__init__(timeout=BUTTON_TIMEOUT) + self.trainer = trainer + self.battle = battle + for poke in trainer.party: + self.add_item(LeadButton(poke)) + + async def on_error(self, interaction, error, item): + self.battle.ctx.cog.log.error("Exception in a button.", exc_info=error) + + +class LeadButton(discord.ui.Button): + """A button that makes the pokemon the user's lead when pressed.""" + def __init__(self, poke): + super().__init__(style=discord.ButtonStyle.secondary, label=f"{poke._name} | {poke.hp}hp") + self.poke = poke + + async def callback(self, interaction): + content = f"You will lead with {self.poke.name}. Waiting for opponent." + self.view.trainer.switch_poke(self.view.trainer.party.index(self.poke)) + self.view.trainer.event.set() + await interaction.response.edit_message(content=content, view=None) + + +class BattlePromptView(discord.ui.View): + """Prompts users to select an action for their turn.""" + def __init__(self, battle): + super().__init__(timeout=BUTTON_TIMEOUT) + self.battle = battle + self.turn = battle.turn + self.child_views = [] + + @discord.ui.button(label="View your actions", style=discord.ButtonStyle.primary) + async def actions(self, interaction, button): + if interaction.user.id == self.battle.trainer1.id: + trainer = self.battle.trainer1 + opponent = self.battle.trainer2 + else: + trainer = self.battle.trainer2 + opponent = self.battle.trainer1 + view = MoveSelectView(self.battle, trainer, opponent) + self.child_views.append(view) + await interaction.response.send_message(content="Pick an action:", view=view, ephemeral=True) + + async def interaction_check(self, interaction): + if self.battle.turn != self.turn: + await interaction.response.send_message(content="This button has expired.", ephemeral=True) + return False + if self.battle.trainer1.is_human() and interaction.user.id == self.battle.trainer1.id: + if self.battle.trainer1.selected_action is not None: + await interaction.response.send_message(content="You have already selected an action.", ephemeral=True) + return False + return True + if self.battle.trainer2.is_human() and interaction.user.id == self.battle.trainer2.id: + if self.battle.trainer2.selected_action is not None: + await interaction.response.send_message(content="You have already selected an action.", ephemeral=True) + return False + return True + return False + + async def on_timeout(self): + self.battle.trainer1.event.set() + self.battle.trainer2.event.set() + + async def on_error(self, interaction, error, item): + self.battle.ctx.cog.log.error("Exception in a button.", exc_info=error) + + def stop(self): + """Override to stop child views when this view is stopped.""" + for view in self.child_views: + view.stop() + super().stop() + + +class MoveSelectView(discord.ui.View): + """Prompts the user to pick a move, enter the swap pokes view, or cancel the duel.""" + def __init__(self, battle, trainer, opponent): + super().__init__(timeout=BUTTON_TIMEOUT) + self.battle = battle + self.turn = battle.turn + self.trainer = trainer + self.opponent = opponent + self.child_views = [] + status_code, movedata = trainer.valid_moves(opponent.current_pokemon) + if status_code == "forced": + trainer.selected_action = movedata + trainer.event.set() + self.add_item(discord.ui.Button(style=discord.ButtonStyle.secondary, label="You were forced to play:", disabled=True)) + self.add_item(MoveButton(movedata, disabled=True)) + return + swapdata = trainer.valid_swaps(opponent.current_pokemon, battle) + if status_code == "struggle": + self.add_item(MoveButton(Move.struggle())) + self.add_item(SwapRequestButton(disabled=not swapdata)) + self.add_item(ForfeitButton(row=0)) + return + + for idx, move in enumerate(trainer.current_pokemon.moves): + self.add_item(MoveButton(move, disabled=idx not in movedata, row=idx // 2)) + self.add_item(SwapRequestButton(disabled=not swapdata)) + self.add_item(ForfeitButton()) + if ( + trainer.current_pokemon is not None + and trainer.current_pokemon.mega_type_ids is not None + and not trainer.has_mega_evolved + ): + self.add_item(MegaEvolveButton()) + + async def interaction_check(self, interaction): + if self.battle.turn != self.turn: + await interaction.response.send_message(content="This button has expired.", ephemeral=True) + return False + # Should never be hit, but just in case :P + if interaction.user.id != self.trainer.id: + await interaction.response.send_message(content="You are not allowed to interact with this button.", ephemeral=True) + return False + if self.trainer.selected_action is not None: + await interaction.response.send_message(content="You have already selected an action.", ephemeral=True) + return False + return True + + async def on_error(self, interaction, error, item): + self.battle.ctx.cog.log.error("Exception in a button.", exc_info=error) + + def stop(self): + """Override to stop child views when this view is stopped.""" + for view in self.child_views: + view.stop() + super().stop() + + +class MoveButton(discord.ui.Button): + """A button that represents a selection of a specific move.""" + def __init__(self, move, *, disabled=False, row=0): + label = f"{move.pretty_name}" + if move.id != 165: + label += f" | {move.pp}pp" + super().__init__(style=discord.ButtonStyle.secondary, label=label, disabled=disabled, row=row) + self.move = move + + async def callback(self, interaction): + self.view.trainer.selected_action = self.move + self.view.trainer.event.set() + await interaction.response.edit_message(content=f"You picked {self.move.pretty_name}. Waiting for opponent.", view=None) + + +class SwapRequestButton(discord.ui.Button): + """A button that represents a request to swap pokemon.""" + def __init__(self, *, disabled=False): + super().__init__(style=discord.ButtonStyle.primary, label="Swap pokemon", disabled=disabled) + + async def callback(self, interaction): + view = SwapView(self.view.trainer, self.view.opponent, self.view.battle, set_move=True) + self.view.child_views.append(view) + await interaction.response.edit_message(content="Pick a pokemon:", view=view) + + +class DuelForfeitView(discord.ui.View): + """View to forfeit a duel.""" + def __init__(self, trainer): + super().__init__(timeout=BUTTON_TIMEOUT) + self.trainer = trainer + self.confirm = False + + @discord.ui.button(label="Forfeit", style=discord.ButtonStyle.red) + async def actuallyforfeit(self, interaction, button): + await interaction.response.edit_message(content="Forfeited.", view=None) + self.confirm = True + self.stop() + + @discord.ui.button(label="Cancel", style=discord.ButtonStyle.secondary) + async def cancel(self, interaction, button): + await interaction.response.edit_message(content="Not forfeiting.", view=None) + self.stop() + + async def interaction_check(self, interaction): + if interaction.user.id != self.trainer.id: + await interaction.response.send_message(content="You are not allowed to interact with this button.", ephemeral=True) + return False + return True + + async def on_error(self, interaction, error, item): + await self.trainer.party[0].held_item.battle.ctx.cog.log.error("Exception in a button.", exc_info=error) + + +class ForfeitButton(discord.ui.Button): + """A button that forfeits the game when pressed.""" + def __init__(self, *, row=1): + super().__init__(style=discord.ButtonStyle.danger, label="Forfeit duel", row=row) + + async def callback(self, interaction): + view = DuelForfeitView(self.view.trainer) + self.view.child_views.append(view) + await interaction.response.send_message(content="Are you sure you want to forfeit?", view=view, ephemeral=True) + await view.wait() + if view.confirm: + self.view.trainer.event.set() + + +class SwapPromptView(discord.ui.View): + """Prompts the trainer to view their pokemon.""" + def __init__(self, trainer, opponent, battle, *, mid_turn=False): + super().__init__(timeout=BUTTON_TIMEOUT) + self.trainer = trainer + self.opponent = opponent + self.battle = battle + self.turn = battle.turn + self.mid_turn = mid_turn + self.child_views = [] + + @discord.ui.button(label="View your pokemon", style=discord.ButtonStyle.primary) + async def swap(self, interaction, button): + view = SwapView(self.trainer, self.opponent, self.battle, mid_turn=self.mid_turn) + self.child_views.append(view) + await interaction.response.send_message( + content="Pick a pokemon to swap to:", + view=view, + ephemeral=True + ) + + async def interaction_check(self, interaction): + if self.battle.turn != self.turn: + await interaction.response.send_message(content="This button has expired.", ephemeral=True) + return False + if interaction.user.id != self.trainer.id: + await interaction.response.send_message(content="You are not allowed to interact with this button.", ephemeral=True) + return False + return True + + async def on_timeout(self): + self.battle.trainer1.event.set() + self.battle.trainer2.event.set() + + async def on_error(self, interaction, error, item): + self.battle.ctx.cog.log.error("Exception in a button.", exc_info=error) + + def stop(self): + """Override to stop child views when this view is stopped.""" + for view in self.child_views: + view.stop() + super().stop() + + +class SwapView(discord.ui.View): + """Shows the user their pokemon, allowing them to click one to swap to.""" + def __init__(self, trainer, opponent, battle, *, set_move=False, mid_turn=False): + super().__init__(timeout=BUTTON_TIMEOUT) + self.trainer = trainer + self.opponent = opponent + self.battle = battle + self.set_move = set_move + self.mid_turn = mid_turn + swapdata = trainer.valid_swaps(opponent.current_pokemon, battle, check_trap=set_move) + for idx, poke in enumerate(trainer.party): + self.add_item(SwapButton(poke, disabled=idx not in swapdata)) + + async def on_error(self, interaction, error, item): + self.battle.ctx.cog.log.error("Exception in a button.", exc_info=error) + + +class SwapButton(discord.ui.Button): + """A button that swaps to that pokemon when pressed.""" + def __init__(self, poke, *, disabled=False): + super().__init__(style=discord.ButtonStyle.secondary, label=f"{poke._name} | {poke.hp}hp", disabled=disabled) + self.poke = poke + + async def callback(self, interaction): + content = f"You picked {self.poke.name}." + if self.view.set_move: + self.view.trainer.selected_action = self.view.trainer.party.index(self.poke) + content += " Waiting for opponent." + else: + self.view.trainer.switch_poke(self.view.trainer.party.index(self.poke), mid_turn=self.view.mid_turn) + self.view.trainer.event.set() + await interaction.response.edit_message(content=content, view=None) + + +class MegaEvolveButton(discord.ui.Button): + """A button that toggles whether the trainer's pokemon should mega evolve this turn.""" + def __init__(self): + super().__init__(style=discord.ButtonStyle.gray, label="Mega Evolve", row=0) + + def get_color(self): + return [discord.ButtonStyle.gray, discord.ButtonStyle.green][self.view.trainer.current_pokemon.should_mega_evolve] + + async def callback(self, interaction): + self.view.trainer.current_pokemon.should_mega_evolve = not self.view.trainer.current_pokemon.should_mega_evolve + self.style = self.get_color() + await interaction.response.edit_message(view=self.view) diff --git a/pokemonduel/commands.py b/pokemonduel/commands.py new file mode 100644 index 0000000..a75ac42 --- /dev/null +++ b/pokemonduel/commands.py @@ -0,0 +1,483 @@ +import discord +from redbot.core import commands +from redbot.core import Config +import asyncio +import aiohttp +import logging +from .battle import Battle +from .buttons import DuelAcceptView +from .pokemon import DuelPokemon +from .data import generate_team_preview, find, find_one +from .trainer import MemberTrainer, NPCTrainer + + +class TeambuilderReadException(Exception): + """Generic exception raised when failing to parse a teambuilder export string.""" + pass + + +class PokemonDuel(commands.Cog): + """Battle in a Pokemon Duel with another member of your server.""" + def __init__(self, bot): + self.bot = bot + self.log = logging.getLogger('red.flamecogs.pokemonduel') + self.games = {} + self.config = Config.get_conf(self, identifier=145519400223506432) + self.config.register_member( + party = [], + ) + self.config.register_guild( + useThreads = False, + ) + + @staticmethod + async def party_from_teambuilder(ctx, teambuilder): + """ + Builds a party from an exported pokemon showdown teambuilder team. + https://play.pokemonshowdown.com/teambuilder + """ + teambuilder = teambuilder.strip() + party = [] + for raw in teambuilder.split("\n\n"): + raw = raw.strip() + lines = raw.split("\n") + + # FIRST LINE + nameraw = lines.pop(0) + item = "None" + if "@" in nameraw: + nameraw, item = nameraw.split("@") + item = item.strip().replace(" ", "-").lower() + gender = "-m" + if "(M)" in nameraw: + nameraw = nameraw.replace("(M)", "") + gender = "-m" + elif "(F)" in nameraw: + nameraw = nameraw.replace("(F)", "") + gender = "-f" + nick = "None" + if "(" in nameraw: + nick, nameraw = nameraw.split("(") + nameraw = nameraw.strip()[:-1] + nick = nick.strip() + + pokname = nameraw.strip().replace(" ", "-").capitalize() + if pokname == "nidoran": + name += gender + + forms = await find_one(ctx, "forms", {"identifier": pokname.lower()}) + if forms is None: + raise TeambuilderReadException(f"`{pokname}` is not a valid pokemon.") + pfile = await find_one(ctx, "pfile", {"id": forms["base_id"]}) + if pfile is None: + raise TeambuilderReadException(f"Could not find a `pfile` entry for `{pokname}`. Please report this bug.") + gender_rate = pfile["gender_rate"] + if gender_rate == 0: + gender = "-m" + elif gender_rate == 8: + gender = "-f" + elif gender_rate == -1: + gender = "-x" + + # REST OF THE LINES + hpiv = 31 + atkiv = 31 + defiv = 31 + spatkiv = 31 + spdefiv = 31 + speediv = 31 + hpev = 0 + atkev = 0 + defev = 0 + spatkev = 0 + spdefev = 0 + speedev = 0 + level = 100 + happiness = 255 + ability_index = 0 + shiny = False + nature = "Hardy" + moves = [] + for line in lines: + line = line.strip() + if line.startswith("IVs:"): + line = line[4:].strip() + ivs = line.split("/") + for iv in ivs: + amount, iv = iv.strip().split(" ") + amount = int(amount) + iv = iv.lower() + if iv == "hp": + hpiv = amount + elif iv == "atk": + atkiv = amount + elif iv == "def": + defiv = amount + elif iv == "spa": + spatkiv = amount + elif iv == "spd": + spdefiv = amount + elif iv == "spe": + speediv = amount + elif line.startswith("EVs:"): + line = line[4:].strip() + evs = line.split("/") + for ev in evs: + amount, ev = ev.strip().split(" ") + amount = int(amount) + ev = ev.lower() + if ev == "hp": + hpev = amount + elif ev == "atk": + atkev = amount + elif ev == "def": + defev = amount + elif ev == "spa": + spatkev = amount + elif ev == "spd": + spdefev = amount + elif ev == "spe": + speedev = amount + elif line.startswith("Shiny:"): + if "Yes" in line: + shiny = True + elif line.startswith("Level:"): + line = line[6:].strip() + level = int(line) + elif line.startswith("Happiness:"): + line = line[10:].strip() + happiness = int(line) + elif line.endswith("Nature"): + line = line[:-6].strip() + nature = line.capitalize() + elif line.startswith("Ability:"): + ability = line[8:].strip().lower().replace(" ", "-") + ability_raw = await find_one(ctx, "abilities", {"identifier": ability}) + if ability_raw is None: + raise TeambuilderReadException(f"`{pokname}` was given an ability `{ability}` which does not exist.") + ability_id = ability_raw["id"] + abilities = await find(ctx, "poke_abilities", {"pokemon_id": forms["pokemon_id"]}) + abilities = [a["ability_id"] for a in abilities] + if ability_id not in abilities: + raise TeambuilderReadException(f"`{pokname}` can not have the ability `{ability}`.") + ability_index = abilities.index(ability_id) + elif line.startswith("-"): + line = line[1:].split("/")[0].strip() + move = line.lower().replace(" ", "-") + if move.startswith("hidden-power"): + move = "hidden-power" + if await find_one(ctx, "moves", {"identifier": move}) is None: + raise TeambuilderReadException(f"`{pokname}` was given a move `{move}` which does not exist.") + moves.append(move) + elif line.startswith("Hidden Power:"): + pass + elif line.startswith("Tera Type:"): + pass # TODO: figure out how to handle teras + else: + raise TeambuilderReadException(f"Data line `{line[:200]}` is not properly formatted.") + if len(moves) != 4: + raise TeambuilderReadException(f"`{pokname}` was given {len(moves)} moves. It must have exactly 4 moves.") + evsum = sum([hpev, atkev, defev, spatkev, spdefev, speedev]) + if evsum > 510: + raise TeambuilderReadException(f"`{pokname}` was given {evsum} EV points. It must have no more than 510 EV points.") + for s in [hpiv, atkiv, defiv, spatkiv, spdefiv, speediv]: + if s > 31 or s < 0: + raise TeambuilderReadException(f"`{pokname}` was given an IV stat of {s}. IVs must be between 0 and 31.") + for s in [hpev, atkev, defev, spatkev, spdefev, speedev]: + if s > 252 or s < 0: + raise TeambuilderReadException(f"`{pokname}` was given an EV stat of {s}. EVs must be between 0 and 252.") + if item != "None": + item_raw = await find_one(ctx, "items", {"identifier": item}) + if item_raw is None: + raise TeambuilderReadException(f"`{pokname}` was given an item `{item}` which does not exist.") + if item in ( + "venusaurite", "blastoisinite", "alakazite", "gengarite", "kangaskhanite", "pinsirite", + "gyaradosite", "aerodactylite", "ampharosite", "scizorite", "heracronite", "houndoominite", + "tyranitarite", "blazikenite", "gardevoirite", "mawilite", "aggronite", "medichamite", + "manectite", "banettite", "absolite", "latiasite", "latiosite", "garchompite", "lucarionite", + "abomasite", "beedrillite", "pidgeotite", "slowbronite", "steelixite", "sceptilite", + "swampertite", "sablenite", "sharpedonite", "cameruptite", "altarianite", "glalitite", + "salamencite", "metagrossite", "lopunnite", "galladite", "audinite", "diancite", + ): + item = "mega-stone" + elif item in ("charizardite-x", "mewtwonite-x"): + item = "mega-stone-x" + elif item in ("charizardite-y", "mewtwonite-y"): + item = "mega-stone-y" + if nature not in ( + "Hardy", "Bold", "Modest", "Calm", "Timid", "Lonely", "Docile", "Mild", "Gentle", "Hasty", "Adamant", "Impish", "Bashful", + "Careful", "Jolly", "Naughty", "Lax", "Rash", "Quirky", "Naive", "Brave", "Relaxed", "Quiet", "Sassy", "Serious", + ): + raise TeambuilderReadException(f"`{pokname}` was given a nature `{nature}` which does not exist.") + if level > 100 or level < 1: + raise TeambuilderReadException(f"`{pokname}` was given a level of {level}. Its level must be between 1 and 100.") + if happiness < 0: + raise TeambuilderReadException(f"`{pokname}` was given a happiness of {happiness}. Its happiness must be at least 0.") + pokemon = { + 'id': 0, + 'pokname': pokname, + 'hpiv': hpiv, + 'atkiv': atkiv, + 'defiv': defiv, + 'spatkiv': spatkiv, + 'spdefiv': spdefiv, + 'speediv': speediv, + 'hpev': hpev, + 'atkev': atkev, + 'defev': defev, + 'spatkev': spatkev, + 'spdefev': spdefev, + 'speedev': speedev, + 'moves': moves, + 'hitem': item, + 'nature': nature, + 'poknick': nick, + 'pokelevel': level, + 'happiness': happiness, + 'ability_index': ability_index, + 'gender': gender, + 'shiny': shiny, + 'radiant': False, + 'skin': None, + } + party.append(pokemon) + if len(party) < 1 or len(party) > 6: + raise TeambuilderReadException(f"Your party has {len(party)} pokemon. It must have 1 to 6 pokemon.") + return party + + async def wrapped_run(self, battle): + """ + Runs the provided battle, handling any errors that are raised. + + Returns the output of the battle, or None if the battle errored. + """ + self.games[int(battle.ctx.message.id)] = battle + try: + winner = await battle.run() + except (aiohttp.client_exceptions.ClientOSError, asyncio.TimeoutError): + await battle.channel.send( + "The bot encountered an unexpected network issue, " + "and the duel could not continue. " + "Please try again in a few moments.\n" + "Note: Do not report this as a bug." + ) + return None + except Exception as exc: + msg = 'Error in PokemonDuel.\n' + self.log.exception(msg) + self.bot.dispatch('flamecogs_game_error', battle, exc) + await battle.channel.send( + 'A fatal error has occurred, shutting down.\n' + 'Please have the bot owner copy the error from console ' + 'and post it in the support channel of .' + ) + return None + else: + if int(battle.ctx.message.id) in self.games: + del self.games[int(battle.ctx.message.id)] + return winner + + @commands.group(aliases=["pokeduel"], invoke_without_command=True) + @commands.bot_has_permissions(attach_files=True, embed_links=True) + async def pokemonduel(self, ctx, opponent: discord.Member): + """Battle in a Pokemon Duel with another member of your server.""" + await self._start_duel(ctx, opponent) + + @pokemonduel.command() + async def inverse(self, ctx, opponent: discord.Member): + """Battle in an Inverse Duel with another member of your server.""" + await self._start_duel(ctx, opponent, inverse_battle=True) + + async def _start_duel(self, ctx, opponent: discord.Member, *, inverse_battle=False): + """Runs a duel.""" + if opponent.id == ctx.author.id: + await ctx.send("You cannot duel yourself!") + return + if opponent.bot: + await ctx.send("You cannot duel a bot!") + return + + view = DuelAcceptView(ctx, opponent) + battle_type = "an inverse battle" if inverse_battle else "a duel" + initial_message = await ctx.send( + f"{opponent.mention} You have been challenged to {battle_type} by {ctx.author.name}!\n", + view=view + ) + view.message = initial_message + channel = ctx.channel + if ( + await self.config.guild(ctx.guild).useThreads() + and ctx.channel.permissions_for(ctx.guild.me).create_public_threads + and ctx.channel.type is discord.ChannelType.text + ): + try: + channel = await initial_message.create_thread( + name='PokemonDuel', + reason='Automated thread for PokemonDuel.', + ) + except discord.HTTPException: + pass + await view.wait() + if not view.confirm: + return + trainers = [] + for player in (ctx.author, opponent): + party = await self.config.member(player).party() + if not party: + await channel.send(f"{player} has not setup their party yet!\nSet one with `{ctx.prefix}pokemonduel party set`.") + return + party = [await DuelPokemon.create(ctx, p) for p in party] + trainers.append(MemberTrainer(player, party)) + battle = Battle(ctx, channel, *trainers, inverse_battle=inverse_battle) # pylint: disable=E1120 + preview_view = await generate_team_preview(battle) + await battle.trainer1.event.wait() + await battle.trainer2.event.wait() + preview_view.stop() + winner = await self.wrapped_run(battle) + + @pokemonduel.group() + async def party(self, ctx): + """Manage your party of pokemon.""" + pass + + @party.command(name="set") + async def party_set(self, ctx, *, pokemon_data): + """ + Set your party of pokemon. + + In order to set your party, you will need to create a team on Pokemon Showdown Team Builder. + 1. Go to the [Team Builder site](https://play.pokemonshowdown.com/teambuilder). + 2. Click the "New Team" button. + 3. Select the format "Anything Goes". + 4. Use the "Add Pokemon" button to create a new pokemon. + 5. Pick its moves, ability, gender, level, etc. + 6. Repeat steps 4 and 5 for up to 6 total pokemon + 7. On the team view, select the "Import/Export" button at the TOP. + 8. Copy the text provided, and pass that to this command. + """ + try: + party = await self.party_from_teambuilder(ctx, pokemon_data) + except TeambuilderReadException as e: + await ctx.send(f"Couldn't validate your team.\n{e}") + return + except Exception: + await ctx.send("Couldn't properly parse your team. Make sure you follow the format provided by Showdown's Team Builder. An error has been logged to console to debug this issue.") + self.log.exception("Failed to read a teambuilder team string.") + return + await self.config.member(ctx.author).party.set(party) + embed = discord.Embed( + title="Your new party", + color=await ctx.embed_color(), + ) + embed.set_thumbnail(url=ctx.author.display_avatar.url) + await self.gen_party_embed(ctx, party, embed) + await ctx.send(embed=embed) + + @party.command(name="pokecord", hidden=True) + async def party_pokecord(self, ctx, *ids: int): + """Create a party of pokemon imported from Pokecord.""" + pass + + @party.command(name="list", aliases=["view"]) + async def party_list(self, ctx): + """View the pokemon currently in your party.""" + party = await self.config.member(ctx.author).party() + if len(party) == 0: + await ctx.send(f"You haven't setup your party yet!\nSet one with `{ctx.prefix}pokemonduel party set`.") + return + embed = discord.Embed( + title=f"{ctx.author.display_name}'s Party", + color=await ctx.embed_color(), + ) + embed.set_thumbnail(url=ctx.author.display_avatar.url) + await self.gen_party_embed(ctx, party, embed) + await ctx.send(embed=embed) + + @staticmethod + async def gen_party_embed(ctx, party, embed): + """Adds fields to the provided `embed` that are rendered descriptors of the pokemon in the provided `party`.""" + for idx, pokemon in enumerate(party): + pokname = pokemon["pokname"] + poknick = pokemon["poknick"] + gender = pokemon["gender"] + if gender == "-m": + gender = "Male" + elif gender == "-f": + gender = "Female" + elif gender == "-x": + gender = "Genderless" + moves = pokemon["moves"] + moves = "|".join([f"`{x}`" for x in moves]) + ability_index = pokemon["ability_index"] + form_info = await find_one(ctx, "forms", {"identifier": pokname.lower()}) + ab_ids = [] + for record in await find(ctx, "poke_abilities", {"pokemon_id": form_info["pokemon_id"]}): + ab_ids.append(record["ability_id"]) + try: + ab_id = ab_ids[ability_index] + except IndexError: + ab_id = ab_ids[0] + ability = await find_one(ctx, "abilities", {"id": ab_id}) + ability = ability["identifier"] + hitem = pokemon["hitem"] + nature = pokemon["nature"].lower() + happiness = pokemon["happiness"] + hpiv = pokemon["hpiv"] + atkiv = pokemon["atkiv"] + defiv = pokemon["defiv"] + spatkiv = pokemon["spatkiv"] + spdefiv = pokemon["spdefiv"] + speediv = pokemon["speediv"] + hpev = pokemon["hpev"] + atkev = pokemon["atkev"] + defev = pokemon["defev"] + spatkev = pokemon["spatkev"] + spdefev = pokemon["spdefev"] + speedev = pokemon["speedev"] + + title = f"{gender} {pokname} " + if poknick != "None": + title += f"({poknick}) " + + desc = f"{moves}\nAbility `{ability}`" + if hitem != "None": + desc += f" | Holding `{hitem}`" + desc += f"\nNature `{nature}` | Happiness `{happiness}`\n" + desc += "` `|` hp`|`atk`|`def`|`spa`|`spd`|`spe`\n" + desc += f"`IVs:`|`{hpiv:3d}`|`{atkiv:3d}`|`{defiv:3d}`|`{spatkiv:3d}`|`{spdefiv:3d}`|`{speediv:3d}`\n" + desc += f"`EVs:`|`{hpev:3d}`|`{atkev:3d}`|`{defev:3d}`|`{spatkev:3d}`|`{spdefev:3d}`|`{speedev:3d}`\n" + + embed.add_field(name=title, value=desc, inline=bool(idx % 2)) + + @commands.guild_only() + @commands.guildowner() + @commands.group(invoke_without_command=True) + async def pokemonduelset(self, ctx): + """Config options for pokemon duels.""" + await ctx.send_help() + cfg = await self.config.guild(ctx.guild).all() + msg = ( + "Game contained to a thread: {useThreads}\n" + ).format_map(cfg) + await ctx.send(f"```py\n{msg}```") + + @pokemonduelset.command() + async def thread(self, ctx, value: bool=None): + """ + Set if a thread should be created per-game to contain game messages. + + Defaults to False. + This value is server specific. + """ + if value is None: + v = await self.config.guild(ctx.guild).useThreads() + if v: + await ctx.send("The game is currently run in a per-game thread.") + else: + await ctx.send("The game is not currently run in a thread.") + else: + await self.config.guild(ctx.guild).useThreads.set(value) + if value: + await ctx.send("The game will now be run in a per-game thread.") + else: + await ctx.send("The game will not be run in a thread.") diff --git a/pokemonduel/data.py b/pokemonduel/data.py new file mode 100644 index 0000000..0a92797 --- /dev/null +++ b/pokemonduel/data.py @@ -0,0 +1,107 @@ +import discord +from redbot.core.data_manager import bundled_data_path +import json +from .buttons import BattlePromptView, PreviewPromptView + + +async def find(ctx, db, filter): + """Fetch all matching rows from a data file.""" + path = str(bundled_data_path(ctx.cog) / db) + ".json" + with open(path) as f: + data = json.load(f) + results = [] + for item in data: + success = True + for key, value in filter.items(): + if isinstance(value, dict): + if "$nin" in value: + if item[key] in value["$nin"]: + success = False + break + else: + if item[key] != value: + success = False + break + if success: + results.append(item) + return results + +async def find_one(ctx, db, filter): + """Fetch the first matching row from a data file.""" + results = await find(ctx, db, filter) + if results: + return results[0] + return None + +async def generate_team_preview(battle): + """Generates a message for trainers to preview their team.""" + preview_view = PreviewPromptView(battle) + await battle.channel.send("Select a lead pokemon:", view=preview_view) + return preview_view + +async def generate_main_battle_message(battle): + """Generates a message representing the current state of the battle.""" + desc = "" + + if battle.weather._weather_type: + desc += f"Weather: {battle.weather._weather_type.title()}\n" # TODO: pretty this output + if battle.terrain.item: + desc += f"Terrain: {battle.terrain.item.title()}\n" # TODO: pretty this output + if battle.trick_room.active(): + desc += "Trick Room: Active\n" + + desc += "\n" + desc += f"{battle.trainer1.name}'s {battle.trainer1.current_pokemon.name}\n" + desc += f" HP: {battle.trainer1.current_pokemon.hp}/{battle.trainer1.current_pokemon.starting_hp}\n" + if battle.trainer1.current_pokemon.nv.current: + desc += f" Status: {battle.trainer1.current_pokemon.nv.current}\n" + if battle.trainer1.current_pokemon.substitute: + desc += " Behind a substitute!\n" + + desc += "\n" + desc += f"{battle.trainer2.name}'s {battle.trainer2.current_pokemon.name}\n" + desc += f" HP: {battle.trainer2.current_pokemon.hp}/{battle.trainer2.current_pokemon.starting_hp}\n" + if battle.trainer2.current_pokemon.nv.current: + desc += f" Status: {battle.trainer2.current_pokemon.nv.current}\n" + if battle.trainer2.current_pokemon.substitute: + desc += " Behind a substitute!\n" + + desc = f"```\n{desc.strip()}```" + e = discord.Embed( + title=f"Battle between {battle.trainer1.name} and {battle.trainer2.name}", + color=await battle.ctx.embed_color(), + description = desc, + ) + e.set_footer(text="Who Wins!?") + try: #aiohttp 3.7 introduced a bug in dpy which causes this to error when rate limited. This catch just lets the bot continue when that happens. + battle_view = BattlePromptView(battle) + await battle.channel.send(embed=e, view=battle_view) + except RuntimeError: + pass + return battle_view + +async def generate_text_battle_message(battle): + """ + Send battle.msg in a boilerplate embed. + + Handles the message being too long. + """ + page = "" + pages = [] + base_embed = discord.Embed(color=await battle.ctx.embed_color()) + raw = battle.msg.strip().split("\n") + for part in raw: + if len(page + part) > 2000: + embed = base_embed.copy() + embed.description = page.strip() + pages.append(embed) + page = "" + page += part + "\n" + page = page.strip() + if page: + embed = base_embed.copy() + embed.description = page + pages.append(embed) + for page in pages: + await battle.channel.send(embed=page) + battle.msg = "" diff --git a/pokemonduel/data/abilities.json b/pokemonduel/data/abilities.json new file mode 100644 index 0000000..5936fb7 --- /dev/null +++ b/pokemonduel/data/abilities.json @@ -0,0 +1,2222 @@ +[ + { + "id": 1, + "identifier": "stench", + "generation_id": 3, + "is_main_series": 1 + }, + { + "id": 2, + "identifier": "drizzle", + "generation_id": 3, + "is_main_series": 1 + }, + { + "id": 3, + "identifier": "speed-boost", + "generation_id": 3, + "is_main_series": 1 + }, + { + "id": 4, + "identifier": "battle-armor", + "generation_id": 3, + "is_main_series": 1 + }, + { + "id": 5, + "identifier": "sturdy", + "generation_id": 3, + "is_main_series": 1 + }, + { + "id": 6, + "identifier": "damp", + "generation_id": 3, + "is_main_series": 1 + }, + { + "id": 7, + "identifier": "limber", + "generation_id": 3, + "is_main_series": 1 + }, + { + "id": 8, + "identifier": "sand-veil", + "generation_id": 3, + "is_main_series": 1 + }, + { + "id": 9, + "identifier": "static", + "generation_id": 3, + "is_main_series": 1 + }, + { + "id": 10, + "identifier": "volt-absorb", + "generation_id": 3, + "is_main_series": 1 + }, + { + "id": 11, + "identifier": "water-absorb", + "generation_id": 3, + "is_main_series": 1 + }, + { + "id": 12, + "identifier": "oblivious", + "generation_id": 3, + "is_main_series": 1 + }, + { + "id": 13, + "identifier": "cloud-nine", + "generation_id": 3, + "is_main_series": 1 + }, + { + "id": 14, + "identifier": "compound-eyes", + "generation_id": 3, + "is_main_series": 1 + }, + { + "id": 15, + "identifier": "insomnia", + "generation_id": 3, + "is_main_series": 1 + }, + { + "id": 16, + "identifier": "color-change", + "generation_id": 3, + "is_main_series": 1 + }, + { + "id": 17, + "identifier": "immunity", + "generation_id": 3, + "is_main_series": 1 + }, + { + "id": 18, + "identifier": "flash-fire", + "generation_id": 3, + "is_main_series": 1 + }, + { + "id": 19, + "identifier": "shield-dust", + "generation_id": 3, + "is_main_series": 1 + }, + { + "id": 20, + "identifier": "own-tempo", + "generation_id": 3, + "is_main_series": 1 + }, + { + "id": 21, + "identifier": "suction-cups", + "generation_id": 3, + "is_main_series": 1 + }, + { + "id": 22, + "identifier": "intimidate", + "generation_id": 3, + "is_main_series": 1 + }, + { + "id": 23, + "identifier": "shadow-tag", + "generation_id": 3, + "is_main_series": 1 + }, + { + "id": 24, + "identifier": "rough-skin", + "generation_id": 3, + "is_main_series": 1 + }, + { + "id": 25, + "identifier": "wonder-guard", + "generation_id": 3, + "is_main_series": 1 + }, + { + "id": 26, + "identifier": "levitate", + "generation_id": 3, + "is_main_series": 1 + }, + { + "id": 27, + "identifier": "effect-spore", + "generation_id": 3, + "is_main_series": 1 + }, + { + "id": 28, + "identifier": "synchronize", + "generation_id": 3, + "is_main_series": 1 + }, + { + "id": 29, + "identifier": "clear-body", + "generation_id": 3, + "is_main_series": 1 + }, + { + "id": 30, + "identifier": "natural-cure", + "generation_id": 3, + "is_main_series": 1 + }, + { + "id": 31, + "identifier": "lightning-rod", + "generation_id": 3, + "is_main_series": 1 + }, + { + "id": 32, + "identifier": "serene-grace", + "generation_id": 3, + "is_main_series": 1 + }, + { + "id": 33, + "identifier": "swift-swim", + "generation_id": 3, + "is_main_series": 1 + }, + { + "id": 34, + "identifier": "chlorophyll", + "generation_id": 3, + "is_main_series": 1 + }, + { + "id": 35, + "identifier": "illuminate", + "generation_id": 3, + "is_main_series": 1 + }, + { + "id": 36, + "identifier": "trace", + "generation_id": 3, + "is_main_series": 1 + }, + { + "id": 37, + "identifier": "huge-power", + "generation_id": 3, + "is_main_series": 1 + }, + { + "id": 38, + "identifier": "poison-point", + "generation_id": 3, + "is_main_series": 1 + }, + { + "id": 39, + "identifier": "inner-focus", + "generation_id": 3, + "is_main_series": 1 + }, + { + "id": 40, + "identifier": "magma-armor", + "generation_id": 3, + "is_main_series": 1 + }, + { + "id": 41, + "identifier": "water-veil", + "generation_id": 3, + "is_main_series": 1 + }, + { + "id": 42, + "identifier": "magnet-pull", + "generation_id": 3, + "is_main_series": 1 + }, + { + "id": 43, + "identifier": "soundproof", + "generation_id": 3, + "is_main_series": 1 + }, + { + "id": 44, + "identifier": "rain-dish", + "generation_id": 3, + "is_main_series": 1 + }, + { + "id": 45, + "identifier": "sand-stream", + "generation_id": 3, + "is_main_series": 1 + }, + { + "id": 46, + "identifier": "pressure", + "generation_id": 3, + "is_main_series": 1 + }, + { + "id": 47, + "identifier": "thick-fat", + "generation_id": 3, + "is_main_series": 1 + }, + { + "id": 48, + "identifier": "early-bird", + "generation_id": 3, + "is_main_series": 1 + }, + { + "id": 49, + "identifier": "flame-body", + "generation_id": 3, + "is_main_series": 1 + }, + { + "id": 50, + "identifier": "run-away", + "generation_id": 3, + "is_main_series": 1 + }, + { + "id": 51, + "identifier": "keen-eye", + "generation_id": 3, + "is_main_series": 1 + }, + { + "id": 52, + "identifier": "hyper-cutter", + "generation_id": 3, + "is_main_series": 1 + }, + { + "id": 53, + "identifier": "pickup", + "generation_id": 3, + "is_main_series": 1 + }, + { + "id": 54, + "identifier": "truant", + "generation_id": 3, + "is_main_series": 1 + }, + { + "id": 55, + "identifier": "hustle", + "generation_id": 3, + "is_main_series": 1 + }, + { + "id": 56, + "identifier": "cute-charm", + "generation_id": 3, + "is_main_series": 1 + }, + { + "id": 57, + "identifier": "plus", + "generation_id": 3, + "is_main_series": 1 + }, + { + "id": 58, + "identifier": "minus", + "generation_id": 3, + "is_main_series": 1 + }, + { + "id": 59, + "identifier": "forecast", + "generation_id": 3, + "is_main_series": 1 + }, + { + "id": 60, + "identifier": "sticky-hold", + "generation_id": 3, + "is_main_series": 1 + }, + { + "id": 61, + "identifier": "shed-skin", + "generation_id": 3, + "is_main_series": 1 + }, + { + "id": 62, + "identifier": "guts", + "generation_id": 3, + "is_main_series": 1 + }, + { + "id": 63, + "identifier": "marvel-scale", + "generation_id": 3, + "is_main_series": 1 + }, + { + "id": 64, + "identifier": "liquid-ooze", + "generation_id": 3, + "is_main_series": 1 + }, + { + "id": 65, + "identifier": "overgrow", + "generation_id": 3, + "is_main_series": 1 + }, + { + "id": 66, + "identifier": "blaze", + "generation_id": 3, + "is_main_series": 1 + }, + { + "id": 67, + "identifier": "torrent", + "generation_id": 3, + "is_main_series": 1 + }, + { + "id": 68, + "identifier": "swarm", + "generation_id": 3, + "is_main_series": 1 + }, + { + "id": 69, + "identifier": "rock-head", + "generation_id": 3, + "is_main_series": 1 + }, + { + "id": 70, + "identifier": "drought", + "generation_id": 3, + "is_main_series": 1 + }, + { + "id": 71, + "identifier": "arena-trap", + "generation_id": 3, + "is_main_series": 1 + }, + { + "id": 72, + "identifier": "vital-spirit", + "generation_id": 3, + "is_main_series": 1 + }, + { + "id": 73, + "identifier": "white-smoke", + "generation_id": 3, + "is_main_series": 1 + }, + { + "id": 74, + "identifier": "pure-power", + "generation_id": 3, + "is_main_series": 1 + }, + { + "id": 75, + "identifier": "shell-armor", + "generation_id": 3, + "is_main_series": 1 + }, + { + "id": 76, + "identifier": "air-lock", + "generation_id": 3, + "is_main_series": 1 + }, + { + "id": 77, + "identifier": "tangled-feet", + "generation_id": 4, + "is_main_series": 1 + }, + { + "id": 78, + "identifier": "motor-drive", + "generation_id": 4, + "is_main_series": 1 + }, + { + "id": 79, + "identifier": "rivalry", + "generation_id": 4, + "is_main_series": 1 + }, + { + "id": 80, + "identifier": "steadfast", + "generation_id": 4, + "is_main_series": 1 + }, + { + "id": 81, + "identifier": "snow-cloak", + "generation_id": 4, + "is_main_series": 1 + }, + { + "id": 82, + "identifier": "gluttony", + "generation_id": 4, + "is_main_series": 1 + }, + { + "id": 83, + "identifier": "anger-point", + "generation_id": 4, + "is_main_series": 1 + }, + { + "id": 84, + "identifier": "unburden", + "generation_id": 4, + "is_main_series": 1 + }, + { + "id": 85, + "identifier": "heatproof", + "generation_id": 4, + "is_main_series": 1 + }, + { + "id": 86, + "identifier": "simple", + "generation_id": 4, + "is_main_series": 1 + }, + { + "id": 87, + "identifier": "dry-skin", + "generation_id": 4, + "is_main_series": 1 + }, + { + "id": 88, + "identifier": "download", + "generation_id": 4, + "is_main_series": 1 + }, + { + "id": 89, + "identifier": "iron-fist", + "generation_id": 4, + "is_main_series": 1 + }, + { + "id": 90, + "identifier": "poison-heal", + "generation_id": 4, + "is_main_series": 1 + }, + { + "id": 91, + "identifier": "adaptability", + "generation_id": 4, + "is_main_series": 1 + }, + { + "id": 92, + "identifier": "skill-link", + "generation_id": 4, + "is_main_series": 1 + }, + { + "id": 93, + "identifier": "hydration", + "generation_id": 4, + "is_main_series": 1 + }, + { + "id": 94, + "identifier": "solar-power", + "generation_id": 4, + "is_main_series": 1 + }, + { + "id": 95, + "identifier": "quick-feet", + "generation_id": 4, + "is_main_series": 1 + }, + { + "id": 96, + "identifier": "normalize", + "generation_id": 4, + "is_main_series": 1 + }, + { + "id": 97, + "identifier": "sniper", + "generation_id": 4, + "is_main_series": 1 + }, + { + "id": 98, + "identifier": "magic-guard", + "generation_id": 4, + "is_main_series": 1 + }, + { + "id": 99, + "identifier": "no-guard", + "generation_id": 4, + "is_main_series": 1 + }, + { + "id": 100, + "identifier": "stall", + "generation_id": 4, + "is_main_series": 1 + }, + { + "id": 101, + "identifier": "technician", + "generation_id": 4, + "is_main_series": 1 + }, + { + "id": 102, + "identifier": "leaf-guard", + "generation_id": 4, + "is_main_series": 1 + }, + { + "id": 103, + "identifier": "klutz", + "generation_id": 4, + "is_main_series": 1 + }, + { + "id": 104, + "identifier": "mold-breaker", + "generation_id": 4, + "is_main_series": 1 + }, + { + "id": 105, + "identifier": "super-luck", + "generation_id": 4, + "is_main_series": 1 + }, + { + "id": 106, + "identifier": "aftermath", + "generation_id": 4, + "is_main_series": 1 + }, + { + "id": 107, + "identifier": "anticipation", + "generation_id": 4, + "is_main_series": 1 + }, + { + "id": 108, + "identifier": "forewarn", + "generation_id": 4, + "is_main_series": 1 + }, + { + "id": 109, + "identifier": "unaware", + "generation_id": 4, + "is_main_series": 1 + }, + { + "id": 110, + "identifier": "tinted-lens", + "generation_id": 4, + "is_main_series": 1 + }, + { + "id": 111, + "identifier": "filter", + "generation_id": 4, + "is_main_series": 1 + }, + { + "id": 112, + "identifier": "slow-start", + "generation_id": 4, + "is_main_series": 1 + }, + { + "id": 113, + "identifier": "scrappy", + "generation_id": 4, + "is_main_series": 1 + }, + { + "id": 114, + "identifier": "storm-drain", + "generation_id": 4, + "is_main_series": 1 + }, + { + "id": 115, + "identifier": "ice-body", + "generation_id": 4, + "is_main_series": 1 + }, + { + "id": 116, + "identifier": "solid-rock", + "generation_id": 4, + "is_main_series": 1 + }, + { + "id": 117, + "identifier": "snow-warning", + "generation_id": 4, + "is_main_series": 1 + }, + { + "id": 118, + "identifier": "honey-gather", + "generation_id": 4, + "is_main_series": 1 + }, + { + "id": 119, + "identifier": "frisk", + "generation_id": 4, + "is_main_series": 1 + }, + { + "id": 120, + "identifier": "reckless", + "generation_id": 4, + "is_main_series": 1 + }, + { + "id": 121, + "identifier": "multitype", + "generation_id": 4, + "is_main_series": 1 + }, + { + "id": 122, + "identifier": "flower-gift", + "generation_id": 4, + "is_main_series": 1 + }, + { + "id": 123, + "identifier": "bad-dreams", + "generation_id": 4, + "is_main_series": 1 + }, + { + "id": 124, + "identifier": "pickpocket", + "generation_id": 5, + "is_main_series": 1 + }, + { + "id": 125, + "identifier": "sheer-force", + "generation_id": 5, + "is_main_series": 1 + }, + { + "id": 126, + "identifier": "contrary", + "generation_id": 5, + "is_main_series": 1 + }, + { + "id": 127, + "identifier": "unnerve", + "generation_id": 5, + "is_main_series": 1 + }, + { + "id": 128, + "identifier": "defiant", + "generation_id": 5, + "is_main_series": 1 + }, + { + "id": 129, + "identifier": "defeatist", + "generation_id": 5, + "is_main_series": 1 + }, + { + "id": 130, + "identifier": "cursed-body", + "generation_id": 5, + "is_main_series": 1 + }, + { + "id": 131, + "identifier": "healer", + "generation_id": 5, + "is_main_series": 1 + }, + { + "id": 132, + "identifier": "friend-guard", + "generation_id": 5, + "is_main_series": 1 + }, + { + "id": 133, + "identifier": "weak-armor", + "generation_id": 5, + "is_main_series": 1 + }, + { + "id": 134, + "identifier": "heavy-metal", + "generation_id": 5, + "is_main_series": 1 + }, + { + "id": 135, + "identifier": "light-metal", + "generation_id": 5, + "is_main_series": 1 + }, + { + "id": 136, + "identifier": "multiscale", + "generation_id": 5, + "is_main_series": 1 + }, + { + "id": 137, + "identifier": "toxic-boost", + "generation_id": 5, + "is_main_series": 1 + }, + { + "id": 138, + "identifier": "flare-boost", + "generation_id": 5, + "is_main_series": 1 + }, + { + "id": 139, + "identifier": "harvest", + "generation_id": 5, + "is_main_series": 1 + }, + { + "id": 140, + "identifier": "telepathy", + "generation_id": 5, + "is_main_series": 1 + }, + { + "id": 141, + "identifier": "moody", + "generation_id": 5, + "is_main_series": 1 + }, + { + "id": 142, + "identifier": "overcoat", + "generation_id": 5, + "is_main_series": 1 + }, + { + "id": 143, + "identifier": "poison-touch", + "generation_id": 5, + "is_main_series": 1 + }, + { + "id": 144, + "identifier": "regenerator", + "generation_id": 5, + "is_main_series": 1 + }, + { + "id": 145, + "identifier": "big-pecks", + "generation_id": 5, + "is_main_series": 1 + }, + { + "id": 146, + "identifier": "sand-rush", + "generation_id": 5, + "is_main_series": 1 + }, + { + "id": 147, + "identifier": "wonder-skin", + "generation_id": 5, + "is_main_series": 1 + }, + { + "id": 148, + "identifier": "analytic", + "generation_id": 5, + "is_main_series": 1 + }, + { + "id": 149, + "identifier": "illusion", + "generation_id": 5, + "is_main_series": 1 + }, + { + "id": 150, + "identifier": "imposter", + "generation_id": 5, + "is_main_series": 1 + }, + { + "id": 151, + "identifier": "infiltrator", + "generation_id": 5, + "is_main_series": 1 + }, + { + "id": 152, + "identifier": "mummy", + "generation_id": 5, + "is_main_series": 1 + }, + { + "id": 153, + "identifier": "moxie", + "generation_id": 5, + "is_main_series": 1 + }, + { + "id": 154, + "identifier": "justified", + "generation_id": 5, + "is_main_series": 1 + }, + { + "id": 155, + "identifier": "rattled", + "generation_id": 5, + "is_main_series": 1 + }, + { + "id": 156, + "identifier": "magic-bounce", + "generation_id": 5, + "is_main_series": 1 + }, + { + "id": 157, + "identifier": "sap-sipper", + "generation_id": 5, + "is_main_series": 1 + }, + { + "id": 158, + "identifier": "prankster", + "generation_id": 5, + "is_main_series": 1 + }, + { + "id": 159, + "identifier": "sand-force", + "generation_id": 5, + "is_main_series": 1 + }, + { + "id": 160, + "identifier": "iron-barbs", + "generation_id": 5, + "is_main_series": 1 + }, + { + "id": 161, + "identifier": "zen-mode", + "generation_id": 5, + "is_main_series": 1 + }, + { + "id": 162, + "identifier": "victory-star", + "generation_id": 5, + "is_main_series": 1 + }, + { + "id": 163, + "identifier": "turboblaze", + "generation_id": 5, + "is_main_series": 1 + }, + { + "id": 164, + "identifier": "teravolt", + "generation_id": 5, + "is_main_series": 1 + }, + { + "id": 165, + "identifier": "aroma-veil", + "generation_id": 6, + "is_main_series": 1 + }, + { + "id": 166, + "identifier": "flower-veil", + "generation_id": 6, + "is_main_series": 1 + }, + { + "id": 167, + "identifier": "cheek-pouch", + "generation_id": 6, + "is_main_series": 1 + }, + { + "id": 168, + "identifier": "protean", + "generation_id": 6, + "is_main_series": 1 + }, + { + "id": 169, + "identifier": "fur-coat", + "generation_id": 6, + "is_main_series": 1 + }, + { + "id": 170, + "identifier": "magician", + "generation_id": 6, + "is_main_series": 1 + }, + { + "id": 171, + "identifier": "bulletproof", + "generation_id": 6, + "is_main_series": 1 + }, + { + "id": 172, + "identifier": "competitive", + "generation_id": 6, + "is_main_series": 1 + }, + { + "id": 173, + "identifier": "strong-jaw", + "generation_id": 6, + "is_main_series": 1 + }, + { + "id": 174, + "identifier": "refrigerate", + "generation_id": 6, + "is_main_series": 1 + }, + { + "id": 175, + "identifier": "sweet-veil", + "generation_id": 6, + "is_main_series": 1 + }, + { + "id": 176, + "identifier": "stance-change", + "generation_id": 6, + "is_main_series": 1 + }, + { + "id": 177, + "identifier": "gale-wings", + "generation_id": 6, + "is_main_series": 1 + }, + { + "id": 178, + "identifier": "mega-launcher", + "generation_id": 6, + "is_main_series": 1 + }, + { + "id": 179, + "identifier": "grass-pelt", + "generation_id": 6, + "is_main_series": 1 + }, + { + "id": 180, + "identifier": "symbiosis", + "generation_id": 6, + "is_main_series": 1 + }, + { + "id": 181, + "identifier": "tough-claws", + "generation_id": 6, + "is_main_series": 1 + }, + { + "id": 182, + "identifier": "pixilate", + "generation_id": 6, + "is_main_series": 1 + }, + { + "id": 183, + "identifier": "gooey", + "generation_id": 6, + "is_main_series": 1 + }, + { + "id": 184, + "identifier": "aerilate", + "generation_id": 6, + "is_main_series": 1 + }, + { + "id": 185, + "identifier": "parental-bond", + "generation_id": 6, + "is_main_series": 1 + }, + { + "id": 186, + "identifier": "dark-aura", + "generation_id": 6, + "is_main_series": 1 + }, + { + "id": 187, + "identifier": "fairy-aura", + "generation_id": 6, + "is_main_series": 1 + }, + { + "id": 188, + "identifier": "aura-break", + "generation_id": 6, + "is_main_series": 1 + }, + { + "id": 189, + "identifier": "primordial-sea", + "generation_id": 6, + "is_main_series": 1 + }, + { + "id": 190, + "identifier": "desolate-land", + "generation_id": 6, + "is_main_series": 1 + }, + { + "id": 191, + "identifier": "delta-stream", + "generation_id": 6, + "is_main_series": 1 + }, + { + "id": 192, + "identifier": "stamina", + "generation_id": 7, + "is_main_series": 1 + }, + { + "id": 193, + "identifier": "wimp-out", + "generation_id": 7, + "is_main_series": 1 + }, + { + "id": 194, + "identifier": "emergency-exit", + "generation_id": 7, + "is_main_series": 1 + }, + { + "id": 195, + "identifier": "water-compaction", + "generation_id": 7, + "is_main_series": 1 + }, + { + "id": 196, + "identifier": "merciless", + "generation_id": 7, + "is_main_series": 1 + }, + { + "id": 197, + "identifier": "shields-down", + "generation_id": 7, + "is_main_series": 1 + }, + { + "id": 198, + "identifier": "stakeout", + "generation_id": 7, + "is_main_series": 1 + }, + { + "id": 199, + "identifier": "water-bubble", + "generation_id": 7, + "is_main_series": 1 + }, + { + "id": 200, + "identifier": "steelworker", + "generation_id": 7, + "is_main_series": 1 + }, + { + "id": 201, + "identifier": "berserk", + "generation_id": 7, + "is_main_series": 1 + }, + { + "id": 202, + "identifier": "slush-rush", + "generation_id": 7, + "is_main_series": 1 + }, + { + "id": 203, + "identifier": "long-reach", + "generation_id": 7, + "is_main_series": 1 + }, + { + "id": 204, + "identifier": "liquid-voice", + "generation_id": 7, + "is_main_series": 1 + }, + { + "id": 205, + "identifier": "triage", + "generation_id": 7, + "is_main_series": 1 + }, + { + "id": 206, + "identifier": "galvanize", + "generation_id": 7, + "is_main_series": 1 + }, + { + "id": 207, + "identifier": "surge-surfer", + "generation_id": 7, + "is_main_series": 1 + }, + { + "id": 208, + "identifier": "schooling", + "generation_id": 7, + "is_main_series": 1 + }, + { + "id": 209, + "identifier": "disguise", + "generation_id": 7, + "is_main_series": 1 + }, + { + "id": 210, + "identifier": "battle-bond", + "generation_id": 7, + "is_main_series": 1 + }, + { + "id": 211, + "identifier": "power-construct", + "generation_id": 7, + "is_main_series": 1 + }, + { + "id": 212, + "identifier": "corrosion", + "generation_id": 7, + "is_main_series": 1 + }, + { + "id": 213, + "identifier": "comatose", + "generation_id": 7, + "is_main_series": 1 + }, + { + "id": 214, + "identifier": "queenly-majesty", + "generation_id": 7, + "is_main_series": 1 + }, + { + "id": 215, + "identifier": "innards-out", + "generation_id": 7, + "is_main_series": 1 + }, + { + "id": 216, + "identifier": "dancer", + "generation_id": 7, + "is_main_series": 1 + }, + { + "id": 217, + "identifier": "battery", + "generation_id": 7, + "is_main_series": 1 + }, + { + "id": 218, + "identifier": "fluffy", + "generation_id": 7, + "is_main_series": 1 + }, + { + "id": 219, + "identifier": "dazzling", + "generation_id": 7, + "is_main_series": 1 + }, + { + "id": 220, + "identifier": "soul-heart", + "generation_id": 7, + "is_main_series": 1 + }, + { + "id": 221, + "identifier": "tangling-hair", + "generation_id": 7, + "is_main_series": 1 + }, + { + "id": 222, + "identifier": "receiver", + "generation_id": 7, + "is_main_series": 1 + }, + { + "id": 223, + "identifier": "power-of-alchemy", + "generation_id": 7, + "is_main_series": 1 + }, + { + "id": 224, + "identifier": "beast-boost", + "generation_id": 7, + "is_main_series": 1 + }, + { + "id": 225, + "identifier": "rks-system", + "generation_id": 7, + "is_main_series": 1 + }, + { + "id": 226, + "identifier": "electric-surge", + "generation_id": 7, + "is_main_series": 1 + }, + { + "id": 227, + "identifier": "psychic-surge", + "generation_id": 7, + "is_main_series": 1 + }, + { + "id": 228, + "identifier": "misty-surge", + "generation_id": 7, + "is_main_series": 1 + }, + { + "id": 229, + "identifier": "grassy-surge", + "generation_id": 7, + "is_main_series": 1 + }, + { + "id": 230, + "identifier": "full-metal-body", + "generation_id": 7, + "is_main_series": 1 + }, + { + "id": 231, + "identifier": "shadow-shield", + "generation_id": 7, + "is_main_series": 1 + }, + { + "id": 232, + "identifier": "prism-armor", + "generation_id": 7, + "is_main_series": 1 + }, + { + "id": 233, + "identifier": "neuroforce", + "generation_id": 7, + "is_main_series": 1 + }, + { + "id": 234, + "identifier": "libero", + "generation_id": 8, + "is_main_series": 0 + }, + { + "id": 235, + "identifier": "mirror-armor", + "generation_id": 8, + "is_main_series": 0 + }, + { + "id": 236, + "identifier": "cotton-down", + "generation_id": 8, + "is_main_series": 0 + }, + { + "id": 237, + "identifier": "ball-fetch", + "generation_id": 8, + "is_main_series": 0 + }, + { + "id": 238, + "identifier": "steam-engine", + "generation_id": 8, + "is_main_series": 0 + }, + { + "id": 239, + "identifier": "ripen", + "generation_id": 8, + "is_main_series": 0 + }, + { + "id": 240, + "identifier": "sand-spit", + "generation_id": 8, + "is_main_series": 0 + }, + { + "id": 241, + "identifier": "gulp-missile", + "generation_id": 8, + "is_main_series": 0 + }, + { + "id": 242, + "identifier": "propeller-tail", + "generation_id": 8, + "is_main_series": 0 + }, + { + "id": 243, + "identifier": "punk-rock", + "generation_id": 8, + "is_main_series": 0 + }, + { + "id": 244, + "identifier": "steely-spirit", + "generation_id": 8, + "is_main_series": 0 + }, + { + "id": 245, + "identifier": "perish-body", + "generation_id": 8, + "is_main_series": 0 + }, + { + "id": 246, + "identifier": "screen-cleaner", + "generation_id": 8, + "is_main_series": 0 + }, + { + "id": 247, + "identifier": "wandering-spirit", + "generation_id": 8, + "is_main_series": 0 + }, + { + "id": 248, + "identifier": "neutralizing-gas", + "generation_id": 8, + "is_main_series": 1 + }, + { + "id": 249, + "identifier": "ice-scales", + "generation_id": 8, + "is_main_series": 0 + }, + { + "id": 250, + "identifier": "power-spot", + "generation_id": 8, + "is_main_series": 0 + }, + { + "id": 251, + "identifier": "ice-face", + "generation_id": 8, + "is_main_series": 0 + }, + { + "id": 252, + "identifier": "hunger-switch", + "generation_id": 8, + "is_main_series": 0 + }, + { + "id": 253, + "identifier": "stalwart", + "generation_id": 8, + "is_main_series": 0 + }, + { + "id": 254, + "identifier": "intrepid-sword", + "generation_id": 8, + "is_main_series": 0 + }, + { + "id": 255, + "identifier": "dauntless-shield", + "generation_id": 8, + "is_main_series": 0 + }, + { + "generation_id": 8, + "id": 256, + "identifier": "pastel-veil", + "is_main_series": 0 + }, + { + "generation_id": 8, + "id": 257, + "identifier": "gorilla-tactics", + "is_main_series": 0 + }, + { + "generation_id": 8, + "id": 258, + "identifier": "quick-draw", + "is_main_series": 0 + }, + { + "generation_id": 8, + "id": 259, + "identifier": "mimicry", + "is_main_series": 0 + }, + { + "generation_id": 8, + "id": 260, + "identifier": "transistor", + "is_main_series": 0 + }, + { + "generation_id": 8, + "id": 261, + "identifier": "dragons-maw", + "is_main_series": 0 + }, + { + "generation_id": 8, + "id": 262, + "identifier": "chilling-neigh", + "is_main_series": 0 + }, + { + "generation_id": 8, + "id": 263, + "identifier": "grim-neigh", + "is_main_series": 0 + }, + { + "id": 264, + "identifier": "as-one-shadow", + "generation_id": 8, + "is_main_series": 0 + }, + { + "id": 265, + "identifier": "as-one-ice", + "generation_id": 8, + "is_main_series": 0 + }, + { + "id": 266, + "identifier": "curious-medicine", + "generation_id": 8, + "is_main_series": 1 + }, + { + "id": 267, + "identifier": "unseen-fist", + "generation_id": 8, + "is_main_series": 1 + }, + { + "id": 268, + "identifier": "lingering-aroma", + "generation_id": 9, + "is_main_series": 1 + }, + { + "id": 269, + "identifier": "seed-sower", + "generation_id": 9, + "is_main_series": 1 + }, + { + "id": 270, + "identifier": "thermal-exchange", + "generation_id": 9, + "is_main_series": 1 + }, + { + "id": 271, + "identifier": "anger-shell", + "generation_id": 9, + "is_main_series": 1 + }, + { + "id": 272, + "identifier": "purifying-salt", + "generation_id": 9, + "is_main_series": 1 + }, + { + "id": 273, + "identifier": "well-baked-body", + "generation_id": 9, + "is_main_series": 1 + }, + { + "id": 274, + "identifier": "wind-rider", + "generation_id": 9, + "is_main_series": 1 + }, + { + "id": 275, + "identifier": "guard-dog", + "generation_id": 9, + "is_main_series": 1 + }, + { + "id": 276, + "identifier": "rocky-payload", + "generation_id": 9, + "is_main_series": 1 + }, + { + "id": 277, + "identifier": "wind-power", + "generation_id": 3, + "is_main_series": 1 + }, + { + "id": 278, + "identifier": "zero-to-hero", + "generation_id": 9, + "is_main_series": 1 + }, + { + "id": 279, + "identifier": "commander", + "generation_id": 9, + "is_main_series": 1 + }, + { + "id": 280, + "identifier": "electromorphosis", + "generation_id": 9, + "is_main_series": 1 + }, + { + "id": 281, + "identifier": "protosynthesis", + "generation_id": 9, + "is_main_series": 1 + }, + { + "id": 282, + "identifier": "quark-drive", + "generation_id": 9, + "is_main_series": 1 + }, + { + "id": 283, + "identifier": "good-as-gold", + "generation_id": 9, + "is_main_series": 1 + }, + { + "id": 284, + "identifier": "vessel-of-ruin", + "generation_id": 9, + "is_main_series": 1 + }, + { + "id": 285, + "identifier": "sword-of-ruin", + "generation_id": 9, + "is_main_series": 1 + }, + { + "id": 286, + "identifier": "tablets of ruin", + "generation_id": 9, + "is_main_series": 1 + }, + { + "id": 287, + "identifier": "beads-of-ruin", + "generation_id": 9, + "is_main_series": 1 + }, + { + "id": 288, + "identifier": "orichalcum-pulse", + "generation_id": 9, + "is_main_series": 1 + }, + { + "id": 289, + "identifier": "hadron-engine", + "generation_id": 9, + "is_main_series": 1 + }, + { + "id": 290, + "identifier": "opportunist", + "generation_id": 9, + "is_main_series": 1 + }, + { + "id": 291, + "identifier": "cud-chew", + "generation_id": 9, + "is_main_series": 1 + }, + { + "id": 292, + "identifier": "sharpness", + "generation_id": 9, + "is_main_series": 1 + }, + { + "id": 293, + "identifier": "supreme-overlord", + "generation_id": 9, + "is_main_series": 1 + }, + { + "id": 294, + "identifier": "costar", + "generation_id": 9, + "is_main_series": 1 + }, + { + "id": 295, + "identifier": "toxic-debris", + "generation_id": 9, + "is_main_series": 1 + }, + { + "id": 296, + "identifier": "armor-tail", + "generation_id": 9, + "is_main_series": 1 + }, + { + "id": 297, + "identifier": "earth-eater", + "generation_id": 9, + "is_main_series": 1 + }, + { + "id": 298, + "identifier": "mycelium-might", + "generation_id": 9, + "is_main_series": 1 + }, + { + "id": 299, + "identifier": "hospitality", + "generation_id": 9, + "is_main_series": 1 + }, + { + "id": 300, + "identifier": "minds-eye", + "generation_id": 9, + "is_main_series": 1 + }, + { + "id": 301, + "identifier": "embody-aspect-teal", + "generation_id": 9, + "is_main_series": 1 + }, + { + "id": 302, + "identifier": "embody-aspect-hearthflame", + "generation_id": 9, + "is_main_series": 1 + }, + { + "id": 303, + "identifier": "embody-aspect-wellspring", + "generation_id": 9, + "is_main_series": 1 + }, + { + "id": 304, + "identifier": "embody-aspect-cornerstone", + "generation_id": 9, + "is_main_series": 1 + }, + { + "id": 305, + "identifier": "toxic-chain", + "generation_id": 9, + "is_main_series": 1 + }, + { + "id": 306, + "identifier": "supersweet-syrup", + "generation_id": 9, + "is_main_series": 1 + }, + { + "id": 307, + "identifier": "tera-shift", + "generation_id": 9, + "is_main_series": 1 + }, + { + "id": 308, + "identifier": "tera-shell", + "generation_id": 9, + "is_main_series": 1 + }, + { + "id": 309, + "identifier": "teraform-zero", + "generation_id": 9, + "is_main_series": 1 + }, + { + "id": 310, + "identifier": "poison-puppeteer", + "generation_id": 9, + "is_main_series": 1 + }, + { + "id": 10001, + "identifier": "mountaineer", + "generation_id": 5, + "is_main_series": 0 + }, + { + "id": 10002, + "identifier": "wave-rider", + "generation_id": 5, + "is_main_series": 0 + }, + { + "id": 10003, + "identifier": "skater", + "generation_id": 5, + "is_main_series": 0 + }, + { + "id": 10004, + "identifier": "thrust", + "generation_id": 5, + "is_main_series": 0 + }, + { + "id": 10005, + "identifier": "perception", + "generation_id": 5, + "is_main_series": 0 + }, + { + "id": 10006, + "identifier": "parry", + "generation_id": 5, + "is_main_series": 0 + }, + { + "id": 10007, + "identifier": "instinct", + "generation_id": 5, + "is_main_series": 0 + }, + { + "id": 10008, + "identifier": "dodge", + "generation_id": 5, + "is_main_series": 0 + }, + { + "id": 10009, + "identifier": "jagged-edge", + "generation_id": 5, + "is_main_series": 0 + }, + { + "id": 10010, + "identifier": "frostbite", + "generation_id": 5, + "is_main_series": 0 + }, + { + "id": 10011, + "identifier": "tenacity", + "generation_id": 5, + "is_main_series": 0 + }, + { + "id": 10012, + "identifier": "pride", + "generation_id": 5, + "is_main_series": 0 + }, + { + "id": 10013, + "identifier": "deep-sleep", + "generation_id": 5, + "is_main_series": 0 + }, + { + "id": 10014, + "identifier": "power-nap", + "generation_id": 5, + "is_main_series": 0 + }, + { + "id": 10015, + "identifier": "spirit", + "generation_id": 5, + "is_main_series": 0 + }, + { + "id": 10016, + "identifier": "warm-blanket", + "generation_id": 5, + "is_main_series": 0 + }, + { + "id": 10017, + "identifier": "gulp", + "generation_id": 5, + "is_main_series": 0 + }, + { + "id": 10018, + "identifier": "herbivore", + "generation_id": 5, + "is_main_series": 0 + }, + { + "id": 10019, + "identifier": "sandpit", + "generation_id": 5, + "is_main_series": 0 + }, + { + "id": 10020, + "identifier": "hot-blooded", + "generation_id": 5, + "is_main_series": 0 + }, + { + "id": 10021, + "identifier": "medic", + "generation_id": 5, + "is_main_series": 0 + }, + { + "id": 10022, + "identifier": "life-force", + "generation_id": 5, + "is_main_series": 0 + }, + { + "id": 10023, + "identifier": "lunchbox", + "generation_id": 5, + "is_main_series": 0 + }, + { + "id": 10024, + "identifier": "nurse", + "generation_id": 5, + "is_main_series": 0 + }, + { + "id": 10025, + "identifier": "melee", + "generation_id": 5, + "is_main_series": 0 + }, + { + "id": 10026, + "identifier": "sponge", + "generation_id": 5, + "is_main_series": 0 + }, + { + "id": 10027, + "identifier": "bodyguard", + "generation_id": 5, + "is_main_series": 0 + }, + { + "id": 10028, + "identifier": "hero", + "generation_id": 5, + "is_main_series": 0 + }, + { + "id": 10029, + "identifier": "last-bastion", + "generation_id": 5, + "is_main_series": 0 + }, + { + "id": 10030, + "identifier": "stealth", + "generation_id": 5, + "is_main_series": 0 + }, + { + "id": 10031, + "identifier": "vanguard", + "generation_id": 5, + "is_main_series": 0 + }, + { + "id": 10032, + "identifier": "nomad", + "generation_id": 5, + "is_main_series": 0 + }, + { + "id": 10033, + "identifier": "sequence", + "generation_id": 5, + "is_main_series": 0 + }, + { + "id": 10034, + "identifier": "grass-cloak", + "generation_id": 5, + "is_main_series": 0 + }, + { + "id": 10035, + "identifier": "celebrate", + "generation_id": 5, + "is_main_series": 0 + }, + { + "id": 10036, + "identifier": "lullaby", + "generation_id": 5, + "is_main_series": 0 + }, + { + "id": 10037, + "identifier": "calming", + "generation_id": 5, + "is_main_series": 0 + }, + { + "id": 10038, + "identifier": "daze", + "generation_id": 5, + "is_main_series": 0 + }, + { + "id": 10039, + "identifier": "frighten", + "generation_id": 5, + "is_main_series": 0 + }, + { + "id": 10040, + "identifier": "interference", + "generation_id": 5, + "is_main_series": 0 + }, + { + "id": 10041, + "identifier": "mood-maker", + "generation_id": 5, + "is_main_series": 0 + }, + { + "id": 10042, + "identifier": "confidence", + "generation_id": 5, + "is_main_series": 0 + }, + { + "id": 10043, + "identifier": "fortune", + "generation_id": 5, + "is_main_series": 0 + }, + { + "id": 10044, + "identifier": "bonanza", + "generation_id": 5, + "is_main_series": 0 + }, + { + "id": 10045, + "identifier": "explode", + "generation_id": 5, + "is_main_series": 0 + }, + { + "id": 10046, + "identifier": "omnipotent", + "generation_id": 5, + "is_main_series": 0 + }, + { + "id": 10047, + "identifier": "share", + "generation_id": 5, + "is_main_series": 0 + }, + { + "id": 10048, + "identifier": "black-hole", + "generation_id": 5, + "is_main_series": 0 + }, + { + "id": 10049, + "identifier": "shadow-dash", + "generation_id": 5, + "is_main_series": 0 + }, + { + "id": 10050, + "identifier": "sprint", + "generation_id": 5, + "is_main_series": 0 + }, + { + "id": 10051, + "identifier": "disgust", + "generation_id": 5, + "is_main_series": 0 + }, + { + "id": 10052, + "identifier": "high-rise", + "generation_id": 5, + "is_main_series": 0 + }, + { + "id": 10053, + "identifier": "climber", + "generation_id": 5, + "is_main_series": 0 + }, + { + "id": 10054, + "identifier": "flame-boost", + "generation_id": 5, + "is_main_series": 0 + }, + { + "id": 10055, + "identifier": "aqua-boost", + "generation_id": 5, + "is_main_series": 0 + }, + { + "id": 10056, + "identifier": "run-up", + "generation_id": 5, + "is_main_series": 0 + }, + { + "id": 10057, + "identifier": "conqueror", + "generation_id": 5, + "is_main_series": 0 + }, + { + "id": 10058, + "identifier": "shackle", + "generation_id": 5, + "is_main_series": 0 + }, + { + "id": 10059, + "identifier": "decoy", + "generation_id": 5, + "is_main_series": 0 + }, + { + "id": 10060, + "identifier": "shield", + "generation_id": 5, + "is_main_series": 0 + } +] \ No newline at end of file diff --git a/pokemonduel/data/forms.json b/pokemonduel/data/forms.json new file mode 100644 index 0000000..4c470da --- /dev/null +++ b/pokemonduel/data/forms.json @@ -0,0 +1,19728 @@ +[ + { + "base_id": 0, + "form_identifier": "", + "form_order": 1, + "id": 16000, + "identifier": "egg", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 16000, + "weight": 0 + }, + { + "base_id": 1, + "form_identifier": "", + "form_order": 1, + "id": 1, + "identifier": "bulbasaur", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 1, + "weight": 69 + }, + { + "base_id": 2, + "form_identifier": "", + "form_order": 1, + "id": 2, + "identifier": "ivysaur", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 2, + "pokemon_id": 2, + "weight": 130 + }, + { + "base_id": 3, + "form_identifier": "", + "form_order": 1, + "id": 3, + "identifier": "venusaur", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 3, + "pokemon_id": 3, + "weight": 1000 + }, + { + "base_id": 4, + "form_identifier": "", + "form_order": 1, + "id": 4, + "identifier": "charmander", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 5, + "pokemon_id": 4, + "weight": 85 + }, + { + "base_id": 5, + "form_identifier": "", + "form_order": 1, + "id": 5, + "identifier": "charmeleon", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 6, + "pokemon_id": 5, + "weight": 190 + }, + { + "base_id": 6, + "form_identifier": "", + "form_order": 1, + "id": 6, + "identifier": "charizard", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 7, + "pokemon_id": 6, + "weight": 905 + }, + { + "base_id": 7, + "form_identifier": "", + "form_order": 1, + "id": 7, + "identifier": "squirtle", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 10, + "pokemon_id": 7, + "weight": 90 + }, + { + "base_id": 8, + "form_identifier": "", + "form_order": 1, + "id": 8, + "identifier": "wartortle", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 11, + "pokemon_id": 8, + "weight": 225 + }, + { + "base_id": 9, + "form_identifier": "", + "form_order": 1, + "id": 9, + "identifier": "blastoise", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 12, + "pokemon_id": 9, + "weight": 855 + }, + { + "base_id": 10, + "form_identifier": "", + "form_order": 1, + "id": 10, + "identifier": "caterpie", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 14, + "pokemon_id": 10, + "weight": 29 + }, + { + "base_id": 11, + "form_identifier": "", + "form_order": 1, + "id": 11, + "identifier": "metapod", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 15, + "pokemon_id": 11, + "weight": 99 + }, + { + "base_id": 12, + "form_identifier": "", + "form_order": 1, + "id": 12, + "identifier": "butterfree", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 16, + "pokemon_id": 12, + "weight": 320 + }, + { + "base_id": 13, + "form_identifier": "", + "form_order": 1, + "id": 13, + "identifier": "weedle", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 17, + "pokemon_id": 13, + "weight": 32 + }, + { + "base_id": 14, + "form_identifier": "", + "form_order": 1, + "id": 14, + "identifier": "kakuna", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 18, + "pokemon_id": 14, + "weight": 100 + }, + { + "base_id": 15, + "form_identifier": "", + "form_order": 1, + "id": 15, + "identifier": "beedrill", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 19, + "pokemon_id": 15, + "weight": 295 + }, + { + "base_id": 16, + "form_identifier": "", + "form_order": 1, + "id": 16, + "identifier": "pidgey", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 21, + "pokemon_id": 16, + "weight": 18 + }, + { + "base_id": 17, + "form_identifier": "", + "form_order": 1, + "id": 17, + "identifier": "pidgeotto", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 22, + "pokemon_id": 17, + "weight": 300 + }, + { + "base_id": 18, + "form_identifier": "", + "form_order": 1, + "id": 18, + "identifier": "pidgeot", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 23, + "pokemon_id": 18, + "weight": 395 + }, + { + "base_id": 19, + "form_identifier": "", + "form_order": 1, + "id": 19, + "identifier": "rattata", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 25, + "pokemon_id": 19, + "weight": 35 + }, + { + "base_id": 20, + "form_identifier": "", + "form_order": 1, + "id": 20, + "identifier": "raticate", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 27, + "pokemon_id": 20, + "weight": 185 + }, + { + "base_id": 21, + "form_identifier": "", + "form_order": 1, + "id": 21, + "identifier": "spearow", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 30, + "pokemon_id": 21, + "weight": 20 + }, + { + "base_id": 22, + "form_identifier": "", + "form_order": 1, + "id": 22, + "identifier": "fearow", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 31, + "pokemon_id": 22, + "weight": 380 + }, + { + "base_id": 23, + "form_identifier": "", + "form_order": 1, + "id": 23, + "identifier": "ekans", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 32, + "pokemon_id": 23, + "weight": 69 + }, + { + "base_id": 24, + "form_identifier": "", + "form_order": 1, + "id": 24, + "identifier": "arbok", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 33, + "pokemon_id": 24, + "weight": 650 + }, + { + "base_id": 25, + "form_identifier": "", + "form_order": 1, + "id": 25, + "identifier": "pikachu", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 36, + "pokemon_id": 25, + "weight": 60 + }, + { + "base_id": 26, + "form_identifier": "", + "form_order": 1, + "id": 26, + "identifier": "raichu", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 44, + "pokemon_id": 26, + "weight": 300 + }, + { + "base_id": 27, + "form_identifier": "", + "form_order": 1, + "id": 27, + "identifier": "sandshrew", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 46, + "pokemon_id": 27, + "weight": 120 + }, + { + "base_id": 28, + "form_identifier": "", + "form_order": 1, + "id": 28, + "identifier": "sandslash", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 48, + "pokemon_id": 28, + "weight": 295 + }, + { + "base_id": 29, + "form_identifier": "", + "form_order": 1, + "id": 29, + "identifier": "nidoran-f", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 50, + "pokemon_id": 29, + "weight": 70 + }, + { + "base_id": 30, + "form_identifier": "", + "form_order": 1, + "id": 30, + "identifier": "nidorina", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 51, + "pokemon_id": 30, + "weight": 200 + }, + { + "base_id": 31, + "form_identifier": "", + "form_order": 1, + "id": 31, + "identifier": "nidoqueen", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 52, + "pokemon_id": 31, + "weight": 600 + }, + { + "base_id": 32, + "form_identifier": "", + "form_order": 1, + "id": 32, + "identifier": "nidoran-m", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 53, + "pokemon_id": 32, + "weight": 90 + }, + { + "base_id": 33, + "form_identifier": "", + "form_order": 1, + "id": 33, + "identifier": "nidorino", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 54, + "pokemon_id": 33, + "weight": 195 + }, + { + "base_id": 34, + "form_identifier": "", + "form_order": 1, + "id": 34, + "identifier": "nidoking", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 55, + "pokemon_id": 34, + "weight": 620 + }, + { + "base_id": 35, + "form_identifier": "", + "form_order": 1, + "id": 35, + "identifier": "clefairy", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 57, + "pokemon_id": 35, + "weight": 75 + }, + { + "base_id": 36, + "form_identifier": "", + "form_order": 1, + "id": 36, + "identifier": "clefable", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 58, + "pokemon_id": 36, + "weight": 400 + }, + { + "base_id": 37, + "form_identifier": "", + "form_order": 1, + "id": 37, + "identifier": "vulpix", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 59, + "pokemon_id": 37, + "weight": 99 + }, + { + "base_id": 38, + "form_identifier": "", + "form_order": 1, + "id": 38, + "identifier": "ninetales", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 61, + "pokemon_id": 38, + "weight": 199 + }, + { + "base_id": 39, + "form_identifier": "", + "form_order": 1, + "id": 39, + "identifier": "jigglypuff", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 64, + "pokemon_id": 39, + "weight": 55 + }, + { + "base_id": 40, + "form_identifier": "", + "form_order": 1, + "id": 40, + "identifier": "wigglytuff", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 65, + "pokemon_id": 40, + "weight": 120 + }, + { + "base_id": 41, + "form_identifier": "skybat", + "form_order": 3, + "id": 41, + "identifier": "zubat", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 68, + "pokemon_id": 41, + "weight": 75 + }, + { + "base_id": 42, + "form_identifier": "", + "form_order": 1, + "id": 42, + "identifier": "golbat", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 67, + "pokemon_id": 42, + "weight": 550 + }, + { + "base_id": 43, + "form_identifier": "", + "form_order": 1, + "id": 43, + "identifier": "oddish", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 69, + "pokemon_id": 43, + "weight": 54 + }, + { + "base_id": 44, + "form_identifier": "", + "form_order": 1, + "id": 44, + "identifier": "gloom", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 70, + "pokemon_id": 44, + "weight": 86 + }, + { + "base_id": 45, + "form_identifier": "", + "form_order": 1, + "id": 45, + "identifier": "vileplume", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 71, + "pokemon_id": 45, + "weight": 186 + }, + { + "base_id": 46, + "form_identifier": "", + "form_order": 1, + "id": 46, + "identifier": "paras", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 73, + "pokemon_id": 46, + "weight": 54 + }, + { + "base_id": 47, + "form_identifier": "", + "form_order": 1, + "id": 47, + "identifier": "parasect", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 74, + "pokemon_id": 47, + "weight": 295 + }, + { + "base_id": 48, + "form_identifier": "", + "form_order": 1, + "id": 48, + "identifier": "venonat", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 75, + "pokemon_id": 48, + "weight": 300 + }, + { + "base_id": 49, + "form_identifier": "", + "form_order": 1, + "id": 49, + "identifier": "venomoth", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 76, + "pokemon_id": 49, + "weight": 125 + }, + { + "base_id": 50, + "form_identifier": "", + "form_order": 1, + "id": 50, + "identifier": "diglett", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 77, + "pokemon_id": 50, + "weight": 8 + }, + { + "base_id": 51, + "form_identifier": "", + "form_order": 1, + "id": 51, + "identifier": "dugtrio", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 79, + "pokemon_id": 51, + "weight": 333 + }, + { + "base_id": 52, + "form_identifier": "", + "form_order": 1, + "id": 52, + "identifier": "meowth", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 81, + "pokemon_id": 52, + "weight": 42 + }, + { + "base_id": 53, + "form_identifier": "", + "form_order": 1, + "id": 53, + "identifier": "persian", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 83, + "pokemon_id": 53, + "weight": 320 + }, + { + "base_id": 54, + "form_identifier": "", + "form_order": 1, + "id": 54, + "identifier": "psyduck", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 85, + "pokemon_id": 54, + "weight": 196 + }, + { + "base_id": 55, + "form_identifier": "", + "form_order": 1, + "id": 55, + "identifier": "golduck", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 86, + "pokemon_id": 55, + "weight": 766 + }, + { + "base_id": 56, + "form_identifier": "", + "form_order": 1, + "id": 56, + "identifier": "mankey", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 87, + "pokemon_id": 56, + "weight": 280 + }, + { + "base_id": 57, + "form_identifier": "", + "form_order": 1, + "id": 57, + "identifier": "primeape", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 88, + "pokemon_id": 57, + "weight": 320 + }, + { + "base_id": 58, + "form_identifier": "", + "form_order": 1, + "id": 58, + "identifier": "growlithe", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 89, + "pokemon_id": 58, + "weight": 190 + }, + { + "base_id": 59, + "form_identifier": "", + "form_order": 1, + "id": 59, + "identifier": "arcanine", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 90, + "pokemon_id": 59, + "weight": 1550 + }, + { + "base_id": 60, + "form_identifier": "", + "form_order": 1, + "id": 60, + "identifier": "poliwag", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 91, + "pokemon_id": 60, + "weight": 124 + }, + { + "base_id": 61, + "form_identifier": "", + "form_order": 1, + "id": 61, + "identifier": "poliwhirl", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 92, + "pokemon_id": 61, + "weight": 200 + }, + { + "base_id": 62, + "form_identifier": "", + "form_order": 1, + "id": 62, + "identifier": "poliwrath", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 93, + "pokemon_id": 62, + "weight": 540 + }, + { + "base_id": 63, + "form_identifier": "", + "form_order": 1, + "id": 63, + "identifier": "abra", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 95, + "pokemon_id": 63, + "weight": 195 + }, + { + "base_id": 64, + "form_identifier": "", + "form_order": 1, + "id": 64, + "identifier": "kadabra", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 96, + "pokemon_id": 64, + "weight": 565 + }, + { + "base_id": 65, + "form_identifier": "", + "form_order": 1, + "id": 65, + "identifier": "alakazam", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 97, + "pokemon_id": 65, + "weight": 480 + }, + { + "base_id": 66, + "form_identifier": "", + "form_order": 1, + "id": 66, + "identifier": "machop", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 99, + "pokemon_id": 66, + "weight": 195 + }, + { + "base_id": 67, + "form_identifier": "", + "form_order": 1, + "id": 67, + "identifier": "machoke", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 100, + "pokemon_id": 67, + "weight": 705 + }, + { + "base_id": 68, + "form_identifier": "", + "form_order": 1, + "id": 68, + "identifier": "machamp", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 101, + "pokemon_id": 68, + "weight": 1300 + }, + { + "base_id": 69, + "form_identifier": "", + "form_order": 1, + "id": 69, + "identifier": "bellsprout", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 102, + "pokemon_id": 69, + "weight": 40 + }, + { + "base_id": 70, + "form_identifier": "", + "form_order": 1, + "id": 70, + "identifier": "weepinbell", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 103, + "pokemon_id": 70, + "weight": 64 + }, + { + "base_id": 71, + "form_identifier": "", + "form_order": 1, + "id": 71, + "identifier": "victreebel", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 104, + "pokemon_id": 71, + "weight": 155 + }, + { + "base_id": 72, + "form_identifier": "", + "form_order": 1, + "id": 72, + "identifier": "tentacool", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 105, + "pokemon_id": 72, + "weight": 455 + }, + { + "base_id": 73, + "form_identifier": "", + "form_order": 1, + "id": 73, + "identifier": "tentacruel", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 106, + "pokemon_id": 73, + "weight": 550 + }, + { + "base_id": 74, + "form_identifier": "", + "form_order": 1, + "id": 74, + "identifier": "geodude", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 107, + "pokemon_id": 74, + "weight": 200 + }, + { + "base_id": 75, + "form_identifier": "", + "form_order": 1, + "id": 75, + "identifier": "graveler", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 109, + "pokemon_id": 75, + "weight": 1050 + }, + { + "base_id": 76, + "form_identifier": "", + "form_order": 1, + "id": 76, + "identifier": "golem", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 111, + "pokemon_id": 76, + "weight": 3000 + }, + { + "base_id": 77, + "form_identifier": "", + "form_order": 1, + "id": 77, + "identifier": "ponyta", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 113, + "pokemon_id": 77, + "weight": 300 + }, + { + "base_id": 78, + "form_identifier": "", + "form_order": 1, + "id": 78, + "identifier": "rapidash", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 114, + "pokemon_id": 78, + "weight": 950 + }, + { + "base_id": 79, + "form_identifier": "", + "form_order": 1, + "id": 79, + "identifier": "slowpoke", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 115, + "pokemon_id": 79, + "weight": 360 + }, + { + "base_id": 80, + "form_identifier": "", + "form_order": 1, + "id": 80, + "identifier": "slowbro", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 116, + "pokemon_id": 80, + "weight": 785 + }, + { + "base_id": 81, + "form_identifier": "", + "form_order": 1, + "id": 81, + "identifier": "magnemite", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 119, + "pokemon_id": 81, + "weight": 60 + }, + { + "base_id": 82, + "form_identifier": "", + "form_order": 1, + "id": 82, + "identifier": "magneton", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 120, + "pokemon_id": 82, + "weight": 600 + }, + { + "base_id": 83, + "form_identifier": "", + "form_order": 1, + "id": 83, + "identifier": "farfetchd", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 122, + "pokemon_id": 83, + "weight": 150 + }, + { + "base_id": 84, + "form_identifier": "", + "form_order": 1, + "id": 84, + "identifier": "doduo", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 123, + "pokemon_id": 84, + "weight": 392 + }, + { + "base_id": 85, + "form_identifier": "", + "form_order": 1, + "id": 85, + "identifier": "dodrio", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 124, + "pokemon_id": 85, + "weight": 852 + }, + { + "base_id": 86, + "form_identifier": "", + "form_order": 1, + "id": 86, + "identifier": "seel", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 125, + "pokemon_id": 86, + "weight": 900 + }, + { + "base_id": 87, + "form_identifier": "", + "form_order": 1, + "id": 87, + "identifier": "dewgong", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 126, + "pokemon_id": 87, + "weight": 1200 + }, + { + "base_id": 88, + "form_identifier": "", + "form_order": 1, + "id": 88, + "identifier": "grimer", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 127, + "pokemon_id": 88, + "weight": 300 + }, + { + "base_id": 89, + "form_identifier": "", + "form_order": 1, + "id": 89, + "identifier": "muk", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 129, + "pokemon_id": 89, + "weight": 300 + }, + { + "base_id": 90, + "form_identifier": "", + "form_order": 1, + "id": 90, + "identifier": "shellder", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 131, + "pokemon_id": 90, + "weight": 40 + }, + { + "base_id": 91, + "form_identifier": "", + "form_order": 1, + "id": 91, + "identifier": "cloyster", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 132, + "pokemon_id": 91, + "weight": 1325 + }, + { + "base_id": 92, + "form_identifier": "", + "form_order": 1, + "id": 92, + "identifier": "gastly", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 133, + "pokemon_id": 92, + "weight": 1 + }, + { + "base_id": 93, + "form_identifier": "", + "form_order": 1, + "id": 93, + "identifier": "haunter", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 134, + "pokemon_id": 93, + "weight": 1 + }, + { + "base_id": 94, + "form_identifier": "", + "form_order": 1, + "id": 94, + "identifier": "gengar", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 135, + "pokemon_id": 94, + "weight": 405 + }, + { + "base_id": 95, + "form_identifier": "", + "form_order": 1, + "id": 95, + "identifier": "onix", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 137, + "pokemon_id": 95, + "weight": 2100 + }, + { + "base_id": 96, + "form_identifier": "", + "form_order": 1, + "id": 96, + "identifier": "drowzee", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 140, + "pokemon_id": 96, + "weight": 324 + }, + { + "base_id": 97, + "form_identifier": "", + "form_order": 1, + "id": 97, + "identifier": "hypno", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 141, + "pokemon_id": 97, + "weight": 756 + }, + { + "base_id": 98, + "form_identifier": "", + "form_order": 1, + "id": 98, + "identifier": "krabby", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 142, + "pokemon_id": 98, + "weight": 65 + }, + { + "base_id": 99, + "form_identifier": "", + "form_order": 1, + "id": 99, + "identifier": "kingler", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 143, + "pokemon_id": 99, + "weight": 600 + }, + { + "base_id": 100, + "form_identifier": "", + "form_order": 1, + "id": 100, + "identifier": "voltorb", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 144, + "pokemon_id": 100, + "weight": 104 + }, + { + "base_id": 101, + "form_identifier": "", + "form_order": 1, + "id": 101, + "identifier": "electrode", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 145, + "pokemon_id": 101, + "weight": 666 + }, + { + "base_id": 102, + "form_identifier": "", + "form_order": 1, + "id": 102, + "identifier": "exeggcute", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 146, + "pokemon_id": 102, + "weight": 25 + }, + { + "base_id": 103, + "form_identifier": "", + "form_order": 1, + "id": 103, + "identifier": "exeggutor", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 147, + "pokemon_id": 103, + "weight": 1200 + }, + { + "base_id": 104, + "form_identifier": "", + "form_order": 1, + "id": 104, + "identifier": "cubone", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 149, + "pokemon_id": 104, + "weight": 65 + }, + { + "base_id": 105, + "form_identifier": "", + "form_order": 1, + "id": 105, + "identifier": "marowak", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 150, + "pokemon_id": 105, + "weight": 450 + }, + { + "base_id": 106, + "form_identifier": "", + "form_order": 1, + "id": 106, + "identifier": "hitmonlee", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 154, + "pokemon_id": 106, + "weight": 498 + }, + { + "base_id": 107, + "form_identifier": "", + "form_order": 1, + "id": 107, + "identifier": "hitmonchan", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 155, + "pokemon_id": 107, + "weight": 502 + }, + { + "base_id": 108, + "form_identifier": "", + "form_order": 1, + "id": 108, + "identifier": "lickitung", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 157, + "pokemon_id": 108, + "weight": 655 + }, + { + "base_id": 109, + "form_identifier": "", + "form_order": 1, + "id": 109, + "identifier": "koffing", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 159, + "pokemon_id": 109, + "weight": 10 + }, + { + "base_id": 110, + "form_identifier": "", + "form_order": 1, + "id": 110, + "identifier": "weezing", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 160, + "pokemon_id": 110, + "weight": 95 + }, + { + "base_id": 111, + "form_identifier": "", + "form_order": 1, + "id": 111, + "identifier": "rhyhorn", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 161, + "pokemon_id": 111, + "weight": 1150 + }, + { + "base_id": 112, + "form_identifier": "", + "form_order": 1, + "id": 112, + "identifier": "rhydon", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 162, + "pokemon_id": 112, + "weight": 1200 + }, + { + "base_id": 113, + "form_identifier": "", + "form_order": 1, + "id": 113, + "identifier": "chansey", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 165, + "pokemon_id": 113, + "weight": 346 + }, + { + "base_id": 114, + "form_identifier": "", + "form_order": 1, + "id": 114, + "identifier": "tangela", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 167, + "pokemon_id": 114, + "weight": 350 + }, + { + "base_id": 115, + "form_identifier": "", + "form_order": 1, + "id": 115, + "identifier": "kangaskhan", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 169, + "pokemon_id": 115, + "weight": 800 + }, + { + "base_id": 116, + "form_identifier": "", + "form_order": 1, + "id": 116, + "identifier": "horsea", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 171, + "pokemon_id": 116, + "weight": 80 + }, + { + "base_id": 117, + "form_identifier": "", + "form_order": 1, + "id": 117, + "identifier": "seadra", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 172, + "pokemon_id": 117, + "weight": 250 + }, + { + "base_id": 118, + "form_identifier": "", + "form_order": 1, + "id": 118, + "identifier": "goldeen", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 174, + "pokemon_id": 118, + "weight": 150 + }, + { + "base_id": 119, + "form_identifier": "", + "form_order": 1, + "id": 119, + "identifier": "seaking", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 175, + "pokemon_id": 119, + "weight": 390 + }, + { + "base_id": 120, + "form_identifier": "", + "form_order": 1, + "id": 120, + "identifier": "staryu", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 176, + "pokemon_id": 120, + "weight": 345 + }, + { + "base_id": 121, + "form_identifier": "", + "form_order": 1, + "id": 121, + "identifier": "starmie", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 177, + "pokemon_id": 121, + "weight": 800 + }, + { + "base_id": 122, + "form_identifier": "", + "form_order": 1, + "id": 122, + "identifier": "mr-mime", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 179, + "pokemon_id": 122, + "weight": 545 + }, + { + "base_id": 123, + "form_identifier": "", + "form_order": 1, + "id": 123, + "identifier": "scyther", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 180, + "pokemon_id": 123, + "weight": 560 + }, + { + "base_id": 124, + "form_identifier": "", + "form_order": 1, + "id": 124, + "identifier": "jynx", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 184, + "pokemon_id": 124, + "weight": 406 + }, + { + "base_id": 125, + "form_identifier": "", + "form_order": 1, + "id": 125, + "identifier": "electabuzz", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 186, + "pokemon_id": 125, + "weight": 300 + }, + { + "base_id": 126, + "form_identifier": "", + "form_order": 1, + "id": 126, + "identifier": "magmar", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 189, + "pokemon_id": 126, + "weight": 445 + }, + { + "base_id": 127, + "form_identifier": "", + "form_order": 1, + "id": 127, + "identifier": "pinsir", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 191, + "pokemon_id": 127, + "weight": 550 + }, + { + "base_id": 128, + "form_identifier": "", + "form_order": 1, + "id": 128, + "identifier": "tauros", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 193, + "pokemon_id": 128, + "weight": 884 + }, + { + "base_id": 129, + "form_identifier": "", + "form_order": 1, + "id": 129, + "identifier": "magikarp", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 194, + "pokemon_id": 129, + "weight": 100 + }, + { + "base_id": 130, + "form_identifier": "", + "form_order": 1, + "id": 130, + "identifier": "gyarados", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 195, + "pokemon_id": 130, + "weight": 2350 + }, + { + "base_id": 131, + "form_identifier": "", + "form_order": 1, + "id": 131, + "identifier": "lapras", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 197, + "pokemon_id": 131, + "weight": 2200 + }, + { + "base_id": 132, + "form_identifier": "", + "form_order": 1, + "id": 132, + "identifier": "ditto", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 198, + "pokemon_id": 132, + "weight": 40 + }, + { + "base_id": 133, + "form_identifier": "", + "form_order": 1, + "id": 133, + "identifier": "eevee", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 199, + "pokemon_id": 133, + "weight": 65 + }, + { + "base_id": 134, + "form_identifier": "", + "form_order": 1, + "id": 134, + "identifier": "vaporeon", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 200, + "pokemon_id": 134, + "weight": 290 + }, + { + "base_id": 135, + "form_identifier": "", + "form_order": 1, + "id": 135, + "identifier": "jolteon", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 201, + "pokemon_id": 135, + "weight": 245 + }, + { + "base_id": 136, + "form_identifier": "", + "form_order": 1, + "id": 136, + "identifier": "flareon", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 202, + "pokemon_id": 136, + "weight": 250 + }, + { + "base_id": 137, + "form_identifier": "", + "form_order": 1, + "id": 137, + "identifier": "porygon", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 208, + "pokemon_id": 137, + "weight": 365 + }, + { + "base_id": 138, + "form_identifier": "", + "form_order": 1, + "id": 138, + "identifier": "omanyte", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 211, + "pokemon_id": 138, + "weight": 75 + }, + { + "base_id": 139, + "form_identifier": "", + "form_order": 1, + "id": 139, + "identifier": "omastar", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 212, + "pokemon_id": 139, + "weight": 350 + }, + { + "base_id": 140, + "form_identifier": "", + "form_order": 1, + "id": 140, + "identifier": "kabuto", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 213, + "pokemon_id": 140, + "weight": 115 + }, + { + "base_id": 141, + "form_identifier": "", + "form_order": 1, + "id": 141, + "identifier": "kabutops", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 214, + "pokemon_id": 141, + "weight": 405 + }, + { + "base_id": 142, + "form_identifier": "", + "form_order": 1, + "id": 142, + "identifier": "aerodactyl", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 215, + "pokemon_id": 142, + "weight": 590 + }, + { + "base_id": 143, + "form_identifier": "", + "form_order": 1, + "id": 143, + "identifier": "snorlax", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 218, + "pokemon_id": 143, + "weight": 4600 + }, + { + "base_id": 144, + "form_identifier": "", + "form_order": 1, + "id": 144, + "identifier": "articuno", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 219, + "pokemon_id": 144, + "weight": 554 + }, + { + "base_id": 145, + "form_identifier": "", + "form_order": 1, + "id": 145, + "identifier": "zapdos", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 220, + "pokemon_id": 145, + "weight": 526 + }, + { + "base_id": 146, + "form_identifier": "", + "form_order": 1, + "id": 146, + "identifier": "moltres", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 221, + "pokemon_id": 146, + "weight": 600 + }, + { + "base_id": 147, + "form_identifier": "", + "form_order": 1, + "id": 147, + "identifier": "dratini", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 222, + "pokemon_id": 147, + "weight": 33 + }, + { + "base_id": 148, + "form_identifier": "", + "form_order": 1, + "id": 148, + "identifier": "dragonair", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 223, + "pokemon_id": 148, + "weight": 165 + }, + { + "base_id": 149, + "form_identifier": "", + "form_order": 1, + "id": 149, + "identifier": "dragonite", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 224, + "pokemon_id": 149, + "weight": 2100 + }, + { + "base_id": 150, + "form_identifier": "", + "form_order": 1, + "id": 150, + "identifier": "mewtwo", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 225, + "pokemon_id": 150, + "weight": 1220 + }, + { + "base_id": 151, + "form_identifier": "", + "form_order": 1, + "id": 151, + "identifier": "mew", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 228, + "pokemon_id": 151, + "weight": 40 + }, + { + "base_id": 152, + "form_identifier": "", + "form_order": 1, + "id": 152, + "identifier": "chikorita", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 229, + "pokemon_id": 152, + "weight": 64 + }, + { + "base_id": 153, + "form_identifier": "", + "form_order": 1, + "id": 153, + "identifier": "bayleef", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 230, + "pokemon_id": 153, + "weight": 158 + }, + { + "base_id": 154, + "form_identifier": "", + "form_order": 1, + "id": 154, + "identifier": "meganium", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 231, + "pokemon_id": 154, + "weight": 1005 + }, + { + "base_id": 155, + "form_identifier": "", + "form_order": 1, + "id": 155, + "identifier": "cyndaquil", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 232, + "pokemon_id": 155, + "weight": 79 + }, + { + "base_id": 156, + "form_identifier": "", + "form_order": 1, + "id": 156, + "identifier": "quilava", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 233, + "pokemon_id": 156, + "weight": 190 + }, + { + "base_id": 157, + "form_identifier": "", + "form_order": 1, + "id": 157, + "identifier": "typhlosion", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 234, + "pokemon_id": 157, + "weight": 795 + }, + { + "base_id": 158, + "form_identifier": "", + "form_order": 1, + "id": 158, + "identifier": "totodile", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 235, + "pokemon_id": 158, + "weight": 95 + }, + { + "base_id": 159, + "form_identifier": "", + "form_order": 1, + "id": 159, + "identifier": "croconaw", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 236, + "pokemon_id": 159, + "weight": 250 + }, + { + "base_id": 160, + "form_identifier": "", + "form_order": 1, + "id": 160, + "identifier": "feraligatr", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 237, + "pokemon_id": 160, + "weight": 888 + }, + { + "base_id": 161, + "form_identifier": "", + "form_order": 1, + "id": 161, + "identifier": "sentret", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 238, + "pokemon_id": 161, + "weight": 60 + }, + { + "base_id": 162, + "form_identifier": "", + "form_order": 1, + "id": 162, + "identifier": "furret", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 239, + "pokemon_id": 162, + "weight": 325 + }, + { + "base_id": 163, + "form_identifier": "", + "form_order": 1, + "id": 163, + "identifier": "hoothoot", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 240, + "pokemon_id": 163, + "weight": 212 + }, + { + "base_id": 164, + "form_identifier": "", + "form_order": 1, + "id": 164, + "identifier": "noctowl", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 241, + "pokemon_id": 164, + "weight": 408 + }, + { + "base_id": 165, + "form_identifier": "", + "form_order": 1, + "id": 165, + "identifier": "ledyba", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 242, + "pokemon_id": 165, + "weight": 108 + }, + { + "base_id": 166, + "form_identifier": "", + "form_order": 1, + "id": 166, + "identifier": "ledian", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 243, + "pokemon_id": 166, + "weight": 356 + }, + { + "base_id": 167, + "form_identifier": "", + "form_order": 1, + "id": 167, + "identifier": "spinarak", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 244, + "pokemon_id": 167, + "weight": 85 + }, + { + "base_id": 168, + "form_identifier": "", + "form_order": 1, + "id": 168, + "identifier": "ariados", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 245, + "pokemon_id": 168, + "weight": 335 + }, + { + "base_id": 169, + "form_identifier": "", + "form_order": 1, + "id": 169, + "identifier": "crobat", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 68, + "pokemon_id": 169, + "weight": 750 + }, + { + "base_id": 170, + "form_identifier": "", + "form_order": 1, + "id": 170, + "identifier": "chinchou", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 246, + "pokemon_id": 170, + "weight": 120 + }, + { + "base_id": 171, + "form_identifier": "", + "form_order": 1, + "id": 171, + "identifier": "lanturn", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 247, + "pokemon_id": 171, + "weight": 225 + }, + { + "base_id": 172, + "form_identifier": "", + "form_order": 1, + "id": 172, + "identifier": "pichu", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 34, + "pokemon_id": 172, + "weight": 20 + }, + { + "base_id": 173, + "form_identifier": "", + "form_order": 1, + "id": 173, + "identifier": "cleffa", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 56, + "pokemon_id": 173, + "weight": 30 + }, + { + "base_id": 174, + "form_identifier": "", + "form_order": 1, + "id": 174, + "identifier": "igglybuff", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 63, + "pokemon_id": 174, + "weight": 10 + }, + { + "base_id": 175, + "form_identifier": "", + "form_order": 1, + "id": 175, + "identifier": "togepi", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 248, + "pokemon_id": 175, + "weight": 15 + }, + { + "base_id": 176, + "form_identifier": "", + "form_order": 1, + "id": 176, + "identifier": "togetic", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 249, + "pokemon_id": 176, + "weight": 32 + }, + { + "base_id": 177, + "form_identifier": "", + "form_order": 1, + "id": 177, + "identifier": "natu", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 251, + "pokemon_id": 177, + "weight": 20 + }, + { + "base_id": 178, + "form_identifier": "", + "form_order": 1, + "id": 178, + "identifier": "xatu", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 252, + "pokemon_id": 178, + "weight": 150 + }, + { + "base_id": 179, + "form_identifier": "", + "form_order": 1, + "id": 179, + "identifier": "mareep", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 253, + "pokemon_id": 179, + "weight": 78 + }, + { + "base_id": 180, + "form_identifier": "", + "form_order": 1, + "id": 180, + "identifier": "flaaffy", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 254, + "pokemon_id": 180, + "weight": 133 + }, + { + "base_id": 181, + "form_identifier": "", + "form_order": 1, + "id": 181, + "identifier": "ampharos", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 255, + "pokemon_id": 181, + "weight": 615 + }, + { + "base_id": 182, + "form_identifier": "", + "form_order": 1, + "id": 182, + "identifier": "bellossom", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 72, + "pokemon_id": 182, + "weight": 58 + }, + { + "base_id": 183, + "form_identifier": "", + "form_order": 1, + "id": 183, + "identifier": "marill", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 258, + "pokemon_id": 183, + "weight": 85 + }, + { + "base_id": 184, + "form_identifier": "", + "form_order": 1, + "id": 184, + "identifier": "azumarill", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 259, + "pokemon_id": 184, + "weight": 285 + }, + { + "base_id": 185, + "form_identifier": "", + "form_order": 1, + "id": 185, + "identifier": "sudowoodo", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 261, + "pokemon_id": 185, + "weight": 380 + }, + { + "base_id": 186, + "form_identifier": "", + "form_order": 1, + "id": 186, + "identifier": "politoed", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 94, + "pokemon_id": 186, + "weight": 339 + }, + { + "base_id": 187, + "form_identifier": "", + "form_order": 1, + "id": 187, + "identifier": "hoppip", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 262, + "pokemon_id": 187, + "weight": 5 + }, + { + "base_id": 188, + "form_identifier": "", + "form_order": 1, + "id": 188, + "identifier": "skiploom", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 263, + "pokemon_id": 188, + "weight": 10 + }, + { + "base_id": 189, + "form_identifier": "", + "form_order": 1, + "id": 189, + "identifier": "jumpluff", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 264, + "pokemon_id": 189, + "weight": 30 + }, + { + "base_id": 190, + "form_identifier": "", + "form_order": 1, + "id": 190, + "identifier": "aipom", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 265, + "pokemon_id": 190, + "weight": 115 + }, + { + "base_id": 191, + "form_identifier": "", + "form_order": 1, + "id": 191, + "identifier": "sunkern", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 267, + "pokemon_id": 191, + "weight": 18 + }, + { + "base_id": 192, + "form_identifier": "", + "form_order": 1, + "id": 192, + "identifier": "sunflora", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 268, + "pokemon_id": 192, + "weight": 85 + }, + { + "base_id": 193, + "form_identifier": "", + "form_order": 1, + "id": 193, + "identifier": "yanma", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 269, + "pokemon_id": 193, + "weight": 380 + }, + { + "base_id": 194, + "form_identifier": "", + "form_order": 1, + "id": 194, + "identifier": "wooper", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 271, + "pokemon_id": 194, + "weight": 85 + }, + { + "base_id": 195, + "form_identifier": "", + "form_order": 1, + "id": 195, + "identifier": "quagsire", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 272, + "pokemon_id": 195, + "weight": 750 + }, + { + "base_id": 196, + "form_identifier": "", + "form_order": 1, + "id": 196, + "identifier": "espeon", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 203, + "pokemon_id": 196, + "weight": 265 + }, + { + "base_id": 197, + "form_identifier": "", + "form_order": 1, + "id": 197, + "identifier": "umbreon", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 204, + "pokemon_id": 197, + "weight": 270 + }, + { + "base_id": 198, + "form_identifier": "", + "form_order": 1, + "id": 198, + "identifier": "murkrow", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 273, + "pokemon_id": 198, + "weight": 21 + }, + { + "base_id": 199, + "form_identifier": "", + "form_order": 1, + "id": 199, + "identifier": "slowking", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 118, + "pokemon_id": 199, + "weight": 795 + }, + { + "base_id": 200, + "form_identifier": "", + "form_order": 1, + "id": 200, + "identifier": "misdreavus", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 275, + "pokemon_id": 200, + "weight": 10 + }, + { + "base_id": 201, + "form_identifier": "a", + "form_order": 1, + "id": 201, + "identifier": "unown", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 277, + "pokemon_id": 201, + "weight": 50 + }, + { + "base_id": 202, + "form_identifier": "", + "form_order": 1, + "id": 202, + "identifier": "wobbuffet", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 306, + "pokemon_id": 202, + "weight": 285 + }, + { + "base_id": 203, + "form_identifier": "", + "form_order": 1, + "id": 203, + "identifier": "girafarig", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 307, + "pokemon_id": 203, + "weight": 415 + }, + { + "base_id": 204, + "form_identifier": "", + "form_order": 1, + "id": 204, + "identifier": "pineco", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 308, + "pokemon_id": 204, + "weight": 72 + }, + { + "base_id": 205, + "form_identifier": "", + "form_order": 1, + "id": 205, + "identifier": "forretress", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 309, + "pokemon_id": 205, + "weight": 1258 + }, + { + "base_id": 206, + "form_identifier": "", + "form_order": 1, + "id": 206, + "identifier": "dunsparce", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 310, + "pokemon_id": 206, + "weight": 140 + }, + { + "base_id": 207, + "form_identifier": "", + "form_order": 1, + "id": 207, + "identifier": "gligar", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 311, + "pokemon_id": 207, + "weight": 648 + }, + { + "base_id": 208, + "form_identifier": "", + "form_order": 1, + "id": 208, + "identifier": "steelix", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 138, + "pokemon_id": 208, + "weight": 4000 + }, + { + "base_id": 209, + "form_identifier": "", + "form_order": 1, + "id": 209, + "identifier": "snubbull", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 313, + "pokemon_id": 209, + "weight": 78 + }, + { + "base_id": 210, + "form_identifier": "", + "form_order": 1, + "id": 210, + "identifier": "granbull", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 314, + "pokemon_id": 210, + "weight": 487 + }, + { + "base_id": 211, + "form_identifier": "", + "form_order": 1, + "id": 211, + "identifier": "qwilfish", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 315, + "pokemon_id": 211, + "weight": 39 + }, + { + "base_id": 212, + "form_identifier": "", + "form_order": 1, + "id": 212, + "identifier": "scizor", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 181, + "pokemon_id": 212, + "weight": 1180 + }, + { + "base_id": 213, + "form_identifier": "", + "form_order": 1, + "id": 213, + "identifier": "shuckle", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 316, + "pokemon_id": 213, + "weight": 205 + }, + { + "base_id": 214, + "form_identifier": "", + "form_order": 1, + "id": 214, + "identifier": "heracross", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 317, + "pokemon_id": 214, + "weight": 540 + }, + { + "base_id": 215, + "form_identifier": "", + "form_order": 1, + "id": 215, + "identifier": "sneasel", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 319, + "pokemon_id": 215, + "weight": 280 + }, + { + "base_id": 216, + "form_identifier": "", + "form_order": 1, + "id": 216, + "identifier": "teddiursa", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 321, + "pokemon_id": 216, + "weight": 88 + }, + { + "base_id": 217, + "form_identifier": "", + "form_order": 1, + "id": 217, + "identifier": "ursaring", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 322, + "pokemon_id": 217, + "weight": 1258 + }, + { + "base_id": 218, + "form_identifier": "", + "form_order": 1, + "id": 218, + "identifier": "slugma", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 323, + "pokemon_id": 218, + "weight": 350 + }, + { + "base_id": 219, + "form_identifier": "", + "form_order": 1, + "id": 219, + "identifier": "magcargo", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 324, + "pokemon_id": 219, + "weight": 550 + }, + { + "base_id": 220, + "form_identifier": "", + "form_order": 1, + "id": 220, + "identifier": "swinub", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 325, + "pokemon_id": 220, + "weight": 65 + }, + { + "base_id": 221, + "form_identifier": "", + "form_order": 1, + "id": 221, + "identifier": "piloswine", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 326, + "pokemon_id": 221, + "weight": 558 + }, + { + "base_id": 222, + "form_identifier": "", + "form_order": 1, + "id": 222, + "identifier": "corsola", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 328, + "pokemon_id": 222, + "weight": 50 + }, + { + "base_id": 223, + "form_identifier": "", + "form_order": 1, + "id": 223, + "identifier": "remoraid", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 329, + "pokemon_id": 223, + "weight": 120 + }, + { + "base_id": 224, + "form_identifier": "", + "form_order": 1, + "id": 224, + "identifier": "octillery", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 330, + "pokemon_id": 224, + "weight": 285 + }, + { + "base_id": 225, + "form_identifier": "", + "form_order": 1, + "id": 225, + "identifier": "delibird", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 331, + "pokemon_id": 225, + "weight": 160 + }, + { + "base_id": 226, + "form_identifier": "", + "form_order": 1, + "id": 226, + "identifier": "mantine", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 333, + "pokemon_id": 226, + "weight": 2200 + }, + { + "base_id": 227, + "form_identifier": "", + "form_order": 1, + "id": 227, + "identifier": "skarmory", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 334, + "pokemon_id": 227, + "weight": 505 + }, + { + "base_id": 228, + "form_identifier": "", + "form_order": 1, + "id": 228, + "identifier": "houndour", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 335, + "pokemon_id": 228, + "weight": 108 + }, + { + "base_id": 229, + "form_identifier": "", + "form_order": 1, + "id": 229, + "identifier": "houndoom", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 336, + "pokemon_id": 229, + "weight": 350 + }, + { + "base_id": 230, + "form_identifier": "", + "form_order": 1, + "id": 230, + "identifier": "kingdra", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 173, + "pokemon_id": 230, + "weight": 1520 + }, + { + "base_id": 231, + "form_identifier": "", + "form_order": 1, + "id": 231, + "identifier": "phanpy", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 338, + "pokemon_id": 231, + "weight": 335 + }, + { + "base_id": 232, + "form_identifier": "", + "form_order": 1, + "id": 232, + "identifier": "donphan", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 339, + "pokemon_id": 232, + "weight": 1200 + }, + { + "base_id": 233, + "form_identifier": "", + "form_order": 1, + "id": 233, + "identifier": "porygon2", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 209, + "pokemon_id": 233, + "weight": 325 + }, + { + "base_id": 234, + "form_identifier": "", + "form_order": 1, + "id": 234, + "identifier": "stantler", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 340, + "pokemon_id": 234, + "weight": 712 + }, + { + "base_id": 235, + "form_identifier": "", + "form_order": 1, + "id": 235, + "identifier": "smeargle", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 341, + "pokemon_id": 235, + "weight": 580 + }, + { + "base_id": 236, + "form_identifier": "", + "form_order": 1, + "id": 236, + "identifier": "tyrogue", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 153, + "pokemon_id": 236, + "weight": 210 + }, + { + "base_id": 237, + "form_identifier": "", + "form_order": 1, + "id": 237, + "identifier": "hitmontop", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 156, + "pokemon_id": 237, + "weight": 480 + }, + { + "base_id": 238, + "form_identifier": "", + "form_order": 1, + "id": 238, + "identifier": "smoochum", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 183, + "pokemon_id": 238, + "weight": 60 + }, + { + "base_id": 239, + "form_identifier": "", + "form_order": 1, + "id": 239, + "identifier": "elekid", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 185, + "pokemon_id": 239, + "weight": 235 + }, + { + "base_id": 240, + "form_identifier": "", + "form_order": 1, + "id": 240, + "identifier": "magby", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 188, + "pokemon_id": 240, + "weight": 214 + }, + { + "base_id": 241, + "form_identifier": "", + "form_order": 1, + "id": 241, + "identifier": "miltank", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 342, + "pokemon_id": 241, + "weight": 755 + }, + { + "base_id": 242, + "form_identifier": "", + "form_order": 1, + "id": 242, + "identifier": "blissey", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 166, + "pokemon_id": 242, + "weight": 468 + }, + { + "base_id": 243, + "form_identifier": "", + "form_order": 1, + "id": 243, + "identifier": "raikou", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 343, + "pokemon_id": 243, + "weight": 1780 + }, + { + "base_id": 244, + "form_identifier": "", + "form_order": 1, + "id": 244, + "identifier": "entei", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 344, + "pokemon_id": 244, + "weight": 1980 + }, + { + "base_id": 245, + "form_identifier": "", + "form_order": 1, + "id": 245, + "identifier": "suicune", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 345, + "pokemon_id": 245, + "weight": 1870 + }, + { + "base_id": 246, + "form_identifier": "", + "form_order": 1, + "id": 246, + "identifier": "larvitar", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 346, + "pokemon_id": 246, + "weight": 720 + }, + { + "base_id": 247, + "form_identifier": "", + "form_order": 1, + "id": 247, + "identifier": "pupitar", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 347, + "pokemon_id": 247, + "weight": 1520 + }, + { + "base_id": 248, + "form_identifier": "", + "form_order": 1, + "id": 248, + "identifier": "tyranitar", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 348, + "pokemon_id": 248, + "weight": 2020 + }, + { + "base_id": 249, + "form_identifier": "", + "form_order": 1, + "id": 249, + "identifier": "lugia", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 350, + "pokemon_id": 249, + "weight": 2160 + }, + { + "base_id": 250, + "form_identifier": "", + "form_order": 1, + "id": 250, + "identifier": "ho-oh", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 351, + "pokemon_id": 250, + "weight": 1990 + }, + { + "base_id": 251, + "form_identifier": "", + "form_order": 1, + "id": 251, + "identifier": "celebi", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 352, + "pokemon_id": 251, + "weight": 50 + }, + { + "base_id": 252, + "form_identifier": "", + "form_order": 1, + "id": 252, + "identifier": "treecko", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 353, + "pokemon_id": 252, + "weight": 50 + }, + { + "base_id": 253, + "form_identifier": "", + "form_order": 1, + "id": 253, + "identifier": "grovyle", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 354, + "pokemon_id": 253, + "weight": 216 + }, + { + "base_id": 254, + "form_identifier": "", + "form_order": 1, + "id": 254, + "identifier": "sceptile", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 355, + "pokemon_id": 254, + "weight": 522 + }, + { + "base_id": 255, + "form_identifier": "", + "form_order": 1, + "id": 255, + "identifier": "torchic", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 357, + "pokemon_id": 255, + "weight": 25 + }, + { + "base_id": 256, + "form_identifier": "", + "form_order": 1, + "id": 256, + "identifier": "combusken", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 358, + "pokemon_id": 256, + "weight": 195 + }, + { + "base_id": 257, + "form_identifier": "", + "form_order": 1, + "id": 257, + "identifier": "blaziken", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 359, + "pokemon_id": 257, + "weight": 520 + }, + { + "base_id": 258, + "form_identifier": "", + "form_order": 1, + "id": 258, + "identifier": "mudkip", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 361, + "pokemon_id": 258, + "weight": 76 + }, + { + "base_id": 259, + "form_identifier": "", + "form_order": 1, + "id": 259, + "identifier": "marshtomp", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 362, + "pokemon_id": 259, + "weight": 280 + }, + { + "base_id": 260, + "form_identifier": "", + "form_order": 1, + "id": 260, + "identifier": "swampert", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 363, + "pokemon_id": 260, + "weight": 819 + }, + { + "base_id": 261, + "form_identifier": "", + "form_order": 1, + "id": 261, + "identifier": "poochyena", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 365, + "pokemon_id": 261, + "weight": 136 + }, + { + "base_id": 262, + "form_identifier": "", + "form_order": 1, + "id": 262, + "identifier": "mightyena", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 366, + "pokemon_id": 262, + "weight": 370 + }, + { + "base_id": 263, + "form_identifier": "", + "form_order": 1, + "id": 263, + "identifier": "zigzagoon", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 367, + "pokemon_id": 263, + "weight": 175 + }, + { + "base_id": 264, + "form_identifier": "", + "form_order": 1, + "id": 264, + "identifier": "linoone", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 368, + "pokemon_id": 264, + "weight": 325 + }, + { + "base_id": 265, + "form_identifier": "", + "form_order": 1, + "id": 265, + "identifier": "wurmple", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 369, + "pokemon_id": 265, + "weight": 36 + }, + { + "base_id": 266, + "form_identifier": "", + "form_order": 1, + "id": 266, + "identifier": "silcoon", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 370, + "pokemon_id": 266, + "weight": 100 + }, + { + "base_id": 267, + "form_identifier": "", + "form_order": 1, + "id": 267, + "identifier": "beautifly", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 371, + "pokemon_id": 267, + "weight": 284 + }, + { + "base_id": 268, + "form_identifier": "", + "form_order": 1, + "id": 268, + "identifier": "cascoon", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 372, + "pokemon_id": 268, + "weight": 115 + }, + { + "base_id": 269, + "form_identifier": "", + "form_order": 1, + "id": 269, + "identifier": "dustox", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 373, + "pokemon_id": 269, + "weight": 316 + }, + { + "base_id": 270, + "form_identifier": "", + "form_order": 1, + "id": 270, + "identifier": "lotad", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 374, + "pokemon_id": 270, + "weight": 26 + }, + { + "base_id": 271, + "form_identifier": "", + "form_order": 1, + "id": 271, + "identifier": "lombre", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 375, + "pokemon_id": 271, + "weight": 325 + }, + { + "base_id": 272, + "form_identifier": "", + "form_order": 1, + "id": 272, + "identifier": "ludicolo", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 376, + "pokemon_id": 272, + "weight": 550 + }, + { + "base_id": 273, + "form_identifier": "", + "form_order": 1, + "id": 273, + "identifier": "seedot", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 377, + "pokemon_id": 273, + "weight": 40 + }, + { + "base_id": 274, + "form_identifier": "", + "form_order": 1, + "id": 274, + "identifier": "nuzleaf", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 378, + "pokemon_id": 274, + "weight": 280 + }, + { + "base_id": 275, + "form_identifier": "", + "form_order": 1, + "id": 275, + "identifier": "shiftry", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 379, + "pokemon_id": 275, + "weight": 596 + }, + { + "base_id": 276, + "form_identifier": "", + "form_order": 1, + "id": 276, + "identifier": "taillow", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 380, + "pokemon_id": 276, + "weight": 23 + }, + { + "base_id": 277, + "form_identifier": "", + "form_order": 1, + "id": 277, + "identifier": "swellow", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 381, + "pokemon_id": 277, + "weight": 198 + }, + { + "base_id": 278, + "form_identifier": "", + "form_order": 1, + "id": 278, + "identifier": "wingull", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 382, + "pokemon_id": 278, + "weight": 95 + }, + { + "base_id": 279, + "form_identifier": "", + "form_order": 1, + "id": 279, + "identifier": "pelipper", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 383, + "pokemon_id": 279, + "weight": 280 + }, + { + "base_id": 280, + "form_identifier": "", + "form_order": 1, + "id": 280, + "identifier": "ralts", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 384, + "pokemon_id": 280, + "weight": 66 + }, + { + "base_id": 281, + "form_identifier": "", + "form_order": 1, + "id": 281, + "identifier": "kirlia", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 385, + "pokemon_id": 281, + "weight": 202 + }, + { + "base_id": 282, + "form_identifier": "", + "form_order": 1, + "id": 282, + "identifier": "gardevoir", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 386, + "pokemon_id": 282, + "weight": 484 + }, + { + "base_id": 283, + "form_identifier": "", + "form_order": 1, + "id": 283, + "identifier": "surskit", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 390, + "pokemon_id": 283, + "weight": 17 + }, + { + "base_id": 284, + "form_identifier": "", + "form_order": 1, + "id": 284, + "identifier": "masquerain", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 391, + "pokemon_id": 284, + "weight": 36 + }, + { + "base_id": 285, + "form_identifier": "", + "form_order": 1, + "id": 285, + "identifier": "shroomish", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 392, + "pokemon_id": 285, + "weight": 45 + }, + { + "base_id": 286, + "form_identifier": "", + "form_order": 1, + "id": 286, + "identifier": "breloom", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 393, + "pokemon_id": 286, + "weight": 392 + }, + { + "base_id": 287, + "form_identifier": "", + "form_order": 1, + "id": 287, + "identifier": "slakoth", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 394, + "pokemon_id": 287, + "weight": 240 + }, + { + "base_id": 288, + "form_identifier": "", + "form_order": 1, + "id": 288, + "identifier": "vigoroth", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 395, + "pokemon_id": 288, + "weight": 465 + }, + { + "base_id": 289, + "form_identifier": "", + "form_order": 1, + "id": 289, + "identifier": "slaking", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 396, + "pokemon_id": 289, + "weight": 1305 + }, + { + "base_id": 290, + "form_identifier": "", + "form_order": 1, + "id": 290, + "identifier": "nincada", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 397, + "pokemon_id": 290, + "weight": 55 + }, + { + "base_id": 291, + "form_identifier": "", + "form_order": 1, + "id": 291, + "identifier": "ninjask", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 398, + "pokemon_id": 291, + "weight": 120 + }, + { + "base_id": 292, + "form_identifier": "", + "form_order": 1, + "id": 292, + "identifier": "shedinja", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 399, + "pokemon_id": 292, + "weight": 12 + }, + { + "base_id": 293, + "form_identifier": "", + "form_order": 1, + "id": 293, + "identifier": "whismur", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 400, + "pokemon_id": 293, + "weight": 163 + }, + { + "base_id": 294, + "form_identifier": "", + "form_order": 1, + "id": 294, + "identifier": "loudred", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 401, + "pokemon_id": 294, + "weight": 405 + }, + { + "base_id": 295, + "form_identifier": "", + "form_order": 1, + "id": 295, + "identifier": "exploud", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 402, + "pokemon_id": 295, + "weight": 840 + }, + { + "base_id": 296, + "form_identifier": "", + "form_order": 1, + "id": 296, + "identifier": "makuhita", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 403, + "pokemon_id": 296, + "weight": 864 + }, + { + "base_id": 297, + "form_identifier": "", + "form_order": 1, + "id": 297, + "identifier": "hariyama", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 404, + "pokemon_id": 297, + "weight": 2538 + }, + { + "base_id": 298, + "form_identifier": "", + "form_order": 1, + "id": 298, + "identifier": "azurill", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 257, + "pokemon_id": 298, + "weight": 20 + }, + { + "base_id": 299, + "form_identifier": "", + "form_order": 1, + "id": 299, + "identifier": "nosepass", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 405, + "pokemon_id": 299, + "weight": 970 + }, + { + "base_id": 300, + "form_identifier": "", + "form_order": 1, + "id": 300, + "identifier": "skitty", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 407, + "pokemon_id": 300, + "weight": 110 + }, + { + "base_id": 301, + "form_identifier": "", + "form_order": 1, + "id": 301, + "identifier": "delcatty", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 408, + "pokemon_id": 301, + "weight": 326 + }, + { + "base_id": 302, + "form_identifier": "", + "form_order": 1, + "id": 302, + "identifier": "sableye", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 409, + "pokemon_id": 302, + "weight": 110 + }, + { + "base_id": 303, + "form_identifier": "", + "form_order": 1, + "id": 303, + "identifier": "mawile", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 411, + "pokemon_id": 303, + "weight": 115 + }, + { + "base_id": 304, + "form_identifier": "", + "form_order": 1, + "id": 304, + "identifier": "aron", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 413, + "pokemon_id": 304, + "weight": 600 + }, + { + "base_id": 305, + "form_identifier": "", + "form_order": 1, + "id": 305, + "identifier": "lairon", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 414, + "pokemon_id": 305, + "weight": 1200 + }, + { + "base_id": 306, + "form_identifier": "", + "form_order": 1, + "id": 306, + "identifier": "aggron", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 415, + "pokemon_id": 306, + "weight": 3600 + }, + { + "base_id": 307, + "form_identifier": "", + "form_order": 1, + "id": 307, + "identifier": "meditite", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 417, + "pokemon_id": 307, + "weight": 112 + }, + { + "base_id": 308, + "form_identifier": "", + "form_order": 1, + "id": 308, + "identifier": "medicham", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 418, + "pokemon_id": 308, + "weight": 315 + }, + { + "base_id": 309, + "form_identifier": "", + "form_order": 1, + "id": 309, + "identifier": "electrike", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 420, + "pokemon_id": 309, + "weight": 152 + }, + { + "base_id": 310, + "form_identifier": "", + "form_order": 1, + "id": 310, + "identifier": "manectric", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 421, + "pokemon_id": 310, + "weight": 402 + }, + { + "base_id": 311, + "form_identifier": "", + "form_order": 1, + "id": 311, + "identifier": "plusle", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 423, + "pokemon_id": 311, + "weight": 42 + }, + { + "base_id": 312, + "form_identifier": "", + "form_order": 1, + "id": 312, + "identifier": "minun", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 424, + "pokemon_id": 312, + "weight": 42 + }, + { + "base_id": 313, + "form_identifier": "", + "form_order": 1, + "id": 313, + "identifier": "volbeat", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 425, + "pokemon_id": 313, + "weight": 177 + }, + { + "base_id": 314, + "form_identifier": "", + "form_order": 1, + "id": 314, + "identifier": "illumise", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 426, + "pokemon_id": 314, + "weight": 177 + }, + { + "base_id": 315, + "form_identifier": "", + "form_order": 1, + "id": 315, + "identifier": "roselia", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 428, + "pokemon_id": 315, + "weight": 20 + }, + { + "base_id": 316, + "form_identifier": "", + "form_order": 1, + "id": 316, + "identifier": "gulpin", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 430, + "pokemon_id": 316, + "weight": 103 + }, + { + "base_id": 317, + "form_identifier": "", + "form_order": 1, + "id": 317, + "identifier": "swalot", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 431, + "pokemon_id": 317, + "weight": 800 + }, + { + "base_id": 318, + "form_identifier": "", + "form_order": 1, + "id": 318, + "identifier": "carvanha", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 432, + "pokemon_id": 318, + "weight": 208 + }, + { + "base_id": 319, + "form_identifier": "", + "form_order": 1, + "id": 319, + "identifier": "sharpedo", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 433, + "pokemon_id": 319, + "weight": 888 + }, + { + "base_id": 320, + "form_identifier": "", + "form_order": 1, + "id": 320, + "identifier": "wailmer", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 435, + "pokemon_id": 320, + "weight": 1300 + }, + { + "base_id": 321, + "form_identifier": "", + "form_order": 1, + "id": 321, + "identifier": "wailord", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 436, + "pokemon_id": 321, + "weight": 3980 + }, + { + "base_id": 322, + "form_identifier": "", + "form_order": 1, + "id": 322, + "identifier": "numel", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 437, + "pokemon_id": 322, + "weight": 240 + }, + { + "base_id": 323, + "form_identifier": "", + "form_order": 1, + "id": 323, + "identifier": "camerupt", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 438, + "pokemon_id": 323, + "weight": 2200 + }, + { + "base_id": 324, + "form_identifier": "", + "form_order": 1, + "id": 324, + "identifier": "torkoal", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 440, + "pokemon_id": 324, + "weight": 804 + }, + { + "base_id": 325, + "form_identifier": "", + "form_order": 1, + "id": 325, + "identifier": "spoink", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 441, + "pokemon_id": 325, + "weight": 306 + }, + { + "base_id": 326, + "form_identifier": "", + "form_order": 1, + "id": 326, + "identifier": "grumpig", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 442, + "pokemon_id": 326, + "weight": 715 + }, + { + "base_id": 327, + "form_identifier": "", + "form_order": 1, + "id": 327, + "identifier": "spinda", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 443, + "pokemon_id": 327, + "weight": 50 + }, + { + "base_id": 328, + "form_identifier": "", + "form_order": 1, + "id": 328, + "identifier": "trapinch", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 444, + "pokemon_id": 328, + "weight": 150 + }, + { + "base_id": 329, + "form_identifier": "", + "form_order": 1, + "id": 329, + "identifier": "vibrava", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 445, + "pokemon_id": 329, + "weight": 153 + }, + { + "base_id": 330, + "form_identifier": "", + "form_order": 1, + "id": 330, + "identifier": "flygon", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 446, + "pokemon_id": 330, + "weight": 820 + }, + { + "base_id": 331, + "form_identifier": "", + "form_order": 1, + "id": 331, + "identifier": "cacnea", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 447, + "pokemon_id": 331, + "weight": 513 + }, + { + "base_id": 332, + "form_identifier": "", + "form_order": 1, + "id": 332, + "identifier": "cacturne", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 448, + "pokemon_id": 332, + "weight": 774 + }, + { + "base_id": 333, + "form_identifier": "", + "form_order": 1, + "id": 333, + "identifier": "swablu", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 449, + "pokemon_id": 333, + "weight": 12 + }, + { + "base_id": 334, + "form_identifier": "", + "form_order": 1, + "id": 334, + "identifier": "altaria", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 450, + "pokemon_id": 334, + "weight": 206 + }, + { + "base_id": 335, + "form_identifier": "", + "form_order": 1, + "id": 335, + "identifier": "zangoose", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 452, + "pokemon_id": 335, + "weight": 403 + }, + { + "base_id": 336, + "form_identifier": "", + "form_order": 1, + "id": 336, + "identifier": "seviper", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 453, + "pokemon_id": 336, + "weight": 525 + }, + { + "base_id": 337, + "form_identifier": "", + "form_order": 1, + "id": 337, + "identifier": "lunatone", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 454, + "pokemon_id": 337, + "weight": 1680 + }, + { + "base_id": 338, + "form_identifier": "", + "form_order": 1, + "id": 338, + "identifier": "solrock", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 455, + "pokemon_id": 338, + "weight": 1540 + }, + { + "base_id": 339, + "form_identifier": "", + "form_order": 1, + "id": 339, + "identifier": "barboach", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 456, + "pokemon_id": 339, + "weight": 19 + }, + { + "base_id": 340, + "form_identifier": "", + "form_order": 1, + "id": 340, + "identifier": "whiscash", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 457, + "pokemon_id": 340, + "weight": 236 + }, + { + "base_id": 341, + "form_identifier": "", + "form_order": 1, + "id": 341, + "identifier": "corphish", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 458, + "pokemon_id": 341, + "weight": 115 + }, + { + "base_id": 342, + "form_identifier": "", + "form_order": 1, + "id": 342, + "identifier": "crawdaunt", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 459, + "pokemon_id": 342, + "weight": 328 + }, + { + "base_id": 343, + "form_identifier": "", + "form_order": 1, + "id": 343, + "identifier": "baltoy", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 460, + "pokemon_id": 343, + "weight": 215 + }, + { + "base_id": 344, + "form_identifier": "", + "form_order": 1, + "id": 344, + "identifier": "claydol", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 461, + "pokemon_id": 344, + "weight": 1080 + }, + { + "base_id": 345, + "form_identifier": "", + "form_order": 1, + "id": 345, + "identifier": "lileep", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 462, + "pokemon_id": 345, + "weight": 238 + }, + { + "base_id": 346, + "form_identifier": "", + "form_order": 1, + "id": 346, + "identifier": "cradily", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 463, + "pokemon_id": 346, + "weight": 604 + }, + { + "base_id": 347, + "form_identifier": "", + "form_order": 1, + "id": 347, + "identifier": "anorith", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 464, + "pokemon_id": 347, + "weight": 125 + }, + { + "base_id": 348, + "form_identifier": "", + "form_order": 1, + "id": 348, + "identifier": "armaldo", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 465, + "pokemon_id": 348, + "weight": 682 + }, + { + "base_id": 349, + "form_identifier": "", + "form_order": 1, + "id": 349, + "identifier": "feebas", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 466, + "pokemon_id": 349, + "weight": 74 + }, + { + "base_id": 350, + "form_identifier": "", + "form_order": 1, + "id": 350, + "identifier": "milotic", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 467, + "pokemon_id": 350, + "weight": 1620 + }, + { + "base_id": 351, + "form_identifier": "", + "form_order": 1, + "id": 351, + "identifier": "castform", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 468, + "pokemon_id": 351, + "weight": 8 + }, + { + "base_id": 352, + "form_identifier": "", + "form_order": 1, + "id": 352, + "identifier": "kecleon", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 472, + "pokemon_id": 352, + "weight": 220 + }, + { + "base_id": 353, + "form_identifier": "", + "form_order": 1, + "id": 353, + "identifier": "shuppet", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 473, + "pokemon_id": 353, + "weight": 23 + }, + { + "base_id": 354, + "form_identifier": "", + "form_order": 1, + "id": 354, + "identifier": "banette", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 474, + "pokemon_id": 354, + "weight": 125 + }, + { + "base_id": 355, + "form_identifier": "", + "form_order": 1, + "id": 355, + "identifier": "duskull", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 476, + "pokemon_id": 355, + "weight": 150 + }, + { + "base_id": 356, + "form_identifier": "", + "form_order": 1, + "id": 356, + "identifier": "dusclops", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 477, + "pokemon_id": 356, + "weight": 306 + }, + { + "base_id": 357, + "form_identifier": "", + "form_order": 1, + "id": 357, + "identifier": "tropius", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 479, + "pokemon_id": 357, + "weight": 1000 + }, + { + "base_id": 358, + "form_identifier": "", + "form_order": 1, + "id": 358, + "identifier": "chimecho", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 481, + "pokemon_id": 358, + "weight": 10 + }, + { + "base_id": 359, + "form_identifier": "", + "form_order": 1, + "id": 359, + "identifier": "absol", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 482, + "pokemon_id": 359, + "weight": 470 + }, + { + "base_id": 360, + "form_identifier": "", + "form_order": 1, + "id": 360, + "identifier": "wynaut", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 305, + "pokemon_id": 360, + "weight": 140 + }, + { + "base_id": 361, + "form_identifier": "", + "form_order": 1, + "id": 361, + "identifier": "snorunt", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 484, + "pokemon_id": 361, + "weight": 168 + }, + { + "base_id": 362, + "form_identifier": "", + "form_order": 1, + "id": 362, + "identifier": "glalie", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 485, + "pokemon_id": 362, + "weight": 2565 + }, + { + "base_id": 363, + "form_identifier": "", + "form_order": 1, + "id": 363, + "identifier": "spheal", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 488, + "pokemon_id": 363, + "weight": 395 + }, + { + "base_id": 364, + "form_identifier": "", + "form_order": 1, + "id": 364, + "identifier": "sealeo", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 489, + "pokemon_id": 364, + "weight": 876 + }, + { + "base_id": 365, + "form_identifier": "", + "form_order": 1, + "id": 365, + "identifier": "walrein", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 490, + "pokemon_id": 365, + "weight": 1506 + }, + { + "base_id": 366, + "form_identifier": "", + "form_order": 1, + "id": 366, + "identifier": "clamperl", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 491, + "pokemon_id": 366, + "weight": 525 + }, + { + "base_id": 367, + "form_identifier": "", + "form_order": 1, + "id": 367, + "identifier": "huntail", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 492, + "pokemon_id": 367, + "weight": 270 + }, + { + "base_id": 368, + "form_identifier": "", + "form_order": 1, + "id": 368, + "identifier": "gorebyss", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 493, + "pokemon_id": 368, + "weight": 226 + }, + { + "base_id": 369, + "form_identifier": "", + "form_order": 1, + "id": 369, + "identifier": "relicanth", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 494, + "pokemon_id": 369, + "weight": 234 + }, + { + "base_id": 370, + "form_identifier": "", + "form_order": 1, + "id": 370, + "identifier": "luvdisc", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 495, + "pokemon_id": 370, + "weight": 87 + }, + { + "base_id": 371, + "form_identifier": "", + "form_order": 1, + "id": 371, + "identifier": "bagon", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 496, + "pokemon_id": 371, + "weight": 421 + }, + { + "base_id": 372, + "form_identifier": "", + "form_order": 1, + "id": 372, + "identifier": "shelgon", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 497, + "pokemon_id": 372, + "weight": 1105 + }, + { + "base_id": 373, + "form_identifier": "", + "form_order": 1, + "id": 373, + "identifier": "salamence", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 498, + "pokemon_id": 373, + "weight": 1026 + }, + { + "base_id": 374, + "form_identifier": "", + "form_order": 1, + "id": 374, + "identifier": "beldum", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 500, + "pokemon_id": 374, + "weight": 952 + }, + { + "base_id": 375, + "form_identifier": "", + "form_order": 1, + "id": 375, + "identifier": "metang", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 501, + "pokemon_id": 375, + "weight": 2025 + }, + { + "base_id": 376, + "form_identifier": "", + "form_order": 1, + "id": 376, + "identifier": "metagross", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 502, + "pokemon_id": 376, + "weight": 5500 + }, + { + "base_id": 377, + "form_identifier": "", + "form_order": 1, + "id": 377, + "identifier": "regirock", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 504, + "pokemon_id": 377, + "weight": 2300 + }, + { + "base_id": 378, + "form_identifier": "", + "form_order": 1, + "id": 378, + "identifier": "regice", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 505, + "pokemon_id": 378, + "weight": 1750 + }, + { + "base_id": 379, + "form_identifier": "", + "form_order": 1, + "id": 379, + "identifier": "registeel", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 506, + "pokemon_id": 379, + "weight": 2050 + }, + { + "base_id": 380, + "form_identifier": "", + "form_order": 1, + "id": 380, + "identifier": "latias", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 507, + "pokemon_id": 380, + "weight": 400 + }, + { + "base_id": 381, + "form_identifier": "", + "form_order": 1, + "id": 381, + "identifier": "latios", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 509, + "pokemon_id": 381, + "weight": 600 + }, + { + "base_id": 382, + "form_identifier": "", + "form_order": 1, + "id": 382, + "identifier": "kyogre", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 511, + "pokemon_id": 382, + "weight": 3520 + }, + { + "base_id": 383, + "form_identifier": "", + "form_order": 1, + "id": 383, + "identifier": "groudon", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 513, + "pokemon_id": 383, + "weight": 9500 + }, + { + "base_id": 384, + "form_identifier": "", + "form_order": 1, + "id": 384, + "identifier": "rayquaza", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 515, + "pokemon_id": 384, + "weight": 2065 + }, + { + "base_id": 385, + "form_identifier": "", + "form_order": 1, + "id": 385, + "identifier": "jirachi", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 517, + "pokemon_id": 385, + "weight": 11 + }, + { + "base_id": 386, + "form_identifier": "normal", + "form_order": 1, + "id": 386, + "identifier": "deoxys", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 518, + "pokemon_id": 386, + "weight": 608 + }, + { + "base_id": 387, + "form_identifier": "", + "form_order": 1, + "id": 387, + "identifier": "turtwig", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 522, + "pokemon_id": 387, + "weight": 102 + }, + { + "base_id": 388, + "form_identifier": "", + "form_order": 1, + "id": 388, + "identifier": "grotle", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 523, + "pokemon_id": 388, + "weight": 970 + }, + { + "base_id": 389, + "form_identifier": "", + "form_order": 1, + "id": 389, + "identifier": "torterra", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 524, + "pokemon_id": 389, + "weight": 3100 + }, + { + "base_id": 390, + "form_identifier": "", + "form_order": 1, + "id": 390, + "identifier": "chimchar", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 525, + "pokemon_id": 390, + "weight": 62 + }, + { + "base_id": 391, + "form_identifier": "", + "form_order": 1, + "id": 391, + "identifier": "monferno", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 526, + "pokemon_id": 391, + "weight": 220 + }, + { + "base_id": 392, + "form_identifier": "", + "form_order": 1, + "id": 392, + "identifier": "infernape", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 527, + "pokemon_id": 392, + "weight": 550 + }, + { + "base_id": 393, + "form_identifier": "", + "form_order": 1, + "id": 393, + "identifier": "piplup", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 528, + "pokemon_id": 393, + "weight": 52 + }, + { + "base_id": 394, + "form_identifier": "", + "form_order": 1, + "id": 394, + "identifier": "prinplup", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 529, + "pokemon_id": 394, + "weight": 230 + }, + { + "base_id": 395, + "form_identifier": "", + "form_order": 1, + "id": 395, + "identifier": "empoleon", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 530, + "pokemon_id": 395, + "weight": 845 + }, + { + "base_id": 396, + "form_identifier": "", + "form_order": 1, + "id": 396, + "identifier": "starly", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 531, + "pokemon_id": 396, + "weight": 20 + }, + { + "base_id": 397, + "form_identifier": "", + "form_order": 1, + "id": 397, + "identifier": "staravia", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 532, + "pokemon_id": 397, + "weight": 155 + }, + { + "base_id": 398, + "form_identifier": "", + "form_order": 1, + "id": 398, + "identifier": "staraptor", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 533, + "pokemon_id": 398, + "weight": 249 + }, + { + "base_id": 399, + "form_identifier": "", + "form_order": 1, + "id": 399, + "identifier": "bidoof", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 534, + "pokemon_id": 399, + "weight": 200 + }, + { + "base_id": 400, + "form_identifier": "", + "form_order": 1, + "id": 400, + "identifier": "bibarel", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 535, + "pokemon_id": 400, + "weight": 315 + }, + { + "base_id": 401, + "form_identifier": "", + "form_order": 1, + "id": 401, + "identifier": "kricketot", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 536, + "pokemon_id": 401, + "weight": 22 + }, + { + "base_id": 402, + "form_identifier": "", + "form_order": 1, + "id": 402, + "identifier": "kricketune", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 537, + "pokemon_id": 402, + "weight": 255 + }, + { + "base_id": 403, + "form_identifier": "", + "form_order": 1, + "id": 403, + "identifier": "shinx", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 538, + "pokemon_id": 403, + "weight": 95 + }, + { + "base_id": 404, + "form_identifier": "", + "form_order": 1, + "id": 404, + "identifier": "luxio", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 539, + "pokemon_id": 404, + "weight": 305 + }, + { + "base_id": 405, + "form_identifier": "", + "form_order": 1, + "id": 405, + "identifier": "luxray", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 540, + "pokemon_id": 405, + "weight": 420 + }, + { + "base_id": 406, + "form_identifier": "", + "form_order": 1, + "id": 406, + "identifier": "budew", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 427, + "pokemon_id": 406, + "weight": 12 + }, + { + "base_id": 407, + "form_identifier": "", + "form_order": 1, + "id": 407, + "identifier": "roserade", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 429, + "pokemon_id": 407, + "weight": 145 + }, + { + "base_id": 408, + "form_identifier": "", + "form_order": 1, + "id": 408, + "identifier": "cranidos", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 541, + "pokemon_id": 408, + "weight": 315 + }, + { + "base_id": 409, + "form_identifier": "", + "form_order": 1, + "id": 409, + "identifier": "rampardos", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 542, + "pokemon_id": 409, + "weight": 1025 + }, + { + "base_id": 410, + "form_identifier": "", + "form_order": 1, + "id": 410, + "identifier": "shieldon", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 543, + "pokemon_id": 410, + "weight": 570 + }, + { + "base_id": 411, + "form_identifier": "", + "form_order": 1, + "id": 411, + "identifier": "bastiodon", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 544, + "pokemon_id": 411, + "weight": 1495 + }, + { + "base_id": 412, + "form_identifier": "plant", + "form_order": 1, + "id": 412, + "identifier": "burmy", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 545, + "pokemon_id": 412, + "weight": 34 + }, + { + "base_id": 413, + "form_identifier": "plant", + "form_order": 1, + "id": 413, + "identifier": "wormadam", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 548, + "pokemon_id": 413, + "weight": 65 + }, + { + "base_id": 414, + "form_identifier": "plant", + "form_order": 1, + "id": 414, + "identifier": "mothim", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 551, + "pokemon_id": 414, + "weight": 233 + }, + { + "base_id": 415, + "form_identifier": "", + "form_order": 1, + "id": 415, + "identifier": "combee", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 554, + "pokemon_id": 415, + "weight": 55 + }, + { + "base_id": 416, + "form_identifier": "", + "form_order": 1, + "id": 416, + "identifier": "vespiquen", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 555, + "pokemon_id": 416, + "weight": 385 + }, + { + "base_id": 417, + "form_identifier": "", + "form_order": 1, + "id": 417, + "identifier": "pachirisu", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 556, + "pokemon_id": 417, + "weight": 39 + }, + { + "base_id": 418, + "form_identifier": "", + "form_order": 1, + "id": 418, + "identifier": "buizel", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 557, + "pokemon_id": 418, + "weight": 295 + }, + { + "base_id": 419, + "form_identifier": "", + "form_order": 1, + "id": 419, + "identifier": "floatzel", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 558, + "pokemon_id": 419, + "weight": 335 + }, + { + "base_id": 420, + "form_identifier": "", + "form_order": 1, + "id": 420, + "identifier": "cherubi", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 559, + "pokemon_id": 420, + "weight": 33 + }, + { + "base_id": 421, + "form_identifier": "overcast", + "form_order": 1, + "id": 421, + "identifier": "cherrim", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 560, + "pokemon_id": 421, + "weight": 93 + }, + { + "base_id": 422, + "form_identifier": "west", + "form_order": 1, + "id": 422, + "identifier": "shellos", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 562, + "pokemon_id": 422, + "weight": 63 + }, + { + "base_id": 423, + "form_identifier": "west", + "form_order": 1, + "id": 423, + "identifier": "gastrodon", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 564, + "pokemon_id": 423, + "weight": 299 + }, + { + "base_id": 424, + "form_identifier": "", + "form_order": 1, + "id": 424, + "identifier": "ambipom", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 266, + "pokemon_id": 424, + "weight": 203 + }, + { + "base_id": 425, + "form_identifier": "", + "form_order": 1, + "id": 425, + "identifier": "drifloon", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 566, + "pokemon_id": 425, + "weight": 12 + }, + { + "base_id": 426, + "form_identifier": "", + "form_order": 1, + "id": 426, + "identifier": "drifblim", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 567, + "pokemon_id": 426, + "weight": 150 + }, + { + "base_id": 427, + "form_identifier": "", + "form_order": 1, + "id": 427, + "identifier": "buneary", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 568, + "pokemon_id": 427, + "weight": 55 + }, + { + "base_id": 428, + "form_identifier": "", + "form_order": 1, + "id": 428, + "identifier": "lopunny", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 569, + "pokemon_id": 428, + "weight": 333 + }, + { + "base_id": 429, + "form_identifier": "", + "form_order": 1, + "id": 429, + "identifier": "mismagius", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 276, + "pokemon_id": 429, + "weight": 44 + }, + { + "base_id": 430, + "form_identifier": "", + "form_order": 1, + "id": 430, + "identifier": "honchkrow", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 274, + "pokemon_id": 430, + "weight": 273 + }, + { + "base_id": 431, + "form_identifier": "", + "form_order": 1, + "id": 431, + "identifier": "glameow", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 571, + "pokemon_id": 431, + "weight": 39 + }, + { + "base_id": 432, + "form_identifier": "", + "form_order": 1, + "id": 432, + "identifier": "purugly", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 572, + "pokemon_id": 432, + "weight": 438 + }, + { + "base_id": 433, + "form_identifier": "", + "form_order": 1, + "id": 433, + "identifier": "chingling", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 480, + "pokemon_id": 433, + "weight": 6 + }, + { + "base_id": 434, + "form_identifier": "", + "form_order": 1, + "id": 434, + "identifier": "stunky", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 573, + "pokemon_id": 434, + "weight": 192 + }, + { + "base_id": 435, + "form_identifier": "", + "form_order": 1, + "id": 435, + "identifier": "skuntank", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 574, + "pokemon_id": 435, + "weight": 380 + }, + { + "base_id": 436, + "form_identifier": "", + "form_order": 1, + "id": 436, + "identifier": "bronzor", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 575, + "pokemon_id": 436, + "weight": 605 + }, + { + "base_id": 437, + "form_identifier": "", + "form_order": 1, + "id": 437, + "identifier": "bronzong", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 576, + "pokemon_id": 437, + "weight": 1870 + }, + { + "base_id": 438, + "form_identifier": "", + "form_order": 1, + "id": 438, + "identifier": "bonsly", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 260, + "pokemon_id": 438, + "weight": 150 + }, + { + "base_id": 439, + "form_identifier": "", + "form_order": 1, + "id": 439, + "identifier": "mime-jr", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 178, + "pokemon_id": 439, + "weight": 130 + }, + { + "base_id": 440, + "form_identifier": "", + "form_order": 1, + "id": 440, + "identifier": "happiny", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 164, + "pokemon_id": 440, + "weight": 244 + }, + { + "base_id": 441, + "form_identifier": "", + "form_order": 1, + "id": 441, + "identifier": "chatot", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 577, + "pokemon_id": 441, + "weight": 19 + }, + { + "base_id": 442, + "form_identifier": "", + "form_order": 1, + "id": 442, + "identifier": "spiritomb", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 578, + "pokemon_id": 442, + "weight": 1080 + }, + { + "base_id": 443, + "form_identifier": "", + "form_order": 1, + "id": 443, + "identifier": "gible", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 579, + "pokemon_id": 443, + "weight": 205 + }, + { + "base_id": 444, + "form_identifier": "", + "form_order": 1, + "id": 444, + "identifier": "gabite", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 580, + "pokemon_id": 444, + "weight": 560 + }, + { + "base_id": 445, + "form_identifier": "", + "form_order": 1, + "id": 445, + "identifier": "garchomp", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 581, + "pokemon_id": 445, + "weight": 950 + }, + { + "base_id": 446, + "form_identifier": "", + "form_order": 1, + "id": 446, + "identifier": "munchlax", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 217, + "pokemon_id": 446, + "weight": 1050 + }, + { + "base_id": 447, + "form_identifier": "", + "form_order": 1, + "id": 447, + "identifier": "riolu", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 583, + "pokemon_id": 447, + "weight": 202 + }, + { + "base_id": 448, + "form_identifier": "", + "form_order": 1, + "id": 448, + "identifier": "lucario", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 584, + "pokemon_id": 448, + "weight": 540 + }, + { + "base_id": 449, + "form_identifier": "", + "form_order": 1, + "id": 449, + "identifier": "hippopotas", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 586, + "pokemon_id": 449, + "weight": 495 + }, + { + "base_id": 450, + "form_identifier": "", + "form_order": 1, + "id": 450, + "identifier": "hippowdon", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 587, + "pokemon_id": 450, + "weight": 3000 + }, + { + "base_id": 451, + "form_identifier": "", + "form_order": 1, + "id": 451, + "identifier": "skorupi", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 588, + "pokemon_id": 451, + "weight": 120 + }, + { + "base_id": 452, + "form_identifier": "", + "form_order": 1, + "id": 452, + "identifier": "drapion", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 589, + "pokemon_id": 452, + "weight": 615 + }, + { + "base_id": 453, + "form_identifier": "", + "form_order": 1, + "id": 453, + "identifier": "croagunk", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 590, + "pokemon_id": 453, + "weight": 230 + }, + { + "base_id": 454, + "form_identifier": "", + "form_order": 1, + "id": 454, + "identifier": "toxicroak", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 591, + "pokemon_id": 454, + "weight": 444 + }, + { + "base_id": 455, + "form_identifier": "", + "form_order": 1, + "id": 455, + "identifier": "carnivine", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 592, + "pokemon_id": 455, + "weight": 270 + }, + { + "base_id": 456, + "form_identifier": "", + "form_order": 1, + "id": 456, + "identifier": "finneon", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 593, + "pokemon_id": 456, + "weight": 70 + }, + { + "base_id": 457, + "form_identifier": "", + "form_order": 1, + "id": 457, + "identifier": "lumineon", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 594, + "pokemon_id": 457, + "weight": 240 + }, + { + "base_id": 458, + "form_identifier": "", + "form_order": 1, + "id": 458, + "identifier": "mantyke", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 332, + "pokemon_id": 458, + "weight": 650 + }, + { + "base_id": 459, + "form_identifier": "", + "form_order": 1, + "id": 459, + "identifier": "snover", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 595, + "pokemon_id": 459, + "weight": 505 + }, + { + "base_id": 460, + "form_identifier": "", + "form_order": 1, + "id": 460, + "identifier": "abomasnow", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 596, + "pokemon_id": 460, + "weight": 1355 + }, + { + "base_id": 461, + "form_identifier": "", + "form_order": 1, + "id": 461, + "identifier": "weavile", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 320, + "pokemon_id": 461, + "weight": 340 + }, + { + "base_id": 462, + "form_identifier": "", + "form_order": 1, + "id": 462, + "identifier": "magnezone", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 121, + "pokemon_id": 462, + "weight": 1800 + }, + { + "base_id": 463, + "form_identifier": "", + "form_order": 1, + "id": 463, + "identifier": "lickilicky", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 158, + "pokemon_id": 463, + "weight": 1400 + }, + { + "base_id": 464, + "form_identifier": "", + "form_order": 1, + "id": 464, + "identifier": "rhyperior", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 163, + "pokemon_id": 464, + "weight": 2828 + }, + { + "base_id": 465, + "form_identifier": "", + "form_order": 1, + "id": 465, + "identifier": "tangrowth", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 168, + "pokemon_id": 465, + "weight": 1286 + }, + { + "base_id": 466, + "form_identifier": "", + "form_order": 1, + "id": 466, + "identifier": "electivire", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 187, + "pokemon_id": 466, + "weight": 1386 + }, + { + "base_id": 467, + "form_identifier": "", + "form_order": 1, + "id": 467, + "identifier": "magmortar", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 190, + "pokemon_id": 467, + "weight": 680 + }, + { + "base_id": 468, + "form_identifier": "", + "form_order": 1, + "id": 468, + "identifier": "togekiss", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 250, + "pokemon_id": 468, + "weight": 380 + }, + { + "base_id": 469, + "form_identifier": "", + "form_order": 1, + "id": 469, + "identifier": "yanmega", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 270, + "pokemon_id": 469, + "weight": 515 + }, + { + "base_id": 470, + "form_identifier": "", + "form_order": 1, + "id": 470, + "identifier": "leafeon", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 205, + "pokemon_id": 470, + "weight": 255 + }, + { + "base_id": 471, + "form_identifier": "", + "form_order": 1, + "id": 471, + "identifier": "glaceon", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 206, + "pokemon_id": 471, + "weight": 259 + }, + { + "base_id": 472, + "form_identifier": "", + "form_order": 1, + "id": 472, + "identifier": "gliscor", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 312, + "pokemon_id": 472, + "weight": 425 + }, + { + "base_id": 473, + "form_identifier": "", + "form_order": 1, + "id": 473, + "identifier": "mamoswine", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 327, + "pokemon_id": 473, + "weight": 2910 + }, + { + "base_id": 474, + "form_identifier": "", + "form_order": 1, + "id": 474, + "identifier": "porygon-z", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 210, + "pokemon_id": 474, + "weight": 340 + }, + { + "base_id": 475, + "form_identifier": "", + "form_order": 1, + "id": 475, + "identifier": "gallade", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 388, + "pokemon_id": 475, + "weight": 520 + }, + { + "base_id": 476, + "form_identifier": "", + "form_order": 1, + "id": 476, + "identifier": "probopass", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 406, + "pokemon_id": 476, + "weight": 3400 + }, + { + "base_id": 477, + "form_identifier": "", + "form_order": 1, + "id": 477, + "identifier": "dusknoir", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 478, + "pokemon_id": 477, + "weight": 1066 + }, + { + "base_id": 478, + "form_identifier": "", + "form_order": 1, + "id": 478, + "identifier": "froslass", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 487, + "pokemon_id": 478, + "weight": 266 + }, + { + "base_id": 479, + "form_identifier": "", + "form_order": 1, + "id": 479, + "identifier": "rotom", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 598, + "pokemon_id": 479, + "weight": 3 + }, + { + "base_id": 480, + "form_identifier": "", + "form_order": 1, + "id": 480, + "identifier": "uxie", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 604, + "pokemon_id": 480, + "weight": 3 + }, + { + "base_id": 481, + "form_identifier": "", + "form_order": 1, + "id": 481, + "identifier": "mesprit", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 605, + "pokemon_id": 481, + "weight": 3 + }, + { + "base_id": 482, + "form_identifier": "", + "form_order": 1, + "id": 482, + "identifier": "azelf", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 606, + "pokemon_id": 482, + "weight": 3 + }, + { + "base_id": 483, + "form_identifier": "", + "form_order": 1, + "id": 483, + "identifier": "dialga", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 607, + "pokemon_id": 483, + "weight": 6830 + }, + { + "base_id": 484, + "form_identifier": "", + "form_order": 1, + "id": 484, + "identifier": "palkia", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 608, + "pokemon_id": 484, + "weight": 3360 + }, + { + "base_id": 485, + "form_identifier": "", + "form_order": 1, + "id": 485, + "identifier": "heatran", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 609, + "pokemon_id": 485, + "weight": 4300 + }, + { + "base_id": 486, + "form_identifier": "", + "form_order": 1, + "id": 486, + "identifier": "regigigas", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 610, + "pokemon_id": 486, + "weight": 4200 + }, + { + "base_id": 487, + "form_identifier": "altered", + "form_order": 1, + "id": 487, + "identifier": "giratina", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 611, + "pokemon_id": 487, + "weight": 7500 + }, + { + "base_id": 488, + "form_identifier": "", + "form_order": 1, + "id": 488, + "identifier": "cresselia", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 613, + "pokemon_id": 488, + "weight": 856 + }, + { + "base_id": 489, + "form_identifier": "", + "form_order": 1, + "id": 489, + "identifier": "phione", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 614, + "pokemon_id": 489, + "weight": 31 + }, + { + "base_id": 490, + "form_identifier": "", + "form_order": 1, + "id": 490, + "identifier": "manaphy", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 615, + "pokemon_id": 490, + "weight": 14 + }, + { + "base_id": 491, + "form_identifier": "", + "form_order": 1, + "id": 491, + "identifier": "darkrai", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 616, + "pokemon_id": 491, + "weight": 505 + }, + { + "base_id": 492, + "form_identifier": "land", + "form_order": 1, + "id": 492, + "identifier": "shaymin", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 617, + "pokemon_id": 492, + "weight": 21 + }, + { + "base_id": 493, + "form_identifier": "normal", + "form_order": 1, + "id": 493, + "identifier": "arceus", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 619, + "pokemon_id": 493, + "weight": 3200 + }, + { + "base_id": 494, + "form_identifier": "", + "form_order": 1, + "id": 494, + "identifier": "victini", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 637, + "pokemon_id": 494, + "weight": 40 + }, + { + "base_id": 495, + "form_identifier": "", + "form_order": 1, + "id": 495, + "identifier": "snivy", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 638, + "pokemon_id": 495, + "weight": 81 + }, + { + "base_id": 496, + "form_identifier": "", + "form_order": 1, + "id": 496, + "identifier": "servine", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 639, + "pokemon_id": 496, + "weight": 160 + }, + { + "base_id": 497, + "form_identifier": "", + "form_order": 1, + "id": 497, + "identifier": "serperior", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 640, + "pokemon_id": 497, + "weight": 630 + }, + { + "base_id": 498, + "form_identifier": "", + "form_order": 1, + "id": 498, + "identifier": "tepig", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 641, + "pokemon_id": 498, + "weight": 99 + }, + { + "base_id": 499, + "form_identifier": "", + "form_order": 1, + "id": 499, + "identifier": "pignite", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 642, + "pokemon_id": 499, + "weight": 555 + }, + { + "base_id": 500, + "form_identifier": "", + "form_order": 1, + "id": 500, + "identifier": "emboar", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 643, + "pokemon_id": 500, + "weight": 1500 + }, + { + "base_id": 501, + "form_identifier": "", + "form_order": 1, + "id": 501, + "identifier": "oshawott", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 644, + "pokemon_id": 501, + "weight": 59 + }, + { + "base_id": 502, + "form_identifier": "", + "form_order": 1, + "id": 502, + "identifier": "dewott", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 645, + "pokemon_id": 502, + "weight": 245 + }, + { + "base_id": 503, + "form_identifier": "", + "form_order": 1, + "id": 503, + "identifier": "samurott", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 646, + "pokemon_id": 503, + "weight": 946 + }, + { + "base_id": 504, + "form_identifier": "", + "form_order": 1, + "id": 504, + "identifier": "patrat", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 647, + "pokemon_id": 504, + "weight": 116 + }, + { + "base_id": 505, + "form_identifier": "", + "form_order": 1, + "id": 505, + "identifier": "watchog", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 648, + "pokemon_id": 505, + "weight": 270 + }, + { + "base_id": 506, + "form_identifier": "", + "form_order": 1, + "id": 506, + "identifier": "lillipup", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 649, + "pokemon_id": 506, + "weight": 41 + }, + { + "base_id": 507, + "form_identifier": "", + "form_order": 1, + "id": 507, + "identifier": "herdier", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 650, + "pokemon_id": 507, + "weight": 147 + }, + { + "base_id": 508, + "form_identifier": "", + "form_order": 1, + "id": 508, + "identifier": "stoutland", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 651, + "pokemon_id": 508, + "weight": 610 + }, + { + "base_id": 509, + "form_identifier": "", + "form_order": 1, + "id": 509, + "identifier": "purrloin", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 652, + "pokemon_id": 509, + "weight": 101 + }, + { + "base_id": 510, + "form_identifier": "", + "form_order": 1, + "id": 510, + "identifier": "liepard", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 653, + "pokemon_id": 510, + "weight": 375 + }, + { + "base_id": 511, + "form_identifier": "", + "form_order": 1, + "id": 511, + "identifier": "pansage", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 654, + "pokemon_id": 511, + "weight": 105 + }, + { + "base_id": 512, + "form_identifier": "", + "form_order": 1, + "id": 512, + "identifier": "simisage", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 655, + "pokemon_id": 512, + "weight": 305 + }, + { + "base_id": 513, + "form_identifier": "", + "form_order": 1, + "id": 513, + "identifier": "pansear", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 656, + "pokemon_id": 513, + "weight": 110 + }, + { + "base_id": 514, + "form_identifier": "", + "form_order": 1, + "id": 514, + "identifier": "simisear", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 657, + "pokemon_id": 514, + "weight": 280 + }, + { + "base_id": 515, + "form_identifier": "", + "form_order": 1, + "id": 515, + "identifier": "panpour", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 658, + "pokemon_id": 515, + "weight": 135 + }, + { + "base_id": 516, + "form_identifier": "", + "form_order": 1, + "id": 516, + "identifier": "simipour", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 659, + "pokemon_id": 516, + "weight": 290 + }, + { + "base_id": 517, + "form_identifier": "", + "form_order": 1, + "id": 517, + "identifier": "munna", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 660, + "pokemon_id": 517, + "weight": 233 + }, + { + "base_id": 518, + "form_identifier": "", + "form_order": 1, + "id": 518, + "identifier": "musharna", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 661, + "pokemon_id": 518, + "weight": 605 + }, + { + "base_id": 519, + "form_identifier": "", + "form_order": 1, + "id": 519, + "identifier": "pidove", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 662, + "pokemon_id": 519, + "weight": 21 + }, + { + "base_id": 520, + "form_identifier": "", + "form_order": 1, + "id": 520, + "identifier": "tranquill", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 663, + "pokemon_id": 520, + "weight": 150 + }, + { + "base_id": 521, + "form_identifier": "", + "form_order": 1, + "id": 521, + "identifier": "unfezant", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 664, + "pokemon_id": 521, + "weight": 290 + }, + { + "base_id": 522, + "form_identifier": "", + "form_order": 1, + "id": 522, + "identifier": "blitzle", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 665, + "pokemon_id": 522, + "weight": 298 + }, + { + "base_id": 523, + "form_identifier": "", + "form_order": 1, + "id": 523, + "identifier": "zebstrika", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 666, + "pokemon_id": 523, + "weight": 795 + }, + { + "base_id": 524, + "form_identifier": "", + "form_order": 1, + "id": 524, + "identifier": "roggenrola", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 667, + "pokemon_id": 524, + "weight": 180 + }, + { + "base_id": 525, + "form_identifier": "", + "form_order": 1, + "id": 525, + "identifier": "boldore", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 668, + "pokemon_id": 525, + "weight": 1020 + }, + { + "base_id": 526, + "form_identifier": "", + "form_order": 1, + "id": 526, + "identifier": "gigalith", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 669, + "pokemon_id": 526, + "weight": 2600 + }, + { + "base_id": 527, + "form_identifier": "", + "form_order": 1, + "id": 527, + "identifier": "woobat", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 670, + "pokemon_id": 527, + "weight": 21 + }, + { + "base_id": 528, + "form_identifier": "", + "form_order": 1, + "id": 528, + "identifier": "swoobat", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 671, + "pokemon_id": 528, + "weight": 105 + }, + { + "base_id": 529, + "form_identifier": "", + "form_order": 1, + "id": 529, + "identifier": "drilbur", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 672, + "pokemon_id": 529, + "weight": 85 + }, + { + "base_id": 530, + "form_identifier": "", + "form_order": 1, + "id": 530, + "identifier": "excadrill", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 673, + "pokemon_id": 530, + "weight": 404 + }, + { + "base_id": 531, + "form_identifier": "", + "form_order": 1, + "id": 531, + "identifier": "audino", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 674, + "pokemon_id": 531, + "weight": 310 + }, + { + "base_id": 532, + "form_identifier": "", + "form_order": 1, + "id": 532, + "identifier": "timburr", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 676, + "pokemon_id": 532, + "weight": 125 + }, + { + "base_id": 533, + "form_identifier": "", + "form_order": 1, + "id": 533, + "identifier": "gurdurr", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 677, + "pokemon_id": 533, + "weight": 400 + }, + { + "base_id": 534, + "form_identifier": "", + "form_order": 1, + "id": 534, + "identifier": "conkeldurr", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 678, + "pokemon_id": 534, + "weight": 870 + }, + { + "base_id": 535, + "form_identifier": "", + "form_order": 1, + "id": 535, + "identifier": "tympole", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 679, + "pokemon_id": 535, + "weight": 45 + }, + { + "base_id": 536, + "form_identifier": "", + "form_order": 1, + "id": 536, + "identifier": "palpitoad", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 680, + "pokemon_id": 536, + "weight": 170 + }, + { + "base_id": 537, + "form_identifier": "", + "form_order": 1, + "id": 537, + "identifier": "seismitoad", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 681, + "pokemon_id": 537, + "weight": 620 + }, + { + "base_id": 538, + "form_identifier": "", + "form_order": 1, + "id": 538, + "identifier": "throh", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 682, + "pokemon_id": 538, + "weight": 555 + }, + { + "base_id": 539, + "form_identifier": "", + "form_order": 1, + "id": 539, + "identifier": "sawk", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 683, + "pokemon_id": 539, + "weight": 510 + }, + { + "base_id": 540, + "form_identifier": "", + "form_order": 1, + "id": 540, + "identifier": "sewaddle", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 684, + "pokemon_id": 540, + "weight": 25 + }, + { + "base_id": 541, + "form_identifier": "", + "form_order": 1, + "id": 541, + "identifier": "swadloon", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 685, + "pokemon_id": 541, + "weight": 73 + }, + { + "base_id": 542, + "form_identifier": "", + "form_order": 1, + "id": 542, + "identifier": "leavanny", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 686, + "pokemon_id": 542, + "weight": 205 + }, + { + "base_id": 543, + "form_identifier": "", + "form_order": 1, + "id": 543, + "identifier": "venipede", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 687, + "pokemon_id": 543, + "weight": 53 + }, + { + "base_id": 544, + "form_identifier": "", + "form_order": 1, + "id": 544, + "identifier": "whirlipede", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 688, + "pokemon_id": 544, + "weight": 585 + }, + { + "base_id": 545, + "form_identifier": "", + "form_order": 1, + "id": 545, + "identifier": "scolipede", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 689, + "pokemon_id": 545, + "weight": 2005 + }, + { + "base_id": 546, + "form_identifier": "", + "form_order": 1, + "id": 546, + "identifier": "cottonee", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 690, + "pokemon_id": 546, + "weight": 6 + }, + { + "base_id": 547, + "form_identifier": "", + "form_order": 1, + "id": 547, + "identifier": "whimsicott", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 691, + "pokemon_id": 547, + "weight": 66 + }, + { + "base_id": 548, + "form_identifier": "", + "form_order": 1, + "id": 548, + "identifier": "petilil", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 692, + "pokemon_id": 548, + "weight": 66 + }, + { + "base_id": 549, + "form_identifier": "", + "form_order": 1, + "id": 549, + "identifier": "lilligant", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 693, + "pokemon_id": 549, + "weight": 163 + }, + { + "base_id": 550, + "form_identifier": "red-striped", + "form_order": 1, + "id": 550, + "identifier": "basculin", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 694, + "pokemon_id": 550, + "weight": 180 + }, + { + "base_id": 551, + "form_identifier": "", + "form_order": 1, + "id": 551, + "identifier": "sandile", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 696, + "pokemon_id": 551, + "weight": 152 + }, + { + "base_id": 552, + "form_identifier": "", + "form_order": 1, + "id": 552, + "identifier": "krokorok", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 697, + "pokemon_id": 552, + "weight": 334 + }, + { + "base_id": 553, + "form_identifier": "", + "form_order": 1, + "id": 553, + "identifier": "krookodile", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 698, + "pokemon_id": 553, + "weight": 963 + }, + { + "base_id": 554, + "form_identifier": "", + "form_order": 1, + "id": 554, + "identifier": "darumaka", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 699, + "pokemon_id": 554, + "weight": 375 + }, + { + "base_id": 555, + "form_identifier": "standard", + "form_order": 1, + "id": 555, + "identifier": "darmanitan", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 700, + "pokemon_id": 555, + "weight": 929 + }, + { + "base_id": 556, + "form_identifier": "", + "form_order": 1, + "id": 556, + "identifier": "maractus", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 702, + "pokemon_id": 556, + "weight": 280 + }, + { + "base_id": 557, + "form_identifier": "", + "form_order": 1, + "id": 557, + "identifier": "dwebble", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 703, + "pokemon_id": 557, + "weight": 145 + }, + { + "base_id": 558, + "form_identifier": "", + "form_order": 1, + "id": 558, + "identifier": "crustle", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 704, + "pokemon_id": 558, + "weight": 2000 + }, + { + "base_id": 559, + "form_identifier": "", + "form_order": 1, + "id": 559, + "identifier": "scraggy", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 705, + "pokemon_id": 559, + "weight": 118 + }, + { + "base_id": 560, + "form_identifier": "", + "form_order": 1, + "id": 560, + "identifier": "scrafty", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 706, + "pokemon_id": 560, + "weight": 300 + }, + { + "base_id": 561, + "form_identifier": "", + "form_order": 1, + "id": 561, + "identifier": "sigilyph", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 707, + "pokemon_id": 561, + "weight": 140 + }, + { + "base_id": 562, + "form_identifier": "", + "form_order": 1, + "id": 562, + "identifier": "yamask", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 708, + "pokemon_id": 562, + "weight": 15 + }, + { + "base_id": 563, + "form_identifier": "", + "form_order": 1, + "id": 563, + "identifier": "cofagrigus", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 709, + "pokemon_id": 563, + "weight": 765 + }, + { + "base_id": 564, + "form_identifier": "", + "form_order": 1, + "id": 564, + "identifier": "tirtouga", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 710, + "pokemon_id": 564, + "weight": 165 + }, + { + "base_id": 565, + "form_identifier": "", + "form_order": 1, + "id": 565, + "identifier": "carracosta", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 711, + "pokemon_id": 565, + "weight": 810 + }, + { + "base_id": 566, + "form_identifier": "", + "form_order": 1, + "id": 566, + "identifier": "archen", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 712, + "pokemon_id": 566, + "weight": 95 + }, + { + "base_id": 567, + "form_identifier": "", + "form_order": 1, + "id": 567, + "identifier": "archeops", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 713, + "pokemon_id": 567, + "weight": 320 + }, + { + "base_id": 568, + "form_identifier": "", + "form_order": 1, + "id": 568, + "identifier": "trubbish", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 714, + "pokemon_id": 568, + "weight": 310 + }, + { + "base_id": 569, + "form_identifier": "", + "form_order": 1, + "id": 569, + "identifier": "garbodor", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 715, + "pokemon_id": 569, + "weight": 1073 + }, + { + "base_id": 570, + "form_identifier": "", + "form_order": 1, + "id": 570, + "identifier": "zorua", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 716, + "pokemon_id": 570, + "weight": 125 + }, + { + "base_id": 571, + "form_identifier": "", + "form_order": 1, + "id": 571, + "identifier": "zoroark", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 717, + "pokemon_id": 571, + "weight": 811 + }, + { + "base_id": 572, + "form_identifier": "", + "form_order": 1, + "id": 572, + "identifier": "minccino", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 718, + "pokemon_id": 572, + "weight": 58 + }, + { + "base_id": 573, + "form_identifier": "", + "form_order": 1, + "id": 573, + "identifier": "cinccino", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 719, + "pokemon_id": 573, + "weight": 75 + }, + { + "base_id": 574, + "form_identifier": "", + "form_order": 1, + "id": 574, + "identifier": "gothita", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 720, + "pokemon_id": 574, + "weight": 58 + }, + { + "base_id": 575, + "form_identifier": "", + "form_order": 1, + "id": 575, + "identifier": "gothorita", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 721, + "pokemon_id": 575, + "weight": 180 + }, + { + "base_id": 576, + "form_identifier": "", + "form_order": 1, + "id": 576, + "identifier": "gothitelle", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 722, + "pokemon_id": 576, + "weight": 440 + }, + { + "base_id": 577, + "form_identifier": "", + "form_order": 1, + "id": 577, + "identifier": "solosis", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 723, + "pokemon_id": 577, + "weight": 10 + }, + { + "base_id": 578, + "form_identifier": "", + "form_order": 1, + "id": 578, + "identifier": "duosion", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 724, + "pokemon_id": 578, + "weight": 80 + }, + { + "base_id": 579, + "form_identifier": "", + "form_order": 1, + "id": 579, + "identifier": "reuniclus", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 725, + "pokemon_id": 579, + "weight": 201 + }, + { + "base_id": 580, + "form_identifier": "", + "form_order": 1, + "id": 580, + "identifier": "ducklett", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 726, + "pokemon_id": 580, + "weight": 55 + }, + { + "base_id": 581, + "form_identifier": "", + "form_order": 1, + "id": 581, + "identifier": "swanna", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 727, + "pokemon_id": 581, + "weight": 242 + }, + { + "base_id": 582, + "form_identifier": "", + "form_order": 1, + "id": 582, + "identifier": "vanillite", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 728, + "pokemon_id": 582, + "weight": 57 + }, + { + "base_id": 583, + "form_identifier": "", + "form_order": 1, + "id": 583, + "identifier": "vanillish", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 729, + "pokemon_id": 583, + "weight": 410 + }, + { + "base_id": 584, + "form_identifier": "", + "form_order": 1, + "id": 584, + "identifier": "vanilluxe", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 730, + "pokemon_id": 584, + "weight": 575 + }, + { + "base_id": 585, + "form_identifier": "spring", + "form_order": 1, + "id": 585, + "identifier": "deerling", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 731, + "pokemon_id": 585, + "weight": 195 + }, + { + "base_id": 586, + "form_identifier": "spring", + "form_order": 1, + "id": 586, + "identifier": "sawsbuck", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 735, + "pokemon_id": 586, + "weight": 925 + }, + { + "base_id": 587, + "form_identifier": "", + "form_order": 1, + "id": 587, + "identifier": "emolga", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 739, + "pokemon_id": 587, + "weight": 50 + }, + { + "base_id": 588, + "form_identifier": "", + "form_order": 1, + "id": 588, + "identifier": "karrablast", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 740, + "pokemon_id": 588, + "weight": 59 + }, + { + "base_id": 589, + "form_identifier": "", + "form_order": 1, + "id": 589, + "identifier": "escavalier", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 741, + "pokemon_id": 589, + "weight": 330 + }, + { + "base_id": 590, + "form_identifier": "", + "form_order": 1, + "id": 590, + "identifier": "foongus", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 742, + "pokemon_id": 590, + "weight": 10 + }, + { + "base_id": 591, + "form_identifier": "", + "form_order": 1, + "id": 591, + "identifier": "amoonguss", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 743, + "pokemon_id": 591, + "weight": 105 + }, + { + "base_id": 592, + "form_identifier": "", + "form_order": 1, + "id": 592, + "identifier": "frillish", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 744, + "pokemon_id": 592, + "weight": 330 + }, + { + "base_id": 593, + "form_identifier": "", + "form_order": 1, + "id": 593, + "identifier": "jellicent", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 745, + "pokemon_id": 593, + "weight": 1350 + }, + { + "base_id": 594, + "form_identifier": "", + "form_order": 1, + "id": 594, + "identifier": "alomomola", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 746, + "pokemon_id": 594, + "weight": 316 + }, + { + "base_id": 595, + "form_identifier": "", + "form_order": 1, + "id": 595, + "identifier": "joltik", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 747, + "pokemon_id": 595, + "weight": 6 + }, + { + "base_id": 596, + "form_identifier": "", + "form_order": 1, + "id": 596, + "identifier": "galvantula", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 748, + "pokemon_id": 596, + "weight": 143 + }, + { + "base_id": 597, + "form_identifier": "", + "form_order": 1, + "id": 597, + "identifier": "ferroseed", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 749, + "pokemon_id": 597, + "weight": 188 + }, + { + "base_id": 598, + "form_identifier": "", + "form_order": 1, + "id": 598, + "identifier": "ferrothorn", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 750, + "pokemon_id": 598, + "weight": 1100 + }, + { + "base_id": 599, + "form_identifier": "", + "form_order": 1, + "id": 599, + "identifier": "klink", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 751, + "pokemon_id": 599, + "weight": 210 + }, + { + "base_id": 600, + "form_identifier": "", + "form_order": 1, + "id": 600, + "identifier": "klang", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 752, + "pokemon_id": 600, + "weight": 510 + }, + { + "base_id": 601, + "form_identifier": "", + "form_order": 1, + "id": 601, + "identifier": "klinklang", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 753, + "pokemon_id": 601, + "weight": 810 + }, + { + "base_id": 602, + "form_identifier": "", + "form_order": 1, + "id": 602, + "identifier": "tynamo", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 754, + "pokemon_id": 602, + "weight": 3 + }, + { + "base_id": 603, + "form_identifier": "", + "form_order": 1, + "id": 603, + "identifier": "eelektrik", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 755, + "pokemon_id": 603, + "weight": 220 + }, + { + "base_id": 604, + "form_identifier": "", + "form_order": 1, + "id": 604, + "identifier": "eelektross", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 756, + "pokemon_id": 604, + "weight": 805 + }, + { + "base_id": 605, + "form_identifier": "", + "form_order": 1, + "id": 605, + "identifier": "elgyem", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 757, + "pokemon_id": 605, + "weight": 90 + }, + { + "base_id": 606, + "form_identifier": "", + "form_order": 1, + "id": 606, + "identifier": "beheeyem", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 758, + "pokemon_id": 606, + "weight": 345 + }, + { + "base_id": 607, + "form_identifier": "", + "form_order": 1, + "id": 607, + "identifier": "litwick", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 759, + "pokemon_id": 607, + "weight": 31 + }, + { + "base_id": 608, + "form_identifier": "", + "form_order": 1, + "id": 608, + "identifier": "lampent", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 760, + "pokemon_id": 608, + "weight": 130 + }, + { + "base_id": 609, + "form_identifier": "", + "form_order": 1, + "id": 609, + "identifier": "chandelure", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 761, + "pokemon_id": 609, + "weight": 343 + }, + { + "base_id": 610, + "form_identifier": "", + "form_order": 1, + "id": 610, + "identifier": "axew", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 762, + "pokemon_id": 610, + "weight": 180 + }, + { + "base_id": 611, + "form_identifier": "", + "form_order": 1, + "id": 611, + "identifier": "fraxure", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 763, + "pokemon_id": 611, + "weight": 360 + }, + { + "base_id": 612, + "form_identifier": "", + "form_order": 1, + "id": 612, + "identifier": "haxorus", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 764, + "pokemon_id": 612, + "weight": 1055 + }, + { + "base_id": 613, + "form_identifier": "", + "form_order": 1, + "id": 613, + "identifier": "cubchoo", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 765, + "pokemon_id": 613, + "weight": 85 + }, + { + "base_id": 614, + "form_identifier": "", + "form_order": 1, + "id": 614, + "identifier": "beartic", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 766, + "pokemon_id": 614, + "weight": 2600 + }, + { + "base_id": 615, + "form_identifier": "", + "form_order": 1, + "id": 615, + "identifier": "cryogonal", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 767, + "pokemon_id": 615, + "weight": 1480 + }, + { + "base_id": 616, + "form_identifier": "", + "form_order": 1, + "id": 616, + "identifier": "shelmet", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 768, + "pokemon_id": 616, + "weight": 77 + }, + { + "base_id": 617, + "form_identifier": "", + "form_order": 1, + "id": 617, + "identifier": "accelgor", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 769, + "pokemon_id": 617, + "weight": 253 + }, + { + "base_id": 618, + "form_identifier": "", + "form_order": 1, + "id": 618, + "identifier": "stunfisk", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 770, + "pokemon_id": 618, + "weight": 110 + }, + { + "base_id": 619, + "form_identifier": "", + "form_order": 1, + "id": 619, + "identifier": "mienfoo", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 771, + "pokemon_id": 619, + "weight": 200 + }, + { + "base_id": 620, + "form_identifier": "", + "form_order": 1, + "id": 620, + "identifier": "mienshao", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 772, + "pokemon_id": 620, + "weight": 355 + }, + { + "base_id": 621, + "form_identifier": "", + "form_order": 1, + "id": 621, + "identifier": "druddigon", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 773, + "pokemon_id": 621, + "weight": 1390 + }, + { + "base_id": 622, + "form_identifier": "", + "form_order": 1, + "id": 622, + "identifier": "golett", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 774, + "pokemon_id": 622, + "weight": 920 + }, + { + "base_id": 623, + "form_identifier": "", + "form_order": 1, + "id": 623, + "identifier": "golurk", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 775, + "pokemon_id": 623, + "weight": 3300 + }, + { + "base_id": 624, + "form_identifier": "", + "form_order": 1, + "id": 624, + "identifier": "pawniard", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 776, + "pokemon_id": 624, + "weight": 102 + }, + { + "base_id": 625, + "form_identifier": "", + "form_order": 1, + "id": 625, + "identifier": "bisharp", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 777, + "pokemon_id": 625, + "weight": 700 + }, + { + "base_id": 626, + "form_identifier": "", + "form_order": 1, + "id": 626, + "identifier": "bouffalant", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 778, + "pokemon_id": 626, + "weight": 946 + }, + { + "base_id": 627, + "form_identifier": "", + "form_order": 1, + "id": 627, + "identifier": "rufflet", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 779, + "pokemon_id": 627, + "weight": 105 + }, + { + "base_id": 628, + "form_identifier": "", + "form_order": 1, + "id": 628, + "identifier": "braviary", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 780, + "pokemon_id": 628, + "weight": 410 + }, + { + "base_id": 629, + "form_identifier": "", + "form_order": 1, + "id": 629, + "identifier": "vullaby", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 781, + "pokemon_id": 629, + "weight": 90 + }, + { + "base_id": 630, + "form_identifier": "", + "form_order": 1, + "id": 630, + "identifier": "mandibuzz", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 782, + "pokemon_id": 630, + "weight": 395 + }, + { + "base_id": 631, + "form_identifier": "", + "form_order": 1, + "id": 631, + "identifier": "heatmor", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 783, + "pokemon_id": 631, + "weight": 580 + }, + { + "base_id": 632, + "form_identifier": "", + "form_order": 1, + "id": 632, + "identifier": "durant", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 784, + "pokemon_id": 632, + "weight": 330 + }, + { + "base_id": 633, + "form_identifier": "", + "form_order": 1, + "id": 633, + "identifier": "deino", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 785, + "pokemon_id": 633, + "weight": 173 + }, + { + "base_id": 634, + "form_identifier": "", + "form_order": 1, + "id": 634, + "identifier": "zweilous", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 786, + "pokemon_id": 634, + "weight": 500 + }, + { + "base_id": 635, + "form_identifier": "", + "form_order": 1, + "id": 635, + "identifier": "hydreigon", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 787, + "pokemon_id": 635, + "weight": 1600 + }, + { + "base_id": 636, + "form_identifier": "", + "form_order": 1, + "id": 636, + "identifier": "larvesta", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 788, + "pokemon_id": 636, + "weight": 288 + }, + { + "base_id": 637, + "form_identifier": "", + "form_order": 1, + "id": 637, + "identifier": "volcarona", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 789, + "pokemon_id": 637, + "weight": 460 + }, + { + "base_id": 638, + "form_identifier": "", + "form_order": 1, + "id": 638, + "identifier": "cobalion", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 790, + "pokemon_id": 638, + "weight": 2500 + }, + { + "base_id": 639, + "form_identifier": "", + "form_order": 1, + "id": 639, + "identifier": "terrakion", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 791, + "pokemon_id": 639, + "weight": 2600 + }, + { + "base_id": 640, + "form_identifier": "", + "form_order": 1, + "id": 640, + "identifier": "virizion", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 792, + "pokemon_id": 640, + "weight": 2000 + }, + { + "base_id": 641, + "form_identifier": "incarnate", + "form_order": 1, + "id": 641, + "identifier": "tornadus", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 793, + "pokemon_id": 641, + "weight": 630 + }, + { + "base_id": 642, + "form_identifier": "incarnate", + "form_order": 1, + "id": 642, + "identifier": "thundurus", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 795, + "pokemon_id": 642, + "weight": 610 + }, + { + "base_id": 643, + "form_identifier": "", + "form_order": 1, + "id": 643, + "identifier": "reshiram", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 797, + "pokemon_id": 643, + "weight": 3300 + }, + { + "base_id": 644, + "form_identifier": "", + "form_order": 1, + "id": 644, + "identifier": "zekrom", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 798, + "pokemon_id": 644, + "weight": 3450 + }, + { + "base_id": 645, + "form_identifier": "incarnate", + "form_order": 1, + "id": 645, + "identifier": "landorus", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 799, + "pokemon_id": 645, + "weight": 680 + }, + { + "base_id": 646, + "form_identifier": "", + "form_order": 1, + "id": 646, + "identifier": "kyurem", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 801, + "pokemon_id": 646, + "weight": 3250 + }, + { + "base_id": 647, + "form_identifier": "ordinary", + "form_order": 1, + "id": 647, + "identifier": "keldeo", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 804, + "pokemon_id": 647, + "weight": 485 + }, + { + "base_id": 648, + "form_identifier": "aria", + "form_order": 1, + "id": 648, + "identifier": "meloetta", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 806, + "pokemon_id": 648, + "weight": 65 + }, + { + "base_id": 649, + "form_identifier": "", + "form_order": 1, + "id": 649, + "identifier": "genesect", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 808, + "pokemon_id": 649, + "weight": 825 + }, + { + "base_id": 650, + "form_identifier": "", + "form_order": 1, + "id": 650, + "identifier": "chespin", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 813, + "pokemon_id": 650, + "weight": 90 + }, + { + "base_id": 651, + "form_identifier": "", + "form_order": 1, + "id": 651, + "identifier": "quilladin", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 814, + "pokemon_id": 651, + "weight": 290 + }, + { + "base_id": 652, + "form_identifier": "", + "form_order": 1, + "id": 652, + "identifier": "chesnaught", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 815, + "pokemon_id": 652, + "weight": 900 + }, + { + "base_id": 653, + "form_identifier": "", + "form_order": 1, + "id": 653, + "identifier": "fennekin", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 816, + "pokemon_id": 653, + "weight": 94 + }, + { + "base_id": 654, + "form_identifier": "", + "form_order": 1, + "id": 654, + "identifier": "braixen", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 817, + "pokemon_id": 654, + "weight": 145 + }, + { + "base_id": 655, + "form_identifier": "", + "form_order": 1, + "id": 655, + "identifier": "delphox", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 818, + "pokemon_id": 655, + "weight": 390 + }, + { + "base_id": 656, + "form_identifier": "", + "form_order": 1, + "id": 656, + "identifier": "froakie", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 819, + "pokemon_id": 656, + "weight": 70 + }, + { + "base_id": 657, + "form_identifier": "", + "form_order": 1, + "id": 657, + "identifier": "frogadier", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 820, + "pokemon_id": 657, + "weight": 109 + }, + { + "base_id": 658, + "form_identifier": "", + "form_order": 1, + "id": 658, + "identifier": "greninja", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 821, + "pokemon_id": 658, + "weight": 400 + }, + { + "base_id": 659, + "form_identifier": "", + "form_order": 1, + "id": 659, + "identifier": "bunnelby", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 824, + "pokemon_id": 659, + "weight": 50 + }, + { + "base_id": 660, + "form_identifier": "", + "form_order": 1, + "id": 660, + "identifier": "diggersby", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 825, + "pokemon_id": 660, + "weight": 424 + }, + { + "base_id": 661, + "form_identifier": "", + "form_order": 1, + "id": 661, + "identifier": "fletchling", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 826, + "pokemon_id": 661, + "weight": 17 + }, + { + "base_id": 662, + "form_identifier": "", + "form_order": 1, + "id": 662, + "identifier": "fletchinder", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 827, + "pokemon_id": 662, + "weight": 160 + }, + { + "base_id": 663, + "form_identifier": "", + "form_order": 1, + "id": 663, + "identifier": "talonflame", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 828, + "pokemon_id": 663, + "weight": 245 + }, + { + "base_id": 664, + "form_identifier": "icy-snow", + "form_order": 1, + "id": 664, + "identifier": "scatterbug", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 829, + "pokemon_id": 664, + "weight": 25 + }, + { + "base_id": 665, + "form_identifier": "icy-snow", + "form_order": 1, + "id": 665, + "identifier": "spewpa", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 849, + "pokemon_id": 665, + "weight": 84 + }, + { + "base_id": 666, + "form_identifier": "meadow", + "form_order": 1, + "id": 666, + "identifier": "vivillon", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 875, + "pokemon_id": 666, + "weight": 170 + }, + { + "base_id": 667, + "form_identifier": "", + "form_order": 1, + "id": 667, + "identifier": "litleo", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 889, + "pokemon_id": 667, + "weight": 135 + }, + { + "base_id": 668, + "form_identifier": "", + "form_order": 1, + "id": 668, + "identifier": "pyroar", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 890, + "pokemon_id": 668, + "weight": 815 + }, + { + "base_id": 669, + "form_identifier": "red", + "form_order": 1, + "id": 669, + "identifier": "flabebe", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 891, + "pokemon_id": 669, + "weight": 1 + }, + { + "base_id": 670, + "form_identifier": "red", + "form_order": 1, + "id": 670, + "identifier": "floette", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 896, + "pokemon_id": 670, + "weight": 9 + }, + { + "base_id": 671, + "form_identifier": "red", + "form_order": 1, + "id": 671, + "identifier": "florges", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 902, + "pokemon_id": 671, + "weight": 100 + }, + { + "base_id": 672, + "form_identifier": "", + "form_order": 1, + "id": 672, + "identifier": "skiddo", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 907, + "pokemon_id": 672, + "weight": 310 + }, + { + "base_id": 673, + "form_identifier": "", + "form_order": 1, + "id": 673, + "identifier": "gogoat", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 908, + "pokemon_id": 673, + "weight": 910 + }, + { + "base_id": 674, + "form_identifier": "", + "form_order": 1, + "id": 674, + "identifier": "pancham", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 909, + "pokemon_id": 674, + "weight": 80 + }, + { + "base_id": 675, + "form_identifier": "", + "form_order": 1, + "id": 675, + "identifier": "pangoro", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 910, + "pokemon_id": 675, + "weight": 1360 + }, + { + "base_id": 676, + "form_identifier": "natural", + "form_order": 1, + "id": 676, + "identifier": "furfrou", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 911, + "pokemon_id": 676, + "weight": 280 + }, + { + "base_id": 677, + "form_identifier": "", + "form_order": 1, + "id": 677, + "identifier": "espurr", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 921, + "pokemon_id": 677, + "weight": 35 + }, + { + "base_id": 678, + "form_identifier": "male", + "form_order": 1, + "id": 678, + "identifier": "meowstic", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 922, + "pokemon_id": 678, + "weight": 85 + }, + { + "base_id": 679, + "form_identifier": "", + "form_order": 1, + "id": 679, + "identifier": "honedge", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 924, + "pokemon_id": 679, + "weight": 20 + }, + { + "base_id": 680, + "form_identifier": "", + "form_order": 1, + "id": 680, + "identifier": "doublade", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 925, + "pokemon_id": 680, + "weight": 45 + }, + { + "base_id": 681, + "form_identifier": "shield", + "form_order": 1, + "id": 681, + "identifier": "aegislash", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 926, + "pokemon_id": 681, + "weight": 530 + }, + { + "base_id": 682, + "form_identifier": "", + "form_order": 1, + "id": 682, + "identifier": "spritzee", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 928, + "pokemon_id": 682, + "weight": 5 + }, + { + "base_id": 683, + "form_identifier": "", + "form_order": 1, + "id": 683, + "identifier": "aromatisse", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 929, + "pokemon_id": 683, + "weight": 155 + }, + { + "base_id": 684, + "form_identifier": "", + "form_order": 1, + "id": 684, + "identifier": "swirlix", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 930, + "pokemon_id": 684, + "weight": 35 + }, + { + "base_id": 685, + "form_identifier": "", + "form_order": 1, + "id": 685, + "identifier": "slurpuff", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 931, + "pokemon_id": 685, + "weight": 50 + }, + { + "base_id": 686, + "form_identifier": "", + "form_order": 1, + "id": 686, + "identifier": "inkay", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 932, + "pokemon_id": 686, + "weight": 35 + }, + { + "base_id": 687, + "form_identifier": "", + "form_order": 1, + "id": 687, + "identifier": "malamar", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 933, + "pokemon_id": 687, + "weight": 470 + }, + { + "base_id": 688, + "form_identifier": "", + "form_order": 1, + "id": 688, + "identifier": "binacle", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 934, + "pokemon_id": 688, + "weight": 310 + }, + { + "base_id": 689, + "form_identifier": "", + "form_order": 1, + "id": 689, + "identifier": "barbaracle", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 935, + "pokemon_id": 689, + "weight": 960 + }, + { + "base_id": 690, + "form_identifier": "", + "form_order": 1, + "id": 690, + "identifier": "skrelp", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 936, + "pokemon_id": 690, + "weight": 73 + }, + { + "base_id": 691, + "form_identifier": "", + "form_order": 1, + "id": 691, + "identifier": "dragalge", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 937, + "pokemon_id": 691, + "weight": 815 + }, + { + "base_id": 692, + "form_identifier": "", + "form_order": 1, + "id": 692, + "identifier": "clauncher", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 938, + "pokemon_id": 692, + "weight": 83 + }, + { + "base_id": 693, + "form_identifier": "", + "form_order": 1, + "id": 693, + "identifier": "clawitzer", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 939, + "pokemon_id": 693, + "weight": 353 + }, + { + "base_id": 694, + "form_identifier": "", + "form_order": 1, + "id": 694, + "identifier": "helioptile", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 940, + "pokemon_id": 694, + "weight": 60 + }, + { + "base_id": 695, + "form_identifier": "", + "form_order": 1, + "id": 695, + "identifier": "heliolisk", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 941, + "pokemon_id": 695, + "weight": 210 + }, + { + "base_id": 696, + "form_identifier": "", + "form_order": 1, + "id": 696, + "identifier": "tyrunt", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 942, + "pokemon_id": 696, + "weight": 260 + }, + { + "base_id": 697, + "form_identifier": "", + "form_order": 1, + "id": 697, + "identifier": "tyrantrum", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 943, + "pokemon_id": 697, + "weight": 2700 + }, + { + "base_id": 698, + "form_identifier": "", + "form_order": 1, + "id": 698, + "identifier": "amaura", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 944, + "pokemon_id": 698, + "weight": 252 + }, + { + "base_id": 699, + "form_identifier": "", + "form_order": 1, + "id": 699, + "identifier": "aurorus", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 945, + "pokemon_id": 699, + "weight": 2250 + }, + { + "base_id": null, + "form_identifier": "", + "form_order": 1, + "id": 700, + "identifier": "sylveon", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 207, + "pokemon_id": 700, + "weight": 235 + }, + { + "base_id": 701, + "form_identifier": "", + "form_order": 1, + "id": 701, + "identifier": "hawlucha", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 946, + "pokemon_id": 701, + "weight": 215 + }, + { + "base_id": 702, + "form_identifier": "", + "form_order": 1, + "id": 702, + "identifier": "dedenne", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 947, + "pokemon_id": 702, + "weight": 22 + }, + { + "base_id": 703, + "form_identifier": "", + "form_order": 1, + "id": 703, + "identifier": "carbink", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 948, + "pokemon_id": 703, + "weight": 57 + }, + { + "base_id": 704, + "form_identifier": "", + "form_order": 1, + "id": 704, + "identifier": "goomy", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 949, + "pokemon_id": 704, + "weight": 28 + }, + { + "base_id": 705, + "form_identifier": "", + "form_order": 1, + "id": 705, + "identifier": "sliggoo", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 950, + "pokemon_id": 705, + "weight": 175 + }, + { + "base_id": 706, + "form_identifier": "", + "form_order": 1, + "id": 706, + "identifier": "goodra", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 951, + "pokemon_id": 706, + "weight": 1505 + }, + { + "base_id": 707, + "form_identifier": "", + "form_order": 1, + "id": 707, + "identifier": "klefki", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 952, + "pokemon_id": 707, + "weight": 30 + }, + { + "base_id": 708, + "form_identifier": "", + "form_order": 1, + "id": 708, + "identifier": "phantump", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 953, + "pokemon_id": 708, + "weight": 70 + }, + { + "base_id": 709, + "form_identifier": "", + "form_order": 1, + "id": 709, + "identifier": "trevenant", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 954, + "pokemon_id": 709, + "weight": 710 + }, + { + "base_id": 710, + "form_identifier": "average", + "form_order": 1, + "id": 710, + "identifier": "pumpkaboo", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 955, + "pokemon_id": 710, + "weight": 50 + }, + { + "base_id": 711, + "form_identifier": "average", + "form_order": 1, + "id": 711, + "identifier": "gourgeist", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 959, + "pokemon_id": 711, + "weight": 125 + }, + { + "base_id": 712, + "form_identifier": "", + "form_order": 1, + "id": 712, + "identifier": "bergmite", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 963, + "pokemon_id": 712, + "weight": 995 + }, + { + "base_id": 713, + "form_identifier": "", + "form_order": 1, + "id": 713, + "identifier": "avalugg", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 964, + "pokemon_id": 713, + "weight": 5050 + }, + { + "base_id": 714, + "form_identifier": "", + "form_order": 1, + "id": 714, + "identifier": "noibat", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 965, + "pokemon_id": 714, + "weight": 80 + }, + { + "base_id": 715, + "form_identifier": "", + "form_order": 1, + "id": 715, + "identifier": "noivern", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 966, + "pokemon_id": 715, + "weight": 850 + }, + { + "base_id": 716, + "form_identifier": "active", + "form_order": 2, + "id": 716, + "identifier": "xerneas", + "introduced_in_version_group_id": 15, + "is_battle_only": 1, + "is_default": 0, + "is_mega": 0, + "order": 968, + "pokemon_id": 716, + "weight": 2150 + }, + { + "base_id": 717, + "form_identifier": "", + "form_order": 1, + "id": 717, + "identifier": "yveltal", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 969, + "pokemon_id": 717, + "weight": 2030 + }, + { + "base_id": 718, + "form_identifier": "", + "form_order": 1, + "id": 718, + "identifier": "zygarde", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 970, + "pokemon_id": 718, + "weight": 3050 + }, + { + "base_id": 719, + "form_identifier": "", + "form_order": 1, + "id": 719, + "identifier": "diancie", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 974, + "pokemon_id": 719, + "weight": 88 + }, + { + "base_id": 720, + "form_identifier": "confined", + "form_order": 1, + "id": 720, + "identifier": "hoopa", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 976, + "pokemon_id": 720, + "weight": 90 + }, + { + "base_id": 721, + "form_identifier": "", + "form_order": 1, + "id": 721, + "identifier": "volcanion", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 978, + "pokemon_id": 721, + "weight": 1950 + }, + { + "base_id": 722, + "form_identifier": "", + "form_order": 1, + "id": 722, + "identifier": "rowlet", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 979, + "pokemon_id": 722, + "weight": 15 + }, + { + "base_id": 723, + "form_identifier": "", + "form_order": 1, + "id": 723, + "identifier": "dartrix", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 980, + "pokemon_id": 723, + "weight": 160 + }, + { + "base_id": 724, + "form_identifier": "", + "form_order": 1, + "id": 724, + "identifier": "decidueye", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 981, + "pokemon_id": 724, + "weight": 366 + }, + { + "base_id": 725, + "form_identifier": "", + "form_order": 1, + "id": 725, + "identifier": "litten", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 982, + "pokemon_id": 725, + "weight": 43 + }, + { + "base_id": 726, + "form_identifier": "", + "form_order": 1, + "id": 726, + "identifier": "torracat", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 983, + "pokemon_id": 726, + "weight": 250 + }, + { + "base_id": 727, + "form_identifier": "", + "form_order": 1, + "id": 727, + "identifier": "incineroar", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 984, + "pokemon_id": 727, + "weight": 830 + }, + { + "base_id": 728, + "form_identifier": "", + "form_order": 1, + "id": 728, + "identifier": "popplio", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 985, + "pokemon_id": 728, + "weight": 75 + }, + { + "base_id": 729, + "form_identifier": "", + "form_order": 1, + "id": 729, + "identifier": "brionne", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 986, + "pokemon_id": 729, + "weight": 175 + }, + { + "base_id": 730, + "form_identifier": "", + "form_order": 1, + "id": 730, + "identifier": "primarina", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 987, + "pokemon_id": 730, + "weight": 440 + }, + { + "base_id": 731, + "form_identifier": "", + "form_order": 1, + "id": 731, + "identifier": "pikipek", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 988, + "pokemon_id": 731, + "weight": 12 + }, + { + "base_id": 732, + "form_identifier": "", + "form_order": 1, + "id": 732, + "identifier": "trumbeak", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 989, + "pokemon_id": 732, + "weight": 148 + }, + { + "base_id": 733, + "form_identifier": "", + "form_order": 1, + "id": 733, + "identifier": "toucannon", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 990, + "pokemon_id": 733, + "weight": 260 + }, + { + "base_id": 734, + "form_identifier": "", + "form_order": 1, + "id": 734, + "identifier": "yungoos", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 991, + "pokemon_id": 734, + "weight": 60 + }, + { + "base_id": 735, + "form_identifier": "", + "form_order": 1, + "id": 735, + "identifier": "gumshoos", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 992, + "pokemon_id": 735, + "weight": 142 + }, + { + "base_id": 736, + "form_identifier": "", + "form_order": 1, + "id": 736, + "identifier": "grubbin", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 994, + "pokemon_id": 736, + "weight": 44 + }, + { + "base_id": 737, + "form_identifier": "", + "form_order": 1, + "id": 737, + "identifier": "charjabug", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 995, + "pokemon_id": 737, + "weight": 105 + }, + { + "base_id": 738, + "form_identifier": "", + "form_order": 1, + "id": 738, + "identifier": "vikavolt", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 996, + "pokemon_id": 738, + "weight": 450 + }, + { + "base_id": 739, + "form_identifier": "", + "form_order": 1, + "id": 739, + "identifier": "crabrawler", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 998, + "pokemon_id": 739, + "weight": 70 + }, + { + "base_id": 740, + "form_identifier": "", + "form_order": 1, + "id": 740, + "identifier": "crabominable", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 999, + "pokemon_id": 740, + "weight": 1800 + }, + { + "base_id": 741, + "form_identifier": "baile", + "form_order": 1, + "id": 741, + "identifier": "oricorio", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1000, + "pokemon_id": 741, + "weight": 34 + }, + { + "base_id": 742, + "form_identifier": "", + "form_order": 1, + "id": 742, + "identifier": "cutiefly", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1004, + "pokemon_id": 742, + "weight": 2 + }, + { + "base_id": 743, + "form_identifier": "", + "form_order": 1, + "id": 743, + "identifier": "ribombee", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1005, + "pokemon_id": 743, + "weight": 5 + }, + { + "base_id": 744, + "form_identifier": "", + "form_order": 1, + "id": 744, + "identifier": "rockruff", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1007, + "pokemon_id": 744, + "weight": 92 + }, + { + "base_id": 745, + "form_identifier": "midday", + "form_order": 1, + "id": 745, + "identifier": "lycanroc", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1009, + "pokemon_id": 745, + "weight": 250 + }, + { + "base_id": 746, + "form_identifier": "solo", + "form_order": 1, + "id": 746, + "identifier": "wishiwashi", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1012, + "pokemon_id": 746, + "weight": 3 + }, + { + "base_id": 747, + "form_identifier": "", + "form_order": 1, + "id": 747, + "identifier": "mareanie", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1014, + "pokemon_id": 747, + "weight": 80 + }, + { + "base_id": 748, + "form_identifier": "", + "form_order": 1, + "id": 748, + "identifier": "toxapex", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1015, + "pokemon_id": 748, + "weight": 145 + }, + { + "base_id": 749, + "form_identifier": "", + "form_order": 1, + "id": 749, + "identifier": "mudbray", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1016, + "pokemon_id": 749, + "weight": 1100 + }, + { + "base_id": 750, + "form_identifier": "", + "form_order": 1, + "id": 750, + "identifier": "mudsdale", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1017, + "pokemon_id": 750, + "weight": 9200 + }, + { + "base_id": 751, + "form_identifier": "", + "form_order": 1, + "id": 751, + "identifier": "dewpider", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1018, + "pokemon_id": 751, + "weight": 40 + }, + { + "base_id": 752, + "form_identifier": "", + "form_order": 1, + "id": 752, + "identifier": "araquanid", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1019, + "pokemon_id": 752, + "weight": 820 + }, + { + "base_id": 753, + "form_identifier": "", + "form_order": 1, + "id": 753, + "identifier": "fomantis", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1021, + "pokemon_id": 753, + "weight": 15 + }, + { + "base_id": 754, + "form_identifier": "", + "form_order": 1, + "id": 754, + "identifier": "lurantis", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1022, + "pokemon_id": 754, + "weight": 185 + }, + { + "base_id": 755, + "form_identifier": "", + "form_order": 1, + "id": 755, + "identifier": "morelull", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1024, + "pokemon_id": 755, + "weight": 15 + }, + { + "base_id": 756, + "form_identifier": "", + "form_order": 1, + "id": 756, + "identifier": "shiinotic", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1025, + "pokemon_id": 756, + "weight": 115 + }, + { + "base_id": 757, + "form_identifier": "", + "form_order": 1, + "id": 757, + "identifier": "salandit", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1026, + "pokemon_id": 757, + "weight": 48 + }, + { + "base_id": 758, + "form_identifier": "", + "form_order": 1, + "id": 758, + "identifier": "salazzle", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1027, + "pokemon_id": 758, + "weight": 222 + }, + { + "base_id": 759, + "form_identifier": "", + "form_order": 1, + "id": 759, + "identifier": "stufful", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1029, + "pokemon_id": 759, + "weight": 68 + }, + { + "base_id": 760, + "form_identifier": "", + "form_order": 1, + "id": 760, + "identifier": "bewear", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1030, + "pokemon_id": 760, + "weight": 1350 + }, + { + "base_id": 761, + "form_identifier": "", + "form_order": 1, + "id": 761, + "identifier": "bounsweet", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1031, + "pokemon_id": 761, + "weight": 32 + }, + { + "base_id": 762, + "form_identifier": "", + "form_order": 1, + "id": 762, + "identifier": "steenee", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1032, + "pokemon_id": 762, + "weight": 82 + }, + { + "base_id": 763, + "form_identifier": "", + "form_order": 1, + "id": 763, + "identifier": "tsareena", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1033, + "pokemon_id": 763, + "weight": 214 + }, + { + "base_id": 764, + "form_identifier": "", + "form_order": 1, + "id": 764, + "identifier": "comfey", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1034, + "pokemon_id": 764, + "weight": 3 + }, + { + "base_id": 765, + "form_identifier": "", + "form_order": 1, + "id": 765, + "identifier": "oranguru", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1035, + "pokemon_id": 765, + "weight": 760 + }, + { + "base_id": 766, + "form_identifier": "", + "form_order": 1, + "id": 766, + "identifier": "passimian", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1036, + "pokemon_id": 766, + "weight": 828 + }, + { + "base_id": 767, + "form_identifier": "", + "form_order": 1, + "id": 767, + "identifier": "wimpod", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1037, + "pokemon_id": 767, + "weight": 120 + }, + { + "base_id": 768, + "form_identifier": "", + "form_order": 1, + "id": 768, + "identifier": "golisopod", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1038, + "pokemon_id": 768, + "weight": 1080 + }, + { + "base_id": 769, + "form_identifier": "", + "form_order": 1, + "id": 769, + "identifier": "sandygast", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1039, + "pokemon_id": 769, + "weight": 700 + }, + { + "base_id": 770, + "form_identifier": "", + "form_order": 1, + "id": 770, + "identifier": "palossand", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1040, + "pokemon_id": 770, + "weight": 2500 + }, + { + "base_id": 771, + "form_identifier": "", + "form_order": 1, + "id": 771, + "identifier": "pyukumuku", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1041, + "pokemon_id": 771, + "weight": 12 + }, + { + "base_id": 772, + "form_identifier": "", + "form_order": 1, + "id": 772, + "identifier": "type-null", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1042, + "pokemon_id": 772, + "weight": 1205 + }, + { + "base_id": 773, + "form_identifier": "normal", + "form_order": 1, + "id": 773, + "identifier": "silvally", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1043, + "pokemon_id": 773, + "weight": 1005 + }, + { + "base_id": 774, + "form_identifier": "red-meteor", + "form_order": 1, + "id": 774, + "identifier": "minior", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1061, + "pokemon_id": 774, + "weight": 400 + }, + { + "base_id": 775, + "form_identifier": "", + "form_order": 1, + "id": 775, + "identifier": "komala", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1075, + "pokemon_id": 775, + "weight": 199 + }, + { + "base_id": 776, + "form_identifier": "", + "form_order": 1, + "id": 776, + "identifier": "turtonator", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1076, + "pokemon_id": 776, + "weight": 2120 + }, + { + "base_id": 777, + "form_identifier": "", + "form_order": 1, + "id": 777, + "identifier": "togedemaru", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1077, + "pokemon_id": 777, + "weight": 33 + }, + { + "base_id": 778, + "form_identifier": "disguised", + "form_order": 1, + "id": 778, + "identifier": "mimikyu", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1079, + "pokemon_id": 778, + "weight": 7 + }, + { + "base_id": 779, + "form_identifier": "", + "form_order": 1, + "id": 779, + "identifier": "bruxish", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1083, + "pokemon_id": 779, + "weight": 190 + }, + { + "base_id": 780, + "form_identifier": "", + "form_order": 1, + "id": 780, + "identifier": "drampa", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1084, + "pokemon_id": 780, + "weight": 1850 + }, + { + "base_id": 781, + "form_identifier": "", + "form_order": 1, + "id": 781, + "identifier": "dhelmise", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1085, + "pokemon_id": 781, + "weight": 2100 + }, + { + "base_id": 782, + "form_identifier": "", + "form_order": 1, + "id": 782, + "identifier": "jangmo-o", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1086, + "pokemon_id": 782, + "weight": 297 + }, + { + "base_id": 783, + "form_identifier": "", + "form_order": 1, + "id": 783, + "identifier": "hakamo-o", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1087, + "pokemon_id": 783, + "weight": 470 + }, + { + "base_id": 784, + "form_identifier": "", + "form_order": 1, + "id": 784, + "identifier": "kommo-o", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1088, + "pokemon_id": 784, + "weight": 782 + }, + { + "base_id": 785, + "form_identifier": "", + "form_order": 1, + "id": 785, + "identifier": "tapu-koko", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1090, + "pokemon_id": 785, + "weight": 205 + }, + { + "base_id": 786, + "form_identifier": "", + "form_order": 1, + "id": 786, + "identifier": "tapu-lele", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1091, + "pokemon_id": 786, + "weight": 186 + }, + { + "base_id": 787, + "form_identifier": "", + "form_order": 1, + "id": 787, + "identifier": "tapu-bulu", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1092, + "pokemon_id": 787, + "weight": 455 + }, + { + "base_id": 788, + "form_identifier": "", + "form_order": 1, + "id": 788, + "identifier": "tapu-fini", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1093, + "pokemon_id": 788, + "weight": 212 + }, + { + "base_id": 789, + "form_identifier": "", + "form_order": 1, + "id": 789, + "identifier": "cosmog", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1094, + "pokemon_id": 789, + "weight": 1 + }, + { + "base_id": 790, + "form_identifier": "", + "form_order": 1, + "id": 790, + "identifier": "cosmoem", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1095, + "pokemon_id": 790, + "weight": 9999 + }, + { + "base_id": 791, + "form_identifier": "", + "form_order": 1, + "id": 791, + "identifier": "solgaleo", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1096, + "pokemon_id": 791, + "weight": 2300 + }, + { + "base_id": 792, + "form_identifier": "", + "form_order": 1, + "id": 792, + "identifier": "lunala", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1097, + "pokemon_id": 792, + "weight": 1200 + }, + { + "base_id": 793, + "form_identifier": "", + "form_order": 1, + "id": 793, + "identifier": "nihilego", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1098, + "pokemon_id": 793, + "weight": 555 + }, + { + "base_id": 794, + "form_identifier": "", + "form_order": 1, + "id": 794, + "identifier": "buzzwole", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1099, + "pokemon_id": 794, + "weight": 3336 + }, + { + "base_id": 795, + "form_identifier": "", + "form_order": 1, + "id": 795, + "identifier": "pheromosa", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1100, + "pokemon_id": 795, + "weight": 250 + }, + { + "base_id": 796, + "form_identifier": "", + "form_order": 1, + "id": 796, + "identifier": "xurkitree", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1101, + "pokemon_id": 796, + "weight": 1000 + }, + { + "base_id": 797, + "form_identifier": "", + "form_order": 1, + "id": 797, + "identifier": "celesteela", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1102, + "pokemon_id": 797, + "weight": 9999 + }, + { + "base_id": 798, + "form_identifier": "", + "form_order": 1, + "id": 798, + "identifier": "kartana", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1103, + "pokemon_id": 798, + "weight": 1 + }, + { + "base_id": 799, + "form_identifier": "", + "form_order": 1, + "id": 799, + "identifier": "guzzlord", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1104, + "pokemon_id": 799, + "weight": 8880 + }, + { + "base_id": 800, + "form_identifier": "", + "form_order": 1, + "id": 800, + "identifier": "necrozma", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1105, + "pokemon_id": 800, + "weight": 2300 + }, + { + "base_id": 801, + "form_identifier": "", + "form_order": 1, + "id": 801, + "identifier": "magearna", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1109, + "pokemon_id": 801, + "weight": 805 + }, + { + "base_id": 802, + "form_identifier": "", + "form_order": 1, + "id": 802, + "identifier": "marshadow", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1111, + "pokemon_id": 802, + "weight": 222 + }, + { + "base_id": 803, + "form_identifier": "", + "form_order": 1, + "id": 803, + "identifier": "poipole", + "introduced_in_version_group_id": 18, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1112, + "pokemon_id": 803, + "weight": 18 + }, + { + "base_id": 804, + "form_identifier": "", + "form_order": 1, + "id": 804, + "identifier": "naganadel", + "introduced_in_version_group_id": 18, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1113, + "pokemon_id": 804, + "weight": 1500 + }, + { + "base_id": 805, + "form_identifier": "", + "form_order": 1, + "id": 805, + "identifier": "stakataka", + "introduced_in_version_group_id": 18, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1114, + "pokemon_id": 805, + "weight": 8200 + }, + { + "base_id": 806, + "form_identifier": "", + "form_order": 1, + "id": 806, + "identifier": "blacephalon", + "introduced_in_version_group_id": 18, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1115, + "pokemon_id": 806, + "weight": 130 + }, + { + "base_id": 807, + "form_identifier": "", + "form_order": 1, + "id": 807, + "identifier": "zeraora", + "introduced_in_version_group_id": 18, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1116, + "pokemon_id": 807, + "weight": 445 + }, + { + "base_id": 808, + "form_identifier": "", + "form_order": 1, + "id": 808, + "identifier": "meltan", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1094, + "pokemon_id": 808, + "weight": 80 + }, + { + "base_id": 809, + "form_identifier": "", + "form_order": 1, + "id": 809, + "identifier": "melmetal", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1095, + "pokemon_id": 809, + "weight": 8000 + }, + { + "base_id": 810, + "form_identifier": "", + "form_order": 1, + "id": 810, + "identifier": "grookey", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 810, + "weight": 50 + }, + { + "base_id": 811, + "form_identifier": "", + "form_order": 1, + "id": 811, + "identifier": "thwackey", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 811, + "weight": 140 + }, + { + "base_id": 812, + "form_identifier": "", + "form_order": 1, + "id": 812, + "identifier": "rillaboom", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 812, + "weight": 900 + }, + { + "base_id": 813, + "form_identifier": "", + "form_order": 1, + "id": 813, + "identifier": "scorbunny", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 813, + "weight": 45 + }, + { + "base_id": 814, + "form_identifier": "", + "form_order": 1, + "id": 814, + "identifier": "raboot", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 814, + "weight": 90 + }, + { + "base_id": 815, + "form_identifier": "", + "form_order": 1, + "id": 815, + "identifier": "cinderace", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 815, + "weight": 330 + }, + { + "base_id": 816, + "form_identifier": "", + "form_order": 1, + "id": 816, + "identifier": "sobble", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 816, + "weight": 40 + }, + { + "base_id": 817, + "form_identifier": "", + "form_order": 1, + "id": 817, + "identifier": "drizzile", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 817, + "weight": 115 + }, + { + "base_id": 818, + "form_identifier": "", + "form_order": 1, + "id": 818, + "identifier": "inteleon", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 818, + "weight": 452 + }, + { + "base_id": 819, + "form_identifier": "", + "form_order": 1, + "id": 819, + "identifier": "skwovet", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 819, + "weight": 25 + }, + { + "base_id": 820, + "form_identifier": "", + "form_order": 1, + "id": 820, + "identifier": "greedent", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 820, + "weight": 60 + }, + { + "base_id": 821, + "form_identifier": "", + "form_order": 1, + "id": 821, + "identifier": "rookidee", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 821, + "weight": 18 + }, + { + "base_id": 822, + "form_identifier": "", + "form_order": 1, + "id": 822, + "identifier": "corvisquire", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 822, + "weight": 160 + }, + { + "base_id": 823, + "form_identifier": "", + "form_order": 1, + "id": 823, + "identifier": "corviknight", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 823, + "weight": 750 + }, + { + "base_id": 824, + "form_identifier": "", + "form_order": 1, + "id": 824, + "identifier": "blipbug", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 824, + "weight": 80 + }, + { + "base_id": 825, + "form_identifier": "", + "form_order": 1, + "id": 825, + "identifier": "dottler", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 825, + "weight": 195 + }, + { + "base_id": 826, + "form_identifier": "", + "form_order": 1, + "id": 826, + "identifier": "orbeetle", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 826, + "weight": 408 + }, + { + "base_id": 827, + "form_identifier": "", + "form_order": 1, + "id": 827, + "identifier": "nickit", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 827, + "weight": 89 + }, + { + "base_id": 828, + "form_identifier": "", + "form_order": 1, + "id": 828, + "identifier": "thievul", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 828, + "weight": 199 + }, + { + "base_id": 829, + "form_identifier": "", + "form_order": 1, + "id": 829, + "identifier": "gossifleur", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 829, + "weight": 22 + }, + { + "base_id": 830, + "form_identifier": "", + "form_order": 1, + "id": 830, + "identifier": "eldegoss", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 830, + "weight": 25 + }, + { + "base_id": 831, + "form_identifier": "", + "form_order": 1, + "id": 831, + "identifier": "wooloo", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 831, + "weight": 60 + }, + { + "base_id": 832, + "form_identifier": "", + "form_order": 1, + "id": 832, + "identifier": "dubwool", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 832, + "weight": 430 + }, + { + "base_id": 833, + "form_identifier": "", + "form_order": 1, + "id": 833, + "identifier": "chewtle", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 833, + "weight": 85 + }, + { + "base_id": 834, + "form_identifier": "", + "form_order": 1, + "id": 834, + "identifier": "drednaw", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 834, + "weight": 1155 + }, + { + "base_id": 835, + "form_identifier": "", + "form_order": 1, + "id": 835, + "identifier": "yamper", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 835, + "weight": 135 + }, + { + "base_id": 836, + "form_identifier": "", + "form_order": 1, + "id": 836, + "identifier": "boltund", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 836, + "weight": 340 + }, + { + "base_id": 837, + "form_identifier": "", + "form_order": 1, + "id": 837, + "identifier": "rolycoly", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 837, + "weight": 120 + }, + { + "base_id": 838, + "form_identifier": "", + "form_order": 1, + "id": 838, + "identifier": "carkol", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 838, + "weight": 780 + }, + { + "base_id": 839, + "form_identifier": "", + "form_order": 1, + "id": 839, + "identifier": "coalossal", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 839, + "weight": 3105 + }, + { + "base_id": 840, + "form_identifier": "", + "form_order": 1, + "id": 840, + "identifier": "applin", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 840, + "weight": 5 + }, + { + "base_id": 841, + "form_identifier": "", + "form_order": 1, + "id": 841, + "identifier": "flapple", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 841, + "weight": 10 + }, + { + "base_id": 842, + "form_identifier": "", + "form_order": 1, + "id": 842, + "identifier": "appletun", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 842, + "weight": 130 + }, + { + "base_id": 843, + "form_identifier": "", + "form_order": 1, + "id": 843, + "identifier": "silicobra", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 843, + "weight": 76 + }, + { + "base_id": 844, + "form_identifier": "", + "form_order": 1, + "id": 844, + "identifier": "sandaconda", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 844, + "weight": 655 + }, + { + "base_id": 845, + "form_identifier": "", + "form_order": 1, + "id": 845, + "identifier": "cramorant", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 845, + "weight": 180 + }, + { + "base_id": 846, + "form_identifier": "", + "form_order": 1, + "id": 846, + "identifier": "arrokuda", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 846, + "weight": 10 + }, + { + "base_id": 847, + "form_identifier": "", + "form_order": 1, + "id": 847, + "identifier": "barraskewda", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 847, + "weight": 300 + }, + { + "base_id": 848, + "form_identifier": "", + "form_order": 1, + "id": 848, + "identifier": "toxel", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 848, + "weight": 110 + }, + { + "base_id": 849, + "form_identifier": "", + "form_order": 1, + "id": 849, + "identifier": "toxtricity", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 849, + "weight": 400 + }, + { + "base_id": 850, + "form_identifier": "", + "form_order": 1, + "id": 850, + "identifier": "sizzlipede", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 850, + "weight": 10 + }, + { + "base_id": 851, + "form_identifier": "", + "form_order": 1, + "id": 851, + "identifier": "centiskorch", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 851, + "weight": 1200 + }, + { + "base_id": 852, + "form_identifier": "", + "form_order": 1, + "id": 852, + "identifier": "clobbopus", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 852, + "weight": 40 + }, + { + "base_id": 853, + "form_identifier": "", + "form_order": 1, + "id": 853, + "identifier": "grapploct", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 853, + "weight": 390 + }, + { + "base_id": 854, + "form_identifier": "", + "form_order": 1, + "id": 854, + "identifier": "sinistea", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 854, + "weight": 2 + }, + { + "base_id": 855, + "form_identifier": "", + "form_order": 1, + "id": 855, + "identifier": "polteageist", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 855, + "weight": 4 + }, + { + "base_id": 856, + "form_identifier": "", + "form_order": 1, + "id": 856, + "identifier": "hatenna", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 856, + "weight": 34 + }, + { + "base_id": 857, + "form_identifier": "", + "form_order": 1, + "id": 857, + "identifier": "hattrem", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 857, + "weight": 48 + }, + { + "base_id": 858, + "form_identifier": "", + "form_order": 1, + "id": 858, + "identifier": "hatterene", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 858, + "weight": 50 + }, + { + "base_id": 859, + "form_identifier": "", + "form_order": 1, + "id": 859, + "identifier": "impidimp", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 859, + "weight": 55 + }, + { + "base_id": 860, + "form_identifier": "", + "form_order": 1, + "id": 860, + "identifier": "morgrem", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 860, + "weight": 125 + }, + { + "base_id": 861, + "form_identifier": "", + "form_order": 1, + "id": 861, + "identifier": "grimmsnarl", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 861, + "weight": 610 + }, + { + "base_id": 862, + "form_identifier": "", + "form_order": 1, + "id": 862, + "identifier": "obstagoon", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 862, + "weight": 460 + }, + { + "base_id": 863, + "form_identifier": "", + "form_order": 1, + "id": 863, + "identifier": "perrserker", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 863, + "weight": 280 + }, + { + "base_id": 864, + "form_identifier": "", + "form_order": 1, + "id": 864, + "identifier": "cursola", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 864, + "weight": 4 + }, + { + "base_id": 865, + "form_identifier": "", + "form_order": 1, + "id": 865, + "identifier": "sirfetchd", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 865, + "weight": 1170 + }, + { + "base_id": 866, + "form_identifier": "", + "form_order": 1, + "id": 866, + "identifier": "mr-rime", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 866, + "weight": 582 + }, + { + "base_id": 867, + "form_identifier": "", + "form_order": 1, + "id": 867, + "identifier": "runerigus", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 867, + "weight": 666 + }, + { + "base_id": 868, + "form_identifier": "", + "form_order": 1, + "id": 868, + "identifier": "milcery", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 868, + "weight": 3 + }, + { + "base_id": 869, + "form_identifier": "", + "form_order": 1, + "id": 869, + "identifier": "alcremie", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 869, + "weight": 5 + }, + { + "base_id": 870, + "form_identifier": "", + "form_order": 1, + "id": 870, + "identifier": "falinks", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 870, + "weight": 620 + }, + { + "base_id": 871, + "form_identifier": "", + "form_order": 1, + "id": 871, + "identifier": "pincurchin", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 871, + "weight": 10 + }, + { + "base_id": 872, + "form_identifier": "", + "form_order": 1, + "id": 872, + "identifier": "snom", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 872, + "weight": 38 + }, + { + "base_id": 873, + "form_identifier": "", + "form_order": 1, + "id": 873, + "identifier": "frosmoth", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 873, + "weight": 420 + }, + { + "base_id": 874, + "form_identifier": "", + "form_order": 1, + "id": 874, + "identifier": "stonjourner", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 874, + "weight": 5200 + }, + { + "base_id": 875, + "form_identifier": "", + "form_order": 1, + "id": 875, + "identifier": "eiscue", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 875, + "weight": 89 + }, + { + "base_id": 875, + "form_identifier": "noice", + "form_order": 2, + "id": 10230, + "identifier": "eiscue-noice", + "introduced_in_version_group_id": 12, + "is_battle_only": 1, + "is_default": 0, + "is_mega": 0, + "order": 1, + "pokemon_id": 10144, + "weight": 890 + }, + { + "base_id": 876, + "form_identifier": "", + "form_order": 1, + "id": 876, + "identifier": "indeedee", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 876, + "weight": 280 + }, + { + "base_id": 877, + "form_identifier": "", + "form_order": 1, + "id": 877, + "identifier": "morpeko", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 877, + "weight": 30 + }, + { + "base_id": 878, + "form_identifier": "", + "form_order": 1, + "id": 878, + "identifier": "cufant", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 878, + "weight": 1000 + }, + { + "base_id": 879, + "form_identifier": "", + "form_order": 1, + "id": 879, + "identifier": "copperajah", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 879, + "weight": 6500 + }, + { + "base_id": 880, + "form_identifier": "", + "form_order": 1, + "id": 880, + "identifier": "dracozolt", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 880, + "weight": 1900 + }, + { + "base_id": 881, + "form_identifier": "", + "form_order": 1, + "id": 881, + "identifier": "arctozolt", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 881, + "weight": 1500 + }, + { + "base_id": 882, + "form_identifier": "", + "form_order": 1, + "id": 882, + "identifier": "dracovish", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 882, + "weight": 2150 + }, + { + "base_id": 883, + "form_identifier": "", + "form_order": 1, + "id": 883, + "identifier": "arctovish", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 883, + "weight": 1750 + }, + { + "base_id": 884, + "form_identifier": "", + "form_order": 1, + "id": 884, + "identifier": "duraludon", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 884, + "weight": 400 + }, + { + "base_id": 885, + "form_identifier": "", + "form_order": 1, + "id": 885, + "identifier": "dreepy", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 885, + "weight": 20 + }, + { + "base_id": 886, + "form_identifier": "", + "form_order": 1, + "id": 886, + "identifier": "drakloak", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 886, + "weight": 110 + }, + { + "base_id": 887, + "form_identifier": "", + "form_order": 1, + "id": 887, + "identifier": "dragapult", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 887, + "weight": 500 + }, + { + "base_id": 888, + "form_identifier": "", + "form_order": 1, + "id": 888, + "identifier": "zacian", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 888, + "weight": 1100 + }, + { + "base_id": 889, + "form_identifier": "", + "form_order": 1, + "id": 889, + "identifier": "zamazenta", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 889, + "weight": 2100 + }, + { + "base_id": 890, + "form_identifier": "", + "form_order": 1, + "id": 890, + "identifier": "eternatus", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 890, + "weight": 9500 + }, + { + "base_id": 201, + "form_identifier": "b", + "form_order": 2, + "id": 10001, + "identifier": "unown-b", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 278, + "pokemon_id": 201, + "weight": 50 + }, + { + "base_id": 201, + "form_identifier": "c", + "form_order": 3, + "id": 10002, + "identifier": "unown-c", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 279, + "pokemon_id": 201, + "weight": 50 + }, + { + "base_id": 201, + "form_identifier": "d", + "form_order": 4, + "id": 10003, + "identifier": "unown-d", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 280, + "pokemon_id": 201, + "weight": 50 + }, + { + "base_id": 201, + "form_identifier": "e", + "form_order": 5, + "id": 10004, + "identifier": "unown-e", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 281, + "pokemon_id": 201, + "weight": 50 + }, + { + "base_id": 201, + "form_identifier": "f", + "form_order": 6, + "id": 10005, + "identifier": "unown-f", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 282, + "pokemon_id": 201, + "weight": 50 + }, + { + "base_id": 201, + "form_identifier": "g", + "form_order": 7, + "id": 10006, + "identifier": "unown-g", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 283, + "pokemon_id": 201, + "weight": 50 + }, + { + "base_id": 201, + "form_identifier": "h", + "form_order": 8, + "id": 10007, + "identifier": "unown-h", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 284, + "pokemon_id": 201, + "weight": 50 + }, + { + "base_id": 201, + "form_identifier": "i", + "form_order": 9, + "id": 10008, + "identifier": "unown-i", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 285, + "pokemon_id": 201, + "weight": 50 + }, + { + "base_id": 201, + "form_identifier": "j", + "form_order": 10, + "id": 10009, + "identifier": "unown-j", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 286, + "pokemon_id": 201, + "weight": 50 + }, + { + "base_id": 201, + "form_identifier": "k", + "form_order": 11, + "id": 10010, + "identifier": "unown-k", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 287, + "pokemon_id": 201, + "weight": 50 + }, + { + "base_id": 201, + "form_identifier": "l", + "form_order": 12, + "id": 10011, + "identifier": "unown-l", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 288, + "pokemon_id": 201, + "weight": 50 + }, + { + "base_id": 201, + "form_identifier": "m", + "form_order": 13, + "id": 10012, + "identifier": "unown-m", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 289, + "pokemon_id": 201, + "weight": 50 + }, + { + "base_id": 201, + "form_identifier": "n", + "form_order": 14, + "id": 10013, + "identifier": "unown-n", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 290, + "pokemon_id": 201, + "weight": 50 + }, + { + "base_id": 201, + "form_identifier": "o", + "form_order": 15, + "id": 10014, + "identifier": "unown-o", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 291, + "pokemon_id": 201, + "weight": 50 + }, + { + "base_id": 201, + "form_identifier": "p", + "form_order": 16, + "id": 10015, + "identifier": "unown-p", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 292, + "pokemon_id": 201, + "weight": 50 + }, + { + "base_id": 201, + "form_identifier": "q", + "form_order": 17, + "id": 10016, + "identifier": "unown-q", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 293, + "pokemon_id": 201, + "weight": 50 + }, + { + "base_id": 201, + "form_identifier": "r", + "form_order": 18, + "id": 10017, + "identifier": "unown-r", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 294, + "pokemon_id": 201, + "weight": 50 + }, + { + "base_id": 201, + "form_identifier": "s", + "form_order": 19, + "id": 10018, + "identifier": "unown-s", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 295, + "pokemon_id": 201, + "weight": 50 + }, + { + "base_id": 201, + "form_identifier": "t", + "form_order": 20, + "id": 10019, + "identifier": "unown-t", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 296, + "pokemon_id": 201, + "weight": 50 + }, + { + "base_id": 201, + "form_identifier": "u", + "form_order": 21, + "id": 10020, + "identifier": "unown-u", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 297, + "pokemon_id": 201, + "weight": 50 + }, + { + "base_id": 201, + "form_identifier": "v", + "form_order": 22, + "id": 10021, + "identifier": "unown-v", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 298, + "pokemon_id": 201, + "weight": 50 + }, + { + "base_id": 201, + "form_identifier": "w", + "form_order": 23, + "id": 10022, + "identifier": "unown-w", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 299, + "pokemon_id": 201, + "weight": 50 + }, + { + "base_id": 201, + "form_identifier": "x", + "form_order": 24, + "id": 10023, + "identifier": "unown-x", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 300, + "pokemon_id": 201, + "weight": 50 + }, + { + "base_id": 201, + "form_identifier": "y", + "form_order": 25, + "id": 10024, + "identifier": "unown-y", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 301, + "pokemon_id": 201, + "weight": 50 + }, + { + "base_id": 201, + "form_identifier": "z", + "form_order": 26, + "id": 10025, + "identifier": "unown-z", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 302, + "pokemon_id": 201, + "weight": 50 + }, + { + "base_id": 201, + "form_identifier": "exclamation", + "form_order": 27, + "id": 10026, + "identifier": "unown-exclamation", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 303, + "pokemon_id": 201, + "weight": 50 + }, + { + "base_id": 201, + "form_identifier": "question", + "form_order": 28, + "id": 10027, + "identifier": "unown-question", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 304, + "pokemon_id": 201, + "weight": 50 + }, + { + "base_id": 351, + "form_identifier": "sunny", + "form_order": 2, + "id": 10028, + "identifier": "castform-sunny", + "introduced_in_version_group_id": 5, + "is_battle_only": 1, + "is_default": 1, + "is_mega": 0, + "order": 469, + "pokemon_id": 10013, + "weight": 8 + }, + { + "base_id": 351, + "form_identifier": "rainy", + "form_order": 3, + "id": 10029, + "identifier": "castform-rainy", + "introduced_in_version_group_id": 5, + "is_battle_only": 1, + "is_default": 1, + "is_mega": 0, + "order": 470, + "pokemon_id": 10014, + "weight": 8 + }, + { + "base_id": 351, + "form_identifier": "snowy", + "form_order": 4, + "id": 10030, + "identifier": "castform-snowy", + "introduced_in_version_group_id": 5, + "is_battle_only": 1, + "is_default": 1, + "is_mega": 0, + "order": 471, + "pokemon_id": 10015, + "weight": 8 + }, + { + "base_id": 386, + "form_identifier": "attack", + "form_order": 2, + "id": 10031, + "identifier": "deoxys-attack", + "introduced_in_version_group_id": 7, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 519, + "pokemon_id": 10001, + "weight": 608 + }, + { + "base_id": 386, + "form_identifier": "defense", + "form_order": 3, + "id": 10032, + "identifier": "deoxys-defense", + "introduced_in_version_group_id": 7, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 520, + "pokemon_id": 10002, + "weight": 608 + }, + { + "base_id": 386, + "form_identifier": "speed", + "form_order": 4, + "id": 10033, + "identifier": "deoxys-speed", + "introduced_in_version_group_id": 6, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 521, + "pokemon_id": 10003, + "weight": 608 + }, + { + "base_id": 412, + "form_identifier": "sandy", + "form_order": 2, + "id": 10034, + "identifier": "burmy-sandy", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 546, + "pokemon_id": 412, + "weight": 34 + }, + { + "base_id": 412, + "form_identifier": "trash", + "form_order": 3, + "id": 10035, + "identifier": "burmy-trash", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 547, + "pokemon_id": 412, + "weight": 34 + }, + { + "base_id": 413, + "form_identifier": "sandy", + "form_order": 2, + "id": 10036, + "identifier": "wormadam-sandy", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 549, + "pokemon_id": 10004, + "weight": 65 + }, + { + "base_id": 413, + "form_identifier": "trash", + "form_order": 3, + "id": 10037, + "identifier": "wormadam-trash", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 550, + "pokemon_id": 10005, + "weight": 65 + }, + { + "base_id": 421, + "form_identifier": "sunshine", + "form_order": 2, + "id": 10038, + "identifier": "cherrim-sunshine", + "introduced_in_version_group_id": 8, + "is_battle_only": 1, + "is_default": 0, + "is_mega": 0, + "order": 561, + "pokemon_id": 421, + "weight": 93 + }, + { + "base_id": 422, + "form_identifier": "east", + "form_order": 2, + "id": 10039, + "identifier": "shellos-east", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 563, + "pokemon_id": 422, + "weight": 63 + }, + { + "base_id": 423, + "form_identifier": "east", + "form_order": 2, + "id": 10040, + "identifier": "gastrodon-east", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 565, + "pokemon_id": 423, + "weight": 299 + }, + { + "base_id": 493, + "form_identifier": "bug", + "form_order": 7, + "id": 10041, + "identifier": "arceus-bug", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 625, + "pokemon_id": 493, + "weight": 3200 + }, + { + "base_id": 493, + "form_identifier": "dark", + "form_order": 17, + "id": 10042, + "identifier": "arceus-dark", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 635, + "pokemon_id": 493, + "weight": 3200 + }, + { + "base_id": 493, + "form_identifier": "dragon", + "form_order": 16, + "id": 10043, + "identifier": "arceus-dragon", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 634, + "pokemon_id": 493, + "weight": 3200 + }, + { + "base_id": 493, + "form_identifier": "electric", + "form_order": 13, + "id": 10044, + "identifier": "arceus-electric", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 631, + "pokemon_id": 493, + "weight": 3200 + }, + { + "base_id": 493, + "form_identifier": "fighting", + "form_order": 2, + "id": 10045, + "identifier": "arceus-fighting", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 620, + "pokemon_id": 493, + "weight": 3200 + }, + { + "base_id": 493, + "form_identifier": "fire", + "form_order": 10, + "id": 10046, + "identifier": "arceus-fire", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 628, + "pokemon_id": 493, + "weight": 3200 + }, + { + "base_id": 493, + "form_identifier": "flying", + "form_order": 3, + "id": 10047, + "identifier": "arceus-flying", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 621, + "pokemon_id": 493, + "weight": 3200 + }, + { + "base_id": 493, + "form_identifier": "ghost", + "form_order": 8, + "id": 10048, + "identifier": "arceus-ghost", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 626, + "pokemon_id": 493, + "weight": 3200 + }, + { + "base_id": 493, + "form_identifier": "grass", + "form_order": 12, + "id": 10049, + "identifier": "arceus-grass", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 630, + "pokemon_id": 493, + "weight": 3200 + }, + { + "base_id": 493, + "form_identifier": "ground", + "form_order": 5, + "id": 10050, + "identifier": "arceus-ground", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 623, + "pokemon_id": 493, + "weight": 3200 + }, + { + "base_id": 493, + "form_identifier": "ice", + "form_order": 15, + "id": 10051, + "identifier": "arceus-ice", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 633, + "pokemon_id": 493, + "weight": 3200 + }, + { + "base_id": 493, + "form_identifier": "poison", + "form_order": 4, + "id": 10052, + "identifier": "arceus-poison", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 622, + "pokemon_id": 493, + "weight": 3200 + }, + { + "base_id": 493, + "form_identifier": "psychic", + "form_order": 14, + "id": 10053, + "identifier": "arceus-psychic", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 632, + "pokemon_id": 493, + "weight": 3200 + }, + { + "base_id": 493, + "form_identifier": "rock", + "form_order": 6, + "id": 10054, + "identifier": "arceus-rock", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 624, + "pokemon_id": 493, + "weight": 3200 + }, + { + "base_id": 493, + "form_identifier": "steel", + "form_order": 9, + "id": 10055, + "identifier": "arceus-steel", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 627, + "pokemon_id": 493, + "weight": 3200 + }, + { + "base_id": 493, + "form_identifier": "water", + "form_order": 11, + "id": 10056, + "identifier": "arceus-water", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 629, + "pokemon_id": 493, + "weight": 3200 + }, + { + "base_id": 479, + "form_identifier": "heat", + "form_order": 2, + "id": 10058, + "identifier": "rotom-heat", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 599, + "pokemon_id": 10008, + "weight": 3 + }, + { + "base_id": 479, + "form_identifier": "wash", + "form_order": 3, + "id": 10059, + "identifier": "rotom-wash", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 600, + "pokemon_id": 10009, + "weight": 3 + }, + { + "base_id": 479, + "form_identifier": "frost", + "form_order": 4, + "id": 10060, + "identifier": "rotom-frost", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 601, + "pokemon_id": 10010, + "weight": 3 + }, + { + "base_id": 479, + "form_identifier": "fan", + "form_order": 5, + "id": 10061, + "identifier": "rotom-fan", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 602, + "pokemon_id": 10011, + "weight": 3 + }, + { + "base_id": 479, + "form_identifier": "mow", + "form_order": 6, + "id": 10062, + "identifier": "rotom-mow", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 603, + "pokemon_id": 10012, + "weight": 3 + }, + { + "base_id": 487, + "form_identifier": "origin", + "form_order": 2, + "id": 10063, + "identifier": "giratina-origin", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 612, + "pokemon_id": 10007, + "weight": 6500 + }, + { + "base_id": 492, + "form_identifier": "sky", + "form_order": 2, + "id": 10064, + "identifier": "shaymin-sky", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 618, + "pokemon_id": 10006, + "weight": 52 + }, + { + "base_id": 172, + "form_identifier": "spiky-eared", + "form_order": 2, + "id": 10065, + "identifier": "pichu-spiky-eared", + "introduced_in_version_group_id": 10, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 35, + "pokemon_id": 172, + "weight": 20 + }, + { + "base_id": 550, + "form_identifier": "blue-striped", + "form_order": 2, + "id": 10066, + "identifier": "basculin-blue-striped", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 695, + "pokemon_id": 10016, + "weight": 180 + }, + { + "base_id": 555, + "form_identifier": "zen", + "form_order": 2, + "id": 10067, + "identifier": "darmanitan-zen", + "introduced_in_version_group_id": 11, + "is_battle_only": 1, + "is_default": 1, + "is_mega": 0, + "order": 701, + "pokemon_id": 10017, + "weight": 929 + }, + { + "base_id": 585, + "form_identifier": "summer", + "form_order": 2, + "id": 10068, + "identifier": "deerling-summer", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 732, + "pokemon_id": 585, + "weight": 195 + }, + { + "base_id": 585, + "form_identifier": "autumn", + "form_order": 3, + "id": 10069, + "identifier": "deerling-autumn", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 733, + "pokemon_id": 585, + "weight": 195 + }, + { + "base_id": 585, + "form_identifier": "winter", + "form_order": 4, + "id": 10070, + "identifier": "deerling-winter", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 734, + "pokemon_id": 585, + "weight": 195 + }, + { + "base_id": 586, + "form_identifier": "summer", + "form_order": 2, + "id": 10071, + "identifier": "sawsbuck-summer", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 736, + "pokemon_id": 586, + "weight": 925 + }, + { + "base_id": 586, + "form_identifier": "autumn", + "form_order": 3, + "id": 10072, + "identifier": "sawsbuck-autumn", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 737, + "pokemon_id": 586, + "weight": 925 + }, + { + "base_id": 586, + "form_identifier": "winter", + "form_order": 4, + "id": 10073, + "identifier": "sawsbuck-winter", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 738, + "pokemon_id": 586, + "weight": 925 + }, + { + "base_id": 648, + "form_identifier": "pirouette", + "form_order": 2, + "id": 10074, + "identifier": "meloetta-pirouette", + "introduced_in_version_group_id": 11, + "is_battle_only": 1, + "is_default": 1, + "is_mega": 0, + "order": 807, + "pokemon_id": 10018, + "weight": 65 + }, + { + "base_id": 649, + "form_identifier": "douse", + "form_order": 2, + "id": 10075, + "identifier": "genesect-douse", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 809, + "pokemon_id": 649, + "weight": 825 + }, + { + "base_id": 649, + "form_identifier": "shock", + "form_order": 3, + "id": 10076, + "identifier": "genesect-shock", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 810, + "pokemon_id": 649, + "weight": 825 + }, + { + "base_id": 649, + "form_identifier": "burn", + "form_order": 4, + "id": 10077, + "identifier": "genesect-burn", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 811, + "pokemon_id": 649, + "weight": 825 + }, + { + "base_id": 649, + "form_identifier": "chill", + "form_order": 5, + "id": 10078, + "identifier": "genesect-chill", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 812, + "pokemon_id": 649, + "weight": 825 + }, + { + "base_id": 641, + "form_identifier": "therian", + "form_order": 2, + "id": 10079, + "identifier": "tornadus-therian", + "introduced_in_version_group_id": 14, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 794, + "pokemon_id": 10019, + "weight": 630 + }, + { + "base_id": 642, + "form_identifier": "therian", + "form_order": 2, + "id": 10080, + "identifier": "thundurus-therian", + "introduced_in_version_group_id": 14, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 796, + "pokemon_id": 10020, + "weight": 610 + }, + { + "base_id": 645, + "form_identifier": "therian", + "form_order": 2, + "id": 10081, + "identifier": "landorus-therian", + "introduced_in_version_group_id": 14, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 800, + "pokemon_id": 10021, + "weight": 680 + }, + { + "base_id": 646, + "form_identifier": "black", + "form_order": 3, + "id": 10082, + "identifier": "kyurem-black", + "introduced_in_version_group_id": 14, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 803, + "pokemon_id": 10022, + "weight": 3250 + }, + { + "base_id": 646, + "form_identifier": "white", + "form_order": 2, + "id": 10083, + "identifier": "kyurem-white", + "introduced_in_version_group_id": 14, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 802, + "pokemon_id": 10023, + "weight": 3250 + }, + { + "base_id": 647, + "form_identifier": "resolute", + "form_order": 2, + "id": 10084, + "identifier": "keldeo-resolute", + "introduced_in_version_group_id": 14, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 805, + "pokemon_id": 10024, + "weight": 485 + }, + { + "base_id": 493, + "form_identifier": "fairy", + "form_order": 18, + "id": 10085, + "identifier": "arceus-fairy", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 636, + "pokemon_id": 493, + "weight": 3200 + }, + { + "base_id": 666, + "form_identifier": "icy-snow", + "form_order": 7, + "id": 10086, + "identifier": "vivillon-icy-snow", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 869, + "pokemon_id": 666, + "weight": 170 + }, + { + "base_id": 666, + "form_identifier": "polar", + "form_order": 2, + "id": 10087, + "identifier": "vivillon-polar", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 870, + "pokemon_id": 666, + "weight": 170 + }, + { + "base_id": 666, + "form_identifier": "tundra", + "form_order": 3, + "id": 10088, + "identifier": "vivillon-tundra", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 871, + "pokemon_id": 666, + "weight": 170 + }, + { + "base_id": 666, + "form_identifier": "continental", + "form_order": 4, + "id": 10089, + "identifier": "vivillon-continental", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 872, + "pokemon_id": 666, + "weight": 170 + }, + { + "base_id": 666, + "form_identifier": "garden", + "form_order": 5, + "id": 10090, + "identifier": "vivillon-garden", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 873, + "pokemon_id": 666, + "weight": 170 + }, + { + "base_id": 666, + "form_identifier": "elegant", + "form_order": 6, + "id": 10091, + "identifier": "vivillon-elegant", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 874, + "pokemon_id": 666, + "weight": 170 + }, + { + "base_id": 666, + "form_identifier": "modern", + "form_order": 8, + "id": 10092, + "identifier": "vivillon-modern", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 876, + "pokemon_id": 666, + "weight": 170 + }, + { + "base_id": 666, + "form_identifier": "marine", + "form_order": 9, + "id": 10093, + "identifier": "vivillon-marine", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 877, + "pokemon_id": 666, + "weight": 170 + }, + { + "base_id": 666, + "form_identifier": "archipelago", + "form_order": 10, + "id": 10094, + "identifier": "vivillon-archipelago", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 878, + "pokemon_id": 666, + "weight": 170 + }, + { + "base_id": 666, + "form_identifier": "high-plains", + "form_order": 11, + "id": 10095, + "identifier": "vivillon-high-plains", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 879, + "pokemon_id": 666, + "weight": 170 + }, + { + "base_id": 666, + "form_identifier": "sandstorm", + "form_order": 12, + "id": 10096, + "identifier": "vivillon-sandstorm", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 880, + "pokemon_id": 666, + "weight": 170 + }, + { + "base_id": 666, + "form_identifier": "river", + "form_order": 13, + "id": 10097, + "identifier": "vivillon-river", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 881, + "pokemon_id": 666, + "weight": 170 + }, + { + "base_id": 666, + "form_identifier": "monsoon", + "form_order": 14, + "id": 10098, + "identifier": "vivillon-monsoon", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 882, + "pokemon_id": 666, + "weight": 170 + }, + { + "base_id": 666, + "form_identifier": "savanna", + "form_order": 15, + "id": 10099, + "identifier": "vivillon-savanna", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 883, + "pokemon_id": 666, + "weight": 170 + }, + { + "base_id": 666, + "form_identifier": "sun", + "form_order": 16, + "id": 10100, + "identifier": "vivillon-sun", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 884, + "pokemon_id": 666, + "weight": 170 + }, + { + "base_id": 666, + "form_identifier": "ocean", + "form_order": 17, + "id": 10101, + "identifier": "vivillon-ocean", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 885, + "pokemon_id": 666, + "weight": 170 + }, + { + "base_id": 666, + "form_identifier": "jungle", + "form_order": 18, + "id": 10102, + "identifier": "vivillon-jungle", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 886, + "pokemon_id": 666, + "weight": 170 + }, + { + "base_id": 669, + "form_identifier": "yellow", + "form_order": 2, + "id": 10103, + "identifier": "flabebe-yellow", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 892, + "pokemon_id": 669, + "weight": 1 + }, + { + "base_id": 669, + "form_identifier": "orange", + "form_order": 3, + "id": 10104, + "identifier": "flabebe-orange", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 893, + "pokemon_id": 669, + "weight": 1 + }, + { + "base_id": 669, + "form_identifier": "blue", + "form_order": 4, + "id": 10105, + "identifier": "flabebe-blue", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 894, + "pokemon_id": 669, + "weight": 1 + }, + { + "base_id": 669, + "form_identifier": "white", + "form_order": 5, + "id": 10106, + "identifier": "flabebe-white", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 895, + "pokemon_id": 669, + "weight": 1 + }, + { + "base_id": 670, + "form_identifier": "yellow", + "form_order": 2, + "id": 10107, + "identifier": "floette-yellow", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 897, + "pokemon_id": 670, + "weight": 9 + }, + { + "base_id": 670, + "form_identifier": "orange", + "form_order": 3, + "id": 10108, + "identifier": "floette-orange", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 898, + "pokemon_id": 670, + "weight": 9 + }, + { + "base_id": 670, + "form_identifier": "blue", + "form_order": 4, + "id": 10109, + "identifier": "floette-blue", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 899, + "pokemon_id": 670, + "weight": 9 + }, + { + "base_id": 670, + "form_identifier": "white", + "form_order": 5, + "id": 10110, + "identifier": "floette-white", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 900, + "pokemon_id": 670, + "weight": 9 + }, + { + "base_id": 671, + "form_identifier": "yellow", + "form_order": 2, + "id": 10111, + "identifier": "florges-yellow", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 903, + "pokemon_id": 671, + "weight": 100 + }, + { + "base_id": 671, + "form_identifier": "orange", + "form_order": 3, + "id": 10112, + "identifier": "florges-orange", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 904, + "pokemon_id": 671, + "weight": 100 + }, + { + "base_id": 671, + "form_identifier": "blue", + "form_order": 4, + "id": 10113, + "identifier": "florges-blue", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 905, + "pokemon_id": 671, + "weight": 100 + }, + { + "base_id": 671, + "form_identifier": "white", + "form_order": 5, + "id": 10114, + "identifier": "florges-white", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 906, + "pokemon_id": 671, + "weight": 100 + }, + { + "base_id": 676, + "form_identifier": "heart", + "form_order": 2, + "id": 10115, + "identifier": "furfrou-heart", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 912, + "pokemon_id": 676, + "weight": 280 + }, + { + "base_id": 676, + "form_identifier": "star", + "form_order": 3, + "id": 10116, + "identifier": "furfrou-star", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 913, + "pokemon_id": 676, + "weight": 280 + }, + { + "base_id": 676, + "form_identifier": "diamond", + "form_order": 4, + "id": 10117, + "identifier": "furfrou-diamond", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 914, + "pokemon_id": 676, + "weight": 280 + }, + { + "base_id": 676, + "form_identifier": "debutante", + "form_order": 5, + "id": 10118, + "identifier": "furfrou-debutante", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 915, + "pokemon_id": 676, + "weight": 280 + }, + { + "base_id": 676, + "form_identifier": "matron", + "form_order": 6, + "id": 10119, + "identifier": "furfrou-matron", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 916, + "pokemon_id": 676, + "weight": 280 + }, + { + "base_id": 676, + "form_identifier": "dandy", + "form_order": 7, + "id": 10120, + "identifier": "furfrou-dandy", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 917, + "pokemon_id": 676, + "weight": 280 + }, + { + "base_id": 676, + "form_identifier": "la-reine", + "form_order": 8, + "id": 10121, + "identifier": "furfrou-la-reine", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 918, + "pokemon_id": 676, + "weight": 280 + }, + { + "base_id": 676, + "form_identifier": "kabuki", + "form_order": 9, + "id": 10122, + "identifier": "furfrou-kabuki", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 919, + "pokemon_id": 676, + "weight": 280 + }, + { + "base_id": 676, + "form_identifier": "pharaoh", + "form_order": 10, + "id": 10123, + "identifier": "furfrou-pharaoh", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 920, + "pokemon_id": 676, + "weight": 280 + }, + { + "base_id": 678, + "form_identifier": "female", + "form_order": 2, + "id": 10124, + "identifier": "meowstic-female", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 923, + "pokemon_id": 10025, + "weight": 85 + }, + { + "base_id": 681, + "form_identifier": "blade", + "form_order": 2, + "id": 10125, + "identifier": "aegislash-blade", + "introduced_in_version_group_id": 15, + "is_battle_only": 1, + "is_default": 1, + "is_mega": 0, + "order": 927, + "pokemon_id": 10026, + "weight": 530 + }, + { + "base_id": 710, + "form_identifier": "small", + "form_order": 2, + "id": 10126, + "identifier": "pumpkaboo-small", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 956, + "pokemon_id": 10027, + "weight": 35 + }, + { + "base_id": 710, + "form_identifier": "large", + "form_order": 3, + "id": 10127, + "identifier": "pumpkaboo-large", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 957, + "pokemon_id": 10028, + "weight": 75 + }, + { + "base_id": 710, + "form_identifier": "super", + "form_order": 4, + "id": 10128, + "identifier": "pumpkaboo-super", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 958, + "pokemon_id": 10029, + "weight": 150 + }, + { + "base_id": 711, + "form_identifier": "small", + "form_order": 2, + "id": 10129, + "identifier": "gourgeist-small", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 960, + "pokemon_id": 10030, + "weight": 95 + }, + { + "base_id": 711, + "form_identifier": "large", + "form_order": 3, + "id": 10130, + "identifier": "gourgeist-large", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 961, + "pokemon_id": 10031, + "weight": 140 + }, + { + "base_id": 711, + "form_identifier": "super", + "form_order": 4, + "id": 10131, + "identifier": "gourgeist-super", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 962, + "pokemon_id": 10032, + "weight": 390 + }, + { + "base_id": 716, + "form_identifier": "neutral", + "form_order": 1, + "id": 10132, + "identifier": "xerneas-neutral", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 967, + "pokemon_id": 716, + "weight": 2150 + }, + { + "base_id": 3, + "form_identifier": "mega", + "form_order": 2, + "id": 10133, + "identifier": "venusaur-mega", + "introduced_in_version_group_id": 15, + "is_battle_only": 1, + "is_default": 1, + "is_mega": 1, + "order": 4, + "pokemon_id": 10033, + "weight": 1555 + }, + { + "base_id": 6, + "form_identifier": "mega-x", + "form_order": 2, + "id": 10134, + "identifier": "charizard-mega-x", + "introduced_in_version_group_id": 15, + "is_battle_only": 1, + "is_default": 1, + "is_mega": 1, + "order": 8, + "pokemon_id": 10034, + "weight": 1105 + }, + { + "base_id": 6, + "form_identifier": "mega-y", + "form_order": 3, + "id": 10135, + "identifier": "charizard-mega-y", + "introduced_in_version_group_id": 15, + "is_battle_only": 1, + "is_default": 1, + "is_mega": 1, + "order": 9, + "pokemon_id": 10035, + "weight": 1005 + }, + { + "base_id": 9, + "form_identifier": "mega", + "form_order": 2, + "id": 10136, + "identifier": "blastoise-mega", + "introduced_in_version_group_id": 15, + "is_battle_only": 1, + "is_default": 1, + "is_mega": 1, + "order": 13, + "pokemon_id": 10036, + "weight": 1011 + }, + { + "base_id": 65, + "form_identifier": "mega", + "form_order": 2, + "id": 10137, + "identifier": "alakazam-mega", + "introduced_in_version_group_id": 15, + "is_battle_only": 1, + "is_default": 1, + "is_mega": 1, + "order": 98, + "pokemon_id": 10037, + "weight": 480 + }, + { + "base_id": 94, + "form_identifier": "mega", + "form_order": 2, + "id": 10138, + "identifier": "gengar-mega", + "introduced_in_version_group_id": 15, + "is_battle_only": 1, + "is_default": 1, + "is_mega": 1, + "order": 136, + "pokemon_id": 10038, + "weight": 405 + }, + { + "base_id": 115, + "form_identifier": "mega", + "form_order": 2, + "id": 10139, + "identifier": "kangaskhan-mega", + "introduced_in_version_group_id": 15, + "is_battle_only": 1, + "is_default": 1, + "is_mega": 1, + "order": 170, + "pokemon_id": 10039, + "weight": 1000 + }, + { + "base_id": 127, + "form_identifier": "mega", + "form_order": 2, + "id": 10140, + "identifier": "pinsir-mega", + "introduced_in_version_group_id": 15, + "is_battle_only": 1, + "is_default": 1, + "is_mega": 1, + "order": 192, + "pokemon_id": 10040, + "weight": 590 + }, + { + "base_id": 130, + "form_identifier": "mega", + "form_order": 2, + "id": 10141, + "identifier": "gyarados-mega", + "introduced_in_version_group_id": 15, + "is_battle_only": 1, + "is_default": 1, + "is_mega": 1, + "order": 196, + "pokemon_id": 10041, + "weight": 3050 + }, + { + "base_id": 142, + "form_identifier": "mega", + "form_order": 2, + "id": 10142, + "identifier": "aerodactyl-mega", + "introduced_in_version_group_id": 15, + "is_battle_only": 1, + "is_default": 1, + "is_mega": 1, + "order": 216, + "pokemon_id": 10042, + "weight": 790 + }, + { + "base_id": 150, + "form_identifier": "mega-x", + "form_order": 2, + "id": 10143, + "identifier": "mewtwo-mega-x", + "introduced_in_version_group_id": 15, + "is_battle_only": 1, + "is_default": 1, + "is_mega": 1, + "order": 226, + "pokemon_id": 10043, + "weight": 1270 + }, + { + "base_id": 150, + "form_identifier": "mega-y", + "form_order": 3, + "id": 10144, + "identifier": "mewtwo-mega-y", + "introduced_in_version_group_id": 15, + "is_battle_only": 1, + "is_default": 1, + "is_mega": 1, + "order": 227, + "pokemon_id": 10044, + "weight": 330 + }, + { + "base_id": 181, + "form_identifier": "mega", + "form_order": 2, + "id": 10145, + "identifier": "ampharos-mega", + "introduced_in_version_group_id": 15, + "is_battle_only": 1, + "is_default": 1, + "is_mega": 1, + "order": 256, + "pokemon_id": 10045, + "weight": 615 + }, + { + "base_id": 212, + "form_identifier": "mega", + "form_order": 2, + "id": 10146, + "identifier": "scizor-mega", + "introduced_in_version_group_id": 15, + "is_battle_only": 1, + "is_default": 1, + "is_mega": 1, + "order": 182, + "pokemon_id": 10046, + "weight": 1250 + }, + { + "base_id": 214, + "form_identifier": "mega", + "form_order": 2, + "id": 10147, + "identifier": "heracross-mega", + "introduced_in_version_group_id": 15, + "is_battle_only": 1, + "is_default": 1, + "is_mega": 1, + "order": 318, + "pokemon_id": 10047, + "weight": 625 + }, + { + "base_id": 229, + "form_identifier": "mega", + "form_order": 2, + "id": 10148, + "identifier": "houndoom-mega", + "introduced_in_version_group_id": 15, + "is_battle_only": 1, + "is_default": 1, + "is_mega": 1, + "order": 337, + "pokemon_id": 10048, + "weight": 495 + }, + { + "base_id": 248, + "form_identifier": "mega", + "form_order": 2, + "id": 10149, + "identifier": "tyranitar-mega", + "introduced_in_version_group_id": 15, + "is_battle_only": 1, + "is_default": 1, + "is_mega": 1, + "order": 349, + "pokemon_id": 10049, + "weight": 2550 + }, + { + "base_id": 257, + "form_identifier": "mega", + "form_order": 2, + "id": 10150, + "identifier": "blaziken-mega", + "introduced_in_version_group_id": 15, + "is_battle_only": 1, + "is_default": 1, + "is_mega": 1, + "order": 360, + "pokemon_id": 10050, + "weight": 520 + }, + { + "base_id": 282, + "form_identifier": "mega", + "form_order": 2, + "id": 10151, + "identifier": "gardevoir-mega", + "introduced_in_version_group_id": 15, + "is_battle_only": 1, + "is_default": 1, + "is_mega": 1, + "order": 387, + "pokemon_id": 10051, + "weight": 484 + }, + { + "base_id": 303, + "form_identifier": "mega", + "form_order": 2, + "id": 10152, + "identifier": "mawile-mega", + "introduced_in_version_group_id": 15, + "is_battle_only": 1, + "is_default": 1, + "is_mega": 1, + "order": 412, + "pokemon_id": 10052, + "weight": 235 + }, + { + "base_id": 306, + "form_identifier": "mega", + "form_order": 2, + "id": 10153, + "identifier": "aggron-mega", + "introduced_in_version_group_id": 15, + "is_battle_only": 1, + "is_default": 1, + "is_mega": 1, + "order": 416, + "pokemon_id": 10053, + "weight": 3950 + }, + { + "base_id": 308, + "form_identifier": "mega", + "form_order": 2, + "id": 10154, + "identifier": "medicham-mega", + "introduced_in_version_group_id": 15, + "is_battle_only": 1, + "is_default": 1, + "is_mega": 1, + "order": 419, + "pokemon_id": 10054, + "weight": 315 + }, + { + "base_id": 310, + "form_identifier": "mega", + "form_order": 2, + "id": 10155, + "identifier": "manectric-mega", + "introduced_in_version_group_id": 15, + "is_battle_only": 1, + "is_default": 1, + "is_mega": 1, + "order": 422, + "pokemon_id": 10055, + "weight": 440 + }, + { + "base_id": 354, + "form_identifier": "mega", + "form_order": 2, + "id": 10156, + "identifier": "banette-mega", + "introduced_in_version_group_id": 15, + "is_battle_only": 1, + "is_default": 1, + "is_mega": 1, + "order": 475, + "pokemon_id": 10056, + "weight": 130 + }, + { + "base_id": 359, + "form_identifier": "mega", + "form_order": 2, + "id": 10157, + "identifier": "absol-mega", + "introduced_in_version_group_id": 15, + "is_battle_only": 1, + "is_default": 1, + "is_mega": 1, + "order": 483, + "pokemon_id": 10057, + "weight": 490 + }, + { + "base_id": 445, + "form_identifier": "mega", + "form_order": 2, + "id": 10158, + "identifier": "garchomp-mega", + "introduced_in_version_group_id": 15, + "is_battle_only": 1, + "is_default": 1, + "is_mega": 1, + "order": 582, + "pokemon_id": 10058, + "weight": 950 + }, + { + "base_id": 448, + "form_identifier": "mega", + "form_order": 2, + "id": 10159, + "identifier": "lucario-mega", + "introduced_in_version_group_id": 15, + "is_battle_only": 1, + "is_default": 1, + "is_mega": 1, + "order": 585, + "pokemon_id": 10059, + "weight": 575 + }, + { + "base_id": 460, + "form_identifier": "mega", + "form_order": 2, + "id": 10160, + "identifier": "abomasnow-mega", + "introduced_in_version_group_id": 15, + "is_battle_only": 1, + "is_default": 1, + "is_mega": 1, + "order": 597, + "pokemon_id": 10060, + "weight": 1850 + }, + { + "base_id": 666, + "form_identifier": "fancy", + "form_order": 19, + "id": 10161, + "identifier": "vivillon-fancy", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 887, + "pokemon_id": 666, + "weight": 170 + }, + { + "base_id": 666, + "form_identifier": "poke-ball", + "form_order": 20, + "id": 10162, + "identifier": "vivillon-poke-ball", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 888, + "pokemon_id": 666, + "weight": 170 + }, + { + "base_id": 670, + "form_identifier": "eternal", + "form_order": 6, + "id": 10163, + "identifier": "floette-eternal", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 901, + "pokemon_id": 10061, + "weight": 9 + }, + { + "base_id": 380, + "form_identifier": "mega", + "form_order": 2, + "id": 10164, + "identifier": "latias-mega", + "introduced_in_version_group_id": 15, + "is_battle_only": 1, + "is_default": 1, + "is_mega": 1, + "order": 508, + "pokemon_id": 10062, + "weight": 520 + }, + { + "base_id": 381, + "form_identifier": "mega", + "form_order": 2, + "id": 10165, + "identifier": "latios-mega", + "introduced_in_version_group_id": 15, + "is_battle_only": 1, + "is_default": 1, + "is_mega": 1, + "order": 510, + "pokemon_id": 10063, + "weight": 700 + }, + { + "base_id": 260, + "form_identifier": "mega", + "form_order": 2, + "id": 10166, + "identifier": "swampert-mega", + "introduced_in_version_group_id": 16, + "is_battle_only": 1, + "is_default": 1, + "is_mega": 1, + "order": 364, + "pokemon_id": 10064, + "weight": 1020 + }, + { + "base_id": 254, + "form_identifier": "mega", + "form_order": 2, + "id": 10167, + "identifier": "sceptile-mega", + "introduced_in_version_group_id": 16, + "is_battle_only": 1, + "is_default": 1, + "is_mega": 1, + "order": 356, + "pokemon_id": 10065, + "weight": 552 + }, + { + "base_id": 302, + "form_identifier": "mega", + "form_order": 2, + "id": 10168, + "identifier": "sableye-mega", + "introduced_in_version_group_id": 16, + "is_battle_only": 1, + "is_default": 1, + "is_mega": 1, + "order": 410, + "pokemon_id": 10066, + "weight": 1610 + }, + { + "base_id": 334, + "form_identifier": "mega", + "form_order": 2, + "id": 10169, + "identifier": "altaria-mega", + "introduced_in_version_group_id": 16, + "is_battle_only": 1, + "is_default": 1, + "is_mega": 1, + "order": 451, + "pokemon_id": 10067, + "weight": 206 + }, + { + "base_id": 475, + "form_identifier": "mega", + "form_order": 2, + "id": 10170, + "identifier": "gallade-mega", + "introduced_in_version_group_id": 16, + "is_battle_only": 1, + "is_default": 1, + "is_mega": 1, + "order": 389, + "pokemon_id": 10068, + "weight": 564 + }, + { + "base_id": 531, + "form_identifier": "mega", + "form_order": 2, + "id": 10171, + "identifier": "audino-mega", + "introduced_in_version_group_id": 16, + "is_battle_only": 1, + "is_default": 1, + "is_mega": 1, + "order": 675, + "pokemon_id": 10069, + "weight": 320 + }, + { + "base_id": 319, + "form_identifier": "mega", + "form_order": 2, + "id": 10172, + "identifier": "sharpedo-mega", + "introduced_in_version_group_id": 16, + "is_battle_only": 1, + "is_default": 1, + "is_mega": 1, + "order": 434, + "pokemon_id": 10070, + "weight": 1303 + }, + { + "base_id": 80, + "form_identifier": "mega", + "form_order": 2, + "id": 10173, + "identifier": "slowbro-mega", + "introduced_in_version_group_id": 16, + "is_battle_only": 1, + "is_default": 1, + "is_mega": 1, + "order": 117, + "pokemon_id": 10071, + "weight": 1200 + }, + { + "base_id": 208, + "form_identifier": "mega", + "form_order": 2, + "id": 10174, + "identifier": "steelix-mega", + "introduced_in_version_group_id": 16, + "is_battle_only": 1, + "is_default": 1, + "is_mega": 1, + "order": 139, + "pokemon_id": 10072, + "weight": 7400 + }, + { + "base_id": 18, + "form_identifier": "mega", + "form_order": 2, + "id": 10175, + "identifier": "pidgeot-mega", + "introduced_in_version_group_id": 16, + "is_battle_only": 1, + "is_default": 1, + "is_mega": 1, + "order": 24, + "pokemon_id": 10073, + "weight": 505 + }, + { + "base_id": 362, + "form_identifier": "mega", + "form_order": 2, + "id": 10176, + "identifier": "glalie-mega", + "introduced_in_version_group_id": 16, + "is_battle_only": 1, + "is_default": 1, + "is_mega": 1, + "order": 486, + "pokemon_id": 10074, + "weight": 3502 + }, + { + "base_id": 719, + "form_identifier": "mega", + "form_order": 2, + "id": 10177, + "identifier": "diancie-mega", + "introduced_in_version_group_id": 16, + "is_battle_only": 1, + "is_default": 1, + "is_mega": 1, + "order": 975, + "pokemon_id": 10075, + "weight": 278 + }, + { + "base_id": 376, + "form_identifier": "mega", + "form_order": 2, + "id": 10178, + "identifier": "metagross-mega", + "introduced_in_version_group_id": 16, + "is_battle_only": 1, + "is_default": 1, + "is_mega": 1, + "order": 503, + "pokemon_id": 10076, + "weight": 9429 + }, + { + "base_id": 382, + "form_identifier": "primal", + "form_order": 2, + "id": 10179, + "identifier": "kyogre-primal", + "introduced_in_version_group_id": 16, + "is_battle_only": 1, + "is_default": 1, + "is_mega": 0, + "order": 512, + "pokemon_id": 10077, + "weight": 4300 + }, + { + "base_id": 383, + "form_identifier": "primal", + "form_order": 2, + "id": 10180, + "identifier": "groudon-primal", + "introduced_in_version_group_id": 16, + "is_battle_only": 1, + "is_default": 1, + "is_mega": 0, + "order": 514, + "pokemon_id": 10078, + "weight": 9997 + }, + { + "base_id": 384, + "form_identifier": "mega", + "form_order": 2, + "id": 10181, + "identifier": "rayquaza-mega", + "introduced_in_version_group_id": 16, + "is_battle_only": 1, + "is_default": 1, + "is_mega": 1, + "order": 516, + "pokemon_id": 10079, + "weight": 3920 + }, + { + "base_id": 25, + "form_identifier": "rock-star", + "form_order": 3, + "id": 10182, + "identifier": "pikachu-rock-star", + "introduced_in_version_group_id": 16, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 38, + "pokemon_id": 10080, + "weight": 60 + }, + { + "base_id": 25, + "form_identifier": "belle", + "form_order": 4, + "id": 10183, + "identifier": "pikachu-belle", + "introduced_in_version_group_id": 16, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 39, + "pokemon_id": 10081, + "weight": 60 + }, + { + "base_id": 25, + "form_identifier": "pop-star", + "form_order": 5, + "id": 10184, + "identifier": "pikachu-pop-star", + "introduced_in_version_group_id": 16, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 40, + "pokemon_id": 10082, + "weight": 60 + }, + { + "base_id": 25, + "form_identifier": "phd", + "form_order": 6, + "id": 10185, + "identifier": "pikachu-phd", + "introduced_in_version_group_id": 16, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 41, + "pokemon_id": 10083, + "weight": 60 + }, + { + "base_id": 25, + "form_identifier": "libre", + "form_order": 7, + "id": 10186, + "identifier": "pikachu-libre", + "introduced_in_version_group_id": 16, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 42, + "pokemon_id": 10084, + "weight": 60 + }, + { + "base_id": 25, + "form_identifier": "cosplay", + "form_order": 2, + "id": 10187, + "identifier": "pikachu-cosplay", + "introduced_in_version_group_id": 16, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 37, + "pokemon_id": 10085, + "weight": 60 + }, + { + "base_id": 720, + "form_identifier": "unbound", + "form_order": 2, + "id": 10188, + "identifier": "hoopa-unbound", + "introduced_in_version_group_id": 16, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 977, + "pokemon_id": 10086, + "weight": 4900 + }, + { + "base_id": 323, + "form_identifier": "mega", + "form_order": 2, + "id": 10189, + "identifier": "camerupt-mega", + "introduced_in_version_group_id": 16, + "is_battle_only": 1, + "is_default": 1, + "is_mega": 1, + "order": 439, + "pokemon_id": 10087, + "weight": 3205 + }, + { + "base_id": 428, + "form_identifier": "mega", + "form_order": 2, + "id": 10190, + "identifier": "lopunny-mega", + "introduced_in_version_group_id": 16, + "is_battle_only": 1, + "is_default": 1, + "is_mega": 1, + "order": 570, + "pokemon_id": 10088, + "weight": 283 + }, + { + "base_id": 373, + "form_identifier": "mega", + "form_order": 2, + "id": 10191, + "identifier": "salamence-mega", + "introduced_in_version_group_id": 16, + "is_battle_only": 1, + "is_default": 1, + "is_mega": 1, + "order": 499, + "pokemon_id": 10089, + "weight": 1126 + }, + { + "base_id": 15, + "form_identifier": "mega", + "form_order": 2, + "id": 10192, + "identifier": "beedrill-mega", + "introduced_in_version_group_id": 16, + "is_battle_only": 1, + "is_default": 1, + "is_mega": 1, + "order": 20, + "pokemon_id": 10090, + "weight": 405 + }, + { + "base_id": 10091, + "form_identifier": "alola", + "form_order": 2, + "id": 10193, + "identifier": "rattata-alola", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 26, + "pokemon_id": 10091, + "weight": 38 + }, + { + "base_id": 10092, + "form_identifier": "alola", + "form_order": 2, + "id": 10194, + "identifier": "raticate-alola", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 28, + "pokemon_id": 10092, + "weight": 255 + }, + { + "base_id": 25, + "form_identifier": "original-cap", + "form_order": 2, + "id": 10196, + "identifier": "pikachu-original-cap", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 37, + "pokemon_id": 10094, + "weight": 60 + }, + { + "base_id": 25, + "form_identifier": "hoenn-cap", + "form_order": 3, + "id": 10197, + "identifier": "pikachu-hoenn-cap", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 38, + "pokemon_id": 10095, + "weight": 60 + }, + { + "base_id": 25, + "form_identifier": "sinnoh-cap", + "form_order": 4, + "id": 10198, + "identifier": "pikachu-sinnoh-cap", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 39, + "pokemon_id": 10096, + "weight": 60 + }, + { + "base_id": 25, + "form_identifier": "unova-cap", + "form_order": 5, + "id": 10199, + "identifier": "pikachu-unova-cap", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 40, + "pokemon_id": 10097, + "weight": 60 + }, + { + "base_id": 25, + "form_identifier": "kalos-cap", + "form_order": 6, + "id": 10200, + "identifier": "pikachu-kalos-cap", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 41, + "pokemon_id": 10098, + "weight": 60 + }, + { + "base_id": 25, + "form_identifier": "alola-cap", + "form_order": 7, + "id": 10201, + "identifier": "pikachu-alola-cap", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 42, + "pokemon_id": 10099, + "weight": 60 + }, + { + "base_id": 10100, + "form_identifier": "alola", + "form_order": 2, + "id": 10202, + "identifier": "raichu-alola", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 45, + "pokemon_id": 10100, + "weight": 210 + }, + { + "base_id": 10101, + "form_identifier": "alola", + "form_order": 2, + "id": 10203, + "identifier": "sandshrew-alola", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 47, + "pokemon_id": 10101, + "weight": 400 + }, + { + "base_id": 10102, + "form_identifier": "alola", + "form_order": 2, + "id": 10204, + "identifier": "sandslash-alola", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 49, + "pokemon_id": 10102, + "weight": 550 + }, + { + "base_id": 10103, + "form_identifier": "alola", + "form_order": 2, + "id": 10205, + "identifier": "vulpix-alola", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 60, + "pokemon_id": 10103, + "weight": 99 + }, + { + "base_id": 10104, + "form_identifier": "alola", + "form_order": 2, + "id": 10206, + "identifier": "ninetales-alola", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 62, + "pokemon_id": 10104, + "weight": 199 + }, + { + "base_id": 10105, + "form_identifier": "alola", + "form_order": 2, + "id": 10207, + "identifier": "diglett-alola", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 78, + "pokemon_id": 10105, + "weight": 10 + }, + { + "base_id": 10106, + "form_identifier": "alola", + "form_order": 2, + "id": 10208, + "identifier": "dugtrio-alola", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 80, + "pokemon_id": 10106, + "weight": 666 + }, + { + "base_id": 10107, + "form_identifier": "alola", + "form_order": 2, + "id": 10209, + "identifier": "meowth-alola", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 82, + "pokemon_id": 10107, + "weight": 42 + }, + { + "base_id": 10108, + "form_identifier": "alola", + "form_order": 2, + "id": 10210, + "identifier": "persian-alola", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 84, + "pokemon_id": 10108, + "weight": 330 + }, + { + "base_id": 10109, + "form_identifier": "alola", + "form_order": 2, + "id": 10211, + "identifier": "geodude-alola", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 108, + "pokemon_id": 10109, + "weight": 203 + }, + { + "base_id": 10110, + "form_identifier": "alola", + "form_order": 2, + "id": 10212, + "identifier": "graveler-alola", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 110, + "pokemon_id": 10110, + "weight": 1100 + }, + { + "base_id": 10111, + "form_identifier": "alola", + "form_order": 2, + "id": 10213, + "identifier": "golem-alola", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 112, + "pokemon_id": 10111, + "weight": 3160 + }, + { + "base_id": 10112, + "form_identifier": "alola", + "form_order": 2, + "id": 10214, + "identifier": "grimer-alola", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 128, + "pokemon_id": 10112, + "weight": 420 + }, + { + "base_id": 10113, + "form_identifier": "alola", + "form_order": 2, + "id": 10215, + "identifier": "muk-alola", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 130, + "pokemon_id": 10113, + "weight": 520 + }, + { + "base_id": 10114, + "form_identifier": "alola", + "form_order": 2, + "id": 10216, + "identifier": "exeggutor-alola", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 148, + "pokemon_id": 10114, + "weight": 4156 + }, + { + "base_id": 10115, + "form_identifier": "alola", + "form_order": 2, + "id": 10217, + "identifier": "marowak-alola", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 151, + "pokemon_id": 10115, + "weight": 340 + }, + { + "base_id": 658, + "form_identifier": "ash", + "form_order": 3, + "id": 10219, + "identifier": "greninja-ash", + "introduced_in_version_group_id": 17, + "is_battle_only": 1, + "is_default": 1, + "is_mega": 0, + "order": 823, + "pokemon_id": 10117, + "weight": 400 + }, + { + "base_id": 718, + "form_identifier": "10", + "form_order": 2, + "id": 10220, + "identifier": "zygarde-10", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 971, + "pokemon_id": 10118, + "weight": 335 + }, + { + "base_id": 718, + "form_identifier": "complete", + "form_order": 5, + "id": 10222, + "identifier": "zygarde-complete", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 973, + "pokemon_id": 10120, + "weight": 6100 + }, + { + "base_id": 741, + "form_identifier": "pom-pom", + "form_order": 2, + "id": 10225, + "identifier": "oricorio-pom-pom", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1001, + "pokemon_id": 10123, + "weight": 34 + }, + { + "base_id": 741, + "form_identifier": "pau", + "form_order": 3, + "id": 10226, + "identifier": "oricorio-pau", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1002, + "pokemon_id": 10124, + "weight": 34 + }, + { + "base_id": 741, + "form_identifier": "sensu", + "form_order": 4, + "id": 10227, + "identifier": "oricorio-sensu", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1003, + "pokemon_id": 10125, + "weight": 34 + }, + { + "base_id": 745, + "form_identifier": "midnight", + "form_order": 2, + "id": 10228, + "identifier": "lycanroc-midnight", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1010, + "pokemon_id": 10126, + "weight": 250 + }, + { + "base_id": 746, + "form_identifier": "school", + "form_order": 2, + "id": 10229, + "identifier": "wishiwashi-school", + "introduced_in_version_group_id": 17, + "is_battle_only": 1, + "is_default": 1, + "is_mega": 0, + "order": 1013, + "pokemon_id": 10127, + "weight": 786 + }, + { + "base_id": 773, + "form_identifier": "fighting", + "form_order": 2, + "id": 10232, + "identifier": "silvally-fighting", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 1044, + "pokemon_id": 773, + "weight": 1005 + }, + { + "base_id": 773, + "form_identifier": "flying", + "form_order": 3, + "id": 10233, + "identifier": "silvally-flying", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 1045, + "pokemon_id": 773, + "weight": 1005 + }, + { + "base_id": 773, + "form_identifier": "poison", + "form_order": 4, + "id": 10234, + "identifier": "silvally-poison", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 1046, + "pokemon_id": 773, + "weight": 1005 + }, + { + "base_id": 773, + "form_identifier": "ground", + "form_order": 5, + "id": 10235, + "identifier": "silvally-ground", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 1047, + "pokemon_id": 773, + "weight": 1005 + }, + { + "base_id": 773, + "form_identifier": "rock", + "form_order": 6, + "id": 10236, + "identifier": "silvally-rock", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 1048, + "pokemon_id": 773, + "weight": 1005 + }, + { + "base_id": 773, + "form_identifier": "bug", + "form_order": 7, + "id": 10237, + "identifier": "silvally-bug", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 1049, + "pokemon_id": 773, + "weight": 1005 + }, + { + "base_id": 773, + "form_identifier": "ghost", + "form_order": 8, + "id": 10238, + "identifier": "silvally-ghost", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 1050, + "pokemon_id": 773, + "weight": 1005 + }, + { + "base_id": 773, + "form_identifier": "steel", + "form_order": 9, + "id": 10239, + "identifier": "silvally-steel", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 1051, + "pokemon_id": 773, + "weight": 1005 + }, + { + "base_id": 773, + "form_identifier": "fire", + "form_order": 10, + "id": 10240, + "identifier": "silvally-fire", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 1052, + "pokemon_id": 773, + "weight": 1005 + }, + { + "base_id": 773, + "form_identifier": "water", + "form_order": 11, + "id": 10241, + "identifier": "silvally-water", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 1053, + "pokemon_id": 773, + "weight": 1005 + }, + { + "base_id": 773, + "form_identifier": "grass", + "form_order": 12, + "id": 10242, + "identifier": "silvally-grass", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 1054, + "pokemon_id": 773, + "weight": 1005 + }, + { + "base_id": 773, + "form_identifier": "electric", + "form_order": 13, + "id": 10243, + "identifier": "silvally-electric", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 1055, + "pokemon_id": 773, + "weight": 1005 + }, + { + "base_id": 773, + "form_identifier": "psychic", + "form_order": 14, + "id": 10244, + "identifier": "silvally-psychic", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 1056, + "pokemon_id": 773, + "weight": 1005 + }, + { + "base_id": 773, + "form_identifier": "ice", + "form_order": 15, + "id": 10245, + "identifier": "silvally-ice", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 1057, + "pokemon_id": 773, + "weight": 1005 + }, + { + "base_id": 773, + "form_identifier": "dragon", + "form_order": 16, + "id": 10246, + "identifier": "silvally-dragon", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 1058, + "pokemon_id": 773, + "weight": 1005 + }, + { + "base_id": 773, + "form_identifier": "dark", + "form_order": 17, + "id": 10247, + "identifier": "silvally-dark", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 1059, + "pokemon_id": 773, + "weight": 1005 + }, + { + "base_id": 773, + "form_identifier": "fairy", + "form_order": 18, + "id": 10248, + "identifier": "silvally-fairy", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 1060, + "pokemon_id": 773, + "weight": 1005 + }, + { + "base_id": 774, + "form_identifier": "red", + "form_order": 8, + "id": 10255, + "identifier": "minior-red", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1068, + "pokemon_id": 10136, + "weight": 3 + }, + { + "base_id": 774, + "form_identifier": "orange", + "form_order": 9, + "id": 10256, + "identifier": "minior-orange", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1069, + "pokemon_id": 10137, + "weight": 3 + }, + { + "base_id": 774, + "form_identifier": "yellow", + "form_order": 10, + "id": 10257, + "identifier": "minior-yellow", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1070, + "pokemon_id": 10138, + "weight": 3 + }, + { + "base_id": 774, + "form_identifier": "green", + "form_order": 11, + "id": 10258, + "identifier": "minior-green", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1071, + "pokemon_id": 10139, + "weight": 3 + }, + { + "base_id": 774, + "form_identifier": "blue", + "form_order": 12, + "id": 10259, + "identifier": "minior-blue", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1072, + "pokemon_id": 10140, + "weight": 3 + }, + { + "base_id": 774, + "form_identifier": "indigo", + "form_order": 13, + "id": 10260, + "identifier": "minior-indigo", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1073, + "pokemon_id": 10141, + "weight": 3 + }, + { + "base_id": 774, + "form_identifier": "violet", + "form_order": 14, + "id": 10261, + "identifier": "minior-violet", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1074, + "pokemon_id": 10142, + "weight": 3 + }, + { + "base_id": 778, + "form_identifier": "busted", + "form_order": 2, + "id": 10262, + "identifier": "mimikyu-busted", + "introduced_in_version_group_id": 17, + "is_battle_only": 1, + "is_default": 1, + "is_mega": 0, + "order": 1080, + "pokemon_id": 10143, + "weight": 7 + }, + { + "base_id": 801, + "form_identifier": "original", + "form_order": 2, + "id": 10266, + "identifier": "magearna-original", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1110, + "pokemon_id": 10147, + "weight": 805 + }, + { + "base_id": 25, + "form_identifier": "partner", + "form_order": 8, + "id": 10267, + "identifier": "pikachu-partner", + "introduced_in_version_group_id": 18, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 43, + "pokemon_id": 10148, + "weight": 60 + }, + { + "base_id": 414, + "form_identifier": "sandy", + "form_order": 2, + "id": 10269, + "identifier": "mothim-sandy", + "introduced_in_version_group_id": 18, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 552, + "pokemon_id": 414, + "weight": 233 + }, + { + "base_id": 414, + "form_identifier": "trash", + "form_order": 3, + "id": 10270, + "identifier": "mothim-trash", + "introduced_in_version_group_id": 18, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 553, + "pokemon_id": 414, + "weight": 233 + }, + { + "base_id": 664, + "form_identifier": "polar", + "form_order": 2, + "id": 10271, + "identifier": "scatterbug-polar", + "introduced_in_version_group_id": 18, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 830, + "pokemon_id": 664, + "weight": 25 + }, + { + "base_id": 664, + "form_identifier": "tundra", + "form_order": 3, + "id": 10272, + "identifier": "scatterbug-tundra", + "introduced_in_version_group_id": 18, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 831, + "pokemon_id": 664, + "weight": 25 + }, + { + "base_id": 664, + "form_identifier": "continental", + "form_order": 4, + "id": 10273, + "identifier": "scatterbug-continental", + "introduced_in_version_group_id": 18, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 832, + "pokemon_id": 664, + "weight": 25 + }, + { + "base_id": 664, + "form_identifier": "garden", + "form_order": 5, + "id": 10274, + "identifier": "scatterbug-garden", + "introduced_in_version_group_id": 18, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 833, + "pokemon_id": 664, + "weight": 25 + }, + { + "base_id": 664, + "form_identifier": "elegant", + "form_order": 6, + "id": 10275, + "identifier": "scatterbug-elegant", + "introduced_in_version_group_id": 18, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 834, + "pokemon_id": 664, + "weight": 25 + }, + { + "base_id": 664, + "form_identifier": "meadow", + "form_order": 7, + "id": 10276, + "identifier": "scatterbug-meadow", + "introduced_in_version_group_id": 18, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 835, + "pokemon_id": 664, + "weight": 25 + }, + { + "base_id": 664, + "form_identifier": "modern", + "form_order": 8, + "id": 10277, + "identifier": "scatterbug-modern", + "introduced_in_version_group_id": 18, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 836, + "pokemon_id": 664, + "weight": 25 + }, + { + "base_id": 664, + "form_identifier": "marine", + "form_order": 9, + "id": 10278, + "identifier": "scatterbug-marine", + "introduced_in_version_group_id": 18, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 837, + "pokemon_id": 664, + "weight": 25 + }, + { + "base_id": 664, + "form_identifier": "archipelago", + "form_order": 10, + "id": 10279, + "identifier": "scatterbug-archipelago", + "introduced_in_version_group_id": 18, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 838, + "pokemon_id": 664, + "weight": 25 + }, + { + "base_id": 664, + "form_identifier": "high-plains", + "form_order": 11, + "id": 10280, + "identifier": "scatterbug-high-plains", + "introduced_in_version_group_id": 18, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 839, + "pokemon_id": 664, + "weight": 25 + }, + { + "base_id": 664, + "form_identifier": "sandstorm", + "form_order": 12, + "id": 10281, + "identifier": "scatterbug-sandstorm", + "introduced_in_version_group_id": 18, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 840, + "pokemon_id": 664, + "weight": 25 + }, + { + "base_id": 664, + "form_identifier": "river", + "form_order": 13, + "id": 10282, + "identifier": "scatterbug-river", + "introduced_in_version_group_id": 18, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 841, + "pokemon_id": 664, + "weight": 25 + }, + { + "base_id": 664, + "form_identifier": "monsoon", + "form_order": 14, + "id": 10283, + "identifier": "scatterbug-monsoon", + "introduced_in_version_group_id": 18, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 842, + "pokemon_id": 664, + "weight": 25 + }, + { + "base_id": 664, + "form_identifier": "savanna", + "form_order": 15, + "id": 10284, + "identifier": "scatterbug-savanna", + "introduced_in_version_group_id": 18, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 843, + "pokemon_id": 664, + "weight": 25 + }, + { + "base_id": 664, + "form_identifier": "sun", + "form_order": 16, + "id": 10285, + "identifier": "scatterbug-sun", + "introduced_in_version_group_id": 18, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 844, + "pokemon_id": 664, + "weight": 25 + }, + { + "base_id": 664, + "form_identifier": "ocean", + "form_order": 17, + "id": 10286, + "identifier": "scatterbug-ocean", + "introduced_in_version_group_id": 18, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 845, + "pokemon_id": 664, + "weight": 25 + }, + { + "base_id": 664, + "form_identifier": "jungle", + "form_order": 18, + "id": 10287, + "identifier": "scatterbug-jungle", + "introduced_in_version_group_id": 18, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 846, + "pokemon_id": 664, + "weight": 25 + }, + { + "base_id": 664, + "form_identifier": "fancy", + "form_order": 19, + "id": 10288, + "identifier": "scatterbug-fancy", + "introduced_in_version_group_id": 18, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 847, + "pokemon_id": 664, + "weight": 25 + }, + { + "base_id": 664, + "form_identifier": "poke-ball", + "form_order": 20, + "id": 10289, + "identifier": "scatterbug-poke-ball", + "introduced_in_version_group_id": 18, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 848, + "pokemon_id": 664, + "weight": 25 + }, + { + "base_id": 745, + "form_identifier": "dusk", + "form_order": 3, + "id": 10311, + "identifier": "lycanroc-dusk", + "introduced_in_version_group_id": 18, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1011, + "pokemon_id": 10152, + "weight": 250 + }, + { + "base_id": 800, + "form_identifier": "dusk", + "form_order": 2, + "id": 10314, + "identifier": "necrozma-dusk", + "introduced_in_version_group_id": 18, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1106, + "pokemon_id": 10155, + "weight": 4600 + }, + { + "base_id": 800, + "form_identifier": "dawn", + "form_order": 3, + "id": 10315, + "identifier": "necrozma-dawn", + "introduced_in_version_group_id": 18, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1107, + "pokemon_id": 10156, + "weight": 3500 + }, + { + "base_id": 800, + "form_identifier": "ultra", + "form_order": 4, + "id": 10316, + "identifier": "necrozma-ultra", + "introduced_in_version_group_id": 18, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1108, + "pokemon_id": 10157, + "weight": 2300 + }, + { + "base_id": 249, + "form_identifier": "shadow", + "form_order": 2, + "id": 10317, + "identifier": "lugia-shadow", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 350, + "pokemon_id": 10158, + "weight": 2160 + }, + { + "base_id": 133, + "form_identifier": "partner", + "form_order": 1, + "id": 10318, + "identifier": "eevee-partner", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 199, + "pokemon_id": 133, + "weight": 65 + }, + { + "base_id": 483, + "form_identifier": "primal", + "form_order": 2, + "id": 10319, + "identifier": "dialga-primal", + "introduced_in_version_group_id": 16, + "is_battle_only": 1, + "is_default": 1, + "is_mega": 0, + "order": 514, + "pokemon_id": 10159, + "weight": 6830 + }, + { + "base_id": 778, + "form_identifier": "", + "form_order": 3, + "id": 10263, + "identifier": "mimikyu-misfit", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 1081, + "pokemon_id": 778, + "weight": 7 + }, + { + "base_id": 10161, + "form_identifier": "galar", + "form_order": 2, + "id": 10321, + "identifier": "ponyta-galar", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 59, + "pokemon_id": 10161, + "weight": 240 + }, + { + "base_id": 10162, + "form_identifier": "galar", + "form_order": 2, + "id": 10322, + "identifier": "rapidash-galar", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 59, + "pokemon_id": 10162, + "weight": 800 + }, + { + "base_id": 10163, + "form_identifier": "galar", + "form_order": 2, + "id": 10323, + "identifier": "slowpoke-galar", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 59, + "pokemon_id": 10163, + "weight": 360 + }, + { + "base_id": 10164, + "form_identifier": "galar", + "form_order": 3, + "id": 10324, + "identifier": "slowbro-galar", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 59, + "pokemon_id": 10164, + "weight": 705 + }, + { + "base_id": 10165, + "form_identifier": "galar", + "form_order": 2, + "id": 10325, + "identifier": "farfetchd-galar", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 59, + "pokemon_id": 10165, + "weight": 420 + }, + { + "base_id": 10166, + "form_identifier": "galar", + "form_order": 2, + "id": 10326, + "identifier": "weezing-galar", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 59, + "pokemon_id": 10166, + "weight": 160 + }, + { + "base_id": 10167, + "form_identifier": "galar", + "form_order": 2, + "id": 10327, + "identifier": "mr-mime-galar", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 59, + "pokemon_id": 10167, + "weight": 568 + }, + { + "base_id": 10168, + "form_identifier": "galar", + "form_order": 2, + "id": 10328, + "identifier": "corsola-galar", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 59, + "pokemon_id": 10168, + "weight": 5 + }, + { + "base_id": 10169, + "form_identifier": "galar", + "form_order": 2, + "id": 10329, + "identifier": "zigzagoon-galar", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 59, + "pokemon_id": 10169, + "weight": 175 + }, + { + "base_id": 10170, + "form_identifier": "galar", + "form_order": 2, + "id": 10330, + "identifier": "linoone-galar", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 59, + "pokemon_id": 10170, + "weight": 325 + }, + { + "base_id": 10171, + "form_identifier": "galar", + "form_order": 2, + "id": 10331, + "identifier": "darumaka-galar", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 59, + "pokemon_id": 10171, + "weight": 400 + }, + { + "base_id": 10172, + "form_identifier": "galar", + "form_order": 3, + "id": 10172, + "identifier": "darmanitan-galar", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 59, + "pokemon_id": 10172, + "weight": 929 + }, + { + "base_id": 10173, + "form_identifier": "galar", + "form_order": 2, + "id": 10333, + "identifier": "yamask-galar", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 59, + "pokemon_id": 10173, + "weight": 15 + }, + { + "base_id": 10174, + "form_identifier": "galar", + "form_order": 2, + "id": 10334, + "identifier": "stunfisk-galar", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 59, + "pokemon_id": 10174, + "weight": 205 + }, + { + "base_id": 10160, + "form_identifier": "galar", + "form_order": 3, + "id": 10320, + "identifier": "meowth-galar", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 59, + "pokemon_id": 10160, + "weight": 75 + }, + { + "base_id": 889, + "form_identifier": "crowned", + "form_order": 2, + "id": 10335, + "identifier": "zamazenta-crowned", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 59, + "pokemon_id": 10175, + "weight": 2100 + }, + { + "base_id": 888, + "form_identifier": "crowned", + "form_order": 2, + "id": 10336, + "identifier": "zacian-crowned", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 59, + "pokemon_id": 10176, + "weight": 3550 + }, + { + "base_id": 893, + "form_identifier": "", + "form_order": 1, + "id": 893, + "identifier": "zarude", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 59, + "pokemon_id": 893, + "weight": 700 + }, + { + "base_id": 609, + "form_identifier": "", + "form_order": 2, + "id": 10337, + "identifier": "chandelure-flame", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 761, + "pokemon_id": 609, + "weight": 343 + }, + { + "base_id": 384, + "form_identifier": "", + "form_order": 3, + "id": 10338, + "identifier": "rayquaza-indo", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 515, + "pokemon_id": 384, + "weight": 2065 + }, + { + "base_id": 889, + "form_identifier": "", + "form_order": 3, + "id": 10339, + "identifier": "zamazenta-silversmith", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 889, + "weight": 2100 + }, + { + "base_id": 534, + "form_identifier": "", + "form_order": 2, + "id": 10340, + "identifier": "conkeldurr-asas", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 678, + "pokemon_id": 534, + "weight": 870 + }, + { + "base_id": 407, + "form_identifier": "", + "form_order": 2, + "id": 10341, + "identifier": "roserade-doomed", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 429, + "pokemon_id": 407, + "weight": 145 + }, + { + "base_id": 700, + "form_identifier": "", + "form_order": 2, + "id": 10345, + "identifier": "sylveon-yuno", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 207, + "pokemon_id": 700, + "weight": 235 + }, + { + "base_id": 637, + "form_identifier": "", + "form_order": 2, + "id": 10346, + "identifier": "volcarona-sins", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 789, + "pokemon_id": 637, + "weight": 460 + }, + { + "base_id": 149, + "form_identifier": "", + "form_order": 2, + "id": 10348, + "identifier": "dragonite-djspree", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 224, + "pokemon_id": 149, + "weight": 2100 + }, + { + "base_id": 131, + "form_identifier": "", + "form_order": 2, + "id": 10349, + "identifier": "lapras-rasp8", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 197, + "pokemon_id": 131, + "weight": 2200 + }, + { + "base_id": 38, + "form_identifier": "", + "form_order": 4, + "id": 10347, + "identifier": "ninetales-darkbritual", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 61, + "pokemon_id": 38, + "weight": 199 + }, + { + "base_id": 184, + "form_identifier": "", + "form_order": 2, + "id": 10350, + "identifier": "azumarill-nah", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 259, + "pokemon_id": 184, + "weight": 285 + }, + { + "base_id": 386, + "form_identifier": "", + "form_order": 6, + "id": 10351, + "identifier": "deoxys-speedy", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 518, + "pokemon_id": 386, + "weight": 608 + }, + { + "base_id": 891, + "form_identifier": "", + "form_order": 1, + "id": 891, + "identifier": "kubfu", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 891, + "weight": 120 + }, + { + "base_id": 892, + "form_identifier": "", + "form_order": 1, + "id": 892, + "identifier": "urshifu", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 892, + "weight": 2050 + }, + { + "base_id": 891, + "form_identifier": "", + "form_order": 1, + "id": 1000, + "identifier": "kubfu-rapid-strike", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 1000, + "weight": 1050 + }, + { + "base_id": 892, + "form_identifier": "rapid-strike", + "form_order": 2, + "id": 15000, + "identifier": "urshifu-rapid-strike", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 8922, + "weight": 1050 + }, + { + "base_id": 10179, + "form_identifier": "galar", + "form_order": 2, + "id": 10400, + "identifier": "moltres-galar", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 221, + "pokemon_id": 10179, + "weight": 660 + }, + { + "base_id": 10177, + "form_identifier": "galar", + "form_order": 2, + "id": 10401, + "identifier": "zapdos-galar", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 220, + "pokemon_id": 10177, + "weight": 582 + }, + { + "base_id": 10178, + "form_identifier": "galar", + "form_order": 2, + "id": 10402, + "identifier": "articuno-galar", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 219, + "pokemon_id": 10178, + "weight": 509 + }, + { + "base_id": 894, + "form_identifier": "", + "form_order": 1, + "id": 894, + "identifier": "regieleki", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 894, + "weight": 1450 + }, + { + "base_id": 895, + "form_identifier": "", + "form_order": 1, + "id": 895, + "identifier": "regidrago", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 895, + "weight": 2000 + }, + { + "base_id": 896, + "form_identifier": "", + "form_order": 1, + "id": 896, + "identifier": "glastrier", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 896, + "weight": 8000 + }, + { + "base_id": 897, + "form_identifier": "", + "form_order": 1, + "id": 897, + "identifier": "spectrier", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 897, + "weight": 445 + }, + { + "base_id": 898, + "form_identifier": "", + "form_order": 1, + "id": 898, + "identifier": "calyrex", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 898, + "weight": 77 + }, + { + "base_id": 898, + "form_identifier": "ice-rider", + "form_order": 2, + "id": 10403, + "identifier": "calyrex-ice-rider", + "introduced_in_version_group_id": 14, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 802, + "pokemon_id": 10180, + "weight": 8091 + }, + { + "base_id": 898, + "form_identifier": "shadow-rider", + "form_order": 3, + "id": 10404, + "identifier": "calyrex-shadow-rider", + "introduced_in_version_group_id": 14, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 802, + "pokemon_id": 10181, + "weight": 536 + }, + { + "base_id": 698, + "form_identifier": "", + "form_order": 2, + "id": 10353, + "identifier": "amaura-rasp", + "introduced_in_version_group_id": 15, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 944, + "pokemon_id": 698, + "weight": 252 + }, + { + "base_id": 492, + "form_identifier": "", + "form_order": 3, + "id": 10412, + "identifier": "shaymin-cheese", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 617, + "pokemon_id": 492, + "weight": 21 + }, + { + "base_id": 492, + "form_identifier": "", + "form_order": 4, + "id": 10413, + "identifier": "shaymin-sky-cheese", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 618, + "pokemon_id": 10006, + "weight": 52 + }, + { + "base_id": 658, + "form_identifier": "", + "form_order": 2, + "id": 10417, + "identifier": "greninja-pepe", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 658, + "weight": 400 + }, + { + "base_id": 10418, + "form_identifier": "galar", + "form_order": 2, + "id": 10418, + "identifier": "slowking-galar", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 59, + "pokemon_id": 10418, + "weight": 795 + }, + { + "base_id": 10172, + "form_identifier": "zen-galar", + "form_order": 4, + "id": 10419, + "identifier": "darmanitan-zen-galar", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 59, + "pokemon_id": 10172, + "weight": 1200 + }, + { + "base_id": 845, + "form_identifier": "gorging", + "form_order": 2, + "id": 13841, + "identifier": "cramorant-gorging", + "introduced_in_version_group_id": 8, + "is_battle_only": 1, + "is_default": 0, + "is_mega": 0, + "order": 310, + "pokemon_id": 845, + "weight": 180 + }, + { + "base_id": 107, + "form_identifier": "", + "form_order": 1, + "id": 10507, + "identifier": "onehitmonchan", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 2, + "pokemon_id": 10507, + "weight": 502 + }, + { + "base_id": 487, + "form_identifier": "", + "form_order": 1, + "id": 4848, + "identifier": "kanna-giratina", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 608, + "pokemon_id": 4848, + "weight": 7500 + }, + { + "base_id": 65, + "form_identifier": "", + "form_order": 1, + "id": 10666, + "identifier": "alacatzam", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 97, + "pokemon_id": 10666, + "weight": 480 + }, + { + "base_id": 493, + "form_identifier": "", + "form_order": 1, + "id": 10668, + "identifier": "tatogod-arceus-staff", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 619, + "pokemon_id": 10668, + "weight": 3200 + }, + { + "base_id": 487, + "form_identifier": "origin", + "form_order": 2, + "id": 4848, + "identifier": "giratinaorigin-kanna", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 608, + "pokemon_id": 4848, + "weight": 6500 + }, + { + "base_id": 888, + "form_identifier": "", + "form_order": 1, + "id": 4851, + "identifier": "kt-zacian-staff", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 4851, + "weight": 1100 + }, + { + "base_id": 888, + "form_identifier": "", + "form_order": 2, + "id": 4852, + "identifier": "kt-zacian.crowned-staff", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 4852, + "weight": 3550 + }, + { + "base_id": 282, + "form_identifier": "", + "form_order": 1, + "id": 4888, + "identifier": "tsu-gardevoir-staff", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 386, + "pokemon_id": 4888, + "weight": 484 + }, + { + "base_id": 745, + "form_identifier": "", + "form_order": 1, + "id": 5858, + "identifier": "snowy-lycanroc-custom", + "introduced_in_version_group_id": 7, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1009, + "pokemon_id": 5858, + "weight": 40 + }, + { + "base_id": 151, + "form_identifier": "", + "form_order": 1, + "id": 10669, + "identifier": "eugene-missingmew-custom", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 228, + "pokemon_id": 10669, + "weight": 40 + }, + { + "base_id": 43, + "form_identifier": "", + "form_order": 1, + "id": 10670, + "identifier": "chichiri-oddish-staff", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 69, + "pokemon_id": 10670, + "weight": 54 + }, + { + "base_id": 479, + "form_identifier": "", + "form_order": 3, + "id": 10900, + "identifier": "silver-rotom-custom", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 600, + "pokemon_id": 10900, + "weight": 3 + }, + { + "base_id": 384, + "form_identifier": "", + "form_order": 1, + "id": 10901, + "identifier": "krypt-rayquaza-custom", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 515, + "pokemon_id": 10901, + "weight": 2065 + }, + { + "base_id": 282, + "form_identifier": "", + "form_order": 1, + "id": 10902, + "identifier": "darling-gardevoir-custom", + "introduced_in_version_group_id": 5, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 386, + "pokemon_id": 10902, + "weight": 484 + }, + { + "base_id": 744, + "form_identifier": "", + "form_order": 1, + "id": 10903, + "identifier": "radio-rockruff-custom", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1007, + "pokemon_id": 10903, + "weight": 92 + }, + { + "base_id": 249, + "form_identifier": "", + "form_order": 1, + "id": 10904, + "identifier": "speedy-lugia-custom", + "introduced_in_version_group_id": 3, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 350, + "pokemon_id": 10904, + "weight": 2160 + }, + { + "base_id": 570, + "form_identifier": "", + "form_order": 1, + "id": 10905, + "identifier": "misfy-zorua-custom", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 716, + "pokemon_id": 10905, + "weight": 125 + }, + { + "base_id": 483, + "form_identifier": "", + "form_order": 1, + "id": 8800, + "identifier": "sunny-dialga-custom", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 607, + "pokemon_id": 8800, + "weight": 6830 + }, + { + "base_id": 807, + "form_identifier": "", + "form_order": 1, + "id": 8801, + "identifier": "eaarl-zeraora-staff", + "introduced_in_version_group_id": 18, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1116, + "pokemon_id": 8801, + "weight": 445 + }, + { + "base_id": 94, + "form_identifier": "", + "form_order": 1, + "id": 8802, + "identifier": "dylee-gengar-custom", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 135, + "pokemon_id": 8802, + "weight": 405 + }, + { + "base_id": 94, + "form_identifier": "", + "form_order": 1, + "id": 8803, + "identifier": "sky-gengar-custom", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 135, + "pokemon_id": 8803, + "weight": 405 + }, + { + "base_id": 393, + "form_identifier": "", + "form_order": 1, + "id": 6666, + "identifier": "gamer-piplup-staff", + "introduced_in_version_group_id": 8, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 528, + "pokemon_id": 6666, + "weight": 52 + }, + { + "base_id": 647, + "form_identifier": "", + "form_order": 1, + "id": 8805, + "identifier": "ru-keldeo-staff", + "introduced_in_version_group_id": 11, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 804, + "pokemon_id": 8805, + "weight": 485 + }, + { + "base_id": 845, + "form_identifier": "gulping", + "form_order": 3, + "id": 13842, + "identifier": "cramorant-gulping", + "introduced_in_version_group_id": 8, + "is_battle_only": 1, + "is_default": 0, + "is_mega": 0, + "order": 310, + "pokemon_id": 845, + "weight": 180 + }, + { + "base_id": 877, + "form_identifier": "hangry", + "form_order": 2, + "id": 10231, + "identifier": "morpeko-hangry", + "introduced_in_version_group_id": 12, + "is_battle_only": 1, + "is_default": 0, + "is_mega": 0, + "order": 1, + "pokemon_id": 877, + "weight": 30 + }, + { + "base_id": 0, + "form_identifier": "", + "form_order": 1, + "id": 0, + "identifier": "missingno", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 0, + "weight": 0 + }, + { + "base_id": 0, + "form_identifier": "ghost", + "form_order": 2, + "id": 16001, + "identifier": "missingno-ghost", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 0, + "weight": 69 + }, + { + "base_id": 483, + "form_identifier": "origin", + "form_order": 3, + "id": 10437, + "identifier": "dialga-origin", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 60, + "pokemon_id": 10437, + "weight": 8500 + }, + { + "base_id": 10435, + "form_identifier": "therian", + "form_order": 2, + "id": 11001, + "identifier": "enamorus-therian", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 60, + "pokemon_id": 10436, + "weight": 480 + }, + { + "base_id": 10435, + "form_identifier": "", + "form_order": 1, + "id": 10435, + "identifier": "enamorus", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 60, + "pokemon_id": 10435, + "weight": 480 + }, + { + "base_id": 10434, + "form_identifier": "", + "form_order": 1, + "id": 10434, + "identifier": "kleavor", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 60, + "pokemon_id": 10434, + "weight": 890 + }, + { + "base_id": 10433, + "form_identifier": "", + "form_order": 1, + "id": 10433, + "identifier": "overqwil", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 60, + "pokemon_id": 10433, + "weight": 605 + }, + { + "base_id": 484, + "form_identifier": "origin", + "form_order": 2, + "id": 11005, + "identifier": "palkia-origin", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 60, + "pokemon_id": 10432, + "weight": 6600 + }, + { + "base_id": 10430, + "form_identifier": "female", + "form_order": 2, + "id": 11006, + "identifier": "basculegion-female", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 60, + "pokemon_id": 10431, + "weight": 1100 + }, + { + "base_id": 10430, + "form_identifier": "", + "form_order": 1, + "id": 11007, + "identifier": "basculegion", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 60, + "pokemon_id": 10430, + "weight": 1100 + }, + { + "base_id": 10429, + "form_identifier": "white-striped", + "form_order": 3, + "id": 11008, + "identifier": "basculin-white-striped", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 60, + "pokemon_id": 10429, + "weight": 180 + }, + { + "base_id": 10428, + "form_identifier": "", + "form_order": 1, + "id": 10428, + "identifier": "wyrdeer", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 60, + "pokemon_id": 10428, + "weight": 951 + }, + { + "base_id": 10427, + "form_identifier": "", + "form_order": 1, + "id": 10427, + "identifier": "ursaluna", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 60, + "pokemon_id": 10427, + "weight": 2900 + }, + { + "base_id": 10426, + "form_identifier": "", + "form_order": 1, + "id": 10426, + "identifier": "sneasler", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 60, + "pokemon_id": 10426, + "weight": 430 + }, + { + "base_id": 10425, + "form_identifier": "hisui", + "form_order": 2, + "id": 10425, + "identifier": "arcanine-hisui", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 60, + "pokemon_id": 10425, + "weight": 1680 + }, + { + "base_id": 10424, + "form_identifier": "hisui", + "form_order": 2, + "id": 11013, + "identifier": "avalugg-hisui", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 60, + "pokemon_id": 10424, + "weight": 2624 + }, + { + "base_id": 10423, + "form_identifier": "hisui", + "form_order": 2, + "id": 11014, + "identifier": "braviary-hisui", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 60, + "pokemon_id": 10423, + "weight": 434 + }, + { + "base_id": 10422, + "form_identifier": "hisui", + "form_order": 2, + "id": 11015, + "identifier": "decidueye-hisui", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 60, + "pokemon_id": 10422, + "weight": 370 + }, + { + "base_id": 10421, + "form_identifier": "hisui", + "form_order": 2, + "id": 11016, + "identifier": "electrode-hisui", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 60, + "pokemon_id": 10421, + "weight": 710 + }, + { + "base_id": 10420, + "form_identifier": "hisui", + "form_order": 2, + "id": 11017, + "identifier": "goodra-hisui", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 60, + "pokemon_id": 10420, + "weight": 3341 + }, + { + "base_id": 10440, + "form_identifier": "hisui", + "form_order": 2, + "id": 11018, + "identifier": "growlithe-hisui", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 60, + "pokemon_id": 10440, + "weight": 227 + }, + { + "base_id": 10438, + "form_identifier": "hisui", + "form_order": 2, + "id": 11019, + "identifier": "lilligant-hisui", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 60, + "pokemon_id": 10438, + "weight": 36 + }, + { + "base_id": 10417, + "form_identifier": "hisui", + "form_order": 2, + "id": 11020, + "identifier": "qwilfish-hisui", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 60, + "pokemon_id": 10417, + "weight": 39 + }, + { + "base_id": 10416, + "form_identifier": "hisui", + "form_order": 2, + "id": 11021, + "identifier": "samurott-hisui", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 60, + "pokemon_id": 10416, + "weight": 582 + }, + { + "base_id": 10415, + "form_identifier": "hisui", + "form_order": 2, + "id": 11022, + "identifier": "sliggoo-hisui", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 60, + "pokemon_id": 10415, + "weight": 685 + }, + { + "base_id": 10414, + "form_identifier": "hisui", + "form_order": 2, + "id": 11023, + "identifier": "sneasel-hisui", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 60, + "pokemon_id": 10414, + "weight": 270 + }, + { + "base_id": 10413, + "form_identifier": "hisui", + "form_order": 2, + "id": 11024, + "identifier": "typhlosion-hisui", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 60, + "pokemon_id": 10413, + "weight": 698 + }, + { + "base_id": 10412, + "form_identifier": "hisui", + "form_order": 2, + "id": 11025, + "identifier": "voltorb-hisui", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 60, + "pokemon_id": 10412, + "weight": 130 + }, + { + "base_id": 10411, + "form_identifier": "hisui", + "form_order": 2, + "id": 11026, + "identifier": "zoroark-hisui", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 60, + "pokemon_id": 10411, + "weight": 730 + }, + { + "base_id": 10409, + "form_identifier": "hisui", + "form_order": 2, + "id": 11027, + "identifier": "zorua-hisui", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 60, + "pokemon_id": 10409, + "weight": 125 + }, + { + "base_id": 0, + "form_identifier": "aerodactyl", + "form_order": 3, + "id": 16002, + "identifier": "missingno-aerodactyl", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 0, + "weight": 69 + }, + { + "base_id": 0, + "form_identifier": "kabutops", + "form_order": 4, + "id": 16003, + "identifier": "missingno-kabutops", + "introduced_in_version_group_id": 1, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 0, + "weight": 69 + }, + { + "base_id": 849, + "form_identifier": "low-key", + "form_order": 2, + "id": 16010, + "identifier": "toxtricity-low-key", + "introduced_in_version_group_id": 12, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 849, + "weight": 400 + }, + { + "base_id": 906, + "form_identifier": "", + "form_order": 1, + "id": 906, + "identifier": "sprigatito", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 906, + "weight": 10 + }, + { + "base_id": 907, + "form_identifier": "", + "form_order": 1, + "id": 907, + "identifier": "floragato", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 907, + "weight": 10 + }, + { + "base_id": 908, + "form_identifier": "", + "form_order": 1, + "id": 908, + "identifier": "meowscarada", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 908, + "weight": 10 + }, + { + "base_id": 909, + "form_identifier": "", + "form_order": 1, + "id": 909, + "identifier": "fuecoco", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 0, + "pokemon_id": 909, + "weight": 10 + }, + { + "base_id": 910, + "form_identifier": "", + "form_order": 1, + "id": 910, + "identifier": "crocalor", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 910, + "weight": 10 + }, + { + "base_id": 911, + "form_identifier": "", + "form_order": 1, + "id": 911, + "identifier": "skeledirge", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 911, + "weight": 10 + }, + { + "base_id": 912, + "form_identifier": "", + "form_order": 1, + "id": 912, + "identifier": "quaxly", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 0, + "pokemon_id": 912, + "weight": 10 + }, + { + "base_id": 913, + "form_identifier": "", + "form_order": 1, + "id": 913, + "identifier": "quaxwell", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 913, + "weight": 10 + }, + { + "base_id": 914, + "form_identifier": "", + "form_order": 1, + "id": 914, + "identifier": "quaquaval", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 914, + "weight": 10 + }, + { + "base_id": 915, + "form_identifier": "", + "form_order": 1, + "id": 915, + "identifier": "lechonk", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 915, + "weight": 10 + }, + { + "base_id": 916, + "form_identifier": "", + "form_order": 1, + "id": 916, + "identifier": "oinkologne", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 916, + "weight": 10 + }, + { + "base_id": 917, + "form_identifier": "", + "form_order": 1, + "id": 917, + "identifier": "dudunsparce", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 917, + "weight": 10 + }, + { + "base_id": 918, + "form_identifier": "", + "form_order": 1, + "id": 918, + "identifier": "tarountula", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 918, + "weight": 10 + }, + { + "base_id": 919, + "form_identifier": "", + "form_order": 1, + "id": 919, + "identifier": "spidops", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 919, + "weight": 10 + }, + { + "base_id": 920, + "form_identifier": "", + "form_order": 1, + "id": 920, + "identifier": "nymble", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 920, + "weight": 10 + }, + { + "base_id": 921, + "form_identifier": "", + "form_order": 1, + "id": 921, + "identifier": "lokix", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 921, + "weight": 10 + }, + { + "base_id": 922, + "form_identifier": "", + "form_order": 1, + "id": 922, + "identifier": "rellor", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 922, + "weight": 10 + }, + { + "base_id": 923, + "form_identifier": "", + "form_order": 1, + "id": 923, + "identifier": "rabsca", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 923, + "weight": 10 + }, + { + "base_id": 924, + "form_identifier": "", + "form_order": 1, + "id": 924, + "identifier": "greavard", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 924, + "weight": 10 + }, + { + "base_id": 925, + "form_identifier": "", + "form_order": 1, + "id": 925, + "identifier": "houndstone", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 925, + "weight": 10 + }, + { + "base_id": 926, + "form_identifier": "", + "form_order": 1, + "id": 926, + "identifier": "flittle", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 926, + "weight": 10 + }, + { + "base_id": 927, + "form_identifier": "", + "form_order": 1, + "id": 927, + "identifier": "espathra", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 927, + "weight": 10 + }, + { + "base_id": 928, + "form_identifier": "", + "form_order": 1, + "id": 928, + "identifier": "farigiraf", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 928, + "weight": 10 + }, + { + "base_id": 929, + "form_identifier": "", + "form_order": 1, + "id": 929, + "identifier": "wiglett", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 929, + "weight": 10 + }, + { + "base_id": 930, + "form_identifier": "", + "form_order": 1, + "id": 930, + "identifier": "wugtrio", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 930, + "weight": 10 + }, + { + "base_id": 931, + "form_identifier": "", + "form_order": 1, + "id": 931, + "identifier": "dondozo", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 931, + "weight": 10 + }, + { + "base_id": 932, + "form_identifier": "", + "form_order": 1, + "id": 932, + "identifier": "veluza", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 932, + "weight": 10 + }, + { + "base_id": 933, + "form_identifier": "", + "form_order": 1, + "id": 933, + "identifier": "finizen", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 933, + "weight": 10 + }, + { + "base_id": 934, + "form_identifier": "", + "form_order": 1, + "id": 934, + "identifier": "palafin", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 934, + "weight": 10 + }, + { + "base_id": 934, + "form_identifier": "hero", + "form_order": 2, + "id": 11004, + "identifier": "palafin-hero", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 2, + "pokemon_id": 11004, + "weight": 10 + }, + { + "base_id": 935, + "form_identifier": "", + "form_order": 1, + "id": 935, + "identifier": "smoliv", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 935, + "weight": 10 + }, + { + "base_id": 936, + "form_identifier": "", + "form_order": 1, + "id": 936, + "identifier": "dolliv", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 936, + "weight": 10 + }, + { + "base_id": 937, + "form_identifier": "", + "form_order": 1, + "id": 937, + "identifier": "arboliva", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 937, + "weight": 10 + }, + { + "base_id": 938, + "form_identifier": "", + "form_order": 1, + "id": 938, + "identifier": "capsakid", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 938, + "weight": 10 + }, + { + "base_id": 939, + "form_identifier": "", + "form_order": 1, + "id": 939, + "identifier": "scovillain", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 939, + "weight": 10 + }, + { + "base_id": 940, + "form_identifier": "", + "form_order": 1, + "id": 940, + "identifier": "tadbulb", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 940, + "weight": 10 + }, + { + "base_id": 941, + "form_identifier": "", + "form_order": 1, + "id": 941, + "identifier": "bellibolt", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 941, + "weight": 10 + }, + { + "base_id": 942, + "form_identifier": "", + "form_order": 1, + "id": 942, + "identifier": "varoom", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 942, + "weight": 10 + }, + { + "base_id": 943, + "form_identifier": "", + "form_order": 1, + "id": 943, + "identifier": "revavroom", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 943, + "weight": 10 + }, + { + "base_id": 944, + "form_identifier": "", + "form_order": 1, + "id": 944, + "identifier": "orthworm", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 944, + "weight": 10 + }, + { + "base_id": 945, + "form_identifier": "", + "form_order": 1, + "id": 945, + "identifier": "tandemaus", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 945, + "weight": 10 + }, + { + "base_id": 946, + "form_identifier": "", + "form_order": 1, + "id": 946, + "identifier": "maushold", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 946, + "weight": 10 + }, + { + "base_id": 947, + "form_identifier": "", + "form_order": 1, + "id": 947, + "identifier": "cetoddle", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 947, + "weight": 10 + }, + { + "base_id": 948, + "form_identifier": "", + "form_order": 1, + "id": 948, + "identifier": "cetitan", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 948, + "weight": 10 + }, + { + "base_id": 949, + "form_identifier": "", + "form_order": 1, + "id": 949, + "identifier": "frigibax", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 949, + "weight": 10 + }, + { + "base_id": 950, + "form_identifier": "", + "form_order": 1, + "id": 950, + "identifier": "arctibax", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 950, + "weight": 10 + }, + { + "base_id": 951, + "form_identifier": "", + "form_order": 1, + "id": 951, + "identifier": "baxcalibur", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 951, + "weight": 10 + }, + { + "base_id": 952, + "form_identifier": "", + "form_order": 1, + "id": 952, + "identifier": "tatsugiri", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 952, + "weight": 10 + }, + { + "base_id": 953, + "form_identifier": "", + "form_order": 1, + "id": 953, + "identifier": "cyclizar", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 953, + "weight": 10 + }, + { + "base_id": 954, + "form_identifier": "", + "form_order": 1, + "id": 954, + "identifier": "pawmi", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 954, + "weight": 10 + }, + { + "base_id": 955, + "form_identifier": "", + "form_order": 1, + "id": 955, + "identifier": "pawmo", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 955, + "weight": 10 + }, + { + "base_id": 956, + "form_identifier": "", + "form_order": 1, + "id": 956, + "identifier": "pawmot", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 956, + "weight": 10 + }, + { + "base_id": 957, + "form_identifier": "", + "form_order": 1, + "id": 957, + "identifier": "wattrel", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 957, + "weight": 10 + }, + { + "base_id": 958, + "form_identifier": "", + "form_order": 1, + "id": 958, + "identifier": "kilowattrel", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 958, + "weight": 10 + }, + { + "base_id": 959, + "form_identifier": "", + "form_order": 1, + "id": 959, + "identifier": "bombirdier", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 959, + "weight": 10 + }, + { + "base_id": 960, + "form_identifier": "", + "form_order": 1, + "id": 960, + "identifier": "squawkabilly", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 960, + "weight": 10 + }, + { + "base_id": 961, + "form_identifier": "", + "form_order": 1, + "id": 961, + "identifier": "flamigo", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 961, + "weight": 10 + }, + { + "base_id": 962, + "form_identifier": "", + "form_order": 1, + "id": 962, + "identifier": "klawf", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 962, + "weight": 10 + }, + { + "base_id": 963, + "form_identifier": "", + "form_order": 1, + "id": 963, + "identifier": "nacli", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 963, + "weight": 10 + }, + { + "base_id": 964, + "form_identifier": "", + "form_order": 1, + "id": 964, + "identifier": "naclstack", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 964, + "weight": 10 + }, + { + "base_id": 965, + "form_identifier": "", + "form_order": 1, + "id": 965, + "identifier": "garganacl", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 965, + "weight": 10 + }, + { + "base_id": 966, + "form_identifier": "", + "form_order": 1, + "id": 966, + "identifier": "glimmet", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 966, + "weight": 10 + }, + { + "base_id": 967, + "form_identifier": "", + "form_order": 1, + "id": 967, + "identifier": "glimmora", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 967, + "weight": 10 + }, + { + "base_id": 968, + "form_identifier": "", + "form_order": 1, + "id": 968, + "identifier": "shroodle", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 968, + "weight": 10 + }, + { + "base_id": 969, + "form_identifier": "", + "form_order": 1, + "id": 969, + "identifier": "grafaiai", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 969, + "weight": 10 + }, + { + "base_id": 970, + "form_identifier": "", + "form_order": 1, + "id": 970, + "identifier": "fidough", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 970, + "weight": 10 + }, + { + "base_id": 971, + "form_identifier": "", + "form_order": 1, + "id": 971, + "identifier": "dachsbun", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 971, + "weight": 10 + }, + { + "base_id": 972, + "form_identifier": "", + "form_order": 1, + "id": 972, + "identifier": "maschiff", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 972, + "weight": 10 + }, + { + "base_id": 973, + "form_identifier": "", + "form_order": 1, + "id": 973, + "identifier": "mabosstiff", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 973, + "weight": 10 + }, + { + "base_id": 974, + "form_identifier": "", + "form_order": 1, + "id": 974, + "identifier": "bramblin", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 974, + "weight": 10 + }, + { + "base_id": 975, + "form_identifier": "", + "form_order": 1, + "id": 975, + "identifier": "brambleghast", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 975, + "weight": 10 + }, + { + "base_id": 976, + "form_identifier": "", + "form_order": 1, + "id": 976, + "identifier": "gimmighoul", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 976, + "weight": 10 + }, + { + "base_id": 977, + "form_identifier": "", + "form_order": 1, + "id": 977, + "identifier": "gholdengo", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 977, + "weight": 10 + }, + { + "base_id": 978, + "form_identifier": "", + "form_order": 1, + "id": 978, + "identifier": "great-tusk", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 978, + "weight": 10 + }, + { + "base_id": 979, + "form_identifier": "", + "form_order": 1, + "id": 979, + "identifier": "brute-bonnet", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 979, + "weight": 10 + }, + { + "base_id": 1012, + "form_identifier": "", + "form_order": 1, + "id": 1012, + "identifier": "walking-wake", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 1012, + "weight": 10 + }, + { + "base_id": 981, + "form_identifier": "", + "form_order": 1, + "id": 981, + "identifier": "sandy-shocks", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 981, + "weight": 10 + }, + { + "base_id": 982, + "form_identifier": "", + "form_order": 1, + "id": 982, + "identifier": "scream-tail", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 982, + "weight": 10 + }, + { + "base_id": 983, + "form_identifier": "", + "form_order": 1, + "id": 983, + "identifier": "flutter-mane", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 983, + "weight": 10 + }, + { + "base_id": 984, + "form_identifier": "", + "form_order": 1, + "id": 984, + "identifier": "slither-wing", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 984, + "weight": 10 + }, + { + "base_id": 985, + "form_identifier": "", + "form_order": 1, + "id": 985, + "identifier": "roaring-moon", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 985, + "weight": 10 + }, + { + "base_id": 986, + "form_identifier": "", + "form_order": 1, + "id": 986, + "identifier": "iron-treads", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 986, + "weight": 10 + }, + { + "base_id": 987, + "form_identifier": "", + "form_order": 1, + "id": 987, + "identifier": "future-virizion", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 987, + "weight": 10 + }, + { + "base_id": 988, + "form_identifier": "", + "form_order": 1, + "id": 988, + "identifier": "iron-moth", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 988, + "weight": 10 + }, + { + "base_id": 989, + "form_identifier": "", + "form_order": 1, + "id": 989, + "identifier": "iron-hands", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 989, + "weight": 10 + }, + { + "base_id": 990, + "form_identifier": "", + "form_order": 1, + "id": 990, + "identifier": "iron-jugulis", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 990, + "weight": 10 + }, + { + "base_id": 991, + "form_identifier": "", + "form_order": 1, + "id": 991, + "identifier": "iron-thorns", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 991, + "weight": 10 + }, + { + "base_id": 992, + "form_identifier": "", + "form_order": 1, + "id": 992, + "identifier": "iron-bundle", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 992, + "weight": 10 + }, + { + "base_id": 993, + "form_identifier": "", + "form_order": 1, + "id": 993, + "identifier": "iron-valiant", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 993, + "weight": 10 + }, + { + "base_id": 994, + "form_identifier": "", + "form_order": 1, + "id": 994, + "identifier": "ting-lu", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 994, + "weight": 10 + }, + { + "base_id": 995, + "form_identifier": "", + "form_order": 1, + "id": 995, + "identifier": "chien-pao", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 995, + "weight": 10 + }, + { + "base_id": 996, + "form_identifier": "", + "form_order": 1, + "id": 996, + "identifier": "wo-chien", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 996, + "weight": 10 + }, + { + "base_id": 997, + "form_identifier": "", + "form_order": 1, + "id": 997, + "identifier": "chi-yu", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 997, + "weight": 10 + }, + { + "base_id": 998, + "form_identifier": "", + "form_order": 1, + "id": 998, + "identifier": "koraidon", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 998, + "weight": 10 + }, + { + "base_id": 999, + "form_identifier": "", + "form_order": 1, + "id": 999, + "identifier": "miraidon", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 999, + "weight": 10 + }, + { + "base_id": 1000, + "form_identifier": "", + "form_order": 1, + "id": 1000, + "identifier": "tinkatink", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 1000, + "weight": 10 + }, + { + "base_id": 1001, + "form_identifier": "", + "form_order": 1, + "id": 1001, + "identifier": "tinkatuff", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 1001, + "weight": 10 + }, + { + "base_id": 1002, + "form_identifier": "", + "form_order": 1, + "id": 1002, + "identifier": "tinkaton", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 1002, + "weight": 10 + }, + { + "base_id": 1003, + "form_identifier": "", + "form_order": 1, + "id": 1003, + "identifier": "charcadet", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 1003, + "weight": 10 + }, + { + "base_id": 1004, + "form_identifier": "", + "form_order": 1, + "id": 1004, + "identifier": "armarouge", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 1004, + "weight": 10 + }, + { + "base_id": 1005, + "form_identifier": "", + "form_order": 1, + "id": 1005, + "identifier": "ceruledge", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 1005, + "weight": 10 + }, + { + "base_id": 1006, + "form_identifier": "", + "form_order": 1, + "id": 1006, + "identifier": "toedscool", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 1006, + "weight": 10 + }, + { + "base_id": 1007, + "form_identifier": "", + "form_order": 1, + "id": 1007, + "identifier": "toedscruel", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 1007, + "weight": 10 + }, + { + "base_id": 1008, + "form_identifier": "", + "form_order": 1, + "id": 1008, + "identifier": "kingambit", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 1008, + "weight": 10 + }, + { + "base_id": 1009, + "form_identifier": "", + "form_order": 1, + "id": 1009, + "identifier": "clodsire", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 1009, + "weight": 10 + }, + { + "base_id": 1010, + "form_identifier": "", + "form_order": 1, + "id": 1010, + "identifier": "annihilape", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 1010, + "weight": 10 + }, + { + "base_id": 11000, + "form_identifier": "paldea", + "form_order": 2, + "id": 11000, + "identifier": "tauros-paldea", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 193, + "pokemon_id": 11000, + "weight": 884 + }, + { + "base_id": 11001, + "form_identifier": "paldea", + "form_order": 2, + "id": 11001, + "identifier": "wooper-paldea", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 271, + "pokemon_id": 11001, + "weight": 85 + }, + { + "base_id": 11000, + "form_identifier": "aqua-paldea", + "form_order": 4, + "id": 11002, + "identifier": "tauros-aqua-paldea", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 193, + "pokemon_id": 11002, + "weight": 884 + }, + { + "base_id": 11000, + "form_identifier": "blaze-paldea", + "form_order": 3, + "id": 11003, + "identifier": "tauros-blaze-paldea", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 193, + "pokemon_id": 11003, + "weight": 884 + }, + { + "base_id": 1011, + "form_identifier": "", + "form_order": 1, + "id": 1011, + "identifier": "iron-leaves", + "introduced_in_version_group_id": 17, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1011, + "pokemon_id": 1011, + "weight": 555 + }, + { + "base_id": 4000, + "form_identifier": "", + "form_order": 1, + "id": 4000, + "identifier": "poltchageist", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 4000, + "pokemon_id": 4000, + "weight": 11 + }, + { + "base_id": 4001, + "form_identifier": "", + "form_order": 1, + "id": 4001, + "identifier": "sinistcha", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 4001, + "pokemon_id": 4001, + "weight": 22 + }, + { + "base_id": 1013, + "form_identifier": "", + "form_order": 1, + "id": 1013, + "identifier": "dipplin", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1013, + "pokemon_id": 1013, + "weight": 44 + }, + { + "base_id": 1014, + "form_identifier": "", + "form_order": 1, + "id": 1014, + "identifier": "okidogi", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1014, + "pokemon_id": 1014, + "weight": 922 + }, + { + "base_id": 1015, + "form_identifier": "", + "form_order": 1, + "id": 1015, + "identifier": "munkidori", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1015, + "pokemon_id": 1015, + "weight": 122 + }, + { + "base_id": 1016, + "form_identifier": "", + "form_order": 1, + "id": 1016, + "identifier": "fezandipiti", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1016, + "pokemon_id": 1016, + "weight": 301 + }, + { + "base_id": 1017, + "form_identifier": "", + "form_order": 1, + "id": 1017, + "identifier": "ogerpon", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1017, + "pokemon_id": 1017, + "weight": 398 + }, + { + "base_id": 1017, + "form_identifier": "wellspring", + "form_order": 2, + "id": 11009, + "identifier": "ogerpon-wellspring", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 1017, + "pokemon_id": 1017, + "weight": 398 + }, + { + "base_id": 1017, + "form_identifier": "hearthflame", + "form_order": 3, + "id": 11010, + "identifier": "ogerpon-hearthflame", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 1017, + "pokemon_id": 1017, + "weight": 398 + }, + { + "base_id": 1017, + "form_identifier": "cornerstone", + "form_order": 4, + "id": 11011, + "identifier": "orgerpon-cornerstone", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 0, + "is_mega": 0, + "order": 1017, + "pokemon_id": 1017, + "weight": 398 + }, + { + "base_id": 1018, + "form_identifier": "", + "form_order": 1, + "id": 1018, + "identifier": "archaludon", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1018, + "pokemon_id": 1018, + "weight": 600 + }, + { + "base_id": 1019, + "form_identifier": "", + "form_order": 1, + "id": 1019, + "identifier": "hydrapple", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 1019, + "weight": 930 + }, + { + "base_id": 1020, + "form_identifier": "", + "form_order": 1, + "id": 1020, + "identifier": "gouging-fire", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 1020, + "weight": 5900 + }, + { + "base_id": 1021, + "form_identifier": "", + "form_order": 1, + "id": 1021, + "identifier": "raging-bolt", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 1021, + "weight": 4800 + }, + { + "base_id": 1022, + "form_identifier": "", + "form_order": 1, + "id": 1022, + "identifier": "iron-boulder", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 1022, + "weight": 1625 + }, + { + "base_id": 1023, + "form_identifier": "", + "form_order": 1, + "id": 1023, + "identifier": "iron-crown", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 1023, + "weight": 1560 + }, + { + "base_id": 1024, + "form_identifier": "", + "form_order": 1, + "id": 1024, + "identifier": "terapagos", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 1024, + "weight": 65 + }, + { + "base_id": 1025, + "form_identifier": "", + "form_order": 1, + "id": 1025, + "identifier": "pecharunt", + "introduced_in_version_group_id": 9, + "is_battle_only": 0, + "is_default": 1, + "is_mega": 0, + "order": 1, + "pokemon_id": 1025, + "weight": 3 + } +] \ No newline at end of file diff --git a/pokemonduel/data/items.json b/pokemonduel/data/items.json new file mode 100644 index 0000000..343fe4a --- /dev/null +++ b/pokemonduel/data/items.json @@ -0,0 +1,8118 @@ +[ + { + "id": 1, + "identifier": "master-ball", + "category_id": 34, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 2, + "identifier": "ultra-ball", + "category_id": 34, + "cost": 800, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 3, + "identifier": "great-ball", + "category_id": 34, + "cost": 600, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 4, + "identifier": "poke-ball", + "category_id": 34, + "cost": 200, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 5, + "identifier": "safari-ball", + "category_id": 34, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 6, + "identifier": "net-ball", + "category_id": 33, + "cost": 1000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 7, + "identifier": "dive-ball", + "category_id": 33, + "cost": 1000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 8, + "identifier": "nest-ball", + "category_id": 33, + "cost": 1000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 9, + "identifier": "repeat-ball", + "category_id": 33, + "cost": 1000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 10, + "identifier": "timer-ball", + "category_id": 33, + "cost": 1000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 11, + "identifier": "luxury-ball", + "category_id": 33, + "cost": 1000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 12, + "identifier": "premier-ball", + "category_id": 33, + "cost": 20, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 13, + "identifier": "dusk-ball", + "category_id": 33, + "cost": 1000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 14, + "identifier": "heal-ball", + "category_id": 33, + "cost": 300, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 15, + "identifier": "quick-ball", + "category_id": 33, + "cost": 1000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 16, + "identifier": "cherish-ball", + "category_id": 33, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 17, + "identifier": "potion", + "category_id": 27, + "cost": 200, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 18, + "identifier": "antidote", + "category_id": 30, + "cost": 200, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 19, + "identifier": "burn-heal", + "category_id": 30, + "cost": 300, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 20, + "identifier": "ice-heal", + "category_id": 30, + "cost": 100, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 21, + "identifier": "awakening", + "category_id": 30, + "cost": 100, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 22, + "identifier": "paralyze-heal", + "category_id": 30, + "cost": 300, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 23, + "identifier": "full-restore", + "category_id": 27, + "cost": 3000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 24, + "identifier": "max-potion", + "category_id": 27, + "cost": 2500, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 25, + "identifier": "hyper-potion", + "category_id": 27, + "cost": 1500, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 26, + "identifier": "super-potion", + "category_id": 27, + "cost": 700, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 27, + "identifier": "full-heal", + "category_id": 30, + "cost": 400, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 28, + "identifier": "revive", + "category_id": 29, + "cost": 2000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 29, + "identifier": "max-revive", + "category_id": 29, + "cost": 4000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 30, + "identifier": "fresh-water", + "category_id": 27, + "cost": 200, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 31, + "identifier": "soda-pop", + "category_id": 27, + "cost": 300, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 32, + "identifier": "lemonade", + "category_id": 27, + "cost": 400, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 33, + "identifier": "moomoo-milk", + "category_id": 27, + "cost": 600, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 34, + "identifier": "energy-powder", + "category_id": 27, + "cost": 500, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 35, + "identifier": "energy-root", + "category_id": 27, + "cost": 1200, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 36, + "identifier": "heal-powder", + "category_id": 30, + "cost": 300, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 37, + "identifier": "revival-herb", + "category_id": 29, + "cost": 2800, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 38, + "identifier": "ether", + "category_id": 28, + "cost": 1200, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 39, + "identifier": "max-ether", + "category_id": 28, + "cost": 2000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 40, + "identifier": "elixir", + "category_id": 28, + "cost": 3000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 41, + "identifier": "max-elixir", + "category_id": 28, + "cost": 4500, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 42, + "identifier": "lava-cookie", + "category_id": 30, + "cost": 350, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 43, + "identifier": "berry-juice", + "category_id": 27, + "cost": 200, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 44, + "identifier": "sacred-ash", + "category_id": 29, + "cost": 50000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 45, + "identifier": "hp-up", + "category_id": 26, + "cost": 10000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 46, + "identifier": "protein", + "category_id": 26, + "cost": 10000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 47, + "identifier": "iron", + "category_id": 26, + "cost": 10000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 48, + "identifier": "carbos", + "category_id": 26, + "cost": 10000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 49, + "identifier": "calcium", + "category_id": 26, + "cost": 10000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 50, + "identifier": "rare-candy", + "category_id": 26, + "cost": 10000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 51, + "identifier": "pp-up", + "category_id": 26, + "cost": 10000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 52, + "identifier": "zinc", + "category_id": 26, + "cost": 10000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 53, + "identifier": "pp-max", + "category_id": 26, + "cost": 10000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 54, + "identifier": "old-gateau", + "category_id": 30, + "cost": 350, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 55, + "identifier": "guard-spec", + "category_id": 1, + "cost": 1500, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 56, + "identifier": "dire-hit", + "category_id": 1, + "cost": 1000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 57, + "identifier": "x-attack", + "category_id": 1, + "cost": 1000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 58, + "identifier": "x-defense", + "category_id": 1, + "cost": 2000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 59, + "identifier": "x-speed", + "category_id": 1, + "cost": 1000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 60, + "identifier": "x-accuracy", + "category_id": 1, + "cost": 1000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 61, + "identifier": "x-sp-atk", + "category_id": 1, + "cost": 1000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 62, + "identifier": "x-sp-def", + "category_id": 1, + "cost": 2000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 63, + "identifier": "poke-doll", + "category_id": 11, + "cost": 100, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 64, + "identifier": "fluffy-tail", + "category_id": 11, + "cost": 100, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 65, + "identifier": "blue-flute", + "category_id": 38, + "cost": 20, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 66, + "identifier": "yellow-flute", + "category_id": 38, + "cost": 20, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 67, + "identifier": "red-flute", + "category_id": 38, + "cost": 20, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 68, + "identifier": "black-flute", + "category_id": 11, + "cost": 20, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 69, + "identifier": "white-flute", + "category_id": 11, + "cost": 20, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 70, + "identifier": "shoal-salt", + "category_id": 9, + "cost": 20, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 71, + "identifier": "shoal-shell", + "category_id": 9, + "cost": 20, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 72, + "identifier": "red-shard", + "category_id": 9, + "cost": 1000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 73, + "identifier": "blue-shard", + "category_id": 9, + "cost": 1000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 74, + "identifier": "yellow-shard", + "category_id": 9, + "cost": 1000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 75, + "identifier": "green-shard", + "category_id": 9, + "cost": 1000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 76, + "identifier": "super-repel", + "category_id": 11, + "cost": 700, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 77, + "identifier": "max-repel", + "category_id": 11, + "cost": 900, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 78, + "identifier": "escape-rope", + "category_id": 11, + "cost": 1000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 79, + "identifier": "repel", + "category_id": 11, + "cost": 400, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 80, + "identifier": "sun-stone", + "category_id": 10, + "cost": 3000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 81, + "identifier": "moon-stone", + "category_id": 10, + "cost": 3000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 82, + "identifier": "fire-stone", + "category_id": 10, + "cost": 3000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 83, + "identifier": "thunder-stone", + "category_id": 10, + "cost": 3000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 84, + "identifier": "water-stone", + "category_id": 10, + "cost": 3000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 85, + "identifier": "leaf-stone", + "category_id": 10, + "cost": 3000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 86, + "identifier": "tiny-mushroom", + "category_id": 24, + "cost": 500, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 87, + "identifier": "big-mushroom", + "category_id": 24, + "cost": 5000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 88, + "identifier": "pearl", + "category_id": 24, + "cost": 2000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 89, + "identifier": "big-pearl", + "category_id": 24, + "cost": 8000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 90, + "identifier": "stardust", + "category_id": 24, + "cost": 3000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 91, + "identifier": "star-piece", + "category_id": 24, + "cost": 12000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 92, + "identifier": "nugget", + "category_id": 24, + "cost": 10000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 93, + "identifier": "heart-scale", + "category_id": 9, + "cost": 100, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 94, + "identifier": "honey", + "category_id": 35, + "cost": 300, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 95, + "identifier": "growth-mulch", + "category_id": 32, + "cost": 200, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 96, + "identifier": "damp-mulch", + "category_id": 32, + "cost": 200, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 97, + "identifier": "stable-mulch", + "category_id": 32, + "cost": 200, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 98, + "identifier": "gooey-mulch", + "category_id": 32, + "cost": 200, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 99, + "identifier": "root-fossil", + "category_id": 35, + "cost": 7000, + "fling_power": 100, + "fling_effect_id": "" + }, + { + "id": 100, + "identifier": "claw-fossil", + "category_id": 35, + "cost": 7000, + "fling_power": 100, + "fling_effect_id": "" + }, + { + "id": 101, + "identifier": "helix-fossil", + "category_id": 35, + "cost": 7000, + "fling_power": 100, + "fling_effect_id": "" + }, + { + "id": 102, + "identifier": "dome-fossil", + "category_id": 35, + "cost": 7000, + "fling_power": 100, + "fling_effect_id": "" + }, + { + "id": 103, + "identifier": "old-amber", + "category_id": 35, + "cost": 10000, + "fling_power": 100, + "fling_effect_id": "" + }, + { + "id": 104, + "identifier": "armor-fossil", + "category_id": 35, + "cost": 7000, + "fling_power": 100, + "fling_effect_id": "" + }, + { + "id": 105, + "identifier": "skull-fossil", + "category_id": 35, + "cost": 7000, + "fling_power": 100, + "fling_effect_id": "" + }, + { + "id": 106, + "identifier": "rare-bone", + "category_id": 24, + "cost": 5000, + "fling_power": 100, + "fling_effect_id": "" + }, + { + "id": 107, + "identifier": "shiny-stone", + "category_id": 10, + "cost": 3000, + "fling_power": 80, + "fling_effect_id": "" + }, + { + "id": 108, + "identifier": "dusk-stone", + "category_id": 10, + "cost": 3000, + "fling_power": 80, + "fling_effect_id": "" + }, + { + "id": 109, + "identifier": "dawn-stone", + "category_id": 10, + "cost": 3000, + "fling_power": 80, + "fling_effect_id": "" + }, + { + "id": 110, + "identifier": "oval-stone", + "category_id": 10, + "cost": 2000, + "fling_power": 80, + "fling_effect_id": "" + }, + { + "id": 111, + "identifier": "odd-keystone", + "category_id": 35, + "cost": 2100, + "fling_power": 80, + "fling_effect_id": "" + }, + { + "id": 112, + "identifier": "adamant-orb", + "category_id": 18, + "cost": 0, + "fling_power": 60, + "fling_effect_id": "" + }, + { + "id": 113, + "identifier": "lustrous-orb", + "category_id": 18, + "cost": 0, + "fling_power": 60, + "fling_effect_id": "" + }, + { + "id": 114, + "identifier": "grass-mail", + "category_id": 25, + "cost": 50, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 115, + "identifier": "flame-mail", + "category_id": 25, + "cost": 50, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 116, + "identifier": "bubble-mail", + "category_id": 25, + "cost": 50, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 117, + "identifier": "bloom-mail", + "category_id": 25, + "cost": 50, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 118, + "identifier": "tunnel-mail", + "category_id": 25, + "cost": 50, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 119, + "identifier": "steel-mail", + "category_id": 25, + "cost": 50, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 120, + "identifier": "heart-mail", + "category_id": 25, + "cost": 50, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 121, + "identifier": "snow-mail", + "category_id": 25, + "cost": 50, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 122, + "identifier": "space-mail", + "category_id": 25, + "cost": 50, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 123, + "identifier": "air-mail", + "category_id": 25, + "cost": 50, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 124, + "identifier": "mosaic-mail", + "category_id": 25, + "cost": 50, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 125, + "identifier": "brick-mail", + "category_id": 25, + "cost": 50, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 126, + "identifier": "cheri-berry", + "category_id": 3, + "cost": 20, + "fling_power": 10, + "fling_effect_id": 3 + }, + { + "id": 127, + "identifier": "chesto-berry", + "category_id": 3, + "cost": 20, + "fling_power": 10, + "fling_effect_id": 3 + }, + { + "id": 128, + "identifier": "pecha-berry", + "category_id": 3, + "cost": 20, + "fling_power": 10, + "fling_effect_id": 3 + }, + { + "id": 129, + "identifier": "rawst-berry", + "category_id": 3, + "cost": 20, + "fling_power": 10, + "fling_effect_id": 3 + }, + { + "id": 130, + "identifier": "aspear-berry", + "category_id": 3, + "cost": 20, + "fling_power": 10, + "fling_effect_id": 3 + }, + { + "id": 131, + "identifier": "leppa-berry", + "category_id": 3, + "cost": 20, + "fling_power": 10, + "fling_effect_id": 3 + }, + { + "id": 132, + "identifier": "oran-berry", + "category_id": 3, + "cost": 20, + "fling_power": 10, + "fling_effect_id": 3 + }, + { + "id": 133, + "identifier": "persim-berry", + "category_id": 3, + "cost": 20, + "fling_power": 10, + "fling_effect_id": 3 + }, + { + "id": 134, + "identifier": "lum-berry", + "category_id": 3, + "cost": 20, + "fling_power": 10, + "fling_effect_id": 3 + }, + { + "id": 135, + "identifier": "sitrus-berry", + "category_id": 3, + "cost": 20, + "fling_power": 10, + "fling_effect_id": 3 + }, + { + "id": 136, + "identifier": "figy-berry", + "category_id": 6, + "cost": 20, + "fling_power": 10, + "fling_effect_id": 3 + }, + { + "id": 137, + "identifier": "wiki-berry", + "category_id": 6, + "cost": 20, + "fling_power": 10, + "fling_effect_id": 3 + }, + { + "id": 138, + "identifier": "mago-berry", + "category_id": 6, + "cost": 20, + "fling_power": 10, + "fling_effect_id": 3 + }, + { + "id": 139, + "identifier": "aguav-berry", + "category_id": 6, + "cost": 20, + "fling_power": 10, + "fling_effect_id": 3 + }, + { + "id": 140, + "identifier": "iapapa-berry", + "category_id": 6, + "cost": 20, + "fling_power": 10, + "fling_effect_id": 3 + }, + { + "id": 141, + "identifier": "razz-berry", + "category_id": 8, + "cost": 20, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 142, + "identifier": "bluk-berry", + "category_id": 8, + "cost": 20, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 143, + "identifier": "nanab-berry", + "category_id": 8, + "cost": 20, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 144, + "identifier": "wepear-berry", + "category_id": 8, + "cost": 20, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 145, + "identifier": "pinap-berry", + "category_id": 8, + "cost": 20, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 146, + "identifier": "pomeg-berry", + "category_id": 2, + "cost": 20, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 147, + "identifier": "kelpsy-berry", + "category_id": 2, + "cost": 20, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 148, + "identifier": "qualot-berry", + "category_id": 2, + "cost": 20, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 149, + "identifier": "hondew-berry", + "category_id": 2, + "cost": 20, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 150, + "identifier": "grepa-berry", + "category_id": 2, + "cost": 20, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 151, + "identifier": "tamato-berry", + "category_id": 2, + "cost": 20, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 152, + "identifier": "cornn-berry", + "category_id": 8, + "cost": 20, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 153, + "identifier": "magost-berry", + "category_id": 8, + "cost": 20, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 154, + "identifier": "rabuta-berry", + "category_id": 8, + "cost": 20, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 155, + "identifier": "nomel-berry", + "category_id": 8, + "cost": 20, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 156, + "identifier": "spelon-berry", + "category_id": 8, + "cost": 20, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 157, + "identifier": "pamtre-berry", + "category_id": 8, + "cost": 20, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 158, + "identifier": "watmel-berry", + "category_id": 8, + "cost": 20, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 159, + "identifier": "durin-berry", + "category_id": 8, + "cost": 20, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 160, + "identifier": "belue-berry", + "category_id": 8, + "cost": 20, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 161, + "identifier": "occa-berry", + "category_id": 7, + "cost": 20, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 162, + "identifier": "passho-berry", + "category_id": 7, + "cost": 20, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 163, + "identifier": "wacan-berry", + "category_id": 7, + "cost": 20, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 164, + "identifier": "rindo-berry", + "category_id": 7, + "cost": 20, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 165, + "identifier": "yache-berry", + "category_id": 7, + "cost": 20, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 166, + "identifier": "chople-berry", + "category_id": 7, + "cost": 20, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 167, + "identifier": "kebia-berry", + "category_id": 7, + "cost": 20, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 168, + "identifier": "shuca-berry", + "category_id": 7, + "cost": 20, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 169, + "identifier": "coba-berry", + "category_id": 7, + "cost": 20, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 170, + "identifier": "payapa-berry", + "category_id": 7, + "cost": 20, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 171, + "identifier": "tanga-berry", + "category_id": 7, + "cost": 20, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 172, + "identifier": "charti-berry", + "category_id": 7, + "cost": 20, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 173, + "identifier": "kasib-berry", + "category_id": 7, + "cost": 20, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 174, + "identifier": "haban-berry", + "category_id": 7, + "cost": 20, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 175, + "identifier": "colbur-berry", + "category_id": 7, + "cost": 20, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 176, + "identifier": "babiri-berry", + "category_id": 7, + "cost": 20, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 177, + "identifier": "chilan-berry", + "category_id": 7, + "cost": 20, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 178, + "identifier": "liechi-berry", + "category_id": 5, + "cost": 20, + "fling_power": 10, + "fling_effect_id": 3 + }, + { + "id": 179, + "identifier": "ganlon-berry", + "category_id": 5, + "cost": 20, + "fling_power": 10, + "fling_effect_id": 3 + }, + { + "id": 180, + "identifier": "salac-berry", + "category_id": 5, + "cost": 20, + "fling_power": 10, + "fling_effect_id": 3 + }, + { + "id": 181, + "identifier": "petaya-berry", + "category_id": 5, + "cost": 20, + "fling_power": 10, + "fling_effect_id": 3 + }, + { + "id": 182, + "identifier": "apicot-berry", + "category_id": 5, + "cost": 20, + "fling_power": 10, + "fling_effect_id": 3 + }, + { + "id": 183, + "identifier": "lansat-berry", + "category_id": 5, + "cost": 20, + "fling_power": 10, + "fling_effect_id": 3 + }, + { + "id": 184, + "identifier": "starf-berry", + "category_id": 5, + "cost": 20, + "fling_power": 10, + "fling_effect_id": 3 + }, + { + "id": 185, + "identifier": "enigma-berry", + "category_id": 4, + "cost": 20, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 186, + "identifier": "micle-berry", + "category_id": 5, + "cost": 20, + "fling_power": 10, + "fling_effect_id": 3 + }, + { + "id": 187, + "identifier": "custap-berry", + "category_id": 5, + "cost": 20, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 188, + "identifier": "jaboca-berry", + "category_id": 4, + "cost": 20, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 189, + "identifier": "rowap-berry", + "category_id": 4, + "cost": 20, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 190, + "identifier": "bright-powder", + "category_id": 12, + "cost": 4000, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 191, + "identifier": "white-herb", + "category_id": 12, + "cost": 4000, + "fling_power": 10, + "fling_effect_id": 4 + }, + { + "id": 192, + "identifier": "macho-brace", + "category_id": 14, + "cost": 3000, + "fling_power": 60, + "fling_effect_id": "" + }, + { + "id": 193, + "identifier": "exp-share", + "category_id": 16, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 194, + "identifier": "quick-claw", + "category_id": 12, + "cost": 4000, + "fling_power": 80, + "fling_effect_id": "" + }, + { + "id": 195, + "identifier": "soothe-bell", + "category_id": 16, + "cost": 4000, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 196, + "identifier": "mental-herb", + "category_id": 12, + "cost": 4000, + "fling_power": 10, + "fling_effect_id": 4 + }, + { + "id": 197, + "identifier": "choice-band", + "category_id": 13, + "cost": 4000, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 198, + "identifier": "kings-rock", + "category_id": 12, + "cost": 5000, + "fling_power": 30, + "fling_effect_id": 7 + }, + { + "id": 199, + "identifier": "silver-powder", + "category_id": 19, + "cost": 1000, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 200, + "identifier": "amulet-coin", + "category_id": 16, + "cost": 10000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 201, + "identifier": "cleanse-tag", + "category_id": 16, + "cost": 5000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 202, + "identifier": "soul-dew", + "category_id": 18, + "cost": 0, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 203, + "identifier": "deep-sea-tooth", + "category_id": 18, + "cost": 2000, + "fling_power": 90, + "fling_effect_id": "" + }, + { + "id": 204, + "identifier": "deep-sea-scale", + "category_id": 18, + "cost": 2000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 205, + "identifier": "smoke-ball", + "category_id": 12, + "cost": 4000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 206, + "identifier": "everstone", + "category_id": 16, + "cost": 3000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 207, + "identifier": "focus-band", + "category_id": 12, + "cost": 4000, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 208, + "identifier": "lucky-egg", + "category_id": 16, + "cost": 10000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 209, + "identifier": "scope-lens", + "category_id": 12, + "cost": 4000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 210, + "identifier": "metal-coat", + "category_id": 19, + "cost": 2000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 211, + "identifier": "leftovers", + "category_id": 12, + "cost": 4000, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 212, + "identifier": "dragon-scale", + "category_id": 10, + "cost": 2000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 213, + "identifier": "light-ball", + "category_id": 18, + "cost": 1000, + "fling_power": 30, + "fling_effect_id": 5 + }, + { + "id": 214, + "identifier": "soft-sand", + "category_id": 19, + "cost": 1000, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 215, + "identifier": "hard-stone", + "category_id": 19, + "cost": 1000, + "fling_power": 100, + "fling_effect_id": "" + }, + { + "id": 216, + "identifier": "miracle-seed", + "category_id": 19, + "cost": 1000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 217, + "identifier": "black-glasses", + "category_id": 19, + "cost": 1000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 218, + "identifier": "black-belt", + "category_id": 19, + "cost": 1000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 219, + "identifier": "magnet", + "category_id": 19, + "cost": 1000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 220, + "identifier": "mystic-water", + "category_id": 19, + "cost": 1000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 221, + "identifier": "sharp-beak", + "category_id": 19, + "cost": 1000, + "fling_power": 50, + "fling_effect_id": "" + }, + { + "id": 222, + "identifier": "poison-barb", + "category_id": 19, + "cost": 1000, + "fling_power": 70, + "fling_effect_id": 6 + }, + { + "id": 223, + "identifier": "never-melt-ice", + "category_id": 19, + "cost": 1000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 224, + "identifier": "spell-tag", + "category_id": 19, + "cost": 1000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 225, + "identifier": "twisted-spoon", + "category_id": 19, + "cost": 1000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 226, + "identifier": "charcoal", + "category_id": 19, + "cost": 1000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 227, + "identifier": "dragon-fang", + "category_id": 19, + "cost": 1000, + "fling_power": 70, + "fling_effect_id": "" + }, + { + "id": 228, + "identifier": "silk-scarf", + "category_id": 19, + "cost": 1000, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 229, + "identifier": "up-grade", + "category_id": 10, + "cost": 2000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 230, + "identifier": "shell-bell", + "category_id": 12, + "cost": 4000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 231, + "identifier": "sea-incense", + "category_id": 19, + "cost": 2000, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 232, + "identifier": "lax-incense", + "category_id": 12, + "cost": 5000, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 233, + "identifier": "lucky-punch", + "category_id": 18, + "cost": 1000, + "fling_power": 40, + "fling_effect_id": "" + }, + { + "id": 234, + "identifier": "metal-powder", + "category_id": 18, + "cost": 1000, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 235, + "identifier": "thick-club", + "category_id": 18, + "cost": 1000, + "fling_power": 90, + "fling_effect_id": "" + }, + { + "id": 236, + "identifier": "stick", + "category_id": 18, + "cost": 1000, + "fling_power": 60, + "fling_effect_id": "" + }, + { + "id": 237, + "identifier": "red-scarf", + "category_id": 36, + "cost": 100, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 238, + "identifier": "blue-scarf", + "category_id": 36, + "cost": 100, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 239, + "identifier": "pink-scarf", + "category_id": 36, + "cost": 100, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 240, + "identifier": "green-scarf", + "category_id": 36, + "cost": 100, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 241, + "identifier": "yellow-scarf", + "category_id": 36, + "cost": 100, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 242, + "identifier": "wide-lens", + "category_id": 12, + "cost": 4000, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 243, + "identifier": "muscle-band", + "category_id": 12, + "cost": 4000, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 244, + "identifier": "wise-glasses", + "category_id": 12, + "cost": 4000, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 245, + "identifier": "expert-belt", + "category_id": 12, + "cost": 4000, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 246, + "identifier": "light-clay", + "category_id": 12, + "cost": 4000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 247, + "identifier": "life-orb", + "category_id": 12, + "cost": 4000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 248, + "identifier": "power-herb", + "category_id": 12, + "cost": 4000, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 249, + "identifier": "toxic-orb", + "category_id": 15, + "cost": 4000, + "fling_power": 30, + "fling_effect_id": 1 + }, + { + "id": 250, + "identifier": "flame-orb", + "category_id": 15, + "cost": 4000, + "fling_power": 30, + "fling_effect_id": 2 + }, + { + "id": 251, + "identifier": "quick-powder", + "category_id": 18, + "cost": 1000, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 252, + "identifier": "focus-sash", + "category_id": 12, + "cost": 4000, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 253, + "identifier": "zoom-lens", + "category_id": 12, + "cost": 4000, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 254, + "identifier": "metronome", + "category_id": 12, + "cost": 4000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 255, + "identifier": "iron-ball", + "category_id": 15, + "cost": 4000, + "fling_power": 130, + "fling_effect_id": "" + }, + { + "id": 256, + "identifier": "lagging-tail", + "category_id": 15, + "cost": 4000, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 257, + "identifier": "destiny-knot", + "category_id": 12, + "cost": 4000, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 258, + "identifier": "black-sludge", + "category_id": 12, + "cost": 4000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 259, + "identifier": "icy-rock", + "category_id": 12, + "cost": 4000, + "fling_power": 40, + "fling_effect_id": "" + }, + { + "id": 260, + "identifier": "smooth-rock", + "category_id": 12, + "cost": 4000, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 261, + "identifier": "heat-rock", + "category_id": 12, + "cost": 4000, + "fling_power": 60, + "fling_effect_id": "" + }, + { + "id": 262, + "identifier": "damp-rock", + "category_id": 12, + "cost": 4000, + "fling_power": 60, + "fling_effect_id": "" + }, + { + "id": 263, + "identifier": "grip-claw", + "category_id": 12, + "cost": 4000, + "fling_power": 90, + "fling_effect_id": "" + }, + { + "id": 264, + "identifier": "choice-scarf", + "category_id": 13, + "cost": 4000, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 265, + "identifier": "sticky-barb", + "category_id": 15, + "cost": 4000, + "fling_power": 80, + "fling_effect_id": "" + }, + { + "id": 266, + "identifier": "power-bracer", + "category_id": 14, + "cost": 3000, + "fling_power": 70, + "fling_effect_id": "" + }, + { + "id": 267, + "identifier": "power-belt", + "category_id": 14, + "cost": 3000, + "fling_power": 70, + "fling_effect_id": "" + }, + { + "id": 268, + "identifier": "power-lens", + "category_id": 14, + "cost": 3000, + "fling_power": 70, + "fling_effect_id": "" + }, + { + "id": 269, + "identifier": "power-band", + "category_id": 14, + "cost": 3000, + "fling_power": 70, + "fling_effect_id": "" + }, + { + "id": 270, + "identifier": "power-anklet", + "category_id": 14, + "cost": 3000, + "fling_power": 70, + "fling_effect_id": "" + }, + { + "id": 271, + "identifier": "power-weight", + "category_id": 14, + "cost": 3000, + "fling_power": 70, + "fling_effect_id": "" + }, + { + "id": 272, + "identifier": "shed-shell", + "category_id": 12, + "cost": 4000, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 273, + "identifier": "big-root", + "category_id": 12, + "cost": 4000, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 274, + "identifier": "choice-specs", + "category_id": 13, + "cost": 4000, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 275, + "identifier": "flame-plate", + "category_id": 17, + "cost": 1000, + "fling_power": 90, + "fling_effect_id": "" + }, + { + "id": 276, + "identifier": "splash-plate", + "category_id": 17, + "cost": 1000, + "fling_power": 90, + "fling_effect_id": "" + }, + { + "id": 277, + "identifier": "zap-plate", + "category_id": 17, + "cost": 1000, + "fling_power": 90, + "fling_effect_id": "" + }, + { + "id": 278, + "identifier": "meadow-plate", + "category_id": 17, + "cost": 1000, + "fling_power": 90, + "fling_effect_id": "" + }, + { + "id": 279, + "identifier": "icicle-plate", + "category_id": 17, + "cost": 1000, + "fling_power": 90, + "fling_effect_id": "" + }, + { + "id": 280, + "identifier": "fist-plate", + "category_id": 17, + "cost": 1000, + "fling_power": 90, + "fling_effect_id": "" + }, + { + "id": 281, + "identifier": "toxic-plate", + "category_id": 17, + "cost": 1000, + "fling_power": 90, + "fling_effect_id": "" + }, + { + "id": 282, + "identifier": "earth-plate", + "category_id": 17, + "cost": 1000, + "fling_power": 90, + "fling_effect_id": "" + }, + { + "id": 283, + "identifier": "sky-plate", + "category_id": 17, + "cost": 1000, + "fling_power": 90, + "fling_effect_id": "" + }, + { + "id": 284, + "identifier": "mind-plate", + "category_id": 17, + "cost": 1000, + "fling_power": 90, + "fling_effect_id": "" + }, + { + "id": 285, + "identifier": "insect-plate", + "category_id": 17, + "cost": 1000, + "fling_power": 90, + "fling_effect_id": "" + }, + { + "id": 286, + "identifier": "stone-plate", + "category_id": 17, + "cost": 1000, + "fling_power": 90, + "fling_effect_id": "" + }, + { + "id": 287, + "identifier": "spooky-plate", + "category_id": 17, + "cost": 1000, + "fling_power": 90, + "fling_effect_id": "" + }, + { + "id": 288, + "identifier": "draco-plate", + "category_id": 17, + "cost": 1000, + "fling_power": 90, + "fling_effect_id": "" + }, + { + "id": 289, + "identifier": "dread-plate", + "category_id": 17, + "cost": 1000, + "fling_power": 90, + "fling_effect_id": "" + }, + { + "id": 290, + "identifier": "iron-plate", + "category_id": 17, + "cost": 1000, + "fling_power": 90, + "fling_effect_id": "" + }, + { + "id": 291, + "identifier": "odd-incense", + "category_id": 19, + "cost": 2000, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 292, + "identifier": "rock-incense", + "category_id": 19, + "cost": 2000, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 293, + "identifier": "full-incense", + "category_id": 15, + "cost": 5000, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 294, + "identifier": "wave-incense", + "category_id": 19, + "cost": 2000, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 295, + "identifier": "rose-incense", + "category_id": 19, + "cost": 2000, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 296, + "identifier": "luck-incense", + "category_id": 16, + "cost": 11000, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 297, + "identifier": "pure-incense", + "category_id": 16, + "cost": 6000, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 298, + "identifier": "protector", + "category_id": 10, + "cost": 2000, + "fling_power": 80, + "fling_effect_id": "" + }, + { + "id": 299, + "identifier": "electirizer", + "category_id": 10, + "cost": 2000, + "fling_power": 80, + "fling_effect_id": "" + }, + { + "id": 300, + "identifier": "magmarizer", + "category_id": 10, + "cost": 2000, + "fling_power": 80, + "fling_effect_id": "" + }, + { + "id": 301, + "identifier": "dubious-disc", + "category_id": 10, + "cost": 2000, + "fling_power": 50, + "fling_effect_id": "" + }, + { + "id": 302, + "identifier": "reaper-cloth", + "category_id": 10, + "cost": 2000, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 303, + "identifier": "razor-claw", + "category_id": 12, + "cost": 5000, + "fling_power": 80, + "fling_effect_id": "" + }, + { + "id": 304, + "identifier": "razor-fang", + "category_id": 12, + "cost": 5000, + "fling_power": 30, + "fling_effect_id": 7 + }, + { + "id": 305, + "identifier": "tm01", + "category_id": 37, + "cost": 10000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 306, + "identifier": "tm02", + "category_id": 37, + "cost": 10000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 307, + "identifier": "tm03", + "category_id": 37, + "cost": 10000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 308, + "identifier": "tm04", + "category_id": 37, + "cost": 10000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 309, + "identifier": "tm05", + "category_id": 37, + "cost": 10000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 310, + "identifier": "tm06", + "category_id": 37, + "cost": 10000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 311, + "identifier": "tm07", + "category_id": 37, + "cost": 50000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 312, + "identifier": "tm08", + "category_id": 37, + "cost": 10000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 313, + "identifier": "tm09", + "category_id": 37, + "cost": 10000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 314, + "identifier": "tm10", + "category_id": 37, + "cost": 10000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 315, + "identifier": "tm11", + "category_id": 37, + "cost": 50000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 316, + "identifier": "tm12", + "category_id": 37, + "cost": 10000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 317, + "identifier": "tm13", + "category_id": 37, + "cost": 10000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 318, + "identifier": "tm14", + "category_id": 37, + "cost": 30000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 319, + "identifier": "tm15", + "category_id": 37, + "cost": 50000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 320, + "identifier": "tm16", + "category_id": 37, + "cost": 10000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 321, + "identifier": "tm17", + "category_id": 37, + "cost": 10000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 322, + "identifier": "tm18", + "category_id": 37, + "cost": 50000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 323, + "identifier": "tm19", + "category_id": 37, + "cost": 10000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 324, + "identifier": "tm20", + "category_id": 37, + "cost": 10000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 325, + "identifier": "tm21", + "category_id": 37, + "cost": 10000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 326, + "identifier": "tm22", + "category_id": 37, + "cost": 10000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 327, + "identifier": "tm23", + "category_id": 37, + "cost": 10000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 328, + "identifier": "tm24", + "category_id": 37, + "cost": 10000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 329, + "identifier": "tm25", + "category_id": 37, + "cost": 30000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 330, + "identifier": "tm26", + "category_id": 37, + "cost": 10000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 331, + "identifier": "tm27", + "category_id": 37, + "cost": 10000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 332, + "identifier": "tm28", + "category_id": 37, + "cost": 30000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 333, + "identifier": "tm29", + "category_id": 37, + "cost": 10000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 334, + "identifier": "tm30", + "category_id": 37, + "cost": 10000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 335, + "identifier": "tm31", + "category_id": 37, + "cost": 10000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 336, + "identifier": "tm32", + "category_id": 37, + "cost": 10000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 337, + "identifier": "tm33", + "category_id": 37, + "cost": 10000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 338, + "identifier": "tm34", + "category_id": 37, + "cost": 10000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 339, + "identifier": "tm35", + "category_id": 37, + "cost": 10000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 340, + "identifier": "tm36", + "category_id": 37, + "cost": 10000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 341, + "identifier": "tm37", + "category_id": 37, + "cost": 50000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 342, + "identifier": "tm38", + "category_id": 37, + "cost": 30000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 343, + "identifier": "tm39", + "category_id": 37, + "cost": 10000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 344, + "identifier": "tm40", + "category_id": 37, + "cost": 10000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 345, + "identifier": "tm41", + "category_id": 37, + "cost": 10000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 346, + "identifier": "tm42", + "category_id": 37, + "cost": 10000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 347, + "identifier": "tm43", + "category_id": 37, + "cost": 10000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 348, + "identifier": "tm44", + "category_id": 37, + "cost": 10000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 349, + "identifier": "tm45", + "category_id": 37, + "cost": 10000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 350, + "identifier": "tm46", + "category_id": 37, + "cost": 10000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 351, + "identifier": "tm47", + "category_id": 37, + "cost": 10000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 352, + "identifier": "tm48", + "category_id": 37, + "cost": 10000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 353, + "identifier": "tm49", + "category_id": 37, + "cost": 10000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 354, + "identifier": "tm50", + "category_id": 37, + "cost": 80000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 355, + "identifier": "tm51", + "category_id": 37, + "cost": 10000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 356, + "identifier": "tm52", + "category_id": 37, + "cost": 30000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 357, + "identifier": "tm53", + "category_id": 37, + "cost": 10000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 358, + "identifier": "tm54", + "category_id": 37, + "cost": 10000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 359, + "identifier": "tm55", + "category_id": 37, + "cost": 10000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 360, + "identifier": "tm56", + "category_id": 37, + "cost": 10000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 361, + "identifier": "tm57", + "category_id": 37, + "cost": 10000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 362, + "identifier": "tm58", + "category_id": 37, + "cost": 10000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 363, + "identifier": "tm59", + "category_id": 37, + "cost": 30000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 364, + "identifier": "tm60", + "category_id": 37, + "cost": 10000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 365, + "identifier": "tm61", + "category_id": 37, + "cost": 10000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 366, + "identifier": "tm62", + "category_id": 37, + "cost": 10000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 367, + "identifier": "tm63", + "category_id": 37, + "cost": 10000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 368, + "identifier": "tm64", + "category_id": 37, + "cost": 10000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 369, + "identifier": "tm65", + "category_id": 37, + "cost": 10000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 370, + "identifier": "tm66", + "category_id": 37, + "cost": 10000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 371, + "identifier": "tm67", + "category_id": 37, + "cost": 10000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 372, + "identifier": "tm68", + "category_id": 37, + "cost": 50000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 373, + "identifier": "tm69", + "category_id": 37, + "cost": 10000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 374, + "identifier": "tm70", + "category_id": 37, + "cost": 30000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 375, + "identifier": "tm71", + "category_id": 37, + "cost": 30000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 376, + "identifier": "tm72", + "category_id": 37, + "cost": 10000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 377, + "identifier": "tm73", + "category_id": 37, + "cost": 5000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 378, + "identifier": "tm74", + "category_id": 37, + "cost": 10000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 379, + "identifier": "tm75", + "category_id": 37, + "cost": 10000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 380, + "identifier": "tm76", + "category_id": 37, + "cost": 10000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 381, + "identifier": "tm77", + "category_id": 37, + "cost": 10000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 382, + "identifier": "tm78", + "category_id": 37, + "cost": 10000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 383, + "identifier": "tm79", + "category_id": 37, + "cost": 10000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 384, + "identifier": "tm80", + "category_id": 37, + "cost": 10000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 385, + "identifier": "tm81", + "category_id": 37, + "cost": 10000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 386, + "identifier": "tm82", + "category_id": 37, + "cost": 10000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 387, + "identifier": "tm83", + "category_id": 37, + "cost": 10000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 388, + "identifier": "tm84", + "category_id": 37, + "cost": 10000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 389, + "identifier": "tm85", + "category_id": 37, + "cost": 10000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 390, + "identifier": "tm86", + "category_id": 37, + "cost": 10000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 391, + "identifier": "tm87", + "category_id": 37, + "cost": 10000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 392, + "identifier": "tm88", + "category_id": 37, + "cost": 10000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 393, + "identifier": "tm89", + "category_id": 37, + "cost": 10000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 394, + "identifier": "tm90", + "category_id": 37, + "cost": 10000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 395, + "identifier": "tm91", + "category_id": 37, + "cost": 10000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 396, + "identifier": "tm92", + "category_id": 37, + "cost": 10000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 397, + "identifier": "hm01", + "category_id": 37, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 398, + "identifier": "hm02", + "category_id": 37, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 399, + "identifier": "hm03", + "category_id": 37, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 400, + "identifier": "hm04", + "category_id": 37, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 401, + "identifier": "hm05", + "category_id": 37, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 402, + "identifier": "hm06", + "category_id": 37, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 403, + "identifier": "hm07", + "category_id": 37, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 404, + "identifier": "hm08", + "category_id": 37, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 405, + "identifier": "explorer-kit", + "category_id": 21, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 406, + "identifier": "loot-sack", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 407, + "identifier": "rule-book", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 408, + "identifier": "poke-radar", + "category_id": 21, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 409, + "identifier": "point-card", + "category_id": 21, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 410, + "identifier": "journal", + "category_id": 21, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 411, + "identifier": "seal-case", + "category_id": 21, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 412, + "identifier": "fashion-case", + "category_id": 21, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 413, + "identifier": "seal-bag", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 414, + "identifier": "pal-pad", + "category_id": 21, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 415, + "identifier": "works-key", + "category_id": 22, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 416, + "identifier": "old-charm", + "category_id": 22, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 417, + "identifier": "galactic-key", + "category_id": 22, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 418, + "identifier": "red-chain", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 419, + "identifier": "town-map", + "category_id": 21, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 420, + "identifier": "vs-seeker", + "category_id": 21, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 421, + "identifier": "coin-case", + "category_id": 21, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 422, + "identifier": "old-rod", + "category_id": 21, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 423, + "identifier": "good-rod", + "category_id": 21, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 424, + "identifier": "super-rod", + "category_id": 21, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 425, + "identifier": "sprayduck", + "category_id": 21, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 426, + "identifier": "poffin-case", + "category_id": 21, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 427, + "identifier": "bicycle", + "category_id": 21, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 428, + "identifier": "suite-key", + "category_id": 20, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 429, + "identifier": "oaks-letter", + "category_id": 20, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 430, + "identifier": "lunar-wing", + "category_id": 20, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 431, + "identifier": "member-card", + "category_id": 20, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 432, + "identifier": "azure-flute", + "category_id": 20, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 433, + "identifier": "ss-ticket", + "category_id": 22, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 434, + "identifier": "contest-pass", + "category_id": 21, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 435, + "identifier": "magma-stone", + "category_id": 22, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 436, + "identifier": "parcel", + "category_id": 22, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 437, + "identifier": "coupon-1", + "category_id": 22, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 438, + "identifier": "coupon-2", + "category_id": 22, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 439, + "identifier": "coupon-3", + "category_id": 22, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 440, + "identifier": "storage-key", + "category_id": 22, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 441, + "identifier": "secret-potion", + "category_id": 22, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 442, + "identifier": "griseous-orb", + "category_id": 18, + "cost": 0, + "fling_power": 60, + "fling_effect_id": "" + }, + { + "id": 443, + "identifier": "vs-recorder", + "category_id": 21, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 444, + "identifier": "gracidea", + "category_id": 20, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 445, + "identifier": "secret-key", + "category_id": 20, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 446, + "identifier": "apricorn-box", + "category_id": 21, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 447, + "identifier": "berry-pots", + "category_id": 21, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 448, + "identifier": "squirt-bottle", + "category_id": 22, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 449, + "identifier": "lure-ball", + "category_id": 39, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 450, + "identifier": "level-ball", + "category_id": 39, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 451, + "identifier": "moon-ball", + "category_id": 39, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 452, + "identifier": "heavy-ball", + "category_id": 39, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 453, + "identifier": "fast-ball", + "category_id": 39, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 454, + "identifier": "friend-ball", + "category_id": 39, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 455, + "identifier": "love-ball", + "category_id": 39, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 456, + "identifier": "park-ball", + "category_id": 34, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 457, + "identifier": "sport-ball", + "category_id": 34, + "cost": 300, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 458, + "identifier": "red-apricorn", + "category_id": 40, + "cost": 20, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 459, + "identifier": "blue-apricorn", + "category_id": 40, + "cost": 20, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 460, + "identifier": "yellow-apricorn", + "category_id": 40, + "cost": 20, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 461, + "identifier": "green-apricorn", + "category_id": 40, + "cost": 20, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 462, + "identifier": "pink-apricorn", + "category_id": 40, + "cost": 20, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 463, + "identifier": "white-apricorn", + "category_id": 40, + "cost": 20, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 464, + "identifier": "black-apricorn", + "category_id": 40, + "cost": 20, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 465, + "identifier": "dowsing-machine", + "category_id": 21, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 466, + "identifier": "rage-candy-bar", + "category_id": 21, + "cost": 350, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 467, + "identifier": "red-orb", + "category_id": 22, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 468, + "identifier": "blue-orb", + "category_id": 22, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 469, + "identifier": "jade-orb", + "category_id": 22, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 470, + "identifier": "enigma-stone", + "category_id": 20, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 471, + "identifier": "unown-report", + "category_id": 21, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 472, + "identifier": "blue-card", + "category_id": 21, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 473, + "identifier": "slowpoke-tail", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 474, + "identifier": "clear-bell", + "category_id": 22, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 475, + "identifier": "card-key", + "category_id": 22, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 476, + "identifier": "basement-key", + "category_id": 22, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 477, + "identifier": "red-scale", + "category_id": 22, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 478, + "identifier": "lost-item", + "category_id": 22, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 479, + "identifier": "pass", + "category_id": 22, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 480, + "identifier": "machine-part", + "category_id": 22, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 481, + "identifier": "silver-wing", + "category_id": 22, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 482, + "identifier": "rainbow-wing", + "category_id": 22, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 483, + "identifier": "mystery-egg", + "category_id": 22, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 484, + "identifier": "gb-sounds", + "category_id": 21, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 485, + "identifier": "tidal-bell", + "category_id": 22, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 486, + "identifier": "data-card-01", + "category_id": 41, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 487, + "identifier": "data-card-02", + "category_id": 41, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 488, + "identifier": "data-card-03", + "category_id": 41, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 489, + "identifier": "data-card-04", + "category_id": 41, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 490, + "identifier": "data-card-05", + "category_id": 41, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 491, + "identifier": "data-card-06", + "category_id": 41, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 492, + "identifier": "data-card-07", + "category_id": 41, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 493, + "identifier": "data-card-08", + "category_id": 41, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 494, + "identifier": "data-card-09", + "category_id": 41, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 495, + "identifier": "data-card-10", + "category_id": 41, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 496, + "identifier": "data-card-11", + "category_id": 41, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 497, + "identifier": "data-card-12", + "category_id": 41, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 498, + "identifier": "data-card-13", + "category_id": 41, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 499, + "identifier": "data-card-14", + "category_id": 41, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 500, + "identifier": "data-card-15", + "category_id": 41, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 501, + "identifier": "data-card-16", + "category_id": 41, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 502, + "identifier": "data-card-17", + "category_id": 41, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 503, + "identifier": "data-card-18", + "category_id": 41, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 504, + "identifier": "data-card-19", + "category_id": 41, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 505, + "identifier": "data-card-20", + "category_id": 41, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 506, + "identifier": "data-card-21", + "category_id": 41, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 507, + "identifier": "data-card-22", + "category_id": 41, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 508, + "identifier": "data-card-23", + "category_id": 41, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 509, + "identifier": "data-card-24", + "category_id": 41, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 510, + "identifier": "data-card-25", + "category_id": 41, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 511, + "identifier": "data-card-26", + "category_id": 41, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 512, + "identifier": "data-card-27", + "category_id": 41, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 513, + "identifier": "lock-capsule", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 514, + "identifier": "photo-album", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 515, + "identifier": "orange-mail", + "category_id": 25, + "cost": 50, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 516, + "identifier": "harbor-mail", + "category_id": 25, + "cost": 50, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 517, + "identifier": "glitter-mail", + "category_id": 25, + "cost": 50, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 518, + "identifier": "mech-mail", + "category_id": 25, + "cost": 50, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 519, + "identifier": "wood-mail", + "category_id": 25, + "cost": 50, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 520, + "identifier": "wave-mail", + "category_id": 25, + "cost": 50, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 521, + "identifier": "bead-mail", + "category_id": 25, + "cost": 50, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 522, + "identifier": "shadow-mail", + "category_id": 25, + "cost": 50, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 523, + "identifier": "tropic-mail", + "category_id": 25, + "cost": 50, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 524, + "identifier": "dream-mail", + "category_id": 25, + "cost": 50, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 525, + "identifier": "fab-mail", + "category_id": 25, + "cost": 50, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 526, + "identifier": "retro-mail", + "category_id": 25, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 527, + "identifier": "mach-bike", + "category_id": 21, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 528, + "identifier": "acro-bike", + "category_id": 21, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 529, + "identifier": "wailmer-pail", + "category_id": 21, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 530, + "identifier": "devon-goods", + "category_id": 22, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 531, + "identifier": "soot-sack", + "category_id": 21, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 532, + "identifier": "pokeblock-case", + "category_id": 21, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 533, + "identifier": "letter", + "category_id": 22, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 534, + "identifier": "eon-ticket", + "category_id": 20, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 535, + "identifier": "scanner", + "category_id": 22, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 536, + "identifier": "go-goggles", + "category_id": 21, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 537, + "identifier": "meteorite", + "category_id": 22, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 538, + "identifier": "rm-1-key", + "category_id": 22, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 539, + "identifier": "rm-2-key", + "category_id": 22, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 540, + "identifier": "rm-4-key", + "category_id": 22, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 541, + "identifier": "rm-6-key", + "category_id": 22, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 542, + "identifier": "devon-scope", + "category_id": 21, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 543, + "identifier": "oaks-parcel", + "category_id": 22, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 544, + "identifier": "poke-flute", + "category_id": 22, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 545, + "identifier": "bike-voucher", + "category_id": 22, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 546, + "identifier": "gold-teeth", + "category_id": 22, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 547, + "identifier": "lift-key", + "category_id": 22, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 548, + "identifier": "silph-scope", + "category_id": 22, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 549, + "identifier": "fame-checker", + "category_id": 21, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 550, + "identifier": "tm-case", + "category_id": 21, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 551, + "identifier": "berry-pouch", + "category_id": 21, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 552, + "identifier": "teachy-tv", + "category_id": 21, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 553, + "identifier": "tri-pass", + "category_id": 22, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 554, + "identifier": "rainbow-pass", + "category_id": 22, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 555, + "identifier": "tea", + "category_id": 22, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 556, + "identifier": "mysticticket", + "category_id": 20, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 557, + "identifier": "auroraticket", + "category_id": 20, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 558, + "identifier": "powder-jar", + "category_id": 21, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 559, + "identifier": "ruby", + "category_id": 22, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 560, + "identifier": "sapphire", + "category_id": 22, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 561, + "identifier": "magma-emblem", + "category_id": 22, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 562, + "identifier": "old-sea-map", + "category_id": 20, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 563, + "identifier": "douse-drive", + "category_id": 18, + "cost": 0, + "fling_power": 70, + "fling_effect_id": "" + }, + { + "id": 564, + "identifier": "shock-drive", + "category_id": 18, + "cost": 0, + "fling_power": 70, + "fling_effect_id": "" + }, + { + "id": 565, + "identifier": "burn-drive", + "category_id": 18, + "cost": 0, + "fling_power": 70, + "fling_effect_id": "" + }, + { + "id": 566, + "identifier": "chill-drive", + "category_id": 18, + "cost": 0, + "fling_power": 70, + "fling_effect_id": "" + }, + { + "id": 567, + "identifier": "sweet-heart", + "category_id": 27, + "cost": 3000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 568, + "identifier": "greet-mail", + "category_id": 25, + "cost": 50, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 569, + "identifier": "favored-mail", + "category_id": 25, + "cost": 50, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 570, + "identifier": "rsvp-mail", + "category_id": 25, + "cost": 50, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 571, + "identifier": "thanks-mail", + "category_id": 25, + "cost": 50, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 572, + "identifier": "inquiry-mail", + "category_id": 25, + "cost": 50, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 573, + "identifier": "like-mail", + "category_id": 25, + "cost": 50, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 574, + "identifier": "reply-mail", + "category_id": 25, + "cost": 50, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 575, + "identifier": "bridge-mail-s", + "category_id": 25, + "cost": 50, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 576, + "identifier": "bridge-mail-d", + "category_id": 25, + "cost": 50, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 577, + "identifier": "bridge-mail-t", + "category_id": 25, + "cost": 50, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 578, + "identifier": "bridge-mail-v", + "category_id": 25, + "cost": 50, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 579, + "identifier": "bridge-mail-m", + "category_id": 25, + "cost": 50, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 580, + "identifier": "prism-scale", + "category_id": 10, + "cost": 2000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 581, + "identifier": "eviolite", + "category_id": 12, + "cost": 4000, + "fling_power": 40, + "fling_effect_id": "" + }, + { + "id": 582, + "identifier": "float-stone", + "category_id": 12, + "cost": 4000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 583, + "identifier": "rocky-helmet", + "category_id": 12, + "cost": 4000, + "fling_power": 60, + "fling_effect_id": "" + }, + { + "id": 584, + "identifier": "air-balloon", + "category_id": 12, + "cost": 4000, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 585, + "identifier": "red-card", + "category_id": 12, + "cost": 4000, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 586, + "identifier": "ring-target", + "category_id": 12, + "cost": 4000, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 587, + "identifier": "binding-band", + "category_id": 12, + "cost": 4000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 588, + "identifier": "absorb-bulb", + "category_id": 12, + "cost": 4000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 589, + "identifier": "cell-battery", + "category_id": 12, + "cost": 4000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 590, + "identifier": "eject-button", + "category_id": 12, + "cost": 4000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 591, + "identifier": "fire-gem", + "category_id": 42, + "cost": 200, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 592, + "identifier": "water-gem", + "category_id": 42, + "cost": 200, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 593, + "identifier": "electric-gem", + "category_id": 42, + "cost": 200, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 594, + "identifier": "grass-gem", + "category_id": 42, + "cost": 200, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 595, + "identifier": "ice-gem", + "category_id": 42, + "cost": 200, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 596, + "identifier": "fighting-gem", + "category_id": 42, + "cost": 200, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 597, + "identifier": "poison-gem", + "category_id": 42, + "cost": 200, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 598, + "identifier": "ground-gem", + "category_id": 42, + "cost": 200, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 599, + "identifier": "flying-gem", + "category_id": 42, + "cost": 200, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 600, + "identifier": "psychic-gem", + "category_id": 42, + "cost": 200, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 601, + "identifier": "bug-gem", + "category_id": 42, + "cost": 200, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 602, + "identifier": "rock-gem", + "category_id": 42, + "cost": 200, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 603, + "identifier": "ghost-gem", + "category_id": 42, + "cost": 200, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 604, + "identifier": "dark-gem", + "category_id": 42, + "cost": 200, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 605, + "identifier": "steel-gem", + "category_id": 42, + "cost": 200, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 606, + "identifier": "health-wing", + "category_id": 26, + "cost": 300, + "fling_power": 20, + "fling_effect_id": "" + }, + { + "id": 607, + "identifier": "muscle-wing", + "category_id": 26, + "cost": 300, + "fling_power": 20, + "fling_effect_id": "" + }, + { + "id": 608, + "identifier": "resist-wing", + "category_id": 26, + "cost": 300, + "fling_power": 20, + "fling_effect_id": "" + }, + { + "id": 609, + "identifier": "genius-wing", + "category_id": 26, + "cost": 300, + "fling_power": 20, + "fling_effect_id": "" + }, + { + "id": 610, + "identifier": "clever-wing", + "category_id": 26, + "cost": 300, + "fling_power": 20, + "fling_effect_id": "" + }, + { + "id": 611, + "identifier": "swift-wing", + "category_id": 26, + "cost": 300, + "fling_power": 20, + "fling_effect_id": "" + }, + { + "id": 612, + "identifier": "pretty-wing", + "category_id": 24, + "cost": 1000, + "fling_power": 20, + "fling_effect_id": "" + }, + { + "id": 613, + "identifier": "cover-fossil", + "category_id": 35, + "cost": 7000, + "fling_power": 100, + "fling_effect_id": "" + }, + { + "id": 614, + "identifier": "plume-fossil", + "category_id": 35, + "cost": 7000, + "fling_power": 100, + "fling_effect_id": "" + }, + { + "id": 615, + "identifier": "liberty-pass", + "category_id": 20, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 616, + "identifier": "pass-orb", + "category_id": 12, + "cost": 200, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 617, + "identifier": "dream-ball", + "category_id": 33, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 618, + "identifier": "poke-toy", + "category_id": 11, + "cost": 100, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 619, + "identifier": "prop-case", + "category_id": 21, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 620, + "identifier": "dragon-skull", + "category_id": 22, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 621, + "identifier": "balm-mushroom", + "category_id": 24, + "cost": 15000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 622, + "identifier": "big-nugget", + "category_id": 24, + "cost": 40000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 623, + "identifier": "pearl-string", + "category_id": 24, + "cost": 30000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 624, + "identifier": "comet-shard", + "category_id": 24, + "cost": 60000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 625, + "identifier": "relic-copper", + "category_id": 24, + "cost": 0, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 626, + "identifier": "relic-silver", + "category_id": 24, + "cost": 0, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 627, + "identifier": "relic-gold", + "category_id": 24, + "cost": 60000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 628, + "identifier": "relic-vase", + "category_id": 24, + "cost": 0, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 629, + "identifier": "relic-band", + "category_id": 24, + "cost": 0, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 630, + "identifier": "relic-statue", + "category_id": 24, + "cost": 0, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 631, + "identifier": "relic-crown", + "category_id": 24, + "cost": 0, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 632, + "identifier": "casteliacone", + "category_id": 30, + "cost": 350, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 633, + "identifier": "dire-hit-2", + "category_id": 43, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 634, + "identifier": "x-speed-2", + "category_id": 43, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 635, + "identifier": "x-sp-atk-2", + "category_id": 43, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 636, + "identifier": "x-sp-def-2", + "category_id": 43, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 637, + "identifier": "x-defense-2", + "category_id": 43, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 638, + "identifier": "x-attack-2", + "category_id": 43, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 639, + "identifier": "x-accuracy-2", + "category_id": 43, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 640, + "identifier": "x-speed-3", + "category_id": 43, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 641, + "identifier": "x-sp-atk-3", + "category_id": 43, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 642, + "identifier": "x-sp-def-3", + "category_id": 43, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 643, + "identifier": "x-defense-3", + "category_id": 43, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 644, + "identifier": "x-attack-3", + "category_id": 43, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 645, + "identifier": "x-accuracy-3", + "category_id": 43, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 646, + "identifier": "x-speed-6", + "category_id": 43, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 647, + "identifier": "x-sp-atk-6", + "category_id": 43, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 648, + "identifier": "x-sp-def-6", + "category_id": 43, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 649, + "identifier": "x-defense-6", + "category_id": 43, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 650, + "identifier": "x-attack-6", + "category_id": 43, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 651, + "identifier": "x-accuracy-6", + "category_id": 43, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 652, + "identifier": "ability-urge", + "category_id": 43, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 653, + "identifier": "item-drop", + "category_id": 43, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 654, + "identifier": "item-urge", + "category_id": 43, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 655, + "identifier": "reset-urge", + "category_id": 43, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 656, + "identifier": "dire-hit-3", + "category_id": 43, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 657, + "identifier": "light-stone", + "category_id": 22, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 658, + "identifier": "dark-stone", + "category_id": 22, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 659, + "identifier": "tm93", + "category_id": 37, + "cost": 50000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 660, + "identifier": "tm94", + "category_id": 37, + "cost": 30000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 661, + "identifier": "tm95", + "category_id": 37, + "cost": 10000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 662, + "identifier": "xtransceiver", + "category_id": 21, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 663, + "identifier": "god-stone", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 664, + "identifier": "gram-1", + "category_id": 22, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 665, + "identifier": "gram-2", + "category_id": 22, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 666, + "identifier": "gram-3", + "category_id": 22, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 668, + "identifier": "dragon-gem", + "category_id": 42, + "cost": 200, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 669, + "identifier": "normal-gem", + "category_id": 42, + "cost": 4000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 670, + "identifier": "medal-box", + "category_id": 21, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 671, + "identifier": "dna-splicers", + "category_id": 21, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 673, + "identifier": "permit", + "category_id": 21, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 674, + "identifier": "oval-charm", + "category_id": 21, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 675, + "identifier": "shiny-charm", + "category_id": 21, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 676, + "identifier": "plasma-card", + "category_id": 22, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 677, + "identifier": "grubby-hanky", + "category_id": 22, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 678, + "identifier": "colress-machine", + "category_id": 22, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 679, + "identifier": "dropped-item", + "category_id": 22, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 681, + "identifier": "reveal-glass", + "category_id": 21, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 682, + "identifier": "weakness-policy", + "category_id": 12, + "cost": 1000, + "fling_power": 80, + "fling_effect_id": "" + }, + { + "id": 683, + "identifier": "assault-vest", + "category_id": 12, + "cost": 1000, + "fling_power": 80, + "fling_effect_id": "" + }, + { + "id": 684, + "identifier": "pixie-plate", + "category_id": 17, + "cost": 1000, + "fling_power": 90, + "fling_effect_id": "" + }, + { + "id": 685, + "identifier": "ability-capsule", + "category_id": 26, + "cost": 10000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 686, + "identifier": "whipped-dream", + "category_id": 10, + "cost": 2000, + "fling_power": 80, + "fling_effect_id": "" + }, + { + "id": 687, + "identifier": "sachet", + "category_id": 10, + "cost": 2000, + "fling_power": 80, + "fling_effect_id": "" + }, + { + "id": 688, + "identifier": "luminous-moss", + "category_id": 12, + "cost": 4000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 689, + "identifier": "snowball", + "category_id": 12, + "cost": 4000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 690, + "identifier": "safety-goggles", + "category_id": 12, + "cost": 4000, + "fling_power": 80, + "fling_effect_id": "" + }, + { + "id": 691, + "identifier": "rich-mulch", + "category_id": 32, + "cost": 200, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 692, + "identifier": "surprise-mulch", + "category_id": 32, + "cost": 200, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 693, + "identifier": "boost-mulch", + "category_id": 32, + "cost": 200, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 694, + "identifier": "amaze-mulch", + "category_id": 32, + "cost": 200, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 695, + "identifier": "gengarite", + "category_id": 44, + "cost": 0, + "fling_power": 80, + "fling_effect_id": "" + }, + { + "id": 696, + "identifier": "gardevoirite", + "category_id": 44, + "cost": 0, + "fling_power": 80, + "fling_effect_id": "" + }, + { + "id": 697, + "identifier": "ampharosite", + "category_id": 44, + "cost": 0, + "fling_power": 80, + "fling_effect_id": "" + }, + { + "id": 698, + "identifier": "venusaurite", + "category_id": 44, + "cost": 0, + "fling_power": 80, + "fling_effect_id": "" + }, + { + "id": 699, + "identifier": "charizardite-x", + "category_id": 44, + "cost": 0, + "fling_power": 80, + "fling_effect_id": "" + }, + { + "id": 700, + "identifier": "blastoisinite", + "category_id": 44, + "cost": 0, + "fling_power": 80, + "fling_effect_id": "" + }, + { + "id": 701, + "identifier": "mewtwonite-x", + "category_id": 44, + "cost": 0, + "fling_power": 80, + "fling_effect_id": "" + }, + { + "id": 702, + "identifier": "mewtwonite-y", + "category_id": 44, + "cost": 0, + "fling_power": 80, + "fling_effect_id": "" + }, + { + "id": 703, + "identifier": "blazikenite", + "category_id": 44, + "cost": 0, + "fling_power": 80, + "fling_effect_id": "" + }, + { + "id": 704, + "identifier": "medichamite", + "category_id": 44, + "cost": 0, + "fling_power": 80, + "fling_effect_id": "" + }, + { + "id": 705, + "identifier": "houndoominite", + "category_id": 44, + "cost": 0, + "fling_power": 80, + "fling_effect_id": "" + }, + { + "id": 706, + "identifier": "aggronite", + "category_id": 44, + "cost": 0, + "fling_power": 80, + "fling_effect_id": "" + }, + { + "id": 707, + "identifier": "banettite", + "category_id": 44, + "cost": 0, + "fling_power": 80, + "fling_effect_id": "" + }, + { + "id": 708, + "identifier": "tyranitarite", + "category_id": 44, + "cost": 0, + "fling_power": 80, + "fling_effect_id": "" + }, + { + "id": 709, + "identifier": "scizorite", + "category_id": 44, + "cost": 0, + "fling_power": 80, + "fling_effect_id": "" + }, + { + "id": 710, + "identifier": "pinsirite", + "category_id": 44, + "cost": 0, + "fling_power": 80, + "fling_effect_id": "" + }, + { + "id": 711, + "identifier": "aerodactylite", + "category_id": 44, + "cost": 0, + "fling_power": 80, + "fling_effect_id": "" + }, + { + "id": 712, + "identifier": "lucarionite", + "category_id": 44, + "cost": 0, + "fling_power": 80, + "fling_effect_id": "" + }, + { + "id": 713, + "identifier": "abomasite", + "category_id": 44, + "cost": 0, + "fling_power": 80, + "fling_effect_id": "" + }, + { + "id": 714, + "identifier": "kangaskhanite", + "category_id": 44, + "cost": 0, + "fling_power": 80, + "fling_effect_id": "" + }, + { + "id": 715, + "identifier": "gyaradosite", + "category_id": 44, + "cost": 0, + "fling_power": 80, + "fling_effect_id": "" + }, + { + "id": 716, + "identifier": "absolite", + "category_id": 44, + "cost": 0, + "fling_power": 80, + "fling_effect_id": "" + }, + { + "id": 717, + "identifier": "charizardite-y", + "category_id": 44, + "cost": 0, + "fling_power": 80, + "fling_effect_id": "" + }, + { + "id": 718, + "identifier": "alakazite", + "category_id": 44, + "cost": 0, + "fling_power": 80, + "fling_effect_id": "" + }, + { + "id": 719, + "identifier": "heracronite", + "category_id": 44, + "cost": 0, + "fling_power": 80, + "fling_effect_id": "" + }, + { + "id": 720, + "identifier": "mawilite", + "category_id": 44, + "cost": 0, + "fling_power": 80, + "fling_effect_id": "" + }, + { + "id": 721, + "identifier": "manectite", + "category_id": 44, + "cost": 0, + "fling_power": 80, + "fling_effect_id": "" + }, + { + "id": 722, + "identifier": "garchompite", + "category_id": 44, + "cost": 0, + "fling_power": 80, + "fling_effect_id": "" + }, + { + "id": 723, + "identifier": "roseli-berry", + "category_id": 7, + "cost": 20, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 724, + "identifier": "kee-berry", + "category_id": 4, + "cost": 20, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 725, + "identifier": "maranga-berry", + "category_id": 4, + "cost": 20, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 726, + "identifier": "discount-coupon", + "category_id": 24, + "cost": 20, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 727, + "identifier": "strange-souvenir", + "category_id": 24, + "cost": 3000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 728, + "identifier": "lumiose-galette", + "category_id": 30, + "cost": 350, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 729, + "identifier": "jaw-fossil", + "category_id": 35, + "cost": 7000, + "fling_power": 100, + "fling_effect_id": "" + }, + { + "id": 730, + "identifier": "sail-fossil", + "category_id": 35, + "cost": 7000, + "fling_power": 100, + "fling_effect_id": "" + }, + { + "id": 731, + "identifier": "fairy-gem", + "category_id": 42, + "cost": 200, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 732, + "identifier": "adventure-rules", + "category_id": 21, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 733, + "identifier": "elevator-key", + "category_id": 22, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 734, + "identifier": "holo-caster", + "category_id": 21, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 735, + "identifier": "honor-of-kalos", + "category_id": 22, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 736, + "identifier": "intriguing-stone", + "category_id": 22, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 737, + "identifier": "lens-case", + "category_id": 21, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 738, + "identifier": "looker-ticket", + "category_id": 22, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 739, + "identifier": "mega-ring", + "category_id": 21, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 740, + "identifier": "power-plant-pass", + "category_id": 22, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 741, + "identifier": "profs-letter", + "category_id": 22, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 742, + "identifier": "roller-skates", + "category_id": 21, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 743, + "identifier": "sprinklotad", + "category_id": 21, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 744, + "identifier": "tmv-pass", + "category_id": 21, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 745, + "identifier": "tm96", + "category_id": 37, + "cost": 10000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 746, + "identifier": "tm97", + "category_id": 37, + "cost": 10000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 747, + "identifier": "tm98", + "category_id": 37, + "cost": 30000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 748, + "identifier": "tm99", + "category_id": 37, + "cost": 10000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 749, + "identifier": "tm100", + "category_id": 37, + "cost": 5000, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 760, + "identifier": "latiasite", + "category_id": 44, + "cost": 0, + "fling_power": 80, + "fling_effect_id": "" + }, + { + "id": 761, + "identifier": "latiosite", + "category_id": 44, + "cost": 0, + "fling_power": 80, + "fling_effect_id": "" + }, + { + "id": 762, + "identifier": "common-stone", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 763, + "identifier": "makeup-bag", + "category_id": 21, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 764, + "identifier": "travel-trunk", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 765, + "identifier": "shalour-sable", + "category_id": 30, + "cost": 350, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 768, + "identifier": "mega-charm", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 769, + "identifier": "mega-glove", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 770, + "identifier": "devon-parts", + "category_id": 22, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 772, + "identifier": "pokeblock-kit", + "category_id": 21, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 773, + "identifier": "key-to-room-1", + "category_id": 22, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 774, + "identifier": "key-to-room-2", + "category_id": 22, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 775, + "identifier": "key-to-room-4", + "category_id": 22, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 776, + "identifier": "key-to-room-6", + "category_id": 22, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 779, + "identifier": "devon-scuba-gear", + "category_id": 22, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 780, + "identifier": "contest-costume--jacket", + "category_id": 21, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 782, + "identifier": "magma-suit", + "category_id": 22, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 783, + "identifier": "aqua-suit", + "category_id": 22, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 784, + "identifier": "pair-of-tickets", + "category_id": 22, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 785, + "identifier": "mega-bracelet", + "category_id": 21, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 786, + "identifier": "mega-pendant", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 787, + "identifier": "mega-glasses", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 788, + "identifier": "mega-anchor", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 789, + "identifier": "mega-stickpin", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 790, + "identifier": "mega-tiara", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 791, + "identifier": "mega-anklet", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 793, + "identifier": "swampertite", + "category_id": 44, + "cost": 0, + "fling_power": 80, + "fling_effect_id": "" + }, + { + "id": 794, + "identifier": "sceptilite", + "category_id": 44, + "cost": 0, + "fling_power": 80, + "fling_effect_id": "" + }, + { + "id": 795, + "identifier": "sablenite", + "category_id": 44, + "cost": 0, + "fling_power": 80, + "fling_effect_id": "" + }, + { + "id": 796, + "identifier": "altarianite", + "category_id": 44, + "cost": 0, + "fling_power": 80, + "fling_effect_id": "" + }, + { + "id": 797, + "identifier": "galladite", + "category_id": 44, + "cost": 0, + "fling_power": 80, + "fling_effect_id": "" + }, + { + "id": 798, + "identifier": "audinite", + "category_id": 44, + "cost": 0, + "fling_power": 80, + "fling_effect_id": "" + }, + { + "id": 799, + "identifier": "metagrossite", + "category_id": 44, + "cost": 0, + "fling_power": 80, + "fling_effect_id": "" + }, + { + "id": 800, + "identifier": "sharpedonite", + "category_id": 44, + "cost": 0, + "fling_power": 80, + "fling_effect_id": "" + }, + { + "id": 801, + "identifier": "slowbronite", + "category_id": 44, + "cost": 0, + "fling_power": 80, + "fling_effect_id": "" + }, + { + "id": 802, + "identifier": "steelixite", + "category_id": 44, + "cost": 0, + "fling_power": 80, + "fling_effect_id": "" + }, + { + "id": 803, + "identifier": "pidgeotite", + "category_id": 44, + "cost": 0, + "fling_power": 80, + "fling_effect_id": "" + }, + { + "id": 804, + "identifier": "glalitite", + "category_id": 44, + "cost": 0, + "fling_power": 80, + "fling_effect_id": "" + }, + { + "id": 805, + "identifier": "diancite", + "category_id": 44, + "cost": 0, + "fling_power": 80, + "fling_effect_id": "" + }, + { + "id": 806, + "identifier": "prison-bottle", + "category_id": 21, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 807, + "identifier": "mega-cuff", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 808, + "identifier": "cameruptite", + "category_id": 44, + "cost": 0, + "fling_power": 80, + "fling_effect_id": "" + }, + { + "id": 809, + "identifier": "lopunnite", + "category_id": 44, + "cost": 0, + "fling_power": 80, + "fling_effect_id": "" + }, + { + "id": 810, + "identifier": "salamencite", + "category_id": 44, + "cost": 0, + "fling_power": 80, + "fling_effect_id": "" + }, + { + "id": 811, + "identifier": "beedrillite", + "category_id": 44, + "cost": 0, + "fling_power": 80, + "fling_effect_id": "" + }, + { + "id": 814, + "identifier": "key-stone", + "category_id": 21, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 815, + "identifier": "meteorite-shard", + "category_id": 22, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 816, + "identifier": "eon-flute", + "category_id": 21, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 817, + "identifier": "normalium-z--held", + "category_id": 46, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 818, + "identifier": "firium-z--held", + "category_id": 46, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 819, + "identifier": "waterium-z--held", + "category_id": 46, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 820, + "identifier": "electrium-z--held", + "category_id": 46, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 821, + "identifier": "grassium-z--held", + "category_id": 46, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 822, + "identifier": "icium-z--held", + "category_id": 46, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 823, + "identifier": "fightinium-z--held", + "category_id": 46, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 824, + "identifier": "poisonium-z--held", + "category_id": 46, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 825, + "identifier": "groundium-z--held", + "category_id": 46, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 826, + "identifier": "flyinium-z--held", + "category_id": 46, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 827, + "identifier": "psychium-z--held", + "category_id": 46, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 828, + "identifier": "buginium-z--held", + "category_id": 46, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 829, + "identifier": "rockium-z--held", + "category_id": 46, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 830, + "identifier": "ghostium-z--held", + "category_id": 46, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 831, + "identifier": "dragonium-z--held", + "category_id": 46, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 832, + "identifier": "darkinium-z--held", + "category_id": 46, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 833, + "identifier": "steelium-z--held", + "category_id": 46, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 834, + "identifier": "fairium-z--held", + "category_id": 46, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 835, + "identifier": "pikanium-z--held", + "category_id": 46, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 836, + "identifier": "bottle-cap", + "category_id": 24, + "cost": 5000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 837, + "identifier": "gold-bottle-cap", + "category_id": 24, + "cost": 10000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 838, + "identifier": "z-ring", + "category_id": 21, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 839, + "identifier": "decidium-z--held", + "category_id": 46, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 840, + "identifier": "incinium-z--held", + "category_id": 46, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 841, + "identifier": "primarium-z--held", + "category_id": 46, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 842, + "identifier": "tapunium-z--held", + "category_id": 46, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 843, + "identifier": "marshadium-z--held", + "category_id": 46, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 844, + "identifier": "aloraichium-z--held", + "category_id": 46, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 845, + "identifier": "snorlium-z--held", + "category_id": 46, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 846, + "identifier": "eevium-z--held", + "category_id": 46, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 847, + "identifier": "mewnium-z--held", + "category_id": 46, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 877, + "identifier": "pikashunium-z--held", + "category_id": 46, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 878, + "identifier": "forage-bag", + "category_id": 21, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 879, + "identifier": "fishing-rod", + "category_id": 21, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 880, + "identifier": "professors-mask", + "category_id": 22, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 881, + "identifier": "festival-ticket", + "category_id": 21, + "cost": 10, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 882, + "identifier": "sparkling-stone", + "category_id": 22, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 883, + "identifier": "adrenaline-orb", + "category_id": 12, + "cost": 300, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 884, + "identifier": "zygarde-cube", + "category_id": 21, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 885, + "identifier": "ice-stone", + "category_id": 10, + "cost": 3000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 886, + "identifier": "ride-pager", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 887, + "identifier": "beast-ball", + "category_id": 33, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 888, + "identifier": "big-malasada", + "category_id": 30, + "cost": 350, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 889, + "identifier": "red-nectar", + "category_id": 18, + "cost": 300, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 890, + "identifier": "yellow-nectar", + "category_id": 18, + "cost": 300, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 891, + "identifier": "pink-nectar", + "category_id": 18, + "cost": 300, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 892, + "identifier": "purple-nectar", + "category_id": 18, + "cost": 300, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 893, + "identifier": "sun-flute", + "category_id": 22, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 894, + "identifier": "moon-flute", + "category_id": 22, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 895, + "identifier": "enigmatic-card", + "category_id": 22, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 896, + "identifier": "terrain-extender", + "category_id": 12, + "cost": 4000, + "fling_power": 60, + "fling_effect_id": "" + }, + { + "id": 897, + "identifier": "protective-pads", + "category_id": 12, + "cost": 4000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 898, + "identifier": "electric-seed", + "category_id": 12, + "cost": 4000, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 899, + "identifier": "psychic-seed", + "category_id": 12, + "cost": 4000, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 900, + "identifier": "misty-seed", + "category_id": 12, + "cost": 4000, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 901, + "identifier": "grassy-seed", + "category_id": 12, + "cost": 4000, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 902, + "identifier": "fighting-memory", + "category_id": 45, + "cost": 1000, + "fling_power": 50, + "fling_effect_id": "" + }, + { + "id": 903, + "identifier": "flying-memory", + "category_id": 45, + "cost": 1000, + "fling_power": 50, + "fling_effect_id": "" + }, + { + "id": 904, + "identifier": "poison-memory", + "category_id": 45, + "cost": 1000, + "fling_power": 50, + "fling_effect_id": "" + }, + { + "id": 905, + "identifier": "ground-memory", + "category_id": 45, + "cost": 1000, + "fling_power": 50, + "fling_effect_id": "" + }, + { + "id": 906, + "identifier": "rock-memory", + "category_id": 45, + "cost": 1000, + "fling_power": 50, + "fling_effect_id": "" + }, + { + "id": 907, + "identifier": "bug-memory", + "category_id": 45, + "cost": 1000, + "fling_power": 50, + "fling_effect_id": "" + }, + { + "id": 908, + "identifier": "ghost-memory", + "category_id": 45, + "cost": 1000, + "fling_power": 50, + "fling_effect_id": "" + }, + { + "id": 909, + "identifier": "steel-memory", + "category_id": 45, + "cost": 1000, + "fling_power": 50, + "fling_effect_id": "" + }, + { + "id": 910, + "identifier": "fire-memory", + "category_id": 45, + "cost": 1000, + "fling_power": 50, + "fling_effect_id": "" + }, + { + "id": 911, + "identifier": "water-memory", + "category_id": 45, + "cost": 1000, + "fling_power": 50, + "fling_effect_id": "" + }, + { + "id": 912, + "identifier": "grass-memory", + "category_id": 45, + "cost": 1000, + "fling_power": 50, + "fling_effect_id": "" + }, + { + "id": 913, + "identifier": "electric-memory", + "category_id": 45, + "cost": 1000, + "fling_power": 50, + "fling_effect_id": "" + }, + { + "id": 914, + "identifier": "psychic-memory", + "category_id": 45, + "cost": 1000, + "fling_power": 50, + "fling_effect_id": "" + }, + { + "id": 915, + "identifier": "ice-memory", + "category_id": 45, + "cost": 1000, + "fling_power": 50, + "fling_effect_id": "" + }, + { + "id": 916, + "identifier": "dragon-memory", + "category_id": 45, + "cost": 1000, + "fling_power": 50, + "fling_effect_id": "" + }, + { + "id": 917, + "identifier": "dark-memory", + "category_id": 45, + "cost": 1000, + "fling_power": 50, + "fling_effect_id": "" + }, + { + "id": 918, + "identifier": "fairy-memory", + "category_id": 45, + "cost": 1000, + "fling_power": 50, + "fling_effect_id": "" + }, + { + "id": 919, + "identifier": "bike--green", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 920, + "identifier": "storage-key--galactic-warehouse", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 921, + "identifier": "basement-key--goldenrod", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 922, + "identifier": "xtranceiver--red", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 923, + "identifier": "xtranceiver--yellow", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 924, + "identifier": "dna-splicers--merge", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 925, + "identifier": "dna-splicers--split", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 926, + "identifier": "dropped-item--red", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 927, + "identifier": "dropped-item--yellow", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 928, + "identifier": "holo-caster--green", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 929, + "identifier": "bike--yellow", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 930, + "identifier": "holo-caster--red", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 931, + "identifier": "basement-key--new-mauville", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 932, + "identifier": "storage-key--sea-mauville", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 933, + "identifier": "ss-ticket--hoenn", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 934, + "identifier": "contest-costume--dress", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 935, + "identifier": "meteorite--2", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 936, + "identifier": "meteorite--3", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 937, + "identifier": "meteorite--4", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 938, + "identifier": "normalium-z--bag", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 939, + "identifier": "firium-z--bag", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 940, + "identifier": "waterium-z--bag", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 941, + "identifier": "electrium-z--bag", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 942, + "identifier": "grassium-z--bag", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 943, + "identifier": "icium-z--bag", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 944, + "identifier": "fightinium-z--bag", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 945, + "identifier": "poisonium-z--bag", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 946, + "identifier": "groundium-z--bag", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 947, + "identifier": "flyinium-z--bag", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 948, + "identifier": "psychium-z--bag", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 949, + "identifier": "buginium-z--bag", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 950, + "identifier": "rockium-z--bag", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 951, + "identifier": "ghostium-z--bag", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 952, + "identifier": "dragonium-z--bag", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 953, + "identifier": "darkinium-z--bag", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 954, + "identifier": "steelium-z--bag", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 955, + "identifier": "fairium-z--bag", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 956, + "identifier": "pikanium-z--bag", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 957, + "identifier": "decidium-z--bag", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 958, + "identifier": "incinium-z--bag", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 959, + "identifier": "primarium-z--bag", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 960, + "identifier": "tapunium-z--bag", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 961, + "identifier": "marshadium-z--bag", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 962, + "identifier": "aloraichium-z--bag", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 963, + "identifier": "snorlium-z--bag", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 964, + "identifier": "eevium-z--bag", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 965, + "identifier": "mewnium-z--bag", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 966, + "identifier": "pikashunium-z--bag", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 967, + "identifier": "solganium-z--held", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 968, + "identifier": "lunalium-z--held", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 969, + "identifier": "ultranecrozium-z--held", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 970, + "identifier": "mimikium-z--held", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 971, + "identifier": "lycanium-z--held", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 972, + "identifier": "kommonium-z--held", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 973, + "identifier": "solganium-z--bag", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 974, + "identifier": "lunalium-z--bag", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 975, + "identifier": "ultranecrozium-z--bag", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 976, + "identifier": "mimikium-z--bag", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 977, + "identifier": "lycanium-z--bag", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 978, + "identifier": "kommonium-z--bag", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 979, + "identifier": "z-power-ring", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 980, + "identifier": "pink-petal", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 981, + "identifier": "orange-petal", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 982, + "identifier": "blue-petal", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 983, + "identifier": "red-petal", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 984, + "identifier": "green-petal", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 985, + "identifier": "yellow-petal", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 986, + "identifier": "purple-petal", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 987, + "identifier": "rainbow-flower", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 988, + "identifier": "surge-badge", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 989, + "identifier": "n-solarizer--merge", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 990, + "identifier": "n-lunarizer--merge", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 991, + "identifier": "n-solarizer--split", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 992, + "identifier": "n-lunarizer--split", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 993, + "identifier": "ilimas-normalium-z", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 994, + "identifier": "left-poke-ball", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 995, + "identifier": "roto-hatch", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 996, + "identifier": "roto-bargain", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 997, + "identifier": "roto-prize-money", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 998, + "identifier": "roto-exp-points", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 999, + "identifier": "roto-friendship", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 1000, + "identifier": "roto-encounter", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 1001, + "identifier": "roto-stealth", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 1002, + "identifier": "roto-hp-restore", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 1003, + "identifier": "roto-pp-restore", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 1004, + "identifier": "roto-boost", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 1005, + "identifier": "roto-catch", + "category_id": 23, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 1006, + "identifier": "meltan-candy" + }, + { + "id": 10000, + "identifier": "sweet-apple", + "category_id": 10, + "cost": 3000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 10001, + "identifier": "tart-apple", + "category_id": 10, + "cost": 3000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 10002, + "identifier": "chipped-pot", + "category_id": 10, + "cost": 3000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 667, + "identifier": "mega-stone", + "category_id": 10, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 750, + "identifier": "rusty-sword", + "category_id": 10, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 751, + "identifier": "rusty-shield", + "category_id": 10, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 1500, + "identifier": "galarica-cuff", + "category_id": 34, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 1501, + "identifier": "galarica-wreath", + "category_id": 34, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 1502, + "identifier": "heavy-duty-boots", + "category_id": 34, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 1503, + "identifier": "eject-pack", + "category_id": 34, + "cost": 0, + "fling_power": 50, + "fling_effect_id": "" + }, + { + "id": 1504, + "identifier": "utility-umbrella", + "category_id": 34, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 1505, + "identifier": "room-service", + "category_id": 34, + "cost": 0, + "fling_power": 100, + "fling_effect_id": "" + }, + { + "id": 1506, + "identifier": "throat-spray", + "category_id": 34, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 1227, + "identifier": "special-sash", + "category_id": 12, + "cost": 4000, + "fling_power": 10, + "fling_effect_id": "" + }, + { + "id": 11000, + "identifier": "mega-stone-x", + "category_id": 10, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 11001, + "identifier": "mega-stone-y", + "category_id": 10, + "cost": 0, + "fling_power": "", + "fling_effect_id": "" + }, + { + "id": 10003, + "identifier": "black-augurite", + "category_id": 10, + "cost": 3000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 10004, + "identifier": "peat-block", + "category_id": 10, + "cost": 3000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 1007, + "identifier": "primal-orb", + "category_id": 18, + "cost": 0, + "fling_power": 60, + "fling_effect_id": "" + }, + { + "id": 3000, + "identifier": "ancient-coin", + "category_id": 34, + "cost": 0, + "fling_power": 100, + "fling_effect_id": 1 + }, + { + "id": 1507, + "identifier": "rotom-phone", + "category_id": 34, + "cost": 3000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 1508, + "identifier": "sandwich", + "category_id": 34, + "cost": 3000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 1509, + "identifier": "koraidon-s-pok-ball", + "category_id": 34, + "cost": 3000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 1510, + "identifier": "miraidon-s-pok-ball", + "category_id": 34, + "cost": 3000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 1511, + "identifier": "tera-orb", + "category_id": 34, + "cost": 3000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 1512, + "identifier": "scarlet-book", + "category_id": 34, + "cost": 3000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 1513, + "identifier": "violet-book", + "category_id": 34, + "cost": 3000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 1514, + "identifier": "kofu-s-wallet", + "category_id": 34, + "cost": 3000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 1515, + "identifier": "tiny-bamboo-shoot", + "category_id": 34, + "cost": 3000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 1516, + "identifier": "big-bamboo-shoot", + "category_id": 34, + "cost": 3000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 1517, + "identifier": "scroll-of-darkness", + "category_id": 34, + "cost": 3000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 1518, + "identifier": "scroll-of-waters", + "category_id": 34, + "cost": 3000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 1519, + "identifier": "auspicious-armor", + "category_id": 34, + "cost": 3000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 1520, + "identifier": "leader-s-crest", + "category_id": 34, + "cost": 3000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 1521, + "identifier": "malicious-armor", + "category_id": 34, + "cost": 3000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 1522, + "identifier": "normal-tera-shard", + "category_id": 34, + "cost": 3000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 1523, + "identifier": "fire-tera-shard", + "category_id": 34, + "cost": 3000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 1524, + "identifier": "water-tera-shard", + "category_id": 34, + "cost": 3000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 1525, + "identifier": "electric-tera-shard", + "category_id": 34, + "cost": 3000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 1526, + "identifier": "grass-tera-shard", + "category_id": 34, + "cost": 3000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 1527, + "identifier": "ice-tera-shard", + "category_id": 34, + "cost": 3000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 1528, + "identifier": "fighting-tera-shard", + "category_id": 34, + "cost": 3000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 1529, + "identifier": "poison-tera-shard", + "category_id": 34, + "cost": 3000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 1530, + "identifier": "ground-tera-shard", + "category_id": 34, + "cost": 3000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 1531, + "identifier": "flying-tera-shard", + "category_id": 34, + "cost": 3000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 1532, + "identifier": "psychic-tera-shard", + "category_id": 34, + "cost": 3000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 1533, + "identifier": "bug-tera-shard", + "category_id": 34, + "cost": 3000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 1534, + "identifier": "rock-tera-shard", + "category_id": 34, + "cost": 3000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 1535, + "identifier": "ghost-tera-shard", + "category_id": 34, + "cost": 3000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 1536, + "identifier": "dragon-tera-shard", + "category_id": 34, + "cost": 3000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 1537, + "identifier": "dark-tera-shard", + "category_id": 34, + "cost": 3000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 1538, + "identifier": "steel-tera-shard", + "category_id": 34, + "cost": 3000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 1539, + "identifier": "fairy-tera-shard", + "category_id": 34, + "cost": 3000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 1540, + "identifier": "booster-energy", + "category_id": 34, + "cost": 3000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 1541, + "identifier": "ability-shield", + "category_id": 34, + "cost": 3000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 1542, + "identifier": "clear-amulet", + "category_id": 34, + "cost": 3000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 1543, + "identifier": "mirror-herb", + "category_id": 34, + "cost": 3000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 1544, + "identifier": "punching-glove", + "category_id": 34, + "cost": 3000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 1545, + "identifier": "covert-cloak", + "category_id": 34, + "cost": 3000, + "fling_power": 30, + "fling_effect_id": "" + }, + { + "id": 1546, + "identifier": "loaded-dice", + "category_id": 34, + "cost": 3000, + "fling_power": 30, + "fling_effect_id": "" + } +] \ No newline at end of file diff --git a/pokemonduel/data/moves.json b/pokemonduel/data/moves.json new file mode 100644 index 0000000..c77dffb --- /dev/null +++ b/pokemonduel/data/moves.json @@ -0,0 +1,15319 @@ +[ + { + "id": 1, + "identifier": "pound", + "generation_id": 1, + "type_id": 1, + "power": 40, + "pp": 56, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 2, + "identifier": "karate-chop", + "generation_id": 1, + "type_id": 2, + "power": 50, + "pp": 40, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 44, + "effect_chance": null, + "crit_rate": 1, + "max_hits": null, + "min_hits": null + }, + { + "id": 3, + "identifier": "double-slap", + "generation_id": 1, + "type_id": 1, + "power": 15, + "pp": 16, + "accuracy": 85, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 30, + "effect_chance": null, + "crit_rate": 0, + "max_hits": 5, + "min_hits": 2 + }, + { + "id": 4, + "identifier": "comet-punch", + "generation_id": 1, + "type_id": 1, + "power": 18, + "pp": 24, + "accuracy": 85, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 30, + "effect_chance": null, + "crit_rate": 0, + "max_hits": 5, + "min_hits": 2 + }, + { + "id": 5, + "identifier": "mega-punch", + "generation_id": 1, + "type_id": 1, + "power": 80, + "pp": 32, + "accuracy": 85, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 6, + "identifier": "pay-day", + "generation_id": 1, + "type_id": 1, + "power": 40, + "pp": 32, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 35, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 7, + "identifier": "fire-punch", + "generation_id": 1, + "type_id": 10, + "power": 75, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 5, + "effect_chance": 10, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 8, + "identifier": "ice-punch", + "generation_id": 1, + "type_id": 15, + "power": 75, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 6, + "effect_chance": 10, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 9, + "identifier": "thunder-punch", + "generation_id": 1, + "type_id": 13, + "power": 75, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 7, + "effect_chance": 10, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 10, + "identifier": "scratch", + "generation_id": 1, + "type_id": 1, + "power": 40, + "pp": 56, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 11, + "identifier": "vise-grip", + "generation_id": 1, + "type_id": 1, + "power": 55, + "pp": 48, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 12, + "identifier": "guillotine", + "generation_id": 1, + "type_id": 1, + "power": null, + "pp": 8, + "accuracy": 30, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 39, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 13, + "identifier": "razor-wind", + "generation_id": 1, + "type_id": 1, + "power": 80, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 11, + "damage_class_id": 3, + "effect_id": 40, + "effect_chance": null, + "crit_rate": 1, + "max_hits": null, + "min_hits": null + }, + { + "id": 14, + "identifier": "swords-dance", + "generation_id": 1, + "type_id": 1, + "power": null, + "pp": 32, + "accuracy": null, + "priority": 0, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 51, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 15, + "identifier": "cut", + "generation_id": 1, + "type_id": 1, + "power": 50, + "pp": 48, + "accuracy": 95, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 16, + "identifier": "gust", + "generation_id": 1, + "type_id": 3, + "power": 40, + "pp": 56, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 150, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 17, + "identifier": "wing-attack", + "generation_id": 1, + "type_id": 3, + "power": 60, + "pp": 56, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 18, + "identifier": "whirlwind", + "generation_id": 1, + "type_id": 1, + "power": null, + "pp": 32, + "accuracy": null, + "priority": -6, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 29, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 19, + "identifier": "fly", + "generation_id": 1, + "type_id": 3, + "power": 90, + "pp": 24, + "accuracy": 95, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 156, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 20, + "identifier": "bind", + "generation_id": 1, + "type_id": 1, + "power": 15, + "pp": 32, + "accuracy": 85, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 43, + "effect_chance": 100, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 21, + "identifier": "slam", + "generation_id": 1, + "type_id": 1, + "power": 80, + "pp": 32, + "accuracy": 75, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 22, + "identifier": "vine-whip", + "generation_id": 1, + "type_id": 12, + "power": 45, + "pp": 40, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 23, + "identifier": "stomp", + "generation_id": 1, + "type_id": 1, + "power": 65, + "pp": 32, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 151, + "effect_chance": 30, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 24, + "identifier": "double-kick", + "generation_id": 1, + "type_id": 2, + "power": 30, + "pp": 48, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 45, + "effect_chance": null, + "crit_rate": 0, + "max_hits": 2, + "min_hits": 2 + }, + { + "id": 25, + "identifier": "mega-kick", + "generation_id": 1, + "type_id": 1, + "power": 120, + "pp": 8, + "accuracy": 75, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 26, + "identifier": "jump-kick", + "generation_id": 1, + "type_id": 2, + "power": 100, + "pp": 16, + "accuracy": 95, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 46, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 27, + "identifier": "rolling-kick", + "generation_id": 1, + "type_id": 2, + "power": 60, + "pp": 24, + "accuracy": 85, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 32, + "effect_chance": 30, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 28, + "identifier": "sand-attack", + "generation_id": 1, + "type_id": 5, + "power": null, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 24, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 29, + "identifier": "headbutt", + "generation_id": 1, + "type_id": 1, + "power": 70, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 32, + "effect_chance": 30, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 30, + "identifier": "horn-attack", + "generation_id": 1, + "type_id": 1, + "power": 65, + "pp": 40, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 31, + "identifier": "fury-attack", + "generation_id": 1, + "type_id": 1, + "power": 15, + "pp": 32, + "accuracy": 85, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 30, + "effect_chance": null, + "crit_rate": 0, + "max_hits": 5, + "min_hits": 2 + }, + { + "id": 32, + "identifier": "horn-drill", + "generation_id": 1, + "type_id": 1, + "power": null, + "pp": 8, + "accuracy": 30, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 39, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 33, + "identifier": "tackle", + "generation_id": 1, + "type_id": 1, + "power": 40, + "pp": 56, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 34, + "identifier": "body-slam", + "generation_id": 1, + "type_id": 1, + "power": 85, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 7, + "effect_chance": 30, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 35, + "identifier": "wrap", + "generation_id": 1, + "type_id": 1, + "power": 15, + "pp": 32, + "accuracy": 90, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 43, + "effect_chance": 100, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 36, + "identifier": "take-down", + "generation_id": 1, + "type_id": 1, + "power": 90, + "pp": 32, + "accuracy": 85, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 49, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 37, + "identifier": "thrash", + "generation_id": 1, + "type_id": 1, + "power": 120, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 8, + "damage_class_id": 2, + "effect_id": 28, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 38, + "identifier": "double-edge", + "generation_id": 1, + "type_id": 1, + "power": 120, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 199, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 39, + "identifier": "tail-whip", + "generation_id": 1, + "type_id": 1, + "power": null, + "pp": 48, + "accuracy": 100, + "priority": 0, + "target_id": 11, + "damage_class_id": 1, + "effect_id": 20, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 40, + "identifier": "poison-sting", + "generation_id": 1, + "type_id": 4, + "power": 15, + "pp": 56, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 3, + "effect_chance": 30, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 41, + "identifier": "twineedle", + "generation_id": 1, + "type_id": 7, + "power": 25, + "pp": 32, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 78, + "effect_chance": 20, + "crit_rate": 0, + "max_hits": 2, + "min_hits": 2 + }, + { + "id": 42, + "identifier": "pin-missile", + "generation_id": 1, + "type_id": 7, + "power": 25, + "pp": 32, + "accuracy": 95, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 30, + "effect_chance": null, + "crit_rate": 0, + "max_hits": 5, + "min_hits": 2 + }, + { + "id": 43, + "identifier": "leer", + "generation_id": 1, + "type_id": 1, + "power": null, + "pp": 48, + "accuracy": 100, + "priority": 0, + "target_id": 11, + "damage_class_id": 1, + "effect_id": 20, + "effect_chance": 100, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 44, + "identifier": "bite", + "generation_id": 1, + "type_id": 17, + "power": 60, + "pp": 40, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 32, + "effect_chance": 30, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 45, + "identifier": "growl", + "generation_id": 1, + "type_id": 1, + "power": null, + "pp": 64, + "accuracy": 100, + "priority": 0, + "target_id": 11, + "damage_class_id": 1, + "effect_id": 19, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 46, + "identifier": "roar", + "generation_id": 1, + "type_id": 1, + "power": null, + "pp": 32, + "accuracy": null, + "priority": -6, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 29, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 47, + "identifier": "sing", + "generation_id": 1, + "type_id": 1, + "power": null, + "pp": 24, + "accuracy": 55, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 2, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 48, + "identifier": "supersonic", + "generation_id": 1, + "type_id": 1, + "power": null, + "pp": 32, + "accuracy": 55, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 50, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 49, + "identifier": "sonic-boom", + "generation_id": 1, + "type_id": 1, + "power": null, + "pp": 32, + "accuracy": 90, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 131, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 50, + "identifier": "disable", + "generation_id": 1, + "type_id": 1, + "power": null, + "pp": 32, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 87, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 51, + "identifier": "acid", + "generation_id": 1, + "type_id": 4, + "power": 40, + "pp": 48, + "accuracy": 100, + "priority": 0, + "target_id": 11, + "damage_class_id": 3, + "effect_id": 73, + "effect_chance": 10, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 52, + "identifier": "ember", + "generation_id": 1, + "type_id": 10, + "power": 40, + "pp": 40, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 5, + "effect_chance": 10, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 53, + "identifier": "flamethrower", + "generation_id": 1, + "type_id": 10, + "power": 90, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 5, + "effect_chance": 10, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 54, + "identifier": "mist", + "generation_id": 1, + "type_id": 15, + "power": null, + "pp": 48, + "accuracy": null, + "priority": 0, + "target_id": 4, + "damage_class_id": 1, + "effect_id": 47, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 55, + "identifier": "water-gun", + "generation_id": 1, + "type_id": 11, + "power": 40, + "pp": 40, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 56, + "identifier": "hydro-pump", + "generation_id": 1, + "type_id": 11, + "power": 110, + "pp": 8, + "accuracy": 80, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 57, + "identifier": "surf", + "generation_id": 1, + "type_id": 11, + "power": 90, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 9, + "damage_class_id": 3, + "effect_id": 258, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 58, + "identifier": "ice-beam", + "generation_id": 1, + "type_id": 15, + "power": 90, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 6, + "effect_chance": 10, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 59, + "identifier": "blizzard", + "generation_id": 1, + "type_id": 15, + "power": 110, + "pp": 8, + "accuracy": 70, + "priority": 0, + "target_id": 11, + "damage_class_id": 3, + "effect_id": 261, + "effect_chance": 10, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 60, + "identifier": "psybeam", + "generation_id": 1, + "type_id": 14, + "power": 65, + "pp": 32, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 77, + "effect_chance": 10, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 61, + "identifier": "bubble-beam", + "generation_id": 1, + "type_id": 11, + "power": 65, + "pp": 32, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 71, + "effect_chance": 10, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 62, + "identifier": "aurora-beam", + "generation_id": 1, + "type_id": 15, + "power": 65, + "pp": 32, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 69, + "effect_chance": 10, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 63, + "identifier": "hyper-beam", + "generation_id": 1, + "type_id": 1, + "power": 150, + "pp": 8, + "accuracy": 90, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 81, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 64, + "identifier": "peck", + "generation_id": 1, + "type_id": 3, + "power": 35, + "pp": 56, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 65, + "identifier": "drill-peck", + "generation_id": 1, + "type_id": 3, + "power": 80, + "pp": 32, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 66, + "identifier": "submission", + "generation_id": 1, + "type_id": 2, + "power": 80, + "pp": 32, + "accuracy": 80, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 49, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 67, + "identifier": "low-kick", + "generation_id": 1, + "type_id": 2, + "power": null, + "pp": 32, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 197, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 68, + "identifier": "counter", + "generation_id": 1, + "type_id": 2, + "power": null, + "pp": 32, + "accuracy": 100, + "priority": -5, + "target_id": 1, + "damage_class_id": 2, + "effect_id": 90, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 69, + "identifier": "seismic-toss", + "generation_id": 1, + "type_id": 2, + "power": null, + "pp": 32, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 88, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 70, + "identifier": "strength", + "generation_id": 1, + "type_id": 1, + "power": 80, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 71, + "identifier": "absorb", + "generation_id": 1, + "type_id": 12, + "power": 20, + "pp": 40, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 4, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 72, + "identifier": "mega-drain", + "generation_id": 1, + "type_id": 12, + "power": 40, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 4, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 73, + "identifier": "leech-seed", + "generation_id": 1, + "type_id": 12, + "power": null, + "pp": 16, + "accuracy": 90, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 85, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 74, + "identifier": "growth", + "generation_id": 1, + "type_id": 1, + "power": null, + "pp": 32, + "accuracy": null, + "priority": 0, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 317, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 75, + "identifier": "razor-leaf", + "generation_id": 1, + "type_id": 12, + "power": 55, + "pp": 40, + "accuracy": 95, + "priority": 0, + "target_id": 11, + "damage_class_id": 2, + "effect_id": 44, + "effect_chance": null, + "crit_rate": 1, + "max_hits": null, + "min_hits": null + }, + { + "id": 76, + "identifier": "solar-beam", + "generation_id": 1, + "type_id": 12, + "power": 120, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 152, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 77, + "identifier": "poison-powder", + "generation_id": 1, + "type_id": 4, + "power": null, + "pp": 56, + "accuracy": 75, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 67, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 78, + "identifier": "stun-spore", + "generation_id": 1, + "type_id": 12, + "power": null, + "pp": 48, + "accuracy": 75, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 68, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 79, + "identifier": "sleep-powder", + "generation_id": 1, + "type_id": 12, + "power": null, + "pp": 24, + "accuracy": 75, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 2, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 80, + "identifier": "petal-dance", + "generation_id": 1, + "type_id": 12, + "power": 120, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 8, + "damage_class_id": 3, + "effect_id": 28, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 81, + "identifier": "string-shot", + "generation_id": 1, + "type_id": 7, + "power": null, + "pp": 64, + "accuracy": 95, + "priority": 0, + "target_id": 11, + "damage_class_id": 1, + "effect_id": 61, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 82, + "identifier": "dragon-rage", + "generation_id": 1, + "type_id": 16, + "power": null, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 42, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 83, + "identifier": "fire-spin", + "generation_id": 1, + "type_id": 10, + "power": 35, + "pp": 24, + "accuracy": 85, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 43, + "effect_chance": 100, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 84, + "identifier": "thunder-shock", + "generation_id": 1, + "type_id": 13, + "power": 40, + "pp": 48, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 7, + "effect_chance": 10, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 85, + "identifier": "thunderbolt", + "generation_id": 1, + "type_id": 13, + "power": 90, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 7, + "effect_chance": 10, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 86, + "identifier": "thunder-wave", + "generation_id": 1, + "type_id": 13, + "power": null, + "pp": 32, + "accuracy": 90, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 68, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 87, + "identifier": "thunder", + "generation_id": 1, + "type_id": 13, + "power": 110, + "pp": 16, + "accuracy": 70, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 153, + "effect_chance": 30, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 88, + "identifier": "rock-throw", + "generation_id": 1, + "type_id": 6, + "power": 50, + "pp": 24, + "accuracy": 90, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 89, + "identifier": "earthquake", + "generation_id": 1, + "type_id": 5, + "power": 100, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 9, + "damage_class_id": 2, + "effect_id": 148, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 90, + "identifier": "fissure", + "generation_id": 1, + "type_id": 5, + "power": null, + "pp": 8, + "accuracy": 30, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 39, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 91, + "identifier": "dig", + "generation_id": 1, + "type_id": 5, + "power": 80, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 257, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 92, + "identifier": "toxic", + "generation_id": 1, + "type_id": 4, + "power": null, + "pp": 16, + "accuracy": 90, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 34, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 93, + "identifier": "confusion", + "generation_id": 1, + "type_id": 14, + "power": 50, + "pp": 40, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 77, + "effect_chance": 10, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 94, + "identifier": "psychic", + "generation_id": 1, + "type_id": 14, + "power": 90, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 73, + "effect_chance": 10, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 95, + "identifier": "hypnosis", + "generation_id": 1, + "type_id": 14, + "power": null, + "pp": 32, + "accuracy": 60, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 2, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 96, + "identifier": "meditate", + "generation_id": 1, + "type_id": 14, + "power": null, + "pp": 64, + "accuracy": null, + "priority": 0, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 11, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 97, + "identifier": "agility", + "generation_id": 1, + "type_id": 14, + "power": null, + "pp": 48, + "accuracy": null, + "priority": 0, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 53, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 98, + "identifier": "quick-attack", + "generation_id": 1, + "type_id": 1, + "power": 40, + "pp": 48, + "accuracy": 100, + "priority": 1, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 104, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 99, + "identifier": "rage", + "generation_id": 1, + "type_id": 1, + "power": 20, + "pp": 32, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 82, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 100, + "identifier": "teleport", + "generation_id": 1, + "type_id": 14, + "power": null, + "pp": 32, + "accuracy": null, + "priority": -6, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 154, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 101, + "identifier": "night-shade", + "generation_id": 1, + "type_id": 8, + "power": null, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 88, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 102, + "identifier": "mimic", + "generation_id": 1, + "type_id": 1, + "power": null, + "pp": 16, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 83, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 103, + "identifier": "screech", + "generation_id": 1, + "type_id": 1, + "power": null, + "pp": 64, + "accuracy": 85, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 60, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 104, + "identifier": "double-team", + "generation_id": 1, + "type_id": 1, + "power": null, + "pp": 24, + "accuracy": null, + "priority": 0, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 17, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 105, + "identifier": "recover", + "generation_id": 1, + "type_id": 1, + "power": null, + "pp": 8, + "accuracy": null, + "priority": 0, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 33, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 106, + "identifier": "harden", + "generation_id": 1, + "type_id": 1, + "power": null, + "pp": 48, + "accuracy": null, + "priority": 0, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 12, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 107, + "identifier": "minimize", + "generation_id": 1, + "type_id": 1, + "power": null, + "pp": 16, + "accuracy": null, + "priority": 0, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 109, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 108, + "identifier": "smokescreen", + "generation_id": 1, + "type_id": 1, + "power": null, + "pp": 32, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 24, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 109, + "identifier": "confuse-ray", + "generation_id": 1, + "type_id": 8, + "power": null, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 50, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 110, + "identifier": "withdraw", + "generation_id": 1, + "type_id": 11, + "power": null, + "pp": 64, + "accuracy": null, + "priority": 0, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 12, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 111, + "identifier": "defense-curl", + "generation_id": 1, + "type_id": 1, + "power": null, + "pp": 64, + "accuracy": null, + "priority": 0, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 157, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 112, + "identifier": "barrier", + "generation_id": 1, + "type_id": 14, + "power": null, + "pp": 32, + "accuracy": null, + "priority": 0, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 52, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 113, + "identifier": "light-screen", + "generation_id": 1, + "type_id": 14, + "power": null, + "pp": 48, + "accuracy": null, + "priority": 0, + "target_id": 4, + "damage_class_id": 1, + "effect_id": 36, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 114, + "identifier": "haze", + "generation_id": 1, + "type_id": 15, + "power": null, + "pp": 48, + "accuracy": null, + "priority": 0, + "target_id": 12, + "damage_class_id": 1, + "effect_id": 26, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 115, + "identifier": "reflect", + "generation_id": 1, + "type_id": 14, + "power": null, + "pp": 32, + "accuracy": null, + "priority": 0, + "target_id": 4, + "damage_class_id": 1, + "effect_id": 66, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 116, + "identifier": "focus-energy", + "generation_id": 1, + "type_id": 1, + "power": null, + "pp": 48, + "accuracy": null, + "priority": 0, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 48, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 117, + "identifier": "bide", + "generation_id": 1, + "type_id": 1, + "power": null, + "pp": 16, + "accuracy": null, + "priority": 1, + "target_id": 7, + "damage_class_id": 2, + "effect_id": 27, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 118, + "identifier": "metronome", + "generation_id": 1, + "type_id": 1, + "power": null, + "pp": 16, + "accuracy": null, + "priority": 0, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 84, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 119, + "identifier": "mirror-move", + "generation_id": 1, + "type_id": 3, + "power": null, + "pp": 32, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 10, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 120, + "identifier": "self-destruct", + "generation_id": 1, + "type_id": 1, + "power": 200, + "pp": 8, + "accuracy": 100, + "priority": 0, + "target_id": 9, + "damage_class_id": 2, + "effect_id": 8, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 121, + "identifier": "egg-bomb", + "generation_id": 1, + "type_id": 1, + "power": 100, + "pp": 16, + "accuracy": 75, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 122, + "identifier": "lick", + "generation_id": 1, + "type_id": 8, + "power": 30, + "pp": 48, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 7, + "effect_chance": 30, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 123, + "identifier": "smog", + "generation_id": 1, + "type_id": 4, + "power": 30, + "pp": 32, + "accuracy": 70, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 3, + "effect_chance": 40, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 124, + "identifier": "sludge", + "generation_id": 1, + "type_id": 4, + "power": 65, + "pp": 32, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 3, + "effect_chance": 30, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 125, + "identifier": "bone-club", + "generation_id": 1, + "type_id": 5, + "power": 65, + "pp": 32, + "accuracy": 85, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 32, + "effect_chance": 10, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 126, + "identifier": "fire-blast", + "generation_id": 1, + "type_id": 10, + "power": 110, + "pp": 8, + "accuracy": 85, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 5, + "effect_chance": 10, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 127, + "identifier": "waterfall", + "generation_id": 1, + "type_id": 11, + "power": 80, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 32, + "effect_chance": 20, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 128, + "identifier": "clamp", + "generation_id": 1, + "type_id": 11, + "power": 35, + "pp": 24, + "accuracy": 85, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 43, + "effect_chance": 100, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 129, + "identifier": "swift", + "generation_id": 1, + "type_id": 1, + "power": 60, + "pp": 32, + "accuracy": null, + "priority": 0, + "target_id": 11, + "damage_class_id": 3, + "effect_id": 18, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 130, + "identifier": "skull-bash", + "generation_id": 1, + "type_id": 1, + "power": 130, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 146, + "effect_chance": 100, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 131, + "identifier": "spike-cannon", + "generation_id": 1, + "type_id": 1, + "power": 20, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 30, + "effect_chance": null, + "crit_rate": 0, + "max_hits": 5, + "min_hits": 2 + }, + { + "id": 132, + "identifier": "constrict", + "generation_id": 1, + "type_id": 1, + "power": 10, + "pp": 56, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 71, + "effect_chance": 10, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 133, + "identifier": "amnesia", + "generation_id": 1, + "type_id": 14, + "power": null, + "pp": 32, + "accuracy": null, + "priority": 0, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 55, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 134, + "identifier": "kinesis", + "generation_id": 1, + "type_id": 14, + "power": null, + "pp": 24, + "accuracy": 80, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 24, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 135, + "identifier": "soft-boiled", + "generation_id": 1, + "type_id": 1, + "power": null, + "pp": 8, + "accuracy": null, + "priority": 0, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 33, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 136, + "identifier": "high-jump-kick", + "generation_id": 1, + "type_id": 2, + "power": 130, + "pp": 16, + "accuracy": 90, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 46, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 137, + "identifier": "glare", + "generation_id": 1, + "type_id": 1, + "power": null, + "pp": 48, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 68, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 138, + "identifier": "dream-eater", + "generation_id": 1, + "type_id": 14, + "power": 100, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 9, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 139, + "identifier": "poison-gas", + "generation_id": 1, + "type_id": 4, + "power": null, + "pp": 64, + "accuracy": 90, + "priority": 0, + "target_id": 11, + "damage_class_id": 1, + "effect_id": 67, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 140, + "identifier": "barrage", + "generation_id": 1, + "type_id": 1, + "power": 15, + "pp": 32, + "accuracy": 85, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 30, + "effect_chance": null, + "crit_rate": 0, + "max_hits": 5, + "min_hits": 2 + }, + { + "id": 141, + "identifier": "leech-life", + "generation_id": 1, + "type_id": 7, + "power": 80, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 4, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 142, + "identifier": "lovely-kiss", + "generation_id": 1, + "type_id": 1, + "power": null, + "pp": 16, + "accuracy": 75, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 2, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 143, + "identifier": "sky-attack", + "generation_id": 1, + "type_id": 3, + "power": 140, + "pp": 8, + "accuracy": 90, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 76, + "effect_chance": 30, + "crit_rate": 1, + "max_hits": null, + "min_hits": null + }, + { + "id": 144, + "identifier": "transform", + "generation_id": 1, + "type_id": 1, + "power": null, + "pp": 16, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 58, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 145, + "identifier": "bubble", + "generation_id": 1, + "type_id": 11, + "power": 40, + "pp": 48, + "accuracy": 100, + "priority": 0, + "target_id": 11, + "damage_class_id": 3, + "effect_id": 71, + "effect_chance": 10, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 146, + "identifier": "dizzy-punch", + "generation_id": 1, + "type_id": 1, + "power": 70, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 77, + "effect_chance": 20, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 147, + "identifier": "spore", + "generation_id": 1, + "type_id": 12, + "power": null, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 2, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 148, + "identifier": "flash", + "generation_id": 1, + "type_id": 1, + "power": null, + "pp": 32, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 24, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 149, + "identifier": "psywave", + "generation_id": 1, + "type_id": 14, + "power": null, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 89, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 150, + "identifier": "splash", + "generation_id": 1, + "type_id": 1, + "power": null, + "pp": 64, + "accuracy": null, + "priority": 0, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 86, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 151, + "identifier": "acid-armor", + "generation_id": 1, + "type_id": 4, + "power": null, + "pp": 32, + "accuracy": null, + "priority": 0, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 52, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 152, + "identifier": "crabhammer", + "generation_id": 1, + "type_id": 11, + "power": 100, + "pp": 16, + "accuracy": 90, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 44, + "effect_chance": null, + "crit_rate": 1, + "max_hits": null, + "min_hits": null + }, + { + "id": 153, + "identifier": "explosion", + "generation_id": 1, + "type_id": 1, + "power": 250, + "pp": 8, + "accuracy": 100, + "priority": 0, + "target_id": 9, + "damage_class_id": 2, + "effect_id": 8, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 154, + "identifier": "fury-swipes", + "generation_id": 1, + "type_id": 1, + "power": 18, + "pp": 24, + "accuracy": 80, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 30, + "effect_chance": null, + "crit_rate": 0, + "max_hits": 5, + "min_hits": 2 + }, + { + "id": 155, + "identifier": "bonemerang", + "generation_id": 1, + "type_id": 5, + "power": 50, + "pp": 16, + "accuracy": 90, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 45, + "effect_chance": null, + "crit_rate": 0, + "max_hits": 2, + "min_hits": 2 + }, + { + "id": 156, + "identifier": "rest", + "generation_id": 1, + "type_id": 14, + "power": null, + "pp": 8, + "accuracy": null, + "priority": 0, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 38, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 157, + "identifier": "rock-slide", + "generation_id": 1, + "type_id": 6, + "power": 75, + "pp": 16, + "accuracy": 90, + "priority": 0, + "target_id": 11, + "damage_class_id": 2, + "effect_id": 32, + "effect_chance": 30, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 158, + "identifier": "hyper-fang", + "generation_id": 1, + "type_id": 1, + "power": 80, + "pp": 24, + "accuracy": 90, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 32, + "effect_chance": 10, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 159, + "identifier": "sharpen", + "generation_id": 1, + "type_id": 1, + "power": null, + "pp": 48, + "accuracy": null, + "priority": 0, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 11, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 160, + "identifier": "conversion", + "generation_id": 1, + "type_id": 1, + "power": null, + "pp": 48, + "accuracy": null, + "priority": 0, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 31, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 161, + "identifier": "tri-attack", + "generation_id": 1, + "type_id": 1, + "power": 80, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 37, + "effect_chance": 20, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 162, + "identifier": "super-fang", + "generation_id": 1, + "type_id": 1, + "power": null, + "pp": 16, + "accuracy": 90, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 41, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 163, + "identifier": "slash", + "generation_id": 1, + "type_id": 1, + "power": 70, + "pp": 32, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 44, + "effect_chance": null, + "crit_rate": 1, + "max_hits": null, + "min_hits": null + }, + { + "id": 164, + "identifier": "substitute", + "generation_id": 1, + "type_id": 1, + "power": null, + "pp": 16, + "accuracy": null, + "priority": 0, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 80, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 165, + "identifier": "struggle", + "generation_id": 1, + "type_id": 1, + "power": 50, + "pp": 1, + "accuracy": null, + "priority": 0, + "target_id": 8, + "damage_class_id": 2, + "effect_id": 255, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 166, + "identifier": "sketch", + "generation_id": 2, + "type_id": 1, + "power": null, + "pp": 1, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 96, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 167, + "identifier": "triple-kick", + "generation_id": 2, + "type_id": 2, + "power": 10, + "pp": 16, + "accuracy": 90, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 105, + "effect_chance": null, + "crit_rate": 0, + "max_hits": 3, + "min_hits": 3 + }, + { + "id": 168, + "identifier": "thief", + "generation_id": 2, + "type_id": 17, + "power": 60, + "pp": 40, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 106, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 169, + "identifier": "spider-web", + "generation_id": 2, + "type_id": 7, + "power": null, + "pp": 16, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 107, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 170, + "identifier": "mind-reader", + "generation_id": 2, + "type_id": 1, + "power": null, + "pp": 8, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 95, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 171, + "identifier": "nightmare", + "generation_id": 2, + "type_id": 8, + "power": null, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 108, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 172, + "identifier": "flame-wheel", + "generation_id": 2, + "type_id": 10, + "power": 60, + "pp": 40, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 126, + "effect_chance": 10, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 173, + "identifier": "snore", + "generation_id": 2, + "type_id": 1, + "power": 50, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 93, + "effect_chance": 30, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 174, + "identifier": "curse", + "generation_id": 2, + "type_id": 8, + "power": null, + "pp": 16, + "accuracy": null, + "priority": 0, + "target_id": 1, + "damage_class_id": 1, + "effect_id": 110, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 175, + "identifier": "flail", + "generation_id": 2, + "type_id": 1, + "power": null, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 100, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 176, + "identifier": "conversion-2", + "generation_id": 2, + "type_id": 1, + "power": null, + "pp": 48, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 94, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 177, + "identifier": "aeroblast", + "generation_id": 2, + "type_id": 3, + "power": 100, + "pp": 8, + "accuracy": 95, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 44, + "effect_chance": null, + "crit_rate": 1, + "max_hits": null, + "min_hits": null + }, + { + "id": 178, + "identifier": "cotton-spore", + "generation_id": 2, + "type_id": 12, + "power": null, + "pp": 64, + "accuracy": 100, + "priority": 0, + "target_id": 11, + "damage_class_id": 1, + "effect_id": 61, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 179, + "identifier": "reversal", + "generation_id": 2, + "type_id": 2, + "power": null, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 100, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 180, + "identifier": "spite", + "generation_id": 2, + "type_id": 8, + "power": null, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 101, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 181, + "identifier": "powder-snow", + "generation_id": 2, + "type_id": 15, + "power": 40, + "pp": 40, + "accuracy": 100, + "priority": 0, + "target_id": 11, + "damage_class_id": 3, + "effect_id": 6, + "effect_chance": 10, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 182, + "identifier": "protect", + "generation_id": 2, + "type_id": 1, + "power": null, + "pp": 16, + "accuracy": null, + "priority": 4, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 112, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 183, + "identifier": "mach-punch", + "generation_id": 2, + "type_id": 2, + "power": 40, + "pp": 48, + "accuracy": 100, + "priority": 1, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 104, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 184, + "identifier": "scary-face", + "generation_id": 2, + "type_id": 1, + "power": null, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 61, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 185, + "identifier": "feint-attack", + "generation_id": 2, + "type_id": 17, + "power": 60, + "pp": 32, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 18, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 186, + "identifier": "sweet-kiss", + "generation_id": 2, + "type_id": 18, + "power": null, + "pp": 16, + "accuracy": 75, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 50, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 187, + "identifier": "belly-drum", + "generation_id": 2, + "type_id": 1, + "power": null, + "pp": 16, + "accuracy": null, + "priority": 0, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 143, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 188, + "identifier": "sludge-bomb", + "generation_id": 2, + "type_id": 4, + "power": 90, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 3, + "effect_chance": 30, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 189, + "identifier": "mud-slap", + "generation_id": 2, + "type_id": 5, + "power": 20, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 74, + "effect_chance": 100, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 190, + "identifier": "octazooka", + "generation_id": 2, + "type_id": 11, + "power": 65, + "pp": 16, + "accuracy": 85, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 74, + "effect_chance": 50, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 191, + "identifier": "spikes", + "generation_id": 2, + "type_id": 5, + "power": null, + "pp": 32, + "accuracy": null, + "priority": 0, + "target_id": 6, + "damage_class_id": 1, + "effect_id": 113, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 192, + "identifier": "zap-cannon", + "generation_id": 2, + "type_id": 13, + "power": 120, + "pp": 8, + "accuracy": 50, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 7, + "effect_chance": 100, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 193, + "identifier": "foresight", + "generation_id": 2, + "type_id": 1, + "power": null, + "pp": 64, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 114, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 194, + "identifier": "destiny-bond", + "generation_id": 2, + "type_id": 8, + "power": null, + "pp": 8, + "accuracy": null, + "priority": 0, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 99, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 195, + "identifier": "perish-song", + "generation_id": 2, + "type_id": 1, + "power": null, + "pp": 8, + "accuracy": null, + "priority": 0, + "target_id": 14, + "damage_class_id": 1, + "effect_id": 115, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 196, + "identifier": "icy-wind", + "generation_id": 2, + "type_id": 15, + "power": 55, + "pp": 24, + "accuracy": 95, + "priority": 0, + "target_id": 11, + "damage_class_id": 3, + "effect_id": 71, + "effect_chance": 100, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 197, + "identifier": "detect", + "generation_id": 2, + "type_id": 2, + "power": null, + "pp": 8, + "accuracy": null, + "priority": 4, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 112, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 198, + "identifier": "bone-rush", + "generation_id": 2, + "type_id": 5, + "power": 25, + "pp": 16, + "accuracy": 90, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 30, + "effect_chance": null, + "crit_rate": 0, + "max_hits": 5, + "min_hits": 2 + }, + { + "id": 199, + "identifier": "lock-on", + "generation_id": 2, + "type_id": 1, + "power": null, + "pp": 8, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 95, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 200, + "identifier": "outrage", + "generation_id": 2, + "type_id": 16, + "power": 120, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 8, + "damage_class_id": 2, + "effect_id": 28, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 201, + "identifier": "sandstorm", + "generation_id": 2, + "type_id": 6, + "power": null, + "pp": 16, + "accuracy": null, + "priority": 0, + "target_id": 12, + "damage_class_id": 1, + "effect_id": 116, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 202, + "identifier": "giga-drain", + "generation_id": 2, + "type_id": 12, + "power": 75, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 4, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 203, + "identifier": "endure", + "generation_id": 2, + "type_id": 1, + "power": null, + "pp": 16, + "accuracy": null, + "priority": 4, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 117, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 204, + "identifier": "charm", + "generation_id": 2, + "type_id": 18, + "power": null, + "pp": 32, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 59, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 205, + "identifier": "rollout", + "generation_id": 2, + "type_id": 6, + "power": 30, + "pp": 32, + "accuracy": 90, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 118, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 206, + "identifier": "false-swipe", + "generation_id": 2, + "type_id": 1, + "power": 40, + "pp": 64, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 102, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 207, + "identifier": "swagger", + "generation_id": 2, + "type_id": 1, + "power": null, + "pp": 24, + "accuracy": 85, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 119, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 208, + "identifier": "milk-drink", + "generation_id": 2, + "type_id": 1, + "power": null, + "pp": 8, + "accuracy": null, + "priority": 0, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 33, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 209, + "identifier": "spark", + "generation_id": 2, + "type_id": 13, + "power": 65, + "pp": 32, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 7, + "effect_chance": 30, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 210, + "identifier": "fury-cutter", + "generation_id": 2, + "type_id": 7, + "power": 40, + "pp": 32, + "accuracy": 95, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 120, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 211, + "identifier": "steel-wing", + "generation_id": 2, + "type_id": 9, + "power": 70, + "pp": 40, + "accuracy": 90, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 139, + "effect_chance": 10, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 212, + "identifier": "mean-look", + "generation_id": 2, + "type_id": 1, + "power": null, + "pp": 8, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 107, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 213, + "identifier": "attract", + "generation_id": 2, + "type_id": 1, + "power": null, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 121, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 214, + "identifier": "sleep-talk", + "generation_id": 2, + "type_id": 1, + "power": null, + "pp": 16, + "accuracy": null, + "priority": 0, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 98, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 215, + "identifier": "heal-bell", + "generation_id": 2, + "type_id": 1, + "power": null, + "pp": 8, + "accuracy": null, + "priority": 0, + "target_id": 13, + "damage_class_id": 1, + "effect_id": 103, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 216, + "identifier": "return", + "generation_id": 2, + "type_id": 1, + "power": null, + "pp": 32, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 122, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 217, + "identifier": "present", + "generation_id": 2, + "type_id": 1, + "power": null, + "pp": 24, + "accuracy": 90, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 123, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 218, + "identifier": "frustration", + "generation_id": 2, + "type_id": 1, + "power": null, + "pp": 32, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 124, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 219, + "identifier": "safeguard", + "generation_id": 2, + "type_id": 1, + "power": null, + "pp": 40, + "accuracy": null, + "priority": 0, + "target_id": 4, + "damage_class_id": 1, + "effect_id": 125, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 220, + "identifier": "pain-split", + "generation_id": 2, + "type_id": 1, + "power": null, + "pp": 32, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 92, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 221, + "identifier": "sacred-fire", + "generation_id": 2, + "type_id": 10, + "power": 100, + "pp": 8, + "accuracy": 95, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 126, + "effect_chance": 50, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 222, + "identifier": "magnitude", + "generation_id": 2, + "type_id": 5, + "power": null, + "pp": 48, + "accuracy": 100, + "priority": 0, + "target_id": 9, + "damage_class_id": 2, + "effect_id": 127, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 223, + "identifier": "dynamic-punch", + "generation_id": 2, + "type_id": 2, + "power": 100, + "pp": 8, + "accuracy": 50, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 77, + "effect_chance": 100, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 224, + "identifier": "megahorn", + "generation_id": 2, + "type_id": 7, + "power": 120, + "pp": 16, + "accuracy": 85, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 225, + "identifier": "dragon-breath", + "generation_id": 2, + "type_id": 16, + "power": 60, + "pp": 32, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 7, + "effect_chance": 30, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 226, + "identifier": "baton-pass", + "generation_id": 2, + "type_id": 1, + "power": null, + "pp": 64, + "accuracy": null, + "priority": 0, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 128, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 227, + "identifier": "encore", + "generation_id": 2, + "type_id": 1, + "power": null, + "pp": 8, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 91, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 228, + "identifier": "pursuit", + "generation_id": 2, + "type_id": 17, + "power": 40, + "pp": 32, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 129, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 229, + "identifier": "rapid-spin", + "generation_id": 2, + "type_id": 1, + "power": 50, + "pp": 64, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 130, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 230, + "identifier": "sweet-scent", + "generation_id": 2, + "type_id": 1, + "power": null, + "pp": 32, + "accuracy": 100, + "priority": 0, + "target_id": 11, + "damage_class_id": 1, + "effect_id": 25, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 231, + "identifier": "iron-tail", + "generation_id": 2, + "type_id": 9, + "power": 100, + "pp": 24, + "accuracy": 75, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 70, + "effect_chance": 30, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 232, + "identifier": "metal-claw", + "generation_id": 2, + "type_id": 9, + "power": 50, + "pp": 56, + "accuracy": 95, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 140, + "effect_chance": 10, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 233, + "identifier": "vital-throw", + "generation_id": 2, + "type_id": 2, + "power": 70, + "pp": 16, + "accuracy": null, + "priority": -1, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 79, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 234, + "identifier": "morning-sun", + "generation_id": 2, + "type_id": 1, + "power": null, + "pp": 8, + "accuracy": null, + "priority": 0, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 133, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 235, + "identifier": "synthesis", + "generation_id": 2, + "type_id": 12, + "power": null, + "pp": 8, + "accuracy": null, + "priority": 0, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 133, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 236, + "identifier": "moonlight", + "generation_id": 2, + "type_id": 18, + "power": null, + "pp": 8, + "accuracy": null, + "priority": 0, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 133, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 237, + "identifier": "hidden-power", + "generation_id": 2, + "type_id": 1, + "power": 60, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 136, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 238, + "identifier": "cross-chop", + "generation_id": 2, + "type_id": 2, + "power": 100, + "pp": 8, + "accuracy": 80, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 44, + "effect_chance": null, + "crit_rate": 1, + "max_hits": null, + "min_hits": null + }, + { + "id": 239, + "identifier": "twister", + "generation_id": 2, + "type_id": 16, + "power": 40, + "pp": 32, + "accuracy": 100, + "priority": 0, + "target_id": 11, + "damage_class_id": 3, + "effect_id": 147, + "effect_chance": 20, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 240, + "identifier": "rain-dance", + "generation_id": 2, + "type_id": 11, + "power": null, + "pp": 8, + "accuracy": null, + "priority": 0, + "target_id": 12, + "damage_class_id": 1, + "effect_id": 137, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 241, + "identifier": "sunny-day", + "generation_id": 2, + "type_id": 10, + "power": null, + "pp": 8, + "accuracy": null, + "priority": 0, + "target_id": 12, + "damage_class_id": 1, + "effect_id": 138, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 242, + "identifier": "crunch", + "generation_id": 2, + "type_id": 17, + "power": 80, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 70, + "effect_chance": 20, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 243, + "identifier": "mirror-coat", + "generation_id": 2, + "type_id": 14, + "power": null, + "pp": 32, + "accuracy": 100, + "priority": -5, + "target_id": 1, + "damage_class_id": 3, + "effect_id": 145, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 244, + "identifier": "psych-up", + "generation_id": 2, + "type_id": 1, + "power": null, + "pp": 16, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 144, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 245, + "identifier": "extreme-speed", + "generation_id": 2, + "type_id": 1, + "power": 80, + "pp": 8, + "accuracy": 100, + "priority": 2, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 104, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 246, + "identifier": "ancient-power", + "generation_id": 2, + "type_id": 6, + "power": 60, + "pp": 8, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 141, + "effect_chance": 10, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 247, + "identifier": "shadow-ball", + "generation_id": 2, + "type_id": 8, + "power": 80, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 73, + "effect_chance": 20, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 248, + "identifier": "future-sight", + "generation_id": 2, + "type_id": 14, + "power": 120, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 149, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 249, + "identifier": "rock-smash", + "generation_id": 2, + "type_id": 2, + "power": 40, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 70, + "effect_chance": 50, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 250, + "identifier": "whirlpool", + "generation_id": 2, + "type_id": 11, + "power": 35, + "pp": 24, + "accuracy": 85, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 262, + "effect_chance": 100, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 251, + "identifier": "beat-up", + "generation_id": 2, + "type_id": 17, + "power": null, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 155, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 252, + "identifier": "fake-out", + "generation_id": 3, + "type_id": 1, + "power": 40, + "pp": 16, + "accuracy": 100, + "priority": 3, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 159, + "effect_chance": 100, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 253, + "identifier": "uproar", + "generation_id": 3, + "type_id": 1, + "power": 90, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 8, + "damage_class_id": 3, + "effect_id": 160, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 254, + "identifier": "stockpile", + "generation_id": 3, + "type_id": 1, + "power": null, + "pp": 32, + "accuracy": null, + "priority": 0, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 161, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 255, + "identifier": "spit-up", + "generation_id": 3, + "type_id": 1, + "power": null, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 162, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 256, + "identifier": "swallow", + "generation_id": 3, + "type_id": 1, + "power": null, + "pp": 16, + "accuracy": null, + "priority": 0, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 163, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 257, + "identifier": "heat-wave", + "generation_id": 3, + "type_id": 10, + "power": 95, + "pp": 16, + "accuracy": 90, + "priority": 0, + "target_id": 11, + "damage_class_id": 3, + "effect_id": 5, + "effect_chance": 10, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 258, + "identifier": "hail", + "generation_id": 3, + "type_id": 15, + "power": null, + "pp": 16, + "accuracy": null, + "priority": 0, + "target_id": 12, + "damage_class_id": 1, + "effect_id": 165, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 259, + "identifier": "torment", + "generation_id": 3, + "type_id": 17, + "power": null, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 166, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 260, + "identifier": "flatter", + "generation_id": 3, + "type_id": 17, + "power": null, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 167, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 261, + "identifier": "will-o-wisp", + "generation_id": 3, + "type_id": 10, + "power": null, + "pp": 24, + "accuracy": 85, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 168, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 262, + "identifier": "memento", + "generation_id": 3, + "type_id": 17, + "power": null, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 169, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 263, + "identifier": "facade", + "generation_id": 3, + "type_id": 1, + "power": 70, + "pp": 32, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 170, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 264, + "identifier": "focus-punch", + "generation_id": 3, + "type_id": 2, + "power": 150, + "pp": 32, + "accuracy": 100, + "priority": -3, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 171, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 265, + "identifier": "smelling-salts", + "generation_id": 3, + "type_id": 1, + "power": 70, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 172, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 266, + "identifier": "follow-me", + "generation_id": 3, + "type_id": 1, + "power": null, + "pp": 32, + "accuracy": null, + "priority": 2, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 173, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 267, + "identifier": "nature-power", + "generation_id": 3, + "type_id": 1, + "power": null, + "pp": 32, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 174, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 268, + "identifier": "charge", + "generation_id": 3, + "type_id": 13, + "power": null, + "pp": 32, + "accuracy": null, + "priority": 0, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 175, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 269, + "identifier": "taunt", + "generation_id": 3, + "type_id": 17, + "power": null, + "pp": 32, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 176, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 270, + "identifier": "helping-hand", + "generation_id": 3, + "type_id": 1, + "power": null, + "pp": 32, + "accuracy": null, + "priority": 5, + "target_id": 3, + "damage_class_id": 1, + "effect_id": 177, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 271, + "identifier": "trick", + "generation_id": 3, + "type_id": 14, + "power": null, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 178, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 272, + "identifier": "role-play", + "generation_id": 3, + "type_id": 14, + "power": null, + "pp": 16, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 179, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 273, + "identifier": "wish", + "generation_id": 3, + "type_id": 1, + "power": null, + "pp": 16, + "accuracy": null, + "priority": 0, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 180, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 274, + "identifier": "assist", + "generation_id": 3, + "type_id": 1, + "power": null, + "pp": 32, + "accuracy": null, + "priority": 0, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 181, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 275, + "identifier": "ingrain", + "generation_id": 3, + "type_id": 12, + "power": null, + "pp": 32, + "accuracy": null, + "priority": 0, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 182, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 276, + "identifier": "superpower", + "generation_id": 3, + "type_id": 2, + "power": 120, + "pp": 8, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 183, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 277, + "identifier": "magic-coat", + "generation_id": 3, + "type_id": 14, + "power": null, + "pp": 24, + "accuracy": null, + "priority": 4, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 184, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 278, + "identifier": "recycle", + "generation_id": 3, + "type_id": 1, + "power": null, + "pp": 16, + "accuracy": null, + "priority": 0, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 185, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 279, + "identifier": "revenge", + "generation_id": 3, + "type_id": 2, + "power": 60, + "pp": 16, + "accuracy": 100, + "priority": -4, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 186, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 280, + "identifier": "brick-break", + "generation_id": 3, + "type_id": 2, + "power": 75, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 187, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 281, + "identifier": "yawn", + "generation_id": 3, + "type_id": 1, + "power": null, + "pp": 16, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 188, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 282, + "identifier": "knock-off", + "generation_id": 3, + "type_id": 17, + "power": 65, + "pp": 32, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 189, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 283, + "identifier": "endeavor", + "generation_id": 3, + "type_id": 1, + "power": null, + "pp": 8, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 190, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 284, + "identifier": "eruption", + "generation_id": 3, + "type_id": 10, + "power": 150, + "pp": 8, + "accuracy": 100, + "priority": 0, + "target_id": 11, + "damage_class_id": 3, + "effect_id": 191, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 285, + "identifier": "skill-swap", + "generation_id": 3, + "type_id": 14, + "power": null, + "pp": 16, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 192, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 286, + "identifier": "imprison", + "generation_id": 3, + "type_id": 14, + "power": null, + "pp": 16, + "accuracy": null, + "priority": 0, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 193, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 287, + "identifier": "refresh", + "generation_id": 3, + "type_id": 1, + "power": null, + "pp": 32, + "accuracy": null, + "priority": 0, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 194, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 288, + "identifier": "grudge", + "generation_id": 3, + "type_id": 8, + "power": null, + "pp": 8, + "accuracy": null, + "priority": 0, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 195, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 289, + "identifier": "snatch", + "generation_id": 3, + "type_id": 17, + "power": null, + "pp": 16, + "accuracy": null, + "priority": 4, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 196, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 290, + "identifier": "secret-power", + "generation_id": 3, + "type_id": 1, + "power": 70, + "pp": 32, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 198, + "effect_chance": 30, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 291, + "identifier": "dive", + "generation_id": 3, + "type_id": 11, + "power": 80, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 256, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 292, + "identifier": "arm-thrust", + "generation_id": 3, + "type_id": 2, + "power": 15, + "pp": 32, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 30, + "effect_chance": null, + "crit_rate": 0, + "max_hits": 5, + "min_hits": 2 + }, + { + "id": 293, + "identifier": "camouflage", + "generation_id": 3, + "type_id": 1, + "power": null, + "pp": 32, + "accuracy": null, + "priority": 0, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 214, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 294, + "identifier": "tail-glow", + "generation_id": 3, + "type_id": 7, + "power": null, + "pp": 32, + "accuracy": null, + "priority": 0, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 322, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 295, + "identifier": "luster-purge", + "generation_id": 3, + "type_id": 14, + "power": 95, + "pp": 8, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 73, + "effect_chance": 50, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 296, + "identifier": "mist-ball", + "generation_id": 3, + "type_id": 14, + "power": 95, + "pp": 8, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 72, + "effect_chance": 50, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 297, + "identifier": "feather-dance", + "generation_id": 3, + "type_id": 3, + "power": null, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 59, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 298, + "identifier": "teeter-dance", + "generation_id": 3, + "type_id": 1, + "power": null, + "pp": 32, + "accuracy": 100, + "priority": 0, + "target_id": 9, + "damage_class_id": 1, + "effect_id": 200, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 299, + "identifier": "blaze-kick", + "generation_id": 3, + "type_id": 10, + "power": 85, + "pp": 16, + "accuracy": 90, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 201, + "effect_chance": 10, + "crit_rate": 1, + "max_hits": null, + "min_hits": null + }, + { + "id": 300, + "identifier": "mud-sport", + "generation_id": 3, + "type_id": 5, + "power": null, + "pp": 24, + "accuracy": null, + "priority": 0, + "target_id": 12, + "damage_class_id": 1, + "effect_id": 202, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 301, + "identifier": "ice-ball", + "generation_id": 3, + "type_id": 15, + "power": 30, + "pp": 32, + "accuracy": 90, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 118, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 302, + "identifier": "needle-arm", + "generation_id": 3, + "type_id": 12, + "power": 60, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 32, + "effect_chance": 30, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 303, + "identifier": "slack-off", + "generation_id": 3, + "type_id": 1, + "power": null, + "pp": 8, + "accuracy": null, + "priority": 0, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 33, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 304, + "identifier": "hyper-voice", + "generation_id": 3, + "type_id": 1, + "power": 90, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 11, + "damage_class_id": 3, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 305, + "identifier": "poison-fang", + "generation_id": 3, + "type_id": 4, + "power": 50, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 203, + "effect_chance": 50, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 306, + "identifier": "crush-claw", + "generation_id": 3, + "type_id": 1, + "power": 75, + "pp": 16, + "accuracy": 95, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 70, + "effect_chance": 50, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 307, + "identifier": "blast-burn", + "generation_id": 3, + "type_id": 10, + "power": 150, + "pp": 8, + "accuracy": 90, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 81, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 308, + "identifier": "hydro-cannon", + "generation_id": 3, + "type_id": 11, + "power": 150, + "pp": 8, + "accuracy": 90, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 81, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 309, + "identifier": "meteor-mash", + "generation_id": 3, + "type_id": 9, + "power": 90, + "pp": 16, + "accuracy": 90, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 140, + "effect_chance": 20, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 310, + "identifier": "astonish", + "generation_id": 3, + "type_id": 8, + "power": 30, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 32, + "effect_chance": 30, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 311, + "identifier": "weather-ball", + "generation_id": 3, + "type_id": 1, + "power": 50, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 204, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 312, + "identifier": "aromatherapy", + "generation_id": 3, + "type_id": 12, + "power": null, + "pp": 8, + "accuracy": null, + "priority": 0, + "target_id": 13, + "damage_class_id": 1, + "effect_id": 103, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 313, + "identifier": "fake-tears", + "generation_id": 3, + "type_id": 17, + "power": null, + "pp": 32, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 63, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 314, + "identifier": "air-cutter", + "generation_id": 3, + "type_id": 3, + "power": 60, + "pp": 40, + "accuracy": 95, + "priority": 0, + "target_id": 11, + "damage_class_id": 3, + "effect_id": 44, + "effect_chance": null, + "crit_rate": 1, + "max_hits": null, + "min_hits": null + }, + { + "id": 315, + "identifier": "overheat", + "generation_id": 3, + "type_id": 10, + "power": 130, + "pp": 8, + "accuracy": 90, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 205, + "effect_chance": 100, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 316, + "identifier": "odor-sleuth", + "generation_id": 3, + "type_id": 1, + "power": null, + "pp": 64, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 114, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 317, + "identifier": "rock-tomb", + "generation_id": 3, + "type_id": 6, + "power": 60, + "pp": 24, + "accuracy": 95, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 71, + "effect_chance": 100, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 318, + "identifier": "silver-wind", + "generation_id": 3, + "type_id": 7, + "power": 60, + "pp": 8, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 141, + "effect_chance": 10, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 319, + "identifier": "metal-sound", + "generation_id": 3, + "type_id": 9, + "power": null, + "pp": 64, + "accuracy": 85, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 63, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 320, + "identifier": "grass-whistle", + "generation_id": 3, + "type_id": 12, + "power": null, + "pp": 24, + "accuracy": 55, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 2, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 321, + "identifier": "tickle", + "generation_id": 3, + "type_id": 1, + "power": null, + "pp": 32, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 206, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 322, + "identifier": "cosmic-power", + "generation_id": 3, + "type_id": 14, + "power": null, + "pp": 32, + "accuracy": null, + "priority": 0, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 207, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 323, + "identifier": "water-spout", + "generation_id": 3, + "type_id": 11, + "power": 150, + "pp": 8, + "accuracy": 100, + "priority": 0, + "target_id": 11, + "damage_class_id": 3, + "effect_id": 191, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 324, + "identifier": "signal-beam", + "generation_id": 3, + "type_id": 7, + "power": 75, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 77, + "effect_chance": 10, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 325, + "identifier": "shadow-punch", + "generation_id": 3, + "type_id": 8, + "power": 60, + "pp": 32, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 18, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 326, + "identifier": "extrasensory", + "generation_id": 3, + "type_id": 14, + "power": 80, + "pp": 32, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 32, + "effect_chance": 10, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 327, + "identifier": "sky-uppercut", + "generation_id": 3, + "type_id": 2, + "power": 85, + "pp": 24, + "accuracy": 90, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 208, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 328, + "identifier": "sand-tomb", + "generation_id": 3, + "type_id": 5, + "power": 35, + "pp": 24, + "accuracy": 85, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 43, + "effect_chance": 100, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 329, + "identifier": "sheer-cold", + "generation_id": 3, + "type_id": 15, + "power": null, + "pp": 8, + "accuracy": 30, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 39, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 330, + "identifier": "muddy-water", + "generation_id": 3, + "type_id": 11, + "power": 90, + "pp": 16, + "accuracy": 85, + "priority": 0, + "target_id": 11, + "damage_class_id": 3, + "effect_id": 74, + "effect_chance": 30, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 331, + "identifier": "bullet-seed", + "generation_id": 3, + "type_id": 12, + "power": 25, + "pp": 48, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 30, + "effect_chance": null, + "crit_rate": 0, + "max_hits": 5, + "min_hits": 2 + }, + { + "id": 332, + "identifier": "aerial-ace", + "generation_id": 3, + "type_id": 3, + "power": 60, + "pp": 32, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 18, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 333, + "identifier": "icicle-spear", + "generation_id": 3, + "type_id": 15, + "power": 25, + "pp": 48, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 30, + "effect_chance": null, + "crit_rate": 0, + "max_hits": 5, + "min_hits": 2 + }, + { + "id": 334, + "identifier": "iron-defense", + "generation_id": 3, + "type_id": 9, + "power": null, + "pp": 24, + "accuracy": null, + "priority": 0, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 52, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 335, + "identifier": "block", + "generation_id": 3, + "type_id": 1, + "power": null, + "pp": 8, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 107, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 336, + "identifier": "howl", + "generation_id": 3, + "type_id": 1, + "power": null, + "pp": 64, + "accuracy": null, + "priority": 0, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 11, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 337, + "identifier": "dragon-claw", + "generation_id": 3, + "type_id": 16, + "power": 80, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 338, + "identifier": "frenzy-plant", + "generation_id": 3, + "type_id": 12, + "power": 150, + "pp": 8, + "accuracy": 90, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 81, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 339, + "identifier": "bulk-up", + "generation_id": 3, + "type_id": 2, + "power": null, + "pp": 32, + "accuracy": null, + "priority": 0, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 209, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 340, + "identifier": "bounce", + "generation_id": 3, + "type_id": 3, + "power": 85, + "pp": 8, + "accuracy": 85, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 264, + "effect_chance": 30, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 341, + "identifier": "mud-shot", + "generation_id": 3, + "type_id": 5, + "power": 55, + "pp": 24, + "accuracy": 95, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 71, + "effect_chance": 100, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 342, + "identifier": "poison-tail", + "generation_id": 3, + "type_id": 4, + "power": 50, + "pp": 40, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 210, + "effect_chance": 10, + "crit_rate": 1, + "max_hits": null, + "min_hits": null + }, + { + "id": 343, + "identifier": "covet", + "generation_id": 3, + "type_id": 1, + "power": 60, + "pp": 40, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 106, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 344, + "identifier": "volt-tackle", + "generation_id": 3, + "type_id": 13, + "power": 120, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 263, + "effect_chance": 10, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 345, + "identifier": "magical-leaf", + "generation_id": 3, + "type_id": 12, + "power": 60, + "pp": 32, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 18, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 346, + "identifier": "water-sport", + "generation_id": 3, + "type_id": 11, + "power": null, + "pp": 24, + "accuracy": null, + "priority": 0, + "target_id": 12, + "damage_class_id": 1, + "effect_id": 211, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 347, + "identifier": "calm-mind", + "generation_id": 3, + "type_id": 14, + "power": null, + "pp": 32, + "accuracy": null, + "priority": 0, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 212, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 348, + "identifier": "leaf-blade", + "generation_id": 3, + "type_id": 12, + "power": 90, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 44, + "effect_chance": null, + "crit_rate": 1, + "max_hits": null, + "min_hits": null + }, + { + "id": 349, + "identifier": "dragon-dance", + "generation_id": 3, + "type_id": 16, + "power": null, + "pp": 32, + "accuracy": null, + "priority": 0, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 213, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 350, + "identifier": "rock-blast", + "generation_id": 3, + "type_id": 6, + "power": 25, + "pp": 16, + "accuracy": 90, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 30, + "effect_chance": null, + "crit_rate": 0, + "max_hits": 5, + "min_hits": 2 + }, + { + "id": 351, + "identifier": "shock-wave", + "generation_id": 3, + "type_id": 13, + "power": 60, + "pp": 32, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 18, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 352, + "identifier": "water-pulse", + "generation_id": 3, + "type_id": 11, + "power": 60, + "pp": 32, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 77, + "effect_chance": 20, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 353, + "identifier": "doom-desire", + "generation_id": 3, + "type_id": 9, + "power": 140, + "pp": 8, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 149, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 354, + "identifier": "psycho-boost", + "generation_id": 3, + "type_id": 14, + "power": 140, + "pp": 8, + "accuracy": 90, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 205, + "effect_chance": 100, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 355, + "identifier": "roost", + "generation_id": 4, + "type_id": 3, + "power": null, + "pp": 8, + "accuracy": null, + "priority": 0, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 215, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 356, + "identifier": "gravity", + "generation_id": 4, + "type_id": 14, + "power": null, + "pp": 8, + "accuracy": null, + "priority": 0, + "target_id": 12, + "damage_class_id": 1, + "effect_id": 216, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 357, + "identifier": "miracle-eye", + "generation_id": 4, + "type_id": 14, + "power": null, + "pp": 64, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 217, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 358, + "identifier": "wake-up-slap", + "generation_id": 4, + "type_id": 2, + "power": 70, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 218, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 359, + "identifier": "hammer-arm", + "generation_id": 4, + "type_id": 2, + "power": 100, + "pp": 16, + "accuracy": 90, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 219, + "effect_chance": 100, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 360, + "identifier": "gyro-ball", + "generation_id": 4, + "type_id": 9, + "power": null, + "pp": 8, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 220, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 361, + "identifier": "healing-wish", + "generation_id": 4, + "type_id": 14, + "power": null, + "pp": 16, + "accuracy": null, + "priority": 0, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 221, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 362, + "identifier": "brine", + "generation_id": 4, + "type_id": 11, + "power": 65, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 222, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 363, + "identifier": "natural-gift", + "generation_id": 4, + "type_id": 1, + "power": null, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 223, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 364, + "identifier": "feint", + "generation_id": 4, + "type_id": 1, + "power": 30, + "pp": 16, + "accuracy": 100, + "priority": 2, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 224, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 365, + "identifier": "pluck", + "generation_id": 4, + "type_id": 3, + "power": 60, + "pp": 32, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 225, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 366, + "identifier": "tailwind", + "generation_id": 4, + "type_id": 3, + "power": null, + "pp": 24, + "accuracy": null, + "priority": 0, + "target_id": 4, + "damage_class_id": 1, + "effect_id": 226, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 367, + "identifier": "acupressure", + "generation_id": 4, + "type_id": 1, + "power": null, + "pp": 48, + "accuracy": null, + "priority": 0, + "target_id": 5, + "damage_class_id": 1, + "effect_id": 227, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 368, + "identifier": "metal-burst", + "generation_id": 4, + "type_id": 9, + "power": 0, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 1, + "damage_class_id": 2, + "effect_id": 228, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 369, + "identifier": "u-turn", + "generation_id": 4, + "type_id": 7, + "power": 70, + "pp": 32, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 229, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 370, + "identifier": "close-combat", + "generation_id": 4, + "type_id": 2, + "power": 120, + "pp": 8, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 230, + "effect_chance": 100, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 371, + "identifier": "payback", + "generation_id": 4, + "type_id": 17, + "power": 50, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 231, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 372, + "identifier": "assurance", + "generation_id": 4, + "type_id": 17, + "power": 60, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 232, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 373, + "identifier": "embargo", + "generation_id": 4, + "type_id": 17, + "power": null, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 233, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 374, + "identifier": "fling", + "generation_id": 4, + "type_id": 17, + "power": null, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 234, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 375, + "identifier": "psycho-shift", + "generation_id": 4, + "type_id": 14, + "power": null, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 235, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 376, + "identifier": "trump-card", + "generation_id": 4, + "type_id": 1, + "power": null, + "pp": 8, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 236, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 377, + "identifier": "heal-block", + "generation_id": 4, + "type_id": 14, + "power": null, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 11, + "damage_class_id": 1, + "effect_id": 237, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 378, + "identifier": "wring-out", + "generation_id": 4, + "type_id": 1, + "power": null, + "pp": 8, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 238, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 379, + "identifier": "power-trick", + "generation_id": 4, + "type_id": 14, + "power": null, + "pp": 16, + "accuracy": null, + "priority": 0, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 239, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 380, + "identifier": "gastro-acid", + "generation_id": 4, + "type_id": 4, + "power": null, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 240, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 381, + "identifier": "lucky-chant", + "generation_id": 4, + "type_id": 1, + "power": null, + "pp": 48, + "accuracy": null, + "priority": 0, + "target_id": 4, + "damage_class_id": 1, + "effect_id": 241, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 382, + "identifier": "me-first", + "generation_id": 4, + "type_id": 1, + "power": null, + "pp": 32, + "accuracy": null, + "priority": 0, + "target_id": 2, + "damage_class_id": 1, + "effect_id": 242, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 383, + "identifier": "copycat", + "generation_id": 4, + "type_id": 1, + "power": null, + "pp": 32, + "accuracy": null, + "priority": 0, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 243, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 384, + "identifier": "power-swap", + "generation_id": 4, + "type_id": 14, + "power": null, + "pp": 16, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 244, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 385, + "identifier": "guard-swap", + "generation_id": 4, + "type_id": 14, + "power": null, + "pp": 16, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 245, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 386, + "identifier": "punishment", + "generation_id": 4, + "type_id": 17, + "power": null, + "pp": 8, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 246, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 387, + "identifier": "last-resort", + "generation_id": 4, + "type_id": 1, + "power": 140, + "pp": 8, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 247, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 388, + "identifier": "worry-seed", + "generation_id": 4, + "type_id": 12, + "power": null, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 248, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 389, + "identifier": "sucker-punch", + "generation_id": 4, + "type_id": 17, + "power": 70, + "pp": 8, + "accuracy": 100, + "priority": 1, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 249, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 390, + "identifier": "toxic-spikes", + "generation_id": 4, + "type_id": 4, + "power": null, + "pp": 32, + "accuracy": null, + "priority": 0, + "target_id": 6, + "damage_class_id": 1, + "effect_id": 250, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 391, + "identifier": "heart-swap", + "generation_id": 4, + "type_id": 14, + "power": null, + "pp": 16, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 251, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 392, + "identifier": "aqua-ring", + "generation_id": 4, + "type_id": 11, + "power": null, + "pp": 32, + "accuracy": null, + "priority": 0, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 252, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 393, + "identifier": "magnet-rise", + "generation_id": 4, + "type_id": 13, + "power": null, + "pp": 16, + "accuracy": null, + "priority": 0, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 253, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 394, + "identifier": "flare-blitz", + "generation_id": 4, + "type_id": 10, + "power": 120, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 254, + "effect_chance": 10, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 395, + "identifier": "force-palm", + "generation_id": 4, + "type_id": 2, + "power": 60, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 7, + "effect_chance": 30, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 396, + "identifier": "aura-sphere", + "generation_id": 4, + "type_id": 2, + "power": 80, + "pp": 32, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 18, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 397, + "identifier": "rock-polish", + "generation_id": 4, + "type_id": 6, + "power": null, + "pp": 32, + "accuracy": null, + "priority": 0, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 53, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 398, + "identifier": "poison-jab", + "generation_id": 4, + "type_id": 4, + "power": 80, + "pp": 32, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 3, + "effect_chance": 30, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 399, + "identifier": "dark-pulse", + "generation_id": 4, + "type_id": 17, + "power": 80, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 32, + "effect_chance": 20, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 400, + "identifier": "night-slash", + "generation_id": 4, + "type_id": 17, + "power": 70, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 44, + "effect_chance": null, + "crit_rate": 1, + "max_hits": null, + "min_hits": null + }, + { + "id": 401, + "identifier": "aqua-tail", + "generation_id": 4, + "type_id": 11, + "power": 90, + "pp": 16, + "accuracy": 90, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 402, + "identifier": "seed-bomb", + "generation_id": 4, + "type_id": 12, + "power": 80, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 403, + "identifier": "air-slash", + "generation_id": 4, + "type_id": 3, + "power": 75, + "pp": 24, + "accuracy": 95, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 32, + "effect_chance": 30, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 404, + "identifier": "x-scissor", + "generation_id": 4, + "type_id": 7, + "power": 80, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 405, + "identifier": "bug-buzz", + "generation_id": 4, + "type_id": 7, + "power": 90, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 73, + "effect_chance": 10, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 406, + "identifier": "dragon-pulse", + "generation_id": 4, + "type_id": 16, + "power": 85, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 407, + "identifier": "dragon-rush", + "generation_id": 4, + "type_id": 16, + "power": 100, + "pp": 16, + "accuracy": 75, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 32, + "effect_chance": 20, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 408, + "identifier": "power-gem", + "generation_id": 4, + "type_id": 6, + "power": 80, + "pp": 32, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 409, + "identifier": "drain-punch", + "generation_id": 4, + "type_id": 2, + "power": 75, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 4, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 410, + "identifier": "vacuum-wave", + "generation_id": 4, + "type_id": 2, + "power": 40, + "pp": 48, + "accuracy": 100, + "priority": 1, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 104, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 411, + "identifier": "focus-blast", + "generation_id": 4, + "type_id": 2, + "power": 120, + "pp": 8, + "accuracy": 70, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 73, + "effect_chance": 10, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 412, + "identifier": "energy-ball", + "generation_id": 4, + "type_id": 12, + "power": 90, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 73, + "effect_chance": 10, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 413, + "identifier": "brave-bird", + "generation_id": 4, + "type_id": 3, + "power": 120, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 199, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 414, + "identifier": "earth-power", + "generation_id": 4, + "type_id": 5, + "power": 90, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 73, + "effect_chance": 10, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 415, + "identifier": "switcheroo", + "generation_id": 4, + "type_id": 17, + "power": null, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 178, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 416, + "identifier": "giga-impact", + "generation_id": 4, + "type_id": 1, + "power": 150, + "pp": 8, + "accuracy": 90, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 81, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 417, + "identifier": "nasty-plot", + "generation_id": 4, + "type_id": 17, + "power": null, + "pp": 32, + "accuracy": null, + "priority": 0, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 54, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 418, + "identifier": "bullet-punch", + "generation_id": 4, + "type_id": 9, + "power": 40, + "pp": 48, + "accuracy": 100, + "priority": 1, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 104, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 419, + "identifier": "avalanche", + "generation_id": 4, + "type_id": 15, + "power": 60, + "pp": 16, + "accuracy": 100, + "priority": -4, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 186, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 420, + "identifier": "ice-shard", + "generation_id": 4, + "type_id": 15, + "power": 40, + "pp": 48, + "accuracy": 100, + "priority": 1, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 104, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 421, + "identifier": "shadow-claw", + "generation_id": 4, + "type_id": 8, + "power": 70, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 44, + "effect_chance": null, + "crit_rate": 1, + "max_hits": null, + "min_hits": null + }, + { + "id": 422, + "identifier": "thunder-fang", + "generation_id": 4, + "type_id": 13, + "power": 65, + "pp": 24, + "accuracy": 95, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 276, + "effect_chance": 10, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 423, + "identifier": "ice-fang", + "generation_id": 4, + "type_id": 15, + "power": 65, + "pp": 24, + "accuracy": 95, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 275, + "effect_chance": 10, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 424, + "identifier": "fire-fang", + "generation_id": 4, + "type_id": 10, + "power": 65, + "pp": 24, + "accuracy": 95, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 274, + "effect_chance": 10, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 425, + "identifier": "shadow-sneak", + "generation_id": 4, + "type_id": 8, + "power": 40, + "pp": 48, + "accuracy": 100, + "priority": 1, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 104, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 426, + "identifier": "mud-bomb", + "generation_id": 4, + "type_id": 5, + "power": 65, + "pp": 16, + "accuracy": 85, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 74, + "effect_chance": 30, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 427, + "identifier": "psycho-cut", + "generation_id": 4, + "type_id": 14, + "power": 70, + "pp": 32, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 44, + "effect_chance": null, + "crit_rate": 1, + "max_hits": null, + "min_hits": null + }, + { + "id": 428, + "identifier": "zen-headbutt", + "generation_id": 4, + "type_id": 14, + "power": 80, + "pp": 24, + "accuracy": 90, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 32, + "effect_chance": 20, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 429, + "identifier": "mirror-shot", + "generation_id": 4, + "type_id": 9, + "power": 65, + "pp": 16, + "accuracy": 85, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 74, + "effect_chance": 30, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 430, + "identifier": "flash-cannon", + "generation_id": 4, + "type_id": 9, + "power": 80, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 73, + "effect_chance": 10, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 431, + "identifier": "rock-climb", + "generation_id": 4, + "type_id": 1, + "power": 90, + "pp": 32, + "accuracy": 85, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 77, + "effect_chance": 20, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 432, + "identifier": "defog", + "generation_id": 4, + "type_id": 3, + "power": null, + "pp": 24, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 259, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 433, + "identifier": "trick-room", + "generation_id": 4, + "type_id": 14, + "power": null, + "pp": 8, + "accuracy": null, + "priority": -7, + "target_id": 12, + "damage_class_id": 1, + "effect_id": 260, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 434, + "identifier": "draco-meteor", + "generation_id": 4, + "type_id": 16, + "power": 130, + "pp": 8, + "accuracy": 90, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 205, + "effect_chance": 100, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 435, + "identifier": "discharge", + "generation_id": 4, + "type_id": 13, + "power": 80, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 9, + "damage_class_id": 3, + "effect_id": 7, + "effect_chance": 30, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 436, + "identifier": "lava-plume", + "generation_id": 4, + "type_id": 10, + "power": 80, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 9, + "damage_class_id": 3, + "effect_id": 5, + "effect_chance": 30, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 437, + "identifier": "leaf-storm", + "generation_id": 4, + "type_id": 12, + "power": 130, + "pp": 8, + "accuracy": 90, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 205, + "effect_chance": 100, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 438, + "identifier": "power-whip", + "generation_id": 4, + "type_id": 12, + "power": 120, + "pp": 16, + "accuracy": 85, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 439, + "identifier": "rock-wrecker", + "generation_id": 4, + "type_id": 6, + "power": 150, + "pp": 8, + "accuracy": 90, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 81, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 440, + "identifier": "cross-poison", + "generation_id": 4, + "type_id": 4, + "power": 70, + "pp": 32, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 210, + "effect_chance": 10, + "crit_rate": 1, + "max_hits": null, + "min_hits": null + }, + { + "id": 441, + "identifier": "gunk-shot", + "generation_id": 4, + "type_id": 4, + "power": 120, + "pp": 8, + "accuracy": 80, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 3, + "effect_chance": 30, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 442, + "identifier": "iron-head", + "generation_id": 4, + "type_id": 9, + "power": 80, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 32, + "effect_chance": 30, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 443, + "identifier": "magnet-bomb", + "generation_id": 4, + "type_id": 9, + "power": 60, + "pp": 32, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 18, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 444, + "identifier": "stone-edge", + "generation_id": 4, + "type_id": 6, + "power": 100, + "pp": 8, + "accuracy": 80, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 44, + "effect_chance": null, + "crit_rate": 1, + "max_hits": null, + "min_hits": null + }, + { + "id": 445, + "identifier": "captivate", + "generation_id": 4, + "type_id": 1, + "power": null, + "pp": 32, + "accuracy": 100, + "priority": 0, + "target_id": 11, + "damage_class_id": 1, + "effect_id": 266, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 446, + "identifier": "stealth-rock", + "generation_id": 4, + "type_id": 6, + "power": null, + "pp": 32, + "accuracy": null, + "priority": 0, + "target_id": 6, + "damage_class_id": 1, + "effect_id": 267, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 447, + "identifier": "grass-knot", + "generation_id": 4, + "type_id": 12, + "power": null, + "pp": 32, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 197, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 448, + "identifier": "chatter", + "generation_id": 4, + "type_id": 3, + "power": 65, + "pp": 32, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 268, + "effect_chance": 100, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 449, + "identifier": "judgment", + "generation_id": 4, + "type_id": 1, + "power": 100, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 269, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 450, + "identifier": "bug-bite", + "generation_id": 4, + "type_id": 7, + "power": 60, + "pp": 32, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 225, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 451, + "identifier": "charge-beam", + "generation_id": 4, + "type_id": 13, + "power": 50, + "pp": 16, + "accuracy": 90, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 277, + "effect_chance": 70, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 452, + "identifier": "wood-hammer", + "generation_id": 4, + "type_id": 12, + "power": 120, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 199, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 453, + "identifier": "aqua-jet", + "generation_id": 4, + "type_id": 11, + "power": 40, + "pp": 32, + "accuracy": 100, + "priority": 1, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 104, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 454, + "identifier": "attack-order", + "generation_id": 4, + "type_id": 7, + "power": 90, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 44, + "effect_chance": null, + "crit_rate": 1, + "max_hits": null, + "min_hits": null + }, + { + "id": 455, + "identifier": "defend-order", + "generation_id": 4, + "type_id": 7, + "power": null, + "pp": 16, + "accuracy": null, + "priority": 0, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 207, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 456, + "identifier": "heal-order", + "generation_id": 4, + "type_id": 7, + "power": null, + "pp": 16, + "accuracy": null, + "priority": 0, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 33, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 457, + "identifier": "head-smash", + "generation_id": 4, + "type_id": 6, + "power": 150, + "pp": 8, + "accuracy": 80, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 270, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 458, + "identifier": "double-hit", + "generation_id": 4, + "type_id": 1, + "power": 35, + "pp": 16, + "accuracy": 90, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 45, + "effect_chance": null, + "crit_rate": 0, + "max_hits": 2, + "min_hits": 2 + }, + { + "id": 459, + "identifier": "roar-of-time", + "generation_id": 4, + "type_id": 16, + "power": 150, + "pp": 8, + "accuracy": 90, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 81, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 460, + "identifier": "spacial-rend", + "generation_id": 4, + "type_id": 16, + "power": 100, + "pp": 8, + "accuracy": 95, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 44, + "effect_chance": null, + "crit_rate": 1, + "max_hits": null, + "min_hits": null + }, + { + "id": 461, + "identifier": "lunar-dance", + "generation_id": 4, + "type_id": 14, + "power": null, + "pp": 16, + "accuracy": null, + "priority": 0, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 271, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 462, + "identifier": "crush-grip", + "generation_id": 4, + "type_id": 1, + "power": null, + "pp": 8, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 238, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 463, + "identifier": "magma-storm", + "generation_id": 4, + "type_id": 10, + "power": 100, + "pp": 8, + "accuracy": 75, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 43, + "effect_chance": 100, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 464, + "identifier": "dark-void", + "generation_id": 4, + "type_id": 17, + "power": null, + "pp": 16, + "accuracy": 50, + "priority": 0, + "target_id": 11, + "damage_class_id": 1, + "effect_id": 2, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 465, + "identifier": "seed-flare", + "generation_id": 4, + "type_id": 12, + "power": 120, + "pp": 8, + "accuracy": 85, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 272, + "effect_chance": 40, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 466, + "identifier": "ominous-wind", + "generation_id": 4, + "type_id": 8, + "power": 60, + "pp": 8, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 141, + "effect_chance": 10, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 467, + "identifier": "shadow-force", + "generation_id": 4, + "type_id": 8, + "power": 120, + "pp": 8, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 273, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 468, + "identifier": "hone-claws", + "generation_id": 5, + "type_id": 17, + "power": null, + "pp": 24, + "accuracy": null, + "priority": 0, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 278, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 469, + "identifier": "wide-guard", + "generation_id": 5, + "type_id": 6, + "power": null, + "pp": 16, + "accuracy": null, + "priority": 3, + "target_id": 4, + "damage_class_id": 1, + "effect_id": 279, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 470, + "identifier": "guard-split", + "generation_id": 5, + "type_id": 14, + "power": null, + "pp": 16, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 280, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 471, + "identifier": "power-split", + "generation_id": 5, + "type_id": 14, + "power": null, + "pp": 16, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 281, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 472, + "identifier": "wonder-room", + "generation_id": 5, + "type_id": 14, + "power": null, + "pp": 16, + "accuracy": null, + "priority": 0, + "target_id": 12, + "damage_class_id": 1, + "effect_id": 282, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 473, + "identifier": "psyshock", + "generation_id": 5, + "type_id": 14, + "power": 80, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 283, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 474, + "identifier": "venoshock", + "generation_id": 5, + "type_id": 4, + "power": 65, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 284, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 475, + "identifier": "autotomize", + "generation_id": 5, + "type_id": 9, + "power": null, + "pp": 24, + "accuracy": null, + "priority": 0, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 285, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 476, + "identifier": "rage-powder", + "generation_id": 5, + "type_id": 7, + "power": null, + "pp": 32, + "accuracy": null, + "priority": 2, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 173, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 477, + "identifier": "telekinesis", + "generation_id": 5, + "type_id": 14, + "power": null, + "pp": 24, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 286, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 478, + "identifier": "magic-room", + "generation_id": 5, + "type_id": 14, + "power": null, + "pp": 16, + "accuracy": null, + "priority": 0, + "target_id": 12, + "damage_class_id": 1, + "effect_id": 287, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 479, + "identifier": "smack-down", + "generation_id": 5, + "type_id": 6, + "power": 50, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 288, + "effect_chance": 100, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 480, + "identifier": "storm-throw", + "generation_id": 5, + "type_id": 2, + "power": 60, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 289, + "effect_chance": null, + "crit_rate": 6, + "max_hits": null, + "min_hits": null + }, + { + "id": 481, + "identifier": "flame-burst", + "generation_id": 5, + "type_id": 10, + "power": 70, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 290, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 482, + "identifier": "sludge-wave", + "generation_id": 5, + "type_id": 4, + "power": 95, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 9, + "damage_class_id": 3, + "effect_id": 3, + "effect_chance": 10, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 483, + "identifier": "quiver-dance", + "generation_id": 5, + "type_id": 7, + "power": null, + "pp": 32, + "accuracy": null, + "priority": 0, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 291, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 484, + "identifier": "heavy-slam", + "generation_id": 5, + "type_id": 9, + "power": null, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 292, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 485, + "identifier": "synchronoise", + "generation_id": 5, + "type_id": 14, + "power": 120, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 9, + "damage_class_id": 3, + "effect_id": 293, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 486, + "identifier": "electro-ball", + "generation_id": 5, + "type_id": 13, + "power": null, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 294, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 487, + "identifier": "soak", + "generation_id": 5, + "type_id": 11, + "power": null, + "pp": 32, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 295, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 488, + "identifier": "flame-charge", + "generation_id": 5, + "type_id": 10, + "power": 50, + "pp": 32, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 296, + "effect_chance": 100, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 489, + "identifier": "coil", + "generation_id": 5, + "type_id": 4, + "power": null, + "pp": 32, + "accuracy": null, + "priority": 0, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 323, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 490, + "identifier": "low-sweep", + "generation_id": 5, + "type_id": 2, + "power": 65, + "pp": 32, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 21, + "effect_chance": 100, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 491, + "identifier": "acid-spray", + "generation_id": 5, + "type_id": 4, + "power": 40, + "pp": 32, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 297, + "effect_chance": 100, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 492, + "identifier": "foul-play", + "generation_id": 5, + "type_id": 17, + "power": 95, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 298, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 493, + "identifier": "simple-beam", + "generation_id": 5, + "type_id": 1, + "power": null, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 299, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 494, + "identifier": "entrainment", + "generation_id": 5, + "type_id": 1, + "power": null, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 300, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 495, + "identifier": "after-you", + "generation_id": 5, + "type_id": 1, + "power": null, + "pp": 24, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 301, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 496, + "identifier": "round", + "generation_id": 5, + "type_id": 1, + "power": 60, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 302, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 497, + "identifier": "echoed-voice", + "generation_id": 5, + "type_id": 1, + "power": 40, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 303, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 498, + "identifier": "chip-away", + "generation_id": 5, + "type_id": 1, + "power": 70, + "pp": 32, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 304, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 499, + "identifier": "clear-smog", + "generation_id": 5, + "type_id": 4, + "power": 50, + "pp": 24, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 305, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 500, + "identifier": "stored-power", + "generation_id": 5, + "type_id": 14, + "power": 20, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 306, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 501, + "identifier": "quick-guard", + "generation_id": 5, + "type_id": 2, + "power": null, + "pp": 24, + "accuracy": null, + "priority": 3, + "target_id": 4, + "damage_class_id": 1, + "effect_id": 307, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 502, + "identifier": "ally-switch", + "generation_id": 5, + "type_id": 14, + "power": null, + "pp": 24, + "accuracy": null, + "priority": 2, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 308, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 503, + "identifier": "scald", + "generation_id": 5, + "type_id": 11, + "power": 80, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 458, + "effect_chance": 30, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 504, + "identifier": "shell-smash", + "generation_id": 5, + "type_id": 1, + "power": null, + "pp": 24, + "accuracy": null, + "priority": 0, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 309, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 505, + "identifier": "heal-pulse", + "generation_id": 5, + "type_id": 14, + "power": null, + "pp": 16, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 310, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 506, + "identifier": "hex", + "generation_id": 5, + "type_id": 8, + "power": 65, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 311, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 507, + "identifier": "sky-drop", + "generation_id": 5, + "type_id": 3, + "power": 60, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 312, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 508, + "identifier": "shift-gear", + "generation_id": 5, + "type_id": 9, + "power": null, + "pp": 16, + "accuracy": null, + "priority": 0, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 313, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 509, + "identifier": "circle-throw", + "generation_id": 5, + "type_id": 2, + "power": 60, + "pp": 16, + "accuracy": 90, + "priority": -6, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 314, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 510, + "identifier": "incinerate", + "generation_id": 5, + "type_id": 10, + "power": 60, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 11, + "damage_class_id": 3, + "effect_id": 315, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 511, + "identifier": "quash", + "generation_id": 5, + "type_id": 17, + "power": null, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 316, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 512, + "identifier": "acrobatics", + "generation_id": 5, + "type_id": 3, + "power": 55, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 318, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 513, + "identifier": "reflect-type", + "generation_id": 5, + "type_id": 1, + "power": null, + "pp": 24, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 319, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 514, + "identifier": "retaliate", + "generation_id": 5, + "type_id": 1, + "power": 70, + "pp": 8, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 320, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 515, + "identifier": "final-gambit", + "generation_id": 5, + "type_id": 2, + "power": null, + "pp": 8, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 321, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 516, + "identifier": "bestow", + "generation_id": 5, + "type_id": 1, + "power": null, + "pp": 24, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 324, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 517, + "identifier": "inferno", + "generation_id": 5, + "type_id": 10, + "power": 100, + "pp": 8, + "accuracy": 50, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 5, + "effect_chance": 100, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 518, + "identifier": "water-pledge", + "generation_id": 5, + "type_id": 11, + "power": 80, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 325, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 519, + "identifier": "fire-pledge", + "generation_id": 5, + "type_id": 10, + "power": 80, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 326, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 520, + "identifier": "grass-pledge", + "generation_id": 5, + "type_id": 12, + "power": 80, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 327, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 521, + "identifier": "volt-switch", + "generation_id": 5, + "type_id": 13, + "power": 70, + "pp": 32, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 229, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 522, + "identifier": "struggle-bug", + "generation_id": 5, + "type_id": 7, + "power": 50, + "pp": 32, + "accuracy": 100, + "priority": 0, + "target_id": 11, + "damage_class_id": 3, + "effect_id": 72, + "effect_chance": 100, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 523, + "identifier": "bulldoze", + "generation_id": 5, + "type_id": 5, + "power": 60, + "pp": 32, + "accuracy": 100, + "priority": 0, + "target_id": 9, + "damage_class_id": 2, + "effect_id": 71, + "effect_chance": 100, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 524, + "identifier": "frost-breath", + "generation_id": 5, + "type_id": 15, + "power": 60, + "pp": 16, + "accuracy": 90, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 289, + "effect_chance": 100, + "crit_rate": 6, + "max_hits": null, + "min_hits": null + }, + { + "id": 525, + "identifier": "dragon-tail", + "generation_id": 5, + "type_id": 16, + "power": 60, + "pp": 16, + "accuracy": 90, + "priority": -6, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 314, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 526, + "identifier": "work-up", + "generation_id": 5, + "type_id": 1, + "power": null, + "pp": 48, + "accuracy": null, + "priority": 0, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 328, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 527, + "identifier": "electroweb", + "generation_id": 5, + "type_id": 13, + "power": 55, + "pp": 24, + "accuracy": 95, + "priority": 0, + "target_id": 11, + "damage_class_id": 3, + "effect_id": 21, + "effect_chance": 100, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 528, + "identifier": "wild-charge", + "generation_id": 5, + "type_id": 13, + "power": 90, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 49, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 529, + "identifier": "drill-run", + "generation_id": 5, + "type_id": 5, + "power": 80, + "pp": 16, + "accuracy": 95, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 44, + "effect_chance": null, + "crit_rate": 1, + "max_hits": null, + "min_hits": null + }, + { + "id": 530, + "identifier": "dual-chop", + "generation_id": 5, + "type_id": 16, + "power": 40, + "pp": 24, + "accuracy": 90, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 45, + "effect_chance": null, + "crit_rate": 0, + "max_hits": 2, + "min_hits": 2 + }, + { + "id": 531, + "identifier": "heart-stamp", + "generation_id": 5, + "type_id": 14, + "power": 60, + "pp": 40, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 32, + "effect_chance": 30, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 532, + "identifier": "horn-leech", + "generation_id": 5, + "type_id": 12, + "power": 75, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 4, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 533, + "identifier": "sacred-sword", + "generation_id": 5, + "type_id": 2, + "power": 90, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 304, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 534, + "identifier": "razor-shell", + "generation_id": 5, + "type_id": 11, + "power": 75, + "pp": 16, + "accuracy": 95, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 70, + "effect_chance": 50, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 535, + "identifier": "heat-crash", + "generation_id": 5, + "type_id": 10, + "power": null, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 292, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 536, + "identifier": "leaf-tornado", + "generation_id": 5, + "type_id": 12, + "power": 65, + "pp": 16, + "accuracy": 90, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 74, + "effect_chance": 50, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 537, + "identifier": "steamroller", + "generation_id": 5, + "type_id": 7, + "power": 65, + "pp": 32, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 151, + "effect_chance": 30, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 538, + "identifier": "cotton-guard", + "generation_id": 5, + "type_id": 12, + "power": null, + "pp": 16, + "accuracy": null, + "priority": 0, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 329, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 539, + "identifier": "night-daze", + "generation_id": 5, + "type_id": 17, + "power": 85, + "pp": 16, + "accuracy": 95, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 74, + "effect_chance": 40, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 540, + "identifier": "psystrike", + "generation_id": 5, + "type_id": 14, + "power": 100, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 283, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 541, + "identifier": "tail-slap", + "generation_id": 5, + "type_id": 1, + "power": 25, + "pp": 16, + "accuracy": 85, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 30, + "effect_chance": null, + "crit_rate": 0, + "max_hits": 5, + "min_hits": 2 + }, + { + "id": 542, + "identifier": "hurricane", + "generation_id": 5, + "type_id": 3, + "power": 110, + "pp": 16, + "accuracy": 70, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 334, + "effect_chance": 30, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 543, + "identifier": "head-charge", + "generation_id": 5, + "type_id": 1, + "power": 120, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 49, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 544, + "identifier": "gear-grind", + "generation_id": 5, + "type_id": 9, + "power": 50, + "pp": 24, + "accuracy": 85, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 45, + "effect_chance": null, + "crit_rate": 0, + "max_hits": 2, + "min_hits": 2 + }, + { + "id": 545, + "identifier": "searing-shot", + "generation_id": 5, + "type_id": 10, + "power": 100, + "pp": 8, + "accuracy": 100, + "priority": 0, + "target_id": 9, + "damage_class_id": 3, + "effect_id": 5, + "effect_chance": 30, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 546, + "identifier": "techno-blast", + "generation_id": 5, + "type_id": 1, + "power": 120, + "pp": 8, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 269, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 547, + "identifier": "relic-song", + "generation_id": 5, + "type_id": 1, + "power": 75, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 11, + "damage_class_id": 3, + "effect_id": 330, + "effect_chance": 10, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 548, + "identifier": "secret-sword", + "generation_id": 5, + "type_id": 2, + "power": 85, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 283, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 549, + "identifier": "glaciate", + "generation_id": 5, + "type_id": 15, + "power": 65, + "pp": 16, + "accuracy": 95, + "priority": 0, + "target_id": 11, + "damage_class_id": 3, + "effect_id": 331, + "effect_chance": 100, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 550, + "identifier": "bolt-strike", + "generation_id": 5, + "type_id": 13, + "power": 130, + "pp": 8, + "accuracy": 85, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 7, + "effect_chance": 20, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 551, + "identifier": "blue-flare", + "generation_id": 5, + "type_id": 10, + "power": 130, + "pp": 8, + "accuracy": 85, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 5, + "effect_chance": 20, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 552, + "identifier": "fiery-dance", + "generation_id": 5, + "type_id": 10, + "power": 80, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 277, + "effect_chance": 50, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 553, + "identifier": "freeze-shock", + "generation_id": 5, + "type_id": 15, + "power": 140, + "pp": 8, + "accuracy": 90, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 332, + "effect_chance": 30, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 554, + "identifier": "ice-burn", + "generation_id": 5, + "type_id": 15, + "power": 140, + "pp": 8, + "accuracy": 90, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 333, + "effect_chance": 30, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 555, + "identifier": "snarl", + "generation_id": 5, + "type_id": 17, + "power": 55, + "pp": 24, + "accuracy": 95, + "priority": 0, + "target_id": 11, + "damage_class_id": 3, + "effect_id": 72, + "effect_chance": 100, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 556, + "identifier": "icicle-crash", + "generation_id": 5, + "type_id": 15, + "power": 85, + "pp": 16, + "accuracy": 90, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 32, + "effect_chance": 30, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 557, + "identifier": "v-create", + "generation_id": 5, + "type_id": 10, + "power": 180, + "pp": 8, + "accuracy": 95, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 335, + "effect_chance": 100, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 558, + "identifier": "fusion-flare", + "generation_id": 5, + "type_id": 10, + "power": 100, + "pp": 8, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 336, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 559, + "identifier": "fusion-bolt", + "generation_id": 5, + "type_id": 13, + "power": 100, + "pp": 8, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 337, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 560, + "identifier": "flying-press", + "generation_id": 6, + "type_id": 2, + "power": 100, + "pp": 16, + "accuracy": 95, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 338, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 561, + "identifier": "mat-block", + "generation_id": 6, + "type_id": 2, + "power": null, + "pp": 16, + "accuracy": null, + "priority": 0, + "target_id": 4, + "damage_class_id": 1, + "effect_id": 377, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 562, + "identifier": "belch", + "generation_id": 6, + "type_id": 4, + "power": 120, + "pp": 16, + "accuracy": 90, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 339, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 563, + "identifier": "rototiller", + "generation_id": 6, + "type_id": 5, + "power": null, + "pp": 16, + "accuracy": null, + "priority": 0, + "target_id": 14, + "damage_class_id": 1, + "effect_id": 340, + "effect_chance": 100, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 564, + "identifier": "sticky-web", + "generation_id": 6, + "type_id": 7, + "power": null, + "pp": 32, + "accuracy": null, + "priority": 0, + "target_id": 6, + "damage_class_id": 1, + "effect_id": 341, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 565, + "identifier": "fell-stinger", + "generation_id": 6, + "type_id": 7, + "power": 50, + "pp": 40, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 342, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 566, + "identifier": "phantom-force", + "generation_id": 6, + "type_id": 8, + "power": 90, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 273, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 567, + "identifier": "trick-or-treat", + "generation_id": 6, + "type_id": 8, + "power": null, + "pp": 32, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 343, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 568, + "identifier": "noble-roar", + "generation_id": 6, + "type_id": 1, + "power": null, + "pp": 48, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 344, + "effect_chance": 100, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 569, + "identifier": "ion-deluge", + "generation_id": 6, + "type_id": 13, + "power": null, + "pp": 40, + "accuracy": null, + "priority": 1, + "target_id": 12, + "damage_class_id": 1, + "effect_id": 345, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 570, + "identifier": "parabolic-charge", + "generation_id": 6, + "type_id": 13, + "power": 65, + "pp": 32, + "accuracy": 100, + "priority": 0, + "target_id": 9, + "damage_class_id": 3, + "effect_id": 346, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 571, + "identifier": "forests-curse", + "generation_id": 6, + "type_id": 12, + "power": null, + "pp": 32, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 376, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 572, + "identifier": "petal-blizzard", + "generation_id": 6, + "type_id": 12, + "power": 90, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 9, + "damage_class_id": 2, + "effect_id": 379, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 573, + "identifier": "freeze-dry", + "generation_id": 6, + "type_id": 15, + "power": 70, + "pp": 32, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 380, + "effect_chance": 10, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 574, + "identifier": "disarming-voice", + "generation_id": 6, + "type_id": 18, + "power": 40, + "pp": 24, + "accuracy": null, + "priority": 0, + "target_id": 11, + "damage_class_id": 3, + "effect_id": 381, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 575, + "identifier": "parting-shot", + "generation_id": 6, + "type_id": 17, + "power": null, + "pp": 32, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 347, + "effect_chance": 100, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 576, + "identifier": "topsy-turvy", + "generation_id": 6, + "type_id": 17, + "power": null, + "pp": 32, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 348, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 577, + "identifier": "draining-kiss", + "generation_id": 6, + "type_id": 18, + "power": 50, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 349, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 578, + "identifier": "crafty-shield", + "generation_id": 6, + "type_id": 18, + "power": null, + "pp": 16, + "accuracy": null, + "priority": 3, + "target_id": 4, + "damage_class_id": 1, + "effect_id": 350, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 579, + "identifier": "flower-shield", + "generation_id": 6, + "type_id": 18, + "power": null, + "pp": 16, + "accuracy": null, + "priority": 0, + "target_id": 14, + "damage_class_id": 1, + "effect_id": 351, + "effect_chance": 100, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 580, + "identifier": "grassy-terrain", + "generation_id": 6, + "type_id": 12, + "power": null, + "pp": 16, + "accuracy": null, + "priority": 0, + "target_id": 12, + "damage_class_id": 1, + "effect_id": 352, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 581, + "identifier": "misty-terrain", + "generation_id": 6, + "type_id": 18, + "power": null, + "pp": 16, + "accuracy": null, + "priority": 0, + "target_id": 12, + "damage_class_id": 1, + "effect_id": 353, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 582, + "identifier": "electrify", + "generation_id": 6, + "type_id": 13, + "power": null, + "pp": 32, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 354, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 583, + "identifier": "play-rough", + "generation_id": 6, + "type_id": 18, + "power": 90, + "pp": 16, + "accuracy": 90, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 69, + "effect_chance": 10, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 584, + "identifier": "fairy-wind", + "generation_id": 6, + "type_id": 18, + "power": 40, + "pp": 48, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 585, + "identifier": "moonblast", + "generation_id": 6, + "type_id": 18, + "power": 95, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 72, + "effect_chance": 30, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 586, + "identifier": "boomburst", + "generation_id": 6, + "type_id": 1, + "power": 140, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 9, + "damage_class_id": 3, + "effect_id": 379, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 587, + "identifier": "fairy-lock", + "generation_id": 6, + "type_id": 18, + "power": null, + "pp": 16, + "accuracy": null, + "priority": 0, + "target_id": 12, + "damage_class_id": 1, + "effect_id": 355, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 588, + "identifier": "kings-shield", + "generation_id": 6, + "type_id": 9, + "power": null, + "pp": 16, + "accuracy": null, + "priority": 4, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 356, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 589, + "identifier": "play-nice", + "generation_id": 6, + "type_id": 1, + "power": null, + "pp": 32, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 19, + "effect_chance": 100, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 590, + "identifier": "confide", + "generation_id": 6, + "type_id": 1, + "power": null, + "pp": 32, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 358, + "effect_chance": 100, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 591, + "identifier": "diamond-storm", + "generation_id": 6, + "type_id": 6, + "power": 100, + "pp": 8, + "accuracy": 95, + "priority": 0, + "target_id": 11, + "damage_class_id": 2, + "effect_id": 359, + "effect_chance": 50, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 592, + "identifier": "steam-eruption", + "generation_id": 6, + "type_id": 11, + "power": 110, + "pp": 8, + "accuracy": 95, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 458, + "effect_chance": 30, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 593, + "identifier": "hyperspace-hole", + "generation_id": 6, + "type_id": 14, + "power": 80, + "pp": 8, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 360, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 594, + "identifier": "water-shuriken", + "generation_id": 6, + "type_id": 11, + "power": 15, + "pp": 32, + "accuracy": 100, + "priority": 1, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 361, + "effect_chance": null, + "crit_rate": 0, + "max_hits": 5, + "min_hits": 2 + }, + { + "id": 595, + "identifier": "mystical-fire", + "generation_id": 6, + "type_id": 10, + "power": 75, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 72, + "effect_chance": 100, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 596, + "identifier": "spiky-shield", + "generation_id": 6, + "type_id": 12, + "power": null, + "pp": 16, + "accuracy": null, + "priority": 4, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 362, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 597, + "identifier": "aromatic-mist", + "generation_id": 6, + "type_id": 18, + "power": null, + "pp": 32, + "accuracy": null, + "priority": 0, + "target_id": 3, + "damage_class_id": 1, + "effect_id": 363, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 598, + "identifier": "eerie-impulse", + "generation_id": 6, + "type_id": 13, + "power": null, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 62, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 599, + "identifier": "venom-drench", + "generation_id": 6, + "type_id": 4, + "power": null, + "pp": 32, + "accuracy": 100, + "priority": 0, + "target_id": 11, + "damage_class_id": 1, + "effect_id": 364, + "effect_chance": 100, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 600, + "identifier": "powder", + "generation_id": 6, + "type_id": 7, + "power": null, + "pp": 32, + "accuracy": 100, + "priority": 1, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 378, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 601, + "identifier": "geomancy", + "generation_id": 6, + "type_id": 18, + "power": null, + "pp": 16, + "accuracy": null, + "priority": 0, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 366, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 602, + "identifier": "magnetic-flux", + "generation_id": 6, + "type_id": 13, + "power": null, + "pp": 32, + "accuracy": null, + "priority": 0, + "target_id": 13, + "damage_class_id": 1, + "effect_id": 367, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 603, + "identifier": "happy-hour", + "generation_id": 6, + "type_id": 1, + "power": null, + "pp": 48, + "accuracy": null, + "priority": 0, + "target_id": 4, + "damage_class_id": 1, + "effect_id": 368, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 604, + "identifier": "electric-terrain", + "generation_id": 6, + "type_id": 13, + "power": null, + "pp": 16, + "accuracy": null, + "priority": 0, + "target_id": 12, + "damage_class_id": 1, + "effect_id": 369, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 605, + "identifier": "dazzling-gleam", + "generation_id": 6, + "type_id": 18, + "power": 80, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 11, + "damage_class_id": 3, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 606, + "identifier": "celebrate", + "generation_id": 6, + "type_id": 1, + "power": null, + "pp": 64, + "accuracy": null, + "priority": 0, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 370, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 607, + "identifier": "hold-hands", + "generation_id": 6, + "type_id": 1, + "power": null, + "pp": 64, + "accuracy": null, + "priority": 0, + "target_id": 3, + "damage_class_id": 1, + "effect_id": 371, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 608, + "identifier": "baby-doll-eyes", + "generation_id": 6, + "type_id": 18, + "power": null, + "pp": 48, + "accuracy": 100, + "priority": 1, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 19, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 609, + "identifier": "nuzzle", + "generation_id": 6, + "type_id": 13, + "power": 20, + "pp": 32, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 372, + "effect_chance": 100, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 610, + "identifier": "hold-back", + "generation_id": 6, + "type_id": 1, + "power": 40, + "pp": 64, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 102, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 611, + "identifier": "infestation", + "generation_id": 6, + "type_id": 7, + "power": 20, + "pp": 32, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 43, + "effect_chance": 100, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 612, + "identifier": "power-up-punch", + "generation_id": 6, + "type_id": 2, + "power": 40, + "pp": 32, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 375, + "effect_chance": 100, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 613, + "identifier": "oblivion-wing", + "generation_id": 6, + "type_id": 3, + "power": 80, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 349, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 614, + "identifier": "thousand-arrows", + "generation_id": 6, + "type_id": 5, + "power": 90, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 11, + "damage_class_id": 2, + "effect_id": 373, + "effect_chance": 100, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 615, + "identifier": "thousand-waves", + "generation_id": 6, + "type_id": 5, + "power": 90, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 11, + "damage_class_id": 2, + "effect_id": 374, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 616, + "identifier": "lands-wrath", + "generation_id": 6, + "type_id": 5, + "power": 90, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 11, + "damage_class_id": 2, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 617, + "identifier": "light-of-ruin", + "generation_id": 6, + "type_id": 18, + "power": 140, + "pp": 8, + "accuracy": 90, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 270, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 618, + "identifier": "origin-pulse", + "generation_id": 6, + "type_id": 11, + "power": 110, + "pp": 16, + "accuracy": 85, + "priority": 0, + "target_id": 11, + "damage_class_id": 3, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 619, + "identifier": "precipice-blades", + "generation_id": 6, + "type_id": 5, + "power": 120, + "pp": 16, + "accuracy": 85, + "priority": 0, + "target_id": 11, + "damage_class_id": 2, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 620, + "identifier": "dragon-ascent", + "generation_id": 6, + "type_id": 3, + "power": 120, + "pp": 8, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 230, + "effect_chance": 100, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 621, + "identifier": "hyperspace-fury", + "generation_id": 6, + "type_id": 17, + "power": 100, + "pp": 8, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 438, + "effect_chance": 100, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 622, + "identifier": "breakneck-blitz--physical", + "generation_id": 7, + "type_id": 1, + "power": null, + "pp": 1, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 623, + "identifier": "breakneck-blitz--special", + "generation_id": 7, + "type_id": 1, + "power": null, + "pp": 1, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 624, + "identifier": "all-out-pummeling--physical", + "generation_id": 7, + "type_id": 2, + "power": null, + "pp": 1, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 625, + "identifier": "all-out-pummeling--special", + "generation_id": 7, + "type_id": 2, + "power": null, + "pp": 1, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 626, + "identifier": "supersonic-skystrike--physical", + "generation_id": 7, + "type_id": 3, + "power": null, + "pp": 1, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 627, + "identifier": "supersonic-skystrike--special", + "generation_id": 7, + "type_id": 3, + "power": null, + "pp": 1, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 628, + "identifier": "acid-downpour--physical", + "generation_id": 7, + "type_id": 4, + "power": null, + "pp": 1, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 629, + "identifier": "acid-downpour--special", + "generation_id": 7, + "type_id": 4, + "power": null, + "pp": 1, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 630, + "identifier": "tectonic-rage--physical", + "generation_id": 7, + "type_id": 5, + "power": null, + "pp": 1, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 631, + "identifier": "tectonic-rage--special", + "generation_id": 7, + "type_id": 5, + "power": null, + "pp": 1, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 632, + "identifier": "continental-crush--physical", + "generation_id": 7, + "type_id": 6, + "power": null, + "pp": 1, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 633, + "identifier": "continental-crush--special", + "generation_id": 7, + "type_id": 6, + "power": null, + "pp": 1, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 634, + "identifier": "savage-spin-out--physical", + "generation_id": 7, + "type_id": 7, + "power": null, + "pp": 1, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 635, + "identifier": "savage-spin-out--special", + "generation_id": 7, + "type_id": 7, + "power": null, + "pp": 1, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 636, + "identifier": "never-ending-nightmare--physical", + "generation_id": 7, + "type_id": 8, + "power": null, + "pp": 1, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 637, + "identifier": "never-ending-nightmare--special", + "generation_id": 7, + "type_id": 8, + "power": null, + "pp": 1, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 638, + "identifier": "corkscrew-crash--physical", + "generation_id": 7, + "type_id": 9, + "power": null, + "pp": 1, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 639, + "identifier": "corkscrew-crash--special", + "generation_id": 7, + "type_id": 9, + "power": null, + "pp": 1, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 640, + "identifier": "inferno-overdrive--physical", + "generation_id": 7, + "type_id": 10, + "power": null, + "pp": 1, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 641, + "identifier": "inferno-overdrive--special", + "generation_id": 7, + "type_id": 10, + "power": null, + "pp": 1, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 642, + "identifier": "hydro-vortex--physical", + "generation_id": 7, + "type_id": 11, + "power": null, + "pp": 1, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 643, + "identifier": "hydro-vortex--special", + "generation_id": 7, + "type_id": 11, + "power": null, + "pp": 1, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 644, + "identifier": "bloom-doom--physical", + "generation_id": 7, + "type_id": 12, + "power": null, + "pp": 1, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 645, + "identifier": "bloom-doom--special", + "generation_id": 7, + "type_id": 12, + "power": null, + "pp": 1, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 646, + "identifier": "gigavolt-havoc--physical", + "generation_id": 7, + "type_id": 13, + "power": null, + "pp": 1, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 647, + "identifier": "gigavolt-havoc--special", + "generation_id": 7, + "type_id": 13, + "power": null, + "pp": 1, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 648, + "identifier": "shattered-psyche--physical", + "generation_id": 7, + "type_id": 14, + "power": null, + "pp": 1, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 649, + "identifier": "shattered-psyche--special", + "generation_id": 7, + "type_id": 14, + "power": null, + "pp": 1, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 650, + "identifier": "subzero-slammer--physical", + "generation_id": 7, + "type_id": 15, + "power": null, + "pp": 1, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 651, + "identifier": "subzero-slammer--special", + "generation_id": 7, + "type_id": 15, + "power": null, + "pp": 1, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 652, + "identifier": "devastating-drake--physical", + "generation_id": 7, + "type_id": 16, + "power": null, + "pp": 1, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 653, + "identifier": "devastating-drake--special", + "generation_id": 7, + "type_id": 16, + "power": null, + "pp": 1, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 654, + "identifier": "black-hole-eclipse--physical", + "generation_id": 7, + "type_id": 17, + "power": null, + "pp": 1, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 655, + "identifier": "black-hole-eclipse--special", + "generation_id": 7, + "type_id": 17, + "power": null, + "pp": 1, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 656, + "identifier": "twinkle-tackle--physical", + "generation_id": 7, + "type_id": 18, + "power": null, + "pp": 1, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 657, + "identifier": "twinkle-tackle--special", + "generation_id": 7, + "type_id": 18, + "power": null, + "pp": 1, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 658, + "identifier": "catastropika", + "generation_id": 7, + "type_id": 13, + "power": 210, + "pp": 1, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 659, + "identifier": "shore-up", + "generation_id": 7, + "type_id": 5, + "power": null, + "pp": 8, + "accuracy": null, + "priority": 0, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 382, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 660, + "identifier": "first-impression", + "generation_id": 7, + "type_id": 7, + "power": 90, + "pp": 16, + "accuracy": 100, + "priority": 2, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 383, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 661, + "identifier": "baneful-bunker", + "generation_id": 7, + "type_id": 4, + "power": null, + "pp": 16, + "accuracy": null, + "priority": 4, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 384, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 662, + "identifier": "spirit-shackle", + "generation_id": 7, + "type_id": 8, + "power": 80, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 385, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 663, + "identifier": "darkest-lariat", + "generation_id": 7, + "type_id": 17, + "power": 85, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 304, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 664, + "identifier": "sparkling-aria", + "generation_id": 7, + "type_id": 11, + "power": 90, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 9, + "damage_class_id": 3, + "effect_id": 386, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 665, + "identifier": "ice-hammer", + "generation_id": 7, + "type_id": 15, + "power": 100, + "pp": 16, + "accuracy": 90, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 219, + "effect_chance": 100, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 666, + "identifier": "floral-healing", + "generation_id": 7, + "type_id": 18, + "power": null, + "pp": 16, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 387, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 667, + "identifier": "high-horsepower", + "generation_id": 7, + "type_id": 5, + "power": 95, + "pp": 16, + "accuracy": 95, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 668, + "identifier": "strength-sap", + "generation_id": 7, + "type_id": 12, + "power": null, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 388, + "effect_chance": 100, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 669, + "identifier": "solar-blade", + "generation_id": 7, + "type_id": 12, + "power": 125, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 152, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 670, + "identifier": "leafage", + "generation_id": 7, + "type_id": 12, + "power": 40, + "pp": 64, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 671, + "identifier": "spotlight", + "generation_id": 7, + "type_id": 1, + "power": null, + "pp": 24, + "accuracy": null, + "priority": 3, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 389, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 672, + "identifier": "toxic-thread", + "generation_id": 7, + "type_id": 4, + "power": null, + "pp": 32, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 390, + "effect_chance": 100, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 673, + "identifier": "laser-focus", + "generation_id": 7, + "type_id": 1, + "power": null, + "pp": 48, + "accuracy": null, + "priority": 0, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 391, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 674, + "identifier": "gear-up", + "generation_id": 7, + "type_id": 9, + "power": null, + "pp": 32, + "accuracy": null, + "priority": 0, + "target_id": 13, + "damage_class_id": 1, + "effect_id": 392, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 675, + "identifier": "throat-chop", + "generation_id": 7, + "type_id": 17, + "power": 80, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 393, + "effect_chance": 100, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 676, + "identifier": "pollen-puff", + "generation_id": 7, + "type_id": 7, + "power": 90, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 394, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 677, + "identifier": "anchor-shot", + "generation_id": 7, + "type_id": 9, + "power": 80, + "pp": 32, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 385, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 678, + "identifier": "psychic-terrain", + "generation_id": 7, + "type_id": 14, + "power": null, + "pp": 16, + "accuracy": null, + "priority": 0, + "target_id": 12, + "damage_class_id": 1, + "effect_id": 395, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 679, + "identifier": "lunge", + "generation_id": 7, + "type_id": 7, + "power": 80, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 19, + "effect_chance": 100, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 680, + "identifier": "fire-lash", + "generation_id": 7, + "type_id": 10, + "power": 80, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 397, + "effect_chance": 100, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 681, + "identifier": "power-trip", + "generation_id": 7, + "type_id": 17, + "power": 20, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 306, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 682, + "identifier": "burn-up", + "generation_id": 7, + "type_id": 10, + "power": 130, + "pp": 8, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 398, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 683, + "identifier": "speed-swap", + "generation_id": 7, + "type_id": 14, + "power": null, + "pp": 16, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 399, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 684, + "identifier": "smart-strike", + "generation_id": 7, + "type_id": 9, + "power": 70, + "pp": 16, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 18, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 685, + "identifier": "purify", + "generation_id": 7, + "type_id": 4, + "power": null, + "pp": 32, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 400, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 686, + "identifier": "revelation-dance", + "generation_id": 7, + "type_id": 1, + "power": 90, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 401, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 687, + "identifier": "core-enforcer", + "generation_id": 7, + "type_id": 16, + "power": 100, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 11, + "damage_class_id": 3, + "effect_id": 402, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 688, + "identifier": "trop-kick", + "generation_id": 7, + "type_id": 12, + "power": 70, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 19, + "effect_chance": 100, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 689, + "identifier": "instruct", + "generation_id": 7, + "type_id": 14, + "power": null, + "pp": 24, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 403, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 690, + "identifier": "beak-blast", + "generation_id": 7, + "type_id": 3, + "power": 100, + "pp": 24, + "accuracy": 100, + "priority": -3, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 404, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 691, + "identifier": "clanging-scales", + "generation_id": 7, + "type_id": 16, + "power": 110, + "pp": 8, + "accuracy": 100, + "priority": 0, + "target_id": 11, + "damage_class_id": 3, + "effect_id": 405, + "effect_chance": 100, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 692, + "identifier": "dragon-hammer", + "generation_id": 7, + "type_id": 16, + "power": 90, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 693, + "identifier": "brutal-swing", + "generation_id": 7, + "type_id": 17, + "power": 60, + "pp": 32, + "accuracy": 100, + "priority": 0, + "target_id": 9, + "damage_class_id": 2, + "effect_id": 406, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 694, + "identifier": "aurora-veil", + "generation_id": 7, + "type_id": 15, + "power": null, + "pp": 32, + "accuracy": null, + "priority": 0, + "target_id": 4, + "damage_class_id": 1, + "effect_id": 407, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 695, + "identifier": "sinister-arrow-raid", + "generation_id": 7, + "type_id": 8, + "power": 180, + "pp": 1, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 696, + "identifier": "malicious-moonsault", + "generation_id": 7, + "type_id": 17, + "power": 180, + "pp": 1, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 697, + "identifier": "oceanic-operetta", + "generation_id": 7, + "type_id": 11, + "power": 195, + "pp": 1, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 698, + "identifier": "guardian-of-alola", + "generation_id": 7, + "type_id": 18, + "power": null, + "pp": 1, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 413, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 699, + "identifier": "soul-stealing-7-star-strike", + "generation_id": 7, + "type_id": 8, + "power": 195, + "pp": 1, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 700, + "identifier": "stoked-sparksurfer", + "generation_id": 7, + "type_id": 13, + "power": 175, + "pp": 1, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 7, + "effect_chance": 100, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 701, + "identifier": "pulverizing-pancake", + "generation_id": 7, + "type_id": 1, + "power": 210, + "pp": 1, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 702, + "identifier": "extreme-evoboost", + "generation_id": 7, + "type_id": 1, + "power": null, + "pp": 1, + "accuracy": null, + "priority": 0, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 10007, + "effect_chance": 100, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 703, + "identifier": "genesis-supernova", + "generation_id": 7, + "type_id": 14, + "power": 185, + "pp": 1, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 415, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 704, + "identifier": "shell-trap", + "generation_id": 7, + "type_id": 10, + "power": 150, + "pp": 8, + "accuracy": 100, + "priority": -3, + "target_id": 11, + "damage_class_id": 3, + "effect_id": 408, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 705, + "identifier": "fleur-cannon", + "generation_id": 7, + "type_id": 18, + "power": 130, + "pp": 8, + "accuracy": 90, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 205, + "effect_chance": 100, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 706, + "identifier": "psychic-fangs", + "generation_id": 7, + "type_id": 14, + "power": 85, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 187, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 707, + "identifier": "stomping-tantrum", + "generation_id": 7, + "type_id": 5, + "power": 75, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 409, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 708, + "identifier": "shadow-bone", + "generation_id": 7, + "type_id": 8, + "power": 85, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 70, + "effect_chance": 20, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 709, + "identifier": "accelerock", + "generation_id": 7, + "type_id": 6, + "power": 40, + "pp": 32, + "accuracy": 100, + "priority": 1, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 104, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 710, + "identifier": "liquidation", + "generation_id": 7, + "type_id": 11, + "power": 85, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 70, + "effect_chance": 20, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 711, + "identifier": "prismatic-laser", + "generation_id": 7, + "type_id": 14, + "power": 160, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 81, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 712, + "identifier": "spectral-thief", + "generation_id": 7, + "type_id": 8, + "power": 90, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 410, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 713, + "identifier": "sunsteel-strike", + "generation_id": 7, + "type_id": 9, + "power": 100, + "pp": 8, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 411, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 714, + "identifier": "moongeist-beam", + "generation_id": 7, + "type_id": 8, + "power": 100, + "pp": 8, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 411, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 715, + "identifier": "tearful-look", + "generation_id": 7, + "type_id": 1, + "power": null, + "pp": 32, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 412, + "effect_chance": 100, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 716, + "identifier": "zing-zap", + "generation_id": 7, + "type_id": 13, + "power": 80, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 32, + "effect_chance": 30, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 717, + "identifier": "natures-madness", + "generation_id": 7, + "type_id": 18, + "power": null, + "pp": 16, + "accuracy": 90, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 41, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 718, + "identifier": "multi-attack", + "generation_id": 7, + "type_id": 1, + "power": 90, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 269, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 719, + "identifier": "10-000-000-volt-thunderbolt", + "generation_id": 7, + "type_id": 13, + "power": 195, + "pp": 1, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 2, + "max_hits": null, + "min_hits": null + }, + { + "id": 720, + "identifier": "mind-blown", + "generation_id": 7, + "type_id": 10, + "power": 150, + "pp": 8, + "accuracy": 100, + "priority": 0, + "target_id": 9, + "damage_class_id": 3, + "effect_id": 420, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 721, + "identifier": "plasma-fists", + "generation_id": 7, + "type_id": 13, + "power": 100, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 455, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 722, + "identifier": "photon-geyser", + "generation_id": 7, + "type_id": 14, + "power": 100, + "pp": 8, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 460, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 723, + "identifier": "light-that-burns-the-sky", + "generation_id": 7, + "type_id": 14, + "power": 200, + "pp": 1, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 416, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 724, + "identifier": "searing-sunraze-smash", + "generation_id": 7, + "type_id": 9, + "power": 200, + "pp": 1, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 411, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 725, + "identifier": "menacing-moonraze-maelstrom", + "generation_id": 7, + "type_id": 8, + "power": 200, + "pp": 1, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 411, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 726, + "identifier": "lets-snuggle-forever", + "generation_id": 7, + "type_id": 18, + "power": 190, + "pp": 1, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 417, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 727, + "identifier": "splintered-stormshards", + "generation_id": 7, + "type_id": 6, + "power": 190, + "pp": 1, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 418, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 728, + "identifier": "clangorous-soulblaze", + "generation_id": 7, + "type_id": 16, + "power": 185, + "pp": 1, + "accuracy": null, + "priority": 0, + "target_id": 11, + "damage_class_id": 3, + "effect_id": 419, + "effect_chance": 100, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 729, + "identifier": "double-iron-bash", + "generation_id": 8, + "type_id": 9, + "power": 60, + "pp": 8, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 32, + "effect_chance": 30, + "crit_rate": 0, + "max_hits": 2, + "min_hits": 2 + }, + { + "id": 730, + "identifier": "branch-poke", + "generation_id": 1, + "type_id": 12, + "power": 45, + "pp": 40, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 731, + "identifier": "dynamax-cannon", + "generation_id": 8, + "type_id": 16, + "power": 100, + "pp": 8, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 732, + "identifier": "snipe-shot", + "generation_id": 8, + "type_id": 11, + "power": 80, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 459, + "effect_chance": null, + "crit_rate": 1, + "max_hits": null, + "min_hits": null + }, + { + "id": 733, + "identifier": "jaw-lock", + "generation_id": 8, + "type_id": 17, + "power": 80, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 449, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 734, + "identifier": "stuff-cheeks", + "generation_id": 8, + "type_id": 1, + "power": null, + "pp": 16, + "accuracy": null, + "priority": 0, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 453, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 735, + "identifier": "no-retreat", + "generation_id": 8, + "type_id": 2, + "power": null, + "pp": 8, + "accuracy": 100, + "priority": 0, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 427, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 736, + "identifier": "tar-shot", + "generation_id": 8, + "type_id": 6, + "power": null, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 477, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 737, + "identifier": "magic-powder", + "generation_id": 8, + "type_id": 14, + "power": null, + "pp": 32, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 456, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 738, + "identifier": "dragon-darts", + "generation_id": 8, + "type_id": 16, + "power": 50, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 45, + "effect_chance": null, + "crit_rate": 0, + "max_hits": 2, + "min_hits": 2 + }, + { + "id": 739, + "identifier": "teatime", + "generation_id": 8, + "type_id": 1, + "power": null, + "pp": 16, + "accuracy": null, + "priority": 0, + "target_id": 14, + "damage_class_id": 1, + "effect_id": 476, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 740, + "identifier": "octolock", + "generation_id": 8, + "type_id": 2, + "power": null, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 452, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 741, + "identifier": "bolt-beak", + "generation_id": 8, + "type_id": 13, + "power": 85, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 436, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 742, + "identifier": "fishious-rend", + "generation_id": 8, + "type_id": 11, + "power": 85, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 436, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 743, + "identifier": "court-change", + "generation_id": 8, + "type_id": 1, + "power": null, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 431, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 744, + "identifier": "clangorous-soul", + "generation_id": 8, + "type_id": 16, + "power": null, + "pp": 8, + "accuracy": 100, + "priority": 0, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 414, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 745, + "identifier": "body-press", + "generation_id": 8, + "type_id": 2, + "power": 80, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 426, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 746, + "identifier": "decorate", + "generation_id": 8, + "type_id": 18, + "power": null, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 432, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 747, + "identifier": "snap-trap", + "generation_id": 8, + "type_id": 12, + "power": 35, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 43, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 748, + "identifier": "pyro-ball", + "generation_id": 8, + "type_id": 10, + "power": 120, + "pp": 8, + "accuracy": 90, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 126, + "effect_chance": 10, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 749, + "identifier": "behemoth-blade", + "generation_id": 8, + "type_id": 9, + "power": 100, + "pp": 8, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 750, + "identifier": "behemoth-bash", + "generation_id": 8, + "type_id": 9, + "power": 100, + "pp": 8, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 751, + "identifier": "aura-wheel", + "generation_id": 8, + "type_id": 13, + "power": 110, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 433, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 752, + "identifier": "breaking-swipe", + "generation_id": 8, + "type_id": 16, + "power": 60, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 19, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 753, + "identifier": "overdrive", + "generation_id": 8, + "type_id": 13, + "power": 80, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 754, + "identifier": "apple-acid", + "generation_id": 8, + "type_id": 12, + "power": 80, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 428, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 755, + "identifier": "grav-apple", + "generation_id": 8, + "type_id": 12, + "power": 80, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 435, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 756, + "identifier": "spirit-break", + "generation_id": 8, + "type_id": 18, + "power": 75, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 358, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 757, + "identifier": "strange-steam", + "generation_id": 8, + "type_id": 18, + "power": 90, + "pp": 16, + "accuracy": 95, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 77, + "effect_chance": 20, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 758, + "identifier": "life-dew", + "generation_id": 8, + "type_id": 11, + "power": null, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 434, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 759, + "identifier": "obstruct", + "generation_id": 8, + "type_id": 17, + "power": null, + "pp": 16, + "accuracy": null, + "priority": 4, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 454, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 760, + "identifier": "false-surrender", + "generation_id": 8, + "type_id": 17, + "power": 80, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 18, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 761, + "identifier": "meteor-assault", + "generation_id": 8, + "type_id": 2, + "power": 150, + "pp": 8, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 81, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 762, + "identifier": "eternabeam", + "generation_id": 8, + "type_id": 16, + "power": 160, + "pp": 8, + "accuracy": 90, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 81, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 763, + "identifier": "steel-beam", + "generation_id": 8, + "type_id": 9, + "power": 140, + "pp": 8, + "accuracy": 95, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 420, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 764, + "identifier": "wicked-blow", + "generation_id": 8, + "type_id": 17, + "power": 75, + "pp": 8, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 289, + "effect_chance": null, + "crit_rate": 6, + "max_hits": null, + "min_hits": null + }, + { + "id": 765, + "identifier": "surging-strikes", + "generation_id": 8, + "type_id": 11, + "power": 25, + "pp": 8, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 289, + "effect_chance": null, + "crit_rate": 6, + "max_hits": 3, + "min_hits": 3 + }, + { + "id": 766, + "identifier": "dual-wingbeat", + "generation_id": 8, + "type_id": 3, + "power": 40, + "pp": 16, + "accuracy": 90, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 45, + "effect_chance": null, + "crit_rate": 0, + "max_hits": 2, + "min_hits": 2 + }, + { + "id": 777, + "identifier": "astral-barrage", + "generation_id": 8, + "type_id": 8, + "power": 120, + "pp": 8, + "accuracy": 100, + "priority": 0, + "target_id": 11, + "damage_class_id": 3, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 778, + "identifier": "glacial-lance", + "generation_id": 8, + "type_id": 15, + "power": 120, + "pp": 8, + "accuracy": 100, + "priority": 0, + "target_id": 11, + "damage_class_id": 2, + "effect_id": 104, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 779, + "identifier": "lash-out", + "generation_id": 8, + "type_id": 17, + "power": 75, + "pp": 8, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 450, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 797, + "identifier": "fiery-wrath", + "generation_id": 8, + "type_id": 17, + "power": 90, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 11, + "damage_class_id": 3, + "effect_id": 32, + "effect_chance": 20, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 798, + "identifier": "freezing-glare", + "generation_id": 8, + "type_id": 14, + "power": 90, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 6, + "effect_chance": 10, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 799, + "identifier": "thunderous-kick", + "generation_id": 8, + "type_id": 2, + "power": 90, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 397, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 800, + "identifier": "meteor-beam", + "generation_id": 8, + "type_id": 6, + "power": 120, + "pp": 16, + "accuracy": 90, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 451, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 801, + "identifier": "shell-side-arm", + "generation_id": 8, + "type_id": 4, + "power": 90, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 447, + "effect_chance": 20, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 802, + "identifier": "misty-explosion", + "generation_id": 8, + "type_id": 18, + "power": 100, + "pp": 8, + "accuracy": 100, + "priority": 0, + "target_id": 9, + "damage_class_id": 3, + "effect_id": 444, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 803, + "identifier": "grassy-glide", + "generation_id": 8, + "type_id": 12, + "power": 70, + "pp": 32, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 437, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 804, + "identifier": "rising-voltage", + "generation_id": 8, + "type_id": 13, + "power": 70, + "pp": 32, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 443, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 805, + "identifier": "terrain-pulse", + "generation_id": 8, + "type_id": 1, + "power": 50, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 441, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 806, + "identifier": "skitter-smack", + "generation_id": 8, + "type_id": 7, + "power": 70, + "pp": 16, + "accuracy": 90, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 358, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 807, + "identifier": "burning-jealousy", + "generation_id": 8, + "type_id": 10, + "power": 70, + "pp": 8, + "accuracy": 100, + "priority": 0, + "target_id": 11, + "damage_class_id": 3, + "effect_id": 429, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 808, + "identifier": "take-heart", + "generation_id": 9, + "type_id": 14, + "power": null, + "pp": 16, + "accuracy": null, + "priority": 0, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 472, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 809, + "identifier": "poltergeist", + "generation_id": 8, + "type_id": 8, + "power": 110, + "pp": 8, + "accuracy": 90, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 446, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 810, + "identifier": "corrosive-gas", + "generation_id": 8, + "type_id": 4, + "power": null, + "pp": 64, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 430, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 811, + "identifier": "coaching", + "generation_id": 8, + "type_id": 2, + "power": null, + "pp": 16, + "accuracy": null, + "priority": 0, + "target_id": 15, + "damage_class_id": 1, + "effect_id": 445, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 812, + "identifier": "flip-turn", + "generation_id": 8, + "type_id": 11, + "power": 60, + "pp": 32, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 229, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 813, + "identifier": "triple-axel", + "generation_id": 8, + "type_id": 15, + "power": 20, + "pp": 16, + "accuracy": 90, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 105, + "effect_chance": null, + "crit_rate": 0, + "max_hits": 3, + "min_hits": 3 + }, + { + "id": 814, + "identifier": "drum-beating", + "generation_id": 1, + "type_id": 12, + "power": 80, + "pp": 40, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 331, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 815, + "identifier": "scorching-sands", + "generation_id": 8, + "type_id": 5, + "power": 70, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 458, + "effect_chance": 30, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 819, + "identifier": "thunder-cage", + "generation_id": 8, + "type_id": 13, + "power": 80, + "pp": 24, + "accuracy": 90, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 43, + "effect_chance": 100, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 820, + "identifier": "dragon-energy", + "generation_id": 8, + "type_id": 16, + "power": 150, + "pp": 8, + "accuracy": 100, + "priority": 0, + "target_id": 11, + "damage_class_id": 3, + "effect_id": 191, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 821, + "identifier": "steel-roller", + "generation_id": 8, + "type_id": 9, + "power": 130, + "pp": 8, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 448, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 823, + "identifier": "scale-shot", + "generation_id": 8, + "type_id": 16, + "power": 25, + "pp": 32, + "accuracy": 90, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 442, + "effect_chance": null, + "crit_rate": 0, + "max_hits": 5, + "min_hits": 2 + }, + { + "id": 826, + "identifier": "eerie-spell", + "generation_id": 8, + "type_id": 14, + "power": 80, + "pp": 8, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 439, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 827, + "identifier": "barb-barrage", + "generation_id": 9, + "type_id": 4, + "power": 60, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 461, + "effect_chance": 50, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 828, + "identifier": "bitter-malice", + "generation_id": 9, + "type_id": 8, + "power": 75, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 19, + "effect_chance": 100, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 829, + "identifier": "bleakwind-storm", + "generation_id": 9, + "type_id": 3, + "power": 100, + "pp": 16, + "accuracy": 80, + "priority": 0, + "target_id": 11, + "damage_class_id": 3, + "effect_id": 357, + "effect_chance": 30, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 830, + "identifier": "ceaseless-edge", + "generation_id": 9, + "type_id": 17, + "power": 65, + "pp": 24, + "accuracy": 90, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 113, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 831, + "identifier": "chloroblast", + "generation_id": 9, + "type_id": 12, + "power": 150, + "pp": 8, + "accuracy": 95, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 463, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 832, + "identifier": "dire-claw", + "generation_id": 9, + "type_id": 4, + "power": 80, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 464, + "effect_chance": 50, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 833, + "identifier": "esper-wing", + "generation_id": 9, + "type_id": 14, + "power": 80, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 296, + "effect_chance": 100, + "crit_rate": 1, + "max_hits": null, + "min_hits": null + }, + { + "id": 834, + "identifier": "headlong-rush", + "generation_id": 9, + "type_id": 5, + "power": 120, + "pp": 8, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 230, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 835, + "identifier": "infernal-parade", + "generation_id": 9, + "type_id": 8, + "power": 60, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 465, + "effect_chance": 30, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 836, + "identifier": "lunar-blessing", + "generation_id": 9, + "type_id": 14, + "power": null, + "pp": 8, + "accuracy": null, + "priority": 0, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 457, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 837, + "identifier": "mountain-gale", + "generation_id": 9, + "type_id": 15, + "power": 100, + "pp": 16, + "accuracy": 85, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 32, + "effect_chance": 30, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 838, + "identifier": "mystical-power", + "generation_id": 9, + "type_id": 14, + "power": 70, + "pp": 16, + "accuracy": 90, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 473, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 839, + "identifier": "power-shift", + "generation_id": 9, + "type_id": 1, + "power": null, + "pp": 16, + "accuracy": null, + "priority": 0, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 466, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 840, + "identifier": "psyshield-bash", + "generation_id": 9, + "type_id": 14, + "power": 70, + "pp": 16, + "accuracy": 90, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 207, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 841, + "identifier": "raging-fury", + "generation_id": 9, + "type_id": 10, + "power": 120, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 28, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 842, + "identifier": "sandsear-storm", + "generation_id": 9, + "type_id": 5, + "power": 100, + "pp": 16, + "accuracy": 80, + "priority": 0, + "target_id": 11, + "damage_class_id": 3, + "effect_id": 5, + "effect_chance": 20, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 843, + "identifier": "shelter", + "generation_id": 9, + "type_id": 9, + "power": null, + "pp": 16, + "accuracy": null, + "priority": 0, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 467, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 844, + "identifier": "springtide-storm", + "generation_id": 9, + "type_id": 18, + "power": 100, + "pp": 8, + "accuracy": 80, + "priority": 0, + "target_id": 11, + "damage_class_id": 3, + "effect_id": 69, + "effect_chance": 30, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 845, + "identifier": "stone-axe", + "generation_id": 9, + "type_id": 6, + "power": 65, + "pp": 24, + "accuracy": 90, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 113, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 846, + "identifier": "victory-dance", + "generation_id": 9, + "type_id": 2, + "power": null, + "pp": 16, + "accuracy": null, + "priority": 0, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 468, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 847, + "identifier": "triple-arrows", + "generation_id": 9, + "type_id": 2, + "power": 90, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 475, + "effect_chance": 30, + "crit_rate": 1, + "max_hits": null, + "min_hits": null + }, + { + "id": 848, + "identifier": "wave-crash", + "generation_id": 9, + "type_id": 11, + "power": 120, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 469, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 849, + "identifier": "wildbolt-storm", + "generation_id": 9, + "type_id": 13, + "power": 100, + "pp": 16, + "accuracy": 80, + "priority": 0, + "target_id": 11, + "damage_class_id": 3, + "effect_id": 396, + "effect_chance": 20, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 851, + "identifier": "tera-blast", + "generation_id": 9, + "type_id": 1, + "power": 80, + "pp": 10, + "accuracy": 100, + "priority": 0, + "target_id": "", + "damage_class_id": 3, + "effect_id": 1, + "effect_chance": 0, + "crit_rate": 1, + "max_hits": null, + "min_hits": null + }, + { + "id": 852, + "identifier": "silk-trap", + "generation_id": 9, + "type_id": 7, + "power": null, + "pp": 16, + "accuracy": null, + "priority": 4, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 488, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 853, + "identifier": "axe-kick", + "generation_id": 9, + "type_id": 2, + "power": 120, + "pp": 16, + "accuracy": 90, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 478, + "effect_chance": 30, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 854, + "identifier": "last-respects", + "generation_id": 9, + "type_id": 8, + "power": 50, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 490, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 855, + "identifier": "lumina-crash", + "generation_id": 9, + "type_id": 14, + "power": 80, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 297, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 856, + "identifier": "order-up", + "generation_id": 9, + "type_id": 16, + "power": 80, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 857, + "identifier": "jet-punch", + "generation_id": 9, + "type_id": 11, + "power": 60, + "pp": 24, + "accuracy": 100, + "priority": 1, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 858, + "identifier": "spicy-extract", + "generation_id": 9, + "type_id": 12, + "power": null, + "pp": 24, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 483, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 859, + "identifier": "spin-out", + "generation_id": 9, + "type_id": 9, + "power": 100, + "pp": 8, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 479, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 860, + "identifier": "population-bomb", + "generation_id": 9, + "type_id": 1, + "power": 20, + "pp": 16, + "accuracy": 90, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 484, + "effect_chance": null, + "crit_rate": 0, + "max_hits": 10, + "min_hits": 10 + }, + { + "id": 861, + "identifier": "ice-spinner", + "generation_id": 9, + "type_id": 15, + "power": 80, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 418, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 862, + "identifier": "glaive-rush", + "generation_id": 9, + "type_id": 16, + "power": 120, + "pp": 5, + "accuracy": 100, + "priority": 0, + "target_id": "", + "damage_class_id": 2, + "effect_id": 1, + "effect_chance": 0, + "crit_rate": 1, + "max_hits": null, + "min_hits": null + }, + { + "id": 863, + "identifier": "revival-blessing", + "generation_id": 9, + "type_id": 1, + "power": null, + "pp": 1, + "accuracy": null, + "priority": 0, + "target_id": "", + "damage_class_id": 1, + "effect_id": 1, + "effect_chance": 0, + "crit_rate": 1, + "max_hits": null, + "min_hits": null + }, + { + "id": 864, + "identifier": "salt-cure", + "generation_id": 9, + "type_id": 6, + "power": 40, + "pp": 15, + "accuracy": 100, + "priority": 0, + "target_id": "", + "damage_class_id": 2, + "effect_id": 1, + "effect_chance": 0, + "crit_rate": 1, + "max_hits": null, + "min_hits": null + }, + { + "id": 865, + "identifier": "triple-dive", + "generation_id": 9, + "type_id": 11, + "power": 30, + "pp": 16, + "accuracy": 95, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": 3, + "min_hits": 3 + }, + { + "id": 866, + "identifier": "mortal-spin", + "generation_id": 9, + "type_id": 4, + "power": 30, + "pp": 24, + "accuracy": 100, + "priority": 0, + "target_id": 11, + "damage_class_id": 2, + "effect_id": 486, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 867, + "identifier": "doodle", + "generation_id": 9, + "type_id": 1, + "power": null, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 1, + "effect_id": 179, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 868, + "identifier": "fillet-away", + "generation_id": 9, + "type_id": 1, + "power": null, + "pp": 16, + "accuracy": null, + "priority": 0, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 485, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 869, + "identifier": "kowtow-cleave", + "generation_id": 9, + "type_id": 17, + "power": 85, + "pp": 16, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 870, + "identifier": "flower-trick", + "generation_id": 9, + "type_id": 12, + "power": 70, + "pp": 16, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 289, + "effect_chance": null, + "crit_rate": 6, + "max_hits": null, + "min_hits": null + }, + { + "id": 871, + "identifier": "torch-song", + "generation_id": 9, + "type_id": 10, + "power": 80, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 14, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 872, + "identifier": "aqua-step", + "generation_id": 9, + "type_id": 11, + "power": 80, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 296, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 873, + "identifier": "raging-bull", + "generation_id": 9, + "type_id": 1, + "power": 90, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 187, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 874, + "identifier": "make-it-rain", + "generation_id": 9, + "type_id": 9, + "power": 120, + "pp": 8, + "accuracy": 100, + "priority": 0, + "target_id": 11, + "damage_class_id": 3, + "effect_id": 480, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 877, + "identifier": "ruination", + "generation_id": 9, + "type_id": 17, + "power": null, + "pp": 16, + "accuracy": 90, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 41, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 878, + "identifier": "collision-course", + "generation_id": 9, + "type_id": 2, + "power": 100, + "pp": 8, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 482, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 879, + "identifier": "electro-drift", + "generation_id": 9, + "type_id": 13, + "power": 100, + "pp": 8, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 482, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 880, + "identifier": "shed-tail", + "generation_id": 9, + "type_id": 1, + "power": null, + "pp": 16, + "accuracy": null, + "priority": 0, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 493, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 881, + "identifier": "chilly-reception", + "generation_id": 9, + "type_id": 15, + "power": null, + "pp": 10, + "accuracy": null, + "priority": 0, + "target_id": "", + "damage_class_id": 1, + "effect_id": 1, + "effect_chance": 0, + "crit_rate": 1, + "max_hits": null, + "min_hits": null + }, + { + "id": 882, + "identifier": "tidy-up", + "generation_id": 9, + "type_id": 1, + "power": null, + "pp": 16, + "accuracy": null, + "priority": 0, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 487, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 883, + "identifier": "snowscape", + "generation_id": 9, + "type_id": 15, + "power": null, + "pp": 10, + "accuracy": null, + "priority": 0, + "target_id": "", + "damage_class_id": 1, + "effect_id": 1, + "effect_chance": 0, + "crit_rate": 1, + "max_hits": null, + "min_hits": null + }, + { + "id": 884, + "identifier": "pounce", + "generation_id": 9, + "type_id": 7, + "power": 50, + "pp": 32, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 331, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 885, + "identifier": "trailblaze", + "generation_id": 9, + "type_id": 12, + "power": 50, + "pp": 32, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 296, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 886, + "identifier": "chilling-water", + "generation_id": 9, + "type_id": 11, + "power": 50, + "pp": 32, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 19, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 887, + "identifier": "hyper-drill", + "generation_id": 9, + "type_id": 1, + "power": 100, + "pp": 8, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 489, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 888, + "identifier": "twin-beam", + "generation_id": 9, + "type_id": 14, + "power": 40, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 45, + "effect_chance": null, + "crit_rate": 0, + "max_hits": 2, + "min_hits": 2 + }, + { + "id": 889, + "identifier": "rage-fist", + "generation_id": 9, + "type_id": 8, + "power": 50, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 491, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 890, + "identifier": "armor-cannon", + "generation_id": 9, + "type_id": 10, + "power": 120, + "pp": 8, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 230, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 891, + "identifier": "bitter-blade", + "generation_id": 9, + "type_id": 10, + "power": 90, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 346, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 892, + "identifier": "double-shock", + "generation_id": 9, + "type_id": 13, + "power": 120, + "pp": 8, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 481, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 893, + "identifier": "gigaton-hammer", + "generation_id": 9, + "type_id": 9, + "power": 160, + "pp": 8, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 492, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 894, + "identifier": "comeuppance", + "generation_id": 9, + "type_id": 17, + "power": null, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 1, + "damage_class_id": 2, + "effect_id": 228, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 895, + "identifier": "aqua-cutter", + "generation_id": 9, + "type_id": 11, + "power": 70, + "pp": 32, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 44, + "effect_chance": null, + "crit_rate": 1, + "max_hits": null, + "min_hits": null + }, + { + "id": 896, + "identifier": "blazing-torque", + "generation_id": 9, + "type_id": 10, + "power": 80, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 5, + "effect_chance": 30, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 897, + "identifier": "wicked-torque", + "generation_id": 9, + "type_id": 17, + "power": 80, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 330, + "effect_chance": 10, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 898, + "identifier": "noxious-torque", + "generation_id": 9, + "type_id": 4, + "power": 100, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 3, + "effect_chance": 30, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 899, + "identifier": "combat-torque", + "generation_id": 9, + "type_id": 2, + "power": 100, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 7, + "effect_chance": 30, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 900, + "identifier": "magical-torque", + "generation_id": 9, + "type_id": 18, + "power": 100, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 77, + "effect_chance": 30, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 1000, + "identifier": "dragon-cheer", + "generation_id": 9, + "type_id": 16, + "power": null, + "pp": 24, + "accuracy": null, + "priority": 0, + "target_id": 15, + "damage_class_id": 1, + "effect_id": 494, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 1001, + "identifier": "expanding-force", + "generation_id": 8, + "type_id": 14, + "power": 80, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 440, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 1002, + "identifier": "jungle-healing", + "generation_id": 8, + "type_id": 12, + "power": null, + "pp": 16, + "accuracy": null, + "priority": 0, + "target_id": 13, + "damage_class_id": 1, + "effect_id": 457, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 1003, + "identifier": "hard-press", + "generation_id": 9, + "type_id": 9, + "power": null, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 495, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 1004, + "identifier": "upper-hand", + "generation_id": 9, + "type_id": 2, + "power": 65, + "pp": 24, + "accuracy": 100, + "priority": 3, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 501, + "effect_chance": 100, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 1005, + "identifier": "psychic-noise", + "generation_id": 9, + "type_id": 14, + "power": 75, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 496, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 1006, + "identifier": "alluring-voice", + "generation_id": 9, + "type_id": 18, + "power": 80, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 497, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 1007, + "identifier": "electro-shot", + "generation_id": 9, + "type_id": 13, + "power": 130, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 502, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 1008, + "identifier": "fickle-beam", + "generation_id": 9, + "type_id": 16, + "power": 80, + "pp": 8, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 498, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 1009, + "identifier": "burning-bulwark", + "generation_id": 9, + "type_id": 10, + "power": null, + "pp": 16, + "accuracy": null, + "priority": 4, + "target_id": 7, + "damage_class_id": 1, + "effect_id": 499, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 1010, + "identifier": "temper-flare", + "generation_id": 9, + "type_id": 10, + "power": 75, + "pp": 16, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 409, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 1011, + "identifier": "thunderclap", + "generation_id": 9, + "type_id": 13, + "power": 70, + "pp": 8, + "accuracy": 100, + "priority": 1, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 249, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 1012, + "identifier": "supercell-slam", + "generation_id": 9, + "type_id": 13, + "power": 100, + "pp": 24, + "accuracy": 95, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 46, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 1013, + "identifier": "mighty-cleave", + "generation_id": 9, + "type_id": 6, + "power": 95, + "pp": 8, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 489, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 1014, + "identifier": "tachyon-cutter", + "generation_id": 9, + "type_id": 9, + "power": 50, + "pp": 16, + "accuracy": null, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 45, + "effect_chance": null, + "crit_rate": 0, + "max_hits": 2, + "min_hits": 2 + }, + { + "id": 1015, + "identifier": "malignant-chain", + "generation_id": 9, + "type_id": 4, + "power": 100, + "pp": 8, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 203, + "effect_chance": 50, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 1016, + "identifier": "tera-starstorm", + "generation_id": 9, + "type_id": 1, + "power": 120, + "pp": 8, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 1017, + "identifier": "syrup-bomb", + "generation_id": 9, + "type_id": 12, + "power": 60, + "pp": 16, + "accuracy": 85, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 503, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 1018, + "identifier": "matcha-gotcha", + "generation_id": 9, + "type_id": 12, + "power": 80, + "pp": 24, + "accuracy": 90, + "priority": 0, + "target_id": 11, + "damage_class_id": 3, + "effect_id": 500, + "effect_chance": 20, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 10001, + "identifier": "shadow-rush", + "generation_id": 3, + "type_id": 10002, + "power": 55, + "pp": 0, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 10001, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 10002, + "identifier": "shadow-blast", + "generation_id": 3, + "type_id": 10002, + "power": 80, + "pp": 0, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 44, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 10003, + "identifier": "shadow-blitz", + "generation_id": 3, + "type_id": 10002, + "power": 40, + "pp": 0, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 10004, + "identifier": "shadow-bolt", + "generation_id": 3, + "type_id": 10002, + "power": 75, + "pp": 0, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 7, + "effect_chance": 10, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 10005, + "identifier": "shadow-break", + "generation_id": 3, + "type_id": 10002, + "power": 75, + "pp": 0, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 10006, + "identifier": "shadow-chill", + "generation_id": 3, + "type_id": 10002, + "power": 75, + "pp": 0, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 6, + "effect_chance": 10, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 10007, + "identifier": "shadow-end", + "generation_id": 3, + "type_id": 10002, + "power": 120, + "pp": 0, + "accuracy": 60, + "priority": 0, + "target_id": 10, + "damage_class_id": 2, + "effect_id": 10002, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 10008, + "identifier": "shadow-fire", + "generation_id": 3, + "type_id": 10002, + "power": 75, + "pp": 0, + "accuracy": 100, + "priority": 0, + "target_id": 10, + "damage_class_id": 3, + "effect_id": 5, + "effect_chance": 10, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 10009, + "identifier": "shadow-rave", + "generation_id": 3, + "type_id": 10002, + "power": 70, + "pp": 0, + "accuracy": 100, + "priority": 0, + "target_id": 6, + "damage_class_id": 3, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 10010, + "identifier": "shadow-storm", + "generation_id": 3, + "type_id": 10002, + "power": 95, + "pp": 0, + "accuracy": 100, + "priority": 0, + "target_id": 6, + "damage_class_id": 3, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 10011, + "identifier": "shadow-wave", + "generation_id": 3, + "type_id": 10002, + "power": 50, + "pp": 0, + "accuracy": 100, + "priority": 0, + "target_id": 6, + "damage_class_id": 3, + "effect_id": 1, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 10012, + "identifier": "shadow-down", + "generation_id": 3, + "type_id": 10002, + "power": null, + "pp": 0, + "accuracy": 100, + "priority": 0, + "target_id": 6, + "damage_class_id": 1, + "effect_id": 60, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 10013, + "identifier": "shadow-half", + "generation_id": 3, + "type_id": 10002, + "power": null, + "pp": 0, + "accuracy": 100, + "priority": 0, + "target_id": 12, + "damage_class_id": 3, + "effect_id": 10003, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 10014, + "identifier": "shadow-hold", + "generation_id": 3, + "type_id": 10002, + "power": null, + "pp": 0, + "accuracy": null, + "priority": 0, + "target_id": 6, + "damage_class_id": 1, + "effect_id": 107, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 10015, + "identifier": "shadow-mist", + "generation_id": 3, + "type_id": 10002, + "power": null, + "pp": 0, + "accuracy": 100, + "priority": 0, + "target_id": 6, + "damage_class_id": 1, + "effect_id": 10004, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 10016, + "identifier": "shadow-panic", + "generation_id": 3, + "type_id": 10002, + "power": null, + "pp": 0, + "accuracy": 90, + "priority": 0, + "target_id": 6, + "damage_class_id": 1, + "effect_id": 50, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 10017, + "identifier": "shadow-shed", + "generation_id": 3, + "type_id": 10002, + "power": null, + "pp": 0, + "accuracy": null, + "priority": 0, + "target_id": 12, + "damage_class_id": 1, + "effect_id": 10005, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + }, + { + "id": 10018, + "identifier": "shadow-sky", + "generation_id": 3, + "type_id": 10002, + "power": null, + "pp": 0, + "accuracy": null, + "priority": 0, + "target_id": 12, + "damage_class_id": 1, + "effect_id": 10006, + "effect_chance": null, + "crit_rate": 0, + "max_hits": null, + "min_hits": null + } +] \ No newline at end of file diff --git a/pokemonduel/data/natures.json b/pokemonduel/data/natures.json new file mode 100644 index 0000000..82c981b --- /dev/null +++ b/pokemonduel/data/natures.json @@ -0,0 +1,227 @@ +[ + { + "id": 1, + "identifier": "hardy", + "decreased_stat_id": 2, + "increased_stat_id": 2, + "hates_flavor_id": 1, + "likes_flavor_id": 1, + "game_index": 0 + }, + { + "id": 2, + "identifier": "bold", + "decreased_stat_id": 2, + "increased_stat_id": 3, + "hates_flavor_id": 1, + "likes_flavor_id": 5, + "game_index": 5 + }, + { + "id": 3, + "identifier": "modest", + "decreased_stat_id": 2, + "increased_stat_id": 4, + "hates_flavor_id": 1, + "likes_flavor_id": 2, + "game_index": 15 + }, + { + "id": 4, + "identifier": "calm", + "decreased_stat_id": 2, + "increased_stat_id": 5, + "hates_flavor_id": 1, + "likes_flavor_id": 4, + "game_index": 20 + }, + { + "id": 5, + "identifier": "timid", + "decreased_stat_id": 2, + "increased_stat_id": 6, + "hates_flavor_id": 1, + "likes_flavor_id": 3, + "game_index": 10 + }, + { + "id": 6, + "identifier": "lonely", + "decreased_stat_id": 3, + "increased_stat_id": 2, + "hates_flavor_id": 5, + "likes_flavor_id": 1, + "game_index": 1 + }, + { + "id": 7, + "identifier": "docile", + "decreased_stat_id": 3, + "increased_stat_id": 3, + "hates_flavor_id": 5, + "likes_flavor_id": 5, + "game_index": 6 + }, + { + "id": 8, + "identifier": "mild", + "decreased_stat_id": 3, + "increased_stat_id": 4, + "hates_flavor_id": 5, + "likes_flavor_id": 2, + "game_index": 16 + }, + { + "id": 9, + "identifier": "gentle", + "decreased_stat_id": 3, + "increased_stat_id": 5, + "hates_flavor_id": 5, + "likes_flavor_id": 4, + "game_index": 21 + }, + { + "id": 10, + "identifier": "hasty", + "decreased_stat_id": 3, + "increased_stat_id": 6, + "hates_flavor_id": 5, + "likes_flavor_id": 3, + "game_index": 11 + }, + { + "id": 11, + "identifier": "adamant", + "decreased_stat_id": 4, + "increased_stat_id": 2, + "hates_flavor_id": 2, + "likes_flavor_id": 1, + "game_index": 3 + }, + { + "id": 12, + "identifier": "impish", + "decreased_stat_id": 4, + "increased_stat_id": 3, + "hates_flavor_id": 2, + "likes_flavor_id": 5, + "game_index": 8 + }, + { + "id": 13, + "identifier": "bashful", + "decreased_stat_id": 4, + "increased_stat_id": 4, + "hates_flavor_id": 2, + "likes_flavor_id": 2, + "game_index": 18 + }, + { + "id": 14, + "identifier": "careful", + "decreased_stat_id": 4, + "increased_stat_id": 5, + "hates_flavor_id": 2, + "likes_flavor_id": 4, + "game_index": 23 + }, + { + "id": 15, + "identifier": "rash", + "decreased_stat_id": 5, + "increased_stat_id": 4, + "hates_flavor_id": 4, + "likes_flavor_id": 2, + "game_index": 19 + }, + { + "id": 16, + "identifier": "jolly", + "decreased_stat_id": 4, + "increased_stat_id": 6, + "hates_flavor_id": 2, + "likes_flavor_id": 3, + "game_index": 13 + }, + { + "id": 17, + "identifier": "naughty", + "decreased_stat_id": 5, + "increased_stat_id": 2, + "hates_flavor_id": 4, + "likes_flavor_id": 1, + "game_index": 4 + }, + { + "id": 18, + "identifier": "lax", + "decreased_stat_id": 5, + "increased_stat_id": 3, + "hates_flavor_id": 4, + "likes_flavor_id": 5, + "game_index": 9 + }, + { + "id": 19, + "identifier": "quirky", + "decreased_stat_id": 5, + "increased_stat_id": 5, + "hates_flavor_id": 4, + "likes_flavor_id": 4, + "game_index": 24 + }, + { + "id": 20, + "identifier": "naive", + "decreased_stat_id": 5, + "increased_stat_id": 6, + "hates_flavor_id": 4, + "likes_flavor_id": 3, + "game_index": 14 + }, + { + "id": 21, + "identifier": "brave", + "decreased_stat_id": 6, + "increased_stat_id": 2, + "hates_flavor_id": 3, + "likes_flavor_id": 1, + "game_index": 2 + }, + { + "id": 22, + "identifier": "relaxed", + "decreased_stat_id": 6, + "increased_stat_id": 3, + "hates_flavor_id": 3, + "likes_flavor_id": 5, + "game_index": 7 + }, + { + "id": 23, + "identifier": "quiet", + "decreased_stat_id": 6, + "increased_stat_id": 4, + "hates_flavor_id": 3, + "likes_flavor_id": 2, + "game_index": 17 + }, + { + "id": 24, + "identifier": "sassy", + "decreased_stat_id": 6, + "increased_stat_id": 5, + "hates_flavor_id": 3, + "likes_flavor_id": 4, + "game_index": 22 + }, + { + "id": 25, + "identifier": "serious", + "decreased_stat_id": 6, + "increased_stat_id": 6, + "hates_flavor_id": 3, + "likes_flavor_id": 3, + "game_index": 12 + } +] \ No newline at end of file diff --git a/pokemonduel/data/pfile.json b/pokemonduel/data/pfile.json new file mode 100644 index 0000000..ee3eca0 --- /dev/null +++ b/pokemonduel/data/pfile.json @@ -0,0 +1,21762 @@ +[ + { + "id": 0, + "identifier": "missingno", + "generation_id": 1, + "evolves_from_species_id": "", + "evolution_chain_id": 0, + "color_id": 5, + "shape_id": 8, + "habitat_id": 3, + "gender_rate": -1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1, + "conquest_order": "" + }, + { + "id": 1, + "identifier": "bulbasaur", + "generation_id": 1, + "evolves_from_species_id": "", + "evolution_chain_id": 1, + "color_id": 5, + "shape_id": 8, + "habitat_id": 3, + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1, + "conquest_order": "" + }, + { + "id": 2, + "identifier": "ivysaur", + "generation_id": 1, + "evolves_from_species_id": 1, + "evolution_chain_id": 1, + "color_id": 5, + "shape_id": 8, + "habitat_id": 3, + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 2, + "conquest_order": "" + }, + { + "id": 3, + "identifier": "venusaur", + "generation_id": 1, + "evolves_from_species_id": 2, + "evolution_chain_id": 1, + "color_id": 5, + "shape_id": 8, + "habitat_id": 3, + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 1, + "growth_rate_id": 4, + "forms_switchable": 1, + "order": 3, + "conquest_order": "" + }, + { + "id": 4, + "identifier": "charmander", + "generation_id": 1, + "evolves_from_species_id": "", + "evolution_chain_id": 2, + "color_id": 8, + "shape_id": 6, + "habitat_id": 4, + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 4, + "conquest_order": 109 + }, + { + "id": 5, + "identifier": "charmeleon", + "generation_id": 1, + "evolves_from_species_id": 4, + "evolution_chain_id": 2, + "color_id": 8, + "shape_id": 6, + "habitat_id": 4, + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 5, + "conquest_order": 110 + }, + { + "id": 6, + "identifier": "charizard", + "generation_id": 1, + "evolves_from_species_id": 5, + "evolution_chain_id": 2, + "color_id": 8, + "shape_id": 6, + "habitat_id": 4, + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 1, + "order": 6, + "conquest_order": 111 + }, + { + "id": 7, + "identifier": "squirtle", + "generation_id": 1, + "evolves_from_species_id": "", + "evolution_chain_id": 3, + "color_id": 2, + "shape_id": 6, + "habitat_id": 9, + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 7, + "conquest_order": "" + }, + { + "id": 8, + "identifier": "wartortle", + "generation_id": 1, + "evolves_from_species_id": 7, + "evolution_chain_id": 3, + "color_id": 2, + "shape_id": 6, + "habitat_id": 9, + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 8, + "conquest_order": "" + }, + { + "id": 9, + "identifier": "blastoise", + "generation_id": 1, + "evolves_from_species_id": 8, + "evolution_chain_id": 3, + "color_id": 2, + "shape_id": 6, + "habitat_id": 9, + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 1, + "order": 9, + "conquest_order": "" + }, + { + "id": 10, + "identifier": "caterpie", + "generation_id": 1, + "evolves_from_species_id": "", + "evolution_chain_id": 4, + "color_id": 5, + "shape_id": 14, + "habitat_id": 2, + "gender_rate": 4, + "capture_rate": 255, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 10, + "conquest_order": "" + }, + { + "id": 11, + "identifier": "metapod", + "generation_id": 1, + "evolves_from_species_id": 10, + "evolution_chain_id": 4, + "color_id": 5, + "shape_id": 2, + "habitat_id": 2, + "gender_rate": 4, + "capture_rate": 120, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 11, + "conquest_order": "" + }, + { + "id": 12, + "identifier": "butterfree", + "generation_id": 1, + "evolves_from_species_id": 11, + "evolution_chain_id": 4, + "color_id": 9, + "shape_id": 13, + "habitat_id": 2, + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 1, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 12, + "conquest_order": "" + }, + { + "id": 13, + "identifier": "weedle", + "generation_id": 1, + "evolves_from_species_id": "", + "evolution_chain_id": 5, + "color_id": 3, + "shape_id": 14, + "habitat_id": 2, + "gender_rate": 4, + "capture_rate": 255, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 13, + "conquest_order": "" + }, + { + "id": 14, + "identifier": "kakuna", + "generation_id": 1, + "evolves_from_species_id": 13, + "evolution_chain_id": 5, + "color_id": 10, + "shape_id": 2, + "habitat_id": 2, + "gender_rate": 4, + "capture_rate": 120, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 14, + "conquest_order": "" + }, + { + "id": 15, + "identifier": "beedrill", + "generation_id": 1, + "evolves_from_species_id": 14, + "evolution_chain_id": 5, + "color_id": 10, + "shape_id": 13, + "habitat_id": 2, + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 1, + "order": 15, + "conquest_order": 177 + }, + { + "id": 16, + "identifier": "pidgey", + "generation_id": 1, + "evolves_from_species_id": "", + "evolution_chain_id": 6, + "color_id": 3, + "shape_id": 9, + "habitat_id": 2, + "gender_rate": 4, + "capture_rate": 255, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 16, + "conquest_order": "" + }, + { + "id": 17, + "identifier": "pidgeotto", + "generation_id": 1, + "evolves_from_species_id": 16, + "evolution_chain_id": 6, + "color_id": 3, + "shape_id": 9, + "habitat_id": 2, + "gender_rate": 4, + "capture_rate": 120, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 17, + "conquest_order": "" + }, + { + "id": 18, + "identifier": "pidgeot", + "generation_id": 1, + "evolves_from_species_id": 17, + "evolution_chain_id": 6, + "color_id": 3, + "shape_id": 9, + "habitat_id": 2, + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 1, + "order": 18, + "conquest_order": "" + }, + { + "id": 19, + "identifier": "rattata", + "generation_id": 1, + "evolves_from_species_id": "", + "evolution_chain_id": 7, + "color_id": 7, + "shape_id": 8, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 255, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 1, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 19, + "conquest_order": "" + }, + { + "id": 20, + "identifier": "raticate", + "generation_id": 1, + "evolves_from_species_id": 19, + "evolution_chain_id": 7, + "color_id": 3, + "shape_id": 8, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 127, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 1, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 20, + "conquest_order": "" + }, + { + "id": 21, + "identifier": "spearow", + "generation_id": 1, + "evolves_from_species_id": "", + "evolution_chain_id": 8, + "color_id": 3, + "shape_id": 9, + "habitat_id": 6, + "gender_rate": 4, + "capture_rate": 255, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 21, + "conquest_order": "" + }, + { + "id": 22, + "identifier": "fearow", + "generation_id": 1, + "evolves_from_species_id": 21, + "evolution_chain_id": 8, + "color_id": 3, + "shape_id": 9, + "habitat_id": 6, + "gender_rate": 4, + "capture_rate": 90, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 22, + "conquest_order": "" + }, + { + "id": 23, + "identifier": "ekans", + "generation_id": 1, + "evolves_from_species_id": "", + "evolution_chain_id": 9, + "color_id": 7, + "shape_id": 2, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 255, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 23, + "conquest_order": 54 + }, + { + "id": 24, + "identifier": "arbok", + "generation_id": 1, + "evolves_from_species_id": 23, + "evolution_chain_id": 9, + "color_id": 7, + "shape_id": 2, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 90, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 24, + "conquest_order": 55 + }, + { + "id": 25, + "identifier": "pikachu", + "generation_id": 1, + "evolves_from_species_id": 172, + "evolution_chain_id": 10, + "color_id": 10, + "shape_id": 8, + "habitat_id": 2, + "gender_rate": 4, + "capture_rate": 190, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 10, + "has_gender_differences": 1, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 26, + "conquest_order": 16 + }, + { + "id": 26, + "identifier": "raichu", + "generation_id": 1, + "evolves_from_species_id": 25, + "evolution_chain_id": 10, + "color_id": 10, + "shape_id": 6, + "habitat_id": 2, + "gender_rate": 4, + "capture_rate": 75, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 10, + "has_gender_differences": 1, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 27, + "conquest_order": 17 + }, + { + "id": 27, + "identifier": "sandshrew", + "generation_id": 1, + "evolves_from_species_id": "", + "evolution_chain_id": 11, + "color_id": 10, + "shape_id": 6, + "habitat_id": 6, + "gender_rate": 4, + "capture_rate": 255, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 28, + "conquest_order": "" + }, + { + "id": 28, + "identifier": "sandslash", + "generation_id": 1, + "evolves_from_species_id": 27, + "evolution_chain_id": 11, + "color_id": 10, + "shape_id": 6, + "habitat_id": 6, + "gender_rate": 4, + "capture_rate": 90, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 29, + "conquest_order": "" + }, + { + "id": 29, + "identifier": "nidoran-f", + "generation_id": 1, + "evolves_from_species_id": "", + "evolution_chain_id": 12, + "color_id": 2, + "shape_id": 8, + "habitat_id": 3, + "gender_rate": 8, + "capture_rate": 235, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 30, + "conquest_order": "" + }, + { + "id": 30, + "identifier": "nidorina", + "generation_id": 1, + "evolves_from_species_id": 29, + "evolution_chain_id": 12, + "color_id": 2, + "shape_id": 8, + "habitat_id": 3, + "gender_rate": 8, + "capture_rate": 120, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 31, + "conquest_order": "" + }, + { + "id": 31, + "identifier": "nidoqueen", + "generation_id": 1, + "evolves_from_species_id": 30, + "evolution_chain_id": 12, + "color_id": 2, + "shape_id": 6, + "habitat_id": 3, + "gender_rate": 8, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 32, + "conquest_order": "" + }, + { + "id": 32, + "identifier": "nidoran-m", + "generation_id": 1, + "evolves_from_species_id": "", + "evolution_chain_id": 13, + "color_id": 7, + "shape_id": 8, + "habitat_id": 3, + "gender_rate": 0, + "capture_rate": 235, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 33, + "conquest_order": "" + }, + { + "id": 33, + "identifier": "nidorino", + "generation_id": 1, + "evolves_from_species_id": 32, + "evolution_chain_id": 13, + "color_id": 7, + "shape_id": 8, + "habitat_id": 3, + "gender_rate": 0, + "capture_rate": 120, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 34, + "conquest_order": "" + }, + { + "id": 34, + "identifier": "nidoking", + "generation_id": 1, + "evolves_from_species_id": 33, + "evolution_chain_id": 13, + "color_id": 7, + "shape_id": 6, + "habitat_id": 3, + "gender_rate": 0, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 35, + "conquest_order": "" + }, + { + "id": 35, + "identifier": "clefairy", + "generation_id": 1, + "evolves_from_species_id": 173, + "evolution_chain_id": 14, + "color_id": 6, + "shape_id": 6, + "habitat_id": 4, + "gender_rate": 6, + "capture_rate": 150, + "base_happiness": 140, + "is_baby": 0, + "hatch_counter": 10, + "has_gender_differences": 0, + "growth_rate_id": 3, + "forms_switchable": 0, + "order": 37, + "conquest_order": "" + }, + { + "id": 36, + "identifier": "clefable", + "generation_id": 1, + "evolves_from_species_id": 35, + "evolution_chain_id": 14, + "color_id": 6, + "shape_id": 6, + "habitat_id": 4, + "gender_rate": 6, + "capture_rate": 25, + "base_happiness": 140, + "is_baby": 0, + "hatch_counter": 10, + "has_gender_differences": 0, + "growth_rate_id": 3, + "forms_switchable": 0, + "order": 38, + "conquest_order": "" + }, + { + "id": 37, + "identifier": "vulpix", + "generation_id": 1, + "evolves_from_species_id": "", + "evolution_chain_id": 15, + "color_id": 3, + "shape_id": 8, + "habitat_id": 3, + "gender_rate": 6, + "capture_rate": 190, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 39, + "conquest_order": "" + }, + { + "id": 38, + "identifier": "ninetales", + "generation_id": 1, + "evolves_from_species_id": 37, + "evolution_chain_id": 15, + "color_id": 10, + "shape_id": 8, + "habitat_id": 3, + "gender_rate": 6, + "capture_rate": 75, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 40, + "conquest_order": "" + }, + { + "id": 39, + "identifier": "jigglypuff", + "generation_id": 1, + "evolves_from_species_id": 174, + "evolution_chain_id": 16, + "color_id": 6, + "shape_id": 12, + "habitat_id": 3, + "gender_rate": 6, + "capture_rate": 170, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 10, + "has_gender_differences": 0, + "growth_rate_id": 3, + "forms_switchable": 0, + "order": 42, + "conquest_order": 21 + }, + { + "id": 40, + "identifier": "wigglytuff", + "generation_id": 1, + "evolves_from_species_id": 39, + "evolution_chain_id": 16, + "color_id": 6, + "shape_id": 12, + "habitat_id": 3, + "gender_rate": 6, + "capture_rate": 50, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 10, + "has_gender_differences": 0, + "growth_rate_id": 3, + "forms_switchable": 0, + "order": 43, + "conquest_order": 22 + }, + { + "id": 41, + "identifier": "zubat", + "generation_id": 1, + "evolves_from_species_id": "", + "evolution_chain_id": 17, + "color_id": 7, + "shape_id": 9, + "habitat_id": 1, + "gender_rate": 4, + "capture_rate": 255, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 1, + "growth_rate_id": 2, + "forms_switchable": 1, + "order": 44, + "conquest_order": 23 + }, + { + "id": 42, + "identifier": "golbat", + "generation_id": 1, + "evolves_from_species_id": 41, + "evolution_chain_id": 17, + "color_id": 7, + "shape_id": 9, + "habitat_id": 1, + "gender_rate": 4, + "capture_rate": 90, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 1, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 45, + "conquest_order": 24 + }, + { + "id": 43, + "identifier": "oddish", + "generation_id": 1, + "evolves_from_species_id": "", + "evolution_chain_id": 18, + "color_id": 2, + "shape_id": 7, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 255, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 47, + "conquest_order": "" + }, + { + "id": 44, + "identifier": "gloom", + "generation_id": 1, + "evolves_from_species_id": 43, + "evolution_chain_id": 18, + "color_id": 2, + "shape_id": 12, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 120, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 1, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 48, + "conquest_order": "" + }, + { + "id": 45, + "identifier": "vileplume", + "generation_id": 1, + "evolves_from_species_id": 44, + "evolution_chain_id": 18, + "color_id": 8, + "shape_id": 12, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 1, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 49, + "conquest_order": "" + }, + { + "id": 46, + "identifier": "paras", + "generation_id": 1, + "evolves_from_species_id": "", + "evolution_chain_id": 19, + "color_id": 8, + "shape_id": 14, + "habitat_id": 2, + "gender_rate": 4, + "capture_rate": 190, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 51, + "conquest_order": "" + }, + { + "id": 47, + "identifier": "parasect", + "generation_id": 1, + "evolves_from_species_id": 46, + "evolution_chain_id": 19, + "color_id": 8, + "shape_id": 14, + "habitat_id": 2, + "gender_rate": 4, + "capture_rate": 75, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 52, + "conquest_order": "" + }, + { + "id": 48, + "identifier": "venonat", + "generation_id": 1, + "evolves_from_species_id": "", + "evolution_chain_id": 20, + "color_id": 7, + "shape_id": 12, + "habitat_id": 2, + "gender_rate": 4, + "capture_rate": 190, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 53, + "conquest_order": "" + }, + { + "id": 49, + "identifier": "venomoth", + "generation_id": 1, + "evolves_from_species_id": 48, + "evolution_chain_id": 20, + "color_id": 7, + "shape_id": 13, + "habitat_id": 2, + "gender_rate": 4, + "capture_rate": 75, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 54, + "conquest_order": "" + }, + { + "id": 50, + "identifier": "diglett", + "generation_id": 1, + "evolves_from_species_id": "", + "evolution_chain_id": 21, + "color_id": 3, + "shape_id": 5, + "habitat_id": 1, + "gender_rate": 4, + "capture_rate": 255, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 55, + "conquest_order": "" + }, + { + "id": 51, + "identifier": "dugtrio", + "generation_id": 1, + "evolves_from_species_id": 50, + "evolution_chain_id": 21, + "color_id": 3, + "shape_id": 11, + "habitat_id": 1, + "gender_rate": 4, + "capture_rate": 50, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 56, + "conquest_order": "" + }, + { + "id": 52, + "identifier": "meowth", + "generation_id": 1, + "evolves_from_species_id": "", + "evolution_chain_id": 22, + "color_id": 10, + "shape_id": 8, + "habitat_id": 8, + "gender_rate": 4, + "capture_rate": 255, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 57, + "conquest_order": 58 + }, + { + "id": 53, + "identifier": "persian", + "generation_id": 1, + "evolves_from_species_id": 52, + "evolution_chain_id": 22, + "color_id": 10, + "shape_id": 8, + "habitat_id": 8, + "gender_rate": 4, + "capture_rate": 90, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 58, + "conquest_order": 59 + }, + { + "id": 54, + "identifier": "psyduck", + "generation_id": 1, + "evolves_from_species_id": "", + "evolution_chain_id": 23, + "color_id": 10, + "shape_id": 6, + "habitat_id": 9, + "gender_rate": 4, + "capture_rate": 190, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 59, + "conquest_order": "" + }, + { + "id": 55, + "identifier": "golduck", + "generation_id": 1, + "evolves_from_species_id": 54, + "evolution_chain_id": 23, + "color_id": 2, + "shape_id": 6, + "habitat_id": 9, + "gender_rate": 4, + "capture_rate": 75, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 60, + "conquest_order": "" + }, + { + "id": 56, + "identifier": "mankey", + "generation_id": 1, + "evolves_from_species_id": "", + "evolution_chain_id": 3636, + "color_id": 3, + "shape_id": 6, + "habitat_id": 4, + "gender_rate": 4, + "capture_rate": 190, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 61, + "conquest_order": "" + }, + { + "id": 57, + "identifier": "primeape", + "generation_id": 1, + "evolves_from_species_id": 56, + "evolution_chain_id": 3636, + "color_id": 3, + "shape_id": 6, + "habitat_id": 4, + "gender_rate": 4, + "capture_rate": 75, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 62, + "conquest_order": "" + }, + { + "id": 58, + "identifier": "growlithe", + "generation_id": 1, + "evolves_from_species_id": "", + "evolution_chain_id": 25, + "color_id": 3, + "shape_id": 8, + "habitat_id": 3, + "gender_rate": 2, + "capture_rate": 190, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 63, + "conquest_order": "" + }, + { + "id": 59, + "identifier": "arcanine", + "generation_id": 1, + "evolves_from_species_id": 58, + "evolution_chain_id": 25, + "color_id": 3, + "shape_id": 8, + "habitat_id": 3, + "gender_rate": 2, + "capture_rate": 75, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 64, + "conquest_order": "" + }, + { + "id": 60, + "identifier": "poliwag", + "generation_id": 1, + "evolves_from_species_id": "", + "evolution_chain_id": 26, + "color_id": 2, + "shape_id": 7, + "habitat_id": 9, + "gender_rate": 4, + "capture_rate": 255, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 65, + "conquest_order": "" + }, + { + "id": 61, + "identifier": "poliwhirl", + "generation_id": 1, + "evolves_from_species_id": 60, + "evolution_chain_id": 26, + "color_id": 2, + "shape_id": 12, + "habitat_id": 9, + "gender_rate": 4, + "capture_rate": 120, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 66, + "conquest_order": "" + }, + { + "id": 62, + "identifier": "poliwrath", + "generation_id": 1, + "evolves_from_species_id": 61, + "evolution_chain_id": 26, + "color_id": 2, + "shape_id": 12, + "habitat_id": 9, + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 67, + "conquest_order": "" + }, + { + "id": 63, + "identifier": "abra", + "generation_id": 1, + "evolves_from_species_id": "", + "evolution_chain_id": 27, + "color_id": 3, + "shape_id": 6, + "habitat_id": 8, + "gender_rate": 2, + "capture_rate": 200, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 69, + "conquest_order": 127 + }, + { + "id": 64, + "identifier": "kadabra", + "generation_id": 1, + "evolves_from_species_id": 63, + "evolution_chain_id": 27, + "color_id": 3, + "shape_id": 6, + "habitat_id": 8, + "gender_rate": 2, + "capture_rate": 100, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 1, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 70, + "conquest_order": 128 + }, + { + "id": 65, + "identifier": "alakazam", + "generation_id": 1, + "evolves_from_species_id": 64, + "evolution_chain_id": 27, + "color_id": 3, + "shape_id": 12, + "habitat_id": 8, + "gender_rate": 2, + "capture_rate": 50, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 1, + "growth_rate_id": 4, + "forms_switchable": 1, + "order": 71, + "conquest_order": 129 + }, + { + "id": 66, + "identifier": "machop", + "generation_id": 1, + "evolves_from_species_id": "", + "evolution_chain_id": 28, + "color_id": 4, + "shape_id": 6, + "habitat_id": 4, + "gender_rate": 2, + "capture_rate": 180, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 72, + "conquest_order": 98 + }, + { + "id": 67, + "identifier": "machoke", + "generation_id": 1, + "evolves_from_species_id": 66, + "evolution_chain_id": 28, + "color_id": 4, + "shape_id": 12, + "habitat_id": 4, + "gender_rate": 2, + "capture_rate": 90, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 73, + "conquest_order": 99 + }, + { + "id": 68, + "identifier": "machamp", + "generation_id": 1, + "evolves_from_species_id": 67, + "evolution_chain_id": 28, + "color_id": 4, + "shape_id": 12, + "habitat_id": 4, + "gender_rate": 2, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 74, + "conquest_order": 100 + }, + { + "id": 69, + "identifier": "bellsprout", + "generation_id": 1, + "evolves_from_species_id": "", + "evolution_chain_id": 29, + "color_id": 5, + "shape_id": 12, + "habitat_id": 2, + "gender_rate": 4, + "capture_rate": 255, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 75, + "conquest_order": "" + }, + { + "id": 70, + "identifier": "weepinbell", + "generation_id": 1, + "evolves_from_species_id": 69, + "evolution_chain_id": 29, + "color_id": 5, + "shape_id": 5, + "habitat_id": 2, + "gender_rate": 4, + "capture_rate": 120, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 76, + "conquest_order": "" + }, + { + "id": 71, + "identifier": "victreebel", + "generation_id": 1, + "evolves_from_species_id": 70, + "evolution_chain_id": 29, + "color_id": 5, + "shape_id": 5, + "habitat_id": 2, + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 77, + "conquest_order": "" + }, + { + "id": 72, + "identifier": "tentacool", + "generation_id": 1, + "evolves_from_species_id": "", + "evolution_chain_id": 30, + "color_id": 2, + "shape_id": 10, + "habitat_id": 7, + "gender_rate": 4, + "capture_rate": 190, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 78, + "conquest_order": "" + }, + { + "id": 73, + "identifier": "tentacruel", + "generation_id": 1, + "evolves_from_species_id": 72, + "evolution_chain_id": 30, + "color_id": 2, + "shape_id": 10, + "habitat_id": 7, + "gender_rate": 4, + "capture_rate": 60, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 79, + "conquest_order": "" + }, + { + "id": 74, + "identifier": "geodude", + "generation_id": 1, + "evolves_from_species_id": "", + "evolution_chain_id": 31, + "color_id": 3, + "shape_id": 4, + "habitat_id": 4, + "gender_rate": 4, + "capture_rate": 255, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 80, + "conquest_order": "" + }, + { + "id": 75, + "identifier": "graveler", + "generation_id": 1, + "evolves_from_species_id": 74, + "evolution_chain_id": 31, + "color_id": 3, + "shape_id": 12, + "habitat_id": 4, + "gender_rate": 4, + "capture_rate": 120, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 81, + "conquest_order": "" + }, + { + "id": 76, + "identifier": "golem", + "generation_id": 1, + "evolves_from_species_id": 75, + "evolution_chain_id": 31, + "color_id": 3, + "shape_id": 12, + "habitat_id": 4, + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 82, + "conquest_order": "" + }, + { + "id": 77, + "identifier": "ponyta", + "generation_id": 1, + "evolves_from_species_id": "", + "evolution_chain_id": 32, + "color_id": 10, + "shape_id": 8, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 190, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 83, + "conquest_order": "" + }, + { + "id": 78, + "identifier": "rapidash", + "generation_id": 1, + "evolves_from_species_id": 77, + "evolution_chain_id": 32, + "color_id": 10, + "shape_id": 8, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 60, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 84, + "conquest_order": "" + }, + { + "id": 79, + "identifier": "slowpoke", + "generation_id": 1, + "evolves_from_species_id": "", + "evolution_chain_id": 33, + "color_id": 6, + "shape_id": 8, + "habitat_id": 9, + "gender_rate": 4, + "capture_rate": 190, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 85, + "conquest_order": "" + }, + { + "id": 80, + "identifier": "slowbro", + "generation_id": 1, + "evolves_from_species_id": 79, + "evolution_chain_id": 33, + "color_id": 6, + "shape_id": 6, + "habitat_id": 9, + "gender_rate": 4, + "capture_rate": 75, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 1, + "order": 86, + "conquest_order": "" + }, + { + "id": 81, + "identifier": "magnemite", + "generation_id": 1, + "evolves_from_species_id": "", + "evolution_chain_id": 34, + "color_id": 4, + "shape_id": 4, + "habitat_id": 6, + "gender_rate": -1, + "capture_rate": 190, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 88, + "conquest_order": "" + }, + { + "id": 82, + "identifier": "magneton", + "generation_id": 1, + "evolves_from_species_id": 81, + "evolution_chain_id": 34, + "color_id": 4, + "shape_id": 11, + "habitat_id": 6, + "gender_rate": -1, + "capture_rate": 60, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 89, + "conquest_order": "" + }, + { + "id": 83, + "identifier": "farfetchd", + "generation_id": 1, + "evolves_from_species_id": "", + "evolution_chain_id": 35, + "color_id": 3, + "shape_id": 9, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 91, + "conquest_order": "" + }, + { + "id": 84, + "identifier": "doduo", + "generation_id": 1, + "evolves_from_species_id": "", + "evolution_chain_id": 36, + "color_id": 3, + "shape_id": 7, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 190, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 1, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 92, + "conquest_order": "" + }, + { + "id": 85, + "identifier": "dodrio", + "generation_id": 1, + "evolves_from_species_id": 84, + "evolution_chain_id": 36, + "color_id": 3, + "shape_id": 7, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 1, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 93, + "conquest_order": "" + }, + { + "id": 86, + "identifier": "seel", + "generation_id": 1, + "evolves_from_species_id": "", + "evolution_chain_id": 37, + "color_id": 9, + "shape_id": 3, + "habitat_id": 7, + "gender_rate": 4, + "capture_rate": 190, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 94, + "conquest_order": "" + }, + { + "id": 87, + "identifier": "dewgong", + "generation_id": 1, + "evolves_from_species_id": 86, + "evolution_chain_id": 37, + "color_id": 9, + "shape_id": 3, + "habitat_id": 7, + "gender_rate": 4, + "capture_rate": 75, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 95, + "conquest_order": "" + }, + { + "id": 88, + "identifier": "grimer", + "generation_id": 1, + "evolves_from_species_id": "", + "evolution_chain_id": 38, + "color_id": 7, + "shape_id": 4, + "habitat_id": 8, + "gender_rate": 4, + "capture_rate": 190, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 96, + "conquest_order": "" + }, + { + "id": 89, + "identifier": "muk", + "generation_id": 1, + "evolves_from_species_id": 88, + "evolution_chain_id": 38, + "color_id": 7, + "shape_id": 4, + "habitat_id": 8, + "gender_rate": 4, + "capture_rate": 75, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 97, + "conquest_order": "" + }, + { + "id": 90, + "identifier": "shellder", + "generation_id": 1, + "evolves_from_species_id": "", + "evolution_chain_id": 39, + "color_id": 7, + "shape_id": 1, + "habitat_id": 7, + "gender_rate": 4, + "capture_rate": 190, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 98, + "conquest_order": "" + }, + { + "id": 91, + "identifier": "cloyster", + "generation_id": 1, + "evolves_from_species_id": 90, + "evolution_chain_id": 39, + "color_id": 7, + "shape_id": 1, + "habitat_id": 7, + "gender_rate": 4, + "capture_rate": 60, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 99, + "conquest_order": "" + }, + { + "id": 92, + "identifier": "gastly", + "generation_id": 1, + "evolves_from_species_id": "", + "evolution_chain_id": 40, + "color_id": 7, + "shape_id": 1, + "habitat_id": 1, + "gender_rate": 4, + "capture_rate": 190, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 100, + "conquest_order": 112 + }, + { + "id": 93, + "identifier": "haunter", + "generation_id": 1, + "evolves_from_species_id": 92, + "evolution_chain_id": 40, + "color_id": 7, + "shape_id": 4, + "habitat_id": 1, + "gender_rate": 4, + "capture_rate": 90, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 101, + "conquest_order": 113 + }, + { + "id": 94, + "identifier": "gengar", + "generation_id": 1, + "evolves_from_species_id": 93, + "evolution_chain_id": 40, + "color_id": 7, + "shape_id": 6, + "habitat_id": 1, + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 1, + "order": 102, + "conquest_order": 114 + }, + { + "id": 95, + "identifier": "onix", + "generation_id": 1, + "evolves_from_species_id": "", + "evolution_chain_id": 41, + "color_id": 4, + "shape_id": 2, + "habitat_id": 1, + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 25, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 103, + "conquest_order": 175 + }, + { + "id": 96, + "identifier": "drowzee", + "generation_id": 1, + "evolves_from_species_id": "", + "evolution_chain_id": 42, + "color_id": 10, + "shape_id": 12, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 190, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 105, + "conquest_order": "" + }, + { + "id": 97, + "identifier": "hypno", + "generation_id": 1, + "evolves_from_species_id": 96, + "evolution_chain_id": 42, + "color_id": 10, + "shape_id": 12, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 75, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 1, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 106, + "conquest_order": "" + }, + { + "id": 98, + "identifier": "krabby", + "generation_id": 1, + "evolves_from_species_id": "", + "evolution_chain_id": 43, + "color_id": 8, + "shape_id": 14, + "habitat_id": 9, + "gender_rate": 4, + "capture_rate": 225, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 107, + "conquest_order": "" + }, + { + "id": 99, + "identifier": "kingler", + "generation_id": 1, + "evolves_from_species_id": 98, + "evolution_chain_id": 43, + "color_id": 8, + "shape_id": 14, + "habitat_id": 9, + "gender_rate": 4, + "capture_rate": 60, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 108, + "conquest_order": "" + }, + { + "id": 100, + "identifier": "voltorb", + "generation_id": 1, + "evolves_from_species_id": "", + "evolution_chain_id": 44, + "color_id": 8, + "shape_id": 1, + "habitat_id": 8, + "gender_rate": -1, + "capture_rate": 190, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 109, + "conquest_order": "" + }, + { + "id": 101, + "identifier": "electrode", + "generation_id": 1, + "evolves_from_species_id": 100, + "evolution_chain_id": 44, + "color_id": 8, + "shape_id": 1, + "habitat_id": 8, + "gender_rate": -1, + "capture_rate": 60, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 110, + "conquest_order": "" + }, + { + "id": 102, + "identifier": "exeggcute", + "generation_id": 1, + "evolves_from_species_id": "", + "evolution_chain_id": 45, + "color_id": 6, + "shape_id": 11, + "habitat_id": 2, + "gender_rate": 4, + "capture_rate": 90, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 111, + "conquest_order": "" + }, + { + "id": 103, + "identifier": "exeggutor", + "generation_id": 1, + "evolves_from_species_id": 102, + "evolution_chain_id": 45, + "color_id": 10, + "shape_id": 7, + "habitat_id": 2, + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 112, + "conquest_order": "" + }, + { + "id": 104, + "identifier": "cubone", + "generation_id": 1, + "evolves_from_species_id": "", + "evolution_chain_id": 46, + "color_id": 3, + "shape_id": 6, + "habitat_id": 4, + "gender_rate": 4, + "capture_rate": 190, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 113, + "conquest_order": "" + }, + { + "id": 105, + "identifier": "marowak", + "generation_id": 1, + "evolves_from_species_id": 104, + "evolution_chain_id": 46, + "color_id": 3, + "shape_id": 6, + "habitat_id": 4, + "gender_rate": 4, + "capture_rate": 75, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 114, + "conquest_order": "" + }, + { + "id": 106, + "identifier": "hitmonlee", + "generation_id": 1, + "evolves_from_species_id": 236, + "evolution_chain_id": 47, + "color_id": 3, + "shape_id": 12, + "habitat_id": 8, + "gender_rate": 0, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 25, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 116, + "conquest_order": "" + }, + { + "id": 107, + "identifier": "hitmonchan", + "generation_id": 1, + "evolves_from_species_id": 236, + "evolution_chain_id": 47, + "color_id": 3, + "shape_id": 12, + "habitat_id": 8, + "gender_rate": 0, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 25, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 117, + "conquest_order": "" + }, + { + "id": 108, + "identifier": "lickitung", + "generation_id": 1, + "evolves_from_species_id": "", + "evolution_chain_id": 48, + "color_id": 6, + "shape_id": 6, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 119, + "conquest_order": "" + }, + { + "id": 109, + "identifier": "koffing", + "generation_id": 1, + "evolves_from_species_id": "", + "evolution_chain_id": 49, + "color_id": 7, + "shape_id": 1, + "habitat_id": 8, + "gender_rate": 4, + "capture_rate": 190, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 121, + "conquest_order": "" + }, + { + "id": 110, + "identifier": "weezing", + "generation_id": 1, + "evolves_from_species_id": 109, + "evolution_chain_id": 49, + "color_id": 7, + "shape_id": 11, + "habitat_id": 8, + "gender_rate": 4, + "capture_rate": 60, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 122, + "conquest_order": "" + }, + { + "id": 111, + "identifier": "rhyhorn", + "generation_id": 1, + "evolves_from_species_id": "", + "evolution_chain_id": 50, + "color_id": 4, + "shape_id": 8, + "habitat_id": 6, + "gender_rate": 4, + "capture_rate": 120, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 1, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 123, + "conquest_order": 160 + }, + { + "id": 112, + "identifier": "rhydon", + "generation_id": 1, + "evolves_from_species_id": 111, + "evolution_chain_id": 50, + "color_id": 4, + "shape_id": 6, + "habitat_id": 6, + "gender_rate": 4, + "capture_rate": 60, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 1, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 124, + "conquest_order": 161 + }, + { + "id": 113, + "identifier": "chansey", + "generation_id": 1, + "evolves_from_species_id": 440, + "evolution_chain_id": 51, + "color_id": 6, + "shape_id": 6, + "habitat_id": 8, + "gender_rate": 8, + "capture_rate": 30, + "base_happiness": 140, + "is_baby": 0, + "hatch_counter": 40, + "has_gender_differences": 0, + "growth_rate_id": 3, + "forms_switchable": 0, + "order": 127, + "conquest_order": "" + }, + { + "id": 114, + "identifier": "tangela", + "generation_id": 1, + "evolves_from_species_id": "", + "evolution_chain_id": 52, + "color_id": 2, + "shape_id": 7, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 129, + "conquest_order": "" + }, + { + "id": 115, + "identifier": "kangaskhan", + "generation_id": 1, + "evolves_from_species_id": "", + "evolution_chain_id": 53, + "color_id": 3, + "shape_id": 6, + "habitat_id": 3, + "gender_rate": 8, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 1, + "order": 131, + "conquest_order": "" + }, + { + "id": 116, + "identifier": "horsea", + "generation_id": 1, + "evolves_from_species_id": "", + "evolution_chain_id": 54, + "color_id": 2, + "shape_id": 5, + "habitat_id": 7, + "gender_rate": 4, + "capture_rate": 225, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 132, + "conquest_order": "" + }, + { + "id": 117, + "identifier": "seadra", + "generation_id": 1, + "evolves_from_species_id": 116, + "evolution_chain_id": 54, + "color_id": 2, + "shape_id": 5, + "habitat_id": 7, + "gender_rate": 4, + "capture_rate": 75, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 133, + "conquest_order": "" + }, + { + "id": 118, + "identifier": "goldeen", + "generation_id": 1, + "evolves_from_species_id": "", + "evolution_chain_id": 55, + "color_id": 8, + "shape_id": 3, + "habitat_id": 9, + "gender_rate": 4, + "capture_rate": 225, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 1, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 135, + "conquest_order": "" + }, + { + "id": 119, + "identifier": "seaking", + "generation_id": 1, + "evolves_from_species_id": 118, + "evolution_chain_id": 55, + "color_id": 8, + "shape_id": 3, + "habitat_id": 9, + "gender_rate": 4, + "capture_rate": 60, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 1, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 136, + "conquest_order": "" + }, + { + "id": 120, + "identifier": "staryu", + "generation_id": 1, + "evolves_from_species_id": "", + "evolution_chain_id": 56, + "color_id": 3, + "shape_id": 5, + "habitat_id": 7, + "gender_rate": -1, + "capture_rate": 225, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 137, + "conquest_order": "" + }, + { + "id": 121, + "identifier": "starmie", + "generation_id": 1, + "evolves_from_species_id": 120, + "evolution_chain_id": 56, + "color_id": 7, + "shape_id": 5, + "habitat_id": 7, + "gender_rate": -1, + "capture_rate": 60, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 138, + "conquest_order": "" + }, + { + "id": 122, + "identifier": "mr-mime", + "generation_id": 1, + "evolves_from_species_id": 439, + "evolution_chain_id": 57, + "color_id": 6, + "shape_id": 12, + "habitat_id": 8, + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 25, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 140, + "conquest_order": "" + }, + { + "id": 123, + "identifier": "scyther", + "generation_id": 1, + "evolves_from_species_id": "", + "evolution_chain_id": 58, + "color_id": 5, + "shape_id": 13, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 25, + "has_gender_differences": 1, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 141, + "conquest_order": 188 + }, + { + "id": 124, + "identifier": "jynx", + "generation_id": 1, + "evolves_from_species_id": 238, + "evolution_chain_id": 59, + "color_id": 8, + "shape_id": 12, + "habitat_id": 8, + "gender_rate": 8, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 25, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 144, + "conquest_order": "" + }, + { + "id": 125, + "identifier": "electabuzz", + "generation_id": 1, + "evolves_from_species_id": 239, + "evolution_chain_id": 60, + "color_id": 10, + "shape_id": 6, + "habitat_id": 3, + "gender_rate": 2, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 25, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 146, + "conquest_order": "" + }, + { + "id": 126, + "identifier": "magmar", + "generation_id": 1, + "evolves_from_species_id": 240, + "evolution_chain_id": 61, + "color_id": 8, + "shape_id": 6, + "habitat_id": 4, + "gender_rate": 2, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 25, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 149, + "conquest_order": "" + }, + { + "id": 127, + "identifier": "pinsir", + "generation_id": 1, + "evolves_from_species_id": "", + "evolution_chain_id": 62, + "color_id": 3, + "shape_id": 12, + "habitat_id": 2, + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 25, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 1, + "order": 151, + "conquest_order": "" + }, + { + "id": 128, + "identifier": "tauros", + "generation_id": 1, + "evolves_from_species_id": "", + "evolution_chain_id": 63, + "color_id": 3, + "shape_id": 8, + "habitat_id": 3, + "gender_rate": 0, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 152, + "conquest_order": "" + }, + { + "id": 129, + "identifier": "magikarp", + "generation_id": 1, + "evolves_from_species_id": "", + "evolution_chain_id": 64, + "color_id": 8, + "shape_id": 3, + "habitat_id": 9, + "gender_rate": 4, + "capture_rate": 255, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 5, + "has_gender_differences": 1, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 153, + "conquest_order": 13 + }, + { + "id": 130, + "identifier": "gyarados", + "generation_id": 1, + "evolves_from_species_id": 129, + "evolution_chain_id": 64, + "color_id": 2, + "shape_id": 2, + "habitat_id": 9, + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 5, + "has_gender_differences": 1, + "growth_rate_id": 1, + "forms_switchable": 1, + "order": 154, + "conquest_order": 14 + }, + { + "id": 131, + "identifier": "lapras", + "generation_id": 1, + "evolves_from_species_id": "", + "evolution_chain_id": 65, + "color_id": 2, + "shape_id": 3, + "habitat_id": 7, + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 40, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 155, + "conquest_order": 190 + }, + { + "id": 132, + "identifier": "ditto", + "generation_id": 1, + "evolves_from_species_id": "", + "evolution_chain_id": 66, + "color_id": 7, + "shape_id": 1, + "habitat_id": 8, + "gender_rate": -1, + "capture_rate": 15, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 156, + "conquest_order": "" + }, + { + "id": 133, + "identifier": "eevee", + "generation_id": 1, + "evolves_from_species_id": "", + "evolution_chain_id": 67, + "color_id": 3, + "shape_id": 8, + "habitat_id": 8, + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 35, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 157, + "conquest_order": 1 + }, + { + "id": 134, + "identifier": "vaporeon", + "generation_id": 1, + "evolves_from_species_id": 133, + "evolution_chain_id": 67, + "color_id": 2, + "shape_id": 8, + "habitat_id": 8, + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 35, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 158, + "conquest_order": 2 + }, + { + "id": 135, + "identifier": "jolteon", + "generation_id": 1, + "evolves_from_species_id": 133, + "evolution_chain_id": 67, + "color_id": 10, + "shape_id": 8, + "habitat_id": 8, + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 35, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 159, + "conquest_order": 3 + }, + { + "id": 136, + "identifier": "flareon", + "generation_id": 1, + "evolves_from_species_id": 133, + "evolution_chain_id": 67, + "color_id": 8, + "shape_id": 8, + "habitat_id": 8, + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 35, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 160, + "conquest_order": 4 + }, + { + "id": 137, + "identifier": "porygon", + "generation_id": 1, + "evolves_from_species_id": "", + "evolution_chain_id": 68, + "color_id": 6, + "shape_id": 7, + "habitat_id": 8, + "gender_rate": -1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 166, + "conquest_order": "" + }, + { + "id": 138, + "identifier": "omanyte", + "generation_id": 1, + "evolves_from_species_id": "", + "evolution_chain_id": 69, + "color_id": 2, + "shape_id": 10, + "habitat_id": 7, + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 30, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 169, + "conquest_order": "" + }, + { + "id": 139, + "identifier": "omastar", + "generation_id": 1, + "evolves_from_species_id": 138, + "evolution_chain_id": 69, + "color_id": 2, + "shape_id": 10, + "habitat_id": 7, + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 30, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 170, + "conquest_order": "" + }, + { + "id": 140, + "identifier": "kabuto", + "generation_id": 1, + "evolves_from_species_id": "", + "evolution_chain_id": 70, + "color_id": 3, + "shape_id": 14, + "habitat_id": 7, + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 30, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 171, + "conquest_order": "" + }, + { + "id": 141, + "identifier": "kabutops", + "generation_id": 1, + "evolves_from_species_id": 140, + "evolution_chain_id": 70, + "color_id": 3, + "shape_id": 6, + "habitat_id": 7, + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 30, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 172, + "conquest_order": "" + }, + { + "id": 142, + "identifier": "aerodactyl", + "generation_id": 1, + "evolves_from_species_id": "", + "evolution_chain_id": 71, + "color_id": 7, + "shape_id": 9, + "habitat_id": 4, + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 35, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 1, + "order": 173, + "conquest_order": "" + }, + { + "id": 143, + "identifier": "snorlax", + "generation_id": 1, + "evolves_from_species_id": 446, + "evolution_chain_id": 72, + "color_id": 1, + "shape_id": 12, + "habitat_id": 4, + "gender_rate": 1, + "capture_rate": 25, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 40, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 175, + "conquest_order": 179 + }, + { + "id": 144, + "identifier": "articuno", + "generation_id": 1, + "evolves_from_species_id": "", + "evolution_chain_id": 73, + "color_id": 2, + "shape_id": 9, + "habitat_id": 5, + "gender_rate": -1, + "capture_rate": 3, + "base_happiness": 35, + "is_baby": 0, + "hatch_counter": 80, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 176, + "conquest_order": 192 + }, + { + "id": 145, + "identifier": "zapdos", + "generation_id": 1, + "evolves_from_species_id": "", + "evolution_chain_id": 74, + "color_id": 10, + "shape_id": 9, + "habitat_id": 5, + "gender_rate": -1, + "capture_rate": 3, + "base_happiness": 35, + "is_baby": 0, + "hatch_counter": 80, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 177, + "conquest_order": "" + }, + { + "id": 146, + "identifier": "moltres", + "generation_id": 1, + "evolves_from_species_id": "", + "evolution_chain_id": 75, + "color_id": 10, + "shape_id": 9, + "habitat_id": 5, + "gender_rate": -1, + "capture_rate": 3, + "base_happiness": 35, + "is_baby": 0, + "hatch_counter": 80, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 178, + "conquest_order": "" + }, + { + "id": 147, + "identifier": "dratini", + "generation_id": 1, + "evolves_from_species_id": "", + "evolution_chain_id": 76, + "color_id": 2, + "shape_id": 2, + "habitat_id": 9, + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 35, + "is_baby": 0, + "hatch_counter": 40, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 179, + "conquest_order": 76 + }, + { + "id": 148, + "identifier": "dragonair", + "generation_id": 1, + "evolves_from_species_id": 147, + "evolution_chain_id": 76, + "color_id": 2, + "shape_id": 2, + "habitat_id": 9, + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 35, + "is_baby": 0, + "hatch_counter": 40, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 180, + "conquest_order": 77 + }, + { + "id": 149, + "identifier": "dragonite", + "generation_id": 1, + "evolves_from_species_id": 148, + "evolution_chain_id": 76, + "color_id": 3, + "shape_id": 6, + "habitat_id": 9, + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 35, + "is_baby": 0, + "hatch_counter": 40, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 181, + "conquest_order": 78 + }, + { + "id": 150, + "identifier": "mewtwo", + "generation_id": 1, + "evolves_from_species_id": "", + "evolution_chain_id": 77, + "color_id": 7, + "shape_id": 6, + "habitat_id": 5, + "gender_rate": -1, + "capture_rate": 3, + "base_happiness": 0, + "is_baby": 0, + "hatch_counter": 120, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 1, + "order": 182, + "conquest_order": 196 + }, + { + "id": 151, + "identifier": "mew", + "generation_id": 1, + "evolves_from_species_id": "", + "evolution_chain_id": 78, + "color_id": 6, + "shape_id": 6, + "habitat_id": 5, + "gender_rate": -1, + "capture_rate": 45, + "base_happiness": 100, + "is_baby": 0, + "hatch_counter": 120, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 183, + "conquest_order": "" + }, + { + "id": 152, + "identifier": "chikorita", + "generation_id": 2, + "evolves_from_species_id": "", + "evolution_chain_id": 79, + "color_id": 5, + "shape_id": 8, + "habitat_id": 3, + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 184, + "conquest_order": "" + }, + { + "id": 153, + "identifier": "bayleef", + "generation_id": 2, + "evolves_from_species_id": 152, + "evolution_chain_id": 79, + "color_id": 5, + "shape_id": 8, + "habitat_id": 3, + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 185, + "conquest_order": "" + }, + { + "id": 154, + "identifier": "meganium", + "generation_id": 2, + "evolves_from_species_id": 153, + "evolution_chain_id": 79, + "color_id": 5, + "shape_id": 8, + "habitat_id": 3, + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 1, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 186, + "conquest_order": "" + }, + { + "id": 155, + "identifier": "cyndaquil", + "generation_id": 2, + "evolves_from_species_id": "", + "evolution_chain_id": 80, + "color_id": 10, + "shape_id": 12, + "habitat_id": 3, + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 187, + "conquest_order": "" + }, + { + "id": 156, + "identifier": "quilava", + "generation_id": 2, + "evolves_from_species_id": 155, + "evolution_chain_id": 80, + "color_id": 10, + "shape_id": 8, + "habitat_id": 3, + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 188, + "conquest_order": "" + }, + { + "id": 157, + "identifier": "typhlosion", + "generation_id": 2, + "evolves_from_species_id": 156, + "evolution_chain_id": 80, + "color_id": 10, + "shape_id": 8, + "habitat_id": 3, + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 189, + "conquest_order": "" + }, + { + "id": 158, + "identifier": "totodile", + "generation_id": 2, + "evolves_from_species_id": "", + "evolution_chain_id": 81, + "color_id": 2, + "shape_id": 6, + "habitat_id": 9, + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 190, + "conquest_order": "" + }, + { + "id": 159, + "identifier": "croconaw", + "generation_id": 2, + "evolves_from_species_id": 158, + "evolution_chain_id": 81, + "color_id": 2, + "shape_id": 6, + "habitat_id": 9, + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 191, + "conquest_order": "" + }, + { + "id": 160, + "identifier": "feraligatr", + "generation_id": 2, + "evolves_from_species_id": 159, + "evolution_chain_id": 81, + "color_id": 2, + "shape_id": 6, + "habitat_id": 9, + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 192, + "conquest_order": "" + }, + { + "id": 161, + "identifier": "sentret", + "generation_id": 2, + "evolves_from_species_id": "", + "evolution_chain_id": 82, + "color_id": 3, + "shape_id": 8, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 255, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 193, + "conquest_order": "" + }, + { + "id": 162, + "identifier": "furret", + "generation_id": 2, + "evolves_from_species_id": 161, + "evolution_chain_id": 82, + "color_id": 3, + "shape_id": 8, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 90, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 194, + "conquest_order": "" + }, + { + "id": 163, + "identifier": "hoothoot", + "generation_id": 2, + "evolves_from_species_id": "", + "evolution_chain_id": 83, + "color_id": 3, + "shape_id": 9, + "habitat_id": 2, + "gender_rate": 4, + "capture_rate": 255, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 195, + "conquest_order": "" + }, + { + "id": 164, + "identifier": "noctowl", + "generation_id": 2, + "evolves_from_species_id": 163, + "evolution_chain_id": 83, + "color_id": 3, + "shape_id": 9, + "habitat_id": 2, + "gender_rate": 4, + "capture_rate": 90, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 196, + "conquest_order": "" + }, + { + "id": 165, + "identifier": "ledyba", + "generation_id": 2, + "evolves_from_species_id": "", + "evolution_chain_id": 84, + "color_id": 8, + "shape_id": 9, + "habitat_id": 2, + "gender_rate": 4, + "capture_rate": 255, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 1, + "growth_rate_id": 3, + "forms_switchable": 0, + "order": 197, + "conquest_order": "" + }, + { + "id": 166, + "identifier": "ledian", + "generation_id": 2, + "evolves_from_species_id": 165, + "evolution_chain_id": 84, + "color_id": 8, + "shape_id": 9, + "habitat_id": 2, + "gender_rate": 4, + "capture_rate": 90, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 1, + "growth_rate_id": 3, + "forms_switchable": 0, + "order": 198, + "conquest_order": "" + }, + { + "id": 167, + "identifier": "spinarak", + "generation_id": 2, + "evolves_from_species_id": "", + "evolution_chain_id": 85, + "color_id": 5, + "shape_id": 14, + "habitat_id": 2, + "gender_rate": 4, + "capture_rate": 255, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 3, + "forms_switchable": 0, + "order": 199, + "conquest_order": "" + }, + { + "id": 168, + "identifier": "ariados", + "generation_id": 2, + "evolves_from_species_id": 167, + "evolution_chain_id": 85, + "color_id": 8, + "shape_id": 14, + "habitat_id": 2, + "gender_rate": 4, + "capture_rate": 90, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 3, + "forms_switchable": 0, + "order": 200, + "conquest_order": "" + }, + { + "id": 169, + "identifier": "crobat", + "generation_id": 2, + "evolves_from_species_id": 42, + "evolution_chain_id": 17, + "color_id": 7, + "shape_id": 13, + "habitat_id": 1, + "gender_rate": 4, + "capture_rate": 90, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 46, + "conquest_order": 25 + }, + { + "id": 170, + "identifier": "chinchou", + "generation_id": 2, + "evolves_from_species_id": "", + "evolution_chain_id": 86, + "color_id": 2, + "shape_id": 3, + "habitat_id": 7, + "gender_rate": 4, + "capture_rate": 190, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 201, + "conquest_order": "" + }, + { + "id": 171, + "identifier": "lanturn", + "generation_id": 2, + "evolves_from_species_id": 170, + "evolution_chain_id": 86, + "color_id": 2, + "shape_id": 3, + "habitat_id": 7, + "gender_rate": 4, + "capture_rate": 75, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 202, + "conquest_order": "" + }, + { + "id": 172, + "identifier": "pichu", + "generation_id": 2, + "evolves_from_species_id": "", + "evolution_chain_id": 10, + "color_id": 10, + "shape_id": 8, + "habitat_id": 2, + "gender_rate": 4, + "capture_rate": 190, + "base_happiness": 70, + "is_baby": 1, + "hatch_counter": 10, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 25, + "conquest_order": 15 + }, + { + "id": 173, + "identifier": "cleffa", + "generation_id": 2, + "evolves_from_species_id": "", + "evolution_chain_id": 14, + "color_id": 6, + "shape_id": 6, + "habitat_id": 4, + "gender_rate": 6, + "capture_rate": 150, + "base_happiness": 140, + "is_baby": 1, + "hatch_counter": 10, + "has_gender_differences": 0, + "growth_rate_id": 3, + "forms_switchable": 0, + "order": 36, + "conquest_order": "" + }, + { + "id": 174, + "identifier": "igglybuff", + "generation_id": 2, + "evolves_from_species_id": "", + "evolution_chain_id": 16, + "color_id": 6, + "shape_id": 12, + "habitat_id": 3, + "gender_rate": 6, + "capture_rate": 170, + "base_happiness": 70, + "is_baby": 1, + "hatch_counter": 10, + "has_gender_differences": 0, + "growth_rate_id": 3, + "forms_switchable": 0, + "order": 41, + "conquest_order": 20 + }, + { + "id": 175, + "identifier": "togepi", + "generation_id": 2, + "evolves_from_species_id": "", + "evolution_chain_id": 87, + "color_id": 9, + "shape_id": 12, + "habitat_id": 2, + "gender_rate": 1, + "capture_rate": 190, + "base_happiness": 70, + "is_baby": 1, + "hatch_counter": 10, + "has_gender_differences": 0, + "growth_rate_id": 3, + "forms_switchable": 0, + "order": 203, + "conquest_order": "" + }, + { + "id": 176, + "identifier": "togetic", + "generation_id": 2, + "evolves_from_species_id": 175, + "evolution_chain_id": 87, + "color_id": 9, + "shape_id": 12, + "habitat_id": 2, + "gender_rate": 1, + "capture_rate": 75, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 10, + "has_gender_differences": 0, + "growth_rate_id": 3, + "forms_switchable": 0, + "order": 204, + "conquest_order": "" + }, + { + "id": 177, + "identifier": "natu", + "generation_id": 2, + "evolves_from_species_id": "", + "evolution_chain_id": 88, + "color_id": 5, + "shape_id": 9, + "habitat_id": 2, + "gender_rate": 4, + "capture_rate": 190, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 206, + "conquest_order": "" + }, + { + "id": 178, + "identifier": "xatu", + "generation_id": 2, + "evolves_from_species_id": 177, + "evolution_chain_id": 88, + "color_id": 5, + "shape_id": 9, + "habitat_id": 2, + "gender_rate": 4, + "capture_rate": 75, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 1, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 207, + "conquest_order": "" + }, + { + "id": 179, + "identifier": "mareep", + "generation_id": 2, + "evolves_from_species_id": "", + "evolution_chain_id": 89, + "color_id": 9, + "shape_id": 8, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 235, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 208, + "conquest_order": 45 + }, + { + "id": 180, + "identifier": "flaaffy", + "generation_id": 2, + "evolves_from_species_id": 179, + "evolution_chain_id": 89, + "color_id": 6, + "shape_id": 6, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 120, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 209, + "conquest_order": 46 + }, + { + "id": 181, + "identifier": "ampharos", + "generation_id": 2, + "evolves_from_species_id": 180, + "evolution_chain_id": 89, + "color_id": 10, + "shape_id": 6, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 1, + "order": 210, + "conquest_order": 47 + }, + { + "id": 182, + "identifier": "bellossom", + "generation_id": 2, + "evolves_from_species_id": 44, + "evolution_chain_id": 18, + "color_id": 5, + "shape_id": 12, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 50, + "conquest_order": "" + }, + { + "id": 183, + "identifier": "marill", + "generation_id": 2, + "evolves_from_species_id": 298, + "evolution_chain_id": 90, + "color_id": 2, + "shape_id": 6, + "habitat_id": 9, + "gender_rate": 4, + "capture_rate": 190, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 10, + "has_gender_differences": 0, + "growth_rate_id": 3, + "forms_switchable": 0, + "order": 212, + "conquest_order": "" + }, + { + "id": 184, + "identifier": "azumarill", + "generation_id": 2, + "evolves_from_species_id": 183, + "evolution_chain_id": 90, + "color_id": 2, + "shape_id": 6, + "habitat_id": 9, + "gender_rate": 4, + "capture_rate": 75, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 10, + "has_gender_differences": 0, + "growth_rate_id": 3, + "forms_switchable": 0, + "order": 213, + "conquest_order": "" + }, + { + "id": 185, + "identifier": "sudowoodo", + "generation_id": 2, + "evolves_from_species_id": 438, + "evolution_chain_id": 91, + "color_id": 3, + "shape_id": 12, + "habitat_id": 2, + "gender_rate": 4, + "capture_rate": 65, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 1, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 215, + "conquest_order": "" + }, + { + "id": 186, + "identifier": "politoed", + "generation_id": 2, + "evolves_from_species_id": 61, + "evolution_chain_id": 26, + "color_id": 5, + "shape_id": 12, + "habitat_id": 9, + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 1, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 68, + "conquest_order": "" + }, + { + "id": 187, + "identifier": "hoppip", + "generation_id": 2, + "evolves_from_species_id": "", + "evolution_chain_id": 92, + "color_id": 6, + "shape_id": 6, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 255, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 216, + "conquest_order": "" + }, + { + "id": 188, + "identifier": "skiploom", + "generation_id": 2, + "evolves_from_species_id": 187, + "evolution_chain_id": 92, + "color_id": 5, + "shape_id": 6, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 120, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 217, + "conquest_order": "" + }, + { + "id": 189, + "identifier": "jumpluff", + "generation_id": 2, + "evolves_from_species_id": 188, + "evolution_chain_id": 92, + "color_id": 2, + "shape_id": 6, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 218, + "conquest_order": "" + }, + { + "id": 190, + "identifier": "aipom", + "generation_id": 2, + "evolves_from_species_id": "", + "evolution_chain_id": 93, + "color_id": 7, + "shape_id": 6, + "habitat_id": 2, + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 1, + "growth_rate_id": 3, + "forms_switchable": 0, + "order": 219, + "conquest_order": "" + }, + { + "id": 191, + "identifier": "sunkern", + "generation_id": 2, + "evolves_from_species_id": "", + "evolution_chain_id": 94, + "color_id": 10, + "shape_id": 1, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 235, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 221, + "conquest_order": "" + }, + { + "id": 192, + "identifier": "sunflora", + "generation_id": 2, + "evolves_from_species_id": 191, + "evolution_chain_id": 94, + "color_id": 10, + "shape_id": 12, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 120, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 222, + "conquest_order": "" + }, + { + "id": 193, + "identifier": "yanma", + "generation_id": 2, + "evolves_from_species_id": "", + "evolution_chain_id": 95, + "color_id": 8, + "shape_id": 13, + "habitat_id": 2, + "gender_rate": 4, + "capture_rate": 75, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 223, + "conquest_order": "" + }, + { + "id": 194, + "identifier": "wooper", + "generation_id": 2, + "evolves_from_species_id": "", + "evolution_chain_id": 96, + "color_id": 2, + "shape_id": 7, + "habitat_id": 9, + "gender_rate": 4, + "capture_rate": 255, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 1, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 225, + "conquest_order": 18 + }, + { + "id": 195, + "identifier": "quagsire", + "generation_id": 2, + "evolves_from_species_id": 194, + "evolution_chain_id": 96, + "color_id": 2, + "shape_id": 6, + "habitat_id": 9, + "gender_rate": 4, + "capture_rate": 90, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 1, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 226, + "conquest_order": 19 + }, + { + "id": 196, + "identifier": "espeon", + "generation_id": 2, + "evolves_from_species_id": 133, + "evolution_chain_id": 67, + "color_id": 7, + "shape_id": 8, + "habitat_id": 8, + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 35, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 161, + "conquest_order": 5 + }, + { + "id": 197, + "identifier": "umbreon", + "generation_id": 2, + "evolves_from_species_id": 133, + "evolution_chain_id": 67, + "color_id": 1, + "shape_id": 8, + "habitat_id": 8, + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 35, + "is_baby": 0, + "hatch_counter": 35, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 162, + "conquest_order": 6 + }, + { + "id": 198, + "identifier": "murkrow", + "generation_id": 2, + "evolves_from_species_id": "", + "evolution_chain_id": 97, + "color_id": 1, + "shape_id": 9, + "habitat_id": 2, + "gender_rate": 4, + "capture_rate": 30, + "base_happiness": 35, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 1, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 227, + "conquest_order": "" + }, + { + "id": 199, + "identifier": "slowking", + "generation_id": 2, + "evolves_from_species_id": 79, + "evolution_chain_id": 33, + "color_id": 6, + "shape_id": 6, + "habitat_id": 9, + "gender_rate": 4, + "capture_rate": 70, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 87, + "conquest_order": "" + }, + { + "id": 200, + "identifier": "misdreavus", + "generation_id": 2, + "evolves_from_species_id": "", + "evolution_chain_id": 98, + "color_id": 4, + "shape_id": 1, + "habitat_id": 1, + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 35, + "is_baby": 0, + "hatch_counter": 25, + "has_gender_differences": 0, + "growth_rate_id": 3, + "forms_switchable": 0, + "order": 229, + "conquest_order": 183 + }, + { + "id": 201, + "identifier": "unown", + "generation_id": 2, + "evolves_from_species_id": "", + "evolution_chain_id": 99, + "color_id": 1, + "shape_id": 1, + "habitat_id": 5, + "gender_rate": -1, + "capture_rate": 225, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 40, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 231, + "conquest_order": "" + }, + { + "id": 202, + "identifier": "wobbuffet", + "generation_id": 2, + "evolves_from_species_id": 360, + "evolution_chain_id": 100, + "color_id": 2, + "shape_id": 5, + "habitat_id": 1, + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 1, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 233, + "conquest_order": "" + }, + { + "id": 203, + "identifier": "girafarig", + "generation_id": 2, + "evolves_from_species_id": "", + "evolution_chain_id": 465, + "color_id": 10, + "shape_id": 8, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 60, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 1, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 234, + "conquest_order": "" + }, + { + "id": 204, + "identifier": "pineco", + "generation_id": 2, + "evolves_from_species_id": "", + "evolution_chain_id": 102, + "color_id": 4, + "shape_id": 1, + "habitat_id": 2, + "gender_rate": 4, + "capture_rate": 190, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 235, + "conquest_order": 56 + }, + { + "id": 205, + "identifier": "forretress", + "generation_id": 2, + "evolves_from_species_id": 204, + "evolution_chain_id": 102, + "color_id": 7, + "shape_id": 1, + "habitat_id": 2, + "gender_rate": 4, + "capture_rate": 75, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 236, + "conquest_order": 57 + }, + { + "id": 206, + "identifier": "dunsparce", + "generation_id": 2, + "evolves_from_species_id": "", + "evolution_chain_id": 3100, + "color_id": 10, + "shape_id": 2, + "habitat_id": 1, + "gender_rate": 4, + "capture_rate": 190, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 237, + "conquest_order": "" + }, + { + "id": 207, + "identifier": "gligar", + "generation_id": 2, + "evolves_from_species_id": "", + "evolution_chain_id": 104, + "color_id": 7, + "shape_id": 9, + "habitat_id": 4, + "gender_rate": 4, + "capture_rate": 60, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 1, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 238, + "conquest_order": "" + }, + { + "id": 208, + "identifier": "steelix", + "generation_id": 2, + "evolves_from_species_id": 95, + "evolution_chain_id": 41, + "color_id": 4, + "shape_id": 2, + "habitat_id": 1, + "gender_rate": 4, + "capture_rate": 25, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 25, + "has_gender_differences": 1, + "growth_rate_id": 2, + "forms_switchable": 1, + "order": 104, + "conquest_order": 176 + }, + { + "id": 209, + "identifier": "snubbull", + "generation_id": 2, + "evolves_from_species_id": "", + "evolution_chain_id": 105, + "color_id": 6, + "shape_id": 12, + "habitat_id": 8, + "gender_rate": 6, + "capture_rate": 190, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 3, + "forms_switchable": 0, + "order": 240, + "conquest_order": "" + }, + { + "id": 210, + "identifier": "granbull", + "generation_id": 2, + "evolves_from_species_id": 209, + "evolution_chain_id": 105, + "color_id": 7, + "shape_id": 6, + "habitat_id": 8, + "gender_rate": 6, + "capture_rate": 75, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 3, + "forms_switchable": 0, + "order": 241, + "conquest_order": "" + }, + { + "id": 211, + "identifier": "qwilfish", + "generation_id": 2, + "evolves_from_species_id": "", + "evolution_chain_id": 106, + "color_id": 4, + "shape_id": 3, + "habitat_id": 7, + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 242, + "conquest_order": "" + }, + { + "id": 212, + "identifier": "scizor", + "generation_id": 2, + "evolves_from_species_id": 123, + "evolution_chain_id": 58, + "color_id": 8, + "shape_id": 13, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 25, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 25, + "has_gender_differences": 1, + "growth_rate_id": 2, + "forms_switchable": 1, + "order": 142, + "conquest_order": 189 + }, + { + "id": 213, + "identifier": "shuckle", + "generation_id": 2, + "evolves_from_species_id": "", + "evolution_chain_id": 107, + "color_id": 10, + "shape_id": 14, + "habitat_id": 4, + "gender_rate": 4, + "capture_rate": 190, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 243, + "conquest_order": "" + }, + { + "id": 214, + "identifier": "heracross", + "generation_id": 2, + "evolves_from_species_id": "", + "evolution_chain_id": 108, + "color_id": 2, + "shape_id": 12, + "habitat_id": 2, + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 25, + "has_gender_differences": 1, + "growth_rate_id": 1, + "forms_switchable": 1, + "order": 244, + "conquest_order": "" + }, + { + "id": 215, + "identifier": "sneasel", + "generation_id": 2, + "evolves_from_species_id": "", + "evolution_chain_id": 109, + "color_id": 1, + "shape_id": 6, + "habitat_id": 2, + "gender_rate": 4, + "capture_rate": 60, + "base_happiness": 35, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 1, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 245, + "conquest_order": 181 + }, + { + "id": 216, + "identifier": "teddiursa", + "generation_id": 2, + "evolves_from_species_id": "", + "evolution_chain_id": 110, + "color_id": 3, + "shape_id": 6, + "habitat_id": 4, + "gender_rate": 4, + "capture_rate": 120, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 247, + "conquest_order": "" + }, + { + "id": 217, + "identifier": "ursaring", + "generation_id": 2, + "evolves_from_species_id": 216, + "evolution_chain_id": 110, + "color_id": 3, + "shape_id": 6, + "habitat_id": 4, + "gender_rate": 4, + "capture_rate": 60, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 1, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 248, + "conquest_order": "" + }, + { + "id": 218, + "identifier": "slugma", + "generation_id": 2, + "evolves_from_species_id": "", + "evolution_chain_id": 111, + "color_id": 8, + "shape_id": 2, + "habitat_id": 4, + "gender_rate": 4, + "capture_rate": 190, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 249, + "conquest_order": "" + }, + { + "id": 219, + "identifier": "magcargo", + "generation_id": 2, + "evolves_from_species_id": 218, + "evolution_chain_id": 111, + "color_id": 8, + "shape_id": 2, + "habitat_id": 4, + "gender_rate": 4, + "capture_rate": 75, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 250, + "conquest_order": "" + }, + { + "id": 220, + "identifier": "swinub", + "generation_id": 2, + "evolves_from_species_id": "", + "evolution_chain_id": 112, + "color_id": 3, + "shape_id": 8, + "habitat_id": 1, + "gender_rate": 4, + "capture_rate": 225, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 251, + "conquest_order": "" + }, + { + "id": 221, + "identifier": "piloswine", + "generation_id": 2, + "evolves_from_species_id": 220, + "evolution_chain_id": 112, + "color_id": 3, + "shape_id": 8, + "habitat_id": 1, + "gender_rate": 4, + "capture_rate": 75, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 1, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 252, + "conquest_order": "" + }, + { + "id": 222, + "identifier": "corsola", + "generation_id": 2, + "evolves_from_species_id": "", + "evolution_chain_id": 113, + "color_id": 6, + "shape_id": 14, + "habitat_id": 7, + "gender_rate": 6, + "capture_rate": 60, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 3, + "forms_switchable": 0, + "order": 254, + "conquest_order": "" + }, + { + "id": 223, + "identifier": "remoraid", + "generation_id": 2, + "evolves_from_species_id": "", + "evolution_chain_id": 114, + "color_id": 4, + "shape_id": 3, + "habitat_id": 7, + "gender_rate": 4, + "capture_rate": 190, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 255, + "conquest_order": "" + }, + { + "id": 224, + "identifier": "octillery", + "generation_id": 2, + "evolves_from_species_id": 223, + "evolution_chain_id": 114, + "color_id": 8, + "shape_id": 10, + "habitat_id": 7, + "gender_rate": 4, + "capture_rate": 75, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 1, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 256, + "conquest_order": "" + }, + { + "id": 225, + "identifier": "delibird", + "generation_id": 2, + "evolves_from_species_id": "", + "evolution_chain_id": 115, + "color_id": 8, + "shape_id": 9, + "habitat_id": 4, + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 3, + "forms_switchable": 0, + "order": 257, + "conquest_order": "" + }, + { + "id": 226, + "identifier": "mantine", + "generation_id": 2, + "evolves_from_species_id": 458, + "evolution_chain_id": 116, + "color_id": 7, + "shape_id": 9, + "habitat_id": 7, + "gender_rate": 4, + "capture_rate": 25, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 25, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 259, + "conquest_order": "" + }, + { + "id": 227, + "identifier": "skarmory", + "generation_id": 2, + "evolves_from_species_id": "", + "evolution_chain_id": 117, + "color_id": 4, + "shape_id": 9, + "habitat_id": 6, + "gender_rate": 4, + "capture_rate": 25, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 25, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 260, + "conquest_order": "" + }, + { + "id": 228, + "identifier": "houndour", + "generation_id": 2, + "evolves_from_species_id": "", + "evolution_chain_id": 118, + "color_id": 1, + "shape_id": 8, + "habitat_id": 6, + "gender_rate": 4, + "capture_rate": 120, + "base_happiness": 35, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 261, + "conquest_order": "" + }, + { + "id": 229, + "identifier": "houndoom", + "generation_id": 2, + "evolves_from_species_id": 228, + "evolution_chain_id": 118, + "color_id": 1, + "shape_id": 8, + "habitat_id": 6, + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 35, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 1, + "growth_rate_id": 1, + "forms_switchable": 1, + "order": 262, + "conquest_order": "" + }, + { + "id": 230, + "identifier": "kingdra", + "generation_id": 2, + "evolves_from_species_id": 117, + "evolution_chain_id": 54, + "color_id": 2, + "shape_id": 5, + "habitat_id": 7, + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 134, + "conquest_order": "" + }, + { + "id": 231, + "identifier": "phanpy", + "generation_id": 2, + "evolves_from_species_id": "", + "evolution_chain_id": 119, + "color_id": 2, + "shape_id": 8, + "habitat_id": 6, + "gender_rate": 4, + "capture_rate": 120, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 263, + "conquest_order": "" + }, + { + "id": 232, + "identifier": "donphan", + "generation_id": 2, + "evolves_from_species_id": 231, + "evolution_chain_id": 119, + "color_id": 4, + "shape_id": 8, + "habitat_id": 6, + "gender_rate": 4, + "capture_rate": 60, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 1, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 264, + "conquest_order": "" + }, + { + "id": 233, + "identifier": "porygon2", + "generation_id": 2, + "evolves_from_species_id": 137, + "evolution_chain_id": 68, + "color_id": 8, + "shape_id": 7, + "habitat_id": 8, + "gender_rate": -1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 167, + "conquest_order": "" + }, + { + "id": 234, + "identifier": "stantler", + "generation_id": 2, + "evolves_from_species_id": "", + "evolution_chain_id": 120, + "color_id": 3, + "shape_id": 8, + "habitat_id": 2, + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 265, + "conquest_order": "" + }, + { + "id": 235, + "identifier": "smeargle", + "generation_id": 2, + "evolves_from_species_id": "", + "evolution_chain_id": 121, + "color_id": 9, + "shape_id": 6, + "habitat_id": 8, + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 3, + "forms_switchable": 0, + "order": 266, + "conquest_order": "" + }, + { + "id": 236, + "identifier": "tyrogue", + "generation_id": 2, + "evolves_from_species_id": "", + "evolution_chain_id": 47, + "color_id": 7, + "shape_id": 12, + "habitat_id": 8, + "gender_rate": 0, + "capture_rate": 75, + "base_happiness": 70, + "is_baby": 1, + "hatch_counter": 25, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 115, + "conquest_order": "" + }, + { + "id": 237, + "identifier": "hitmontop", + "generation_id": 2, + "evolves_from_species_id": 236, + "evolution_chain_id": 47, + "color_id": 3, + "shape_id": 6, + "habitat_id": 8, + "gender_rate": 0, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 25, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 118, + "conquest_order": "" + }, + { + "id": 238, + "identifier": "smoochum", + "generation_id": 2, + "evolves_from_species_id": "", + "evolution_chain_id": 59, + "color_id": 6, + "shape_id": 12, + "habitat_id": 8, + "gender_rate": 8, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 1, + "hatch_counter": 25, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 143, + "conquest_order": "" + }, + { + "id": 239, + "identifier": "elekid", + "generation_id": 2, + "evolves_from_species_id": "", + "evolution_chain_id": 60, + "color_id": 10, + "shape_id": 12, + "habitat_id": 3, + "gender_rate": 2, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 1, + "hatch_counter": 25, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 145, + "conquest_order": "" + }, + { + "id": 240, + "identifier": "magby", + "generation_id": 2, + "evolves_from_species_id": "", + "evolution_chain_id": 61, + "color_id": 8, + "shape_id": 6, + "habitat_id": 4, + "gender_rate": 2, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 1, + "hatch_counter": 25, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 148, + "conquest_order": "" + }, + { + "id": 241, + "identifier": "miltank", + "generation_id": 2, + "evolves_from_species_id": "", + "evolution_chain_id": 122, + "color_id": 6, + "shape_id": 6, + "habitat_id": 3, + "gender_rate": 8, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 267, + "conquest_order": "" + }, + { + "id": 242, + "identifier": "blissey", + "generation_id": 2, + "evolves_from_species_id": 113, + "evolution_chain_id": 51, + "color_id": 6, + "shape_id": 12, + "habitat_id": 8, + "gender_rate": 8, + "capture_rate": 30, + "base_happiness": 140, + "is_baby": 0, + "hatch_counter": 40, + "has_gender_differences": 0, + "growth_rate_id": 3, + "forms_switchable": 0, + "order": 128, + "conquest_order": "" + }, + { + "id": 243, + "identifier": "raikou", + "generation_id": 2, + "evolves_from_species_id": "", + "evolution_chain_id": 123, + "color_id": 10, + "shape_id": 8, + "habitat_id": 3, + "gender_rate": -1, + "capture_rate": 3, + "base_happiness": 35, + "is_baby": 0, + "hatch_counter": 80, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 268, + "conquest_order": "" + }, + { + "id": 244, + "identifier": "entei", + "generation_id": 2, + "evolves_from_species_id": "", + "evolution_chain_id": 124, + "color_id": 3, + "shape_id": 8, + "habitat_id": 3, + "gender_rate": -1, + "capture_rate": 3, + "base_happiness": 35, + "is_baby": 0, + "hatch_counter": 80, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 269, + "conquest_order": "" + }, + { + "id": 245, + "identifier": "suicune", + "generation_id": 2, + "evolves_from_species_id": "", + "evolution_chain_id": 125, + "color_id": 2, + "shape_id": 8, + "habitat_id": 3, + "gender_rate": -1, + "capture_rate": 3, + "base_happiness": 35, + "is_baby": 0, + "hatch_counter": 80, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 270, + "conquest_order": "" + }, + { + "id": 246, + "identifier": "larvitar", + "generation_id": 2, + "evolves_from_species_id": "", + "evolution_chain_id": 126, + "color_id": 5, + "shape_id": 6, + "habitat_id": 4, + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 35, + "is_baby": 0, + "hatch_counter": 40, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 271, + "conquest_order": 79 + }, + { + "id": 247, + "identifier": "pupitar", + "generation_id": 2, + "evolves_from_species_id": 246, + "evolution_chain_id": 126, + "color_id": 4, + "shape_id": 2, + "habitat_id": 4, + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 35, + "is_baby": 0, + "hatch_counter": 40, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 272, + "conquest_order": 80 + }, + { + "id": 248, + "identifier": "tyranitar", + "generation_id": 2, + "evolves_from_species_id": 247, + "evolution_chain_id": 126, + "color_id": 5, + "shape_id": 6, + "habitat_id": 4, + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 35, + "is_baby": 0, + "hatch_counter": 40, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 1, + "order": 273, + "conquest_order": 81 + }, + { + "id": 249, + "identifier": "lugia", + "generation_id": 2, + "evolves_from_species_id": "", + "evolution_chain_id": 127, + "color_id": 9, + "shape_id": 9, + "habitat_id": 5, + "gender_rate": -1, + "capture_rate": 3, + "base_happiness": 0, + "is_baby": 0, + "hatch_counter": 120, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 274, + "conquest_order": "" + }, + { + "id": 250, + "identifier": "ho-oh", + "generation_id": 2, + "evolves_from_species_id": "", + "evolution_chain_id": 128, + "color_id": 8, + "shape_id": 9, + "habitat_id": 5, + "gender_rate": -1, + "capture_rate": 3, + "base_happiness": 0, + "is_baby": 0, + "hatch_counter": 120, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 275, + "conquest_order": "" + }, + { + "id": 251, + "identifier": "celebi", + "generation_id": 2, + "evolves_from_species_id": "", + "evolution_chain_id": 129, + "color_id": 5, + "shape_id": 12, + "habitat_id": 2, + "gender_rate": -1, + "capture_rate": 45, + "base_happiness": 100, + "is_baby": 0, + "hatch_counter": 120, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 276, + "conquest_order": "" + }, + { + "id": 252, + "identifier": "treecko", + "generation_id": 3, + "evolves_from_species_id": "", + "evolution_chain_id": 130, + "color_id": 5, + "shape_id": 6, + "habitat_id": 2, + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 277, + "conquest_order": 130 + }, + { + "id": 253, + "identifier": "grovyle", + "generation_id": 3, + "evolves_from_species_id": 252, + "evolution_chain_id": 130, + "color_id": 5, + "shape_id": 6, + "habitat_id": 2, + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 278, + "conquest_order": 131 + }, + { + "id": 254, + "identifier": "sceptile", + "generation_id": 3, + "evolves_from_species_id": 253, + "evolution_chain_id": 130, + "color_id": 5, + "shape_id": 6, + "habitat_id": 2, + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 1, + "order": 279, + "conquest_order": 132 + }, + { + "id": 255, + "identifier": "torchic", + "generation_id": 3, + "evolves_from_species_id": "", + "evolution_chain_id": 131, + "color_id": 8, + "shape_id": 7, + "habitat_id": 3, + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 1, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 280, + "conquest_order": "" + }, + { + "id": 256, + "identifier": "combusken", + "generation_id": 3, + "evolves_from_species_id": 255, + "evolution_chain_id": 131, + "color_id": 8, + "shape_id": 6, + "habitat_id": 3, + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 1, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 281, + "conquest_order": "" + }, + { + "id": 257, + "identifier": "blaziken", + "generation_id": 3, + "evolves_from_species_id": 256, + "evolution_chain_id": 131, + "color_id": 8, + "shape_id": 6, + "habitat_id": 3, + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 1, + "growth_rate_id": 4, + "forms_switchable": 1, + "order": 282, + "conquest_order": "" + }, + { + "id": 258, + "identifier": "mudkip", + "generation_id": 3, + "evolves_from_species_id": "", + "evolution_chain_id": 132, + "color_id": 2, + "shape_id": 8, + "habitat_id": 9, + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 283, + "conquest_order": "" + }, + { + "id": 259, + "identifier": "marshtomp", + "generation_id": 3, + "evolves_from_species_id": 258, + "evolution_chain_id": 132, + "color_id": 2, + "shape_id": 6, + "habitat_id": 9, + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 284, + "conquest_order": "" + }, + { + "id": 260, + "identifier": "swampert", + "generation_id": 3, + "evolves_from_species_id": 259, + "evolution_chain_id": 132, + "color_id": 2, + "shape_id": 6, + "habitat_id": 9, + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 1, + "order": 285, + "conquest_order": "" + }, + { + "id": 261, + "identifier": "poochyena", + "generation_id": 3, + "evolves_from_species_id": "", + "evolution_chain_id": 133, + "color_id": 4, + "shape_id": 8, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 255, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 286, + "conquest_order": "" + }, + { + "id": 262, + "identifier": "mightyena", + "generation_id": 3, + "evolves_from_species_id": 261, + "evolution_chain_id": 133, + "color_id": 4, + "shape_id": 8, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 127, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 287, + "conquest_order": "" + }, + { + "id": 263, + "identifier": "zigzagoon", + "generation_id": 3, + "evolves_from_species_id": "", + "evolution_chain_id": 134, + "color_id": 3, + "shape_id": 8, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 255, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 288, + "conquest_order": "" + }, + { + "id": 264, + "identifier": "linoone", + "generation_id": 3, + "evolves_from_species_id": 263, + "evolution_chain_id": 134, + "color_id": 9, + "shape_id": 8, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 90, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 289, + "conquest_order": "" + }, + { + "id": 265, + "identifier": "wurmple", + "generation_id": 3, + "evolves_from_species_id": "", + "evolution_chain_id": 135, + "color_id": 8, + "shape_id": 14, + "habitat_id": 2, + "gender_rate": 4, + "capture_rate": 255, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 290, + "conquest_order": "" + }, + { + "id": 266, + "identifier": "silcoon", + "generation_id": 3, + "evolves_from_species_id": 265, + "evolution_chain_id": 135, + "color_id": 9, + "shape_id": 1, + "habitat_id": 2, + "gender_rate": 4, + "capture_rate": 120, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 291, + "conquest_order": "" + }, + { + "id": 267, + "identifier": "beautifly", + "generation_id": 3, + "evolves_from_species_id": 266, + "evolution_chain_id": 135, + "color_id": 10, + "shape_id": 13, + "habitat_id": 2, + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 1, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 292, + "conquest_order": "" + }, + { + "id": 268, + "identifier": "cascoon", + "generation_id": 3, + "evolves_from_species_id": 265, + "evolution_chain_id": 135, + "color_id": 7, + "shape_id": 1, + "habitat_id": 2, + "gender_rate": 4, + "capture_rate": 120, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 293, + "conquest_order": "" + }, + { + "id": 269, + "identifier": "dustox", + "generation_id": 3, + "evolves_from_species_id": 268, + "evolution_chain_id": 135, + "color_id": 5, + "shape_id": 13, + "habitat_id": 2, + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 1, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 294, + "conquest_order": "" + }, + { + "id": 270, + "identifier": "lotad", + "generation_id": 3, + "evolves_from_species_id": "", + "evolution_chain_id": 136, + "color_id": 5, + "shape_id": 14, + "habitat_id": 9, + "gender_rate": 4, + "capture_rate": 255, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 295, + "conquest_order": "" + }, + { + "id": 271, + "identifier": "lombre", + "generation_id": 3, + "evolves_from_species_id": 270, + "evolution_chain_id": 136, + "color_id": 5, + "shape_id": 12, + "habitat_id": 9, + "gender_rate": 4, + "capture_rate": 120, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 296, + "conquest_order": "" + }, + { + "id": 272, + "identifier": "ludicolo", + "generation_id": 3, + "evolves_from_species_id": 271, + "evolution_chain_id": 136, + "color_id": 5, + "shape_id": 12, + "habitat_id": 9, + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 1, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 297, + "conquest_order": "" + }, + { + "id": 273, + "identifier": "seedot", + "generation_id": 3, + "evolves_from_species_id": "", + "evolution_chain_id": 137, + "color_id": 3, + "shape_id": 7, + "habitat_id": 2, + "gender_rate": 4, + "capture_rate": 255, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 298, + "conquest_order": "" + }, + { + "id": 274, + "identifier": "nuzleaf", + "generation_id": 3, + "evolves_from_species_id": 273, + "evolution_chain_id": 137, + "color_id": 3, + "shape_id": 12, + "habitat_id": 2, + "gender_rate": 4, + "capture_rate": 120, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 1, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 299, + "conquest_order": "" + }, + { + "id": 275, + "identifier": "shiftry", + "generation_id": 3, + "evolves_from_species_id": 274, + "evolution_chain_id": 137, + "color_id": 3, + "shape_id": 12, + "habitat_id": 2, + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 1, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 300, + "conquest_order": "" + }, + { + "id": 276, + "identifier": "taillow", + "generation_id": 3, + "evolves_from_species_id": "", + "evolution_chain_id": 138, + "color_id": 2, + "shape_id": 9, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 200, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 301, + "conquest_order": "" + }, + { + "id": 277, + "identifier": "swellow", + "generation_id": 3, + "evolves_from_species_id": 276, + "evolution_chain_id": 138, + "color_id": 2, + "shape_id": 9, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 302, + "conquest_order": "" + }, + { + "id": 278, + "identifier": "wingull", + "generation_id": 3, + "evolves_from_species_id": "", + "evolution_chain_id": 139, + "color_id": 9, + "shape_id": 9, + "habitat_id": 7, + "gender_rate": 4, + "capture_rate": 190, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 303, + "conquest_order": "" + }, + { + "id": 279, + "identifier": "pelipper", + "generation_id": 3, + "evolves_from_species_id": 278, + "evolution_chain_id": 139, + "color_id": 10, + "shape_id": 9, + "habitat_id": 7, + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 304, + "conquest_order": "" + }, + { + "id": 280, + "identifier": "ralts", + "generation_id": 3, + "evolves_from_species_id": "", + "evolution_chain_id": 140, + "color_id": 9, + "shape_id": 12, + "habitat_id": 8, + "gender_rate": 4, + "capture_rate": 235, + "base_happiness": 35, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 305, + "conquest_order": 9 + }, + { + "id": 281, + "identifier": "kirlia", + "generation_id": 3, + "evolves_from_species_id": 280, + "evolution_chain_id": 140, + "color_id": 9, + "shape_id": 12, + "habitat_id": 8, + "gender_rate": 4, + "capture_rate": 120, + "base_happiness": 35, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 306, + "conquest_order": 10 + }, + { + "id": 282, + "identifier": "gardevoir", + "generation_id": 3, + "evolves_from_species_id": 281, + "evolution_chain_id": 140, + "color_id": 9, + "shape_id": 12, + "habitat_id": 8, + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 35, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 1, + "order": 307, + "conquest_order": 11 + }, + { + "id": 283, + "identifier": "surskit", + "generation_id": 3, + "evolves_from_species_id": "", + "evolution_chain_id": 141, + "color_id": 2, + "shape_id": 14, + "habitat_id": 9, + "gender_rate": 4, + "capture_rate": 200, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 309, + "conquest_order": "" + }, + { + "id": 284, + "identifier": "masquerain", + "generation_id": 3, + "evolves_from_species_id": 283, + "evolution_chain_id": 141, + "color_id": 2, + "shape_id": 13, + "habitat_id": 9, + "gender_rate": 4, + "capture_rate": 75, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 310, + "conquest_order": "" + }, + { + "id": 285, + "identifier": "shroomish", + "generation_id": 3, + "evolves_from_species_id": "", + "evolution_chain_id": 142, + "color_id": 3, + "shape_id": 7, + "habitat_id": 2, + "gender_rate": 4, + "capture_rate": 255, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 6, + "forms_switchable": 0, + "order": 311, + "conquest_order": "" + }, + { + "id": 286, + "identifier": "breloom", + "generation_id": 3, + "evolves_from_species_id": 285, + "evolution_chain_id": 142, + "color_id": 5, + "shape_id": 6, + "habitat_id": 2, + "gender_rate": 4, + "capture_rate": 90, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 6, + "forms_switchable": 0, + "order": 312, + "conquest_order": "" + }, + { + "id": 287, + "identifier": "slakoth", + "generation_id": 3, + "evolves_from_species_id": "", + "evolution_chain_id": 143, + "color_id": 3, + "shape_id": 8, + "habitat_id": 2, + "gender_rate": 4, + "capture_rate": 255, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 313, + "conquest_order": "" + }, + { + "id": 288, + "identifier": "vigoroth", + "generation_id": 3, + "evolves_from_species_id": 287, + "evolution_chain_id": 143, + "color_id": 9, + "shape_id": 6, + "habitat_id": 2, + "gender_rate": 4, + "capture_rate": 120, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 314, + "conquest_order": "" + }, + { + "id": 289, + "identifier": "slaking", + "generation_id": 3, + "evolves_from_species_id": 288, + "evolution_chain_id": 143, + "color_id": 3, + "shape_id": 12, + "habitat_id": 2, + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 315, + "conquest_order": "" + }, + { + "id": 290, + "identifier": "nincada", + "generation_id": 3, + "evolves_from_species_id": "", + "evolution_chain_id": 144, + "color_id": 4, + "shape_id": 14, + "habitat_id": 2, + "gender_rate": 4, + "capture_rate": 255, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 5, + "forms_switchable": 0, + "order": 316, + "conquest_order": "" + }, + { + "id": 291, + "identifier": "ninjask", + "generation_id": 3, + "evolves_from_species_id": 290, + "evolution_chain_id": 144, + "color_id": 10, + "shape_id": 13, + "habitat_id": 2, + "gender_rate": 4, + "capture_rate": 120, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 5, + "forms_switchable": 0, + "order": 317, + "conquest_order": "" + }, + { + "id": 292, + "identifier": "shedinja", + "generation_id": 3, + "evolves_from_species_id": 290, + "evolution_chain_id": 144, + "color_id": 3, + "shape_id": 5, + "habitat_id": 2, + "gender_rate": -1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 5, + "forms_switchable": 0, + "order": 318, + "conquest_order": "" + }, + { + "id": 293, + "identifier": "whismur", + "generation_id": 3, + "evolves_from_species_id": "", + "evolution_chain_id": 145, + "color_id": 6, + "shape_id": 6, + "habitat_id": 1, + "gender_rate": 4, + "capture_rate": 190, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 319, + "conquest_order": "" + }, + { + "id": 294, + "identifier": "loudred", + "generation_id": 3, + "evolves_from_species_id": 293, + "evolution_chain_id": 145, + "color_id": 2, + "shape_id": 6, + "habitat_id": 1, + "gender_rate": 4, + "capture_rate": 120, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 320, + "conquest_order": "" + }, + { + "id": 295, + "identifier": "exploud", + "generation_id": 3, + "evolves_from_species_id": 294, + "evolution_chain_id": 145, + "color_id": 2, + "shape_id": 6, + "habitat_id": 1, + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 321, + "conquest_order": "" + }, + { + "id": 296, + "identifier": "makuhita", + "generation_id": 3, + "evolves_from_species_id": "", + "evolution_chain_id": 146, + "color_id": 10, + "shape_id": 12, + "habitat_id": 4, + "gender_rate": 2, + "capture_rate": 180, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 6, + "forms_switchable": 0, + "order": 322, + "conquest_order": "" + }, + { + "id": 297, + "identifier": "hariyama", + "generation_id": 3, + "evolves_from_species_id": 296, + "evolution_chain_id": 146, + "color_id": 3, + "shape_id": 12, + "habitat_id": 4, + "gender_rate": 2, + "capture_rate": 200, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 6, + "forms_switchable": 0, + "order": 323, + "conquest_order": "" + }, + { + "id": 298, + "identifier": "azurill", + "generation_id": 3, + "evolves_from_species_id": "", + "evolution_chain_id": 90, + "color_id": 2, + "shape_id": 7, + "habitat_id": 9, + "gender_rate": 6, + "capture_rate": 150, + "base_happiness": 70, + "is_baby": 1, + "hatch_counter": 10, + "has_gender_differences": 0, + "growth_rate_id": 3, + "forms_switchable": 0, + "order": 211, + "conquest_order": "" + }, + { + "id": 299, + "identifier": "nosepass", + "generation_id": 3, + "evolves_from_species_id": "", + "evolution_chain_id": 147, + "color_id": 4, + "shape_id": 12, + "habitat_id": 1, + "gender_rate": 4, + "capture_rate": 255, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 324, + "conquest_order": "" + }, + { + "id": 300, + "identifier": "skitty", + "generation_id": 3, + "evolves_from_species_id": "", + "evolution_chain_id": 148, + "color_id": 6, + "shape_id": 8, + "habitat_id": 2, + "gender_rate": 6, + "capture_rate": 255, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 3, + "forms_switchable": 0, + "order": 326, + "conquest_order": "" + }, + { + "id": 301, + "identifier": "delcatty", + "generation_id": 3, + "evolves_from_species_id": 300, + "evolution_chain_id": 148, + "color_id": 7, + "shape_id": 8, + "habitat_id": 2, + "gender_rate": 6, + "capture_rate": 60, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 3, + "forms_switchable": 0, + "order": 327, + "conquest_order": "" + }, + { + "id": 302, + "identifier": "sableye", + "generation_id": 3, + "evolves_from_species_id": "", + "evolution_chain_id": 149, + "color_id": 7, + "shape_id": 12, + "habitat_id": 1, + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 35, + "is_baby": 0, + "hatch_counter": 25, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 1, + "order": 328, + "conquest_order": "" + }, + { + "id": 303, + "identifier": "mawile", + "generation_id": 3, + "evolves_from_species_id": "", + "evolution_chain_id": 150, + "color_id": 1, + "shape_id": 12, + "habitat_id": 1, + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 3, + "forms_switchable": 1, + "order": 329, + "conquest_order": "" + }, + { + "id": 304, + "identifier": "aron", + "generation_id": 3, + "evolves_from_species_id": "", + "evolution_chain_id": 151, + "color_id": 4, + "shape_id": 8, + "habitat_id": 4, + "gender_rate": 4, + "capture_rate": 180, + "base_happiness": 35, + "is_baby": 0, + "hatch_counter": 35, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 330, + "conquest_order": 149 + }, + { + "id": 305, + "identifier": "lairon", + "generation_id": 3, + "evolves_from_species_id": 304, + "evolution_chain_id": 151, + "color_id": 4, + "shape_id": 8, + "habitat_id": 4, + "gender_rate": 4, + "capture_rate": 90, + "base_happiness": 35, + "is_baby": 0, + "hatch_counter": 35, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 331, + "conquest_order": 150 + }, + { + "id": 306, + "identifier": "aggron", + "generation_id": 3, + "evolves_from_species_id": 305, + "evolution_chain_id": 151, + "color_id": 4, + "shape_id": 6, + "habitat_id": 4, + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 35, + "is_baby": 0, + "hatch_counter": 35, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 1, + "order": 332, + "conquest_order": 151 + }, + { + "id": 307, + "identifier": "meditite", + "generation_id": 3, + "evolves_from_species_id": "", + "evolution_chain_id": 152, + "color_id": 2, + "shape_id": 12, + "habitat_id": 4, + "gender_rate": 4, + "capture_rate": 180, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 1, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 333, + "conquest_order": "" + }, + { + "id": 308, + "identifier": "medicham", + "generation_id": 3, + "evolves_from_species_id": 307, + "evolution_chain_id": 152, + "color_id": 8, + "shape_id": 12, + "habitat_id": 4, + "gender_rate": 4, + "capture_rate": 90, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 1, + "growth_rate_id": 2, + "forms_switchable": 1, + "order": 334, + "conquest_order": "" + }, + { + "id": 309, + "identifier": "electrike", + "generation_id": 3, + "evolves_from_species_id": "", + "evolution_chain_id": 153, + "color_id": 5, + "shape_id": 8, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 120, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 335, + "conquest_order": "" + }, + { + "id": 310, + "identifier": "manectric", + "generation_id": 3, + "evolves_from_species_id": 309, + "evolution_chain_id": 153, + "color_id": 10, + "shape_id": 8, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 1, + "order": 336, + "conquest_order": "" + }, + { + "id": 311, + "identifier": "plusle", + "generation_id": 3, + "evolves_from_species_id": "", + "evolution_chain_id": 154, + "color_id": 10, + "shape_id": 6, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 200, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 337, + "conquest_order": "" + }, + { + "id": 312, + "identifier": "minun", + "generation_id": 3, + "evolves_from_species_id": "", + "evolution_chain_id": 155, + "color_id": 10, + "shape_id": 6, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 200, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 338, + "conquest_order": "" + }, + { + "id": 313, + "identifier": "volbeat", + "generation_id": 3, + "evolves_from_species_id": "", + "evolution_chain_id": 156, + "color_id": 4, + "shape_id": 6, + "habitat_id": 2, + "gender_rate": 0, + "capture_rate": 150, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 5, + "forms_switchable": 0, + "order": 339, + "conquest_order": "" + }, + { + "id": 314, + "identifier": "illumise", + "generation_id": 3, + "evolves_from_species_id": "", + "evolution_chain_id": 157, + "color_id": 7, + "shape_id": 12, + "habitat_id": 2, + "gender_rate": 8, + "capture_rate": 150, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 6, + "forms_switchable": 0, + "order": 340, + "conquest_order": "" + }, + { + "id": 315, + "identifier": "roselia", + "generation_id": 3, + "evolves_from_species_id": 406, + "evolution_chain_id": 158, + "color_id": 5, + "shape_id": 12, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 150, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 1, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 342, + "conquest_order": "" + }, + { + "id": 316, + "identifier": "gulpin", + "generation_id": 3, + "evolves_from_species_id": "", + "evolution_chain_id": 159, + "color_id": 5, + "shape_id": 4, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 225, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 1, + "growth_rate_id": 6, + "forms_switchable": 0, + "order": 344, + "conquest_order": "" + }, + { + "id": 317, + "identifier": "swalot", + "generation_id": 3, + "evolves_from_species_id": 316, + "evolution_chain_id": 159, + "color_id": 7, + "shape_id": 4, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 75, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 1, + "growth_rate_id": 6, + "forms_switchable": 0, + "order": 345, + "conquest_order": "" + }, + { + "id": 318, + "identifier": "carvanha", + "generation_id": 3, + "evolves_from_species_id": "", + "evolution_chain_id": 160, + "color_id": 8, + "shape_id": 3, + "habitat_id": 7, + "gender_rate": 4, + "capture_rate": 225, + "base_happiness": 35, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 346, + "conquest_order": "" + }, + { + "id": 319, + "identifier": "sharpedo", + "generation_id": 3, + "evolves_from_species_id": 318, + "evolution_chain_id": 160, + "color_id": 2, + "shape_id": 3, + "habitat_id": 7, + "gender_rate": 4, + "capture_rate": 60, + "base_happiness": 35, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 1, + "order": 347, + "conquest_order": "" + }, + { + "id": 320, + "identifier": "wailmer", + "generation_id": 3, + "evolves_from_species_id": "", + "evolution_chain_id": 161, + "color_id": 2, + "shape_id": 3, + "habitat_id": 7, + "gender_rate": 4, + "capture_rate": 125, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 40, + "has_gender_differences": 0, + "growth_rate_id": 6, + "forms_switchable": 0, + "order": 348, + "conquest_order": "" + }, + { + "id": 321, + "identifier": "wailord", + "generation_id": 3, + "evolves_from_species_id": 320, + "evolution_chain_id": 161, + "color_id": 2, + "shape_id": 3, + "habitat_id": 7, + "gender_rate": 4, + "capture_rate": 60, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 40, + "has_gender_differences": 0, + "growth_rate_id": 6, + "forms_switchable": 0, + "order": 349, + "conquest_order": "" + }, + { + "id": 322, + "identifier": "numel", + "generation_id": 3, + "evolves_from_species_id": "", + "evolution_chain_id": 162, + "color_id": 10, + "shape_id": 8, + "habitat_id": 4, + "gender_rate": 4, + "capture_rate": 255, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 1, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 350, + "conquest_order": "" + }, + { + "id": 323, + "identifier": "camerupt", + "generation_id": 3, + "evolves_from_species_id": 322, + "evolution_chain_id": 162, + "color_id": 8, + "shape_id": 8, + "habitat_id": 4, + "gender_rate": 4, + "capture_rate": 150, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 1, + "growth_rate_id": 2, + "forms_switchable": 1, + "order": 351, + "conquest_order": "" + }, + { + "id": 324, + "identifier": "torkoal", + "generation_id": 3, + "evolves_from_species_id": "", + "evolution_chain_id": 163, + "color_id": 3, + "shape_id": 8, + "habitat_id": 4, + "gender_rate": 4, + "capture_rate": 90, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 352, + "conquest_order": "" + }, + { + "id": 325, + "identifier": "spoink", + "generation_id": 3, + "evolves_from_species_id": "", + "evolution_chain_id": 164, + "color_id": 1, + "shape_id": 4, + "habitat_id": 4, + "gender_rate": 4, + "capture_rate": 255, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 3, + "forms_switchable": 0, + "order": 353, + "conquest_order": "" + }, + { + "id": 326, + "identifier": "grumpig", + "generation_id": 3, + "evolves_from_species_id": 325, + "evolution_chain_id": 164, + "color_id": 7, + "shape_id": 6, + "habitat_id": 4, + "gender_rate": 4, + "capture_rate": 60, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 3, + "forms_switchable": 0, + "order": 354, + "conquest_order": "" + }, + { + "id": 327, + "identifier": "spinda", + "generation_id": 3, + "evolves_from_species_id": "", + "evolution_chain_id": 165, + "color_id": 3, + "shape_id": 6, + "habitat_id": 4, + "gender_rate": 4, + "capture_rate": 255, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 3, + "forms_switchable": 0, + "order": 355, + "conquest_order": "" + }, + { + "id": 328, + "identifier": "trapinch", + "generation_id": 3, + "evolves_from_species_id": "", + "evolution_chain_id": 166, + "color_id": 3, + "shape_id": 14, + "habitat_id": 6, + "gender_rate": 4, + "capture_rate": 255, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 356, + "conquest_order": "" + }, + { + "id": 329, + "identifier": "vibrava", + "generation_id": 3, + "evolves_from_species_id": 328, + "evolution_chain_id": 166, + "color_id": 5, + "shape_id": 13, + "habitat_id": 6, + "gender_rate": 4, + "capture_rate": 120, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 357, + "conquest_order": "" + }, + { + "id": 330, + "identifier": "flygon", + "generation_id": 3, + "evolves_from_species_id": 329, + "evolution_chain_id": 166, + "color_id": 5, + "shape_id": 9, + "habitat_id": 6, + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 358, + "conquest_order": "" + }, + { + "id": 331, + "identifier": "cacnea", + "generation_id": 3, + "evolves_from_species_id": "", + "evolution_chain_id": 167, + "color_id": 5, + "shape_id": 12, + "habitat_id": 6, + "gender_rate": 4, + "capture_rate": 190, + "base_happiness": 35, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 359, + "conquest_order": "" + }, + { + "id": 332, + "identifier": "cacturne", + "generation_id": 3, + "evolves_from_species_id": 331, + "evolution_chain_id": 167, + "color_id": 5, + "shape_id": 12, + "habitat_id": 6, + "gender_rate": 4, + "capture_rate": 60, + "base_happiness": 35, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 1, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 360, + "conquest_order": "" + }, + { + "id": 333, + "identifier": "swablu", + "generation_id": 3, + "evolves_from_species_id": "", + "evolution_chain_id": 168, + "color_id": 2, + "shape_id": 9, + "habitat_id": 2, + "gender_rate": 4, + "capture_rate": 255, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 5, + "forms_switchable": 0, + "order": 361, + "conquest_order": "" + }, + { + "id": 334, + "identifier": "altaria", + "generation_id": 3, + "evolves_from_species_id": 333, + "evolution_chain_id": 168, + "color_id": 2, + "shape_id": 9, + "habitat_id": 2, + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 5, + "forms_switchable": 1, + "order": 362, + "conquest_order": "" + }, + { + "id": 335, + "identifier": "zangoose", + "generation_id": 3, + "evolves_from_species_id": "", + "evolution_chain_id": 169, + "color_id": 9, + "shape_id": 6, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 90, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 5, + "forms_switchable": 0, + "order": 363, + "conquest_order": "" + }, + { + "id": 336, + "identifier": "seviper", + "generation_id": 3, + "evolves_from_species_id": "", + "evolution_chain_id": 170, + "color_id": 1, + "shape_id": 2, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 90, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 6, + "forms_switchable": 0, + "order": 364, + "conquest_order": "" + }, + { + "id": 337, + "identifier": "lunatone", + "generation_id": 3, + "evolves_from_species_id": "", + "evolution_chain_id": 171, + "color_id": 10, + "shape_id": 1, + "habitat_id": 1, + "gender_rate": -1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 25, + "has_gender_differences": 0, + "growth_rate_id": 3, + "forms_switchable": 0, + "order": 365, + "conquest_order": "" + }, + { + "id": 338, + "identifier": "solrock", + "generation_id": 3, + "evolves_from_species_id": "", + "evolution_chain_id": 172, + "color_id": 8, + "shape_id": 1, + "habitat_id": 1, + "gender_rate": -1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 25, + "has_gender_differences": 0, + "growth_rate_id": 3, + "forms_switchable": 0, + "order": 366, + "conquest_order": "" + }, + { + "id": 339, + "identifier": "barboach", + "generation_id": 3, + "evolves_from_species_id": "", + "evolution_chain_id": 173, + "color_id": 4, + "shape_id": 3, + "habitat_id": 9, + "gender_rate": 4, + "capture_rate": 190, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 367, + "conquest_order": "" + }, + { + "id": 340, + "identifier": "whiscash", + "generation_id": 3, + "evolves_from_species_id": 339, + "evolution_chain_id": 173, + "color_id": 2, + "shape_id": 3, + "habitat_id": 9, + "gender_rate": 4, + "capture_rate": 75, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 368, + "conquest_order": "" + }, + { + "id": 341, + "identifier": "corphish", + "generation_id": 3, + "evolves_from_species_id": "", + "evolution_chain_id": 174, + "color_id": 8, + "shape_id": 14, + "habitat_id": 9, + "gender_rate": 4, + "capture_rate": 205, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 6, + "forms_switchable": 0, + "order": 369, + "conquest_order": "" + }, + { + "id": 342, + "identifier": "crawdaunt", + "generation_id": 3, + "evolves_from_species_id": 341, + "evolution_chain_id": 174, + "color_id": 8, + "shape_id": 14, + "habitat_id": 9, + "gender_rate": 4, + "capture_rate": 155, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 6, + "forms_switchable": 0, + "order": 370, + "conquest_order": "" + }, + { + "id": 343, + "identifier": "baltoy", + "generation_id": 3, + "evolves_from_species_id": "", + "evolution_chain_id": 175, + "color_id": 3, + "shape_id": 4, + "habitat_id": 6, + "gender_rate": -1, + "capture_rate": 255, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 371, + "conquest_order": "" + }, + { + "id": 344, + "identifier": "claydol", + "generation_id": 3, + "evolves_from_species_id": 343, + "evolution_chain_id": 175, + "color_id": 1, + "shape_id": 4, + "habitat_id": 6, + "gender_rate": -1, + "capture_rate": 90, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 372, + "conquest_order": "" + }, + { + "id": 345, + "identifier": "lileep", + "generation_id": 3, + "evolves_from_species_id": "", + "evolution_chain_id": 176, + "color_id": 7, + "shape_id": 5, + "habitat_id": 7, + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 30, + "has_gender_differences": 0, + "growth_rate_id": 5, + "forms_switchable": 0, + "order": 373, + "conquest_order": "" + }, + { + "id": 346, + "identifier": "cradily", + "generation_id": 3, + "evolves_from_species_id": 345, + "evolution_chain_id": 176, + "color_id": 5, + "shape_id": 5, + "habitat_id": 7, + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 30, + "has_gender_differences": 0, + "growth_rate_id": 5, + "forms_switchable": 0, + "order": 374, + "conquest_order": "" + }, + { + "id": 347, + "identifier": "anorith", + "generation_id": 3, + "evolves_from_species_id": "", + "evolution_chain_id": 177, + "color_id": 4, + "shape_id": 14, + "habitat_id": 9, + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 30, + "has_gender_differences": 0, + "growth_rate_id": 5, + "forms_switchable": 0, + "order": 375, + "conquest_order": 171 + }, + { + "id": 348, + "identifier": "armaldo", + "generation_id": 3, + "evolves_from_species_id": 347, + "evolution_chain_id": 177, + "color_id": 4, + "shape_id": 6, + "habitat_id": 9, + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 30, + "has_gender_differences": 0, + "growth_rate_id": 5, + "forms_switchable": 0, + "order": 376, + "conquest_order": 172 + }, + { + "id": 349, + "identifier": "feebas", + "generation_id": 3, + "evolves_from_species_id": "", + "evolution_chain_id": 178, + "color_id": 3, + "shape_id": 3, + "habitat_id": 9, + "gender_rate": 4, + "capture_rate": 255, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 5, + "forms_switchable": 0, + "order": 377, + "conquest_order": "" + }, + { + "id": 350, + "identifier": "milotic", + "generation_id": 3, + "evolves_from_species_id": 349, + "evolution_chain_id": 178, + "color_id": 6, + "shape_id": 2, + "habitat_id": 9, + "gender_rate": 4, + "capture_rate": 60, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 1, + "growth_rate_id": 5, + "forms_switchable": 0, + "order": 378, + "conquest_order": "" + }, + { + "id": 351, + "identifier": "castform", + "generation_id": 3, + "evolves_from_species_id": "", + "evolution_chain_id": 179, + "color_id": 4, + "shape_id": 1, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 25, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 1, + "order": 379, + "conquest_order": "" + }, + { + "id": 352, + "identifier": "kecleon", + "generation_id": 3, + "evolves_from_species_id": "", + "evolution_chain_id": 180, + "color_id": 5, + "shape_id": 6, + "habitat_id": 2, + "gender_rate": 4, + "capture_rate": 200, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 380, + "conquest_order": "" + }, + { + "id": 353, + "identifier": "shuppet", + "generation_id": 3, + "evolves_from_species_id": "", + "evolution_chain_id": 181, + "color_id": 1, + "shape_id": 1, + "habitat_id": 8, + "gender_rate": 4, + "capture_rate": 225, + "base_happiness": 35, + "is_baby": 0, + "hatch_counter": 25, + "has_gender_differences": 0, + "growth_rate_id": 3, + "forms_switchable": 0, + "order": 381, + "conquest_order": "" + }, + { + "id": 354, + "identifier": "banette", + "generation_id": 3, + "evolves_from_species_id": 353, + "evolution_chain_id": 181, + "color_id": 1, + "shape_id": 6, + "habitat_id": 8, + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 35, + "is_baby": 0, + "hatch_counter": 25, + "has_gender_differences": 0, + "growth_rate_id": 3, + "forms_switchable": 1, + "order": 382, + "conquest_order": "" + }, + { + "id": 355, + "identifier": "duskull", + "generation_id": 3, + "evolves_from_species_id": "", + "evolution_chain_id": 182, + "color_id": 1, + "shape_id": 4, + "habitat_id": 2, + "gender_rate": 4, + "capture_rate": 190, + "base_happiness": 35, + "is_baby": 0, + "hatch_counter": 25, + "has_gender_differences": 0, + "growth_rate_id": 3, + "forms_switchable": 0, + "order": 383, + "conquest_order": 69 + }, + { + "id": 356, + "identifier": "dusclops", + "generation_id": 3, + "evolves_from_species_id": 355, + "evolution_chain_id": 182, + "color_id": 1, + "shape_id": 12, + "habitat_id": 2, + "gender_rate": 4, + "capture_rate": 90, + "base_happiness": 35, + "is_baby": 0, + "hatch_counter": 25, + "has_gender_differences": 0, + "growth_rate_id": 3, + "forms_switchable": 0, + "order": 384, + "conquest_order": 70 + }, + { + "id": 357, + "identifier": "tropius", + "generation_id": 3, + "evolves_from_species_id": "", + "evolution_chain_id": 183, + "color_id": 5, + "shape_id": 8, + "habitat_id": 2, + "gender_rate": 4, + "capture_rate": 200, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 25, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 386, + "conquest_order": "" + }, + { + "id": 358, + "identifier": "chimecho", + "generation_id": 3, + "evolves_from_species_id": 433, + "evolution_chain_id": 184, + "color_id": 2, + "shape_id": 4, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 25, + "has_gender_differences": 0, + "growth_rate_id": 3, + "forms_switchable": 0, + "order": 388, + "conquest_order": 53 + }, + { + "id": 359, + "identifier": "absol", + "generation_id": 3, + "evolves_from_species_id": "", + "evolution_chain_id": 185, + "color_id": 9, + "shape_id": 8, + "habitat_id": 4, + "gender_rate": 4, + "capture_rate": 30, + "base_happiness": 35, + "is_baby": 0, + "hatch_counter": 25, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 1, + "order": 389, + "conquest_order": "" + }, + { + "id": 360, + "identifier": "wynaut", + "generation_id": 3, + "evolves_from_species_id": "", + "evolution_chain_id": 100, + "color_id": 2, + "shape_id": 6, + "habitat_id": 1, + "gender_rate": 4, + "capture_rate": 125, + "base_happiness": 70, + "is_baby": 1, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 232, + "conquest_order": "" + }, + { + "id": 361, + "identifier": "snorunt", + "generation_id": 3, + "evolves_from_species_id": "", + "evolution_chain_id": 186, + "color_id": 4, + "shape_id": 12, + "habitat_id": 1, + "gender_rate": 4, + "capture_rate": 190, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 390, + "conquest_order": 93 + }, + { + "id": 362, + "identifier": "glalie", + "generation_id": 3, + "evolves_from_species_id": 361, + "evolution_chain_id": 186, + "color_id": 4, + "shape_id": 1, + "habitat_id": 1, + "gender_rate": 4, + "capture_rate": 75, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 1, + "order": 391, + "conquest_order": 94 + }, + { + "id": 363, + "identifier": "spheal", + "generation_id": 3, + "evolves_from_species_id": "", + "evolution_chain_id": 187, + "color_id": 2, + "shape_id": 3, + "habitat_id": 7, + "gender_rate": 4, + "capture_rate": 255, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 393, + "conquest_order": 60 + }, + { + "id": 364, + "identifier": "sealeo", + "generation_id": 3, + "evolves_from_species_id": 363, + "evolution_chain_id": 187, + "color_id": 2, + "shape_id": 3, + "habitat_id": 7, + "gender_rate": 4, + "capture_rate": 120, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 394, + "conquest_order": 61 + }, + { + "id": 365, + "identifier": "walrein", + "generation_id": 3, + "evolves_from_species_id": 364, + "evolution_chain_id": 187, + "color_id": 2, + "shape_id": 8, + "habitat_id": 7, + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 395, + "conquest_order": 62 + }, + { + "id": 366, + "identifier": "clamperl", + "generation_id": 3, + "evolves_from_species_id": "", + "evolution_chain_id": 188, + "color_id": 2, + "shape_id": 1, + "habitat_id": 7, + "gender_rate": 4, + "capture_rate": 255, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 5, + "forms_switchable": 0, + "order": 396, + "conquest_order": "" + }, + { + "id": 367, + "identifier": "huntail", + "generation_id": 3, + "evolves_from_species_id": 366, + "evolution_chain_id": 188, + "color_id": 2, + "shape_id": 2, + "habitat_id": 7, + "gender_rate": 4, + "capture_rate": 60, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 5, + "forms_switchable": 0, + "order": 397, + "conquest_order": "" + }, + { + "id": 368, + "identifier": "gorebyss", + "generation_id": 3, + "evolves_from_species_id": 366, + "evolution_chain_id": 188, + "color_id": 6, + "shape_id": 2, + "habitat_id": 7, + "gender_rate": 4, + "capture_rate": 60, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 5, + "forms_switchable": 0, + "order": 398, + "conquest_order": "" + }, + { + "id": 369, + "identifier": "relicanth", + "generation_id": 3, + "evolves_from_species_id": "", + "evolution_chain_id": 189, + "color_id": 4, + "shape_id": 3, + "habitat_id": 7, + "gender_rate": 1, + "capture_rate": 25, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 40, + "has_gender_differences": 1, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 399, + "conquest_order": "" + }, + { + "id": 370, + "identifier": "luvdisc", + "generation_id": 3, + "evolves_from_species_id": "", + "evolution_chain_id": 190, + "color_id": 6, + "shape_id": 3, + "habitat_id": 7, + "gender_rate": 6, + "capture_rate": 225, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 3, + "forms_switchable": 0, + "order": 400, + "conquest_order": "" + }, + { + "id": 371, + "identifier": "bagon", + "generation_id": 3, + "evolves_from_species_id": "", + "evolution_chain_id": 191, + "color_id": 2, + "shape_id": 12, + "habitat_id": 6, + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 35, + "is_baby": 0, + "hatch_counter": 40, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 401, + "conquest_order": "" + }, + { + "id": 372, + "identifier": "shelgon", + "generation_id": 3, + "evolves_from_species_id": 371, + "evolution_chain_id": 191, + "color_id": 9, + "shape_id": 8, + "habitat_id": 6, + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 35, + "is_baby": 0, + "hatch_counter": 40, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 402, + "conquest_order": "" + }, + { + "id": 373, + "identifier": "salamence", + "generation_id": 3, + "evolves_from_species_id": 372, + "evolution_chain_id": 191, + "color_id": 2, + "shape_id": 8, + "habitat_id": 6, + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 35, + "is_baby": 0, + "hatch_counter": 40, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 1, + "order": 403, + "conquest_order": "" + }, + { + "id": 374, + "identifier": "beldum", + "generation_id": 3, + "evolves_from_species_id": "", + "evolution_chain_id": 192, + "color_id": 2, + "shape_id": 5, + "habitat_id": 6, + "gender_rate": -1, + "capture_rate": 3, + "base_happiness": 35, + "is_baby": 0, + "hatch_counter": 40, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 404, + "conquest_order": 82 + }, + { + "id": 375, + "identifier": "metang", + "generation_id": 3, + "evolves_from_species_id": 374, + "evolution_chain_id": 192, + "color_id": 2, + "shape_id": 4, + "habitat_id": 6, + "gender_rate": -1, + "capture_rate": 3, + "base_happiness": 35, + "is_baby": 0, + "hatch_counter": 40, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 405, + "conquest_order": 83 + }, + { + "id": 376, + "identifier": "metagross", + "generation_id": 3, + "evolves_from_species_id": 375, + "evolution_chain_id": 192, + "color_id": 2, + "shape_id": 11, + "habitat_id": 6, + "gender_rate": -1, + "capture_rate": 3, + "base_happiness": 35, + "is_baby": 0, + "hatch_counter": 40, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 1, + "order": 406, + "conquest_order": 84 + }, + { + "id": 377, + "identifier": "regirock", + "generation_id": 3, + "evolves_from_species_id": "", + "evolution_chain_id": 193, + "color_id": 3, + "shape_id": 12, + "habitat_id": 1, + "gender_rate": -1, + "capture_rate": 3, + "base_happiness": 35, + "is_baby": 0, + "hatch_counter": 80, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 407, + "conquest_order": "" + }, + { + "id": 378, + "identifier": "regice", + "generation_id": 3, + "evolves_from_species_id": "", + "evolution_chain_id": 194, + "color_id": 2, + "shape_id": 12, + "habitat_id": 1, + "gender_rate": -1, + "capture_rate": 3, + "base_happiness": 35, + "is_baby": 0, + "hatch_counter": 80, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 408, + "conquest_order": "" + }, + { + "id": 379, + "identifier": "registeel", + "generation_id": 3, + "evolves_from_species_id": "", + "evolution_chain_id": 195, + "color_id": 4, + "shape_id": 12, + "habitat_id": 1, + "gender_rate": -1, + "capture_rate": 3, + "base_happiness": 35, + "is_baby": 0, + "hatch_counter": 80, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 409, + "conquest_order": 193 + }, + { + "id": 380, + "identifier": "latias", + "generation_id": 3, + "evolves_from_species_id": "", + "evolution_chain_id": 196, + "color_id": 8, + "shape_id": 9, + "habitat_id": 9, + "gender_rate": 8, + "capture_rate": 3, + "base_happiness": 90, + "is_baby": 0, + "hatch_counter": 120, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 1, + "order": 410, + "conquest_order": "" + }, + { + "id": 381, + "identifier": "latios", + "generation_id": 3, + "evolves_from_species_id": "", + "evolution_chain_id": 197, + "color_id": 2, + "shape_id": 9, + "habitat_id": 9, + "gender_rate": 0, + "capture_rate": 3, + "base_happiness": 90, + "is_baby": 0, + "hatch_counter": 120, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 1, + "order": 411, + "conquest_order": "" + }, + { + "id": 382, + "identifier": "kyogre", + "generation_id": 3, + "evolves_from_species_id": "", + "evolution_chain_id": 198, + "color_id": 2, + "shape_id": 3, + "habitat_id": 7, + "gender_rate": -1, + "capture_rate": 3, + "base_happiness": 0, + "is_baby": 0, + "hatch_counter": 120, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 1, + "order": 412, + "conquest_order": "" + }, + { + "id": 383, + "identifier": "groudon", + "generation_id": 3, + "evolves_from_species_id": "", + "evolution_chain_id": 199, + "color_id": 8, + "shape_id": 6, + "habitat_id": 6, + "gender_rate": -1, + "capture_rate": 3, + "base_happiness": 0, + "is_baby": 0, + "hatch_counter": 120, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 1, + "order": 413, + "conquest_order": 194 + }, + { + "id": 384, + "identifier": "rayquaza", + "generation_id": 3, + "evolves_from_species_id": "", + "evolution_chain_id": 200, + "color_id": 5, + "shape_id": 2, + "habitat_id": 5, + "gender_rate": -1, + "capture_rate": 45, + "base_happiness": 0, + "is_baby": 0, + "hatch_counter": 120, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 1, + "order": 414, + "conquest_order": 200 + }, + { + "id": 385, + "identifier": "jirachi", + "generation_id": 3, + "evolves_from_species_id": "", + "evolution_chain_id": 201, + "color_id": 10, + "shape_id": 12, + "habitat_id": 4, + "gender_rate": -1, + "capture_rate": 3, + "base_happiness": 100, + "is_baby": 0, + "hatch_counter": 120, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 415, + "conquest_order": "" + }, + { + "id": 386, + "identifier": "deoxys", + "generation_id": 3, + "evolves_from_species_id": "", + "evolution_chain_id": 202, + "color_id": 8, + "shape_id": 12, + "habitat_id": 5, + "gender_rate": -1, + "capture_rate": 3, + "base_happiness": 0, + "is_baby": 0, + "hatch_counter": 120, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 1, + "order": 416, + "conquest_order": "" + }, + { + "id": 387, + "identifier": "turtwig", + "generation_id": 4, + "evolves_from_species_id": "", + "evolution_chain_id": 203, + "color_id": 5, + "shape_id": 8, + "habitat_id": "", + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 417, + "conquest_order": "" + }, + { + "id": 388, + "identifier": "grotle", + "generation_id": 4, + "evolves_from_species_id": 387, + "evolution_chain_id": 203, + "color_id": 5, + "shape_id": 8, + "habitat_id": "", + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 418, + "conquest_order": "" + }, + { + "id": 389, + "identifier": "torterra", + "generation_id": 4, + "evolves_from_species_id": 388, + "evolution_chain_id": 203, + "color_id": 5, + "shape_id": 8, + "habitat_id": "", + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 419, + "conquest_order": "" + }, + { + "id": 390, + "identifier": "chimchar", + "generation_id": 4, + "evolves_from_species_id": "", + "evolution_chain_id": 204, + "color_id": 3, + "shape_id": 6, + "habitat_id": "", + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 420, + "conquest_order": 115 + }, + { + "id": 391, + "identifier": "monferno", + "generation_id": 4, + "evolves_from_species_id": 390, + "evolution_chain_id": 204, + "color_id": 3, + "shape_id": 6, + "habitat_id": "", + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 421, + "conquest_order": 116 + }, + { + "id": 392, + "identifier": "infernape", + "generation_id": 4, + "evolves_from_species_id": 391, + "evolution_chain_id": 204, + "color_id": 3, + "shape_id": 6, + "habitat_id": "", + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 422, + "conquest_order": 117 + }, + { + "id": 393, + "identifier": "piplup", + "generation_id": 4, + "evolves_from_species_id": "", + "evolution_chain_id": 205, + "color_id": 2, + "shape_id": 12, + "habitat_id": "", + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 423, + "conquest_order": 133 + }, + { + "id": 394, + "identifier": "prinplup", + "generation_id": 4, + "evolves_from_species_id": 393, + "evolution_chain_id": 205, + "color_id": 2, + "shape_id": 6, + "habitat_id": "", + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 424, + "conquest_order": 134 + }, + { + "id": 395, + "identifier": "empoleon", + "generation_id": 4, + "evolves_from_species_id": 394, + "evolution_chain_id": 205, + "color_id": 2, + "shape_id": 6, + "habitat_id": "", + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 425, + "conquest_order": 135 + }, + { + "id": 396, + "identifier": "starly", + "generation_id": 4, + "evolves_from_species_id": "", + "evolution_chain_id": 206, + "color_id": 3, + "shape_id": 9, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 255, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 1, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 426, + "conquest_order": 26 + }, + { + "id": 397, + "identifier": "staravia", + "generation_id": 4, + "evolves_from_species_id": 396, + "evolution_chain_id": 206, + "color_id": 3, + "shape_id": 9, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 120, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 1, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 427, + "conquest_order": 27 + }, + { + "id": 398, + "identifier": "staraptor", + "generation_id": 4, + "evolves_from_species_id": 397, + "evolution_chain_id": 206, + "color_id": 3, + "shape_id": 9, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 1, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 428, + "conquest_order": 28 + }, + { + "id": 399, + "identifier": "bidoof", + "generation_id": 4, + "evolves_from_species_id": "", + "evolution_chain_id": 207, + "color_id": 3, + "shape_id": 8, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 255, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 1, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 429, + "conquest_order": 29 + }, + { + "id": 400, + "identifier": "bibarel", + "generation_id": 4, + "evolves_from_species_id": 399, + "evolution_chain_id": 207, + "color_id": 3, + "shape_id": 6, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 127, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 1, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 430, + "conquest_order": 30 + }, + { + "id": 401, + "identifier": "kricketot", + "generation_id": 4, + "evolves_from_species_id": "", + "evolution_chain_id": 208, + "color_id": 8, + "shape_id": 12, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 255, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 1, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 431, + "conquest_order": "" + }, + { + "id": 402, + "identifier": "kricketune", + "generation_id": 4, + "evolves_from_species_id": 401, + "evolution_chain_id": 208, + "color_id": 8, + "shape_id": 13, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 1, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 432, + "conquest_order": "" + }, + { + "id": 403, + "identifier": "shinx", + "generation_id": 4, + "evolves_from_species_id": "", + "evolution_chain_id": 209, + "color_id": 2, + "shape_id": 8, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 235, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 1, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 433, + "conquest_order": 34 + }, + { + "id": 404, + "identifier": "luxio", + "generation_id": 4, + "evolves_from_species_id": 403, + "evolution_chain_id": 209, + "color_id": 2, + "shape_id": 8, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 120, + "base_happiness": 100, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 1, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 434, + "conquest_order": 35 + }, + { + "id": 405, + "identifier": "luxray", + "generation_id": 4, + "evolves_from_species_id": 404, + "evolution_chain_id": 209, + "color_id": 2, + "shape_id": 8, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 1, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 435, + "conquest_order": 36 + }, + { + "id": 406, + "identifier": "budew", + "generation_id": 4, + "evolves_from_species_id": "", + "evolution_chain_id": 158, + "color_id": 5, + "shape_id": 12, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 255, + "base_happiness": 70, + "is_baby": 1, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 341, + "conquest_order": "" + }, + { + "id": 407, + "identifier": "roserade", + "generation_id": 4, + "evolves_from_species_id": 315, + "evolution_chain_id": 158, + "color_id": 5, + "shape_id": 12, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 75, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 1, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 343, + "conquest_order": "" + }, + { + "id": 408, + "identifier": "cranidos", + "generation_id": 4, + "evolves_from_species_id": "", + "evolution_chain_id": 211, + "color_id": 2, + "shape_id": 6, + "habitat_id": "", + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 30, + "has_gender_differences": 0, + "growth_rate_id": 5, + "forms_switchable": 0, + "order": 436, + "conquest_order": "" + }, + { + "id": 409, + "identifier": "rampardos", + "generation_id": 4, + "evolves_from_species_id": 408, + "evolution_chain_id": 211, + "color_id": 2, + "shape_id": 6, + "habitat_id": "", + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 30, + "has_gender_differences": 0, + "growth_rate_id": 5, + "forms_switchable": 0, + "order": 437, + "conquest_order": "" + }, + { + "id": 410, + "identifier": "shieldon", + "generation_id": 4, + "evolves_from_species_id": "", + "evolution_chain_id": 212, + "color_id": 4, + "shape_id": 8, + "habitat_id": "", + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 30, + "has_gender_differences": 0, + "growth_rate_id": 5, + "forms_switchable": 0, + "order": 438, + "conquest_order": 163 + }, + { + "id": 411, + "identifier": "bastiodon", + "generation_id": 4, + "evolves_from_species_id": 410, + "evolution_chain_id": 212, + "color_id": 4, + "shape_id": 8, + "habitat_id": "", + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 30, + "has_gender_differences": 0, + "growth_rate_id": 5, + "forms_switchable": 0, + "order": 439, + "conquest_order": 164 + }, + { + "id": 412, + "identifier": "burmy", + "generation_id": 4, + "evolves_from_species_id": "", + "evolution_chain_id": 213, + "color_id": 5, + "shape_id": 5, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 120, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 1, + "order": 440, + "conquest_order": "" + }, + { + "id": 413, + "identifier": "wormadam", + "generation_id": 4, + "evolves_from_species_id": 412, + "evolution_chain_id": 213, + "color_id": 5, + "shape_id": 5, + "habitat_id": "", + "gender_rate": 8, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 441, + "conquest_order": "" + }, + { + "id": 414, + "identifier": "mothim", + "generation_id": 4, + "evolves_from_species_id": 412, + "evolution_chain_id": 213, + "color_id": 10, + "shape_id": 13, + "habitat_id": "", + "gender_rate": 0, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 442, + "conquest_order": "" + }, + { + "id": 415, + "identifier": "combee", + "generation_id": 4, + "evolves_from_species_id": "", + "evolution_chain_id": 214, + "color_id": 10, + "shape_id": 11, + "habitat_id": "", + "gender_rate": 1, + "capture_rate": 120, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 1, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 443, + "conquest_order": "" + }, + { + "id": 416, + "identifier": "vespiquen", + "generation_id": 4, + "evolves_from_species_id": 415, + "evolution_chain_id": 214, + "color_id": 10, + "shape_id": 13, + "habitat_id": "", + "gender_rate": 8, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 444, + "conquest_order": "" + }, + { + "id": 417, + "identifier": "pachirisu", + "generation_id": 4, + "evolves_from_species_id": "", + "evolution_chain_id": 215, + "color_id": 9, + "shape_id": 8, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 200, + "base_happiness": 100, + "is_baby": 0, + "hatch_counter": 10, + "has_gender_differences": 1, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 445, + "conquest_order": "" + }, + { + "id": 418, + "identifier": "buizel", + "generation_id": 4, + "evolves_from_species_id": "", + "evolution_chain_id": 216, + "color_id": 3, + "shape_id": 8, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 190, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 1, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 446, + "conquest_order": "" + }, + { + "id": 419, + "identifier": "floatzel", + "generation_id": 4, + "evolves_from_species_id": 418, + "evolution_chain_id": 216, + "color_id": 3, + "shape_id": 8, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 75, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 1, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 447, + "conquest_order": "" + }, + { + "id": 420, + "identifier": "cherubi", + "generation_id": 4, + "evolves_from_species_id": "", + "evolution_chain_id": 217, + "color_id": 6, + "shape_id": 11, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 190, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 448, + "conquest_order": "" + }, + { + "id": 421, + "identifier": "cherrim", + "generation_id": 4, + "evolves_from_species_id": 420, + "evolution_chain_id": 217, + "color_id": 7, + "shape_id": 7, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 75, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 1, + "order": 449, + "conquest_order": "" + }, + { + "id": 422, + "identifier": "shellos", + "generation_id": 4, + "evolves_from_species_id": "", + "evolution_chain_id": 218, + "color_id": 7, + "shape_id": 2, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 190, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 450, + "conquest_order": "" + }, + { + "id": 423, + "identifier": "gastrodon", + "generation_id": 4, + "evolves_from_species_id": 422, + "evolution_chain_id": 218, + "color_id": 7, + "shape_id": 2, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 75, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 451, + "conquest_order": "" + }, + { + "id": 424, + "identifier": "ambipom", + "generation_id": 4, + "evolves_from_species_id": 190, + "evolution_chain_id": 93, + "color_id": 7, + "shape_id": 6, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 100, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 1, + "growth_rate_id": 3, + "forms_switchable": 0, + "order": 220, + "conquest_order": "" + }, + { + "id": 425, + "identifier": "drifloon", + "generation_id": 4, + "evolves_from_species_id": "", + "evolution_chain_id": 219, + "color_id": 7, + "shape_id": 4, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 125, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 30, + "has_gender_differences": 0, + "growth_rate_id": 6, + "forms_switchable": 0, + "order": 452, + "conquest_order": 167 + }, + { + "id": 426, + "identifier": "drifblim", + "generation_id": 4, + "evolves_from_species_id": 425, + "evolution_chain_id": 219, + "color_id": 7, + "shape_id": 4, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 60, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 30, + "has_gender_differences": 0, + "growth_rate_id": 6, + "forms_switchable": 0, + "order": 453, + "conquest_order": 168 + }, + { + "id": 427, + "identifier": "buneary", + "generation_id": 4, + "evolves_from_species_id": "", + "evolution_chain_id": 220, + "color_id": 3, + "shape_id": 6, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 190, + "base_happiness": 0, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 454, + "conquest_order": "" + }, + { + "id": 428, + "identifier": "lopunny", + "generation_id": 4, + "evolves_from_species_id": 427, + "evolution_chain_id": 220, + "color_id": 3, + "shape_id": 6, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 60, + "base_happiness": 140, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 1, + "order": 455, + "conquest_order": "" + }, + { + "id": 429, + "identifier": "mismagius", + "generation_id": 4, + "evolves_from_species_id": 200, + "evolution_chain_id": 98, + "color_id": 7, + "shape_id": 1, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 35, + "is_baby": 0, + "hatch_counter": 25, + "has_gender_differences": 0, + "growth_rate_id": 3, + "forms_switchable": 0, + "order": 230, + "conquest_order": 184 + }, + { + "id": 430, + "identifier": "honchkrow", + "generation_id": 4, + "evolves_from_species_id": 198, + "evolution_chain_id": 97, + "color_id": 1, + "shape_id": 9, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 30, + "base_happiness": 35, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 228, + "conquest_order": "" + }, + { + "id": 431, + "identifier": "glameow", + "generation_id": 4, + "evolves_from_species_id": "", + "evolution_chain_id": 221, + "color_id": 4, + "shape_id": 8, + "habitat_id": "", + "gender_rate": 6, + "capture_rate": 190, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 3, + "forms_switchable": 0, + "order": 456, + "conquest_order": "" + }, + { + "id": 432, + "identifier": "purugly", + "generation_id": 4, + "evolves_from_species_id": 431, + "evolution_chain_id": 221, + "color_id": 4, + "shape_id": 8, + "habitat_id": "", + "gender_rate": 6, + "capture_rate": 75, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 3, + "forms_switchable": 0, + "order": 457, + "conquest_order": "" + }, + { + "id": 433, + "identifier": "chingling", + "generation_id": 4, + "evolves_from_species_id": "", + "evolution_chain_id": 184, + "color_id": 10, + "shape_id": 12, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 120, + "base_happiness": 70, + "is_baby": 1, + "hatch_counter": 25, + "has_gender_differences": 0, + "growth_rate_id": 3, + "forms_switchable": 0, + "order": 387, + "conquest_order": 52 + }, + { + "id": 434, + "identifier": "stunky", + "generation_id": 4, + "evolves_from_species_id": "", + "evolution_chain_id": 223, + "color_id": 7, + "shape_id": 8, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 225, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 458, + "conquest_order": "" + }, + { + "id": 435, + "identifier": "skuntank", + "generation_id": 4, + "evolves_from_species_id": 434, + "evolution_chain_id": 223, + "color_id": 7, + "shape_id": 8, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 60, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 459, + "conquest_order": "" + }, + { + "id": 436, + "identifier": "bronzor", + "generation_id": 4, + "evolves_from_species_id": "", + "evolution_chain_id": 224, + "color_id": 5, + "shape_id": 1, + "habitat_id": "", + "gender_rate": -1, + "capture_rate": 255, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 460, + "conquest_order": "" + }, + { + "id": 437, + "identifier": "bronzong", + "generation_id": 4, + "evolves_from_species_id": 436, + "evolution_chain_id": 224, + "color_id": 5, + "shape_id": 4, + "habitat_id": "", + "gender_rate": -1, + "capture_rate": 90, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 461, + "conquest_order": "" + }, + { + "id": 438, + "identifier": "bonsly", + "generation_id": 4, + "evolves_from_species_id": "", + "evolution_chain_id": 91, + "color_id": 3, + "shape_id": 7, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 255, + "base_happiness": 70, + "is_baby": 1, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 214, + "conquest_order": "" + }, + { + "id": 439, + "identifier": "mime-jr", + "generation_id": 4, + "evolves_from_species_id": "", + "evolution_chain_id": 57, + "color_id": 6, + "shape_id": 12, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 145, + "base_happiness": 70, + "is_baby": 1, + "hatch_counter": 25, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 139, + "conquest_order": "" + }, + { + "id": 440, + "identifier": "happiny", + "generation_id": 4, + "evolves_from_species_id": "", + "evolution_chain_id": 51, + "color_id": 6, + "shape_id": 12, + "habitat_id": "", + "gender_rate": 8, + "capture_rate": 130, + "base_happiness": 140, + "is_baby": 1, + "hatch_counter": 40, + "has_gender_differences": 0, + "growth_rate_id": 3, + "forms_switchable": 0, + "order": 126, + "conquest_order": "" + }, + { + "id": 441, + "identifier": "chatot", + "generation_id": 4, + "evolves_from_species_id": "", + "evolution_chain_id": 228, + "color_id": 1, + "shape_id": 9, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 30, + "base_happiness": 35, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 462, + "conquest_order": "" + }, + { + "id": 442, + "identifier": "spiritomb", + "generation_id": 4, + "evolves_from_species_id": "", + "evolution_chain_id": 229, + "color_id": 7, + "shape_id": 5, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 100, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 30, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 463, + "conquest_order": 187 + }, + { + "id": 443, + "identifier": "gible", + "generation_id": 4, + "evolves_from_species_id": "", + "evolution_chain_id": 230, + "color_id": 2, + "shape_id": 6, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 40, + "has_gender_differences": 1, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 464, + "conquest_order": 85 + }, + { + "id": 444, + "identifier": "gabite", + "generation_id": 4, + "evolves_from_species_id": 443, + "evolution_chain_id": 230, + "color_id": 2, + "shape_id": 6, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 40, + "has_gender_differences": 1, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 465, + "conquest_order": 86 + }, + { + "id": 445, + "identifier": "garchomp", + "generation_id": 4, + "evolves_from_species_id": 444, + "evolution_chain_id": 230, + "color_id": 2, + "shape_id": 6, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 40, + "has_gender_differences": 1, + "growth_rate_id": 1, + "forms_switchable": 1, + "order": 466, + "conquest_order": 87 + }, + { + "id": 446, + "identifier": "munchlax", + "generation_id": 4, + "evolves_from_species_id": "", + "evolution_chain_id": 72, + "color_id": 1, + "shape_id": 12, + "habitat_id": "", + "gender_rate": 1, + "capture_rate": 50, + "base_happiness": 70, + "is_baby": 1, + "hatch_counter": 40, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 174, + "conquest_order": 178 + }, + { + "id": 447, + "identifier": "riolu", + "generation_id": 4, + "evolves_from_species_id": "", + "evolution_chain_id": 232, + "color_id": 2, + "shape_id": 6, + "habitat_id": "", + "gender_rate": 1, + "capture_rate": 75, + "base_happiness": 70, + "is_baby": 1, + "hatch_counter": 25, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 467, + "conquest_order": 50 + }, + { + "id": 448, + "identifier": "lucario", + "generation_id": 4, + "evolves_from_species_id": 447, + "evolution_chain_id": 232, + "color_id": 2, + "shape_id": 6, + "habitat_id": "", + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 25, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 1, + "order": 468, + "conquest_order": 51 + }, + { + "id": 449, + "identifier": "hippopotas", + "generation_id": 4, + "evolves_from_species_id": "", + "evolution_chain_id": 233, + "color_id": 3, + "shape_id": 8, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 140, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 30, + "has_gender_differences": 1, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 469, + "conquest_order": "" + }, + { + "id": 450, + "identifier": "hippowdon", + "generation_id": 4, + "evolves_from_species_id": 449, + "evolution_chain_id": 233, + "color_id": 3, + "shape_id": 8, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 60, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 30, + "has_gender_differences": 1, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 470, + "conquest_order": "" + }, + { + "id": 451, + "identifier": "skorupi", + "generation_id": 4, + "evolves_from_species_id": "", + "evolution_chain_id": 234, + "color_id": 7, + "shape_id": 14, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 120, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 471, + "conquest_order": 156 + }, + { + "id": 452, + "identifier": "drapion", + "generation_id": 4, + "evolves_from_species_id": 451, + "evolution_chain_id": 234, + "color_id": 7, + "shape_id": 14, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 472, + "conquest_order": 157 + }, + { + "id": 453, + "identifier": "croagunk", + "generation_id": 4, + "evolves_from_species_id": "", + "evolution_chain_id": 235, + "color_id": 2, + "shape_id": 12, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 140, + "base_happiness": 100, + "is_baby": 0, + "hatch_counter": 10, + "has_gender_differences": 1, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 473, + "conquest_order": 88 + }, + { + "id": 454, + "identifier": "toxicroak", + "generation_id": 4, + "evolves_from_species_id": 453, + "evolution_chain_id": 235, + "color_id": 2, + "shape_id": 12, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 75, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 1, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 474, + "conquest_order": 89 + }, + { + "id": 455, + "identifier": "carnivine", + "generation_id": 4, + "evolves_from_species_id": "", + "evolution_chain_id": 236, + "color_id": 5, + "shape_id": 10, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 200, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 25, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 475, + "conquest_order": 186 + }, + { + "id": 456, + "identifier": "finneon", + "generation_id": 4, + "evolves_from_species_id": "", + "evolution_chain_id": 237, + "color_id": 2, + "shape_id": 3, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 190, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 1, + "growth_rate_id": 5, + "forms_switchable": 0, + "order": 476, + "conquest_order": "" + }, + { + "id": 457, + "identifier": "lumineon", + "generation_id": 4, + "evolves_from_species_id": 456, + "evolution_chain_id": 237, + "color_id": 2, + "shape_id": 3, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 75, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 1, + "growth_rate_id": 5, + "forms_switchable": 0, + "order": 477, + "conquest_order": "" + }, + { + "id": 458, + "identifier": "mantyke", + "generation_id": 4, + "evolves_from_species_id": "", + "evolution_chain_id": 116, + "color_id": 2, + "shape_id": 9, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 25, + "base_happiness": 70, + "is_baby": 1, + "hatch_counter": 25, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 258, + "conquest_order": "" + }, + { + "id": 459, + "identifier": "snover", + "generation_id": 4, + "evolves_from_species_id": "", + "evolution_chain_id": 239, + "color_id": 9, + "shape_id": 6, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 120, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 1, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 478, + "conquest_order": "" + }, + { + "id": 460, + "identifier": "abomasnow", + "generation_id": 4, + "evolves_from_species_id": 459, + "evolution_chain_id": 239, + "color_id": 9, + "shape_id": 6, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 60, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 1, + "growth_rate_id": 1, + "forms_switchable": 1, + "order": 479, + "conquest_order": "" + }, + { + "id": 461, + "identifier": "weavile", + "generation_id": 4, + "evolves_from_species_id": 215, + "evolution_chain_id": 109, + "color_id": 1, + "shape_id": 6, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 35, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 1, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 246, + "conquest_order": 182 + }, + { + "id": 462, + "identifier": "magnezone", + "generation_id": 4, + "evolves_from_species_id": 82, + "evolution_chain_id": 34, + "color_id": 4, + "shape_id": 4, + "habitat_id": "", + "gender_rate": -1, + "capture_rate": 30, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 90, + "conquest_order": "" + }, + { + "id": 463, + "identifier": "lickilicky", + "generation_id": 4, + "evolves_from_species_id": 108, + "evolution_chain_id": 48, + "color_id": 6, + "shape_id": 12, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 30, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 120, + "conquest_order": "" + }, + { + "id": 464, + "identifier": "rhyperior", + "generation_id": 4, + "evolves_from_species_id": 112, + "evolution_chain_id": 50, + "color_id": 4, + "shape_id": 6, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 30, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 1, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 125, + "conquest_order": 162 + }, + { + "id": 465, + "identifier": "tangrowth", + "generation_id": 4, + "evolves_from_species_id": 114, + "evolution_chain_id": 52, + "color_id": 2, + "shape_id": 12, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 30, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 1, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 130, + "conquest_order": "" + }, + { + "id": 466, + "identifier": "electivire", + "generation_id": 4, + "evolves_from_species_id": 125, + "evolution_chain_id": 60, + "color_id": 10, + "shape_id": 6, + "habitat_id": "", + "gender_rate": 2, + "capture_rate": 30, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 25, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 147, + "conquest_order": "" + }, + { + "id": 467, + "identifier": "magmortar", + "generation_id": 4, + "evolves_from_species_id": 126, + "evolution_chain_id": 61, + "color_id": 8, + "shape_id": 6, + "habitat_id": "", + "gender_rate": 2, + "capture_rate": 30, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 25, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 150, + "conquest_order": "" + }, + { + "id": 468, + "identifier": "togekiss", + "generation_id": 4, + "evolves_from_species_id": 176, + "evolution_chain_id": 87, + "color_id": 9, + "shape_id": 9, + "habitat_id": "", + "gender_rate": 1, + "capture_rate": 30, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 10, + "has_gender_differences": 0, + "growth_rate_id": 3, + "forms_switchable": 0, + "order": 205, + "conquest_order": "" + }, + { + "id": 469, + "identifier": "yanmega", + "generation_id": 4, + "evolves_from_species_id": 193, + "evolution_chain_id": 95, + "color_id": 5, + "shape_id": 13, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 30, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 224, + "conquest_order": "" + }, + { + "id": 470, + "identifier": "leafeon", + "generation_id": 4, + "evolves_from_species_id": 133, + "evolution_chain_id": 67, + "color_id": 5, + "shape_id": 8, + "habitat_id": "", + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 35, + "is_baby": 0, + "hatch_counter": 35, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 163, + "conquest_order": 7 + }, + { + "id": 471, + "identifier": "glaceon", + "generation_id": 4, + "evolves_from_species_id": 133, + "evolution_chain_id": 67, + "color_id": 2, + "shape_id": 8, + "habitat_id": "", + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 35, + "is_baby": 0, + "hatch_counter": 35, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 164, + "conquest_order": 8 + }, + { + "id": 472, + "identifier": "gliscor", + "generation_id": 4, + "evolves_from_species_id": 207, + "evolution_chain_id": 104, + "color_id": 7, + "shape_id": 9, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 30, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 239, + "conquest_order": "" + }, + { + "id": 473, + "identifier": "mamoswine", + "generation_id": 4, + "evolves_from_species_id": 221, + "evolution_chain_id": 112, + "color_id": 3, + "shape_id": 8, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 50, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 1, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 253, + "conquest_order": "" + }, + { + "id": 474, + "identifier": "porygon-z", + "generation_id": 4, + "evolves_from_species_id": 233, + "evolution_chain_id": 68, + "color_id": 8, + "shape_id": 4, + "habitat_id": "", + "gender_rate": -1, + "capture_rate": 30, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 168, + "conquest_order": "" + }, + { + "id": 475, + "identifier": "gallade", + "generation_id": 4, + "evolves_from_species_id": 281, + "evolution_chain_id": 140, + "color_id": 9, + "shape_id": 12, + "habitat_id": "", + "gender_rate": 0, + "capture_rate": 45, + "base_happiness": 35, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 1, + "order": 308, + "conquest_order": 12 + }, + { + "id": 476, + "identifier": "probopass", + "generation_id": 4, + "evolves_from_species_id": 299, + "evolution_chain_id": 147, + "color_id": 4, + "shape_id": 11, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 60, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 325, + "conquest_order": "" + }, + { + "id": 477, + "identifier": "dusknoir", + "generation_id": 4, + "evolves_from_species_id": 356, + "evolution_chain_id": 182, + "color_id": 1, + "shape_id": 4, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 35, + "is_baby": 0, + "hatch_counter": 25, + "has_gender_differences": 0, + "growth_rate_id": 3, + "forms_switchable": 0, + "order": 385, + "conquest_order": 71 + }, + { + "id": 478, + "identifier": "froslass", + "generation_id": 4, + "evolves_from_species_id": 361, + "evolution_chain_id": 186, + "color_id": 9, + "shape_id": 4, + "habitat_id": "", + "gender_rate": 8, + "capture_rate": 75, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 392, + "conquest_order": 95 + }, + { + "id": 479, + "identifier": "rotom", + "generation_id": 4, + "evolves_from_species_id": "", + "evolution_chain_id": 240, + "color_id": 8, + "shape_id": 1, + "habitat_id": "", + "gender_rate": -1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 1, + "order": 480, + "conquest_order": "" + }, + { + "id": 480, + "identifier": "uxie", + "generation_id": 4, + "evolves_from_species_id": "", + "evolution_chain_id": 241, + "color_id": 10, + "shape_id": 6, + "habitat_id": "", + "gender_rate": -1, + "capture_rate": 3, + "base_happiness": 140, + "is_baby": 0, + "hatch_counter": 80, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 481, + "conquest_order": "" + }, + { + "id": 481, + "identifier": "mesprit", + "generation_id": 4, + "evolves_from_species_id": "", + "evolution_chain_id": 242, + "color_id": 6, + "shape_id": 6, + "habitat_id": "", + "gender_rate": -1, + "capture_rate": 3, + "base_happiness": 140, + "is_baby": 0, + "hatch_counter": 80, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 482, + "conquest_order": "" + }, + { + "id": 482, + "identifier": "azelf", + "generation_id": 4, + "evolves_from_species_id": "", + "evolution_chain_id": 243, + "color_id": 2, + "shape_id": 6, + "habitat_id": "", + "gender_rate": -1, + "capture_rate": 3, + "base_happiness": 140, + "is_baby": 0, + "hatch_counter": 80, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 483, + "conquest_order": "" + }, + { + "id": 483, + "identifier": "dialga", + "generation_id": 4, + "evolves_from_species_id": "", + "evolution_chain_id": 244, + "color_id": 9, + "shape_id": 8, + "habitat_id": "", + "gender_rate": -1, + "capture_rate": 3, + "base_happiness": 0, + "is_baby": 0, + "hatch_counter": 120, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 484, + "conquest_order": 195 + }, + { + "id": 484, + "identifier": "palkia", + "generation_id": 4, + "evolves_from_species_id": "", + "evolution_chain_id": 245, + "color_id": 7, + "shape_id": 6, + "habitat_id": "", + "gender_rate": -1, + "capture_rate": 3, + "base_happiness": 0, + "is_baby": 0, + "hatch_counter": 120, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 485, + "conquest_order": "" + }, + { + "id": 485, + "identifier": "heatran", + "generation_id": 4, + "evolves_from_species_id": "", + "evolution_chain_id": 246, + "color_id": 3, + "shape_id": 8, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 3, + "base_happiness": 100, + "is_baby": 0, + "hatch_counter": 10, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 486, + "conquest_order": "" + }, + { + "id": 486, + "identifier": "regigigas", + "generation_id": 4, + "evolves_from_species_id": "", + "evolution_chain_id": 247, + "color_id": 9, + "shape_id": 12, + "habitat_id": "", + "gender_rate": -1, + "capture_rate": 3, + "base_happiness": 0, + "is_baby": 0, + "hatch_counter": 120, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 487, + "conquest_order": "" + }, + { + "id": 487, + "identifier": "giratina", + "generation_id": 4, + "evolves_from_species_id": "", + "evolution_chain_id": 248, + "color_id": 1, + "shape_id": 10, + "habitat_id": "", + "gender_rate": -1, + "capture_rate": 3, + "base_happiness": 0, + "is_baby": 0, + "hatch_counter": 120, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 1, + "order": 488, + "conquest_order": "" + }, + { + "id": 488, + "identifier": "cresselia", + "generation_id": 4, + "evolves_from_species_id": "", + "evolution_chain_id": 249, + "color_id": 10, + "shape_id": 2, + "habitat_id": "", + "gender_rate": 8, + "capture_rate": 3, + "base_happiness": 100, + "is_baby": 0, + "hatch_counter": 120, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 489, + "conquest_order": "" + }, + { + "id": 489, + "identifier": "phione", + "generation_id": 4, + "evolves_from_species_id": "", + "evolution_chain_id": 250, + "color_id": 2, + "shape_id": 4, + "habitat_id": "", + "gender_rate": -1, + "capture_rate": 30, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 40, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 490, + "conquest_order": "" + }, + { + "id": 490, + "identifier": "manaphy", + "generation_id": 4, + "evolves_from_species_id": "", + "evolution_chain_id": 250, + "color_id": 2, + "shape_id": 12, + "habitat_id": "", + "gender_rate": -1, + "capture_rate": 3, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 10, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 491, + "conquest_order": "" + }, + { + "id": 491, + "identifier": "darkrai", + "generation_id": 4, + "evolves_from_species_id": "", + "evolution_chain_id": 252, + "color_id": 1, + "shape_id": 12, + "habitat_id": "", + "gender_rate": -1, + "capture_rate": 3, + "base_happiness": 0, + "is_baby": 0, + "hatch_counter": 120, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 492, + "conquest_order": "" + }, + { + "id": 492, + "identifier": "shaymin", + "generation_id": 4, + "evolves_from_species_id": "", + "evolution_chain_id": 253, + "color_id": 5, + "shape_id": 8, + "habitat_id": "", + "gender_rate": -1, + "capture_rate": 45, + "base_happiness": 100, + "is_baby": 0, + "hatch_counter": 120, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 1, + "order": 493, + "conquest_order": "" + }, + { + "id": 493, + "identifier": "arceus", + "generation_id": 4, + "evolves_from_species_id": "", + "evolution_chain_id": 254, + "color_id": 9, + "shape_id": 8, + "habitat_id": "", + "gender_rate": -1, + "capture_rate": 3, + "base_happiness": 0, + "is_baby": 0, + "hatch_counter": 120, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 1, + "order": 494, + "conquest_order": 199 + }, + { + "id": 494, + "identifier": "victini", + "generation_id": 5, + "evolves_from_species_id": "", + "evolution_chain_id": 255, + "color_id": 10, + "shape_id": 12, + "habitat_id": "", + "gender_rate": -1, + "capture_rate": 3, + "base_happiness": 100, + "is_baby": 0, + "hatch_counter": 120, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 495, + "conquest_order": "" + }, + { + "id": 495, + "identifier": "snivy", + "generation_id": 5, + "evolves_from_species_id": "", + "evolution_chain_id": 256, + "color_id": 5, + "shape_id": 6, + "habitat_id": "", + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 496, + "conquest_order": 118 + }, + { + "id": 496, + "identifier": "servine", + "generation_id": 5, + "evolves_from_species_id": 495, + "evolution_chain_id": 256, + "color_id": 5, + "shape_id": 6, + "habitat_id": "", + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 497, + "conquest_order": 119 + }, + { + "id": 497, + "identifier": "serperior", + "generation_id": 5, + "evolves_from_species_id": 496, + "evolution_chain_id": 256, + "color_id": 5, + "shape_id": 2, + "habitat_id": "", + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 498, + "conquest_order": 120 + }, + { + "id": 498, + "identifier": "tepig", + "generation_id": 5, + "evolves_from_species_id": "", + "evolution_chain_id": 257, + "color_id": 8, + "shape_id": 8, + "habitat_id": "", + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 499, + "conquest_order": 121 + }, + { + "id": 499, + "identifier": "pignite", + "generation_id": 5, + "evolves_from_species_id": 498, + "evolution_chain_id": 257, + "color_id": 8, + "shape_id": 6, + "habitat_id": "", + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 500, + "conquest_order": 122 + }, + { + "id": 500, + "identifier": "emboar", + "generation_id": 5, + "evolves_from_species_id": 499, + "evolution_chain_id": 257, + "color_id": 8, + "shape_id": 6, + "habitat_id": "", + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 501, + "conquest_order": 123 + }, + { + "id": 501, + "identifier": "oshawott", + "generation_id": 5, + "evolves_from_species_id": "", + "evolution_chain_id": 258, + "color_id": 2, + "shape_id": 6, + "habitat_id": "", + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 502, + "conquest_order": 106 + }, + { + "id": 502, + "identifier": "dewott", + "generation_id": 5, + "evolves_from_species_id": 501, + "evolution_chain_id": 258, + "color_id": 2, + "shape_id": 6, + "habitat_id": "", + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 503, + "conquest_order": 107 + }, + { + "id": 503, + "identifier": "samurott", + "generation_id": 5, + "evolves_from_species_id": 502, + "evolution_chain_id": 258, + "color_id": 2, + "shape_id": 8, + "habitat_id": "", + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 504, + "conquest_order": 108 + }, + { + "id": 504, + "identifier": "patrat", + "generation_id": 5, + "evolves_from_species_id": "", + "evolution_chain_id": 259, + "color_id": 3, + "shape_id": 8, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 255, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 505, + "conquest_order": "" + }, + { + "id": 505, + "identifier": "watchog", + "generation_id": 5, + "evolves_from_species_id": 504, + "evolution_chain_id": 259, + "color_id": 3, + "shape_id": 6, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 255, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 506, + "conquest_order": "" + }, + { + "id": 506, + "identifier": "lillipup", + "generation_id": 5, + "evolves_from_species_id": "", + "evolution_chain_id": 260, + "color_id": 3, + "shape_id": 8, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 255, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 507, + "conquest_order": "" + }, + { + "id": 507, + "identifier": "herdier", + "generation_id": 5, + "evolves_from_species_id": 506, + "evolution_chain_id": 260, + "color_id": 4, + "shape_id": 8, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 120, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 508, + "conquest_order": "" + }, + { + "id": 508, + "identifier": "stoutland", + "generation_id": 5, + "evolves_from_species_id": 507, + "evolution_chain_id": 260, + "color_id": 4, + "shape_id": 8, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 509, + "conquest_order": "" + }, + { + "id": 509, + "identifier": "purrloin", + "generation_id": 5, + "evolves_from_species_id": "", + "evolution_chain_id": 261, + "color_id": 7, + "shape_id": 8, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 255, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 510, + "conquest_order": "" + }, + { + "id": 510, + "identifier": "liepard", + "generation_id": 5, + "evolves_from_species_id": 509, + "evolution_chain_id": 261, + "color_id": 7, + "shape_id": 8, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 90, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 511, + "conquest_order": "" + }, + { + "id": 511, + "identifier": "pansage", + "generation_id": 5, + "evolves_from_species_id": "", + "evolution_chain_id": 262, + "color_id": 5, + "shape_id": 6, + "habitat_id": "", + "gender_rate": 1, + "capture_rate": 190, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 512, + "conquest_order": 136 + }, + { + "id": 512, + "identifier": "simisage", + "generation_id": 5, + "evolves_from_species_id": 511, + "evolution_chain_id": 262, + "color_id": 5, + "shape_id": 6, + "habitat_id": "", + "gender_rate": 1, + "capture_rate": 75, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 513, + "conquest_order": 137 + }, + { + "id": 513, + "identifier": "pansear", + "generation_id": 5, + "evolves_from_species_id": "", + "evolution_chain_id": 263, + "color_id": 8, + "shape_id": 6, + "habitat_id": "", + "gender_rate": 1, + "capture_rate": 190, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 514, + "conquest_order": 138 + }, + { + "id": 514, + "identifier": "simisear", + "generation_id": 5, + "evolves_from_species_id": 513, + "evolution_chain_id": 263, + "color_id": 8, + "shape_id": 6, + "habitat_id": "", + "gender_rate": 1, + "capture_rate": 75, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 515, + "conquest_order": 139 + }, + { + "id": 515, + "identifier": "panpour", + "generation_id": 5, + "evolves_from_species_id": "", + "evolution_chain_id": 264, + "color_id": 2, + "shape_id": 6, + "habitat_id": "", + "gender_rate": 1, + "capture_rate": 190, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 516, + "conquest_order": 140 + }, + { + "id": 516, + "identifier": "simipour", + "generation_id": 5, + "evolves_from_species_id": 515, + "evolution_chain_id": 264, + "color_id": 2, + "shape_id": 6, + "habitat_id": "", + "gender_rate": 1, + "capture_rate": 75, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 517, + "conquest_order": 141 + }, + { + "id": 517, + "identifier": "munna", + "generation_id": 5, + "evolves_from_species_id": "", + "evolution_chain_id": 265, + "color_id": 6, + "shape_id": 8, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 190, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 10, + "has_gender_differences": 0, + "growth_rate_id": 3, + "forms_switchable": 0, + "order": 518, + "conquest_order": 72 + }, + { + "id": 518, + "identifier": "musharna", + "generation_id": 5, + "evolves_from_species_id": 517, + "evolution_chain_id": 265, + "color_id": 6, + "shape_id": 12, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 75, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 10, + "has_gender_differences": 0, + "growth_rate_id": 3, + "forms_switchable": 0, + "order": 519, + "conquest_order": 73 + }, + { + "id": 519, + "identifier": "pidove", + "generation_id": 5, + "evolves_from_species_id": "", + "evolution_chain_id": 266, + "color_id": 4, + "shape_id": 9, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 255, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 520, + "conquest_order": "" + }, + { + "id": 520, + "identifier": "tranquill", + "generation_id": 5, + "evolves_from_species_id": 519, + "evolution_chain_id": 266, + "color_id": 4, + "shape_id": 9, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 120, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 521, + "conquest_order": "" + }, + { + "id": 521, + "identifier": "unfezant", + "generation_id": 5, + "evolves_from_species_id": 520, + "evolution_chain_id": 266, + "color_id": 4, + "shape_id": 9, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 1, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 522, + "conquest_order": "" + }, + { + "id": 522, + "identifier": "blitzle", + "generation_id": 5, + "evolves_from_species_id": "", + "evolution_chain_id": 267, + "color_id": 1, + "shape_id": 8, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 190, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 523, + "conquest_order": 74 + }, + { + "id": 523, + "identifier": "zebstrika", + "generation_id": 5, + "evolves_from_species_id": 522, + "evolution_chain_id": 267, + "color_id": 1, + "shape_id": 8, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 75, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 524, + "conquest_order": 75 + }, + { + "id": 524, + "identifier": "roggenrola", + "generation_id": 5, + "evolves_from_species_id": "", + "evolution_chain_id": 268, + "color_id": 2, + "shape_id": 7, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 255, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 525, + "conquest_order": 40 + }, + { + "id": 525, + "identifier": "boldore", + "generation_id": 5, + "evolves_from_species_id": 524, + "evolution_chain_id": 268, + "color_id": 2, + "shape_id": 10, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 120, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 526, + "conquest_order": 41 + }, + { + "id": 526, + "identifier": "gigalith", + "generation_id": 5, + "evolves_from_species_id": 525, + "evolution_chain_id": 268, + "color_id": 2, + "shape_id": 10, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 527, + "conquest_order": 42 + }, + { + "id": 527, + "identifier": "woobat", + "generation_id": 5, + "evolves_from_species_id": "", + "evolution_chain_id": 269, + "color_id": 2, + "shape_id": 9, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 190, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 528, + "conquest_order": "" + }, + { + "id": 528, + "identifier": "swoobat", + "generation_id": 5, + "evolves_from_species_id": 527, + "evolution_chain_id": 269, + "color_id": 2, + "shape_id": 9, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 529, + "conquest_order": "" + }, + { + "id": 529, + "identifier": "drilbur", + "generation_id": 5, + "evolves_from_species_id": "", + "evolution_chain_id": 270, + "color_id": 4, + "shape_id": 6, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 120, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 530, + "conquest_order": 152 + }, + { + "id": 530, + "identifier": "excadrill", + "generation_id": 5, + "evolves_from_species_id": 529, + "evolution_chain_id": 270, + "color_id": 4, + "shape_id": 12, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 60, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 531, + "conquest_order": 153 + }, + { + "id": 531, + "identifier": "audino", + "generation_id": 5, + "evolves_from_species_id": "", + "evolution_chain_id": 271, + "color_id": 6, + "shape_id": 6, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 255, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 3, + "forms_switchable": 1, + "order": 532, + "conquest_order": 185 + }, + { + "id": 532, + "identifier": "timburr", + "generation_id": 5, + "evolves_from_species_id": "", + "evolution_chain_id": 272, + "color_id": 4, + "shape_id": 12, + "habitat_id": "", + "gender_rate": 2, + "capture_rate": 180, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 533, + "conquest_order": 101 + }, + { + "id": 533, + "identifier": "gurdurr", + "generation_id": 5, + "evolves_from_species_id": 532, + "evolution_chain_id": 272, + "color_id": 4, + "shape_id": 12, + "habitat_id": "", + "gender_rate": 2, + "capture_rate": 90, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 534, + "conquest_order": 102 + }, + { + "id": 534, + "identifier": "conkeldurr", + "generation_id": 5, + "evolves_from_species_id": 533, + "evolution_chain_id": 272, + "color_id": 3, + "shape_id": 12, + "habitat_id": "", + "gender_rate": 2, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 535, + "conquest_order": 103 + }, + { + "id": 535, + "identifier": "tympole", + "generation_id": 5, + "evolves_from_species_id": "", + "evolution_chain_id": 273, + "color_id": 2, + "shape_id": 3, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 255, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 536, + "conquest_order": "" + }, + { + "id": 536, + "identifier": "palpitoad", + "generation_id": 5, + "evolves_from_species_id": 535, + "evolution_chain_id": 273, + "color_id": 2, + "shape_id": 6, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 120, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 537, + "conquest_order": "" + }, + { + "id": 537, + "identifier": "seismitoad", + "generation_id": 5, + "evolves_from_species_id": 536, + "evolution_chain_id": 273, + "color_id": 2, + "shape_id": 12, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 538, + "conquest_order": "" + }, + { + "id": 538, + "identifier": "throh", + "generation_id": 5, + "evolves_from_species_id": "", + "evolution_chain_id": 274, + "color_id": 8, + "shape_id": 12, + "habitat_id": "", + "gender_rate": 0, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 539, + "conquest_order": "" + }, + { + "id": 539, + "identifier": "sawk", + "generation_id": 5, + "evolves_from_species_id": "", + "evolution_chain_id": 275, + "color_id": 2, + "shape_id": 12, + "habitat_id": "", + "gender_rate": 0, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 540, + "conquest_order": "" + }, + { + "id": 540, + "identifier": "sewaddle", + "generation_id": 5, + "evolves_from_species_id": "", + "evolution_chain_id": 276, + "color_id": 10, + "shape_id": 14, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 255, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 541, + "conquest_order": 124 + }, + { + "id": 541, + "identifier": "swadloon", + "generation_id": 5, + "evolves_from_species_id": 540, + "evolution_chain_id": 276, + "color_id": 5, + "shape_id": 4, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 120, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 542, + "conquest_order": 125 + }, + { + "id": 542, + "identifier": "leavanny", + "generation_id": 5, + "evolves_from_species_id": 541, + "evolution_chain_id": 276, + "color_id": 10, + "shape_id": 12, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 543, + "conquest_order": 126 + }, + { + "id": 543, + "identifier": "venipede", + "generation_id": 5, + "evolves_from_species_id": "", + "evolution_chain_id": 277, + "color_id": 8, + "shape_id": 14, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 255, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 544, + "conquest_order": 31 + }, + { + "id": 544, + "identifier": "whirlipede", + "generation_id": 5, + "evolves_from_species_id": 543, + "evolution_chain_id": 277, + "color_id": 4, + "shape_id": 1, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 120, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 545, + "conquest_order": 32 + }, + { + "id": 545, + "identifier": "scolipede", + "generation_id": 5, + "evolves_from_species_id": 544, + "evolution_chain_id": 277, + "color_id": 8, + "shape_id": 14, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 546, + "conquest_order": 33 + }, + { + "id": 546, + "identifier": "cottonee", + "generation_id": 5, + "evolves_from_species_id": "", + "evolution_chain_id": 278, + "color_id": 5, + "shape_id": 1, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 190, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 547, + "conquest_order": 48 + }, + { + "id": 547, + "identifier": "whimsicott", + "generation_id": 5, + "evolves_from_species_id": 546, + "evolution_chain_id": 278, + "color_id": 5, + "shape_id": 12, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 75, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 548, + "conquest_order": 49 + }, + { + "id": 548, + "identifier": "petilil", + "generation_id": 5, + "evolves_from_species_id": "", + "evolution_chain_id": 279, + "color_id": 5, + "shape_id": 5, + "habitat_id": "", + "gender_rate": 8, + "capture_rate": 190, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 549, + "conquest_order": 43 + }, + { + "id": 549, + "identifier": "lilligant", + "generation_id": 5, + "evolves_from_species_id": 548, + "evolution_chain_id": 279, + "color_id": 5, + "shape_id": 5, + "habitat_id": "", + "gender_rate": 8, + "capture_rate": 75, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 550, + "conquest_order": 44 + }, + { + "id": 550, + "identifier": "basculin", + "generation_id": 5, + "evolves_from_species_id": "", + "evolution_chain_id": 280, + "color_id": 5, + "shape_id": 3, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 25, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 40, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 551, + "conquest_order": "" + }, + { + "id": 551, + "identifier": "sandile", + "generation_id": 5, + "evolves_from_species_id": "", + "evolution_chain_id": 281, + "color_id": 3, + "shape_id": 8, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 180, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 552, + "conquest_order": 66 + }, + { + "id": 552, + "identifier": "krokorok", + "generation_id": 5, + "evolves_from_species_id": 551, + "evolution_chain_id": 281, + "color_id": 3, + "shape_id": 8, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 90, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 553, + "conquest_order": 67 + }, + { + "id": 553, + "identifier": "krookodile", + "generation_id": 5, + "evolves_from_species_id": 552, + "evolution_chain_id": 281, + "color_id": 8, + "shape_id": 6, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 554, + "conquest_order": 68 + }, + { + "id": 554, + "identifier": "darumaka", + "generation_id": 5, + "evolves_from_species_id": "", + "evolution_chain_id": 282, + "color_id": 8, + "shape_id": 12, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 120, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 555, + "conquest_order": 142 + }, + { + "id": 555, + "identifier": "darmanitan", + "generation_id": 5, + "evolves_from_species_id": 554, + "evolution_chain_id": 282, + "color_id": 8, + "shape_id": 8, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 60, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 1, + "order": 556, + "conquest_order": 143 + }, + { + "id": 556, + "identifier": "maractus", + "generation_id": 5, + "evolves_from_species_id": "", + "evolution_chain_id": 283, + "color_id": 5, + "shape_id": 5, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 255, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 557, + "conquest_order": "" + }, + { + "id": 557, + "identifier": "dwebble", + "generation_id": 5, + "evolves_from_species_id": "", + "evolution_chain_id": 284, + "color_id": 8, + "shape_id": 14, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 190, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 558, + "conquest_order": "" + }, + { + "id": 558, + "identifier": "crustle", + "generation_id": 5, + "evolves_from_species_id": 557, + "evolution_chain_id": 284, + "color_id": 8, + "shape_id": 14, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 75, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 559, + "conquest_order": "" + }, + { + "id": 559, + "identifier": "scraggy", + "generation_id": 5, + "evolves_from_species_id": "", + "evolution_chain_id": 285, + "color_id": 10, + "shape_id": 6, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 180, + "base_happiness": 35, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 560, + "conquest_order": 165 + }, + { + "id": 560, + "identifier": "scrafty", + "generation_id": 5, + "evolves_from_species_id": 559, + "evolution_chain_id": 285, + "color_id": 8, + "shape_id": 6, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 90, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 561, + "conquest_order": 166 + }, + { + "id": 561, + "identifier": "sigilyph", + "generation_id": 5, + "evolves_from_species_id": "", + "evolution_chain_id": 286, + "color_id": 1, + "shape_id": 9, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 562, + "conquest_order": "" + }, + { + "id": 562, + "identifier": "yamask", + "generation_id": 5, + "evolves_from_species_id": "", + "evolution_chain_id": 287, + "color_id": 1, + "shape_id": 4, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 190, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 25, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 563, + "conquest_order": "" + }, + { + "id": 563, + "identifier": "cofagrigus", + "generation_id": 5, + "evolves_from_species_id": 562, + "evolution_chain_id": 287, + "color_id": 10, + "shape_id": 5, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 90, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 25, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 564, + "conquest_order": "" + }, + { + "id": 564, + "identifier": "tirtouga", + "generation_id": 5, + "evolves_from_species_id": "", + "evolution_chain_id": 288, + "color_id": 2, + "shape_id": 8, + "habitat_id": "", + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 30, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 565, + "conquest_order": "" + }, + { + "id": 565, + "identifier": "carracosta", + "generation_id": 5, + "evolves_from_species_id": 564, + "evolution_chain_id": 288, + "color_id": 2, + "shape_id": 6, + "habitat_id": "", + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 30, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 566, + "conquest_order": "" + }, + { + "id": 566, + "identifier": "archen", + "generation_id": 5, + "evolves_from_species_id": "", + "evolution_chain_id": 289, + "color_id": 10, + "shape_id": 9, + "habitat_id": "", + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 30, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 567, + "conquest_order": "" + }, + { + "id": 567, + "identifier": "archeops", + "generation_id": 5, + "evolves_from_species_id": 566, + "evolution_chain_id": 289, + "color_id": 10, + "shape_id": 9, + "habitat_id": "", + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 30, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 568, + "conquest_order": "" + }, + { + "id": 568, + "identifier": "trubbish", + "generation_id": 5, + "evolves_from_species_id": "", + "evolution_chain_id": 290, + "color_id": 5, + "shape_id": 12, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 190, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 569, + "conquest_order": "" + }, + { + "id": 569, + "identifier": "garbodor", + "generation_id": 5, + "evolves_from_species_id": 568, + "evolution_chain_id": 290, + "color_id": 5, + "shape_id": 12, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 60, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 570, + "conquest_order": "" + }, + { + "id": 570, + "identifier": "zorua", + "generation_id": 5, + "evolves_from_species_id": "", + "evolution_chain_id": 291, + "color_id": 4, + "shape_id": 8, + "habitat_id": "", + "gender_rate": 1, + "capture_rate": 75, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 25, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 571, + "conquest_order": 154 + }, + { + "id": 571, + "identifier": "zoroark", + "generation_id": 5, + "evolves_from_species_id": 570, + "evolution_chain_id": 291, + "color_id": 4, + "shape_id": 6, + "habitat_id": "", + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 572, + "conquest_order": 155 + }, + { + "id": 572, + "identifier": "minccino", + "generation_id": 5, + "evolves_from_species_id": "", + "evolution_chain_id": 292, + "color_id": 4, + "shape_id": 8, + "habitat_id": "", + "gender_rate": 6, + "capture_rate": 255, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 3, + "forms_switchable": 0, + "order": 573, + "conquest_order": 96 + }, + { + "id": 573, + "identifier": "cinccino", + "generation_id": 5, + "evolves_from_species_id": 572, + "evolution_chain_id": 292, + "color_id": 4, + "shape_id": 8, + "habitat_id": "", + "gender_rate": 6, + "capture_rate": 60, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 3, + "forms_switchable": 0, + "order": 574, + "conquest_order": 97 + }, + { + "id": 574, + "identifier": "gothita", + "generation_id": 5, + "evolves_from_species_id": "", + "evolution_chain_id": 293, + "color_id": 7, + "shape_id": 12, + "habitat_id": "", + "gender_rate": 6, + "capture_rate": 200, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 575, + "conquest_order": 63 + }, + { + "id": 575, + "identifier": "gothorita", + "generation_id": 5, + "evolves_from_species_id": 574, + "evolution_chain_id": 293, + "color_id": 7, + "shape_id": 12, + "habitat_id": "", + "gender_rate": 6, + "capture_rate": 100, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 576, + "conquest_order": 64 + }, + { + "id": 576, + "identifier": "gothitelle", + "generation_id": 5, + "evolves_from_species_id": 575, + "evolution_chain_id": 293, + "color_id": 7, + "shape_id": 12, + "habitat_id": "", + "gender_rate": 6, + "capture_rate": 50, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 577, + "conquest_order": 65 + }, + { + "id": 577, + "identifier": "solosis", + "generation_id": 5, + "evolves_from_species_id": "", + "evolution_chain_id": 294, + "color_id": 5, + "shape_id": 1, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 200, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 578, + "conquest_order": "" + }, + { + "id": 578, + "identifier": "duosion", + "generation_id": 5, + "evolves_from_species_id": 577, + "evolution_chain_id": 294, + "color_id": 5, + "shape_id": 1, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 100, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 579, + "conquest_order": "" + }, + { + "id": 579, + "identifier": "reuniclus", + "generation_id": 5, + "evolves_from_species_id": 578, + "evolution_chain_id": 294, + "color_id": 5, + "shape_id": 4, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 50, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 580, + "conquest_order": "" + }, + { + "id": 580, + "identifier": "ducklett", + "generation_id": 5, + "evolves_from_species_id": "", + "evolution_chain_id": 295, + "color_id": 2, + "shape_id": 9, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 190, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 581, + "conquest_order": "" + }, + { + "id": 581, + "identifier": "swanna", + "generation_id": 5, + "evolves_from_species_id": 580, + "evolution_chain_id": 295, + "color_id": 9, + "shape_id": 9, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 582, + "conquest_order": "" + }, + { + "id": 582, + "identifier": "vanillite", + "generation_id": 5, + "evolves_from_species_id": "", + "evolution_chain_id": 296, + "color_id": 9, + "shape_id": 5, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 255, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 583, + "conquest_order": "" + }, + { + "id": 583, + "identifier": "vanillish", + "generation_id": 5, + "evolves_from_species_id": 582, + "evolution_chain_id": 296, + "color_id": 9, + "shape_id": 5, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 120, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 584, + "conquest_order": "" + }, + { + "id": 584, + "identifier": "vanilluxe", + "generation_id": 5, + "evolves_from_species_id": 583, + "evolution_chain_id": 296, + "color_id": 9, + "shape_id": 11, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 585, + "conquest_order": "" + }, + { + "id": 585, + "identifier": "deerling", + "generation_id": 5, + "evolves_from_species_id": "", + "evolution_chain_id": 297, + "color_id": 6, + "shape_id": 8, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 190, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 1, + "order": 586, + "conquest_order": "" + }, + { + "id": 586, + "identifier": "sawsbuck", + "generation_id": 5, + "evolves_from_species_id": 585, + "evolution_chain_id": 297, + "color_id": 3, + "shape_id": 8, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 75, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 1, + "order": 587, + "conquest_order": "" + }, + { + "id": 587, + "identifier": "emolga", + "generation_id": 5, + "evolves_from_species_id": "", + "evolution_chain_id": 298, + "color_id": 9, + "shape_id": 8, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 200, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 588, + "conquest_order": 180 + }, + { + "id": 588, + "identifier": "karrablast", + "generation_id": 5, + "evolves_from_species_id": "", + "evolution_chain_id": 299, + "color_id": 2, + "shape_id": 12, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 200, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 589, + "conquest_order": "" + }, + { + "id": 589, + "identifier": "escavalier", + "generation_id": 5, + "evolves_from_species_id": 588, + "evolution_chain_id": 299, + "color_id": 4, + "shape_id": 4, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 75, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 590, + "conquest_order": "" + }, + { + "id": 590, + "identifier": "foongus", + "generation_id": 5, + "evolves_from_species_id": "", + "evolution_chain_id": 300, + "color_id": 9, + "shape_id": 4, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 190, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 591, + "conquest_order": "" + }, + { + "id": 591, + "identifier": "amoonguss", + "generation_id": 5, + "evolves_from_species_id": 590, + "evolution_chain_id": 300, + "color_id": 9, + "shape_id": 4, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 75, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 592, + "conquest_order": "" + }, + { + "id": 592, + "identifier": "frillish", + "generation_id": 5, + "evolves_from_species_id": "", + "evolution_chain_id": 301, + "color_id": 9, + "shape_id": 10, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 190, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 1, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 593, + "conquest_order": "" + }, + { + "id": 593, + "identifier": "jellicent", + "generation_id": 5, + "evolves_from_species_id": 592, + "evolution_chain_id": 301, + "color_id": 9, + "shape_id": 10, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 60, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 1, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 594, + "conquest_order": "" + }, + { + "id": 594, + "identifier": "alomomola", + "generation_id": 5, + "evolves_from_species_id": "", + "evolution_chain_id": 302, + "color_id": 6, + "shape_id": 3, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 75, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 40, + "has_gender_differences": 0, + "growth_rate_id": 3, + "forms_switchable": 0, + "order": 595, + "conquest_order": "" + }, + { + "id": 595, + "identifier": "joltik", + "generation_id": 5, + "evolves_from_species_id": "", + "evolution_chain_id": 303, + "color_id": 10, + "shape_id": 14, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 190, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 596, + "conquest_order": 147 + }, + { + "id": 596, + "identifier": "galvantula", + "generation_id": 5, + "evolves_from_species_id": 595, + "evolution_chain_id": 303, + "color_id": 10, + "shape_id": 14, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 75, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 597, + "conquest_order": 148 + }, + { + "id": 597, + "identifier": "ferroseed", + "generation_id": 5, + "evolves_from_species_id": "", + "evolution_chain_id": 304, + "color_id": 4, + "shape_id": 1, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 255, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 598, + "conquest_order": "" + }, + { + "id": 598, + "identifier": "ferrothorn", + "generation_id": 5, + "evolves_from_species_id": 597, + "evolution_chain_id": 304, + "color_id": 4, + "shape_id": 10, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 90, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 599, + "conquest_order": "" + }, + { + "id": 599, + "identifier": "klink", + "generation_id": 5, + "evolves_from_species_id": "", + "evolution_chain_id": 305, + "color_id": 4, + "shape_id": 11, + "habitat_id": "", + "gender_rate": -1, + "capture_rate": 130, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 600, + "conquest_order": "" + }, + { + "id": 600, + "identifier": "klang", + "generation_id": 5, + "evolves_from_species_id": 599, + "evolution_chain_id": 305, + "color_id": 4, + "shape_id": 11, + "habitat_id": "", + "gender_rate": -1, + "capture_rate": 60, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 601, + "conquest_order": "" + }, + { + "id": 601, + "identifier": "klinklang", + "generation_id": 5, + "evolves_from_species_id": 600, + "evolution_chain_id": 305, + "color_id": 4, + "shape_id": 11, + "habitat_id": "", + "gender_rate": -1, + "capture_rate": 30, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 602, + "conquest_order": "" + }, + { + "id": 602, + "identifier": "tynamo", + "generation_id": 5, + "evolves_from_species_id": "", + "evolution_chain_id": 306, + "color_id": 9, + "shape_id": 3, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 190, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 603, + "conquest_order": "" + }, + { + "id": 603, + "identifier": "eelektrik", + "generation_id": 5, + "evolves_from_species_id": 602, + "evolution_chain_id": 306, + "color_id": 2, + "shape_id": 3, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 60, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 604, + "conquest_order": "" + }, + { + "id": 604, + "identifier": "eelektross", + "generation_id": 5, + "evolves_from_species_id": 603, + "evolution_chain_id": 306, + "color_id": 2, + "shape_id": 3, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 30, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 605, + "conquest_order": "" + }, + { + "id": 605, + "identifier": "elgyem", + "generation_id": 5, + "evolves_from_species_id": "", + "evolution_chain_id": 307, + "color_id": 2, + "shape_id": 6, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 255, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 606, + "conquest_order": "" + }, + { + "id": 606, + "identifier": "beheeyem", + "generation_id": 5, + "evolves_from_species_id": 605, + "evolution_chain_id": 307, + "color_id": 3, + "shape_id": 12, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 90, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 607, + "conquest_order": "" + }, + { + "id": 607, + "identifier": "litwick", + "generation_id": 5, + "evolves_from_species_id": "", + "evolution_chain_id": 308, + "color_id": 9, + "shape_id": 5, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 190, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 608, + "conquest_order": 37 + }, + { + "id": 608, + "identifier": "lampent", + "generation_id": 5, + "evolves_from_species_id": 607, + "evolution_chain_id": 308, + "color_id": 1, + "shape_id": 4, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 90, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 609, + "conquest_order": 38 + }, + { + "id": 609, + "identifier": "chandelure", + "generation_id": 5, + "evolves_from_species_id": 608, + "evolution_chain_id": 308, + "color_id": 1, + "shape_id": 4, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 1, + "order": 610, + "conquest_order": 39 + }, + { + "id": 610, + "identifier": "axew", + "generation_id": 5, + "evolves_from_species_id": "", + "evolution_chain_id": 309, + "color_id": 5, + "shape_id": 6, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 75, + "base_happiness": 35, + "is_baby": 0, + "hatch_counter": 40, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 611, + "conquest_order": 144 + }, + { + "id": 611, + "identifier": "fraxure", + "generation_id": 5, + "evolves_from_species_id": 610, + "evolution_chain_id": 309, + "color_id": 5, + "shape_id": 6, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 60, + "base_happiness": 35, + "is_baby": 0, + "hatch_counter": 40, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 612, + "conquest_order": 145 + }, + { + "id": 612, + "identifier": "haxorus", + "generation_id": 5, + "evolves_from_species_id": 611, + "evolution_chain_id": 309, + "color_id": 10, + "shape_id": 6, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 35, + "is_baby": 0, + "hatch_counter": 40, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 613, + "conquest_order": 146 + }, + { + "id": 613, + "identifier": "cubchoo", + "generation_id": 5, + "evolves_from_species_id": "", + "evolution_chain_id": 310, + "color_id": 9, + "shape_id": 6, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 120, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 614, + "conquest_order": 104 + }, + { + "id": 614, + "identifier": "beartic", + "generation_id": 5, + "evolves_from_species_id": 613, + "evolution_chain_id": 310, + "color_id": 9, + "shape_id": 8, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 60, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 615, + "conquest_order": 105 + }, + { + "id": 615, + "identifier": "cryogonal", + "generation_id": 5, + "evolves_from_species_id": "", + "evolution_chain_id": 311, + "color_id": 2, + "shape_id": 1, + "habitat_id": "", + "gender_rate": -1, + "capture_rate": 25, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 25, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 616, + "conquest_order": "" + }, + { + "id": 616, + "identifier": "shelmet", + "generation_id": 5, + "evolves_from_species_id": "", + "evolution_chain_id": 312, + "color_id": 8, + "shape_id": 1, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 200, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 617, + "conquest_order": "" + }, + { + "id": 617, + "identifier": "accelgor", + "generation_id": 5, + "evolves_from_species_id": 616, + "evolution_chain_id": 312, + "color_id": 8, + "shape_id": 4, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 75, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 618, + "conquest_order": "" + }, + { + "id": 618, + "identifier": "stunfisk", + "generation_id": 5, + "evolves_from_species_id": "", + "evolution_chain_id": 313, + "color_id": 3, + "shape_id": 3, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 75, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 619, + "conquest_order": "" + }, + { + "id": 619, + "identifier": "mienfoo", + "generation_id": 5, + "evolves_from_species_id": "", + "evolution_chain_id": 314, + "color_id": 10, + "shape_id": 6, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 180, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 25, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 620, + "conquest_order": "" + }, + { + "id": 620, + "identifier": "mienshao", + "generation_id": 5, + "evolves_from_species_id": 619, + "evolution_chain_id": 314, + "color_id": 7, + "shape_id": 6, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 25, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 621, + "conquest_order": "" + }, + { + "id": 621, + "identifier": "druddigon", + "generation_id": 5, + "evolves_from_species_id": "", + "evolution_chain_id": 315, + "color_id": 8, + "shape_id": 6, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 30, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 622, + "conquest_order": "" + }, + { + "id": 622, + "identifier": "golett", + "generation_id": 5, + "evolves_from_species_id": "", + "evolution_chain_id": 316, + "color_id": 5, + "shape_id": 12, + "habitat_id": "", + "gender_rate": -1, + "capture_rate": 190, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 25, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 623, + "conquest_order": "" + }, + { + "id": 623, + "identifier": "golurk", + "generation_id": 5, + "evolves_from_species_id": 622, + "evolution_chain_id": 316, + "color_id": 5, + "shape_id": 12, + "habitat_id": "", + "gender_rate": -1, + "capture_rate": 90, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 25, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 624, + "conquest_order": "" + }, + { + "id": 624, + "identifier": "pawniard", + "generation_id": 5, + "evolves_from_species_id": "", + "evolution_chain_id": 317, + "color_id": 8, + "shape_id": 12, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 120, + "base_happiness": 35, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 625, + "conquest_order": 158 + }, + { + "id": 625, + "identifier": "bisharp", + "generation_id": 5, + "evolves_from_species_id": 624, + "evolution_chain_id": 317, + "color_id": 8, + "shape_id": 12, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 35, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 626, + "conquest_order": 159 + }, + { + "id": 626, + "identifier": "bouffalant", + "generation_id": 5, + "evolves_from_species_id": "", + "evolution_chain_id": 318, + "color_id": 3, + "shape_id": 8, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 627, + "conquest_order": "" + }, + { + "id": 627, + "identifier": "rufflet", + "generation_id": 5, + "evolves_from_species_id": "", + "evolution_chain_id": 319, + "color_id": 9, + "shape_id": 9, + "habitat_id": "", + "gender_rate": 0, + "capture_rate": 190, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 628, + "conquest_order": 169 + }, + { + "id": 628, + "identifier": "braviary", + "generation_id": 5, + "evolves_from_species_id": 627, + "evolution_chain_id": 319, + "color_id": 8, + "shape_id": 9, + "habitat_id": "", + "gender_rate": 0, + "capture_rate": 60, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 629, + "conquest_order": 170 + }, + { + "id": 629, + "identifier": "vullaby", + "generation_id": 5, + "evolves_from_species_id": "", + "evolution_chain_id": 320, + "color_id": 3, + "shape_id": 9, + "habitat_id": "", + "gender_rate": 8, + "capture_rate": 190, + "base_happiness": 35, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 630, + "conquest_order": "" + }, + { + "id": 630, + "identifier": "mandibuzz", + "generation_id": 5, + "evolves_from_species_id": 629, + "evolution_chain_id": 320, + "color_id": 3, + "shape_id": 9, + "habitat_id": "", + "gender_rate": 8, + "capture_rate": 60, + "base_happiness": 35, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 631, + "conquest_order": "" + }, + { + "id": 631, + "identifier": "heatmor", + "generation_id": 5, + "evolves_from_species_id": "", + "evolution_chain_id": 321, + "color_id": 8, + "shape_id": 6, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 90, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 632, + "conquest_order": "" + }, + { + "id": 632, + "identifier": "durant", + "generation_id": 5, + "evolves_from_species_id": "", + "evolution_chain_id": 322, + "color_id": 4, + "shape_id": 14, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 90, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 633, + "conquest_order": "" + }, + { + "id": 633, + "identifier": "deino", + "generation_id": 5, + "evolves_from_species_id": "", + "evolution_chain_id": 323, + "color_id": 2, + "shape_id": 8, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 35, + "is_baby": 0, + "hatch_counter": 40, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 634, + "conquest_order": 90 + }, + { + "id": 634, + "identifier": "zweilous", + "generation_id": 5, + "evolves_from_species_id": 633, + "evolution_chain_id": 323, + "color_id": 2, + "shape_id": 8, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 35, + "is_baby": 0, + "hatch_counter": 40, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 635, + "conquest_order": 91 + }, + { + "id": 635, + "identifier": "hydreigon", + "generation_id": 5, + "evolves_from_species_id": 634, + "evolution_chain_id": 323, + "color_id": 2, + "shape_id": 6, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 35, + "is_baby": 0, + "hatch_counter": 40, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 636, + "conquest_order": 92 + }, + { + "id": 636, + "identifier": "larvesta", + "generation_id": 5, + "evolves_from_species_id": "", + "evolution_chain_id": 324, + "color_id": 9, + "shape_id": 14, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 40, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 637, + "conquest_order": 173 + }, + { + "id": 637, + "identifier": "volcarona", + "generation_id": 5, + "evolves_from_species_id": 636, + "evolution_chain_id": 324, + "color_id": 9, + "shape_id": 13, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 15, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 40, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 638, + "conquest_order": 174 + }, + { + "id": 638, + "identifier": "cobalion", + "generation_id": 5, + "evolves_from_species_id": "", + "evolution_chain_id": 325, + "color_id": 2, + "shape_id": 8, + "habitat_id": "", + "gender_rate": -1, + "capture_rate": 3, + "base_happiness": 35, + "is_baby": 0, + "hatch_counter": 80, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 639, + "conquest_order": "" + }, + { + "id": 639, + "identifier": "terrakion", + "generation_id": 5, + "evolves_from_species_id": "", + "evolution_chain_id": 326, + "color_id": 4, + "shape_id": 8, + "habitat_id": "", + "gender_rate": -1, + "capture_rate": 3, + "base_happiness": 35, + "is_baby": 0, + "hatch_counter": 80, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 640, + "conquest_order": 191 + }, + { + "id": 640, + "identifier": "virizion", + "generation_id": 5, + "evolves_from_species_id": "", + "evolution_chain_id": 327, + "color_id": 5, + "shape_id": 8, + "habitat_id": "", + "gender_rate": -1, + "capture_rate": 3, + "base_happiness": 35, + "is_baby": 0, + "hatch_counter": 80, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 641, + "conquest_order": "" + }, + { + "id": 641, + "identifier": "tornadus", + "generation_id": 5, + "evolves_from_species_id": "", + "evolution_chain_id": 328, + "color_id": 5, + "shape_id": 4, + "habitat_id": "", + "gender_rate": 0, + "capture_rate": 3, + "base_happiness": 90, + "is_baby": 0, + "hatch_counter": 120, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 1, + "order": 642, + "conquest_order": "" + }, + { + "id": 642, + "identifier": "thundurus", + "generation_id": 5, + "evolves_from_species_id": "", + "evolution_chain_id": 329, + "color_id": 2, + "shape_id": 4, + "habitat_id": "", + "gender_rate": 0, + "capture_rate": 3, + "base_happiness": 90, + "is_baby": 0, + "hatch_counter": 120, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 1, + "order": 643, + "conquest_order": "" + }, + { + "id": 643, + "identifier": "reshiram", + "generation_id": 5, + "evolves_from_species_id": "", + "evolution_chain_id": 330, + "color_id": 9, + "shape_id": 9, + "habitat_id": "", + "gender_rate": -1, + "capture_rate": 3, + "base_happiness": 0, + "is_baby": 0, + "hatch_counter": 120, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 644, + "conquest_order": 197 + }, + { + "id": 644, + "identifier": "zekrom", + "generation_id": 5, + "evolves_from_species_id": "", + "evolution_chain_id": 331, + "color_id": 1, + "shape_id": 6, + "habitat_id": "", + "gender_rate": -1, + "capture_rate": 3, + "base_happiness": 0, + "is_baby": 0, + "hatch_counter": 120, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 645, + "conquest_order": 198 + }, + { + "id": 645, + "identifier": "landorus", + "generation_id": 5, + "evolves_from_species_id": "", + "evolution_chain_id": 332, + "color_id": 3, + "shape_id": 4, + "habitat_id": "", + "gender_rate": 0, + "capture_rate": 3, + "base_happiness": 90, + "is_baby": 0, + "hatch_counter": 120, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 1, + "order": 646, + "conquest_order": "" + }, + { + "id": 646, + "identifier": "kyurem", + "generation_id": 5, + "evolves_from_species_id": "", + "evolution_chain_id": 333, + "color_id": 4, + "shape_id": 6, + "habitat_id": "", + "gender_rate": -1, + "capture_rate": 3, + "base_happiness": 0, + "is_baby": 0, + "hatch_counter": 120, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 1, + "order": 647, + "conquest_order": "" + }, + { + "id": 647, + "identifier": "keldeo", + "generation_id": 5, + "evolves_from_species_id": "", + "evolution_chain_id": 334, + "color_id": 10, + "shape_id": 8, + "habitat_id": "", + "gender_rate": -1, + "capture_rate": 3, + "base_happiness": 35, + "is_baby": 0, + "hatch_counter": 80, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 1, + "order": 648, + "conquest_order": "" + }, + { + "id": 648, + "identifier": "meloetta", + "generation_id": 5, + "evolves_from_species_id": "", + "evolution_chain_id": 335, + "color_id": 9, + "shape_id": 12, + "habitat_id": "", + "gender_rate": -1, + "capture_rate": 3, + "base_happiness": 100, + "is_baby": 0, + "hatch_counter": 120, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 1, + "order": 649, + "conquest_order": "" + }, + { + "id": 649, + "identifier": "genesect", + "generation_id": 5, + "evolves_from_species_id": "", + "evolution_chain_id": 336, + "color_id": 7, + "shape_id": 12, + "habitat_id": "", + "gender_rate": -1, + "capture_rate": 3, + "base_happiness": 0, + "is_baby": 0, + "hatch_counter": 120, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 1, + "order": 650, + "conquest_order": "" + }, + { + "id": 650, + "identifier": "chespin", + "generation_id": 6, + "evolves_from_species_id": "", + "evolution_chain_id": 337, + "color_id": 5, + "shape_id": 6, + "habitat_id": "", + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 651, + "conquest_order": "" + }, + { + "id": 651, + "identifier": "quilladin", + "generation_id": 6, + "evolves_from_species_id": 650, + "evolution_chain_id": 337, + "color_id": 5, + "shape_id": 6, + "habitat_id": "", + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 652, + "conquest_order": "" + }, + { + "id": 652, + "identifier": "chesnaught", + "generation_id": 6, + "evolves_from_species_id": 651, + "evolution_chain_id": 337, + "color_id": 5, + "shape_id": 6, + "habitat_id": "", + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 653, + "conquest_order": "" + }, + { + "id": 653, + "identifier": "fennekin", + "generation_id": 6, + "evolves_from_species_id": "", + "evolution_chain_id": 338, + "color_id": 8, + "shape_id": 8, + "habitat_id": "", + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 654, + "conquest_order": "" + }, + { + "id": 654, + "identifier": "braixen", + "generation_id": 6, + "evolves_from_species_id": 653, + "evolution_chain_id": 338, + "color_id": 8, + "shape_id": 6, + "habitat_id": "", + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 655, + "conquest_order": "" + }, + { + "id": 655, + "identifier": "delphox", + "generation_id": 6, + "evolves_from_species_id": 654, + "evolution_chain_id": 338, + "color_id": 8, + "shape_id": 6, + "habitat_id": "", + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 656, + "conquest_order": "" + }, + { + "id": 656, + "identifier": "froakie", + "generation_id": 6, + "evolves_from_species_id": "", + "evolution_chain_id": 339, + "color_id": 2, + "shape_id": 8, + "habitat_id": "", + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 657, + "conquest_order": "" + }, + { + "id": 657, + "identifier": "frogadier", + "generation_id": 6, + "evolves_from_species_id": 656, + "evolution_chain_id": 339, + "color_id": 2, + "shape_id": 12, + "habitat_id": "", + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 658, + "conquest_order": "" + }, + { + "id": 658, + "identifier": "greninja", + "generation_id": 6, + "evolves_from_species_id": 657, + "evolution_chain_id": 339, + "color_id": 2, + "shape_id": 12, + "habitat_id": "", + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 659, + "conquest_order": "" + }, + { + "id": 659, + "identifier": "bunnelby", + "generation_id": 6, + "evolves_from_species_id": "", + "evolution_chain_id": 340, + "color_id": 3, + "shape_id": 6, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 255, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 660, + "conquest_order": "" + }, + { + "id": 660, + "identifier": "diggersby", + "generation_id": 6, + "evolves_from_species_id": 659, + "evolution_chain_id": 340, + "color_id": 3, + "shape_id": 6, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 127, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 661, + "conquest_order": "" + }, + { + "id": 661, + "identifier": "fletchling", + "generation_id": 6, + "evolves_from_species_id": "", + "evolution_chain_id": 341, + "color_id": 8, + "shape_id": 9, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 255, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 662, + "conquest_order": "" + }, + { + "id": 662, + "identifier": "fletchinder", + "generation_id": 6, + "evolves_from_species_id": 661, + "evolution_chain_id": 341, + "color_id": 8, + "shape_id": 9, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 120, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 663, + "conquest_order": "" + }, + { + "id": 663, + "identifier": "talonflame", + "generation_id": 6, + "evolves_from_species_id": 662, + "evolution_chain_id": 341, + "color_id": 8, + "shape_id": 9, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 664, + "conquest_order": "" + }, + { + "id": 664, + "identifier": "scatterbug", + "generation_id": 6, + "evolves_from_species_id": "", + "evolution_chain_id": 342, + "color_id": 1, + "shape_id": 14, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 255, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 665, + "conquest_order": "" + }, + { + "id": 665, + "identifier": "spewpa", + "generation_id": 6, + "evolves_from_species_id": 664, + "evolution_chain_id": 342, + "color_id": 1, + "shape_id": 5, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 120, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 666, + "conquest_order": "" + }, + { + "id": 666, + "identifier": "vivillon", + "generation_id": 6, + "evolves_from_species_id": 665, + "evolution_chain_id": 342, + "color_id": 9, + "shape_id": 13, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 1, + "order": 667, + "conquest_order": "" + }, + { + "id": 667, + "identifier": "litleo", + "generation_id": 6, + "evolves_from_species_id": "", + "evolution_chain_id": 343, + "color_id": 3, + "shape_id": 8, + "habitat_id": "", + "gender_rate": 7, + "capture_rate": 220, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 668, + "conquest_order": "" + }, + { + "id": 668, + "identifier": "pyroar", + "generation_id": 6, + "evolves_from_species_id": 667, + "evolution_chain_id": 343, + "color_id": 3, + "shape_id": 8, + "habitat_id": "", + "gender_rate": 7, + "capture_rate": 65, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 1, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 669, + "conquest_order": "" + }, + { + "id": 669, + "identifier": "flabebe", + "generation_id": 6, + "evolves_from_species_id": "", + "evolution_chain_id": 344, + "color_id": 9, + "shape_id": 4, + "habitat_id": "", + "gender_rate": 8, + "capture_rate": 225, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 670, + "conquest_order": "" + }, + { + "id": 670, + "identifier": "floette", + "generation_id": 6, + "evolves_from_species_id": 669, + "evolution_chain_id": 344, + "color_id": 9, + "shape_id": 4, + "habitat_id": "", + "gender_rate": 8, + "capture_rate": 120, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 671, + "conquest_order": "" + }, + { + "id": 671, + "identifier": "florges", + "generation_id": 6, + "evolves_from_species_id": 670, + "evolution_chain_id": 344, + "color_id": 9, + "shape_id": 4, + "habitat_id": "", + "gender_rate": 8, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 672, + "conquest_order": "" + }, + { + "id": 672, + "identifier": "skiddo", + "generation_id": 6, + "evolves_from_species_id": "", + "evolution_chain_id": 345, + "color_id": 3, + "shape_id": 8, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 200, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 673, + "conquest_order": "" + }, + { + "id": 673, + "identifier": "gogoat", + "generation_id": 6, + "evolves_from_species_id": 672, + "evolution_chain_id": 345, + "color_id": 3, + "shape_id": 8, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 674, + "conquest_order": "" + }, + { + "id": 674, + "identifier": "pancham", + "generation_id": 6, + "evolves_from_species_id": "", + "evolution_chain_id": 346, + "color_id": 9, + "shape_id": 6, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 220, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 25, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 675, + "conquest_order": "" + }, + { + "id": 675, + "identifier": "pangoro", + "generation_id": 6, + "evolves_from_species_id": 674, + "evolution_chain_id": 346, + "color_id": 9, + "shape_id": 12, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 65, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 25, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 676, + "conquest_order": "" + }, + { + "id": 676, + "identifier": "furfrou", + "generation_id": 6, + "evolves_from_species_id": "", + "evolution_chain_id": 347, + "color_id": 9, + "shape_id": 8, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 160, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 1, + "order": 677, + "conquest_order": "" + }, + { + "id": 677, + "identifier": "espurr", + "generation_id": 6, + "evolves_from_species_id": "", + "evolution_chain_id": 348, + "color_id": 4, + "shape_id": 6, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 190, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 678, + "conquest_order": "" + }, + { + "id": 678, + "identifier": "meowstic", + "generation_id": 6, + "evolves_from_species_id": 677, + "evolution_chain_id": 348, + "color_id": 2, + "shape_id": 6, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 75, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 1, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 679, + "conquest_order": "" + }, + { + "id": 679, + "identifier": "honedge", + "generation_id": 6, + "evolves_from_species_id": "", + "evolution_chain_id": 349, + "color_id": 3, + "shape_id": 5, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 180, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 680, + "conquest_order": "" + }, + { + "id": 680, + "identifier": "doublade", + "generation_id": 6, + "evolves_from_species_id": 679, + "evolution_chain_id": 349, + "color_id": 3, + "shape_id": 11, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 90, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 681, + "conquest_order": "" + }, + { + "id": 681, + "identifier": "aegislash", + "generation_id": 6, + "evolves_from_species_id": 680, + "evolution_chain_id": 349, + "color_id": 3, + "shape_id": 5, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 1, + "order": 682, + "conquest_order": "" + }, + { + "id": 682, + "identifier": "spritzee", + "generation_id": 6, + "evolves_from_species_id": "", + "evolution_chain_id": 350, + "color_id": 6, + "shape_id": 4, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 200, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 683, + "conquest_order": "" + }, + { + "id": 683, + "identifier": "aromatisse", + "generation_id": 6, + "evolves_from_species_id": 682, + "evolution_chain_id": 350, + "color_id": 6, + "shape_id": 12, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 140, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 684, + "conquest_order": "" + }, + { + "id": 684, + "identifier": "swirlix", + "generation_id": 6, + "evolves_from_species_id": "", + "evolution_chain_id": 351, + "color_id": 9, + "shape_id": 7, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 200, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 685, + "conquest_order": "" + }, + { + "id": 685, + "identifier": "slurpuff", + "generation_id": 6, + "evolves_from_species_id": 684, + "evolution_chain_id": 351, + "color_id": 9, + "shape_id": 12, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 140, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 686, + "conquest_order": "" + }, + { + "id": 686, + "identifier": "inkay", + "generation_id": 6, + "evolves_from_species_id": "", + "evolution_chain_id": 352, + "color_id": 2, + "shape_id": 10, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 190, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 687, + "conquest_order": "" + }, + { + "id": 687, + "identifier": "malamar", + "generation_id": 6, + "evolves_from_species_id": 686, + "evolution_chain_id": 352, + "color_id": 2, + "shape_id": 5, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 80, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 688, + "conquest_order": "" + }, + { + "id": 688, + "identifier": "binacle", + "generation_id": 6, + "evolves_from_species_id": "", + "evolution_chain_id": 353, + "color_id": 3, + "shape_id": 11, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 120, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 689, + "conquest_order": "" + }, + { + "id": 689, + "identifier": "barbaracle", + "generation_id": 6, + "evolves_from_species_id": 688, + "evolution_chain_id": 353, + "color_id": 3, + "shape_id": 11, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 690, + "conquest_order": "" + }, + { + "id": 690, + "identifier": "skrelp", + "generation_id": 6, + "evolves_from_species_id": "", + "evolution_chain_id": 354, + "color_id": 3, + "shape_id": 5, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 225, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 691, + "conquest_order": "" + }, + { + "id": 691, + "identifier": "dragalge", + "generation_id": 6, + "evolves_from_species_id": 690, + "evolution_chain_id": 354, + "color_id": 3, + "shape_id": 5, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 55, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 692, + "conquest_order": "" + }, + { + "id": 692, + "identifier": "clauncher", + "generation_id": 6, + "evolves_from_species_id": "", + "evolution_chain_id": 355, + "color_id": 2, + "shape_id": 14, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 225, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 693, + "conquest_order": "" + }, + { + "id": 693, + "identifier": "clawitzer", + "generation_id": 6, + "evolves_from_species_id": 692, + "evolution_chain_id": 355, + "color_id": 2, + "shape_id": 2, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 55, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 694, + "conquest_order": "" + }, + { + "id": 694, + "identifier": "helioptile", + "generation_id": 6, + "evolves_from_species_id": "", + "evolution_chain_id": 356, + "color_id": 10, + "shape_id": 6, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 190, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 695, + "conquest_order": "" + }, + { + "id": 695, + "identifier": "heliolisk", + "generation_id": 6, + "evolves_from_species_id": 694, + "evolution_chain_id": 356, + "color_id": 10, + "shape_id": 6, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 75, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 696, + "conquest_order": "" + }, + { + "id": 696, + "identifier": "tyrunt", + "generation_id": 6, + "evolves_from_species_id": "", + "evolution_chain_id": 357, + "color_id": 3, + "shape_id": 6, + "habitat_id": "", + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 30, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 697, + "conquest_order": "" + }, + { + "id": 697, + "identifier": "tyrantrum", + "generation_id": 6, + "evolves_from_species_id": 696, + "evolution_chain_id": 357, + "color_id": 8, + "shape_id": 6, + "habitat_id": "", + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 30, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 698, + "conquest_order": "" + }, + { + "id": 698, + "identifier": "amaura", + "generation_id": 6, + "evolves_from_species_id": "", + "evolution_chain_id": 358, + "color_id": 2, + "shape_id": 8, + "habitat_id": "", + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 30, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 699, + "conquest_order": "" + }, + { + "id": 699, + "identifier": "aurorus", + "generation_id": 6, + "evolves_from_species_id": 698, + "evolution_chain_id": 358, + "color_id": 2, + "shape_id": 8, + "habitat_id": "", + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 30, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 700, + "conquest_order": "" + }, + { + "id": 700, + "identifier": "sylveon", + "generation_id": 6, + "evolves_from_species_id": 133, + "evolution_chain_id": 67, + "color_id": 6, + "shape_id": 8, + "habitat_id": "", + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 35, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 165, + "conquest_order": "" + }, + { + "id": 701, + "identifier": "hawlucha", + "generation_id": 6, + "evolves_from_species_id": "", + "evolution_chain_id": 359, + "color_id": 5, + "shape_id": 12, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 100, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 701, + "conquest_order": "" + }, + { + "id": 702, + "identifier": "dedenne", + "generation_id": 6, + "evolves_from_species_id": "", + "evolution_chain_id": 360, + "color_id": 10, + "shape_id": 6, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 180, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 702, + "conquest_order": "" + }, + { + "id": 703, + "identifier": "carbink", + "generation_id": 6, + "evolves_from_species_id": "", + "evolution_chain_id": 361, + "color_id": 4, + "shape_id": 1, + "habitat_id": "", + "gender_rate": -1, + "capture_rate": 60, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 25, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 703, + "conquest_order": "" + }, + { + "id": 704, + "identifier": "goomy", + "generation_id": 6, + "evolves_from_species_id": "", + "evolution_chain_id": 362, + "color_id": 7, + "shape_id": 2, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 35, + "is_baby": 0, + "hatch_counter": 40, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 704, + "conquest_order": "" + }, + { + "id": 705, + "identifier": "sliggoo", + "generation_id": 6, + "evolves_from_species_id": 704, + "evolution_chain_id": 362, + "color_id": 7, + "shape_id": 2, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 35, + "is_baby": 0, + "hatch_counter": 40, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 705, + "conquest_order": "" + }, + { + "id": 706, + "identifier": "goodra", + "generation_id": 6, + "evolves_from_species_id": 705, + "evolution_chain_id": 362, + "color_id": 7, + "shape_id": 6, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 35, + "is_baby": 0, + "hatch_counter": 40, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 706, + "conquest_order": "" + }, + { + "id": 707, + "identifier": "klefki", + "generation_id": 6, + "evolves_from_species_id": "", + "evolution_chain_id": 363, + "color_id": 4, + "shape_id": 1, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 75, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 3, + "forms_switchable": 0, + "order": 707, + "conquest_order": "" + }, + { + "id": 708, + "identifier": "phantump", + "generation_id": 6, + "evolves_from_species_id": "", + "evolution_chain_id": 364, + "color_id": 3, + "shape_id": 4, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 120, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 708, + "conquest_order": "" + }, + { + "id": 709, + "identifier": "trevenant", + "generation_id": 6, + "evolves_from_species_id": 708, + "evolution_chain_id": 364, + "color_id": 3, + "shape_id": 10, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 60, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 709, + "conquest_order": "" + }, + { + "id": 710, + "identifier": "pumpkaboo", + "generation_id": 6, + "evolves_from_species_id": "", + "evolution_chain_id": 365, + "color_id": 3, + "shape_id": 1, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 120, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 710, + "conquest_order": "" + }, + { + "id": 711, + "identifier": "gourgeist", + "generation_id": 6, + "evolves_from_species_id": 710, + "evolution_chain_id": 365, + "color_id": 3, + "shape_id": 5, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 60, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 711, + "conquest_order": "" + }, + { + "id": 712, + "identifier": "bergmite", + "generation_id": 6, + "evolves_from_species_id": "", + "evolution_chain_id": 366, + "color_id": 2, + "shape_id": 8, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 190, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 712, + "conquest_order": "" + }, + { + "id": 713, + "identifier": "avalugg", + "generation_id": 6, + "evolves_from_species_id": 712, + "evolution_chain_id": 366, + "color_id": 2, + "shape_id": 8, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 55, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 713, + "conquest_order": "" + }, + { + "id": 714, + "identifier": "noibat", + "generation_id": 6, + "evolves_from_species_id": "", + "evolution_chain_id": 367, + "color_id": 7, + "shape_id": 9, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 190, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 714, + "conquest_order": "" + }, + { + "id": 715, + "identifier": "noivern", + "generation_id": 6, + "evolves_from_species_id": 714, + "evolution_chain_id": 367, + "color_id": 7, + "shape_id": 9, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 715, + "conquest_order": "" + }, + { + "id": 716, + "identifier": "xerneas", + "generation_id": 6, + "evolves_from_species_id": "", + "evolution_chain_id": 368, + "color_id": 2, + "shape_id": 8, + "habitat_id": "", + "gender_rate": -1, + "capture_rate": 45, + "base_happiness": 0, + "is_baby": 0, + "hatch_counter": 120, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 1, + "order": 716, + "conquest_order": "" + }, + { + "id": 717, + "identifier": "yveltal", + "generation_id": 6, + "evolves_from_species_id": "", + "evolution_chain_id": 369, + "color_id": 8, + "shape_id": 9, + "habitat_id": "", + "gender_rate": -1, + "capture_rate": 45, + "base_happiness": 0, + "is_baby": 0, + "hatch_counter": 120, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 717, + "conquest_order": "" + }, + { + "id": 718, + "identifier": "zygarde", + "generation_id": 6, + "evolves_from_species_id": "", + "evolution_chain_id": 370, + "color_id": 5, + "shape_id": 2, + "habitat_id": "", + "gender_rate": -1, + "capture_rate": 3, + "base_happiness": 0, + "is_baby": 0, + "hatch_counter": 120, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 718, + "conquest_order": "" + }, + { + "id": 719, + "identifier": "diancie", + "generation_id": 6, + "evolves_from_species_id": "", + "evolution_chain_id": 371, + "color_id": 6, + "shape_id": 4, + "habitat_id": "", + "gender_rate": -1, + "capture_rate": 3, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 25, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 1, + "order": 719, + "conquest_order": "" + }, + { + "id": 720, + "identifier": "hoopa", + "generation_id": 6, + "evolves_from_species_id": "", + "evolution_chain_id": 372, + "color_id": 7, + "shape_id": 4, + "habitat_id": "", + "gender_rate": -1, + "capture_rate": 3, + "base_happiness": 100, + "is_baby": 0, + "hatch_counter": 120, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 720, + "conquest_order": "" + }, + { + "id": 721, + "identifier": "volcanion", + "generation_id": 6, + "evolves_from_species_id": "", + "evolution_chain_id": 373, + "color_id": 3, + "shape_id": 8, + "habitat_id": "", + "gender_rate": -1, + "capture_rate": 3, + "base_happiness": 100, + "is_baby": 0, + "hatch_counter": 120, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 721, + "conquest_order": "" + }, + { + "id": 722, + "identifier": "rowlet", + "generation_id": 7, + "evolves_from_species_id": "", + "evolution_chain_id": 374, + "color_id": 3, + "shape_id": 9, + "habitat_id": "", + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 722, + "conquest_order": "" + }, + { + "id": 723, + "identifier": "dartrix", + "generation_id": 7, + "evolves_from_species_id": 722, + "evolution_chain_id": 374, + "color_id": 3, + "shape_id": 9, + "habitat_id": "", + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 723, + "conquest_order": "" + }, + { + "id": 724, + "identifier": "decidueye", + "generation_id": 7, + "evolves_from_species_id": 723, + "evolution_chain_id": 374, + "color_id": 3, + "shape_id": 9, + "habitat_id": "", + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 724, + "conquest_order": "" + }, + { + "id": 725, + "identifier": "litten", + "generation_id": 7, + "evolves_from_species_id": "", + "evolution_chain_id": 375, + "color_id": 8, + "shape_id": 8, + "habitat_id": "", + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 725, + "conquest_order": "" + }, + { + "id": 726, + "identifier": "torracat", + "generation_id": 7, + "evolves_from_species_id": 725, + "evolution_chain_id": 375, + "color_id": 8, + "shape_id": 8, + "habitat_id": "", + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 726, + "conquest_order": "" + }, + { + "id": 727, + "identifier": "incineroar", + "generation_id": 7, + "evolves_from_species_id": 726, + "evolution_chain_id": 375, + "color_id": 8, + "shape_id": 6, + "habitat_id": "", + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 727, + "conquest_order": "" + }, + { + "id": 728, + "identifier": "popplio", + "generation_id": 7, + "evolves_from_species_id": "", + "evolution_chain_id": 376, + "color_id": 2, + "shape_id": 3, + "habitat_id": "", + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 728, + "conquest_order": "" + }, + { + "id": 729, + "identifier": "brionne", + "generation_id": 7, + "evolves_from_species_id": 728, + "evolution_chain_id": 376, + "color_id": 2, + "shape_id": 3, + "habitat_id": "", + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 729, + "conquest_order": "" + }, + { + "id": 730, + "identifier": "primarina", + "generation_id": 7, + "evolves_from_species_id": 729, + "evolution_chain_id": 376, + "color_id": 2, + "shape_id": 3, + "habitat_id": "", + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 730, + "conquest_order": "" + }, + { + "id": 731, + "identifier": "pikipek", + "generation_id": 7, + "evolves_from_species_id": "", + "evolution_chain_id": 377, + "color_id": 1, + "shape_id": 9, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 255, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 731, + "conquest_order": "" + }, + { + "id": 732, + "identifier": "trumbeak", + "generation_id": 7, + "evolves_from_species_id": 731, + "evolution_chain_id": 377, + "color_id": 1, + "shape_id": 9, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 120, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 732, + "conquest_order": "" + }, + { + "id": 733, + "identifier": "toucannon", + "generation_id": 7, + "evolves_from_species_id": 732, + "evolution_chain_id": 377, + "color_id": 1, + "shape_id": 9, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 733, + "conquest_order": "" + }, + { + "id": 734, + "identifier": "yungoos", + "generation_id": 7, + "evolves_from_species_id": "", + "evolution_chain_id": 378, + "color_id": 3, + "shape_id": 8, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 255, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 734, + "conquest_order": "" + }, + { + "id": 735, + "identifier": "gumshoos", + "generation_id": 7, + "evolves_from_species_id": 734, + "evolution_chain_id": 378, + "color_id": 3, + "shape_id": 8, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 127, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 735, + "conquest_order": "" + }, + { + "id": 736, + "identifier": "grubbin", + "generation_id": 7, + "evolves_from_species_id": "", + "evolution_chain_id": 379, + "color_id": 4, + "shape_id": 14, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 255, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 736, + "conquest_order": "" + }, + { + "id": 737, + "identifier": "charjabug", + "generation_id": 7, + "evolves_from_species_id": 736, + "evolution_chain_id": 379, + "color_id": 5, + "shape_id": 2, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 120, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 737, + "conquest_order": "" + }, + { + "id": 738, + "identifier": "vikavolt", + "generation_id": 7, + "evolves_from_species_id": 737, + "evolution_chain_id": 379, + "color_id": 2, + "shape_id": 14, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 738, + "conquest_order": "" + }, + { + "id": 739, + "identifier": "crabrawler", + "generation_id": 7, + "evolves_from_species_id": "", + "evolution_chain_id": 380, + "color_id": 7, + "shape_id": 14, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 225, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 739, + "conquest_order": "" + }, + { + "id": 740, + "identifier": "crabominable", + "generation_id": 7, + "evolves_from_species_id": 739, + "evolution_chain_id": 380, + "color_id": 9, + "shape_id": 14, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 60, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 740, + "conquest_order": "" + }, + { + "id": 741, + "identifier": "oricorio", + "generation_id": 7, + "evolves_from_species_id": "", + "evolution_chain_id": 381, + "color_id": 8, + "shape_id": 9, + "habitat_id": "", + "gender_rate": 6, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 741, + "conquest_order": "" + }, + { + "id": 742, + "identifier": "cutiefly", + "generation_id": 7, + "evolves_from_species_id": "", + "evolution_chain_id": 382, + "color_id": 10, + "shape_id": 14, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 190, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 742, + "conquest_order": "" + }, + { + "id": 743, + "identifier": "ribombee", + "generation_id": 7, + "evolves_from_species_id": 742, + "evolution_chain_id": 382, + "color_id": 10, + "shape_id": 13, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 75, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 743, + "conquest_order": "" + }, + { + "id": 744, + "identifier": "rockruff", + "generation_id": 7, + "evolves_from_species_id": "", + "evolution_chain_id": 383, + "color_id": 3, + "shape_id": 8, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 190, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 744, + "conquest_order": "" + }, + { + "id": 745, + "identifier": "lycanroc", + "generation_id": 7, + "evolves_from_species_id": 744, + "evolution_chain_id": 383, + "color_id": 3, + "shape_id": 8, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 90, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 745, + "conquest_order": "" + }, + { + "id": 746, + "identifier": "wishiwashi", + "generation_id": 7, + "evolves_from_species_id": "", + "evolution_chain_id": 384, + "color_id": 2, + "shape_id": 3, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 60, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 3, + "forms_switchable": 0, + "order": 746, + "conquest_order": "" + }, + { + "id": 747, + "identifier": "mareanie", + "generation_id": 7, + "evolves_from_species_id": "", + "evolution_chain_id": 385, + "color_id": 2, + "shape_id": 5, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 190, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 747, + "conquest_order": "" + }, + { + "id": 748, + "identifier": "toxapex", + "generation_id": 7, + "evolves_from_species_id": 747, + "evolution_chain_id": 385, + "color_id": 2, + "shape_id": 10, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 75, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 748, + "conquest_order": "" + }, + { + "id": 749, + "identifier": "mudbray", + "generation_id": 7, + "evolves_from_species_id": "", + "evolution_chain_id": 386, + "color_id": 3, + "shape_id": 8, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 190, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 749, + "conquest_order": "" + }, + { + "id": 750, + "identifier": "mudsdale", + "generation_id": 7, + "evolves_from_species_id": 749, + "evolution_chain_id": 386, + "color_id": 3, + "shape_id": 8, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 60, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 750, + "conquest_order": "" + }, + { + "id": 751, + "identifier": "dewpider", + "generation_id": 7, + "evolves_from_species_id": "", + "evolution_chain_id": 387, + "color_id": 5, + "shape_id": 7, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 200, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 751, + "conquest_order": "" + }, + { + "id": 752, + "identifier": "araquanid", + "generation_id": 7, + "evolves_from_species_id": 751, + "evolution_chain_id": 387, + "color_id": 5, + "shape_id": 14, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 100, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 752, + "conquest_order": "" + }, + { + "id": 753, + "identifier": "fomantis", + "generation_id": 7, + "evolves_from_species_id": "", + "evolution_chain_id": 388, + "color_id": 6, + "shape_id": 6, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 190, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 753, + "conquest_order": "" + }, + { + "id": 754, + "identifier": "lurantis", + "generation_id": 7, + "evolves_from_species_id": 753, + "evolution_chain_id": 388, + "color_id": 6, + "shape_id": 12, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 75, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 754, + "conquest_order": "" + }, + { + "id": 755, + "identifier": "morelull", + "generation_id": 7, + "evolves_from_species_id": "", + "evolution_chain_id": 389, + "color_id": 7, + "shape_id": 5, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 190, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 755, + "conquest_order": "" + }, + { + "id": 756, + "identifier": "shiinotic", + "generation_id": 7, + "evolves_from_species_id": 755, + "evolution_chain_id": 389, + "color_id": 7, + "shape_id": 12, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 75, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 756, + "conquest_order": "" + }, + { + "id": 757, + "identifier": "salandit", + "generation_id": 7, + "evolves_from_species_id": "", + "evolution_chain_id": 390, + "color_id": 1, + "shape_id": 8, + "habitat_id": "", + "gender_rate": 1, + "capture_rate": 120, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 757, + "conquest_order": "" + }, + { + "id": 758, + "identifier": "salazzle", + "generation_id": 7, + "evolves_from_species_id": 757, + "evolution_chain_id": 390, + "color_id": 1, + "shape_id": 8, + "habitat_id": "", + "gender_rate": 8, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 758, + "conquest_order": "" + }, + { + "id": 759, + "identifier": "stufful", + "generation_id": 7, + "evolves_from_species_id": "", + "evolution_chain_id": 391, + "color_id": 6, + "shape_id": 8, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 140, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 759, + "conquest_order": "" + }, + { + "id": 760, + "identifier": "bewear", + "generation_id": 7, + "evolves_from_species_id": 759, + "evolution_chain_id": 391, + "color_id": 6, + "shape_id": 6, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 70, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 760, + "conquest_order": "" + }, + { + "id": 761, + "identifier": "bounsweet", + "generation_id": 7, + "evolves_from_species_id": "", + "evolution_chain_id": 392, + "color_id": 7, + "shape_id": 7, + "habitat_id": "", + "gender_rate": 8, + "capture_rate": 235, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 761, + "conquest_order": "" + }, + { + "id": 762, + "identifier": "steenee", + "generation_id": 7, + "evolves_from_species_id": 761, + "evolution_chain_id": 392, + "color_id": 7, + "shape_id": 12, + "habitat_id": "", + "gender_rate": 8, + "capture_rate": 120, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 762, + "conquest_order": "" + }, + { + "id": 763, + "identifier": "tsareena", + "generation_id": 7, + "evolves_from_species_id": 762, + "evolution_chain_id": 392, + "color_id": 7, + "shape_id": 12, + "habitat_id": "", + "gender_rate": 8, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 763, + "conquest_order": "" + }, + { + "id": 764, + "identifier": "comfey", + "generation_id": 7, + "evolves_from_species_id": "", + "evolution_chain_id": 393, + "color_id": 5, + "shape_id": 1, + "habitat_id": "", + "gender_rate": 6, + "capture_rate": 60, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 3, + "forms_switchable": 0, + "order": 764, + "conquest_order": "" + }, + { + "id": 765, + "identifier": "oranguru", + "generation_id": 7, + "evolves_from_species_id": "", + "evolution_chain_id": 394, + "color_id": 9, + "shape_id": 12, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 765, + "conquest_order": "" + }, + { + "id": 766, + "identifier": "passimian", + "generation_id": 7, + "evolves_from_species_id": "", + "evolution_chain_id": 395, + "color_id": 9, + "shape_id": 6, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 766, + "conquest_order": "" + }, + { + "id": 767, + "identifier": "wimpod", + "generation_id": 7, + "evolves_from_species_id": "", + "evolution_chain_id": 396, + "color_id": 4, + "shape_id": 10, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 90, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 767, + "conquest_order": "" + }, + { + "id": 768, + "identifier": "golisopod", + "generation_id": 7, + "evolves_from_species_id": 767, + "evolution_chain_id": 396, + "color_id": 4, + "shape_id": 12, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 768, + "conquest_order": "" + }, + { + "id": 769, + "identifier": "sandygast", + "generation_id": 7, + "evolves_from_species_id": "", + "evolution_chain_id": 397, + "color_id": 3, + "shape_id": 2, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 140, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 769, + "conquest_order": "" + }, + { + "id": 770, + "identifier": "palossand", + "generation_id": 7, + "evolves_from_species_id": 769, + "evolution_chain_id": 397, + "color_id": 3, + "shape_id": 2, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 60, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 770, + "conquest_order": "" + }, + { + "id": 771, + "identifier": "pyukumuku", + "generation_id": 7, + "evolves_from_species_id": "", + "evolution_chain_id": 398, + "color_id": 1, + "shape_id": 2, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 60, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 3, + "forms_switchable": 0, + "order": 771, + "conquest_order": "" + }, + { + "id": 772, + "identifier": "type-null", + "generation_id": 7, + "evolves_from_species_id": "", + "evolution_chain_id": 399, + "color_id": 4, + "shape_id": 8, + "habitat_id": "", + "gender_rate": -1, + "capture_rate": 3, + "base_happiness": 0, + "is_baby": 0, + "hatch_counter": 120, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 772, + "conquest_order": "" + }, + { + "id": 773, + "identifier": "silvally", + "generation_id": 7, + "evolves_from_species_id": 772, + "evolution_chain_id": 399, + "color_id": 4, + "shape_id": 8, + "habitat_id": "", + "gender_rate": -1, + "capture_rate": 3, + "base_happiness": 0, + "is_baby": 0, + "hatch_counter": 120, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 773, + "conquest_order": "" + }, + { + "id": 774, + "identifier": "minior", + "generation_id": 7, + "evolves_from_species_id": "", + "evolution_chain_id": 400, + "color_id": 3, + "shape_id": 1, + "habitat_id": "", + "gender_rate": -1, + "capture_rate": 30, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 25, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 774, + "conquest_order": "" + }, + { + "id": 775, + "identifier": "komala", + "generation_id": 7, + "evolves_from_species_id": "", + "evolution_chain_id": 401, + "color_id": 2, + "shape_id": 12, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 775, + "conquest_order": "" + }, + { + "id": 776, + "identifier": "turtonator", + "generation_id": 7, + "evolves_from_species_id": "", + "evolution_chain_id": 402, + "color_id": 8, + "shape_id": 6, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 70, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 776, + "conquest_order": "" + }, + { + "id": 777, + "identifier": "togedemaru", + "generation_id": 7, + "evolves_from_species_id": "", + "evolution_chain_id": 403, + "color_id": 4, + "shape_id": 6, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 180, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 10, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 777, + "conquest_order": "" + }, + { + "id": 778, + "identifier": "mimikyu", + "generation_id": 7, + "evolves_from_species_id": "", + "evolution_chain_id": 404, + "color_id": 10, + "shape_id": 2, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 1, + "order": 778, + "conquest_order": "" + }, + { + "id": 779, + "identifier": "bruxish", + "generation_id": 7, + "evolves_from_species_id": "", + "evolution_chain_id": 405, + "color_id": 6, + "shape_id": 3, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 80, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 779, + "conquest_order": "" + }, + { + "id": 780, + "identifier": "drampa", + "generation_id": 7, + "evolves_from_species_id": "", + "evolution_chain_id": 406, + "color_id": 9, + "shape_id": 2, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 70, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 780, + "conquest_order": "" + }, + { + "id": 781, + "identifier": "dhelmise", + "generation_id": 7, + "evolves_from_species_id": "", + "evolution_chain_id": 407, + "color_id": 5, + "shape_id": 5, + "habitat_id": "", + "gender_rate": -1, + "capture_rate": 25, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 25, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 781, + "conquest_order": "" + }, + { + "id": 782, + "identifier": "jangmo-o", + "generation_id": 7, + "evolves_from_species_id": "", + "evolution_chain_id": 408, + "color_id": 4, + "shape_id": 8, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 40, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 782, + "conquest_order": "" + }, + { + "id": 783, + "identifier": "hakamo-o", + "generation_id": 7, + "evolves_from_species_id": 782, + "evolution_chain_id": 408, + "color_id": 4, + "shape_id": 6, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 40, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 783, + "conquest_order": "" + }, + { + "id": 784, + "identifier": "kommo-o", + "generation_id": 7, + "evolves_from_species_id": 783, + "evolution_chain_id": 408, + "color_id": 4, + "shape_id": 6, + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 40, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 784, + "conquest_order": "" + }, + { + "id": 785, + "identifier": "tapu-koko", + "generation_id": 7, + "evolves_from_species_id": "", + "evolution_chain_id": 409, + "color_id": 10, + "shape_id": 4, + "habitat_id": "", + "gender_rate": -1, + "capture_rate": 3, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 785, + "conquest_order": "" + }, + { + "id": 786, + "identifier": "tapu-lele", + "generation_id": 7, + "evolves_from_species_id": "", + "evolution_chain_id": 410, + "color_id": 6, + "shape_id": 4, + "habitat_id": "", + "gender_rate": -1, + "capture_rate": 3, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 786, + "conquest_order": "" + }, + { + "id": 787, + "identifier": "tapu-bulu", + "generation_id": 7, + "evolves_from_species_id": "", + "evolution_chain_id": 411, + "color_id": 8, + "shape_id": 4, + "habitat_id": "", + "gender_rate": -1, + "capture_rate": 3, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 787, + "conquest_order": "" + }, + { + "id": 788, + "identifier": "tapu-fini", + "generation_id": 7, + "evolves_from_species_id": "", + "evolution_chain_id": 412, + "color_id": 7, + "shape_id": 4, + "habitat_id": "", + "gender_rate": -1, + "capture_rate": 3, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 788, + "conquest_order": "" + }, + { + "id": 789, + "identifier": "cosmog", + "generation_id": 7, + "evolves_from_species_id": "", + "evolution_chain_id": 413, + "color_id": 2, + "shape_id": 1, + "habitat_id": "", + "gender_rate": -1, + "capture_rate": 45, + "base_happiness": 0, + "is_baby": 0, + "hatch_counter": 120, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 789, + "conquest_order": "" + }, + { + "id": 790, + "identifier": "cosmoem", + "generation_id": 7, + "evolves_from_species_id": 789, + "evolution_chain_id": 413, + "color_id": 2, + "shape_id": 1, + "habitat_id": "", + "gender_rate": -1, + "capture_rate": 45, + "base_happiness": 0, + "is_baby": 0, + "hatch_counter": 120, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 790, + "conquest_order": "" + }, + { + "id": 791, + "identifier": "solgaleo", + "generation_id": 7, + "evolves_from_species_id": 790, + "evolution_chain_id": 413, + "color_id": 9, + "shape_id": 8, + "habitat_id": "", + "gender_rate": -1, + "capture_rate": 45, + "base_happiness": 0, + "is_baby": 0, + "hatch_counter": 120, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 791, + "conquest_order": "" + }, + { + "id": 792, + "identifier": "lunala", + "generation_id": 7, + "evolves_from_species_id": 790, + "evolution_chain_id": 413, + "color_id": 7, + "shape_id": 9, + "habitat_id": "", + "gender_rate": -1, + "capture_rate": 45, + "base_happiness": 0, + "is_baby": 0, + "hatch_counter": 120, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 792, + "conquest_order": "" + }, + { + "id": 793, + "identifier": "nihilego", + "generation_id": 7, + "evolves_from_species_id": "", + "evolution_chain_id": 414, + "color_id": 9, + "shape_id": 10, + "habitat_id": "", + "gender_rate": -1, + "capture_rate": 45, + "base_happiness": 0, + "is_baby": 0, + "hatch_counter": 120, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 793, + "conquest_order": "" + }, + { + "id": 794, + "identifier": "buzzwole", + "generation_id": 7, + "evolves_from_species_id": "", + "evolution_chain_id": 415, + "color_id": 8, + "shape_id": 10, + "habitat_id": "", + "gender_rate": -1, + "capture_rate": 45, + "base_happiness": 0, + "is_baby": 0, + "hatch_counter": 120, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 794, + "conquest_order": "" + }, + { + "id": 795, + "identifier": "pheromosa", + "generation_id": 7, + "evolves_from_species_id": "", + "evolution_chain_id": 416, + "color_id": 9, + "shape_id": 12, + "habitat_id": "", + "gender_rate": -1, + "capture_rate": 45, + "base_happiness": 0, + "is_baby": 0, + "hatch_counter": 120, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 795, + "conquest_order": "" + }, + { + "id": 796, + "identifier": "xurkitree", + "generation_id": 7, + "evolves_from_species_id": "", + "evolution_chain_id": 417, + "color_id": 1, + "shape_id": 6, + "habitat_id": "", + "gender_rate": -1, + "capture_rate": 45, + "base_happiness": 0, + "is_baby": 0, + "hatch_counter": 120, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 796, + "conquest_order": "" + }, + { + "id": 797, + "identifier": "celesteela", + "generation_id": 7, + "evolves_from_species_id": "", + "evolution_chain_id": 418, + "color_id": 5, + "shape_id": 12, + "habitat_id": "", + "gender_rate": -1, + "capture_rate": 45, + "base_happiness": 0, + "is_baby": 0, + "hatch_counter": 120, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 797, + "conquest_order": "" + }, + { + "id": 798, + "identifier": "kartana", + "generation_id": 7, + "evolves_from_species_id": "", + "evolution_chain_id": 419, + "color_id": 9, + "shape_id": 12, + "habitat_id": "", + "gender_rate": -1, + "capture_rate": 45, + "base_happiness": 0, + "is_baby": 0, + "hatch_counter": 120, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 798, + "conquest_order": "" + }, + { + "id": 799, + "identifier": "guzzlord", + "generation_id": 7, + "evolves_from_species_id": "", + "evolution_chain_id": 420, + "color_id": 1, + "shape_id": 6, + "habitat_id": "", + "gender_rate": -1, + "capture_rate": 45, + "base_happiness": 0, + "is_baby": 0, + "hatch_counter": 120, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 799, + "conquest_order": "" + }, + { + "id": 800, + "identifier": "necrozma", + "generation_id": 7, + "evolves_from_species_id": "", + "evolution_chain_id": 421, + "color_id": 1, + "shape_id": 4, + "habitat_id": "", + "gender_rate": -1, + "capture_rate": 255, + "base_happiness": 0, + "is_baby": 0, + "hatch_counter": 120, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 800, + "conquest_order": "" + }, + { + "id": 801, + "identifier": "magearna", + "generation_id": 7, + "evolves_from_species_id": "", + "evolution_chain_id": 422, + "color_id": 4, + "shape_id": 12, + "habitat_id": "", + "gender_rate": -1, + "capture_rate": 3, + "base_happiness": 0, + "is_baby": 0, + "hatch_counter": 120, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 801, + "conquest_order": "" + }, + { + "id": 802, + "identifier": "marshadow", + "generation_id": 7, + "evolves_from_species_id": "", + "evolution_chain_id": 423, + "color_id": 4, + "shape_id": 12, + "habitat_id": "", + "gender_rate": -1, + "capture_rate": 3, + "base_happiness": 0, + "is_baby": 0, + "hatch_counter": 120, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 802, + "conquest_order": "" + }, + { + "id": 803, + "identifier": "poipole", + "generation_id": 7, + "evolves_from_species_id": "", + "evolution_chain_id": 424, + "color_id": 7, + "shape_id": 6, + "habitat_id": "", + "gender_rate": -1, + "capture_rate": 45, + "base_happiness": 0, + "is_baby": 0, + "hatch_counter": 120, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 803, + "conquest_order": "" + }, + { + "id": 804, + "identifier": "naganadel", + "generation_id": 7, + "evolves_from_species_id": 803, + "evolution_chain_id": 424, + "color_id": 7, + "shape_id": 9, + "habitat_id": "", + "gender_rate": -1, + "capture_rate": 45, + "base_happiness": 0, + "is_baby": 0, + "hatch_counter": 120, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 804, + "conquest_order": "" + }, + { + "id": 805, + "identifier": "stakataka", + "generation_id": 7, + "evolves_from_species_id": "", + "evolution_chain_id": 425, + "color_id": 4, + "shape_id": 8, + "habitat_id": "", + "gender_rate": -1, + "capture_rate": 30, + "base_happiness": 0, + "is_baby": 0, + "hatch_counter": 120, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 805, + "conquest_order": "" + }, + { + "id": 806, + "identifier": "blacephalon", + "generation_id": 7, + "evolves_from_species_id": "", + "evolution_chain_id": 426, + "color_id": 9, + "shape_id": 12, + "habitat_id": "", + "gender_rate": -1, + "capture_rate": 30, + "base_happiness": 0, + "is_baby": 0, + "hatch_counter": 120, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 806, + "conquest_order": "" + }, + { + "id": 807, + "identifier": "zeraora", + "generation_id": 7, + "evolves_from_species_id": "", + "evolution_chain_id": 427, + "color_id": 10, + "shape_id": 12, + "habitat_id": "", + "gender_rate": -1, + "capture_rate": 3, + "base_happiness": 0, + "is_baby": 0, + "hatch_counter": 120, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 807, + "conquest_order": "" + }, + { + "id": 808, + "identifier": "meltan", + "generation_id": 7, + "evolves_from_species_id": "", + "evolution_chain_id": 428, + "color_id": 2, + "shape_id": 1, + "habitat_id": "", + "gender_rate": -1, + "capture_rate": 45, + "base_happiness": 0, + "is_baby": 0, + "hatch_counter": 120, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 789, + "conquest_order": "" + }, + { + "id": 809, + "identifier": "melmetal", + "generation_id": 7, + "evolves_from_species_id": 808, + "evolution_chain_id": 428, + "color_id": 2, + "shape_id": 1, + "habitat_id": "", + "gender_rate": -1, + "capture_rate": 45, + "base_happiness": 0, + "is_baby": 0, + "hatch_counter": 120, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 790, + "conquest_order": "" + }, + { + "id": 810, + "identifier": "grookey", + "generation_id": 8, + "evolves_from_species_id": "", + "evolution_chain_id": 429, + "color_id": 5, + "shape_id": 5, + "habitat_id": 3, + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1, + "conquest_order": "" + }, + { + "id": 811, + "identifier": "thwackey", + "generation_id": 8, + "evolves_from_species_id": 810, + "evolution_chain_id": 429, + "color_id": 5, + "shape_id": 5, + "habitat_id": 3, + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1, + "conquest_order": "" + }, + { + "id": 812, + "identifier": "rillaboom", + "generation_id": 8, + "evolves_from_species_id": 811, + "evolution_chain_id": 429, + "color_id": 5, + "shape_id": 5, + "habitat_id": 3, + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1, + "conquest_order": "" + }, + { + "id": 813, + "identifier": "scorbunny", + "generation_id": 8, + "evolves_from_species_id": "", + "evolution_chain_id": 430, + "color_id": 5, + "shape_id": 5, + "habitat_id": 3, + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1, + "conquest_order": "" + }, + { + "id": 814, + "identifier": "raboot", + "generation_id": 8, + "evolves_from_species_id": 813, + "evolution_chain_id": 430, + "color_id": 5, + "shape_id": 5, + "habitat_id": 3, + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1, + "conquest_order": "" + }, + { + "id": 815, + "identifier": "cinderace", + "generation_id": 8, + "evolves_from_species_id": 814, + "evolution_chain_id": 430, + "color_id": 5, + "shape_id": 5, + "habitat_id": 3, + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1, + "conquest_order": "" + }, + { + "id": 816, + "identifier": "sobble", + "generation_id": 8, + "evolves_from_species_id": "", + "evolution_chain_id": 431, + "color_id": 5, + "shape_id": 5, + "habitat_id": 3, + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1, + "conquest_order": "" + }, + { + "id": 817, + "identifier": "drizzile", + "generation_id": 8, + "evolves_from_species_id": 816, + "evolution_chain_id": 431, + "color_id": 5, + "shape_id": 5, + "habitat_id": 3, + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1, + "conquest_order": "" + }, + { + "id": 818, + "identifier": "inteleon", + "generation_id": 8, + "evolves_from_species_id": 817, + "evolution_chain_id": 431, + "color_id": 5, + "shape_id": 5, + "habitat_id": 3, + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1, + "conquest_order": "" + }, + { + "id": 819, + "identifier": "skwovet", + "generation_id": 8, + "evolves_from_species_id": "", + "evolution_chain_id": 434, + "color_id": 5, + "shape_id": 5, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 255, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1, + "conquest_order": "" + }, + { + "id": 820, + "identifier": "greedent", + "generation_id": 8, + "evolves_from_species_id": 819, + "evolution_chain_id": 434, + "color_id": 5, + "shape_id": 5, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 90, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1, + "conquest_order": "" + }, + { + "id": 821, + "identifier": "rookidee", + "generation_id": 8, + "evolves_from_species_id": "", + "evolution_chain_id": 433, + "color_id": 5, + "shape_id": 5, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 255, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1, + "conquest_order": "" + }, + { + "id": 822, + "identifier": "corvisquire", + "generation_id": 8, + "evolves_from_species_id": 821, + "evolution_chain_id": 433, + "color_id": 5, + "shape_id": 5, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 120, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1, + "conquest_order": "" + }, + { + "id": 823, + "identifier": "corviknight", + "generation_id": 8, + "evolves_from_species_id": 822, + "evolution_chain_id": 433, + "color_id": 5, + "shape_id": 5, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1, + "conquest_order": "" + }, + { + "id": 824, + "identifier": "blipbug", + "generation_id": 8, + "evolves_from_species_id": "", + "evolution_chain_id": 432, + "color_id": 5, + "shape_id": 5, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 255, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1, + "conquest_order": "" + }, + { + "id": 825, + "identifier": "dottler", + "generation_id": 8, + "evolves_from_species_id": 824, + "evolution_chain_id": 432, + "color_id": 5, + "shape_id": 5, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 120, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1, + "conquest_order": "" + }, + { + "id": 826, + "identifier": "orbeetle", + "generation_id": 8, + "evolves_from_species_id": 825, + "evolution_chain_id": 432, + "color_id": 5, + "shape_id": 5, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1, + "conquest_order": "" + }, + { + "id": 827, + "identifier": "nickit", + "generation_id": 8, + "evolves_from_species_id": "", + "evolution_chain_id": 435, + "color_id": 5, + "shape_id": 5, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 255, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1, + "conquest_order": "" + }, + { + "id": 828, + "identifier": "thievul", + "generation_id": 8, + "evolves_from_species_id": 827, + "evolution_chain_id": 435, + "color_id": 5, + "shape_id": 5, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 127, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1, + "conquest_order": "" + }, + { + "id": 829, + "identifier": "gossifleur", + "generation_id": 8, + "evolves_from_species_id": "", + "evolution_chain_id": 439, + "color_id": 5, + "shape_id": 5, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 190, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1, + "conquest_order": "" + }, + { + "id": 830, + "identifier": "eldegoss", + "generation_id": 8, + "evolves_from_species_id": 829, + "evolution_chain_id": 439, + "color_id": 5, + "shape_id": 5, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 75, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1, + "conquest_order": "" + }, + { + "id": 831, + "identifier": "wooloo", + "generation_id": 8, + "evolves_from_species_id": "", + "evolution_chain_id": 436, + "color_id": 5, + "shape_id": 5, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 255, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1, + "conquest_order": "" + }, + { + "id": 832, + "identifier": "dubwool", + "generation_id": 8, + "evolves_from_species_id": 831, + "evolution_chain_id": 436, + "color_id": 5, + "shape_id": 5, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 127, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1, + "conquest_order": "" + }, + { + "id": 833, + "identifier": "chewtle", + "generation_id": 8, + "evolves_from_species_id": "", + "evolution_chain_id": 437, + "color_id": 5, + "shape_id": 5, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 255, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1, + "conquest_order": "" + }, + { + "id": 834, + "identifier": "drednaw", + "generation_id": 8, + "evolves_from_species_id": 833, + "evolution_chain_id": 437, + "color_id": 5, + "shape_id": 5, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 75, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1, + "conquest_order": "" + }, + { + "id": 835, + "identifier": "yamper", + "generation_id": 8, + "evolves_from_species_id": "", + "evolution_chain_id": 438, + "color_id": 5, + "shape_id": 5, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 255, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1, + "conquest_order": "" + }, + { + "id": 836, + "identifier": "boltund", + "generation_id": 8, + "evolves_from_species_id": 835, + "evolution_chain_id": 438, + "color_id": 5, + "shape_id": 5, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1, + "conquest_order": "" + }, + { + "id": 837, + "identifier": "rolycoly", + "generation_id": 8, + "evolves_from_species_id": "", + "evolution_chain_id": 440, + "color_id": 5, + "shape_id": 5, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 255, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1, + "conquest_order": "" + }, + { + "id": 838, + "identifier": "carkol", + "generation_id": 8, + "evolves_from_species_id": 837, + "evolution_chain_id": 440, + "color_id": 5, + "shape_id": 5, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 120, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1, + "conquest_order": "" + }, + { + "id": 839, + "identifier": "coalossal", + "generation_id": 8, + "evolves_from_species_id": 838, + "evolution_chain_id": 440, + "color_id": 5, + "shape_id": 5, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1, + "conquest_order": "" + }, + { + "id": 840, + "identifier": "applin", + "generation_id": 8, + "evolves_from_species_id": "", + "evolution_chain_id": 443, + "color_id": 5, + "shape_id": 5, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 255, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1, + "conquest_order": "" + }, + { + "id": 841, + "identifier": "flapple", + "generation_id": 8, + "evolves_from_species_id": 840, + "evolution_chain_id": 443, + "color_id": 5, + "shape_id": 5, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1, + "conquest_order": "" + }, + { + "id": 842, + "identifier": "appletun", + "generation_id": 8, + "evolves_from_species_id": 840, + "evolution_chain_id": 443, + "color_id": 5, + "shape_id": 5, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1, + "conquest_order": "" + }, + { + "id": 843, + "identifier": "silicobra", + "generation_id": 8, + "evolves_from_species_id": "", + "evolution_chain_id": 448, + "color_id": 5, + "shape_id": 5, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 255, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1, + "conquest_order": "" + }, + { + "id": 844, + "identifier": "sandaconda", + "generation_id": 8, + "evolves_from_species_id": 843, + "evolution_chain_id": 448, + "color_id": 5, + "shape_id": 5, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 120, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1, + "conquest_order": "" + }, + { + "id": 845, + "identifier": "cramorant", + "generation_id": 8, + "evolves_from_species_id": "", + "evolution_chain_id": 1275, + "color_id": 5, + "shape_id": 5, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1, + "conquest_order": "" + }, + { + "id": 846, + "identifier": "arrokuda", + "generation_id": 8, + "evolves_from_species_id": "", + "evolution_chain_id": 441, + "color_id": 5, + "shape_id": 5, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 255, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1, + "conquest_order": "" + }, + { + "id": 847, + "identifier": "barraskewda", + "generation_id": 8, + "evolves_from_species_id": 846, + "evolution_chain_id": 441, + "color_id": 5, + "shape_id": 5, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 60, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1, + "conquest_order": "" + }, + { + "id": 848, + "identifier": "toxel", + "generation_id": 8, + "evolves_from_species_id": "", + "evolution_chain_id": 447, + "color_id": 5, + "shape_id": 5, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 75, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 25, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1, + "conquest_order": "" + }, + { + "id": 849, + "identifier": "toxtricity", + "generation_id": 8, + "evolves_from_species_id": 848, + "evolution_chain_id": 447, + "color_id": 5, + "shape_id": 5, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 25, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1, + "conquest_order": "" + }, + { + "id": 850, + "identifier": "sizzlipede", + "generation_id": 8, + "evolves_from_species_id": "", + "evolution_chain_id": 1905, + "color_id": 5, + "shape_id": 5, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 190, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1, + "conquest_order": "" + }, + { + "id": 851, + "identifier": "centiskorch", + "generation_id": 8, + "evolves_from_species_id": 850, + "evolution_chain_id": 1905, + "color_id": 5, + "shape_id": 5, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 75, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1, + "conquest_order": "" + }, + { + "id": 852, + "identifier": "clobbopus", + "generation_id": 8, + "evolves_from_species_id": "", + "evolution_chain_id": 450, + "color_id": 5, + "shape_id": 5, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 180, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 25, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1, + "conquest_order": "" + }, + { + "id": 853, + "identifier": "grapploct", + "generation_id": 8, + "evolves_from_species_id": 852, + "evolution_chain_id": 450, + "color_id": 5, + "shape_id": 5, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 25, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1, + "conquest_order": "" + }, + { + "id": 854, + "identifier": "sinistea", + "generation_id": 8, + "evolves_from_species_id": "", + "evolution_chain_id": 452, + "color_id": 5, + "shape_id": 5, + "habitat_id": 3, + "gender_rate": -1, + "capture_rate": 120, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1, + "conquest_order": "" + }, + { + "id": 855, + "identifier": "polteageist", + "generation_id": 8, + "evolves_from_species_id": 854, + "evolution_chain_id": 452, + "color_id": 5, + "shape_id": 5, + "habitat_id": 3, + "gender_rate": -1, + "capture_rate": 60, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1, + "conquest_order": "" + }, + { + "id": 856, + "identifier": "hatenna", + "generation_id": 8, + "evolves_from_species_id": "", + "evolution_chain_id": 445, + "color_id": 5, + "shape_id": 5, + "habitat_id": 3, + "gender_rate": 8, + "capture_rate": 235, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1, + "conquest_order": "" + }, + { + "id": 857, + "identifier": "hattrem", + "generation_id": 8, + "evolves_from_species_id": 856, + "evolution_chain_id": 445, + "color_id": 5, + "shape_id": 5, + "habitat_id": 3, + "gender_rate": 8, + "capture_rate": 120, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1, + "conquest_order": "" + }, + { + "id": 858, + "identifier": "hatterene", + "generation_id": 8, + "evolves_from_species_id": 857, + "evolution_chain_id": 445, + "color_id": 5, + "shape_id": 5, + "habitat_id": 3, + "gender_rate": 8, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1, + "conquest_order": "" + }, + { + "id": 859, + "identifier": "impidimp", + "generation_id": 8, + "evolves_from_species_id": "", + "evolution_chain_id": 444, + "color_id": 5, + "shape_id": 5, + "habitat_id": 3, + "gender_rate": 0, + "capture_rate": 255, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1, + "conquest_order": "" + }, + { + "id": 860, + "identifier": "morgrem", + "generation_id": 8, + "evolves_from_species_id": 859, + "evolution_chain_id": 444, + "color_id": 5, + "shape_id": 5, + "habitat_id": 3, + "gender_rate": 0, + "capture_rate": 120, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1, + "conquest_order": "" + }, + { + "id": 861, + "identifier": "grimmsnarl", + "generation_id": 8, + "evolves_from_species_id": 860, + "evolution_chain_id": 444, + "color_id": 5, + "shape_id": 5, + "habitat_id": 3, + "gender_rate": 0, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1, + "conquest_order": "" + }, + { + "id": 862, + "identifier": "obstagoon", + "generation_id": 8, + "evolves_from_species_id": 10170, + "evolution_chain_id": 1977, + "color_id": 5, + "shape_id": 5, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1, + "conquest_order": "" + }, + { + "id": 863, + "identifier": "perrserker", + "generation_id": 8, + "evolves_from_species_id": 10160, + "evolution_chain_id": 1599, + "color_id": 5, + "shape_id": 5, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 90, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1, + "conquest_order": "" + }, + { + "id": 864, + "identifier": "cursola", + "generation_id": 8, + "evolves_from_species_id": 10168, + "evolution_chain_id": 1486, + "color_id": 5, + "shape_id": 5, + "habitat_id": 3, + "gender_rate": 6, + "capture_rate": 60, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1, + "conquest_order": "" + }, + { + "id": 865, + "identifier": "sirfetchd", + "generation_id": 8, + "evolves_from_species_id": 10165, + "evolution_chain_id": 2000, + "color_id": 5, + "shape_id": 5, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1, + "conquest_order": "" + }, + { + "id": 866, + "identifier": "mr-rime", + "generation_id": 8, + "evolves_from_species_id": 10167, + "evolution_chain_id": 57, + "color_id": 5, + "shape_id": 5, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 25, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1, + "conquest_order": "" + }, + { + "id": 867, + "identifier": "runerigus", + "generation_id": 8, + "evolves_from_species_id": 10173, + "evolution_chain_id": 1640, + "color_id": 5, + "shape_id": 5, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 90, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 25, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1, + "conquest_order": "" + }, + { + "id": 868, + "identifier": "milcery", + "generation_id": 8, + "evolves_from_species_id": "", + "evolution_chain_id": 442, + "color_id": 5, + "shape_id": 5, + "habitat_id": 3, + "gender_rate": 8, + "capture_rate": 200, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1, + "conquest_order": "" + }, + { + "id": 869, + "identifier": "alcremie", + "generation_id": 8, + "evolves_from_species_id": 868, + "evolution_chain_id": 442, + "color_id": 5, + "shape_id": 5, + "habitat_id": 3, + "gender_rate": 8, + "capture_rate": 100, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1, + "conquest_order": "" + }, + { + "id": 870, + "identifier": "falinks", + "generation_id": 8, + "evolves_from_species_id": "", + "evolution_chain_id": 1351, + "color_id": 5, + "shape_id": 5, + "habitat_id": 3, + "gender_rate": -1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 25, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1, + "conquest_order": "" + }, + { + "id": 871, + "identifier": "pincurchin", + "generation_id": 8, + "evolves_from_species_id": "", + "evolution_chain_id": 1584, + "color_id": 5, + "shape_id": 5, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 75, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1, + "conquest_order": "" + }, + { + "id": 872, + "identifier": "snom", + "generation_id": 8, + "evolves_from_species_id": "", + "evolution_chain_id": 449, + "color_id": 5, + "shape_id": 5, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 190, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1, + "conquest_order": "" + }, + { + "id": 873, + "identifier": "frosmoth", + "generation_id": 8, + "evolves_from_species_id": 872, + "evolution_chain_id": 449, + "color_id": 5, + "shape_id": 5, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 75, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1, + "conquest_order": "" + }, + { + "id": 874, + "identifier": "stonjourner", + "generation_id": 8, + "evolves_from_species_id": "", + "evolution_chain_id": 1779, + "color_id": 5, + "shape_id": 5, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 60, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 25, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1, + "conquest_order": "" + }, + { + "id": 875, + "identifier": "eiscue", + "generation_id": 8, + "evolves_from_species_id": "", + "evolution_chain_id": 1806, + "color_id": 5, + "shape_id": 5, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 60, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 25, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1, + "conquest_order": "" + }, + { + "id": 876, + "identifier": "indeedee", + "generation_id": 8, + "evolves_from_species_id": "", + "evolution_chain_id": 1764, + "color_id": 5, + "shape_id": 5, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 30, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 40, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1, + "conquest_order": "" + }, + { + "id": 877, + "identifier": "morpeko", + "generation_id": 8, + "evolves_from_species_id": "", + "evolution_chain_id": 1964, + "color_id": 5, + "shape_id": 5, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 180, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 10, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1, + "conquest_order": "" + }, + { + "id": 878, + "identifier": "cufant", + "generation_id": 8, + "evolves_from_species_id": "", + "evolution_chain_id": 446, + "color_id": 5, + "shape_id": 5, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 190, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 25, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1, + "conquest_order": "" + }, + { + "id": 879, + "identifier": "copperajah", + "generation_id": 8, + "evolves_from_species_id": 878, + "evolution_chain_id": 446, + "color_id": 5, + "shape_id": 5, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 90, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 25, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1, + "conquest_order": "" + }, + { + "id": 880, + "identifier": "dracozolt", + "generation_id": 8, + "evolves_from_species_id": "", + "evolution_chain_id": 1276, + "color_id": 5, + "shape_id": 5, + "habitat_id": 3, + "gender_rate": -1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 35, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1, + "conquest_order": "" + }, + { + "id": 881, + "identifier": "arctozolt", + "generation_id": 8, + "evolves_from_species_id": "", + "evolution_chain_id": 1634, + "color_id": 5, + "shape_id": 5, + "habitat_id": 3, + "gender_rate": -1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 35, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1, + "conquest_order": "" + }, + { + "id": 882, + "identifier": "dracovish", + "generation_id": 8, + "evolves_from_species_id": "", + "evolution_chain_id": 1284, + "color_id": 5, + "shape_id": 5, + "habitat_id": 3, + "gender_rate": -1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 35, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1, + "conquest_order": "" + }, + { + "id": 883, + "identifier": "arctovish", + "generation_id": 8, + "evolves_from_species_id": "", + "evolution_chain_id": 1720, + "color_id": 5, + "shape_id": 5, + "habitat_id": 3, + "gender_rate": -1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 35, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1, + "conquest_order": "" + }, + { + "id": 884, + "identifier": "duraludon", + "generation_id": 8, + "evolves_from_species_id": "", + "evolution_chain_id": 1498, + "color_id": 5, + "shape_id": 5, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 30, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1, + "conquest_order": "" + }, + { + "id": 885, + "identifier": "dreepy", + "generation_id": 8, + "evolves_from_species_id": "", + "evolution_chain_id": 451, + "color_id": 5, + "shape_id": 5, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 40, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1, + "conquest_order": "" + }, + { + "id": 886, + "identifier": "drakloak", + "generation_id": 8, + "evolves_from_species_id": 885, + "evolution_chain_id": 451, + "color_id": 5, + "shape_id": 5, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 40, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1, + "conquest_order": "" + }, + { + "id": 887, + "identifier": "dragapult", + "generation_id": 8, + "evolves_from_species_id": 886, + "evolution_chain_id": 451, + "color_id": 5, + "shape_id": 5, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 40, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1, + "conquest_order": "" + }, + { + "id": 888, + "identifier": "zacian", + "generation_id": 8, + "evolves_from_species_id": "", + "evolution_chain_id": 1873, + "color_id": 5, + "shape_id": 5, + "habitat_id": 3, + "gender_rate": -1, + "capture_rate": 10, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 120, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1, + "conquest_order": "" + }, + { + "id": 889, + "identifier": "zamazenta", + "generation_id": 8, + "evolves_from_species_id": "", + "evolution_chain_id": 1088, + "color_id": 5, + "shape_id": 5, + "habitat_id": 3, + "gender_rate": -1, + "capture_rate": 10, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 120, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1, + "conquest_order": "" + }, + { + "id": 890, + "identifier": "eternatus", + "generation_id": 8, + "evolves_from_species_id": "", + "evolution_chain_id": 1958, + "color_id": 5, + "shape_id": 5, + "habitat_id": 3, + "gender_rate": -1, + "capture_rate": 255, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 120, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1, + "conquest_order": "" + }, + { + "base_happiness": 70, + "capture_rate": 3, + "color_id": 10, + "conquest_order": "", + "evolves_from_species_id": "", + "forms_switchable": 0, + "gender_rate": 0, + "generation_id": 8, + "growth_rate_id": 2, + "habitat_id": 3, + "has_gender_differences": 0, + "hatch_counter": 120, + "is_baby": 0, + "order": 40, + "shape_id": 8, + "identifier": "kubfu", + "id": 891, + "evolution_chain_id": 1983 + }, + { + "base_happiness": 70, + "capture_rate": 3, + "color_id": 10, + "conquest_order": "", + "evolves_from_species_id": 891, + "forms_switchable": 1, + "gender_rate": 0, + "generation_id": 8, + "growth_rate_id": 2, + "habitat_id": 3, + "has_gender_differences": 0, + "hatch_counter": 120, + "is_baby": 0, + "order": 40, + "shape_id": 8, + "identifier": "urshifu", + "id": 892, + "evolution_chain_id": 1983 + }, + { + "base_happiness": 70, + "capture_rate": 3, + "color_id": 10, + "conquest_order": "", + "evolves_from_species_id": "", + "forms_switchable": 0, + "gender_rate": -1, + "generation_id": 8, + "growth_rate_id": 2, + "habitat_id": 3, + "has_gender_differences": 0, + "hatch_counter": 120, + "is_baby": 0, + "order": 40, + "shape_id": 8, + "identifier": "zarude", + "id": 893, + "evolution_chain_id": 2014 + }, + { + "base_happiness": 70, + "capture_rate": 3, + "color_id": 10, + "conquest_order": "", + "evolves_from_species_id": "", + "forms_switchable": 0, + "gender_rate": -1, + "generation_id": 8, + "growth_rate_id": 2, + "habitat_id": 3, + "has_gender_differences": 0, + "hatch_counter": 120, + "is_baby": 0, + "order": 40, + "shape_id": 8, + "identifier": "regieleki", + "id": 894, + "evolution_chain_id": 2013 + }, + { + "base_happiness": 70, + "capture_rate": 3, + "color_id": 10, + "conquest_order": "", + "evolves_from_species_id": "", + "forms_switchable": 0, + "gender_rate": -1, + "generation_id": 8, + "growth_rate_id": 2, + "habitat_id": 3, + "has_gender_differences": 0, + "hatch_counter": 120, + "is_baby": 0, + "order": 40, + "shape_id": 8, + "identifier": "regidrago", + "id": 895, + "evolution_chain_id": 2012 + }, + { + "base_happiness": 70, + "capture_rate": 3, + "color_id": 10, + "conquest_order": "", + "evolves_from_species_id": "", + "forms_switchable": 0, + "gender_rate": -1, + "generation_id": 8, + "growth_rate_id": 2, + "habitat_id": 3, + "has_gender_differences": 0, + "hatch_counter": 120, + "is_baby": 0, + "order": 40, + "shape_id": 8, + "identifier": "glastrier", + "id": 896, + "evolution_chain_id": 2010 + }, + { + "base_happiness": 70, + "capture_rate": 3, + "color_id": 10, + "conquest_order": "", + "evolves_from_species_id": "", + "forms_switchable": 0, + "gender_rate": -1, + "generation_id": 8, + "growth_rate_id": 2, + "habitat_id": 3, + "has_gender_differences": 0, + "hatch_counter": 120, + "is_baby": 0, + "order": 40, + "shape_id": 8, + "identifier": "spectrier", + "id": 897, + "evolution_chain_id": 2011 + }, + { + "base_happiness": 70, + "capture_rate": 3, + "color_id": 10, + "conquest_order": "", + "evolves_from_species_id": "", + "forms_switchable": 0, + "gender_rate": -1, + "generation_id": 8, + "growth_rate_id": 2, + "habitat_id": 3, + "has_gender_differences": 0, + "hatch_counter": 120, + "is_baby": 0, + "order": 40, + "shape_id": 8, + "identifier": "calyrex", + "id": 898, + "evolution_chain_id": 1982 + }, + { + "identifier": "sprigatito", + "id": 906, + "evolution_chain_id": 455, + "evolves_from_species_id": "", + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 5, + "conquest_order": 0, + "gender_rate": 1, + "generation_id": 1, + "growth_rate_id": 4, + "habitat_id": 3, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 1, + "shape_id": 8 + }, + { + "identifier": "floragato", + "id": 907, + "evolution_chain_id": 455, + "evolves_from_species_id": 906, + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 5, + "conquest_order": 1, + "gender_rate": 1, + "generation_id": 1, + "growth_rate_id": 4, + "habitat_id": 3, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 2, + "shape_id": 8 + }, + { + "identifier": "meowscarada", + "id": 908, + "evolution_chain_id": 455, + "evolves_from_species_id": 907, + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 5, + "conquest_order": 1, + "gender_rate": 1, + "generation_id": 1, + "growth_rate_id": 4, + "habitat_id": 3, + "has_gender_differences": 1, + "hatch_counter": 20, + "is_baby": 0, + "order": 3, + "shape_id": 8 + }, + { + "identifier": "fuecoco", + "id": 909, + "evolution_chain_id": 456, + "evolves_from_species_id": "", + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 8, + "conquest_order": 109, + "gender_rate": 1, + "generation_id": 1, + "growth_rate_id": 4, + "habitat_id": 4, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 4, + "shape_id": 6 + }, + { + "identifier": "crocalor", + "id": 910, + "evolution_chain_id": 456, + "evolves_from_species_id": 909, + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 8, + "conquest_order": 110, + "gender_rate": 1, + "generation_id": 1, + "growth_rate_id": 4, + "habitat_id": 4, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 5, + "shape_id": 6 + }, + { + "identifier": "skeledirge", + "id": 911, + "evolution_chain_id": 456, + "evolves_from_species_id": 910, + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 8, + "conquest_order": 111, + "gender_rate": 1, + "generation_id": 1, + "growth_rate_id": 4, + "habitat_id": 4, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 6, + "shape_id": 6 + }, + { + "identifier": "quaxly", + "id": 912, + "evolution_chain_id": 457, + "evolves_from_species_id": "", + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 1, + "generation_id": 1, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 7, + "shape_id": 6 + }, + { + "identifier": "quaxwell", + "id": 913, + "evolution_chain_id": 457, + "evolves_from_species_id": 912, + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 1, + "generation_id": 1, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 8, + "shape_id": 6 + }, + { + "identifier": "quaquaval", + "id": 914, + "evolution_chain_id": 457, + "evolves_from_species_id": 913, + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 1, + "generation_id": 1, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 9, + "shape_id": 6 + }, + { + "identifier": "lechonk", + "id": 915, + "evolution_chain_id": 458, + "evolves_from_species_id": "", + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 4, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 10, + "shape_id": 6 + }, + { + "identifier": "oinkologne", + "id": 916, + "evolution_chain_id": 458, + "evolves_from_species_id": 915, + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 4, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 11, + "shape_id": 6 + }, + { + "identifier": "dudunsparce", + "id": 917, + "evolution_chain_id": 3100, + "evolves_from_species_id": 206, + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 4, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 12, + "shape_id": 6 + }, + { + "identifier": "tarountula", + "id": 918, + "evolution_chain_id": 460, + "evolves_from_species_id": "", + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 4, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 13, + "shape_id": 6 + }, + { + "identifier": "spidops", + "id": 919, + "evolution_chain_id": 460, + "evolves_from_species_id": 918, + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 4, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 14, + "shape_id": 6 + }, + { + "identifier": "nymble", + "id": 920, + "evolution_chain_id": 461, + "evolves_from_species_id": "", + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 1, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 15, + "shape_id": 6 + }, + { + "identifier": "lokix", + "id": 921, + "evolution_chain_id": 461, + "evolves_from_species_id": 920, + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 1, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 16, + "shape_id": 6 + }, + { + "identifier": "rellor", + "id": 922, + "evolution_chain_id": 462, + "evolves_from_species_id": "", + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 1, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 17, + "shape_id": 6 + }, + { + "identifier": "rabsca", + "id": 923, + "evolution_chain_id": 462, + "evolves_from_species_id": 922, + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 1, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 18, + "shape_id": 6 + }, + { + "identifier": "greavard", + "id": 924, + "evolution_chain_id": 463, + "evolves_from_species_id": "", + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 1, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 19, + "shape_id": 6 + }, + { + "identifier": "houndstone", + "id": 925, + "evolution_chain_id": 463, + "evolves_from_species_id": 924, + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 1, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 20, + "shape_id": 6 + }, + { + "identifier": "flittle", + "id": 926, + "evolution_chain_id": 464, + "evolves_from_species_id": "", + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 1, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 21, + "shape_id": 6 + }, + { + "identifier": "espathra", + "id": 927, + "evolution_chain_id": 464, + "evolves_from_species_id": 926, + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 1, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 22, + "shape_id": 6 + }, + { + "identifier": "farigiraf", + "id": 928, + "evolution_chain_id": 465, + "evolves_from_species_id": 203, + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 1, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 23, + "shape_id": 6 + }, + { + "identifier": "wiglett", + "id": 929, + "evolution_chain_id": 466, + "evolves_from_species_id": "", + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 4, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 24, + "shape_id": 6 + }, + { + "identifier": "wugtrio", + "id": 930, + "evolution_chain_id": 466, + "evolves_from_species_id": 929, + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 1, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 25, + "shape_id": 6 + }, + { + "identifier": "dondozo", + "id": 931, + "evolution_chain_id": 3102, + "evolves_from_species_id": "", + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 1, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 26, + "shape_id": 6 + }, + { + "identifier": "veluza", + "id": 932, + "evolution_chain_id": 3103, + "evolves_from_species_id": "", + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 1, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 27, + "shape_id": 6 + }, + { + "identifier": "finizen", + "id": 933, + "evolution_chain_id": 467, + "evolves_from_species_id": "", + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 1, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 28, + "shape_id": 6 + }, + { + "identifier": "palafin", + "id": 934, + "evolution_chain_id": 467, + "evolves_from_species_id": 933, + "forms_switchable": 1, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 1, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 29, + "shape_id": 6 + }, + { + "identifier": "smoliv", + "id": 935, + "evolution_chain_id": 468, + "evolves_from_species_id": "", + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 1, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 30, + "shape_id": 6 + }, + { + "identifier": "dolliv", + "id": 936, + "evolution_chain_id": 468, + "evolves_from_species_id": 935, + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 1, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 31, + "shape_id": 6 + }, + { + "identifier": "arboliva", + "id": 937, + "evolution_chain_id": 468, + "evolves_from_species_id": 936, + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 1, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 32, + "shape_id": 6 + }, + { + "identifier": "capsakid", + "id": 938, + "evolution_chain_id": 469, + "evolves_from_species_id": "", + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 1, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 33, + "shape_id": 6 + }, + { + "identifier": "scovillain", + "id": 939, + "evolution_chain_id": 469, + "evolves_from_species_id": 938, + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 1, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 34, + "shape_id": 6 + }, + { + "identifier": "tadbulb", + "id": 940, + "evolution_chain_id": 470, + "evolves_from_species_id": "", + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 1, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 35, + "shape_id": 6 + }, + { + "identifier": "bellibolt", + "id": 941, + "evolution_chain_id": 470, + "evolves_from_species_id": 940, + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 1, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 36, + "shape_id": 6 + }, + { + "identifier": "varoom", + "id": 942, + "evolution_chain_id": 471, + "evolves_from_species_id": "", + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 1, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 37, + "shape_id": 6 + }, + { + "identifier": "revavroom", + "id": 943, + "evolution_chain_id": 471, + "evolves_from_species_id": 942, + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 1, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 38, + "shape_id": 6 + }, + { + "identifier": "orthworm", + "id": 944, + "evolution_chain_id": 3105, + "evolves_from_species_id": "", + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 2, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 39, + "shape_id": 6 + }, + { + "identifier": "tandemaus", + "id": 945, + "evolution_chain_id": 472, + "evolves_from_species_id": "", + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": -1, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 40, + "shape_id": 6 + }, + { + "identifier": "maushold", + "id": 946, + "evolution_chain_id": 472, + "evolves_from_species_id": 945, + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": -1, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 41, + "shape_id": 6 + }, + { + "identifier": "cetoddle", + "id": 947, + "evolution_chain_id": 473, + "evolves_from_species_id": "", + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 1, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 42, + "shape_id": 6 + }, + { + "identifier": "cetitan", + "id": 948, + "evolution_chain_id": 473, + "evolves_from_species_id": 947, + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 1, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 43, + "shape_id": 6 + }, + { + "identifier": "frigibax", + "id": 949, + "evolution_chain_id": 474, + "evolves_from_species_id": "", + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 1, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 44, + "shape_id": 6 + }, + { + "identifier": "arctibax", + "id": 950, + "evolution_chain_id": 474, + "evolves_from_species_id": 949, + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 1, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 45, + "shape_id": 6 + }, + { + "identifier": "baxcalibur", + "id": 951, + "evolution_chain_id": 474, + "evolves_from_species_id": 950, + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 1, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 46, + "shape_id": 6 + }, + { + "identifier": "tatsugiri", + "id": 952, + "evolution_chain_id": 3107, + "evolves_from_species_id": "", + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 1, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 47, + "shape_id": 6 + }, + { + "identifier": "cyclizar", + "id": 953, + "evolution_chain_id": 3108, + "evolves_from_species_id": "", + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 4, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 48, + "shape_id": 6 + }, + { + "identifier": "pawmi", + "id": 954, + "evolution_chain_id": 475, + "evolves_from_species_id": "", + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 1, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 49, + "shape_id": 6 + }, + { + "identifier": "pawmo", + "id": 955, + "evolution_chain_id": 475, + "evolves_from_species_id": 954, + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 1, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 50, + "shape_id": 6 + }, + { + "identifier": "pawmot", + "id": 956, + "evolution_chain_id": 475, + "evolves_from_species_id": 955, + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 1, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 51, + "shape_id": 6 + }, + { + "identifier": "wattrel", + "id": 957, + "evolution_chain_id": 476, + "evolves_from_species_id": "", + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 1, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 52, + "shape_id": 6 + }, + { + "identifier": "kilowattrel", + "id": 958, + "evolution_chain_id": 476, + "evolves_from_species_id": 957, + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 1, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 53, + "shape_id": 6 + }, + { + "identifier": "bombirdier", + "id": 959, + "evolution_chain_id": 3111, + "evolves_from_species_id": "", + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 1, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 54, + "shape_id": 6 + }, + { + "identifier": "squawkabilly", + "id": 960, + "evolution_chain_id": 3110, + "evolves_from_species_id": "", + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 1, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 55, + "shape_id": 6 + }, + { + "identifier": "flamigo", + "id": 961, + "evolution_chain_id": "", + "evolves_from_species_id": 961, + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 1, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 56, + "shape_id": 6 + }, + { + "identifier": "klawf", + "id": 962, + "evolution_chain_id": 3109, + "evolves_from_species_id": "", + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 1, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 57, + "shape_id": 6 + }, + { + "identifier": "nacli", + "id": 963, + "evolution_chain_id": 477, + "evolves_from_species_id": "", + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 1, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 58, + "shape_id": 6 + }, + { + "identifier": "naclstack", + "id": 964, + "evolution_chain_id": 477, + "evolves_from_species_id": 963, + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 1, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 59, + "shape_id": 6 + }, + { + "identifier": "garganacl", + "id": 965, + "evolution_chain_id": 477, + "evolves_from_species_id": 964, + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 1, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 60, + "shape_id": 6 + }, + { + "identifier": "glimmet", + "id": 966, + "evolution_chain_id": 478, + "evolves_from_species_id": "", + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 1, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 61, + "shape_id": 6 + }, + { + "identifier": "glimmora", + "id": 967, + "evolution_chain_id": 478, + "evolves_from_species_id": 966, + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 1, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 62, + "shape_id": 6 + }, + { + "identifier": "shroodle", + "id": 968, + "evolution_chain_id": 479, + "evolves_from_species_id": "", + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 190, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 1, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 63, + "shape_id": 6 + }, + { + "identifier": "grafaiai", + "id": 969, + "evolution_chain_id": 479, + "evolves_from_species_id": 968, + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 90, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 1, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 64, + "shape_id": 6 + }, + { + "identifier": "fidough", + "id": 970, + "evolution_chain_id": 480, + "evolves_from_species_id": "", + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 1, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 65, + "shape_id": 6 + }, + { + "identifier": "dachsbun", + "id": 971, + "evolution_chain_id": 480, + "evolves_from_species_id": 970, + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 1, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 66, + "shape_id": 6 + }, + { + "identifier": "maschiff", + "id": 972, + "evolution_chain_id": 481, + "evolves_from_species_id": "", + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 1, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 67, + "shape_id": 6 + }, + { + "identifier": "mabosstiff", + "id": 973, + "evolution_chain_id": 481, + "evolves_from_species_id": 972, + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 1, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 68, + "shape_id": 6 + }, + { + "identifier": "bramblin", + "id": 974, + "evolution_chain_id": 482, + "evolves_from_species_id": "", + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 1, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 69, + "shape_id": 6 + }, + { + "identifier": "brambleghast", + "id": 975, + "evolution_chain_id": 482, + "evolves_from_species_id": 974, + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 1, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 70, + "shape_id": 6 + }, + { + "identifier": "gimmighoul", + "id": 976, + "evolution_chain_id": 483, + "evolves_from_species_id": "", + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 1, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 71, + "shape_id": 6 + }, + { + "identifier": "gholdengo", + "id": 977, + "evolution_chain_id": 483, + "evolves_from_species_id": 976, + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 1, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 72, + "shape_id": 6 + }, + { + "identifier": "great-tusk", + "id": 978, + "evolution_chain_id": 484, + "evolves_from_species_id": "", + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 1, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 73, + "shape_id": 6 + }, + { + "identifier": "brute-bonnet", + "id": 979, + "evolution_chain_id": 485, + "evolves_from_species_id": "", + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 1, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 74, + "shape_id": 6 + }, + { + "identifier": "sandy-shocks", + "id": 981, + "evolution_chain_id": 3050, + "evolves_from_species_id": "", + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 1, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 76, + "shape_id": 6 + }, + { + "identifier": "scream-tail", + "id": 982, + "evolution_chain_id": 501, + "evolves_from_species_id": "", + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 1, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 77, + "shape_id": 6 + }, + { + "identifier": "flutter-mane", + "id": 983, + "evolution_chain_id": 502, + "evolves_from_species_id": "", + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 1, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 78, + "shape_id": 6 + }, + { + "identifier": "slither-wing", + "id": 984, + "evolution_chain_id": 571, + "evolves_from_species_id": "", + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 1, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 79, + "shape_id": 6 + }, + { + "identifier": "roaring-moon", + "id": 985, + "evolution_chain_id": 566, + "evolves_from_species_id": "", + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 1, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 80, + "shape_id": 6 + }, + { + "identifier": "iron-treads", + "id": 986, + "evolution_chain_id": 558, + "evolves_from_species_id": "", + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 1, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 81, + "shape_id": 6 + }, + { + "identifier": "iron-moth", + "id": 988, + "evolution_chain_id": 559, + "evolves_from_species_id": "", + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 1, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 83, + "shape_id": 6 + }, + { + "identifier": "iron-hands", + "id": 989, + "evolution_chain_id": 486, + "evolves_from_species_id": 297, + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 1, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 84, + "shape_id": 6 + }, + { + "identifier": "iron-jugulis", + "id": 990, + "evolution_chain_id": 557, + "evolves_from_species_id": "", + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 1, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 85, + "shape_id": 6 + }, + { + "identifier": "iron-thorns", + "id": 991, + "evolution_chain_id": 560, + "evolves_from_species_id": "", + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 1, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 86, + "shape_id": 6 + }, + { + "identifier": "iron-bundle", + "id": 992, + "evolution_chain_id": 487, + "evolves_from_species_id": "", + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 1, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 87, + "shape_id": 6 + }, + { + "identifier": "iron-valiant", + "id": 993, + "evolution_chain_id": 3101, + "evolves_from_species_id": "", + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 1, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 88, + "shape_id": 6 + }, + { + "identifier": "ting-lu", + "id": 994, + "evolution_chain_id": 3114, + "evolves_from_species_id": "", + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 1, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 89, + "shape_id": 6 + }, + { + "identifier": "chien-pao", + "id": 995, + "evolution_chain_id": 500, + "evolves_from_species_id": "", + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 1, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 90, + "shape_id": 6 + }, + { + "identifier": "wo-chien", + "id": 996, + "evolution_chain_id": 3115, + "evolves_from_species_id": "", + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 1, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 91, + "shape_id": 6 + }, + { + "identifier": "chi-yu", + "id": 997, + "evolution_chain_id": 0, + "evolves_from_species_id": "", + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 1, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 92, + "shape_id": 6 + }, + { + "identifier": "koraidon", + "id": 998, + "evolution_chain_id": 3116, + "evolves_from_species_id": "", + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 1, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 93, + "shape_id": 6 + }, + { + "identifier": "miraidon", + "id": 999, + "evolution_chain_id": 3004, + "evolves_from_species_id": "", + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 1, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 94, + "shape_id": 6 + }, + { + "identifier": "tinkatink", + "id": 1000, + "evolution_chain_id": 488, + "evolves_from_species_id": "", + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 8, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 95, + "shape_id": 6 + }, + { + "identifier": "tinkatuff", + "id": 1001, + "evolution_chain_id": 488, + "evolves_from_species_id": 1000, + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 8, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 96, + "shape_id": 6 + }, + { + "identifier": "tinkaton", + "id": 1002, + "evolution_chain_id": 488, + "evolves_from_species_id": 1001, + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 8, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 97, + "shape_id": 6 + }, + { + "identifier": "charcadet", + "id": 1003, + "evolution_chain_id": 489, + "evolves_from_species_id": "", + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 90, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 1, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 98, + "shape_id": 6 + }, + { + "identifier": "armarouge", + "id": 1004, + "evolution_chain_id": 489, + "evolves_from_species_id": 1003, + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 25, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 1, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 99, + "shape_id": 6 + }, + { + "identifier": "ceruledge", + "id": 1005, + "evolution_chain_id": 489, + "evolves_from_species_id": 1003, + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 25, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 1, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 100, + "shape_id": 6 + }, + { + "identifier": "toedscool", + "id": 1006, + "evolution_chain_id": 490, + "evolves_from_species_id": "", + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 1, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 101, + "shape_id": 6 + }, + { + "identifier": "toedscruel", + "id": 1007, + "evolution_chain_id": 490, + "evolves_from_species_id": 1006, + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 1, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 102, + "shape_id": 6 + }, + { + "identifier": "kingambit", + "id": 1008, + "evolution_chain_id": 317, + "evolves_from_species_id": 625, + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 1, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 103, + "shape_id": 6 + }, + { + "identifier": "clodsire", + "id": 1009, + "evolution_chain_id": 3001, + "evolves_from_species_id": 11001, + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 1, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 104, + "shape_id": 6 + }, + { + "identifier": "annihilape", + "id": 1010, + "evolution_chain_id": 3636, + "evolves_from_species_id": 57, + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 1, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 105, + "shape_id": 6 + }, + { + "id": 1011, + "identifier": "iron-leaves", + "generation_id": 9, + "evolves_from_species_id": "", + "evolution_chain_id": 5997, + "color_id": 2, + "shape_id": 1, + "habitat_id": 9, + "gender_rate": -1, + "capture_rate": 10, + "base_happiness": 0, + "is_baby": 0, + "hatch_counter": 12000, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 1011, + "conquest_order": 1 + }, + { + "identifier": "walking-wake", + "id": 1012, + "evolution_chain_id": 3112, + "evolves_from_species_id": "", + "forms_switchable": 0, + "base_happiness": 70, + "capture_rate": 45, + "color_id": 2, + "conquest_order": 0, + "gender_rate": 1, + "generation_id": 9, + "growth_rate_id": 4, + "habitat_id": 9, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 75, + "shape_id": 6 + }, + { + "id": 1013, + "identifier": "dipplin", + "generation_id": 9, + "evolves_from_species_id": 840, + "evolution_chain_id": 443, + "color_id": 5, + "shape_id": 8, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1013, + "conquest_order": "" + }, + { + "id": 1014, + "identifier": "okidogi", + "generation_id": 9, + "evolves_from_species_id": "", + "evolution_chain_id": 3005, + "color_id": 5, + "shape_id": 8, + "habitat_id": 3, + "gender_rate": 0, + "capture_rate": 3, + "base_happiness": 0, + "is_baby": 0, + "hatch_counter": 120, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1014, + "conquest_order": "" + }, + { + "id": 1015, + "identifier": "munkidori", + "generation_id": 9, + "evolves_from_species_id": "", + "evolution_chain_id": 3006, + "color_id": 5, + "shape_id": 8, + "habitat_id": 3, + "gender_rate": 0, + "capture_rate": 3, + "base_happiness": 0, + "is_baby": 0, + "hatch_counter": 120, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1015, + "conquest_order": "" + }, + { + "id": 1016, + "identifier": "fezandipiti", + "generation_id": 9, + "evolves_from_species_id": "", + "evolution_chain_id": 3007, + "color_id": 5, + "shape_id": 8, + "habitat_id": 3, + "gender_rate": 0, + "capture_rate": 3, + "base_happiness": 0, + "is_baby": 0, + "hatch_counter": 120, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1016, + "conquest_order": "" + }, + { + "id": 1017, + "identifier": "ogerpon", + "generation_id": 9, + "evolves_from_species_id": "", + "evolution_chain_id": 3008, + "color_id": 5, + "shape_id": 8, + "habitat_id": 3, + "gender_rate": 8, + "capture_rate": 5, + "base_happiness": 50, + "is_baby": 0, + "hatch_counter": 10, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 1, + "order": 1017, + "conquest_order": "" + }, + { + "id": 1018, + "identifier": "archaludon", + "generation_id": 9, + "evolves_from_species_id": 884, + "evolution_chain_id": 1498, + "color_id": 5, + "shape_id": 8, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 10, + "base_happiness": 50, + "is_baby": 0, + "hatch_counter": 30, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1018, + "conquest_order": "" + }, + { + "id": 1019, + "identifier": "hydrapple", + "generation_id": 9, + "evolves_from_species_id": 840, + "evolution_chain_id": 443, + "color_id": "", + "shape_id": "", + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 10, + "base_happiness": 50, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": "", + "forms_switchable": 0, + "order": "", + "conquest_order": "" + }, + { + "id": 1020, + "identifier": "gouging-fire", + "generation_id": 9, + "evolves_from_species_id": "", + "evolution_chain_id": 3010, + "color_id": "", + "shape_id": "", + "habitat_id": "", + "gender_rate": -1, + "capture_rate": 10, + "base_happiness": 0, + "is_baby": 0, + "hatch_counter": 50, + "has_gender_differences": 0, + "growth_rate_id": "", + "forms_switchable": 0, + "order": "", + "conquest_order": "" + }, + { + "id": 1021, + "identifier": "raging-bolt", + "generation_id": 9, + "evolves_from_species_id": "", + "evolution_chain_id": 3011, + "color_id": "", + "shape_id": "", + "habitat_id": "", + "gender_rate": -1, + "capture_rate": 10, + "base_happiness": 0, + "is_baby": 0, + "hatch_counter": 50, + "has_gender_differences": 0, + "growth_rate_id": "", + "forms_switchable": 0, + "order": "", + "conquest_order": "" + }, + { + "id": 1022, + "identifier": "iron-boulder", + "generation_id": 9, + "evolves_from_species_id": "", + "evolution_chain_id": 3012, + "color_id": "", + "shape_id": "", + "habitat_id": "", + "gender_rate": -1, + "capture_rate": 10, + "base_happiness": 0, + "is_baby": 0, + "hatch_counter": 50, + "has_gender_differences": 0, + "growth_rate_id": "", + "forms_switchable": 0, + "order": "", + "conquest_order": "" + }, + { + "id": 1023, + "identifier": "iron-crown", + "generation_id": 9, + "evolves_from_species_id": "", + "evolution_chain_id": 3013, + "color_id": "", + "shape_id": "", + "habitat_id": "", + "gender_rate": -1, + "capture_rate": 10, + "base_happiness": 0, + "is_baby": 0, + "hatch_counter": 50, + "has_gender_differences": 0, + "growth_rate_id": "", + "forms_switchable": 0, + "order": "", + "conquest_order": "" + }, + { + "id": 1024, + "identifier": "terapagos", + "generation_id": 9, + "evolves_from_species_id": "", + "evolution_chain_id": 3014, + "color_id": "", + "shape_id": "", + "habitat_id": "", + "gender_rate": 4, + "capture_rate": 255, + "base_happiness": 50, + "is_baby": 0, + "hatch_counter": 5, + "has_gender_differences": 0, + "growth_rate_id": "", + "forms_switchable": 0, + "order": "", + "conquest_order": "" + }, + { + "id": 1025, + "identifier": "pecharunt", + "generation_id": 9, + "evolves_from_species_id": "", + "evolution_chain_id": 3015, + "color_id": "", + "shape_id": "", + "habitat_id": "", + "gender_rate": -1, + "capture_rate": 3, + "base_happiness": 0, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": "", + "forms_switchable": 0, + "order": "", + "conquest_order": "" + }, + { + "id": 4000, + "identifier": "poltchageist", + "generation_id": 9, + "evolves_from_species_id": "", + "evolution_chain_id": 3004, + "color_id": 5, + "shape_id": 8, + "habitat_id": 3, + "gender_rate": -1, + "capture_rate": 120, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1012, + "conquest_order": "" + }, + { + "id": 4001, + "identifier": "sinistcha", + "generation_id": 9, + "evolves_from_species_id": 4000, + "evolution_chain_id": 3004, + "color_id": 5, + "shape_id": 8, + "habitat_id": 3, + "gender_rate": -1, + "capture_rate": 60, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 1012, + "conquest_order": "" + }, + { + "base_happiness": 70, + "capture_rate": 255, + "color_id": 10, + "conquest_order": "", + "evolution_chain_id": 1966, + "evolves_from_species_id": "", + "forms_switchable": 0, + "gender_rate": 4, + "generation_id": 7, + "growth_rate_id": 2, + "habitat_id": 3, + "has_gender_differences": 0, + "hatch_counter": 15, + "id": 10091, + "identifier": "rattata-alola", + "is_baby": 0, + "order": 40, + "shape_id": 8 + }, + { + "base_happiness": 70, + "capture_rate": 127, + "color_id": 10, + "conquest_order": "", + "evolution_chain_id": 1966, + "evolves_from_species_id": 10091, + "forms_switchable": 0, + "gender_rate": 4, + "generation_id": 7, + "growth_rate_id": 2, + "habitat_id": 3, + "has_gender_differences": 0, + "hatch_counter": 15, + "id": 10092, + "identifier": "raticate-alola", + "is_baby": 0, + "order": 40, + "shape_id": 8 + }, + { + "base_happiness": 70, + "capture_rate": 75, + "color_id": 10, + "conquest_order": "", + "evolution_chain_id": 10, + "evolves_from_species_id": 25, + "forms_switchable": 0, + "gender_rate": 4, + "generation_id": 7, + "growth_rate_id": 2, + "habitat_id": 3, + "has_gender_differences": 0, + "hatch_counter": 10, + "id": 10100, + "identifier": "raichu-alola", + "is_baby": 0, + "order": 40, + "shape_id": 8 + }, + { + "base_happiness": 70, + "capture_rate": 255, + "color_id": 10, + "conquest_order": "", + "evolution_chain_id": 1968, + "evolves_from_species_id": "", + "forms_switchable": 0, + "gender_rate": 4, + "generation_id": 7, + "growth_rate_id": 2, + "habitat_id": 3, + "has_gender_differences": 0, + "hatch_counter": 20, + "id": 10101, + "identifier": "sandshrew-alola", + "is_baby": 0, + "order": 40, + "shape_id": 8 + }, + { + "base_happiness": 70, + "capture_rate": 90, + "color_id": 10, + "conquest_order": "", + "evolution_chain_id": 1968, + "evolves_from_species_id": 10101, + "forms_switchable": 0, + "gender_rate": 4, + "generation_id": 7, + "growth_rate_id": 2, + "habitat_id": 3, + "has_gender_differences": 0, + "hatch_counter": 20, + "id": 10102, + "identifier": "sandslash-alola", + "is_baby": 0, + "order": 40, + "shape_id": 8 + }, + { + "id": 10103, + "identifier": "vulpix-alola", + "generation_id": 7, + "evolves_from_species_id": "", + "evolution_chain_id": 1965, + "color_id": 3, + "shape_id": 8, + "habitat_id": 3, + "gender_rate": 6, + "capture_rate": 190, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 39, + "conquest_order": "" + }, + { + "base_happiness": 70, + "capture_rate": 75, + "color_id": 10, + "conquest_order": "", + "evolution_chain_id": 1965, + "evolves_from_species_id": 10103, + "forms_switchable": 0, + "gender_rate": 6, + "generation_id": 7, + "growth_rate_id": 2, + "habitat_id": 3, + "has_gender_differences": 0, + "hatch_counter": 20, + "id": 10104, + "identifier": "ninetales-alola", + "is_baby": 0, + "order": 40, + "shape_id": 8 + }, + { + "base_happiness": 70, + "capture_rate": 255, + "color_id": 10, + "conquest_order": "", + "evolution_chain_id": 1973, + "evolves_from_species_id": "", + "forms_switchable": 0, + "gender_rate": 4, + "generation_id": 1, + "growth_rate_id": 2, + "habitat_id": 3, + "has_gender_differences": 0, + "hatch_counter": 20, + "id": 10105, + "identifier": "diglett-alola", + "is_baby": 0, + "order": 40, + "shape_id": 8 + }, + { + "base_happiness": 70, + "capture_rate": 50, + "color_id": 10, + "conquest_order": "", + "evolution_chain_id": 1973, + "evolves_from_species_id": 10105, + "forms_switchable": 0, + "gender_rate": 4, + "generation_id": 1, + "growth_rate_id": 2, + "habitat_id": 3, + "has_gender_differences": 0, + "hatch_counter": 20, + "id": 10106, + "identifier": "dugtrio-alola", + "is_baby": 0, + "order": 40, + "shape_id": 8 + }, + { + "base_happiness": 70, + "capture_rate": 255, + "color_id": 10, + "conquest_order": "", + "evolution_chain_id": 1972, + "evolves_from_species_id": "", + "forms_switchable": 0, + "gender_rate": 4, + "generation_id": 1, + "growth_rate_id": 2, + "habitat_id": 3, + "has_gender_differences": 0, + "hatch_counter": 20, + "id": 10107, + "identifier": "meowth-alola", + "is_baby": 0, + "order": 40, + "shape_id": 8 + }, + { + "base_happiness": 70, + "capture_rate": 90, + "color_id": 10, + "conquest_order": "", + "evolution_chain_id": 1972, + "evolves_from_species_id": 10107, + "forms_switchable": 0, + "gender_rate": 4, + "generation_id": 1, + "growth_rate_id": 2, + "habitat_id": 3, + "has_gender_differences": 0, + "hatch_counter": 20, + "id": 10108, + "identifier": "persian-alola", + "is_baby": 0, + "order": 40, + "shape_id": 8 + }, + { + "base_happiness": 70, + "capture_rate": 255, + "color_id": 10, + "conquest_order": "", + "evolution_chain_id": 1974, + "evolves_from_species_id": "", + "forms_switchable": 0, + "gender_rate": 4, + "generation_id": 1, + "growth_rate_id": 2, + "habitat_id": 3, + "has_gender_differences": 0, + "hatch_counter": 15, + "id": 10109, + "identifier": "geodude-alola", + "is_baby": 0, + "order": 40, + "shape_id": 8 + }, + { + "base_happiness": 70, + "capture_rate": 120, + "color_id": 10, + "conquest_order": "", + "evolution_chain_id": 1974, + "evolves_from_species_id": 10109, + "forms_switchable": 0, + "gender_rate": 4, + "generation_id": 1, + "growth_rate_id": 2, + "habitat_id": 3, + "has_gender_differences": 0, + "hatch_counter": 15, + "id": 10110, + "identifier": "graveler-alola", + "is_baby": 0, + "order": 40, + "shape_id": 8 + }, + { + "base_happiness": 70, + "capture_rate": 40, + "color_id": 10, + "conquest_order": "", + "evolution_chain_id": 1974, + "evolves_from_species_id": 10110, + "forms_switchable": 0, + "gender_rate": 4, + "generation_id": 1, + "growth_rate_id": 2, + "habitat_id": 3, + "has_gender_differences": 0, + "hatch_counter": 15, + "id": 10111, + "identifier": "golem-alola", + "is_baby": 0, + "order": 40, + "shape_id": 8 + }, + { + "base_happiness": 70, + "capture_rate": 190, + "color_id": 10, + "conquest_order": "", + "evolution_chain_id": 1971, + "evolves_from_species_id": "", + "forms_switchable": 0, + "gender_rate": 4, + "generation_id": 1, + "growth_rate_id": 2, + "habitat_id": 3, + "has_gender_differences": 0, + "hatch_counter": 20, + "id": 10112, + "identifier": "grimer-alola", + "is_baby": 0, + "order": 40, + "shape_id": 8 + }, + { + "base_happiness": 70, + "capture_rate": 75, + "color_id": 10, + "conquest_order": "", + "evolution_chain_id": 1971, + "evolves_from_species_id": 10112, + "forms_switchable": 0, + "gender_rate": 4, + "generation_id": 1, + "growth_rate_id": 2, + "habitat_id": 3, + "has_gender_differences": 0, + "hatch_counter": 20, + "id": 10113, + "identifier": "muk-alola", + "is_baby": 0, + "order": 40, + "shape_id": 8 + }, + { + "base_happiness": 70, + "capture_rate": 45, + "color_id": 10, + "conquest_order": "", + "evolution_chain_id": 45, + "evolves_from_species_id": 102, + "forms_switchable": 0, + "gender_rate": 4, + "generation_id": 7, + "growth_rate_id": 2, + "habitat_id": 3, + "has_gender_differences": 0, + "hatch_counter": 20, + "id": 10114, + "identifier": "exeggutor-alola", + "is_baby": 0, + "order": 40, + "shape_id": 8 + }, + { + "base_happiness": 70, + "capture_rate": 75, + "color_id": 10, + "conquest_order": "", + "evolution_chain_id": 46, + "evolves_from_species_id": 104, + "forms_switchable": 0, + "gender_rate": 4, + "generation_id": 7, + "growth_rate_id": 2, + "habitat_id": 3, + "has_gender_differences": 0, + "hatch_counter": 20, + "id": 10115, + "identifier": "marowak-alola", + "is_baby": 0, + "order": 40, + "shape_id": 8 + }, + { + "base_happiness": 70, + "capture_rate": 255, + "color_id": 10, + "conquest_order": "", + "evolves_from_species_id": "", + "forms_switchable": 0, + "gender_rate": 4, + "generation_id": 8, + "growth_rate_id": 2, + "habitat_id": 3, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 40, + "shape_id": 8, + "identifier": "meowth-galar", + "id": 10160, + "evolution_chain_id": 1599 + }, + { + "base_happiness": 70, + "capture_rate": 190, + "color_id": 10, + "conquest_order": "", + "evolves_from_species_id": "", + "forms_switchable": 0, + "gender_rate": 4, + "generation_id": 8, + "growth_rate_id": 2, + "habitat_id": 3, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 40, + "shape_id": 8, + "identifier": "ponyta-galar", + "id": 10161, + "evolution_chain_id": 1975 + }, + { + "base_happiness": 70, + "capture_rate": 60, + "color_id": 10, + "conquest_order": "", + "evolves_from_species_id": 10161, + "forms_switchable": 0, + "gender_rate": 4, + "generation_id": 8, + "growth_rate_id": 2, + "habitat_id": 3, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 40, + "shape_id": 8, + "identifier": "rapidash-galar", + "id": 10162, + "evolution_chain_id": 1975 + }, + { + "base_happiness": 70, + "capture_rate": 190, + "color_id": 10, + "conquest_order": "", + "evolves_from_species_id": "", + "forms_switchable": 0, + "gender_rate": 4, + "generation_id": 8, + "growth_rate_id": 2, + "habitat_id": 3, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 40, + "shape_id": 8, + "identifier": "slowpoke-galar", + "id": 10163, + "evolution_chain_id": 1976 + }, + { + "base_happiness": 70, + "capture_rate": 75, + "color_id": 10, + "conquest_order": "", + "evolves_from_species_id": 10163, + "forms_switchable": 0, + "gender_rate": 4, + "generation_id": 8, + "growth_rate_id": 2, + "habitat_id": 3, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 40, + "shape_id": 8, + "identifier": "slowbro-galar", + "id": 10164, + "evolution_chain_id": 1976 + }, + { + "base_happiness": 70, + "capture_rate": 45, + "color_id": 10, + "conquest_order": "", + "evolves_from_species_id": "", + "forms_switchable": 0, + "gender_rate": 4, + "generation_id": 8, + "growth_rate_id": 2, + "habitat_id": 3, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 40, + "shape_id": 8, + "identifier": "farfetchd-galar", + "id": 10165, + "evolution_chain_id": 2000 + }, + { + "base_happiness": 70, + "capture_rate": 60, + "color_id": 10, + "conquest_order": "", + "evolves_from_species_id": 109, + "forms_switchable": 0, + "gender_rate": 4, + "generation_id": 8, + "growth_rate_id": 2, + "habitat_id": 3, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 40, + "shape_id": 8, + "identifier": "weezing-galar", + "id": 10166, + "evolution_chain_id": 49 + }, + { + "base_happiness": 70, + "capture_rate": 45, + "color_id": 10, + "conquest_order": "", + "evolves_from_species_id": 439, + "forms_switchable": 0, + "gender_rate": 4, + "generation_id": 8, + "growth_rate_id": 2, + "habitat_id": 3, + "has_gender_differences": 0, + "hatch_counter": 25, + "is_baby": 0, + "order": 40, + "shape_id": 8, + "identifier": "mr-mime-galar", + "id": 10167, + "evolution_chain_id": 57 + }, + { + "base_happiness": 70, + "capture_rate": 60, + "color_id": 10, + "conquest_order": "", + "evolves_from_species_id": "", + "forms_switchable": 0, + "gender_rate": 6, + "generation_id": 8, + "growth_rate_id": 2, + "habitat_id": 3, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 40, + "shape_id": 8, + "identifier": "corsola-galar", + "id": 10168, + "evolution_chain_id": 1486 + }, + { + "base_happiness": 70, + "capture_rate": 255, + "color_id": 10, + "conquest_order": "", + "evolves_from_species_id": "", + "forms_switchable": 0, + "gender_rate": 4, + "generation_id": 8, + "growth_rate_id": 2, + "habitat_id": 3, + "has_gender_differences": 0, + "hatch_counter": 15, + "is_baby": 0, + "order": 40, + "shape_id": 8, + "identifier": "zigzagoon-galar", + "id": 10169, + "evolution_chain_id": 1977 + }, + { + "base_happiness": 70, + "capture_rate": 90, + "color_id": 10, + "conquest_order": "", + "evolves_from_species_id": 10169, + "forms_switchable": 0, + "gender_rate": 4, + "generation_id": 8, + "growth_rate_id": 2, + "habitat_id": 3, + "has_gender_differences": 0, + "hatch_counter": 15, + "is_baby": 0, + "order": 40, + "shape_id": 8, + "identifier": "linoone-galar", + "id": 10170, + "evolution_chain_id": 1977 + }, + { + "base_happiness": 70, + "capture_rate": 120, + "color_id": 10, + "conquest_order": "", + "evolves_from_species_id": "", + "forms_switchable": 0, + "gender_rate": 4, + "generation_id": 8, + "growth_rate_id": 2, + "habitat_id": 3, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 40, + "shape_id": 8, + "identifier": "darumaka-galar", + "id": 10171, + "evolution_chain_id": 1978 + }, + { + "base_happiness": 70, + "capture_rate": 60, + "color_id": 10, + "conquest_order": "", + "evolves_from_species_id": 10171, + "forms_switchable": 1, + "gender_rate": 4, + "generation_id": 8, + "growth_rate_id": 2, + "habitat_id": 3, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 40, + "shape_id": 8, + "identifier": "darmanitan-galar", + "id": 10172, + "evolution_chain_id": 1978 + }, + { + "base_happiness": 70, + "capture_rate": 190, + "color_id": 10, + "conquest_order": "", + "evolves_from_species_id": "", + "forms_switchable": 0, + "gender_rate": 4, + "generation_id": 8, + "growth_rate_id": 2, + "habitat_id": 3, + "has_gender_differences": 0, + "hatch_counter": 25, + "is_baby": 0, + "order": 40, + "shape_id": 8, + "identifier": "yamask-galar", + "id": 10173, + "evolution_chain_id": 1640 + }, + { + "base_happiness": 70, + "capture_rate": 75, + "color_id": 10, + "conquest_order": "", + "evolves_from_species_id": "", + "forms_switchable": 0, + "gender_rate": 4, + "generation_id": 8, + "growth_rate_id": 2, + "habitat_id": 3, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 40, + "shape_id": 8, + "identifier": "stunfisk-galar", + "id": 10174, + "evolution_chain_id": 1979 + }, + { + "base_happiness": 70, + "capture_rate": 10, + "color_id": 10, + "conquest_order": "", + "evolves_from_species_id": "", + "forms_switchable": 0, + "gender_rate": -1, + "generation_id": 8, + "growth_rate_id": 2, + "habitat_id": 3, + "has_gender_differences": 0, + "hatch_counter": 120, + "is_baby": 0, + "order": 40, + "shape_id": 8, + "identifier": "zamazenta-crowned", + "id": 10175, + "evolution_chain_id": 1980 + }, + { + "base_happiness": 70, + "capture_rate": 10, + "color_id": 10, + "conquest_order": "", + "evolves_from_species_id": "", + "forms_switchable": 0, + "gender_rate": -1, + "generation_id": 8, + "growth_rate_id": 2, + "habitat_id": 3, + "has_gender_differences": 0, + "hatch_counter": 120, + "is_baby": 0, + "order": 40, + "shape_id": 8, + "identifier": "zacian-crowned", + "id": 10176, + "evolution_chain_id": 1981 + }, + { + "base_happiness": 70, + "capture_rate": 3, + "color_id": 10, + "conquest_order": "", + "evolves_from_species_id": "", + "forms_switchable": 0, + "gender_rate": -1, + "generation_id": 8, + "growth_rate_id": 2, + "habitat_id": 3, + "has_gender_differences": 0, + "hatch_counter": 80, + "is_baby": 0, + "order": 40, + "shape_id": 8, + "identifier": "zapdos-galar", + "id": 10177, + "evolution_chain_id": 2006 + }, + { + "base_happiness": 70, + "capture_rate": 3, + "color_id": 10, + "conquest_order": "", + "evolves_from_species_id": "", + "forms_switchable": 0, + "gender_rate": -1, + "generation_id": 8, + "growth_rate_id": 2, + "habitat_id": 3, + "has_gender_differences": 0, + "hatch_counter": 80, + "is_baby": 0, + "order": 40, + "shape_id": 8, + "identifier": "articuno-galar", + "id": 10178, + "evolution_chain_id": 2005 + }, + { + "base_happiness": 70, + "capture_rate": 3, + "color_id": 10, + "conquest_order": "", + "evolves_from_species_id": "", + "forms_switchable": 0, + "gender_rate": -1, + "generation_id": 8, + "growth_rate_id": 2, + "habitat_id": 3, + "has_gender_differences": 0, + "hatch_counter": 80, + "is_baby": 0, + "order": 40, + "shape_id": 8, + "identifier": "moltres-galar", + "id": 10179, + "evolution_chain_id": 2007 + }, + { + "id": 10409, + "identifier": "zorua-hisui", + "generation_id": 8, + "evolution_chain_id": 2001, + "color_id": 10, + "shape_id": 8, + "habitat_id": 3, + "gender_rate": 1, + "capture_rate": 75, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 25, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 40, + "conquest_order": "", + "evolves_from_species_id": "" + }, + { + "id": 10411, + "identifier": "zoroark-hisui", + "generation_id": 8, + "evolves_from_species_id": 10409, + "evolution_chain_id": 2001, + "color_id": 10, + "shape_id": 8, + "habitat_id": 3, + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 40, + "conquest_order": "" + }, + { + "id": 10412, + "identifier": "voltorb-hisui", + "generation_id": 8, + "evolution_chain_id": 2002, + "color_id": 10, + "shape_id": 8, + "habitat_id": 3, + "gender_rate": -1, + "capture_rate": 190, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 40, + "conquest_order": "", + "evolves_from_species_id": "" + }, + { + "id": 10413, + "identifier": "typhlosion-hisui", + "generation_id": 8, + "evolution_chain_id": 80, + "color_id": 10, + "shape_id": 8, + "habitat_id": 3, + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 40, + "conquest_order": "", + "evolves_from_species_id": 156 + }, + { + "id": 10414, + "identifier": "sneasel-hisui", + "generation_id": 8, + "evolution_chain_id": 2004, + "color_id": 10, + "shape_id": 8, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 60, + "base_happiness": 35, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 40, + "conquest_order": "", + "evolves_from_species_id": "" + }, + { + "id": 10415, + "identifier": "sliggoo-hisui", + "generation_id": 8, + "evolution_chain_id": 362, + "color_id": 10, + "shape_id": 8, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 35, + "is_baby": 0, + "hatch_counter": 40, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 40, + "conquest_order": "", + "evolves_from_species_id": 704 + }, + { + "id": 10416, + "identifier": "samurott-hisui", + "generation_id": 8, + "evolution_chain_id": 258, + "color_id": 10, + "shape_id": 8, + "habitat_id": 3, + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 40, + "conquest_order": "", + "evolves_from_species_id": 502 + }, + { + "id": 10417, + "identifier": "qwilfish-hisui", + "generation_id": 8, + "evolution_chain_id": 2008, + "color_id": 10, + "shape_id": 8, + "habitat_id": 3, + "evolves_from_species_id": "", + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 40, + "conquest_order": "" + }, + { + "base_happiness": 70, + "capture_rate": 70, + "color_id": 10, + "conquest_order": "", + "evolves_from_species_id": 10163, + "forms_switchable": 0, + "gender_rate": 4, + "generation_id": 8, + "growth_rate_id": 2, + "habitat_id": 3, + "has_gender_differences": 0, + "hatch_counter": 20, + "is_baby": 0, + "order": 40, + "shape_id": 8, + "identifier": "slowking-galar", + "id": 10418, + "evolution_chain_id": 1976 + }, + { + "id": 10420, + "identifier": "goodra-hisui", + "generation_id": 8, + "evolves_from_species_id": 10415, + "evolution_chain_id": 362, + "color_id": 10, + "shape_id": 8, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 35, + "is_baby": 0, + "hatch_counter": 40, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 40, + "conquest_order": "" + }, + { + "id": 10421, + "identifier": "electrode-hisui", + "generation_id": 8, + "evolves_from_species_id": 10412, + "evolution_chain_id": 2002, + "color_id": 10, + "shape_id": 8, + "habitat_id": 3, + "gender_rate": -1, + "capture_rate": 60, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 40, + "conquest_order": "" + }, + { + "id": 10422, + "identifier": "decidueye-hisui", + "generation_id": 8, + "evolution_chain_id": 374, + "color_id": 10, + "shape_id": 8, + "habitat_id": 3, + "gender_rate": 1, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 15, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 40, + "evolves_from_species_id": 723, + "conquest_order": "" + }, + { + "id": 10423, + "identifier": "braviary-hisui", + "generation_id": 8, + "evolution_chain_id": 319, + "color_id": 10, + "shape_id": 8, + "habitat_id": 3, + "gender_rate": 0, + "capture_rate": 60, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 40, + "evolves_from_species_id": 627, + "conquest_order": "" + }, + { + "id": 10424, + "identifier": "avalugg-hisui", + "generation_id": 8, + "evolution_chain_id": 366, + "color_id": 10, + "shape_id": 8, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 55, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 40, + "evolves_from_species_id": 712, + "conquest_order": "" + }, + { + "id": 10425, + "identifier": "arcanine-hisui", + "generation_id": 8, + "evolves_from_species_id": 10440, + "evolution_chain_id": 2009, + "color_id": 10, + "shape_id": 8, + "habitat_id": 3, + "gender_rate": 2, + "capture_rate": 75, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 40, + "conquest_order": "" + }, + { + "id": 10426, + "identifier": "sneasler", + "generation_id": 8, + "evolves_from_species_id": 10414, + "evolution_chain_id": 2004, + "color_id": 10, + "shape_id": 8, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 35, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 4, + "forms_switchable": 0, + "order": 40, + "conquest_order": "" + }, + { + "id": 10427, + "identifier": "ursaluna", + "generation_id": 8, + "evolution_chain_id": 110, + "color_id": 10, + "shape_id": 8, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 60, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 40, + "evolves_from_species_id": 217, + "conquest_order": "" + }, + { + "id": 10428, + "identifier": "wyrdeer", + "generation_id": 8, + "evolution_chain_id": 120, + "color_id": 10, + "shape_id": 8, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 40, + "evolves_from_species_id": 234, + "conquest_order": "" + }, + { + "id": 10430, + "identifier": "basculegion", + "generation_id": 8, + "evolution_chain_id": 280, + "color_id": 10, + "shape_id": 8, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 25, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 40, + "has_gender_differences": 1, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 40, + "evolves_from_species_id": 550, + "conquest_order": "" + }, + { + "id": 10432, + "identifier": "palkia-origin", + "generation_id": 8, + "evolution_chain_id": 2016, + "color_id": 10, + "shape_id": 8, + "habitat_id": 3, + "gender_rate": -1, + "capture_rate": 3, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 120, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 40, + "evolves_from_species_id": null, + "conquest_order": "" + }, + { + "id": 10433, + "identifier": "overqwil", + "generation_id": 8, + "evolves_from_species_id": 10417, + "evolution_chain_id": 2008, + "color_id": 10, + "shape_id": 8, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 40, + "conquest_order": "" + }, + { + "id": 10434, + "identifier": "kleavor", + "generation_id": 8, + "evolution_chain_id": 58, + "color_id": 10, + "shape_id": 8, + "habitat_id": 3, + "gender_rate": 4, + "capture_rate": 25, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 25, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 40, + "evolves_from_species_id": 123, + "conquest_order": "" + }, + { + "id": 10435, + "identifier": "enamorus", + "generation_id": 8, + "evolution_chain_id": 2019, + "color_id": 10, + "shape_id": 8, + "habitat_id": 3, + "gender_rate": 8, + "capture_rate": 3, + "base_happiness": 90, + "is_baby": 0, + "hatch_counter": 120, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 40, + "evolves_from_species_id": "", + "conquest_order": "" + }, + { + "id": 10436, + "identifier": "enamorus-therian-forme", + "generation_id": 8, + "evolution_chain_id": 2020, + "color_id": 10, + "shape_id": 8, + "habitat_id": 3, + "gender_rate": 8, + "capture_rate": 3, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 120, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 40, + "evolves_from_species_id": "", + "conquest_order": "" + }, + { + "id": 10437, + "identifier": "dialga-origin", + "generation_id": 8, + "evolution_chain_id": 2021, + "color_id": 10, + "shape_id": 8, + "habitat_id": 3, + "gender_rate": -1, + "capture_rate": 3, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 120, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 40, + "evolves_from_species_id": null, + "conquest_order": "" + }, + { + "id": 10438, + "identifier": "lilligant-hisui", + "generation_id": 8, + "evolution_chain_id": 279, + "color_id": 10, + "shape_id": 8, + "habitat_id": 3, + "gender_rate": 8, + "capture_rate": 75, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 40, + "evolves_from_species_id": 548, + "conquest_order": "" + }, + { + "id": 10440, + "identifier": "growlithe-hisui", + "generation_id": 8, + "evolution_chain_id": 2009, + "color_id": 10, + "shape_id": 8, + "habitat_id": 3, + "gender_rate": 2, + "capture_rate": 190, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 40, + "evolves_from_species_id": "", + "conquest_order": "" + }, + { + "id": 11000, + "identifier": "tauros-paldea", + "generation_id": 9, + "evolves_from_species_id": "", + "evolution_chain_id": 3000, + "color_id": 3, + "shape_id": 8, + "habitat_id": 3, + "gender_rate": 0, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 152, + "conquest_order": "" + }, + { + "id": 11001, + "identifier": "wooper-paldea", + "generation_id": 2, + "evolves_from_species_id": "", + "evolution_chain_id": 3001, + "color_id": 2, + "shape_id": 7, + "habitat_id": 9, + "gender_rate": 4, + "capture_rate": 255, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 1, + "growth_rate_id": 2, + "forms_switchable": 0, + "order": 225, + "conquest_order": 18 + }, + { + "id": 11002, + "identifier": "tauros-aqua-paldea", + "generation_id": 9, + "evolves_from_species_id": "", + "evolution_chain_id": 3003, + "color_id": 3, + "shape_id": 8, + "habitat_id": 3, + "gender_rate": 0, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 152, + "conquest_order": "" + }, + { + "id": 11003, + "identifier": "tauros-blaze-paldea", + "generation_id": 9, + "evolves_from_species_id": "", + "evolution_chain_id": 3003, + "color_id": 3, + "shape_id": 8, + "habitat_id": 3, + "gender_rate": 0, + "capture_rate": 45, + "base_happiness": 70, + "is_baby": 0, + "hatch_counter": 20, + "has_gender_differences": 0, + "growth_rate_id": 1, + "forms_switchable": 0, + "order": 152, + "conquest_order": "" + } +] \ No newline at end of file diff --git a/pokemonduel/data/poke_abilities.json b/pokemonduel/data/poke_abilities.json new file mode 100644 index 0000000..b09b17d --- /dev/null +++ b/pokemonduel/data/poke_abilities.json @@ -0,0 +1,16950 @@ +[ + { + "pokemon_id": 1, + "ability_id": 65, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 1, + "ability_id": 34, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 2, + "ability_id": 65, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 2, + "ability_id": 34, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 3, + "ability_id": 65, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 3, + "ability_id": 34, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 4, + "ability_id": 66, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 4, + "ability_id": 94, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 5, + "ability_id": 66, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 5, + "ability_id": 94, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 6, + "ability_id": 66, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 6, + "ability_id": 94, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 7, + "ability_id": 67, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 7, + "ability_id": 44, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 8, + "ability_id": 67, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 8, + "ability_id": 44, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 9, + "ability_id": 67, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 9, + "ability_id": 44, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 10, + "ability_id": 19, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10, + "ability_id": 50, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 11, + "ability_id": 61, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 12, + "ability_id": 14, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 12, + "ability_id": 110, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 13, + "ability_id": 19, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 13, + "ability_id": 50, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 14, + "ability_id": 61, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 15, + "ability_id": 68, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 15, + "ability_id": 97, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 16, + "ability_id": 51, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 16, + "ability_id": 77, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 16, + "ability_id": 145, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 17, + "ability_id": 51, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 17, + "ability_id": 77, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 17, + "ability_id": 145, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 18, + "ability_id": 51, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 18, + "ability_id": 77, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 18, + "ability_id": 145, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 19, + "ability_id": 50, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 19, + "ability_id": 62, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 19, + "ability_id": 55, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 20, + "ability_id": 50, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 20, + "ability_id": 62, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 20, + "ability_id": 55, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 21, + "ability_id": 51, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 21, + "ability_id": 97, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 22, + "ability_id": 51, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 22, + "ability_id": 97, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 23, + "ability_id": 22, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 23, + "ability_id": 61, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 23, + "ability_id": 127, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 24, + "ability_id": 22, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 24, + "ability_id": 61, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 24, + "ability_id": 127, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 25, + "ability_id": 9, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 25, + "ability_id": 31, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 26, + "ability_id": 9, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 26, + "ability_id": 31, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 27, + "ability_id": 8, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 27, + "ability_id": 146, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 28, + "ability_id": 8, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 28, + "ability_id": 146, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 29, + "ability_id": 38, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 29, + "ability_id": 79, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 29, + "ability_id": 55, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 30, + "ability_id": 38, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 30, + "ability_id": 79, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 30, + "ability_id": 55, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 31, + "ability_id": 38, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 31, + "ability_id": 79, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 31, + "ability_id": 125, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 32, + "ability_id": 38, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 32, + "ability_id": 79, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 32, + "ability_id": 55, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 33, + "ability_id": 38, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 33, + "ability_id": 79, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 33, + "ability_id": 55, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 34, + "ability_id": 38, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 34, + "ability_id": 79, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 34, + "ability_id": 125, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 35, + "ability_id": 56, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 35, + "ability_id": 98, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 35, + "ability_id": 132, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 36, + "ability_id": 56, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 36, + "ability_id": 98, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 36, + "ability_id": 109, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 37, + "ability_id": 18, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 37, + "ability_id": 70, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 38, + "ability_id": 18, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 38, + "ability_id": 70, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 39, + "ability_id": 56, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 39, + "ability_id": 172, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 39, + "ability_id": 132, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 40, + "ability_id": 56, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 40, + "ability_id": 172, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 40, + "ability_id": 119, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 41, + "ability_id": 39, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 41, + "ability_id": 151, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 42, + "ability_id": 39, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 42, + "ability_id": 151, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 43, + "ability_id": 34, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 43, + "ability_id": 50, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 44, + "ability_id": 34, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 44, + "ability_id": 1, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 45, + "ability_id": 34, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 45, + "ability_id": 27, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 46, + "ability_id": 27, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 46, + "ability_id": 87, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 46, + "ability_id": 6, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 47, + "ability_id": 27, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 47, + "ability_id": 87, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 47, + "ability_id": 6, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 48, + "ability_id": 14, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 48, + "ability_id": 110, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 48, + "ability_id": 50, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 49, + "ability_id": 19, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 49, + "ability_id": 110, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 49, + "ability_id": 147, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 50, + "ability_id": 8, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 50, + "ability_id": 71, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 50, + "ability_id": 159, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 51, + "ability_id": 8, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 51, + "ability_id": 71, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 51, + "ability_id": 159, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 52, + "ability_id": 53, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 52, + "ability_id": 101, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 52, + "ability_id": 127, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 53, + "ability_id": 7, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 53, + "ability_id": 101, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 53, + "ability_id": 127, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 54, + "ability_id": 6, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 54, + "ability_id": 13, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 54, + "ability_id": 33, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 55, + "ability_id": 6, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 55, + "ability_id": 13, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 55, + "ability_id": 33, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 56, + "ability_id": 72, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 56, + "ability_id": 83, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 56, + "ability_id": 128, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 57, + "ability_id": 72, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 57, + "ability_id": 83, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 57, + "ability_id": 128, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 58, + "ability_id": 22, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 58, + "ability_id": 18, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 58, + "ability_id": 154, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 59, + "ability_id": 22, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 59, + "ability_id": 18, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 59, + "ability_id": 154, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 60, + "ability_id": 11, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 60, + "ability_id": 6, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 60, + "ability_id": 33, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 61, + "ability_id": 11, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 61, + "ability_id": 6, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 61, + "ability_id": 33, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 62, + "ability_id": 11, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 62, + "ability_id": 6, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 62, + "ability_id": 33, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 63, + "ability_id": 28, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 63, + "ability_id": 39, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 63, + "ability_id": 98, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 64, + "ability_id": 28, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 64, + "ability_id": 39, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 64, + "ability_id": 98, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 65, + "ability_id": 28, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 65, + "ability_id": 39, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 65, + "ability_id": 98, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 66, + "ability_id": 62, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 66, + "ability_id": 99, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 66, + "ability_id": 80, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 67, + "ability_id": 62, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 67, + "ability_id": 99, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 67, + "ability_id": 80, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 68, + "ability_id": 62, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 68, + "ability_id": 99, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 68, + "ability_id": 80, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 69, + "ability_id": 34, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 69, + "ability_id": 82, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 70, + "ability_id": 34, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 70, + "ability_id": 82, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 71, + "ability_id": 34, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 71, + "ability_id": 82, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 72, + "ability_id": 29, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 72, + "ability_id": 64, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 72, + "ability_id": 44, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 73, + "ability_id": 29, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 73, + "ability_id": 64, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 73, + "ability_id": 44, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 74, + "ability_id": 69, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 74, + "ability_id": 5, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 74, + "ability_id": 8, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 75, + "ability_id": 69, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 75, + "ability_id": 5, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 75, + "ability_id": 8, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 76, + "ability_id": 69, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 76, + "ability_id": 5, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 76, + "ability_id": 8, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 77, + "ability_id": 50, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 77, + "ability_id": 18, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 77, + "ability_id": 49, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 78, + "ability_id": 50, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 78, + "ability_id": 18, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 78, + "ability_id": 49, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 79, + "ability_id": 12, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 79, + "ability_id": 20, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 79, + "ability_id": 144, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 80, + "ability_id": 12, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 80, + "ability_id": 20, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 80, + "ability_id": 144, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 81, + "ability_id": 42, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 81, + "ability_id": 5, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 81, + "ability_id": 148, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 82, + "ability_id": 42, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 82, + "ability_id": 5, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 82, + "ability_id": 148, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 83, + "ability_id": 51, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 83, + "ability_id": 39, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 83, + "ability_id": 128, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 84, + "ability_id": 50, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 84, + "ability_id": 48, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 84, + "ability_id": 77, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 85, + "ability_id": 50, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 85, + "ability_id": 48, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 85, + "ability_id": 77, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 86, + "ability_id": 47, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 86, + "ability_id": 93, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 86, + "ability_id": 115, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 87, + "ability_id": 47, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 87, + "ability_id": 93, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 87, + "ability_id": 115, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 88, + "ability_id": 1, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 88, + "ability_id": 60, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 88, + "ability_id": 143, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 89, + "ability_id": 1, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 89, + "ability_id": 60, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 89, + "ability_id": 143, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 90, + "ability_id": 75, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 90, + "ability_id": 92, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 90, + "ability_id": 142, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 91, + "ability_id": 75, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 91, + "ability_id": 92, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 91, + "ability_id": 142, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 92, + "ability_id": 26, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 93, + "ability_id": 26, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 94, + "ability_id": 130, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 95, + "ability_id": 69, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 95, + "ability_id": 5, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 95, + "ability_id": 133, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 96, + "ability_id": 15, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 96, + "ability_id": 108, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 96, + "ability_id": 39, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 97, + "ability_id": 15, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 97, + "ability_id": 108, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 97, + "ability_id": 39, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 98, + "ability_id": 52, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 98, + "ability_id": 75, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 98, + "ability_id": 125, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 99, + "ability_id": 52, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 99, + "ability_id": 75, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 99, + "ability_id": 125, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 100, + "ability_id": 43, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 100, + "ability_id": 9, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 100, + "ability_id": 106, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 101, + "ability_id": 43, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 101, + "ability_id": 9, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 101, + "ability_id": 106, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 102, + "ability_id": 34, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 102, + "ability_id": 139, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 103, + "ability_id": 34, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 103, + "ability_id": 139, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 104, + "ability_id": 69, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 104, + "ability_id": 31, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 104, + "ability_id": 4, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 105, + "ability_id": 69, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 105, + "ability_id": 31, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 105, + "ability_id": 4, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 106, + "ability_id": 7, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 106, + "ability_id": 120, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 106, + "ability_id": 84, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 107, + "ability_id": 51, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 107, + "ability_id": 89, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 107, + "ability_id": 39, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 108, + "ability_id": 20, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 108, + "ability_id": 12, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 108, + "ability_id": 13, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 109, + "ability_id": 26, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 110, + "ability_id": 26, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 111, + "ability_id": 31, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 111, + "ability_id": 69, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 111, + "ability_id": 120, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 112, + "ability_id": 31, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 112, + "ability_id": 69, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 112, + "ability_id": 120, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 113, + "ability_id": 30, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 113, + "ability_id": 32, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 113, + "ability_id": 131, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 114, + "ability_id": 34, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 114, + "ability_id": 102, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 114, + "ability_id": 144, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 115, + "ability_id": 48, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 115, + "ability_id": 113, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 115, + "ability_id": 39, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 116, + "ability_id": 33, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 116, + "ability_id": 97, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 116, + "ability_id": 6, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 117, + "ability_id": 38, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 117, + "ability_id": 97, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 117, + "ability_id": 6, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 118, + "ability_id": 33, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 118, + "ability_id": 41, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 118, + "ability_id": 31, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 119, + "ability_id": 33, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 119, + "ability_id": 41, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 119, + "ability_id": 31, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 120, + "ability_id": 35, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 120, + "ability_id": 30, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 120, + "ability_id": 148, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 121, + "ability_id": 35, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 121, + "ability_id": 30, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 121, + "ability_id": 148, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 122, + "ability_id": 43, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 122, + "ability_id": 111, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 122, + "ability_id": 101, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 123, + "ability_id": 68, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 123, + "ability_id": 101, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 123, + "ability_id": 80, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 124, + "ability_id": 12, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 124, + "ability_id": 108, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 124, + "ability_id": 87, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 125, + "ability_id": 9, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 125, + "ability_id": 72, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 126, + "ability_id": 49, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 126, + "ability_id": 72, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 127, + "ability_id": 52, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 127, + "ability_id": 104, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 127, + "ability_id": 153, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 128, + "ability_id": 22, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 128, + "ability_id": 83, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 128, + "ability_id": 125, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 129, + "ability_id": 33, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 129, + "ability_id": 155, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 130, + "ability_id": 22, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 130, + "ability_id": 153, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 131, + "ability_id": 11, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 131, + "ability_id": 75, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 131, + "ability_id": 93, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 132, + "ability_id": 7, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 132, + "ability_id": 150, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 133, + "ability_id": 50, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 133, + "ability_id": 91, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 133, + "ability_id": 107, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 134, + "ability_id": 11, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 134, + "ability_id": 93, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 135, + "ability_id": 10, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 135, + "ability_id": 95, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 136, + "ability_id": 18, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 136, + "ability_id": 62, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 137, + "ability_id": 36, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 137, + "ability_id": 88, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 137, + "ability_id": 148, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 138, + "ability_id": 33, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 138, + "ability_id": 75, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 138, + "ability_id": 133, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 139, + "ability_id": 33, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 139, + "ability_id": 75, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 139, + "ability_id": 133, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 140, + "ability_id": 33, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 140, + "ability_id": 4, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 140, + "ability_id": 133, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 141, + "ability_id": 33, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 141, + "ability_id": 4, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 141, + "ability_id": 133, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 142, + "ability_id": 69, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 142, + "ability_id": 46, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 142, + "ability_id": 127, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 143, + "ability_id": 17, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 143, + "ability_id": 47, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 143, + "ability_id": 82, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 144, + "ability_id": 46, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 144, + "ability_id": 81, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 145, + "ability_id": 46, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 145, + "ability_id": 9, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 146, + "ability_id": 46, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 146, + "ability_id": 49, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 147, + "ability_id": 61, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 147, + "ability_id": 63, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 148, + "ability_id": 61, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 148, + "ability_id": 63, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 149, + "ability_id": 39, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 149, + "ability_id": 136, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 150, + "ability_id": 46, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 150, + "ability_id": 127, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 151, + "ability_id": 28, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 152, + "ability_id": 65, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 152, + "ability_id": 102, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 153, + "ability_id": 65, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 153, + "ability_id": 102, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 154, + "ability_id": 65, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 154, + "ability_id": 102, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 155, + "ability_id": 66, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 155, + "ability_id": 18, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 156, + "ability_id": 66, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 156, + "ability_id": 18, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 157, + "ability_id": 66, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 157, + "ability_id": 18, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 158, + "ability_id": 67, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 158, + "ability_id": 125, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 159, + "ability_id": 67, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 159, + "ability_id": 125, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 160, + "ability_id": 67, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 160, + "ability_id": 125, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 161, + "ability_id": 50, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 161, + "ability_id": 51, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 161, + "ability_id": 119, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 162, + "ability_id": 50, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 162, + "ability_id": 51, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 162, + "ability_id": 119, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 163, + "ability_id": 15, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 163, + "ability_id": 51, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 163, + "ability_id": 110, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 164, + "ability_id": 15, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 164, + "ability_id": 51, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 164, + "ability_id": 110, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 165, + "ability_id": 68, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 165, + "ability_id": 48, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 165, + "ability_id": 155, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 166, + "ability_id": 68, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 166, + "ability_id": 48, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 166, + "ability_id": 89, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 167, + "ability_id": 68, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 167, + "ability_id": 15, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 167, + "ability_id": 97, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 168, + "ability_id": 68, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 168, + "ability_id": 15, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 168, + "ability_id": 97, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 169, + "ability_id": 39, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 169, + "ability_id": 151, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 170, + "ability_id": 10, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 170, + "ability_id": 35, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 170, + "ability_id": 11, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 171, + "ability_id": 10, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 171, + "ability_id": 35, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 171, + "ability_id": 11, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 172, + "ability_id": 9, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 172, + "ability_id": 31, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 173, + "ability_id": 56, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 173, + "ability_id": 98, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 173, + "ability_id": 132, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 174, + "ability_id": 56, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 174, + "ability_id": 172, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 174, + "ability_id": 132, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 175, + "ability_id": 55, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 175, + "ability_id": 32, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 175, + "ability_id": 105, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 176, + "ability_id": 55, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 176, + "ability_id": 32, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 176, + "ability_id": 105, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 177, + "ability_id": 28, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 177, + "ability_id": 48, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 177, + "ability_id": 156, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 178, + "ability_id": 28, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 178, + "ability_id": 48, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 178, + "ability_id": 156, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 179, + "ability_id": 9, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 179, + "ability_id": 57, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 180, + "ability_id": 9, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 180, + "ability_id": 57, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 181, + "ability_id": 9, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 181, + "ability_id": 57, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 182, + "ability_id": 34, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 182, + "ability_id": 131, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 183, + "ability_id": 47, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 183, + "ability_id": 37, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 183, + "ability_id": 157, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 184, + "ability_id": 47, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 184, + "ability_id": 37, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 184, + "ability_id": 157, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 185, + "ability_id": 5, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 185, + "ability_id": 69, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 185, + "ability_id": 155, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 186, + "ability_id": 11, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 186, + "ability_id": 6, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 186, + "ability_id": 2, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 187, + "ability_id": 34, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 187, + "ability_id": 102, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 187, + "ability_id": 151, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 188, + "ability_id": 34, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 188, + "ability_id": 102, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 188, + "ability_id": 151, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 189, + "ability_id": 34, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 189, + "ability_id": 102, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 189, + "ability_id": 151, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 190, + "ability_id": 50, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 190, + "ability_id": 53, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 190, + "ability_id": 92, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 191, + "ability_id": 34, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 191, + "ability_id": 94, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 191, + "ability_id": 48, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 192, + "ability_id": 34, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 192, + "ability_id": 94, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 192, + "ability_id": 48, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 193, + "ability_id": 3, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 193, + "ability_id": 14, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 193, + "ability_id": 119, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 194, + "ability_id": 6, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 194, + "ability_id": 11, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 194, + "ability_id": 109, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 195, + "ability_id": 6, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 195, + "ability_id": 11, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 195, + "ability_id": 109, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 196, + "ability_id": 28, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 196, + "ability_id": 156, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 197, + "ability_id": 28, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 197, + "ability_id": 39, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 198, + "ability_id": 15, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 198, + "ability_id": 105, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 198, + "ability_id": 158, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 199, + "ability_id": 12, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 199, + "ability_id": 20, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 199, + "ability_id": 144, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 200, + "ability_id": 26, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 201, + "ability_id": 26, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 202, + "ability_id": 23, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 202, + "ability_id": 140, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 203, + "ability_id": 39, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 203, + "ability_id": 48, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 203, + "ability_id": 157, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 204, + "ability_id": 5, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 204, + "ability_id": 142, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 205, + "ability_id": 5, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 205, + "ability_id": 142, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 206, + "ability_id": 32, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 206, + "ability_id": 50, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 206, + "ability_id": 155, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 207, + "ability_id": 52, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 207, + "ability_id": 8, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 207, + "ability_id": 17, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 208, + "ability_id": 69, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 208, + "ability_id": 5, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 208, + "ability_id": 125, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 209, + "ability_id": 22, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 209, + "ability_id": 50, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 209, + "ability_id": 155, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 210, + "ability_id": 22, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 210, + "ability_id": 95, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 210, + "ability_id": 155, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 211, + "ability_id": 38, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 211, + "ability_id": 33, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 211, + "ability_id": 22, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 212, + "ability_id": 68, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 212, + "ability_id": 101, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 212, + "ability_id": 135, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 213, + "ability_id": 5, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 213, + "ability_id": 82, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 213, + "ability_id": 126, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 214, + "ability_id": 68, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 214, + "ability_id": 62, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 214, + "ability_id": 153, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 215, + "ability_id": 39, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 215, + "ability_id": 51, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 215, + "ability_id": 124, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 216, + "ability_id": 53, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 216, + "ability_id": 95, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 216, + "ability_id": 118, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 217, + "ability_id": 62, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 217, + "ability_id": 95, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 217, + "ability_id": 127, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 218, + "ability_id": 40, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 218, + "ability_id": 49, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 218, + "ability_id": 133, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 219, + "ability_id": 40, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 219, + "ability_id": 49, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 219, + "ability_id": 133, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 220, + "ability_id": 12, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 220, + "ability_id": 81, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 220, + "ability_id": 47, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 221, + "ability_id": 12, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 221, + "ability_id": 81, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 221, + "ability_id": 47, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 222, + "ability_id": 55, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 222, + "ability_id": 30, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 222, + "ability_id": 144, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 223, + "ability_id": 55, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 223, + "ability_id": 97, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 223, + "ability_id": 141, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 224, + "ability_id": 21, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 224, + "ability_id": 97, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 224, + "ability_id": 141, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 225, + "ability_id": 72, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 225, + "ability_id": 55, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 225, + "ability_id": 15, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 226, + "ability_id": 33, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 226, + "ability_id": 11, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 226, + "ability_id": 41, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 227, + "ability_id": 51, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 227, + "ability_id": 5, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 227, + "ability_id": 133, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 228, + "ability_id": 48, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 228, + "ability_id": 18, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 228, + "ability_id": 127, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 229, + "ability_id": 48, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 229, + "ability_id": 18, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 229, + "ability_id": 127, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 230, + "ability_id": 33, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 230, + "ability_id": 97, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 230, + "ability_id": 6, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 231, + "ability_id": 53, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 231, + "ability_id": 8, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 232, + "ability_id": 5, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 232, + "ability_id": 8, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 233, + "ability_id": 36, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 233, + "ability_id": 88, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 233, + "ability_id": 148, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 234, + "ability_id": 22, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 234, + "ability_id": 119, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 234, + "ability_id": 157, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 235, + "ability_id": 20, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 235, + "ability_id": 101, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 235, + "ability_id": 141, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 236, + "ability_id": 62, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 236, + "ability_id": 80, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 236, + "ability_id": 72, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 237, + "ability_id": 22, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 237, + "ability_id": 101, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 237, + "ability_id": 80, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 238, + "ability_id": 12, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 238, + "ability_id": 108, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 238, + "ability_id": 93, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 239, + "ability_id": 9, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 239, + "ability_id": 72, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 240, + "ability_id": 49, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 240, + "ability_id": 72, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 241, + "ability_id": 47, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 241, + "ability_id": 113, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 241, + "ability_id": 157, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 242, + "ability_id": 30, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 242, + "ability_id": 32, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 242, + "ability_id": 131, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 243, + "ability_id": 46, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 243, + "ability_id": 39, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 244, + "ability_id": 46, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 244, + "ability_id": 39, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 245, + "ability_id": 46, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 245, + "ability_id": 39, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 246, + "ability_id": 62, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 246, + "ability_id": 8, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 247, + "ability_id": 61, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 248, + "ability_id": 45, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 248, + "ability_id": 127, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 249, + "ability_id": 46, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 249, + "ability_id": 136, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 250, + "ability_id": 46, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 250, + "ability_id": 144, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 251, + "ability_id": 30, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 252, + "ability_id": 65, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 252, + "ability_id": 84, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 253, + "ability_id": 65, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 253, + "ability_id": 84, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 254, + "ability_id": 65, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 254, + "ability_id": 84, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 255, + "ability_id": 66, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 255, + "ability_id": 3, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 256, + "ability_id": 66, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 256, + "ability_id": 3, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 257, + "ability_id": 66, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 257, + "ability_id": 3, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 258, + "ability_id": 67, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 258, + "ability_id": 6, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 259, + "ability_id": 67, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 259, + "ability_id": 6, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 260, + "ability_id": 67, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 260, + "ability_id": 6, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 261, + "ability_id": 50, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 261, + "ability_id": 95, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 261, + "ability_id": 155, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 262, + "ability_id": 22, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 262, + "ability_id": 95, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 262, + "ability_id": 153, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 263, + "ability_id": 53, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 263, + "ability_id": 82, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 263, + "ability_id": 95, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 264, + "ability_id": 53, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 264, + "ability_id": 82, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 264, + "ability_id": 95, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 265, + "ability_id": 19, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 265, + "ability_id": 50, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 266, + "ability_id": 61, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 267, + "ability_id": 68, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 267, + "ability_id": 79, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 268, + "ability_id": 61, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 269, + "ability_id": 19, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 269, + "ability_id": 14, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 270, + "ability_id": 33, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 270, + "ability_id": 44, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 270, + "ability_id": 20, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 271, + "ability_id": 33, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 271, + "ability_id": 44, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 271, + "ability_id": 20, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 272, + "ability_id": 33, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 272, + "ability_id": 44, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 272, + "ability_id": 20, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 273, + "ability_id": 34, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 273, + "ability_id": 48, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 273, + "ability_id": 124, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 274, + "ability_id": 34, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 274, + "ability_id": 48, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 274, + "ability_id": 124, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 275, + "ability_id": 34, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 275, + "ability_id": 48, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 275, + "ability_id": 124, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 276, + "ability_id": 62, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 276, + "ability_id": 113, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 277, + "ability_id": 62, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 277, + "ability_id": 113, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 278, + "ability_id": 51, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 278, + "ability_id": 93, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 278, + "ability_id": 44, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 279, + "ability_id": 51, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 279, + "ability_id": 2, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 279, + "ability_id": 44, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 280, + "ability_id": 28, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 280, + "ability_id": 36, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 280, + "ability_id": 140, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 281, + "ability_id": 28, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 281, + "ability_id": 36, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 281, + "ability_id": 140, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 282, + "ability_id": 28, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 282, + "ability_id": 36, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 282, + "ability_id": 140, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 283, + "ability_id": 33, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 283, + "ability_id": 44, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 284, + "ability_id": 22, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 284, + "ability_id": 127, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 285, + "ability_id": 27, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 285, + "ability_id": 90, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 285, + "ability_id": 95, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 286, + "ability_id": 27, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 286, + "ability_id": 90, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 286, + "ability_id": 101, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 287, + "ability_id": 54, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 288, + "ability_id": 72, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 289, + "ability_id": 54, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 290, + "ability_id": 14, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 290, + "ability_id": 50, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 291, + "ability_id": 3, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 291, + "ability_id": 151, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 292, + "ability_id": 25, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 293, + "ability_id": 43, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 293, + "ability_id": 155, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 294, + "ability_id": 43, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 294, + "ability_id": 113, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 295, + "ability_id": 43, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 295, + "ability_id": 113, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 296, + "ability_id": 47, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 296, + "ability_id": 62, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 296, + "ability_id": 125, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 297, + "ability_id": 47, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 297, + "ability_id": 62, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 297, + "ability_id": 125, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 298, + "ability_id": 47, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 298, + "ability_id": 37, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 298, + "ability_id": 157, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 299, + "ability_id": 5, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 299, + "ability_id": 42, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 299, + "ability_id": 159, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 300, + "ability_id": 56, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 300, + "ability_id": 96, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 300, + "ability_id": 147, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 301, + "ability_id": 56, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 301, + "ability_id": 96, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 301, + "ability_id": 147, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 302, + "ability_id": 51, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 302, + "ability_id": 100, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 302, + "ability_id": 158, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 303, + "ability_id": 52, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 303, + "ability_id": 22, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 303, + "ability_id": 125, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 304, + "ability_id": 5, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 304, + "ability_id": 69, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 304, + "ability_id": 134, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 305, + "ability_id": 5, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 305, + "ability_id": 69, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 305, + "ability_id": 134, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 306, + "ability_id": 5, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 306, + "ability_id": 69, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 306, + "ability_id": 134, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 307, + "ability_id": 74, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 307, + "ability_id": 140, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 308, + "ability_id": 74, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 308, + "ability_id": 140, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 309, + "ability_id": 9, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 309, + "ability_id": 31, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 309, + "ability_id": 58, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 310, + "ability_id": 9, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 310, + "ability_id": 31, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 310, + "ability_id": 58, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 311, + "ability_id": 57, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 311, + "ability_id": 31, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 312, + "ability_id": 58, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 312, + "ability_id": 10, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 313, + "ability_id": 35, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 313, + "ability_id": 68, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 313, + "ability_id": 158, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 314, + "ability_id": 12, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 314, + "ability_id": 110, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 314, + "ability_id": 158, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 315, + "ability_id": 30, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 315, + "ability_id": 38, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 315, + "ability_id": 102, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 316, + "ability_id": 64, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 316, + "ability_id": 60, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 316, + "ability_id": 82, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 317, + "ability_id": 64, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 317, + "ability_id": 60, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 317, + "ability_id": 82, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 318, + "ability_id": 24, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 318, + "ability_id": 3, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 319, + "ability_id": 24, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 319, + "ability_id": 3, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 320, + "ability_id": 41, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 320, + "ability_id": 12, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 320, + "ability_id": 46, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 321, + "ability_id": 41, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 321, + "ability_id": 12, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 321, + "ability_id": 46, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 322, + "ability_id": 12, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 322, + "ability_id": 86, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 322, + "ability_id": 20, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 323, + "ability_id": 40, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 323, + "ability_id": 116, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 323, + "ability_id": 83, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 324, + "ability_id": 73, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 324, + "ability_id": 70, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 324, + "ability_id": 75, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 325, + "ability_id": 47, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 325, + "ability_id": 20, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 325, + "ability_id": 82, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 326, + "ability_id": 47, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 326, + "ability_id": 20, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 326, + "ability_id": 82, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 327, + "ability_id": 20, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 327, + "ability_id": 77, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 327, + "ability_id": 126, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 328, + "ability_id": 52, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 328, + "ability_id": 71, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 328, + "ability_id": 125, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 329, + "ability_id": 26, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 330, + "ability_id": 26, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 331, + "ability_id": 8, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 331, + "ability_id": 11, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 332, + "ability_id": 8, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 332, + "ability_id": 11, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 333, + "ability_id": 30, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 333, + "ability_id": 13, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 334, + "ability_id": 30, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 334, + "ability_id": 13, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 335, + "ability_id": 17, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 335, + "ability_id": 137, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 336, + "ability_id": 61, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 336, + "ability_id": 151, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 337, + "ability_id": 26, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 338, + "ability_id": 26, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 339, + "ability_id": 12, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 339, + "ability_id": 107, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 339, + "ability_id": 93, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 340, + "ability_id": 12, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 340, + "ability_id": 107, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 340, + "ability_id": 93, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 341, + "ability_id": 52, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 341, + "ability_id": 75, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 341, + "ability_id": 91, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 342, + "ability_id": 52, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 342, + "ability_id": 75, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 342, + "ability_id": 91, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 343, + "ability_id": 26, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 344, + "ability_id": 26, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 345, + "ability_id": 21, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 345, + "ability_id": 114, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 346, + "ability_id": 21, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 346, + "ability_id": 114, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 347, + "ability_id": 4, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 347, + "ability_id": 33, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 348, + "ability_id": 4, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 348, + "ability_id": 33, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 349, + "ability_id": 33, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 349, + "ability_id": 12, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 349, + "ability_id": 91, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 350, + "ability_id": 63, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 350, + "ability_id": 172, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 350, + "ability_id": 56, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 351, + "ability_id": 59, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 352, + "ability_id": 16, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 352, + "ability_id": 168, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 353, + "ability_id": 15, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 353, + "ability_id": 119, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 353, + "ability_id": 130, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 354, + "ability_id": 15, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 354, + "ability_id": 119, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 354, + "ability_id": 130, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 355, + "ability_id": 26, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 355, + "ability_id": 119, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 356, + "ability_id": 46, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 356, + "ability_id": 119, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 357, + "ability_id": 34, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 357, + "ability_id": 94, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 357, + "ability_id": 139, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 358, + "ability_id": 26, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 359, + "ability_id": 46, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 359, + "ability_id": 105, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 359, + "ability_id": 154, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 360, + "ability_id": 23, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 360, + "ability_id": 140, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 361, + "ability_id": 39, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 361, + "ability_id": 115, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 361, + "ability_id": 141, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 362, + "ability_id": 39, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 362, + "ability_id": 115, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 362, + "ability_id": 141, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 363, + "ability_id": 47, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 363, + "ability_id": 115, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 363, + "ability_id": 12, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 364, + "ability_id": 47, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 364, + "ability_id": 115, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 364, + "ability_id": 12, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 365, + "ability_id": 47, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 365, + "ability_id": 115, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 365, + "ability_id": 12, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 366, + "ability_id": 75, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 366, + "ability_id": 155, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 367, + "ability_id": 33, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 367, + "ability_id": 41, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 368, + "ability_id": 33, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 368, + "ability_id": 93, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 369, + "ability_id": 33, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 369, + "ability_id": 69, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 369, + "ability_id": 5, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 370, + "ability_id": 33, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 370, + "ability_id": 93, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 371, + "ability_id": 69, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 371, + "ability_id": 125, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 372, + "ability_id": 69, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 372, + "ability_id": 142, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 373, + "ability_id": 22, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 373, + "ability_id": 153, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 374, + "ability_id": 29, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 374, + "ability_id": 135, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 375, + "ability_id": 29, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 375, + "ability_id": 135, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 376, + "ability_id": 29, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 376, + "ability_id": 135, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 377, + "ability_id": 29, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 377, + "ability_id": 5, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 378, + "ability_id": 29, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 378, + "ability_id": 115, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 379, + "ability_id": 29, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 379, + "ability_id": 135, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 380, + "ability_id": 26, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 381, + "ability_id": 26, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 382, + "ability_id": 2, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 383, + "ability_id": 70, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 384, + "ability_id": 76, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 385, + "ability_id": 32, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 386, + "ability_id": 46, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 387, + "ability_id": 65, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 387, + "ability_id": 75, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 388, + "ability_id": 65, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 388, + "ability_id": 75, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 389, + "ability_id": 65, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 389, + "ability_id": 75, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 390, + "ability_id": 66, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 390, + "ability_id": 89, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 391, + "ability_id": 66, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 391, + "ability_id": 89, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 392, + "ability_id": 66, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 392, + "ability_id": 89, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 393, + "ability_id": 67, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 393, + "ability_id": 128, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 394, + "ability_id": 67, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 394, + "ability_id": 128, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 395, + "ability_id": 67, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 395, + "ability_id": 128, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 396, + "ability_id": 51, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 396, + "ability_id": 120, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 397, + "ability_id": 22, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 397, + "ability_id": 120, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 398, + "ability_id": 22, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 398, + "ability_id": 120, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 399, + "ability_id": 86, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 399, + "ability_id": 109, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 399, + "ability_id": 141, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 400, + "ability_id": 86, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 400, + "ability_id": 109, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 400, + "ability_id": 141, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 401, + "ability_id": 61, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 401, + "ability_id": 50, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 402, + "ability_id": 68, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 402, + "ability_id": 101, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 403, + "ability_id": 79, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 403, + "ability_id": 22, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 403, + "ability_id": 62, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 404, + "ability_id": 79, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 404, + "ability_id": 22, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 404, + "ability_id": 62, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 405, + "ability_id": 79, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 405, + "ability_id": 22, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 405, + "ability_id": 62, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 406, + "ability_id": 30, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 406, + "ability_id": 38, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 406, + "ability_id": 102, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 407, + "ability_id": 30, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 407, + "ability_id": 38, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 407, + "ability_id": 101, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 408, + "ability_id": 104, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 408, + "ability_id": 125, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 409, + "ability_id": 104, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 409, + "ability_id": 125, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 410, + "ability_id": 5, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 410, + "ability_id": 43, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 411, + "ability_id": 5, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 411, + "ability_id": 43, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 412, + "ability_id": 61, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 412, + "ability_id": 142, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 413, + "ability_id": 107, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 413, + "ability_id": 142, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 414, + "ability_id": 68, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 414, + "ability_id": 110, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 415, + "ability_id": 118, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 415, + "ability_id": 55, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 416, + "ability_id": 46, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 416, + "ability_id": 127, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 417, + "ability_id": 50, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 417, + "ability_id": 53, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 417, + "ability_id": 10, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 418, + "ability_id": 33, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 418, + "ability_id": 41, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 419, + "ability_id": 33, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 419, + "ability_id": 41, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 420, + "ability_id": 34, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 421, + "ability_id": 122, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 422, + "ability_id": 60, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 422, + "ability_id": 114, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 422, + "ability_id": 159, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 423, + "ability_id": 60, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 423, + "ability_id": 114, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 423, + "ability_id": 159, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 424, + "ability_id": 101, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 424, + "ability_id": 53, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 424, + "ability_id": 92, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 425, + "ability_id": 106, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 425, + "ability_id": 84, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 425, + "ability_id": 138, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 426, + "ability_id": 106, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 426, + "ability_id": 84, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 426, + "ability_id": 138, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 427, + "ability_id": 50, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 427, + "ability_id": 103, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 427, + "ability_id": 7, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 428, + "ability_id": 56, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 428, + "ability_id": 103, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 428, + "ability_id": 7, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 429, + "ability_id": 26, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 430, + "ability_id": 15, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 430, + "ability_id": 105, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 430, + "ability_id": 153, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 431, + "ability_id": 7, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 431, + "ability_id": 20, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 431, + "ability_id": 51, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 432, + "ability_id": 47, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 432, + "ability_id": 20, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 432, + "ability_id": 128, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 433, + "ability_id": 26, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 434, + "ability_id": 1, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 434, + "ability_id": 106, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 434, + "ability_id": 51, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 435, + "ability_id": 1, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 435, + "ability_id": 106, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 435, + "ability_id": 51, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 436, + "ability_id": 26, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 436, + "ability_id": 85, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 436, + "ability_id": 134, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 437, + "ability_id": 26, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 437, + "ability_id": 85, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 437, + "ability_id": 134, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 438, + "ability_id": 5, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 438, + "ability_id": 69, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 438, + "ability_id": 155, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 439, + "ability_id": 43, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 439, + "ability_id": 111, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 439, + "ability_id": 101, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 440, + "ability_id": 30, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 440, + "ability_id": 32, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 440, + "ability_id": 132, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 441, + "ability_id": 51, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 441, + "ability_id": 77, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 441, + "ability_id": 145, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 442, + "ability_id": 46, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 442, + "ability_id": 151, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 443, + "ability_id": 8, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 443, + "ability_id": 24, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 444, + "ability_id": 8, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 444, + "ability_id": 24, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 445, + "ability_id": 8, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 445, + "ability_id": 24, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 446, + "ability_id": 53, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 446, + "ability_id": 47, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 446, + "ability_id": 82, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 447, + "ability_id": 80, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 447, + "ability_id": 39, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 447, + "ability_id": 158, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 448, + "ability_id": 80, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 448, + "ability_id": 39, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 448, + "ability_id": 154, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 449, + "ability_id": 45, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 449, + "ability_id": 159, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 450, + "ability_id": 45, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 450, + "ability_id": 159, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 451, + "ability_id": 4, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 451, + "ability_id": 97, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 451, + "ability_id": 51, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 452, + "ability_id": 4, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 452, + "ability_id": 97, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 452, + "ability_id": 51, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 453, + "ability_id": 107, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 453, + "ability_id": 87, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 453, + "ability_id": 143, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 454, + "ability_id": 107, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 454, + "ability_id": 87, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 454, + "ability_id": 143, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 455, + "ability_id": 26, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 456, + "ability_id": 33, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 456, + "ability_id": 114, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 456, + "ability_id": 41, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 457, + "ability_id": 33, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 457, + "ability_id": 114, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 457, + "ability_id": 41, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 458, + "ability_id": 33, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 458, + "ability_id": 11, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 458, + "ability_id": 41, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 459, + "ability_id": 117, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 459, + "ability_id": 43, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 460, + "ability_id": 117, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 460, + "ability_id": 43, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 461, + "ability_id": 46, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 461, + "ability_id": 124, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 462, + "ability_id": 42, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 462, + "ability_id": 5, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 462, + "ability_id": 148, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 463, + "ability_id": 20, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 463, + "ability_id": 12, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 463, + "ability_id": 13, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 464, + "ability_id": 31, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 464, + "ability_id": 116, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 464, + "ability_id": 120, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 465, + "ability_id": 34, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 465, + "ability_id": 102, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 465, + "ability_id": 144, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 466, + "ability_id": 78, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 466, + "ability_id": 72, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 467, + "ability_id": 49, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 467, + "ability_id": 72, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 468, + "ability_id": 55, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 468, + "ability_id": 32, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 468, + "ability_id": 105, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 469, + "ability_id": 3, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 469, + "ability_id": 110, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 469, + "ability_id": 119, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 470, + "ability_id": 102, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 470, + "ability_id": 34, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 471, + "ability_id": 81, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 471, + "ability_id": 115, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 472, + "ability_id": 52, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 472, + "ability_id": 8, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 472, + "ability_id": 90, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 473, + "ability_id": 12, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 473, + "ability_id": 81, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 473, + "ability_id": 47, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 474, + "ability_id": 91, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 474, + "ability_id": 88, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 474, + "ability_id": 148, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 475, + "ability_id": 80, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 475, + "ability_id": 154, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 476, + "ability_id": 5, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 476, + "ability_id": 42, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 476, + "ability_id": 159, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 477, + "ability_id": 46, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 477, + "ability_id": 119, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 478, + "ability_id": 81, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 478, + "ability_id": 130, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 479, + "ability_id": 26, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 480, + "ability_id": 26, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 481, + "ability_id": 26, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 482, + "ability_id": 26, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 483, + "ability_id": 46, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 483, + "ability_id": 140, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 484, + "ability_id": 46, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 484, + "ability_id": 140, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 485, + "ability_id": 18, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 485, + "ability_id": 49, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 486, + "ability_id": 112, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 487, + "ability_id": 46, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 487, + "ability_id": 140, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 488, + "ability_id": 26, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 489, + "ability_id": 93, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 490, + "ability_id": 93, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 491, + "ability_id": 123, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 492, + "ability_id": 30, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 493, + "ability_id": 121, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 494, + "ability_id": 162, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 495, + "ability_id": 65, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 495, + "ability_id": 126, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 496, + "ability_id": 65, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 496, + "ability_id": 126, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 497, + "ability_id": 65, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 497, + "ability_id": 126, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 498, + "ability_id": 66, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 498, + "ability_id": 47, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 499, + "ability_id": 66, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 499, + "ability_id": 47, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 500, + "ability_id": 66, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 500, + "ability_id": 120, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 501, + "ability_id": 67, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 501, + "ability_id": 75, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 502, + "ability_id": 67, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 502, + "ability_id": 75, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 503, + "ability_id": 67, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 503, + "ability_id": 75, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 504, + "ability_id": 50, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 504, + "ability_id": 51, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 504, + "ability_id": 148, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 505, + "ability_id": 35, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 505, + "ability_id": 51, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 505, + "ability_id": 148, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 506, + "ability_id": 72, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 506, + "ability_id": 53, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 506, + "ability_id": 50, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 507, + "ability_id": 22, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 507, + "ability_id": 146, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 507, + "ability_id": 113, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 508, + "ability_id": 22, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 508, + "ability_id": 146, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 508, + "ability_id": 113, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 509, + "ability_id": 7, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 509, + "ability_id": 84, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 509, + "ability_id": 158, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 510, + "ability_id": 7, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 510, + "ability_id": 84, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 510, + "ability_id": 158, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 511, + "ability_id": 82, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 511, + "ability_id": 65, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 512, + "ability_id": 82, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 512, + "ability_id": 65, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 513, + "ability_id": 82, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 513, + "ability_id": 66, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 514, + "ability_id": 82, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 514, + "ability_id": 66, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 515, + "ability_id": 82, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 515, + "ability_id": 67, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 516, + "ability_id": 82, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 516, + "ability_id": 67, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 517, + "ability_id": 108, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 517, + "ability_id": 28, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 517, + "ability_id": 140, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 518, + "ability_id": 108, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 518, + "ability_id": 28, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 518, + "ability_id": 140, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 519, + "ability_id": 145, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 519, + "ability_id": 105, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 519, + "ability_id": 79, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 520, + "ability_id": 145, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 520, + "ability_id": 105, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 520, + "ability_id": 79, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 521, + "ability_id": 145, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 521, + "ability_id": 105, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 521, + "ability_id": 79, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 522, + "ability_id": 31, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 522, + "ability_id": 78, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 522, + "ability_id": 157, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 523, + "ability_id": 31, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 523, + "ability_id": 78, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 523, + "ability_id": 157, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 524, + "ability_id": 5, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 524, + "ability_id": 133, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 524, + "ability_id": 159, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 525, + "ability_id": 5, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 525, + "ability_id": 133, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 525, + "ability_id": 159, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 526, + "ability_id": 5, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 526, + "ability_id": 45, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 526, + "ability_id": 159, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 527, + "ability_id": 109, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 527, + "ability_id": 103, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 527, + "ability_id": 86, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 528, + "ability_id": 109, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 528, + "ability_id": 103, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 528, + "ability_id": 86, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 529, + "ability_id": 146, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 529, + "ability_id": 159, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 529, + "ability_id": 104, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 530, + "ability_id": 146, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 530, + "ability_id": 159, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 530, + "ability_id": 104, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 531, + "ability_id": 131, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 531, + "ability_id": 144, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 531, + "ability_id": 103, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 532, + "ability_id": 62, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 532, + "ability_id": 125, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 532, + "ability_id": 89, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 533, + "ability_id": 62, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 533, + "ability_id": 125, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 533, + "ability_id": 89, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 534, + "ability_id": 62, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 534, + "ability_id": 125, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 534, + "ability_id": 89, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 535, + "ability_id": 33, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 535, + "ability_id": 93, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 535, + "ability_id": 11, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 536, + "ability_id": 33, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 536, + "ability_id": 93, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 536, + "ability_id": 11, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 537, + "ability_id": 33, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 537, + "ability_id": 143, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 537, + "ability_id": 11, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 538, + "ability_id": 62, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 538, + "ability_id": 39, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 538, + "ability_id": 104, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 539, + "ability_id": 5, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 539, + "ability_id": 39, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 539, + "ability_id": 104, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 540, + "ability_id": 68, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 540, + "ability_id": 34, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 540, + "ability_id": 142, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 541, + "ability_id": 102, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 541, + "ability_id": 34, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 541, + "ability_id": 142, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 542, + "ability_id": 68, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 542, + "ability_id": 34, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 542, + "ability_id": 142, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 543, + "ability_id": 38, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 543, + "ability_id": 68, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 543, + "ability_id": 3, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 544, + "ability_id": 38, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 544, + "ability_id": 68, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 544, + "ability_id": 3, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 545, + "ability_id": 38, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 545, + "ability_id": 68, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 545, + "ability_id": 3, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 546, + "ability_id": 158, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 546, + "ability_id": 151, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 546, + "ability_id": 34, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 547, + "ability_id": 158, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 547, + "ability_id": 151, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 547, + "ability_id": 34, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 548, + "ability_id": 34, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 548, + "ability_id": 20, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 548, + "ability_id": 102, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 549, + "ability_id": 34, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 549, + "ability_id": 20, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 549, + "ability_id": 102, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 550, + "ability_id": 120, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 550, + "ability_id": 91, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 550, + "ability_id": 104, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 551, + "ability_id": 22, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 551, + "ability_id": 153, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 551, + "ability_id": 83, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 552, + "ability_id": 22, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 552, + "ability_id": 153, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 552, + "ability_id": 83, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 553, + "ability_id": 22, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 553, + "ability_id": 153, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 553, + "ability_id": 83, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 554, + "ability_id": 55, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 554, + "ability_id": 39, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 555, + "ability_id": 125, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 555, + "ability_id": 161, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 556, + "ability_id": 11, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 556, + "ability_id": 34, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 556, + "ability_id": 114, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 557, + "ability_id": 5, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 557, + "ability_id": 75, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 557, + "ability_id": 133, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 558, + "ability_id": 5, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 558, + "ability_id": 75, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 558, + "ability_id": 133, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 559, + "ability_id": 61, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 559, + "ability_id": 153, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 559, + "ability_id": 22, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 560, + "ability_id": 61, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 560, + "ability_id": 153, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 560, + "ability_id": 22, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 561, + "ability_id": 147, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 561, + "ability_id": 98, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 561, + "ability_id": 110, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 562, + "ability_id": 152, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 563, + "ability_id": 152, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 564, + "ability_id": 116, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 564, + "ability_id": 5, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 564, + "ability_id": 33, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 565, + "ability_id": 116, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 565, + "ability_id": 5, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 565, + "ability_id": 33, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 566, + "ability_id": 129, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 567, + "ability_id": 129, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 568, + "ability_id": 1, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 568, + "ability_id": 60, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 568, + "ability_id": 106, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 569, + "ability_id": 1, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 569, + "ability_id": 133, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 569, + "ability_id": 106, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 570, + "ability_id": 149, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 571, + "ability_id": 149, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 572, + "ability_id": 56, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 572, + "ability_id": 101, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 572, + "ability_id": 92, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 573, + "ability_id": 56, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 573, + "ability_id": 101, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 573, + "ability_id": 92, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 574, + "ability_id": 119, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 574, + "ability_id": 172, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 574, + "ability_id": 23, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 575, + "ability_id": 119, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 575, + "ability_id": 172, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 575, + "ability_id": 23, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 576, + "ability_id": 119, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 576, + "ability_id": 172, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 576, + "ability_id": 23, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 577, + "ability_id": 142, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 577, + "ability_id": 98, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 577, + "ability_id": 144, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 578, + "ability_id": 142, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 578, + "ability_id": 98, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 578, + "ability_id": 144, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 579, + "ability_id": 142, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 579, + "ability_id": 98, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 579, + "ability_id": 144, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 580, + "ability_id": 51, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 580, + "ability_id": 145, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 580, + "ability_id": 93, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 581, + "ability_id": 51, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 581, + "ability_id": 145, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 581, + "ability_id": 93, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 582, + "ability_id": 115, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 582, + "ability_id": 81, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 582, + "ability_id": 133, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 583, + "ability_id": 115, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 583, + "ability_id": 81, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 583, + "ability_id": 133, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 584, + "ability_id": 115, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 584, + "ability_id": 117, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 584, + "ability_id": 133, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 585, + "ability_id": 34, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 585, + "ability_id": 157, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 585, + "ability_id": 32, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 586, + "ability_id": 34, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 586, + "ability_id": 157, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 586, + "ability_id": 32, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 587, + "ability_id": 9, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 587, + "ability_id": 78, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 588, + "ability_id": 68, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 588, + "ability_id": 61, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 588, + "ability_id": 99, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 589, + "ability_id": 68, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 589, + "ability_id": 75, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 589, + "ability_id": 142, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 590, + "ability_id": 27, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 590, + "ability_id": 144, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 591, + "ability_id": 27, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 591, + "ability_id": 144, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 592, + "ability_id": 11, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 592, + "ability_id": 130, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 592, + "ability_id": 6, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 593, + "ability_id": 11, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 593, + "ability_id": 130, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 593, + "ability_id": 6, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 594, + "ability_id": 131, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 594, + "ability_id": 93, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 594, + "ability_id": 144, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 595, + "ability_id": 14, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 595, + "ability_id": 127, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 595, + "ability_id": 68, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 596, + "ability_id": 14, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 596, + "ability_id": 127, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 596, + "ability_id": 68, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 597, + "ability_id": 160, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 598, + "ability_id": 160, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 598, + "ability_id": 107, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 599, + "ability_id": 57, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 599, + "ability_id": 58, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 599, + "ability_id": 29, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 600, + "ability_id": 57, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 600, + "ability_id": 58, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 600, + "ability_id": 29, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 601, + "ability_id": 57, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 601, + "ability_id": 58, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 601, + "ability_id": 29, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 602, + "ability_id": 26, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 603, + "ability_id": 26, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 604, + "ability_id": 26, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 605, + "ability_id": 140, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 605, + "ability_id": 28, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 605, + "ability_id": 148, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 606, + "ability_id": 140, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 606, + "ability_id": 28, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 606, + "ability_id": 148, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 607, + "ability_id": 18, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 607, + "ability_id": 49, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 607, + "ability_id": 151, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 608, + "ability_id": 18, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 608, + "ability_id": 49, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 608, + "ability_id": 151, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 609, + "ability_id": 18, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 609, + "ability_id": 49, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 609, + "ability_id": 151, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 610, + "ability_id": 79, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 610, + "ability_id": 104, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 610, + "ability_id": 127, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 611, + "ability_id": 79, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 611, + "ability_id": 104, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 611, + "ability_id": 127, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 612, + "ability_id": 79, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 612, + "ability_id": 104, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 612, + "ability_id": 127, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 613, + "ability_id": 81, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 613, + "ability_id": 202, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 613, + "ability_id": 155, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 614, + "ability_id": 81, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 614, + "ability_id": 202, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 614, + "ability_id": 33, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 615, + "ability_id": 26, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 616, + "ability_id": 93, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 616, + "ability_id": 75, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 616, + "ability_id": 142, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 617, + "ability_id": 93, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 617, + "ability_id": 60, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 617, + "ability_id": 84, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 618, + "ability_id": 9, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 618, + "ability_id": 7, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 618, + "ability_id": 8, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 619, + "ability_id": 39, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 619, + "ability_id": 144, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 619, + "ability_id": 120, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 620, + "ability_id": 39, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 620, + "ability_id": 144, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 620, + "ability_id": 120, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 621, + "ability_id": 24, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 621, + "ability_id": 125, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 621, + "ability_id": 104, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 622, + "ability_id": 89, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 622, + "ability_id": 103, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 622, + "ability_id": 99, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 623, + "ability_id": 89, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 623, + "ability_id": 103, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 623, + "ability_id": 99, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 624, + "ability_id": 128, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 624, + "ability_id": 39, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 624, + "ability_id": 46, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 625, + "ability_id": 128, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 625, + "ability_id": 39, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 625, + "ability_id": 46, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 626, + "ability_id": 120, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 626, + "ability_id": 157, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 626, + "ability_id": 43, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 627, + "ability_id": 51, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 627, + "ability_id": 125, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 627, + "ability_id": 55, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 628, + "ability_id": 51, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 628, + "ability_id": 125, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 628, + "ability_id": 128, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 629, + "ability_id": 145, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 629, + "ability_id": 142, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 629, + "ability_id": 133, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 630, + "ability_id": 145, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 630, + "ability_id": 142, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 630, + "ability_id": 133, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 631, + "ability_id": 82, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 631, + "ability_id": 18, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 631, + "ability_id": 73, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 632, + "ability_id": 68, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 632, + "ability_id": 55, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 632, + "ability_id": 54, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 633, + "ability_id": 55, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 634, + "ability_id": 55, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 635, + "ability_id": 26, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 636, + "ability_id": 49, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 636, + "ability_id": 68, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 637, + "ability_id": 49, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 637, + "ability_id": 68, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 638, + "ability_id": 154, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 639, + "ability_id": 154, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 640, + "ability_id": 154, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 641, + "ability_id": 158, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 641, + "ability_id": 128, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 642, + "ability_id": 158, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 642, + "ability_id": 128, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 643, + "ability_id": 163, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 644, + "ability_id": 164, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 645, + "ability_id": 159, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 645, + "ability_id": 125, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 646, + "ability_id": 46, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 647, + "ability_id": 154, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 648, + "ability_id": 32, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 649, + "ability_id": 88, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 650, + "ability_id": 65, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 650, + "ability_id": 171, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 651, + "ability_id": 65, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 651, + "ability_id": 171, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 652, + "ability_id": 65, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 652, + "ability_id": 171, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 653, + "ability_id": 66, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 653, + "ability_id": 170, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 654, + "ability_id": 66, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 654, + "ability_id": 170, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 655, + "ability_id": 66, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 655, + "ability_id": 170, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 656, + "ability_id": 67, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 656, + "ability_id": 168, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 657, + "ability_id": 67, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 657, + "ability_id": 168, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 658, + "ability_id": 67, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 658, + "ability_id": 168, + "is_hidden": 1, + "slot": 2 + }, + { + "pokemon_id": 659, + "ability_id": 53, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 659, + "ability_id": 167, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 659, + "ability_id": 37, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 660, + "ability_id": 53, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 660, + "ability_id": 167, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 660, + "ability_id": 37, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 661, + "ability_id": 145, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 661, + "ability_id": 177, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 662, + "ability_id": 49, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 662, + "ability_id": 177, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 663, + "ability_id": 49, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 663, + "ability_id": 177, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 664, + "ability_id": 19, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 664, + "ability_id": 14, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 664, + "ability_id": 132, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 665, + "ability_id": 61, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 665, + "ability_id": 132, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 666, + "ability_id": 19, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 666, + "ability_id": 14, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 666, + "ability_id": 132, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 667, + "ability_id": 79, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 667, + "ability_id": 127, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 667, + "ability_id": 153, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 668, + "ability_id": 79, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 668, + "ability_id": 127, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 668, + "ability_id": 153, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 669, + "ability_id": 166, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 669, + "ability_id": 180, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 670, + "ability_id": 166, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 670, + "ability_id": 180, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 671, + "ability_id": 166, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 671, + "ability_id": 180, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 672, + "ability_id": 157, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 672, + "ability_id": 179, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 673, + "ability_id": 157, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 673, + "ability_id": 179, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 674, + "ability_id": 89, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 674, + "ability_id": 104, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 674, + "ability_id": 113, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 675, + "ability_id": 89, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 675, + "ability_id": 104, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 675, + "ability_id": 113, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 676, + "ability_id": 169, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 677, + "ability_id": 51, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 677, + "ability_id": 151, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 677, + "ability_id": 20, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 678, + "ability_id": 51, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 678, + "ability_id": 151, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 678, + "ability_id": 158, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 679, + "ability_id": 99, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 680, + "ability_id": 99, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 681, + "ability_id": 176, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 682, + "ability_id": 131, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 682, + "ability_id": 165, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 683, + "ability_id": 131, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 683, + "ability_id": 165, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 684, + "ability_id": 175, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 684, + "ability_id": 84, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 685, + "ability_id": 175, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 685, + "ability_id": 84, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 686, + "ability_id": 126, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 686, + "ability_id": 21, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 686, + "ability_id": 151, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 687, + "ability_id": 126, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 687, + "ability_id": 21, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 687, + "ability_id": 151, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 688, + "ability_id": 181, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 688, + "ability_id": 97, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 688, + "ability_id": 124, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 689, + "ability_id": 181, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 689, + "ability_id": 97, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 689, + "ability_id": 124, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 690, + "ability_id": 38, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 690, + "ability_id": 143, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 690, + "ability_id": 91, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 691, + "ability_id": 38, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 691, + "ability_id": 143, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 691, + "ability_id": 91, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 692, + "ability_id": 178, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 693, + "ability_id": 178, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 694, + "ability_id": 87, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 694, + "ability_id": 8, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 694, + "ability_id": 94, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 695, + "ability_id": 87, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 695, + "ability_id": 8, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 695, + "ability_id": 94, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 696, + "ability_id": 173, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 696, + "ability_id": 5, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 697, + "ability_id": 173, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 697, + "ability_id": 69, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 698, + "ability_id": 174, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 698, + "ability_id": 117, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 699, + "ability_id": 174, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 699, + "ability_id": 117, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 700, + "ability_id": 56, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 700, + "ability_id": 182, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 701, + "ability_id": 7, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 701, + "ability_id": 84, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 701, + "ability_id": 104, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 702, + "ability_id": 167, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 702, + "ability_id": 53, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 702, + "ability_id": 57, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 703, + "ability_id": 29, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 703, + "ability_id": 5, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 704, + "ability_id": 157, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 704, + "ability_id": 93, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 704, + "ability_id": 183, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 705, + "ability_id": 157, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 705, + "ability_id": 93, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 705, + "ability_id": 183, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 706, + "ability_id": 157, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 706, + "ability_id": 93, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 706, + "ability_id": 183, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 707, + "ability_id": 158, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 707, + "ability_id": 170, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 708, + "ability_id": 30, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 708, + "ability_id": 119, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 708, + "ability_id": 139, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 709, + "ability_id": 30, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 709, + "ability_id": 119, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 709, + "ability_id": 139, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 710, + "ability_id": 53, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 710, + "ability_id": 119, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 710, + "ability_id": 15, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 711, + "ability_id": 53, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 711, + "ability_id": 119, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 711, + "ability_id": 15, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 712, + "ability_id": 20, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 712, + "ability_id": 115, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 712, + "ability_id": 5, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 713, + "ability_id": 20, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 713, + "ability_id": 115, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 713, + "ability_id": 5, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 714, + "ability_id": 119, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 714, + "ability_id": 151, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 714, + "ability_id": 140, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 715, + "ability_id": 119, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 715, + "ability_id": 151, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 715, + "ability_id": 140, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 716, + "ability_id": 187, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 717, + "ability_id": 186, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 718, + "ability_id": 188, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 719, + "ability_id": 29, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 720, + "ability_id": 170, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 721, + "ability_id": 11, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 722, + "ability_id": 65, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 722, + "ability_id": 203, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 723, + "ability_id": 65, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 723, + "ability_id": 203, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 724, + "ability_id": 65, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 724, + "ability_id": 203, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 725, + "ability_id": 66, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 725, + "ability_id": 22, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 726, + "ability_id": 66, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 726, + "ability_id": 22, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 727, + "ability_id": 22, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 728, + "ability_id": 67, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 728, + "ability_id": 204, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 729, + "ability_id": 67, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 729, + "ability_id": 204, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 730, + "ability_id": 67, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 730, + "ability_id": 204, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 731, + "ability_id": 51, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 731, + "ability_id": 92, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 731, + "ability_id": 53, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 732, + "ability_id": 51, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 732, + "ability_id": 92, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 732, + "ability_id": 53, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 733, + "ability_id": 51, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 733, + "ability_id": 92, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 733, + "ability_id": 125, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 734, + "ability_id": 198, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 734, + "ability_id": 173, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 734, + "ability_id": 91, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 735, + "ability_id": 198, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 735, + "ability_id": 173, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 735, + "ability_id": 91, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 736, + "ability_id": 68, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 737, + "ability_id": 217, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 738, + "ability_id": 26, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 739, + "ability_id": 52, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 739, + "ability_id": 89, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 739, + "ability_id": 83, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 740, + "ability_id": 52, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 740, + "ability_id": 89, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 740, + "ability_id": 83, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 741, + "ability_id": 216, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 742, + "ability_id": 118, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 742, + "ability_id": 19, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 742, + "ability_id": 175, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 743, + "ability_id": 118, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 743, + "ability_id": 19, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 743, + "ability_id": 175, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 744, + "ability_id": 51, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 744, + "ability_id": 72, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 744, + "ability_id": 80, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 745, + "ability_id": 51, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 745, + "ability_id": 146, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 745, + "ability_id": 80, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 746, + "ability_id": 208, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 747, + "ability_id": 196, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 747, + "ability_id": 7, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 747, + "ability_id": 144, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 748, + "ability_id": 196, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 748, + "ability_id": 7, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 748, + "ability_id": 144, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 749, + "ability_id": 20, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 749, + "ability_id": 192, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 749, + "ability_id": 39, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 750, + "ability_id": 20, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 750, + "ability_id": 192, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 750, + "ability_id": 39, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 751, + "ability_id": 199, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 751, + "ability_id": 11, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 752, + "ability_id": 199, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 752, + "ability_id": 11, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 753, + "ability_id": 102, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 753, + "ability_id": 126, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 754, + "ability_id": 102, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 754, + "ability_id": 126, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 755, + "ability_id": 35, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 755, + "ability_id": 27, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 755, + "ability_id": 44, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 756, + "ability_id": 35, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 756, + "ability_id": 27, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 756, + "ability_id": 44, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 757, + "ability_id": 212, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 757, + "ability_id": 12, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 758, + "ability_id": 212, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 758, + "ability_id": 12, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 759, + "ability_id": 218, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 759, + "ability_id": 103, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 759, + "ability_id": 56, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 760, + "ability_id": 218, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 760, + "ability_id": 103, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 760, + "ability_id": 127, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 761, + "ability_id": 102, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 761, + "ability_id": 12, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 761, + "ability_id": 175, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 762, + "ability_id": 102, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 762, + "ability_id": 12, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 762, + "ability_id": 175, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 763, + "ability_id": 102, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 763, + "ability_id": 214, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 763, + "ability_id": 175, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 764, + "ability_id": 166, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 764, + "ability_id": 205, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 764, + "ability_id": 30, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 765, + "ability_id": 39, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 765, + "ability_id": 140, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 765, + "ability_id": 180, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 766, + "ability_id": 222, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 766, + "ability_id": 128, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 767, + "ability_id": 193, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 768, + "ability_id": 194, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 769, + "ability_id": 195, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 769, + "ability_id": 8, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 770, + "ability_id": 195, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 770, + "ability_id": 8, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 771, + "ability_id": 215, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 771, + "ability_id": 109, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 772, + "ability_id": 4, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 773, + "ability_id": 225, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 774, + "ability_id": 197, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 775, + "ability_id": 213, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 776, + "ability_id": 75, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 777, + "ability_id": 160, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 777, + "ability_id": 31, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 777, + "ability_id": 5, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 778, + "ability_id": 209, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 779, + "ability_id": 219, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 779, + "ability_id": 173, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 779, + "ability_id": 147, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 780, + "ability_id": 201, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 780, + "ability_id": 157, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 780, + "ability_id": 13, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 781, + "ability_id": 200, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 782, + "ability_id": 171, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 782, + "ability_id": 43, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 782, + "ability_id": 142, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 783, + "ability_id": 171, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 783, + "ability_id": 43, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 783, + "ability_id": 142, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 784, + "ability_id": 171, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 784, + "ability_id": 43, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 784, + "ability_id": 142, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 785, + "ability_id": 226, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 785, + "ability_id": 140, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 786, + "ability_id": 227, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 786, + "ability_id": 140, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 787, + "ability_id": 229, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 787, + "ability_id": 140, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 788, + "ability_id": 228, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 788, + "ability_id": 140, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 789, + "ability_id": 109, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 790, + "ability_id": 5, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 791, + "ability_id": 230, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 792, + "ability_id": 231, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 793, + "ability_id": 224, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 794, + "ability_id": 224, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 795, + "ability_id": 224, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 796, + "ability_id": 224, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 797, + "ability_id": 224, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 798, + "ability_id": 224, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 799, + "ability_id": 224, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 800, + "ability_id": 232, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 801, + "ability_id": 220, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 802, + "ability_id": 101, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 803, + "ability_id": 224, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 804, + "ability_id": 224, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 805, + "ability_id": 224, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 806, + "ability_id": 224, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 807, + "ability_id": 10, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 808, + "ability_id": 42, + "slot": 1 + }, + { + "pokemon_id": 809, + "ability_id": 89, + "slot": 1 + }, + { + "pokemon_id": 10001, + "ability_id": 46, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10002, + "ability_id": 46, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10003, + "ability_id": 46, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10004, + "ability_id": 107, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10004, + "ability_id": 142, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 10005, + "ability_id": 107, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10005, + "ability_id": 142, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 10006, + "ability_id": 32, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10007, + "ability_id": 26, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10008, + "ability_id": 26, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10009, + "ability_id": 26, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10010, + "ability_id": 26, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10011, + "ability_id": 26, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10012, + "ability_id": 26, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10013, + "ability_id": 59, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10014, + "ability_id": 59, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10015, + "ability_id": 59, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10016, + "ability_id": 69, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10016, + "ability_id": 91, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 10016, + "ability_id": 104, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 10017, + "ability_id": 125, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10017, + "ability_id": 161, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 10018, + "ability_id": 32, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10019, + "ability_id": 144, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10020, + "ability_id": 10, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10021, + "ability_id": 22, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10022, + "ability_id": 164, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10023, + "ability_id": 163, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10024, + "ability_id": 154, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10025, + "ability_id": 51, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10025, + "ability_id": 151, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 10025, + "ability_id": 172, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 10026, + "ability_id": 176, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10027, + "ability_id": 53, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10027, + "ability_id": 119, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 10027, + "ability_id": 15, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 10028, + "ability_id": 53, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10028, + "ability_id": 119, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 10028, + "ability_id": 15, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 10029, + "ability_id": 53, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10029, + "ability_id": 119, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 10029, + "ability_id": 15, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 10030, + "ability_id": 53, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10030, + "ability_id": 119, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 10030, + "ability_id": 15, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 10031, + "ability_id": 53, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10031, + "ability_id": 119, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 10031, + "ability_id": 15, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 10032, + "ability_id": 53, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10032, + "ability_id": 119, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 10032, + "ability_id": 15, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 10033, + "ability_id": 47, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10034, + "ability_id": 181, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10035, + "ability_id": 70, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10036, + "ability_id": 178, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10037, + "ability_id": 36, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10038, + "ability_id": 23, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10039, + "ability_id": 185, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10040, + "ability_id": 184, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10041, + "ability_id": 104, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10042, + "ability_id": 181, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10043, + "ability_id": 80, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10044, + "ability_id": 15, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10045, + "ability_id": 104, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10046, + "ability_id": 101, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10047, + "ability_id": 92, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10048, + "ability_id": 94, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10049, + "ability_id": 45, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10050, + "ability_id": 3, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10051, + "ability_id": 182, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10052, + "ability_id": 37, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10053, + "ability_id": 111, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10054, + "ability_id": 74, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10055, + "ability_id": 22, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10056, + "ability_id": 158, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10057, + "ability_id": 156, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10058, + "ability_id": 159, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10059, + "ability_id": 91, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10060, + "ability_id": 117, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10061, + "ability_id": 166, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10061, + "ability_id": 180, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 10062, + "ability_id": 26, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10063, + "ability_id": 26, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10064, + "ability_id": 33, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10065, + "ability_id": 31, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10066, + "ability_id": 156, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10067, + "ability_id": 182, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10068, + "ability_id": 39, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10069, + "ability_id": 131, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10070, + "ability_id": 173, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10071, + "ability_id": 75, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10072, + "ability_id": 159, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10073, + "ability_id": 99, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10074, + "ability_id": 174, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10075, + "ability_id": 156, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10076, + "ability_id": 181, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10077, + "ability_id": 189, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10078, + "ability_id": 190, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10079, + "ability_id": 191, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10080, + "ability_id": 9, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10080, + "ability_id": 31, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 10081, + "ability_id": 9, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10081, + "ability_id": 31, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 10082, + "ability_id": 9, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10082, + "ability_id": 31, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 10083, + "ability_id": 9, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10083, + "ability_id": 31, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 10084, + "ability_id": 9, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10084, + "ability_id": 31, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 10085, + "ability_id": 9, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10085, + "ability_id": 31, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 10086, + "ability_id": 170, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10087, + "ability_id": 125, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10088, + "ability_id": 113, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10089, + "ability_id": 184, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10090, + "ability_id": 91, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10091, + "ability_id": 82, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10091, + "ability_id": 55, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 10091, + "ability_id": 47, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 10092, + "ability_id": 82, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10092, + "ability_id": 55, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 10092, + "ability_id": 47, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 10093, + "ability_id": 82, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10093, + "ability_id": 55, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 10093, + "ability_id": 47, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 10094, + "ability_id": 9, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10094, + "ability_id": 31, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 10095, + "ability_id": 9, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10095, + "ability_id": 31, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 10096, + "ability_id": 9, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10096, + "ability_id": 31, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 10097, + "ability_id": 9, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10097, + "ability_id": 31, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 10098, + "ability_id": 9, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10098, + "ability_id": 31, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 10099, + "ability_id": 9, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10099, + "ability_id": 31, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 10100, + "ability_id": 207, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10101, + "ability_id": 81, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10101, + "ability_id": 202, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 10102, + "ability_id": 81, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10102, + "ability_id": 202, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 10103, + "ability_id": 81, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10103, + "ability_id": 117, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 10104, + "ability_id": 81, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10104, + "ability_id": 117, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 10105, + "ability_id": 8, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10105, + "ability_id": 221, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 10105, + "ability_id": 159, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 10106, + "ability_id": 8, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10106, + "ability_id": 221, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 10106, + "ability_id": 159, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 10107, + "ability_id": 53, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10107, + "ability_id": 101, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 10107, + "ability_id": 155, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 10108, + "ability_id": 169, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10108, + "ability_id": 101, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 10108, + "ability_id": 155, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 10109, + "ability_id": 42, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10109, + "ability_id": 5, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 10109, + "ability_id": 206, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 10110, + "ability_id": 42, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10110, + "ability_id": 5, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 10110, + "ability_id": 206, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 10111, + "ability_id": 42, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10111, + "ability_id": 5, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 10111, + "ability_id": 206, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 10112, + "ability_id": 143, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10112, + "ability_id": 82, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 10112, + "ability_id": 223, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 10113, + "ability_id": 143, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10113, + "ability_id": 82, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 10113, + "ability_id": 223, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 10114, + "ability_id": 119, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10114, + "ability_id": 139, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 10115, + "ability_id": 130, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10115, + "ability_id": 31, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 10115, + "ability_id": 69, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 658, + "ability_id": 210, + "is_hidden": 0, + "slot": 3 + }, + { + "pokemon_id": 10117, + "ability_id": 210, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10118, + "ability_id": 188, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 10119, + "ability_id": 211, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10120, + "ability_id": 211, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10121, + "ability_id": 198, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10121, + "ability_id": 173, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 10121, + "ability_id": 91, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 10122, + "ability_id": 26, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10123, + "ability_id": 216, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10124, + "ability_id": 216, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10125, + "ability_id": 216, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10126, + "ability_id": 51, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10126, + "ability_id": 72, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 10126, + "ability_id": 99, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 10127, + "ability_id": 208, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10128, + "ability_id": 102, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10128, + "ability_id": 126, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 10129, + "ability_id": 212, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10129, + "ability_id": 12, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 10130, + "ability_id": 197, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10131, + "ability_id": 197, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10132, + "ability_id": 197, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10133, + "ability_id": 197, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10134, + "ability_id": 197, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10135, + "ability_id": 197, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10136, + "ability_id": 197, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10137, + "ability_id": 197, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10138, + "ability_id": 197, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10139, + "ability_id": 197, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10140, + "ability_id": 197, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10141, + "ability_id": 197, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10142, + "ability_id": 197, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10143, + "ability_id": 209, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10144, + "ability_id": 251, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10145, + "ability_id": 209, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10146, + "ability_id": 171, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10146, + "ability_id": 43, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 10146, + "ability_id": 142, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 10147, + "ability_id": 220, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10148, + "ability_id": 9, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10148, + "ability_id": 31, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 10149, + "ability_id": 130, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10149, + "ability_id": 31, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 10149, + "ability_id": 69, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 10150, + "ability_id": 118, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10150, + "ability_id": 19, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 10150, + "ability_id": 175, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 10151, + "ability_id": 20, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10152, + "ability_id": 181, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10153, + "ability_id": 199, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10153, + "ability_id": 11, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 10154, + "ability_id": 160, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10154, + "ability_id": 31, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 10154, + "ability_id": 5, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 10155, + "ability_id": 232, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10156, + "ability_id": 232, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10157, + "ability_id": 233, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 2000, + "ability_id": 93, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 2001, + "ability_id": 93, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 2002, + "ability_id": 93, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 2003, + "ability_id": 18, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 2004, + "ability_id": 18, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 2005, + "ability_id": 18, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 2006, + "ability_id": 65, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 2007, + "ability_id": 65, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 2008, + "ability_id": 65, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10158, + "ability_id": 46, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10159, + "ability_id": 46, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10159, + "ability_id": 140, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 810, + "is_hidden": 0, + "slot": 1, + "ability_id": 65 + }, + { + "pokemon_id": 810, + "is_hidden": 0, + "slot": 1, + "ability_id": 229 + }, + { + "pokemon_id": 811, + "is_hidden": 0, + "slot": 1, + "ability_id": 65 + }, + { + "pokemon_id": 811, + "is_hidden": 0, + "slot": 1, + "ability_id": 229 + }, + { + "pokemon_id": 812, + "is_hidden": 0, + "slot": 1, + "ability_id": 65 + }, + { + "pokemon_id": 812, + "is_hidden": 0, + "slot": 1, + "ability_id": 229 + }, + { + "pokemon_id": 813, + "is_hidden": 0, + "slot": 1, + "ability_id": 66 + }, + { + "pokemon_id": 813, + "is_hidden": 0, + "slot": 1, + "ability_id": 234 + }, + { + "pokemon_id": 814, + "is_hidden": 0, + "slot": 1, + "ability_id": 66 + }, + { + "pokemon_id": 814, + "is_hidden": 0, + "slot": 1, + "ability_id": 234 + }, + { + "pokemon_id": 815, + "is_hidden": 0, + "slot": 1, + "ability_id": 66 + }, + { + "pokemon_id": 815, + "is_hidden": 0, + "slot": 1, + "ability_id": 234 + }, + { + "pokemon_id": 816, + "is_hidden": 0, + "slot": 1, + "ability_id": 67 + }, + { + "pokemon_id": 816, + "is_hidden": 0, + "slot": 1, + "ability_id": 97 + }, + { + "pokemon_id": 817, + "is_hidden": 0, + "slot": 1, + "ability_id": 67 + }, + { + "pokemon_id": 817, + "is_hidden": 0, + "slot": 1, + "ability_id": 97 + }, + { + "pokemon_id": 818, + "is_hidden": 0, + "slot": 1, + "ability_id": 67 + }, + { + "pokemon_id": 818, + "is_hidden": 0, + "slot": 1, + "ability_id": 97 + }, + { + "pokemon_id": 819, + "is_hidden": 0, + "slot": 1, + "ability_id": 167 + }, + { + "pokemon_id": 819, + "is_hidden": 0, + "slot": 1, + "ability_id": 82 + }, + { + "pokemon_id": 820, + "is_hidden": 0, + "slot": 1, + "ability_id": 167 + }, + { + "pokemon_id": 820, + "is_hidden": 0, + "slot": 1, + "ability_id": 82 + }, + { + "pokemon_id": 821, + "is_hidden": 0, + "slot": 1, + "ability_id": 51 + }, + { + "pokemon_id": 821, + "is_hidden": 0, + "slot": 1, + "ability_id": 127 + }, + { + "pokemon_id": 821, + "is_hidden": 0, + "slot": 1, + "ability_id": 145 + }, + { + "pokemon_id": 822, + "is_hidden": 0, + "slot": 1, + "ability_id": 51 + }, + { + "pokemon_id": 822, + "is_hidden": 0, + "slot": 1, + "ability_id": 127 + }, + { + "pokemon_id": 822, + "is_hidden": 0, + "slot": 1, + "ability_id": 145 + }, + { + "pokemon_id": 823, + "is_hidden": 0, + "slot": 1, + "ability_id": 46 + }, + { + "pokemon_id": 823, + "is_hidden": 0, + "slot": 1, + "ability_id": 127 + }, + { + "pokemon_id": 823, + "is_hidden": 0, + "slot": 1, + "ability_id": 235 + }, + { + "pokemon_id": 824, + "is_hidden": 0, + "slot": 1, + "ability_id": 68 + }, + { + "pokemon_id": 824, + "is_hidden": 0, + "slot": 1, + "ability_id": 14 + }, + { + "pokemon_id": 824, + "is_hidden": 0, + "slot": 1, + "ability_id": 140 + }, + { + "pokemon_id": 825, + "is_hidden": 0, + "slot": 1, + "ability_id": 68 + }, + { + "pokemon_id": 825, + "is_hidden": 0, + "slot": 1, + "ability_id": 14 + }, + { + "pokemon_id": 825, + "is_hidden": 0, + "slot": 1, + "ability_id": 140 + }, + { + "pokemon_id": 826, + "is_hidden": 0, + "slot": 1, + "ability_id": 68 + }, + { + "pokemon_id": 826, + "is_hidden": 0, + "slot": 1, + "ability_id": 119 + }, + { + "pokemon_id": 826, + "is_hidden": 0, + "slot": 1, + "ability_id": 140 + }, + { + "pokemon_id": 827, + "is_hidden": 0, + "slot": 1, + "ability_id": 50 + }, + { + "pokemon_id": 827, + "is_hidden": 0, + "slot": 1, + "ability_id": 84 + }, + { + "pokemon_id": 827, + "is_hidden": 0, + "slot": 1, + "ability_id": 198 + }, + { + "pokemon_id": 828, + "is_hidden": 0, + "slot": 1, + "ability_id": 50 + }, + { + "pokemon_id": 828, + "is_hidden": 0, + "slot": 1, + "ability_id": 84 + }, + { + "pokemon_id": 828, + "is_hidden": 0, + "slot": 1, + "ability_id": 198 + }, + { + "pokemon_id": 829, + "is_hidden": 0, + "slot": 1, + "ability_id": 236 + }, + { + "pokemon_id": 829, + "is_hidden": 0, + "slot": 1, + "ability_id": 144 + }, + { + "pokemon_id": 829, + "is_hidden": 0, + "slot": 1, + "ability_id": 27 + }, + { + "pokemon_id": 830, + "is_hidden": 0, + "slot": 1, + "ability_id": 236 + }, + { + "pokemon_id": 830, + "is_hidden": 0, + "slot": 1, + "ability_id": 144 + }, + { + "pokemon_id": 830, + "is_hidden": 0, + "slot": 1, + "ability_id": 27 + }, + { + "pokemon_id": 831, + "is_hidden": 0, + "slot": 1, + "ability_id": 218 + }, + { + "pokemon_id": 831, + "is_hidden": 0, + "slot": 1, + "ability_id": 50 + }, + { + "pokemon_id": 831, + "is_hidden": 0, + "slot": 1, + "ability_id": 171 + }, + { + "pokemon_id": 832, + "is_hidden": 0, + "slot": 1, + "ability_id": 218 + }, + { + "pokemon_id": 832, + "is_hidden": 0, + "slot": 1, + "ability_id": 80 + }, + { + "pokemon_id": 832, + "is_hidden": 0, + "slot": 1, + "ability_id": 171 + }, + { + "pokemon_id": 833, + "is_hidden": 0, + "slot": 1, + "ability_id": 173 + }, + { + "pokemon_id": 833, + "is_hidden": 0, + "slot": 1, + "ability_id": 75 + }, + { + "pokemon_id": 833, + "is_hidden": 0, + "slot": 1, + "ability_id": 33 + }, + { + "pokemon_id": 834, + "is_hidden": 0, + "slot": 1, + "ability_id": 173 + }, + { + "pokemon_id": 834, + "is_hidden": 0, + "slot": 1, + "ability_id": 75 + }, + { + "pokemon_id": 834, + "is_hidden": 0, + "slot": 1, + "ability_id": 33 + }, + { + "pokemon_id": 835, + "is_hidden": 0, + "slot": 1, + "ability_id": 237 + }, + { + "pokemon_id": 835, + "is_hidden": 0, + "slot": 1, + "ability_id": 155 + }, + { + "pokemon_id": 836, + "is_hidden": 0, + "slot": 1, + "ability_id": 173 + }, + { + "pokemon_id": 836, + "is_hidden": 0, + "slot": 1, + "ability_id": 172 + }, + { + "pokemon_id": 837, + "is_hidden": 0, + "slot": 1, + "ability_id": 238 + }, + { + "pokemon_id": 837, + "is_hidden": 0, + "slot": 1, + "ability_id": 85 + }, + { + "pokemon_id": 837, + "is_hidden": 0, + "slot": 1, + "ability_id": 18 + }, + { + "pokemon_id": 838, + "is_hidden": 0, + "slot": 1, + "ability_id": 238 + }, + { + "pokemon_id": 838, + "is_hidden": 0, + "slot": 1, + "ability_id": 49 + }, + { + "pokemon_id": 838, + "is_hidden": 0, + "slot": 1, + "ability_id": 18 + }, + { + "pokemon_id": 839, + "is_hidden": 0, + "slot": 1, + "ability_id": 238 + }, + { + "pokemon_id": 839, + "is_hidden": 0, + "slot": 1, + "ability_id": 49 + }, + { + "pokemon_id": 839, + "is_hidden": 0, + "slot": 1, + "ability_id": 18 + }, + { + "pokemon_id": 840, + "is_hidden": 0, + "slot": 1, + "ability_id": 239 + }, + { + "pokemon_id": 840, + "is_hidden": 0, + "slot": 1, + "ability_id": 82 + }, + { + "pokemon_id": 840, + "is_hidden": 0, + "slot": 1, + "ability_id": 171 + }, + { + "pokemon_id": 841, + "is_hidden": 0, + "slot": 1, + "ability_id": 239 + }, + { + "pokemon_id": 841, + "is_hidden": 0, + "slot": 1, + "ability_id": 82 + }, + { + "pokemon_id": 841, + "is_hidden": 0, + "slot": 1, + "ability_id": 55 + }, + { + "pokemon_id": 842, + "is_hidden": 0, + "slot": 1, + "ability_id": 239 + }, + { + "pokemon_id": 842, + "is_hidden": 0, + "slot": 1, + "ability_id": 82 + }, + { + "pokemon_id": 842, + "is_hidden": 0, + "slot": 1, + "ability_id": 47 + }, + { + "pokemon_id": 843, + "is_hidden": 0, + "slot": 1, + "ability_id": 240 + }, + { + "pokemon_id": 843, + "is_hidden": 0, + "slot": 1, + "ability_id": 61 + }, + { + "pokemon_id": 843, + "is_hidden": 0, + "slot": 1, + "ability_id": 8 + }, + { + "pokemon_id": 844, + "is_hidden": 0, + "slot": 1, + "ability_id": 240 + }, + { + "pokemon_id": 844, + "is_hidden": 0, + "slot": 1, + "ability_id": 61 + }, + { + "pokemon_id": 844, + "is_hidden": 0, + "slot": 1, + "ability_id": 8 + }, + { + "pokemon_id": 845, + "is_hidden": 0, + "slot": 1, + "ability_id": 241 + }, + { + "pokemon_id": 846, + "is_hidden": 0, + "slot": 1, + "ability_id": 33 + }, + { + "pokemon_id": 846, + "is_hidden": 0, + "slot": 1, + "ability_id": 242 + }, + { + "pokemon_id": 847, + "is_hidden": 0, + "slot": 1, + "ability_id": 33 + }, + { + "pokemon_id": 847, + "is_hidden": 0, + "slot": 1, + "ability_id": 242 + }, + { + "pokemon_id": 848, + "is_hidden": 0, + "slot": 1, + "ability_id": 155 + }, + { + "pokemon_id": 848, + "is_hidden": 0, + "slot": 1, + "ability_id": 9 + }, + { + "pokemon_id": 848, + "is_hidden": 0, + "slot": 1, + "ability_id": 103 + }, + { + "pokemon_id": 849, + "is_hidden": 0, + "slot": 1, + "ability_id": 57 + }, + { + "pokemon_id": 849, + "is_hidden": 0, + "slot": 1, + "ability_id": 243 + }, + { + "pokemon_id": 849, + "is_hidden": 0, + "slot": 1, + "ability_id": 58 + }, + { + "pokemon_id": 849, + "is_hidden": 0, + "slot": 1, + "ability_id": 101 + }, + { + "pokemon_id": 850, + "is_hidden": 0, + "slot": 1, + "ability_id": 18 + }, + { + "pokemon_id": 850, + "is_hidden": 0, + "slot": 1, + "ability_id": 73 + }, + { + "pokemon_id": 850, + "is_hidden": 0, + "slot": 1, + "ability_id": 49 + }, + { + "pokemon_id": 851, + "is_hidden": 0, + "slot": 1, + "ability_id": 18 + }, + { + "pokemon_id": 851, + "is_hidden": 0, + "slot": 1, + "ability_id": 73 + }, + { + "pokemon_id": 851, + "is_hidden": 0, + "slot": 1, + "ability_id": 49 + }, + { + "pokemon_id": 852, + "is_hidden": 0, + "slot": 1, + "ability_id": 7 + }, + { + "pokemon_id": 852, + "is_hidden": 0, + "slot": 1, + "ability_id": 101 + }, + { + "pokemon_id": 853, + "is_hidden": 0, + "slot": 1, + "ability_id": 7 + }, + { + "pokemon_id": 853, + "is_hidden": 0, + "slot": 1, + "ability_id": 101 + }, + { + "pokemon_id": 854, + "is_hidden": 0, + "slot": 1, + "ability_id": 133 + }, + { + "pokemon_id": 854, + "is_hidden": 0, + "slot": 1, + "ability_id": 130 + }, + { + "pokemon_id": 855, + "is_hidden": 0, + "slot": 1, + "ability_id": 133 + }, + { + "pokemon_id": 855, + "is_hidden": 0, + "slot": 1, + "ability_id": 130 + }, + { + "pokemon_id": 856, + "is_hidden": 0, + "slot": 1, + "ability_id": 131 + }, + { + "pokemon_id": 856, + "is_hidden": 0, + "slot": 1, + "ability_id": 107 + }, + { + "pokemon_id": 856, + "is_hidden": 0, + "slot": 1, + "ability_id": 156 + }, + { + "pokemon_id": 857, + "is_hidden": 0, + "slot": 1, + "ability_id": 131 + }, + { + "pokemon_id": 857, + "is_hidden": 0, + "slot": 1, + "ability_id": 107 + }, + { + "pokemon_id": 857, + "is_hidden": 0, + "slot": 1, + "ability_id": 156 + }, + { + "pokemon_id": 858, + "is_hidden": 0, + "slot": 1, + "ability_id": 131 + }, + { + "pokemon_id": 858, + "is_hidden": 0, + "slot": 1, + "ability_id": 107 + }, + { + "pokemon_id": 858, + "is_hidden": 0, + "slot": 1, + "ability_id": 156 + }, + { + "pokemon_id": 859, + "is_hidden": 0, + "slot": 1, + "ability_id": 158 + }, + { + "pokemon_id": 859, + "is_hidden": 0, + "slot": 1, + "ability_id": 119 + }, + { + "pokemon_id": 859, + "is_hidden": 0, + "slot": 1, + "ability_id": 124 + }, + { + "pokemon_id": 860, + "is_hidden": 0, + "slot": 1, + "ability_id": 158 + }, + { + "pokemon_id": 860, + "is_hidden": 0, + "slot": 1, + "ability_id": 119 + }, + { + "pokemon_id": 860, + "is_hidden": 0, + "slot": 1, + "ability_id": 124 + }, + { + "pokemon_id": 861, + "is_hidden": 0, + "slot": 1, + "ability_id": 158 + }, + { + "pokemon_id": 861, + "is_hidden": 0, + "slot": 1, + "ability_id": 119 + }, + { + "pokemon_id": 861, + "is_hidden": 0, + "slot": 1, + "ability_id": 124 + }, + { + "pokemon_id": 862, + "is_hidden": 0, + "slot": 1, + "ability_id": 120 + }, + { + "pokemon_id": 862, + "is_hidden": 0, + "slot": 1, + "ability_id": 62 + }, + { + "pokemon_id": 862, + "is_hidden": 0, + "slot": 1, + "ability_id": 128 + }, + { + "pokemon_id": 863, + "is_hidden": 0, + "slot": 1, + "ability_id": 4 + }, + { + "pokemon_id": 863, + "is_hidden": 0, + "slot": 1, + "ability_id": 181 + }, + { + "pokemon_id": 863, + "is_hidden": 0, + "slot": 1, + "ability_id": 244 + }, + { + "pokemon_id": 864, + "is_hidden": 0, + "slot": 1, + "ability_id": 133 + }, + { + "pokemon_id": 864, + "is_hidden": 0, + "slot": 1, + "ability_id": 245 + }, + { + "pokemon_id": 865, + "is_hidden": 0, + "slot": 1, + "ability_id": 80 + }, + { + "pokemon_id": 865, + "is_hidden": 0, + "slot": 1, + "ability_id": 113 + }, + { + "pokemon_id": 866, + "is_hidden": 0, + "slot": 1, + "ability_id": 77 + }, + { + "pokemon_id": 866, + "is_hidden": 0, + "slot": 1, + "ability_id": 246 + }, + { + "pokemon_id": 866, + "is_hidden": 0, + "slot": 1, + "ability_id": 115 + }, + { + "pokemon_id": 867, + "is_hidden": 0, + "slot": 1, + "ability_id": 247 + }, + { + "pokemon_id": 868, + "is_hidden": 0, + "slot": 1, + "ability_id": 175 + }, + { + "pokemon_id": 868, + "is_hidden": 0, + "slot": 1, + "ability_id": 165 + }, + { + "pokemon_id": 869, + "is_hidden": 0, + "slot": 1, + "ability_id": 175 + }, + { + "pokemon_id": 869, + "is_hidden": 0, + "slot": 1, + "ability_id": 165 + }, + { + "pokemon_id": 870, + "is_hidden": 0, + "slot": 1, + "ability_id": 4 + }, + { + "pokemon_id": 870, + "is_hidden": 0, + "slot": 1, + "ability_id": 128 + }, + { + "pokemon_id": 871, + "is_hidden": 0, + "slot": 1, + "ability_id": 31 + }, + { + "pokemon_id": 871, + "is_hidden": 0, + "slot": 1, + "ability_id": 226 + }, + { + "pokemon_id": 872, + "is_hidden": 0, + "slot": 1, + "ability_id": 19 + }, + { + "pokemon_id": 872, + "is_hidden": 0, + "slot": 1, + "ability_id": 249 + }, + { + "pokemon_id": 873, + "is_hidden": 0, + "slot": 1, + "ability_id": 19 + }, + { + "pokemon_id": 873, + "is_hidden": 0, + "slot": 1, + "ability_id": 249 + }, + { + "pokemon_id": 874, + "is_hidden": 0, + "slot": 1, + "ability_id": 250 + }, + { + "pokemon_id": 875, + "is_hidden": 0, + "slot": 1, + "ability_id": 251 + }, + { + "pokemon_id": 876, + "is_hidden": 0, + "slot": 1, + "ability_id": 39 + }, + { + "pokemon_id": 876, + "is_hidden": 0, + "slot": 1, + "ability_id": 28 + }, + { + "pokemon_id": 876, + "is_hidden": 0, + "slot": 1, + "ability_id": 227 + }, + { + "pokemon_id": 876, + "is_hidden": 0, + "slot": 1, + "ability_id": 20 + }, + { + "pokemon_id": 877, + "is_hidden": 0, + "slot": 1, + "ability_id": 252 + }, + { + "pokemon_id": 878, + "is_hidden": 0, + "slot": 1, + "ability_id": 125 + }, + { + "pokemon_id": 878, + "is_hidden": 0, + "slot": 1, + "ability_id": 134 + }, + { + "pokemon_id": 879, + "is_hidden": 0, + "slot": 1, + "ability_id": 125 + }, + { + "pokemon_id": 879, + "is_hidden": 0, + "slot": 1, + "ability_id": 134 + }, + { + "pokemon_id": 880, + "is_hidden": 0, + "slot": 1, + "ability_id": 10 + }, + { + "pokemon_id": 880, + "is_hidden": 0, + "slot": 1, + "ability_id": 55 + }, + { + "pokemon_id": 880, + "is_hidden": 0, + "slot": 1, + "ability_id": 146 + }, + { + "pokemon_id": 881, + "is_hidden": 0, + "slot": 1, + "ability_id": 10 + }, + { + "pokemon_id": 881, + "is_hidden": 0, + "slot": 1, + "ability_id": 9 + }, + { + "pokemon_id": 881, + "is_hidden": 0, + "slot": 1, + "ability_id": 202 + }, + { + "pokemon_id": 882, + "is_hidden": 0, + "slot": 1, + "ability_id": 11 + }, + { + "pokemon_id": 882, + "is_hidden": 0, + "slot": 1, + "ability_id": 173 + }, + { + "pokemon_id": 882, + "is_hidden": 0, + "slot": 1, + "ability_id": 146 + }, + { + "pokemon_id": 883, + "is_hidden": 0, + "slot": 1, + "ability_id": 11 + }, + { + "pokemon_id": 883, + "is_hidden": 0, + "slot": 1, + "ability_id": 115 + }, + { + "pokemon_id": 883, + "is_hidden": 0, + "slot": 1, + "ability_id": 202 + }, + { + "pokemon_id": 884, + "is_hidden": 0, + "slot": 1, + "ability_id": 135 + }, + { + "pokemon_id": 884, + "is_hidden": 0, + "slot": 1, + "ability_id": 134 + }, + { + "pokemon_id": 884, + "is_hidden": 0, + "slot": 1, + "ability_id": 253 + }, + { + "pokemon_id": 885, + "is_hidden": 0, + "slot": 1, + "ability_id": 29 + }, + { + "pokemon_id": 885, + "is_hidden": 0, + "slot": 1, + "ability_id": 151 + }, + { + "pokemon_id": 885, + "is_hidden": 0, + "slot": 1, + "ability_id": 130 + }, + { + "pokemon_id": 886, + "is_hidden": 0, + "slot": 1, + "ability_id": 29 + }, + { + "pokemon_id": 886, + "is_hidden": 0, + "slot": 1, + "ability_id": 151 + }, + { + "pokemon_id": 886, + "is_hidden": 0, + "slot": 1, + "ability_id": 130 + }, + { + "pokemon_id": 887, + "is_hidden": 0, + "slot": 1, + "ability_id": 29 + }, + { + "pokemon_id": 887, + "is_hidden": 0, + "slot": 1, + "ability_id": 151 + }, + { + "pokemon_id": 887, + "is_hidden": 0, + "slot": 1, + "ability_id": 130 + }, + { + "pokemon_id": 888, + "is_hidden": 0, + "slot": 1, + "ability_id": 254 + }, + { + "pokemon_id": 889, + "is_hidden": 0, + "slot": 1, + "ability_id": 255 + }, + { + "pokemon_id": 890, + "is_hidden": 0, + "slot": 1, + "ability_id": 46 + }, + { + "pokemon_id": 10160, + "ability_id": 53 + }, + { + "pokemon_id": 10160, + "ability_id": 181 + }, + { + "pokemon_id": 10161, + "ability_id": 50 + }, + { + "pokemon_id": 10161, + "ability_id": 256 + }, + { + "pokemon_id": 10161, + "ability_id": 107 + }, + { + "pokemon_id": 10162, + "ability_id": 50 + }, + { + "pokemon_id": 10162, + "ability_id": 256 + }, + { + "pokemon_id": 10162, + "ability_id": 107 + }, + { + "pokemon_id": 10163, + "ability_id": 82 + }, + { + "pokemon_id": 10163, + "ability_id": 20 + }, + { + "pokemon_id": 10164, + "ability_id": 258 + }, + { + "pokemon_id": 10164, + "ability_id": 20 + }, + { + "pokemon_id": 10165, + "ability_id": 80 + }, + { + "pokemon_id": 10165, + "ability_id": 113 + }, + { + "pokemon_id": 10166, + "ability_id": 228, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 10167, + "ability_id": 72 + }, + { + "pokemon_id": 10167, + "ability_id": 246 + }, + { + "pokemon_id": 10167, + "ability_id": 115 + }, + { + "pokemon_id": 10168, + "ability_id": 133 + }, + { + "pokemon_id": 10168, + "ability_id": 130 + }, + { + "pokemon_id": 10169, + "ability_id": 53 + }, + { + "pokemon_id": 10169, + "ability_id": 82 + }, + { + "pokemon_id": 10169, + "ability_id": 95 + }, + { + "pokemon_id": 10170, + "ability_id": 53 + }, + { + "pokemon_id": 10170, + "ability_id": 82 + }, + { + "pokemon_id": 10170, + "ability_id": 95 + }, + { + "pokemon_id": 10171, + "ability_id": 55 + }, + { + "pokemon_id": 10171, + "ability_id": 39 + }, + { + "pokemon_id": 10272, + "ability_id": 161 + }, + { + "pokemon_id": 10173, + "ability_id": 247 + }, + { + "pokemon_id": 10174, + "ability_id": 259 + }, + { + "pokemon_id": 10175, + "ability_id": 255, + "slot": 1, + "is_hidden": 0 + }, + { + "pokemon_id": 10176, + "ability_id": 254, + "slot": 1, + "is_hidden": 0 + }, + { + "pokemon_id": 893, + "ability_id": 102, + "slot": 1, + "is_hidden": 0 + }, + { + "pokemon_id": 891, + "ability_id": 39, + "slot": 1, + "is_hidden": 0 + }, + { + "pokemon_id": 892, + "ability_id": 267, + "slot": 1, + "is_hidden": 0 + }, + { + "pokemon_id": 10177, + "ability_id": 128, + "slot": 1, + "is_hidden": 0 + }, + { + "pokemon_id": 10178, + "ability_id": 172, + "slot": 1, + "is_hidden": 0 + }, + { + "pokemon_id": 10179, + "ability_id": 201, + "slot": 1, + "is_hidden": 0 + }, + { + "pokemon_id": 894, + "ability_id": 260, + "slot": 1, + "is_hidden": 0 + }, + { + "pokemon_id": 895, + "ability_id": 261, + "slot": 1, + "is_hidden": 0 + }, + { + "pokemon_id": 896, + "ability_id": 262, + "slot": 1, + "is_hidden": 0 + }, + { + "pokemon_id": 897, + "ability_id": 263, + "slot": 1, + "is_hidden": 0 + }, + { + "pokemon_id": 898, + "ability_id": 127, + "slot": 1, + "is_hidden": 0 + }, + { + "pokemon_id": 10180, + "ability_id": 265, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10181, + "ability_id": 264, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10419, + "ability_id": 161, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10507, + "ability_id": 51, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10507, + "ability_id": 89, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 10507, + "ability_id": 39, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 10508, + "ability_id": 187, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10509, + "ability_id": 154, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 10509, + "ability_id": 39, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 10509, + "ability_id": 80, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10510, + "ability_id": 69, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10510, + "ability_id": 31, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 10510, + "ability_id": 4, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 10511, + "ability_id": 81, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10511, + "ability_id": 115, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 10512, + "is_hidden": 0, + "slot": 1, + "ability_id": 66 + }, + { + "pokemon_id": 10512, + "is_hidden": 0, + "slot": 1, + "ability_id": 234 + }, + { + "pokemon_id": 4848, + "ability_id": 46, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 4848, + "ability_id": 140, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 10515, + "ability_id": 91, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10666, + "ability_id": 28, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10667, + "ability_id": 220, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10668, + "ability_id": 121, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10172, + "ability_id": 257, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 4858, + "ability_id": 140, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 4858, + "ability_id": 46, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 4851, + "is_hidden": 0, + "slot": 1, + "ability_id": 254 + }, + { + "pokemon_id": 4852, + "ability_id": 254, + "slot": 1, + "is_hidden": 0 + }, + { + "pokemon_id": 7000, + "ability_id": 26, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10418, + "ability_id": 266, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 5858, + "ability_id": 51, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 5858, + "ability_id": 146, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 5858, + "ability_id": 80, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 10669, + "ability_id": 28, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10670, + "ability_id": 34, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10670, + "ability_id": 50, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 10687, + "ability_id": 2, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10900, + "ability_id": 26, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10901, + "ability_id": 76, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10902, + "ability_id": 28, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10902, + "ability_id": 36, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 10902, + "ability_id": 140, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 10903, + "ability_id": 51, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10903, + "ability_id": 72, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 10903, + "ability_id": 80, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 10904, + "ability_id": 46, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10904, + "ability_id": 136, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 10905, + "ability_id": 149, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 8800, + "ability_id": 46, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 8800, + "ability_id": 140, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 8801, + "ability_id": 10, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 8802, + "ability_id": 130, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 8803, + "ability_id": 130, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10410, + "ability_id": 79, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10410, + "ability_id": 22, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 10410, + "ability_id": 62, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 8804, + "ability_id": 163, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 6666, + "ability_id": 67, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 6666, + "ability_id": 128, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 4888, + "ability_id": 20, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 8805, + "ability_id": 154, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 718, + "ability_id": 211, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 10118, + "ability_id": 211, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10166, + "ability_id": 26, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10418, + "ability_id": 144, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 10418, + "ability_id": 20, + "is_hidden": 0, + "slot": 3 + }, + { + "pokemon_id": 0, + "ability_id": 147, + "is_hidden": 1, + "slot": 1 + }, + { + "pokemon_id": 10172, + "ability_id": 161, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 10437, + "ability_id": 46, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10437, + "ability_id": 140, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 10436, + "ability_id": 142, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10435, + "ability_id": 131, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10435, + "ability_id": 126, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 10434, + "ability_id": 68, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10434, + "ability_id": 125, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 10434, + "ability_id": 292, + "is_hidden": 0, + "slot": 3 + }, + { + "pokemon_id": 10433, + "ability_id": 38, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10433, + "ability_id": 33, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 10433, + "ability_id": 22, + "is_hidden": 0, + "slot": 3 + }, + { + "pokemon_id": 10432, + "ability_id": 46, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10432, + "ability_id": 140, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 10431, + "ability_id": 155, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10431, + "ability_id": 91, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 10431, + "ability_id": 104, + "is_hidden": 0, + "slot": 3 + }, + { + "pokemon_id": 10430, + "ability_id": 155, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10430, + "ability_id": 91, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 10430, + "ability_id": 104, + "is_hidden": 0, + "slot": 3 + }, + { + "pokemon_id": 10429, + "ability_id": 155, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10429, + "ability_id": 91, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 10429, + "ability_id": 104, + "is_hidden": 0, + "slot": 3 + }, + { + "pokemon_id": 10428, + "ability_id": 22, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10428, + "ability_id": 119, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 10428, + "ability_id": 157, + "is_hidden": 0, + "slot": 3 + }, + { + "pokemon_id": 10427, + "ability_id": 62, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10427, + "ability_id": 171, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 10427, + "ability_id": 127, + "is_hidden": 0, + "slot": 3 + }, + { + "pokemon_id": 10426, + "ability_id": 46, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10426, + "ability_id": 143, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 10425, + "ability_id": 22, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10425, + "ability_id": 18, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 10425, + "ability_id": 154, + "is_hidden": 0, + "slot": 3 + }, + { + "pokemon_id": 10424, + "ability_id": 173, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10424, + "ability_id": 115, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 10424, + "ability_id": 5, + "is_hidden": 0, + "slot": 3 + }, + { + "pokemon_id": 10423, + "ability_id": 51, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10423, + "ability_id": 125, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 10423, + "ability_id": 128, + "is_hidden": 0, + "slot": 3 + }, + { + "pokemon_id": 10422, + "ability_id": 65, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10422, + "ability_id": 203, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 10421, + "ability_id": 43, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10421, + "ability_id": 9, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 10421, + "ability_id": 106, + "is_hidden": 0, + "slot": 3 + }, + { + "pokemon_id": 10420, + "ability_id": 157, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10420, + "ability_id": 142, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 10420, + "ability_id": 183, + "is_hidden": 0, + "slot": 3 + }, + { + "pokemon_id": 10440, + "ability_id": 22, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10440, + "ability_id": 18, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 10440, + "ability_id": 154, + "is_hidden": 0, + "slot": 3 + }, + { + "pokemon_id": 10438, + "ability_id": 34, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10438, + "ability_id": 55, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 10438, + "ability_id": 102, + "is_hidden": 0, + "slot": 3 + }, + { + "pokemon_id": 10417, + "ability_id": 38, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10417, + "ability_id": 33, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 10417, + "ability_id": 22, + "is_hidden": 0, + "slot": 3 + }, + { + "pokemon_id": 10416, + "ability_id": 67, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10416, + "ability_id": 75, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 10415, + "ability_id": 157, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10415, + "ability_id": 142, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 10415, + "ability_id": 183, + "is_hidden": 0, + "slot": 3 + }, + { + "pokemon_id": 10414, + "ability_id": 39, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10414, + "ability_id": 51, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 10414, + "ability_id": 143, + "is_hidden": 0, + "slot": 3 + }, + { + "pokemon_id": 10413, + "ability_id": 66, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10413, + "ability_id": 18, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 10412, + "ability_id": 9, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10412, + "ability_id": 43, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 10412, + "ability_id": 106, + "is_hidden": 0, + "slot": 3 + }, + { + "pokemon_id": 10411, + "ability_id": 149, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10409, + "ability_id": 149, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 109, + "ability_id": 248, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 109, + "ability_id": 1, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 110, + "ability_id": 248, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 110, + "ability_id": 1, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 10166, + "ability_id": 248, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 906, + "ability_id": 65, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 906, + "ability_id": 168, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 907, + "ability_id": 65, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 907, + "ability_id": 168, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 908, + "ability_id": 65, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 908, + "ability_id": 168, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 909, + "ability_id": 66, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 909, + "ability_id": 109, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 910, + "ability_id": 66, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 910, + "ability_id": 109, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 911, + "ability_id": 66, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 911, + "ability_id": 109, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 912, + "ability_id": 67, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 912, + "ability_id": 153, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 913, + "ability_id": 67, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 913, + "ability_id": 153, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 914, + "ability_id": 67, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 914, + "ability_id": 153, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 915, + "ability_id": 165, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 915, + "ability_id": 82, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 915, + "ability_id": 47, + "is_hidden": 0, + "slot": 3 + }, + { + "pokemon_id": 916, + "ability_id": 268, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 916, + "ability_id": 82, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 916, + "ability_id": 47, + "is_hidden": 0, + "slot": 3 + }, + { + "pokemon_id": 917, + "ability_id": 32, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 917, + "ability_id": 50, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 917, + "ability_id": 155, + "is_hidden": 0, + "slot": 3 + }, + { + "pokemon_id": 918, + "ability_id": 15, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 918, + "ability_id": 198, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 919, + "ability_id": 15, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 919, + "ability_id": 198, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 920, + "ability_id": 68, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 920, + "ability_id": 110, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 921, + "ability_id": 68, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 921, + "ability_id": 110, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 922, + "ability_id": 14, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 922, + "ability_id": 61, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 923, + "ability_id": 28, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 923, + "ability_id": 140, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 924, + "ability_id": 53, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 924, + "ability_id": 218, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 925, + "ability_id": 146, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 925, + "ability_id": 218, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 926, + "ability_id": 107, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 926, + "ability_id": 119, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 926, + "ability_id": 3, + "is_hidden": 0, + "slot": 3 + }, + { + "pokemon_id": 927, + "ability_id": 290, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 927, + "ability_id": 119, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 927, + "ability_id": 3, + "is_hidden": 0, + "slot": 3 + }, + { + "pokemon_id": 928, + "ability_id": 291, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 928, + "ability_id": 296, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 928, + "ability_id": 157, + "is_hidden": 0, + "slot": 3 + }, + { + "pokemon_id": 929, + "ability_id": 183, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 929, + "ability_id": 155, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 929, + "ability_id": 8, + "is_hidden": 0, + "slot": 3 + }, + { + "pokemon_id": 930, + "ability_id": 183, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 930, + "ability_id": 155, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 930, + "ability_id": 8, + "is_hidden": 0, + "slot": 3 + }, + { + "pokemon_id": 931, + "ability_id": 109, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 931, + "ability_id": 12, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 931, + "ability_id": 41, + "is_hidden": 0, + "slot": 3 + }, + { + "pokemon_id": 932, + "ability_id": 104, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 932, + "ability_id": 292, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 933, + "ability_id": 41, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 934, + "ability_id": 278, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 935, + "ability_id": 48, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 935, + "ability_id": 139, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 936, + "ability_id": 48, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 936, + "ability_id": 139, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 937, + "ability_id": 269, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 937, + "ability_id": 139, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 938, + "ability_id": 34, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 938, + "ability_id": 15, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 938, + "ability_id": 103, + "is_hidden": 0, + "slot": 3 + }, + { + "pokemon_id": 939, + "ability_id": 34, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 939, + "ability_id": 15, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 939, + "ability_id": 141, + "is_hidden": 0, + "slot": 3 + }, + { + "pokemon_id": 940, + "ability_id": 20, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 940, + "ability_id": 9, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 940, + "ability_id": 6, + "is_hidden": 0, + "slot": 3 + }, + { + "pokemon_id": 941, + "ability_id": 280, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 941, + "ability_id": 9, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 941, + "ability_id": 6, + "is_hidden": 0, + "slot": 3 + }, + { + "pokemon_id": 942, + "ability_id": 142, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 942, + "ability_id": 112, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 943, + "ability_id": 142, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 943, + "ability_id": 111, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 944, + "ability_id": 297, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 944, + "ability_id": 8, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 945, + "ability_id": 50, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 945, + "ability_id": 53, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 945, + "ability_id": 20, + "is_hidden": 0, + "slot": 3 + }, + { + "pokemon_id": 946, + "ability_id": 132, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 946, + "ability_id": 167, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 946, + "ability_id": 101, + "is_hidden": 0, + "slot": 3 + }, + { + "pokemon_id": 947, + "ability_id": 47, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 947, + "ability_id": 81, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 947, + "ability_id": 125, + "is_hidden": 0, + "slot": 3 + }, + { + "pokemon_id": 948, + "ability_id": 47, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 948, + "ability_id": 202, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 948, + "ability_id": 125, + "is_hidden": 0, + "slot": 3 + }, + { + "pokemon_id": 949, + "ability_id": 270, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 949, + "ability_id": 115, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 950, + "ability_id": 270, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 950, + "ability_id": 115, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 951, + "ability_id": 270, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 951, + "ability_id": 115, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 952, + "ability_id": 279, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 952, + "ability_id": 114, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 953, + "ability_id": 61, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 953, + "ability_id": 144, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 954, + "ability_id": 9, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 954, + "ability_id": 30, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 954, + "ability_id": 89, + "is_hidden": 0, + "slot": 3 + }, + { + "pokemon_id": 955, + "ability_id": 10, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 955, + "ability_id": 30, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 955, + "ability_id": 89, + "is_hidden": 0, + "slot": 3 + }, + { + "pokemon_id": 956, + "ability_id": 10, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 956, + "ability_id": 30, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 956, + "ability_id": 89, + "is_hidden": 0, + "slot": 3 + }, + { + "pokemon_id": 957, + "ability_id": 277, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 957, + "ability_id": 10, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 957, + "ability_id": 172, + "is_hidden": 0, + "slot": 3 + }, + { + "pokemon_id": 958, + "ability_id": 277, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 958, + "ability_id": 10, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 958, + "ability_id": 172, + "is_hidden": 0, + "slot": 3 + }, + { + "pokemon_id": 959, + "ability_id": 145, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 959, + "ability_id": 51, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 959, + "ability_id": 276, + "is_hidden": 0, + "slot": 3 + }, + { + "pokemon_id": 960, + "ability_id": 22, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 960, + "ability_id": 55, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 960, + "ability_id": 62, + "is_hidden": 0, + "slot": 3 + }, + { + "pokemon_id": 961, + "ability_id": 113, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 961, + "ability_id": 77, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 961, + "ability_id": 294, + "is_hidden": 0, + "slot": 3 + }, + { + "pokemon_id": 962, + "ability_id": 271, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 962, + "ability_id": 75, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 962, + "ability_id": 144, + "is_hidden": 0, + "slot": 3 + }, + { + "pokemon_id": 963, + "ability_id": 272, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 963, + "ability_id": 5, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 963, + "ability_id": 29, + "is_hidden": 0, + "slot": 3 + }, + { + "pokemon_id": 964, + "ability_id": 272, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 964, + "ability_id": 5, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 964, + "ability_id": 29, + "is_hidden": 0, + "slot": 3 + }, + { + "pokemon_id": 965, + "ability_id": 272, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 965, + "ability_id": 5, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 965, + "ability_id": 29, + "is_hidden": 0, + "slot": 3 + }, + { + "pokemon_id": 966, + "ability_id": 295, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 966, + "ability_id": 212, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 967, + "ability_id": 295, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 967, + "ability_id": 212, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 968, + "ability_id": 84, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 968, + "ability_id": 124, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 968, + "ability_id": 158, + "is_hidden": 0, + "slot": 3 + }, + { + "pokemon_id": 969, + "ability_id": 84, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 969, + "ability_id": 143, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 969, + "ability_id": 158, + "is_hidden": 0, + "slot": 3 + }, + { + "pokemon_id": 970, + "ability_id": 20, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 970, + "ability_id": 103, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 971, + "ability_id": 273, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 971, + "ability_id": 165, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 972, + "ability_id": 22, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 972, + "ability_id": 50, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 972, + "ability_id": 198, + "is_hidden": 0, + "slot": 3 + }, + { + "pokemon_id": 973, + "ability_id": 22, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 973, + "ability_id": 275, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 973, + "ability_id": 198, + "is_hidden": 0, + "slot": 3 + }, + { + "pokemon_id": 974, + "ability_id": 274, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 974, + "ability_id": 151, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 975, + "ability_id": 274, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 975, + "ability_id": 151, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 976, + "ability_id": 155, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 977, + "ability_id": 283, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 978, + "ability_id": 281, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 979, + "ability_id": 281, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 981, + "ability_id": 281, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 982, + "ability_id": 281, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 983, + "ability_id": 281, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 984, + "ability_id": 281, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 985, + "ability_id": 281, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 986, + "ability_id": 282, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 988, + "ability_id": 282, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 989, + "ability_id": 282, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 990, + "ability_id": 282, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 991, + "ability_id": 282, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 992, + "ability_id": 282, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 993, + "ability_id": 282, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 994, + "ability_id": 284, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 995, + "ability_id": 285, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 996, + "ability_id": 286, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 997, + "ability_id": 287, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 998, + "ability_id": 288, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 999, + "ability_id": 289, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 1000, + "ability_id": 104, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 1000, + "ability_id": 20, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 1000, + "ability_id": 124, + "is_hidden": 0, + "slot": 3 + }, + { + "pokemon_id": 1001, + "ability_id": 104, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 1001, + "ability_id": 20, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 1001, + "ability_id": 124, + "is_hidden": 0, + "slot": 3 + }, + { + "pokemon_id": 1002, + "ability_id": 104, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 1002, + "ability_id": 20, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 1002, + "ability_id": 124, + "is_hidden": 0, + "slot": 3 + }, + { + "pokemon_id": 1003, + "ability_id": 18, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 1003, + "ability_id": 49, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 1004, + "ability_id": 18, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 1004, + "ability_id": 133, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 1005, + "ability_id": 18, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 1005, + "ability_id": 133, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 1006, + "ability_id": 298, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 1007, + "ability_id": 298, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 1008, + "ability_id": 128, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 1008, + "ability_id": 293, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 1008, + "ability_id": 46, + "is_hidden": 0, + "slot": 3 + }, + { + "pokemon_id": 1009, + "ability_id": 38, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 1009, + "ability_id": 11, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 1009, + "ability_id": 109, + "is_hidden": 0, + "slot": 3 + }, + { + "pokemon_id": 1010, + "ability_id": 72, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 1010, + "ability_id": 39, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 1010, + "ability_id": 128, + "is_hidden": 0, + "slot": 3 + }, + { + "pokemon_id": 8922, + "ability_id": 267, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 11000, + "ability_id": 83, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 11000, + "ability_id": 22, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 11000, + "ability_id": 291, + "is_hidden": 0, + "slot": 3 + }, + { + "pokemon_id": 11001, + "ability_id": 38, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 11001, + "ability_id": 11, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 11001, + "ability_id": 109, + "is_hidden": 0, + "slot": 3 + }, + { + "pokemon_id": 11002, + "ability_id": 83, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 11002, + "ability_id": 22, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 11002, + "ability_id": 291, + "is_hidden": 0, + "slot": 3 + }, + { + "pokemon_id": 11003, + "ability_id": 291, + "is_hidden": 0, + "slot": 3 + }, + { + "pokemon_id": 11003, + "ability_id": 22, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 11003, + "ability_id": 83, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 475, + "ability_id": 292, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 10416, + "ability_id": 292, + "is_hidden": 0, + "slot": 3 + }, + { + "pokemon_id": 11004, + "ability_id": 278, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 1011, + "ability_id": 282, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 1012, + "ability_id": 281, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 10426, + "ability_id": 84, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 4000, + "ability_id": 10061, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 4001, + "ability_id": 10061, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 4000, + "ability_id": 85, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 4001, + "ability_id": 85, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 1013, + "ability_id": 10062, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 1013, + "ability_id": 82, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 1013, + "ability_id": 60, + "is_hidden": 0, + "slot": 3 + }, + { + "pokemon_id": 1014, + "ability_id": 275, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 1014, + "ability_id": 10063, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 1015, + "ability_id": 10063, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 1015, + "ability_id": 119, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 1016, + "ability_id": 10063, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 1016, + "ability_id": 101, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 1017, + "ability_id": 128, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 4002, + "ability_id": 11, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 4003, + "ability_id": 104, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 4004, + "ability_id": 5, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 1018, + "ability_id": 192, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 1018, + "ability_id": 5, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 1018, + "ability_id": 253, + "is_hidden": 0, + "slot": 3 + }, + { + "pokemon_id": 1019, + "ability_id": 10062, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 1019, + "ability_id": 144, + "is_hidden": 0, + "slot": 2 + }, + { + "pokemon_id": 1019, + "ability_id": 60, + "is_hidden": 1, + "slot": 3 + }, + { + "pokemon_id": 1020, + "ability_id": 281, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 1021, + "ability_id": 281, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 1022, + "ability_id": 282, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 1023, + "ability_id": 282, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 1025, + "ability_id": 10064, + "is_hidden": 0, + "slot": 1 + }, + { + "pokemon_id": 1024, + "ability_id": 10065, + "is_hidden": 0, + "slot": 1 + } +] \ No newline at end of file diff --git a/pokemonduel/data/pokemon_stats.json b/pokemonduel/data/pokemon_stats.json new file mode 100644 index 0000000..1696e5e --- /dev/null +++ b/pokemonduel/data/pokemon_stats.json @@ -0,0 +1,14104 @@ +[ + { + "pokemon_id": 0, + "stats": [ + 33, + 136, + 0, + 0, + 6, + 29 + ] + }, + { + "pokemon_id": 1, + "stats": [ + 45, + 49, + 49, + 65, + 65, + 45 + ] + }, + { + "pokemon_id": 2, + "stats": [ + 60, + 62, + 63, + 80, + 80, + 60 + ] + }, + { + "pokemon_id": 3, + "stats": [ + 80, + 82, + 83, + 100, + 100, + 80 + ] + }, + { + "pokemon_id": 4, + "stats": [ + 39, + 52, + 43, + 60, + 50, + 65 + ] + }, + { + "pokemon_id": 5, + "stats": [ + 58, + 64, + 58, + 80, + 65, + 80 + ] + }, + { + "pokemon_id": 6, + "stats": [ + 78, + 84, + 78, + 109, + 85, + 100 + ] + }, + { + "pokemon_id": 7, + "stats": [ + 44, + 48, + 65, + 50, + 64, + 43 + ] + }, + { + "pokemon_id": 8, + "stats": [ + 59, + 63, + 80, + 65, + 80, + 58 + ] + }, + { + "pokemon_id": 9, + "stats": [ + 79, + 83, + 100, + 85, + 105, + 78 + ] + }, + { + "pokemon_id": 10, + "stats": [ + 45, + 30, + 35, + 20, + 20, + 45 + ] + }, + { + "pokemon_id": 11, + "stats": [ + 50, + 20, + 55, + 25, + 25, + 30 + ] + }, + { + "pokemon_id": 12, + "stats": [ + 60, + 45, + 50, + 90, + 80, + 70 + ] + }, + { + "pokemon_id": 13, + "stats": [ + 40, + 35, + 30, + 20, + 20, + 50 + ] + }, + { + "pokemon_id": 14, + "stats": [ + 45, + 25, + 50, + 25, + 25, + 35 + ] + }, + { + "pokemon_id": 15, + "stats": [ + 65, + 90, + 40, + 45, + 80, + 75 + ] + }, + { + "pokemon_id": 16, + "stats": [ + 40, + 45, + 40, + 35, + 35, + 56 + ] + }, + { + "pokemon_id": 17, + "stats": [ + 63, + 60, + 55, + 50, + 50, + 71 + ] + }, + { + "pokemon_id": 18, + "stats": [ + 83, + 80, + 75, + 70, + 70, + 101 + ] + }, + { + "pokemon_id": 19, + "stats": [ + 30, + 56, + 35, + 25, + 35, + 72 + ] + }, + { + "pokemon_id": 20, + "stats": [ + 55, + 81, + 60, + 50, + 70, + 97 + ] + }, + { + "pokemon_id": 21, + "stats": [ + 40, + 60, + 30, + 31, + 31, + 70 + ] + }, + { + "pokemon_id": 22, + "stats": [ + 65, + 90, + 65, + 61, + 61, + 100 + ] + }, + { + "pokemon_id": 23, + "stats": [ + 35, + 60, + 44, + 40, + 54, + 55 + ] + }, + { + "pokemon_id": 24, + "stats": [ + 60, + 95, + 69, + 65, + 79, + 80 + ] + }, + { + "pokemon_id": 25, + "stats": [ + 35, + 55, + 40, + 50, + 50, + 90 + ] + }, + { + "pokemon_id": 26, + "stats": [ + 60, + 90, + 55, + 90, + 80, + 110 + ] + }, + { + "pokemon_id": 27, + "stats": [ + 50, + 75, + 85, + 20, + 30, + 40 + ] + }, + { + "pokemon_id": 28, + "stats": [ + 75, + 100, + 110, + 45, + 55, + 65 + ] + }, + { + "pokemon_id": 29, + "stats": [ + 55, + 47, + 52, + 40, + 40, + 41 + ] + }, + { + "pokemon_id": 30, + "stats": [ + 70, + 62, + 67, + 55, + 55, + 56 + ] + }, + { + "pokemon_id": 31, + "stats": [ + 90, + 92, + 87, + 75, + 85, + 76 + ] + }, + { + "pokemon_id": 32, + "stats": [ + 46, + 57, + 40, + 40, + 40, + 50 + ] + }, + { + "pokemon_id": 33, + "stats": [ + 61, + 72, + 57, + 55, + 55, + 65 + ] + }, + { + "pokemon_id": 34, + "stats": [ + 81, + 102, + 77, + 85, + 75, + 85 + ] + }, + { + "pokemon_id": 35, + "stats": [ + 70, + 45, + 48, + 60, + 65, + 35 + ] + }, + { + "pokemon_id": 36, + "stats": [ + 95, + 70, + 73, + 95, + 90, + 60 + ] + }, + { + "pokemon_id": 37, + "stats": [ + 38, + 41, + 40, + 50, + 65, + 65 + ] + }, + { + "pokemon_id": 38, + "stats": [ + 73, + 76, + 75, + 81, + 100, + 100 + ] + }, + { + "pokemon_id": 39, + "stats": [ + 115, + 45, + 20, + 45, + 25, + 20 + ] + }, + { + "pokemon_id": 40, + "stats": [ + 140, + 70, + 45, + 85, + 50, + 45 + ] + }, + { + "pokemon_id": 41, + "stats": [ + 40, + 45, + 35, + 30, + 40, + 55 + ] + }, + { + "pokemon_id": 42, + "stats": [ + 75, + 80, + 70, + 65, + 75, + 90 + ] + }, + { + "pokemon_id": 43, + "stats": [ + 45, + 50, + 55, + 75, + 65, + 30 + ] + }, + { + "pokemon_id": 44, + "stats": [ + 60, + 65, + 70, + 85, + 75, + 40 + ] + }, + { + "pokemon_id": 45, + "stats": [ + 75, + 80, + 85, + 110, + 90, + 50 + ] + }, + { + "pokemon_id": 46, + "stats": [ + 35, + 70, + 55, + 45, + 55, + 25 + ] + }, + { + "pokemon_id": 47, + "stats": [ + 60, + 95, + 80, + 60, + 80, + 30 + ] + }, + { + "pokemon_id": 48, + "stats": [ + 60, + 55, + 50, + 40, + 55, + 45 + ] + }, + { + "pokemon_id": 49, + "stats": [ + 70, + 65, + 60, + 90, + 75, + 90 + ] + }, + { + "pokemon_id": 50, + "stats": [ + 10, + 55, + 25, + 35, + 45, + 95 + ] + }, + { + "pokemon_id": 51, + "stats": [ + 35, + 100, + 50, + 50, + 70, + 120 + ] + }, + { + "pokemon_id": 52, + "stats": [ + 40, + 45, + 35, + 40, + 40, + 90 + ] + }, + { + "pokemon_id": 53, + "stats": [ + 65, + 70, + 60, + 65, + 65, + 115 + ] + }, + { + "pokemon_id": 54, + "stats": [ + 50, + 52, + 48, + 65, + 50, + 55 + ] + }, + { + "pokemon_id": 55, + "stats": [ + 80, + 82, + 78, + 95, + 80, + 85 + ] + }, + { + "pokemon_id": 56, + "stats": [ + 40, + 80, + 35, + 35, + 45, + 70 + ] + }, + { + "pokemon_id": 57, + "stats": [ + 65, + 105, + 60, + 60, + 70, + 95 + ] + }, + { + "pokemon_id": 58, + "stats": [ + 55, + 70, + 45, + 70, + 50, + 60 + ] + }, + { + "pokemon_id": 59, + "stats": [ + 90, + 110, + 80, + 100, + 80, + 95 + ] + }, + { + "pokemon_id": 60, + "stats": [ + 40, + 50, + 40, + 40, + 40, + 90 + ] + }, + { + "pokemon_id": 61, + "stats": [ + 65, + 65, + 65, + 50, + 50, + 90 + ] + }, + { + "pokemon_id": 62, + "stats": [ + 90, + 95, + 95, + 70, + 90, + 70 + ] + }, + { + "pokemon_id": 63, + "stats": [ + 25, + 20, + 15, + 105, + 55, + 90 + ] + }, + { + "pokemon_id": 64, + "stats": [ + 40, + 35, + 30, + 120, + 70, + 105 + ] + }, + { + "pokemon_id": 65, + "stats": [ + 55, + 50, + 45, + 135, + 95, + 120 + ] + }, + { + "pokemon_id": 66, + "stats": [ + 70, + 80, + 50, + 35, + 35, + 35 + ] + }, + { + "pokemon_id": 67, + "stats": [ + 80, + 100, + 70, + 50, + 60, + 45 + ] + }, + { + "pokemon_id": 68, + "stats": [ + 90, + 130, + 80, + 65, + 85, + 55 + ] + }, + { + "pokemon_id": 69, + "stats": [ + 50, + 75, + 35, + 70, + 30, + 40 + ] + }, + { + "pokemon_id": 70, + "stats": [ + 65, + 90, + 50, + 85, + 45, + 55 + ] + }, + { + "pokemon_id": 71, + "stats": [ + 80, + 105, + 65, + 100, + 70, + 70 + ] + }, + { + "pokemon_id": 72, + "stats": [ + 40, + 40, + 35, + 50, + 100, + 70 + ] + }, + { + "pokemon_id": 73, + "stats": [ + 80, + 70, + 65, + 80, + 120, + 100 + ] + }, + { + "pokemon_id": 74, + "stats": [ + 40, + 80, + 100, + 30, + 30, + 20 + ] + }, + { + "pokemon_id": 75, + "stats": [ + 55, + 95, + 115, + 45, + 45, + 35 + ] + }, + { + "pokemon_id": 76, + "stats": [ + 80, + 120, + 130, + 55, + 65, + 45 + ] + }, + { + "pokemon_id": 77, + "stats": [ + 50, + 85, + 55, + 65, + 65, + 90 + ] + }, + { + "pokemon_id": 78, + "stats": [ + 65, + 100, + 70, + 80, + 80, + 105 + ] + }, + { + "pokemon_id": 79, + "stats": [ + 90, + 65, + 65, + 40, + 40, + 15 + ] + }, + { + "pokemon_id": 80, + "stats": [ + 95, + 75, + 110, + 100, + 80, + 30 + ] + }, + { + "pokemon_id": 81, + "stats": [ + 25, + 35, + 70, + 95, + 55, + 45 + ] + }, + { + "pokemon_id": 82, + "stats": [ + 50, + 60, + 95, + 120, + 70, + 70 + ] + }, + { + "pokemon_id": 83, + "stats": [ + 52, + 90, + 55, + 58, + 62, + 60 + ] + }, + { + "pokemon_id": 84, + "stats": [ + 35, + 85, + 45, + 35, + 35, + 75 + ] + }, + { + "pokemon_id": 85, + "stats": [ + 60, + 110, + 70, + 60, + 60, + 110 + ] + }, + { + "pokemon_id": 86, + "stats": [ + 65, + 45, + 55, + 45, + 70, + 45 + ] + }, + { + "pokemon_id": 87, + "stats": [ + 90, + 70, + 80, + 70, + 95, + 70 + ] + }, + { + "pokemon_id": 88, + "stats": [ + 80, + 80, + 50, + 40, + 50, + 25 + ] + }, + { + "pokemon_id": 89, + "stats": [ + 105, + 105, + 75, + 65, + 100, + 50 + ] + }, + { + "pokemon_id": 90, + "stats": [ + 30, + 65, + 100, + 45, + 25, + 40 + ] + }, + { + "pokemon_id": 91, + "stats": [ + 50, + 95, + 180, + 85, + 45, + 70 + ] + }, + { + "pokemon_id": 92, + "stats": [ + 30, + 35, + 30, + 100, + 35, + 80 + ] + }, + { + "pokemon_id": 93, + "stats": [ + 45, + 50, + 45, + 115, + 55, + 95 + ] + }, + { + "pokemon_id": 94, + "stats": [ + 60, + 65, + 60, + 130, + 75, + 110 + ] + }, + { + "pokemon_id": 95, + "stats": [ + 35, + 45, + 160, + 30, + 45, + 70 + ] + }, + { + "pokemon_id": 96, + "stats": [ + 60, + 48, + 45, + 43, + 90, + 42 + ] + }, + { + "pokemon_id": 97, + "stats": [ + 85, + 73, + 70, + 73, + 115, + 67 + ] + }, + { + "pokemon_id": 98, + "stats": [ + 30, + 105, + 90, + 25, + 25, + 50 + ] + }, + { + "pokemon_id": 99, + "stats": [ + 55, + 130, + 115, + 50, + 50, + 75 + ] + }, + { + "pokemon_id": 100, + "stats": [ + 40, + 30, + 50, + 55, + 55, + 100 + ] + }, + { + "pokemon_id": 101, + "stats": [ + 60, + 50, + 70, + 80, + 80, + 150 + ] + }, + { + "pokemon_id": 102, + "stats": [ + 60, + 40, + 80, + 60, + 45, + 40 + ] + }, + { + "pokemon_id": 103, + "stats": [ + 95, + 95, + 85, + 125, + 75, + 55 + ] + }, + { + "pokemon_id": 104, + "stats": [ + 50, + 50, + 95, + 40, + 50, + 35 + ] + }, + { + "pokemon_id": 105, + "stats": [ + 60, + 80, + 110, + 50, + 80, + 45 + ] + }, + { + "pokemon_id": 106, + "stats": [ + 50, + 120, + 53, + 35, + 110, + 87 + ] + }, + { + "pokemon_id": 107, + "stats": [ + 50, + 105, + 79, + 35, + 110, + 76 + ] + }, + { + "pokemon_id": 108, + "stats": [ + 90, + 55, + 75, + 60, + 75, + 30 + ] + }, + { + "pokemon_id": 109, + "stats": [ + 40, + 65, + 95, + 60, + 45, + 35 + ] + }, + { + "pokemon_id": 110, + "stats": [ + 65, + 90, + 120, + 85, + 70, + 60 + ] + }, + { + "pokemon_id": 111, + "stats": [ + 80, + 85, + 95, + 30, + 30, + 25 + ] + }, + { + "pokemon_id": 112, + "stats": [ + 105, + 130, + 120, + 45, + 45, + 40 + ] + }, + { + "pokemon_id": 113, + "stats": [ + 250, + 5, + 5, + 35, + 105, + 50 + ] + }, + { + "pokemon_id": 114, + "stats": [ + 65, + 55, + 115, + 100, + 40, + 60 + ] + }, + { + "pokemon_id": 115, + "stats": [ + 105, + 95, + 80, + 40, + 80, + 90 + ] + }, + { + "pokemon_id": 116, + "stats": [ + 30, + 40, + 70, + 70, + 25, + 60 + ] + }, + { + "pokemon_id": 117, + "stats": [ + 55, + 65, + 95, + 95, + 45, + 85 + ] + }, + { + "pokemon_id": 118, + "stats": [ + 45, + 67, + 60, + 35, + 50, + 63 + ] + }, + { + "pokemon_id": 119, + "stats": [ + 80, + 92, + 65, + 65, + 80, + 68 + ] + }, + { + "pokemon_id": 120, + "stats": [ + 30, + 45, + 55, + 70, + 55, + 85 + ] + }, + { + "pokemon_id": 121, + "stats": [ + 60, + 75, + 85, + 100, + 85, + 115 + ] + }, + { + "pokemon_id": 122, + "stats": [ + 40, + 45, + 65, + 100, + 120, + 90 + ] + }, + { + "pokemon_id": 123, + "stats": [ + 70, + 110, + 80, + 55, + 80, + 105 + ] + }, + { + "pokemon_id": 124, + "stats": [ + 65, + 50, + 35, + 115, + 95, + 95 + ] + }, + { + "pokemon_id": 125, + "stats": [ + 65, + 83, + 57, + 95, + 85, + 105 + ] + }, + { + "pokemon_id": 126, + "stats": [ + 65, + 95, + 57, + 100, + 85, + 93 + ] + }, + { + "pokemon_id": 127, + "stats": [ + 65, + 125, + 100, + 55, + 70, + 85 + ] + }, + { + "pokemon_id": 128, + "stats": [ + 75, + 100, + 95, + 40, + 70, + 110 + ] + }, + { + "pokemon_id": 129, + "stats": [ + 20, + 10, + 55, + 15, + 20, + 80 + ] + }, + { + "pokemon_id": 130, + "stats": [ + 95, + 125, + 79, + 60, + 100, + 81 + ] + }, + { + "pokemon_id": 131, + "stats": [ + 130, + 85, + 80, + 85, + 95, + 60 + ] + }, + { + "pokemon_id": 132, + "stats": [ + 48, + 48, + 48, + 48, + 48, + 48 + ] + }, + { + "pokemon_id": 133, + "stats": [ + 55, + 55, + 50, + 45, + 65, + 55 + ] + }, + { + "pokemon_id": 134, + "stats": [ + 130, + 65, + 60, + 110, + 95, + 65 + ] + }, + { + "pokemon_id": 135, + "stats": [ + 65, + 65, + 60, + 110, + 95, + 130 + ] + }, + { + "pokemon_id": 136, + "stats": [ + 65, + 130, + 60, + 95, + 110, + 65 + ] + }, + { + "pokemon_id": 137, + "stats": [ + 65, + 60, + 70, + 85, + 75, + 40 + ] + }, + { + "pokemon_id": 138, + "stats": [ + 35, + 40, + 100, + 90, + 55, + 35 + ] + }, + { + "pokemon_id": 139, + "stats": [ + 70, + 60, + 125, + 115, + 70, + 55 + ] + }, + { + "pokemon_id": 140, + "stats": [ + 30, + 80, + 90, + 55, + 45, + 55 + ] + }, + { + "pokemon_id": 141, + "stats": [ + 60, + 115, + 105, + 65, + 70, + 80 + ] + }, + { + "pokemon_id": 142, + "stats": [ + 80, + 105, + 65, + 60, + 75, + 130 + ] + }, + { + "pokemon_id": 143, + "stats": [ + 160, + 110, + 65, + 65, + 110, + 30 + ] + }, + { + "pokemon_id": 144, + "stats": [ + 90, + 85, + 100, + 95, + 125, + 85 + ] + }, + { + "pokemon_id": 145, + "stats": [ + 90, + 90, + 85, + 125, + 90, + 100 + ] + }, + { + "pokemon_id": 146, + "stats": [ + 90, + 100, + 90, + 125, + 85, + 90 + ] + }, + { + "pokemon_id": 147, + "stats": [ + 41, + 64, + 45, + 50, + 50, + 50 + ] + }, + { + "pokemon_id": 148, + "stats": [ + 61, + 84, + 65, + 70, + 70, + 70 + ] + }, + { + "pokemon_id": 149, + "stats": [ + 91, + 134, + 95, + 100, + 100, + 80 + ] + }, + { + "pokemon_id": 150, + "stats": [ + 106, + 110, + 90, + 154, + 90, + 130 + ] + }, + { + "pokemon_id": 151, + "stats": [ + 100, + 100, + 100, + 100, + 100, + 100 + ] + }, + { + "pokemon_id": 152, + "stats": [ + 45, + 49, + 65, + 49, + 65, + 45 + ] + }, + { + "pokemon_id": 153, + "stats": [ + 60, + 62, + 80, + 63, + 80, + 60 + ] + }, + { + "pokemon_id": 154, + "stats": [ + 80, + 82, + 100, + 83, + 100, + 80 + ] + }, + { + "pokemon_id": 155, + "stats": [ + 39, + 52, + 43, + 60, + 50, + 65 + ] + }, + { + "pokemon_id": 156, + "stats": [ + 58, + 64, + 58, + 80, + 65, + 80 + ] + }, + { + "pokemon_id": 157, + "stats": [ + 78, + 84, + 78, + 109, + 85, + 100 + ] + }, + { + "pokemon_id": 158, + "stats": [ + 50, + 65, + 64, + 44, + 48, + 43 + ] + }, + { + "pokemon_id": 159, + "stats": [ + 65, + 80, + 80, + 59, + 63, + 58 + ] + }, + { + "pokemon_id": 160, + "stats": [ + 85, + 105, + 100, + 79, + 83, + 78 + ] + }, + { + "pokemon_id": 161, + "stats": [ + 35, + 46, + 34, + 35, + 45, + 20 + ] + }, + { + "pokemon_id": 162, + "stats": [ + 85, + 76, + 64, + 45, + 55, + 90 + ] + }, + { + "pokemon_id": 163, + "stats": [ + 60, + 30, + 30, + 36, + 56, + 50 + ] + }, + { + "pokemon_id": 164, + "stats": [ + 100, + 50, + 50, + 86, + 96, + 70 + ] + }, + { + "pokemon_id": 165, + "stats": [ + 40, + 20, + 30, + 40, + 80, + 55 + ] + }, + { + "pokemon_id": 166, + "stats": [ + 55, + 35, + 50, + 55, + 110, + 85 + ] + }, + { + "pokemon_id": 167, + "stats": [ + 40, + 60, + 40, + 40, + 40, + 30 + ] + }, + { + "pokemon_id": 168, + "stats": [ + 70, + 90, + 70, + 60, + 70, + 40 + ] + }, + { + "pokemon_id": 169, + "stats": [ + 85, + 90, + 80, + 70, + 80, + 130 + ] + }, + { + "pokemon_id": 170, + "stats": [ + 75, + 38, + 38, + 56, + 56, + 67 + ] + }, + { + "pokemon_id": 171, + "stats": [ + 125, + 58, + 58, + 76, + 76, + 67 + ] + }, + { + "pokemon_id": 172, + "stats": [ + 20, + 40, + 15, + 35, + 35, + 60 + ] + }, + { + "pokemon_id": 173, + "stats": [ + 50, + 25, + 28, + 45, + 55, + 15 + ] + }, + { + "pokemon_id": 174, + "stats": [ + 90, + 30, + 15, + 40, + 20, + 15 + ] + }, + { + "pokemon_id": 175, + "stats": [ + 35, + 20, + 65, + 40, + 65, + 20 + ] + }, + { + "pokemon_id": 176, + "stats": [ + 55, + 40, + 85, + 80, + 105, + 40 + ] + }, + { + "pokemon_id": 177, + "stats": [ + 40, + 50, + 45, + 70, + 45, + 70 + ] + }, + { + "pokemon_id": 178, + "stats": [ + 65, + 75, + 70, + 95, + 70, + 95 + ] + }, + { + "pokemon_id": 179, + "stats": [ + 55, + 40, + 40, + 65, + 45, + 35 + ] + }, + { + "pokemon_id": 180, + "stats": [ + 70, + 55, + 55, + 80, + 60, + 45 + ] + }, + { + "pokemon_id": 181, + "stats": [ + 90, + 75, + 85, + 115, + 90, + 55 + ] + }, + { + "pokemon_id": 182, + "stats": [ + 75, + 80, + 95, + 90, + 100, + 50 + ] + }, + { + "pokemon_id": 183, + "stats": [ + 70, + 20, + 50, + 20, + 50, + 40 + ] + }, + { + "pokemon_id": 184, + "stats": [ + 100, + 50, + 80, + 60, + 80, + 50 + ] + }, + { + "pokemon_id": 185, + "stats": [ + 70, + 100, + 115, + 30, + 65, + 30 + ] + }, + { + "pokemon_id": 186, + "stats": [ + 90, + 75, + 75, + 90, + 100, + 70 + ] + }, + { + "pokemon_id": 187, + "stats": [ + 35, + 35, + 40, + 35, + 55, + 50 + ] + }, + { + "pokemon_id": 188, + "stats": [ + 55, + 45, + 50, + 45, + 65, + 80 + ] + }, + { + "pokemon_id": 189, + "stats": [ + 75, + 55, + 70, + 55, + 95, + 110 + ] + }, + { + "pokemon_id": 190, + "stats": [ + 55, + 70, + 55, + 40, + 55, + 85 + ] + }, + { + "pokemon_id": 191, + "stats": [ + 30, + 30, + 30, + 30, + 30, + 30 + ] + }, + { + "pokemon_id": 192, + "stats": [ + 75, + 75, + 55, + 105, + 85, + 30 + ] + }, + { + "pokemon_id": 193, + "stats": [ + 65, + 65, + 45, + 75, + 45, + 95 + ] + }, + { + "pokemon_id": 194, + "stats": [ + 55, + 45, + 45, + 25, + 25, + 15 + ] + }, + { + "pokemon_id": 195, + "stats": [ + 95, + 85, + 85, + 65, + 65, + 35 + ] + }, + { + "pokemon_id": 196, + "stats": [ + 65, + 65, + 60, + 130, + 95, + 110 + ] + }, + { + "pokemon_id": 197, + "stats": [ + 95, + 65, + 110, + 60, + 130, + 65 + ] + }, + { + "pokemon_id": 198, + "stats": [ + 60, + 85, + 42, + 85, + 42, + 91 + ] + }, + { + "pokemon_id": 199, + "stats": [ + 95, + 75, + 80, + 100, + 110, + 30 + ] + }, + { + "pokemon_id": 200, + "stats": [ + 60, + 60, + 60, + 85, + 85, + 85 + ] + }, + { + "pokemon_id": 201, + "stats": [ + 48, + 72, + 48, + 72, + 48, + 48 + ] + }, + { + "pokemon_id": 202, + "stats": [ + 190, + 33, + 58, + 33, + 58, + 33 + ] + }, + { + "pokemon_id": 203, + "stats": [ + 70, + 80, + 65, + 90, + 65, + 85 + ] + }, + { + "pokemon_id": 204, + "stats": [ + 50, + 65, + 90, + 35, + 35, + 15 + ] + }, + { + "pokemon_id": 205, + "stats": [ + 75, + 90, + 140, + 60, + 60, + 40 + ] + }, + { + "pokemon_id": 206, + "stats": [ + 100, + 70, + 70, + 65, + 65, + 45 + ] + }, + { + "pokemon_id": 207, + "stats": [ + 65, + 75, + 105, + 35, + 65, + 85 + ] + }, + { + "pokemon_id": 208, + "stats": [ + 75, + 85, + 200, + 55, + 65, + 30 + ] + }, + { + "pokemon_id": 209, + "stats": [ + 60, + 80, + 50, + 40, + 40, + 30 + ] + }, + { + "pokemon_id": 210, + "stats": [ + 90, + 120, + 75, + 60, + 60, + 45 + ] + }, + { + "pokemon_id": 211, + "stats": [ + 65, + 95, + 85, + 55, + 55, + 85 + ] + }, + { + "pokemon_id": 212, + "stats": [ + 70, + 130, + 100, + 55, + 80, + 65 + ] + }, + { + "pokemon_id": 213, + "stats": [ + 20, + 10, + 230, + 10, + 230, + 5 + ] + }, + { + "pokemon_id": 214, + "stats": [ + 80, + 125, + 75, + 40, + 95, + 85 + ] + }, + { + "pokemon_id": 215, + "stats": [ + 55, + 95, + 55, + 35, + 75, + 115 + ] + }, + { + "pokemon_id": 216, + "stats": [ + 60, + 80, + 50, + 50, + 50, + 40 + ] + }, + { + "pokemon_id": 217, + "stats": [ + 90, + 130, + 75, + 75, + 75, + 55 + ] + }, + { + "pokemon_id": 218, + "stats": [ + 40, + 40, + 40, + 70, + 40, + 20 + ] + }, + { + "pokemon_id": 219, + "stats": [ + 60, + 50, + 120, + 90, + 80, + 30 + ] + }, + { + "pokemon_id": 220, + "stats": [ + 50, + 50, + 40, + 30, + 30, + 50 + ] + }, + { + "pokemon_id": 221, + "stats": [ + 100, + 100, + 80, + 60, + 60, + 50 + ] + }, + { + "pokemon_id": 222, + "stats": [ + 65, + 55, + 95, + 65, + 95, + 35 + ] + }, + { + "pokemon_id": 223, + "stats": [ + 35, + 65, + 35, + 65, + 35, + 65 + ] + }, + { + "pokemon_id": 224, + "stats": [ + 75, + 105, + 75, + 105, + 75, + 45 + ] + }, + { + "pokemon_id": 225, + "stats": [ + 45, + 55, + 45, + 65, + 45, + 75 + ] + }, + { + "pokemon_id": 226, + "stats": [ + 85, + 40, + 70, + 80, + 140, + 70 + ] + }, + { + "pokemon_id": 227, + "stats": [ + 65, + 80, + 140, + 40, + 70, + 70 + ] + }, + { + "pokemon_id": 228, + "stats": [ + 45, + 60, + 30, + 80, + 50, + 65 + ] + }, + { + "pokemon_id": 229, + "stats": [ + 75, + 90, + 50, + 110, + 80, + 95 + ] + }, + { + "pokemon_id": 230, + "stats": [ + 75, + 95, + 95, + 95, + 95, + 85 + ] + }, + { + "pokemon_id": 231, + "stats": [ + 90, + 60, + 60, + 40, + 40, + 40 + ] + }, + { + "pokemon_id": 232, + "stats": [ + 90, + 120, + 120, + 60, + 60, + 50 + ] + }, + { + "pokemon_id": 233, + "stats": [ + 85, + 80, + 90, + 105, + 95, + 60 + ] + }, + { + "pokemon_id": 234, + "stats": [ + 73, + 95, + 62, + 85, + 65, + 85 + ] + }, + { + "pokemon_id": 235, + "stats": [ + 55, + 20, + 35, + 20, + 45, + 75 + ] + }, + { + "pokemon_id": 236, + "stats": [ + 35, + 35, + 35, + 35, + 35, + 35 + ] + }, + { + "pokemon_id": 237, + "stats": [ + 50, + 95, + 95, + 35, + 110, + 70 + ] + }, + { + "pokemon_id": 238, + "stats": [ + 45, + 30, + 15, + 85, + 65, + 65 + ] + }, + { + "pokemon_id": 239, + "stats": [ + 45, + 63, + 37, + 65, + 55, + 95 + ] + }, + { + "pokemon_id": 240, + "stats": [ + 45, + 75, + 37, + 70, + 55, + 83 + ] + }, + { + "pokemon_id": 241, + "stats": [ + 95, + 80, + 105, + 40, + 70, + 100 + ] + }, + { + "pokemon_id": 242, + "stats": [ + 255, + 10, + 10, + 75, + 135, + 55 + ] + }, + { + "pokemon_id": 243, + "stats": [ + 90, + 85, + 75, + 115, + 100, + 115 + ] + }, + { + "pokemon_id": 244, + "stats": [ + 115, + 115, + 85, + 90, + 75, + 100 + ] + }, + { + "pokemon_id": 245, + "stats": [ + 100, + 75, + 115, + 90, + 115, + 85 + ] + }, + { + "pokemon_id": 246, + "stats": [ + 50, + 64, + 50, + 45, + 50, + 41 + ] + }, + { + "pokemon_id": 247, + "stats": [ + 70, + 84, + 70, + 65, + 70, + 51 + ] + }, + { + "pokemon_id": 248, + "stats": [ + 100, + 134, + 110, + 95, + 100, + 61 + ] + }, + { + "pokemon_id": 249, + "stats": [ + 106, + 90, + 130, + 90, + 154, + 110 + ] + }, + { + "pokemon_id": 250, + "stats": [ + 106, + 130, + 90, + 110, + 154, + 90 + ] + }, + { + "pokemon_id": 251, + "stats": [ + 100, + 100, + 100, + 100, + 100, + 100 + ] + }, + { + "pokemon_id": 252, + "stats": [ + 40, + 45, + 35, + 65, + 55, + 70 + ] + }, + { + "pokemon_id": 253, + "stats": [ + 50, + 65, + 45, + 85, + 65, + 95 + ] + }, + { + "pokemon_id": 254, + "stats": [ + 70, + 85, + 65, + 105, + 85, + 120 + ] + }, + { + "pokemon_id": 255, + "stats": [ + 45, + 60, + 40, + 70, + 50, + 45 + ] + }, + { + "pokemon_id": 256, + "stats": [ + 60, + 85, + 60, + 85, + 60, + 55 + ] + }, + { + "pokemon_id": 257, + "stats": [ + 80, + 120, + 70, + 110, + 70, + 80 + ] + }, + { + "pokemon_id": 258, + "stats": [ + 50, + 70, + 50, + 50, + 50, + 40 + ] + }, + { + "pokemon_id": 259, + "stats": [ + 70, + 85, + 70, + 60, + 70, + 50 + ] + }, + { + "pokemon_id": 260, + "stats": [ + 100, + 110, + 90, + 85, + 90, + 60 + ] + }, + { + "pokemon_id": 261, + "stats": [ + 35, + 55, + 35, + 30, + 30, + 35 + ] + }, + { + "pokemon_id": 262, + "stats": [ + 70, + 90, + 70, + 60, + 60, + 70 + ] + }, + { + "pokemon_id": 263, + "stats": [ + 38, + 30, + 41, + 30, + 41, + 60 + ] + }, + { + "pokemon_id": 264, + "stats": [ + 78, + 70, + 61, + 50, + 61, + 100 + ] + }, + { + "pokemon_id": 265, + "stats": [ + 45, + 45, + 35, + 20, + 30, + 20 + ] + }, + { + "pokemon_id": 266, + "stats": [ + 50, + 35, + 55, + 25, + 25, + 15 + ] + }, + { + "pokemon_id": 267, + "stats": [ + 60, + 70, + 50, + 100, + 50, + 65 + ] + }, + { + "pokemon_id": 268, + "stats": [ + 50, + 35, + 55, + 25, + 25, + 15 + ] + }, + { + "pokemon_id": 269, + "stats": [ + 60, + 50, + 70, + 50, + 90, + 65 + ] + }, + { + "pokemon_id": 270, + "stats": [ + 40, + 30, + 30, + 40, + 50, + 30 + ] + }, + { + "pokemon_id": 271, + "stats": [ + 60, + 50, + 50, + 60, + 70, + 50 + ] + }, + { + "pokemon_id": 272, + "stats": [ + 80, + 70, + 70, + 90, + 100, + 70 + ] + }, + { + "pokemon_id": 273, + "stats": [ + 40, + 40, + 50, + 30, + 30, + 30 + ] + }, + { + "pokemon_id": 274, + "stats": [ + 70, + 70, + 40, + 60, + 40, + 60 + ] + }, + { + "pokemon_id": 275, + "stats": [ + 90, + 100, + 60, + 90, + 60, + 80 + ] + }, + { + "pokemon_id": 276, + "stats": [ + 40, + 55, + 30, + 30, + 30, + 85 + ] + }, + { + "pokemon_id": 277, + "stats": [ + 60, + 85, + 60, + 75, + 50, + 125 + ] + }, + { + "pokemon_id": 278, + "stats": [ + 40, + 30, + 30, + 55, + 30, + 85 + ] + }, + { + "pokemon_id": 279, + "stats": [ + 60, + 50, + 100, + 95, + 70, + 65 + ] + }, + { + "pokemon_id": 280, + "stats": [ + 28, + 25, + 25, + 45, + 35, + 40 + ] + }, + { + "pokemon_id": 281, + "stats": [ + 38, + 35, + 35, + 65, + 55, + 50 + ] + }, + { + "pokemon_id": 282, + "stats": [ + 68, + 65, + 65, + 125, + 115, + 80 + ] + }, + { + "pokemon_id": 283, + "stats": [ + 40, + 30, + 32, + 50, + 52, + 65 + ] + }, + { + "pokemon_id": 284, + "stats": [ + 70, + 60, + 62, + 100, + 82, + 80 + ] + }, + { + "pokemon_id": 285, + "stats": [ + 60, + 40, + 60, + 40, + 60, + 35 + ] + }, + { + "pokemon_id": 286, + "stats": [ + 60, + 130, + 80, + 60, + 60, + 70 + ] + }, + { + "pokemon_id": 287, + "stats": [ + 60, + 60, + 60, + 35, + 35, + 30 + ] + }, + { + "pokemon_id": 288, + "stats": [ + 80, + 80, + 80, + 55, + 55, + 90 + ] + }, + { + "pokemon_id": 289, + "stats": [ + 150, + 160, + 100, + 95, + 65, + 100 + ] + }, + { + "pokemon_id": 290, + "stats": [ + 31, + 45, + 90, + 30, + 30, + 40 + ] + }, + { + "pokemon_id": 291, + "stats": [ + 61, + 90, + 45, + 50, + 50, + 160 + ] + }, + { + "pokemon_id": 292, + "stats": [ + 1, + 90, + 45, + 30, + 30, + 40 + ] + }, + { + "pokemon_id": 293, + "stats": [ + 64, + 51, + 23, + 51, + 23, + 28 + ] + }, + { + "pokemon_id": 294, + "stats": [ + 84, + 71, + 43, + 71, + 43, + 48 + ] + }, + { + "pokemon_id": 295, + "stats": [ + 104, + 91, + 63, + 91, + 73, + 68 + ] + }, + { + "pokemon_id": 296, + "stats": [ + 72, + 60, + 30, + 20, + 30, + 25 + ] + }, + { + "pokemon_id": 297, + "stats": [ + 144, + 120, + 60, + 40, + 60, + 50 + ] + }, + { + "pokemon_id": 298, + "stats": [ + 50, + 20, + 40, + 20, + 40, + 20 + ] + }, + { + "pokemon_id": 299, + "stats": [ + 30, + 45, + 135, + 45, + 90, + 30 + ] + }, + { + "pokemon_id": 300, + "stats": [ + 50, + 45, + 45, + 35, + 35, + 50 + ] + }, + { + "pokemon_id": 301, + "stats": [ + 70, + 65, + 65, + 55, + 55, + 90 + ] + }, + { + "pokemon_id": 302, + "stats": [ + 50, + 75, + 75, + 65, + 65, + 50 + ] + }, + { + "pokemon_id": 303, + "stats": [ + 50, + 85, + 85, + 55, + 55, + 50 + ] + }, + { + "pokemon_id": 304, + "stats": [ + 50, + 70, + 100, + 40, + 40, + 30 + ] + }, + { + "pokemon_id": 305, + "stats": [ + 60, + 90, + 140, + 50, + 50, + 40 + ] + }, + { + "pokemon_id": 306, + "stats": [ + 70, + 110, + 180, + 60, + 60, + 50 + ] + }, + { + "pokemon_id": 307, + "stats": [ + 30, + 40, + 55, + 40, + 55, + 60 + ] + }, + { + "pokemon_id": 308, + "stats": [ + 60, + 60, + 75, + 60, + 75, + 80 + ] + }, + { + "pokemon_id": 309, + "stats": [ + 40, + 45, + 40, + 65, + 40, + 65 + ] + }, + { + "pokemon_id": 310, + "stats": [ + 70, + 75, + 60, + 105, + 60, + 105 + ] + }, + { + "pokemon_id": 311, + "stats": [ + 60, + 50, + 40, + 85, + 75, + 95 + ] + }, + { + "pokemon_id": 312, + "stats": [ + 60, + 40, + 50, + 75, + 85, + 95 + ] + }, + { + "pokemon_id": 313, + "stats": [ + 65, + 73, + 75, + 47, + 85, + 85 + ] + }, + { + "pokemon_id": 314, + "stats": [ + 65, + 47, + 75, + 73, + 85, + 85 + ] + }, + { + "pokemon_id": 315, + "stats": [ + 50, + 60, + 45, + 100, + 80, + 65 + ] + }, + { + "pokemon_id": 316, + "stats": [ + 70, + 43, + 53, + 43, + 53, + 40 + ] + }, + { + "pokemon_id": 317, + "stats": [ + 100, + 73, + 83, + 73, + 83, + 55 + ] + }, + { + "pokemon_id": 318, + "stats": [ + 45, + 90, + 20, + 65, + 20, + 65 + ] + }, + { + "pokemon_id": 319, + "stats": [ + 70, + 120, + 40, + 95, + 40, + 95 + ] + }, + { + "pokemon_id": 320, + "stats": [ + 130, + 70, + 35, + 70, + 35, + 60 + ] + }, + { + "pokemon_id": 321, + "stats": [ + 170, + 90, + 45, + 90, + 45, + 60 + ] + }, + { + "pokemon_id": 322, + "stats": [ + 60, + 60, + 40, + 65, + 45, + 35 + ] + }, + { + "pokemon_id": 323, + "stats": [ + 70, + 100, + 70, + 105, + 75, + 40 + ] + }, + { + "pokemon_id": 324, + "stats": [ + 70, + 85, + 140, + 85, + 70, + 20 + ] + }, + { + "pokemon_id": 325, + "stats": [ + 60, + 25, + 35, + 70, + 80, + 60 + ] + }, + { + "pokemon_id": 326, + "stats": [ + 80, + 45, + 65, + 90, + 110, + 80 + ] + }, + { + "pokemon_id": 327, + "stats": [ + 60, + 60, + 60, + 60, + 60, + 60 + ] + }, + { + "pokemon_id": 328, + "stats": [ + 45, + 100, + 45, + 45, + 45, + 10 + ] + }, + { + "pokemon_id": 329, + "stats": [ + 50, + 70, + 50, + 50, + 50, + 70 + ] + }, + { + "pokemon_id": 330, + "stats": [ + 80, + 100, + 80, + 80, + 80, + 100 + ] + }, + { + "pokemon_id": 331, + "stats": [ + 50, + 85, + 40, + 85, + 40, + 35 + ] + }, + { + "pokemon_id": 332, + "stats": [ + 70, + 115, + 60, + 115, + 60, + 55 + ] + }, + { + "pokemon_id": 333, + "stats": [ + 45, + 40, + 60, + 40, + 75, + 50 + ] + }, + { + "pokemon_id": 334, + "stats": [ + 75, + 70, + 90, + 70, + 105, + 80 + ] + }, + { + "pokemon_id": 335, + "stats": [ + 73, + 115, + 60, + 60, + 60, + 90 + ] + }, + { + "pokemon_id": 336, + "stats": [ + 73, + 100, + 60, + 100, + 60, + 65 + ] + }, + { + "pokemon_id": 337, + "stats": [ + 90, + 55, + 65, + 95, + 85, + 70 + ] + }, + { + "pokemon_id": 338, + "stats": [ + 90, + 95, + 85, + 55, + 65, + 70 + ] + }, + { + "pokemon_id": 339, + "stats": [ + 50, + 48, + 43, + 46, + 41, + 60 + ] + }, + { + "pokemon_id": 340, + "stats": [ + 110, + 78, + 73, + 76, + 71, + 60 + ] + }, + { + "pokemon_id": 341, + "stats": [ + 43, + 80, + 65, + 50, + 35, + 35 + ] + }, + { + "pokemon_id": 342, + "stats": [ + 63, + 120, + 85, + 90, + 55, + 55 + ] + }, + { + "pokemon_id": 343, + "stats": [ + 40, + 40, + 55, + 40, + 70, + 55 + ] + }, + { + "pokemon_id": 344, + "stats": [ + 60, + 70, + 105, + 70, + 120, + 75 + ] + }, + { + "pokemon_id": 345, + "stats": [ + 66, + 41, + 77, + 61, + 87, + 23 + ] + }, + { + "pokemon_id": 346, + "stats": [ + 86, + 81, + 97, + 81, + 107, + 43 + ] + }, + { + "pokemon_id": 347, + "stats": [ + 45, + 95, + 50, + 40, + 50, + 75 + ] + }, + { + "pokemon_id": 348, + "stats": [ + 75, + 125, + 100, + 70, + 80, + 45 + ] + }, + { + "pokemon_id": 349, + "stats": [ + 20, + 15, + 20, + 10, + 55, + 80 + ] + }, + { + "pokemon_id": 350, + "stats": [ + 95, + 60, + 79, + 100, + 125, + 81 + ] + }, + { + "pokemon_id": 351, + "stats": [ + 70, + 70, + 70, + 70, + 70, + 70 + ] + }, + { + "pokemon_id": 352, + "stats": [ + 60, + 90, + 70, + 60, + 120, + 40 + ] + }, + { + "pokemon_id": 353, + "stats": [ + 44, + 75, + 35, + 63, + 33, + 45 + ] + }, + { + "pokemon_id": 354, + "stats": [ + 64, + 115, + 65, + 83, + 63, + 65 + ] + }, + { + "pokemon_id": 355, + "stats": [ + 20, + 40, + 90, + 30, + 90, + 25 + ] + }, + { + "pokemon_id": 356, + "stats": [ + 40, + 70, + 130, + 60, + 130, + 25 + ] + }, + { + "pokemon_id": 357, + "stats": [ + 99, + 68, + 83, + 72, + 87, + 51 + ] + }, + { + "pokemon_id": 358, + "stats": [ + 75, + 50, + 80, + 95, + 90, + 65 + ] + }, + { + "pokemon_id": 359, + "stats": [ + 65, + 130, + 60, + 75, + 60, + 75 + ] + }, + { + "pokemon_id": 360, + "stats": [ + 95, + 23, + 48, + 23, + 48, + 23 + ] + }, + { + "pokemon_id": 361, + "stats": [ + 50, + 50, + 50, + 50, + 50, + 50 + ] + }, + { + "pokemon_id": 362, + "stats": [ + 80, + 80, + 80, + 80, + 80, + 80 + ] + }, + { + "pokemon_id": 363, + "stats": [ + 70, + 40, + 50, + 55, + 50, + 25 + ] + }, + { + "pokemon_id": 364, + "stats": [ + 90, + 60, + 70, + 75, + 70, + 45 + ] + }, + { + "pokemon_id": 365, + "stats": [ + 110, + 80, + 90, + 95, + 90, + 65 + ] + }, + { + "pokemon_id": 366, + "stats": [ + 35, + 64, + 85, + 74, + 55, + 32 + ] + }, + { + "pokemon_id": 367, + "stats": [ + 55, + 104, + 105, + 94, + 75, + 52 + ] + }, + { + "pokemon_id": 368, + "stats": [ + 55, + 84, + 105, + 114, + 75, + 52 + ] + }, + { + "pokemon_id": 369, + "stats": [ + 100, + 90, + 130, + 45, + 65, + 55 + ] + }, + { + "pokemon_id": 370, + "stats": [ + 43, + 30, + 55, + 40, + 65, + 97 + ] + }, + { + "pokemon_id": 371, + "stats": [ + 45, + 75, + 60, + 40, + 30, + 50 + ] + }, + { + "pokemon_id": 372, + "stats": [ + 65, + 95, + 100, + 60, + 50, + 50 + ] + }, + { + "pokemon_id": 373, + "stats": [ + 95, + 135, + 80, + 110, + 80, + 100 + ] + }, + { + "pokemon_id": 374, + "stats": [ + 40, + 55, + 80, + 35, + 60, + 30 + ] + }, + { + "pokemon_id": 375, + "stats": [ + 60, + 75, + 100, + 55, + 80, + 50 + ] + }, + { + "pokemon_id": 376, + "stats": [ + 80, + 135, + 130, + 95, + 90, + 70 + ] + }, + { + "pokemon_id": 377, + "stats": [ + 80, + 100, + 200, + 50, + 100, + 50 + ] + }, + { + "pokemon_id": 378, + "stats": [ + 80, + 50, + 100, + 100, + 200, + 50 + ] + }, + { + "pokemon_id": 379, + "stats": [ + 80, + 75, + 150, + 75, + 150, + 50 + ] + }, + { + "pokemon_id": 380, + "stats": [ + 80, + 80, + 90, + 110, + 130, + 110 + ] + }, + { + "pokemon_id": 381, + "stats": [ + 80, + 90, + 80, + 130, + 110, + 110 + ] + }, + { + "pokemon_id": 382, + "stats": [ + 100, + 100, + 90, + 150, + 140, + 90 + ] + }, + { + "pokemon_id": 383, + "stats": [ + 100, + 150, + 140, + 100, + 90, + 90 + ] + }, + { + "pokemon_id": 384, + "stats": [ + 105, + 150, + 90, + 150, + 90, + 95 + ] + }, + { + "pokemon_id": 385, + "stats": [ + 100, + 100, + 100, + 100, + 100, + 100 + ] + }, + { + "pokemon_id": 386, + "stats": [ + 50, + 150, + 50, + 150, + 50, + 150 + ] + }, + { + "pokemon_id": 387, + "stats": [ + 55, + 68, + 64, + 45, + 55, + 31 + ] + }, + { + "pokemon_id": 388, + "stats": [ + 75, + 89, + 85, + 55, + 65, + 36 + ] + }, + { + "pokemon_id": 389, + "stats": [ + 95, + 109, + 105, + 75, + 85, + 56 + ] + }, + { + "pokemon_id": 390, + "stats": [ + 44, + 58, + 44, + 58, + 44, + 61 + ] + }, + { + "pokemon_id": 391, + "stats": [ + 64, + 78, + 52, + 78, + 52, + 81 + ] + }, + { + "pokemon_id": 392, + "stats": [ + 76, + 104, + 71, + 104, + 71, + 108 + ] + }, + { + "pokemon_id": 393, + "stats": [ + 53, + 51, + 53, + 61, + 56, + 40 + ] + }, + { + "pokemon_id": 394, + "stats": [ + 64, + 66, + 68, + 81, + 76, + 50 + ] + }, + { + "pokemon_id": 395, + "stats": [ + 84, + 86, + 88, + 111, + 101, + 60 + ] + }, + { + "pokemon_id": 396, + "stats": [ + 40, + 55, + 30, + 30, + 30, + 60 + ] + }, + { + "pokemon_id": 397, + "stats": [ + 55, + 75, + 50, + 40, + 40, + 80 + ] + }, + { + "pokemon_id": 398, + "stats": [ + 85, + 120, + 70, + 50, + 60, + 100 + ] + }, + { + "pokemon_id": 399, + "stats": [ + 59, + 45, + 40, + 35, + 40, + 31 + ] + }, + { + "pokemon_id": 400, + "stats": [ + 79, + 85, + 60, + 55, + 60, + 71 + ] + }, + { + "pokemon_id": 401, + "stats": [ + 37, + 25, + 41, + 25, + 41, + 25 + ] + }, + { + "pokemon_id": 402, + "stats": [ + 77, + 85, + 51, + 55, + 51, + 65 + ] + }, + { + "pokemon_id": 403, + "stats": [ + 45, + 65, + 34, + 40, + 34, + 45 + ] + }, + { + "pokemon_id": 404, + "stats": [ + 60, + 85, + 49, + 60, + 49, + 60 + ] + }, + { + "pokemon_id": 405, + "stats": [ + 80, + 120, + 79, + 95, + 79, + 70 + ] + }, + { + "pokemon_id": 406, + "stats": [ + 40, + 30, + 35, + 50, + 70, + 55 + ] + }, + { + "pokemon_id": 407, + "stats": [ + 60, + 70, + 65, + 125, + 105, + 90 + ] + }, + { + "pokemon_id": 408, + "stats": [ + 67, + 125, + 40, + 30, + 30, + 58 + ] + }, + { + "pokemon_id": 409, + "stats": [ + 97, + 165, + 60, + 65, + 50, + 58 + ] + }, + { + "pokemon_id": 410, + "stats": [ + 30, + 42, + 118, + 42, + 88, + 30 + ] + }, + { + "pokemon_id": 411, + "stats": [ + 60, + 52, + 168, + 47, + 138, + 30 + ] + }, + { + "pokemon_id": 412, + "stats": [ + 40, + 29, + 45, + 29, + 45, + 36 + ] + }, + { + "pokemon_id": 413, + "stats": [ + 60, + 59, + 85, + 79, + 105, + 36 + ] + }, + { + "pokemon_id": 414, + "stats": [ + 70, + 94, + 50, + 94, + 50, + 66 + ] + }, + { + "pokemon_id": 415, + "stats": [ + 30, + 30, + 42, + 30, + 42, + 70 + ] + }, + { + "pokemon_id": 416, + "stats": [ + 70, + 80, + 102, + 80, + 102, + 40 + ] + }, + { + "pokemon_id": 417, + "stats": [ + 60, + 45, + 70, + 45, + 90, + 95 + ] + }, + { + "pokemon_id": 418, + "stats": [ + 55, + 65, + 35, + 60, + 30, + 85 + ] + }, + { + "pokemon_id": 419, + "stats": [ + 85, + 105, + 55, + 85, + 50, + 115 + ] + }, + { + "pokemon_id": 420, + "stats": [ + 45, + 35, + 45, + 62, + 53, + 35 + ] + }, + { + "pokemon_id": 421, + "stats": [ + 70, + 60, + 70, + 87, + 78, + 85 + ] + }, + { + "pokemon_id": 422, + "stats": [ + 76, + 48, + 48, + 57, + 62, + 34 + ] + }, + { + "pokemon_id": 423, + "stats": [ + 111, + 83, + 68, + 92, + 82, + 39 + ] + }, + { + "pokemon_id": 424, + "stats": [ + 75, + 100, + 66, + 60, + 66, + 115 + ] + }, + { + "pokemon_id": 425, + "stats": [ + 90, + 50, + 34, + 60, + 44, + 70 + ] + }, + { + "pokemon_id": 426, + "stats": [ + 150, + 80, + 44, + 90, + 54, + 80 + ] + }, + { + "pokemon_id": 427, + "stats": [ + 55, + 66, + 44, + 44, + 56, + 85 + ] + }, + { + "pokemon_id": 428, + "stats": [ + 65, + 76, + 84, + 54, + 96, + 105 + ] + }, + { + "pokemon_id": 429, + "stats": [ + 60, + 60, + 60, + 105, + 105, + 105 + ] + }, + { + "pokemon_id": 430, + "stats": [ + 100, + 125, + 52, + 105, + 52, + 71 + ] + }, + { + "pokemon_id": 431, + "stats": [ + 49, + 55, + 42, + 42, + 37, + 85 + ] + }, + { + "pokemon_id": 432, + "stats": [ + 71, + 82, + 64, + 64, + 59, + 112 + ] + }, + { + "pokemon_id": 433, + "stats": [ + 45, + 30, + 50, + 65, + 50, + 45 + ] + }, + { + "pokemon_id": 434, + "stats": [ + 63, + 63, + 47, + 41, + 41, + 74 + ] + }, + { + "pokemon_id": 435, + "stats": [ + 103, + 93, + 67, + 71, + 61, + 84 + ] + }, + { + "pokemon_id": 436, + "stats": [ + 57, + 24, + 86, + 24, + 86, + 23 + ] + }, + { + "pokemon_id": 437, + "stats": [ + 67, + 89, + 116, + 79, + 116, + 33 + ] + }, + { + "pokemon_id": 438, + "stats": [ + 50, + 80, + 95, + 10, + 45, + 10 + ] + }, + { + "pokemon_id": 439, + "stats": [ + 20, + 25, + 45, + 70, + 90, + 60 + ] + }, + { + "pokemon_id": 440, + "stats": [ + 100, + 5, + 5, + 15, + 65, + 30 + ] + }, + { + "pokemon_id": 441, + "stats": [ + 76, + 65, + 45, + 92, + 42, + 91 + ] + }, + { + "pokemon_id": 442, + "stats": [ + 50, + 92, + 108, + 92, + 108, + 35 + ] + }, + { + "pokemon_id": 443, + "stats": [ + 58, + 70, + 45, + 40, + 45, + 42 + ] + }, + { + "pokemon_id": 444, + "stats": [ + 68, + 90, + 65, + 50, + 55, + 82 + ] + }, + { + "pokemon_id": 445, + "stats": [ + 108, + 130, + 95, + 80, + 85, + 102 + ] + }, + { + "pokemon_id": 446, + "stats": [ + 135, + 85, + 40, + 40, + 85, + 5 + ] + }, + { + "pokemon_id": 447, + "stats": [ + 40, + 70, + 40, + 35, + 40, + 60 + ] + }, + { + "pokemon_id": 448, + "stats": [ + 70, + 110, + 70, + 115, + 70, + 90 + ] + }, + { + "pokemon_id": 449, + "stats": [ + 68, + 72, + 78, + 38, + 42, + 32 + ] + }, + { + "pokemon_id": 450, + "stats": [ + 108, + 112, + 118, + 68, + 72, + 47 + ] + }, + { + "pokemon_id": 451, + "stats": [ + 40, + 50, + 90, + 30, + 55, + 65 + ] + }, + { + "pokemon_id": 452, + "stats": [ + 70, + 90, + 110, + 60, + 75, + 95 + ] + }, + { + "pokemon_id": 453, + "stats": [ + 48, + 61, + 40, + 61, + 40, + 50 + ] + }, + { + "pokemon_id": 454, + "stats": [ + 83, + 106, + 65, + 86, + 65, + 85 + ] + }, + { + "pokemon_id": 455, + "stats": [ + 74, + 100, + 72, + 90, + 72, + 46 + ] + }, + { + "pokemon_id": 456, + "stats": [ + 49, + 49, + 56, + 49, + 61, + 66 + ] + }, + { + "pokemon_id": 457, + "stats": [ + 69, + 69, + 76, + 69, + 86, + 91 + ] + }, + { + "pokemon_id": 458, + "stats": [ + 45, + 20, + 50, + 60, + 120, + 50 + ] + }, + { + "pokemon_id": 459, + "stats": [ + 60, + 62, + 50, + 62, + 60, + 40 + ] + }, + { + "pokemon_id": 460, + "stats": [ + 90, + 92, + 75, + 92, + 85, + 60 + ] + }, + { + "pokemon_id": 461, + "stats": [ + 70, + 120, + 65, + 45, + 85, + 125 + ] + }, + { + "pokemon_id": 462, + "stats": [ + 70, + 70, + 115, + 130, + 90, + 60 + ] + }, + { + "pokemon_id": 463, + "stats": [ + 110, + 85, + 95, + 80, + 95, + 50 + ] + }, + { + "pokemon_id": 464, + "stats": [ + 115, + 140, + 130, + 55, + 55, + 40 + ] + }, + { + "pokemon_id": 465, + "stats": [ + 100, + 100, + 125, + 110, + 50, + 50 + ] + }, + { + "pokemon_id": 466, + "stats": [ + 75, + 123, + 67, + 95, + 85, + 95 + ] + }, + { + "pokemon_id": 467, + "stats": [ + 75, + 95, + 67, + 125, + 95, + 83 + ] + }, + { + "pokemon_id": 468, + "stats": [ + 85, + 50, + 95, + 120, + 115, + 80 + ] + }, + { + "pokemon_id": 469, + "stats": [ + 86, + 76, + 86, + 116, + 56, + 95 + ] + }, + { + "pokemon_id": 470, + "stats": [ + 65, + 110, + 130, + 60, + 65, + 95 + ] + }, + { + "pokemon_id": 471, + "stats": [ + 65, + 60, + 110, + 130, + 95, + 65 + ] + }, + { + "pokemon_id": 472, + "stats": [ + 75, + 95, + 125, + 45, + 75, + 95 + ] + }, + { + "pokemon_id": 473, + "stats": [ + 110, + 130, + 80, + 70, + 60, + 80 + ] + }, + { + "pokemon_id": 474, + "stats": [ + 85, + 80, + 70, + 135, + 75, + 90 + ] + }, + { + "pokemon_id": 475, + "stats": [ + 68, + 125, + 65, + 65, + 115, + 80 + ] + }, + { + "pokemon_id": 476, + "stats": [ + 60, + 55, + 145, + 75, + 150, + 40 + ] + }, + { + "pokemon_id": 477, + "stats": [ + 45, + 100, + 135, + 65, + 135, + 45 + ] + }, + { + "pokemon_id": 478, + "stats": [ + 70, + 80, + 70, + 80, + 70, + 110 + ] + }, + { + "pokemon_id": 479, + "stats": [ + 50, + 50, + 77, + 95, + 77, + 91 + ] + }, + { + "pokemon_id": 480, + "stats": [ + 75, + 75, + 130, + 75, + 130, + 95 + ] + }, + { + "pokemon_id": 481, + "stats": [ + 80, + 105, + 105, + 105, + 105, + 80 + ] + }, + { + "pokemon_id": 482, + "stats": [ + 75, + 125, + 70, + 125, + 70, + 115 + ] + }, + { + "pokemon_id": 483, + "stats": [ + 100, + 120, + 120, + 150, + 100, + 90 + ] + }, + { + "pokemon_id": 484, + "stats": [ + 90, + 120, + 100, + 150, + 120, + 100 + ] + }, + { + "pokemon_id": 485, + "stats": [ + 91, + 90, + 106, + 130, + 106, + 77 + ] + }, + { + "pokemon_id": 486, + "stats": [ + 110, + 160, + 110, + 80, + 110, + 100 + ] + }, + { + "pokemon_id": 487, + "stats": [ + 150, + 100, + 120, + 100, + 120, + 90 + ] + }, + { + "pokemon_id": 488, + "stats": [ + 120, + 70, + 120, + 75, + 130, + 85 + ] + }, + { + "pokemon_id": 489, + "stats": [ + 80, + 80, + 80, + 80, + 80, + 80 + ] + }, + { + "pokemon_id": 490, + "stats": [ + 100, + 100, + 100, + 100, + 100, + 100 + ] + }, + { + "pokemon_id": 491, + "stats": [ + 70, + 90, + 90, + 135, + 90, + 125 + ] + }, + { + "pokemon_id": 492, + "stats": [ + 100, + 100, + 100, + 100, + 100, + 100 + ] + }, + { + "pokemon_id": 493, + "stats": [ + 120, + 120, + 120, + 120, + 120, + 120 + ] + }, + { + "pokemon_id": 494, + "stats": [ + 100, + 100, + 100, + 100, + 100, + 100 + ] + }, + { + "pokemon_id": 495, + "stats": [ + 45, + 45, + 55, + 45, + 55, + 63 + ] + }, + { + "pokemon_id": 496, + "stats": [ + 60, + 60, + 75, + 60, + 75, + 83 + ] + }, + { + "pokemon_id": 497, + "stats": [ + 75, + 75, + 95, + 75, + 95, + 113 + ] + }, + { + "pokemon_id": 498, + "stats": [ + 65, + 63, + 45, + 45, + 45, + 45 + ] + }, + { + "pokemon_id": 499, + "stats": [ + 90, + 93, + 55, + 70, + 55, + 55 + ] + }, + { + "pokemon_id": 500, + "stats": [ + 110, + 123, + 65, + 100, + 65, + 65 + ] + }, + { + "pokemon_id": 501, + "stats": [ + 55, + 55, + 45, + 63, + 45, + 45 + ] + }, + { + "pokemon_id": 502, + "stats": [ + 75, + 75, + 60, + 83, + 60, + 60 + ] + }, + { + "pokemon_id": 503, + "stats": [ + 95, + 100, + 85, + 108, + 70, + 70 + ] + }, + { + "pokemon_id": 504, + "stats": [ + 45, + 55, + 39, + 35, + 39, + 42 + ] + }, + { + "pokemon_id": 505, + "stats": [ + 60, + 85, + 69, + 60, + 69, + 77 + ] + }, + { + "pokemon_id": 506, + "stats": [ + 45, + 60, + 45, + 25, + 45, + 55 + ] + }, + { + "pokemon_id": 507, + "stats": [ + 65, + 80, + 65, + 35, + 65, + 60 + ] + }, + { + "pokemon_id": 508, + "stats": [ + 85, + 110, + 90, + 45, + 90, + 80 + ] + }, + { + "pokemon_id": 509, + "stats": [ + 41, + 50, + 37, + 50, + 37, + 66 + ] + }, + { + "pokemon_id": 510, + "stats": [ + 64, + 88, + 50, + 88, + 50, + 106 + ] + }, + { + "pokemon_id": 511, + "stats": [ + 50, + 53, + 48, + 53, + 48, + 64 + ] + }, + { + "pokemon_id": 512, + "stats": [ + 75, + 98, + 63, + 98, + 63, + 101 + ] + }, + { + "pokemon_id": 513, + "stats": [ + 50, + 53, + 48, + 53, + 48, + 64 + ] + }, + { + "pokemon_id": 514, + "stats": [ + 75, + 98, + 63, + 98, + 63, + 101 + ] + }, + { + "pokemon_id": 515, + "stats": [ + 50, + 53, + 48, + 53, + 48, + 64 + ] + }, + { + "pokemon_id": 516, + "stats": [ + 75, + 98, + 63, + 98, + 63, + 101 + ] + }, + { + "pokemon_id": 517, + "stats": [ + 76, + 25, + 45, + 67, + 55, + 24 + ] + }, + { + "pokemon_id": 518, + "stats": [ + 116, + 55, + 85, + 107, + 95, + 29 + ] + }, + { + "pokemon_id": 519, + "stats": [ + 50, + 55, + 50, + 36, + 30, + 43 + ] + }, + { + "pokemon_id": 520, + "stats": [ + 62, + 77, + 62, + 50, + 42, + 65 + ] + }, + { + "pokemon_id": 521, + "stats": [ + 80, + 115, + 80, + 65, + 55, + 93 + ] + }, + { + "pokemon_id": 522, + "stats": [ + 45, + 60, + 32, + 50, + 32, + 76 + ] + }, + { + "pokemon_id": 523, + "stats": [ + 75, + 100, + 63, + 80, + 63, + 116 + ] + }, + { + "pokemon_id": 524, + "stats": [ + 55, + 75, + 85, + 25, + 25, + 15 + ] + }, + { + "pokemon_id": 525, + "stats": [ + 70, + 105, + 105, + 50, + 40, + 20 + ] + }, + { + "pokemon_id": 526, + "stats": [ + 85, + 135, + 130, + 60, + 80, + 25 + ] + }, + { + "pokemon_id": 527, + "stats": [ + 65, + 45, + 43, + 55, + 43, + 72 + ] + }, + { + "pokemon_id": 528, + "stats": [ + 67, + 57, + 55, + 77, + 55, + 114 + ] + }, + { + "pokemon_id": 529, + "stats": [ + 60, + 85, + 40, + 30, + 45, + 68 + ] + }, + { + "pokemon_id": 530, + "stats": [ + 110, + 135, + 60, + 50, + 65, + 88 + ] + }, + { + "pokemon_id": 531, + "stats": [ + 103, + 60, + 86, + 60, + 86, + 50 + ] + }, + { + "pokemon_id": 532, + "stats": [ + 75, + 80, + 55, + 25, + 35, + 35 + ] + }, + { + "pokemon_id": 533, + "stats": [ + 85, + 105, + 85, + 40, + 50, + 40 + ] + }, + { + "pokemon_id": 534, + "stats": [ + 105, + 140, + 95, + 55, + 65, + 45 + ] + }, + { + "pokemon_id": 535, + "stats": [ + 50, + 50, + 40, + 50, + 40, + 64 + ] + }, + { + "pokemon_id": 536, + "stats": [ + 75, + 65, + 55, + 65, + 55, + 69 + ] + }, + { + "pokemon_id": 537, + "stats": [ + 105, + 95, + 75, + 85, + 75, + 74 + ] + }, + { + "pokemon_id": 538, + "stats": [ + 120, + 100, + 85, + 30, + 85, + 45 + ] + }, + { + "pokemon_id": 539, + "stats": [ + 75, + 125, + 75, + 30, + 75, + 85 + ] + }, + { + "pokemon_id": 540, + "stats": [ + 45, + 53, + 70, + 40, + 60, + 42 + ] + }, + { + "pokemon_id": 541, + "stats": [ + 55, + 63, + 90, + 50, + 80, + 42 + ] + }, + { + "pokemon_id": 542, + "stats": [ + 75, + 103, + 80, + 70, + 80, + 92 + ] + }, + { + "pokemon_id": 543, + "stats": [ + 30, + 45, + 59, + 30, + 39, + 57 + ] + }, + { + "pokemon_id": 544, + "stats": [ + 40, + 55, + 99, + 40, + 79, + 47 + ] + }, + { + "pokemon_id": 545, + "stats": [ + 60, + 100, + 89, + 55, + 69, + 112 + ] + }, + { + "pokemon_id": 546, + "stats": [ + 40, + 27, + 60, + 37, + 50, + 66 + ] + }, + { + "pokemon_id": 547, + "stats": [ + 60, + 67, + 85, + 77, + 75, + 116 + ] + }, + { + "pokemon_id": 548, + "stats": [ + 45, + 35, + 50, + 70, + 50, + 30 + ] + }, + { + "pokemon_id": 549, + "stats": [ + 70, + 60, + 75, + 110, + 75, + 90 + ] + }, + { + "pokemon_id": 550, + "stats": [ + 70, + 92, + 65, + 80, + 55, + 98 + ] + }, + { + "pokemon_id": 551, + "stats": [ + 50, + 72, + 35, + 35, + 35, + 65 + ] + }, + { + "pokemon_id": 552, + "stats": [ + 60, + 82, + 45, + 45, + 45, + 74 + ] + }, + { + "pokemon_id": 553, + "stats": [ + 95, + 117, + 80, + 65, + 70, + 92 + ] + }, + { + "pokemon_id": 554, + "stats": [ + 70, + 90, + 45, + 15, + 45, + 50 + ] + }, + { + "pokemon_id": 555, + "stats": [ + 105, + 140, + 55, + 30, + 55, + 95 + ] + }, + { + "pokemon_id": 556, + "stats": [ + 75, + 86, + 67, + 106, + 67, + 60 + ] + }, + { + "pokemon_id": 557, + "stats": [ + 50, + 65, + 85, + 35, + 35, + 55 + ] + }, + { + "pokemon_id": 558, + "stats": [ + 70, + 105, + 125, + 65, + 75, + 45 + ] + }, + { + "pokemon_id": 559, + "stats": [ + 50, + 75, + 70, + 35, + 70, + 48 + ] + }, + { + "pokemon_id": 560, + "stats": [ + 65, + 90, + 115, + 45, + 115, + 58 + ] + }, + { + "pokemon_id": 561, + "stats": [ + 72, + 58, + 80, + 103, + 80, + 97 + ] + }, + { + "pokemon_id": 562, + "stats": [ + 38, + 30, + 85, + 55, + 65, + 30 + ] + }, + { + "pokemon_id": 563, + "stats": [ + 58, + 50, + 145, + 95, + 105, + 30 + ] + }, + { + "pokemon_id": 564, + "stats": [ + 54, + 78, + 103, + 53, + 45, + 22 + ] + }, + { + "pokemon_id": 565, + "stats": [ + 74, + 108, + 133, + 83, + 65, + 32 + ] + }, + { + "pokemon_id": 566, + "stats": [ + 55, + 112, + 45, + 74, + 45, + 70 + ] + }, + { + "pokemon_id": 567, + "stats": [ + 75, + 140, + 65, + 112, + 65, + 110 + ] + }, + { + "pokemon_id": 568, + "stats": [ + 50, + 50, + 62, + 40, + 62, + 65 + ] + }, + { + "pokemon_id": 569, + "stats": [ + 80, + 95, + 82, + 60, + 82, + 75 + ] + }, + { + "pokemon_id": 570, + "stats": [ + 40, + 65, + 40, + 80, + 40, + 65 + ] + }, + { + "pokemon_id": 571, + "stats": [ + 60, + 105, + 60, + 120, + 60, + 105 + ] + }, + { + "pokemon_id": 572, + "stats": [ + 55, + 50, + 40, + 40, + 40, + 75 + ] + }, + { + "pokemon_id": 573, + "stats": [ + 75, + 95, + 60, + 65, + 60, + 115 + ] + }, + { + "pokemon_id": 574, + "stats": [ + 45, + 30, + 50, + 55, + 65, + 45 + ] + }, + { + "pokemon_id": 575, + "stats": [ + 60, + 45, + 70, + 75, + 85, + 55 + ] + }, + { + "pokemon_id": 576, + "stats": [ + 70, + 55, + 95, + 95, + 110, + 65 + ] + }, + { + "pokemon_id": 577, + "stats": [ + 45, + 30, + 40, + 105, + 50, + 20 + ] + }, + { + "pokemon_id": 578, + "stats": [ + 65, + 40, + 50, + 125, + 60, + 30 + ] + }, + { + "pokemon_id": 579, + "stats": [ + 110, + 65, + 75, + 125, + 85, + 30 + ] + }, + { + "pokemon_id": 580, + "stats": [ + 62, + 44, + 50, + 44, + 50, + 55 + ] + }, + { + "pokemon_id": 581, + "stats": [ + 75, + 87, + 63, + 87, + 63, + 98 + ] + }, + { + "pokemon_id": 582, + "stats": [ + 36, + 50, + 50, + 65, + 60, + 44 + ] + }, + { + "pokemon_id": 583, + "stats": [ + 51, + 65, + 65, + 80, + 75, + 59 + ] + }, + { + "pokemon_id": 584, + "stats": [ + 71, + 95, + 85, + 110, + 95, + 79 + ] + }, + { + "pokemon_id": 585, + "stats": [ + 60, + 60, + 50, + 40, + 50, + 75 + ] + }, + { + "pokemon_id": 586, + "stats": [ + 80, + 100, + 70, + 60, + 70, + 95 + ] + }, + { + "pokemon_id": 587, + "stats": [ + 55, + 75, + 60, + 75, + 60, + 103 + ] + }, + { + "pokemon_id": 588, + "stats": [ + 50, + 75, + 45, + 40, + 45, + 60 + ] + }, + { + "pokemon_id": 589, + "stats": [ + 70, + 135, + 105, + 60, + 105, + 20 + ] + }, + { + "pokemon_id": 590, + "stats": [ + 69, + 55, + 45, + 55, + 55, + 15 + ] + }, + { + "pokemon_id": 591, + "stats": [ + 114, + 85, + 70, + 85, + 80, + 30 + ] + }, + { + "pokemon_id": 592, + "stats": [ + 55, + 40, + 50, + 65, + 85, + 40 + ] + }, + { + "pokemon_id": 593, + "stats": [ + 100, + 60, + 70, + 85, + 105, + 60 + ] + }, + { + "pokemon_id": 594, + "stats": [ + 165, + 75, + 80, + 40, + 45, + 65 + ] + }, + { + "pokemon_id": 595, + "stats": [ + 50, + 47, + 50, + 57, + 50, + 65 + ] + }, + { + "pokemon_id": 596, + "stats": [ + 70, + 77, + 60, + 97, + 60, + 108 + ] + }, + { + "pokemon_id": 597, + "stats": [ + 44, + 50, + 91, + 24, + 86, + 10 + ] + }, + { + "pokemon_id": 598, + "stats": [ + 74, + 94, + 131, + 54, + 116, + 20 + ] + }, + { + "pokemon_id": 599, + "stats": [ + 40, + 55, + 70, + 45, + 60, + 30 + ] + }, + { + "pokemon_id": 600, + "stats": [ + 60, + 80, + 95, + 70, + 85, + 50 + ] + }, + { + "pokemon_id": 601, + "stats": [ + 60, + 100, + 115, + 70, + 85, + 90 + ] + }, + { + "pokemon_id": 602, + "stats": [ + 35, + 55, + 40, + 45, + 40, + 60 + ] + }, + { + "pokemon_id": 603, + "stats": [ + 65, + 85, + 70, + 75, + 70, + 40 + ] + }, + { + "pokemon_id": 604, + "stats": [ + 85, + 115, + 80, + 105, + 80, + 50 + ] + }, + { + "pokemon_id": 605, + "stats": [ + 55, + 55, + 55, + 85, + 55, + 30 + ] + }, + { + "pokemon_id": 606, + "stats": [ + 75, + 75, + 75, + 125, + 95, + 40 + ] + }, + { + "pokemon_id": 607, + "stats": [ + 50, + 30, + 55, + 65, + 55, + 20 + ] + }, + { + "pokemon_id": 608, + "stats": [ + 60, + 40, + 60, + 95, + 60, + 55 + ] + }, + { + "pokemon_id": 609, + "stats": [ + 60, + 55, + 90, + 145, + 90, + 80 + ] + }, + { + "pokemon_id": 610, + "stats": [ + 46, + 87, + 60, + 30, + 40, + 57 + ] + }, + { + "pokemon_id": 611, + "stats": [ + 66, + 117, + 70, + 40, + 50, + 67 + ] + }, + { + "pokemon_id": 612, + "stats": [ + 76, + 147, + 90, + 60, + 70, + 97 + ] + }, + { + "pokemon_id": 613, + "stats": [ + 55, + 70, + 40, + 60, + 40, + 40 + ] + }, + { + "pokemon_id": 614, + "stats": [ + 95, + 130, + 80, + 70, + 80, + 50 + ] + }, + { + "pokemon_id": 615, + "stats": [ + 80, + 50, + 50, + 95, + 135, + 105 + ] + }, + { + "pokemon_id": 616, + "stats": [ + 50, + 40, + 85, + 40, + 65, + 25 + ] + }, + { + "pokemon_id": 617, + "stats": [ + 80, + 70, + 40, + 100, + 60, + 145 + ] + }, + { + "pokemon_id": 618, + "stats": [ + 109, + 66, + 84, + 81, + 99, + 32 + ] + }, + { + "pokemon_id": 619, + "stats": [ + 45, + 85, + 50, + 55, + 50, + 65 + ] + }, + { + "pokemon_id": 620, + "stats": [ + 65, + 125, + 60, + 95, + 60, + 105 + ] + }, + { + "pokemon_id": 621, + "stats": [ + 77, + 120, + 90, + 60, + 90, + 48 + ] + }, + { + "pokemon_id": 622, + "stats": [ + 59, + 74, + 50, + 35, + 50, + 35 + ] + }, + { + "pokemon_id": 623, + "stats": [ + 89, + 124, + 80, + 55, + 80, + 55 + ] + }, + { + "pokemon_id": 624, + "stats": [ + 45, + 85, + 70, + 40, + 40, + 60 + ] + }, + { + "pokemon_id": 625, + "stats": [ + 65, + 125, + 100, + 60, + 70, + 70 + ] + }, + { + "pokemon_id": 626, + "stats": [ + 95, + 110, + 95, + 40, + 95, + 55 + ] + }, + { + "pokemon_id": 627, + "stats": [ + 70, + 83, + 50, + 37, + 50, + 60 + ] + }, + { + "pokemon_id": 628, + "stats": [ + 100, + 123, + 75, + 57, + 75, + 80 + ] + }, + { + "pokemon_id": 629, + "stats": [ + 70, + 55, + 75, + 45, + 65, + 60 + ] + }, + { + "pokemon_id": 630, + "stats": [ + 110, + 65, + 105, + 55, + 95, + 80 + ] + }, + { + "pokemon_id": 631, + "stats": [ + 85, + 97, + 66, + 105, + 66, + 65 + ] + }, + { + "pokemon_id": 632, + "stats": [ + 58, + 109, + 112, + 48, + 48, + 109 + ] + }, + { + "pokemon_id": 633, + "stats": [ + 52, + 65, + 50, + 45, + 50, + 38 + ] + }, + { + "pokemon_id": 634, + "stats": [ + 72, + 85, + 70, + 65, + 70, + 58 + ] + }, + { + "pokemon_id": 635, + "stats": [ + 92, + 105, + 90, + 125, + 90, + 98 + ] + }, + { + "pokemon_id": 636, + "stats": [ + 55, + 85, + 55, + 50, + 55, + 60 + ] + }, + { + "pokemon_id": 637, + "stats": [ + 85, + 60, + 65, + 135, + 105, + 100 + ] + }, + { + "pokemon_id": 638, + "stats": [ + 91, + 90, + 129, + 90, + 72, + 108 + ] + }, + { + "pokemon_id": 639, + "stats": [ + 91, + 129, + 90, + 72, + 90, + 108 + ] + }, + { + "pokemon_id": 640, + "stats": [ + 91, + 90, + 72, + 90, + 129, + 108 + ] + }, + { + "pokemon_id": 641, + "stats": [ + 79, + 115, + 70, + 125, + 80, + 111 + ] + }, + { + "pokemon_id": 642, + "stats": [ + 79, + 115, + 70, + 125, + 80, + 111 + ] + }, + { + "pokemon_id": 643, + "stats": [ + 100, + 120, + 100, + 150, + 120, + 90 + ] + }, + { + "pokemon_id": 644, + "stats": [ + 100, + 150, + 120, + 120, + 100, + 90 + ] + }, + { + "pokemon_id": 645, + "stats": [ + 89, + 125, + 90, + 115, + 80, + 101 + ] + }, + { + "pokemon_id": 646, + "stats": [ + 125, + 130, + 90, + 130, + 90, + 95 + ] + }, + { + "pokemon_id": 647, + "stats": [ + 91, + 72, + 90, + 129, + 90, + 108 + ] + }, + { + "pokemon_id": 648, + "stats": [ + 100, + 77, + 77, + 128, + 128, + 90 + ] + }, + { + "pokemon_id": 649, + "stats": [ + 71, + 120, + 95, + 120, + 95, + 99 + ] + }, + { + "pokemon_id": 650, + "stats": [ + 56, + 61, + 65, + 48, + 45, + 38 + ] + }, + { + "pokemon_id": 651, + "stats": [ + 61, + 78, + 95, + 56, + 58, + 57 + ] + }, + { + "pokemon_id": 652, + "stats": [ + 88, + 107, + 122, + 74, + 75, + 64 + ] + }, + { + "pokemon_id": 653, + "stats": [ + 40, + 45, + 40, + 62, + 60, + 60 + ] + }, + { + "pokemon_id": 654, + "stats": [ + 59, + 59, + 58, + 90, + 70, + 73 + ] + }, + { + "pokemon_id": 655, + "stats": [ + 75, + 69, + 72, + 114, + 100, + 104 + ] + }, + { + "pokemon_id": 656, + "stats": [ + 41, + 56, + 40, + 62, + 44, + 71 + ] + }, + { + "pokemon_id": 657, + "stats": [ + 54, + 63, + 52, + 83, + 56, + 97 + ] + }, + { + "pokemon_id": 658, + "stats": [ + 72, + 95, + 67, + 103, + 71, + 122 + ] + }, + { + "pokemon_id": 659, + "stats": [ + 38, + 36, + 38, + 32, + 36, + 57 + ] + }, + { + "pokemon_id": 660, + "stats": [ + 85, + 56, + 77, + 50, + 77, + 78 + ] + }, + { + "pokemon_id": 661, + "stats": [ + 45, + 50, + 43, + 40, + 38, + 62 + ] + }, + { + "pokemon_id": 662, + "stats": [ + 62, + 73, + 55, + 56, + 52, + 84 + ] + }, + { + "pokemon_id": 663, + "stats": [ + 78, + 81, + 71, + 74, + 69, + 126 + ] + }, + { + "pokemon_id": 664, + "stats": [ + 38, + 35, + 40, + 27, + 25, + 35 + ] + }, + { + "pokemon_id": 665, + "stats": [ + 45, + 22, + 60, + 27, + 30, + 29 + ] + }, + { + "pokemon_id": 666, + "stats": [ + 80, + 52, + 50, + 90, + 50, + 89 + ] + }, + { + "pokemon_id": 667, + "stats": [ + 62, + 50, + 58, + 73, + 54, + 72 + ] + }, + { + "pokemon_id": 668, + "stats": [ + 86, + 68, + 72, + 109, + 66, + 106 + ] + }, + { + "pokemon_id": 669, + "stats": [ + 44, + 38, + 39, + 61, + 79, + 42 + ] + }, + { + "pokemon_id": 670, + "stats": [ + 54, + 45, + 47, + 75, + 98, + 52 + ] + }, + { + "pokemon_id": 671, + "stats": [ + 78, + 65, + 68, + 112, + 154, + 75 + ] + }, + { + "pokemon_id": 672, + "stats": [ + 66, + 65, + 48, + 62, + 57, + 52 + ] + }, + { + "pokemon_id": 673, + "stats": [ + 123, + 100, + 62, + 97, + 81, + 68 + ] + }, + { + "pokemon_id": 674, + "stats": [ + 67, + 82, + 62, + 46, + 48, + 43 + ] + }, + { + "pokemon_id": 675, + "stats": [ + 95, + 124, + 78, + 69, + 71, + 58 + ] + }, + { + "pokemon_id": 676, + "stats": [ + 75, + 80, + 60, + 65, + 90, + 102 + ] + }, + { + "pokemon_id": 677, + "stats": [ + 62, + 48, + 54, + 63, + 60, + 68 + ] + }, + { + "pokemon_id": 678, + "stats": [ + 74, + 48, + 76, + 83, + 81, + 104 + ] + }, + { + "pokemon_id": 679, + "stats": [ + 45, + 80, + 100, + 35, + 37, + 28 + ] + }, + { + "pokemon_id": 680, + "stats": [ + 59, + 110, + 150, + 45, + 49, + 35 + ] + }, + { + "pokemon_id": 681, + "stats": [ + 60, + 50, + 140, + 50, + 140, + 60 + ] + }, + { + "pokemon_id": 682, + "stats": [ + 78, + 52, + 60, + 63, + 65, + 23 + ] + }, + { + "pokemon_id": 683, + "stats": [ + 101, + 72, + 72, + 99, + 89, + 29 + ] + }, + { + "pokemon_id": 684, + "stats": [ + 62, + 48, + 66, + 59, + 57, + 49 + ] + }, + { + "pokemon_id": 685, + "stats": [ + 82, + 80, + 86, + 85, + 75, + 72 + ] + }, + { + "pokemon_id": 686, + "stats": [ + 53, + 54, + 53, + 37, + 46, + 45 + ] + }, + { + "pokemon_id": 687, + "stats": [ + 86, + 92, + 88, + 68, + 75, + 73 + ] + }, + { + "pokemon_id": 688, + "stats": [ + 42, + 52, + 67, + 39, + 56, + 50 + ] + }, + { + "pokemon_id": 689, + "stats": [ + 72, + 105, + 115, + 54, + 86, + 68 + ] + }, + { + "pokemon_id": 690, + "stats": [ + 50, + 60, + 60, + 60, + 60, + 30 + ] + }, + { + "pokemon_id": 691, + "stats": [ + 65, + 75, + 90, + 97, + 123, + 44 + ] + }, + { + "pokemon_id": 692, + "stats": [ + 50, + 53, + 62, + 58, + 63, + 44 + ] + }, + { + "pokemon_id": 693, + "stats": [ + 71, + 73, + 88, + 120, + 89, + 59 + ] + }, + { + "pokemon_id": 694, + "stats": [ + 44, + 38, + 33, + 61, + 43, + 70 + ] + }, + { + "pokemon_id": 695, + "stats": [ + 62, + 55, + 52, + 109, + 94, + 109 + ] + }, + { + "pokemon_id": 696, + "stats": [ + 58, + 89, + 77, + 45, + 45, + 48 + ] + }, + { + "pokemon_id": 697, + "stats": [ + 82, + 121, + 119, + 69, + 59, + 71 + ] + }, + { + "pokemon_id": 698, + "stats": [ + 77, + 59, + 50, + 67, + 63, + 46 + ] + }, + { + "pokemon_id": 699, + "stats": [ + 123, + 77, + 72, + 99, + 92, + 58 + ] + }, + { + "pokemon_id": 700, + "stats": [ + 95, + 65, + 65, + 110, + 130, + 60 + ] + }, + { + "pokemon_id": 701, + "stats": [ + 78, + 92, + 75, + 74, + 63, + 118 + ] + }, + { + "pokemon_id": 702, + "stats": [ + 67, + 58, + 57, + 81, + 67, + 101 + ] + }, + { + "pokemon_id": 703, + "stats": [ + 50, + 50, + 150, + 50, + 150, + 50 + ] + }, + { + "pokemon_id": 704, + "stats": [ + 45, + 50, + 35, + 55, + 75, + 40 + ] + }, + { + "pokemon_id": 705, + "stats": [ + 68, + 75, + 53, + 83, + 113, + 60 + ] + }, + { + "pokemon_id": 706, + "stats": [ + 90, + 100, + 70, + 110, + 150, + 80 + ] + }, + { + "pokemon_id": 707, + "stats": [ + 57, + 80, + 91, + 80, + 87, + 75 + ] + }, + { + "pokemon_id": 708, + "stats": [ + 43, + 70, + 48, + 50, + 60, + 38 + ] + }, + { + "pokemon_id": 709, + "stats": [ + 85, + 110, + 76, + 65, + 82, + 56 + ] + }, + { + "pokemon_id": 710, + "stats": [ + 49, + 66, + 70, + 44, + 55, + 51 + ] + }, + { + "pokemon_id": 711, + "stats": [ + 65, + 90, + 122, + 58, + 75, + 84 + ] + }, + { + "pokemon_id": 712, + "stats": [ + 55, + 69, + 85, + 32, + 35, + 28 + ] + }, + { + "pokemon_id": 713, + "stats": [ + 95, + 117, + 184, + 44, + 46, + 28 + ] + }, + { + "pokemon_id": 714, + "stats": [ + 40, + 30, + 35, + 45, + 40, + 55 + ] + }, + { + "pokemon_id": 715, + "stats": [ + 85, + 70, + 80, + 97, + 80, + 123 + ] + }, + { + "pokemon_id": 716, + "stats": [ + 126, + 131, + 95, + 131, + 98, + 99 + ] + }, + { + "pokemon_id": 717, + "stats": [ + 126, + 131, + 95, + 131, + 98, + 99 + ] + }, + { + "pokemon_id": 718, + "stats": [ + 108, + 100, + 121, + 81, + 95, + 95 + ] + }, + { + "pokemon_id": 719, + "stats": [ + 50, + 100, + 150, + 100, + 150, + 50 + ] + }, + { + "pokemon_id": 720, + "stats": [ + 80, + 110, + 60, + 150, + 130, + 70 + ] + }, + { + "pokemon_id": 721, + "stats": [ + 80, + 110, + 120, + 130, + 90, + 70 + ] + }, + { + "pokemon_id": 722, + "stats": [ + 68, + 55, + 55, + 50, + 50, + 42 + ] + }, + { + "pokemon_id": 723, + "stats": [ + 78, + 75, + 75, + 70, + 70, + 52 + ] + }, + { + "pokemon_id": 724, + "stats": [ + 78, + 107, + 75, + 100, + 100, + 70 + ] + }, + { + "pokemon_id": 725, + "stats": [ + 45, + 65, + 40, + 60, + 40, + 70 + ] + }, + { + "pokemon_id": 726, + "stats": [ + 65, + 85, + 50, + 80, + 50, + 90 + ] + }, + { + "pokemon_id": 727, + "stats": [ + 95, + 115, + 90, + 80, + 90, + 60 + ] + }, + { + "pokemon_id": 728, + "stats": [ + 50, + 54, + 54, + 66, + 56, + 40 + ] + }, + { + "pokemon_id": 729, + "stats": [ + 60, + 69, + 69, + 91, + 81, + 50 + ] + }, + { + "pokemon_id": 730, + "stats": [ + 80, + 74, + 74, + 126, + 116, + 60 + ] + }, + { + "pokemon_id": 731, + "stats": [ + 35, + 75, + 30, + 30, + 30, + 65 + ] + }, + { + "pokemon_id": 732, + "stats": [ + 55, + 85, + 50, + 40, + 50, + 75 + ] + }, + { + "pokemon_id": 733, + "stats": [ + 80, + 120, + 75, + 75, + 75, + 60 + ] + }, + { + "pokemon_id": 734, + "stats": [ + 48, + 70, + 30, + 30, + 30, + 45 + ] + }, + { + "pokemon_id": 735, + "stats": [ + 88, + 110, + 60, + 55, + 60, + 45 + ] + }, + { + "pokemon_id": 736, + "stats": [ + 47, + 62, + 45, + 55, + 45, + 46 + ] + }, + { + "pokemon_id": 737, + "stats": [ + 57, + 82, + 95, + 55, + 75, + 36 + ] + }, + { + "pokemon_id": 738, + "stats": [ + 77, + 70, + 90, + 145, + 75, + 43 + ] + }, + { + "pokemon_id": 739, + "stats": [ + 47, + 82, + 57, + 42, + 47, + 63 + ] + }, + { + "pokemon_id": 740, + "stats": [ + 97, + 132, + 77, + 62, + 67, + 43 + ] + }, + { + "pokemon_id": 741, + "stats": [ + 75, + 70, + 70, + 98, + 70, + 93 + ] + }, + { + "pokemon_id": 742, + "stats": [ + 40, + 45, + 40, + 55, + 40, + 84 + ] + }, + { + "pokemon_id": 743, + "stats": [ + 60, + 55, + 60, + 95, + 70, + 124 + ] + }, + { + "pokemon_id": 744, + "stats": [ + 45, + 65, + 40, + 30, + 40, + 60 + ] + }, + { + "pokemon_id": 745, + "stats": [ + 75, + 115, + 65, + 55, + 65, + 112 + ] + }, + { + "pokemon_id": 746, + "stats": [ + 45, + 20, + 20, + 25, + 25, + 40 + ] + }, + { + "pokemon_id": 747, + "stats": [ + 50, + 53, + 62, + 43, + 52, + 45 + ] + }, + { + "pokemon_id": 748, + "stats": [ + 50, + 63, + 152, + 53, + 142, + 35 + ] + }, + { + "pokemon_id": 749, + "stats": [ + 70, + 100, + 70, + 45, + 55, + 45 + ] + }, + { + "pokemon_id": 750, + "stats": [ + 100, + 125, + 100, + 55, + 85, + 35 + ] + }, + { + "pokemon_id": 751, + "stats": [ + 38, + 40, + 52, + 40, + 72, + 27 + ] + }, + { + "pokemon_id": 752, + "stats": [ + 68, + 70, + 92, + 50, + 132, + 42 + ] + }, + { + "pokemon_id": 753, + "stats": [ + 40, + 55, + 35, + 50, + 35, + 35 + ] + }, + { + "pokemon_id": 754, + "stats": [ + 70, + 105, + 90, + 80, + 90, + 45 + ] + }, + { + "pokemon_id": 755, + "stats": [ + 40, + 35, + 55, + 65, + 75, + 15 + ] + }, + { + "pokemon_id": 756, + "stats": [ + 60, + 45, + 80, + 90, + 100, + 30 + ] + }, + { + "pokemon_id": 757, + "stats": [ + 48, + 44, + 40, + 71, + 40, + 77 + ] + }, + { + "pokemon_id": 758, + "stats": [ + 68, + 64, + 60, + 111, + 60, + 117 + ] + }, + { + "pokemon_id": 759, + "stats": [ + 70, + 75, + 50, + 45, + 50, + 50 + ] + }, + { + "pokemon_id": 760, + "stats": [ + 120, + 125, + 80, + 55, + 60, + 60 + ] + }, + { + "pokemon_id": 761, + "stats": [ + 42, + 30, + 38, + 30, + 38, + 32 + ] + }, + { + "pokemon_id": 762, + "stats": [ + 52, + 40, + 48, + 40, + 48, + 62 + ] + }, + { + "pokemon_id": 763, + "stats": [ + 72, + 120, + 98, + 50, + 98, + 72 + ] + }, + { + "pokemon_id": 764, + "stats": [ + 51, + 52, + 90, + 82, + 110, + 100 + ] + }, + { + "pokemon_id": 765, + "stats": [ + 90, + 60, + 80, + 90, + 110, + 60 + ] + }, + { + "pokemon_id": 766, + "stats": [ + 100, + 120, + 90, + 40, + 60, + 80 + ] + }, + { + "pokemon_id": 767, + "stats": [ + 25, + 35, + 40, + 20, + 30, + 80 + ] + }, + { + "pokemon_id": 768, + "stats": [ + 75, + 125, + 140, + 60, + 90, + 40 + ] + }, + { + "pokemon_id": 769, + "stats": [ + 55, + 55, + 80, + 70, + 45, + 15 + ] + }, + { + "pokemon_id": 770, + "stats": [ + 85, + 75, + 110, + 100, + 75, + 35 + ] + }, + { + "pokemon_id": 771, + "stats": [ + 55, + 60, + 130, + 30, + 130, + 5 + ] + }, + { + "pokemon_id": 772, + "stats": [ + 95, + 95, + 95, + 95, + 95, + 59 + ] + }, + { + "pokemon_id": 773, + "stats": [ + 95, + 95, + 95, + 95, + 95, + 95 + ] + }, + { + "pokemon_id": 774, + "stats": [ + 60, + 60, + 100, + 60, + 100, + 60 + ] + }, + { + "pokemon_id": 775, + "stats": [ + 65, + 115, + 65, + 75, + 95, + 65 + ] + }, + { + "pokemon_id": 776, + "stats": [ + 60, + 78, + 135, + 91, + 85, + 36 + ] + }, + { + "pokemon_id": 777, + "stats": [ + 65, + 98, + 63, + 40, + 73, + 96 + ] + }, + { + "pokemon_id": 778, + "stats": [ + 55, + 90, + 80, + 50, + 105, + 96 + ] + }, + { + "pokemon_id": 779, + "stats": [ + 68, + 105, + 70, + 70, + 70, + 92 + ] + }, + { + "pokemon_id": 780, + "stats": [ + 78, + 60, + 85, + 135, + 91, + 36 + ] + }, + { + "pokemon_id": 781, + "stats": [ + 70, + 131, + 100, + 86, + 90, + 40 + ] + }, + { + "pokemon_id": 782, + "stats": [ + 45, + 55, + 65, + 45, + 45, + 45 + ] + }, + { + "pokemon_id": 783, + "stats": [ + 55, + 75, + 90, + 65, + 70, + 65 + ] + }, + { + "pokemon_id": 784, + "stats": [ + 75, + 110, + 125, + 100, + 105, + 85 + ] + }, + { + "pokemon_id": 785, + "stats": [ + 70, + 115, + 85, + 95, + 75, + 130 + ] + }, + { + "pokemon_id": 786, + "stats": [ + 70, + 85, + 75, + 130, + 115, + 95 + ] + }, + { + "pokemon_id": 787, + "stats": [ + 70, + 130, + 115, + 85, + 95, + 75 + ] + }, + { + "pokemon_id": 788, + "stats": [ + 70, + 75, + 115, + 95, + 130, + 85 + ] + }, + { + "pokemon_id": 789, + "stats": [ + 43, + 29, + 31, + 29, + 31, + 37 + ] + }, + { + "pokemon_id": 790, + "stats": [ + 43, + 29, + 131, + 29, + 131, + 37 + ] + }, + { + "pokemon_id": 791, + "stats": [ + 137, + 137, + 107, + 113, + 89, + 97 + ] + }, + { + "pokemon_id": 792, + "stats": [ + 137, + 113, + 89, + 137, + 107, + 97 + ] + }, + { + "pokemon_id": 793, + "stats": [ + 109, + 53, + 47, + 127, + 131, + 103 + ] + }, + { + "pokemon_id": 794, + "stats": [ + 107, + 139, + 139, + 53, + 53, + 79 + ] + }, + { + "pokemon_id": 795, + "stats": [ + 71, + 137, + 37, + 137, + 37, + 151 + ] + }, + { + "pokemon_id": 796, + "stats": [ + 83, + 89, + 71, + 173, + 71, + 83 + ] + }, + { + "pokemon_id": 797, + "stats": [ + 97, + 101, + 103, + 107, + 101, + 61 + ] + }, + { + "pokemon_id": 798, + "stats": [ + 59, + 181, + 131, + 59, + 31, + 109 + ] + }, + { + "pokemon_id": 799, + "stats": [ + 223, + 101, + 53, + 97, + 53, + 43 + ] + }, + { + "pokemon_id": 800, + "stats": [ + 97, + 107, + 101, + 127, + 89, + 79 + ] + }, + { + "pokemon_id": 801, + "stats": [ + 80, + 95, + 115, + 130, + 115, + 65 + ] + }, + { + "pokemon_id": 802, + "stats": [ + 90, + 125, + 80, + 90, + 90, + 125 + ] + }, + { + "pokemon_id": 803, + "stats": [ + 67, + 73, + 67, + 73, + 67, + 73 + ] + }, + { + "pokemon_id": 804, + "stats": [ + 73, + 73, + 73, + 127, + 73, + 121 + ] + }, + { + "pokemon_id": 805, + "stats": [ + 61, + 131, + 211, + 53, + 101, + 13 + ] + }, + { + "pokemon_id": 806, + "stats": [ + 53, + 127, + 53, + 151, + 79, + 107 + ] + }, + { + "pokemon_id": 807, + "stats": [ + 88, + 112, + 75, + 102, + 80, + 143 + ] + }, + { + "pokemon_id": 808, + "stats": [ + 46, + 65, + 65, + 55, + 35, + 34 + ] + }, + { + "pokemon_id": 809, + "stats": [ + 135, + 143, + 143, + 80, + 65, + 34 + ] + }, + { + "pokemon_id": 810, + "stats": [ + 50, + 65, + 50, + 40, + 40, + 65 + ] + }, + { + "pokemon_id": 811, + "stats": [ + 70, + 85, + 70, + 55, + 60, + 80 + ] + }, + { + "pokemon_id": 812, + "stats": [ + 100, + 125, + 90, + 60, + 70, + 85 + ] + }, + { + "pokemon_id": 813, + "stats": [ + 50, + 71, + 40, + 40, + 40, + 69 + ] + }, + { + "pokemon_id": 814, + "stats": [ + 65, + 86, + 60, + 55, + 60, + 94 + ] + }, + { + "pokemon_id": 815, + "stats": [ + 80, + 116, + 75, + 65, + 75, + 119 + ] + }, + { + "pokemon_id": 816, + "stats": [ + 50, + 40, + 40, + 70, + 40, + 70 + ] + }, + { + "pokemon_id": 817, + "stats": [ + 65, + 60, + 55, + 95, + 55, + 90 + ] + }, + { + "pokemon_id": 818, + "stats": [ + 70, + 85, + 65, + 125, + 65, + 120 + ] + }, + { + "pokemon_id": 819, + "stats": [ + 70, + 55, + 55, + 35, + 35, + 25 + ] + }, + { + "pokemon_id": 820, + "stats": [ + 120, + 95, + 95, + 55, + 75, + 20 + ] + }, + { + "pokemon_id": 821, + "stats": [ + 38, + 47, + 35, + 33, + 35, + 57 + ] + }, + { + "pokemon_id": 822, + "stats": [ + 68, + 67, + 55, + 43, + 55, + 77 + ] + }, + { + "pokemon_id": 823, + "stats": [ + 98, + 87, + 105, + 53, + 85, + 67 + ] + }, + { + "pokemon_id": 824, + "stats": [ + 25, + 20, + 20, + 25, + 45, + 45 + ] + }, + { + "pokemon_id": 825, + "stats": [ + 50, + 35, + 80, + 50, + 90, + 30 + ] + }, + { + "pokemon_id": 826, + "stats": [ + 60, + 45, + 110, + 80, + 120, + 90 + ] + }, + { + "pokemon_id": 827, + "stats": [ + 40, + 28, + 28, + 47, + 52, + 50 + ] + }, + { + "pokemon_id": 828, + "stats": [ + 70, + 58, + 58, + 87, + 92, + 90 + ] + }, + { + "pokemon_id": 829, + "stats": [ + 40, + 40, + 60, + 40, + 60, + 10 + ] + }, + { + "pokemon_id": 830, + "stats": [ + 60, + 50, + 90, + 80, + 120, + 60 + ] + }, + { + "pokemon_id": 831, + "stats": [ + 42, + 40, + 55, + 40, + 45, + 48 + ] + }, + { + "pokemon_id": 832, + "stats": [ + 72, + 80, + 100, + 60, + 90, + 88 + ] + }, + { + "pokemon_id": 833, + "stats": [ + 50, + 64, + 50, + 38, + 38, + 44 + ] + }, + { + "pokemon_id": 834, + "stats": [ + 90, + 115, + 90, + 48, + 68, + 74 + ] + }, + { + "pokemon_id": 835, + "stats": [ + 59, + 45, + 50, + 40, + 50, + 26 + ] + }, + { + "pokemon_id": 836, + "stats": [ + 69, + 90, + 60, + 90, + 60, + 121 + ] + }, + { + "pokemon_id": 837, + "stats": [ + 30, + 40, + 50, + 40, + 50, + 30 + ] + }, + { + "pokemon_id": 838, + "stats": [ + 80, + 60, + 90, + 60, + 70, + 50 + ] + }, + { + "pokemon_id": 839, + "stats": [ + 110, + 80, + 120, + 80, + 90, + 30 + ] + }, + { + "pokemon_id": 840, + "stats": [ + 40, + 40, + 80, + 40, + 40, + 20 + ] + }, + { + "pokemon_id": 841, + "stats": [ + 70, + 110, + 80, + 95, + 60, + 70 + ] + }, + { + "pokemon_id": 842, + "stats": [ + 110, + 85, + 80, + 100, + 80, + 30 + ] + }, + { + "pokemon_id": 843, + "stats": [ + 52, + 57, + 75, + 35, + 50, + 46 + ] + }, + { + "pokemon_id": 844, + "stats": [ + 72, + 107, + 125, + 65, + 70, + 71 + ] + }, + { + "pokemon_id": 845, + "stats": [ + 70, + 85, + 55, + 85, + 95, + 85 + ] + }, + { + "pokemon_id": 846, + "stats": [ + 41, + 63, + 40, + 40, + 30, + 66 + ] + }, + { + "pokemon_id": 847, + "stats": [ + 61, + 123, + 60, + 60, + 50, + 136 + ] + }, + { + "pokemon_id": 848, + "stats": [ + 40, + 38, + 35, + 54, + 35, + 40 + ] + }, + { + "pokemon_id": 849, + "stats": [ + 75, + 98, + 70, + 114, + 70, + 75 + ] + }, + { + "pokemon_id": 850, + "stats": [ + 50, + 65, + 45, + 50, + 50, + 45 + ] + }, + { + "pokemon_id": 851, + "stats": [ + 100, + 115, + 65, + 90, + 90, + 65 + ] + }, + { + "pokemon_id": 852, + "stats": [ + 50, + 68, + 60, + 50, + 50, + 32 + ] + }, + { + "pokemon_id": 853, + "stats": [ + 80, + 118, + 90, + 70, + 80, + 42 + ] + }, + { + "pokemon_id": 854, + "stats": [ + 40, + 45, + 45, + 74, + 54, + 50 + ] + }, + { + "pokemon_id": 855, + "stats": [ + 60, + 65, + 65, + 134, + 114, + 70 + ] + }, + { + "pokemon_id": 856, + "stats": [ + 42, + 30, + 45, + 56, + 53, + 39 + ] + }, + { + "pokemon_id": 857, + "stats": [ + 57, + 40, + 65, + 86, + 73, + 49 + ] + }, + { + "pokemon_id": 858, + "stats": [ + 57, + 90, + 95, + 136, + 103, + 29 + ] + }, + { + "pokemon_id": 859, + "stats": [ + 45, + 45, + 30, + 55, + 40, + 50 + ] + }, + { + "pokemon_id": 860, + "stats": [ + 65, + 60, + 45, + 75, + 55, + 70 + ] + }, + { + "pokemon_id": 861, + "stats": [ + 95, + 120, + 65, + 95, + 75, + 60 + ] + }, + { + "pokemon_id": 862, + "stats": [ + 93, + 90, + 101, + 60, + 81, + 95 + ] + }, + { + "pokemon_id": 863, + "stats": [ + 70, + 110, + 100, + 50, + 60, + 50 + ] + }, + { + "pokemon_id": 864, + "stats": [ + 60, + 95, + 50, + 145, + 130, + 30 + ] + }, + { + "pokemon_id": 865, + "stats": [ + 62, + 135, + 95, + 68, + 82, + 65 + ] + }, + { + "pokemon_id": 866, + "stats": [ + 80, + 85, + 75, + 110, + 100, + 70 + ] + }, + { + "pokemon_id": 867, + "stats": [ + 58, + 95, + 145, + 50, + 105, + 30 + ] + }, + { + "pokemon_id": 868, + "stats": [ + 45, + 40, + 40, + 50, + 61, + 34 + ] + }, + { + "pokemon_id": 869, + "stats": [ + 65, + 60, + 75, + 110, + 121, + 64 + ] + }, + { + "pokemon_id": 870, + "stats": [ + 65, + 100, + 100, + 70, + 60, + 75 + ] + }, + { + "pokemon_id": 871, + "stats": [ + 48, + 101, + 95, + 91, + 85, + 15 + ] + }, + { + "pokemon_id": 872, + "stats": [ + 30, + 25, + 35, + 45, + 30, + 20 + ] + }, + { + "pokemon_id": 873, + "stats": [ + 70, + 65, + 60, + 125, + 90, + 65 + ] + }, + { + "pokemon_id": 874, + "stats": [ + 100, + 125, + 135, + 20, + 20, + 70 + ] + }, + { + "pokemon_id": 875, + "stats": [ + 75, + 80, + 110, + 65, + 90, + 50 + ] + }, + { + "pokemon_id": 876, + "stats": [ + 60, + 65, + 55, + 105, + 95, + 95 + ] + }, + { + "pokemon_id": 877, + "stats": [ + 58, + 95, + 58, + 70, + 58, + 97 + ] + }, + { + "pokemon_id": 878, + "stats": [ + 72, + 80, + 49, + 40, + 49, + 40 + ] + }, + { + "pokemon_id": 879, + "stats": [ + 122, + 130, + 69, + 80, + 69, + 30 + ] + }, + { + "pokemon_id": 880, + "stats": [ + 90, + 100, + 90, + 80, + 70, + 75 + ] + }, + { + "pokemon_id": 881, + "stats": [ + 90, + 100, + 90, + 90, + 80, + 55 + ] + }, + { + "pokemon_id": 882, + "stats": [ + 90, + 90, + 100, + 70, + 80, + 75 + ] + }, + { + "pokemon_id": 883, + "stats": [ + 90, + 90, + 100, + 80, + 90, + 55 + ] + }, + { + "pokemon_id": 884, + "stats": [ + 70, + 95, + 115, + 120, + 50, + 85 + ] + }, + { + "pokemon_id": 885, + "stats": [ + 28, + 60, + 30, + 40, + 30, + 82 + ] + }, + { + "pokemon_id": 886, + "stats": [ + 68, + 80, + 50, + 60, + 50, + 102 + ] + }, + { + "pokemon_id": 887, + "stats": [ + 88, + 120, + 75, + 100, + 75, + 142 + ] + }, + { + "pokemon_id": 888, + "stats": [ + 92, + 130, + 115, + 80, + 115, + 138 + ] + }, + { + "pokemon_id": 889, + "stats": [ + 92, + 130, + 115, + 80, + 115, + 138 + ] + }, + { + "pokemon_id": 890, + "stats": [ + 140, + 85, + 95, + 145, + 95, + 130 + ] + }, + { + "pokemon_id": 891, + "stats": [ + 60, + 90, + 60, + 53, + 50, + 72 + ] + }, + { + "pokemon_id": 892, + "stats": [ + 100, + 130, + 100, + 63, + 60, + 97 + ] + }, + { + "pokemon_id": 893, + "stats": [ + 105, + 120, + 105, + 70, + 95, + 105 + ] + }, + { + "pokemon_id": 894, + "stats": [ + 80, + 100, + 50, + 100, + 50, + 200 + ] + }, + { + "pokemon_id": 895, + "stats": [ + 200, + 100, + 50, + 100, + 50, + 80 + ] + }, + { + "pokemon_id": 896, + "stats": [ + 100, + 145, + 130, + 65, + 110, + 30 + ] + }, + { + "pokemon_id": 897, + "stats": [ + 100, + 65, + 60, + 145, + 80, + 130 + ] + }, + { + "pokemon_id": 898, + "stats": [ + 100, + 80, + 80, + 80, + 80, + 80 + ] + }, + { + "pokemon_id": 906, + "stats": [ + 40, + 61, + 54, + 45, + 45, + 65 + ] + }, + { + "pokemon_id": 907, + "stats": [ + 61, + 80, + 63, + 60, + 63, + 83 + ] + }, + { + "pokemon_id": 908, + "stats": [ + 76, + 110, + 70, + 81, + 70, + 123 + ] + }, + { + "pokemon_id": 909, + "stats": [ + 67, + 45, + 59, + 63, + 40, + 36 + ] + }, + { + "pokemon_id": 910, + "stats": [ + 81, + 55, + 78, + 90, + 58, + 49 + ] + }, + { + "pokemon_id": 911, + "stats": [ + 104, + 75, + 100, + 110, + 75, + 66 + ] + }, + { + "pokemon_id": 912, + "stats": [ + 55, + 65, + 45, + 50, + 45, + 50 + ] + }, + { + "pokemon_id": 913, + "stats": [ + 70, + 85, + 65, + 65, + 60, + 65 + ] + }, + { + "pokemon_id": 914, + "stats": [ + 85, + 120, + 80, + 85, + 75, + 85 + ] + }, + { + "pokemon_id": 915, + "stats": [ + 54, + 45, + 40, + 35, + 45, + 35 + ] + }, + { + "pokemon_id": 916, + "stats": [ + 110, + 100, + 75, + 59, + 80, + 65 + ] + }, + { + "pokemon_id": 917, + "stats": [ + 125, + 100, + 80, + 85, + 75, + 55 + ] + }, + { + "pokemon_id": 918, + "stats": [ + 35, + 41, + 45, + 29, + 40, + 20 + ] + }, + { + "pokemon_id": 919, + "stats": [ + 60, + 79, + 92, + 52, + 86, + 35 + ] + }, + { + "pokemon_id": 920, + "stats": [ + 33, + 46, + 40, + 21, + 25, + 45 + ] + }, + { + "pokemon_id": 921, + "stats": [ + 71, + 102, + 78, + 52, + 55, + 92 + ] + }, + { + "pokemon_id": 922, + "stats": [ + 41, + 50, + 60, + 31, + 58, + 30 + ] + }, + { + "pokemon_id": 923, + "stats": [ + 75, + 50, + 85, + 115, + 100, + 45 + ] + }, + { + "pokemon_id": 924, + "stats": [ + 50, + 61, + 60, + 30, + 55, + 34 + ] + }, + { + "pokemon_id": 925, + "stats": [ + 72, + 101, + 100, + 50, + 97, + 68 + ] + }, + { + "pokemon_id": 926, + "stats": [ + 30, + 35, + 30, + 55, + 30, + 75 + ] + }, + { + "pokemon_id": 927, + "stats": [ + 95, + 60, + 60, + 101, + 60, + 105 + ] + }, + { + "pokemon_id": 928, + "stats": [ + 120, + 90, + 70, + 110, + 70, + 60 + ] + }, + { + "pokemon_id": 929, + "stats": [ + 10, + 55, + 25, + 35, + 25, + 95 + ] + }, + { + "pokemon_id": 930, + "stats": [ + 35, + 100, + 50, + 50, + 70, + 120 + ] + }, + { + "pokemon_id": 931, + "stats": [ + 150, + 100, + 115, + 65, + 65, + 35 + ] + }, + { + "pokemon_id": 932, + "stats": [ + 90, + 102, + 73, + 78, + 65, + 70 + ] + }, + { + "pokemon_id": 933, + "stats": [ + 70, + 45, + 40, + 45, + 40, + 75 + ] + }, + { + "pokemon_id": 934, + "stats": [ + 100, + 70, + 72, + 53, + 62, + 100 + ] + }, + { + "pokemon_id": 935, + "stats": [ + 41, + 35, + 45, + 58, + 51, + 30 + ] + }, + { + "pokemon_id": 936, + "stats": [ + 52, + 53, + 60, + 78, + 78, + 33 + ] + }, + { + "pokemon_id": 937, + "stats": [ + 78, + 69, + 90, + 125, + 109, + 39 + ] + }, + { + "pokemon_id": 938, + "stats": [ + 50, + 62, + 40, + 62, + 40, + 50 + ] + }, + { + "pokemon_id": 939, + "stats": [ + 65, + 108, + 65, + 108, + 65, + 75 + ] + }, + { + "pokemon_id": 940, + "stats": [ + 61, + 31, + 41, + 59, + 35, + 45 + ] + }, + { + "pokemon_id": 941, + "stats": [ + 109, + 64, + 91, + 103, + 83, + 45 + ] + }, + { + "pokemon_id": 942, + "stats": [ + 45, + 70, + 63, + 30, + 45, + 47 + ] + }, + { + "pokemon_id": 943, + "stats": [ + 80, + 119, + 90, + 54, + 67, + 90 + ] + }, + { + "pokemon_id": 944, + "stats": [ + 70, + 85, + 145, + 60, + 55, + 65 + ] + }, + { + "pokemon_id": 945, + "stats": [ + 50, + 50, + 45, + 40, + 45, + 75 + ] + }, + { + "pokemon_id": 946, + "stats": [ + 74, + 75, + 70, + 65, + 75, + 111 + ] + }, + { + "pokemon_id": 947, + "stats": [ + 108, + 68, + 45, + 30, + 40, + 43 + ] + }, + { + "pokemon_id": 948, + "stats": [ + 170, + 113, + 65, + 45, + 55, + 73 + ] + }, + { + "pokemon_id": 949, + "stats": [ + 65, + 75, + 45, + 35, + 45, + 55 + ] + }, + { + "pokemon_id": 950, + "stats": [ + 90, + 95, + 66, + 45, + 65, + 62 + ] + }, + { + "pokemon_id": 951, + "stats": [ + 115, + 145, + 92, + 78, + 86, + 87 + ] + }, + { + "pokemon_id": 952, + "stats": [ + 68, + 50, + 60, + 120, + 95, + 82 + ] + }, + { + "pokemon_id": 953, + "stats": [ + 70, + 95, + 65, + 85, + 65, + 121 + ] + }, + { + "pokemon_id": 954, + "stats": [ + 45, + 50, + 20, + 40, + 25, + 60 + ] + }, + { + "pokemon_id": 955, + "stats": [ + 60, + 75, + 40, + 50, + 40, + 85 + ] + }, + { + "pokemon_id": 956, + "stats": [ + 70, + 115, + 70, + 70, + 60, + 105 + ] + }, + { + "pokemon_id": 957, + "stats": [ + 40, + 40, + 35, + 55, + 40, + 70 + ] + }, + { + "pokemon_id": 958, + "stats": [ + 70, + 70, + 60, + 105, + 60, + 125 + ] + }, + { + "pokemon_id": 959, + "stats": [ + 70, + 103, + 85, + 60, + 85, + 82 + ] + }, + { + "pokemon_id": 960, + "stats": [ + 82, + 96, + 51, + 45, + 51, + 92 + ] + }, + { + "pokemon_id": 961, + "stats": [ + 82, + 115, + 74, + 75, + 64, + 90 + ] + }, + { + "pokemon_id": 962, + "stats": [ + 70, + 100, + 115, + 35, + 55, + 75 + ] + }, + { + "pokemon_id": 963, + "stats": [ + 55, + 55, + 75, + 35, + 35, + 25 + ] + }, + { + "pokemon_id": 964, + "stats": [ + 60, + 60, + 100, + 35, + 65, + 35 + ] + }, + { + "pokemon_id": 965, + "stats": [ + 100, + 100, + 130, + 45, + 90, + 35 + ] + }, + { + "pokemon_id": 966, + "stats": [ + 48, + 35, + 42, + 105, + 60, + 60 + ] + }, + { + "pokemon_id": 967, + "stats": [ + 83, + 55, + 90, + 130, + 81, + 86 + ] + }, + { + "pokemon_id": 968, + "stats": [ + 40, + 65, + 35, + 40, + 35, + 75 + ] + }, + { + "pokemon_id": 969, + "stats": [ + 63, + 95, + 65, + 80, + 72, + 110 + ] + }, + { + "pokemon_id": 970, + "stats": [ + 37, + 55, + 70, + 30, + 55, + 65 + ] + }, + { + "pokemon_id": 971, + "stats": [ + 57, + 80, + 115, + 50, + 80, + 95 + ] + }, + { + "pokemon_id": 972, + "stats": [ + 60, + 78, + 60, + 40, + 51, + 51 + ] + }, + { + "pokemon_id": 973, + "stats": [ + 80, + 120, + 90, + 60, + 70, + 85 + ] + }, + { + "pokemon_id": 974, + "stats": [ + 40, + 65, + 30, + 45, + 35, + 60 + ] + }, + { + "pokemon_id": 975, + "stats": [ + 55, + 115, + 70, + 80, + 70, + 90 + ] + }, + { + "pokemon_id": 976, + "stats": [ + 45, + 30, + 70, + 75, + 70, + 10 + ] + }, + { + "pokemon_id": 977, + "stats": [ + 87, + 60, + 95, + 133, + 91, + 84 + ] + }, + { + "pokemon_id": 978, + "stats": [ + 115, + 131, + 131, + 53, + 53, + 87 + ] + }, + { + "pokemon_id": 979, + "stats": [ + 111, + 127, + 99, + 79, + 99, + 55 + ] + }, + { + "pokemon_id": 981, + "stats": [ + 85, + 81, + 97, + 121, + 85, + 101 + ] + }, + { + "pokemon_id": 982, + "stats": [ + 115, + 65, + 99, + 65, + 115, + 111 + ] + }, + { + "pokemon_id": 983, + "stats": [ + 55, + 55, + 55, + 135, + 135, + 135 + ] + }, + { + "pokemon_id": 984, + "stats": [ + 85, + 135, + 79, + 85, + 105, + 81 + ] + }, + { + "pokemon_id": 985, + "stats": [ + 105, + 139, + 71, + 55, + 101, + 119 + ] + }, + { + "pokemon_id": 986, + "stats": [ + 90, + 112, + 120, + 72, + 70, + 106 + ] + }, + { + "pokemon_id": 988, + "stats": [ + 80, + 70, + 60, + 140, + 110, + 110 + ] + }, + { + "pokemon_id": 989, + "stats": [ + 154, + 140, + 108, + 50, + 68, + 50 + ] + }, + { + "pokemon_id": 990, + "stats": [ + 94, + 80, + 86, + 122, + 80, + 108 + ] + }, + { + "pokemon_id": 991, + "stats": [ + 100, + 134, + 110, + 70, + 84, + 72 + ] + }, + { + "pokemon_id": 992, + "stats": [ + 56, + 80, + 114, + 124, + 60, + 136 + ] + }, + { + "pokemon_id": 993, + "stats": [ + 74, + 130, + 90, + 120, + 60, + 116 + ] + }, + { + "pokemon_id": 994, + "stats": [ + 155, + 110, + 125, + 55, + 80, + 45 + ] + }, + { + "pokemon_id": 995, + "stats": [ + 80, + 120, + 80, + 90, + 65, + 135 + ] + }, + { + "pokemon_id": 996, + "stats": [ + 85, + 85, + 100, + 95, + 135, + 70 + ] + }, + { + "pokemon_id": 997, + "stats": [ + 55, + 80, + 80, + 135, + 120, + 100 + ] + }, + { + "pokemon_id": 998, + "stats": [ + 100, + 135, + 115, + 85, + 100, + 135 + ] + }, + { + "pokemon_id": 999, + "stats": [ + 100, + 85, + 100, + 135, + 115, + 135 + ] + }, + { + "pokemon_id": 1000, + "stats": [ + 50, + 45, + 45, + 35, + 64, + 58 + ] + }, + { + "pokemon_id": 1001, + "stats": [ + 65, + 55, + 55, + 45, + 82, + 78 + ] + }, + { + "pokemon_id": 1002, + "stats": [ + 85, + 75, + 77, + 70, + 105, + 94 + ] + }, + { + "pokemon_id": 1003, + "stats": [ + 40, + 50, + 40, + 50, + 40, + 35 + ] + }, + { + "pokemon_id": 1004, + "stats": [ + 85, + 60, + 100, + 125, + 80, + 75 + ] + }, + { + "pokemon_id": 1005, + "stats": [ + 75, + 125, + 80, + 60, + 100, + 85 + ] + }, + { + "pokemon_id": 1006, + "stats": [ + 40, + 40, + 35, + 50, + 100, + 70 + ] + }, + { + "pokemon_id": 1007, + "stats": [ + 80, + 70, + 65, + 80, + 120, + 100 + ] + }, + { + "pokemon_id": 1008, + "stats": [ + 100, + 135, + 120, + 60, + 85, + 50 + ] + }, + { + "pokemon_id": 1009, + "stats": [ + 130, + 75, + 60, + 45, + 100, + 20 + ] + }, + { + "pokemon_id": 1010, + "stats": [ + 110, + 115, + 80, + 50, + 90, + 90 + ] + }, + { + "pokemon_id": 1011, + "stats": [ + 90, + 130, + 88, + 70, + 108, + 104 + ] + }, + { + "pokemon_id": 1012, + "stats": [ + 99, + 83, + 91, + 125, + 83, + 109 + ] + }, + { + "pokemon_id": 1013, + "stats": [ + 80, + 80, + 110, + 95, + 80, + 40 + ] + }, + { + "pokemon_id": 1014, + "stats": [ + 88, + 128, + 115, + 58, + 86, + 80 + ] + }, + { + "pokemon_id": 1015, + "stats": [ + 88, + 75, + 66, + 130, + 90, + 106 + ] + }, + { + "pokemon_id": 1016, + "stats": [ + 88, + 91, + 82, + 70, + 125, + 99 + ] + }, + { + "pokemon_id": 1017, + "stats": [ + 80, + 120, + 84, + 60, + 96, + 110 + ] + }, + { + "pokemon_id": 1018, + "stats": [ + 90, + 105, + 130, + 125, + 65, + 85 + ] + }, + { + "pokemon_id": 1019, + "stats": [ + 106, + 80, + 110, + 120, + 80, + 44 + ] + }, + { + "pokemon_id": 1020, + "stats": [ + 105, + 115, + 121, + 65, + 93, + 91 + ] + }, + { + "pokemon_id": 1021, + "stats": [ + 125, + 73, + 91, + 137, + 89, + 75 + ] + }, + { + "pokemon_id": 1022, + "stats": [ + 90, + 120, + 80, + 68, + 108, + 124 + ] + }, + { + "pokemon_id": 1023, + "stats": [ + 90, + 72, + 100, + 122, + 108, + 98 + ] + }, + { + "pokemon_id": 1024, + "stats": [ + 90, + 65, + 85, + 65, + 85, + 60 + ] + }, + { + "pokemon_id": 1025, + "stats": [ + 88, + 88, + 160, + 88, + 88, + 88 + ] + }, + { + "pokemon_id": 2000, + "stats": [ + 50, + 55, + 75, + 45, + 75, + 50 + ] + }, + { + "pokemon_id": 2001, + "stats": [ + 85, + 54, + 100, + 65, + 95, + 85 + ] + }, + { + "pokemon_id": 2002, + "stats": [ + 97, + 100, + 130, + 85, + 130, + 90 + ] + }, + { + "pokemon_id": 2003, + "stats": [ + 65, + 50, + 65, + 55, + 65, + 45 + ] + }, + { + "pokemon_id": 2004, + "stats": [ + 95, + 100, + 75, + 85, + 87, + 95 + ] + }, + { + "pokemon_id": 2005, + "stats": [ + 120, + 85, + 95, + 140, + 95, + 130 + ] + }, + { + "pokemon_id": 2006, + "stats": [ + 65, + 55, + 65, + 40, + 55, + 45 + ] + }, + { + "pokemon_id": 2007, + "stats": [ + 90, + 85, + 65, + 55, + 90, + 75 + ] + }, + { + "pokemon_id": 2008, + "stats": [ + 97, + 135, + 120, + 90, + 93, + 85 + ] + }, + { + "pokemon_id": 4000, + "stats": [ + 40, + 45, + 45, + 74, + 54, + 50 + ] + }, + { + "pokemon_id": 4001, + "stats": [ + 71, + 60, + 106, + 121, + 80, + 70 + ] + }, + { + "pokemon_id": 4002, + "stats": [ + 80, + 120, + 84, + 60, + 96, + 110 + ] + }, + { + "pokemon_id": 4003, + "stats": [ + 80, + 120, + 84, + 60, + 96, + 110 + ] + }, + { + "pokemon_id": 4004, + "stats": [ + 80, + 120, + 84, + 60, + 96, + 110 + ] + }, + { + "pokemon_id": 4848, + "stats": [ + 150, + 100, + 120, + 100, + 120, + 90 + ] + }, + { + "pokemon_id": 4851, + "stats": [ + 92, + 130, + 115, + 80, + 115, + 138 + ] + }, + { + "pokemon_id": 4852, + "stats": [ + 92, + 170, + 115, + 80, + 115, + 148 + ] + }, + { + "pokemon_id": 4858, + "stats": [ + 100, + 120, + 120, + 150, + 100, + 90 + ] + }, + { + "pokemon_id": 4888, + "stats": [ + 68, + 85, + 65, + 165, + 135, + 100 + ] + }, + { + "pokemon_id": 5858, + "stats": [ + 75, + 115, + 65, + 55, + 65, + 112 + ] + }, + { + "pokemon_id": 6666, + "stats": [ + 84, + 86, + 88, + 111, + 101, + 60 + ] + }, + { + "pokemon_id": 7000, + "stats": [ + 80, + 80, + 90, + 110, + 130, + 110 + ] + }, + { + "pokemon_id": 8800, + "stats": [ + 100, + 140, + 120, + 180, + 130, + 90 + ] + }, + { + "pokemon_id": 8801, + "stats": [ + 88, + 112, + 75, + 102, + 80, + 143 + ] + }, + { + "pokemon_id": 8802, + "stats": [ + 60, + 65, + 60, + 130, + 75, + 110 + ] + }, + { + "pokemon_id": 8803, + "stats": [ + 80, + 65, + 60, + 130, + 75, + 125 + ] + }, + { + "pokemon_id": 8804, + "stats": [ + 100, + 120, + 100, + 150, + 120, + 90 + ] + }, + { + "pokemon_id": 8805, + "stats": [ + 91, + 72, + 90, + 129, + 90, + 108 + ] + }, + { + "pokemon_id": 8922, + "stats": [ + 100, + 130, + 100, + 63, + 60, + 97 + ] + }, + { + "pokemon_id": 10001, + "stats": [ + 50, + 180, + 20, + 180, + 20, + 150 + ] + }, + { + "pokemon_id": 10002, + "stats": [ + 50, + 70, + 160, + 70, + 160, + 90 + ] + }, + { + "pokemon_id": 10003, + "stats": [ + 50, + 95, + 90, + 95, + 90, + 180 + ] + }, + { + "pokemon_id": 10004, + "stats": [ + 60, + 79, + 105, + 59, + 85, + 36 + ] + }, + { + "pokemon_id": 10005, + "stats": [ + 60, + 69, + 95, + 69, + 95, + 36 + ] + }, + { + "pokemon_id": 10006, + "stats": [ + 100, + 103, + 75, + 120, + 75, + 127 + ] + }, + { + "pokemon_id": 10007, + "stats": [ + 150, + 120, + 100, + 120, + 100, + 90 + ] + }, + { + "pokemon_id": 10008, + "stats": [ + 50, + 65, + 107, + 105, + 107, + 86 + ] + }, + { + "pokemon_id": 10009, + "stats": [ + 50, + 65, + 107, + 105, + 107, + 86 + ] + }, + { + "pokemon_id": 10010, + "stats": [ + 50, + 65, + 107, + 105, + 107, + 86 + ] + }, + { + "pokemon_id": 10011, + "stats": [ + 50, + 65, + 107, + 105, + 107, + 86 + ] + }, + { + "pokemon_id": 10012, + "stats": [ + 50, + 65, + 107, + 105, + 107, + 86 + ] + }, + { + "pokemon_id": 10013, + "stats": [ + 70, + 70, + 70, + 70, + 70, + 70 + ] + }, + { + "pokemon_id": 10014, + "stats": [ + 70, + 70, + 70, + 70, + 70, + 70 + ] + }, + { + "pokemon_id": 10015, + "stats": [ + 70, + 70, + 70, + 70, + 70, + 70 + ] + }, + { + "pokemon_id": 10016, + "stats": [ + 70, + 92, + 65, + 80, + 55, + 98 + ] + }, + { + "pokemon_id": 10017, + "stats": [ + 105, + 30, + 105, + 140, + 105, + 55 + ] + }, + { + "pokemon_id": 10018, + "stats": [ + 100, + 128, + 90, + 77, + 77, + 128 + ] + }, + { + "pokemon_id": 10019, + "stats": [ + 79, + 100, + 80, + 110, + 90, + 121 + ] + }, + { + "pokemon_id": 10020, + "stats": [ + 79, + 105, + 70, + 145, + 80, + 101 + ] + }, + { + "pokemon_id": 10021, + "stats": [ + 89, + 145, + 90, + 105, + 80, + 91 + ] + }, + { + "pokemon_id": 10022, + "stats": [ + 125, + 170, + 100, + 120, + 90, + 95 + ] + }, + { + "pokemon_id": 10023, + "stats": [ + 125, + 120, + 90, + 170, + 100, + 95 + ] + }, + { + "pokemon_id": 10024, + "stats": [ + 91, + 72, + 90, + 129, + 90, + 108 + ] + }, + { + "pokemon_id": 10025, + "stats": [ + 74, + 48, + 76, + 83, + 81, + 104 + ] + }, + { + "pokemon_id": 10026, + "stats": [ + 60, + 140, + 50, + 140, + 50, + 60 + ] + }, + { + "pokemon_id": 10027, + "stats": [ + 44, + 66, + 70, + 44, + 55, + 56 + ] + }, + { + "pokemon_id": 10028, + "stats": [ + 54, + 66, + 70, + 44, + 55, + 46 + ] + }, + { + "pokemon_id": 10029, + "stats": [ + 59, + 66, + 70, + 44, + 55, + 41 + ] + }, + { + "pokemon_id": 10030, + "stats": [ + 55, + 85, + 122, + 58, + 75, + 99 + ] + }, + { + "pokemon_id": 10031, + "stats": [ + 75, + 95, + 122, + 58, + 75, + 69 + ] + }, + { + "pokemon_id": 10032, + "stats": [ + 85, + 100, + 122, + 58, + 75, + 54 + ] + }, + { + "pokemon_id": 10033, + "stats": [ + 80, + 100, + 123, + 122, + 120, + 80 + ] + }, + { + "pokemon_id": 10034, + "stats": [ + 78, + 130, + 111, + 130, + 85, + 100 + ] + }, + { + "pokemon_id": 10035, + "stats": [ + 78, + 104, + 78, + 159, + 115, + 100 + ] + }, + { + "pokemon_id": 10036, + "stats": [ + 79, + 103, + 120, + 135, + 115, + 78 + ] + }, + { + "pokemon_id": 10037, + "stats": [ + 55, + 50, + 65, + 175, + 105, + 150 + ] + }, + { + "pokemon_id": 10038, + "stats": [ + 60, + 65, + 80, + 170, + 95, + 130 + ] + }, + { + "pokemon_id": 10039, + "stats": [ + 105, + 125, + 100, + 60, + 100, + 100 + ] + }, + { + "pokemon_id": 10040, + "stats": [ + 65, + 155, + 120, + 65, + 90, + 105 + ] + }, + { + "pokemon_id": 10041, + "stats": [ + 95, + 155, + 109, + 70, + 130, + 81 + ] + }, + { + "pokemon_id": 10042, + "stats": [ + 80, + 135, + 85, + 70, + 95, + 150 + ] + }, + { + "pokemon_id": 10043, + "stats": [ + 106, + 190, + 100, + 154, + 100, + 130 + ] + }, + { + "pokemon_id": 10044, + "stats": [ + 106, + 150, + 70, + 194, + 120, + 140 + ] + }, + { + "pokemon_id": 10045, + "stats": [ + 90, + 95, + 105, + 165, + 110, + 45 + ] + }, + { + "pokemon_id": 10046, + "stats": [ + 70, + 150, + 140, + 65, + 100, + 75 + ] + }, + { + "pokemon_id": 10047, + "stats": [ + 80, + 185, + 115, + 40, + 105, + 75 + ] + }, + { + "pokemon_id": 10048, + "stats": [ + 75, + 90, + 90, + 140, + 90, + 115 + ] + }, + { + "pokemon_id": 10049, + "stats": [ + 100, + 164, + 150, + 95, + 120, + 71 + ] + }, + { + "pokemon_id": 10050, + "stats": [ + 80, + 160, + 80, + 130, + 80, + 100 + ] + }, + { + "pokemon_id": 10051, + "stats": [ + 68, + 85, + 65, + 165, + 135, + 100 + ] + }, + { + "pokemon_id": 10052, + "stats": [ + 50, + 105, + 125, + 55, + 95, + 50 + ] + }, + { + "pokemon_id": 10053, + "stats": [ + 70, + 140, + 230, + 60, + 80, + 50 + ] + }, + { + "pokemon_id": 10054, + "stats": [ + 60, + 100, + 85, + 80, + 85, + 100 + ] + }, + { + "pokemon_id": 10055, + "stats": [ + 70, + 75, + 80, + 135, + 80, + 135 + ] + }, + { + "pokemon_id": 10056, + "stats": [ + 64, + 165, + 75, + 93, + 83, + 75 + ] + }, + { + "pokemon_id": 10057, + "stats": [ + 65, + 150, + 60, + 115, + 60, + 115 + ] + }, + { + "pokemon_id": 10058, + "stats": [ + 108, + 170, + 115, + 120, + 95, + 92 + ] + }, + { + "pokemon_id": 10059, + "stats": [ + 70, + 145, + 88, + 140, + 70, + 112 + ] + }, + { + "pokemon_id": 10060, + "stats": [ + 90, + 132, + 105, + 132, + 105, + 30 + ] + }, + { + "pokemon_id": 10061, + "stats": [ + 74, + 65, + 67, + 125, + 128, + 92 + ] + }, + { + "pokemon_id": 10062, + "stats": [ + 80, + 100, + 120, + 140, + 150, + 110 + ] + }, + { + "pokemon_id": 10063, + "stats": [ + 80, + 130, + 100, + 160, + 120, + 110 + ] + }, + { + "pokemon_id": 10064, + "stats": [ + 100, + 150, + 110, + 95, + 110, + 70 + ] + }, + { + "pokemon_id": 10065, + "stats": [ + 70, + 110, + 75, + 145, + 85, + 145 + ] + }, + { + "pokemon_id": 10066, + "stats": [ + 50, + 85, + 125, + 85, + 115, + 20 + ] + }, + { + "pokemon_id": 10067, + "stats": [ + 75, + 110, + 110, + 110, + 105, + 80 + ] + }, + { + "pokemon_id": 10068, + "stats": [ + 68, + 165, + 95, + 65, + 115, + 110 + ] + }, + { + "pokemon_id": 10069, + "stats": [ + 103, + 60, + 126, + 80, + 126, + 50 + ] + }, + { + "pokemon_id": 10070, + "stats": [ + 70, + 140, + 70, + 110, + 65, + 105 + ] + }, + { + "pokemon_id": 10071, + "stats": [ + 95, + 75, + 180, + 130, + 80, + 30 + ] + }, + { + "pokemon_id": 10072, + "stats": [ + 75, + 125, + 230, + 55, + 95, + 30 + ] + }, + { + "pokemon_id": 10073, + "stats": [ + 83, + 80, + 80, + 135, + 80, + 121 + ] + }, + { + "pokemon_id": 10074, + "stats": [ + 80, + 120, + 80, + 120, + 80, + 100 + ] + }, + { + "pokemon_id": 10075, + "stats": [ + 50, + 160, + 110, + 160, + 110, + 110 + ] + }, + { + "pokemon_id": 10076, + "stats": [ + 80, + 145, + 150, + 105, + 110, + 110 + ] + }, + { + "pokemon_id": 10077, + "stats": [ + 100, + 150, + 90, + 180, + 160, + 90 + ] + }, + { + "pokemon_id": 10078, + "stats": [ + 100, + 180, + 160, + 150, + 90, + 90 + ] + }, + { + "pokemon_id": 10079, + "stats": [ + 105, + 180, + 100, + 180, + 100, + 115 + ] + }, + { + "pokemon_id": 10080, + "stats": [ + 35, + 55, + 40, + 50, + 50, + 90 + ] + }, + { + "pokemon_id": 10081, + "stats": [ + 35, + 55, + 40, + 50, + 50, + 90 + ] + }, + { + "pokemon_id": 10082, + "stats": [ + 35, + 55, + 40, + 50, + 50, + 90 + ] + }, + { + "pokemon_id": 10083, + "stats": [ + 35, + 55, + 40, + 50, + 50, + 90 + ] + }, + { + "pokemon_id": 10084, + "stats": [ + 35, + 55, + 40, + 50, + 50, + 90 + ] + }, + { + "pokemon_id": 10085, + "stats": [ + 35, + 55, + 40, + 50, + 50, + 90 + ] + }, + { + "pokemon_id": 10086, + "stats": [ + 80, + 160, + 60, + 170, + 130, + 80 + ] + }, + { + "pokemon_id": 10087, + "stats": [ + 70, + 120, + 100, + 145, + 105, + 20 + ] + }, + { + "pokemon_id": 10088, + "stats": [ + 65, + 136, + 94, + 54, + 96, + 135 + ] + }, + { + "pokemon_id": 10089, + "stats": [ + 95, + 145, + 130, + 120, + 90, + 120 + ] + }, + { + "pokemon_id": 10090, + "stats": [ + 65, + 150, + 40, + 15, + 80, + 145 + ] + }, + { + "pokemon_id": 10091, + "stats": [ + 30, + 56, + 35, + 25, + 35, + 72 + ] + }, + { + "pokemon_id": 10092, + "stats": [ + 75, + 71, + 70, + 40, + 80, + 77 + ] + }, + { + "pokemon_id": 10093, + "stats": [ + 75, + 71, + 70, + 40, + 80, + 77 + ] + }, + { + "pokemon_id": 10094, + "stats": [ + 35, + 55, + 40, + 50, + 50, + 90 + ] + }, + { + "pokemon_id": 10095, + "stats": [ + 35, + 55, + 40, + 50, + 50, + 90 + ] + }, + { + "pokemon_id": 10096, + "stats": [ + 35, + 55, + 40, + 50, + 50, + 90 + ] + }, + { + "pokemon_id": 10097, + "stats": [ + 35, + 55, + 40, + 50, + 50, + 90 + ] + }, + { + "pokemon_id": 10098, + "stats": [ + 35, + 55, + 40, + 50, + 50, + 90 + ] + }, + { + "pokemon_id": 10099, + "stats": [ + 35, + 55, + 40, + 50, + 50, + 90 + ] + }, + { + "pokemon_id": 10100, + "stats": [ + 60, + 85, + 50, + 95, + 85, + 110 + ] + }, + { + "pokemon_id": 10101, + "stats": [ + 50, + 75, + 90, + 10, + 35, + 40 + ] + }, + { + "pokemon_id": 10102, + "stats": [ + 75, + 100, + 120, + 25, + 65, + 65 + ] + }, + { + "pokemon_id": 10103, + "stats": [ + 38, + 41, + 40, + 50, + 65, + 65 + ] + }, + { + "pokemon_id": 10104, + "stats": [ + 73, + 67, + 75, + 81, + 100, + 109 + ] + }, + { + "pokemon_id": 10105, + "stats": [ + 10, + 55, + 30, + 35, + 45, + 90 + ] + }, + { + "pokemon_id": 10106, + "stats": [ + 35, + 100, + 60, + 50, + 70, + 110 + ] + }, + { + "pokemon_id": 10107, + "stats": [ + 40, + 35, + 35, + 50, + 40, + 90 + ] + }, + { + "pokemon_id": 10108, + "stats": [ + 65, + 60, + 60, + 75, + 65, + 115 + ] + }, + { + "pokemon_id": 10109, + "stats": [ + 40, + 80, + 100, + 30, + 30, + 20 + ] + }, + { + "pokemon_id": 10110, + "stats": [ + 55, + 95, + 115, + 45, + 45, + 35 + ] + }, + { + "pokemon_id": 10111, + "stats": [ + 80, + 120, + 130, + 55, + 65, + 45 + ] + }, + { + "pokemon_id": 10112, + "stats": [ + 80, + 80, + 50, + 40, + 50, + 25 + ] + }, + { + "pokemon_id": 10113, + "stats": [ + 105, + 105, + 75, + 65, + 100, + 50 + ] + }, + { + "pokemon_id": 10114, + "stats": [ + 95, + 105, + 85, + 125, + 75, + 45 + ] + }, + { + "pokemon_id": 10115, + "stats": [ + 60, + 80, + 110, + 50, + 80, + 45 + ] + }, + { + "pokemon_id": 10116, + "stats": [ + 72, + 95, + 67, + 103, + 71, + 122 + ] + }, + { + "pokemon_id": 10117, + "stats": [ + 72, + 145, + 67, + 153, + 71, + 132 + ] + }, + { + "pokemon_id": 10118, + "stats": [ + 54, + 100, + 71, + 61, + 85, + 115 + ] + }, + { + "pokemon_id": 10119, + "stats": [ + 108, + 100, + 121, + 81, + 95, + 95 + ] + }, + { + "pokemon_id": 10120, + "stats": [ + 216, + 100, + 121, + 91, + 95, + 85 + ] + }, + { + "pokemon_id": 10121, + "stats": [ + 88, + 110, + 60, + 55, + 60, + 45 + ] + }, + { + "pokemon_id": 10122, + "stats": [ + 77, + 70, + 90, + 145, + 75, + 43 + ] + }, + { + "pokemon_id": 10123, + "stats": [ + 75, + 70, + 70, + 98, + 70, + 93 + ] + }, + { + "pokemon_id": 10124, + "stats": [ + 75, + 70, + 70, + 98, + 70, + 93 + ] + }, + { + "pokemon_id": 10125, + "stats": [ + 75, + 70, + 70, + 98, + 70, + 93 + ] + }, + { + "pokemon_id": 10126, + "stats": [ + 85, + 115, + 75, + 55, + 75, + 82 + ] + }, + { + "pokemon_id": 10127, + "stats": [ + 45, + 140, + 130, + 140, + 135, + 30 + ] + }, + { + "pokemon_id": 10128, + "stats": [ + 70, + 105, + 90, + 80, + 90, + 45 + ] + }, + { + "pokemon_id": 10129, + "stats": [ + 68, + 64, + 60, + 111, + 60, + 117 + ] + }, + { + "pokemon_id": 10130, + "stats": [ + 60, + 60, + 100, + 60, + 100, + 60 + ] + }, + { + "pokemon_id": 10131, + "stats": [ + 60, + 60, + 100, + 60, + 100, + 60 + ] + }, + { + "pokemon_id": 10132, + "stats": [ + 60, + 60, + 100, + 60, + 100, + 60 + ] + }, + { + "pokemon_id": 10133, + "stats": [ + 60, + 60, + 100, + 60, + 100, + 60 + ] + }, + { + "pokemon_id": 10134, + "stats": [ + 60, + 60, + 100, + 60, + 100, + 60 + ] + }, + { + "pokemon_id": 10135, + "stats": [ + 60, + 60, + 100, + 60, + 100, + 60 + ] + }, + { + "pokemon_id": 10136, + "stats": [ + 60, + 100, + 60, + 100, + 60, + 120 + ] + }, + { + "pokemon_id": 10137, + "stats": [ + 60, + 100, + 60, + 100, + 60, + 120 + ] + }, + { + "pokemon_id": 10138, + "stats": [ + 60, + 100, + 60, + 100, + 60, + 120 + ] + }, + { + "pokemon_id": 10139, + "stats": [ + 60, + 100, + 60, + 100, + 60, + 120 + ] + }, + { + "pokemon_id": 10140, + "stats": [ + 60, + 100, + 60, + 100, + 60, + 120 + ] + }, + { + "pokemon_id": 10141, + "stats": [ + 60, + 100, + 60, + 100, + 60, + 120 + ] + }, + { + "pokemon_id": 10142, + "stats": [ + 60, + 100, + 60, + 100, + 60, + 120 + ] + }, + { + "pokemon_id": 10143, + "stats": [ + 55, + 90, + 80, + 50, + 105, + 96 + ] + }, + { + "pokemon_id": 10144, + "stats": [ + 75, + 80, + 70, + 65, + 50, + 130 + ] + }, + { + "pokemon_id": 10145, + "stats": [ + 55, + 90, + 80, + 50, + 105, + 96 + ] + }, + { + "pokemon_id": 10146, + "stats": [ + 75, + 110, + 125, + 100, + 105, + 85 + ] + }, + { + "pokemon_id": 10147, + "stats": [ + 80, + 95, + 115, + 130, + 115, + 65 + ] + }, + { + "pokemon_id": 10148, + "stats": [ + 35, + 55, + 40, + 50, + 50, + 90 + ] + }, + { + "pokemon_id": 10149, + "stats": [ + 60, + 80, + 110, + 50, + 80, + 45 + ] + }, + { + "pokemon_id": 10150, + "stats": [ + 60, + 55, + 60, + 95, + 70, + 124 + ] + }, + { + "pokemon_id": 10151, + "stats": [ + 45, + 65, + 40, + 30, + 40, + 60 + ] + }, + { + "pokemon_id": 10152, + "stats": [ + 75, + 117, + 65, + 55, + 65, + 110 + ] + }, + { + "pokemon_id": 10153, + "stats": [ + 68, + 70, + 92, + 50, + 132, + 42 + ] + }, + { + "pokemon_id": 10154, + "stats": [ + 65, + 98, + 63, + 40, + 73, + 96 + ] + }, + { + "pokemon_id": 10155, + "stats": [ + 97, + 157, + 127, + 113, + 109, + 77 + ] + }, + { + "pokemon_id": 10156, + "stats": [ + 97, + 113, + 109, + 157, + 127, + 77 + ] + }, + { + "pokemon_id": 10157, + "stats": [ + 97, + 167, + 97, + 167, + 97, + 129 + ] + }, + { + "pokemon_id": 10158, + "stats": [ + 106, + 90, + 130, + 90, + 154, + 110 + ] + }, + { + "pokemon_id": 10159, + "stats": [ + 100, + 140, + 120, + 180, + 130, + 90 + ] + }, + { + "pokemon_id": 10160, + "stats": [ + 50, + 65, + 55, + 40, + 40, + 40 + ] + }, + { + "pokemon_id": 10161, + "stats": [ + 50, + 85, + 55, + 65, + 65, + 90 + ] + }, + { + "pokemon_id": 10162, + "stats": [ + 65, + 100, + 70, + 80, + 80, + 105 + ] + }, + { + "pokemon_id": 10163, + "stats": [ + 90, + 65, + 65, + 40, + 40, + 15 + ] + }, + { + "pokemon_id": 10164, + "stats": [ + 95, + 100, + 95, + 100, + 70, + 30 + ] + }, + { + "pokemon_id": 10165, + "stats": [ + 52, + 95, + 55, + 58, + 62, + 55 + ] + }, + { + "pokemon_id": 10166, + "stats": [ + 65, + 90, + 120, + 85, + 70, + 60 + ] + }, + { + "pokemon_id": 10167, + "stats": [ + 50, + 65, + 65, + 90, + 90, + 100 + ] + }, + { + "pokemon_id": 10168, + "stats": [ + 60, + 55, + 100, + 65, + 100, + 30 + ] + }, + { + "pokemon_id": 10169, + "stats": [ + 38, + 30, + 41, + 30, + 41, + 60 + ] + }, + { + "pokemon_id": 10170, + "stats": [ + 78, + 70, + 61, + 50, + 61, + 100 + ] + }, + { + "pokemon_id": 10171, + "stats": [ + 70, + 90, + 45, + 15, + 45, + 50 + ] + }, + { + "pokemon_id": 10172, + "stats": [ + 105, + 140, + 55, + 30, + 55, + 95 + ] + }, + { + "pokemon_id": 10173, + "stats": [ + 38, + 55, + 85, + 30, + 65, + 30 + ] + }, + { + "pokemon_id": 10174, + "stats": [ + 109, + 81, + 99, + 66, + 84, + 32 + ] + }, + { + "pokemon_id": 10175, + "stats": [ + 92, + 130, + 145, + 80, + 145, + 128 + ] + }, + { + "pokemon_id": 10176, + "stats": [ + 92, + 170, + 115, + 80, + 115, + 148 + ] + }, + { + "pokemon_id": 10177, + "stats": [ + 90, + 125, + 90, + 85, + 90, + 100 + ] + }, + { + "pokemon_id": 10178, + "stats": [ + 90, + 85, + 85, + 125, + 100, + 95 + ] + }, + { + "pokemon_id": 10179, + "stats": [ + 90, + 85, + 90, + 100, + 125, + 90 + ] + }, + { + "pokemon_id": 10180, + "stats": [ + 100, + 165, + 150, + 85, + 130, + 50 + ] + }, + { + "pokemon_id": 10181, + "stats": [ + 100, + 85, + 80, + 165, + 100, + 150 + ] + }, + { + "pokemon_id": 10272, + "stats": [ + 105, + 160, + 55, + 30, + 55, + 135 + ] + }, + { + "pokemon_id": 10409, + "stats": [ + 35, + 60, + 40, + 85, + 40, + 70 + ] + }, + { + "pokemon_id": 10410, + "stats": [ + 80, + 120, + 79, + 95, + 79, + 70 + ] + }, + { + "pokemon_id": 10411, + "stats": [ + 55, + 100, + 60, + 125, + 60, + 110 + ] + }, + { + "pokemon_id": 10412, + "stats": [ + 40, + 30, + 50, + 55, + 55, + 100 + ] + }, + { + "pokemon_id": 10413, + "stats": [ + 73, + 84, + 78, + 119, + 85, + 95 + ] + }, + { + "pokemon_id": 10414, + "stats": [ + 55, + 95, + 55, + 35, + 75, + 115 + ] + }, + { + "pokemon_id": 10415, + "stats": [ + 58, + 75, + 83, + 83, + 113, + 40 + ] + }, + { + "pokemon_id": 10416, + "stats": [ + 90, + 108, + 80, + 100, + 65, + 85 + ] + }, + { + "pokemon_id": 10417, + "stats": [ + 65, + 95, + 85, + 55, + 55, + 85 + ] + }, + { + "pokemon_id": 10418, + "stats": [ + 95, + 65, + 80, + 110, + 110, + 30 + ] + }, + { + "pokemon_id": 10419, + "stats": [ + 105, + 160, + 55, + 30, + 55, + 135 + ] + }, + { + "pokemon_id": 10420, + "stats": [ + 80, + 100, + 100, + 110, + 150, + 60 + ] + }, + { + "pokemon_id": 10421, + "stats": [ + 60, + 50, + 70, + 80, + 80, + 150 + ] + }, + { + "pokemon_id": 10422, + "stats": [ + 88, + 112, + 80, + 95, + 95, + 60 + ] + }, + { + "pokemon_id": 10423, + "stats": [ + 110, + 83, + 70, + 112, + 70, + 65 + ] + }, + { + "pokemon_id": 10424, + "stats": [ + 95, + 127, + 184, + 34, + 36, + 38 + ] + }, + { + "pokemon_id": 10425, + "stats": [ + 95, + 115, + 80, + 95, + 80, + 90 + ] + }, + { + "pokemon_id": 10426, + "stats": [ + 80, + 130, + 60, + 40, + 80, + 120 + ] + }, + { + "pokemon_id": 10427, + "stats": [ + 130, + 140, + 105, + 45, + 80, + 50 + ] + }, + { + "pokemon_id": 10428, + "stats": [ + 103, + 105, + 72, + 105, + 75, + 65 + ] + }, + { + "pokemon_id": 10429, + "stats": [ + 70, + 92, + 65, + 80, + 55, + 98 + ] + }, + { + "pokemon_id": 10430, + "stats": [ + 120, + 112, + 65, + 80, + 75, + 78 + ] + }, + { + "pokemon_id": 10431, + "stats": [ + 120, + 92, + 65, + 100, + 75, + 78 + ] + }, + { + "pokemon_id": 10432, + "stats": [ + 90, + 100, + 100, + 150, + 120, + 120 + ] + }, + { + "pokemon_id": 10433, + "stats": [ + 85, + 115, + 95, + 65, + 65, + 85 + ] + }, + { + "pokemon_id": 10434, + "stats": [ + 70, + 135, + 95, + 45, + 70, + 85 + ] + }, + { + "pokemon_id": 10435, + "stats": [ + 74, + 115, + 70, + 135, + 80, + 106 + ] + }, + { + "pokemon_id": 10436, + "stats": [ + 74, + 115, + 110, + 135, + 100, + 46 + ] + }, + { + "pokemon_id": 10437, + "stats": [ + 100, + 100, + 120, + 150, + 120, + 90 + ] + }, + { + "pokemon_id": 10438, + "stats": [ + 70, + 105, + 75, + 50, + 75, + 105 + ] + }, + { + "pokemon_id": 10440, + "stats": [ + 60, + 75, + 45, + 65, + 50, + 55 + ] + }, + { + "pokemon_id": 10507, + "stats": [ + 50, + 105, + 79, + 35, + 110, + 76 + ] + }, + { + "pokemon_id": 10508, + "stats": [ + 126, + 131, + 95, + 131, + 98, + 99 + ] + }, + { + "pokemon_id": 10509, + "stats": [ + 70, + 110, + 70, + 115, + 70, + 90 + ] + }, + { + "pokemon_id": 10510, + "stats": [ + 50, + 50, + 95, + 40, + 50, + 35 + ] + }, + { + "pokemon_id": 10511, + "stats": [ + 65, + 60, + 110, + 130, + 95, + 65 + ] + }, + { + "pokemon_id": 10512, + "stats": [ + 50, + 71, + 40, + 40, + 40, + 69 + ] + }, + { + "pokemon_id": 10666, + "stats": [ + 55, + 50, + 65, + 175, + 105, + 150 + ] + }, + { + "pokemon_id": 10667, + "stats": [ + 80, + 95, + 115, + 130, + 115, + 65 + ] + }, + { + "pokemon_id": 10668, + "stats": [ + 120, + 120, + 120, + 120, + 120, + 120 + ] + }, + { + "pokemon_id": 10669, + "stats": [ + 100, + 100, + 100, + 100, + 100, + 100 + ] + }, + { + "pokemon_id": 10670, + "stats": [ + 45, + 50, + 55, + 75, + 65, + 30 + ] + }, + { + "pokemon_id": 10687, + "stats": [ + 100, + 100, + 90, + 150, + 140, + 90 + ] + }, + { + "pokemon_id": 10900, + "stats": [ + 50, + 65, + 107, + 105, + 107, + 86 + ] + }, + { + "pokemon_id": 10901, + "stats": [ + 105, + 150, + 90, + 150, + 90, + 95 + ] + }, + { + "pokemon_id": 10902, + "stats": [ + 68, + 65, + 65, + 125, + 115, + 80 + ] + }, + { + "pokemon_id": 10903, + "stats": [ + 40, + 65, + 40, + 80, + 40, + 65 + ] + }, + { + "pokemon_id": 10904, + "stats": [ + 106, + 90, + 130, + 90, + 154, + 110 + ] + }, + { + "pokemon_id": 10905, + "stats": [ + 40, + 65, + 40, + 80, + 40, + 65 + ] + }, + { + "pokemon_id": 11000, + "stats": [ + 75, + 110, + 105, + 30, + 70, + 100 + ] + }, + { + "pokemon_id": 11001, + "stats": [ + 55, + 45, + 45, + 25, + 25, + 15 + ] + }, + { + "pokemon_id": 11002, + "stats": [ + 75, + 110, + 105, + 30, + 70, + 100 + ] + }, + { + "pokemon_id": 11003, + "stats": [ + 75, + 110, + 105, + 30, + 70, + 100 + ] + }, + { + "pokemon_id": 11004, + "stats": [ + 100, + 160, + 97, + 106, + 87, + 100 + ] + } +] \ No newline at end of file diff --git a/pokemonduel/data/ptypes.json b/pokemonduel/data/ptypes.json new file mode 100644 index 0000000..66e3919 --- /dev/null +++ b/pokemonduel/data/ptypes.json @@ -0,0 +1,8420 @@ +[ + { + "id": 0, + "types": [ + 19 + ] + }, + { + "id": 1, + "types": [ + 12, + 4 + ] + }, + { + "id": 2, + "types": [ + 12, + 4 + ] + }, + { + "id": 3, + "types": [ + 12, + 4 + ] + }, + { + "id": 4, + "types": [ + 10 + ] + }, + { + "id": 5, + "types": [ + 10 + ] + }, + { + "id": 6, + "types": [ + 10, + 3 + ] + }, + { + "id": 7, + "types": [ + 11 + ] + }, + { + "id": 8, + "types": [ + 11 + ] + }, + { + "id": 9, + "types": [ + 11 + ] + }, + { + "id": 10, + "types": [ + 7 + ] + }, + { + "id": 11, + "types": [ + 7 + ] + }, + { + "id": 12, + "types": [ + 7, + 3 + ] + }, + { + "id": 13, + "types": [ + 7, + 4 + ] + }, + { + "id": 14, + "types": [ + 7, + 4 + ] + }, + { + "id": 15, + "types": [ + 7, + 4 + ] + }, + { + "id": 16, + "types": [ + 1, + 3 + ] + }, + { + "id": 17, + "types": [ + 1, + 3 + ] + }, + { + "id": 18, + "types": [ + 1, + 3 + ] + }, + { + "id": 19, + "types": [ + 1 + ] + }, + { + "id": 20, + "types": [ + 1 + ] + }, + { + "id": 21, + "types": [ + 1, + 3 + ] + }, + { + "id": 22, + "types": [ + 1, + 3 + ] + }, + { + "id": 23, + "types": [ + 4 + ] + }, + { + "id": 24, + "types": [ + 4 + ] + }, + { + "id": 25, + "types": [ + 13 + ] + }, + { + "id": 26, + "types": [ + 13 + ] + }, + { + "id": 27, + "types": [ + 5 + ] + }, + { + "id": 28, + "types": [ + 5 + ] + }, + { + "id": 29, + "types": [ + 4 + ] + }, + { + "id": 30, + "types": [ + 4 + ] + }, + { + "id": 31, + "types": [ + 4, + 5 + ] + }, + { + "id": 32, + "types": [ + 4 + ] + }, + { + "id": 33, + "types": [ + 4 + ] + }, + { + "id": 34, + "types": [ + 4, + 5 + ] + }, + { + "id": 35, + "types": [ + 18 + ] + }, + { + "id": 36, + "types": [ + 18 + ] + }, + { + "id": 37, + "types": [ + 10 + ] + }, + { + "id": 38, + "types": [ + 10 + ] + }, + { + "id": 39, + "types": [ + 1, + 18 + ] + }, + { + "id": 40, + "types": [ + 1, + 18 + ] + }, + { + "id": 41, + "types": [ + 4, + 3 + ] + }, + { + "id": 42, + "types": [ + 4, + 3 + ] + }, + { + "id": 43, + "types": [ + 12, + 4 + ] + }, + { + "id": 44, + "types": [ + 12, + 4 + ] + }, + { + "id": 45, + "types": [ + 12, + 4 + ] + }, + { + "id": 46, + "types": [ + 7, + 12 + ] + }, + { + "id": 47, + "types": [ + 7, + 12 + ] + }, + { + "id": 48, + "types": [ + 7, + 4 + ] + }, + { + "id": 49, + "types": [ + 7, + 4 + ] + }, + { + "id": 50, + "types": [ + 5 + ] + }, + { + "id": 51, + "types": [ + 5 + ] + }, + { + "id": 52, + "types": [ + 1 + ] + }, + { + "id": 53, + "types": [ + 1 + ] + }, + { + "id": 54, + "types": [ + 11 + ] + }, + { + "id": 55, + "types": [ + 11 + ] + }, + { + "id": 56, + "types": [ + 2 + ] + }, + { + "id": 57, + "types": [ + 2 + ] + }, + { + "id": 58, + "types": [ + 10 + ] + }, + { + "id": 59, + "types": [ + 10 + ] + }, + { + "id": 60, + "types": [ + 11 + ] + }, + { + "id": 61, + "types": [ + 11 + ] + }, + { + "id": 62, + "types": [ + 11, + 2 + ] + }, + { + "id": 63, + "types": [ + 14 + ] + }, + { + "id": 64, + "types": [ + 14 + ] + }, + { + "id": 65, + "types": [ + 14 + ] + }, + { + "id": 66, + "types": [ + 2 + ] + }, + { + "id": 67, + "types": [ + 2 + ] + }, + { + "id": 68, + "types": [ + 2 + ] + }, + { + "id": 69, + "types": [ + 12, + 4 + ] + }, + { + "id": 70, + "types": [ + 12, + 4 + ] + }, + { + "id": 71, + "types": [ + 12, + 4 + ] + }, + { + "id": 72, + "types": [ + 11, + 4 + ] + }, + { + "id": 73, + "types": [ + 11, + 4 + ] + }, + { + "id": 74, + "types": [ + 6, + 5 + ] + }, + { + "id": 75, + "types": [ + 6, + 5 + ] + }, + { + "id": 76, + "types": [ + 6, + 5 + ] + }, + { + "id": 77, + "types": [ + 10 + ] + }, + { + "id": 78, + "types": [ + 10 + ] + }, + { + "id": 79, + "types": [ + 11, + 14 + ] + }, + { + "id": 80, + "types": [ + 11, + 14 + ] + }, + { + "id": 81, + "types": [ + 13, + 9 + ] + }, + { + "id": 82, + "types": [ + 13, + 9 + ] + }, + { + "id": 83, + "types": [ + 1, + 3 + ] + }, + { + "id": 84, + "types": [ + 1, + 3 + ] + }, + { + "id": 85, + "types": [ + 1, + 3 + ] + }, + { + "id": 86, + "types": [ + 11 + ] + }, + { + "id": 87, + "types": [ + 11, + 15 + ] + }, + { + "id": 88, + "types": [ + 4 + ] + }, + { + "id": 89, + "types": [ + 4 + ] + }, + { + "id": 90, + "types": [ + 11 + ] + }, + { + "id": 91, + "types": [ + 11, + 15 + ] + }, + { + "id": 92, + "types": [ + 8, + 4 + ] + }, + { + "id": 93, + "types": [ + 8, + 4 + ] + }, + { + "id": 94, + "types": [ + 8, + 4 + ] + }, + { + "id": 95, + "types": [ + 6, + 5 + ] + }, + { + "id": 96, + "types": [ + 14 + ] + }, + { + "id": 97, + "types": [ + 14 + ] + }, + { + "id": 98, + "types": [ + 11 + ] + }, + { + "id": 99, + "types": [ + 11 + ] + }, + { + "id": 100, + "types": [ + 13 + ] + }, + { + "id": 101, + "types": [ + 13 + ] + }, + { + "id": 102, + "types": [ + 12, + 14 + ] + }, + { + "id": 103, + "types": [ + 12, + 14 + ] + }, + { + "id": 104, + "types": [ + 5 + ] + }, + { + "id": 105, + "types": [ + 5 + ] + }, + { + "id": 106, + "types": [ + 2 + ] + }, + { + "id": 107, + "types": [ + 2 + ] + }, + { + "id": 108, + "types": [ + 1 + ] + }, + { + "id": 109, + "types": [ + 4 + ] + }, + { + "id": 110, + "types": [ + 4 + ] + }, + { + "id": 111, + "types": [ + 5, + 6 + ] + }, + { + "id": 112, + "types": [ + 5, + 6 + ] + }, + { + "id": 113, + "types": [ + 1 + ] + }, + { + "id": 114, + "types": [ + 12 + ] + }, + { + "id": 115, + "types": [ + 1 + ] + }, + { + "id": 116, + "types": [ + 11 + ] + }, + { + "id": 117, + "types": [ + 11 + ] + }, + { + "id": 118, + "types": [ + 11 + ] + }, + { + "id": 119, + "types": [ + 11 + ] + }, + { + "id": 120, + "types": [ + 11 + ] + }, + { + "id": 121, + "types": [ + 11, + 14 + ] + }, + { + "id": 122, + "types": [ + 14, + 18 + ] + }, + { + "id": 123, + "types": [ + 7, + 3 + ] + }, + { + "id": 124, + "types": [ + 15, + 14 + ] + }, + { + "id": 125, + "types": [ + 13 + ] + }, + { + "id": 126, + "types": [ + 10 + ] + }, + { + "id": 127, + "types": [ + 7 + ] + }, + { + "id": 128, + "types": [ + 1 + ] + }, + { + "id": 129, + "types": [ + 11 + ] + }, + { + "id": 130, + "types": [ + 11, + 3 + ] + }, + { + "id": 131, + "types": [ + 11, + 15 + ] + }, + { + "id": 132, + "types": [ + 1 + ] + }, + { + "id": 133, + "types": [ + 1 + ] + }, + { + "id": 134, + "types": [ + 11 + ] + }, + { + "id": 135, + "types": [ + 13 + ] + }, + { + "id": 136, + "types": [ + 10 + ] + }, + { + "id": 137, + "types": [ + 1 + ] + }, + { + "id": 138, + "types": [ + 6, + 11 + ] + }, + { + "id": 139, + "types": [ + 6, + 11 + ] + }, + { + "id": 140, + "types": [ + 6, + 11 + ] + }, + { + "id": 141, + "types": [ + 6, + 11 + ] + }, + { + "id": 142, + "types": [ + 6, + 3 + ] + }, + { + "id": 143, + "types": [ + 1 + ] + }, + { + "id": 144, + "types": [ + 15, + 3 + ] + }, + { + "id": 145, + "types": [ + 13, + 3 + ] + }, + { + "id": 146, + "types": [ + 10, + 3 + ] + }, + { + "id": 147, + "types": [ + 16 + ] + }, + { + "id": 148, + "types": [ + 16 + ] + }, + { + "id": 149, + "types": [ + 16, + 3 + ] + }, + { + "id": 150, + "types": [ + 14 + ] + }, + { + "id": 151, + "types": [ + 14 + ] + }, + { + "id": 152, + "types": [ + 12 + ] + }, + { + "id": 153, + "types": [ + 12 + ] + }, + { + "id": 154, + "types": [ + 12 + ] + }, + { + "id": 155, + "types": [ + 10 + ] + }, + { + "id": 156, + "types": [ + 10 + ] + }, + { + "id": 157, + "types": [ + 10 + ] + }, + { + "id": 158, + "types": [ + 11 + ] + }, + { + "id": 159, + "types": [ + 11 + ] + }, + { + "id": 160, + "types": [ + 11 + ] + }, + { + "id": 161, + "types": [ + 1 + ] + }, + { + "id": 162, + "types": [ + 1 + ] + }, + { + "id": 163, + "types": [ + 1, + 3 + ] + }, + { + "id": 164, + "types": [ + 1, + 3 + ] + }, + { + "id": 165, + "types": [ + 7, + 3 + ] + }, + { + "id": 166, + "types": [ + 7, + 3 + ] + }, + { + "id": 167, + "types": [ + 7, + 4 + ] + }, + { + "id": 168, + "types": [ + 7, + 4 + ] + }, + { + "id": 169, + "types": [ + 4, + 3 + ] + }, + { + "id": 170, + "types": [ + 11, + 13 + ] + }, + { + "id": 171, + "types": [ + 11, + 13 + ] + }, + { + "id": 172, + "types": [ + 13 + ] + }, + { + "id": 173, + "types": [ + 18 + ] + }, + { + "id": 174, + "types": [ + 1, + 18 + ] + }, + { + "id": 175, + "types": [ + 18 + ] + }, + { + "id": 176, + "types": [ + 18, + 3 + ] + }, + { + "id": 177, + "types": [ + 14, + 3 + ] + }, + { + "id": 178, + "types": [ + 14, + 3 + ] + }, + { + "id": 179, + "types": [ + 13 + ] + }, + { + "id": 180, + "types": [ + 13 + ] + }, + { + "id": 181, + "types": [ + 13 + ] + }, + { + "id": 182, + "types": [ + 12 + ] + }, + { + "id": 183, + "types": [ + 11, + 18 + ] + }, + { + "id": 184, + "types": [ + 11, + 18 + ] + }, + { + "id": 185, + "types": [ + 6 + ] + }, + { + "id": 186, + "types": [ + 11 + ] + }, + { + "id": 187, + "types": [ + 12, + 3 + ] + }, + { + "id": 188, + "types": [ + 12, + 3 + ] + }, + { + "id": 189, + "types": [ + 12, + 3 + ] + }, + { + "id": 190, + "types": [ + 1 + ] + }, + { + "id": 191, + "types": [ + 12 + ] + }, + { + "id": 192, + "types": [ + 12 + ] + }, + { + "id": 193, + "types": [ + 7, + 3 + ] + }, + { + "id": 194, + "types": [ + 11, + 5 + ] + }, + { + "id": 195, + "types": [ + 11, + 5 + ] + }, + { + "id": 196, + "types": [ + 14 + ] + }, + { + "id": 197, + "types": [ + 17 + ] + }, + { + "id": 198, + "types": [ + 17, + 3 + ] + }, + { + "id": 199, + "types": [ + 11, + 14 + ] + }, + { + "id": 200, + "types": [ + 8 + ] + }, + { + "id": 201, + "types": [ + 14 + ] + }, + { + "id": 202, + "types": [ + 14 + ] + }, + { + "id": 203, + "types": [ + 1, + 14 + ] + }, + { + "id": 204, + "types": [ + 7 + ] + }, + { + "id": 205, + "types": [ + 7, + 9 + ] + }, + { + "id": 206, + "types": [ + 1 + ] + }, + { + "id": 207, + "types": [ + 5, + 3 + ] + }, + { + "id": 208, + "types": [ + 9, + 5 + ] + }, + { + "id": 209, + "types": [ + 18 + ] + }, + { + "id": 210, + "types": [ + 18 + ] + }, + { + "id": 211, + "types": [ + 11, + 4 + ] + }, + { + "id": 212, + "types": [ + 7, + 9 + ] + }, + { + "id": 213, + "types": [ + 7, + 6 + ] + }, + { + "id": 214, + "types": [ + 7, + 2 + ] + }, + { + "id": 215, + "types": [ + 17, + 15 + ] + }, + { + "id": 216, + "types": [ + 1 + ] + }, + { + "id": 217, + "types": [ + 1 + ] + }, + { + "id": 218, + "types": [ + 10 + ] + }, + { + "id": 219, + "types": [ + 10, + 6 + ] + }, + { + "id": 220, + "types": [ + 15, + 5 + ] + }, + { + "id": 221, + "types": [ + 15, + 5 + ] + }, + { + "id": 222, + "types": [ + 11, + 6 + ] + }, + { + "id": 223, + "types": [ + 11 + ] + }, + { + "id": 224, + "types": [ + 11 + ] + }, + { + "id": 225, + "types": [ + 15, + 3 + ] + }, + { + "id": 226, + "types": [ + 11, + 3 + ] + }, + { + "id": 227, + "types": [ + 9, + 3 + ] + }, + { + "id": 228, + "types": [ + 17, + 10 + ] + }, + { + "id": 229, + "types": [ + 17, + 10 + ] + }, + { + "id": 230, + "types": [ + 11, + 16 + ] + }, + { + "id": 231, + "types": [ + 5 + ] + }, + { + "id": 232, + "types": [ + 5 + ] + }, + { + "id": 233, + "types": [ + 1 + ] + }, + { + "id": 234, + "types": [ + 1 + ] + }, + { + "id": 235, + "types": [ + 1 + ] + }, + { + "id": 236, + "types": [ + 2 + ] + }, + { + "id": 237, + "types": [ + 2 + ] + }, + { + "id": 238, + "types": [ + 15, + 14 + ] + }, + { + "id": 239, + "types": [ + 13 + ] + }, + { + "id": 240, + "types": [ + 10 + ] + }, + { + "id": 241, + "types": [ + 1 + ] + }, + { + "id": 242, + "types": [ + 1 + ] + }, + { + "id": 243, + "types": [ + 13 + ] + }, + { + "id": 244, + "types": [ + 10 + ] + }, + { + "id": 245, + "types": [ + 11 + ] + }, + { + "id": 246, + "types": [ + 6, + 5 + ] + }, + { + "id": 247, + "types": [ + 6, + 5 + ] + }, + { + "id": 248, + "types": [ + 6, + 17 + ] + }, + { + "id": 249, + "types": [ + 14, + 3 + ] + }, + { + "id": 250, + "types": [ + 10, + 3 + ] + }, + { + "id": 251, + "types": [ + 14, + 12 + ] + }, + { + "id": 252, + "types": [ + 12 + ] + }, + { + "id": 253, + "types": [ + 12 + ] + }, + { + "id": 254, + "types": [ + 12 + ] + }, + { + "id": 255, + "types": [ + 10 + ] + }, + { + "id": 256, + "types": [ + 10, + 2 + ] + }, + { + "id": 257, + "types": [ + 10, + 2 + ] + }, + { + "id": 258, + "types": [ + 11 + ] + }, + { + "id": 259, + "types": [ + 11, + 5 + ] + }, + { + "id": 260, + "types": [ + 11, + 5 + ] + }, + { + "id": 261, + "types": [ + 17 + ] + }, + { + "id": 262, + "types": [ + 17 + ] + }, + { + "id": 263, + "types": [ + 1 + ] + }, + { + "id": 264, + "types": [ + 1 + ] + }, + { + "id": 265, + "types": [ + 7 + ] + }, + { + "id": 266, + "types": [ + 7 + ] + }, + { + "id": 267, + "types": [ + 7, + 3 + ] + }, + { + "id": 268, + "types": [ + 7 + ] + }, + { + "id": 269, + "types": [ + 7, + 4 + ] + }, + { + "id": 270, + "types": [ + 11, + 12 + ] + }, + { + "id": 271, + "types": [ + 11, + 12 + ] + }, + { + "id": 272, + "types": [ + 11, + 12 + ] + }, + { + "id": 273, + "types": [ + 12 + ] + }, + { + "id": 274, + "types": [ + 12, + 17 + ] + }, + { + "id": 275, + "types": [ + 12, + 17 + ] + }, + { + "id": 276, + "types": [ + 1, + 3 + ] + }, + { + "id": 277, + "types": [ + 1, + 3 + ] + }, + { + "id": 278, + "types": [ + 11, + 3 + ] + }, + { + "id": 279, + "types": [ + 11, + 3 + ] + }, + { + "id": 280, + "types": [ + 14, + 18 + ] + }, + { + "id": 281, + "types": [ + 14, + 18 + ] + }, + { + "id": 282, + "types": [ + 14, + 18 + ] + }, + { + "id": 283, + "types": [ + 7, + 11 + ] + }, + { + "id": 284, + "types": [ + 7, + 3 + ] + }, + { + "id": 285, + "types": [ + 12 + ] + }, + { + "id": 286, + "types": [ + 12, + 2 + ] + }, + { + "id": 287, + "types": [ + 1 + ] + }, + { + "id": 288, + "types": [ + 1 + ] + }, + { + "id": 289, + "types": [ + 1 + ] + }, + { + "id": 290, + "types": [ + 7, + 5 + ] + }, + { + "id": 291, + "types": [ + 7, + 3 + ] + }, + { + "id": 292, + "types": [ + 7, + 8 + ] + }, + { + "id": 293, + "types": [ + 1 + ] + }, + { + "id": 294, + "types": [ + 1 + ] + }, + { + "id": 295, + "types": [ + 1 + ] + }, + { + "id": 296, + "types": [ + 2 + ] + }, + { + "id": 297, + "types": [ + 2 + ] + }, + { + "id": 298, + "types": [ + 1, + 18 + ] + }, + { + "id": 299, + "types": [ + 6 + ] + }, + { + "id": 300, + "types": [ + 1 + ] + }, + { + "id": 301, + "types": [ + 1 + ] + }, + { + "id": 302, + "types": [ + 17, + 8 + ] + }, + { + "id": 303, + "types": [ + 9, + 18 + ] + }, + { + "id": 304, + "types": [ + 9, + 6 + ] + }, + { + "id": 305, + "types": [ + 9, + 6 + ] + }, + { + "id": 306, + "types": [ + 9, + 6 + ] + }, + { + "id": 307, + "types": [ + 2, + 14 + ] + }, + { + "id": 308, + "types": [ + 2, + 14 + ] + }, + { + "id": 309, + "types": [ + 13 + ] + }, + { + "id": 310, + "types": [ + 13 + ] + }, + { + "id": 311, + "types": [ + 13 + ] + }, + { + "id": 312, + "types": [ + 13 + ] + }, + { + "id": 313, + "types": [ + 7 + ] + }, + { + "id": 314, + "types": [ + 7 + ] + }, + { + "id": 315, + "types": [ + 12, + 4 + ] + }, + { + "id": 316, + "types": [ + 4 + ] + }, + { + "id": 317, + "types": [ + 4 + ] + }, + { + "id": 318, + "types": [ + 11, + 17 + ] + }, + { + "id": 319, + "types": [ + 11, + 17 + ] + }, + { + "id": 320, + "types": [ + 11 + ] + }, + { + "id": 321, + "types": [ + 11 + ] + }, + { + "id": 322, + "types": [ + 10, + 5 + ] + }, + { + "id": 323, + "types": [ + 10, + 5 + ] + }, + { + "id": 324, + "types": [ + 10 + ] + }, + { + "id": 325, + "types": [ + 14 + ] + }, + { + "id": 326, + "types": [ + 14 + ] + }, + { + "id": 327, + "types": [ + 1 + ] + }, + { + "id": 328, + "types": [ + 5 + ] + }, + { + "id": 329, + "types": [ + 5, + 16 + ] + }, + { + "id": 330, + "types": [ + 5, + 16 + ] + }, + { + "id": 331, + "types": [ + 12 + ] + }, + { + "id": 332, + "types": [ + 12, + 17 + ] + }, + { + "id": 333, + "types": [ + 1, + 3 + ] + }, + { + "id": 334, + "types": [ + 16, + 3 + ] + }, + { + "id": 335, + "types": [ + 1 + ] + }, + { + "id": 336, + "types": [ + 4 + ] + }, + { + "id": 337, + "types": [ + 6, + 14 + ] + }, + { + "id": 338, + "types": [ + 6, + 14 + ] + }, + { + "id": 339, + "types": [ + 11, + 5 + ] + }, + { + "id": 340, + "types": [ + 11, + 5 + ] + }, + { + "id": 341, + "types": [ + 11 + ] + }, + { + "id": 342, + "types": [ + 11, + 17 + ] + }, + { + "id": 343, + "types": [ + 5, + 14 + ] + }, + { + "id": 344, + "types": [ + 5, + 14 + ] + }, + { + "id": 345, + "types": [ + 6, + 12 + ] + }, + { + "id": 346, + "types": [ + 6, + 12 + ] + }, + { + "id": 347, + "types": [ + 6, + 7 + ] + }, + { + "id": 348, + "types": [ + 6, + 7 + ] + }, + { + "id": 349, + "types": [ + 11 + ] + }, + { + "id": 350, + "types": [ + 11 + ] + }, + { + "id": 351, + "types": [ + 1 + ] + }, + { + "id": 352, + "types": [ + 1 + ] + }, + { + "id": 353, + "types": [ + 8 + ] + }, + { + "id": 354, + "types": [ + 8 + ] + }, + { + "id": 355, + "types": [ + 8 + ] + }, + { + "id": 356, + "types": [ + 8 + ] + }, + { + "id": 357, + "types": [ + 12, + 3 + ] + }, + { + "id": 358, + "types": [ + 14 + ] + }, + { + "id": 359, + "types": [ + 17 + ] + }, + { + "id": 360, + "types": [ + 14 + ] + }, + { + "id": 361, + "types": [ + 15 + ] + }, + { + "id": 362, + "types": [ + 15 + ] + }, + { + "id": 363, + "types": [ + 15, + 11 + ] + }, + { + "id": 364, + "types": [ + 15, + 11 + ] + }, + { + "id": 365, + "types": [ + 15, + 11 + ] + }, + { + "id": 366, + "types": [ + 11 + ] + }, + { + "id": 367, + "types": [ + 11 + ] + }, + { + "id": 368, + "types": [ + 11 + ] + }, + { + "id": 369, + "types": [ + 11, + 6 + ] + }, + { + "id": 370, + "types": [ + 11 + ] + }, + { + "id": 371, + "types": [ + 16 + ] + }, + { + "id": 372, + "types": [ + 16 + ] + }, + { + "id": 373, + "types": [ + 16, + 3 + ] + }, + { + "id": 374, + "types": [ + 9, + 14 + ] + }, + { + "id": 375, + "types": [ + 9, + 14 + ] + }, + { + "id": 376, + "types": [ + 9, + 14 + ] + }, + { + "id": 377, + "types": [ + 6 + ] + }, + { + "id": 378, + "types": [ + 15 + ] + }, + { + "id": 379, + "types": [ + 9 + ] + }, + { + "id": 380, + "types": [ + 16, + 14 + ] + }, + { + "id": 381, + "types": [ + 16, + 14 + ] + }, + { + "id": 382, + "types": [ + 11 + ] + }, + { + "id": 383, + "types": [ + 5 + ] + }, + { + "id": 384, + "types": [ + 16, + 3 + ] + }, + { + "id": 385, + "types": [ + 9, + 14 + ] + }, + { + "id": 386, + "types": [ + 14 + ] + }, + { + "id": 387, + "types": [ + 12 + ] + }, + { + "id": 388, + "types": [ + 12 + ] + }, + { + "id": 389, + "types": [ + 12, + 5 + ] + }, + { + "id": 390, + "types": [ + 10 + ] + }, + { + "id": 391, + "types": [ + 10, + 2 + ] + }, + { + "id": 392, + "types": [ + 10, + 2 + ] + }, + { + "id": 393, + "types": [ + 11 + ] + }, + { + "id": 394, + "types": [ + 11 + ] + }, + { + "id": 395, + "types": [ + 11, + 9 + ] + }, + { + "id": 396, + "types": [ + 1, + 3 + ] + }, + { + "id": 397, + "types": [ + 1, + 3 + ] + }, + { + "id": 398, + "types": [ + 1, + 3 + ] + }, + { + "id": 399, + "types": [ + 1 + ] + }, + { + "id": 400, + "types": [ + 1, + 11 + ] + }, + { + "id": 401, + "types": [ + 7 + ] + }, + { + "id": 402, + "types": [ + 7 + ] + }, + { + "id": 403, + "types": [ + 13 + ] + }, + { + "id": 404, + "types": [ + 13 + ] + }, + { + "id": 405, + "types": [ + 13 + ] + }, + { + "id": 406, + "types": [ + 12, + 4 + ] + }, + { + "id": 407, + "types": [ + 12, + 4 + ] + }, + { + "id": 408, + "types": [ + 6 + ] + }, + { + "id": 409, + "types": [ + 6 + ] + }, + { + "id": 410, + "types": [ + 6, + 9 + ] + }, + { + "id": 411, + "types": [ + 6, + 9 + ] + }, + { + "id": 412, + "types": [ + 7 + ] + }, + { + "id": 413, + "types": [ + 7, + 12 + ] + }, + { + "id": 414, + "types": [ + 7, + 3 + ] + }, + { + "id": 415, + "types": [ + 7, + 3 + ] + }, + { + "id": 416, + "types": [ + 7, + 3 + ] + }, + { + "id": 417, + "types": [ + 13 + ] + }, + { + "id": 418, + "types": [ + 11 + ] + }, + { + "id": 419, + "types": [ + 11 + ] + }, + { + "id": 420, + "types": [ + 12 + ] + }, + { + "id": 421, + "types": [ + 12 + ] + }, + { + "id": 422, + "types": [ + 11 + ] + }, + { + "id": 423, + "types": [ + 11, + 5 + ] + }, + { + "id": 424, + "types": [ + 1 + ] + }, + { + "id": 425, + "types": [ + 8, + 3 + ] + }, + { + "id": 426, + "types": [ + 8, + 3 + ] + }, + { + "id": 427, + "types": [ + 1 + ] + }, + { + "id": 428, + "types": [ + 1 + ] + }, + { + "id": 429, + "types": [ + 8 + ] + }, + { + "id": 430, + "types": [ + 17, + 3 + ] + }, + { + "id": 431, + "types": [ + 1 + ] + }, + { + "id": 432, + "types": [ + 1 + ] + }, + { + "id": 433, + "types": [ + 14 + ] + }, + { + "id": 434, + "types": [ + 4, + 17 + ] + }, + { + "id": 435, + "types": [ + 4, + 17 + ] + }, + { + "id": 436, + "types": [ + 9, + 14 + ] + }, + { + "id": 437, + "types": [ + 9, + 14 + ] + }, + { + "id": 438, + "types": [ + 6 + ] + }, + { + "id": 439, + "types": [ + 14, + 18 + ] + }, + { + "id": 440, + "types": [ + 1 + ] + }, + { + "id": 441, + "types": [ + 1, + 3 + ] + }, + { + "id": 442, + "types": [ + 8, + 17 + ] + }, + { + "id": 443, + "types": [ + 16, + 5 + ] + }, + { + "id": 444, + "types": [ + 16, + 5 + ] + }, + { + "id": 445, + "types": [ + 16, + 5 + ] + }, + { + "id": 446, + "types": [ + 1 + ] + }, + { + "id": 447, + "types": [ + 2 + ] + }, + { + "id": 448, + "types": [ + 2, + 9 + ] + }, + { + "id": 449, + "types": [ + 5 + ] + }, + { + "id": 450, + "types": [ + 5 + ] + }, + { + "id": 451, + "types": [ + 4, + 7 + ] + }, + { + "id": 452, + "types": [ + 4, + 17 + ] + }, + { + "id": 453, + "types": [ + 4, + 2 + ] + }, + { + "id": 454, + "types": [ + 4, + 2 + ] + }, + { + "id": 455, + "types": [ + 12 + ] + }, + { + "id": 456, + "types": [ + 11 + ] + }, + { + "id": 457, + "types": [ + 11 + ] + }, + { + "id": 458, + "types": [ + 11, + 3 + ] + }, + { + "id": 459, + "types": [ + 12, + 15 + ] + }, + { + "id": 460, + "types": [ + 12, + 15 + ] + }, + { + "id": 461, + "types": [ + 17, + 15 + ] + }, + { + "id": 462, + "types": [ + 13, + 9 + ] + }, + { + "id": 463, + "types": [ + 1 + ] + }, + { + "id": 464, + "types": [ + 5, + 6 + ] + }, + { + "id": 465, + "types": [ + 12 + ] + }, + { + "id": 466, + "types": [ + 13 + ] + }, + { + "id": 467, + "types": [ + 10 + ] + }, + { + "id": 468, + "types": [ + 18, + 3 + ] + }, + { + "id": 469, + "types": [ + 7, + 3 + ] + }, + { + "id": 470, + "types": [ + 12 + ] + }, + { + "id": 471, + "types": [ + 15 + ] + }, + { + "id": 472, + "types": [ + 5, + 3 + ] + }, + { + "id": 473, + "types": [ + 15, + 5 + ] + }, + { + "id": 474, + "types": [ + 1 + ] + }, + { + "id": 475, + "types": [ + 14, + 2 + ] + }, + { + "id": 476, + "types": [ + 6, + 9 + ] + }, + { + "id": 477, + "types": [ + 8 + ] + }, + { + "id": 478, + "types": [ + 15, + 8 + ] + }, + { + "id": 479, + "types": [ + 13, + 8 + ] + }, + { + "id": 480, + "types": [ + 14 + ] + }, + { + "id": 481, + "types": [ + 14 + ] + }, + { + "id": 482, + "types": [ + 14 + ] + }, + { + "id": 483, + "types": [ + 9, + 16 + ] + }, + { + "id": 484, + "types": [ + 11, + 16 + ] + }, + { + "id": 485, + "types": [ + 10, + 9 + ] + }, + { + "id": 486, + "types": [ + 1 + ] + }, + { + "id": 487, + "types": [ + 8, + 16 + ] + }, + { + "id": 488, + "types": [ + 14 + ] + }, + { + "id": 489, + "types": [ + 11 + ] + }, + { + "id": 490, + "types": [ + 11 + ] + }, + { + "id": 491, + "types": [ + 17 + ] + }, + { + "id": 492, + "types": [ + 12 + ] + }, + { + "id": 493, + "types": [ + 1 + ] + }, + { + "id": 494, + "types": [ + 14, + 10 + ] + }, + { + "id": 495, + "types": [ + 12 + ] + }, + { + "id": 496, + "types": [ + 12 + ] + }, + { + "id": 497, + "types": [ + 12 + ] + }, + { + "id": 498, + "types": [ + 10 + ] + }, + { + "id": 499, + "types": [ + 10, + 2 + ] + }, + { + "id": 500, + "types": [ + 10, + 2 + ] + }, + { + "id": 501, + "types": [ + 11 + ] + }, + { + "id": 502, + "types": [ + 11 + ] + }, + { + "id": 503, + "types": [ + 11 + ] + }, + { + "id": 504, + "types": [ + 1 + ] + }, + { + "id": 505, + "types": [ + 1 + ] + }, + { + "id": 506, + "types": [ + 1 + ] + }, + { + "id": 507, + "types": [ + 1 + ] + }, + { + "id": 508, + "types": [ + 1 + ] + }, + { + "id": 509, + "types": [ + 17 + ] + }, + { + "id": 510, + "types": [ + 17 + ] + }, + { + "id": 511, + "types": [ + 12 + ] + }, + { + "id": 512, + "types": [ + 12 + ] + }, + { + "id": 513, + "types": [ + 10 + ] + }, + { + "id": 514, + "types": [ + 10 + ] + }, + { + "id": 515, + "types": [ + 11 + ] + }, + { + "id": 516, + "types": [ + 11 + ] + }, + { + "id": 517, + "types": [ + 14 + ] + }, + { + "id": 518, + "types": [ + 14 + ] + }, + { + "id": 519, + "types": [ + 1, + 3 + ] + }, + { + "id": 520, + "types": [ + 1, + 3 + ] + }, + { + "id": 521, + "types": [ + 1, + 3 + ] + }, + { + "id": 522, + "types": [ + 13 + ] + }, + { + "id": 523, + "types": [ + 13 + ] + }, + { + "id": 524, + "types": [ + 6 + ] + }, + { + "id": 525, + "types": [ + 6 + ] + }, + { + "id": 526, + "types": [ + 6 + ] + }, + { + "id": 527, + "types": [ + 14, + 3 + ] + }, + { + "id": 528, + "types": [ + 14, + 3 + ] + }, + { + "id": 529, + "types": [ + 5 + ] + }, + { + "id": 530, + "types": [ + 5, + 9 + ] + }, + { + "id": 531, + "types": [ + 1 + ] + }, + { + "id": 532, + "types": [ + 2 + ] + }, + { + "id": 533, + "types": [ + 2 + ] + }, + { + "id": 534, + "types": [ + 2 + ] + }, + { + "id": 535, + "types": [ + 11 + ] + }, + { + "id": 536, + "types": [ + 11, + 5 + ] + }, + { + "id": 537, + "types": [ + 11, + 5 + ] + }, + { + "id": 538, + "types": [ + 2 + ] + }, + { + "id": 539, + "types": [ + 2 + ] + }, + { + "id": 540, + "types": [ + 7, + 12 + ] + }, + { + "id": 541, + "types": [ + 7, + 12 + ] + }, + { + "id": 542, + "types": [ + 7, + 12 + ] + }, + { + "id": 543, + "types": [ + 7, + 4 + ] + }, + { + "id": 544, + "types": [ + 7, + 4 + ] + }, + { + "id": 545, + "types": [ + 7, + 4 + ] + }, + { + "id": 546, + "types": [ + 12, + 18 + ] + }, + { + "id": 547, + "types": [ + 12, + 18 + ] + }, + { + "id": 548, + "types": [ + 12 + ] + }, + { + "id": 549, + "types": [ + 12 + ] + }, + { + "id": 550, + "types": [ + 11 + ] + }, + { + "id": 551, + "types": [ + 5, + 17 + ] + }, + { + "id": 552, + "types": [ + 5, + 17 + ] + }, + { + "id": 553, + "types": [ + 5, + 17 + ] + }, + { + "id": 554, + "types": [ + 10 + ] + }, + { + "id": 555, + "types": [ + 10 + ] + }, + { + "id": 556, + "types": [ + 12 + ] + }, + { + "id": 557, + "types": [ + 7, + 6 + ] + }, + { + "id": 558, + "types": [ + 7, + 6 + ] + }, + { + "id": 559, + "types": [ + 17, + 2 + ] + }, + { + "id": 560, + "types": [ + 17, + 2 + ] + }, + { + "id": 561, + "types": [ + 14, + 3 + ] + }, + { + "id": 562, + "types": [ + 8 + ] + }, + { + "id": 563, + "types": [ + 8 + ] + }, + { + "id": 564, + "types": [ + 11, + 6 + ] + }, + { + "id": 565, + "types": [ + 11, + 6 + ] + }, + { + "id": 566, + "types": [ + 6, + 3 + ] + }, + { + "id": 567, + "types": [ + 6, + 3 + ] + }, + { + "id": 568, + "types": [ + 4 + ] + }, + { + "id": 569, + "types": [ + 4 + ] + }, + { + "id": 570, + "types": [ + 17 + ] + }, + { + "id": 571, + "types": [ + 17 + ] + }, + { + "id": 572, + "types": [ + 1 + ] + }, + { + "id": 573, + "types": [ + 1 + ] + }, + { + "id": 574, + "types": [ + 14 + ] + }, + { + "id": 575, + "types": [ + 14 + ] + }, + { + "id": 576, + "types": [ + 14 + ] + }, + { + "id": 577, + "types": [ + 14 + ] + }, + { + "id": 578, + "types": [ + 14 + ] + }, + { + "id": 579, + "types": [ + 14 + ] + }, + { + "id": 580, + "types": [ + 11, + 3 + ] + }, + { + "id": 581, + "types": [ + 11, + 3 + ] + }, + { + "id": 582, + "types": [ + 15 + ] + }, + { + "id": 583, + "types": [ + 15 + ] + }, + { + "id": 584, + "types": [ + 15 + ] + }, + { + "id": 585, + "types": [ + 1, + 12 + ] + }, + { + "id": 586, + "types": [ + 1, + 12 + ] + }, + { + "id": 587, + "types": [ + 13, + 3 + ] + }, + { + "id": 588, + "types": [ + 7 + ] + }, + { + "id": 589, + "types": [ + 7, + 9 + ] + }, + { + "id": 590, + "types": [ + 12, + 4 + ] + }, + { + "id": 591, + "types": [ + 12, + 4 + ] + }, + { + "id": 592, + "types": [ + 11, + 8 + ] + }, + { + "id": 593, + "types": [ + 11, + 8 + ] + }, + { + "id": 594, + "types": [ + 11 + ] + }, + { + "id": 595, + "types": [ + 7, + 13 + ] + }, + { + "id": 596, + "types": [ + 7, + 13 + ] + }, + { + "id": 597, + "types": [ + 12, + 9 + ] + }, + { + "id": 598, + "types": [ + 12, + 9 + ] + }, + { + "id": 599, + "types": [ + 9 + ] + }, + { + "id": 600, + "types": [ + 9 + ] + }, + { + "id": 601, + "types": [ + 9 + ] + }, + { + "id": 602, + "types": [ + 13 + ] + }, + { + "id": 603, + "types": [ + 13 + ] + }, + { + "id": 604, + "types": [ + 13 + ] + }, + { + "id": 605, + "types": [ + 14 + ] + }, + { + "id": 606, + "types": [ + 14 + ] + }, + { + "id": 607, + "types": [ + 8, + 10 + ] + }, + { + "id": 608, + "types": [ + 8, + 10 + ] + }, + { + "id": 609, + "types": [ + 8, + 10 + ] + }, + { + "id": 610, + "types": [ + 16 + ] + }, + { + "id": 611, + "types": [ + 16 + ] + }, + { + "id": 612, + "types": [ + 16 + ] + }, + { + "id": 613, + "types": [ + 15 + ] + }, + { + "id": 614, + "types": [ + 15 + ] + }, + { + "id": 615, + "types": [ + 15 + ] + }, + { + "id": 616, + "types": [ + 7 + ] + }, + { + "id": 617, + "types": [ + 7 + ] + }, + { + "id": 618, + "types": [ + 5, + 13 + ] + }, + { + "id": 619, + "types": [ + 2 + ] + }, + { + "id": 620, + "types": [ + 2 + ] + }, + { + "id": 621, + "types": [ + 16 + ] + }, + { + "id": 622, + "types": [ + 5, + 8 + ] + }, + { + "id": 623, + "types": [ + 5, + 8 + ] + }, + { + "id": 624, + "types": [ + 17, + 9 + ] + }, + { + "id": 625, + "types": [ + 17, + 9 + ] + }, + { + "id": 626, + "types": [ + 1 + ] + }, + { + "id": 627, + "types": [ + 1, + 3 + ] + }, + { + "id": 628, + "types": [ + 1, + 3 + ] + }, + { + "id": 629, + "types": [ + 17, + 3 + ] + }, + { + "id": 630, + "types": [ + 17, + 3 + ] + }, + { + "id": 631, + "types": [ + 10 + ] + }, + { + "id": 632, + "types": [ + 7, + 9 + ] + }, + { + "id": 633, + "types": [ + 17, + 16 + ] + }, + { + "id": 634, + "types": [ + 17, + 16 + ] + }, + { + "id": 635, + "types": [ + 17, + 16 + ] + }, + { + "id": 636, + "types": [ + 7, + 10 + ] + }, + { + "id": 637, + "types": [ + 7, + 10 + ] + }, + { + "id": 638, + "types": [ + 9, + 2 + ] + }, + { + "id": 639, + "types": [ + 6, + 2 + ] + }, + { + "id": 640, + "types": [ + 12, + 2 + ] + }, + { + "id": 641, + "types": [ + 3 + ] + }, + { + "id": 642, + "types": [ + 13, + 3 + ] + }, + { + "id": 643, + "types": [ + 16, + 10 + ] + }, + { + "id": 644, + "types": [ + 16, + 13 + ] + }, + { + "id": 645, + "types": [ + 5, + 3 + ] + }, + { + "id": 646, + "types": [ + 16, + 15 + ] + }, + { + "id": 647, + "types": [ + 11, + 2 + ] + }, + { + "id": 648, + "types": [ + 1, + 14 + ] + }, + { + "id": 649, + "types": [ + 7, + 9 + ] + }, + { + "id": 650, + "types": [ + 12 + ] + }, + { + "id": 651, + "types": [ + 12 + ] + }, + { + "id": 652, + "types": [ + 12, + 2 + ] + }, + { + "id": 653, + "types": [ + 10 + ] + }, + { + "id": 654, + "types": [ + 10 + ] + }, + { + "id": 655, + "types": [ + 10, + 14 + ] + }, + { + "id": 656, + "types": [ + 11 + ] + }, + { + "id": 657, + "types": [ + 11 + ] + }, + { + "id": 658, + "types": [ + 11, + 17 + ] + }, + { + "id": 659, + "types": [ + 1 + ] + }, + { + "id": 660, + "types": [ + 1, + 5 + ] + }, + { + "id": 661, + "types": [ + 1, + 3 + ] + }, + { + "id": 662, + "types": [ + 10, + 3 + ] + }, + { + "id": 663, + "types": [ + 10, + 3 + ] + }, + { + "id": 664, + "types": [ + 7 + ] + }, + { + "id": 665, + "types": [ + 7 + ] + }, + { + "id": 666, + "types": [ + 7, + 3 + ] + }, + { + "id": 667, + "types": [ + 10, + 1 + ] + }, + { + "id": 668, + "types": [ + 10, + 1 + ] + }, + { + "id": 669, + "types": [ + 18 + ] + }, + { + "id": 670, + "types": [ + 18 + ] + }, + { + "id": 671, + "types": [ + 18 + ] + }, + { + "id": 672, + "types": [ + 12 + ] + }, + { + "id": 673, + "types": [ + 12 + ] + }, + { + "id": 674, + "types": [ + 2 + ] + }, + { + "id": 675, + "types": [ + 2, + 17 + ] + }, + { + "id": 676, + "types": [ + 1 + ] + }, + { + "id": 677, + "types": [ + 14 + ] + }, + { + "id": 678, + "types": [ + 14 + ] + }, + { + "id": 679, + "types": [ + 9, + 8 + ] + }, + { + "id": 680, + "types": [ + 9, + 8 + ] + }, + { + "id": 681, + "types": [ + 9, + 8 + ] + }, + { + "id": 682, + "types": [ + 18 + ] + }, + { + "id": 683, + "types": [ + 18 + ] + }, + { + "id": 684, + "types": [ + 18 + ] + }, + { + "id": 685, + "types": [ + 18 + ] + }, + { + "id": 686, + "types": [ + 17, + 14 + ] + }, + { + "id": 687, + "types": [ + 17, + 14 + ] + }, + { + "id": 688, + "types": [ + 6, + 11 + ] + }, + { + "id": 689, + "types": [ + 6, + 11 + ] + }, + { + "id": 690, + "types": [ + 4, + 11 + ] + }, + { + "id": 691, + "types": [ + 4, + 16 + ] + }, + { + "id": 692, + "types": [ + 11 + ] + }, + { + "id": 693, + "types": [ + 11 + ] + }, + { + "id": 694, + "types": [ + 13, + 1 + ] + }, + { + "id": 695, + "types": [ + 13, + 1 + ] + }, + { + "id": 696, + "types": [ + 6, + 16 + ] + }, + { + "id": 697, + "types": [ + 6, + 16 + ] + }, + { + "id": 698, + "types": [ + 6, + 15 + ] + }, + { + "id": 699, + "types": [ + 6, + 15 + ] + }, + { + "id": 700, + "types": [ + 18 + ] + }, + { + "id": 701, + "types": [ + 2, + 3 + ] + }, + { + "id": 702, + "types": [ + 13, + 18 + ] + }, + { + "id": 703, + "types": [ + 6, + 18 + ] + }, + { + "id": 704, + "types": [ + 16 + ] + }, + { + "id": 705, + "types": [ + 16 + ] + }, + { + "id": 706, + "types": [ + 16 + ] + }, + { + "id": 707, + "types": [ + 9, + 18 + ] + }, + { + "id": 708, + "types": [ + 8, + 12 + ] + }, + { + "id": 709, + "types": [ + 8, + 12 + ] + }, + { + "id": 710, + "types": [ + 8, + 12 + ] + }, + { + "id": 711, + "types": [ + 8, + 12 + ] + }, + { + "id": 712, + "types": [ + 15 + ] + }, + { + "id": 713, + "types": [ + 15 + ] + }, + { + "id": 714, + "types": [ + 3, + 16 + ] + }, + { + "id": 715, + "types": [ + 3, + 16 + ] + }, + { + "id": 716, + "types": [ + 18 + ] + }, + { + "id": 717, + "types": [ + 17, + 3 + ] + }, + { + "id": 718, + "types": [ + 16, + 5 + ] + }, + { + "id": 719, + "types": [ + 6, + 18 + ] + }, + { + "id": 720, + "types": [ + 14, + 8 + ] + }, + { + "id": 721, + "types": [ + 10, + 11 + ] + }, + { + "id": 722, + "types": [ + 12, + 3 + ] + }, + { + "id": 723, + "types": [ + 12, + 3 + ] + }, + { + "id": 724, + "types": [ + 12, + 8 + ] + }, + { + "id": 725, + "types": [ + 10 + ] + }, + { + "id": 726, + "types": [ + 10 + ] + }, + { + "id": 727, + "types": [ + 10, + 17 + ] + }, + { + "id": 728, + "types": [ + 11 + ] + }, + { + "id": 729, + "types": [ + 11 + ] + }, + { + "id": 730, + "types": [ + 11, + 18 + ] + }, + { + "id": 731, + "types": [ + 1, + 3 + ] + }, + { + "id": 732, + "types": [ + 1, + 3 + ] + }, + { + "id": 733, + "types": [ + 1, + 3 + ] + }, + { + "id": 734, + "types": [ + 1 + ] + }, + { + "id": 735, + "types": [ + 1 + ] + }, + { + "id": 736, + "types": [ + 7 + ] + }, + { + "id": 737, + "types": [ + 7, + 13 + ] + }, + { + "id": 738, + "types": [ + 7, + 13 + ] + }, + { + "id": 739, + "types": [ + 2 + ] + }, + { + "id": 740, + "types": [ + 2, + 15 + ] + }, + { + "id": 741, + "types": [ + 10, + 3 + ] + }, + { + "id": 742, + "types": [ + 7, + 18 + ] + }, + { + "id": 743, + "types": [ + 7, + 18 + ] + }, + { + "id": 744, + "types": [ + 6 + ] + }, + { + "id": 745, + "types": [ + 6 + ] + }, + { + "id": 746, + "types": [ + 11 + ] + }, + { + "id": 747, + "types": [ + 4, + 11 + ] + }, + { + "id": 748, + "types": [ + 4, + 11 + ] + }, + { + "id": 749, + "types": [ + 5 + ] + }, + { + "id": 750, + "types": [ + 5 + ] + }, + { + "id": 751, + "types": [ + 11, + 7 + ] + }, + { + "id": 752, + "types": [ + 11, + 7 + ] + }, + { + "id": 753, + "types": [ + 12 + ] + }, + { + "id": 754, + "types": [ + 12 + ] + }, + { + "id": 755, + "types": [ + 12, + 18 + ] + }, + { + "id": 756, + "types": [ + 12, + 18 + ] + }, + { + "id": 757, + "types": [ + 4, + 10 + ] + }, + { + "id": 758, + "types": [ + 4, + 10 + ] + }, + { + "id": 759, + "types": [ + 1, + 2 + ] + }, + { + "id": 760, + "types": [ + 1, + 2 + ] + }, + { + "id": 761, + "types": [ + 12 + ] + }, + { + "id": 762, + "types": [ + 12 + ] + }, + { + "id": 763, + "types": [ + 12 + ] + }, + { + "id": 764, + "types": [ + 18 + ] + }, + { + "id": 765, + "types": [ + 1, + 14 + ] + }, + { + "id": 766, + "types": [ + 2 + ] + }, + { + "id": 767, + "types": [ + 7, + 11 + ] + }, + { + "id": 768, + "types": [ + 7, + 11 + ] + }, + { + "id": 769, + "types": [ + 8, + 5 + ] + }, + { + "id": 770, + "types": [ + 8, + 5 + ] + }, + { + "id": 771, + "types": [ + 11 + ] + }, + { + "id": 772, + "types": [ + 1 + ] + }, + { + "id": 773, + "types": [ + 1 + ] + }, + { + "id": 774, + "types": [ + 6, + 3 + ] + }, + { + "id": 775, + "types": [ + 1 + ] + }, + { + "id": 776, + "types": [ + 10, + 16 + ] + }, + { + "id": 777, + "types": [ + 13, + 9 + ] + }, + { + "id": 778, + "types": [ + 8, + 18 + ] + }, + { + "id": 779, + "types": [ + 11, + 14 + ] + }, + { + "id": 780, + "types": [ + 1, + 16 + ] + }, + { + "id": 781, + "types": [ + 8, + 12 + ] + }, + { + "id": 782, + "types": [ + 16 + ] + }, + { + "id": 783, + "types": [ + 16, + 2 + ] + }, + { + "id": 784, + "types": [ + 16, + 2 + ] + }, + { + "id": 785, + "types": [ + 13, + 18 + ] + }, + { + "id": 786, + "types": [ + 14, + 18 + ] + }, + { + "id": 787, + "types": [ + 12, + 18 + ] + }, + { + "id": 788, + "types": [ + 11, + 18 + ] + }, + { + "id": 789, + "types": [ + 14 + ] + }, + { + "id": 790, + "types": [ + 14 + ] + }, + { + "id": 791, + "types": [ + 14, + 9 + ] + }, + { + "id": 792, + "types": [ + 14, + 8 + ] + }, + { + "id": 793, + "types": [ + 6, + 4 + ] + }, + { + "id": 794, + "types": [ + 7, + 2 + ] + }, + { + "id": 795, + "types": [ + 7, + 2 + ] + }, + { + "id": 796, + "types": [ + 13 + ] + }, + { + "id": 797, + "types": [ + 9, + 3 + ] + }, + { + "id": 798, + "types": [ + 12, + 9 + ] + }, + { + "id": 799, + "types": [ + 17, + 16 + ] + }, + { + "id": 800, + "types": [ + 14 + ] + }, + { + "id": 801, + "types": [ + 9, + 18 + ] + }, + { + "id": 802, + "types": [ + 2, + 8 + ] + }, + { + "id": 803, + "types": [ + 4 + ] + }, + { + "id": 804, + "types": [ + 4, + 16 + ] + }, + { + "id": 805, + "types": [ + 6, + 9 + ] + }, + { + "id": 806, + "types": [ + 10, + 8 + ] + }, + { + "id": 807, + "types": [ + 13 + ] + }, + { + "id": 808, + "types": [ + 9 + ] + }, + { + "id": 809, + "types": [ + 9 + ] + }, + { + "id": 810, + "types": [ + 12 + ] + }, + { + "id": 811, + "types": [ + 12 + ] + }, + { + "id": 812, + "types": [ + 12 + ] + }, + { + "id": 813, + "types": [ + 10 + ] + }, + { + "id": 814, + "types": [ + 10 + ] + }, + { + "id": 815, + "types": [ + 10 + ] + }, + { + "id": 816, + "types": [ + 11 + ] + }, + { + "id": 817, + "types": [ + 11 + ] + }, + { + "id": 818, + "types": [ + 11 + ] + }, + { + "id": 819, + "types": [ + 1 + ] + }, + { + "id": 820, + "types": [ + 1 + ] + }, + { + "id": 821, + "types": [ + 3 + ] + }, + { + "id": 822, + "types": [ + 3 + ] + }, + { + "id": 823, + "types": [ + 3, + 9 + ] + }, + { + "id": 824, + "types": [ + 7 + ] + }, + { + "id": 825, + "types": [ + 7, + 14 + ] + }, + { + "id": 826, + "types": [ + 7, + 14 + ] + }, + { + "id": 827, + "types": [ + 17 + ] + }, + { + "id": 828, + "types": [ + 17 + ] + }, + { + "id": 829, + "types": [ + 12 + ] + }, + { + "id": 830, + "types": [ + 12 + ] + }, + { + "id": 831, + "types": [ + 1 + ] + }, + { + "id": 832, + "types": [ + 1 + ] + }, + { + "id": 833, + "types": [ + 11 + ] + }, + { + "id": 834, + "types": [ + 11, + 6 + ] + }, + { + "id": 835, + "types": [ + 13 + ] + }, + { + "id": 836, + "types": [ + 13 + ] + }, + { + "id": 837, + "types": [ + 6 + ] + }, + { + "id": 838, + "types": [ + 6, + 10 + ] + }, + { + "id": 839, + "types": [ + 6, + 10 + ] + }, + { + "id": 840, + "types": [ + 12, + 16 + ] + }, + { + "id": 841, + "types": [ + 12, + 16 + ] + }, + { + "id": 842, + "types": [ + 12, + 16 + ] + }, + { + "id": 843, + "types": [ + 5 + ] + }, + { + "id": 844, + "types": [ + 5 + ] + }, + { + "id": 845, + "types": [ + 3, + 11 + ] + }, + { + "id": 846, + "types": [ + 11 + ] + }, + { + "id": 847, + "types": [ + 11 + ] + }, + { + "id": 848, + "types": [ + 4, + 13 + ] + }, + { + "id": 849, + "types": [ + 4, + 13 + ] + }, + { + "id": 850, + "types": [ + 7, + 10 + ] + }, + { + "id": 851, + "types": [ + 7, + 10 + ] + }, + { + "id": 852, + "types": [ + 2 + ] + }, + { + "id": 853, + "types": [ + 2 + ] + }, + { + "id": 854, + "types": [ + 8 + ] + }, + { + "id": 855, + "types": [ + 8 + ] + }, + { + "id": 856, + "types": [ + 14 + ] + }, + { + "id": 857, + "types": [ + 14 + ] + }, + { + "id": 858, + "types": [ + 14, + 18 + ] + }, + { + "id": 859, + "types": [ + 17, + 18 + ] + }, + { + "id": 860, + "types": [ + 17, + 18 + ] + }, + { + "id": 861, + "types": [ + 17, + 18 + ] + }, + { + "id": 862, + "types": [ + 17, + 1 + ] + }, + { + "id": 863, + "types": [ + 9 + ] + }, + { + "id": 864, + "types": [ + 8 + ] + }, + { + "id": 865, + "types": [ + 2 + ] + }, + { + "id": 866, + "types": [ + 14, + 15 + ] + }, + { + "id": 867, + "types": [ + 5, + 8 + ] + }, + { + "id": 868, + "types": [ + 18 + ] + }, + { + "id": 869, + "types": [ + 18 + ] + }, + { + "id": 870, + "types": [ + 2 + ] + }, + { + "id": 871, + "types": [ + 13 + ] + }, + { + "id": 872, + "types": [ + 7, + 15 + ] + }, + { + "id": 873, + "types": [ + 7, + 15 + ] + }, + { + "id": 874, + "types": [ + 6 + ] + }, + { + "id": 875, + "types": [ + 15 + ] + }, + { + "id": 876, + "types": [ + 14, + 1 + ] + }, + { + "id": 877, + "types": [ + 13, + 17 + ] + }, + { + "id": 878, + "types": [ + 9 + ] + }, + { + "id": 879, + "types": [ + 9 + ] + }, + { + "id": 880, + "types": [ + 13, + 16 + ] + }, + { + "id": 881, + "types": [ + 13, + 15 + ] + }, + { + "id": 882, + "types": [ + 11, + 16 + ] + }, + { + "id": 883, + "types": [ + 11, + 15 + ] + }, + { + "id": 884, + "types": [ + 9, + 16 + ] + }, + { + "id": 885, + "types": [ + 16, + 8 + ] + }, + { + "id": 886, + "types": [ + 16, + 8 + ] + }, + { + "id": 887, + "types": [ + 16, + 8 + ] + }, + { + "id": 888, + "types": [ + 18 + ] + }, + { + "id": 889, + "types": [ + 2 + ] + }, + { + "id": 890, + "types": [ + 4, + 16 + ] + }, + { + "id": 891, + "types": [ + 2 + ] + }, + { + "id": 892, + "types": [ + 2, + 17 + ] + }, + { + "id": 893, + "types": [ + 12, + 17 + ] + }, + { + "id": 894, + "types": [ + 13 + ] + }, + { + "id": 895, + "types": [ + 16 + ] + }, + { + "id": 896, + "types": [ + 15 + ] + }, + { + "id": 897, + "types": [ + 8 + ] + }, + { + "id": 898, + "types": [ + 12, + 14 + ] + }, + { + "id": 906, + "types": [ + 12 + ] + }, + { + "id": 907, + "types": [ + 12 + ] + }, + { + "id": 908, + "types": [ + 12, + 17 + ] + }, + { + "id": 909, + "types": [ + 10 + ] + }, + { + "id": 910, + "types": [ + 10 + ] + }, + { + "id": 911, + "types": [ + 10, + 8 + ] + }, + { + "id": 912, + "types": [ + 11 + ] + }, + { + "id": 913, + "types": [ + 11 + ] + }, + { + "id": 914, + "types": [ + 11, + 2 + ] + }, + { + "id": 915, + "types": [ + 1 + ] + }, + { + "id": 916, + "types": [ + 1 + ] + }, + { + "id": 917, + "types": [ + 1 + ] + }, + { + "id": 918, + "types": [ + 7 + ] + }, + { + "id": 919, + "types": [ + 7 + ] + }, + { + "id": 920, + "types": [ + 7 + ] + }, + { + "id": 921, + "types": [ + 7, + 17 + ] + }, + { + "id": 922, + "types": [ + 7 + ] + }, + { + "id": 923, + "types": [ + 7, + 14 + ] + }, + { + "id": 924, + "types": [ + 8 + ] + }, + { + "id": 925, + "types": [ + 8 + ] + }, + { + "id": 926, + "types": [ + 14 + ] + }, + { + "id": 927, + "types": [ + 14 + ] + }, + { + "id": 928, + "types": [ + 1, + 14 + ] + }, + { + "id": 929, + "types": [ + 11 + ] + }, + { + "id": 930, + "types": [ + 11 + ] + }, + { + "id": 931, + "types": [ + 11 + ] + }, + { + "id": 932, + "types": [ + 11, + 14 + ] + }, + { + "id": 933, + "types": [ + 11 + ] + }, + { + "id": 934, + "types": [ + 11 + ] + }, + { + "id": 935, + "types": [ + 12, + 1 + ] + }, + { + "id": 936, + "types": [ + 12, + 1 + ] + }, + { + "id": 937, + "types": [ + 12, + 1 + ] + }, + { + "id": 938, + "types": [ + 12 + ] + }, + { + "id": 939, + "types": [ + 12, + 10 + ] + }, + { + "id": 940, + "types": [ + 13 + ] + }, + { + "id": 941, + "types": [ + 13 + ] + }, + { + "id": 942, + "types": [ + 9, + 4 + ] + }, + { + "id": 943, + "types": [ + 9, + 4 + ] + }, + { + "id": 944, + "types": [ + 9 + ] + }, + { + "id": 945, + "types": [ + 1 + ] + }, + { + "id": 946, + "types": [ + 1 + ] + }, + { + "id": 947, + "types": [ + 15 + ] + }, + { + "id": 948, + "types": [ + 15 + ] + }, + { + "id": 949, + "types": [ + 16, + 15 + ] + }, + { + "id": 950, + "types": [ + 16, + 15 + ] + }, + { + "id": 951, + "types": [ + 16, + 15 + ] + }, + { + "id": 952, + "types": [ + 16, + 11 + ] + }, + { + "id": 953, + "types": [ + 16, + 1 + ] + }, + { + "id": 954, + "types": [ + 13 + ] + }, + { + "id": 955, + "types": [ + 13, + 2 + ] + }, + { + "id": 956, + "types": [ + 13, + 2 + ] + }, + { + "id": 957, + "types": [ + 13, + 3 + ] + }, + { + "id": 958, + "types": [ + 13, + 3 + ] + }, + { + "id": 959, + "types": [ + 3, + 17 + ] + }, + { + "id": 960, + "types": [ + 1, + 3 + ] + }, + { + "id": 961, + "types": [ + 3, + 2 + ] + }, + { + "id": 962, + "types": [ + 6 + ] + }, + { + "id": 963, + "types": [ + 6 + ] + }, + { + "id": 964, + "types": [ + 6 + ] + }, + { + "id": 965, + "types": [ + 6 + ] + }, + { + "id": 966, + "types": [ + 6, + 4 + ] + }, + { + "id": 967, + "types": [ + 6, + 4 + ] + }, + { + "id": 968, + "types": [ + 4, + 1 + ] + }, + { + "id": 969, + "types": [ + 4, + 1 + ] + }, + { + "id": 970, + "types": [ + 18 + ] + }, + { + "id": 971, + "types": [ + 18 + ] + }, + { + "id": 972, + "types": [ + 17 + ] + }, + { + "id": 973, + "types": [ + 17 + ] + }, + { + "id": 974, + "types": [ + 12, + 8 + ] + }, + { + "id": 975, + "types": [ + 12, + 8 + ] + }, + { + "id": 976, + "types": [ + 8 + ] + }, + { + "id": 977, + "types": [ + 8, + 9 + ] + }, + { + "id": 978, + "types": [ + 5, + 2 + ] + }, + { + "id": 979, + "types": [ + 12, + 17 + ] + }, + { + "id": 981, + "types": [ + 13, + 5 + ] + }, + { + "id": 982, + "types": [ + 18, + 14 + ] + }, + { + "id": 983, + "types": [ + 8, + 18 + ] + }, + { + "id": 984, + "types": [ + 7, + 2 + ] + }, + { + "id": 985, + "types": [ + 16, + 17 + ] + }, + { + "id": 986, + "types": [ + 5, + 9 + ] + }, + { + "id": 987, + "types": [] + }, + { + "id": 988, + "types": [ + 10, + 4 + ] + }, + { + "id": 989, + "types": [ + 2, + 13 + ] + }, + { + "id": 990, + "types": [ + 17, + 3 + ] + }, + { + "id": 991, + "types": [ + 6, + 13 + ] + }, + { + "id": 992, + "types": [ + 15, + 11 + ] + }, + { + "id": 993, + "types": [ + 18, + 2 + ] + }, + { + "id": 994, + "types": [ + 17, + 5 + ] + }, + { + "id": 995, + "types": [ + 17, + 15 + ] + }, + { + "id": 996, + "types": [ + 17, + 12 + ] + }, + { + "id": 997, + "types": [ + 17, + 10 + ] + }, + { + "id": 998, + "types": [ + 16, + 2 + ] + }, + { + "id": 999, + "types": [ + 16, + 13 + ] + }, + { + "id": 1000, + "types": [ + 18, + 9 + ] + }, + { + "id": 1001, + "types": [ + 18, + 9 + ] + }, + { + "id": 1002, + "types": [ + 18, + 9 + ] + }, + { + "id": 1003, + "types": [ + 10 + ] + }, + { + "id": 1004, + "types": [ + 10, + 14 + ] + }, + { + "id": 1005, + "types": [ + 10, + 8 + ] + }, + { + "id": 1006, + "types": [ + 5, + 12 + ] + }, + { + "id": 1007, + "types": [ + 5, + 12 + ] + }, + { + "id": 1008, + "types": [ + 17, + 9 + ] + }, + { + "id": 1009, + "types": [ + 4, + 5 + ] + }, + { + "id": 1010, + "types": [ + 2, + 8 + ] + }, + { + "id": 1011, + "types": [ + 12, + 14 + ] + }, + { + "id": 1012, + "types": [ + 11, + 16 + ] + }, + { + "id": 1013, + "types": [ + 12, + 16 + ] + }, + { + "id": 1014, + "types": [ + 4, + 2 + ] + }, + { + "id": 1015, + "types": [ + 4, + 14 + ] + }, + { + "id": 1016, + "types": [ + 4, + 18 + ] + }, + { + "id": 1017, + "types": [ + 12 + ] + }, + { + "id": 1018, + "types": [ + 9, + 16 + ] + }, + { + "id": 1019, + "types": [ + 12, + 16 + ] + }, + { + "id": 1020, + "types": [ + 10, + 16 + ] + }, + { + "id": 1021, + "types": [ + 13, + 16 + ] + }, + { + "id": 1022, + "types": [ + 6, + 14 + ] + }, + { + "id": 1023, + "types": [ + 9, + 14 + ] + }, + { + "id": 1024, + "types": [ + 1 + ] + }, + { + "id": 1025, + "types": [ + 4, + 8 + ] + }, + { + "id": 2000, + "types": [ + 11 + ] + }, + { + "id": 2001, + "types": [ + 11 + ] + }, + { + "id": 2002, + "types": [ + 11, + 16 + ] + }, + { + "id": 2003, + "types": [ + 10 + ] + }, + { + "id": 2004, + "types": [ + 10 + ] + }, + { + "id": 2005, + "types": [ + 10 + ] + }, + { + "id": 2006, + "types": [ + 12, + 6 + ] + }, + { + "id": 2007, + "types": [ + 12, + 6 + ] + }, + { + "id": 2008, + "types": [ + 12, + 6 + ] + }, + { + "id": 4000, + "types": [ + 12, + 8 + ] + }, + { + "id": 4001, + "types": [ + 12, + 8 + ] + }, + { + "id": 4002, + "types": [ + 12, + 11 + ] + }, + { + "id": 4003, + "types": [ + 12, + 10 + ] + }, + { + "id": 4004, + "types": [ + 12, + 6 + ] + }, + { + "id": 4848, + "types": [ + 8, + 16 + ] + }, + { + "id": 4851, + "types": [ + 18 + ] + }, + { + "id": 4852, + "types": [ + 18, + 9 + ] + }, + { + "id": 4858, + "types": [ + 9, + 16 + ] + }, + { + "id": 4888, + "types": [ + 14, + 18 + ] + }, + { + "id": 5858, + "types": [ + 6 + ] + }, + { + "id": 6666, + "types": [ + 11 + ] + }, + { + "id": 7000, + "types": [ + 16, + 14 + ] + }, + { + "id": 8800, + "types": [ + 9, + 16 + ] + }, + { + "id": 8801, + "types": [ + 13 + ] + }, + { + "id": 8802, + "types": [ + 8, + 4 + ] + }, + { + "id": 8803, + "types": [ + 8, + 4 + ] + }, + { + "id": 8804, + "types": [ + 16, + 10 + ] + }, + { + "id": 8805, + "types": [ + 11, + 2 + ] + }, + { + "id": 8922, + "types": [ + 2, + 11 + ] + }, + { + "id": 10001, + "types": [ + 14 + ] + }, + { + "id": 10002, + "types": [ + 14 + ] + }, + { + "id": 10003, + "types": [ + 14 + ] + }, + { + "id": 10004, + "types": [ + 7, + 5 + ] + }, + { + "id": 10005, + "types": [ + 7, + 9 + ] + }, + { + "id": 10006, + "types": [ + 12, + 3 + ] + }, + { + "id": 10007, + "types": [ + 8, + 16 + ] + }, + { + "id": 10008, + "types": [ + 13, + 10 + ] + }, + { + "id": 10009, + "types": [ + 13, + 11 + ] + }, + { + "id": 10010, + "types": [ + 13, + 15 + ] + }, + { + "id": 10011, + "types": [ + 13, + 3 + ] + }, + { + "id": 10012, + "types": [ + 13, + 12 + ] + }, + { + "id": 10013, + "types": [ + 10 + ] + }, + { + "id": 10014, + "types": [ + 11 + ] + }, + { + "id": 10015, + "types": [ + 15 + ] + }, + { + "id": 10016, + "types": [ + 11 + ] + }, + { + "id": 10017, + "types": [ + 10, + 14 + ] + }, + { + "id": 10018, + "types": [ + 1, + 2 + ] + }, + { + "id": 10019, + "types": [ + 3 + ] + }, + { + "id": 10020, + "types": [ + 13, + 3 + ] + }, + { + "id": 10021, + "types": [ + 5, + 3 + ] + }, + { + "id": 10022, + "types": [ + 16, + 15 + ] + }, + { + "id": 10023, + "types": [ + 16, + 15 + ] + }, + { + "id": 10024, + "types": [ + 11, + 2 + ] + }, + { + "id": 10025, + "types": [ + 14 + ] + }, + { + "id": 10026, + "types": [ + 9, + 8 + ] + }, + { + "id": 10027, + "types": [ + 8, + 12 + ] + }, + { + "id": 10028, + "types": [ + 8, + 12 + ] + }, + { + "id": 10029, + "types": [ + 8, + 12 + ] + }, + { + "id": 10030, + "types": [ + 8, + 12 + ] + }, + { + "id": 10031, + "types": [ + 8, + 12 + ] + }, + { + "id": 10032, + "types": [ + 8, + 12 + ] + }, + { + "id": 10033, + "types": [ + 12, + 4 + ] + }, + { + "id": 10034, + "types": [ + 10, + 16 + ] + }, + { + "id": 10035, + "types": [ + 10, + 3 + ] + }, + { + "id": 10036, + "types": [ + 11 + ] + }, + { + "id": 10037, + "types": [ + 14 + ] + }, + { + "id": 10038, + "types": [ + 8, + 4 + ] + }, + { + "id": 10039, + "types": [ + 1 + ] + }, + { + "id": 10040, + "types": [ + 7, + 3 + ] + }, + { + "id": 10041, + "types": [ + 11, + 17 + ] + }, + { + "id": 10042, + "types": [ + 6, + 3 + ] + }, + { + "id": 10043, + "types": [ + 14, + 2 + ] + }, + { + "id": 10044, + "types": [ + 14 + ] + }, + { + "id": 10045, + "types": [ + 13, + 16 + ] + }, + { + "id": 10046, + "types": [ + 7, + 9 + ] + }, + { + "id": 10047, + "types": [ + 7, + 2 + ] + }, + { + "id": 10048, + "types": [ + 17, + 10 + ] + }, + { + "id": 10049, + "types": [ + 6, + 17 + ] + }, + { + "id": 10050, + "types": [ + 10, + 2 + ] + }, + { + "id": 10051, + "types": [ + 14, + 18 + ] + }, + { + "id": 10052, + "types": [ + 9, + 18 + ] + }, + { + "id": 10053, + "types": [ + 9 + ] + }, + { + "id": 10054, + "types": [ + 2, + 14 + ] + }, + { + "id": 10055, + "types": [ + 13 + ] + }, + { + "id": 10056, + "types": [ + 8 + ] + }, + { + "id": 10057, + "types": [ + 17 + ] + }, + { + "id": 10058, + "types": [ + 16, + 5 + ] + }, + { + "id": 10059, + "types": [ + 2, + 9 + ] + }, + { + "id": 10060, + "types": [ + 12, + 15 + ] + }, + { + "id": 10061, + "types": [ + 18 + ] + }, + { + "id": 10062, + "types": [ + 16, + 14 + ] + }, + { + "id": 10063, + "types": [ + 16, + 14 + ] + }, + { + "id": 10064, + "types": [ + 11, + 5 + ] + }, + { + "id": 10065, + "types": [ + 12, + 16 + ] + }, + { + "id": 10066, + "types": [ + 17, + 8 + ] + }, + { + "id": 10067, + "types": [ + 16, + 18 + ] + }, + { + "id": 10068, + "types": [ + 14, + 2 + ] + }, + { + "id": 10069, + "types": [ + 1, + 18 + ] + }, + { + "id": 10070, + "types": [ + 11, + 17 + ] + }, + { + "id": 10071, + "types": [ + 11, + 14 + ] + }, + { + "id": 10072, + "types": [ + 9, + 5 + ] + }, + { + "id": 10073, + "types": [ + 1, + 3 + ] + }, + { + "id": 10074, + "types": [ + 15 + ] + }, + { + "id": 10075, + "types": [ + 6, + 18 + ] + }, + { + "id": 10076, + "types": [ + 9, + 14 + ] + }, + { + "id": 10077, + "types": [ + 11 + ] + }, + { + "id": 10078, + "types": [ + 5, + 10 + ] + }, + { + "id": 10079, + "types": [ + 16, + 3 + ] + }, + { + "id": 10080, + "types": [ + 13 + ] + }, + { + "id": 10081, + "types": [ + 13 + ] + }, + { + "id": 10082, + "types": [ + 13 + ] + }, + { + "id": 10083, + "types": [ + 13 + ] + }, + { + "id": 10084, + "types": [ + 13 + ] + }, + { + "id": 10085, + "types": [ + 13 + ] + }, + { + "id": 10086, + "types": [ + 14, + 17 + ] + }, + { + "id": 10087, + "types": [ + 10, + 5 + ] + }, + { + "id": 10088, + "types": [ + 1, + 2 + ] + }, + { + "id": 10089, + "types": [ + 16, + 3 + ] + }, + { + "id": 10090, + "types": [ + 7, + 4 + ] + }, + { + "id": 10091, + "types": [ + 17, + 1 + ] + }, + { + "id": 10092, + "types": [ + 17, + 1 + ] + }, + { + "id": 10093, + "types": [ + 17, + 1 + ] + }, + { + "id": 10094, + "types": [ + 13 + ] + }, + { + "id": 10095, + "types": [ + 13 + ] + }, + { + "id": 10096, + "types": [ + 13 + ] + }, + { + "id": 10097, + "types": [ + 13 + ] + }, + { + "id": 10098, + "types": [ + 13 + ] + }, + { + "id": 10099, + "types": [ + 13 + ] + }, + { + "id": 10100, + "types": [ + 13, + 14 + ] + }, + { + "id": 10101, + "types": [ + 15, + 9 + ] + }, + { + "id": 10102, + "types": [ + 15, + 9 + ] + }, + { + "id": 10103, + "types": [ + 15 + ] + }, + { + "id": 10104, + "types": [ + 15, + 18 + ] + }, + { + "id": 10105, + "types": [ + 5, + 9 + ] + }, + { + "id": 10106, + "types": [ + 5, + 9 + ] + }, + { + "id": 10107, + "types": [ + 17 + ] + }, + { + "id": 10108, + "types": [ + 17 + ] + }, + { + "id": 10109, + "types": [ + 6, + 13 + ] + }, + { + "id": 10110, + "types": [ + 6, + 13 + ] + }, + { + "id": 10111, + "types": [ + 6, + 13 + ] + }, + { + "id": 10112, + "types": [ + 4, + 17 + ] + }, + { + "id": 10113, + "types": [ + 4, + 17 + ] + }, + { + "id": 10114, + "types": [ + 12, + 16 + ] + }, + { + "id": 10115, + "types": [ + 10, + 8 + ] + }, + { + "id": 10116, + "types": [ + 11, + 17 + ] + }, + { + "id": 10117, + "types": [ + 11, + 17 + ] + }, + { + "id": 10118, + "types": [ + 16, + 5 + ] + }, + { + "id": 10119, + "types": [ + 16, + 5 + ] + }, + { + "id": 10120, + "types": [ + 16, + 5 + ] + }, + { + "id": 10121, + "types": [ + 1 + ] + }, + { + "id": 10122, + "types": [ + 7, + 13 + ] + }, + { + "id": 10123, + "types": [ + 13, + 3 + ] + }, + { + "id": 10124, + "types": [ + 14, + 3 + ] + }, + { + "id": 10125, + "types": [ + 8, + 3 + ] + }, + { + "id": 10126, + "types": [ + 6 + ] + }, + { + "id": 10127, + "types": [ + 11 + ] + }, + { + "id": 10128, + "types": [ + 12 + ] + }, + { + "id": 10129, + "types": [ + 4, + 10 + ] + }, + { + "id": 10130, + "types": [ + 6, + 3 + ] + }, + { + "id": 10131, + "types": [ + 6, + 3 + ] + }, + { + "id": 10132, + "types": [ + 6, + 3 + ] + }, + { + "id": 10133, + "types": [ + 6, + 3 + ] + }, + { + "id": 10134, + "types": [ + 6, + 3 + ] + }, + { + "id": 10135, + "types": [ + 6, + 3 + ] + }, + { + "id": 10136, + "types": [ + 6, + 3 + ] + }, + { + "id": 10137, + "types": [ + 6, + 3 + ] + }, + { + "id": 10138, + "types": [ + 6, + 3 + ] + }, + { + "id": 10139, + "types": [ + 6, + 3 + ] + }, + { + "id": 10140, + "types": [ + 6, + 3 + ] + }, + { + "id": 10141, + "types": [ + 6, + 3 + ] + }, + { + "id": 10142, + "types": [ + 6, + 3 + ] + }, + { + "id": 10143, + "types": [ + 8, + 18 + ] + }, + { + "id": 10144, + "types": [ + 15 + ] + }, + { + "id": 10145, + "types": [ + 8, + 18 + ] + }, + { + "id": 10146, + "types": [ + 16, + 2 + ] + }, + { + "id": 10147, + "types": [ + 9, + 18 + ] + }, + { + "id": 10148, + "types": [ + 13 + ] + }, + { + "id": 10149, + "types": [ + 10, + 8 + ] + }, + { + "id": 10150, + "types": [ + 7, + 18 + ] + }, + { + "id": 10151, + "types": [ + 6 + ] + }, + { + "id": 10152, + "types": [ + 6 + ] + }, + { + "id": 10153, + "types": [ + 11, + 7 + ] + }, + { + "id": 10154, + "types": [ + 13, + 9 + ] + }, + { + "id": 10155, + "types": [ + 14, + 9 + ] + }, + { + "id": 10156, + "types": [ + 14, + 8 + ] + }, + { + "id": 10157, + "types": [ + 14, + 16 + ] + }, + { + "id": 10158, + "types": [ + 14, + 3 + ] + }, + { + "id": 10159, + "types": [ + 9, + 16 + ] + }, + { + "id": 10160, + "types": [ + 9 + ] + }, + { + "id": 10161, + "types": [ + 14 + ] + }, + { + "id": 10162, + "types": [ + 14, + 18 + ] + }, + { + "id": 10163, + "types": [ + 14 + ] + }, + { + "id": 10164, + "types": [ + 4, + 14 + ] + }, + { + "id": 10165, + "types": [ + 2 + ] + }, + { + "id": 10166, + "types": [ + 4, + 18 + ] + }, + { + "id": 10167, + "types": [ + 15, + 14 + ] + }, + { + "id": 10168, + "types": [ + 8 + ] + }, + { + "id": 10169, + "types": [ + 17, + 1 + ] + }, + { + "id": 10170, + "types": [ + 17, + 1 + ] + }, + { + "id": 10171, + "types": [ + 15 + ] + }, + { + "id": 10172, + "types": [ + 15 + ] + }, + { + "id": 10173, + "types": [ + 5, + 8 + ] + }, + { + "id": 10174, + "types": [ + 5, + 9 + ] + }, + { + "id": 10175, + "types": [ + 2, + 9 + ] + }, + { + "id": 10176, + "types": [ + 18, + 9 + ] + }, + { + "id": 10177, + "types": [ + 3, + 2 + ] + }, + { + "id": 10178, + "types": [ + 3, + 14 + ] + }, + { + "id": 10179, + "types": [ + 17, + 3 + ] + }, + { + "id": 10180, + "types": [ + 14, + 15 + ] + }, + { + "id": 10181, + "types": [ + 14, + 8 + ] + }, + { + "id": 10272, + "types": [ + 15, + 10 + ] + }, + { + "id": 10401, + "types": [ + 3, + 2 + ] + }, + { + "id": 10409, + "types": [ + 1, + 8 + ] + }, + { + "id": 10410, + "types": [ + 13 + ] + }, + { + "id": 10411, + "types": [ + 1, + 8 + ] + }, + { + "id": 10412, + "types": [ + 13, + 12 + ] + }, + { + "id": 10413, + "types": [ + 10, + 8 + ] + }, + { + "id": 10414, + "types": [ + 4, + 2 + ] + }, + { + "id": 10415, + "types": [ + 16, + 9 + ] + }, + { + "id": 10416, + "types": [ + 11, + 17 + ] + }, + { + "id": 10417, + "types": [ + 17, + 4 + ] + }, + { + "id": 10418, + "types": [ + 4, + 14 + ] + }, + { + "id": 10419, + "types": [ + 15, + 10 + ] + }, + { + "id": 10420, + "types": [ + 16, + 9 + ] + }, + { + "id": 10421, + "types": [ + 13, + 12 + ] + }, + { + "id": 10422, + "types": [ + 12, + 2 + ] + }, + { + "id": 10423, + "types": [ + 14, + 3 + ] + }, + { + "id": 10424, + "types": [ + 15, + 6 + ] + }, + { + "id": 10425, + "types": [ + 10, + 6 + ] + }, + { + "id": 10426, + "types": [ + 4, + 2 + ] + }, + { + "id": 10427, + "types": [ + 1, + 5 + ] + }, + { + "id": 10428, + "types": [ + 1, + 14 + ] + }, + { + "id": 10429, + "types": [ + 11 + ] + }, + { + "id": 10430, + "types": [ + 11, + 8 + ] + }, + { + "id": 10431, + "types": [ + 11, + 8 + ] + }, + { + "id": 10432, + "types": [ + 11, + 16 + ] + }, + { + "id": 10433, + "types": [ + 17, + 4 + ] + }, + { + "id": 10434, + "types": [ + 7, + 6 + ] + }, + { + "id": 10435, + "types": [ + 18, + 3 + ] + }, + { + "id": 10436, + "types": [ + 18, + 3 + ] + }, + { + "id": 10437, + "types": [ + 9, + 16 + ] + }, + { + "id": 10438, + "types": [ + 12, + 2 + ] + }, + { + "id": 10440, + "types": [ + 10, + 6 + ] + }, + { + "id": 10507, + "types": [ + 2 + ] + }, + { + "id": 10508, + "types": [ + 18 + ] + }, + { + "id": 10509, + "types": [ + 2, + 9 + ] + }, + { + "id": 10510, + "types": [ + 5 + ] + }, + { + "id": 10511, + "types": [ + 15 + ] + }, + { + "id": 10512, + "types": [ + 10 + ] + }, + { + "id": 10515, + "types": [ + 2, + 9 + ] + }, + { + "id": 10666, + "types": [ + 15 + ] + }, + { + "id": 10667, + "types": [ + 9, + 18 + ] + }, + { + "id": 10668, + "types": [ + 1 + ] + }, + { + "id": 10669, + "types": [ + 14 + ] + }, + { + "id": 10670, + "types": [ + 12, + 4 + ] + }, + { + "id": 10687, + "types": [ + 11 + ] + }, + { + "id": 10900, + "types": [ + 13, + 11 + ] + }, + { + "id": 10901, + "types": [ + 16, + 3 + ] + }, + { + "id": 10902, + "types": [ + 14, + 18 + ] + }, + { + "id": 10903, + "types": [ + 6 + ] + }, + { + "id": 10904, + "types": [ + 14, + 3 + ] + }, + { + "id": 10905, + "types": [ + 17 + ] + }, + { + "id": 11000, + "types": [ + 2 + ] + }, + { + "id": 11001, + "types": [ + 4, + 5 + ] + }, + { + "id": 11002, + "types": [ + 2, + 11 + ] + }, + { + "id": 11003, + "types": [ + 2, + 10 + ] + }, + { + "id": 11004, + "types": [ + 11 + ] + } +] \ No newline at end of file diff --git a/pokemonduel/data/stat_types.json b/pokemonduel/data/stat_types.json new file mode 100644 index 0000000..a00b26d --- /dev/null +++ b/pokemonduel/data/stat_types.json @@ -0,0 +1,58 @@ +[ + { + "id": 1, + "damage_class_id": "", + "identifier": "hp", + "is_battle_only": 0, + "game_index": 1 + }, + { + "id": 2, + "damage_class_id": 2, + "identifier": "attack", + "is_battle_only": 0, + "game_index": 2 + }, + { + "id": 3, + "damage_class_id": 2, + "identifier": "defense", + "is_battle_only": 0, + "game_index": 3 + }, + { + "id": 4, + "damage_class_id": 3, + "identifier": "special-attack", + "is_battle_only": 0, + "game_index": 5 + }, + { + "id": 5, + "damage_class_id": 3, + "identifier": "special-defense", + "is_battle_only": 0, + "game_index": 6 + }, + { + "id": 6, + "damage_class_id": "", + "identifier": "speed", + "is_battle_only": 0, + "game_index": 4 + }, + { + "id": 7, + "damage_class_id": "", + "identifier": "accuracy", + "is_battle_only": 1, + "game_index": "" + }, + { + "id": 8, + "damage_class_id": "", + "identifier": "evasion", + "is_battle_only": 1, + "game_index": "" + } +] \ No newline at end of file diff --git a/pokemonduel/data/type_effectiveness.json b/pokemonduel/data/type_effectiveness.json new file mode 100644 index 0000000..df44f7d --- /dev/null +++ b/pokemonduel/data/type_effectiveness.json @@ -0,0 +1,1712 @@ +[ + { + "damage_type_id": 1, + "target_type_id": 1, + "damage_factor": 100 + }, + { + "damage_type_id": 1, + "target_type_id": 2, + "damage_factor": 100 + }, + { + "damage_type_id": 1, + "target_type_id": 3, + "damage_factor": 100 + }, + { + "damage_type_id": 1, + "target_type_id": 4, + "damage_factor": 100 + }, + { + "damage_type_id": 1, + "target_type_id": 5, + "damage_factor": 100 + }, + { + "damage_type_id": 1, + "target_type_id": 6, + "damage_factor": 50 + }, + { + "damage_type_id": 1, + "target_type_id": 7, + "damage_factor": 100 + }, + { + "damage_type_id": 1, + "target_type_id": 8, + "damage_factor": 0 + }, + { + "damage_type_id": 1, + "target_type_id": 9, + "damage_factor": 50 + }, + { + "damage_type_id": 1, + "target_type_id": 10, + "damage_factor": 100 + }, + { + "damage_type_id": 1, + "target_type_id": 11, + "damage_factor": 100 + }, + { + "damage_type_id": 1, + "target_type_id": 12, + "damage_factor": 100 + }, + { + "damage_type_id": 1, + "target_type_id": 13, + "damage_factor": 100 + }, + { + "damage_type_id": 1, + "target_type_id": 14, + "damage_factor": 100 + }, + { + "damage_type_id": 1, + "target_type_id": 15, + "damage_factor": 100 + }, + { + "damage_type_id": 1, + "target_type_id": 16, + "damage_factor": 100 + }, + { + "damage_type_id": 1, + "target_type_id": 17, + "damage_factor": 100 + }, + { + "damage_type_id": 1, + "target_type_id": 18, + "damage_factor": 100 + }, + { + "damage_type_id": 2, + "target_type_id": 1, + "damage_factor": 200 + }, + { + "damage_type_id": 2, + "target_type_id": 2, + "damage_factor": 100 + }, + { + "damage_type_id": 2, + "target_type_id": 3, + "damage_factor": 50 + }, + { + "damage_type_id": 2, + "target_type_id": 4, + "damage_factor": 50 + }, + { + "damage_type_id": 2, + "target_type_id": 5, + "damage_factor": 100 + }, + { + "damage_type_id": 2, + "target_type_id": 6, + "damage_factor": 200 + }, + { + "damage_type_id": 2, + "target_type_id": 7, + "damage_factor": 50 + }, + { + "damage_type_id": 2, + "target_type_id": 8, + "damage_factor": 0 + }, + { + "damage_type_id": 2, + "target_type_id": 9, + "damage_factor": 200 + }, + { + "damage_type_id": 2, + "target_type_id": 10, + "damage_factor": 100 + }, + { + "damage_type_id": 2, + "target_type_id": 11, + "damage_factor": 100 + }, + { + "damage_type_id": 2, + "target_type_id": 12, + "damage_factor": 100 + }, + { + "damage_type_id": 2, + "target_type_id": 13, + "damage_factor": 100 + }, + { + "damage_type_id": 2, + "target_type_id": 14, + "damage_factor": 50 + }, + { + "damage_type_id": 2, + "target_type_id": 15, + "damage_factor": 200 + }, + { + "damage_type_id": 2, + "target_type_id": 16, + "damage_factor": 100 + }, + { + "damage_type_id": 2, + "target_type_id": 17, + "damage_factor": 200 + }, + { + "damage_type_id": 2, + "target_type_id": 18, + "damage_factor": 50 + }, + { + "damage_type_id": 3, + "target_type_id": 1, + "damage_factor": 100 + }, + { + "damage_type_id": 3, + "target_type_id": 2, + "damage_factor": 200 + }, + { + "damage_type_id": 3, + "target_type_id": 3, + "damage_factor": 100 + }, + { + "damage_type_id": 3, + "target_type_id": 4, + "damage_factor": 100 + }, + { + "damage_type_id": 3, + "target_type_id": 5, + "damage_factor": 100 + }, + { + "damage_type_id": 3, + "target_type_id": 6, + "damage_factor": 50 + }, + { + "damage_type_id": 3, + "target_type_id": 7, + "damage_factor": 200 + }, + { + "damage_type_id": 3, + "target_type_id": 8, + "damage_factor": 100 + }, + { + "damage_type_id": 3, + "target_type_id": 9, + "damage_factor": 50 + }, + { + "damage_type_id": 3, + "target_type_id": 10, + "damage_factor": 100 + }, + { + "damage_type_id": 3, + "target_type_id": 11, + "damage_factor": 100 + }, + { + "damage_type_id": 3, + "target_type_id": 12, + "damage_factor": 200 + }, + { + "damage_type_id": 3, + "target_type_id": 13, + "damage_factor": 50 + }, + { + "damage_type_id": 3, + "target_type_id": 14, + "damage_factor": 100 + }, + { + "damage_type_id": 3, + "target_type_id": 15, + "damage_factor": 100 + }, + { + "damage_type_id": 3, + "target_type_id": 16, + "damage_factor": 100 + }, + { + "damage_type_id": 3, + "target_type_id": 17, + "damage_factor": 100 + }, + { + "damage_type_id": 3, + "target_type_id": 18, + "damage_factor": 100 + }, + { + "damage_type_id": 4, + "target_type_id": 1, + "damage_factor": 100 + }, + { + "damage_type_id": 4, + "target_type_id": 2, + "damage_factor": 100 + }, + { + "damage_type_id": 4, + "target_type_id": 3, + "damage_factor": 100 + }, + { + "damage_type_id": 4, + "target_type_id": 4, + "damage_factor": 50 + }, + { + "damage_type_id": 4, + "target_type_id": 5, + "damage_factor": 50 + }, + { + "damage_type_id": 4, + "target_type_id": 6, + "damage_factor": 50 + }, + { + "damage_type_id": 4, + "target_type_id": 7, + "damage_factor": 100 + }, + { + "damage_type_id": 4, + "target_type_id": 8, + "damage_factor": 50 + }, + { + "damage_type_id": 4, + "target_type_id": 9, + "damage_factor": 0 + }, + { + "damage_type_id": 4, + "target_type_id": 10, + "damage_factor": 100 + }, + { + "damage_type_id": 4, + "target_type_id": 11, + "damage_factor": 100 + }, + { + "damage_type_id": 4, + "target_type_id": 12, + "damage_factor": 200 + }, + { + "damage_type_id": 4, + "target_type_id": 13, + "damage_factor": 100 + }, + { + "damage_type_id": 4, + "target_type_id": 14, + "damage_factor": 100 + }, + { + "damage_type_id": 4, + "target_type_id": 15, + "damage_factor": 100 + }, + { + "damage_type_id": 4, + "target_type_id": 16, + "damage_factor": 100 + }, + { + "damage_type_id": 4, + "target_type_id": 17, + "damage_factor": 100 + }, + { + "damage_type_id": 4, + "target_type_id": 18, + "damage_factor": 200 + }, + { + "damage_type_id": 5, + "target_type_id": 1, + "damage_factor": 100 + }, + { + "damage_type_id": 5, + "target_type_id": 2, + "damage_factor": 100 + }, + { + "damage_type_id": 5, + "target_type_id": 3, + "damage_factor": 0 + }, + { + "damage_type_id": 5, + "target_type_id": 4, + "damage_factor": 200 + }, + { + "damage_type_id": 5, + "target_type_id": 5, + "damage_factor": 100 + }, + { + "damage_type_id": 5, + "target_type_id": 6, + "damage_factor": 200 + }, + { + "damage_type_id": 5, + "target_type_id": 7, + "damage_factor": 50 + }, + { + "damage_type_id": 5, + "target_type_id": 8, + "damage_factor": 100 + }, + { + "damage_type_id": 5, + "target_type_id": 9, + "damage_factor": 200 + }, + { + "damage_type_id": 5, + "target_type_id": 10, + "damage_factor": 200 + }, + { + "damage_type_id": 5, + "target_type_id": 11, + "damage_factor": 100 + }, + { + "damage_type_id": 5, + "target_type_id": 12, + "damage_factor": 50 + }, + { + "damage_type_id": 5, + "target_type_id": 13, + "damage_factor": 200 + }, + { + "damage_type_id": 5, + "target_type_id": 14, + "damage_factor": 100 + }, + { + "damage_type_id": 5, + "target_type_id": 15, + "damage_factor": 100 + }, + { + "damage_type_id": 5, + "target_type_id": 16, + "damage_factor": 100 + }, + { + "damage_type_id": 5, + "target_type_id": 17, + "damage_factor": 100 + }, + { + "damage_type_id": 5, + "target_type_id": 18, + "damage_factor": 100 + }, + { + "damage_type_id": 6, + "target_type_id": 1, + "damage_factor": 100 + }, + { + "damage_type_id": 6, + "target_type_id": 2, + "damage_factor": 50 + }, + { + "damage_type_id": 6, + "target_type_id": 3, + "damage_factor": 200 + }, + { + "damage_type_id": 6, + "target_type_id": 4, + "damage_factor": 100 + }, + { + "damage_type_id": 6, + "target_type_id": 5, + "damage_factor": 50 + }, + { + "damage_type_id": 6, + "target_type_id": 6, + "damage_factor": 100 + }, + { + "damage_type_id": 6, + "target_type_id": 7, + "damage_factor": 200 + }, + { + "damage_type_id": 6, + "target_type_id": 8, + "damage_factor": 100 + }, + { + "damage_type_id": 6, + "target_type_id": 9, + "damage_factor": 50 + }, + { + "damage_type_id": 6, + "target_type_id": 10, + "damage_factor": 200 + }, + { + "damage_type_id": 6, + "target_type_id": 11, + "damage_factor": 100 + }, + { + "damage_type_id": 6, + "target_type_id": 12, + "damage_factor": 100 + }, + { + "damage_type_id": 6, + "target_type_id": 13, + "damage_factor": 100 + }, + { + "damage_type_id": 6, + "target_type_id": 14, + "damage_factor": 100 + }, + { + "damage_type_id": 6, + "target_type_id": 15, + "damage_factor": 200 + }, + { + "damage_type_id": 6, + "target_type_id": 16, + "damage_factor": 100 + }, + { + "damage_type_id": 6, + "target_type_id": 17, + "damage_factor": 100 + }, + { + "damage_type_id": 6, + "target_type_id": 18, + "damage_factor": 100 + }, + { + "damage_type_id": 7, + "target_type_id": 1, + "damage_factor": 100 + }, + { + "damage_type_id": 7, + "target_type_id": 2, + "damage_factor": 50 + }, + { + "damage_type_id": 7, + "target_type_id": 3, + "damage_factor": 50 + }, + { + "damage_type_id": 7, + "target_type_id": 4, + "damage_factor": 50 + }, + { + "damage_type_id": 7, + "target_type_id": 5, + "damage_factor": 100 + }, + { + "damage_type_id": 7, + "target_type_id": 6, + "damage_factor": 100 + }, + { + "damage_type_id": 7, + "target_type_id": 7, + "damage_factor": 100 + }, + { + "damage_type_id": 7, + "target_type_id": 8, + "damage_factor": 50 + }, + { + "damage_type_id": 7, + "target_type_id": 9, + "damage_factor": 50 + }, + { + "damage_type_id": 7, + "target_type_id": 10, + "damage_factor": 50 + }, + { + "damage_type_id": 7, + "target_type_id": 11, + "damage_factor": 100 + }, + { + "damage_type_id": 7, + "target_type_id": 12, + "damage_factor": 200 + }, + { + "damage_type_id": 7, + "target_type_id": 13, + "damage_factor": 100 + }, + { + "damage_type_id": 7, + "target_type_id": 14, + "damage_factor": 200 + }, + { + "damage_type_id": 7, + "target_type_id": 15, + "damage_factor": 100 + }, + { + "damage_type_id": 7, + "target_type_id": 16, + "damage_factor": 100 + }, + { + "damage_type_id": 7, + "target_type_id": 17, + "damage_factor": 200 + }, + { + "damage_type_id": 7, + "target_type_id": 18, + "damage_factor": 50 + }, + { + "damage_type_id": 8, + "target_type_id": 1, + "damage_factor": 0 + }, + { + "damage_type_id": 8, + "target_type_id": 2, + "damage_factor": 100 + }, + { + "damage_type_id": 8, + "target_type_id": 3, + "damage_factor": 100 + }, + { + "damage_type_id": 8, + "target_type_id": 4, + "damage_factor": 100 + }, + { + "damage_type_id": 8, + "target_type_id": 5, + "damage_factor": 100 + }, + { + "damage_type_id": 8, + "target_type_id": 6, + "damage_factor": 100 + }, + { + "damage_type_id": 8, + "target_type_id": 7, + "damage_factor": 100 + }, + { + "damage_type_id": 8, + "target_type_id": 8, + "damage_factor": 200 + }, + { + "damage_type_id": 8, + "target_type_id": 9, + "damage_factor": 100 + }, + { + "damage_type_id": 8, + "target_type_id": 10, + "damage_factor": 100 + }, + { + "damage_type_id": 8, + "target_type_id": 11, + "damage_factor": 100 + }, + { + "damage_type_id": 8, + "target_type_id": 12, + "damage_factor": 100 + }, + { + "damage_type_id": 8, + "target_type_id": 13, + "damage_factor": 100 + }, + { + "damage_type_id": 8, + "target_type_id": 14, + "damage_factor": 200 + }, + { + "damage_type_id": 8, + "target_type_id": 15, + "damage_factor": 100 + }, + { + "damage_type_id": 8, + "target_type_id": 16, + "damage_factor": 100 + }, + { + "damage_type_id": 8, + "target_type_id": 17, + "damage_factor": 50 + }, + { + "damage_type_id": 8, + "target_type_id": 18, + "damage_factor": 100 + }, + { + "damage_type_id": 9, + "target_type_id": 1, + "damage_factor": 100 + }, + { + "damage_type_id": 9, + "target_type_id": 2, + "damage_factor": 100 + }, + { + "damage_type_id": 9, + "target_type_id": 3, + "damage_factor": 100 + }, + { + "damage_type_id": 9, + "target_type_id": 4, + "damage_factor": 100 + }, + { + "damage_type_id": 9, + "target_type_id": 5, + "damage_factor": 100 + }, + { + "damage_type_id": 9, + "target_type_id": 6, + "damage_factor": 200 + }, + { + "damage_type_id": 9, + "target_type_id": 7, + "damage_factor": 100 + }, + { + "damage_type_id": 9, + "target_type_id": 8, + "damage_factor": 100 + }, + { + "damage_type_id": 9, + "target_type_id": 9, + "damage_factor": 50 + }, + { + "damage_type_id": 9, + "target_type_id": 10, + "damage_factor": 50 + }, + { + "damage_type_id": 9, + "target_type_id": 11, + "damage_factor": 50 + }, + { + "damage_type_id": 9, + "target_type_id": 12, + "damage_factor": 100 + }, + { + "damage_type_id": 9, + "target_type_id": 13, + "damage_factor": 50 + }, + { + "damage_type_id": 9, + "target_type_id": 14, + "damage_factor": 100 + }, + { + "damage_type_id": 9, + "target_type_id": 15, + "damage_factor": 200 + }, + { + "damage_type_id": 9, + "target_type_id": 16, + "damage_factor": 100 + }, + { + "damage_type_id": 9, + "target_type_id": 17, + "damage_factor": 100 + }, + { + "damage_type_id": 9, + "target_type_id": 18, + "damage_factor": 200 + }, + { + "damage_type_id": 10, + "target_type_id": 1, + "damage_factor": 100 + }, + { + "damage_type_id": 10, + "target_type_id": 2, + "damage_factor": 100 + }, + { + "damage_type_id": 10, + "target_type_id": 3, + "damage_factor": 100 + }, + { + "damage_type_id": 10, + "target_type_id": 4, + "damage_factor": 100 + }, + { + "damage_type_id": 10, + "target_type_id": 5, + "damage_factor": 100 + }, + { + "damage_type_id": 10, + "target_type_id": 6, + "damage_factor": 50 + }, + { + "damage_type_id": 10, + "target_type_id": 7, + "damage_factor": 200 + }, + { + "damage_type_id": 10, + "target_type_id": 8, + "damage_factor": 100 + }, + { + "damage_type_id": 10, + "target_type_id": 9, + "damage_factor": 200 + }, + { + "damage_type_id": 10, + "target_type_id": 10, + "damage_factor": 50 + }, + { + "damage_type_id": 10, + "target_type_id": 11, + "damage_factor": 50 + }, + { + "damage_type_id": 10, + "target_type_id": 12, + "damage_factor": 200 + }, + { + "damage_type_id": 10, + "target_type_id": 13, + "damage_factor": 100 + }, + { + "damage_type_id": 10, + "target_type_id": 14, + "damage_factor": 100 + }, + { + "damage_type_id": 10, + "target_type_id": 15, + "damage_factor": 200 + }, + { + "damage_type_id": 10, + "target_type_id": 16, + "damage_factor": 50 + }, + { + "damage_type_id": 10, + "target_type_id": 17, + "damage_factor": 100 + }, + { + "damage_type_id": 10, + "target_type_id": 18, + "damage_factor": 100 + }, + { + "damage_type_id": 11, + "target_type_id": 1, + "damage_factor": 100 + }, + { + "damage_type_id": 11, + "target_type_id": 2, + "damage_factor": 100 + }, + { + "damage_type_id": 11, + "target_type_id": 3, + "damage_factor": 100 + }, + { + "damage_type_id": 11, + "target_type_id": 4, + "damage_factor": 100 + }, + { + "damage_type_id": 11, + "target_type_id": 5, + "damage_factor": 200 + }, + { + "damage_type_id": 11, + "target_type_id": 6, + "damage_factor": 200 + }, + { + "damage_type_id": 11, + "target_type_id": 7, + "damage_factor": 100 + }, + { + "damage_type_id": 11, + "target_type_id": 8, + "damage_factor": 100 + }, + { + "damage_type_id": 11, + "target_type_id": 9, + "damage_factor": 100 + }, + { + "damage_type_id": 11, + "target_type_id": 10, + "damage_factor": 200 + }, + { + "damage_type_id": 11, + "target_type_id": 11, + "damage_factor": 50 + }, + { + "damage_type_id": 11, + "target_type_id": 12, + "damage_factor": 50 + }, + { + "damage_type_id": 11, + "target_type_id": 13, + "damage_factor": 100 + }, + { + "damage_type_id": 11, + "target_type_id": 14, + "damage_factor": 100 + }, + { + "damage_type_id": 11, + "target_type_id": 15, + "damage_factor": 100 + }, + { + "damage_type_id": 11, + "target_type_id": 16, + "damage_factor": 50 + }, + { + "damage_type_id": 11, + "target_type_id": 17, + "damage_factor": 100 + }, + { + "damage_type_id": 11, + "target_type_id": 18, + "damage_factor": 100 + }, + { + "damage_type_id": 12, + "target_type_id": 1, + "damage_factor": 100 + }, + { + "damage_type_id": 12, + "target_type_id": 2, + "damage_factor": 100 + }, + { + "damage_type_id": 12, + "target_type_id": 3, + "damage_factor": 50 + }, + { + "damage_type_id": 12, + "target_type_id": 4, + "damage_factor": 50 + }, + { + "damage_type_id": 12, + "target_type_id": 5, + "damage_factor": 200 + }, + { + "damage_type_id": 12, + "target_type_id": 6, + "damage_factor": 200 + }, + { + "damage_type_id": 12, + "target_type_id": 7, + "damage_factor": 50 + }, + { + "damage_type_id": 12, + "target_type_id": 8, + "damage_factor": 100 + }, + { + "damage_type_id": 12, + "target_type_id": 9, + "damage_factor": 50 + }, + { + "damage_type_id": 12, + "target_type_id": 10, + "damage_factor": 50 + }, + { + "damage_type_id": 12, + "target_type_id": 11, + "damage_factor": 200 + }, + { + "damage_type_id": 12, + "target_type_id": 12, + "damage_factor": 50 + }, + { + "damage_type_id": 12, + "target_type_id": 13, + "damage_factor": 100 + }, + { + "damage_type_id": 12, + "target_type_id": 14, + "damage_factor": 100 + }, + { + "damage_type_id": 12, + "target_type_id": 15, + "damage_factor": 100 + }, + { + "damage_type_id": 12, + "target_type_id": 16, + "damage_factor": 50 + }, + { + "damage_type_id": 12, + "target_type_id": 17, + "damage_factor": 100 + }, + { + "damage_type_id": 12, + "target_type_id": 18, + "damage_factor": 100 + }, + { + "damage_type_id": 13, + "target_type_id": 1, + "damage_factor": 100 + }, + { + "damage_type_id": 13, + "target_type_id": 2, + "damage_factor": 100 + }, + { + "damage_type_id": 13, + "target_type_id": 3, + "damage_factor": 200 + }, + { + "damage_type_id": 13, + "target_type_id": 4, + "damage_factor": 100 + }, + { + "damage_type_id": 13, + "target_type_id": 5, + "damage_factor": 0 + }, + { + "damage_type_id": 13, + "target_type_id": 6, + "damage_factor": 100 + }, + { + "damage_type_id": 13, + "target_type_id": 7, + "damage_factor": 100 + }, + { + "damage_type_id": 13, + "target_type_id": 8, + "damage_factor": 100 + }, + { + "damage_type_id": 13, + "target_type_id": 9, + "damage_factor": 100 + }, + { + "damage_type_id": 13, + "target_type_id": 10, + "damage_factor": 100 + }, + { + "damage_type_id": 13, + "target_type_id": 11, + "damage_factor": 200 + }, + { + "damage_type_id": 13, + "target_type_id": 12, + "damage_factor": 50 + }, + { + "damage_type_id": 13, + "target_type_id": 13, + "damage_factor": 50 + }, + { + "damage_type_id": 13, + "target_type_id": 14, + "damage_factor": 100 + }, + { + "damage_type_id": 13, + "target_type_id": 15, + "damage_factor": 100 + }, + { + "damage_type_id": 13, + "target_type_id": 16, + "damage_factor": 50 + }, + { + "damage_type_id": 13, + "target_type_id": 17, + "damage_factor": 100 + }, + { + "damage_type_id": 13, + "target_type_id": 18, + "damage_factor": 100 + }, + { + "damage_type_id": 14, + "target_type_id": 1, + "damage_factor": 100 + }, + { + "damage_type_id": 14, + "target_type_id": 2, + "damage_factor": 200 + }, + { + "damage_type_id": 14, + "target_type_id": 3, + "damage_factor": 100 + }, + { + "damage_type_id": 14, + "target_type_id": 4, + "damage_factor": 200 + }, + { + "damage_type_id": 14, + "target_type_id": 5, + "damage_factor": 100 + }, + { + "damage_type_id": 14, + "target_type_id": 6, + "damage_factor": 100 + }, + { + "damage_type_id": 14, + "target_type_id": 7, + "damage_factor": 100 + }, + { + "damage_type_id": 14, + "target_type_id": 8, + "damage_factor": 100 + }, + { + "damage_type_id": 14, + "target_type_id": 9, + "damage_factor": 50 + }, + { + "damage_type_id": 14, + "target_type_id": 10, + "damage_factor": 100 + }, + { + "damage_type_id": 14, + "target_type_id": 11, + "damage_factor": 100 + }, + { + "damage_type_id": 14, + "target_type_id": 12, + "damage_factor": 100 + }, + { + "damage_type_id": 14, + "target_type_id": 13, + "damage_factor": 100 + }, + { + "damage_type_id": 14, + "target_type_id": 14, + "damage_factor": 50 + }, + { + "damage_type_id": 14, + "target_type_id": 15, + "damage_factor": 100 + }, + { + "damage_type_id": 14, + "target_type_id": 16, + "damage_factor": 100 + }, + { + "damage_type_id": 14, + "target_type_id": 17, + "damage_factor": 0 + }, + { + "damage_type_id": 14, + "target_type_id": 18, + "damage_factor": 100 + }, + { + "damage_type_id": 15, + "target_type_id": 1, + "damage_factor": 100 + }, + { + "damage_type_id": 15, + "target_type_id": 2, + "damage_factor": 100 + }, + { + "damage_type_id": 15, + "target_type_id": 3, + "damage_factor": 200 + }, + { + "damage_type_id": 15, + "target_type_id": 4, + "damage_factor": 100 + }, + { + "damage_type_id": 15, + "target_type_id": 5, + "damage_factor": 200 + }, + { + "damage_type_id": 15, + "target_type_id": 6, + "damage_factor": 100 + }, + { + "damage_type_id": 15, + "target_type_id": 7, + "damage_factor": 100 + }, + { + "damage_type_id": 15, + "target_type_id": 8, + "damage_factor": 100 + }, + { + "damage_type_id": 15, + "target_type_id": 9, + "damage_factor": 50 + }, + { + "damage_type_id": 15, + "target_type_id": 10, + "damage_factor": 50 + }, + { + "damage_type_id": 15, + "target_type_id": 11, + "damage_factor": 50 + }, + { + "damage_type_id": 15, + "target_type_id": 12, + "damage_factor": 200 + }, + { + "damage_type_id": 15, + "target_type_id": 13, + "damage_factor": 100 + }, + { + "damage_type_id": 15, + "target_type_id": 14, + "damage_factor": 100 + }, + { + "damage_type_id": 15, + "target_type_id": 15, + "damage_factor": 50 + }, + { + "damage_type_id": 15, + "target_type_id": 16, + "damage_factor": 200 + }, + { + "damage_type_id": 15, + "target_type_id": 17, + "damage_factor": 100 + }, + { + "damage_type_id": 15, + "target_type_id": 18, + "damage_factor": 100 + }, + { + "damage_type_id": 16, + "target_type_id": 1, + "damage_factor": 100 + }, + { + "damage_type_id": 16, + "target_type_id": 2, + "damage_factor": 100 + }, + { + "damage_type_id": 16, + "target_type_id": 3, + "damage_factor": 100 + }, + { + "damage_type_id": 16, + "target_type_id": 4, + "damage_factor": 100 + }, + { + "damage_type_id": 16, + "target_type_id": 5, + "damage_factor": 100 + }, + { + "damage_type_id": 16, + "target_type_id": 6, + "damage_factor": 100 + }, + { + "damage_type_id": 16, + "target_type_id": 7, + "damage_factor": 100 + }, + { + "damage_type_id": 16, + "target_type_id": 8, + "damage_factor": 100 + }, + { + "damage_type_id": 16, + "target_type_id": 9, + "damage_factor": 50 + }, + { + "damage_type_id": 16, + "target_type_id": 10, + "damage_factor": 100 + }, + { + "damage_type_id": 16, + "target_type_id": 11, + "damage_factor": 100 + }, + { + "damage_type_id": 16, + "target_type_id": 12, + "damage_factor": 100 + }, + { + "damage_type_id": 16, + "target_type_id": 13, + "damage_factor": 100 + }, + { + "damage_type_id": 16, + "target_type_id": 14, + "damage_factor": 100 + }, + { + "damage_type_id": 16, + "target_type_id": 15, + "damage_factor": 100 + }, + { + "damage_type_id": 16, + "target_type_id": 16, + "damage_factor": 200 + }, + { + "damage_type_id": 16, + "target_type_id": 17, + "damage_factor": 100 + }, + { + "damage_type_id": 16, + "target_type_id": 18, + "damage_factor": 0 + }, + { + "damage_type_id": 17, + "target_type_id": 1, + "damage_factor": 100 + }, + { + "damage_type_id": 17, + "target_type_id": 2, + "damage_factor": 50 + }, + { + "damage_type_id": 17, + "target_type_id": 3, + "damage_factor": 100 + }, + { + "damage_type_id": 17, + "target_type_id": 4, + "damage_factor": 100 + }, + { + "damage_type_id": 17, + "target_type_id": 5, + "damage_factor": 100 + }, + { + "damage_type_id": 17, + "target_type_id": 6, + "damage_factor": 100 + }, + { + "damage_type_id": 17, + "target_type_id": 7, + "damage_factor": 100 + }, + { + "damage_type_id": 17, + "target_type_id": 8, + "damage_factor": 200 + }, + { + "damage_type_id": 17, + "target_type_id": 9, + "damage_factor": 100 + }, + { + "damage_type_id": 17, + "target_type_id": 10, + "damage_factor": 100 + }, + { + "damage_type_id": 17, + "target_type_id": 11, + "damage_factor": 100 + }, + { + "damage_type_id": 17, + "target_type_id": 12, + "damage_factor": 100 + }, + { + "damage_type_id": 17, + "target_type_id": 13, + "damage_factor": 100 + }, + { + "damage_type_id": 17, + "target_type_id": 14, + "damage_factor": 200 + }, + { + "damage_type_id": 17, + "target_type_id": 15, + "damage_factor": 100 + }, + { + "damage_type_id": 17, + "target_type_id": 16, + "damage_factor": 100 + }, + { + "damage_type_id": 17, + "target_type_id": 17, + "damage_factor": 50 + }, + { + "damage_type_id": 17, + "target_type_id": 18, + "damage_factor": 50 + }, + { + "damage_type_id": 18, + "target_type_id": 1, + "damage_factor": 100 + }, + { + "damage_type_id": 18, + "target_type_id": 2, + "damage_factor": 200 + }, + { + "damage_type_id": 18, + "target_type_id": 3, + "damage_factor": 100 + }, + { + "damage_type_id": 18, + "target_type_id": 4, + "damage_factor": 50 + }, + { + "damage_type_id": 18, + "target_type_id": 5, + "damage_factor": 100 + }, + { + "damage_type_id": 18, + "target_type_id": 6, + "damage_factor": 100 + }, + { + "damage_type_id": 18, + "target_type_id": 7, + "damage_factor": 100 + }, + { + "damage_type_id": 18, + "target_type_id": 8, + "damage_factor": 100 + }, + { + "damage_type_id": 18, + "target_type_id": 9, + "damage_factor": 50 + }, + { + "damage_type_id": 18, + "target_type_id": 10, + "damage_factor": 50 + }, + { + "damage_type_id": 18, + "target_type_id": 11, + "damage_factor": 100 + }, + { + "damage_type_id": 18, + "target_type_id": 12, + "damage_factor": 100 + }, + { + "damage_type_id": 18, + "target_type_id": 13, + "damage_factor": 100 + }, + { + "damage_type_id": 18, + "target_type_id": 14, + "damage_factor": 100 + }, + { + "damage_type_id": 18, + "target_type_id": 15, + "damage_factor": 100 + }, + { + "damage_type_id": 18, + "target_type_id": 16, + "damage_factor": 200 + }, + { + "damage_type_id": 18, + "target_type_id": 17, + "damage_factor": 200 + }, + { + "damage_type_id": 18, + "target_type_id": 18, + "damage_factor": 100 + }, + { + "damage_type_id": 10002, + "target_type_id": 1, + "damage_factor": 0 + }, + { + "damage_type_id": 10002, + "target_type_id": 2, + "damage_factor": 100 + }, + { + "damage_type_id": 10002, + "target_type_id": 3, + "damage_factor": 100 + }, + { + "damage_type_id": 10002, + "target_type_id": 4, + "damage_factor": 100 + }, + { + "damage_type_id": 10002, + "target_type_id": 5, + "damage_factor": 100 + }, + { + "damage_type_id": 10002, + "target_type_id": 6, + "damage_factor": 100 + }, + { + "damage_type_id": 10002, + "target_type_id": 7, + "damage_factor": 100 + }, + { + "damage_type_id": 10002, + "target_type_id": 8, + "damage_factor": 200 + }, + { + "damage_type_id": 10002, + "target_type_id": 9, + "damage_factor": 100 + }, + { + "damage_type_id": 10002, + "target_type_id": 10, + "damage_factor": 100 + }, + { + "damage_type_id": 10002, + "target_type_id": 11, + "damage_factor": 100 + }, + { + "damage_type_id": 10002, + "target_type_id": 12, + "damage_factor": 100 + }, + { + "damage_type_id": 10002, + "target_type_id": 13, + "damage_factor": 100 + }, + { + "damage_type_id": 10002, + "target_type_id": 14, + "damage_factor": 200 + }, + { + "damage_type_id": 10002, + "target_type_id": 15, + "damage_factor": 100 + }, + { + "damage_type_id": 10002, + "target_type_id": 16, + "damage_factor": 100 + }, + { + "damage_type_id": 10002, + "target_type_id": 17, + "damage_factor": 100 + }, + { + "damage_type_id": 10002, + "target_type_id": 18, + "damage_factor": 100 + } +] \ No newline at end of file diff --git a/pokemonduel/enums.py b/pokemonduel/enums.py new file mode 100644 index 0000000..89599d7 --- /dev/null +++ b/pokemonduel/enums.py @@ -0,0 +1,369 @@ +from enum import IntEnum + + +class Ability(IntEnum): + """Helper enum for ability ids to make them more readable.""" + STENCH = 1 + DRIZZLE = 2 + SPEED_BOOST = 3 + BATTLE_ARMOR = 4 + STURDY = 5 + DAMP = 6 + LIMBER = 7 + SAND_VEIL = 8 + STATIC = 9 + VOLT_ABSORB = 10 + WATER_ABSORB = 11 + OBLIVIOUS = 12 + CLOUD_NINE = 13 + COMPOUND_EYES = 14 + INSOMNIA = 15 + COLOR_CHANGE = 16 + IMMUNITY = 17 + FLASH_FIRE = 18 + SHIELD_DUST = 19 + OWN_TEMPO = 20 + SUCTION_CUPS = 21 + INTIMIDATE = 22 + SHADOW_TAG = 23 + ROUGH_SKIN = 24 + WONDER_GUARD = 25 + LEVITATE = 26 + EFFECT_SPORE = 27 + SYNCHRONIZE = 28 + CLEAR_BODY = 29 + NATURAL_CURE = 30 + LIGHTNING_ROD = 31 + SERENE_GRACE = 32 + SWIFT_SWIM = 33 + CHLOROPHYLL = 34 + ILLUMINATE = 35 + TRACE = 36 + HUGE_POWER = 37 + POISON_POINT = 38 + INNER_FOCUS = 39 + MAGMA_ARMOR = 40 + WATER_VEIL = 41 + MAGNET_PULL = 42 + SOUNDPROOF = 43 + RAIN_DISH = 44 + SAND_STREAM = 45 + PRESSURE = 46 + THICK_FAT = 47 + EARLY_BIRD = 48 + FLAME_BODY = 49 + RUN_AWAY = 50 + KEEN_EYE = 51 + HYPER_CUTTER = 52 + PICKUP = 53 + TRUANT = 54 + HUSTLE = 55 + CUTE_CHARM = 56 + PLUS = 57 + MINUS = 58 + FORECAST = 59 + STICKY_HOLD = 60 + SHED_SKIN = 61 + GUTS = 62 + MARVEL_SCALE = 63 + LIQUID_OOZE = 64 + OVERGROW = 65 + BLAZE = 66 + TORRENT = 67 + SWARM = 68 + ROCK_HEAD = 69 + DROUGHT = 70 + ARENA_TRAP = 71 + VITAL_SPIRIT = 72 + WHITE_SMOKE = 73 + PURE_POWER = 74 + SHELL_ARMOR = 75 + AIR_LOCK = 76 + TANGLED_FEET = 77 + MOTOR_DRIVE = 78 + RIVALRY = 79 + STEADFAST = 80 + SNOW_CLOAK = 81 + GLUTTONY = 82 + ANGER_POINT = 83 + UNBURDEN = 84 + HEATPROOF = 85 + SIMPLE = 86 + DRY_SKIN = 87 + DOWNLOAD = 88 + IRON_FIST = 89 + POISON_HEAL = 90 + ADAPTABILITY = 91 + SKILL_LINK = 92 + HYDRATION = 93 + SOLAR_POWER = 94 + QUICK_FEET = 95 + NORMALIZE = 96 + SNIPER = 97 + MAGIC_GUARD = 98 + NO_GUARD = 99 + STALL = 100 + TECHNICIAN = 101 + LEAF_GUARD = 102 + KLUTZ = 103 + MOLD_BREAKER = 104 + SUPER_LUCK = 105 + AFTERMATH = 106 + ANTICIPATION = 107 + FOREWARN = 108 + UNAWARE = 109 + TINTED_LENS = 110 + FILTER = 111 + SLOW_START = 112 + SCRAPPY = 113 + STORM_DRAIN = 114 + ICE_BODY = 115 + SOLID_ROCK = 116 + SNOW_WARNING = 117 + HONEY_GATHER = 118 + FRISK = 119 + RECKLESS = 120 + MULTITYPE = 121 + FLOWER_GIFT = 122 + BAD_DREAMS = 123 + PICKPOCKET = 124 + SHEER_FORCE = 125 + CONTRARY = 126 + UNNERVE = 127 + DEFIANT = 128 + DEFEATIST = 129 + CURSED_BODY = 130 + HEALER = 131 + FRIEND_GUARD = 132 + WEAK_ARMOR = 133 + HEAVY_METAL = 134 + LIGHT_METAL = 135 + MULTISCALE = 136 + TOXIC_BOOST = 137 + FLARE_BOOST = 138 + HARVEST = 139 + TELEPATHY = 140 + MOODY = 141 + OVERCOAT = 142 + POISON_TOUCH = 143 + REGENERATOR = 144 + BIG_PECKS = 145 + SAND_RUSH = 146 + WONDER_SKIN = 147 + ANALYTIC = 148 + ILLUSION = 149 + IMPOSTER = 150 + INFILTRATOR = 151 + MUMMY = 152 + MOXIE = 153 + JUSTIFIED = 154 + RATTLED = 155 + MAGIC_BOUNCE = 156 + SAP_SIPPER = 157 + PRANKSTER = 158 + SAND_FORCE = 159 + IRON_BARBS = 160 + ZEN_MODE = 161 + VICTORY_STAR = 162 + TURBOBLAZE = 163 + TERAVOLT = 164 + AROMA_VEIL = 165 + FLOWER_VEIL = 166 + CHEEK_POUCH = 167 + PROTEAN = 168 + FUR_COAT = 169 + MAGICIAN = 170 + BULLETPROOF = 171 + COMPETITIVE = 172 + STRONG_JAW = 173 + REFRIGERATE = 174 + SWEET_VEIL = 175 + STANCE_CHANGE = 176 + GALE_WINGS = 177 + MEGA_LAUNCHER = 178 + GRASS_PELT = 179 + SYMBIOSIS = 180 + TOUGH_CLAWS = 181 + PIXILATE = 182 + GOOEY = 183 + AERILATE = 184 + PARENTAL_BOND = 185 + DARK_AURA = 186 + FAIRY_AURA = 187 + AURA_BREAK = 188 + PRIMORDIAL_SEA = 189 + DESOLATE_LAND = 190 + DELTA_STREAM = 191 + STAMINA = 192 + WIMP_OUT = 193 + EMERGENCY_EXIT = 194 + WATER_COMPACTION = 195 + MERCILESS = 196 + SHIELDS_DOWN = 197 + STAKEOUT = 198 + WATER_BUBBLE = 199 + STEELWORKER = 200 + BERSERK = 201 + SLUSH_RUSH = 202 + LONG_REACH = 203 + LIQUID_VOICE = 204 + TRIAGE = 205 + GALVANIZE = 206 + SURGE_SURFER = 207 + SCHOOLING = 208 + DISGUISE = 209 + BATTLE_BOND = 210 + POWER_CONSTRUCT = 211 + CORROSION = 212 + COMATOSE = 213 + QUEENLY_MAJESTY = 214 + INNARDS_OUT = 215 + DANCER = 216 + BATTERY = 217 + FLUFFY = 218 + DAZZLING = 219 + SOUL_HEART = 220 + TANGLING_HAIR = 221 + RECEIVER = 222 + POWER_OF_ALCHEMY = 223 + BEAST_BOOST = 224 + RKS_SYSTEM = 225 + ELECTRIC_SURGE = 226 + PSYCHIC_SURGE = 227 + MISTY_SURGE = 228 + GRASSY_SURGE = 229 + FULL_METAL_BODY = 230 + SHADOW_SHIELD = 231 + PRISM_ARMOR = 232 + NEUROFORCE = 233 + LIBERO = 234 + MIRROR_ARMOR = 235 + COTTON_DOWN = 236 + BALL_FETCH = 237 + STEAM_ENGINE = 238 + RIPEN = 239 + SAND_SPIT = 240 + GULP_MISSILE = 241 + PROPELLER_TAIL = 242 + PUNK_ROCK = 243 + STEELY_SPIRIT = 244 + PERISH_BODY = 245 + SCREEN_CLEANER = 246 + WANDERING_SPIRIT = 247 + NEUTRALIZING_GAS = 248 + ICE_SCALES = 249 + POWER_SPOT = 250 + ICE_FACE = 251 + HUNGER_SWITCH = 252 + STALWART = 253 + INTREPID_SWORD = 254 + DAUNTLESS_SHIELD = 255 + PASTEL_VEIL = 256 + GORILLA_TACTICS = 257 + QUICK_DRAW = 258 + MIMICRY = 259 + TRANSISTOR = 260 + DRAGONS_MAW = 261 + CHILLING_NEIGH = 262 + GRIM_NEIGH = 263 + AS_ONE_SHADOW = 264 + AS_ONE_ICE = 265 + CURIOUS_MEDICINE = 266 + UNSEEN_FIST = 267 + LINGERING_AROMA = 268 + SEED_SOWER = 269 + THERMAL_EXCHANGE = 270 + ANGER_SHELL = 271 + PURIFYING_SALT = 272 + WELL_BAKED_BODY = 273 + WIND_RIDER = 274 + GUARD_DOG = 275 + ROCKY_PAYLOAD = 276 + WIND_POWER = 277 + ZERO_TO_HERO = 278 + COMMANDER = 279 + ELECTROMORPHOSIS = 280 + PROTOSYNTHESIS = 281 + QUARK_DRIVE = 282 + GOOD_AS_GOLD = 283 + VESSEL_OF_RUIN = 284 + SWORD_OF_RUIN = 285 + TABLETS_OF_RUIN = 286 + BEADS_OF_RUIN = 287 + ORICHALCUM_PULSE = 288 + HADRON_ENGINE = 289 + OPPORTUNIST = 290 + CUD_CHEW = 291 + SHARPNESS = 292 + SUPREME_OVERLORD = 293 + COSTAR = 294 + TOXIC_DEBRIS = 295 + ARMOR_TAIL = 296 + EARTH_EATER = 297 + MYCELIUM_MIGHT = 298 + HOSPITALITY = 299 + MINDS_EYE = 300 + EMBODY_ASPECT_TEAL = 301 + EMBODY_ASPECT_HEARTHFLAME = 302 + EMBODY_ASPECT_WELLSPRING = 303 + EMBODY_ASPECT_CORNERSTONE = 304 + TOXIC_CHAIN = 305 + SUPERSWEET_SYRUP = 306 + TERA_SHIFT = 307 + TERA_SHELL = 308 + TERAFORM_ZERO = 309 + POISON_PUPPETEER = 310 + + @property + def pretty_name(self): + """Formats the ability name for outputs.""" + return self.name.lower().replace("_", " ") # pylint: disable=E1101 + + +class DamageClass(IntEnum): + """Helper enum for damage classes to make them more readable.""" + STATUS = 1 + PHYSICAL = 2 + SPECIAL = 3 + + +class ElementType(IntEnum): + """Helper enum for element types to make them more readable.""" + NORMAL = 1 + FIGHTING = 2 + FLYING = 3 + POISON = 4 + GROUND = 5 + ROCK = 6 + BUG = 7 + GHOST = 8 + STEEL = 9 + FIRE = 10 + WATER = 11 + GRASS = 12 + ELECTRIC = 13 + PSYCHIC = 14 + ICE = 15 + DRAGON = 16 + DARK = 17 + FAIRY = 18 + TYPELESS = 19 + + +class MoveTarget(IntEnum): + """Helper enum for move targets to make them more readable.""" + SPECIFIC_MOVE = 1 + SELECTED_POKEMON_ME_FIRST = 2 + ALLY = 3 + USERS_FIELD = 4 + USER_OR_ALLY = 5 + OPPONENTS_FIELD = 6 + USER = 7 + RANDOM_OPPONENT = 8 + ALL_OTHER_POKEMON = 9 + SELECTED_POKEMON = 10 + ALL_OPPONENTS = 11 + ENTIRE_FIELD = 12 + USER_AND_ALLIES = 13 + ALL_POKEMON = 14 + ALL_ALLIES = 15 diff --git a/pokemonduel/info.json b/pokemonduel/info.json new file mode 100644 index 0000000..3eab75a --- /dev/null +++ b/pokemonduel/info.json @@ -0,0 +1,12 @@ +{ + "author" : ["Flame442"], + "install_msg" : "Thanks for installing Pokemon Duels. Use `[p]help pokemonduel` to get started.\nThis cog comes with bundled data.", + "name" : "PokemonDuel", + "short" : "Battle in a Pokemon Duel with another member of your server.", + "requirements" : [], + "description" : "Battle in a Pokemon Duel with another member of your server. Supports all moves, abilities, and pokemon from generation 8, with partial item support and partial support for generation 9 additions. Also supports the inverse type effectiveness format. Run [p]pokemonduel to play!", + "tags" : ["fun", "games", "pokemon"], + "min_bot_version": "3.5.0.dev1", + "min_python_version": [3, 6, 0], + "end_user_data_statement": "This cog stores user ids in order to track your party of pokemon." +} \ No newline at end of file diff --git a/pokemonduel/misc.py b/pokemonduel/misc.py new file mode 100644 index 0000000..cead2d9 --- /dev/null +++ b/pokemonduel/misc.py @@ -0,0 +1,853 @@ +import random +from .enums import Ability, ElementType + + +class ExpiringEffect(): + """ + Some effect that has a specific amount of time it is active. + + turns_to_expire can be None, in which case this effect never expires. + """ + def __init__(self, turns_to_expire: int): + self._remaining_turns = turns_to_expire + + def active(self): + """Returns True if this effect is still active, False otherwise.""" + if self._remaining_turns is None: + return True + return bool(self._remaining_turns) + + def next_turn(self): + """ + Progresses this effect for a turn. + + Returns True if the effect just ended. + """ + if self._remaining_turns is None: + return False + if self.active(): + self._remaining_turns -= 1 + return not self.active() + return False + + def set_turns(self, turns_to_expire): + """Set the amount of turns until this effect expires.""" + self._remaining_turns = turns_to_expire + + +class Weather(ExpiringEffect): + """ + The current weather of the battlefield. + + Options: + -hail + -sandstorm + -h-rain + -rain + -h-sun + -sun + -h-wind + """ + def __init__(self, battle): + super().__init__(0) + self._weather_type = "" + self.battle = battle + + def _expire_weather(self): + """Clear the current weather and update Castform forms.""" + self._weather_type = "" + for poke in (self.battle.trainer1.current_pokemon, self.battle.trainer2.current_pokemon): + if poke is None: + continue + # Forecast + if poke.ability() == Ability.FORECAST and poke._name in ("Castform-snowy", "Castform-rainy", "Castform-sunny"): + if poke.form("Castform"): + poke.type_ids = [ElementType.NORMAL] + + def next_turn(self): + """Progresses the weather a turn.""" + if super().next_turn(): + self._expire_weather() + return True + return False + + def recheck_ability_weather(self): + """Checks if strong weather effects from a pokemon with a weather ability need to be removed.""" + maintain_weather = False + for poke in (self.battle.trainer1.current_pokemon, self.battle.trainer2.current_pokemon): + if poke is None: + continue + if self._weather_type == "h-wind" and poke.ability() == Ability.DELTA_STREAM: + maintain_weather = True + if self._weather_type == "h-sun" and poke.ability() == Ability.DESOLATE_LAND: + maintain_weather = True + if self._weather_type == "h-rain" and poke.ability() == Ability.PRIMORDIAL_SEA: + maintain_weather = True + + if self._weather_type in ("h-wind", "h-sun", "h-rain") and not maintain_weather: + self._expire_weather() + return True + return False + + def get(self): + """Get the current weather type.""" + for poke in (self.battle.trainer1.current_pokemon, self.battle.trainer2.current_pokemon): + if poke is None: + continue + if poke.ability() in (Ability.CLOUD_NINE, Ability.AIR_LOCK): + return "" + return self._weather_type + + def set(self, weather: str, pokemon): + """ + Set the weather, lasting a certain number of turns. + + Returns a formatted message indicating any weather change. + """ + msg = "" + turns = None + element = None + castform = None + if self._weather_type == weather: + return "" + if weather == "hail": + if self._weather_type in ("h-rain", "h-sun", "h-wind"): + return "" + if pokemon.held_item == "icy-rock": + turns = 8 + else: + turns = 5 + msg += "It starts to hail!\n" + element = ElementType.ICE + castform = "Castform-snowy" + elif weather == "sandstorm": + if self._weather_type in ("h-rain", "h-sun", "h-wind"): + return "" + if pokemon.held_item == "smooth-rock": + turns = 8 + else: + turns = 5 + msg += "A sandstorm is brewing up!\n" + element = ElementType.NORMAL + castform = "Castform" + elif weather == "rain": + if self._weather_type in ("h-rain", "h-sun", "h-wind"): + return "" + if pokemon.held_item == "damp-rock": + turns = 8 + else: + turns = 5 + msg += "It starts to rain!\n" + element = ElementType.WATER + castform = "Castform-rainy" + elif weather == "sun": + if self._weather_type in ("h-rain", "h-sun", "h-wind"): + return "" + if pokemon.held_item == "heat-rock": + turns = 8 + else: + turns = 5 + msg += "The sunlight is strong!\n" + element = ElementType.FIRE + castform = "Castform-sunny" + elif weather == "h-rain": + msg += "Heavy rain begins to fall!\n" + element = ElementType.WATER + castform = "Castform-rainy" + elif weather == "h-sun": + msg += "The sunlight is extremely harsh!\n" + element = ElementType.FIRE + castform = "Castform-sunny" + elif weather == "h-wind": + msg += "The winds are extremely strong!\n" + element = ElementType.NORMAL + castform = "Castform" + else: + raise ValueError("unexpected weather") + + # Forecast + t = ElementType(element).name.lower() + for poke in (self.battle.trainer1.current_pokemon, self.battle.trainer2.current_pokemon): + if poke is None: + continue + if poke.ability() == Ability.FORECAST and poke._name != castform: + if poke.form(castform): + poke.type_ids = [element] + msg += f"{poke.name} transformed into a {t} type using its forecast!\n" + + self._weather_type = weather + self._remaining_turns = turns + return msg + + +class LockedMove(ExpiringEffect): + """A multi-turn move that a pokemon is locked into.""" + def __init__(self, move, turns_to_expire: int): + super().__init__(turns_to_expire) + self.move = move + self.turn = 0 + + def next_turn(self): + """Progresses the move a turn.""" + expired = super().next_turn() + self.turn += 1 + return expired + + def is_last_turn(self): + """Returns True if this is the last turn this move will be used.""" + return self._remaining_turns == 1 + + +class ExpiringItem(ExpiringEffect): + """An expiration timer with some data.""" + def __init__(self): + super().__init__(0) + self.item = None + + def next_turn(self): + """Progresses the effect a turn.""" + expired = super().next_turn() + if expired: + self.item = None + return expired + + def set(self, item, turns: int): + """Set the item and turns until expiration.""" + self.item = item + self._remaining_turns = turns + + def end(self): + """Ends this expiring item.""" + self.item = None + self._remaining_turns = 0 + + +class Terrain(ExpiringItem): + """The terrain of the battle""" + def __init__(self, battle): + super().__init__() + self.battle = battle + + def next_turn(self): + """Progresses the effect a turn.""" + expired = super().next_turn() + if expired: + self.end() + return expired + + def set(self, item, attacker): + """ + Set the terrain and turns until expiration. + + Returns a formatted string. + """ + if item == self.item: + return f"There's already a {item} terrain!\n" + turns = 8 if attacker.held_item == "terrain-extender" else 5 + super().set(item, turns) + msg = f"{attacker.name} creates a{'n' if item == 'electric' else ''} {item} terrain!\n" + # Mimicry + element = None + if item == "electric": + element = ElementType.ELECTRIC + elif item == "grassy": + element = ElementType.GRASS + elif item == "misty": + element = ElementType.FAIRY + elif item == "psychic": + element = ElementType.PSYCHIC + for poke in (self.battle.trainer1.current_pokemon, self.battle.trainer2.current_pokemon): + if poke is None: + continue + if poke.ability() == Ability.MIMICRY: + poke.type_ids = [element] + t = ElementType(element).name.lower() + msg += f"{poke.name} became a {t} type using its mimicry!\n" + if poke.held_item == "electric-seed" and item == "electric": + msg += poke.append_defense(1, attacker=poke, source="its electric seed") + poke.held_item.use() + if poke.held_item == "psychic-seed" and item == "psychic": + msg += poke.append_spdef(1, attacker=poke, source="its psychic seed") + poke.held_item.use() + if poke.held_item == "misty-seed" and item == "misty": + msg += poke.append_spdef(1, attacker=poke, source="its misty seed") + poke.held_item.use() + if poke.held_item == "grassy-seed" and item == "grassy": + msg += poke.append_defense(1, attacker=poke, source="its grassy seed") + poke.held_item.use() + return msg + + def end(self): + """Ends the terrain.""" + super().end() + # Mimicry + for poke in (self.battle.trainer1.current_pokemon, self.battle.trainer2.current_pokemon): + if poke is None: + continue + if poke.ability() == Ability.MIMICRY: + poke.type_ids = poke.starting_type_ids.copy() + + +class ExpiringWish(ExpiringEffect): + """Stores the HP and when to heal for the move Wish.""" + def __init__(self): + super().__init__(0) + self.hp = None + + def next_turn(self): + """Progresses the effect a turn.""" + expired = super().next_turn() + hp = 0 + if expired: + hp = self.hp + self.hp = None + return hp + + def set(self, hp): + """Set the move and turns until expiration.""" + self.hp = hp + self._remaining_turns = 2 + + +class NonVolatileEffect(): + """The current non volatile effect status.""" + def __init__(self, pokemon): + self.current = "" + self.pokemon = pokemon + self.sleep_timer = ExpiringEffect(0) + self.badly_poisoned_turn = 0 + + def next_turn(self, battle): + """ + Progresses this status by a turn. + + Returns a formatted string if a status wore off. + """ + if not self.current: + return "" + if self.current == "b-poison": + self.badly_poisoned_turn += 1 + if self.pokemon.ability() == Ability.HYDRATION and battle.weather.get() in ("rain", "h-rain"): + removed = self.current + self.reset() + return f"{self.pokemon.name}'s hydration cured its {removed}!\n" + if self.pokemon.ability() == Ability.SHED_SKIN and not random.randint(0, 2): + removed = self.current + self.reset() + return f"{self.pokemon.name}'s shed skin cured its {removed}!\n" + # The poke still has a status effect, apply damage + if self.current == "burn": + damage = max(1, self.pokemon.starting_hp // 16) + if self.pokemon.ability() == Ability.HEATPROOF: + damage //= 2 + return self.pokemon.damage(damage, battle, source="its burn") + if self.current == "b-poison": + if self.pokemon.ability() == Ability.POISON_HEAL: + return self.pokemon.heal(self.pokemon.starting_hp // 8, source="its poison heal") + damage = max(1, (self.pokemon.starting_hp // 16) * min(15, self.badly_poisoned_turn)) + return self.pokemon.damage(damage, battle, source="its bad poison") + if self.current == "poison": + if self.pokemon.ability() == Ability.POISON_HEAL: + return self.pokemon.heal(self.pokemon.starting_hp // 8, source="its poison heal") + damage = max(1, self.pokemon.starting_hp // 8) + return self.pokemon.damage(damage, battle, source="its poison") + if self.current == "sleep" and self.pokemon.nightmare: + return self.pokemon.damage(self.pokemon.starting_hp // 4, battle, source="its nightmare") + return "" + + def burn(self): + """Returns True if the pokemon is burned.""" + return self.current == "burn" + + def sleep(self): + """Returns True if the pokemon is asleep.""" + if self.pokemon.ability() == Ability.COMATOSE: + return True + return self.current == "sleep" + + def poison(self): + """Returns True if the pokemon is poisoned.""" + return self.current in ("poison", "b-poison") + + def paralysis(self): + """Returns True if the pokemon is paralyzed.""" + return self.current == "paralysis" + + def freeze(self): + """Returns True if the pokemon is frozen.""" + return self.current == "freeze" + + def apply_status(self, status, battle, *, attacker=None, move=None, turns=None, force=False, source: str=""): + """ + Apply a non volatile status to a pokemon. + + Returns a formatted message. + """ + msg = "" + if source: + source = f" from {source}" + if self.current and not force: + return f"{self.pokemon.name} already has a status, it can't get {status} too!\n" + if self.pokemon.ability(attacker=attacker, move=move) == Ability.COMATOSE: + return f"{self.pokemon.name} already has a status, it can't get {status} too!\n" + if self.pokemon.ability(attacker=attacker, move=move) == Ability.PURIFYING_SALT: + return f"{self.pokemon.name}'s purifying salt protects it from being inflicted with {status}!\n" + if self.pokemon.ability(attacker=attacker, move=move) == Ability.LEAF_GUARD and battle.weather.get() in ("sun", "h-sun"): + return f"{self.pokemon.name}'s leaf guard protects it from being inflicted with {status}!\n" + if self.pokemon.substitute and attacker is not self.pokemon and (move is None or move.is_affected_by_substitute()): + return f"{self.pokemon.name}'s substitute protects it from being inflicted with {status}!\n" + if self.pokemon.owner.safeguard.active() and attacker is not self.pokemon and (attacker is None or attacker.ability() != Ability.INFILTRATOR): + return f"{self.pokemon.name}'s safeguard protects it from being inflicted with {status}!\n" + if self.pokemon.grounded(battle, attacker=attacker, move=move) and battle.terrain.item == "misty": + return f"The misty terrain protects {self.pokemon.name} from being inflicted with {status}!\n" + if self.pokemon.ability(attacker=attacker, move=move) == Ability.FLOWER_VEIL and ElementType.GRASS in self.pokemon.type_ids: + return f"{self.pokemon.name}'s flower veil protects it from being inflicted with {status}!\n" + if self.pokemon._name == "Minior": + return "Minior's hard shell protects it from status effects!\n" + if status == "burn": + if ElementType.FIRE in self.pokemon.type_ids: + return f"{self.pokemon.name} is a fire type and can't be burned!\n" + if self.pokemon.ability(attacker=attacker, move=move) in (Ability.WATER_VEIL, Ability.WATER_BUBBLE): + ability_name = Ability(self.pokemon.ability_id).pretty_name + return f"{self.pokemon.name}'s {ability_name} prevents it from getting burned!\n" + self.current = status + msg += f"{self.pokemon.name} was burned{source}!\n" + if status == "sleep": + if self.pokemon.ability(attacker=attacker, move=move) in (Ability.INSOMNIA, Ability.VITAL_SPIRIT, Ability.SWEET_VEIL): + ability_name = Ability(self.pokemon.ability_id).pretty_name + return f"{self.pokemon.name}'s {ability_name} keeps it awake!\n" + if self.pokemon.grounded(battle, attacker=attacker, move=move) and battle.terrain.item == "electric": + return f"The terrain is too electric for {self.pokemon.name} to fall asleep!\n" + if battle.trainer1.current_pokemon and battle.trainer1.current_pokemon.uproar.active(): + return f"An uproar keeps {self.pokemon.name} from falling asleep!\n" + if battle.trainer2.current_pokemon and battle.trainer2.current_pokemon.uproar.active(): + return f"An uproar keeps {self.pokemon.name} from falling asleep!\n" + if turns is None: + turns = random.randint(2, 4) + if self.pokemon.ability(attacker=attacker, move=move) == Ability.EARLY_BIRD: + turns //= 2 + self.current = status + self.sleep_timer.set_turns(turns) + msg += f"{self.pokemon.name} fell asleep{source}!\n" + if status in ("poison", "b-poison"): + if attacker is None or attacker.ability() != Ability.CORROSION: + if ElementType.STEEL in self.pokemon.type_ids: + return f"{self.pokemon.name} is a steel type and can't be poisoned!\n" + if ElementType.POISON in self.pokemon.type_ids: + return f"{self.pokemon.name} is a poison type and can't be poisoned!\n" + if self.pokemon.ability(attacker=attacker, move=move) in (Ability.IMMUNITY, Ability.PASTEL_VEIL): + ability_name = Ability(self.pokemon.ability_id).pretty_name + return f"{self.pokemon.name}'s {ability_name} keeps it from being poisoned!\n" + self.current = status + bad = " badly" if status == "b-poison" else "" + msg += f"{self.pokemon.name} was{bad} poisoned{source}!\n" + + if move is not None and attacker is not None and attacker.ability() == Ability.POISON_PUPPETEER: + msg += self.pokemon.confuse(attacker=attacker, source=f"{attacker.name}'s poison puppeteer") + if status == "paralysis": + if ElementType.ELECTRIC in self.pokemon.type_ids: + return f"{self.pokemon.name} is an electric type and can't be paralyzed!\n" + if self.pokemon.ability(attacker=attacker, move=move) == Ability.LIMBER: + return f"{self.pokemon.name}'s limber keeps it from being paralyzed!\n" + self.current = status + msg += f"{self.pokemon.name} was paralyzed{source}!\n" + if status == "freeze": + if ElementType.ICE in self.pokemon.type_ids: + return f"{self.pokemon.name} is an ice type and can't be frozen!\n" + if self.pokemon.ability(attacker=attacker, move=move) == Ability.MAGMA_ARMOR: + return f"{self.pokemon.name}'s magma armor keeps it from being frozen!\n" + if battle.weather.get() in ("sun", "h-sun"): + return f"It's too sunny to freeze {self.pokemon.name}!\n" + self.current = status + msg += f"{self.pokemon.name} was frozen solid{source}!\n" + + if self.pokemon.ability(attacker=attacker, move=move) == Ability.SYNCHRONIZE and attacker is not None: + msg += attacker.nv.apply_status(status, battle, attacker=self.pokemon, source=f"{self.pokemon.name}'s synchronize") + + if self.pokemon.held_item.should_eat_berry_status(attacker): + msg += self.pokemon.held_item.eat_berry(attacker=attacker, move=move) + + return msg + + def reset(self): + """Remove a non volatile status from a pokemon.""" + self.current = "" + self.badly_poisoned_turn = 0 + self.sleep_timer.set_turns(0) + self.pokemon.nightmare = False + + +class Metronome(): + """Holds recent move status for the held item metronome.""" + def __init__(self): + self.move = "" + self.count = 0 + + def reset(self): + """A move failed or a non-move action was done.""" + self.move = "" + self.count = 0 + + def use(self, movename): + """Updates the metronome based on a used move.""" + if self.move == movename: + self.count += 1 + else: + self.move = movename + self.count = 1 + + def get_buff(self, movename): + """Get the buff multiplier for this metronome.""" + if self.move != movename: + return 1 + return min(2, 1 + (.2 * self.count)) + + +class Item(): + """Stores information about an item.""" + def __init__(self, item_data): + self.name = item_data["identifier"] + self.id = item_data["id"] + self.power = item_data["fling_power"] + self.effect = item_data["fling_effect_id"] + +class HeldItem(): + """Stores information about the current held item for a particualar poke.""" + def __init__(self, item_data, owner): + if item_data is None: + self.item = None + else: + self.item = Item(item_data) + self.owner = owner + self.battle = None + self.last_used = None + self.ever_had_item = self.item is not None + + def get(self): + """Get the current held item identifier.""" + if self.item is None: + return None + if not self.can_remove(): + return self.item.name + if self.owner.embargo.active(): + return None + if self.battle and self.battle.magic_room.active(): + return None + if self.owner.ability() == Ability.KLUTZ: + return None + if self.owner.corrosive_gas: + return None + return self.item.name + + def has_item(self): + """Helper method to prevent attempting to acquire a new item if the poke already has one.""" + return self.item is not None + + def can_remove(self): + """Returns a boolean indicating whether this held item can be removed.""" + return self.name not in ( + # Plates + "draco-plate", "dread-plate", "earth-plate", "fist-plate", "flame-plate", "icicle-plate", + "insect-plate", "iron-plate", "meadow-plate", "mind-plate", "pixie-plate", "sky-plate", + "splash-plate", "spooky-plate", "stone-plate", "toxic-plate", "zap-plate", + # Memories + "dragon-memory", "dark-memory", "ground-memory", "fighting-memory", "fire-memory", + "ice-memory", "bug-memory", "steel-memory", "grass-memory", "psychic-memory", + "fairy-memory", "flying-memory", "water-memory", "ghost-memory", "rock-memory", + "poison-memory", "electric-memory", + # Misc + "primal-orb", "griseous-orb", "blue-orb", "red-orb", "rusty-sword", "rusty-shield", + # Mega Stones + "mega-stone", "mega-stone-x", "mega-stone-y", + ) + + def is_berry(self, *, only_active=True): + """ + Returns a boolean indicating whether this held item is a berry. + + The optional param only_active determines if this method should only return True if the berry is active and usable. + """ + if only_active: + return self.get() is not None and self.get().endswith("-berry") + return self.name is not None and self.name.endswith("-berry") + + def remove(self): + """Remove this held item, setting it to None.""" + if not self.can_remove(): + raise ValueError(f"{self.name} cannot be removed.") + self.item = None + + def use(self): + """Uses this item, setting it to None but also recording that it was used.""" + if not self.can_remove(): + raise ValueError(f"{self.name} cannot be removed.") + self.last_used = self.item + self.owner.choice_move = None + self.remove() + + def transfer(self, other): + """Transfer the data of this held item to other, and clear this item.""" + if not self.can_remove(): + raise ValueError(f"{self.name} cannot be removed.") + if not other.can_remove(): + raise ValueError(f"{other.name} cannot be removed.") + other.item = self.item + self.remove() + + def swap(self, other): + """Swap the date between this held item and other.""" + if not self.can_remove(): + raise ValueError(f"{self.name} cannot be removed.") + if not other.can_remove(): + raise ValueError(f"{other.name} cannot be removed.") + self.item, other.item = other.item, self.item + self.owner.choice_move = None + other.owner.choice_move = None + self.ever_had_item = self.ever_had_item or self.item is not None + + def recover(self, other): + """Recover & claim the last_used item from other.""" + self.item = other.last_used + other.last_used = None + self.ever_had_item = self.ever_had_item or self.item is not None + + def _should_eat_berry_util(self, otherpoke=None): + """Util for all the things that are shared between the different kinds of berry.""" + if self.owner.hp == 0: + return False + if otherpoke is not None and otherpoke.ability() in (Ability.UNNERVE, Ability.AS_ONE_SHADOW, Ability.AS_ONE_ICE): #TODO: idk make this check better... + return False + if not self.is_berry(): + return False + return True + + def should_eat_berry_damage(self, otherpoke=None): + """Returns True if the pokemon meets the criteria to eat its held berry after being damaged.""" + if not self._should_eat_berry_util(otherpoke): + return False + if self.owner.hp <= self.owner.starting_hp / 4: + if self in ( + # HP berries + "figy-berry", "wiki-berry", "mago-berry", "aguav-berry", "iapapa-berry", + # Stat berries + "apicot-berry", "ganlon-berry", "lansat-berry", "liechi-berry", "micle-berry", "petaya-berry", "salac-berry", "starf-berry", + ): + return True + if self.owner.hp <= self.owner.starting_hp / 2: + if self.owner.ability() == Ability.GLUTTONY: + return True + if self == "sitrus-berry": + return True + return False + + def should_eat_berry_status(self, otherpoke=None): + """Returns True if the pokemon meets the criteria to eat its held berry after getting a status.""" + if not self._should_eat_berry_util(otherpoke): + return False + if self in ("aspear-berry", "lum-berry") and self.owner.nv.freeze(): + return True + if self in ("cheri-berry", "lum-berry") and self.owner.nv.paralysis(): + return True + if self in ("chesto-berry", "lum-berry") and self.owner.nv.sleep(): + return True + if self in ("pecha-berry", "lum-berry") and self.owner.nv.poison(): + return True + if self in ("rawst-berry", "lum-berry") and self.owner.nv.burn(): + return True + if self in ("persim-berry", "lum-berry") and self.owner.confusion.active(): + return True + return False + + def should_eat_berry(self, otherpoke=None): + """Returns True if the pokemon meets the criteria to eat its held berry.""" + return self.should_eat_berry_damage(otherpoke) or self.should_eat_berry_status(otherpoke) + + def eat_berry(self, *, consumer=None, attacker=None, move=None): + """ + Eat this held item berry. + + Returns a formatted message. + """ + msg = "" + if not self.is_berry(): + return "" + if consumer is None: + consumer = self.owner + else: + msg += f"{consumer.name} eats {self.owner.name}'s berry!\n" + + # 2x or 1x + ripe = int(consumer.ability(attacker=attacker, move=move) == Ability.RIPEN) + 1 + flavor = None + + if self == "sitrus-berry": + msg += consumer.heal((ripe * consumer.starting_hp) // 4, source="eating its berry") + elif self == "figy-berry": + msg += consumer.heal((ripe * consumer.starting_hp) // 3, source="eating its berry") + flavor = "spicy" + elif self == "wiki-berry": + msg += consumer.heal((ripe * consumer.starting_hp) // 3, source="eating its berry") + flavor = "dry" + elif self == "mago-berry": + msg += consumer.heal((ripe * consumer.starting_hp) // 3, source="eating its berry") + flavor = "sweet" + elif self == "aguav-berry": + msg += consumer.heal((ripe * consumer.starting_hp) // 3, source="eating its berry") + flavor = "bitter" + elif self == "iapapa-berry": + msg += consumer.heal((ripe * consumer.starting_hp) // 3, source="eating its berry") + flavor = "sour" + elif self == "apicot-berry": + msg += consumer.append_spdef(ripe * 1, attacker=attacker, move=move, source="eating its berry") + elif self == "ganlon-berry": + msg += consumer.append_defense(ripe * 1, attacker=attacker, move=move, source="eating its berry") + elif self == "lansat-berry": + consumer.lansat_berry_ate = True + msg += f"{consumer.name} is powered up by eating its berry.\n" + elif self == "liechi-berry": + msg += consumer.append_attack(ripe * 1, attacker=attacker, move=move, source="eating its berry") + elif self == "micle-berry": + consumer.micle_berry_ate = True + msg += f"{consumer.name} is powered up by eating its berry.\n" + elif self == "petaya-berry": + msg += consumer.append_spatk(ripe * 1, attacker=attacker, move=move, source="eating its berry") + elif self == "salac-berry": + msg += consumer.append_speed(ripe * 1, attacker=attacker, move=move, source="eating its berry") + elif self == "starf-berry": + funcs = [ + consumer.append_attack, + consumer.append_defense, + consumer.append_spatk, + consumer.append_spdef, + consumer.append_speed, + ] + func = random.choice(funcs) + msg += func(ripe * 2, attacker=attacker, move=move, source="eating its berry") + elif self == "aspear-berry": + if consumer.nv.freeze(): + consumer.nv.reset() + msg += f"{consumer.name} is no longer frozen after eating its berry!\n" + else: + msg += f"{consumer.name}'s berry had no effect!\n" + elif self == "cheri-berry": + if consumer.nv.paralysis(): + consumer.nv.reset() + msg += f"{consumer.name} is no longer paralyzed after eating its berry!\n" + else: + msg += f"{consumer.name}'s berry had no effect!\n" + elif self == "chesto-berry": + if consumer.nv.sleep(): + consumer.nv.reset() + msg += f"{consumer.name} woke up after eating its berry!\n" + else: + msg += f"{consumer.name}'s berry had no effect!\n" + elif self == "pecha-berry": + if consumer.nv.poison(): + consumer.nv.reset() + msg += f"{consumer.name} is no longer poisoned after eating its berry!\n" + else: + msg += f"{consumer.name}'s berry had no effect!\n" + elif self == "rawst-berry": + if consumer.nv.burn(): + consumer.nv.reset() + msg += f"{consumer.name} is no longer burned after eating its berry!\n" + else: + msg += f"{consumer.name}'s berry had no effect!\n" + elif self == "persim-berry": + if consumer.confusion.active(): + consumer.confusion.set_turns(0) + msg += f"{consumer.name} is no longer confused after eating its berry!\n" + else: + msg += f"{consumer.name}'s berry had no effect!\n" + elif self == "lum-berry": + consumer.nv.reset() + consumer.confusion.set_turns(0) + msg += f"{consumer.name}'s statuses were cleared from eating its berry!\n" + + if flavor is not None and consumer.disliked_flavor == flavor: + msg += consumer.confuse(attacker=attacker, move=move, source="disliking its berry's flavor") + if consumer.ability(attacker=attacker, move=move) == Ability.CHEEK_POUCH: + msg += consumer.heal(consumer.starting_hp // 3, source="its cheek pouch") + + consumer.last_berry = self.item + consumer.ate_berry = True + # TODO: right now HeldItem does not support `recover`ing/setting from anything other than another HeldItem object. + # this should probably be modified to be an `ExpiringItem` w/ that item for cases where `last_item` gets reset. + if consumer.ability(attacker=attacker, move=move) == Ability.CUD_CHEW: + consumer.cud_chew.set_turns(2) + if consumer is self.owner: + self.use() + else: + self.remove() + + return msg + + def __eq__(self, other): + return self.get() == other + + def __getattr__(self, attr): + if attr not in ("name", "power", "id", "effect"): + raise AttributeError(f"{attr} is not an attribute of {self.__class__.__name__}.") + if self.item is None: + return None + if attr == "name": + return self.item.name + if attr == "power": + return self.item.power + if attr == "id": + return self.item.id + if attr == "effect": + return self.item.effect + raise AttributeError(f"{attr} is not an attribute of {self.__class__.__name__}.") + +class BatonPass(): + """Stores the necessary data from a pokemon to baton pass to another pokemon.""" + def __init__(self, poke): + self.attack_stage = poke.attack_stage + self.defense_stage = poke.defense_stage + self.spatk_stage = poke.spatk_stage + self.spdef_stage = poke.spdef_stage + self.speed_stage = poke.speed_stage + self.evasion_stage = poke.evasion_stage + self.accuracy_stage = poke.accuracy_stage + self.confusion = poke.confusion + self.focus_energy = poke.focus_energy + self.mind_reader = poke.mind_reader + self.leech_seed = poke.leech_seed + self.curse = poke.curse + self.substitute = poke.substitute + self.ingrain = poke.ingrain + self.power_trick = poke.power_trick + self.power_shift = poke.power_shift + self.heal_block = poke.heal_block + self.embargo = poke.embargo + self.perish_song = poke.perish_song + self.magnet_rise = poke.magnet_rise + self.aqua_ring = poke.aqua_ring + self.telekinesis = poke.telekinesis + + def apply(self, poke): + """Push this objects data to a poke.""" + if poke.ability() != Ability.CURIOUS_MEDICINE: + poke.attack_stage = self.attack_stage + poke.defense_stage = self.defense_stage + poke.spatk_stage = self.spatk_stage + poke.spdef_stage = self.spdef_stage + poke.speed_stage = self.speed_stage + poke.evasion_stage = self.evasion_stage + poke.accuracy_stage = self.accuracy_stage + poke.confusion = self.confusion + poke.focus_energy = self.focus_energy + poke.mind_reader = self.mind_reader + poke.leech_seed = self.leech_seed + poke.curse = self.curse + poke.substitute = self.substitute + poke.ingrain = self.ingrain + poke.power_trick = self.power_trick + poke.power_shift = self.power_shift + poke.heal_block = self.heal_block + poke.embargo = self.embargo + poke.perish_song = self.perish_song + poke.magnet_rise = self.magnet_rise + poke.aqua_ring = self.aqua_ring + poke.telekinesis = self.telekinesis diff --git a/pokemonduel/move.py b/pokemonduel/move.py new file mode 100644 index 0000000..5fc913b --- /dev/null +++ b/pokemonduel/move.py @@ -0,0 +1,3752 @@ +import random +from .enums import Ability, DamageClass, ElementType, MoveTarget +from .misc import LockedMove, BatonPass, ExpiringEffect, ExpiringItem + + +class Move(): + """Represents an instance of a move.""" + def __init__(self, **kwargs): + """Accepts a dict from the mongo moves table.""" + self.id = kwargs["id"] + self.name = kwargs["identifier"] + self.pretty_name = self.name.capitalize().replace("-", " ") + self.power = kwargs["power"] + self.pp = kwargs["pp"] + self.starting_pp = self.pp + self.accuracy = kwargs["accuracy"] + self.priority = kwargs["priority"] + self.type = kwargs["type_id"] + self.damage_class = kwargs["damage_class_id"] + self.effect = kwargs["effect_id"] + self.effect_chance = kwargs["effect_chance"] + self.target = kwargs["target_id"] + self.crit_rate = kwargs["crit_rate"] + self.min_hits = kwargs["min_hits"] + self.max_hits = kwargs["max_hits"] + self.used = False + + def setup(self, attacker, defender, battle): + """ + Sets up anything this move needs to do prior to normal move execution. + + Returns a formatted message. + """ + msg = "" + if self.effect == 129 and (isinstance(defender.owner.selected_action, int) or defender.owner.selected_action.effect in (128, 154, 229, 347, 493)): + msg += self.use(attacker, defender, battle) + if self.effect == 171: + msg += f"{attacker.name} is focusing on its attack!\n" + if self.effect == 404: + attacker.beak_blast = True + return msg + + def use(self, attacker, defender, battle, *, use_pp=True, override_sleep=False, bounced=False): + """ + Uses this move as attacker on defender. + + Returns a string of formatted results of the move. + """ + #This handles an edge case for moves that cause the target to swap out + if attacker.has_moved and use_pp: + return "" + self.used = True + if use_pp: + attacker.has_moved = True + attacker.last_move = self + attacker.beak_blast = False + attacker.destiny_bond = False + # Reset semi-invulnerable status in case this is turn 2 + attacker.dive = False + attacker.dig = False + attacker.fly = False + attacker.shadow_force = False + current_type = self.get_type(attacker, defender, battle) + effect_chance = self.get_effect_chance(attacker, defender, battle) + msg = "" + + if self.effect in (5, 126, 168, 254, 336, 398, 458, 500) and attacker.nv.freeze(): + attacker.nv.reset() + msg += f"{attacker.name} thawed out!\n" + if attacker.nv.freeze(): + if use_pp and not random.randint(0, 4): + attacker.nv.reset() + msg += f"{attacker.name} is no longer frozen!\n" + else: + msg += f"{attacker.name} is frozen solid!\n" + if self.effect == 28: + attacker.locked_move = None + return msg + if attacker.nv.paralysis() and not random.randint(0, 3): + msg += f"{attacker.name} is paralyzed! It can't move!\n" + if self.effect == 28: + attacker.locked_move = None + return msg + if attacker.infatuated is defender and not random.randint(0, 1): + msg += f"{attacker.name} is in love with {defender.name} and can't bare to hurt them!\n" + if self.effect == 28: + attacker.locked_move = None + return msg + if attacker.flinched: + msg += f"{attacker.name} flinched! It can't move!\n" + if self.effect == 28: + attacker.locked_move = None + return msg + if attacker.nv.sleep(): + if use_pp and attacker.nv.sleep_timer.next_turn(): + attacker.nv.reset() + msg += f"{attacker.name} woke up!\n" + elif self.effect not in (93, 98) and attacker.ability() != Ability.COMATOSE and not override_sleep: + msg += f"{attacker.name} is fast asleep!\n" + if self.effect == 28: + attacker.locked_move = None + return msg + if attacker.confusion.next_turn(): + msg += f"{attacker.name} is no longer confused!\n" + if attacker.confusion.active() and not random.randint(0, 2): + msg += f"{attacker.name} hurt itself in its confusion!\n" + msgadd, numhits = self.confusion().attack(attacker, attacker, battle) + msg += msgadd + if self.effect == 28: + attacker.locked_move = None + return msg + if attacker.ability() == Ability.TRUANT and attacker.truant_turn % 2: + msg += f"{attacker.name} is loafing around!\n" + if self.effect == 28: + attacker.locked_move = None + return msg + + if not bounced: + msg += f"{attacker.name} used {self.pretty_name}!\n" + attacker.metronome.use(self.name) + + # PP + if attacker.locked_move is None and use_pp: + self.pp -= 1 + if defender.ability(attacker=attacker, move=self) == Ability.PRESSURE and self.pp != 0: + if self.targets_opponent() or self.effect in (113, 193, 196, 250, 267): + self.pp -= 1 + if self.pp == 0: + msg += "It ran out of PP!\n" + + #User is using a choice item and had not used a move yet, set that as their only move. + if attacker.choice_move is None and use_pp: + if attacker.held_item in ("choice-scarf", "choice-band", "choice-specs"): + attacker.choice_move = self + elif attacker.ability() == Ability.GORILLA_TACTICS: + attacker.choice_move = self + + # Stance change + if attacker.ability() == Ability.STANCE_CHANGE: + if attacker._name == "Aegislash" and self.damage_class in (DamageClass.PHYSICAL, DamageClass.SPECIAL): + if attacker.form("Aegislash-blade"): + msg += f"{attacker.name} draws its blade!\n" + if attacker._name == "Aegislash-blade" and self.effect == 356: + if attacker.form("Aegislash"): + msg += f"{attacker.name} readies its shield!\n" + + # Powder damage + if attacker.powdered and current_type == ElementType.FIRE and battle.weather.get() != "h-rain": + msg += attacker.damage(attacker.starting_hp // 4, battle, source="its powder exploding") + return msg + + # Snatch steal + if defender.snatching and self.selectable_by_snatch(): + msg += f"{defender.name} snatched the move!\n" + msg += self.use(defender, attacker, battle, use_pp=False) + return msg + + # Check Fail + if not self.check_executable(attacker, defender, battle): + msg += "But it failed!\n" + if self.effect in (28, 118): + attacker.locked_move = None + attacker.last_move_failed = True + return msg + + # Setup for multi-turn moves + if attacker.locked_move is None: + # 2 turn moves + # During sun, this move does not need to charge + if self.effect == 152 and battle.weather.get() not in ("sun", "h-sun"): + attacker.locked_move = LockedMove(self, 2) + # During rain, this move does not need to charge + if self.effect == 502: + if battle.weather.get() not in ("rain", "h-rain"): + attacker.locked_move = LockedMove(self, 2) + else: + # If this move isn't charging, the spatk increase has to happen manually + msg += attacker.append_spatk(1, attacker=attacker, move=self) + if self.effect in (40, 76, 81, 146, 156, 256, 257, 264, 273, 332, 333, 366, 451): + attacker.locked_move = LockedMove(self, 2) + # 3 turn moves + if self.effect == 27: + attacker.locked_move = LockedMove(self, 3) + attacker.bide = 0 + if self.effect == 160: + attacker.locked_move = LockedMove(self, 3) + attacker.uproar.set_turns(3) + if attacker.nv.sleep(): + attacker.nv.reset() + msg += f"{attacker.name} woke up!\n" + if defender.nv.sleep(): + defender.nv.reset() + msg += f"{defender.name} woke up!\n" + # 5 turn moves + if self.effect == 118: + attacker.locked_move = LockedMove(self, 5) + # 2-3 turn moves + if self.effect == 28: + attacker.locked_move = LockedMove(self, random.randint(2, 3)) + #2-5 turn moves + if self.effect == 160: + attacker.locked_move = LockedMove(self, random.randint(2, 5)) + # Semi-invulnerable + if self.effect == 256: + attacker.dive = True + if self.effect == 257: + attacker.dig = True + if self.effect in (156, 264): + attacker.fly = True + if self.effect == 273: + attacker.shadow_force = True + + # Early exits for moves that hit a certain turn when it is not that turn + # Turn 1 hit moves + if self.effect == 81 and attacker.locked_move: + if attacker.locked_move.turn != 0: + msg += "It's recharging!\n" + return msg + + # Turn 2 hit moves + elif self.effect in (40, 76, 146, 152, 156, 256, 257, 264, 273, 332, 333, 366, 451, 502) and attacker.locked_move: + if attacker.locked_move.turn != 1: + if self.effect == 146: + msg += attacker.append_defense(1, attacker=attacker, move=self) + elif self.effect in (451, 502): + msg += attacker.append_spatk(1, attacker=attacker, move=self) + else: + msg += "It's charging up!\n" + # Gulp Missile + if self.effect == 256 and attacker.ability() == Ability.GULP_MISSILE and attacker._name == "Cramorant": + if attacker.hp > attacker.starting_hp // 2: + if attacker.form("Cramorant-gulping"): + msg += f"{attacker.name} gulped up an arrokuda!\n" + else: + if attacker.form("Cramorant-gorging"): + msg += f"{attacker.name} gulped up a pikachu!\n" + return msg + + # Turn 3 hit moves + elif self.effect == 27: + if attacker.locked_move.turn != 2: + msg += "It's storing energy!\n" + return msg + + # User Faints + if self.effect in (8, 444): + msg += attacker.faint(battle) + + # User takes damage + if self.effect == 420: + msg += attacker.damage(attacker.starting_hp // 2, battle, source="its head exploding (tragic)") + + # User's type changes + if current_type != ElementType.TYPELESS: + if attacker.ability() == Ability.PROTEAN: + attacker.type_ids = [current_type] + t = ElementType(current_type).name.lower() + msg += f"{attacker.name} transformed into a {t} type using its protean!\n" + if attacker.ability() == Ability.LIBERO: + attacker.type_ids = [current_type] + t = ElementType(current_type).name.lower() + msg += f"{attacker.name} transformed into a {t} type using its libero!\n" + + # Status effects reflected by magic coat or magic bounce. + if self.is_affected_by_magic_coat() and (defender.ability(attacker=attacker, move=self) == Ability.MAGIC_BOUNCE or defender.magic_coat) and not bounced: + msg += f"It was reflected by {defender.name}'s magic bounce!\n" + hm = defender.has_moved + msg += self.use(defender, attacker, battle, use_pp=False, bounced=True) + defender.has_moved = hm + return msg + + # Check Effect + if not self.check_effective(attacker, defender, battle) and not bounced: + msg += "It had no effect...\n" + if self.effect == 120: + attacker.fury_cutter = 0 + if self.effect in (46, 478): + msg += attacker.damage(attacker.starting_hp // 2, battle, source="recoil") + if self.effect in (28, 81, 118): + attacker.locked_move = None + attacker.last_move_failed = True + return msg + + # Check Semi-invulnerable - treated as a miss + if not self.check_semi_invulnerable(attacker, defender, battle): + msg += f"{defender.name} avoided the attack!\n" + if self.effect == 120: + attacker.fury_cutter = 0 + if self.effect in (46, 478): + msg += attacker.damage(attacker.starting_hp // 2, battle, source="recoil") + if self.effect in (28, 81, 118): + attacker.locked_move = None + return msg + + # Check Protection + was_hit, msgdelta = self.check_protect(attacker, defender, battle) + if not was_hit: + msg += f"{defender.name} was protected against the attack!\n" + msg += msgdelta + if self.effect == 120: + attacker.fury_cutter = 0 + if self.effect in (46, 478): + msg += attacker.damage(attacker.starting_hp // 2, battle, source="recoil") + if self.effect in (28, 81, 118): + attacker.locked_move = None + return msg + + # Check Hit + if not self.check_hit(attacker, defender, battle): + msg += "But it missed!\n" + if self.effect == 120: + attacker.fury_cutter = 0 + if self.effect in (46, 478): + msg += attacker.damage(attacker.starting_hp // 2, battle, source="recoil") + if self.effect in (28, 81, 118): + attacker.locked_move = None + return msg + + # Absorbs + if self.targets_opponent() and self.effect != 459: + # Heal + if current_type == ElementType.ELECTRIC and defender.ability(attacker=attacker, move=self) == Ability.VOLT_ABSORB: + msg += f"{defender.name}'s volt absorb absorbed the move!\n" + msg += defender.heal(defender.starting_hp // 4, source="absorbing the move") + return msg + if current_type == ElementType.WATER and defender.ability(attacker=attacker, move=self) == Ability.WATER_ABSORB: + msg += f"{defender.name}'s water absorb absorbed the move!\n" + msg += defender.heal(defender.starting_hp // 4, source="absorbing the move") + return msg + if current_type == ElementType.WATER and defender.ability(attacker=attacker, move=self) == Ability.DRY_SKIN: + msg += f"{defender.name}'s dry skin absorbed the move!\n" + msg += defender.heal(defender.starting_hp // 4, source="absorbing the move") + return msg + if current_type == ElementType.GROUND and defender.ability(attacker=attacker, move=self) == Ability.EARTH_EATER: + msg += f"{defender.name}'s earth eater absorbed the move!\n" + msg += defender.heal(defender.starting_hp // 4, source="absorbing the move") + return msg + # Stat stage changes + if current_type == ElementType.ELECTRIC and defender.ability(attacker=attacker, move=self) == Ability.LIGHTNING_ROD: + msg += f"{defender.name}'s lightning rod absorbed the move!\n" + msg += defender.append_spatk(1, attacker=defender, move=self) + return msg + if current_type == ElementType.ELECTRIC and defender.ability(attacker=attacker, move=self) == Ability.MOTOR_DRIVE: + msg += f"{defender.name}'s motor drive absorbed the move!\n" + msg += defender.append_speed(1, attacker=defender, move=self) + return msg + if current_type == ElementType.WATER and defender.ability(attacker=attacker, move=self) == Ability.STORM_DRAIN: + msg += f"{defender.name}'s storm drain absorbed the move!\n" + msg += defender.append_spatk(1, attacker=defender, move=self) + return msg + if current_type == ElementType.GRASS and defender.ability(attacker=attacker, move=self) == Ability.SAP_SIPPER: + msg += f"{defender.name}'s sap sipper absorbed the move!\n" + msg += defender.append_attack(1, attacker=defender, move=self) + return msg + if current_type == ElementType.FIRE and defender.ability(attacker=attacker, move=self) == Ability.WELL_BAKED_BODY: + msg += f"{defender.name}'s well baked body absorbed the move!\n" + msg += defender.append_defense(2, attacker=defender, move=self) + return msg + # Other + if current_type == ElementType.FIRE and defender.ability(attacker=attacker, move=self) == Ability.FLASH_FIRE: + defender.flash_fire = True + msg += f"{defender.name} used its flash fire to buff its fire type moves!\n" + return msg + + # Stat stage from type items + if not defender.substitute: + if current_type == ElementType.WATER and defender.held_item == "absorb-bulb": + msg += defender.append_spatk(1, attacker=defender, move=self, source="its absorb bulb") + defender.held_item.use() + if current_type == ElementType.ELECTRIC and defender.held_item == "cell-battery": + msg += defender.append_attack(1, attacker=defender, move=self, source="its cell battery") + defender.held_item.use() + if current_type == ElementType.WATER and defender.held_item == "luminous-moss": + msg += defender.append_spdef(1, attacker=defender, move=self, source="its luminous moss") + defender.held_item.use() + if current_type == ElementType.ICE and defender.held_item == "snowball": + msg += defender.append_attack(1, attacker=defender, move=self, source="its snowball") + defender.held_item.use() + + # Metronome + if self.effect == 84: + attacker.has_moved = False + raw = random.choice(battle.metronome_moves_raw) + msg += Move(**raw).use(attacker, defender, battle) + return msg + + # Brick break - runs before damage calculation + if self.effect == 187: + if defender.owner.aurora_veil.active(): + defender.owner.aurora_veil.set_turns(0) + msg += f"{defender.name}'s aurora veil wore off!\n" + if defender.owner.light_screen.active(): + defender.owner.light_screen.set_turns(0) + msg += f"{defender.name}'s light screen wore off!\n" + if defender.owner.reflect.active(): + defender.owner.reflect.set_turns(0) + msg += f"{defender.name}'s reflect wore off!\n" + + # Sleep talk + if self.effect == 98: + move = random.choice([m for m in attacker.moves if m.selectable_by_sleep_talk()]) + msg += move.use(attacker, defender, battle, use_pp=False, override_sleep=True) + return msg + + # Mirror Move/Copy Cat + if self.effect in (10, 243): + msg += defender.last_move.use(attacker, defender, battle, use_pp=False) + return msg + + # Me First + if self.effect == 242: + msg += defender.owner.selected_action.use(attacker, defender, battle, use_pp=False) + return msg + + # Assist + if self.effect == 181: + msg += attacker.get_assist_move().use(attacker, defender, battle, use_pp=False) + return msg + + # Spectral Thief + if self.effect == 410: + if defender.attack_stage > 0: + stage = defender.attack_stage + defender.attack_stage = 0 + msg += f"{defender.name}'s attack stage was reset!\n" + msg += attacker.append_attack(stage, attacker=attacker, move=self) + if defender.defense_stage > 0: + stage = defender.defense_stage + defender.defense_stage = 0 + msg += f"{defender.name}'s defense stage was reset!\n" + msg += attacker.append_defense(stage, attacker=attacker, move=self) + if defender.spatk_stage > 0: + stage = defender.spatk_stage + defender.spatk_stage = 0 + msg += f"{defender.name}'s special attack stage was reset!\n" + msg += attacker.append_spatk(stage, attacker=attacker, move=self) + if defender.spdef_stage > 0: + stage = defender.spdef_stage + defender.spdef_stage = 0 + msg += f"{defender.name}'s special defense stage was reset!\n" + msg += attacker.append_spdef(stage, attacker=attacker, move=self) + if defender.speed_stage > 0: + stage = defender.speed_stage + defender.speed_stage = 0 + msg += f"{defender.name}'s speed stage was reset!\n" + msg += attacker.append_speed(stage, attacker=attacker, move=self) + if defender.evasion_stage > 0: + stage = defender.evasion_stage + defender.evasion_stage = 0 + msg += f"{defender.name}'s evasion stage was reset!\n" + msg += attacker.append_evasion(stage, attacker=attacker, move=self) + if defender.accuracy_stage > 0: + stage = defender.accuracy_stage + defender.accuracy_stage = 0 + msg += f"{defender.name}'s accuracy stage was reset!\n" + msg += attacker.append_accuracy(stage, attacker=attacker, move=self) + + # Future Sight + if self.effect == 149: + defender.owner.future_sight.set((attacker, self), 3) + msg += f"{attacker.name} foresaw an attack!\n" + return msg + + # Present + if self.effect == 123: + action = random.randint(1, 4) + if action == 1: + if defender.hp == defender.starting_hp: + msg += "It had no effect!\n" + else: + msg += defender.heal(defender.starting_hp // 4, source=f"{attacker.name}'s present") + return msg + if action == 2: + power = 40 + elif action == 3: + power = 80 + else: + power = 120 + m = self.present(power) + msgadd, _ = m.attack(attacker, defender, battle) + msg += msgadd + return msg + + # Incinerate + if self.effect == 315 and defender.held_item.is_berry(only_active=False): + if defender.ability(attacker=attacker, move=self) == Ability.STICKY_HOLD: + msg += f"{defender.name}'s sticky hand kept hold of its item!\n" + else: + defender.held_item.remove() + msg += f"{defender.name}'s berry was incinerated!\n" + + # Poltergeist + if self.effect == 446: + msg += f"{defender.name} is about to be attacked by its {defender.held_item.get()}!\n" + + numhits = 0 + # Turn 1 hit moves + if self.effect == 81 and attacker.locked_move: + if attacker.locked_move.turn == 0: + msgadd, numhits = self.attack(attacker, defender, battle) + msg += msgadd + + # Turn 2 hit moves + elif self.effect in (40, 76, 146, 152, 156, 256, 257, 264, 273, 332, 333, 366, 451, 502) and attacker.locked_move: + if attacker.locked_move.turn == 1: + if self.damage_class in (DamageClass.PHYSICAL, DamageClass.SPECIAL): + msgadd, numhits = self.attack(attacker, defender, battle) + msg += msgadd + + # Turn 3 hit moves + elif self.effect == 27: + if attacker.locked_move.turn == 2: + msg += defender.damage(attacker.bide * 2, battle, move=self, move_type=current_type, attacker=attacker) + attacker.bide = None + numhits = 1 + + # Counter attack moves + elif self.effect == 228: + msg += defender.damage(int(1.5 * attacker.last_move_damage[0]), battle, move=self, move_type=current_type, attacker=attacker) + numhits = 1 + elif self.effect == 145: + msg += defender.damage(2 * attacker.last_move_damage[0], battle, move=self, move_type=current_type, attacker=attacker) + numhits = 1 + elif self.effect == 90: + msg += defender.damage(2 * attacker.last_move_damage[0], battle, move=self, move_type=current_type, attacker=attacker) + numhits = 1 + + # Static-damage moves + elif self.effect == 41: + msg += defender.damage(defender.hp // 2, battle, move=self, move_type=current_type, attacker=attacker) + numhits = 1 + elif self.effect == 42: + msg += defender.damage(40, battle, move=self, move_type=current_type, attacker=attacker) + numhits = 1 + elif self.effect == 88: + msg += defender.damage(attacker.level, battle, move=self, move_type=current_type, attacker=attacker) + numhits = 1 + elif self.effect == 89: + # 0.5-1.5, increments of .1 + scale = (random.randint(0, 10) / 10.0) + .5 + msg += defender.damage(int(attacker.level * scale), battle, move=self, move_type=current_type, attacker=attacker) + numhits = 1 + elif self.effect == 131: + msg += defender.damage(20, battle, move=self, move_type=current_type, attacker=attacker) + numhits = 1 + elif self.effect == 190: + msg += defender.damage(max(0, defender.hp - attacker.hp), battle, move=self, move_type=current_type, attacker=attacker) + numhits = 1 + elif self.effect == 39: + msg += defender.damage(defender.hp, battle, move=self, move_type=current_type, attacker=attacker) + numhits = 1 + elif self.effect == 321: + msg += defender.damage(attacker.hp, battle, move=self, move_type=current_type, attacker=attacker) + numhits = 1 + elif self.effect == 413: + msg += defender.damage(3 * (defender.hp // 4), battle, move=self, move_type=current_type, attacker=attacker) + numhits = 1 + + # Beat up, a stupid move + elif self.effect == 155: + for poke in attacker.owner.party: + if defender.hp == 0: + break + if poke.hp == 0: + continue + if poke is attacker: + msgadd, nh = self.attack(attacker, defender, battle) + msg += msgadd + numhits += nh + else: + if poke.nv.current: + continue + fake_move = { + "id": 251, + "identifier": "beat-up", + "power": (poke.get_raw_attack() // 10) + 5, + "pp": 100, + "accuracy": 100, + "priority": 0, + "type_id": ElementType.DARK, + "damage_class_id": DamageClass.PHYSICAL, + "effect_id": 1, + "effect_chance": None, + "target_id": 10, + "crit_rate": 0, + "min_hits": None, + "max_hits": None, + } + fake_move = Move(**fake_move) + msgadd, nh = fake_move.attack(attacker, defender, battle) + msg += msgadd + numhits += nh + + # Other damaging moves + elif self.damage_class in (DamageClass.PHYSICAL, DamageClass.SPECIAL): + msgadd, numhits = self.attack(attacker, defender, battle) + msg += msgadd + + # Fusion Flare/Bolt effect tracking + battle.last_move_effect = self.effect + + # Stockpile + if self.effect == 161: + attacker.stockpile += 1 + msg += f"{attacker.name} stores energy!\n" + if self.effect == 162: + msg += attacker.append_defense(-attacker.stockpile, attacker=attacker, move=self) + msg += attacker.append_spdef(-attacker.stockpile, attacker=attacker, move=self) + attacker.stockpile = 0 + + # Healing + if self.effect in (33, 215): + msg += attacker.heal(attacker.starting_hp // 2) + if self.effect in (434, 457): + msg += attacker.heal(attacker.starting_hp // 4) + if self.effect == 310: + if attacker.ability() == Ability.MEGA_LAUNCHER: + msg += defender.heal((defender.starting_hp * 3) // 4) + else: + msg += defender.heal(defender.starting_hp // 2) + if self.effect == 133: + if battle.weather.get() in ("sun", "h-sun"): + msg += attacker.heal((attacker.starting_hp * 2) // 3) + elif battle.weather.get() == "h-wind": + msg += attacker.heal(attacker.starting_hp // 2) + elif battle.weather.get(): + msg += attacker.heal(attacker.starting_hp // 4) + else: + msg += attacker.heal(attacker.starting_hp // 2) + if self.effect == 85: + defender.leech_seed = True + msg += f"{defender.name} was seeded!\n" + if self.effect == 163: + msg += attacker.heal(attacker.starting_hp // {1: 4, 2: 2, 3: 1}[attacker.stockpile], source="stockpiled energy") + msg += attacker.append_defense(-attacker.stockpile, attacker=attacker, move=self) + msg += attacker.append_spdef(-attacker.stockpile, attacker=attacker, move=self) + attacker.stockpile = 0 + if self.effect == 180: + attacker.owner.wish.set(attacker.starting_hp // 2) + msg += f"{attacker.name} makes a wish!\n" + if self.effect == 382: + if battle.weather.get() == "sandstorm": + msg += attacker.heal((attacker.starting_hp * 2) // 3) + else: + msg += attacker.heal(attacker.starting_hp // 2) + if self.effect == 387: + if battle.terrain.item == "grassy": + msg += attacker.heal((attacker.starting_hp * 2) // 3) + else: + msg += attacker.heal(attacker.starting_hp // 2) + if self.effect == 388: + msg += attacker.heal(defender.get_attack(battle)) + if self.effect == 400: + status = defender.nv.current + defender.nv.reset() + msg += f"{defender.name}'s {status} was healed!\n" + msg += attacker.heal(attacker.starting_hp // 2) + + # Status effects + if self.effect in (5, 126, 201, 254, 274, 333, 365, 458, 465, 500): + if random.randint(1, 100) <= effect_chance: + msg += defender.nv.apply_status("burn", battle, attacker=attacker, move=self) + if self.effect == 168: + msg += defender.nv.apply_status("burn", battle, attacker=attacker, move=self) + if self.effect == 429 and defender.stat_increased: + msg += defender.nv.apply_status("burn", battle, attacker=attacker, move=self) + if self.effect == 37: + status = random.choice(["burn", "freeze", "paralysis"]) + if random.randint(1, 100) <= effect_chance: + msg += defender.nv.apply_status(status, battle, attacker=attacker, move=self) + if self.effect == 464: + status = random.choice(["poison", "paralysis", "sleep"]) + if random.randint(1, 100) <= effect_chance: + msg += defender.nv.apply_status(status, battle, attacker=attacker, move=self) + if self.effect in (6, 261, 275, 380): + if random.randint(1, 100) <= effect_chance: + msg += defender.nv.apply_status("freeze", battle, attacker=attacker, move=self) + if self.effect in (7, 153, 263, 264, 276, 332, 372, 396): + if random.randint(1, 100) <= effect_chance: + msg += defender.nv.apply_status("paralysis", battle, attacker=attacker, move=self) + if self.effect == 68: + msg += defender.nv.apply_status("paralysis", battle, attacker=attacker, move=self) + if self.effect in (3, 78, 210, 447, 461): + if random.randint(1, 100) <= effect_chance: + msg += defender.nv.apply_status("poison", battle, attacker=attacker, move=self) + if self.effect in (67, 390, 486): + msg += defender.nv.apply_status("poison", battle, attacker=attacker, move=self) + if self.effect == 203: + if random.randint(1, 100) <= effect_chance: + msg += defender.nv.apply_status("b-poison", battle, attacker=attacker, move=self) + if self.effect == 34: + msg += defender.nv.apply_status("b-poison", battle, attacker=attacker, move=self) + if self.effect == 2: + if self.id == 464 and attacker._name != "Darkrai": + msg += f"{attacker.name} can't use the move!\n" + else: + msg += defender.nv.apply_status("sleep", battle, attacker=attacker, move=self) + if self.effect == 330: + if random.randint(1, 100) <= effect_chance: + msg += defender.nv.apply_status("sleep", battle, attacker=attacker, move=self) + if self.effect == 38: + msg += attacker.nv.apply_status("sleep", battle, attacker=attacker, move=self, turns=3, force=True) + if attacker.nv.sleep(): + msg += f"{attacker.name}'s slumber restores its health back to full!\n" + attacker.hp = attacker.starting_hp + if self.effect in (50, 119, 167, 200): + msg += defender.confuse(attacker=attacker, move=self) + # This checks if attacker.locked_move is not None as locked_move is cleared if the poke dies to rocky helmet or similar items + if self.effect == 28 and attacker.locked_move is not None and attacker.locked_move.is_last_turn(): + msg += attacker.confuse() + if self.effect in (77, 268, 334, 478): + if random.randint(1, 100) <= effect_chance: + msg += defender.confuse(attacker=attacker, move=self) + if self.effect == 497 and defender.stat_increased: + msg += defender.confuse(attacker=attacker, move=self) + if self.effect in (194, 457, 472): + attacker.nv.reset() + msg += f"{attacker.name}'s status was cleared!\n" + if self.effect == 386: + if defender.nv.burn(): + defender.nv.reset() + msg += f"{defender.name}'s burn was healed!\n" + + # Stage changes + # +1 + if self.effect in (11, 209, 213, 278, 313, 323, 328, 392, 414, 427, 468, 472, 487): + msg += attacker.append_attack(1, attacker=attacker, move=self) + if self.effect in (12, 157, 161, 207, 209, 323, 367, 414, 427, 467, 468, 472): + msg += attacker.append_defense(1, attacker=attacker, move=self) + if self.effect in (14, 212, 291, 328, 392, 414, 427, 472): + msg += attacker.append_spatk(1, attacker=attacker, move=self) + if self.effect in (161, 175, 207, 212, 291, 367, 414, 427, 472): + msg += attacker.append_spdef(1, attacker=attacker, move=self) + if self.effect in (130, 213, 291, 296, 414, 427, 442, 468, 469, 487): + msg += attacker.append_speed(1, attacker=attacker, move=self) + if self.effect in (17, 467): + msg += attacker.append_evasion(1, attacker=attacker, move=self) + if self.effect in (278, 323): + msg += attacker.append_accuracy(1, attacker=attacker, move=self) + if self.effect == 139: + if random.randint(1, 100) <= effect_chance: + msg += attacker.append_defense(1, attacker=attacker, move=self) + if self.effect in (140, 375): + if random.randint(1, 100) <= effect_chance: + msg += attacker.append_attack(1, attacker=attacker, move=self) + if self.effect == 277: + if random.randint(1, 100) <= effect_chance: + msg += attacker.append_spatk(1, attacker=attacker, move=self) + if self.effect == 433: + if random.randint(1, 100) <= effect_chance: + msg += attacker.append_speed(1, attacker=attacker, move=self) + if self.effect == 167: + msg += defender.append_spatk(1, attacker=attacker, move=self) + # +2 + if self.effect in (51, 309): + msg += attacker.append_attack(2, attacker=attacker, move=self) + if self.effect in (52, 453): + msg += attacker.append_defense(2, attacker=attacker, move=self) + if self.effect in (53, 285, 309, 313, 366): + msg += attacker.append_speed(2, attacker=attacker, move=self) + if self.effect in (54, 309, 366): + msg += attacker.append_spatk(2, attacker=attacker, move=self) + if self.effect in (55, 366): + msg += attacker.append_spdef(2, attacker=attacker, move=self) + if self.effect == 109: + msg += attacker.append_evasion(2, attacker=attacker, move=self) + if self.effect in (119, 432, 483): + msg += defender.append_attack(2, attacker=attacker, move=self) + if self.effect == 432: + msg += defender.append_spatk(2, attacker=attacker, move=self) + if self.effect == 359: + if random.randint(1, 100) <= effect_chance: + msg += attacker.append_defense(2, attacker=attacker, move=self) + # -1 + if self.effect in (19, 206, 344, 347, 357, 365, 388, 412): + msg += defender.append_attack(-1, attacker=attacker, move=self) + if self.effect in (20, 206): + msg += defender.append_defense(-1, attacker=attacker, move=self) + if self.effect in (344, 347, 358, 412): + msg += defender.append_spatk(-1, attacker=attacker, move=self) + if self.effect == 428: + msg += defender.append_spdef(-1, attacker=attacker, move=self) + if self.effect in (331, 390): + msg += defender.append_speed(-1, attacker=attacker, move=self) + if self.effect == 24: + msg += defender.append_accuracy(-1, attacker=attacker, move=self) + if self.effect in (25, 259): + msg += defender.append_evasion(-1, attacker=attacker, move=self) + if self.effect in (69, 396): + if random.randint(1, 100) <= effect_chance: + msg += defender.append_attack(-1, attacker=attacker, move=self) + if self.effect in (70, 397, 435): + if random.randint(1, 100) <= effect_chance: + msg += defender.append_defense(-1, attacker=attacker, move=self) + if self.effect == 475: + # This one has two different chance percents, one has to be hardcoded + if random.randint(1, 100) <= 50: + msg += defender.append_defense(-1, attacker=attacker, move=self) + if self.effect in (21, 71, 357, 477): + if random.randint(1, 100) <= effect_chance: + msg += defender.append_speed(-1, attacker=attacker, move=self) + if self.effect == 72: + if random.randint(1, 100) <= effect_chance: + msg += defender.append_spatk(-1, attacker=attacker, move=self) + if self.effect == 73: + if random.randint(1, 100) <= effect_chance: + msg += defender.append_spdef(-1, attacker=attacker, move=self) + if self.effect == 74: + if random.randint(1, 100) <= effect_chance: + msg += defender.append_accuracy(-1, attacker=attacker, move=self) + if self.effect == 183: + msg += attacker.append_attack(-1, attacker=attacker, move=self) + if self.effect in (183, 230, 309, 335, 405, 438, 442): + msg += attacker.append_defense(-1, attacker=attacker, move=self) + if self.effect == 480: + msg += attacker.append_spatk(-1, attacker=attacker, move=self) + if self.effect in (230, 309, 335): + msg += attacker.append_spdef(-1, attacker=attacker, move=self) + if self.effect in (219, 335): + msg += attacker.append_speed(-1, attacker=attacker, move=self) + # -2 + if self.effect in (59, 169): + msg += defender.append_attack(-2, attacker=attacker, move=self) + if self.effect in (60, 483): + msg += defender.append_defense(-2, attacker=attacker, move=self) + if self.effect == 61: + msg += defender.append_speed(-2, attacker=attacker, move=self) + if self.effect in (62, 169, 266): + msg += defender.append_spatk(-2, attacker=attacker, move=self) + if self.effect == 63: + msg += defender.append_spdef(-2, attacker=attacker, move=self) + if self.effect in (272, 297): + if random.randint(1, 100) <= effect_chance: + msg += defender.append_spdef(-2, attacker=attacker, move=self) + if self.effect == 205: + msg += attacker.append_spatk(-2, attacker=attacker, move=self) + if self.effect == 479: + msg += attacker.append_speed(-2, attacker=attacker, move=self) + # other + if self.effect == 26: + attacker.attack_stage = 0 + attacker.defense_stage = 0 + attacker.spatk_stage = 0 + attacker.spdef_stage = 0 + attacker.speed_stage = 0 + attacker.accuracy_stage = 0 + attacker.evasion_stage = 0 + defender.attack_stage = 0 + defender.defense_stage = 0 + defender.spatk_stage = 0 + defender.spdef_stage = 0 + defender.speed_stage = 0 + defender.accuracy_stage = 0 + defender.evasion_stage = 0 + msg += "All pokemon had their stat stages reset!\n" + if self.effect == 305: + defender.attack_stage = 0 + defender.defense_stage = 0 + defender.spatk_stage = 0 + defender.spdef_stage = 0 + defender.speed_stage = 0 + defender.accuracy_stage = 0 + defender.evasion_stage = 0 + msg += f"{defender.name} had their stat stages reset!\n" + if self.effect == 141: + if random.randint(1, 100) <= effect_chance: + msg += attacker.append_attack(1, attacker=attacker, move=self) + msg += attacker.append_defense(1, attacker=attacker, move=self) + msg += attacker.append_spatk(1, attacker=attacker, move=self) + msg += attacker.append_spdef(1, attacker=attacker, move=self) + msg += attacker.append_speed(1, attacker=attacker, move=self) + if self.effect == 143: + msg += attacker.damage(attacker.starting_hp // 2, battle) + msg += attacker.append_attack(12, attacker=attacker, move=self) + if self.effect == 317: + amount = 1 + if battle.weather.get() in ("sun", "h-sun"): + amount = 2 + msg += attacker.append_attack(amount, attacker=attacker, move=self) + msg += attacker.append_spatk(amount, attacker=attacker, move=self) + if self.effect == 364 and defender.nv.poison(): + msg += defender.append_attack(-1, attacker=attacker, move=self) + msg += defender.append_spatk(-1, attacker=attacker, move=self) + msg += defender.append_speed(-1, attacker=attacker, move=self) + if self.effect == 329: + msg += attacker.append_defense(3, attacker=attacker, move=self) + if self.effect == 322: + msg += attacker.append_spatk(3, attacker=attacker, move=self) + if self.effect == 227: + valid_stats = [] + if attacker.attack_stage < 6: + valid_stats.append(attacker.append_attack) + if attacker.defense_stage < 6: + valid_stats.append(attacker.append_defense) + if attacker.spatk_stage < 6: + valid_stats.append(attacker.append_spatk) + if attacker.spdef_stage < 6: + valid_stats.append(attacker.append_spdef) + if attacker.speed_stage < 6: + valid_stats.append(attacker.append_speed) + if attacker.evasion_stage < 6: + valid_stats.append(attacker.append_evasion) + if attacker.accuracy_stage < 6: + valid_stats.append(attacker.append_accuracy) + if valid_stats: + stat_raise_func = random.choice(valid_stats) + msg += stat_raise_func(2, attacker=attacker, move=self) + else: + msg += f"None of {attacker.name}'s stats can go any higher!\n" + if self.effect == 473: + raw_atk = attacker.get_raw_attack() + attacker.get_raw_spatk() + raw_def = attacker.get_raw_defense() + attacker.get_raw_spdef() + if raw_atk > raw_def: + msg += attacker.append_attack(1, attacker=attacker, move=self) + msg += attacker.append_spatk(1, attacker=attacker, move=self) + else: + msg += attacker.append_defense(1, attacker=attacker, move=self) + msg += attacker.append_spdef(1, attacker=attacker, move=self) + if self.effect == 485: + msg += attacker.damage(attacker.starting_hp // 2, battle) + msg += attacker.append_attack(2, attacker=attacker, move=self) + msg += attacker.append_spatk(2, attacker=attacker, move=self) + msg += attacker.append_speed(2, attacker=attacker, move=self) + + # Flinch + if not defender.has_moved: + for _ in range(numhits): + if defender.flinched: + break + if self.effect in (32, 76, 93, 147, 151, 159, 274, 275, 276, 425, 475, 501): + if random.randint(1, 100) <= effect_chance: + msg += defender.flinch(move=self, attacker=attacker) + elif self.damage_class in (DamageClass.PHYSICAL, DamageClass.SPECIAL): + if attacker.ability() == Ability.STENCH: + if random.randint(1, 100) <= 10: + msg += defender.flinch(move=self, attacker=attacker, source="its stench") + elif attacker.held_item == "kings-rock": + if random.randint(1, 100) <= 10: + msg += defender.flinch(move=self, attacker=attacker, source="its kings rock") + elif attacker.held_item == "razor-fang": + if random.randint(1, 100) <= 10: + msg += defender.flinch(move=self, attacker=attacker, source="its razor fang") + + # Move locking + if self.effect == 87: + if defender.ability(attacker=attacker, move=self) == Ability.AROMA_VEIL: + msg += f"{defender.name}'s aroma veil protects its move from being disabled!\n" + else: + defender.disable.set(defender.last_move, random.randint(4, 7)) + msg += f"{defender.name}'s {defender.last_move.pretty_name} was disabled!\n" + if self.effect == 176: + if defender.ability(attacker=attacker, move=self) == Ability.OBLIVIOUS: + msg += f"{defender.name} is too oblivious to be taunted!\n" + elif defender.ability(attacker=attacker, move=self) == Ability.AROMA_VEIL: + msg += f"{defender.name}'s aroma veil protects it from being taunted!\n" + else: + if defender.has_moved: + defender.taunt.set_turns(4) + else: + defender.taunt.set_turns(3) + msg += f"{defender.name} is being taunted!\n" + if self.effect == 91: + if defender.ability(attacker=attacker, move=self) == Ability.AROMA_VEIL: + msg += f"{defender.name}'s aroma veil protects it from being encored!\n" + else: + defender.encore.set(defender.last_move, 4) + if not defender.has_moved: + defender.owner.selected_action = defender.last_move + msg += f"{defender.name} is giving an encore!\n" + if self.effect == 166: + if defender.ability(attacker=attacker, move=self) == Ability.AROMA_VEIL: + msg += f"{defender.name}'s aroma veil protects it from being tormented!\n" + else: + defender.torment = True + msg += f"{defender.name} is tormented!\n" + if self.effect == 193: + attacker.imprison = True + msg += f"{attacker.name} imprisons!\n" + if self.effect == 237: + if defender.ability(attacker=attacker, move=self) == Ability.AROMA_VEIL: + msg += f"{defender.name}'s aroma veil protects it from being heal blocked!\n" + else: + defender.heal_block.set_turns(5) + msg += f"{defender.name} is blocked from healing!\n" + if self.effect == 496: + if defender.ability(attacker=attacker, move=self) == Ability.AROMA_VEIL: + msg += f"{defender.name}'s aroma veil protects it from being heal blocked!\n" + else: + defender.heal_block.set_turns(2) + msg += f"{defender.name} is blocked from healing!\n" + + # Weather changing + if self.effect == 116: + msg += battle.weather.set("sandstorm", attacker) + if self.effect == 137: + msg += battle.weather.set("rain", attacker) + if self.effect == 138: + msg += battle.weather.set("sun", attacker) + if self.effect == 165: + msg += battle.weather.set("hail", attacker) + + # Terrain changing + if self.effect == 352: + msg += battle.terrain.set("grassy", attacker) + if self.effect == 353: + msg += battle.terrain.set("misty", attacker) + if self.effect == 369: + msg += battle.terrain.set("electric", attacker) + if self.effect == 395: + msg += battle.terrain.set("psychic", attacker) + + # Protection + if self.effect in (112, 117, 279, 356, 362, 384, 454, 488, 499): + attacker.protection_used = True + attacker.protection_chance *= 3 + if self.effect == 112: + attacker.protect = True + msg += f"{attacker.name} protected itself!\n" + if self.effect == 117: + attacker.endure = True + msg += f"{attacker.name} braced itself!\n" + if self.effect == 279: + attacker.wide_guard = True + msg += f"Wide guard protects {attacker.name}!\n" + if self.effect == 350: + attacker.crafty_shield = True + msg += f"A crafty shield protects {attacker.name} from status moves!\n" + if self.effect == 356: + attacker.king_shield = True + msg += f"{attacker.name} shields itself!\n" + if self.effect == 362: + attacker.spiky_shield = True + msg += f"{attacker.name} shields itself!\n" + if self.effect == 377: + attacker.mat_block = True + msg += f"{attacker.name} shields itself!\n" + if self.effect == 384: + attacker.baneful_bunker = True + msg += f"{attacker.name} bunkers down!\n" + if self.effect == 307: + attacker.quick_guard = True + msg += f"{attacker.name} guards itself!\n" + if self.effect == 454: + attacker.obstruct = True + msg += f"{attacker.name} protected itself!\n" + if self.effect == 488: + attacker.silk_trap = True + msg += f"{attacker.name} protected itself!\n" + if self.effect == 499: + attacker.burning_bulwark = True + msg += f"{attacker.name} protected itself!\n" + + # Life orb + if ( + attacker.held_item == "life-orb" + and defender.owner.has_alive_pokemon() + and self.damage_class != DamageClass.STATUS + and (attacker.ability() != Ability.SHEER_FORCE or self.effect_chance is None) + and self.effect != 149 + ): + msg += attacker.damage(attacker.starting_hp // 10, battle, source="its life orb") + + # Swap outs + # A poke is force-swapped out before activating red-card + if self.effect in (29, 314): + swaps = defender.owner.valid_swaps(attacker, battle, check_trap=False) + if not swaps: + pass + elif defender.ability(attacker=attacker, move=self) == Ability.SUCTION_CUPS: + msg += f"{defender.name}'s suction cups kept it in place!\n" + elif defender.ability(attacker=attacker, move=self) == Ability.GUARD_DOG: + msg += f"{defender.name}'s guard dog kept it in place!\n" + elif defender.ingrain: + msg += f"{defender.name} is ingrained in the ground!\n" + else: + msg += f"{defender.name} fled in fear!\n" + msg += defender.remove(battle) + idx = random.choice(swaps) + defender.owner.switch_poke(idx, mid_turn=True) + msg += defender.owner.current_pokemon.send_out(attacker, battle) + # Safety in case the poke dies on send out. + if defender.owner.current_pokemon is not None: + defender.owner.current_pokemon.has_moved = True + # A red-card forces the attacker to swap to a random poke, even if they used a switch out move + elif defender.held_item == "red-card" and defender.hp > 0 and self.damage_class != DamageClass.STATUS: + swaps = attacker.owner.valid_swaps(defender, battle, check_trap=False) + if not swaps: + pass + elif attacker.ability(attacker=defender, move=self) == Ability.SUCTION_CUPS: + msg += f"{attacker.name}'s suction cups kept it in place from {defender.name}'s red card!\n" + defender.held_item.use() + elif attacker.ability(attacker=defender, move=self) == Ability.GUARD_DOG: + msg += f"{attacker.name}'s guard dog kept it in place from {defender.name}'s red card!\n" + defender.held_item.use() + elif attacker.ingrain: + msg += f"{attacker.name} is ingrained in the ground from {defender.name}'s red card!\n" + defender.held_item.use() + else: + msg += f"{defender.name} held up its red card against {attacker.name}!\n" + defender.held_item.use() + msg += attacker.remove(battle) + idx = random.choice(swaps) + attacker.owner.switch_poke(idx, mid_turn=True) + msg += attacker.owner.current_pokemon.send_out(defender, battle) + # Safety in case the poke dies on send out. + if attacker.owner.current_pokemon is not None: + attacker.owner.current_pokemon.has_moved = True + elif self.effect in (128, 154, 229, 347): + swaps = attacker.owner.valid_swaps(defender, battle, check_trap=False) + if swaps: + msg += f"{attacker.name} went back!\n" + if self.effect == 128: + attacker.owner.baton_pass = BatonPass(attacker) + msg += attacker.remove(battle) + # Force this pokemon to immediately return to be attacked + attacker.owner.mid_turn_remove = True + + # Trapping + if self.effect in (107, 374, 385, 449, 452) and not defender.trapping: + defender.trapping = True + msg += f"{defender.name} can't escape!\n" + if self.effect == 449 and not attacker.trapping: + attacker.trapping = True + msg += f"{attacker.name} can't escape!\n" + + # Attacker faints + if self.effect in (169, 221, 271, 321): + msg += attacker.faint(battle) + + # Struggle + if self.effect == 255: + msg += attacker.damage(attacker.starting_hp // 4, battle, attacker=attacker) + + # Pain Split + if self.effect == 92: + hp = (attacker.hp + defender.hp) // 2 + attacker.hp = min(attacker.starting_hp, hp) + defender.hp = min(defender.starting_hp, hp) + msg += "The battlers share their pain!\n" + + # Spite + if self.effect == 101: + defender.last_move.pp = max(0, defender.last_move.pp - 4) + msg += f"{defender.name}'s {defender.last_move.pretty_name} was reduced!\n" + + # Eerie Spell + if self.effect == 439 and defender.last_move is not None: + defender.last_move.pp = max(0, defender.last_move.pp - 3) + msg += f"{defender.name}'s {defender.last_move.pretty_name} was reduced!\n" + + # Heal Bell + if self.effect == 103: + for poke in attacker.owner.party: + poke.nv.reset() + msg += f"A bell chimed, and all of {attacker.owner.name}'s pokemon had status conditions removed!\n" + + # Psycho Shift + if self.effect == 235: + transfered_status = attacker.nv.current + msg += defender.nv.apply_status(transfered_status, battle, attacker=attacker, move=self) + if defender.nv.current == transfered_status: + attacker.nv.reset() + msg += f"{attacker.name}'s {transfered_status} was transfered to {defender.name}!\n" + else: + msg += "But it failed!\n" + + # Defog + if self.effect == 259: + defender.owner.spikes = 0 + defender.owner.toxic_spikes = 0 + defender.owner.stealth_rock = False + defender.owner.sticky_web = False + defender.owner.aurora_veil = ExpiringEffect(0) + defender.owner.light_screen = ExpiringEffect(0) + defender.owner.reflect = ExpiringEffect(0) + defender.owner.mist = ExpiringEffect(0) + defender.owner.safeguard = ExpiringEffect(0) + attacker.owner.spikes = 0 + attacker.owner.toxic_spikes = 0 + attacker.owner.stealth_rock = False + attacker.owner.sticky_web = False + battle.terrain.end() + msg += f"{attacker.name} blew away the fog!\n" + + # Trick room + if self.effect == 260: + if battle.trick_room.active(): + battle.trick_room.set_turns(0) + msg += "The Dimensions returned back to normal!\n" + else: + battle.trick_room.set_turns(5) + msg += f"{attacker.name} twisted the dimensions!\n" + + # Magic Room + if self.effect == 287: + if battle.magic_room.active(): + battle.magic_room.set_turns(0) + msg += "The room returns to normal, and held items regain their effect!\n" + else: + battle.magic_room.set_turns(5) + msg += "A bizzare area was created, and pokemon's held items lost their effect!\n" + + # Wonder Room + if self.effect == 282: + if battle.wonder_room.active(): + battle.wonder_room.set_turns(0) + msg += "The room returns to normal, and stats swap back to what they were before!\n" + else: + battle.wonder_room.set_turns(5) + msg += "A bizzare area was created, and pokemon's defense and special defense were swapped!\n" + + # Perish Song + if self.effect == 115: + msg += "All pokemon hearing the song will faint after 3 turns!\n" + if attacker.perish_song.active(): + msg += f"{attacker.name} is already under the effect of perish song!\n" + else: + attacker.perish_song.set_turns(4) + if defender.perish_song.active(): + msg += f"{defender.name} is already under the effect of perish song!\n" + elif defender.ability(attacker=attacker, move=self) == Ability.SOUNDPROOF: + msg += f"{defender.name}'s soundproof protects it from hearing the song!\n" + else: + defender.perish_song.set_turns(4) + + # Nightmare + if self.effect == 108: + defender.nightmare = True + msg += f"{defender.name} fell into a nightmare!\n" + + # Gravity + if self.effect == 216: + battle.gravity.set_turns(5) + msg += "Gravity intensified!\n" + defender.telekinesis.set_turns(0) + if defender.fly: + defender.fly = False + defender.locked_move = None + msg += f"{defender.name} fell from the sky!\n" + + # Spikes + if self.effect == 113: + defender.owner.spikes += 1 + msg += f"Spikes were scattered around the feet of {defender.owner.name}'s team!\n" + + # Toxic Spikes + if self.effect == 250: + defender.owner.toxic_spikes += 1 + msg += f"Toxic spikes were scattered around the feet of {defender.owner.name}'s team!\n" + + # Stealth Rock + if self.effect == 267: + defender.owner.stealth_rock = True + msg += f"Pointed stones float in the air around {defender.owner.name}'s team!\n" + + # Sticky Web + if self.effect == 341: + defender.owner.sticky_web = True + msg += f"A sticky web is shot around the feet of {defender.owner.name}'s team!\n" + + # Defense curl + if self.effect == 157 and not attacker.defense_curl: + attacker.defense_curl = True + + # Psych Up + if self.effect == 144: + attacker.attack_stage = defender.attack_stage + attacker.defense_stage = defender.defense_stage + attacker.spatk_stage = defender.spatk_stage + attacker.spdef_stage = defender.spdef_stage + attacker.speed_stage = defender.speed_stage + attacker.accuracy_stage = defender.accuracy_stage + attacker.evasion_stage = defender.evasion_stage + attacker.focus_energy = defender.focus_energy + msg += "It psyched itself up!\n" + + # Conversion + if self.effect == 31: + t = attacker.moves[0].type + if t not in ElementType.__members__.values(): + t = ElementType.NORMAL + attacker.type_ids = [t] + t = ElementType(t).name.lower() + msg += f"{attacker.name} transformed into a {t} type!\n" + + # Conversion 2 + if self.effect == 94: + t = self.get_conversion_2(attacker, defender, battle) + attacker.type_ids = [t] + t = ElementType(t).name.lower() + msg += f"{attacker.name} transformed into a {t} type!\n" + + # Burn up + if self.effect == 398: + attacker.type_ids.remove(ElementType.FIRE) + msg += f"{attacker.name} lost its fire type!\n" + + # Double shock + if self.effect == 481: + attacker.type_ids.remove(ElementType.ELECTRIC) + msg += f"{attacker.name} lost its electric type!\n" + + # Forest's Curse + if self.effect == 376: + defender.type_ids.append(ElementType.GRASS) + msg += f"{defender.name} added grass type!\n" + + # Trick or Treat + if self.effect == 343: + defender.type_ids.append(ElementType.GHOST) + msg += f"{defender.name} added ghost type!\n" + + # Soak + if self.effect == 295: + defender.type_ids = [ElementType.WATER] + msg += f"{defender.name} was transformed into a water type!\n" + + # Magic Powder + if self.effect == 456: + defender.type_ids = [ElementType.PSYCHIC] + msg += f"{defender.name} was transformed into a psychic type!\n" + + # Camouflage + if self.effect == 214: + if battle.terrain.item == "grassy": + attacker.type_ids = [ElementType.GRASS] + msg += f"{attacker.name} was transformed into a grass type!\n" + elif battle.terrain.item == "misty": + attacker.type_ids = [ElementType.FAIRY] + msg += f"{attacker.name} was transformed into a fairy type!\n" + elif battle.terrain.item == "electric": + attacker.type_ids = [ElementType.ELECTRIC] + msg += f"{attacker.name} was transformed into a electric type!\n" + elif battle.terrain.item == "psychic": + attacker.type_ids = [ElementType.PSYCHIC] + msg += f"{attacker.name} was transformed into a psychic type!\n" + else: + attacker.type_ids = [ElementType.NORMAL] + msg += f"{attacker.name} was transformed into a normal type!\n" + + # Role Play + if self.effect == 179: + attacker.ability_id = defender.ability_id + ability_name = Ability(attacker.ability_id).pretty_name + msg += f"{attacker.name} acquired {ability_name}!\n" + msg += attacker.send_out_ability(defender, battle) + + # Simple Beam + if self.effect == 299: + defender.ability_id = Ability.SIMPLE + msg += f"{defender.name} acquired simple!\n" + msg += defender.send_out_ability(attacker, battle) + + # Entrainment + if self.effect == 300: + defender.ability_id = attacker.ability_id + ability_name = Ability(defender.ability_id).pretty_name + msg += f"{defender.name} acquired {ability_name}!\n" + msg += defender.send_out_ability(attacker, battle) + + # Worry Seed + if self.effect == 248: + defender.ability_id = Ability.INSOMNIA + if defender.nv.sleep(): + defender.nv.reset() + msg += f"{defender.name} acquired insomnia!\n" + msg += defender.send_out_ability(attacker, battle) + + # Skill Swap + if self.effect == 192: + defender.ability_id, attacker.ability_id = attacker.ability_id, defender.ability_id + ability_name = Ability(defender.ability_id).pretty_name + msg += f"{defender.name} acquired {ability_name}!\n" + msg += defender.send_out_ability(attacker, battle) + ability_name = Ability(attacker.ability_id).pretty_name + msg += f"{attacker.name} acquired {ability_name}!\n" + msg += attacker.send_out_ability(defender, battle) + + # Aurora Veil + if self.effect == 407: + if attacker.held_item == "light-clay": + attacker.owner.aurora_veil.set_turns(8) + else: + attacker.owner.aurora_veil.set_turns(5) + msg += f"{attacker.name} put up its aurora veil!\n" + + # Light Screen + if self.effect in (36, 421): + if attacker.held_item == "light-clay": + attacker.owner.light_screen.set_turns(8) + else: + attacker.owner.light_screen.set_turns(5) + msg += f"{attacker.name} put up its light screen!\n" + + # Reflect + if self.effect in (66, 422): + if attacker.held_item == "light-clay": + attacker.owner.reflect.set_turns(8) + else: + attacker.owner.reflect.set_turns(5) + msg += f"{attacker.name} put up its reflect!\n" + + # Mist + if self.effect == 47: + attacker.owner.mist.set_turns(5) + msg += f"{attacker.name} gained the protection of mist!\n" + + # Bind + if self.effect in (43, 262) and not defender.substitute and not defender.bind.active(): + if attacker.held_item == "grip-claw": + defender.bind.set_turns(7) + else: + defender.bind.set_turns(random.randint(4, 5)) + msg += f"{defender.name} was squeezed!\n" + + # Sketch + if self.effect == 96: + m = defender.last_move.copy() + attacker.moves[attacker.moves.index(self)] = m + msg += f"The move {m.pretty_name} was sketched!\n" + + # Transform + if self.effect == 58: + msg += f"{attacker.name} transformed into {defender._name}!\n" + attacker.transform(defender) + + # Substitute + if self.effect == 80: + hp = attacker.starting_hp // 4 + msg += attacker.damage(hp, battle, attacker=attacker, source="building a substitute") + attacker.substitute = hp + attacker.bind = ExpiringEffect(0) + msg += f"{attacker.name} made a substitute!\n" + + # Shed Tail + if self.effect == 493: + hp = attacker.starting_hp // 4 + msg += attacker.damage(attacker.starting_hp // 2, battle, attacker=attacker, source="building a substitute") + attacker.owner.next_substitute = hp + attacker.bind = ExpiringEffect(0) + msg += f"{attacker.name} left behind a substitute!\n" + msg += attacker.remove(battle) + # Force this pokemon to immediately return to be attacked + attacker.owner.mid_turn_remove = True + + # Throat Chop + if self.effect == 393 and not defender.silenced.active(): + if random.randint(1, 100) <= effect_chance: + defender.silenced.set_turns(3) + msg += f"{defender.name} was silenced!\n" + + # Speed Swap + if self.effect == 399: + attacker.speed, defender.speed = defender.speed, attacker.speed + msg += "Both pokemon exchange speed!\n" + + # Mimic + if self.effect == 83: + m = defender.last_move.copy() + m.pp = m.starting_pp + attacker.moves[attacker.moves.index(self)] = m + msg += f"{attacker.name} mimicked {m.pretty_name}!\n" + + # Rage + if self.effect == 82: + attacker.rage = True + msg += f"{attacker.name}'s rage is building!\n" + + # Mind Reader + if self.effect == 95: + defender.mind_reader.set(attacker, 2) + msg += f"{attacker.name} took aim at {defender.name}!\n" + + # Destiny Bond + if self.effect == 99: + attacker.destiny_bond = True + attacker.destiny_bond_cooldown.set_turns(2) + msg += f"{attacker.name} is trying to take its foe with it!\n" + + # Ingrain + if self.effect == 182: + attacker.ingrain = True + msg += f"{attacker.name} planted its roots!\n" + + # Attract + if self.effect == 121: + msg += defender.infatuate(attacker, move=self) + + # Heart Swap + if self.effect == 251: + attacker.attack_stage, defender.attack_stage = defender.attack_stage, attacker.attack_stage + attacker.defense_stage, defender.defense_stage = defender.defense_stage, attacker.defense_stage + attacker.spatk_stage, defender.spatk_stage = defender.spatk_stage, attacker.spatk_stage + attacker.spdef_stage, defender.spdef_stage = defender.spdef_stage, attacker.spdef_stage + attacker.speed_stage, defender.speed_stage = defender.speed_stage, attacker.speed_stage + attacker.accuracy_stage, defender.accuracy_stage = defender.accuracy_stage, attacker.accuracy_stage + attacker.evasion_stage, defender.evasion_stage = defender.evasion_stage, attacker.evasion_stage + msg += f"{attacker.name} switched stat changes with {defender.name}!\n" + + # Power Swap + if self.effect == 244: + attacker.attack_stage, defender.attack_stage = defender.attack_stage, attacker.attack_stage + attacker.spatk_stage, defender.spatk_stage = defender.spatk_stage, attacker.spatk_stage + msg += f"{attacker.name} switched attack and special attack stat changes with {defender.name}!\n" + + # Guard Swap + if self.effect == 245: + attacker.defense_stage, defender.defense_stage = defender.defense_stage, attacker.defense_stage + attacker.spdef_stage, defender.spdef_stage = defender.spdef_stage, attacker.spdef_stage + msg += f"{attacker.name} switched defense and special defense stat changes with {defender.name}!\n" + + # Aqua Ring + if self.effect == 252: + attacker.aqua_ring = True + msg += f"{attacker.name} surrounded itself with a veil of water!\n" + + # Magnet Rise + if self.effect == 253: + attacker.magnet_rise.set_turns(5) + msg += f"{attacker.name} levitated with electromagnetism!\n" + + # Healing Wish + if self.effect == 221: + attacker.owner.healing_wish = True + msg += f"{attacker.name}'s replacement will be restored!\n" + + # Lunar Dance + if self.effect == 271: + attacker.owner.lunar_dance = True + msg += f"{attacker.name}'s replacement will be restored!\n" + + # Gastro Acid + if self.effect == 240: + defender.ability_id = None + msg += f"{defender.name}'s ability was disabled!\n" + + # Lucky Chant + if self.effect == 241: + attacker.lucky_chant.set_turns(5) + msg += f"{attacker.name} is shielded from critical hits!\n" + + # Safeguard + if self.effect == 125: + attacker.owner.safeguard.set_turns(5) + msg += f"{attacker.name} is protected from status effects!\n" + + # Guard Split + if self.effect == 280: + attacker.defense_split = defender.get_raw_defense() + attacker.spdef_split = defender.get_raw_spdef() + defender.defense_split = attacker.get_raw_defense() + defender.spdef_split = attacker.get_raw_spdef() + msg += f"{attacker.name} and {defender.name} shared their guard!\n" + + # Power Split + if self.effect == 281: + attacker.attack_split = defender.get_raw_attack() + attacker.spatk_split = defender.get_raw_spatk() + defender.attack_split = attacker.get_raw_attack() + defender.spatk_split = attacker.get_raw_spatk() + msg += f"{attacker.name} and {defender.name} shared their power!\n" + + # Smack Down/Thousand Arrows + if self.effect in (288, 373): + defender.telekinesis.set_turns(0) + if defender.fly: + defender.fly = False + defender.locked_move = None + defender.has_moved = True + msg += f"{defender.name} was shot out of the air!\n" + if not defender.grounded(battle, attacker=attacker, move=self): + defender.grounded_by_move = True + msg += f"{defender.name} was grounded!\n" + + # Reflect Type + if self.effect == 319: + attacker.type_ids = defender.type_ids.copy() + msg += f"{attacker.name}'s type changed to match {defender.name}!\n" + + # Charge + if self.effect == 175: + # TODO: Gen 9 makes charge last until an electric move is used + attacker.charge.set_turns(2) + msg += f"{attacker.name} charges up electric type moves!\n" + + # Magic Coat + if self.effect == 184: + attacker.magic_coat = True + msg += f"{attacker.name} shrouded itself with a magic coat!\n" + + # Tailwind + if self.effect == 226: + attacker.owner.tailwind.set_turns(4) + msg += f"{attacker.owner.name}'s team gets a tailwind!\n" + if attacker.ability() == Ability.WIND_RIDER: + msg += attacker.append_attack(1, attacker=attacker, source="its wind rider") + + # Fling + if self.effect == 234 and attacker.held_item.can_remove(): + item = attacker.held_item.name + msg += f"{attacker.name}'s {item} was flung away!\n" + if attacker.held_item.is_berry(): + msg += attacker.held_item.eat_berry(consumer=defender, attacker=attacker, move=self) + else: + attacker.held_item.use() + if item == "flame-orb": + msg += defender.nv.apply_status("burn", battle, attacker=attacker, move=self) + elif item in ("kings-rock", "razor-fang"): + msg += defender.flinch(attacker=attacker, move=self) + elif item == "light-ball": + msg += defender.nv.apply_status("paralysis", battle, attacker=attacker, move=self) + elif item == "mental-herb": + defender.infatuated = None + defender.taunt = ExpiringEffect(0) + defender.encore = ExpiringItem() + defender.torment = False + defender.disable = ExpiringItem() + defender.heal_block = ExpiringEffect(0) + msg += f"{defender.name} feels refreshed!\n" + elif item == "poison-barb": + msg += defender.nv.apply_status("poison", battle, attacker=attacker, move=self) + elif item == "toxic-orb": + msg += defender.nv.apply_status("b-poison", battle, attacker=attacker, move=self) + elif item == "white-herb": + defender.attack_stage = max(0, defender.attack_stage) + defender.defense_stage = max(0, defender.defense_stage) + defender.spatk_stage = max(0, defender.spatk_stage) + defender.spdef_stage = max(0, defender.spdef_stage) + defender.speed_stage = max(0, defender.speed_stage) + defender.accuracy_stage = max(0, defender.accuracy_stage) + defender.evasion_stage = max(0, defender.evasion_stage) + msg += f"{defender.name} feels refreshed!\n" + + # Thief + if self.effect == 106 and defender.held_item.has_item() and defender.held_item.can_remove() and not defender.substitute and not attacker.held_item.has_item(): + if defender.ability(attacker=attacker, move=self) == Ability.STICKY_HOLD: + msg += f"{defender.name}'s sticky hand kept hold of its item!\n" + else: + defender.held_item.transfer(attacker.held_item) + msg += f"{defender.name}'s {attacker.held_item.name} was stolen!\n" + + # Trick + if self.effect == 178: + attacker.held_item.swap(defender.held_item) + msg += f"{attacker.name} and {defender.name} swapped their items!\n" + if attacker.held_item.name is not None: + msg += f"{attacker.name} gained {attacker.held_item.name}!\n" + if defender.held_item.name is not None: + msg += f"{defender.name} gained {defender.held_item.name}!\n" + + # Knock off + if self.effect == 189 and defender.held_item.has_item() and defender.held_item.can_remove() and not defender.substitute and attacker.hp > 0: + if defender.ability(attacker=attacker, move=self) == Ability.STICKY_HOLD: + msg += f"{defender.name}'s sticky hand kept hold of its item!\n" + else: + msg += f"{defender.name} lost its {defender.held_item.name}!\n" + defender.held_item.remove() + + # Teatime + if self.effect == 476: + msgadd = "" + for poke in (attacker, defender): + msgadd += poke.held_item.eat_berry(attacker=attacker, move=self) + msg += msgadd + if not msgadd: + msg += "But nothing happened..." + + # Corrosive Gas + if self.effect == 430: + if defender.ability(attacker=attacker, move=self) == Ability.STICKY_HOLD: + msg += f"{defender.name}'s sticky hand kept hold of its item!\n" + else: + msg += f"{defender.name}'s {defender.held_item.name} was corroded!\n" + defender.corrosive_gas = True + + # Mud Sport + if self.effect == 202: + attacker.owner.mud_sport.set_turns(6) + msg += "Electricity's power was weakened!\n" + + # Water Sport + if self.effect == 211: + attacker.owner.water_sport.set_turns(6) + msg += "Fire's power was weakened!\n" + + # Power Trick + if self.effect == 239: + attacker.power_trick = not attacker.power_trick + msg += f"{attacker.name} switched its Attack and Defense!\n" + + # Power Shift + if self.effect == 466: + attacker.power_shift = not attacker.power_shift + msg += f"{attacker.name} switched its offensive and defensive stats!\n" + + # Yank + if self.effect == 188: + if battle.terrain.item == "electric" and defender.grounded(battle, attacker=attacker, move=self): + msg += f"{defender.name} keeps alert from being shocked by the electric terrain!\n" + else: + defender.yawn.set_turns(2) + msg += f"{defender.name} is drowsy!\n" + + # Rototiller + if self.effect == 340: + for p in (attacker, defender): + if ElementType.GRASS not in p.type_ids: + continue + if not p.grounded(battle): + continue + if p.dive or p.dig or p.fly or p.shadow_force: + continue + msg += p.append_attack(1, attacker=attacker, move=self) + msg += p.append_spatk(1, attacker=attacker, move=self) + + # Flower Shield + if self.effect == 351: + for p in (attacker, defender): + if ElementType.GRASS not in p.type_ids: + continue + if not p.grounded(battle): + continue + if p.dive or p.dig or p.fly or p.shadow_force: + continue + msg += p.append_defense(1, attacker=attacker, move=self) + + # Ion Deluge + if self.effect == 345: + attacker.ion_deluge = True + msg += f"{attacker.name} charges up the air!\n" + + # Topsy Turvy + if self.effect == 348: + defender.attack_stage = -defender.attack_stage + defender.defense_stage = -defender.defense_stage + defender.spatk_stage = -defender.spatk_stage + defender.spdef_stage = -defender.spdef_stage + defender.speed_stage = -defender.speed_stage + defender.accuracy_stage = -defender.accuracy_stage + defender.evasion_stage = -defender.evasion_stage + msg += f"{defender.name}'s stat stages were inverted!\n" + + # Electrify + if self.effect == 354: + defender.electrify = True + msg += f"{defender.name}'s move was charged with electricity!\n" + + # Instruct + if self.effect == 403: + hm = defender.has_moved + defender.has_moved = False + msg += defender.last_move.use(defender, attacker, battle) + defender.has_moved = hm + + # Core Enforcer + if self.effect == 402 and defender.has_moved and defender.ability_changeable(): + defender.ability_id = None + msg += f"{defender.name}'s ability was nullified!\n" + + # Laser Focus + if self.effect == 391: + attacker.laser_focus.set_turns(2) + msg += f"{attacker.name} focuses!\n" + + # Powder + if self.effect == 378: + defender.powdered = True + msg += f"{defender.name} was coated in powder!\n" + + # Rapid/Mortal Spin + if self.effect in (130, 486): + attacker.bind.set_turns(0) + attacker.trapping = False + attacker.leech_seed = False + attacker.owner.spikes = 0 + attacker.owner.toxic_spikes = 0 + attacker.owner.stealth_rock = False + attacker.owner.sticky_web = False + msg += f"{attacker.name} was released!\n" + + # Snatch + if self.effect == 196: + attacker.snatching = True + msg += f"{attacker.name} waits for a target to make a move!\n" + + # Telekinesis + if self.effect == 286: + defender.telekinesis.set_turns(5) + msg += f"{defender.name} was hurled into the air!\n" + + # Embargo + if self.effect == 233: + defender.embargo.set_turns(6) + msg += f"{defender.name} can't use items anymore!\n" + + # Echoed Voice + if self.effect == 303: + attacker.echoed_voice_power = min(attacker.echoed_voice_power + 40, 200) + attacker.echoed_voice_used = True + msg += f"{attacker.name}'s voice echos!\n" + + # Bestow + if self.effect == 324: + attacker.held_item.transfer(defender.held_item) + msg += f"{attacker.name} gave its {defender.held_item.name} to {defender.name}!\n" + + # Curse + if self.effect == 110: + if ElementType.GHOST in attacker.type_ids: + msg += attacker.damage(attacker.starting_hp // 2, battle, source="inflicting the curse") + defender.curse = True + msg += f"{defender.name} was cursed!\n" + else: + msg += attacker.append_speed(-1, attacker=attacker, move=self) + msg += attacker.append_attack(1, attacker=attacker, move=self) + msg += attacker.append_defense(1, attacker=attacker, move=self) + + # Autotomize + if self.effect == 285: + attacker.autotomize += 1 + msg += f"{attacker.name} became nimble!\n" + + # Fell Stinger + if self.effect == 342 and defender.hp == 0: + msg += attacker.append_attack(3, attacker=attacker, move=self) + + # Fairy Lock + if self.effect == 355: + attacker.fairy_lock.set_turns(2) + msg += f"{attacker.name} prevents escape next turn!\n" + + # Grudge + if self.effect == 195: + attacker.grudge = True + msg += f"{attacker.name} has a grudge!\n" + + # Foresight + if self.effect == 114: + defender.foresight = True + msg += f"{attacker.name} identified {defender.name}!\n" + + # Miracle Eye + if self.effect == 217: + defender.miracle_eye = True + msg += f"{attacker.name} identified {defender.name}!\n" + + # Clangorous Soul + if self.effect == 414: + msg += attacker.damage(attacker.starting_hp // 3, battle) + + # No Retreat + if self.effect == 427: + attacker.no_retreat = True + msg += f"{attacker.name} takes its last stand!\n" + + # Recycle + if self.effect == 185: + attacker.held_item.recover(attacker.held_item) + msg += f"{attacker.name} recovered their {attacker.held_item.name}!\n" + if attacker.held_item.should_eat_berry(defender): + msg += attacker.held_item.eat_berry(attacker=defender, move=self) + + # Court Change + if self.effect == 431: + attacker.owner.spikes, defender.owner.spikes = defender.owner.spikes, attacker.owner.spikes + attacker.owner.toxic_spikes, defender.owner.toxic_spikes = defender.owner.toxic_spikes, attacker.owner.toxic_spikes + attacker.owner.stealth_rock, defender.owner.stealth_rock = defender.owner.stealth_rock, attacker.owner.stealth_rock + attacker.owner.sticky_web, defender.owner.sticky_web = defender.owner.sticky_web, attacker.owner.sticky_web + attacker.owner.aurora_veil, defender.owner.aurora_veil = defender.owner.aurora_veil, attacker.owner.aurora_veil + attacker.owner.light_screen, defender.owner.light_screen = defender.owner.light_screen, attacker.owner.light_screen + attacker.owner.reflect, defender.owner.reflect = defender.owner.reflect, attacker.owner.reflect + attacker.owner.mist, defender.owner.mist = defender.owner.mist, attacker.owner.mist + attacker.owner.safeguard, defender.owner.safeguard = defender.owner.safeguard, attacker.owner.safeguard + attacker.owner.tailwind, defender.owner.tailwind = defender.owner.tailwind, attacker.owner.tailwind + msg += "Active battle effects swapped sides!\n" + + # Roost + if self.effect == 215: + attacker.roost = True + if ElementType.FLYING in attacker.type_ids: + msg += f"{attacker.name}'s flying type is surpressed!\n" + + # Pluck + if self.effect == 225 and defender.ability(attacker=attacker, move=self) != Ability.STICKY_HOLD: + msg += defender.held_item.eat_berry(consumer=attacker) + + # Focus energy + if self.effect == 48: + attacker.focus_energy = True + msg += f"{attacker.name} focuses on its target!\n" + + # Natural Gift + if self.effect == 223: + msg += f"{attacker.name}'s {attacker.held_item.name} was consumed!\n" + attacker.held_item.use() + + # Gulp Missile + if self.effect == 258 and attacker.ability() == Ability.GULP_MISSILE and attacker._name == "Cramorant": + if attacker.hp > attacker.starting_hp // 2: + if attacker.form("Cramorant-gulping"): + msg += f"{attacker.name} gulped up an arrokuda!\n" + else: + if attacker.form("Cramorant-gorging"): + msg += f"{attacker.name} gulped up a pikachu!\n" + + # Steel Roller + if self.effect in (418, 448) and battle.terrain.item is not None: + battle.terrain.end() + msg += "The terrain was cleared!\n" + + # Octolock + if self.effect == 452: + defender.octolock = True + msg += f"{defender.name} is octolocked!\n" + + # Stuff Cheeks + if self.effect == 453: + msg += attacker.held_item.eat_berry() + + # Plasma Fists + if self.effect == 455: + if not battle.plasma_fists: + battle.plasma_fists = True + msg += f"{attacker.name} electrifies the battlefield, energizing normal type moves!\n" + + # Secret Power + if self.effect == 198: + if random.randint(1, 100) <= effect_chance: + if battle.terrain.item == "grassy": + msg += defender.nv.apply_status("sleep", battle, attacker=attacker, move=self) + elif battle.terrain.item == "misty": + msg += defender.append_spatk(-1, attacker=attacker, move=self) + elif battle.terrain.item == "psychic": + msg += defender.append_speed(-1, attacker=attacker, move=self) + else: + msg += defender.nv.apply_status("paralysis", battle, attacker=attacker, move=self) + + if self.is_sound_based() and attacker.held_item == "throat-spray": + msg += attacker.append_spatk(1, attacker=attacker, source="it's throat spray") + attacker.held_item.use() + + # Tar Shot + if self.effect == 477 and not defender.tar_shot: + defender.tar_shot = True + msg += f"{defender.name} is covered in sticky tar!\n" + + # Tidy Up + if self.effect == 487: + defender.owner.spikes = 0 + defender.owner.toxic_spikes = 0 + defender.owner.stealth_rock = False + defender.owner.sticky_web = False + defender.substitute = 0 + attacker.owner.spikes = 0 + attacker.owner.toxic_spikes = 0 + attacker.owner.stealth_rock = False + attacker.owner.sticky_web = False + attacker.substitute = 0 + msg += f"{attacker.name} tidied up!\n" + + # Syrup Bomb + if self.effect == 503: + defender.syrup_bomb.set_turns(4) + msg += f"{defender.name} got covered in sticky candy syrup!\n" + + # Dancer Ability - Runs at the end of move usage + if defender.ability(attacker=attacker, move=self) == Ability.DANCER and self.is_dance() and use_pp: + hm = defender.has_moved + msg += self.use(defender, attacker, battle, use_pp=False) + defender.has_moved = hm + + return msg + + def attack(self, attacker, defender, battle): + """ + Attacks the defender using this move. + + Returns a string of formatted results of this attack and the number of hits this move did. + """ + #https://bulbapedia.bulbagarden.net/wiki/Damage + msg = "" + current_type = self.get_type(attacker, defender, battle) + + # Move effectiveness + effectiveness = defender.effectiveness(current_type, battle, attacker=attacker, move=self) + if self.effect == 338: + effectiveness *= defender.effectiveness(ElementType.FLYING, battle, attacker=attacker, move=self) + if effectiveness <= 0: + return ("The attack had no effect!\n", 0) + if effectiveness <= .5: + msg += "It's not very effective...\n" + elif effectiveness >= 2: + msg += "It's super effective!\n" + + # Calculate the number of hits for this move. + parental_bond = False + min_hits = self.min_hits + max_hits = self.max_hits + if self.effect == 361 and attacker._name == "Greninja-ash": + hits = 3 + elif min_hits is not None and max_hits is not None: + # Handle hit range overrides + if attacker.ability() == Ability.SKILL_LINK: + min_hits = max_hits + elif attacker.held_item == "loaded-dice" and max_hits >= 4 and (min_hits < 4 or self.effect == 484): + min_hits = 4 + # Randomly select number of hits + if min_hits == 2 and max_hits == 5: + hits = random.choice([ + 2, 2, 2, 2, 2, 2, 2, + 3, 3, 3, 3, 3, 3, 3, + 4, 4, 4, + 5, 5, 5 + ]) + else: + hits = random.randint(min_hits, max_hits) + else: + if attacker.ability() == Ability.PARENTAL_BOND: + hits = 2 + parental_bond = True + else: + hits = 1 + + for hit in range(hits): + if defender.hp == 0: + break + # Explosion faints the user first, but should still do damage after death. + # Future sight still needs to hit after the attacker dies. + # Mind blown still needs to hit after the attacker dies. + if attacker.hp == 0 and self.effect not in (8, 149, 420, 444): + break + + # Critical hit chance + critical_stage = self.crit_rate + if attacker.held_item in ("scope-lens", "razor-claw"): + critical_stage += 1 + if attacker.ability() == Ability.SUPER_LUCK: + critical_stage += 1 + if attacker.focus_energy: + critical_stage += 2 + if attacker.lansat_berry_ate: + critical_stage += 2 + critical_stage = min(critical_stage, 3) + crit_map = { + 0: 24, + 1: 8, + 2: 2, + 3: 1, + } + critical = not random.randrange(crit_map[critical_stage]) + if attacker.ability() == Ability.MERCILESS and defender.nv.poison(): + critical = True + # Always scores a critical hit. + if self.effect == 289: + critical = True + if attacker.laser_focus.active(): + critical = True + if defender.ability(attacker=attacker, move=self) in (Ability.SHELL_ARMOR, Ability.BATTLE_ARMOR): + critical = False + if defender.lucky_chant.active(): + critical = False + # Confusion never crits + if self.id == 0xCFCF: + critical = False + + # Stats + if self.damage_class == DamageClass.PHYSICAL: + damage_class = DamageClass.PHYSICAL + a = attacker.get_attack( + battle, + critical=critical, + ignore_stages=defender.ability(attacker=attacker, move=self) == Ability.UNAWARE + ) + if self.effect == 304: + d = defender.get_raw_defense() + else: + d = defender.get_defense( + battle, + critical=critical, + ignore_stages=attacker.ability() == Ability.UNAWARE, + attacker=attacker, + move=self + ) + else: + damage_class = DamageClass.SPECIAL + a = attacker.get_spatk( + battle, + critical=critical, + ignore_stages=defender.ability(attacker=attacker, move=self) == Ability.UNAWARE + ) + if self.effect == 304: + d = defender.get_raw_spdef() + else: + d = defender.get_spdef( + battle, + critical=critical, + ignore_stages=attacker.ability() == Ability.UNAWARE, + attacker=attacker, + move=self + ) + + # Always uses defender's defense + if self.effect == 283: + d = defender.get_defense( + battle, + critical=critical, + ignore_stages=attacker.ability() == Ability.UNAWARE, + attacker=attacker, + move=self + ) + + # Use the user's defense instead of attack for the attack stat + if self.effect == 426: + # This does not pass critical, otherwise it would crop the wrong direction. + a = attacker.get_defense( + battle, + ignore_stages=defender.ability(attacker=attacker, move=self) == Ability.UNAWARE + ) + + # Use the defender's attacking stat + if self.effect == 298: + if self.damage_class == DamageClass.PHYSICAL: + a = defender.get_attack( + battle, + critical=critical, + ignore_stages=defender.ability(attacker=attacker, move=self) == Ability.UNAWARE + ) + else: + a = defender.get_spatk( + battle, + critical=critical, + ignore_stages=defender.ability(attacker=attacker, move=self) == Ability.UNAWARE + ) + + # Use the higher of attack or special attack + if self.effect == 416: + ignore_stages = defender.ability(attacker=attacker, move=self) == Ability.UNAWARE + a = max(attacker.get_attack(battle, critical=critical, ignore_stages=ignore_stages), attacker.get_spatk(battle, critical=critical, ignore_stages=ignore_stages)) + + if attacker.flash_fire and current_type == ElementType.FIRE: + a *= 1.5 + if defender.ability(attacker=attacker, move=self) == Ability.THICK_FAT and current_type in (ElementType.FIRE, ElementType.ICE): + a *= .5 + + power = self.get_power(attacker, defender, battle) + if power is None: + raise ValueError(f"{self.name} has no power and no override.") + + # Check accuracy on each hit + # WARNING: If there is something BEFORE this in the loop which adds to msg (like "A critical hit") + # it MUST be after this block, or it will appear even after "misses" from this move. + if hit > 0 and not attacker.ability() == Ability.SKILL_LINK: + # Increasing damage each hit + if self.effect == 105: + if not self.check_hit(attacker, defender, battle): + # Reset the number of hits to the number of ACTUAL hits + hits = hit + break + # x2 then x3 + power *= 1 + hit + # Only checks if loaded dice did not activate + if self.effect == 484 and attacker.held_item != "loaded-dice": + if not self.check_hit(attacker, defender, battle): + hits = hit + break + + damage = 2 * attacker.level + damage /= 5 + damage += 2 + damage = damage * power * (a / d) + damage /= 50 + damage += 2 + + # Critical hit damage + if critical: + msg += "A critical hit!\n" + damage *= 1.5 + + # Type buffing weather + if current_type == ElementType.WATER and battle.weather.get() in ("rain", "h-rain"): + damage *= 1.5 + elif current_type == ElementType.FIRE and battle.weather.get() in ("rain", "h-rain"): + damage *= 0.5 + elif current_type == ElementType.FIRE and battle.weather.get() == "sun": + damage *= 1.5 + elif current_type == ElementType.WATER and battle.weather.get() == "sun": + damage *= 0.5 + + # Same type attack bonus - extra damage for using a move that is the same type as your poke's type. + if current_type in attacker.type_ids: + if attacker.ability() == Ability.ADAPTABILITY: + damage *= 2 + else: + damage *= 1.5 + + # Move effectiveness + damage *= effectiveness + + # Burn + if ( + attacker.nv.burn() + and damage_class == DamageClass.PHYSICAL + and attacker.ability() != Ability.GUTS + and self.effect != 170 + ): + damage *= .5 + + # Aurora Veil, Light Screen, Reflect do not stack but all reduce incoming damage in some way + if not critical and attacker.ability() != Ability.INFILTRATOR: + if defender.owner.aurora_veil.active(): + damage *= .5 + elif defender.owner.light_screen.active() and damage_class == DamageClass.SPECIAL: + damage *= .5 + elif defender.owner.reflect.active() and damage_class == DamageClass.PHYSICAL: + damage *= .5 + + # Moves that do extra damage to minimized pokes + if defender.minimized and self.effect == 338: + damage *= 2 + + # Fluffy + if defender.ability(attacker=attacker, move=self) == Ability.FLUFFY: + if self.makes_contact(attacker): + damage *= .5 + if current_type == ElementType.FIRE: + damage *= 2 + + # Abilities that change damage + if defender.ability(attacker=attacker, move=self) in (Ability.FILTER, Ability.PRISM_ARMOR, Ability.SOLID_ROCK) and effectiveness > 1: + damage *= .75 + if attacker.ability() == Ability.NEUROFORCE and effectiveness > 1: + damage *= 1.25 + if defender.ability(attacker=attacker, move=self) == Ability.ICE_SCALES and damage_class == DamageClass.SPECIAL: + damage *= .5 + if attacker.ability() == Ability.SNIPER and critical: + damage *= 1.5 + if attacker.ability() == Ability.TINTED_LENS and effectiveness < 1: + damage *= 2 + if attacker.ability() == Ability.PUNK_ROCK and self.is_sound_based(): + damage *= 1.3 + if defender.ability(attacker=attacker, move=self) == Ability.PUNK_ROCK and self.is_sound_based(): + damage *= .5 + if defender.ability(attacker=attacker, move=self) == Ability.HEATPROOF and current_type == ElementType.FIRE: + damage *= .5 + if defender.ability(attacker=attacker, move=self) == Ability.PURIFYING_SALT and current_type == ElementType.GHOST: + damage *= .5 + if Ability.DARK_AURA in (attacker.ability(), defender.ability(attacker=attacker, move=self)) and current_type == ElementType.DARK: + if Ability.AURA_BREAK in (attacker.ability(), defender.ability(attacker=attacker, move=self)): + damage *= .75 + else: + damage *= 4/3 + if Ability.FAIRY_AURA in (attacker.ability(), defender.ability(attacker=attacker, move=self)) and current_type == ElementType.FAIRY: + if Ability.AURA_BREAK in (attacker.ability(), defender.ability(attacker=attacker, move=self)): + damage *= .75 + else: + damage *= 4/3 + if defender.ability(attacker=attacker, move=self) == Ability.DRY_SKIN and current_type == ElementType.FIRE: + damage *= 1.25 + + # Items that change damage + if defender.held_item == "chilan-berry" and current_type == ElementType.NORMAL: + damage *= .5 + if attacker.held_item == "expert-belt" and effectiveness > 1: + damage *= 1.2 + if ( + attacker.held_item == "life-orb" + and self.damage_class != DamageClass.STATUS + and self.effect != 149 + ): + damage *= 1.3 + if attacker.held_item == "metronome": + damage *= attacker.metronome.get_buff(self.name) + + # Parental bond - adds an extra low power hit + if parental_bond and hit > 0: + damage *= .25 + + # Reduced damage while at full hp + if defender.ability(attacker=attacker, move=self) in (Ability.MULTISCALE, Ability.SHADOW_SHIELD) and defender.hp == defender.starting_hp: + damage *= .5 + + # Random damage scaling + damage *= random.uniform(0.85, 1) + damage = max(1, int(damage)) + + # Cannot lower the target's HP below 1. + if self.effect == 102: + damage = min(damage, defender.hp - 1) + + # Drain ratios + drain_heal_ratio = None + if self.effect in (4, 9, 346, 500): + drain_heal_ratio = 1/2 + elif self.effect == 349: + drain_heal_ratio = 3/4 + + # Do the damage + msgadd, damage = defender._damage(damage, battle, move=self, move_type=current_type, attacker=attacker, critical=critical, drain_heal_ratio=drain_heal_ratio) + msg += msgadd + + # Recoil + if attacker.ability() != Ability.ROCK_HEAD and defender.owner.has_alive_pokemon(): + if self.effect == 49: + msg += attacker.damage(damage // 4, battle, source="recoil") + if self.effect in (199, 254, 263, 469): + msg += attacker.damage(damage // 3, battle, source="recoil") + if self.effect == 270: + msg += attacker.damage(damage // 2, battle, source="recoil") + if self.effect == 463: + msg += attacker.damage(attacker.starting_hp // 2, battle, source="recoil") + + # Weakness Policy + if effectiveness > 1 and defender.held_item == "weakness-policy" and not defender.substitute: + msg += defender.append_attack(2, attacker=defender, move=self, source="its weakness policy") + msg += defender.append_spatk(2, attacker=defender, move=self, source="its weakness policy") + defender.held_item.use() + + return (msg, hits) + + def get_power(self, attacker, defender, battle): + """Get the power of this move.""" + current_type = self.get_type(attacker, defender, battle) + # Inflicts damage equal to the user's level. + if self.effect == 88: + power = attacker.level + # Inflicts damage between 50% and 150% of the user's level. + elif self.effect == 89: + power = random.randint(int(attacker.level * 0.5), int(attacker.level * 1.5)) + # Inflicts more damage to heavier targets, with a maximum of 120 power. + elif self.effect == 197: + def_weight = defender.weight(attacker=attacker, move=self) + if def_weight <= 100: + power = 20 + elif def_weight <= 250: + power = 40 + elif def_weight <= 500: + power = 60 + elif def_weight <= 1000: + power = 80 + elif def_weight <= 2000: + power = 100 + else: + power = 120 + # Power is higher when the user weighs more than the target, up to a maximum of 120. + elif self.effect == 292: + weight_delta = attacker.weight() / defender.weight(attacker=attacker, move=self) + if weight_delta <= 2: + power = 40 + elif weight_delta <= 3: + power = 60 + elif weight_delta <= 4: + power = 80 + elif weight_delta <= 5: + power = 100 + else: + power = 120 + # Power increases with happiness, up to a maximum of 102. + elif self.effect == 122: + power = int(attacker.happiness / 2.5) + if power > 102: + power = 102 + elif power < 1: + power = 1 + # Power increases as happiness **decreases**, up to a maximum of 102. + elif self.effect == 124: + power = int((255 - attacker.happiness) / 2.5) + if power > 102: + power = 102 + elif power < 1: + power = 1 + # Power raises when the user has lower Speed, up to a maximum of 150. + elif self.effect == 220: + power = min(150, int(1 + 25 * defender.get_speed(battle) / attacker.get_speed(battle))) + # Inflicts more damage when the user has more HP remaining, with a maximum of 150 power. + elif self.effect == 191: + power = int(150 * (attacker.hp / attacker.starting_hp)) + # Power is 100 times the amount of energy Stockpiled. + elif self.effect == 162: + power = 100 * attacker.stockpile + # Inflicts more damage when the user has less HP remaining, with a maximum of 200 power. + elif self.effect == 100: + hp_percent = 64 * (attacker.hp / attacker.starting_hp) + if hp_percent <= 1: + power = 200 + elif hp_percent <= 5: + power = 150 + elif hp_percent <= 12: + power = 100 + elif hp_percent <= 21: + power = 80 + elif hp_percent <= 42: + power = 40 + else: + power = 20 + # Power increases when this move has less PP, up to a maximum of 200. + elif self.effect == 236: + if self.pp == 0: + power = 200 + elif self.pp == 1: + power = 80 + elif self.pp == 2: + power = 60 + elif self.pp == 3: + power = 50 + else: + power = 40 + # Power increases against targets with more HP remaining, up to a maximum of 120|100 power. + elif self.effect == 238: + power = max(1, int(120 * (defender.hp / defender.starting_hp))) + elif self.effect == 495: + power = max(1, int(100 * (defender.hp / defender.starting_hp))) + # Power increases against targets with more raised stats, up to a maximum of 200. + elif self.effect == 246: + delta = 0 + delta += max(0, defender.attack_stage) + delta += max(0, defender.defense_stage) + delta += max(0, defender.spatk_stage) + delta += max(0, defender.spdef_stage) + delta += max(0, defender.speed_stage) + power = min(200, 60 + (delta * 20)) + # Power is higher when the user has greater Speed than the target, up to a maximum of 150. + elif self.effect == 294: + delta = attacker.get_speed(battle) // defender.get_speed(battle) + if delta <= 0: + power = 40 + elif delta <= 1: + power = 60 + elif delta <= 2: + power = 80 + elif delta <= 3: + power = 120 + else: + power = 150 + # Power is higher the more the user's stats have been raised. + elif self.effect == 306: + delta = 1 + delta += max(0, attacker.attack_stage) + delta += max(0, attacker.defense_stage) + delta += max(0, attacker.spatk_stage) + delta += max(0, attacker.spdef_stage) + delta += max(0, attacker.speed_stage) + delta += max(0, attacker.accuracy_stage) + delta += max(0, attacker.evasion_stage) + power = 20 * delta + # Power doubles every turn this move is used in succession after the first, maxing out after five turns. + elif self.effect == 120: + power = (2 ** attacker.fury_cutter) * 10 + attacker.fury_cutter = min(4, attacker.fury_cutter + 1) + # Power doubles every turn this move is used in succession after the first, resetting after five turns. + elif self.effect == 118: + power = (2 ** attacker.locked_move.turn) * self.power + # Power varies randomly from 10 to 150. + elif self.effect == 127: + percentile = random.randint(0, 100) + if percentile <= 5: + power = 10 + elif percentile <= 15: + power = 30 + elif percentile <= 35: + power = 50 + elif percentile <= 65: + power = 70 + elif percentile <= 85: + power = 90 + elif percentile <= 95: + power = 110 + else: + power = 150 + # Power is based on the user's held item + elif self.effect == 234: + power = attacker.held_item.power + # Power increases by 100% for each consecutive use by any friendly Pokémon, to a maximum of 200. + elif self.effect == 303: + power = attacker.echoed_voice_power + # Power is dependent on the user's held berry. + elif self.effect == 223: + if attacker.held_item.get() in ( + "enigma berry", "rowap berry", "maranga berry", "jaboca berry", "belue berry", "kee berry", + "salac berry", "watmel berry", "lansat berry", "custap berry", "liechi berry", "apicot berry", + "ganlon berry", "petaya berry", "starf berry", "micle berry", "durin berry" + ): + power = 100 + elif attacker.held_item.get() in ( + "cornn berry", "spelon berry", "nomel berry", "wepear berry", "kelpsy berry", "bluk berry", + "grepa berry", "rabuta berry", "pinap berry", "hondew berry", "pomeg berry", "qualot berry", + "tamato berry", "magost berry", "pamtre berry", "nanab berry" + ): + power = 90 + else: + power = 80 + elif self.effect == 361 and attacker._name == "Greninja-ash": + power = 20 + # Power is based on the user's base attack. Only applies when not explicitly overridden. + elif self.effect == 155 and self.power is None: + power = (attacker.get_raw_attack() // 10) + 5 + # No special changes to power, return its raw value. + else: + power = self.power + + if power is None: + return None + + #NOTE: this needs to be first as it only applies to raw power + if attacker.ability() == Ability.TECHNICIAN and power <= 60: + power *= 1.5 + if attacker.ability() == Ability.TOUGH_CLAWS and self.makes_contact(attacker): + power *= 1.3 + if attacker.ability() == Ability.RIVALRY and "-x" not in (attacker.gender, defender.gender): + if attacker.gender == defender.gender: + power *= 1.25 + else: + power *= .75 + if attacker.ability() == Ability.IRON_FIST and self.is_punching(): + power *= 1.2 + if attacker.ability() == Ability.STRONG_JAW and self.is_biting(): + power *= 1.5 + if attacker.ability() == Ability.MEGA_LAUNCHER and self.is_aura_or_pulse(): + power *= 1.5 + if attacker.ability() == Ability.SHARPNESS and self.is_slicing(): + power *= 1.5 + if attacker.ability() == Ability.RECKLESS and self.effect in (46, 49, 199, 254, 263, 270): + power *= 1.2 + if attacker.ability() == Ability.TOXIC_BOOST and self.damage_class == DamageClass.PHYSICAL and attacker.nv.poison(): + power *= 1.5 + if attacker.ability() == Ability.FLARE_BOOST and self.damage_class == DamageClass.SPECIAL and attacker.nv.burn(): + power *= 1.5 + if attacker.ability() == Ability.ANALYTIC and defender.has_moved: + power *= 1.3 + if attacker.ability() == Ability.BATTERY and self.damage_class == DamageClass.SPECIAL: + power *= 1.3 + if attacker.ability() == Ability.SHEER_FORCE and self.effect_chance is not None: # Not *perfect* but good enough + power *= 1.3 + if attacker.ability() == Ability.STAKEOUT and defender.swapped_in: + power *= 2 + if attacker.ability() == Ability.SUPREME_OVERLORD: + fainted = sum(poke.hp == 0 for poke in attacker.owner.party) + if fainted: + power *= (10 + fainted) / 10 + + # Type buffing abilities - Some use naive type because the type is changed. + if attacker.ability() == Ability.AERILATE and self.type == ElementType.NORMAL: + power *= 1.2 + if attacker.ability() == Ability.PIXILATE and self.type == ElementType.NORMAL: + power *= 1.2 + if attacker.ability() == Ability.GALVANIZE and self.type == ElementType.NORMAL: + power *= 1.2 + if attacker.ability() == Ability.REFRIGERATE and self.type == ElementType.NORMAL: + power *= 1.2 + if attacker.ability() == Ability.DRAGONS_MAW and current_type == ElementType.DRAGON: + power *= 1.5 + if attacker.ability() == Ability.TRANSISTOR and current_type == ElementType.ELECTRIC: + power *= 1.5 + if attacker.ability() == Ability.WATER_BUBBLE and current_type == ElementType.WATER: + power *= 2 + if defender.ability(attacker=attacker, move=self) == Ability.WATER_BUBBLE and current_type == ElementType.FIRE: + power *= .5 + if attacker.ability() == Ability.OVERGROW and current_type == ElementType.GRASS and attacker.hp <= attacker.starting_hp // 3: + power *= 1.5 + if attacker.ability() == Ability.BLAZE and current_type == ElementType.FIRE and attacker.hp <= attacker.starting_hp // 3: + power *= 1.5 + if attacker.ability() == Ability.TORRENT and current_type == ElementType.WATER and attacker.hp <= attacker.starting_hp // 3: + power *= 1.5 + if attacker.ability() == Ability.SWARM and current_type == ElementType.BUG and attacker.hp <= attacker.starting_hp // 3: + power *= 1.5 + if attacker.ability() == Ability.NORMALIZE and current_type == ElementType.NORMAL: + power *= 1.2 + if attacker.ability() == Ability.SAND_FORCE and current_type in (ElementType.ROCK, ElementType.GROUND, ElementType.STEEL) and battle.weather.get() == "sandstorm": + power *= 1.3 + if attacker.ability() in (Ability.STEELWORKER, Ability.STEELY_SPIRIT) and current_type == ElementType.STEEL: + power *= 1.5 + if attacker.ability() == Ability.ROCKY_PAYLOAD and current_type == ElementType.ROCK: + power *= 1.5 + + # Type buffing items + if attacker.held_item == "black-glasses" and current_type == ElementType.DARK: + power *= 1.2 + if attacker.held_item == "black-belt" and current_type == ElementType.FIGHTING: + power *= 1.2 + if attacker.held_item == "hard-stone" and current_type == ElementType.ROCK: + power *= 1.2 + if attacker.held_item == "magnet" and current_type == ElementType.ELECTRIC: + power *= 1.2 + if attacker.held_item == "mystic-water" and current_type == ElementType.WATER: + power *= 1.2 + if attacker.held_item == "never-melt-ice" and current_type == ElementType.ICE: + power *= 1.2 + if attacker.held_item == "dragon-fang" and current_type == ElementType.DRAGON: + power *= 1.2 + if attacker.held_item == "poison-barb" and current_type == ElementType.POISON: + power *= 1.2 + if attacker.held_item == "charcoal" and current_type == ElementType.FIRE: + power *= 1.2 + if attacker.held_item == "silk-scarf" and current_type == ElementType.NORMAL: + power *= 1.2 + if attacker.held_item == "metal-coat" and current_type == ElementType.STEEL: + power *= 1.2 + if attacker.held_item == "sharp-beak" and current_type == ElementType.FLYING: + power *= 1.2 + if attacker.held_item == "draco-plate" and current_type == ElementType.DRAGON: + power *= 1.2 + if attacker.held_item == "dread-plate" and current_type == ElementType.DARK: + power *= 1.2 + if attacker.held_item == "earth-plate" and current_type == ElementType.GROUND: + power *= 1.2 + if attacker.held_item == "fist-plate" and current_type == ElementType.FIGHTING: + power *= 1.2 + if attacker.held_item == "flame-plate" and current_type == ElementType.FIRE: + power *= 1.2 + if attacker.held_item == "icicle-plate" and current_type == ElementType.ICE: + power *= 1.2 + if attacker.held_item == "insect-plate" and current_type == ElementType.BUG: + power *= 1.2 + if attacker.held_item == "iron-plate" and current_type == ElementType.STEEL: + power *= 1.2 + if attacker.held_item == "meadow-plate" and current_type == ElementType.GRASS: + power *= 1.2 + if attacker.held_item == "mind-plate" and current_type == ElementType.PSYCHIC: + power *= 1.2 + if attacker.held_item == "pixie-plate" and current_type == ElementType.FAIRY: + power *= 1.2 + if attacker.held_item == "sky-plate" and current_type == ElementType.FLYING: + power *= 1.2 + if attacker.held_item == "splash-plate" and current_type == ElementType.WATER: + power *= 1.2 + if attacker.held_item == "spooky-plate" and current_type == ElementType.GHOST: + power *= 1.2 + if attacker.held_item == "stone-plate" and current_type == ElementType.ROCK: + power *= 1.2 + if attacker.held_item == "toxic-plate" and current_type == ElementType.POISON: + power *= 1.2 + if attacker.held_item == "zap-plate" and current_type == ElementType.ELECTRIC: + power *= 1.2 + if attacker.held_item == "adamant-orb" and current_type in (ElementType.DRAGON, ElementType.STEEL) and attacker._name == "Dialga": + power *= 1.2 + if attacker.held_item == "griseous-orb" and current_type in (ElementType.DRAGON, ElementType.GHOST) and attacker._name == "Giratina": + power *= 1.2 + if attacker.held_item == "soul-dew" and current_type in (ElementType.DRAGON, ElementType.PSYCHIC) and attacker._name in ("Latios", "Latias"): + power *= 1.2 + if attacker.held_item == "lustrous-orb" and current_type in (ElementType.DRAGON, ElementType.WATER) and attacker._name == "Palkia": + power *= 1.2 + + # Damage class buffing items + if attacker.held_item == "wise-glasses" and self.damage_class == DamageClass.SPECIAL: + power *= 1.1 + if attacker.held_item == "muscle-band" and self.damage_class == DamageClass.PHYSICAL: + power *= 1.1 + + # If there be weather, this move has doubled power and the weather's type. + if self.effect == 204 and battle.weather.get() in ("hail", "sandstorm", "rain", "h-rain", "sun", "h-sun"): + power *= 2 + # During hail, rain-dance, or sandstorm, power is halved. + if self.effect == 152 and battle.weather.get() in ("rain", "hail"): + power *= 0.5 + # Power doubles if user is burned, paralyzed, or poisoned. + if self.effect == 170 and (attacker.nv.burn() or attacker.nv.poison() or attacker.nv.paralysis()): + power *= 2 + # If the target is paralyzed, power is doubled and cures the paralysis. + if self.effect == 172 and defender.nv.paralysis(): + power *= 2 + defender.nv.reset() + # If the target is poisoned, this move has double power. + if self.effect in (284, 461) and defender.nv.poison(): + power *= 2 + # If the target is sleeping, this move has double power, and the target wakes up. + if self.effect == 218 and defender.nv.sleep(): + power *= 2 + defender.nv.reset() + # Has double power against Pokémon that have less than half their max HP remaining. + if self.effect == 222 and defender.hp < defender.starting_hp // 2: + power *= 2 + # Power is doubled if the target has already moved this turn. + if self.effect == 231 and defender.has_moved: + power *= 2 + # Has double power if the target has a major status ailment. + if self.effect == 311 and defender.nv.current: + power *= 2 + # If the user has used defense-curl since entering the field, this move has double power. + if self.effect == 118 and attacker.defense_curl: + power *= 2 + # Has double power if the user's last move failed. + if self.effect == 409 and attacker.last_move_failed: + power *= 2 + # Has double power if the target is in the first turn of dive. + if self.effect in (258, 262) and defender.dive: + power *= 2 + # Has double power if the target is in the first turn of dig. + if self.effect in (127, 148) and defender.dig: + power *= 2 + # Has double power if the target is in the first turn of bounce or fly. + if self.effect in (147, 150) and defender.fly: + power *= 2 + # Has double power if the user takes damage before attacking this turn. + if self.effect == 186 and attacker.last_move_damage is not None: + power *= 2 + # Has double power if the user has no held item. + if self.effect == 318 and not attacker.held_item.has_item(): + power *= 2 + # Has double power if a friendly Pokémon fainted last turn. + if self.effect == 320 and attacker.owner.retaliate.active(): + power *= 2 + # Has double power against, and can hit, Pokémon attempting to switch out. + if self.effect == 129 and (isinstance(defender.owner.selected_action, int) or defender.owner.selected_action.effect in (128, 154, 229, 347, 493)): + power *= 2 + # Power is doubled if the target has already received damage this turn. + if self.effect == 232 and defender.dmg_this_turn: + power *= 2 + # Power is doubled if the target is minimized. + if self.effect == 151 and defender.minimized: + power *= 2 + # With Fusion Bolt, power is doubled. + if self.effect == 336 and battle.last_move_effect == 337: + power *= 2 + # With Fusion Flare, power is doubled. + if self.effect == 337 and battle.last_move_effect == 336: + power *= 2 + # Me first increases the power of the used move by 50%. + if attacker.owner.selected_action is not None and not isinstance(attacker.owner.selected_action, int) and attacker.owner.selected_action.effect == 242: + power *= 1.5 + # Has 1.5x power during gravity. + if self.effect == 435 and battle.gravity.active(): + power *= 1.5 + # If the user attacks before the target, or if the target switched in this turn, its base power doubles. + if self.effect == 436 and (not defender.has_moved or defender.swapped_in): + power *= 2 + # If the terrain is psychic and the user is grounded, this move gets 1.5x power. + if self.effect == 440 and battle.terrain.item == "psychic" and attacker.grounded(battle): + power *= 1.5 + # Power is doubled if terrain is present. + if self.effect == 441 and battle.terrain.item and attacker.grounded(battle): + power *= 2 + # Power is boosted by 50% if used on a Pokémon that is holding an item that can be knocked off. + if self.effect == 189 and defender.held_item.has_item() and defender.held_item.can_remove(): + power *= 1.5 + # If the target is under the effect of electric terrain, this move has double power. + if self.effect == 443 and battle.terrain.item == "electric" and defender.grounded(battle, attacker=attacker, move=self): + power *= 2 + # Deals 1.5x damage if the user is under the effect of misty terrain. + if self.effect == 444 and battle.terrain.item == "misty" and attacker.grounded(battle): + power *= 1.5 + # Power is doubled if any of the user's stats were lowered this turn. + if self.effect == 450 and attacker.stat_decreased: + power *= 2 + # Power is doubled if the defender has a non volatile status effect. + if self.effect == 465 and defender.nv.current: + power *= 2 + # Deals 4/3x damage if supereffective. + if self.effect == 482 and defender.effectiveness(current_type, battle, attacker=attacker, move=self) > 1: + power *= 4/3 + # Power is multiplied by (1 + number of fainted party members)x, capping at 101x (100 faints). + if self.effect == 490: + power *= 1 + min(attacker.owner.num_fainted, 100) + # Power is multiplied by (1 + number of times hit)x, capping at 7x (6 hits). + if self.effect == 491: + power *= 1 + min(attacker.num_hits, 6) + # Has a 30% chance to double power + if self.effect == 498 and random.random() <= 0.3: + power *= 2 + + # Terrains + if battle.terrain.item == "psychic" and attacker.grounded(battle) and current_type == ElementType.PSYCHIC: + power *= 1.3 + if battle.terrain.item == "grassy" and attacker.grounded(battle) and current_type == ElementType.GRASS: + power *= 1.3 + if battle.terrain.item == "grassy" and defender.grounded(battle, attacker=attacker, move=self) and self.id in (89, 222, 523): + power *= 0.5 + if battle.terrain.item == "electric" and attacker.grounded(battle) and current_type == ElementType.ELECTRIC: + power *= 1.3 + if battle.terrain.item == "misty" and defender.grounded(battle, attacker=attacker, move=self) and current_type == ElementType.DRAGON: + power *= 0.5 + + # Power buffing statuses + if attacker.charge.active() and current_type == ElementType.ELECTRIC: + power *= 2 + if (attacker.owner.mud_sport.active() or defender.owner.mud_sport.active()) and current_type == ElementType.ELECTRIC: + power //= 3 + if (attacker.owner.water_sport.active() or defender.owner.water_sport.active()) and current_type == ElementType.FIRE: + power //= 3 + + return int(power) + + def get_type(self, attacker, defender, battle): + """ + Calculates the element type this move will be. + """ + # Abilities are first because those are intrinsic to the poke and would "apply" to the move first + if attacker.ability() == Ability.REFRIGERATE and self.type == ElementType.NORMAL: + return ElementType.ICE + if attacker.ability() == Ability.PIXILATE and self.type == ElementType.NORMAL: + return ElementType.FAIRY + if attacker.ability() == Ability.AERILATE and self.type == ElementType.NORMAL: + return ElementType.FLYING + if attacker.ability() == Ability.GALVANIZE and self.type == ElementType.NORMAL: + return ElementType.ELECTRIC + if attacker.ability() == Ability.NORMALIZE: + return ElementType.NORMAL + if attacker.ability() == Ability.LIQUID_VOICE and self.is_sound_based(): + return ElementType.WATER + if self.type == ElementType.NORMAL and (attacker.ion_deluge or defender.ion_deluge or battle.plasma_fists): + return ElementType.ELECTRIC + if attacker.electrify: + return ElementType.ELECTRIC + if self.effect == 204: + if battle.weather.get() == "hail": + return ElementType.ICE + if battle.weather.get() == "sandstorm": + return ElementType.ROCK + if battle.weather.get() in ("h-sun", "sun"): + return ElementType.FIRE + if battle.weather.get() in ("h-rain", "rain"): + return ElementType.WATER + if self.effect == 136: + # Uses starting IVs as its own IVs should be used even if transformed + type_idx = attacker.starting_hpiv % 2 + type_idx += 2 * (attacker.starting_atkiv % 2) + type_idx += 4 * (attacker.starting_defiv % 2) + type_idx += 8 * (attacker.starting_speediv % 2) + type_idx += 16 * (attacker.starting_spatkiv % 2) + type_idx += 32 * (attacker.starting_spdefiv % 2) + type_idx = (type_idx * 15) // 63 + type_options = { + 0: ElementType.FIGHTING, + 1: ElementType.FLYING, + 2: ElementType.POISON, + 3: ElementType.GROUND, + 4: ElementType.ROCK, + 5: ElementType.BUG, + 6: ElementType.GHOST, + 7: ElementType.STEEL, + 8: ElementType.FIRE, + 9: ElementType.WATER, + 10: ElementType.GRASS, + 11: ElementType.ELECTRIC, + 12: ElementType.PSYCHIC, + 13: ElementType.ICE, + 14: ElementType.DRAGON, + 15: ElementType.DARK, + } + return type_options[type_idx] + if self.effect == 401: + if len(attacker.type_ids) == 0: + return ElementType.TYPELESS + return attacker.type_ids[0] + if self.effect == 269: + if attacker.held_item in ("draco-plate", "dragon-memory"): + return ElementType.DRAGON + if attacker.held_item in ("dread-plate", "dark-memory"): + return ElementType.DARK + if attacker.held_item in ("earth-plate", "ground-memory"): + return ElementType.GROUND + if attacker.held_item in ("fist-plate", "fighting-memory"): + return ElementType.FIGHTING + if attacker.held_item in ("flame-plate", "burn-drive", "fire-memory"): + return ElementType.FIRE + if attacker.held_item in ("icicle-plate", "chill-drive", "ice-memory"): + return ElementType.ICE + if attacker.held_item in ("insect-plate", "bug-memory"): + return ElementType.BUG + if attacker.held_item in ("iron-plate", "steel-memory"): + return ElementType.STEEL + if attacker.held_item in ("meadow-plate", "grass-memory"): + return ElementType.GRASS + if attacker.held_item in ("mind-plate", "psychic-memory"): + return ElementType.PSYCHIC + if attacker.held_item in ("pixie-plate", "fairy-memory"): + return ElementType.FAIRY + if attacker.held_item in ("sky-plate", "flying-memory"): + return ElementType.FLYING + if attacker.held_item in ("splash-plate", "douse-drive", "water-memory"): + return ElementType.WATER + if attacker.held_item in ("spooky-plate", "ghost-memory"): + return ElementType.GHOST + if attacker.held_item in ("stone-plate", "rock-memory"): + return ElementType.ROCK + if attacker.held_item in ("toxic-plate", "poison-memory"): + return ElementType.POISON + if attacker.held_item in ("zap-plate", "shock-drive", "electric-memory"): + return ElementType.ELECTRIC + if self.effect == 223: + hi = attacker.held_item.get() + if hi in ("figy-berry", "tanga-berry", "cornn-berry", "enigma-berry"): + return ElementType.BUG + if hi in ("iapapa-berry", "colbur-berry", "spelon-berry", "rowap-berry", "maranga-berry"): + return ElementType.DARK + if hi in ("aguav-berry", "haban-berry", "nomel-berry", "jaboca-berry"): + return ElementType.DRAGON + if hi in ("pecha-berry", "wacan-berry", "wepear-berry", "belue-berry"): + return ElementType.ELECTRIC + if hi in ("roseli-berry", "kee-berry"): + return ElementType.FAIRY + if hi in ("leppa-berry", "chople-berry", "kelpsy-berry", "salac-berry"): + return ElementType.FIGHTING + if hi in ("cheri-berry", "occa-berry", "bluk-berry", "watmel-berry"): + return ElementType.FIRE + if hi in ("lum-berry", "coba-berry", "grepa-berry", "lansat-berry"): + return ElementType.FLYING + if hi in ("mago-berry", "kasib-berry", "rabuta-berry", "custap-berry"): + return ElementType.GHOST + if hi in ("rawst-berry", "rindo-berry", "pinap-berry", "liechi-berry"): + return ElementType.GRASS + if hi in ("persim-berry", "shuca-berry", "hondew-berry", "apicot-berry"): + return ElementType.GROUND + if hi in ("aspear-berry", "yache-berry", "pomeg-berry", "ganlon-berry"): + return ElementType.ICE + if hi in ("oran-berry", "kebia-berry", "qualot-berry", "petaya-berry"): + return ElementType.POISON + if hi in ("sitrus-berry", "payapa-berry", "tamato-berry", "starf-berry"): + return ElementType.PSYCHIC + if hi in ("wiki-berry", "charti-berry", "magost-berry", "micle-berry"): + return ElementType.ROCK + if hi in ("razz-berry", "babiri-berry", "pamtre-berry"): + return ElementType.STEEL + if hi in ("chesto-berry", "passho-berry", "nanab-berry", "durin-berry"): + return ElementType.WATER + if hi == "chilan-berry": + return ElementType.NORMAL + if self.effect == 433 and attacker._name == "Morpeko-hangry": + return ElementType.DARK + if self.effect == 441 and attacker.grounded(battle): + if battle.terrain.item == "electric": + return ElementType.ELECTRIC + if battle.terrain.item == "grass": + return ElementType.GRASS + if battle.terrain.item == "misty": + return ElementType.FAIRY + if battle.terrain.item == "psychic": + return ElementType.PSYCHIC + if self.id == 873: + if attacker._name == "Tauros-paldea": + return ElementType.FIGHTING + if attacker._name == "Tauros-aqua-paldea": + return ElementType.WATER + if attacker._name == "Tauros-blaze-paldea": + return ElementType.FIRE + + return self.type + + def get_priority(self, attacker, defender, battle): + """ + Calculates the priority value for this move. + + Returns an int priority from -7 to 5. + """ + priority = self.priority + current_type = self.get_type(attacker, defender, battle) + if self.effect == 437 and attacker.grounded(battle) and battle.terrain.item == "grassy": + priority += 1 + if attacker.ability() == Ability.GALE_WINGS and current_type == ElementType.FLYING and attacker.hp == attacker.starting_hp: + priority += 1 + if attacker.ability() == Ability.PRANKSTER and self.damage_class == DamageClass.STATUS: + priority += 1 + if attacker.ability() == Ability.TRIAGE and self.is_affected_by_heal_block(): + priority += 3 + return priority + + def get_effect_chance(self, attacker, defender, battle): + """ + Gets the chance for secondary effects to occur. + + Returns an int from 0-100. + """ + if self.effect_chance is None: + return 100 + if defender.ability(attacker=attacker, move=self) == Ability.SHIELD_DUST: + return 0 + if defender.held_item == "covert-cloak": + return 0 + if attacker.ability() == Ability.SHEER_FORCE: + return 0 + if attacker.ability() == Ability.SERENE_GRACE: + return min(100, self.effect_chance * 2) + return self.effect_chance + + def check_executable(self, attacker, defender, battle): + """ + Returns True if the move can be executed, False otherwise + + Checks different requirements for moves that can make them fail. + """ + if attacker.taunt.active() and self.damage_class == DamageClass.STATUS: + return False + if attacker.silenced.active() and self.is_sound_based(): + return False + if self.is_affected_by_heal_block() and attacker.heal_block.active(): + return False + if self.is_powder_or_spore() and (ElementType.GRASS in defender.type_ids or defender.ability(attacker=attacker, move=self) == Ability.OVERCOAT or defender.held_item == "safety-goggles"): + return False + if battle.weather.get() == "h-sun" and self.get_type(attacker, defender, battle) == ElementType.WATER and self.damage_class != DamageClass.STATUS: + return False + if battle.weather.get() == "h-rain" and self.get_type(attacker, defender, battle) == ElementType.FIRE and self.damage_class != DamageClass.STATUS: + return False + if attacker.disable.active() and attacker.disable.item is self: + return False + if attacker is not defender and defender.imprison and self.id in [x.id for x in defender.moves]: + return False + #Since we only have single battles, these moves always fail + if self.effect in (173, 301, 308, 316, 363, 445, 494): + return False + if self.effect in (93, 98) and not attacker.nv.sleep(): + return False + if self.effect in (9, 108) and not defender.nv.sleep(): + return False + if self.effect == 364 and not defender.nv.poison(): + return False + if self.effect in (162, 163) and attacker.stockpile == 0: + return False + if self.effect == 85 and (ElementType.GRASS in defender.type_ids or defender.leech_seed): + return False + if self.effect == 193 and attacker.imprison: + return False + if self.effect == 166 and defender.torment: + return False + if self.effect == 91 and (defender.encore.active() or defender.last_move is None or defender.last_move.pp == 0): + return False + if self.effect == 87 and (defender.disable.active() or defender.last_move is None or defender.last_move.pp == 0): + return False + if self.effect in (96, 101) and (defender.last_move is None or defender.last_move.pp == 0): + return False + if self.effect == 176 and defender.taunt.active(): + return False + if self.effect == 29 and not defender.owner.valid_swaps(attacker, battle, check_trap=False): + return False + if self.effect in (128, 154, 493) and not attacker.owner.valid_swaps(defender, battle, check_trap=False): + return False + if self.effect == 161 and attacker.stockpile >= 3: + return False + if self.effect in (90, 145, 228, 408) and attacker.last_move_damage is None: + return False + if self.effect == 145 and attacker.last_move_damage[1] != DamageClass.SPECIAL: + return False + if self.effect in (90, 408) and attacker.last_move_damage[1] != DamageClass.PHYSICAL: + return False + if self.effect in (10, 243) and (defender.last_move is None or not defender.last_move.selectable_by_mirror_move()): + return False + if self.effect == 83 and (defender.last_move is None or not defender.last_move.selectable_by_mimic()): + return False + if self.effect == 180 and attacker.owner.wish.active(): + return False + if self.effect == 388 and defender.attack_stage == -6: + return False + if self.effect in (143, 485, 493) and attacker.hp <= attacker.starting_hp // 2: + return False + if self.effect == 414 and attacker.hp < attacker.starting_hp // 3: + return False + if self.effect == 80 and attacker.hp <= attacker.starting_hp // 4: + return False + if self.effect == 48 and attacker.focus_energy: + return False + if self.effect == 190 and attacker.hp >= defender.hp: + return False + if self.effect == 194 and not (attacker.nv.burn() or attacker.nv.paralysis() or attacker.nv.poison()): + return False + if self.effect == 235 and (not attacker.nv.current or defender.nv.current): + return False + if self.effect in (121, 266) and ("-x" in (attacker.gender, defender.gender) or attacker.gender == defender.gender or defender.ability(attacker=attacker, move=self) == Ability.OBLIVIOUS): + return False + if self.effect in (367, 392) and attacker.ability() not in (Ability.PLUS, Ability.MINUS): + return False + if self.effect == 39 and attacker.level < defender.level: + return False + if self.effect in (46, 86, 156, 264, 286) and battle.gravity.active(): + return False + if self.effect == 113 and defender.owner.spikes == 3: + return False + if self.effect == 250 and defender.owner.toxic_spikes == 2: + return False + if self.effect in (159, 377, 383) and attacker.active_turns != 0: + return False + if self.effect == 98 and not any(m.selectable_by_sleep_talk() for m in attacker.moves): + return False + if self.effect == 407 and not battle.weather.get() == "hail": + return False + if self.effect == 407 and attacker.owner.aurora_veil.active(): + return False + if self.effect == 47 and attacker.owner.mist.active(): + return False + if self.effect in (80, 493) and attacker.substitute: + return False + if self.effect == 398 and ElementType.FIRE not in attacker.type_ids: + return False + if self.effect == 481 and ElementType.ELECTRIC not in attacker.type_ids: + return False + if self.effect == 376 and ElementType.GRASS in defender.type_ids: + return False + if self.effect == 343 and ElementType.GHOST in defender.type_ids: + return False + if self.effect == 107 and defender.trapping: + return False + if self.effect == 182 and attacker.ingrain: + return False + if self.effect == 94 and self.get_conversion_2(attacker, defender, battle) is None: + return False + if self.effect == 121 and defender.infatuated is attacker: + return False + if self.effect == 248 and defender.ability(attacker=attacker, move=self) == Ability.INSOMNIA: + return False + if self.effect in (242, 249) and (defender.has_moved or isinstance(defender.owner.selected_action, int) or defender.owner.selected_action.damage_class == DamageClass.STATUS): + return False + if self.effect == 252 and attacker.aqua_ring: + return False + if self.effect == 253 and attacker.magnet_rise.active(): + return False + if self.effect == 221 and attacker.owner.healing_wish: + return False + if self.effect == 271 and attacker.owner.lunar_dance: + return False + if self.effect in (240, 248, 299, 300) and not defender.ability_changeable(): + return False + if self.effect == 300 and not attacker.ability_giveable(): + return False + if self.effect == 241 and attacker.lucky_chant.active(): + return False + if self.effect == 125 and attacker.owner.safeguard.active(): + return False + if self.effect == 293 and not set(attacker.type_ids) & set(defender.type_ids): + return False + if self.effect == 295 and defender.ability(attacker=attacker, move=self) == Ability.MULTITYPE: + return False + if self.effect == 319 and not defender.type_ids: + return False + if self.effect == 171 and attacker.last_move_damage is not None: + return False + if self.effect == 179 and not (attacker.ability_changeable() and defender.ability_giveable()): + return False + if self.effect == 181 and attacker.get_assist_move() is None: + return False + if self.effect in (112, 117, 184, 195, 196, 279, 307, 345, 350, 354, 356, 362, 378, 384, 454, 488, 499) and defender.has_moved: + return False + if self.effect == 192 and not (attacker.ability_changeable() and attacker.ability_giveable() and defender.ability_changeable() and defender.ability_giveable()): + return False + if self.effect == 226 and attacker.owner.tailwind.active(): + return False + if self.effect in (90, 92, 145) and attacker.substitute: + return False + if self.effect in (85, 92, 169, 178, 188, 206, 388) and defender.substitute: + return False + if self.effect == 234 and (not attacker.held_item.power or attacker.ability() == Ability.STICKY_HOLD): + return False + if self.effect == 178 and (Ability.STICKY_HOLD in (attacker.ability(), defender.ability(attacker=attacker, move=self)) or not attacker.held_item.can_remove() or not defender.held_item.can_remove()): + return False + if self.effect == 202 and attacker.owner.mud_sport.active(): + return False + if self.effect == 211 and attacker.owner.water_sport.active(): + return False + if self.effect == 149 and defender.owner.future_sight.active(): + return False + if self.effect == 188 and (defender.nv.current or defender.ability(attacker=attacker, move=self) in (Ability.INSOMNIA, Ability.VITAL_SPIRIT, Ability.SWEET_VEIL) or defender.yawn.active()): + return False + if self.effect == 188 and battle.terrain.item == "electric" and attacker.grounded(battle): + return False + if self.effect in (340, 351) and not any(ElementType.GRASS in p.type_ids and p.grounded(battle) and not p.dive and not p.dig and not p.fly and not p.shadow_force for p in (attacker, defender)): + return False + if self.effect == 341 and defender.owner.sticky_web: + return False + if self.effect in (112, 117, 356, 362, 384, 454, 488, 499) and random.randint(1, attacker.protection_chance) != 1: + return False + if self.effect == 403 and (defender.last_move is None or defender.last_move.pp == 0 or not defender.last_move.selectable_by_instruct() or defender.locked_move is not None): + return False + if self.effect == 378 and (ElementType.GRASS in defender.type_ids or defender.ability(attacker=attacker, move=self) == Ability.OVERCOAT or defender.held_item == "safety-goggles"): + return False + if self.effect == 233 and defender.embargo.active(): + return False + if self.effect == 324 and (not attacker.held_item.has_item() or defender.held_item.has_item() or not attacker.held_item.can_remove()): + return False + if self.effect == 185 and (attacker.held_item.has_item() or attacker.held_item.last_used is None): + return False + if self.effect == 430 and (not defender.held_item.has_item() or not defender.held_item.can_remove() or defender.corrosive_gas): + return False + if self.effect == 114 and defender.foresight: + return False + if self.effect == 217 and defender.miracle_eye: + return False + if self.effect == 38 and (attacker.nv.sleep() or attacker.hp == attacker.starting_hp or attacker._name == "Minior"): + return False + if self.effect == 427 and attacker.no_retreat: + return False + if self.effect == 99 and attacker.destiny_bond_cooldown.active(): + return False + if self.effect in (116, 137, 138, 165) and battle.weather.get() in ("h-rain", "h-sun", "h-wind"): + return False + if self.effect in (8, 420, 444) and Ability.DAMP in (attacker.ability(), defender.ability(attacker=attacker, move=self)): + return False + if self.effect in (223, 453) and not attacker.held_item.is_berry(): + return False + if self.effect == 369 and battle.terrain.item == "electric": + return False + if self.effect == 352 and battle.terrain.item == "grassy": + return False + if self.effect == 353 and battle.terrain.item == "misty": + return False + if self.effect == 395 and battle.terrain.item == "psychic": + return False + if self.effect == 66 and attacker.owner.reflect.active(): + return False + if self.effect == 36 and attacker.owner.light_screen.active(): + return False + if self.effect == 110 and ElementType.GHOST in attacker.type_ids and defender.cursed: + return False + if self.effect == 58 and (defender.substitute or defender.illusion_name is not None): + return False + if self.effect == 446 and defender.held_item.get() is None: + return False + if self.effect == 448 and not battle.terrain.item: + return False + if self.effect == 452 and defender.octolock: + return False + if self.effect == 280 and any([defender.defense_split, defender.spdef_split, attacker.defense_split, attacker.spdef_split]): + return False + if self.effect == 281 and any([defender.attack_split, defender.spatk_split, attacker.attack_split, attacker.spatk_split]): + return False + if self.effect == 456 and (defender.type_ids == [ElementType.PSYCHIC] or defender.ability(attacker=attacker, move=self) == Ability.RKS_SYSTEM): + return False + if self.effect == 83 and self not in attacker.moves: + return False + if self.effect == 501 and (defender.has_moved or isinstance(defender.owner.selected_action, int) or defender.owner.selected_action.get_priority(defender, attacker, battle) <= 0): + return False + if defender.ability(attacker=attacker, move=self) in (Ability.QUEENLY_MAJESTY, Ability.DAZZLING, Ability.ARMOR_TAIL) and self.get_priority(attacker, defender, battle) > 0: + return False + return True + + def check_semi_invulnerable(self, attacker, defender, battle): + """ + Returns True if this move hits, False otherwise. + + Checks if a pokemon is in the semi-invulnerable turn of dive or dig. + """ + if not self.targets_opponent(): + return True + if Ability.NO_GUARD in (attacker.ability(), defender.ability(attacker=attacker, move=self)): + return True + if defender.mind_reader.active() and defender.mind_reader.item is attacker: + return True + if defender.dive and self.effect not in (258, 262): + return False + if defender.dig and self.effect not in (127, 148): + return False + if defender.fly and self.effect not in (147, 150, 153, 208, 288, 334, 373): + return False + if defender.shadow_force: + return False + return True + + def check_protect(self, attacker, defender, battle): + """ + Returns True if this move hits, False otherwise. + + Checks if this pokemon is protected by a move like protect or wide guard. + Also returns a formatted message. + """ + msg = "" + # Moves that don't target the opponent can't be protected by the target. + if not self.targets_opponent(): + return True, msg + # Moves which bypass all protection. + if self.effect in (149, 224, 273, 360, 438, 489): + return True, msg + if attacker.ability() == Ability.UNSEEN_FIST and self.makes_contact(attacker): + return True, msg + if defender.crafty_shield and self.damage_class == DamageClass.STATUS: + return False, msg + # Moves which bypass all protection except for crafty shield. + if self.effect in (29, 107, 179, 412): + return True, msg + if defender.protect: + return False, msg + if defender.spiky_shield: + if self.makes_contact(attacker) and attacker.held_item != "protective-pads": + msg += attacker.damage(attacker.starting_hp // 8, battle, source=f"{defender.name}'s spiky shield") + return False, msg + if defender.baneful_bunker: + if self.makes_contact(attacker) and attacker.held_item != "protective-pads": + msg += attacker.nv.apply_status("poison", battle, attacker=defender, source=f"{defender.name}'s baneful bunker") + return False, msg + if defender.wide_guard and self.targets_multiple(): + return False, msg + if self.get_priority(attacker, defender, battle) > 0 and battle.terrain.item == "psychic" and defender.grounded(battle, attacker=attacker, move=self): + return False, msg + if defender.mat_block and self.damage_class != DamageClass.STATUS: + return False, msg + if defender.king_shield and self.damage_class != DamageClass.STATUS: + if self.makes_contact(attacker) and attacker.held_item != "protective-pads": + msg += attacker.append_attack(-1, attacker=defender, move=self, source=f"{defender.name}'s silk trap") + return False, msg + if defender.obstruct and self.damage_class != DamageClass.STATUS: + if self.makes_contact(attacker) and attacker.held_item != "protective-pads": + msg += attacker.append_defense(-2, attacker=defender, move=self, source=f"{defender.name}'s silk trap") + return False, msg + if defender.silk_trap and self.damage_class != DamageClass.STATUS: + if self.makes_contact(attacker) and attacker.held_item != "protective-pads": + msg += attacker.append_speed(-1, attacker=defender, move=self, source=f"{defender.name}'s silk trap") + return False, msg + if defender.burning_bulwark and self.damage_class != DamageClass.STATUS: + if self.makes_contact(attacker) and attacker.held_item != "protective-pads": + msg += attacker.nv.apply_status("burn", battle, attacker=defender, source=f"{defender.name}'s burning bulwark") + return False, msg + if defender.quick_guard and self.get_priority(attacker, defender, battle) > 0: + return False, msg + return True, msg + + def check_hit(self, attacker, defender, battle): + """ + Returns True if this move hits, False otherwise. + + Calculates the chance to hit & does an RNG check using that chance. + """ + micle_used = attacker.micle_berry_ate + attacker.micle_berry_ate = False + #Moves that have a None accuracy always hit. + if self.accuracy is None: + return True + + # During hail, this bypasses accuracy checks + if self.effect == 261 and battle.weather.get() == "hail": + return True + # During rain, this bypasses accuracy checks + if self.effect in (153, 334, 357, 365, 396) and battle.weather.get() in ("rain", "h-rain"): + return True + # If used by a poison type, this bypasses accuracy checks + if self.effect == 34 and ElementType.POISON in attacker.type_ids: + return True + # If used against a minimized poke, this bypasses accuracy checks + if self.effect == 338 and defender.minimized: + return True + + # These DO allow OHKO moves to bypass accuracy checks + if self.targets_opponent(): + if defender.mind_reader.active() and defender.mind_reader.item is attacker: + return True + if attacker.ability() == Ability.NO_GUARD: + return True + if defender.ability(attacker=attacker, move=self) == Ability.NO_GUARD: + return True + + # OHKO moves + if self.effect == 39: + accuracy = 30 + (attacker.level - defender.level) + return random.uniform(0, 100) <= accuracy + + # This does NOT allow OHKO moves to bypass accuracy checks + if attacker.telekinesis.active(): + return True + + + accuracy = self.accuracy + # When used during harsh sunlight, this has an accuracy of 50% + if self.effect in (153, 334) and battle.weather.get() in ("sun", "h-sun"): + accuracy = 50 + if self.targets_opponent(): + if defender.ability(attacker=attacker, move=self) == Ability.WONDER_SKIN and self.damage_class == DamageClass.STATUS: + accuracy = 50 + + if defender.ability(attacker=attacker, move=self) == Ability.UNAWARE: + stage = 0 + else: + stage = attacker.get_accuracy(battle) + if not ( + self.effect == 304 + or defender.foresight + or defender.miracle_eye + or attacker.ability() in [Ability.UNAWARE, Ability.KEEN_EYE, Ability.MINDS_EYE] + ): + stage -= defender.get_evasion(battle) + stage = min(6, max(-6, stage)) + stage_multiplier = { + -6: 3/9, + -5: 3/8, + -4: 3/7, + -3: 3/6, + -2: 3/5, + -1: 3/4, + 0: 1, + 1: 4/3, + 2: 5/3, + 3: 2, + 4: 7/3, + 5: 8/3, + 6: 3, + } + accuracy *= stage_multiplier[stage] + if self.targets_opponent(): + if defender.ability(attacker=attacker, move=self) == Ability.TANGLED_FEET and defender.confusion.active(): + accuracy *= .5 + if defender.ability(attacker=attacker, move=self) == Ability.SAND_VEIL and battle.weather.get() == "sandstorm": + accuracy *= .8 + if defender.ability(attacker=attacker, move=self) == Ability.SNOW_CLOAK and battle.weather.get() == "hail": + accuracy *= .8 + if attacker.ability() == Ability.COMPOUND_EYES: + accuracy *= 1.3 + if attacker.ability() == Ability.HUSTLE and self.damage_class == DamageClass.PHYSICAL: + accuracy *= .8 + if attacker.ability() == Ability.VICTORY_STAR: + accuracy *= 1.1 + if battle.gravity.active(): + accuracy *= (5 / 3) + if attacker.held_item == "wide-lens": + accuracy *= 1.1 + if attacker.held_item == "zoom-lens" and defender.has_moved: + accuracy *= 1.2 + if defender.held_item == "bright-powder": + accuracy *= .9 + if micle_used: + accuracy *= 1.2 + + return random.uniform(0, 100) <= accuracy + + def check_effective(self, attacker, defender, battle): + """ + Returns True if a move has an effect on a poke. + + Moves can have no effect based on things like type effectiveness and groundedness. + """ + # What if I :flushed: used Hold Hands :flushed: in a double battle :flushed: with you? :flushed: + # (and you weren't protected by Crafty Shield or in the semi-invulnerable turn of a move like Fly or Dig) + if self.effect in (86, 174, 368, 370, 371, 389): + return False + + if not self.targets_opponent(): + return True + + if self.effect == 266 and defender.ability(attacker=attacker, move=self) == Ability.OBLIVIOUS: + return False + if self.effect == 39 and defender.ability(attacker=attacker, move=self) == Ability.STURDY: + return False + if self.effect == 39 and self.id == 329 and ElementType.ICE in defender.type_ids: + return False + if self.effect == 400 and not defender.nv.current: + return False + if self.is_sound_based() and defender.ability(attacker=attacker, move=self) == Ability.SOUNDPROOF: + return False + if self.is_ball_or_bomb() and defender.ability(attacker=attacker, move=self) == Ability.BULLETPROOF: + return False + if attacker.ability() == Ability.PRANKSTER and ElementType.DARK in defender.type_ids: + if self.damage_class == DamageClass.STATUS: + return False + # If the attacker used a status move that called this move, even if this move is not a status move then it should still be considered affected by prankster. + if not isinstance(attacker.owner.selected_action, int) and attacker.owner.selected_action.damage_class == DamageClass.STATUS: + return False + if defender.ability(attacker=attacker, move=self) == Ability.GOOD_AS_GOLD and self.damage_class == DamageClass.STATUS: + return False + + # Status moves do not care about type effectiveness - except for thunder wave FOR SOME REASON... + if self.damage_class == DamageClass.STATUS and self.id != 86: + return True + + current_type = self.get_type(attacker, defender, battle) + if current_type == ElementType.TYPELESS: + return True + effectiveness = defender.effectiveness(current_type, battle, attacker=attacker, move=self) + if self.effect == 338: + effectiveness *= defender.effectiveness(ElementType.FLYING, battle, attacker=attacker, move=self) + if effectiveness == 0: + return False + + if current_type == ElementType.GROUND and not defender.grounded(battle, attacker=attacker, move=self) and self.effect != 373 and not battle.inverse_battle: + return False + if self.effect != 459: + if current_type == ElementType.ELECTRIC and defender.ability(attacker=attacker, move=self) == Ability.VOLT_ABSORB and defender.hp == defender.starting_hp: + return False + if current_type == ElementType.WATER and defender.ability(attacker=attacker, move=self) in (Ability.WATER_ABSORB, Ability.DRY_SKIN) and defender.hp == defender.starting_hp: + return False + if current_type == ElementType.FIRE and defender.ability(attacker=attacker, move=self) == Ability.FLASH_FIRE and defender.flash_fire: + return False + if effectiveness <= 1 and defender.ability(attacker=attacker, move=self) == Ability.WONDER_GUARD: + return False + + return True + + def is_sound_based(self): + """Whether or not this move is sound based.""" + return self.id in [ + 45, 46, 47, 48, 103, 173, 195, 215, 253, 304, 319, 320, 336, 405, 448, 496, 497, 547, + 555, 568, 574, 575, 586, 590, 664, 691, 728, 744, 753, 826, 871, 1005, 1006 + ] + + def is_punching(self): + """Whether or not this move is a punching move.""" + return self.id in [ + 4, 5, 7, 8, 9, 146, 183, 223, 264, 309, 325, 327, 359, 409, 418, 612, 665, 721, 729, + 764, 765, 834, 857, 889 + ] + + def is_biting(self): + """Whether or not this move is a biting move.""" + return self.id in [44, 158, 242, 305, 422, 423, 424, 706, 733, 742] + + def is_ball_or_bomb(self): + """Whether or not this move is a ball or bomb move.""" + return self.id in [ + 121, 140, 188, 190, 192, 247, 296, 301, 311, 331, 350, 360, 396, 402, 411, 412, 426, + 439, 443, 486, 491, 545, 676, 690, 748, 1017 + ] + + def is_aura_or_pulse(self): + """Whether or not this move is an aura or pulse move.""" + return self.id in [352, 396, 399, 406, 505, 618, 805] + + def is_powder_or_spore(self): + """Whether or not this move is a powder or spore move.""" + return self.id in [77, 78, 79, 147, 178, 476, 600, 737] + + def is_dance(self): + """Whether or not this move is a dance move.""" + return self.id in [14, 80, 297, 298, 349, 461, 483, 552, 686, 744, 846, 872] + + def is_slicing(self): + """Whether or not this move is a slicing move.""" + return self.id in [ + 15, 75, 163, 210, 314, 332, 348, 400, 403, 404, 427, 440, 533, 534, 669, 749, 830, 845, + 860, 869, 891, 895, 1013, 1014 + ] + + def is_wind(self): + """Whether or not this move is a wind move.""" + return self.id in [16, 18, 59, 196, 201, 239, 257, 314, 366, 542, 572, 584, 829, 842, 844, 849] + + def is_affected_by_magic_coat(self): + """Whether or not this move can be reflected by magic coat and magic bounce.""" + return self.id in [ + 18, 28, 39, 43, 45, 46, 47, 48, 50, 73, 77, 78, 79, 81, 86, 92, 95, 103, 108, 109, 134, + 137, 139, 142, 147, 148, 169, 178, 180, 184, 186, 191, 193, 204, 207, 212, 213, 227, 230, + 259, 260, 261, 269, 281, 297, 313, 316, 319, 320, 321, 335, 357, 373, 377, 380, 388, 390, + 432, 445, 446, 464, 477, 487, 493, 494, 505, 564, 567, 568, 571, 575, 576, 589, 590, 598, + 599, 600, 608, 666, 668, 671, 672, 685, 715, 736, 737, 810 + ] + + def is_affected_by_heal_block(self): + """Whether or not this move cannot be selected during heal block.""" + return self.id in [ + 71, 72, 105, 135, 138, 141, 156, 202, 208, 234, 235, 236, 256, 273, 303, 355, 361, 409, + 456, 461, 505, 532, 570, 577, 613, 659, 666, 668, 685 + ] + + def is_affected_by_substitute(self): + """Whether or not this move is able to bypass a substitute.""" + return self.id not in [ + 18, 45, 46, 47, 48, 50, 102, 103, 114, 166, 173, 174, 176, 180, 193, 195, 213, 215, 227, + 244, 253, 259, 269, 270, 272, 285, 286, 304, 312, 316, 319, 320, 357, 367, 382, 384, 385, + 391, 405, 448, 495, 496, 497, 513, 516, 547, 555, 568, 574, 575, 586, 587, 589, 590, 593, + 597, 600, 602, 607, 621, 664, 674, 683, 689, 691, 712, 728, 753, 826, 871, 1005, 1006 + ] + + def targets_opponent(self): + """Whether or not this move targets the opponent.""" + #Moves which don't follow normal targeting protocals, ignore them unless they are damaging. + if self.target == MoveTarget.SPECIFIC_MOVE and self.damage_class == DamageClass.STATUS: + return False + #Moves which do not target the opponent pokemon. + return self.target not in ( + MoveTarget.SELECTED_POKEMON_ME_FIRST, + MoveTarget.ALLY, + MoveTarget.USERS_FIELD, + MoveTarget.USER_OR_ALLY, + MoveTarget.OPPONENTS_FIELD, + MoveTarget.USER, + MoveTarget.ENTIRE_FIELD, + MoveTarget.USER_AND_ALLIES, + MoveTarget.ALL_ALLIES, + ) + + def targets_multiple(self): + """Whether or not this move targets multiple pokemon.""" + return self.target in ( + MoveTarget.ALL_OTHER_POKEMON, + MoveTarget.ALL_OPPONENTS, + MoveTarget.USER_AND_ALLIES, + MoveTarget.ALL_POKEMON, + MoveTarget.ALL_ALLIES, + ) + + def makes_contact(self, attacker): + """Whether or not this move makes contact.""" + return self.id in [ + 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 12, 15, 17, 19, 20, 21, 22, 23, 24, 25, 26, 27, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 44, 64, 65, 66, 67, 68, 69, 70, 80, 91, 98, 99, + 117, 122, 127, 128, 130, 132, 136, 141, 146, 152, 154, 158, 162, 163, 165, 167, 168, + 172, 175, 179, 183, 185, 200, 205, 206, 209, 210, 211, 216, 218, 223, 224, 228, 229, + 231, 232, 233, 238, 242, 245, 249, 252, 263, 264, 265, 276, 279, 280, 282, 283, 291, + 292, 299, 301, 302, 305, 306, 309, 310, 325, 327, 332, 337, 340, 342, 343, 344, 348, + 358, 359, 360, 365, 369, 370, 371, 372, 376, 378, 386, 387, 389, 394, 395, 398, 400, + 401, 404, 407, 409, 413, 416, 418, 419, 421, 422, 423, 424, 425, 428, 431, 438, 440, + 442, 447, 450, 452, 453, 457, 458, 462, 467, 480, 484, 488, 490, 492, 498, 507, 509, + 512, 514, 525, 528, 529, 530, 531, 532, 533, 534, 535, 537, 541, 543, 544, 550, 557, + 560, 565, 566, 577, 583, 609, 610, 611, 612, 620, 658, 660, 663, 665, 667, 669, 675, + 677, 679, 680, 681, 684, 688, 692, 693, 696, 699, 701, 706, 707, 709, 710, 712, 713, + 716, 718, 721, 724, 729, 730, 733, 741, 742, 745, 747, 749, 750, 752, 756, 760, 764, + 765, 766, 779, 799, 803, 806, 812, 813, 821, 830, 832, 834, 840, 845, 848, 853, 857, + 859, 860, 861, 862, 866, 869, 872, 873, 878, 879, 884, 885, 887, 889, 891, 892, 894, + 1003, 1010, 1012, 1013 + ] and not attacker.ability() == Ability.LONG_REACH + + def selectable_by_mirror_move(self): + """Whether or not this move can be selected by mirror move.""" + return self.targets_opponent() + # Previously, this was a hardcoded list of values. + # I don't think there is any factor besides whether or not the move can target opponents (for single battles). + """ + return self.id not in [ + 10, 14, 54, 68, 74, 96, 97, 100, 102, 104, 105, 106, 107, 110, 111, 112, 113, 114, 115, + 116, 117, 118, 119, 133, 135, 144, 150, 151, 156, 159, 160, 164, 165, 166, 174, 176, + 182, 187, 191, 194, 195, 197, 201, 203, 208, 214, 215, 219, 226, 234, 235, 236, 240, + 241, 243, 244, 248, 254, 255, 256, 258, 264, 266, 267, 268, 270, 272, 273, 274, 275, + 277, 278, 286, 287, 288, 289, 293, 294, 300, 303, 312, 322, 334, 336, 339, 346, 347, + 349, 353, 355, 356, 361, 366, 367, 379, 381, 382, 383, 390, 392, 393, 397, 417, 446, + 455, 456, 461, 468, 469, 470, 471, 475, 476, 483, 489, 495, 501, 502, 504, 505, 508, + 513, 515, 526, 538, 561, 562, 563, 564, 569, 578, 579, 580, 581, 596, 597, 601, 602, + 603, 604, 606, 607, 1000 + ] + """ + + def selectable_by_sleep_talk(self): + """Whether or not this move can be selected by sleep talk.""" + return self.id not in [ + 13, 19, 76, 91, 102, 117, 118, 119, 130, 143, 166, 253, 264, 274, 291, 340, 382, 383, + 467, 507, 553, 554, 562, 566, 601, 669, 690, 704, 731 + ] + + def selectable_by_assist(self): + """Whether or not this move can be selected by assist.""" + return self.id not in [ + 18, 19, 46, 68, 91, 102, 118, 119, 144, 165, 166, 168, 182, 194, 197, 203, 214, 243, + 264, 266, 267, 270, 271, 289, 291, 340, 343, 364, 382, 383, 415, 448, 467, 476, 507, + 509, 516, 525, 561, 562, 566, 588, 596, 606, 607, 661, 671, 690, 704 + ] + + def selectable_by_mimic(self): + """Whether or not this move can be selected by mimic.""" + return self.id not in [102, 118, 165, 166, 448, 896] + + def selectable_by_instruct(self): + """Whether or not this move can be selected by instruct.""" + return self.id not in [ + 13, 19, 63, 76, 91, 102, 117, 118, 119, 130, 143, 144, 165, 166, 214, 264, 267, 274, + 289, 291, 307, 308, 338, 340, 382, 383, 408, 416, 439, 459, 467, 507, 553, 554, 566, + 588, 601, 669, 689, 690, 704, 711, 761, 762, 896 + ] + + def selectable_by_snatch(self): + """Whether or not this move can be selected by snatch.""" + return self.id in [ + 14, 54, 74, 96, 97, 104, 105, 106, 107, 110, 111, 112, 113, 115, 116, 133, 135, 151, + 156, 159, 160, 164, 187, 208, 215, 219, 234, 235, 236, 254, 256, 268, 273, 275, 278, + 286, 287, 293, 294, 303, 312, 322, 334, 336, 339, 347, 349, 355, 361, 366, 379, 381, + 392, 393, 397, 417, 455, 456, 461, 468, 469, 475, 483, 489, 501, 504, 508, 526, 538, + 561, 602, 659, 673, 674, 694, 0xCFCF + ] + + @staticmethod + def get_conversion_2(attacker, defender, battle): + """ + Gets a random new type for attacker that is resistant to defender's last move type. + + Returns a random possible type id, or None if there is no valid type. + """ + if defender.last_move is None: + return None + movetype = defender.last_move.get_type(attacker, defender, battle) + newtypes = set() + for e in ElementType: + if e == ElementType.TYPELESS: + continue + if battle.inverse_battle: + if battle.type_effectiveness[(movetype, e)] > 100: + newtypes.add(e) + else: + if battle.type_effectiveness[(movetype, e)] < 100: + newtypes.add(e) + newtypes -= set(attacker.type_ids) + newtypes = list(newtypes) + if not newtypes: + return None + return random.choice(newtypes) + + def copy(self): + """Generate a copy of this move.""" + return Move( + id=self.id, + identifier=self.name, + power=self.power, + pp=self.pp, + accuracy=self.accuracy, + priority=self.priority, + type_id=self.type, + damage_class_id=self.damage_class, + effect_id=self.effect, + effect_chance=self.effect_chance, + target_id=self.target, + crit_rate=self.crit_rate, + min_hits=self.min_hits, + max_hits=self.max_hits, + ) + + @classmethod + def struggle(cls): + """Generate an instance of the move struggle.""" + return cls( + id=165, + identifier="struggle", + power=50, + pp=999999999999, + accuracy=None, + priority=0, + type_id=ElementType.TYPELESS, + damage_class_id=2, + effect_id=255, + effect_chance=None, + target_id=10, + crit_rate=0, + min_hits=None, + max_hits=None, + ) + + @classmethod + def confusion(cls): + """Generate an instance of the move confusion.""" + return cls( + id=0xCFCF, + identifier="confusion", + power=40, + pp=999999999999, + accuracy=None, + priority=0, + type_id=ElementType.TYPELESS, + damage_class_id=DamageClass.PHYSICAL, + effect_id=1, + effect_chance=None, + target_id=7, + crit_rate=0, + min_hits=None, + max_hits=None, + ) + + @classmethod + def present(cls, power): + """Generate an instance of the move present.""" + return cls( + id=217, + identifier="present", + power=power, + pp=999999999999, + accuracy=90, + priority=0, + type_id=ElementType.NORMAL, + damage_class_id=DamageClass.PHYSICAL, + effect_id=123, + effect_chance=None, + target_id=10, + crit_rate=0, + min_hits=None, + max_hits=None, + ) + + def __repr__(self): + return f"Move(name={self.name!r}, power={self.power!r}, effect_id={self.effect!r})" diff --git a/pokemonduel/pokemon.py b/pokemonduel/pokemon.py new file mode 100644 index 0000000..0ed1a0d --- /dev/null +++ b/pokemonduel/pokemon.py @@ -0,0 +1,2666 @@ +import random +from .data import find, find_one +from .enums import Ability, DamageClass, ElementType +from .misc import NonVolatileEffect, Metronome, ExpiringEffect, ExpiringItem, HeldItem +from .move import Move + + +class DuelPokemon(): + """ + An instance of a pokemon in a duel. + + Contains extra duel-specific information. + """ + + def __init__(self, **kwargs): + #ID from pfile + self.pokemon_id = kwargs['pokemon_id'] + self._name = kwargs['name'] + self._nickname = kwargs['nickname'] + if self._nickname != "None": + self.name = f"{self._nickname} ({self._name.replace('-', ' ')})" + else: + self.name = self._name.replace("-", " ") + self.illusion__name = None + self.illusion_name = None + + # Dict {pokname: List[int]} + self.base_stats = kwargs['base_stats'] + self.hp = kwargs['hp'] + self.attack = self.base_stats[self._name][1] + self.defense = self.base_stats[self._name][2] + self.spatk = self.base_stats[self._name][3] + self.spdef = self.base_stats[self._name][4] + self.speed = self.base_stats[self._name][5] + self.hpiv = min(31, kwargs['hpiv']) + self.atkiv = min(31, kwargs['atkiv']) + self.defiv = min(31, kwargs['defiv']) + self.spatkiv = min(31, kwargs['spatkiv']) + self.spdefiv = min(31, kwargs['spdefiv']) + self.speediv = min(31, kwargs['speediv']) + self.hpev = kwargs['hpev'] + self.atkev = kwargs['atkev'] + self.defev = kwargs['defev'] + self.spatkev = kwargs['spatkev'] + self.spdefev = kwargs['spdefev'] + self.speedev = kwargs['speedev'] + self.nature_stat_deltas = kwargs['nature_stat_deltas'] + self.moves = kwargs['moves'] + self.ability_id = kwargs['ability_id'] + self.mega_ability_id = kwargs['mega_ability_id'] + self.type_ids = kwargs['type_ids'] + self.mega_type_ids = kwargs['mega_type_ids'] + self._starting_name = self._name + self.starting_hp = self.hp + self.starting_hpiv = self.hpiv + self.starting_atkiv = self.atkiv + self.starting_defiv = self.defiv + self.starting_spatkiv = self.spatkiv + self.starting_spdefiv = self.spdefiv + self.starting_speediv = self.speediv + self.starting_hpev = self.hpev + self.starting_atkev = self.atkev + self.starting_defev = self.defev + self.starting_spatkev = self.spatkev + self.starting_spdefev = self.spdefev + self.starting_speedev = self.speedev + self.starting_moves = self.moves.copy() #shallow copy to keep the objects but not the list itself + self.starting_ability_id = self.ability_id + self.starting_type_ids = self.type_ids.copy() + #10 "weight" = 1 kg + self.starting_weight = max(1, kwargs['weight']) + self.attack_stage = 0 + self.defense_stage = 0 + self.spatk_stage = 0 + self.spdef_stage = 0 + self.speed_stage = 0 + self.accuracy_stage = 0 + self.evasion_stage = 0 + self.level = kwargs['level'] + self.shiny = kwargs['shiny'] + self.radiant = kwargs['radiant'] + self.skin = kwargs['skin'] + self.id = kwargs['id'] + self.held_item = HeldItem(kwargs['held_item'], self) + self.happiness = kwargs['happiness'] + self.gender = kwargs['gender'] + self.can_still_evolve = kwargs['can_still_evolve'] + self.disliked_flavor = kwargs['disliked_flavor'] + + self.owner = None + self.active_turns = 0 + + self.cursed = False + self.switched = False + self.minimized = False + self.nv = NonVolatileEffect(self) + self.metronome = Metronome() + self.leech_seed = False + self.stockpile = 0 + self.flinched = False + self.confusion = ExpiringEffect(0) + + self.can_move = True + self.has_moved = False + #Boolean - stores whether this poke swapped in this turn, and should not have the next_turn function be called. + self.swapped_in = False + #Boolean - stores whether this poke has ever been sent in. + self.ever_sent_out = False + #Boolean - stores whether this poke should attempt to mega evolve this turn. + self.should_mega_evolve = False + + # Moves + #Optional[Move] - stores the last move used by this poke + self.last_move = None + #Optional[Tuple[int, DamageClass]] - stores the damage taken and the class of that damage. + #Resets at the end of a turn. + self.last_move_damage = None + #Boolean - stores whether or not the last move used by this poke failed. + self.last_move_failed = False + #Optional[LockedMove] - stores the move this poke is currently locked into using due to it being a multi turn move. + self.locked_move = None + #Optional[Move] - stores the move this poke is currently locked into using due to a choice item. + self.choice_move = None + #ExpiringItem - stores the number of turns a specific move is disabled. + self.disable = ExpiringItem() + #ExpiringEffect - stores the number of turns this poke is taunted. + self.taunt = ExpiringEffect(0) + #ExpiringItem - stores the number of turns this poke is giving an encore of a specific move. + self.encore = ExpiringItem() + #Boolean - stores whether or not this pokemon is affected by torment. + self.torment = False + #Boolean - stores whether or not this pokemon has imprison active. + self.imprison = False + #ExpiringEffect - stores the number of turns this poke is blocked from using healing moves. + self.heal_block = ExpiringEffect(0) + #Optional[int] - stores the damage takes since bide was started. + self.bide = None + #Boolean - stores whether or not this pokemon has used focus energy. + self.focus_energy = False + #ExpiringEffect - stores the number of turns until this pokemon faints. + self.perish_song = ExpiringEffect(0) + #Boolean - stores whether or not this pokemon is inflicted by nightmare. + self.nightmare = False + #Boolean - stores whether or not this pokemon has used defense curl since entering the field. + self.defense_curl = False + #Int - stores the number of times fury cutter has been used since entering the field. + self.fury_cutter = 0 + #ExpiringEffect - stores the number of turns bind is active on this poke. + self.bind = ExpiringEffect(0) + #Int - stores the remaining HP of this pokemon's substitute, or 0 if there is no substitute. + self.substitute = 0 + #ExpiringEffect - stores the number of turns this pokemon is silenced for (can't use sound based moves). + self.silenced = ExpiringEffect(0) + #Boolean - stores whether or not this poke is in rage, and gains attack stages after being hit. + self.rage = False + #ExpiringItem - stores whether or not mind reader is active ON this poke, and the poke which is reading its mind. + self.mind_reader = ExpiringItem() + #Boolean - stores whether any attacker that causes this poke to faint will also faint this turn. + self.destiny_bond = False + #ExpiringEffect - stores whether destiny bond is on cooldown and cannot be executed. + self.destiny_bond_cooldown = ExpiringEffect(0) + #Boolean - stores whether or not this poke is prevented from switching out. This does not prevent moves that swap the target or user. + self.trapping = False + #Boolean - stores whether or not this poke is under the effect of ingrain. This does not prevent moves that swap the user, but does prevent target swaps. + self.ingrain = False + #Optional[DuelPokemon] - stores the pokemon that this pokemon is infatuated with. + self.infatuated = None + #Boolean - stores whether or not this poke is under the effect of aqua ring. + self.aqua_ring = False + #ExpiringEffect - stores the number of turns this pokemon is ungrounded due to magnet rise. + self.magnet_rise = ExpiringEffect(0) + #Boolean - stores whether or not this poke is in a semi-invulnerable state from dive. + self.dive = False + #Boolean - stores whether or not this poke is in a semi-invulnerable state from dig. + self.dig = False + #Boolean - stores whether or not this poke is in a semi-invulnerable state from bounce or fly. + self.fly = False + #Boolean - stores whether or not this poke is in a semi-invulnerable state from shadow force or phantom force. + self.shadow_force = False + #ExpiringEffect - stores how long this poke cannot be hit by critical hits due to lucky chant. + self.lucky_chant = ExpiringEffect(0) + #Boolean - stores whether or not this poke has been hit by smack down or thousand arrows, and is grounded. + self.grounded_by_move = False + #ExpiringEffect - stores the number of turns electric type moves have double power from this poke. + self.charge = ExpiringEffect(0) + #ExpiringEffect - stores the number of turns pokes cannot fall asleep. + self.uproar = ExpiringEffect(0) + #Boolean - stores whether or not this poke reflects status moves due to magic coat. + self.magic_coat = False + #Boolean - stores whether or not this poke has used power trick. + self.power_trick = False + #Boolean - stores whether or not this poke has used power shift. + self.power_shift = False + #ExpiringEffect - stores the number of turns until this poke falls asleep due to drowsiness. + self.yawn = ExpiringEffect(0) + #Boolean - stores whether this poke is turning normal moves to electric this turn. + self.ion_deluge = False + #Boolean - stores whether this poke's move is changed to electric type due to electrify. + self.electrify = False + #Boolean - stores whether this poke used a protection move this turn. + self.protection_used = False + #Int - stores the current chance (1/x) that a poke can use a protection move. + self.protection_chance = 1 + #Boolean - stores whether this poke is protected by protect this turn. + self.protect = False + #Boolean - stores whether this poke is protected by endure this turn. + self.endure = False + #Boolean - stores whether this poke is protected by wide guard this turn. + self.wide_guard = False + #Boolean - stores whether this poke is protected by crafty shield this turn. + self.crafty_shield = False + #Boolean - stores whether this poke is protected by king shield this turn. + self.king_shield = False + #Boolean - stores whether this poke is protected by spiky shield this turn. + self.spiky_shield = False + #Boolean - stores whether this poke is protected by mat block this turn. + self.mat_block = False + #Boolean - stores whether this poke is protected by baneful bunker this turn. + self.baneful_bunker = False + #Boolean - stores whether this poke is protected by quick guard this turn. + self.quick_guard = False + #Boolean - stores whether this poke is protected by obstruct this turn. + self.obstruct = False + #Boolean - stores whether this poke is protected by silk trap this turn. + self.silk_trap = False + #Boolean - stores whether this poke is protected by burning bulwark this turn. + self.burning_bulwark = False + #ExpiringEffect - stores whether this poke will always crit due to laser focus. + self.laser_focus = ExpiringEffect(0) + #Boolean - stores whether this poke is coated with powder and will explode if it uses a fire type move. + self.powdered = False + #Boolean - stores whether this poke will steal the effect of certain self targeted moves this turn using snatch. + self.snatching = False + #ExpiringEffect - stores the number of turns this poke is ungrounded and hits to it never miss due to telekinesis. + self.telekinesis = ExpiringEffect(0) + #ExpiringEffect - stores the number of turns this poke is blocked from using held items due to embargo. + self.embargo = ExpiringEffect(0) + #Int - stores the current power of echoed voice. + self.echoed_voice_power = 40 + #Boolean - stores whether echoed voice was used this turn. + self.echoed_voice_used = False + #Boolean - stores whether this poke is inflicted with a curse. + self.curse = False + #ExpiringEffect - stores whether this poke is preventing swap outs this turn. + self.fairy_lock = ExpiringEffect(0) + #Boolean - stores whether this poke remove all PP from a move that kills it this turn. + self.grudge = False + #Boolean - stores whether this poke is affected by foresight. + self.foresight = False + #Boolean - stores whether this poke is affected by miracle_eye. + self.miracle_eye = False + #Boolean - stores whether this poke is currently charging beak blast. + self.beak_blast = False + #Boolean - stores whether this poke is unable to switch out from no retreat. + self.no_retreat = False + #Boolean - stores whether this poke has taken ANY damage this turn. + self.dmg_this_turn = False + #Boolean - stores whether this poke has eaten a berry this battle. + self.ate_berry = False + #Boolean - stores whether this poke is unable to use its held item for the rest of the battle due to corrosive gas. + self.corrosive_gas = False + #Boolean - stores whether this poke has had a stat increase this turn. + self.stat_increased = False + #Boolean - stores whether this poke has had a stat decrease this turn. + self.stat_decreased = False + #Boolean - stores whether this poke has had its flying type surpressed this turn. + self.roost = False + #Boolean - stores whether this poke is affected by octolock, and has its def/spdef lowered each turn. + self.octolock = False + #Optional[Int] - stores the raw attack value this poke's attack is split with. + self.attack_split = None + #Optional[Int] - stores the raw special attack value this poke's special attack is split with. + self.spatk_split = None + #Optional[Int] - stores the raw defense value this poke's defense is split with. + self.defense_split = None + #Optional[Int] - stores the raw special defense value this poke's special defense is split with. + self.spdef_split = None + #Int - stores the number of times autotomize has been used since switching out. + self.autotomize = 0 + #Boolean - stores whether or not this pokemon's critical hit ratio is increased from eating a lansat berry. + self.lansat_berry_ate = False + #Boolean - stores whether or not this pokemon's next move has increased accuracy from eating a micle berry. + self.micle_berry_ate = False + #Boolean - stores whether or not fire type moves are 2x effective on this pokemon from tar shot. + self.tar_shot = False + #ExpiringEffect - stores the number of turns this pokemon is lowering the opponent's speed at the end of every turn. + self.syrup_bomb = ExpiringEffect(0) + #Int - stores the number of times this pokemon has been hit this battle, and does NOT reset when switching out. + self.num_hits = 0 + + # Abilities + #Boolean - stores whether this poke's fire moves are boosted by flash fire. + self.flash_fire = False + #Int - stores the turn number relative to getting truant, % 2 == 1 -> loaf around. + self.truant_turn = 0 + #Boolean - stores whether the ice face of this pokemon has been repaired. + self.ice_repaired = False + #Optional[Item] - stores the last berry ate by this pokemon. + self.last_berry = None + #ExpiringEffect - stores the number of turns until this pokemon attempts to recover & eat their last eaten berry. + self.cud_chew = ExpiringEffect(0) + #Boolean - stores whether booster_energy has been consumed this send out to activate the effects of Protosynthesis / Quark Drive. + self.booster_energy = False + #Boolean - stores whether supersweet_syrup has been consumed to lower the evasion of its opponent. NOT reset on switch out. + self.supersweet_syrup = False + + def send_out(self, otherpoke, battle): + """ + Initalize a poke upon first sending it out. + + otherpoke may be None, if two pokes are sent out at the same time and the first is killed in the send out process. + Returns a formatted message. + """ + self.ever_sent_out = True + + # Emergency exit `remove`s the pokemon *in the middle of the turn* in a somewhat unsafe way. + # `remove` may need to be called here, but that seems like it may have side effects. + self.flinched = False + + # This has to go BEFORE the send out message, and not in send_out_ability as it only + # applies on send out, not when abilities are changed, and it changes the send out msg. + illusion_options = [x for x in self.owner.party if x is not self and x.hp > 0] + if self.ability() == Ability.ILLUSION and illusion_options: + self.illusion__name = self._name + self.illusion_name = self.name + self._name = illusion_options[-1]._name + self.name = illusion_options[-1].name + + if self._name == "Pikachu": + msg = f"{self.name}, I choose you!\n" + else: + msg = f"{self.owner.name} sent out {self.name}!\n" + + # Any time a poke switches out, certain effects it had put on its opponent end + if otherpoke is not None: + otherpoke.trapping = False + otherpoke.octolock = False + otherpoke.bind.set_turns(0) + + #Baton Pass + if self.owner.baton_pass is not None: + msg += f"{self.name} carries on the baton!\n" + self.owner.baton_pass.apply(self) + self.owner.baton_pass = None + + #Shed Tail + if self.owner.next_substitute: + self.substitute = self.owner.next_substitute + self.owner.next_substitute = 0 + + #Entry hazards + #Special case for clearing toxic spikes, still happens even with heavy duty boots + if self.owner.toxic_spikes and self.grounded(battle) and ElementType.POISON in self.type_ids: + self.owner.toxic_spikes = 0 + msg += f"{self.name} absorbed the toxic spikes!\n" + if self.held_item != "heavy-duty-boots": + #Grounded entry hazards + if self.grounded(battle): + #Spikes + if self.owner.spikes: + #1/8 -> 1/4 + damage = self.starting_hp // (10 - (2 * self.owner.spikes)) + msg += self.damage(damage, battle, source="spikes") + #Toxic spikes + if self.owner.toxic_spikes == 1: + msg += self.nv.apply_status("poison", battle, source="toxic spikes") + elif self.owner.toxic_spikes == 2: + msg += self.nv.apply_status("b-poison", battle, source="toxic spikes") + #Sticky web + if self.owner.sticky_web: + msg += self.append_speed(-1, source="the sticky web") + #Non-grounded entry hazards + if self.owner.stealth_rock: + effective = self.effectiveness(ElementType.ROCK, battle) + if effective: + # damage = 1/8 max hp * effectiveness + damage = self.starting_hp // (32 // (4 * effective)) + msg += self.damage(int(damage), battle, source="stealth rock") + + if self.hp > 0: + msg += self.send_out_ability(otherpoke, battle) + + #Restoration + if self.owner.healing_wish: + used = False + if self.hp != self.starting_hp: + used = True + self.hp = self.starting_hp + if self.nv.current: + used = True + self.nv.reset() + if used: + self.owner.healing_wish = False + msg += f"{self.name} was restored by healing wish!\n" + if self.owner.lunar_dance: + used = False + if self.hp != self.starting_hp: + used = True + self.hp = self.starting_hp + if self.nv.current: + used = True + self.nv.reset() + not_at_full_pp = [move for move in self.moves if move.pp != move.starting_pp] + if not_at_full_pp: + used = True + for move in not_at_full_pp: + move.pp = move.starting_pp + if used: + self.owner.lunar_dance = False + msg += f"{self.name} was restored by lunar dance\n" + + # Items + if self.held_item == "air-balloon" and not self.grounded(battle): + msg += f"{self.name} floats in the air with its air balloon!\n" + if self.held_item == "electric-seed" and battle.terrain.item == "electric": + msg += self.append_defense(1, attacker=self, source="its electric seed") + self.held_item.use() + if self.held_item == "psychic-seed" and battle.terrain.item == "psychic": + msg += self.append_spdef(1, attacker=self, source="its psychic seed") + self.held_item.use() + if self.held_item == "misty-seed" and battle.terrain.item == "misty": + msg += self.append_spdef(1, attacker=self, source="its misty seed") + self.held_item.use() + if self.held_item == "grassy-seed" and battle.terrain.item == "grassy": + msg += self.append_defense(1, attacker=self, source="its grassy seed") + self.held_item.use() + + return msg + + def send_out_ability(self, otherpoke, battle): + """ + Initalize this poke's ability. + + otherpoke may be None. + Returns a formatted message. + """ + msg = "" + + #Imposter (sus) + if self.ability() == Ability.IMPOSTER and otherpoke is not None and not otherpoke.substitute and otherpoke.illusion_name is None: + msg += f"{self.name} transformed into {otherpoke._name}!\n" + self.transform(otherpoke) + + #Weather + if self.ability() == Ability.DRIZZLE: + msg += battle.weather.set("rain", self) + if self.ability() == Ability.PRIMORDIAL_SEA: + msg += battle.weather.set("h-rain", self) + if self.ability() == Ability.SAND_STREAM: + msg += battle.weather.set("sandstorm", self) + if self.ability() == Ability.SNOW_WARNING: + msg += battle.weather.set("hail", self) + if self.ability() in (Ability.DROUGHT, Ability.ORICHALCUM_PULSE): + msg += battle.weather.set("sun", self) + if self.ability() == Ability.DESOLATE_LAND: + msg += battle.weather.set("h-sun", self) + if self.ability() == Ability.DELTA_STREAM: + msg += battle.weather.set("h-wind", self) + + #Terrain + if self.ability() == Ability.GRASSY_SURGE: + msg += battle.terrain.set("grassy", self) + if self.ability() == Ability.MISTY_SURGE: + msg += battle.terrain.set("misty", self) + if self.ability() in (Ability.ELECTRIC_SURGE, Ability.HADRON_ENGINE): + msg += battle.terrain.set("electric", self) + if self.ability() == Ability.PSYCHIC_SURGE: + msg += battle.terrain.set("psychic", self) + + # Message only + if self.ability() == Ability.MOLD_BREAKER: + msg += f"{self.name} breaks the mold!\n" + if self.ability() == Ability.TURBOBLAZE: + msg += f"{self.name} is radiating a blazing aura!\n" + if self.ability() == Ability.TERAVOLT: + msg += f"{self.name} is radiating a bursting aura!\n" + + if self.ability() == Ability.INTIMIDATE and otherpoke is not None: + if otherpoke.ability() == Ability.OBLIVIOUS: + msg += f"{otherpoke.name} is too oblivious to be intimidated!\n" + elif otherpoke.ability() == Ability.OWN_TEMPO: + msg += f"{otherpoke.name} keeps walking on its own tempo, and is not intimidated!\n" + elif otherpoke.ability() == Ability.INNER_FOCUS: + msg += f"{otherpoke.name} is too focused to be intimidated!\n" + elif otherpoke.ability() == Ability.SCRAPPY: + msg += f"{otherpoke.name} is too scrappy to be intimidated!\n" + elif otherpoke.ability() == Ability.GUARD_DOG: + msg += f"{otherpoke.name}'s guard dog keeps it from being intimidated!\n" + msg += otherpoke.append_attack(1, attacker=otherpoke, source="its guard dog") + else: + msg += otherpoke.append_attack(-1, attacker=self, source=f"{self.name}'s Intimidate") + if otherpoke.held_item == "adrenaline-orb": + msg += otherpoke.append_speed(1, attacker=otherpoke, source="its adrenaline orb") + if otherpoke.ability() == Ability.RATTLED: + msg += otherpoke.append_speed(1, attacker=otherpoke, source="its rattled") + if self.ability() == Ability.SCREEN_CLEANER: + battle.trainer1.aurora_veil.set_turns(0) + battle.trainer1.light_screen.set_turns(0) + battle.trainer1.reflect.set_turns(0) + battle.trainer2.aurora_veil.set_turns(0) + battle.trainer2.light_screen.set_turns(0) + battle.trainer2.reflect.set_turns(0) + msg += f"{self.name}'s screen cleaner removed barriers from both sides of the field!\n" + if self.ability() == Ability.INTREPID_SWORD: + msg += self.append_attack(1, attacker=self, source="its intrepid sword") + if self.ability() == Ability.DAUNTLESS_SHIELD: + msg += self.append_defense(1, attacker=self, source="its dauntless shield") + if self.ability() == Ability.TRACE and otherpoke is not None and otherpoke.ability_giveable(): + self.ability_id = otherpoke.ability_id + msg += f"{self.name} traced {otherpoke.name}'s ability!\n" + msg += self.send_out_ability(otherpoke, battle) + return msg + if self.ability() == Ability.DOWNLOAD and otherpoke is not None: + if otherpoke.get_spdef(battle) > otherpoke.get_defense(battle): + msg += self.append_attack(1, attacker=self, source="its download") + else: + msg += self.append_spatk(1, attacker=self, source="its download") + if self.ability() == Ability.ANTICIPATION and otherpoke is not None: + for move in otherpoke.moves: + if move.effect == 39: + msg += f"{self.name} shuddered in anticipation!\n" + break + if self.effectiveness(move.type, battle) > 1: + msg += f"{self.name} shuddered in anticipation!\n" + break + if self.ability() == Ability.FOREWARN and otherpoke is not None: + bestmoves = [] + bestpower = 0 + for move in otherpoke.moves: + if move.damage_class == DamageClass.STATUS: + power = 0 + if move.effect == 39: + power = 150 + elif move.power is None: # Good enough + power = 80 + else: + power = move.power + if power > bestpower: + bestpower = power + bestmoves = [move] + elif power == bestpower: + bestmoves.append(move) + if bestmoves: + move = random.choice(bestmoves) + msg += f"{self.name} is forewarned about {otherpoke.name}'s {move.pretty_name}!\n" + if self.ability() == Ability.FRISK and otherpoke is not None and otherpoke.held_item.has_item(): + msg += f"{self.name} senses that {otherpoke.name} is holding a {otherpoke.held_item.name} using its frisk!\n" + if self.ability() == Ability.MULTITYPE: + e = None + if self.held_item == "draco-plate": + e = ElementType.DRAGON + f = "Arceus-dragon" + elif self.held_item == "dread-plate": + e = ElementType.DARK + f = "Arceus-dark" + elif self.held_item == "earth-plate": + e = ElementType.GROUND + f = "Arceus-ground" + elif self.held_item == "fist-plate": + e = ElementType.FIGHTING + f = "Arceus-fighting" + elif self.held_item == "flame-plate": + e = ElementType.FIRE + f = "Arceus-fire" + elif self.held_item == "icicle-plate": + e = ElementType.ICE + f = "Arceus-ice" + elif self.held_item == "insect-plate": + e = ElementType.BUG + f = "Arceus-bug" + elif self.held_item == "iron-plate": + e = ElementType.STEEL + f = "Arceus-steel" + elif self.held_item == "meadow-plate": + e = ElementType.GRASS + f = "Arceus-grass" + elif self.held_item == "mind-plate": + e = ElementType.PSYCHIC + f = "Arceus-psychic" + elif self.held_item == "pixie-plate": + e = ElementType.FAIRY + f = "Arceus-fairy" + elif self.held_item == "sky-plate": + e = ElementType.FLYING + f = "Arceus-flying" + elif self.held_item == "splash-plate": + e = ElementType.WATER + f = "Arceus-water" + elif self.held_item == "spooky-plate": + e = ElementType.GHOST + f = "Arceus-ghost" + elif self.held_item == "stone-plate": + e = ElementType.ROCK + f = "Arceus-rock" + elif self.held_item == "toxic-plate": + e = ElementType.POISON + f = "Arceus-poison" + elif self.held_item == "zap-plate": + e = ElementType.ELECTRIC + f = "Arceus-electric" + if e is not None and self.form(f): + self.type_ids = [e] + t = ElementType(e).name.lower() + msg += f"{self.name} transformed into a {t} type using its multitype!\n" + if self.ability() == Ability.RKS_SYSTEM and self._name == "Silvally": + e = None + if self.held_item == "dragon-memory": + if self.form("Silvally-dragon"): + e = ElementType.DRAGON + elif self.held_item == "dark-memory": + if self.form("Silvally-dark"): + e = ElementType.DARK + elif self.held_item == "ground-memory": + if self.form("Silvally-ground"): + e = ElementType.GROUND + elif self.held_item == "fighting-memory": + if self.form("Silvally-fighting"): + e = ElementType.FIGHTING + elif self.held_item == "fire-memory": + if self.form("Silvally-fire"): + e = ElementType.FIRE + elif self.held_item == "ice-memory": + if self.form("Silvally-ice"): + e = ElementType.ICE + elif self.held_item == "bug-memory": + if self.form("Silvally-bug"): + e = ElementType.BUG + elif self.held_item == "steel-memory": + if self.form("Silvally-steel"): + e = ElementType.STEEL + elif self.held_item == "grass-memory": + if self.form("Silvally-grass"): + e = ElementType.GRASS + elif self.held_item == "psychic-memory": + if self.form("Silvally-psychic"): + e = ElementType.PSYCHIC + elif self.held_item == "fairy-memory": + if self.form("Silvally-fairy"): + e = ElementType.FAIRY + elif self.held_item == "flying-memory": + if self.form("Silvally-flying"): + e = ElementType.FLYING + elif self.held_item == "water-memory": + if self.form("Silvally-water"): + e = ElementType.WATER + elif self.held_item == "ghost-memory": + if self.form("Silvally-ghost"): + e = ElementType.GHOST + elif self.held_item == "rock-memory": + if self.form("Silvally-rock"): + e = ElementType.ROCK + elif self.held_item == "poison-memory": + if self.form("Silvally-poison"): + e = ElementType.POISON + elif self.held_item == "electric-memory": + if self.form("Silvally-electric"): + e = ElementType.ELECTRIC + if e is not None: + self.type_ids = [e] + t = ElementType(e).name.lower() + msg += f"{self.name} transformed into a {t} type using its rks system!\n" + if self.ability() == Ability.TRUANT: + self.truant_turn = 0 + if self.ability() == Ability.FORECAST and self._name in ("Castform", "Castform-snowy", "Castform-rainy", "Castform-sunny"): + weather = battle.weather.get() + element = None + if weather == "hail" and self._name != "Castform-snowy": + if self.form("Castform-snowy"): + element = ElementType.ICE + elif weather in ("sandstorm", "h-wind", None) and self._name != "Castform": + if self.form("Castform"): + element = ElementType.NORMAL + elif weather in ("rain", "h-rain") and self._name != "Castform-rainy": + if self.form("Castform-rainy"): + element = ElementType.WATER + elif weather in ("sun", "h-sun") and self._name != "Castform-sunny": + if self.form("Castform-sunny"): + element = ElementType.FIRE + if element is not None: + self.type_ids = [element] + t = ElementType(element).name.lower() + msg += f"{self.name} transformed into a {t} type using its forecast!\n" + if self.ability() == Ability.MIMICRY and battle.terrain.item: + terrain = battle.terrain.item + if terrain == "electric": + element = ElementType.ELECTRIC + elif terrain == "grassy": + element = ElementType.GRASS + elif terrain == "misty": + element = ElementType.FAIRY + elif terrain == "psychic": + element = ElementType.PSYCHIC + self.type_ids = [element] + t = ElementType(element).name.lower() + msg += f"{self.name} transformed into a {t} type using its mimicry!\n" + if self.ability() == Ability.WIND_RIDER and self.owner.tailwind.active(): + msg += self.append_attack(1, attacker=self, source="its wind rider") + if self.ability() == Ability.SUPERSWEET_SYRUP and not self.supersweet_syrup and otherpoke is not None: + msg += otherpoke.append_evasion(-1, attacker=self, source=f"{self.name}'s supersweet syrup") + + return msg + + def remove(self, battle, *, fainted=False): + """ + Clean up a poke when it is removed from battle. + + Returns a formatted message of anything that happened while switching out. + """ + msg = "" + if not fainted: + if self.ability() == Ability.NATURAL_CURE and self.nv.current: + msg += f"{self.name}'s {self.nv.current} was cured by its natural cure!\n" + self.nv.reset() + if self.ability() == Ability.REGENERATOR: + msg += self.heal(self.starting_hp // 3, source="its regenerator") + if self.ability() == Ability.ZERO_TO_HERO: + if self.form("Palafin-hero"): + msg += f"{self.name} is ready to be a hero!\n" + self.nv.badly_poisoned_turn = 0 + self.minimized = False + self.has_moved = False + self.choice_move = None + self.last_move = None + self.should_mega_evolve = False + self.swapped_in = False + self.active_turns = 0 + if self.illusion__name is not None: + self._name = self.illusion__name + self.name = self.illusion_name + self.illusion__name = None + self.illusion_name = None + if self._starting_name in ("Ditto", "Smeargle", "Mew", "Aegislash"): + self._name = self._starting_name + if self._nickname != "None": + self.name = f"{self._nickname} ({self._name.replace('-', ' ')})" + else: + self.name = self._name.replace("-", " ") + if self.owner.current_pokemon is self: + self.owner.current_pokemon = None + if battle.weather.recheck_ability_weather(): + msg += "The weather cleared!\n" + self.attack = self.base_stats[self._name][1] + self.defense = self.base_stats[self._name][2] + self.spatk = self.base_stats[self._name][3] + self.spdef = self.base_stats[self._name][4] + self.speed = self.base_stats[self._name][5] + self.hpiv = self.starting_hpiv + self.atkiv = self.starting_atkiv + self.defiv = self.starting_defiv + self.spatkiv = self.starting_spatkiv + self.spdefiv = self.starting_spdefiv + self.speediv = self.starting_speediv + self.hpev = self.starting_hpev + self.atkev = self.starting_atkev + self.defev = self.starting_defev + self.spatkev = self.starting_spatkev + self.spdefev = self.starting_spdefev + self.speedev = self.starting_speedev + self.moves = self.starting_moves.copy() + self.ability_id = self.starting_ability_id + self.type_ids = self.starting_type_ids.copy() + self.attack_stage = 0 + self.defense_stage = 0 + self.spatk_stage = 0 + self.spdef_stage = 0 + self.speed_stage = 0 + self.accuracy_stage = 0 + self.evasion_stage = 0 + self.metronome = Metronome() + self.leech_seed = False + self.stockpile = 0 + self.flinched = False + self.confusion = ExpiringEffect(0) + self.last_move_damage = None + self.locked_move = None + self.bide = None + self.torment = False + self.imprison = False + self.disable = ExpiringItem() + self.taunt = ExpiringEffect(0) + self.encore = ExpiringItem() + self.heal_block = ExpiringEffect(0) + self.focus_energy = False + self.perish_song = ExpiringEffect(0) + self.nightmare = False + self.defense_curl = False + self.fury_cutter = 0 + self.bind = ExpiringEffect(0) + self.substitute = 0 + self.silenced = ExpiringEffect(0) + self.last_move_failed = False + self.rage = False + self.mind_reader = ExpiringItem() + self.destiny_bond = False + self.destiny_bond_cooldown = ExpiringEffect(0) + self.trapping = False + self.ingrain = False + self.infatuated = None + self.aqua_ring = False + self.magnet_rise = ExpiringEffect(0) + self.dive = False + self.dig = False + self.fly = False + self.shadow_force = False + self.lucky_chant = ExpiringEffect(0) + self.grounded_by_move = False + self.charge = ExpiringEffect(0) + self.uproar = ExpiringEffect(0) + self.magic_coat = False + self.power_trick = False + self.power_shift = False + self.yawn = ExpiringEffect(0) + self.ion_deluge = False + self.electrify = False + self.protection_used = False + self.protection_chance = 1 + self.protect = False + self.endure = False + self.wide_guard = False + self.crafty_shield = False + self.king_shield = False + self.spiky_shield = False + self.mat_block = False + self.baneful_bunker = False + self.quick_guard = False + self.obstruct = False + self.silk_trap = False + self.burning_bulwark = False + self.laser_focus = ExpiringEffect(0) + self.powdered = False + self.snatching = False + self.telekinesis = ExpiringEffect(0) + self.embargo = ExpiringEffect(0) + self.echoed_voice_power = 40 + self.echoed_voice_used = False + self.curse = False + self.fairy_lock = ExpiringEffect(0) + self.grudge = False + self.foresight = False + self.miracle_eye = False + self.beak_blast = False + self.no_retreat = False + self.dmg_this_turn = False + self.autotomize = 0 + self.lansat_berry_ate = False + self.micle_berry_ate = False + self.flash_fire = False + self.truant_turn = 0 + self.cud_chew = ExpiringEffect(0) + self.booster_energy = False + self.stat_increased = False + self.stat_decreased = False + self.roost = False + self.octolock = False + self.attack_split = None + self.spatk_split = None + self.defense_split = None + self.spdef_split = None + self.tar_shot = False + self.syrup_bomb = ExpiringEffect(0) + self.held_item.ever_had_item = self.held_item.item is not None + + return msg + + def next_turn(self, otherpoke, battle): + """ + Updates this pokemon for a new turn. + + `otherpoke` may be None if the opponent fainted the previous turn. + Returns a formatted message. + """ + msg = "" + # This needs to be here, as swapping sets this value explicitly + self.has_moved = False + if not self.swapped_in: + self.active_turns += 1 + self.last_move_damage = None + self.last_move_failed = False + self.should_mega_evolve = False + self.rage = False + self.mind_reader.next_turn() + self.charge.next_turn() + self.destiny_bond_cooldown.next_turn() + self.magic_coat = False + self.ion_deluge = False + self.electrify = False + if not self.protection_used: + self.protection_chance = 1 + self.protection_used = False + self.protect = False + self.endure = False + self.wide_guard = False + self.crafty_shield = False + self.king_shield = False + self.spiky_shield = False + self.mat_block = False + self.baneful_bunker = False + self.quick_guard = False + self.obstruct = False + self.silk_trap = False + self.burning_bulwark = False + self.laser_focus.next_turn() + self.powdered = False + self.snatching = False + if not self.echoed_voice_used: + self.echoed_voice_power = 40 + self.grudge = False + self.beak_blast = False + self.dmg_this_turn = False + if self.locked_move: + if self.locked_move.next_turn(): + self.locked_move = None + # Just in case they never actually used the move to remove it + self.dive = False + self.dig = False + self.fly = False + self.shadow_force = False + self.fairy_lock.next_turn() + self.flinched = False + self.truant_turn += 1 + self.stat_increased = False + self.stat_decreased = False + self.roost = False + self.syrup_bomb.next_turn() + + msg += self.nv.next_turn(battle) + + # Volatile status turn progression + prev_disab_move = self.disable.item + if self.disable.next_turn(): + msg += f"{self.name}'s {prev_disab_move.pretty_name} is no longer disabled!\n" + if self.taunt.next_turn(): + msg += f"{self.name}'s taunt has ended!\n" + if self.heal_block.next_turn(): + msg += f"{self.name}'s heal block has ended!\n" + if self.silenced.next_turn(): + msg += f"{self.name}'s voice returned!\n" + if self.magnet_rise.next_turn(): + msg += f"{self.name}'s magnet rise has ended!\n" + if self.lucky_chant.next_turn(): + msg += f"{self.name} is no longer shielded by lucky chant!\n" + if self.uproar.next_turn(): + msg += f"{self.name} calms down!\n" + if self.telekinesis.next_turn(): + msg += f"{self.name} was released from telekinesis!\n" + if self.embargo.next_turn(): + msg += f"{self.name}'s embargo was lifted!\n" + if self.yawn.next_turn(): + msg += self.nv.apply_status("sleep", battle, attacker=self, source="drowsiness") + if self.encore.next_turn(): + msg += f"{self.name}'s encore is over!\n" + if self.perish_song.next_turn(): + msg += self.faint(battle, source="perish song") + if self.encore.active() and self.encore.item.pp == 0: + self.encore.end() + msg += f"{self.name}'s encore is over!\n" + if self.cud_chew.next_turn() and self.held_item.last_used is not None and self.held_item.last_used.name.endswith("-berry"): + self.held_item.recover(self.held_item) + msg += self.held_item.eat_berry() + self.held_item.last_used = None + + # Held Items + if self.held_item == "white-herb": + changed = False + if self.attack_stage < 0: + self.attack_stage = 0 + changed = True + if self.defense_stage < 0: + self.defense_stage = 0 + changed = True + if self.spatk_stage < 0: + self.spatk_stage = 0 + changed = True + if self.spdef_stage < 0: + self.spdef_stage = 0 + changed = True + if self.speed_stage < 0: + self.speed_stage = 0 + changed = True + if self.accuracy_stage < 0: + self.accuracy_stage = 0 + changed = True + if self.evasion_stage < 0: + self.evasion_stage = 0 + changed = True + if changed: + msg += f"{self.name}'s white herb reset all negative stat stage changes.\n" + self.held_item.use() + if self.held_item == "toxic-orb": + msg += self.nv.apply_status("b-poison", battle, attacker=self, source="its toxic orb") + if self.held_item == "flame-orb": + msg += self.nv.apply_status("burn", battle, attacker=self, source="its flame orb") + if self.held_item == "leftovers": + msg += self.heal(self.starting_hp // 16, source="its leftovers") + if self.held_item == "black-sludge": + if ElementType.POISON in self.type_ids: + msg += self.heal(self.starting_hp // 16, source="its black sludge") + else: + msg += self.damage(self.starting_hp // 8, battle, source="its black sludge") + + # Abilities + if self.ability() == Ability.SPEED_BOOST and not self.swapped_in: + msg += self.append_speed(1, attacker=self, source="its Speed boost") + if self.ability() == Ability.LIMBER and self.nv.paralysis(): + self.nv.reset() + msg += f"{self.name}'s limber cured it of its paralysis!\n" + if self.ability() == Ability.INSOMNIA and self.nv.sleep(): + self.nv.reset() + msg += f"{self.name}'s insomnia woke it up!\n" + if self.ability() == Ability.VITAL_SPIRIT and self.nv.sleep(): + self.nv.reset() + msg += f"{self.name}'s vital spirit woke it up!\n" + if self.ability() == Ability.IMMUNITY and self.nv.poison(): + self.nv.reset() + msg += f"{self.name}'s immunity cured it of its poison!\n" + if self.ability() == Ability.MAGMA_ARMOR and self.nv.freeze(): + self.nv.reset() + msg += f"{self.name}'s magma armor cured it of thawed it!\n" + if self.ability() in (Ability.WATER_VEIL, Ability.WATER_BUBBLE) and self.nv.burn(): + self.nv.reset() + ability_name = Ability(self.ability_id).pretty_name + msg += f"{self.name}'s {ability_name} cured it of its burn!\n" + if self.ability() == Ability.OWN_TEMPO and self.confusion.active(): + self.confusion.set_turns(0) + msg += f"{self.name}'s tempo cured it of its confusion!\n" + if self.ability() == Ability.OBLIVIOUS: + if self.infatuated: + self.infatuated = None + msg += f"{self.name} fell out of love because of its obliviousness!\n" + if self.taunt.active(): + self.taunt.set_turns(0) + msg += f"{self.name} stopped caring about being taunted because of its obliviousness!\n" + if self.ability() == Ability.RAIN_DISH and battle.weather.get() in ("rain", "h-rain"): + msg += self.heal(self.starting_hp // 16, source="its rain dish") + if self.ability() == Ability.ICE_BODY and battle.weather.get() == "hail": + msg += self.heal(self.starting_hp // 16, source="its ice body") + if self.ability() == Ability.DRY_SKIN: + if battle.weather.get() in ("rain", "h-rain"): + msg += self.heal(self.starting_hp // 8, source="its dry skin") + elif battle.weather.get() in ("sun", "h-sun"): + msg += self.damage(self.starting_hp // 8, battle, source="its dry skin") + if self.ability() == Ability.SOLAR_POWER and battle.weather.get() in ("sun", "h-sun"): + msg += self.damage(self.starting_hp // 8, battle, source="its solar power") + if self.ability() == Ability.MOODY: + stats = [ + (self.attack_stage, "attack"), + (self.defense_stage, "defense"), + (self.spatk_stage, "special attack"), + (self.spdef_stage, "special defense"), + (self.speed_stage, "speed") + ] + add_stats = stats.copy() + remove_stats = stats.copy() + for stat in stats: + if stat[0] == 6: + add_stats.remove(stat) + add_stat = None + if add_stats: + add_stat = random.choice(add_stats) + msg += self.append_stat(2, self, None, add_stat[1], "its moodiness") + for stat in stats: + if stat == add_stat: + remove_stats.remove(stat) + if stat[0] == -6: + remove_stats.remove(stat) + if remove_stats: + remove_stat = random.choice(remove_stats) + msg += self.append_stat(-1, self, None, remove_stat[1], "its moodiness") + if ( + self.ability() == Ability.PICKUP + and not self.held_item.has_item() + and otherpoke is not None + and otherpoke.held_item.last_used is not None + ): + self.held_item.recover(otherpoke.held_item) + msg += f"{self.name} picked up a {self.held_item.name}!\n" + if self.ability() == Ability.ICE_FACE and not self.ice_repaired and self._name == "Eiscue-noice" and battle.weather.get() == "hail": + if self.form("Eiscue"): + self.ice_repaired = True + msg += f"{self.name}'s ice face was restored by the hail!\n" + if self.ability() == Ability.HARVEST and self.last_berry is not None and not self.held_item.has_item(): + if random.randint(0, 1): + self.held_item.item = self.last_berry + self.last_berry = None + msg += f"{self.name} harvested a {self.held_item.name}!\n" + if self.ability() == Ability.ZEN_MODE and self._name == "Darmanitan" and self.hp < self.starting_hp / 2: + if self.form("Darmanitan-zen"): + if ElementType.PSYCHIC not in self.type_ids: + self.type_ids.append(ElementType.PSYCHIC) + msg += f"{self.name} enters a zen state.\n" + if self.ability() == Ability.ZEN_MODE and self._name == "Darmanitan-galar" and self.hp < self.starting_hp / 2: + if self.form("Darmanitan-zen-galar"): + if ElementType.FIRE not in self.type_ids: + self.type_ids.append(ElementType.FIRE) + msg += f"{self.name} enters a zen state.\n" + if self.ability() == Ability.ZEN_MODE and self._name == "Darmanitan-zen" and self.hp >= self.starting_hp / 2: + if self.form("Darmanitan"): + if ElementType.PSYCHIC in self.type_ids: + self.type_ids.remove(ElementType.PSYCHIC) + msg += f"{self.name}'s zen state ends!\n" + if self.ability() == Ability.ZEN_MODE and self._name == "Darmanitan-zen-galar" and self.hp >= self.starting_hp / 2: + if self.form("Darmanitan-galar"): + if ElementType.FIRE in self.type_ids: + self.type_ids.remove(ElementType.FIRE) + msg += f"{self.name}'s zen state ends!\n" + if self.ability() == Ability.SHIELDS_DOWN and self._name == "Minior" and self.hp < self.starting_hp / 2: + if self.id % 7 == 0: + new_form = "Minior-red" + elif self.id % 7 == 1: + new_form = "Minior-orange" + elif self.id % 7 == 2: + new_form = "Minior-yellow" + elif self.id % 7 == 3: + new_form = "Minior-green" + elif self.id % 7 == 4: + new_form = "Minior-blue" + elif self.id % 7 == 5: + new_form = "Minior-indigo" + else: + new_form = "Minior-violet" + if self.form(new_form): + msg += f"{self.name}'s core was exposed!\n" + if ( + self.ability() == Ability.SHIELDS_DOWN + and self._name in ("Minior-red", "Minior-orange", "Minior-yellow", "Minior-green", "Minior-blue", "Minior-indigo", "Minior-violet") + and self.hp >= self.starting_hp / 2 + ): + if self.form("Minior"): + msg += f"{self.name}'s shell returned!\n" + if self.ability() == Ability.SCHOOLING and self._name == "Wishiwashi-school" and self.hp < self.starting_hp / 4: + if self.form("Wishiwashi"): + msg += f"{self.name}'s school is gone!\n" + if self.ability() == Ability.SCHOOLING and self._name == "Wishiwashi" and self.hp >= self.starting_hp / 4 and self.level >= 20: + if self.form("Wishiwashi-school"): + msg += f"{self.name} schools together!\n" + if self.ability() == Ability.POWER_CONSTRUCT and self._name in ("Zygarde", "Zygarde-10") and self.hp < self.starting_hp / 2 and self.hp > 0: + if self.form("Zygarde-complete"): + msg += f"{self.name} is at full power!\n" + # Janky way to raise the current HP of this poke, as it's new form has a higher HP stat. Note, this is NOT healing. + new_hp = round((((2 * self.base_stats["Zygarde-complete"][0] + self.hpiv + (self.hpev / 4)) * self.level) / 100) + self.level + 10) + self.hp = new_hp - (self.starting_hp - self.hp) + self.starting_hp = new_hp + if self.ability() == Ability.HUNGER_SWITCH: + if self._name == "Morpeko": + self.form("Morpeko-hangry") + elif self._name == "Morpeko-hangry": + self.form("Morpeko") + if self.ability() == Ability.FLOWER_GIFT and self._name == "Cherrim" and battle.weather.get() in ("sun", "h-sun"): + self.form("Cherrim-sunshine") + if self.ability() == Ability.FLOWER_GIFT and self._name == "Cherrim-sunshine" and battle.weather.get() not in ("sun", "h-sun"): + self.form("Cherrim") + + #Bad Dreams + if otherpoke is not None and otherpoke.ability() == Ability.BAD_DREAMS and self.nv.sleep(): + msg += self.damage(self.starting_hp // 8, battle, source=f"{otherpoke.name}'s bad dreams") + #Leech seed + if self.leech_seed and otherpoke is not None: + damage = self.starting_hp // 8 + msg += self.damage(damage, battle, attacker=otherpoke, drain_heal_ratio=1, source="leech seed") + #Curse + if self.curse: + msg += self.damage(self.starting_hp // 4, battle, source="its curse") + #Syrup bomb + if self.syrup_bomb.active() and otherpoke is not None: + msg += self.append_speed(-1, attacker=otherpoke, source="its syrup coating") + + #Weather damages + if self.ability() == Ability.OVERCOAT: + pass + elif self.held_item == "safety-goggles": + pass + elif battle.weather.get() == "sandstorm": + if ( + ElementType.ROCK not in self.type_ids + and ElementType.GROUND not in self.type_ids + and ElementType.STEEL not in self.type_ids + and self.ability() not in (Ability.SAND_RUSH, Ability.SAND_VEIL, Ability.SAND_FORCE) + ): + msg += self.damage(self.starting_hp // 16, battle, source="the sandstorm") + elif battle.weather.get() == "hail": + if ( + ElementType.ICE not in self.type_ids + and self.ability() not in (Ability.SNOW_CLOAK, Ability.ICE_BODY) + ): + msg += self.damage(self.starting_hp // 16, battle, source="the hail") + + #Bind + if self.bind.next_turn(): + msg += f"{self.name} is no longer bound!\n" + elif self.bind.active() and otherpoke is not None: + if otherpoke.held_item == "binding-band": + msg += self.damage(self.starting_hp // 6, battle, source=f"{otherpoke.name}'s bind") + else: + msg += self.damage(self.starting_hp // 8, battle, source=f"{otherpoke.name}'s bind") + #Ingrain + if self.ingrain: + heal = self.starting_hp // 16 + if self.held_item == "big_root": + heal = int(heal * 1.3) + msg += self.heal(heal, source="ingrain") + #Aqua Ring + if self.aqua_ring: + heal = self.starting_hp // 16 + if self.held_item == "big_root": + heal = int(heal * 1.3) + msg += self.heal(heal, source="aqua ring") + #Octolock + if self.octolock and otherpoke is not None: + msg += self.append_defense(-1, attacker=self, source=f"{otherpoke.name}'s octolock") + msg += self.append_spdef(-1, attacker=self, source=f"{otherpoke.name}'s octolock") + #Grassy Terrain + if battle.terrain.item == "grassy" and self.grounded(battle) and not self.heal_block.active(): + msg += self.heal(self.starting_hp // 16, source="grassy terrain") + + #Goes at the end so everything in this func that checks it handles it correctly + self.swapped_in = False + + return msg + + def faint(self, battle, *, move=None, attacker=None, source: str=""): + """ + Sets a pokemon's HP to zero and cleans it up. + + If a pokemon takes damage equal to its HP, use damage instead. + This method ignores focus sash and sturdy, forcing the pokemon to faint. + Returns a formatted message. + """ + msg = "" + self.hp = 0 + if source: + source = f" from {source}" + msg += f"{self.name} fainted{source}!\n" + if move is not None and attacker is not None and self.destiny_bond and self.owner.has_alive_pokemon(): + msg += attacker.faint(battle, source=f"{self.name}'s destiny bond") + if move is not None and attacker is not None and attacker._name == "Greninja" and attacker.ability() == Ability.BATTLE_BOND: + if attacker.form("Greninja-ash"): + msg += f"{attacker.name}'s bond with its trainer has strengthened it!\n" + if move is not None and self.grudge: + move.pp = 0 + msg += f"{move.pretty_name}'s pp was depleted!\n" + if attacker is not None and attacker.ability() in (Ability.CHILLING_NEIGH, Ability.AS_ONE_ICE): + msg += attacker.append_attack(1, attacker=attacker, source="its chilling neigh") + if attacker is not None and attacker.ability() in (Ability.GRIM_NEIGH, Ability.AS_ONE_SHADOW): + msg += attacker.append_spatk(1, attacker=attacker, source="its grim neigh") + for poke in (battle.trainer1.current_pokemon, battle.trainer2.current_pokemon): + if poke is not None and poke is not self and poke.ability() == Ability.SOUL_HEART: + msg += poke.append_spatk( + 1, + attacker=poke, + source="its soul heart" + ) + self.owner.retaliate.set_turns(2) + self.owner.num_fainted += 1 + msg += self.remove(battle, fainted=True) + return msg + + def damage(self, damage, battle, *, move=None, move_type=None, attacker=None, critical=False, drain_heal_ratio=None, source: str=""): + """ + Applies a certain amount of damage to this pokemon. + + Returns a formatted message. + """ + msgadd, _ = self._damage(damage, battle, move=move, move_type=move_type, attacker=attacker, critical=critical, drain_heal_ratio=drain_heal_ratio, source=source) + return msgadd + + def _damage(self, damage, battle, *, move=None, move_type=None, attacker=None, critical=False, drain_heal_ratio=None, source: str=""): + """ + Applies a certain amount of damage to this pokemon. + + Returns a formatted message and the amount of damage actually dealt. + """ + msg = "" + # Don't go through with an attack if the poke is already dead. + # If this is a bad idea for *some* reason, make sure to add an `attacker is self` check to INNARDS_OUT. + if self.hp <= 0: + return "", 0 + previous_hp = self.hp + damage = max(1, damage) + + # Magic guard + if self.ability(attacker=attacker, move=move) == Ability.MAGIC_GUARD and move is None and attacker is not self: + return f"{self.name}'s magic guard protected it from damage!\n", 0 + + # Substitute + if ( + self.substitute + and move is not None and move.is_affected_by_substitute() and not move.is_sound_based() + and (attacker is None or attacker.ability() != Ability.INFILTRATOR) + ): + # is_affected_by_substitute should be a superset of is_sound_based, but it's better to check both to be sure. + msg += f"{self.name}'s substitute took {damage} damage{source}!\n" + new_hp = max(0, self.substitute - damage) + true_damage = self.substitute - new_hp + self.substitute = new_hp + if self.substitute == 0: + msg += f"{self.name}'s substitute broke!\n" + return msg, true_damage + + # Damage blocking forms / abilities + if move is not None: + if self.ability(attacker=attacker, move=move) == Ability.DISGUISE and self._name == "Mimikyu": + if self.form("Mimikyu-busted"): + msg += f"{self.name}'s disguise was busted!\n" + msg += self.damage(self.starting_hp // 8, battle, source="losing its disguise") + return msg, 0 + if self.ability(attacker=attacker, move=move) == Ability.ICE_FACE and self._name == "Eiscue" and move.damage_class == DamageClass.PHYSICAL: + if self.form("Eiscue-noice"): + msg += f"{self.name}'s ice face was busted!\n" + return msg, 0 + + # OHKO protection + self.dmg_this_turn = True + if damage >= self.hp and move is not None: + if self.endure: + msg += f"{self.name} endured the hit!\n" + damage = self.hp - 1 + elif self.hp == self.starting_hp and self.ability(attacker=attacker, move=move) == Ability.STURDY: + msg += f"{self.name} endured the hit with its Sturdy!\n" + damage = self.hp - 1 + elif self.hp == self.starting_hp and self.held_item == "focus-sash": + msg += f"{self.name} held on using its focus sash!\n" + damage = self.hp - 1 + self.held_item.use() + elif self.held_item == "focus-band" and not random.randrange(10): + msg += f"{self.name} held on using its focus band!\n" + damage = self.hp - 1 + + # Apply the damage + dropped_below_half = self.hp > self.starting_hp / 2 + dropped_below_quarter = self.hp > self.starting_hp / 4 + + new_hp = max(0, self.hp - damage) + true_damage = self.hp - new_hp + self.hp = new_hp + + dropped_below_half = dropped_below_half and self.hp <= self.starting_hp / 2 + dropped_below_quarter = dropped_below_quarter and self.hp <= self.starting_hp / 4 + if source: + source = f" from {source}" + msg += f"{self.name} took {damage} damage{source}!\n" + self.num_hits += 1 + + # Drain + if drain_heal_ratio is not None and attacker is not None: + heal = true_damage * drain_heal_ratio + if attacker.held_item == "big-root": + heal = heal * 1.3 + heal = int(heal) + if self.ability() == Ability.LIQUID_OOZE: + msg += attacker.damage(heal, battle, source=f"{self.name}'s liquid ooze") + else: + if not attacker.heal_block.active(): + msg += attacker.heal(heal, source=source) + + if self.hp == 0: + msg += self.faint(battle, move=move, attacker=attacker) + if ( + self.ability() == Ability.AFTERMATH + and attacker is not None + and attacker is not self + and attacker.ability() != Ability.DAMP + and move is not None + and move.makes_contact(attacker) + ): + msg += attacker.damage(attacker.starting_hp // 4, battle, source=f"{self.name}'s aftermath") + if attacker is not None and attacker.ability() == Ability.MOXIE: + msg += attacker.append_attack(1, attacker=attacker, source="its moxie") + if attacker is not None and attacker.ability() == Ability.BEAST_BOOST: + stats = ( + (attacker.get_raw_attack(), attacker.append_attack), + (attacker.get_raw_defense(), attacker.append_defense), + (attacker.get_raw_spatk(), attacker.append_spatk), + (attacker.get_raw_spdef(), attacker.append_spdef), + (attacker.get_raw_speed(), attacker.append_speed), + ) + append_func = sorted(stats, reverse=True, key=lambda s: s[0])[0][1] + msg += append_func(1, attacker=attacker, source="its beast boost") + if attacker is not None and self.ability() == Ability.INNARDS_OUT: + msg += attacker.damage(previous_hp, battle, attacker=self, source=f"{self.name}'s innards out") + elif move is not None and move_type is not None: + if move_type == ElementType.FIRE and self.nv.freeze(): + self.nv.reset() + msg += f"{self.name} thawed out!\n" + if move.effect in (458, 500) and self.nv.freeze(): + self.nv.reset() + msg += f"{self.name} thawed out!\n" + if self.ability() == Ability.COLOR_CHANGE and move_type not in self.type_ids: + self.type_ids = [move_type] + t = ElementType(move_type).name.lower() + msg += f"{self.name} changed its color, transforming into a {t} type!\n" + if self.ability() == Ability.ANGER_POINT and critical: + msg += self.append_attack(6, attacker=self, source="its anger point") + if self.ability() == Ability.WEAK_ARMOR and move.damage_class == DamageClass.PHYSICAL and attacker is not self: + msg += self.append_defense(-1, attacker=self, source="its weak armor") + msg += self.append_speed(2, attacker=self, source="its weak armor") + if self.ability() == Ability.JUSTIFIED and move_type == ElementType.DARK: + msg += self.append_attack(1, attacker=self, source="justified") + if self.ability() == Ability.RATTLED and move_type in (ElementType.BUG, ElementType.DARK, ElementType.GHOST): + msg += self.append_speed(1, attacker=self, source="its rattled") + if self.ability() == Ability.STAMINA: + msg += self.append_defense(1, attacker=self, source="its stamina") + if self.ability() == Ability.WATER_COMPACTION and move_type == ElementType.WATER: + msg += self.append_defense(2, attacker=self, source="its water compaction") + if self.ability() == Ability.BERSERK and dropped_below_half: + msg += self.append_spatk(1, attacker=self, source="its berserk") + if self.ability() == Ability.ANGER_SHELL and dropped_below_half: + msg += self.append_attack(1, attacker=self, source="its anger shell") + msg += self.append_spatk(1, attacker=self, source="its anger shell") + msg += self.append_speed(1, attacker=self, source="its anger shell") + msg += self.append_defense(-1, attacker=self, source="its anger shell") + msg += self.append_spdef(-1, attacker=self, source="its anger shell") + if self.ability() == Ability.STEAM_ENGINE and move_type in (ElementType.FIRE, ElementType.WATER): + msg += self.append_speed(6, attacker=self, source="its steam engine") + if self.ability() == Ability.THERMAL_EXCHANGE and move_type == ElementType.FIRE: + msg += self.append_attack(1, attacker=self, source="its thermal exchange") + if self.ability() == Ability.WIND_RIDER and move.is_wind(): + msg += self.append_attack(1, attacker=self, source="its wind rider") + if self.ability() == Ability.COTTON_DOWN and attacker is not None: + msg += attacker.append_speed(-1, attacker=self, source=f"{self.name}'s cotton down") + if self.ability() == Ability.SAND_SPIT: + msg += battle.weather.set("sandstorm", self) + if self.ability() == Ability.SEED_SOWER and battle.terrain.item is None: + msg += battle.terrain.set("grassy", self) + if self.ability() == Ability.ELECTROMORPHOSIS: + self.charge.set_turns(2) + msg += f"{self.name} became charged by its electromorphosis!\n" + if self.ability() == Ability.WIND_POWER and move.is_wind(): + self.charge.set_turns(2) + msg += f"{self.name} became charged by its wind power!\n" + if self.ability() == Ability.TOXIC_DEBRIS and move.damage_class == DamageClass.PHYSICAL: + if attacker is not None and attacker is not self and attacker.owner.toxic_spikes < 2: + attacker.owner.toxic_spikes += 1 + msg += f"Toxic spikes were scattered around the feet of {attacker.owner.name}'s team because of {self.name}'s toxic debris!\n" + if self.illusion_name is not None: + self._name = self.illusion__name + self.name = self.illusion_name + self.illusion__name = None + self.illusion_name = None + msg += f"{self.name}'s illusion broke!\n" + if self.held_item == "air-balloon": + self.held_item.remove() + msg += f"{self.name}'s air balloon popped!\n" + + if move is not None: + self.last_move_damage = (max(1, damage), move.damage_class) + if self.bide is not None: + self.bide += damage + if self.rage: + msg += self.append_attack(1, attacker=self, source="its rage") + if attacker is not None: + if ( + self.ability() == Ability.CURSED_BODY + and not attacker.disable.active() + and move in attacker.moves + and random.randint(1, 100) <= 30 + ): + if attacker.ability() == Ability.AROMA_VEIL: + msg += f"{attacker.name}'s aroma veil protects its move from being disabled!\n" + else: + attacker.disable.set(move, 4) + msg += f"{attacker.name}'s {move.pretty_name} was disabled by {self.name}'s cursed body!\n" + if attacker.ability() == Ability.MAGICIAN and not attacker.held_item.has_item() and self.held_item.can_remove(): + self.held_item.transfer(attacker.held_item) + msg += f"{attacker.name} stole {attacker.held_item.name} using its magician!\n" + if attacker.ability() == Ability.TOXIC_CHAIN and random.randint(1, 100) <= 30: + msg += self.nv.apply_status("b-poison", battle, attacker=attacker, source=f"{attacker.name}'s toxic chain") + if attacker.held_item == "shell-bell": + # Shell bell does not trigger when a move is buffed by sheer force. + if attacker.ability() != Ability.SHEER_FORCE or move.effect_chance is None: + msg += attacker.heal(damage // 8, source="its shell bell") + + # Retreat + if dropped_below_half and sum(x.hp > 0 for x in self.owner.party) > 1: + if self.ability() == Ability.WIMP_OUT: + msg += f"{self.name} wimped out and retreated!\n" + msg += self.remove(battle) + elif self.ability() == Ability.EMERGENCY_EXIT: + msg += f"{self.name} used the emergency exit and retreated!\n" + msg += self.remove(battle) + + # Gulp Missile + if attacker is not None and self._name in ("Cramorant-gulping", "Cramorant-gorging") and self.owner.has_alive_pokemon(): + prey = "pikachu" if self._name == "Cramorant-gorging" else "arrokuda" + if self.form("Cramorant"): + msg += attacker.damage(attacker.starting_hp // 4, battle, source=f"{self.name} spitting out its {prey}") + if prey == "arrokuda": + msg += attacker.append_defense(-1, attacker=self, source=f"{self.name} spitting out its {prey}") + elif prey == "pikachu": + msg += attacker.nv.apply_status("paralysis", battle, attacker=self, source=f"{self.name} spitting out its {prey}") + + # Berries + if self.held_item.should_eat_berry_damage(attacker): + msg += self.held_item.eat_berry(attacker=attacker, move=move) + + # Contact + if move is not None and attacker is not None and move.makes_contact(attacker): + # Affects ATTACKER + if attacker.held_item != "protective-pads": + if self.beak_blast: + msg += attacker.nv.apply_status("burn", battle, attacker=attacker, source=f"{self.name}'s charging beak blast") + if self.ability() == Ability.STATIC: + if random.randint(1, 100) <= 30: + msg += attacker.nv.apply_status("paralysis", battle, attacker=attacker, source=f"{self.name}'s static") + if self.ability() == Ability.POISON_POINT: + if random.randint(1, 100) <= 30: + msg += attacker.nv.apply_status("poison", battle, attacker=attacker, source=f"{self.name}'s poison point") + if self.ability() == Ability.FLAME_BODY: + if random.randint(1, 100) <= 30: + msg += attacker.nv.apply_status("burn", battle, attacker=attacker, source=f"{self.name}'s flame body") + if self.ability() == Ability.ROUGH_SKIN and self.owner.has_alive_pokemon(): + msg += attacker.damage(attacker.starting_hp // 8, battle, source=f"{self.name}'s rough skin") + if self.ability() == Ability.IRON_BARBS and self.owner.has_alive_pokemon(): + msg += attacker.damage(attacker.starting_hp // 8, battle, source=f"{self.name}'s iron barbs") + if self.ability() == Ability.EFFECT_SPORE: + if ( + attacker.ability() != Ability.OVERCOAT + and ElementType.GRASS not in attacker.type_ids + and attacker.held_item != "safety-glasses" + and random.randint(1, 100) <= 30 + ): + status = random.choice(["paralysis", "poison", "sleep"]) + msg += attacker.nv.apply_status(status, battle, attacker=attacker) + if self.ability() == Ability.CUTE_CHARM and random.randint(1, 100) <= 30: + msg += attacker.infatuate(self, source=f"{self.name}'s cute charm") + if self.ability() == Ability.MUMMY and attacker.ability() != Ability.MUMMY and attacker.ability_changeable(): + attacker.ability_id = Ability.MUMMY + msg += f"{attacker.name} gained mummy from {self.name}!\n" + msg += attacker.send_out_ability(self, battle) + if self.ability() == Ability.LINGERING_AROMA and attacker.ability() != Ability.LINGERING_AROMA and attacker.ability_changeable(): + attacker.ability_id = Ability.LINGERING_AROMA + msg += f"{attacker.name} gained lingering aroma from {self.name}!\n" + msg += attacker.send_out_ability(self, battle) + if self.ability() == Ability.GOOEY: + msg += attacker.append_speed(-1, attacker=self, source=f"touching {self.name}'s gooey body") + if self.ability() == Ability.TANGLING_HAIR: + msg += attacker.append_speed(-1, attacker=self, source=f"touching {self.name}'s tangled hair") + if self.held_item == "rocky-helmet" and self.owner.has_alive_pokemon(): + msg += attacker.damage(attacker.starting_hp // 6, battle, source=f"{self.name}'s rocky helmet") + # Pickpocket is not included in the protective pads protection + if ( + self.ability() == Ability.PICKPOCKET + and not self.held_item.has_item() + and attacker.held_item.has_item() + and attacker.held_item.can_remove() + ): + if attacker.ability() == Ability.STICKY_HOLD: + msg += f"{attacker.name}'s sticky hand kept hold of its item!\n" + else: + attacker.held_item.transfer(self.held_item) + msg += f"{attacker.name}'s {self.held_item.name} was stolen!\n" + # Affects DEFENDER + if attacker.ability() == Ability.POISON_TOUCH: + if random.randint(1, 100) <= 30: + msg += self.nv.apply_status("poison", battle, attacker=attacker, move=move, source=f"{attacker.name}'s poison touch") + # Affects BOTH + if attacker.held_item != "protective-pads": + if self.ability() == Ability.PERISH_BODY and not attacker.perish_song.active(): + attacker.perish_song.set_turns(4) + self.perish_song.set_turns(4) + msg += f"All pokemon will faint after 3 turns from {self.name}'s perish body!\n" + if self.ability() == Ability.WANDERING_SPIRIT and attacker.ability_changeable() and attacker.ability_giveable(): + msg += f"{attacker.name} swapped abilities with {self.name} because of {self.name}'s wandering spirit!\n" + self.ability_id, attacker.ability_id = attacker.ability_id, self.ability_id + ability_name = Ability(self.ability_id).pretty_name + msg += f"{self.name} acquired {ability_name}!\n" + msg += self.send_out_ability(attacker, battle) + ability_name = Ability(attacker.ability_id).pretty_name + msg += f"{attacker.name} acquired {ability_name}!\n" + msg += attacker.send_out_ability(self, battle) + + return msg, true_damage + + def heal(self, health, *, source: str=""): + """ + Heals a pokemon by a certain amount. + + Handles heal-affecting items and abilities, and keeping health within bounds. + Returns a formatted message. + """ + msg = "" + health = max(1, int(health)) + #greater than is used to prevent zygarde's hp incresing form from losing its extra health + if self.hp >= self.starting_hp: + return msg + #safety to prevent errors from ""reviving"" pokes + if self.hp == 0: + return msg + if self.heal_block.active(): + return msg + health = min(self.starting_hp - self.hp, health) + self.hp += health + if source: + source = f" from {source}" + msg += f"{self.name} healed {health} hp{source}!\n" + return msg + + def confuse(self, *, attacker=None, move=None, source=""): + """ + Attempts to confuse this poke. + + Returns a formatted message. + """ + if self.substitute and (move is None or move.is_affected_by_substitute()): + return "" + if self.confusion.active(): + return "" + if self.ability(move=move, attacker=attacker) == Ability.OWN_TEMPO: + return "" + self.confusion.set_turns(random.randint(2, 5)) + if source: + source = f" from {source}" + msg = f"{self.name} is confused{source}!\n" + if self.held_item.should_eat_berry_status(attacker): + msg += self.held_item.eat_berry(attacker=attacker, move=move) + return msg + + def flinch(self, *, attacker=None, move=None, source=""): + """ + Attepts to flinch this poke. + + Returns a formatted message. + """ + msg = "" + if self.substitute and (move is None or move.is_affected_by_substitute()): + return "" + if self.ability(move=move, attacker=attacker) == Ability.INNER_FOCUS: + return f"{self.name} resisted the urge to flinch with its inner focus!\n" + self.flinched = True + if source: + source = f" from {source}" + msg += f"{self.name} flinched{source}!\n" + if self.ability() == Ability.STEADFAST: + msg += self.append_speed(1, attacker=self, source="its steadfast") + return msg + + def infatuate(self, attacker, *, move=None, source=""): + """ + Attepts to cause attacker to infatuate this poke. + + Returns a formatted message. + """ + msg = "" + if source: + source = f" from {source}" + if "-x" in (self.gender, attacker.gender): + return "" + if self.gender == attacker.gender: + return "" + if self.ability(move=move, attacker=attacker) == Ability.OBLIVIOUS: + return f"{self.name} is too oblivious to fall in love!\n" + if self.ability(move=move, attacker=attacker) == Ability.AROMA_VEIL: + return f"{self.name}'s aroma veil protects it from being infatuated!\n" + self.infatuated = attacker + msg += f"{self.name} fell in love{source}!\n" + if self.held_item == "destiny-knot": + msg += attacker.infatuate(self, source=f"{self.name}'s destiny knot") + return msg + + def calculate_raw_stat(self, base, iv, ev, nature): + """ + Helper function to calculate a raw stat using the base, IV, EV, level, and nature. + + https://bulbapedia.bulbagarden.net/wiki/Stat#Determination_of_stats "In Generation III onward" + """ + return round((((2 * base + iv + (ev / 4)) * self.level) / 100) + 5) * nature + + @staticmethod + def calculate_stat(stat, stat_stage, *, crop=False): + """Calculates a stat based on that stat's stage changes.""" + if crop == "bottom": + stat_stage = max(stat_stage, 0) + elif crop == "top": + stat_stage = min(stat_stage, 0) + stage_multiplier = { + -6: 2/8, + -5: 2/7, + -4: 2/6, + -3: 2/5, + -2: 2/4, + -1: 2/3, + 0: 1, + 1: 3/2, + 2: 2, + 3: 5/2, + 4: 3, + 5: 7/2, + 6: 4, + } + return stage_multiplier[stat_stage] * stat + + def get_raw_attack(self, *, check_power_trick=True, check_power_shift=True): + """Returns the raw attack of this poke, taking into account IVs EVs and natures and forms.""" + if self.power_trick and check_power_trick: + return self.get_raw_defense(check_power_trick=False, check_power_shift=check_power_shift) + if self.power_shift and check_power_shift: + return self.get_raw_defense(check_power_trick=check_power_trick, check_power_shift=False) + stat = self.calculate_raw_stat(self.attack, self.atkiv, self.atkev, self.nature_stat_deltas["Attack"]) + if self.attack_split is not None: + stat = (stat + self.attack_split) // 2 + return stat + + def get_raw_defense(self, *, check_power_trick=True, check_power_shift=True): + """Returns the raw attack of this poke, taking into account IVs EVs and natures and forms.""" + if self.power_trick and check_power_trick: + return self.get_raw_attack(check_power_trick=False, check_power_shift=check_power_shift) + if self.power_shift and check_power_shift: + return self.get_raw_attack(check_power_trick=check_power_trick, check_power_shift=False) + stat = self.calculate_raw_stat(self.defense, self.defiv, self.defev, self.nature_stat_deltas["Defense"]) + if self.defense_split is not None: + stat = (stat + self.defense_split) // 2 + return stat + + def get_raw_spatk(self, *, check_power_shift=True): + """Returns the raw attack of this poke, taking into account IVs EVs and natures and forms.""" + if self.power_shift and check_power_shift: + return self.get_raw_spdef(check_power_shift=False) + stat = self.calculate_raw_stat(self.spatk, self.spatkiv, self.spatkev, self.nature_stat_deltas["Special attack"]) + if self.spatk_split is not None: + stat = (stat + self.spatk_split) // 2 + return stat + + def get_raw_spdef(self, *, check_power_shift=True): + """Returns the raw attack of this poke, taking into account IVs EVs and natures and forms.""" + if self.power_shift and check_power_shift: + return self.get_raw_spatk(check_power_shift=False) + stat = self.calculate_raw_stat(self.spdef, self.spdefiv, self.spdefev, self.nature_stat_deltas["Special defense"]) + if self.spdef_split is not None: + stat = (stat + self.spdef_split) // 2 + return stat + + def get_raw_speed(self): + """Returns the raw attack of this poke, taking into account IVs EVs and natures and forms.""" + return self.calculate_raw_stat(self.speed, self.speediv, self.speedev, self.nature_stat_deltas["Speed"]) + + def get_attack(self, battle, *, critical=False, ignore_stages=False): + """Helper method to call calculate_stat for attack.""" + attack = self.get_raw_attack() + if not ignore_stages: + attack = self.calculate_stat(attack, self.attack_stage, crop="bottom" if critical else False) + if self.ability() == Ability.GUTS and self.nv.current: + attack *= 1.5 + if self.ability() == Ability.SLOW_START and self.active_turns < 5: + attack *= .5 + if self.ability() in (Ability.HUGE_POWER, Ability.PURE_POWER): + attack *= 2 + if self.ability() == Ability.HUSTLE: + attack *= 1.5 + if self.ability() == Ability.DEFEATIST and self.hp <= self.starting_hp / 2: + attack *= .5 + if self.ability() == Ability.GORILLA_TACTICS: + attack *= 1.5 + if self.ability() == Ability.FLOWER_GIFT and battle.weather.get() in ("sun", "h-sun"): + attack *= 1.5 + if self.ability() == Ability.ORICHALCUM_PULSE and battle.weather.get() in ("sun", "h-sun"): + attack *= 4/3 + if self.held_item == "choice-band": + attack *= 1.5 + if self.held_item == "light-ball" and self._name == "Pikachu": + attack *= 2 + if self.held_item == "thick-club" and self._name in ("Cubone", "Marowak", "Marowak-alola"): + attack *= 2 + for poke in (battle.trainer1.current_pokemon, battle.trainer2.current_pokemon): + if poke is not None and poke is not self and poke.ability() == Ability.TABLETS_OF_RUIN: + attack *= .75 + if all(self.get_raw_attack() >= x for x in (self.get_raw_defense(), self.get_raw_spatk(), self.get_raw_spdef(), self.get_raw_speed())): + if ( + (self.ability() == Ability.PROTOSYNTHESIS and (battle.weather.get() in ("sun", "h-sun") or self.booster_energy)) + or (self.ability() == Ability.QUARK_DRIVE and (battle.terrain.item == "electric" or self.booster_energy)) + ): + attack *= 1.3 + elif self.ability() in (Ability.PROTOSYNTHESIS, Ability.QUARK_DRIVE) and self.held_item == "booster-energy": + self.held_item.use() + self.booster_energy = True + attack *= 1.3 + + return attack + + def get_defense(self, battle, *, critical=False, ignore_stages=False, attacker=None, move=None): + """Helper method to call calculate_stat for defense.""" + if battle.wonder_room.active(): + defense = self.get_raw_spdef() + else: + defense = self.get_raw_defense() + if not ignore_stages: + defense = self.calculate_stat(defense, self.defense_stage, crop="top" if critical else False) + if self.ability(attacker=attacker, move=move) == Ability.MARVEL_SCALE and self.nv.current: + defense *= 1.5 + if self.ability(attacker=attacker, move=move) == Ability.FUR_COAT: + defense *= 2 + if self.ability(attacker=attacker, move=move) == Ability.GRASS_PELT and battle.terrain.item == "grassy": + defense *= 1.5 + if self.held_item == "eviolite" and self.can_still_evolve: + defense *= 1.5 + for poke in (battle.trainer1.current_pokemon, battle.trainer2.current_pokemon): + if poke is not None and poke is not self and poke.ability() == Ability.SWORD_OF_RUIN: + defense *= .75 + if ( + self.get_raw_defense() > self.get_raw_attack() + and all(self.get_raw_defense() >= x for x in (self.get_raw_spatk(), self.get_raw_spdef(), self.get_raw_speed())) + ): + if ( + (self.ability() == Ability.PROTOSYNTHESIS and (battle.weather.get() in ("sun", "h-sun") or self.booster_energy)) + or (self.ability() == Ability.QUARK_DRIVE and (battle.terrain.item == "electric" or self.booster_energy)) + ): + defense *= 1.3 + elif self.ability() in (Ability.PROTOSYNTHESIS, Ability.QUARK_DRIVE) and self.held_item == "booster-energy": + self.held_item.use() + self.booster_energy = True + defense *= 1.3 + return defense + + def get_spatk(self, battle, *, critical=False, ignore_stages=False): + """Helper method to call calculate_stat for spatk.""" + spatk = self.get_raw_spatk() + if not ignore_stages: + spatk = self.calculate_stat(spatk, self.spatk_stage, crop="bottom" if critical else False) + if self.ability() == Ability.DEFEATIST and self.hp <= self.starting_hp / 2: + spatk *= .5 + if self.ability() == Ability.SOLAR_POWER and battle.weather.get() in ("sun", "h-sun"): + spatk *= 1.5 + if self.ability() == Ability.HADRON_ENGINE and battle.terrain.item == "grassy": + spatk *= 4/3 + if self.held_item == "choice-specs": + spatk *= 1.5 + if self.held_item == "deep-sea-tooth" and self._name == "Clamperl": + spatk *= 2 + if self.held_item == "light-ball" and self._name == "Pikachu": + spatk *= 2 + for poke in (battle.trainer1.current_pokemon, battle.trainer2.current_pokemon): + if poke is not None and poke is not self and poke.ability() == Ability.VESSEL_OF_RUIN: + spatk *= .75 + if ( + all(self.get_raw_spatk() >= x for x in (self.get_raw_spdef(), self.get_raw_speed())) + and all(self.get_raw_spatk() > x for x in (self.get_raw_attack(), self.get_raw_defense())) + ): + if ( + (self.ability() == Ability.PROTOSYNTHESIS and (battle.weather.get() in ("sun", "h-sun") or self.booster_energy)) + or (self.ability() == Ability.QUARK_DRIVE and (battle.terrain.item == "electric" or self.booster_energy)) + ): + spatk *= 1.3 + elif self.ability() in (Ability.PROTOSYNTHESIS, Ability.QUARK_DRIVE) and self.held_item == "booster-energy": + self.held_item.use() + self.booster_energy = True + spatk *= 1.3 + return spatk + + def get_spdef(self, battle, *, critical=False, ignore_stages=False, attacker=None, move=None): + """Helper method to call calculate_stat for spdef.""" + if battle.wonder_room.active(): + spdef = self.get_raw_defense() + else: + spdef = self.get_raw_spdef() + if not ignore_stages: + spdef = self.calculate_stat(spdef, self.spdef_stage, crop="top" if critical else False) + if battle.weather.get() == "sandstorm" and ElementType.ROCK in self.type_ids: + spdef *= 1.5 + if self.ability(attacker=attacker, move=move) == Ability.FLOWER_GIFT and battle.weather.get() in ("sun", "h-sun"): + spdef *= 1.5 + if self.held_item == "deep-sea-scale" and self._name == "Clamperl": + spdef *= 2 + if self.held_item == "assault-vest": + spdef *= 1.5 + if self.held_item == "eviolite" and self.can_still_evolve: + spdef *= 1.5 + for poke in (battle.trainer1.current_pokemon, battle.trainer2.current_pokemon): + if poke is not None and poke is not self and poke.ability() == Ability.BEADS_OF_RUIN: + spdef *= .75 + if ( + self.get_raw_spdef() >= self.get_raw_speed() + and all(self.get_raw_spdef() > x for x in (self.get_raw_attack(), self.get_raw_defense(), self.get_raw_spatk())) + ): + if ( + (self.ability() == Ability.PROTOSYNTHESIS and (battle.weather.get() in ("sun", "h-sun") or self.booster_energy)) + or (self.ability() == Ability.QUARK_DRIVE and (battle.terrain.item == "electric" or self.booster_energy)) + ): + spdef *= 1.3 + elif self.ability() in (Ability.PROTOSYNTHESIS, Ability.QUARK_DRIVE) and self.held_item == "booster-energy": + self.held_item.use() + self.booster_energy = True + spdef *= 1.3 + return spdef + + def get_speed(self, battle): + """Helper method to call calculate_stat for speed.""" + #Always active stage changes + speed = self.calculate_stat(self.get_raw_speed(), self.speed_stage) + if self.nv.paralysis() and not self.ability() == Ability.QUICK_FEET: + speed //= 2 + if self.held_item == "iron-ball": + speed //= 2 + if self.owner.tailwind.active(): + speed *= 2 + if self.ability() == Ability.SLUSH_RUSH and battle.weather.get() == "hail": + speed *= 2 + if self.ability() == Ability.SAND_RUSH and battle.weather.get() == "sandstorm": + speed *= 2 + if self.ability() == Ability.SWIFT_SWIM and battle.weather.get() in ("rain", "h-rain"): + speed *= 2 + if self.ability() == Ability.CHLOROPHYLL and battle.weather.get() in ("sun", "h-sun"): + speed *= 2 + if self.ability() == Ability.SLOW_START and self.active_turns < 5: + speed *= .5 + if self.ability() == Ability.UNBURDEN and not self.held_item.has_item() and self.held_item.ever_had_item: + speed *= 2 + if self.ability() == Ability.QUICK_FEET and self.nv.current: + speed *= 1.5 + if self.ability() == Ability.SURGE_SURFER and battle.terrain.item == "electric": + speed *= 2 + if self.held_item == "choice-scarf": + speed *= 1.5 + if all(self.get_raw_speed() > x for x in (self.get_raw_attack(), self.get_raw_defense(), self.get_raw_spatk(), self.get_raw_spdef())): + if ( + (self.ability() == Ability.PROTOSYNTHESIS and (battle.weather.get() in ("sun", "h-sun") or self.booster_energy)) + or (self.ability() == Ability.QUARK_DRIVE and (battle.terrain.item == "electric" or self.booster_energy)) + ): + speed *= 1.5 + elif self.ability() in (Ability.PROTOSYNTHESIS, Ability.QUARK_DRIVE) and self.held_item == "booster-energy": + self.held_item.use() + self.booster_energy = True + speed *= 1.5 + return speed + + def get_accuracy(self, battle): + """Helper method to calculate accuracy stage.""" + return self.accuracy_stage + + def get_evasion(self, battle): + """Helper method to calculate evasion stage.""" + return self.evasion_stage + + def append_attack(self, stage_change: int, *, attacker=None, move=None, source: str="", check_looping: bool=True): + """Helper method to call append_stat for attack.""" + return self.append_stat(stage_change, attacker, move, "attack", source, check_looping) + + def append_defense(self, stage_change: int, *, attacker=None, move=None, source: str="", check_looping: bool=True): + """Helper method to call append_stat for defense.""" + return self.append_stat(stage_change, attacker, move, "defense", source, check_looping) + + def append_spatk(self, stage_change: int, *, attacker=None, move=None, source: str="", check_looping: bool=True): + """Helper method to call append_stat for special attack.""" + return self.append_stat(stage_change, attacker, move, "special attack", source, check_looping) + + def append_spdef(self, stage_change: int, *, attacker=None, move=None, source: str="", check_looping: bool=True): + """Helper method to call append_stat for special defense.""" + return self.append_stat(stage_change, attacker, move, "special defense", source, check_looping) + + def append_speed(self, stage_change: int, *, attacker=None, move=None, source: str="", check_looping: bool=True): + """Helper method to call append_stat for speed.""" + return self.append_stat(stage_change, attacker, move, "speed", source, check_looping) + + def append_accuracy(self, stage_change: int, *, attacker=None, move=None, source: str="", check_looping: bool=True): + """Helper method to call append_stat for accuracy.""" + return self.append_stat(stage_change, attacker, move, "accuracy", source, check_looping) + + def append_evasion(self, stage_change: int, *, attacker=None, move=None, source: str="", check_looping: bool=True): + """Helper method to call append_stat for evasion.""" + return self.append_stat(stage_change, attacker, move, "evasion", source, check_looping) + + def append_stat(self, stage_change: int, attacker, move, stat: str, source: str, check_looping: bool=True): + """ + Adds a stat stage change to this pokemon. + + Returns a formatted string describing the stat change. + """ + msg = "" + if self.substitute and attacker is not self and attacker is not None and (move is None or move.is_affected_by_substitute()): + return "" + if source: + source = f" from {source}" + delta_msgs = { + -3: f"{self.name}'s {stat} severely fell{source}!\n", + -2: f"{self.name}'s {stat} harshly fell{source}!\n", + -1: f"{self.name}'s {stat} fell{source}!\n", + 1: f"{self.name}'s {stat} rose{source}!\n", + 2: f"{self.name}'s {stat} rose sharply{source}!\n", + 3: f"{self.name}'s {stat} rose drastically{source}!\n", + } + delta = stage_change + if self.ability(attacker=attacker, move=move) == Ability.SIMPLE: + delta *= 2 + if self.ability(attacker=attacker, move=move) == Ability.CONTRARY: + delta *= -1 + + if stat == "attack": + current_stage = self.attack_stage + elif stat == "defense": + current_stage = self.defense_stage + elif stat == "special attack": + current_stage = self.spatk_stage + elif stat == "special defense": + current_stage = self.spdef_stage + elif stat == "speed": + current_stage = self.speed_stage + elif stat == "accuracy": + current_stage = self.accuracy_stage + elif stat == "evasion": + current_stage = self.evasion_stage + else: + raise ValueError(f"invalid stat {stat}") + + # Cap stat stages within -6 to 6 + if delta < 0: + #-6 -5 -4 .. 2 + # 0 -1 -2 .. -8 + cap = (current_stage * -1) - 6 + delta = max(delta, cap) + if delta == 0: + return f"{self.name}'s {stat} won't go any lower!\n" + else: + # 6 5 4 .. -2 + # 0 1 2 .. 8 + cap = (current_stage * -1) + 6 + delta = min(delta, cap) + if delta == 0: + return f"{self.name}'s {stat} won't go any higher!\n" + + # Prevent stat changes + if delta < 0 and attacker is not self: + if self.ability(attacker=attacker, move=move) in (Ability.CLEAR_BODY, Ability.WHITE_SMOKE, Ability.FULL_METAL_BODY): + ability_name = Ability(self.ability_id).pretty_name + return f"{self.name}'s {ability_name} prevented its {stat} from being lowered!\n" + if self.ability(attacker=attacker, move=move) == Ability.HYPER_CUTTER and stat == "attack": + return f"{self.name}'s claws stayed sharp because of its hyper cutter!\n" + if self.ability(attacker=attacker, move=move) == Ability.KEEN_EYE and stat == "accuracy": + return f"{self.name}'s aim stayed true because of its keen eye!\n" + if self.ability(attacker=attacker, move=move) == Ability.MINDS_EYE and stat == "accuracy": + return f"{self.name}'s aim stayed true because of its mind's eye!\n" + if self.ability(attacker=attacker, move=move) == Ability.BIG_PECKS and stat == "defense": + return f"{self.name}'s defense stayed strong because of its big pecks!\n" + if self.owner.mist.active() and (attacker is None or attacker.ability() != Ability.INFILTRATOR): + return f"The mist around {self.name}'s feet prevented its {stat} from being lowered!\n" + if self.ability(attacker=attacker, move=move) == Ability.FLOWER_VEIL and ElementType.GRASS in self.type_ids: + return "" + if self.ability(attacker=attacker, move=move) == Ability.MIRROR_ARMOR and attacker is not None and check_looping: + msg += f"{self.name} reflected the stat change with its mirror armor!\n" + msg += attacker.append_stat(delta, self, None, stat, "", check_looping=False) + return msg + + # Remember if stats were changed for certain moves + if delta > 0: + self.stat_increased = True + elif delta < 0: + self.stat_decreased = True + + if stat == "attack": + self.attack_stage += delta + elif stat == "defense": + self.defense_stage += delta + elif stat == "special attack": + self.spatk_stage += delta + elif stat == "special defense": + self.spdef_stage += delta + elif stat == "speed": + self.speed_stage += delta + elif stat == "accuracy": + self.accuracy_stage += delta + elif stat == "evasion": + self.evasion_stage += delta + else: + raise ValueError(f"invalid stat {stat}") + + formatted_delta = min(max(delta, -3), 3) + msg += delta_msgs[formatted_delta] + + # TODO: fix this hacky way of doing this, but probably not until multi battles... + battle = self.held_item.battle + + # Effects that happen after a pokemon gains stats + if delta < 0: + if attacker is not self: + if self.ability(attacker=attacker, move=move) == Ability.DEFIANT: + msg += self.append_attack(2, attacker=self, source="its defiance") + if self.ability(attacker=attacker, move=move) == Ability.COMPETITIVE: + msg += self.append_spatk(2, attacker=self, source="its competitiveness") + if self.held_item == "eject-pack": + # This assumes that neither attacker or poke are needed if not checking traps + swaps = self.owner.valid_swaps(..., ..., check_trap=False) + if swaps: + msg += f"{self.name} is switched out by its eject pack!\n" + self.held_item.use() + msg += self.remove(battle) + # Force this pokemon to immediately return to be attacked + self.owner.mid_turn_remove = True + elif delta > 0: + for poke in (battle.trainer1.current_pokemon, battle.trainer2.current_pokemon): + if poke is not None and poke is not self and poke.ability() == Ability.OPPORTUNIST and check_looping: + msg += f"{poke.name} seizes the opportunity to boost its stat with its opportunist!\n" + msg += poke.append_stat(delta, poke, None, stat, "", check_looping=False) + return msg + + def grounded(self, battle, *, attacker=None, move=None): + """ + Returns True if this pokemon is considered "grounded". + + Explicit grounding applies first, then explicit ungrounding, then implicit grounding. + """ + if battle.gravity.active(): + return True + if self.held_item == "iron-ball": + return True + if self.grounded_by_move: + return True + if ElementType.FLYING in self.type_ids and not self.roost: + return False + if self.ability(attacker=attacker, move=move) == Ability.LEVITATE: + return False + if self.held_item == "air-balloon": + return False + if self.magnet_rise.active(): + return False + if self.telekinesis.active(): + return False + return True + + def transform(self, otherpoke): + """Transforms this poke into otherpoke.""" + self.choice_move = None + self._name = otherpoke._name + if self._nickname != "None": + self.name = f"{self._nickname} ({self._name.replace('-', ' ')})" + else: + self.name = self._name.replace("-", " ") + self.attack = otherpoke.attack + self.defense = otherpoke.defense + self.spatk = otherpoke.spatk + self.spdef = otherpoke.spdef + self.speed = otherpoke.speed + self.hpiv = otherpoke.hpiv + self.atkiv = otherpoke.atkiv + self.defiv = otherpoke.defiv + self.spatkiv = otherpoke.spatkiv + self.spdefiv = otherpoke.spdefiv + self.speediv = otherpoke.speediv + self.hpev = otherpoke.hpev + self.atkev = otherpoke.atkev + self.defev = otherpoke.defev + self.spatkev = otherpoke.spatkev + self.spdefev = otherpoke.spdefev + self.speedev = otherpoke.speedev + self.moves = [move.copy() for move in otherpoke.moves] + for m in self.moves: + m.pp = 5 + self.ability_id = otherpoke.ability_id + self.type_ids = otherpoke.type_ids.copy() + self.attack_stage = otherpoke.attack_stage + self.defense_stage = otherpoke.defense_stage + self.spatk_stage = otherpoke.spatk_stage + self.spdef_stage = otherpoke.spdef_stage + self.speed_stage = otherpoke.speed_stage + self.accuracy_stage = otherpoke.accuracy_stage + self.evasion_stage = otherpoke.evasion_stage + + def form(self, form: str): + """ + Changes this poke's form to the provided form. + + This changes its name and base stats, and may affect moves, abilities, and items. + Returns True if the poke successfully reformed. + """ + if form not in self.base_stats: + return False + self._name = form + if self._nickname != "None": + self.name = f"{self._nickname} ({self._name.replace('-', ' ')})" + else: + self.name = self._name.replace("-", " ") + self.attack = self.base_stats[self._name][1] + self.defense = self.base_stats[self._name][2] + self.spatk = self.base_stats[self._name][3] + self.spdef = self.base_stats[self._name][4] + self.speed = self.base_stats[self._name][5] + self.attack_split = None + self.spatk_split = None + self.defense_split = None + self.spdef_split = None + self.autotomize = 0 + return True + + def effectiveness(self, attacker_type: ElementType, battle, *, attacker=None, move=None): + """Calculates a float representing the effectiveness of `attacker_type` damage on this poke.""" + if attacker_type == ElementType.TYPELESS: + return 1 + effectiveness = 1 + for defender_type in self.type_ids: + if defender_type == ElementType.TYPELESS: + continue + if move is not None and move.effect == 380 and defender_type == ElementType.WATER: + effectiveness *= 2 + continue + if move is not None and move.effect == 373 and defender_type == ElementType.FLYING and not self.grounded(battle, attacker=attacker, move=move): + return 1 # Ignores secondary types if defender is flying type and not grounded + if self.roost and defender_type == ElementType.FLYING: + continue + if self.foresight and attacker_type in (ElementType.FIGHTING, ElementType.NORMAL) and defender_type == ElementType.GHOST: + continue + if self.miracle_eye and attacker_type == ElementType.PSYCHIC and defender_type == ElementType.DARK: + continue + if ( + attacker_type in (ElementType.FIGHTING, ElementType.NORMAL) + and defender_type == ElementType.GHOST + and attacker is not None + and attacker.ability() in [Ability.SCRAPPY, Ability.MINDS_EYE] + ): + continue + if attacker_type == ElementType.GROUND and defender_type == ElementType.FLYING and self.grounded(battle, attacker=attacker, move=move): + continue + e = battle.type_effectiveness[(attacker_type, defender_type)] / 100 + if defender_type == ElementType.FLYING and e > 1 and move is not None and battle.weather.get() == "h-wind": + e = 1 + if battle.inverse_battle: + if e < 1: + e = 2 + elif e > 1: + e = 0.5 + effectiveness *= e + if attacker_type == ElementType.FIRE and self.tar_shot: + effectiveness *= 2 + if effectiveness >= 1 and self.hp == self.starting_hp and self.ability(attacker=attacker, move=move) == Ability.TERA_SHELL: + effectiveness = 0.5 + return effectiveness + + def weight(self, *, attacker=None, move=None): + """ + Returns this pokemon's current weight. + + Dynamically modifies the weight based on the ability of this pokemon. + """ + cur_ability = self.ability(attacker=attacker, move=move) + cur_weight = self.starting_weight + if cur_ability == Ability.HEAVY_METAL: + cur_weight *= 2 + if cur_ability == Ability.LIGHT_METAL: + cur_weight //= 2 + cur_weight = max(1, cur_weight) + cur_weight -= self.autotomize * 1000 + cur_weight = max(1, cur_weight) + return cur_weight + + + def ability(self, *, attacker=None, move=None): + """ + Returns this pokemon's current ability. + + Returns None in cases where the ability is blocked or nullified. + """ + # Currently there are two categories of ability ignores, and both only apply when a move is used. + # Since this could change, the method signature is flexable. However, without both present, it + # should not consider the existing options. + if move is None or attacker is None or attacker is self: + return self.ability_id + if not self.ability_ignorable(): + return self.ability_id + if move.effect in (411, 460): + return None + if attacker.ability_id in (Ability.MOLD_BREAKER, Ability.TURBOBLAZE, Ability.TERAVOLT, Ability.NEUTRALIZING_GAS): + return None + if attacker.ability_id == Ability.MYCELIUM_MIGHT and move.damage_class == DamageClass.STATUS: + return None + return self.ability_id + + def ability_changeable(self): + """Returns True if this pokemon's current ability can be changed.""" + return self.ability_id not in ( + Ability.MULTITYPE, Ability.STANCE_CHANGE, Ability.SCHOOLING, Ability.COMATOSE, + Ability.SHIELDS_DOWN, Ability.DISGUISE, Ability.RKS_SYSTEM, Ability.BATTLE_BOND, + Ability.POWER_CONSTRUCT, Ability.ICE_FACE, Ability.GULP_MISSILE, Ability.ZERO_TO_HERO + ) + + def ability_giveable(self): + """Returns True if this pokemon's current ability can be given to another pokemon.""" + return self.ability_id not in ( + Ability.TRACE, Ability.FORECAST, Ability.FLOWER_GIFT, Ability.ZEN_MODE, Ability.ILLUSION, + Ability.IMPOSTER, Ability.POWER_OF_ALCHEMY, Ability.RECEIVER, Ability.DISGUISE, Ability.STANCE_CHANGE, + Ability.POWER_CONSTRUCT, Ability.ICE_FACE, Ability.HUNGER_SWITCH, Ability.GULP_MISSILE, Ability.ZERO_TO_HERO + ) + + def ability_ignorable(self): + """Returns True if this pokemon's current ability can be ignored.""" + return self.ability_id in ( + Ability.AROMA_VEIL, Ability.BATTLE_ARMOR, Ability.BIG_PECKS, Ability.BULLETPROOF, Ability.CLEAR_BODY, + Ability.CONTRARY, Ability.DAMP, Ability.DAZZLING, Ability.DISGUISE, Ability.DRY_SKIN, Ability.FILTER, + Ability.FLASH_FIRE, Ability.FLOWER_GIFT, Ability.FLOWER_VEIL, Ability.FLUFFY, Ability.FRIEND_GUARD, + Ability.FUR_COAT, Ability.HEATPROOF, Ability.HEAVY_METAL, Ability.HYPER_CUTTER, Ability.ICE_FACE, + Ability.ICE_SCALES, Ability.IMMUNITY, Ability.INNER_FOCUS, Ability.INSOMNIA, Ability.KEEN_EYE, + Ability.LEAF_GUARD, Ability.LEVITATE, Ability.LIGHT_METAL, Ability.LIGHTNING_ROD, Ability.LIMBER, + Ability.MAGIC_BOUNCE, Ability.MAGMA_ARMOR, Ability.MARVEL_SCALE, Ability.MIRROR_ARMOR, Ability.MOTOR_DRIVE, + Ability.MULTISCALE, Ability.OBLIVIOUS, Ability.OVERCOAT, Ability.OWN_TEMPO, Ability.PASTEL_VEIL, + Ability.PUNK_ROCK, Ability.QUEENLY_MAJESTY, Ability.SAND_VEIL, Ability.SAP_SIPPER, Ability.SHELL_ARMOR, + Ability.SHIELD_DUST, Ability.SIMPLE, Ability.SNOW_CLOAK, Ability.SOLID_ROCK, Ability.SOUNDPROOF, + Ability.STICKY_HOLD, Ability.STORM_DRAIN, Ability.STURDY, Ability.SUCTION_CUPS, Ability.SWEET_VEIL, + Ability.TANGLED_FEET, Ability.TELEPATHY, Ability.THICK_FAT, Ability.UNAWARE, Ability.VITAL_SPIRIT, + Ability.VOLT_ABSORB, Ability.WATER_ABSORB, Ability.WATER_BUBBLE, Ability.WATER_VEIL, Ability.WHITE_SMOKE, + Ability.WONDER_GUARD, Ability.WONDER_SKIN, Ability.ARMOR_TAIL, Ability.EARTH_EATER, Ability.GOOD_AS_GOLD, + Ability.PURIFYING_SALT, Ability.WELL_BAKED_BODY + ) + + def get_assist_move(self): + """ + Returns a Move that can be used with assist, or None if none exists. + + This selects a random move from the pool of moves from pokes in the user's party that are eligable. + """ + moves = [] + for idx, poke in enumerate(self.owner.party): + if idx == self.owner.last_idx: + continue + for move in poke.moves: + if move.selectable_by_assist(): + moves.append(move) + if not moves: + return None + return random.choice(moves) + + @classmethod + async def create(cls, ctx, raw_data: dict): + """Creates a new DuelPokemon object using the raw data provided.""" + pn = raw_data["pokname"] + nick = raw_data["poknick"] + hpiv = min(31, raw_data["hpiv"]) + atkiv = min(31, raw_data["atkiv"]) + defiv = min(31, raw_data["defiv"]) + spatkiv = min(31, raw_data["spatkiv"]) + spdefiv = min(31, raw_data["spdefiv"]) + speediv = min(31, raw_data["speediv"]) + hpev = raw_data["hpev"] + atkev = raw_data["atkev"] + defev = raw_data["defev"] + spaev = raw_data["spatkev"] + spdev = raw_data["spdefev"] + speedev = raw_data["speedev"] + plevel = raw_data["pokelevel"] + shiny = raw_data["shiny"] + radiant = raw_data["radiant"] + skin = raw_data["skin"] + id = raw_data["id"] + hitem = raw_data["hitem"] + happiness = raw_data["happiness"] + moves = raw_data["moves"] + ab_index = raw_data["ability_index"] + nature = raw_data["nature"] + gender = raw_data["gender"] + + nature = await find_one(ctx, "natures", {"identifier": nature.lower()}) + dec_stat_id = nature["decreased_stat_id"] + inc_stat_id = nature["increased_stat_id"] + dec_stat = await find_one(ctx, "stat_types", {"id": dec_stat_id}) + inc_stat = await find_one(ctx, "stat_types", {"id": inc_stat_id}) + dec_stat = dec_stat["identifier"].capitalize().replace("-", " ") + inc_stat = inc_stat["identifier"].capitalize().replace("-", " ") + nature_stat_deltas = {"Attack": 1, "Defense": 1, "Special attack": 1, "Special defense": 1, "Speed": 1} + flavor_map = { + "Attack": "spicy", + "Defense": "sour", + "Speed": "sweet", + "Special attack": "dry", + "Special defense": "bitter", + } + disliked_flavor = "" + if dec_stat != inc_stat: + nature_stat_deltas[dec_stat] = 0.9 + nature_stat_deltas[inc_stat] = 1.1 + disliked_flavor = flavor_map[dec_stat] + + #Deform pokes that are formed into battle forms that they should not start off in + if pn == "Mimikyu-busted": + pn = "Mimikyu" + if pn in ("Cramorant-gorging", "Cramorant-gulping"): + pn = "Cramorant" + if pn == "Eiscue-noice": + pn = "Eiscue" + if pn == "Darmanitan-zen": + pn = "Darmanitan" + if pn == "Darmanitan-zen-galar": + pn = "Darmanitan-galar" + if pn == "Aegislash-blade": + pn = "Aegislash" + if pn in ("Minior-red", "Minior-orange", "Minior-yellow", "Minior-green", "Minior-blue", "Minior-indigo", "Minior-violet"): + pn = "Minior" + if pn == "Wishiwashi" and plevel >= 20: + pn = "Wishiwashi-school" + if pn == "Wishiwashi-school" and plevel < 20: + pn = "Wishiwashi" + if pn == "Greninja-ash": + pn = "Greninja" + if pn == "Zygarde-complete": + pn = "Zygarde" + if pn == "Morpeko-hangry": + pn = "Morpeko" + if pn == "Cherrim-sunshine": + pn = "Cherrim" + if pn in ("Castform-snowy", "Castform-rainy", "Castform-sunny"): + pn = "Castform" + if pn in ( + "Arceus-dragon", + "Arceus-dark", + "Arceus-ground", + "Arceus-fighting", + "Arceus-fire", + "Arceus-ice", + "Arceus-bug", + "Arceus-steel", + "Arceus-grass", + "Arceus-psychic", + "Arceus-fairy", + "Arceus-flying", + "Arceus-water", + "Arceus-ghost", + "Arceus-rock", + "Arceus-poison", + "Arceus-electric", + ): + pn = "Arceus" + if pn in ( + "Silvally-psychic", + "Silvally-fairy", + "Silvally-flying", + "Silvally-water", + "Silvally-ghost", + "Silvally-rock", + "Silvally-poison", + "Silvally-electric", + "Silvally-dragon", + "Silvally-dark", + "Silvally-ground", + "Silvally-fighting", + "Silvally-fire", + "Silvally-ice", + "Silvally-bug", + "Silvally-steel", + "Silvally-grass", + ): + pn = "Silvally" + if pn == "Palafin-hero": + pn = "Palafin" + if pn.endswith("-mega-x") or pn.endswith("-mega-y"): + pn = pn[:-7] + if pn.endswith("-mega"): + pn = pn[:-5] + #TODO: Meloetta, Shaymin + + form_info = await find_one(ctx, "forms", {"identifier": pn.lower()}) + #List of type ids + type_ids = (await find_one(ctx, "ptypes", {"id": form_info["pokemon_id"]}))["types"] + + #6 element list of stat values (int) + stats = (await find_one(ctx, "pokemon_stats", {"pokemon_id": form_info["pokemon_id"]}))["stats"] + pokemonHp = stats[0] + + #Store the base stats for all forms of this poke + base_stats = {} + base_stats[pn] = stats + extra_forms = [] + if pn == "Mimikyu": + extra_forms = ["Mimikyu-busted"] + if pn == "Cramorant": + extra_forms = ["Cramorant-gorging", "Cramorant-gulping"] + if pn == "Eiscue": + extra_forms = ["Eiscue-noice"] + if pn == "Darmanitan": + extra_forms = ["Darmanitan-zen"] + if pn == "Darmanitan-galar": + extra_forms = ["Darmanitan-zen-galar"] + if pn == "Aegislash": + extra_forms = ["Aegislash-blade"] + if pn == "Minior": + extra_forms = ["Minior-red", "Minior-orange", "Minior-yellow", "Minior-green", "Minior-blue", "Minior-indigo", "Minior-violet"] + if pn == "Wishiwashi": + extra_forms = ["Wishiwashi-school"] + if pn == "Wishiwashi-school": + extra_forms = ["Wishiwashi"] + if pn == "Greninja": + extra_forms = ["Greninja-ash"] + if pn == "Zygarde": + extra_forms = ["Zygarde-complete"] + if pn == "Zygarde-10": + extra_forms = ["Zygarde-complete"] + if pn == "Morpeko": + extra_forms = ["Morpeko-hangry"] + if pn == "Cherrim": + extra_forms = ["Cherrim-sunshine"] + if pn == "Castform": + extra_forms = ["Castform-snowy", "Castform-rainy", "Castform-sunny"] + if pn == "Arceus": + extra_forms = [ + "Arceus-dragon", + "Arceus-dark", + "Arceus-ground", + "Arceus-fighting", + "Arceus-fire", + "Arceus-ice", + "Arceus-bug", + "Arceus-steel", + "Arceus-grass", + "Arceus-psychic", + "Arceus-fairy", + "Arceus-flying", + "Arceus-water", + "Arceus-ghost", + "Arceus-rock", + "Arceus-poison", + "Arceus-electric", + ] + if pn == "Silvally": + extra_forms = [ + "Silvally-psychic", + "Silvally-fairy", + "Silvally-flying", + "Silvally-water", + "Silvally-ghost", + "Silvally-rock", + "Silvally-poison", + "Silvally-electric", + "Silvally-dragon", + "Silvally-dark", + "Silvally-ground", + "Silvally-fighting", + "Silvally-fire", + "Silvally-ice", + "Silvally-bug", + "Silvally-steel", + "Silvally-grass", + ] + if pn == "Palafin": + extra_forms = ["Palafin-hero"] + mega_form = None + mega_ability_id = None + mega_type_ids = None + if pn != "Rayquaza": + if hitem == "mega-stone": + mega_form = pn + "-mega" + elif hitem == "mega-stone-x": + mega_form = pn + "-mega-x" + elif hitem == "mega-stone-y": + mega_form = pn + "-mega-y" + else: + if "dragon-ascent" in moves: + mega_form = pn + "-mega" + if mega_form is not None: + mega_form_info = await find_one(ctx, "forms", {"identifier": mega_form.lower()}) + if mega_form_info is not None: + mega_ability = await find_one(ctx, "poke_abilities", {"pokemon_id": mega_form_info["pokemon_id"]}) + if mega_ability is None: + raise ValueError("mega form missing ability in `poke_abilities`") + mega_ability_id = mega_ability["ability_id"] + mega_types = (await find_one(ctx, "ptypes", {"id": mega_form_info["pokemon_id"]})) + if mega_types is None: + raise ValueError("mega form missing types in `ptypes`") + mega_type_ids = mega_types["types"] + extra_forms.append(mega_form) + + for f_name in extra_forms: + f_info = await find_one(ctx, "forms", {"identifier": f_name.lower()}) + f_stats = (await find_one(ctx, "pokemon_stats", {"pokemon_id": f_info["pokemon_id"]}))["stats"] + base_stats[f_name] = f_stats + + #Builds a list of the possible ability ids for this poke, `ab_index` is the currently selected ability from this list + ab_ids = [] + for record in await find(ctx, "poke_abilities", {"pokemon_id": form_info["pokemon_id"]}): + ab_ids.append(record["ability_id"]) + + try: + ab_id = ab_ids[ab_index] + #Should never happen, but better safe than sorry + except IndexError: + ab_id = ab_ids[0] + + if any( + pn.endswith(suffix) + for suffix in [ + "-bug","-summer","-marine","-elegant","-poison","-average","-altered","-winter","-trash","-incarnate", + "-baile","-rainy","-steel","-star","-ash","-diamond","-pop-star","-fan","-school","-therian","-pau", + "-river","-poke-ball","-kabuki","-electric","-heat","-unbound","-chill","-archipelago","-zen","-normal", + "-mega-y","-resolute","-blade","-speed","-indigo","-dusk","-sky","-west","-sun","-dandy","-solo","-high-plains", + "-la-reine","-50","-unova-cap","-burn","-mega-x","-monsoon","-primal","-red-striped","-blue-striped", + "-white-striped","-ground","-super","-yellow","-polar","-cosplay","-ultra","-heart","-snowy","-sensu", + "-eternal","-douse","-defense","-sunshine","-psychic","-modern","-natural","-tundra","-flying","-pharaoh", + "-libre","-sunny","-autumn","-10","-orange","-standard","-land","-partner","-dragon","-plant","-pirouette", + "-male","-hoenn-cap","-violet","-spring","-fighting","-sandstorm","-original-cap","-neutral","-fire", + "-fairy","-attack","-black","-shock","-shield","-shadow","-grass","-continental","-overcast","-disguised", + "-exclamation","-origin","-garden","-blue","-matron","-red-meteor","-small","-rock-star","-belle", + "-alola-cap","-green","-active","-red","-mow","-icy-snow","-debutante","-east","-midday","-jungle","-frost", + "-midnight","-rock","-fancy","-busted","-ordinary","-water","-phd","-ice","-spiky-eared","-savanna","-original", + "-ghost","-meadow","-dawn","-question","-pom-pom","-female","-kalos-cap","-confined","-sinnoh-cap","-aria", + "-dark","-ocean","-wash","-white","-mega","-sandy","-complete","-large","-crowned","-ice-rider","-shadow-rider", + "-zen-galar","-rapid-strike","-noice","-hangry", + ] + ): + name = pn.lower().split("-")[0] + pid = (await find_one(ctx, "forms", {"identifier": name}))["pokemon_id"] + else: + pid = form_info["pokemon_id"] + + #True if any possible future evo exists + can_still_evolve = bool(await find_one(ctx, "pfile", {"evolves_from_species_id": pid})) + #Unreleased pokemon that is treated like a form in the bot, monkeypatch fix. + if pn == "Floette-eternal": + can_still_evolve = False + + #This stat can (/has to) be calculated ahead of time, as it does not change between forms. + #If transform copied HP, I would probably take up drinking... + pokemonHp = round((((2 * pokemonHp + hpiv + (hpev / 4)) * plevel) / 100) + plevel + 10) + + hitem = await find_one(ctx, "items", {"identifier": hitem}) + + if pn == "Shedinja": + pokemonHp = 1 + + weight = (await find_one(ctx, "forms", {"identifier": pn.lower()}))["weight"] + if weight is None: + weight = 20 + + object_moves = [] + for move in moves: + type_override = None + if move.startswith("hidden-power-"): + element = move.split("-")[2] + move = "hidden-power" + type_override = ElementType[element.upper()] + move = await find_one(ctx, "moves", {"identifier": move}) + if move is None: + move = await find_one(ctx, "moves", {"identifier": "tackle"}) + else: + if type_override is not None: + move["type_id"] = type_override + object_moves.append(Move(**move)) + p = cls( + pokemon_id=pid, + name=pn, + nickname=nick, + base_stats=base_stats, + hp=pokemonHp, + hpiv=hpiv, + atkiv=atkiv, + defiv=defiv, + spatkiv=spatkiv, + spdefiv=spdefiv, + speediv=speediv, + hpev=hpev, + atkev=atkev, + defev=defev, + spatkev=spaev, + spdefev=spdev, + speedev=speedev, + level=plevel, + nature_stat_deltas=nature_stat_deltas, + shiny=shiny, + radiant=radiant, + skin=skin, + type_ids=type_ids, + mega_type_ids=mega_type_ids, + id=id, + held_item=hitem, + happiness=happiness, + moves=object_moves, + ability_id=ab_id, + mega_ability_id=mega_ability_id, + weight=weight, + gender=gender, + can_still_evolve=can_still_evolve, + disliked_flavor=disliked_flavor, + ) + + return p + + def __repr__(self): + return f"DuelPokemon(name={self._name!r}, hp={self.hp!r})" diff --git a/pokemonduel/trainer.py b/pokemonduel/trainer.py new file mode 100644 index 0000000..5e0a7dd --- /dev/null +++ b/pokemonduel/trainer.py @@ -0,0 +1,251 @@ +import discord +import asyncio +import random +from .enums import Ability, DamageClass, ElementType +from .misc import ExpiringEffect, ExpiringWish, ExpiringItem +from .move import Move + + +class Trainer(): + """ + Represents a genereric pokemon trainer. + + This class outlines the methods that Trainer objects + should have, but should not be used directly. + """ + def __init__(self, name: str, party: list): + self.name = name + self.party = party + self.current_pokemon = party[0] if len(party) > 0 else None + for poke in self.party: + poke.owner = self + self.event = asyncio.Event() + self.selected_action = None + #Boolean - True if this trainer's pokemon was removed in such a way that it needs to return mid-turn. + self.mid_turn_remove = False + #Optional[BatonPass] - Holds data baton passed from the previous pokemon to the next, if applicable. + self.baton_pass = None + #Int - Stacks of spikes on this trainer's side of the field + self.spikes = 0 + #Int - Stacks of toxic spikes on this trainer's side of the field + self.toxic_spikes = 0 + #Boolean - Whether stealth rocks are on this trainer's side of the field + self.stealth_rock = False + #Boolean - Whether a sticky web is on this trainer's side of the field + self.sticky_web = False + #Int - The last index of self.party that was selected + self.last_idx = 0 + self.wish = ExpiringWish() + self.aurora_veil = ExpiringEffect(0) + self.light_screen = ExpiringEffect(0) + self.reflect = ExpiringEffect(0) + self.mist = ExpiringEffect(0) + #ExpiringEffect - Stores the number of turns that pokes are protected from NV effects + self.safeguard = ExpiringEffect(0) + #Boolean - Whether the next poke to swap in should be restored via healing wish + self.healing_wish = False + #Boolean - Whether the next poke to swap in should be restored via lunar dance + self.lunar_dance = False + #ExpiringEffect - Stores the number of turns that pokes have doubled speed + self.tailwind = ExpiringEffect(0) + #ExpiringEffect - Stores the number of turns that electric moves have 1/3 power + self.mud_sport = ExpiringEffect(0) + #ExpiringEffect - Stores the number of turns that fire moves have 1/3 power + self.water_sport = ExpiringEffect(0) + #ExpiringEffect - Stores the fact that a party member recently fainted. + self.retaliate = ExpiringEffect(0) + #ExpiringItem - Stores the turns until future sight attacks this trainer's pokemon. + self.future_sight = ExpiringItem() + #Boolean - Whether or not any of this trainer's pokemon have mega evolved yet this battle. + self.has_mega_evolved = False + #Int - Stores the number of times a pokemon in this trainer's party has fainted, including after being revived. + self.num_fainted = 0 + #Int - Stores the HP of the subsitute this trainer's next pokemon on the field will receive. + self.next_substitute = 0 + + def has_alive_pokemon(self) -> bool: + """Returns True if this trainer still has at least one pokemon that is alive.""" + return any((poke.hp > 0 for poke in self.party)) + + def next_turn(self, battle): + """ + Updates this trainer for a new turn. + + Returns a formatted message. + """ + msg = "" + self.selected_action = None + self.mid_turn_remove = False + hp = self.wish.next_turn() + if hp and self.current_pokemon is not None: + msg += self.current_pokemon.heal(hp, source="its wish") + if self.aurora_veil.next_turn(): + msg += f"{self.name}'s aurora veil wore off!\n" + if self.light_screen.next_turn(): + msg += f"{self.name}'s light screen wore off!\n" + if self.reflect.next_turn(): + msg += f"{self.name}'s reflect wore off!\n" + if self.mist.next_turn(): + msg += f"{self.name}'s mist wore off!\n" + if self.safeguard.next_turn(): + msg += f"{self.name}'s safeguard wore off!\n" + if self.tailwind.next_turn(): + msg += f"{self.name}'s tailwind died down!\n" + if self.mud_sport.next_turn(): + msg += f"{self.name}'s mud sport wore off!\n" + if self.water_sport.next_turn(): + msg += f"{self.name}'s water sport evaporated!\n" + self.retaliate.next_turn() + future_sight_data = self.future_sight.item + if self.future_sight.next_turn() and self.current_pokemon is not None: + msg += f"{self.current_pokemon.name} took the future sight attack!\n" + future_sight_attacker, future_sight_move = future_sight_data + msgadd, _ = future_sight_move.attack(future_sight_attacker, self.current_pokemon, battle) + msg += msgadd + return msg + + def switch_poke(self, slot: int, *, mid_turn=False): + """Switch the currently active poke to the given slot.""" + if slot < 0 or slot >= len(self.party): + raise ValueError("out of bounds") + if not self.party[slot].hp > 0: + raise ValueError("no hp") + self.current_pokemon = self.party[slot] + self.mid_turn_remove = False + self.last_idx = slot + if mid_turn: + self.current_pokemon.swapped_in = True + + def is_human(self): + """Returns True if this trainer is a human player, False if it is an AI.""" + raise NotImplementedError() + + def valid_swaps(self, defender, battle, *, check_trap=True): + """Returns a list of indexes of pokes in the party that can be swapped to.""" + if self.current_pokemon is not None: + if ElementType.GHOST in self.current_pokemon.type_ids: + check_trap = False + if self.current_pokemon.held_item == "shed-shell": + check_trap = False + + if check_trap: + if self.current_pokemon.trapping: + return [] + if self.current_pokemon.ingrain: + return [] + if self.current_pokemon.fairy_lock.active() or defender.fairy_lock.active(): + return [] + if self.current_pokemon.no_retreat: + return [] + if self.current_pokemon.bind.active() and not self.current_pokemon.substitute: + return [] + if defender.ability() == Ability.SHADOW_TAG and not self.current_pokemon.ability() == Ability.SHADOW_TAG: + return [] + if defender.ability() == Ability.MAGNET_PULL and ElementType.STEEL in self.current_pokemon.type_ids: + return [] + if defender.ability() == Ability.ARENA_TRAP and self.current_pokemon.grounded(battle): + return [] + result = [idx for idx, poke in enumerate(self.party) if poke.hp > 0] + if self.last_idx in result: + result.remove(self.last_idx) + return result + + def valid_moves(self, defender): + """ + https://www.smogon.com/dp/articles/move_restrictions + + Returns + - ("forced", Move) - The move-action this trainer is FORCED to use. + - ("idxs", List[int]) - The indexes of moves that are valid to CHOOSE to use. + - ("struggle", List[int]) - If the user attempts to use any move, use struggle instead (no valid moves). + """ + # Check if they are FORCED to use a certain move + if self.current_pokemon.locked_move: + return ("forced", self.current_pokemon.locked_move.move) + # Remove all moves not matching a restriction + result = [] + for idx, move in enumerate(self.current_pokemon.moves): + if move.pp <= 0: + continue + if move.damage_class == DamageClass.STATUS and self.current_pokemon.held_item == "assault-vest": + continue + if move.damage_class == DamageClass.STATUS and self.current_pokemon.taunt.active(): + continue + if move.effect == 247 and not all(m.used for m in self.current_pokemon.moves if m.effect != 247): + continue + if self.current_pokemon.disable.active() and move is self.current_pokemon.disable.item: + continue + if self.current_pokemon.held_item in ("choice-scarf", "choice-band", "choice-specs") or self.current_pokemon.ability() == Ability.GORILLA_TACTICS: + if self.current_pokemon.choice_move is not None and move is not self.current_pokemon.choice_move: + continue + if self.current_pokemon.torment and self.current_pokemon.last_move is move: + continue + if ( + self.current_pokemon.last_move is not None + and self.current_pokemon.last_move.effect == 492 + and self.current_pokemon.last_move.id == move.id + and not self.current_pokemon.last_move_failed + ): + continue + if defender.imprison and move.id in [x.id for x in defender.moves]: + continue + if self.current_pokemon.heal_block.active() and move.is_affected_by_heal_block(): + continue + if self.current_pokemon.silenced.active() and move.is_sound_based(): + continue + if move.effect == 339 and not self.current_pokemon.ate_berry: + continue + if move.effect == 453 and not self.current_pokemon.held_item.is_berry(): + continue + if self.current_pokemon.encore.active() and move is not self.current_pokemon.encore.item: + continue + result.append(idx) + if not result: + return ("struggle", [0, 1, 2, 3]) + return ("idxs", result) + + def __repr__(self): + return f"{self.__class__.__name__}(name={self.name!r}, party={self.party!r})" + +class MemberTrainer(Trainer): + """ + Represents a pokemon trainer that is a discord.Member. + """ + def __init__(self, member: discord.Member, party): + super().__init__(member.name, party) + self.id = member.id + self.member = member + + def is_human(self): + """Returns True if this trainer is a human player, False if it is an AI.""" + return True + +class NPCTrainer(Trainer): + """ + Represents a pokemon trainer that is a NPC. + """ + def __init__(self, party): + super().__init__("Trainer John", party) + + def move(self, defender, battle): + """Request a normal move from this trainer AI.""" + status_code, movedata = self.valid_moves(defender) + if status_code == "forced": + self.selected_action = movedata + elif status_code == "struggle": + self.selected_action = Move.struggle() + else: + self.selected_action = self.current_pokemon.moves[random.choice(movedata)] + self.event.set() + #TODO: npc ai? + + def swap(self, defender, battle, *, mid_turn=False): + """Request a swap choice from this trainer AI.""" + poke_idx = random.choice(self.valid_swaps(defender, battle, check_trap=False)) + self.switch_poke(poke_idx, mid_turn=mid_turn) + self.event.set() + #TODO: npc ai? + + def is_human(self): + """Returns True if this trainer is a human player, False if it is an AI.""" + return False diff --git a/rolehistory/__init__.py b/rolehistory/__init__.py new file mode 100644 index 0000000..36ca12f --- /dev/null +++ b/rolehistory/__init__.py @@ -0,0 +1,7 @@ +from .rolehistory import RoleHistory + + +async def setup(bot): + cog = RoleHistory(bot) + await cog.initalize() + await bot.add_cog(cog) diff --git a/rolehistory/info.json b/rolehistory/info.json new file mode 100644 index 0000000..456f425 --- /dev/null +++ b/rolehistory/info.json @@ -0,0 +1,16 @@ +{ + "author": [ + "flare(flare#0001)" + ], + "install_msg": "Role History. A way to visualize the history of a user's roles.", + "name": "RoleHistory", + "disabled": false, + "short": "Visualize the history of a user's roles.", + "description": "Visualize the history of a user's roles.", + "tags": [ + "roles", + "history", + "rolehistory" + ], + "min_bot_version": "3.5.0" +} diff --git a/rolehistory/rolehistory.py b/rolehistory/rolehistory.py new file mode 100644 index 0000000..b2c3535 --- /dev/null +++ b/rolehistory/rolehistory.py @@ -0,0 +1,104 @@ +from datetime import datetime + +import discord +from discord.utils import format_dt, utcnow +from redbot.core import Config, commands +from redbot.core.utils.chat_formatting import pagify +from redbot.core.utils.menus import DEFAULT_CONTROLS, menu + + +class RoleHistory(commands.Cog): + __version__ = "0.1.0" + + def format_help_for_context(self, ctx): + pre_processed = super().format_help_for_context(ctx) + return f"{pre_processed}\nCog Version: {self.__version__}" + + def __init__(self, bot): + self.bot = bot + self.config = Config.get_conf(self, identifier=95932766180343808) + default_member = {"history": [], "toggle": False} + default_guild = {"toggle": False} + self.config.register_member(**default_member) + self.config.register_guild(**default_guild) + self.guild_cache = {} + self.toggle_cache = {} + + async def initalize(self): + await self.bot.wait_until_ready() + self.guild_cache = await self.config.all_guilds() + self.toggle_cache = await self.config.all_members() + + @commands.Cog.listener() + async def on_member_update(self, before, after): + guild = before.guild + if before.guild.id not in self.guild_cache: + return + if not self.guild_cache[before.guild.id]["toggle"]: + return + if guild.id not in self.toggle_cache: + return + if not self.toggle_cache[guild.id].get(before.id, {}).get("toggle", False): + return + if before.roles != after.roles: + roles = [] + if len(before.roles) > len(after.roles): + roles.extend( + (role.id, role.name, "removed", utcnow().timestamp()) + for role in before.roles + if role not in after.roles + ) + elif len(before.roles) < len(after.roles): + roles.extend( + (role.id, role.name, "added", utcnow().timestamp()) + for role in after.roles + if role not in before.roles + ) + if roles: + async with self.config.member(before).history() as history: + for role in roles: + history.append(role) + + @commands.hybrid_group() + async def rolehistory(self, ctx): + """Role History Commands""" + + @rolehistory.command() + async def toggle(self, ctx): + """Toggle Role History""" + guild_toggle = await self.config.guild(ctx.guild).toggle() + if not guild_toggle: + return await ctx.send("Role History is disabled for this guild", ephemeral=True) + toggle = await self.config.member(ctx.author).toggle() + await self.config.member(ctx.author).toggle.set(not toggle) + await ctx.send(f"Role History is now {not toggle}", ephemeral=True) + self.toggle_cache = await self.config.all_members() + + @rolehistory.command() + async def show(self, ctx): + """Show Role History""" + history = await self.config.member(ctx.author).history() + if not history: + return await ctx.send("You have no role history", ephemeral=True) + minus = "\\-" + msg = "".join( + f"{'+' if role[2] == 'added' else minus} {role[1]} | {format_dt(datetime.fromtimestamp(role[3]), style='F')}\n" + for role in history + ) + embeds = [] + for i, page in enumerate(pagify(msg, page_length=1000)): + embed = discord.Embed(title=f"{ctx.author}'s Role History", description=page) + embed.set_footer(text=f"Page {i}") + embeds.append(embed) + if len(embeds) == 1: + return await ctx.send(embed=embeds[0]) + await menu(ctx, embeds, DEFAULT_CONTROLS) + + @rolehistory.command() + @commands.admin_or_permissions(manage_roles=True) + async def guildtoggle(self, ctx): + """Toggle Role History for the guild""" + toggle = await self.config.guild(ctx.guild).toggle() + await self.config.guild(ctx.guild).toggle.set(not toggle) + await ctx.send(f"Role History is now {not toggle}", ephemeral=True) + self.guild_cache = await self.config.all_guilds() diff --git a/simpleembed/__init__.py b/simpleembed/__init__.py new file mode 100644 index 0000000..52872f1 --- /dev/null +++ b/simpleembed/__init__.py @@ -0,0 +1,6 @@ +from .simpleembed import SimpleEmbed + +__red_end_user_data_statement__ = 'This cog does not store user data.' + +async def setup(bot): + await bot.add_cog(SimpleEmbed(bot)) diff --git a/simpleembed/info.json b/simpleembed/info.json new file mode 100644 index 0000000..0aa924c --- /dev/null +++ b/simpleembed/info.json @@ -0,0 +1,12 @@ +{ + "author" : ["Flame442"], + "install_msg" : "Thanks for installing SimpleEmbed. Use `[p]sendembed` to send embeds.", + "name" : "SimpleEmbed", + "short" : "Simply send embeds.", + "requirements" : [], + "description" : "Create and send simple embeds through the bot. Only the description, color, and large image fields of the embed can be modified. Run [p]sendembed to create an embed!", + "tags" : ["utility", "embed", "say"], + "min_bot_version": "3.5.0.dev1", + "min_python_version": [3, 6, 0], + "end_user_data_statement": "This cog does not store user data." +} diff --git a/simpleembed/simpleembed.py b/simpleembed/simpleembed.py new file mode 100644 index 0000000..a2aa45d --- /dev/null +++ b/simpleembed/simpleembed.py @@ -0,0 +1,41 @@ +import discord +from redbot.core import commands +from redbot.core import checks +from typing import Optional + + +class SimpleEmbed(commands.Cog): + """Simply send embeds.""" + def __init__(self, bot): + self.bot = bot + + @checks.has_permissions(manage_messages=True) + @commands.bot_has_permissions(embed_links=True) + @commands.command() + async def sendembed(self, ctx, color: Optional[discord.Color]=None, *, text): + """ + Send an embed. + + Use the optional parameter `color` to change the color of the embed. + The embed will contain the text `text`. + All normal discord formatting will work inside the embed. + If an imaged is attached with the command, it will be inserted at the bottom of the embed. + """ + if color is None: + color = await ctx.embed_color() + embed = discord.Embed( + description=text, + color=color + ) + if ctx.message.attachments: + content = await ctx.message.attachments[0].to_file() + embed.set_image(url="attachment://" + str(content.filename)) + await ctx.send(embed=embed, file=content if ctx.message.attachments else None) + try: + await ctx.message.delete() + except discord.Forbidden: + pass + + async def red_delete_data_for_user(self, **kwargs): + """Nothing to delete.""" + return diff --git a/stickbugged/__init__.py b/stickbugged/__init__.py new file mode 100644 index 0000000..8d0e8ad --- /dev/null +++ b/stickbugged/__init__.py @@ -0,0 +1,5 @@ +from .stickbugged import StickBugged + + +async def setup(bot): + await bot.add_cog(StickBugged(bot)) diff --git a/stickbugged/converters.py b/stickbugged/converters.py new file mode 100644 index 0000000..a486993 --- /dev/null +++ b/stickbugged/converters.py @@ -0,0 +1,77 @@ +# Taken and modified from Trustys NotSoBot cog. + +import re + +from discord.ext.commands.converter import Converter +from discord.ext.commands.errors import BadArgument + +IMAGE_LINKS = re.compile(r"(https?:\/\/[^\"\'\s]*\.(?:png|jpg|jpeg|gif|png|svg)(\?size=[0-9]*)?)") +EMOJI_REGEX = re.compile(r"(<(a)?:[a-zA-Z0-9\_]+:([0-9]+)>)") +MENTION_REGEX = re.compile(r"<@!?([0-9]+)>") +ID_REGEX = re.compile(r"[0-9]{17,}") + + +class ImageFinder(Converter): + """This is a class to convert notsobots image searching capabilities into a more general + converter class.""" + + async def convert(self, ctx, argument): + attachments = ctx.message.attachments + mentions = MENTION_REGEX.finditer(argument) + matches = IMAGE_LINKS.finditer(argument) + emojis = EMOJI_REGEX.finditer(argument) + ids = ID_REGEX.finditer(argument) + urls = [] + if matches: + for match in matches: + urls.append(match.group(1)) + if emojis: + for emoji in emojis: + ext = "gif" if emoji.group(2) else "png" + url = "https://cdn.discordapp.com/emojis/{id}.{ext}?v=1".format( + id=emoji.group(3), ext=ext + ) + urls.append(url) + if mentions: + for mention in mentions: + user = ctx.guild.get_member(int(mention.group(1))) + if user is not None: + url = IMAGE_LINKS.search( + str(user.display_avatar.replace(size=512, static_format="png").url) + ) + urls.append(url.group(1)) + if not urls and ids: + for possible_id in ids: + user = ctx.guild.get_member(int(possible_id.group(0))) + if user: + url = IMAGE_LINKS.search( + str(user.display_avatar.replace(size=512, static_format="png").url) + ) + urls.append(url.group(1)) + if attachments: + for attachment in attachments: + urls.append(attachment.url) + + if not urls and ctx.guild: + user = ctx.guild.get_member_named(argument) + if user: + url = IMAGE_LINKS.search( + str(user.display_avatar.replace(size=512, static_format="png").url) + ) + urls.append(url) + if not urls: + raise BadArgument("No images found.") + return urls[0] + + async def search_for_images(self, ctx): + urls = [] + async for message in ctx.channel.history(limit=10): + if message.attachments: + for attachment in message.attachments: + urls.append(attachment.url) + match = IMAGE_LINKS.match(message.content) + if match: + urls.append(match.group(1)) + if not urls: + raise BadArgument("No Images found in recent history.") + return urls[0] diff --git a/stickbugged/info.json b/stickbugged/info.json new file mode 100644 index 0000000..24eefd5 --- /dev/null +++ b/stickbugged/info.json @@ -0,0 +1,18 @@ +{ + "author": [ + "flare(flare#0001)" + ], + "install_msg": "Get stick bugged lol. This cog may be usage intensive and not recommender for smaller hosts. This cog required ffmpeg to be installed, it will error otherwise.", + "name": "StickBugged", + "disabled": false, + "short": "Get stickbugged.", + "description": "Get stickbugged.", + "tags": [ + "stickbugged" + ], + "requirements": [ + "get-stick-bugged-lol" + ], + "min_bot_version": "3.5.0", + "hidden": false +} diff --git a/stickbugged/stickbugged.py b/stickbugged/stickbugged.py new file mode 100644 index 0000000..c9bd8b2 --- /dev/null +++ b/stickbugged/stickbugged.py @@ -0,0 +1,95 @@ +import asyncio +import functools +import logging +import os +from io import BytesIO +from typing import Optional + +import aiohttp +import discord +from gsbl.stick_bug import StickBug +from PIL import Image +from redbot.core import commands +from redbot.core.data_manager import cog_data_path + +from .converters import ImageFinder + +log = logging.getLogger("red.flare.stick") + + +class StickBugged(commands.Cog): + __version__ = "0.0.1" + __author__ = "flare#0001" + + def format_help_for_context(self, ctx): + """Thanks Sinbad.""" + pre_processed = super().format_help_for_context(ctx) + return f"{pre_processed}\nCog Version: {self.__version__}\nAuthor: {self.__author__}" + + def __init__(self, bot) -> None: + self.bot = bot + self._stickbug = StickBug() + + def blocking(self, io, id): + io = Image.open(io) + self._stickbug.image = io + + self._stickbug.video_resolution = max(min(1280, io.width), 128), max( + min(720, io.height), 72 + ) + self._stickbug.lsd_scale = 0.35 + video = self._stickbug.video + video.write_videofile( + str(cog_data_path(self)) + f"/{id}stick.mp4", + threads=1, + preset="superfast", + verbose=False, + logger=None, + temp_audiofile=str(cog_data_path(self) / f"{id}stick.mp3"), + ) + video.close() + return + + @commands.max_concurrency(1, commands.BucketType.default) + @commands.command(aliases=["stickbug", "stickbugged"]) + async def stick(self, ctx, images: Optional[ImageFinder]): + """get stick bugged lol""" + if images is None: + images = await ImageFinder().search_for_images(ctx) + if not images: + return await ctx.send_help() + image = images + async with ctx.typing(): + io = BytesIO() + if isinstance(image, discord.Asset): + await image.save(io, seek_begin=True) + else: + async with aiohttp.ClientSession() as session: + async with session.get(str(image)) as resp: + if resp.status != 200: + return await ctx.send("The picture returned an unknown status code.") + io.write(await resp.read()) + io.seek(0) + await asyncio.sleep(0.2) + fake_task = functools.partial(self.blocking, io=io, id=ctx.message.id) + task = self.bot.loop.run_in_executor(None, fake_task) + try: + video_file = await asyncio.wait_for(task, timeout=300) + except asyncio.TimeoutError as e: + log.error("Timeout creating stickbug video", exc_info=e) + return await ctx.send("Timeout creating stickbug video.") + except Exception: + log.exception("Error sending stick bugged video") + return await ctx.send( + "An error occured during the creation of the stick bugged video" + ) + fp = cog_data_path(self) / f"{ctx.message.id}stick.mp4" + file = discord.File(str(fp), filename="stick.mp4") + try: + await ctx.send(files=[file]) + except Exception as e: + log.error("Error sending stick bugged video", exc_info=e) + try: + os.remove(fp) + except Exception as e: + log.error("Error deleting stick bugged video", exc_info=e) diff --git a/theme/__init__.py b/theme/__init__.py new file mode 100644 index 0000000..c7118cf --- /dev/null +++ b/theme/__init__.py @@ -0,0 +1,10 @@ +from redbot.core.bot import Red +from redbot.core.utils import get_end_user_data_statement_or_raise + +__red_end_user_data_statement__ = get_end_user_data_statement_or_raise(__file__) + +from .theme import Theme + + +async def setup(bot: Red): + await bot.add_cog(Theme()) diff --git a/theme/info.json b/theme/info.json new file mode 100644 index 0000000..31608c3 --- /dev/null +++ b/theme/info.json @@ -0,0 +1,16 @@ +{ + "author": [ + "Zephyrkul (Zephyrkul #1089)" + ], + "install_msg": "Usage: `[p]help theme`. Requires the Audio cog to function.", + "name": "Theme", + "short": "Allows you to set themes to easily play accross all servers.", + "description": "Allows you to set themes to easily play accross all servers.", + "min_bot_version": "3.5.0", + "tags": [ + "music", + "audio", + "fun" + ], + "end_user_data_statement": "This cog stores data provided via command by users for the purposes of replaying." +} diff --git a/theme/theme.py b/theme/theme.py new file mode 100644 index 0000000..9ba319c --- /dev/null +++ b/theme/theme.py @@ -0,0 +1,166 @@ +from io import BytesIO +from random import choice + +import discord +from redbot.core import Config, commands +from redbot.core.i18n import Translator, cog_i18n +from redbot.core.utils.chat_formatting import bold, italics, pagify, warning +from redbot.core.utils.menus import menu + +_ = Translator("Theme", __file__) + + +def theme_strip(argument): + return [t.strip().strip('"<>"') for t in argument.split(",")] # noqa: B005 + + +@cog_i18n(_) +class Theme(commands.Cog): + """ + Allows you to set themes to easily play accross all servers. + """ + + async def red_get_data_for_user(self, *, user_id): + if themes := await self.config.user_from_id(user_id).themes(): + themes_text = "\n".join(themes) + bio = BytesIO( + (f"You currently have the following theme songs saved:\n{themes_text}").encode( + "utf-8" + ) + ) + bio.seek(0) + return {f"{self.__class__.__name__}.txt": bio} + return {} # No data to get + + async def red_delete_data_for_user(self, *, requester, user_id): + # Nothing here is operational, so just delete it all + await self.config.user_from_id(user_id).clear() + + def __init__(self): + super().__init__() + self.config = Config.get_conf(self, identifier=2_113_674_295, force_registration=True) + self.config.register_user(themes=[]) + + @commands.group(invoke_without_command=True, aliases=["themes"]) + @commands.guild_only() + async def theme(self, ctx, *, user: discord.User = None): + """ + Play, view, or configure a user's set theme song(s). + """ + if not ctx.invoked_subcommand: + await ctx.invoke(self.theme_play, user=user) + + @theme.command(name="play") + @commands.guild_only() + async def theme_play(self, ctx, *, user: discord.User = None): + """ + Play a user's set theme song(s). + """ + play = ctx.bot.get_command("play") + if not play: + return await ctx.send(warning(_("Audio cog is not loaded."))) + if not user: + user = ctx.author + themes = await self.maybe_bot_themes(ctx, user) + if not themes: + return await ctx.send(_("{} has not set any themes.").format(user.name)) + theme = choice(themes) + await ctx.invoke(play, query=theme) + + @theme.command(name="add") + async def theme_add(self, ctx, *, new_themes: theme_strip): + """ + Adds the specified themes to your theme list. + + Comma-seperated list. + """ + async with self.config.user(ctx.author).themes() as themes: + themes[:] = set(themes).union(new_themes) + await ctx.send(_("Themes added.")) + + @theme.command(name="remove") + async def theme_remove(self, ctx, *, themes_to_remove: theme_strip): + """ + Removes the specified themes from your theme list. + + Comma-seperated list. + """ + async with self.config.user(ctx.author).themes() as themes: + if not themes: + return await ctx.send(_("You have no themes to remove.")) + themes[:] = set(themes).difference(themes_to_remove) + await ctx.send(_("Themes removed.")) + + @theme.command(name="clear") + async def theme_clear(self, ctx): + """ + Clear your list of themes. + + \N{WARNING SIGN} This action cannot be undone. + """ + if not await self.config.user(ctx.author).themes(): + return await ctx.send(_("You have no themes to remove.")) + + async def clear(ctx, pages, controls, message, *_): + try: + await message.clear_reactions() + except discord.Forbidden: + for key in controls.keys(): + await message.remove_reaction(key, ctx.bot.user) + + async def yes(*args): + # pylint: disable=E1120 + await clear(*args) + return True + + async def no(*args): + # pylint: disable=E1120 + await clear(*args) + return False + + reply = await menu( + ctx, + [_("Are you sure you wish to clear your themes?")], + {"\N{WHITE HEAVY CHECK MARK}": yes, "\N{CROSS MARK}": no}, + ) + if reply: + await self.config.user(ctx.author).clear() + await ctx.send(_("Themes cleared.")) + else: + await ctx.send(_("Okay, I haven't cleared your themes.")) + + @theme.command(name="list") + async def theme_list(self, ctx, *, user: discord.User = None): + """ + Lists your currently set themes. + """ + if not user: + user = ctx.author + themes = await self.maybe_bot_themes(ctx, user) + if themes: + message = self.pretty_themes(bold(_("{}'s Themes")).format(user.name), themes) + else: + message = "{}\n\n{}".format( + bold(_("{0}'s Themes")), italics(_("{0} has not set any themes.")) + ).format(user.name) + for msg in pagify(message): + await ctx.maybe_send_embed(msg) + + async def maybe_bot_themes(self, ctx, user): + if user == ctx.bot.user: + return ( + "https://youtu.be/zGTkAVsrfg8", + "https://youtu.be/cGMWL8cOeAU", + "https://youtu.be/vFrjMq4aL-g", + "https://youtu.be/WROI5WYBU_A", + "https://youtu.be/41tIUr_ex3g", + "https://youtu.be/f9O2Rjn1azc", + ) + elif user.bot: + return ("https://youtu.be/nMyoI-Za6z8",) + else: + return await self.config.user(user).themes() + + def pretty_themes(self, pre, themes): + themes = "\n".join(f"<{theme}>" for theme in themes) + return f"{pre}\n\n{themes}" diff --git a/tickettool/README.rst b/tickettool/README.rst new file mode 100644 index 0000000..e027d53 --- /dev/null +++ b/tickettool/README.rst @@ -0,0 +1,205 @@ +.. _tickettool: +========== +TicketTool +========== + +This is the cog guide for the ``TicketTool`` cog. This guide contains the collection of commands which you can use in the cog. +Through this guide, ``[p]`` will always represent your prefix. Replace ``[p]`` with your own prefix when you use these commands in Discord. + +.. note:: + + Ensure that you are up to date by running ``[p]cog update tickettool``. + If there is something missing, or something that needs improving in this documentation, feel free to create an issue `here `_. + This documentation is generated everytime this cog receives an update. + +--------------- +About this cog: +--------------- + +A cog to manage a Tickets system! + +--------- +Commands: +--------- + +Here are all the commands included in this cog (48): + +* ``[p]settickettool`` + Configure TicketTool for your server. + +* ``[p]settickettool adminroles `` + Users with this role will have full permissions for tickets, but will not be able to set up the cog. + +* ``[p]settickettool auditlogs `` + On all requests to the Discord api regarding the ticket (channel modification), does the bot send the name and id of the user who requested the action as the reason? + +* ``[p]settickettool categoryclose `` + Set the category where the closed tickets will be. + +* ``[p]settickettool categoryopen `` + Set the category where the opened tickets will be. + +* ``[p]settickettool closeconfirmation `` + Should the bot ask for confirmation before closing the ticket (deletion will necessarily have a confirmation)? + +* ``[p]settickettool closeonleave `` + If a user leaves the server, will all their open tickets be closed? + +* ``[p]settickettool createonreact `` + Create a ticket when the reaction 🎟️ is set on any message on the server. + +* ``[p]settickettool custommessage `` + This message will be sent in the ticket channel when the ticket is opened. + +* ``[p]settickettool custommodal `` + Ask a maximum of 5 questions to the user who opens a ticket, with a Discord Modal. + +* ``[p]settickettool deleteonclose `` + Does closing the ticket directly delete it (with confirmation)? + +* ``[p]settickettool dynamicchannelname `` + Set the template that will be used to name the channel when creating a ticket. + +* ``[p]settickettool enable `` + Enable the system. + +* ``[p]settickettool forumchannel `` + Set the forum channel where the opened tickets will be, or a text channel to use private threads. If it's set, `category_open` and `category_close` will be ignored (except for existing tickets). + +* ``[p]settickettool logschannel `` + Set the channel where the logs will be sent/saved. + +* ``[p]settickettool message [channel] [message] [reason_options]... [emoji=🎟️] [label]`` + Send a message with a button to open a ticket or dropdown with possible reasons. + +* ``[p]settickettool modalconfig [confirmation=False]`` + Set all settings for the cog with a Discord Modal. + +* ``[p]settickettool modlog `` + Does the bot create an action in the bot modlog when a ticket is created? + +* ``[p]settickettool nbmax `` + Sets the maximum number of open tickets a user can have on the system at any one time (for a profile only). + +* ``[p]settickettool pingroles `` + This role will be pinged automatically when the ticket is created, but does not give any additional permissions. + +* ``[p]settickettool profileadd `` + Create a new profile with defaults settings. + +* ``[p]settickettool profileclone `` + Clone an existing profile with his settings. + +* ``[p]settickettool profileremove [confirmation=False]`` + Remove an existing profile. + +* ``[p]settickettool profilerename `` + Rename an existing profile. + +* ``[p]settickettool profileslist`` + List the existing profiles. + +* ``[p]settickettool renamechanneldropdown `` + With Dropdowns feature, rename the ticket channel with chosen reason. + +* ``[p]settickettool resetsetting `` + Reset a setting. + +* ``[p]settickettool showsettings [with_dev=False]`` + Show all settings for the cog with defaults and values. + +* ``[p]settickettool supportroles `` + Users with this role will be able to participate and claim the ticket. + +* ``[p]settickettool ticketrole `` + This role will be added automatically to open tickets owners. + +* ``[p]settickettool usercanclose `` + Can the author of the ticket, if he/she does not have a role set up for the system, close the ticket himself? + +* ``[p]settickettool viewroles `` + Users with this role will only be able to read messages from the ticket, but not send them. + +* ``[p]ticket`` + Commands for using the Tickets system. + +* ``[p]ticket addmember [members]...`` + Add a member to an existing Ticket. + +* ``[p]ticket claim [member] [reason=No reason provided.]`` + Claim an existing Ticket. + +* ``[p]ticket close [confirmation] [reason=No reason provided.]`` + Close an existing Ticket. + +* ``[p]ticket create [profile] [reason=No reason provided.]`` + Create a Ticket. + +* ``[p]ticket createfor [profile] [reason=No reason provided.]`` + Create a Ticket for a member. + +* ``[p]ticket delete [confirmation=False] [reason=No reason provided.]`` + Delete an existing Ticket. + +* ``[p]ticket export`` + Export all the messages of an existing Ticket in html format. + +* ``[p]ticket list ["open"|"close"|"all"] [owner]`` + List the existing Tickets for a profile. You can provide a status and/or a ticket owner. + +* ``[p]ticket lock [confirmation] [reason=No reason provided.]`` + Lock an existing Ticket. + +* ``[p]ticket open [reason=No reason provided.]`` + Open an existing Ticket. + +* ``[p]ticket owner [reason=No reason provided.]`` + Change the owner of an existing Ticket. + +* ``[p]ticket removemember [members]...`` + Remove a member to an existing Ticket. + +* ``[p]ticket rename [reason=No reason provided.]`` + Rename an existing Ticket. + +* ``[p]ticket unclaim [reason=No reason provided.]`` + Unclaim an existing Ticket. + +* ``[p]ticket unlock [reason=No reason provided.]`` + Unlock an existing locked Ticket. + +------------ +Installation +------------ + +If you haven't added my repo before, lets add it first. We'll call it "AAA3A-cogs" here. + +.. code-block:: ini + + [p]repo add AAA3A-cogs https://github.com/AAA3A-AAA3A/AAA3A-cogs + +Now, we can install TicketTool. + +.. code-block:: ini + + [p]cog install AAA3A-cogs tickettool + +Once it's installed, it is not loaded by default. Load it by running the following command: + +.. code-block:: ini + + [p]load tickettool + +---------------- +Further Support: +---------------- + +Check out my docs `here `_. +Mention me in the #support_other-cogs in the `cog support server `_ if you need any help. +Additionally, feel free to open an issue or pull request to this repo. + +-------- +Credits: +-------- + +Thanks to Kreusada for the Python code to automatically generate this documentation! \ No newline at end of file diff --git a/tickettool/__init__.py b/tickettool/__init__.py new file mode 100644 index 0000000..d9d38d3 --- /dev/null +++ b/tickettool/__init__.py @@ -0,0 +1,46 @@ +from redbot.core import errors # isort:skip +import importlib +import sys + +try: + import AAA3A_utils +except ModuleNotFoundError: + raise errors.CogLoadError( + "The needed utils to run the cog were not found. Please execute the command `[p]pipinstall git+https://github.com/AAA3A-AAA3A/AAA3A_utils.git`. A restart of the bot isn't necessary." + ) +modules = sorted( + [module for module in sys.modules if module.split(".")[0] == "AAA3A_utils"], reverse=True +) +for module in modules: + try: + importlib.reload(sys.modules[module]) + except ModuleNotFoundError: + pass +del AAA3A_utils +# import AAA3A_utils +# import json +# import os +# __version__ = AAA3A_utils.__version__ +# with open(os.path.join(os.path.dirname(__file__), "utils_version.json"), mode="r") as f: +# data = json.load(f) +# needed_utils_version = data["needed_utils_version"] +# if __version__ > needed_utils_version: +# raise errors.CogLoadError( +# "The needed utils to run the cog has a higher version than the one supported by this version of the cog. Please update the cogs of the `AAA3A-cogs` repo." +# ) +# elif __version__ < needed_utils_version: +# raise errors.CogLoadError( +# "The needed utils to run the cog has a lower version than the one supported by this version of the cog. Please execute the command `[p]pipinstall --upgrade git+https://github.com/AAA3A-AAA3A/AAA3A_utils.git`. A restart of the bot isn't necessary." +# ) + +from redbot.core.bot import Red # isort:skip +from redbot.core.utils import get_end_user_data_statement + +from .tickettool import TicketTool + +__red_end_user_data_statement__ = get_end_user_data_statement(file=__file__) + + +async def setup(bot: Red) -> None: + cog = TicketTool(bot) + await bot.add_cog(cog) diff --git a/tickettool/dashboard_integration.py b/tickettool/dashboard_integration.py new file mode 100644 index 0000000..1e7cd7e --- /dev/null +++ b/tickettool/dashboard_integration.py @@ -0,0 +1,39 @@ +from redbot.core import commands # isort:skip +from redbot.core.bot import Red # isort:skip +import typing # isort:skip + + +def dashboard_page(*args, **kwargs): + def decorator(func: typing.Callable): + func.__dashboard_decorator_params__ = (args, kwargs) + return func + + return decorator + + +class DashboardIntegration: + bot: Red + + @commands.Cog.listener() + async def on_dashboard_cog_add(self, dashboard_cog: commands.Cog) -> None: + if hasattr(self, "settings") and hasattr(self.settings, "commands_added"): + await self.settings.commands_added.wait() + dashboard_cog.rpc.third_parties_handler.add_third_party(self) + + @dashboard_page(name="transcript") + async def rpc_callback_transcript( + self, attachment_url: str, **kwargs + ) -> typing.Dict[str, typing.Any]: + if not attachment_url.startswith("https://cdn.discordapp.com/attachments/"): + if len(attachment_url.split("-")) >= 3: + attachment_url = f"{attachment_url.split('-')[0]}/{attachment_url.split('-')[1]}/{'-'.join(attachment_url.split('-')[2:])}" + elif len(attachment_url.split("_")) >= 3: + attachment_url = f"{attachment_url.split('_')[0]}/{attachment_url.split('_')[1]}/{'_'.join(attachment_url.split('_')[2:])}" + attachment_url = f"https://cdn.discordapp.com/attachments/{attachment_url}" + return { + "status": 0, + "web_content": { + "source": '', + "attachment_url": attachment_url, + }, + } diff --git a/tickettool/info.json b/tickettool/info.json new file mode 100644 index 0000000..87e2ade --- /dev/null +++ b/tickettool/info.json @@ -0,0 +1,15 @@ +{ + "author": ["AAA3A"], + "name": "TicketTool", + "install_msg": "Thank you for installing this cog!\nDo `[p]help CogName` to get the list of commands and their description. If you enjoy my work, please consider donating on [Buy Me a Coffee]() or [Ko-Fi]()!", + "short": "A cog to manage a Tickets system!", + "description": "Have you ever wanted to set up a Tickets system, with many options for the user and the support team, on your server? Then this cog is for you! It has many settings, buttons, a reaction to create the ticket, many commands working in the ticket channel, different roles with access to different options... There is also a system of panels!", + "tags": [ + "tickets", + "tool", + "system" + ], + "requirements": ["git+https://github.com/AAA3A-AAA3A/AAA3A_utils.git", "chat-exporter", "emoji"], + "min_bot_version": "3.5.0", + "end_user_data_statement": "This cog records all the data needed to operate the ticket system. It records the reason for the ticket, the open/close dates, the members who have opened/closed/claimed a ticket. Apart from deleting the ticket with `[p]ticket delete`, this cog is not configured to delete this operational data. The reason for a user's tickets can be communicated to OpenAI if the user requests informations about their own open tickets with the Vert's Assistant cog." +} \ No newline at end of file diff --git a/tickettool/locales/de-DE.po b/tickettool/locales/de-DE.po new file mode 100644 index 0000000..f51c6f8 --- /dev/null +++ b/tickettool/locales/de-DE.po @@ -0,0 +1,584 @@ +msgid "" +msgstr "" +"Project-Id-Version: aaa3a-cogs\n" +"POT-Creation-Date: 2024-07-20 22:15+0200\n" +"PO-Revision-Date: 2024-07-21 15:13\n" +"Last-Translator: \n" +"Language-Team: German\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: redgettext 3.4.2\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Crowdin-Project: aaa3a-cogs\n" +"X-Crowdin-Project-ID: 531090\n" +"X-Crowdin-Language: de\n" +"X-Crowdin-File: /[AAA3A-AAA3A.AAA3A-cogs] main/tickettool/locales/messages.pot\n" +"X-Crowdin-File-ID: 102\n" +"Language: de_DE\n" + +#: tickettool\settings.py:15 tickettool\settings.py:18 +#: tickettool\tickettool.py:759 tickettool\tickettool.py:762 +msgid "This profile does not exist." +msgstr "Dieses Profil existiert nicht." + +#: tickettool\settings.py:27 +msgid "I have to be the author of the message. You can use EmbedUtils by AAA3A to send one." +msgstr "Ich muss der Verfasser der Nachricht sein. Sie können EmbedUtils von AAA3A verwenden, um eine zu senden." + +#: tickettool\settings.py:54 +#, docstring +msgid "Send a message with a button to open a ticket or dropdown with possible reasons.\n\n" +" Examples:\n" +" - `[p]settickettool message #general \"🐛|Report a bug|If you find a bug, report it here.|bug\" \"⚠️|Report a user|If you find a malicious user, report it here.|user\"`\n" +" - `[p]settickettool 1234567890-0987654321`\n" +" " +msgstr "Senden Sie eine Nachricht mit einer Schaltfläche zum Öffnen eines Tickets oder einem Dropdown-Menü mit möglichen Gründen.\n\n" +" Beispiele:\n" +" - `[p]settickettool message #general \"🐛|Report a bug|If you find a bug, report it here.|bug\" \"⚠️|Report a user|If you find a malicious user, report it here.|user\"`\n" +" - `[p]settickettool 1234567890-0987654321`\n" +" " + +#: tickettool\settings.py:70 +msgid "I don't have sufficient permissions in this channel to view it and to send messages into." +msgstr "Ich habe keine ausreichenden Berechtigungen in diesem Kanal, um ihn zu sehen und Nachrichten zu senden." + +#: tickettool\settings.py:97 tickettool\tickettool.py:339 +msgid "Create ticket" +msgstr "Ticket erstellen" + +#: tickettool\settings.py:116 +msgid "A different value must be provided for each dropdown option." +msgstr "Für jede Dropdown-Option muss ein anderer Wert angegeben werden." + +#: tickettool\settings.py:124 +msgid "An emoji you selected seems invalid. Check that it is an emoji. If you have Nitro, you may have used a custom emoji from another server." +msgstr "Ein von Ihnen ausgewähltes Emoji scheint ungültig zu sein. Prüfen Sie, ob es sich um ein Emoji handelt. Wenn Sie Nitro haben, haben Sie möglicherweise ein benutzerdefiniertes Emoji von einem anderen Server verwendet." + +#: tickettool\ticket.py:245 +msgid "Creating the ticket {ticket.id}." +msgstr "Erstellen des Tickets {ticket.id}." + +#: tickettool\ticket.py:266 +msgid "The dynamic channel name does not contain correct variable names and must be re-configured with `[p]settickettool dynamicchannelname`." +msgstr "Der dynamische Kanalname enthält keine korrekten Variablennamen und muss mit \"[p]settickettool dynamicchannelname\" neu konfiguriert werden." + +#: tickettool\ticket.py:275 tickettool\ticket.py:528 tickettool\ticket.py:890 +#: tickettool\ticket.py:969 tickettool\tickettool.py:352 +msgid "Close" +msgstr "Schließen" + +#: tickettool\ticket.py:282 tickettool\ticket.py:535 tickettool\ticket.py:615 +#: tickettool\ticket.py:897 tickettool\ticket.py:976 +#: tickettool\tickettool.py:366 +msgid "Claim" +msgstr "Beanspruchen" + +#: tickettool\ticket.py:289 tickettool\ticket.py:542 tickettool\ticket.py:622 +#: tickettool\ticket.py:904 tickettool\ticket.py:983 +#: tickettool\tickettool.py:373 +msgid "Delete" +msgstr "Löschen" + +#: tickettool\ticket.py:303 tickettool\ticket.py:429 +msgid "Ticket Created" +msgstr "Ticket erstellt" + +#: tickettool\ticket.py:304 +msgid "Thank you for creating a ticket on this server!" +msgstr "Danke, dass Sie ein Ticket auf diesem Server erstellt haben!" + +#: tickettool\ticket.py:315 +msgid "🎟️ Ticket ID: {ticket.id}\n" +"🕵️ Ticket created by: @{ticket.created_by.display_name} ({ticket.created_by.id})\n" +"☢️ Ticket reason: {short_reason}\n" +msgstr "🎟️ Ticket-ID: {ticket.id}\n" +"🕵️ Ticket erstellt von: @{ticket.created_by.display_name} ({ticket.created_by.id})\n" +"☢️ Ticketgrund: {short_reason}\n" + +#: tickettool\ticket.py:395 +msgid "⚠ At least one user (the ticket owner or a team member) could not be added to the ticket thread. Maybe the user doesn't have access to the parent forum/text channel. If the server uses private threads in a text channel, the bot does not have the `manage_messages` permission in this channel." +msgstr "Mindestens ein Benutzer (der Ticketbesitzer oder ein Teammitglied) konnte nicht zum Ticket-Thread hinzugefügt werden. Vielleicht hat der Benutzer keinen Zugriff auf das übergeordnete Forum/den Textkanal. Wenn der Server private Threads in einem Textchannel verwendet, hat der Bot nicht die Berechtigung `manage_messages` in diesem Channel." + +#: tickettool\ticket.py:430 +msgid "The ticket was created by {ticket.created_by}." +msgstr "Das Ticket wurde von {ticket.created_by}erstellt." + +#: tickettool\ticket.py:436 +msgid "Report on the creation of the ticket {ticket.id}." +msgstr "Bericht über die Erstellung des Tickets {ticket.id}." + +#: tickettool\ticket.py:476 +msgid "Opening the ticket {ticket.id}." +msgstr "Öffnen des Tickets {ticket.id}." + +#: tickettool\ticket.py:505 tickettool\ticket.py:513 +msgid "Ticket Opened" +msgstr "Ticket geöffnet" + +#: tickettool\ticket.py:514 +msgid "The ticket was opened by {ticket.opened_by}." +msgstr "Das Ticket wurde von {ticket.opened_by}eröffnet." + +#: tickettool\ticket.py:520 tickettool\ticket.py:600 +msgid "Report on the close of the ticket {ticket.id}." +msgstr "Bericht über den Abschluss des Tickets {ticket.id}." + +#: tickettool\ticket.py:608 tickettool\tickettool.py:359 +msgid "Re-open" +msgstr "Wiedereröffnen" + +#: tickettool\ticket.py:675 tickettool\ticket.py:712 +#: tickettool\tickettool.py:1100 tickettool\tickettool.py:1142 +msgid "Cannot execute action on a text channel." +msgstr "Aktion kann nicht auf einem Textkanal ausgeführt werden." + +#: tickettool\ticket.py:701 +msgid "Report on the lock of the ticket {ticket.id}." +msgstr "Bericht über die Sperre des Tickets {ticket.id}." + +#: tickettool\ticket.py:738 +msgid "Report on the unlock of the ticket {ticket.id}." +msgstr "Bericht über die Freischaltung des Tickets {ticket.id}." + +#: tickettool\ticket.py:755 +msgid "Renaming the ticket {ticket.id}. (`{ticket.channel.name}` to `{new_name}`)" +msgstr "Umbenennung des Tickets {ticket.id}. (`{ticket.channel.name}` in `{new_name}`)" + +#: tickettool\ticket.py:765 +msgid "Ticket Renamed." +msgstr "Ticket umbenannt." + +#: tickettool\ticket.py:783 +msgid "Ticket Deleted" +msgstr "Ticket Gelöscht" + +#: tickettool\ticket.py:784 +msgid "The ticket was deleted by {ticket.deleted_by}." +msgstr "Das Ticket wurde von {ticket.deleted_by}gelöscht." + +#: tickettool\ticket.py:807 +msgid "Report on the deletion of the ticket {ticket.id}." +msgstr "Bericht über die Löschung des Tickets {ticket.id}." + +#: tickettool\ticket.py:824 +msgid "Deleting the ticket {ticket.id}." +msgstr "Löschung des Tickets {ticket.id}." + +#: tickettool\ticket.py:845 +msgid "A ticket cannot be claimed if it is closed." +msgstr "Ein Ticket kann nicht beansprucht werden, wenn es geschlossen ist." + +#: tickettool\ticket.py:849 +msgid "A bot cannot claim a ticket." +msgstr "Ein Bot kann keinen Anspruch auf ein Ticket erheben." + +#: tickettool\ticket.py:863 +msgid "Claiming the ticket {ticket.id}." +msgstr "Beantragung des Tickets {ticket.id}." + +#: tickettool\ticket.py:918 +msgid "Ticket claimed." +msgstr "Eintrittskarte gefordert." + +#: tickettool\ticket.py:932 +msgid "A ticket cannot be unclaimed if it is closed." +msgstr "Ein Ticket kann nicht mehr zurückgefordert werden, wenn es geschlossen ist." + +#: tickettool\ticket.py:948 +msgid "Unclaiming the ticket {ticket.id}." +msgstr "Rücknahme des Tickets {ticket.id}." + +#: tickettool\ticket.py:997 +msgid "Ticket unclaimed." +msgstr "Ticket nicht abgeholt." + +#: tickettool\ticket.py:1011 +msgid "Cannot execute action in a thread channel." +msgstr "Aktion kann nicht in einem Thread-Kanal ausgeführt werden." + +#: tickettool\ticket.py:1018 +msgid "Changing owner of the ticket {ticket.id}." +msgstr "Wechsel des Besitzers des Tickets {ticket.id}." + +#: tickettool\ticket.py:1022 +msgid "You cannot transfer ownership of a ticket to a bot." +msgstr "Sie können das Eigentum an einem Ticket nicht auf einen Bot übertragen." + +#: tickettool\ticket.py:1051 +msgid "Owner Modified." +msgstr "Eigentümer Geändert." + +#: tickettool\ticket.py:1070 +msgid "Adding a member to the ticket {ticket.id}." +msgstr "Hinzufügen eines Mitglieds zum Ticket {ticket.id}." + +#: tickettool\ticket.py:1077 tickettool\ticket.py:1114 +msgid "You cannot add a bot to a ticket. ({member})" +msgstr "Sie können einen Bot nicht zu einem Ticket hinzufügen. ({member})" + +#: tickettool\ticket.py:1081 tickettool\ticket.py:1118 +msgid "This member is already the owner of this ticket. ({member})" +msgstr "Dieses Mitglied ist bereits der Besitzer dieses Tickets. ({member})" + +#: tickettool\ticket.py:1087 tickettool\ticket.py:1124 +msgid "This member is an administrator for the tickets system. They will always have access to the ticket anyway. ({member})" +msgstr "Dieses Mitglied ist ein Administrator für das Ticketsystem. Er hat sowieso immer Zugriff auf das Ticket. ({member})" + +#: tickettool\ticket.py:1093 tickettool\ticket.py:1130 +msgid "This member already has access to this ticket. ({member})" +msgstr "Dieses Mitglied hat bereits Zugang zu diesem Ticket. ({member})" + +#: tickettool\ticket.py:1144 +msgid "⚠ At least one user (the ticket owner or a team member) could not be added to the ticket thread. Maybe the user the user doesn't have access to the parent forum/text channel. If the server uses private threads in a text channel, the bot does not have the `manage_messages` permission in this channel." +msgstr "Mindestens ein Benutzer (der Ticketbesitzer oder ein Teammitglied) konnte nicht zum Ticket-Thread hinzugefügt werden. Vielleicht hat der Benutzer keinen Zugriff auf das übergeordnete Forum/den Textkanal. Wenn der Server private Threads in einem Textchannel verwendet, hat der Bot nicht die Berechtigung `manage_messages` in diesem Channel." + +#: tickettool\ticket.py:1168 +msgid "Removing a member to the ticket {ticket.id}." +msgstr "Entfernen eines Mitglieds aus dem Ticket {ticket.id}." + +#: tickettool\ticket.py:1174 tickettool\ticket.py:1204 +msgid "You cannot remove a bot to a ticket ({member})." +msgstr "Sie können einen Bot nicht zu einem Ticket entfernen ({member})." + +#: tickettool\ticket.py:1180 tickettool\ticket.py:1210 +msgid "You cannot remove the owner of this ticket. ({member})" +msgstr "Sie können den Besitzer dieses Tickets nicht entfernen. ({member})" + +#: tickettool\ticket.py:1186 tickettool\ticket.py:1216 +msgid "This member is an administrator for the tickets system. They will always have access to the ticket. ({member})" +msgstr "Dieses Mitglied ist ein Administrator für das Ticketsystem. Er hat immer Zugriff auf das Ticket. ({member})" + +#: tickettool\ticket.py:1192 tickettool\ticket.py:1222 +msgid "This member is not in the list of those authorised to access the ticket. ({member})" +msgstr "Dieses Mitglied ist nicht in der Liste der zum Zugriff auf das Ticket berechtigten Personen aufgeführt. ({member})" + +#: tickettool\tickettool.py:32 +#, docstring +msgid "A cog to manage a tickets system!" +msgstr "Ein Rädchen zur Verwaltung eines Ticketsystems!" + +#: tickettool\tickettool.py:74 +msgid "To get help on this server or to make an order for example, you can create a ticket.\n" +"Just use the command `{prefix}ticket create` or click on the button below.\n" +"You can then use the `{prefix}ticket` subcommands to manage your ticket." +msgstr "Um Hilfe auf diesem Server zu erhalten oder um eine Bestellung aufzugeben, können Sie ein Ticket erstellen.\n" +"Benutzen Sie dazu den Befehl `{prefix}ticket create` oder klicken Sie auf die Schaltfläche unten.\n" +"Sie können dann die Unterbefehle `{prefix}ticket` verwenden, um Ihr Ticket zu verwalten." + +#: tickettool\tickettool.py:403 +msgid "Choose the reason for open a ticket." +msgstr "Wählen Sie den Grund für die Eröffnung eines Tickets." + +#: tickettool\tickettool.py:521 +msgid "Action taken for the ticket system." +msgstr "Maßnahmen für das Ticketsystem ergriffen." + +#: tickettool\tickettool.py:555 +msgid "Ticket ID:" +msgstr "Ticket-ID:" + +#: tickettool\tickettool.py:558 +msgid "Owned by:" +msgstr "Im Besitz von:" + +#: tickettool\tickettool.py:566 +msgid "Channel:" +msgstr "Kanal:" + +#: tickettool\tickettool.py:573 +msgid "Closed by:" +msgstr "Geschlossen von:" + +#: tickettool\tickettool.py:581 +msgid "Deleted by:" +msgstr "Gelöscht von:" + +#: tickettool\tickettool.py:589 +msgid "Closed at:" +msgstr "Geschlossen am:" + +#: tickettool\tickettool.py:596 tickettool\tickettool.py:622 +msgid "Reason:" +msgstr "Der Grund:" + +#: tickettool\tickettool.py:607 +msgid "Ticket [{ticket.profile}] {ticket.id} - Action taken" +msgstr "Ticket [{ticket.profile}] {ticket.id} - Maßnahme ergriffen" + +#: tickettool\tickettool.py:687 +msgid "You're not in a ticket." +msgstr "Sie haben keinen Strafzettel bekommen." + +#: tickettool\tickettool.py:691 +msgid "This ticket isn't {status}ed." +msgstr "Dieses Ticket ist nicht {status}." + +#: tickettool\tickettool.py:700 +msgid "This ticket is {status}." +msgstr "Dieses Ticket ist {status}." + +#: tickettool\tickettool.py:709 +msgid "You're not allowed to lock this ticket." +msgstr "Sie dürfen dieses Ticket nicht sperren." + +#: tickettool\tickettool.py:752 +msgid "You're not allowed to view this ticket." +msgstr "Sie sind nicht berechtigt, dieses Ticket zu sehen." + +#: tickettool\tickettool.py:786 +msgid "Please provide a profile." +msgstr "Bitte erstellen Sie ein Profil." + +#: tickettool\tickettool.py:789 +msgid "No profile has been created on this server." +msgstr "Auf diesem Server wurde noch kein Profil erstellt." + +#: tickettool\tickettool.py:797 +msgid "The ticket system is not enabled on this server. Please ask an administrator of this server to use the `{ctx.prefix}settickettool` subcommands to configure it." +msgstr "Das Ticketsystem ist auf diesem Server nicht aktiviert. Bitten Sie einen Administrator dieses Servers, es mit den Unterbefehlen `{ctx.prefix}settickettool` zu konfigurieren." + +#: tickettool\tickettool.py:803 +msgid "The category `open` or the category `close` have not been configured. Please ask an administrator of this server to use the `{ctx.prefix}settickettool` subcommands to configure it." +msgstr "Die Kategorie `open` oder die Kategorie `close` wurde nicht konfiguriert. Bitten Sie einen Administrator dieses Servers, die Unterbefehle \"{ctx.prefix}settickettool\" zu verwenden, um sie zu konfigurieren." + +#: tickettool\tickettool.py:810 +msgid "Sorry. You have already reached the limit of {limit} open tickets." +msgstr "Entschuldigung. Sie haben bereits das Limit von {limit} offenen Tickets erreicht." + +#: tickettool\tickettool.py:821 +msgid "The bot does not have `manage_channels` permission on the `open` and `close` categories to allow the ticket system to function properly. Please notify an administrator of this server." +msgstr "Der Bot hat nicht die Berechtigung `manage_channels` für die Kategorien `open` und `close`, damit das Ticketsystem richtig funktioniert. Bitte benachrichtigen Sie einen Administrator dieses Servers." + +#: tickettool\tickettool.py:830 +msgid "The bot does not have `manage_channel` permission in the forum channel to allow the ticket system to function properly. Please notify an administrator of this server." +msgstr "Der Bot hat nicht die Berechtigung `manage_channel` im Forumskanal, damit das Ticketsystem richtig funktioniert. Bitte benachrichtigen Sie einen Administrator dieses Servers." + +#: tickettool\tickettool.py:875 +msgid "Please provide the required informations by clicking on the button below." +msgstr "Bitte geben Sie die erforderlichen Informationen an, indem Sie auf die Schaltfläche unten klicken." + +#: tickettool\tickettool.py:926 +#, docstring +msgid "Create a Ticket.\n\n" +" If only one profile has been created on this server, you don't need to specify its name.\n" +" " +msgstr "Erstellen Sie ein Ticket.\n\n" +" Wenn auf diesem Server nur ein Profil erstellt wurde, müssen Sie dessen Namen nicht angeben.\n" +" " + +#: tickettool\tickettool.py:942 +#, docstring +msgid "Create a Ticket for a member.\n\n" +" If only one profile has been created on this server, you don't need to specify its name.\n" +" " +msgstr "Erstellen Sie ein Ticket für ein Mitglied.\n\n" +" Wenn auf diesem Server nur ein Profil erstellt wurde, müssen Sie den Namen nicht angeben.\n" +" " + +#: tickettool\tickettool.py:947 +msgid "You cannot create a ticket for a bot." +msgstr "Sie können kein Ticket für einen Bot erstellen." + +#: tickettool\tickettool.py:950 +msgid "You cannot create a ticket for a member with a higher or equal role." +msgstr "Sie können kein Ticket für ein Mitglied mit einer höheren oder gleichen Rolle erstellen." + +#: tickettool\tickettool.py:970 +#, docstring +msgid "Export all the messages of an existing Ticket in html format.\n" +" Please note: all attachments and user avatars are saved with the Discord link in this file.\n" +" " +msgstr "Exportiert alle Nachrichten eines bestehenden Tickets im html-Format.\n" +" Bitte beachten Sie: Alle Anhänge und Benutzeravatare werden mit dem Discord-Link in dieser Datei gespeichert.\n" +" " + +#: tickettool\tickettool.py:987 +msgid "Here is the html file of the transcript of all the messages in this ticket.\n" +"Please note: all attachments and user avatars are saved with the Discord link in this file." +msgstr "Hier ist die html-Datei der Abschrift aller Nachrichten in diesem Ticket.\n" +"Bitte beachten Sie: Alle Anhänge und Benutzeravatare werden mit dem Discord-Link in dieser Datei gespeichert." + +#: tickettool\tickettool.py:1019 +#, docstring +msgid "Open an existing Ticket." +msgstr "Öffnen Sie ein bestehendes Ticket." + +#: tickettool\tickettool.py:1024 +msgid "The ticket system is not enabled on this server." +msgstr "Das Ticketsystem ist auf diesem Server nicht aktiviert." + +#: tickettool\tickettool.py:1050 +#, docstring +msgid "Close an existing Ticket." +msgstr "Schließen Sie ein bestehendes Ticket." + +#: tickettool\tickettool.py:1061 +msgid "Do you really want to close the ticket {ticket.id}?" +msgstr "Wollen Sie das Ticket {ticket.id}wirklich schließen?" + +#: tickettool\tickettool.py:1097 +#, docstring +msgid "Lock an existing Ticket." +msgstr "Ein bestehendes Ticket sperren." + +#: tickettool\tickettool.py:1104 +msgid "Do you really want to lock the ticket {ticket.id}?" +msgstr "Wollen Sie das Ticket {ticket.id}wirklich sperren?" + +#: tickettool\tickettool.py:1139 +#, docstring +msgid "Unlock an existing locked Ticket." +msgstr "Entsperren Sie ein vorhandenes gesperrtes Ticket." + +#: tickettool\tickettool.py:1167 +#, docstring +msgid "Rename an existing Ticket." +msgstr "Ein bestehendes Ticket umbenennen." + +#: tickettool\tickettool.py:1193 +#, docstring +msgid "Delete an existing Ticket.\n\n" +" If a logs channel is defined, an html file containing all the messages of this ticket will be generated.\n" +" (Attachments are not supported, as they are saved with their Discord link)\n" +" " +msgstr "Ein bestehendes Ticket löschen.\n\n" +" Wenn ein Protokollkanal definiert ist, wird eine Html-Datei mit allen Nachrichten dieses Tickets erstellt.\n" +" (Anhänge werden nicht unterstützt, da sie mit ihrem Discord-Link gespeichert werden)\n" +" " + +#: tickettool\tickettool.py:1202 +msgid "Do you really want to delete all the messages of the ticket {ticket.id}?" +msgstr "Möchten Sie wirklich alle Nachrichten auf dem Ticket {ticket.id}löschen?" + +#: tickettool\tickettool.py:1206 +msgid "If a logs channel is defined, an html file containing all the messages of this ticket will be generated. (Attachments are not supported, as they are saved with their Discord link.)" +msgstr "Wenn ein Protokollkanal definiert ist, wird eine Html-Datei mit allen Nachrichten zu diesem Ticket erstellt. (Anhänge werden nicht unterstützt, da sie mit ihrem Discord-Link gespeichert werden.)" + +#: tickettool\tickettool.py:1242 +#, docstring +msgid "Claim an existing Ticket." +msgstr "Beanspruchen Sie ein bestehendes Ticket." + +#: tickettool\tickettool.py:1266 +#, docstring +msgid "Unclaim an existing Ticket." +msgstr "Beanspruchen Sie ein bestehendes Ticket zurück." + +#: tickettool\tickettool.py:1292 +#, docstring +msgid "Change the owner of an existing Ticket." +msgstr "Ändern Sie den Besitzer eines bestehenden Tickets." + +#: tickettool\tickettool.py:1318 +#, docstring +msgid "Add a member to an existing Ticket." +msgstr "Hinzufügen eines Mitglieds zu einem bestehenden Ticket." + +#: tickettool\tickettool.py:1343 +#, docstring +msgid "Remove a member to an existing Ticket." +msgstr "Entfernen Sie ein Mitglied aus einem bestehenden Ticket." + +#: tickettool\tickettool.py:1357 +#, docstring +msgid "List the existing Tickets for a profile. You can provide a status and/or a ticket owner." +msgstr "Listet die vorhandenen Tickets für ein Profil auf. Sie können einen Status und/oder einen Ticketbesitzer angeben." + +#: tickettool\tickettool.py:1378 +msgid "No tickets to show." +msgstr "Keine Tickets zu zeigen." + +#: tickettool\tickettool.py:1419 +msgid "The profile for which this button was configured no longer exists." +msgstr "Das Profil, für das diese Schaltfläche konfiguriert wurde, existiert nicht mehr." + +#: tickettool\tickettool.py:1482 tickettool\tickettool.py:1541 +#: tickettool\tickettool.py:1545 tickettool\tickettool.py:1563 +#: tickettool\tickettool.py:1567 tickettool\tickettool.py:1587 +#: tickettool\tickettool.py:1591 tickettool\tickettool.py:1661 +#: tickettool\tickettool.py:1665 +msgid "You are not allowed to execute this command." +msgstr "Sie sind nicht berechtigt, diesen Befehl auszuführen." + +#: tickettool\tickettool.py:1486 tickettool\tickettool.py:1491 +#: tickettool\tickettool.py:1495 +msgid "You have chosen to create a ticket." +msgstr "Sie haben sich für die Erstellung eines Tickets entschieden." + +#: tickettool\tickettool.py:1517 +msgid "You have chosen to close this ticket. If this is not done, you do not have the necessary permissions to execute this command." +msgstr "Sie haben sich entschieden, diese Anfrage zu schließen. Wenn dies nicht der Fall ist, verfügen Sie nicht über die erforderlichen Berechtigungen zur Ausführung dieses Befehls." + +#: tickettool\tickettool.py:1549 +msgid "You have chosen to re-open this ticket." +msgstr "Sie haben sich entschieden, dieses Ticket erneut zu öffnen." + +#: tickettool\tickettool.py:1571 +msgid "You have chosen to claim this ticket. If this is not done, you do not have the necessary permissions to execute this command." +msgstr "Sie haben sich entschieden, dieses Ticket zu beanspruchen. Wenn dies nicht der Fall ist, verfügen Sie nicht über die erforderlichen Berechtigungen, um diesen Befehl auszuführen." + +#: tickettool\tickettool.py:1611 +msgid "This message is not in TicketTool config." +msgstr "Diese Meldung ist nicht in der TicketTool-Konfiguration enthalten." + +#: tickettool\tickettool.py:1620 +msgid "The profile for which this dropdown was configured no longer exists." +msgstr "Das Profil, für das dieses Dropdown konfiguriert wurde, existiert nicht mehr." + +#: tickettool\tickettool.py:1687 tickettool\tickettool.py:1694 +msgid "You have chosen to create a ticket with the reason `{reason}`." +msgstr "Sie haben sich entschieden, ein Ticket mit dem Grund `{reason}` zu erstellen." + +#: tickettool\tickettool.py:1840 +msgid "No open tickets by this user in this server." +msgstr "Keine offenen Tickets von diesem Benutzer auf diesem Server." + +#: tickettool\utils.py:143 +msgid "Emoji Label must be An emoji followed by a label, and optionnaly by a description and a value (for rename ticket channel), separated by either `;`, `,`, `|`, or `-`." +msgstr "Emoji Label muss ein Emoji sein, gefolgt von einem Label und optional von einer Beschreibung und einem Wert (für rename ticket channel), getrennt durch `;`, `,`, `|`, oder `-`." + +#: tickettool\utils.py:160 +msgid "Error parsing YAML. Please make sure the format is valid (a YAML validator may help)" +msgstr "Fehler beim Parsen von YAML. Bitte stellen Sie sicher, dass das Format gültig ist (ein YAML-Validator kann helfen)" + +#: tickettool\utils.py:174 +msgid "You can only have 5 text inputs." +msgstr "Sie können nur 5 Texteingaben haben." + +#: tickettool\utils.py:180 +msgid "The argument `/{count}/{arg}` is required in the YAML." +msgstr "Das Argument `/{count}/{arg}` ist in der YAML erforderlich." + +#: tickettool\utils.py:187 +msgid "The argument `/{count}/{arg}` is invalid in the YAML. Check the spelling." +msgstr "Das Argument `/{count}/{arg}` ist in der YAML ungültig. Überprüfen Sie die Schreibweise." + +#: tickettool\utils.py:193 +msgid "The argument `/modal/{count}/label` must be less than 45 characters long." +msgstr "Das Argument `/modal/{count}/label` muss weniger als 45 Zeichen lang sein." + +#: tickettool\utils.py:203 tickettool\utils.py:209 +msgid "The argument `/{count}/style` must be a number between 1 and 2." +msgstr "Das Argument `/{count}/style` muss eine Zahl zwischen 1 und 2 sein." + +#: tickettool\utils.py:232 +msgid "The argument `/{count}/required` must be a boolean (True or False)." +msgstr "Das Argument `/{count}/required` muss ein Boolean sein (True oder False)." + +#: tickettool\utils.py:242 +msgid "The argument `/modal/{count}/default` must be less than 4000 characters long." +msgstr "Das Argument `/modal/{count}/default` muss weniger als 4000 Zeichen lang sein." + +#: tickettool\utils.py:250 +msgid "The argument `/modal/{count}/placeholder` must be less than 100 characters long." +msgstr "Das Argument `/modal/{count}/placeholder` muss weniger als 100 Zeichen lang sein." + +#: tickettool\utils.py:258 +msgid "The argument `/modal/{count}/min_length` must be between 0 and 4000." +msgstr "Das Argument `/modal/{count}/min_length` muss zwischen 0 und 4000 liegen." + +#: tickettool\utils.py:266 +msgid "The argument `/modal/{count}/max_length` must be between 0 and 4000." +msgstr "Das Argument `/modal/{count}/max_length` muss zwischen 0 und 4000 liegen." + diff --git a/tickettool/locales/el-GR.po b/tickettool/locales/el-GR.po new file mode 100644 index 0000000..f00f831 --- /dev/null +++ b/tickettool/locales/el-GR.po @@ -0,0 +1,584 @@ +msgid "" +msgstr "" +"Project-Id-Version: aaa3a-cogs\n" +"POT-Creation-Date: 2024-07-20 22:15+0200\n" +"PO-Revision-Date: 2024-07-21 15:13\n" +"Last-Translator: \n" +"Language-Team: Greek\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: redgettext 3.4.2\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Crowdin-Project: aaa3a-cogs\n" +"X-Crowdin-Project-ID: 531090\n" +"X-Crowdin-Language: el\n" +"X-Crowdin-File: /[AAA3A-AAA3A.AAA3A-cogs] main/tickettool/locales/messages.pot\n" +"X-Crowdin-File-ID: 102\n" +"Language: el_GR\n" + +#: tickettool\settings.py:15 tickettool\settings.py:18 +#: tickettool\tickettool.py:759 tickettool\tickettool.py:762 +msgid "This profile does not exist." +msgstr "Αυτό το προφίλ δεν υπάρχει." + +#: tickettool\settings.py:27 +msgid "I have to be the author of the message. You can use EmbedUtils by AAA3A to send one." +msgstr "Εγώ πρέπει να είμαι ο συντάκτης του μηνύματος. Μπορείτε να χρησιμοποιήσετε το EmbedUtils by AAA3A για να στείλετε ένα." + +#: tickettool\settings.py:54 +#, docstring +msgid "Send a message with a button to open a ticket or dropdown with possible reasons.\n\n" +" Examples:\n" +" - `[p]settickettool message #general \"🐛|Report a bug|If you find a bug, report it here.|bug\" \"⚠️|Report a user|If you find a malicious user, report it here.|user\"`\n" +" - `[p]settickettool 1234567890-0987654321`\n" +" " +msgstr "Στείλτε ένα μήνυμα με ένα κουμπί για να ανοίξετε ένα εισιτήριο ή ένα πτυσσόμενο μενού με τους πιθανούς λόγους.\n\n" +" Παραδείγματα:\n" +" - `[p]settickettool message #general \"🐛|Report a bug|If you find a bug, report it here.|bug\" \"⚠️|Report a user|If you find a malicious user, report it here.|user\"`\n" +" - `[p]settickettool 1234567890-0987654321`\n" +" " + +#: tickettool\settings.py:70 +msgid "I don't have sufficient permissions in this channel to view it and to send messages into." +msgstr "Δεν έχω επαρκή δικαιώματα σε αυτό το κανάλι για να το βλέπω και να στέλνω μηνύματα." + +#: tickettool\settings.py:97 tickettool\tickettool.py:339 +msgid "Create ticket" +msgstr "Δημιουργία εισιτηρίου" + +#: tickettool\settings.py:116 +msgid "A different value must be provided for each dropdown option." +msgstr "Πρέπει να παρέχεται διαφορετική τιμή για κάθε πτυσσόμενη επιλογή." + +#: tickettool\settings.py:124 +msgid "An emoji you selected seems invalid. Check that it is an emoji. If you have Nitro, you may have used a custom emoji from another server." +msgstr "Ένα emoji που επιλέξατε φαίνεται άκυρο. Ελέγξτε ότι πρόκειται για emoji. Αν έχετε Nitro, μπορεί να έχετε χρησιμοποιήσει ένα προσαρμοσμένο emoji από άλλο διακομιστή." + +#: tickettool\ticket.py:245 +msgid "Creating the ticket {ticket.id}." +msgstr "Δημιουργία του εισιτηρίου {ticket.id}." + +#: tickettool\ticket.py:266 +msgid "The dynamic channel name does not contain correct variable names and must be re-configured with `[p]settickettool dynamicchannelname`." +msgstr "Το όνομα του δυναμικού καναλιού δεν περιέχει σωστά ονόματα μεταβλητών και πρέπει να ρυθμιστεί εκ νέου με την εντολή `[p]settickettool dynamicchannelname`." + +#: tickettool\ticket.py:275 tickettool\ticket.py:528 tickettool\ticket.py:890 +#: tickettool\ticket.py:969 tickettool\tickettool.py:352 +msgid "Close" +msgstr "Κλείστε το" + +#: tickettool\ticket.py:282 tickettool\ticket.py:535 tickettool\ticket.py:615 +#: tickettool\ticket.py:897 tickettool\ticket.py:976 +#: tickettool\tickettool.py:366 +msgid "Claim" +msgstr "Διεκδίκηση" + +#: tickettool\ticket.py:289 tickettool\ticket.py:542 tickettool\ticket.py:622 +#: tickettool\ticket.py:904 tickettool\ticket.py:983 +#: tickettool\tickettool.py:373 +msgid "Delete" +msgstr "Διαγραφή" + +#: tickettool\ticket.py:303 tickettool\ticket.py:429 +msgid "Ticket Created" +msgstr "Δημιουργήθηκε εισιτήριο" + +#: tickettool\ticket.py:304 +msgid "Thank you for creating a ticket on this server!" +msgstr "Σας ευχαριστούμε που δημιουργήσατε ένα εισιτήριο σε αυτόν τον διακομιστή!" + +#: tickettool\ticket.py:315 +msgid "🎟️ Ticket ID: {ticket.id}\n" +"🕵️ Ticket created by: @{ticket.created_by.display_name} ({ticket.created_by.id})\n" +"☢️ Ticket reason: {short_reason}\n" +msgstr "🎟️ Αναγνωριστικό εισιτηρίου: {ticket.id}\n" +"🕵️ Ticket created by: @{ticket.created_by.display_name} ({ticket.created_by.id})\n" +"☢️ Αιτία έκδοσης του δελτίου: {short_reason}\n" + +#: tickettool\ticket.py:395 +msgid "⚠ At least one user (the ticket owner or a team member) could not be added to the ticket thread. Maybe the user doesn't have access to the parent forum/text channel. If the server uses private threads in a text channel, the bot does not have the `manage_messages` permission in this channel." +msgstr "⚠ Τουλάχιστον ένας χρήστης (ο ιδιοκτήτης του εισιτηρίου ή ένα μέλος της ομάδας) δεν μπόρεσε να προστεθεί στο νήμα του εισιτηρίου. Ίσως ο χρήστης δεν έχει πρόσβαση στο γονικό φόρουμ/κανάλι κειμένου. Εάν ο διακομιστής χρησιμοποιεί ιδιωτικά νήματα σε ένα κανάλι κειμένου, το bot δεν έχει το δικαίωμα `manage_messages` σε αυτό το κανάλι." + +#: tickettool\ticket.py:430 +msgid "The ticket was created by {ticket.created_by}." +msgstr "Το εισιτήριο δημιουργήθηκε από {ticket.created_by}." + +#: tickettool\ticket.py:436 +msgid "Report on the creation of the ticket {ticket.id}." +msgstr "Έκθεση σχετικά με τη δημιουργία του εισιτηρίου {ticket.id}." + +#: tickettool\ticket.py:476 +msgid "Opening the ticket {ticket.id}." +msgstr "Άνοιγμα του εισιτηρίου {ticket.id}." + +#: tickettool\ticket.py:505 tickettool\ticket.py:513 +msgid "Ticket Opened" +msgstr "Ανοιχτό εισιτήριο" + +#: tickettool\ticket.py:514 +msgid "The ticket was opened by {ticket.opened_by}." +msgstr "Το εισιτήριο άνοιξε ο {ticket.opened_by}." + +#: tickettool\ticket.py:520 tickettool\ticket.py:600 +msgid "Report on the close of the ticket {ticket.id}." +msgstr "Αναφορά για το κλείσιμο του εισιτηρίου {ticket.id}." + +#: tickettool\ticket.py:608 tickettool\tickettool.py:359 +msgid "Re-open" +msgstr "Επαναλειτουργία του" + +#: tickettool\ticket.py:675 tickettool\ticket.py:712 +#: tickettool\tickettool.py:1100 tickettool\tickettool.py:1142 +msgid "Cannot execute action on a text channel." +msgstr "Δεν είναι δυνατή η εκτέλεση ενέργειας σε κανάλι κειμένου." + +#: tickettool\ticket.py:701 +msgid "Report on the lock of the ticket {ticket.id}." +msgstr "Έκθεση σχετικά με την κλειδαριά του εισιτηρίου {ticket.id}." + +#: tickettool\ticket.py:738 +msgid "Report on the unlock of the ticket {ticket.id}." +msgstr "Έκθεση σχετικά με το ξεκλείδωμα του εισιτηρίου {ticket.id}." + +#: tickettool\ticket.py:755 +msgid "Renaming the ticket {ticket.id}. (`{ticket.channel.name}` to `{new_name}`)" +msgstr "Μετονομασία του εισιτηρίου {ticket.id}. (`{ticket.channel.name}` σε `{new_name}`)" + +#: tickettool\ticket.py:765 +msgid "Ticket Renamed." +msgstr "Μετονομασία εισιτηρίου." + +#: tickettool\ticket.py:783 +msgid "Ticket Deleted" +msgstr "Εισιτήριο Διαγράφηκε" + +#: tickettool\ticket.py:784 +msgid "The ticket was deleted by {ticket.deleted_by}." +msgstr "Το εισιτήριο διαγράφηκε από το {ticket.deleted_by}." + +#: tickettool\ticket.py:807 +msgid "Report on the deletion of the ticket {ticket.id}." +msgstr "Έκθεση σχετικά με τη διαγραφή του εισιτηρίου {ticket.id}." + +#: tickettool\ticket.py:824 +msgid "Deleting the ticket {ticket.id}." +msgstr "Διαγραφή του εισιτηρίου {ticket.id}." + +#: tickettool\ticket.py:845 +msgid "A ticket cannot be claimed if it is closed." +msgstr "Ένα εισιτήριο δεν μπορεί να διεκδικηθεί εάν έχει κλείσει." + +#: tickettool\ticket.py:849 +msgid "A bot cannot claim a ticket." +msgstr "Ένα bot δεν μπορεί να διεκδικήσει ένα εισιτήριο." + +#: tickettool\ticket.py:863 +msgid "Claiming the ticket {ticket.id}." +msgstr "Διεκδίκηση του εισιτηρίου {ticket.id}." + +#: tickettool\ticket.py:918 +msgid "Ticket claimed." +msgstr "Διεκδίκηση εισιτηρίου." + +#: tickettool\ticket.py:932 +msgid "A ticket cannot be unclaimed if it is closed." +msgstr "Ένα εισιτήριο δεν μπορεί να μη διεκδικηθεί εάν έχει κλείσει." + +#: tickettool\ticket.py:948 +msgid "Unclaiming the ticket {ticket.id}." +msgstr "Ακύρωση του εισιτηρίου {ticket.id}." + +#: tickettool\ticket.py:997 +msgid "Ticket unclaimed." +msgstr "Εισιτήριο που δεν διεκδικείται." + +#: tickettool\ticket.py:1011 +msgid "Cannot execute action in a thread channel." +msgstr "Δεν είναι δυνατή η εκτέλεση ενέργειας σε κανάλι νήματος." + +#: tickettool\ticket.py:1018 +msgid "Changing owner of the ticket {ticket.id}." +msgstr "Αλλαγή ιδιοκτήτη του εισιτηρίου {ticket.id}." + +#: tickettool\ticket.py:1022 +msgid "You cannot transfer ownership of a ticket to a bot." +msgstr "Δεν μπορείτε να μεταβιβάσετε την κυριότητα ενός εισιτηρίου σε ένα bot." + +#: tickettool\ticket.py:1051 +msgid "Owner Modified." +msgstr "Ιδιοκτήτης Τροποποιήθηκε." + +#: tickettool\ticket.py:1070 +msgid "Adding a member to the ticket {ticket.id}." +msgstr "Προσθήκη μέλους στο εισιτήριο {ticket.id}." + +#: tickettool\ticket.py:1077 tickettool\ticket.py:1114 +msgid "You cannot add a bot to a ticket. ({member})" +msgstr "Δεν μπορείτε να προσθέσετε ένα bot σε ένα εισιτήριο. ({member})" + +#: tickettool\ticket.py:1081 tickettool\ticket.py:1118 +msgid "This member is already the owner of this ticket. ({member})" +msgstr "Αυτό το μέλος είναι ήδη ο ιδιοκτήτης αυτού του εισιτηρίου. ({member})" + +#: tickettool\ticket.py:1087 tickettool\ticket.py:1124 +msgid "This member is an administrator for the tickets system. They will always have access to the ticket anyway. ({member})" +msgstr "Αυτό το μέλος είναι διαχειριστής του συστήματος εισιτηρίων. Θα έχει πάντα πρόσβαση στο εισιτήριο ούτως ή άλλως. ({member})" + +#: tickettool\ticket.py:1093 tickettool\ticket.py:1130 +msgid "This member already has access to this ticket. ({member})" +msgstr "Αυτό το μέλος έχει ήδη πρόσβαση σε αυτό το εισιτήριο. ({member})" + +#: tickettool\ticket.py:1144 +msgid "⚠ At least one user (the ticket owner or a team member) could not be added to the ticket thread. Maybe the user the user doesn't have access to the parent forum/text channel. If the server uses private threads in a text channel, the bot does not have the `manage_messages` permission in this channel." +msgstr "⚠ Τουλάχιστον ένας χρήστης (ο ιδιοκτήτης του εισιτηρίου ή ένα μέλος της ομάδας) δεν μπόρεσε να προστεθεί στο νήμα του εισιτηρίου. Ίσως ο χρήστης ο χρήστης δεν έχει πρόσβαση στο γονικό φόρουμ/κανάλι κειμένου. Εάν ο διακομιστής χρησιμοποιεί ιδιωτικά νήματα σε ένα κανάλι κειμένου, το bot δεν έχει το δικαίωμα `manage_messages` σε αυτό το κανάλι." + +#: tickettool\ticket.py:1168 +msgid "Removing a member to the ticket {ticket.id}." +msgstr "Αφαίρεση μέλους από το ticket {ticket.id}." + +#: tickettool\ticket.py:1174 tickettool\ticket.py:1204 +msgid "You cannot remove a bot to a ticket ({member})." +msgstr "Δεν μπορείτε να αφαιρέσετε ένα bot από ένα ticket ({member})." + +#: tickettool\ticket.py:1180 tickettool\ticket.py:1210 +msgid "You cannot remove the owner of this ticket. ({member})" +msgstr "Δεν μπορείτε να αφαιρέσετε τον ιδιοκτήτη αυτού του εισιτηρίου. ({member})" + +#: tickettool\ticket.py:1186 tickettool\ticket.py:1216 +msgid "This member is an administrator for the tickets system. They will always have access to the ticket. ({member})" +msgstr "Αυτό το μέλος είναι διαχειριστής του συστήματος εισιτηρίων. Θα έχει πάντα πρόσβαση στο εισιτήριο. ({member})" + +#: tickettool\ticket.py:1192 tickettool\ticket.py:1222 +msgid "This member is not in the list of those authorised to access the ticket. ({member})" +msgstr "Αυτό το μέλος δεν περιλαμβάνεται στη λίστα των ατόμων που έχουν δικαίωμα πρόσβασης στο εισιτήριο. ({member})" + +#: tickettool\tickettool.py:32 +#, docstring +msgid "A cog to manage a tickets system!" +msgstr "Ένα γρανάζι για τη διαχείριση ενός συστήματος εισιτηρίων!" + +#: tickettool\tickettool.py:74 +msgid "To get help on this server or to make an order for example, you can create a ticket.\n" +"Just use the command `{prefix}ticket create` or click on the button below.\n" +"You can then use the `{prefix}ticket` subcommands to manage your ticket." +msgstr "Για να λάβετε βοήθεια σε αυτόν τον διακομιστή ή για να κάνετε μια παραγγελία για παράδειγμα, μπορείτε να δημιουργήσετε ένα εισιτήριο.\n" +"Απλά χρησιμοποιήστε την εντολή `{prefix}ticket create` ή κάντε κλικ στο παρακάτω κουμπί.\n" +"Στη συνέχεια μπορείτε να χρησιμοποιήσετε τις υποεντολές `{prefix}ticket` για να διαχειριστείτε το εισιτήριό σας." + +#: tickettool\tickettool.py:403 +msgid "Choose the reason for open a ticket." +msgstr "Επιλέξτε τον λόγο για τον οποίο ανοίγετε ένα εισιτήριο." + +#: tickettool\tickettool.py:521 +msgid "Action taken for the ticket system." +msgstr "Ανάληψη δράσης για το σύστημα εισιτηρίων." + +#: tickettool\tickettool.py:555 +msgid "Ticket ID:" +msgstr "Αναγνωριστικό εισιτηρίου:" + +#: tickettool\tickettool.py:558 +msgid "Owned by:" +msgstr "Ιδιοκτήτης:" + +#: tickettool\tickettool.py:566 +msgid "Channel:" +msgstr "Κανάλι:" + +#: tickettool\tickettool.py:573 +msgid "Closed by:" +msgstr "Έκλεισε από:" + +#: tickettool\tickettool.py:581 +msgid "Deleted by:" +msgstr "Διαγράφηκε από:" + +#: tickettool\tickettool.py:589 +msgid "Closed at:" +msgstr "Έκλεισε στο:" + +#: tickettool\tickettool.py:596 tickettool\tickettool.py:622 +msgid "Reason:" +msgstr "Λόγος:" + +#: tickettool\tickettool.py:607 +msgid "Ticket [{ticket.profile}] {ticket.id} - Action taken" +msgstr "Ticket [{ticket.profile}] {ticket.id} - Ενέργειες" + +#: tickettool\tickettool.py:687 +msgid "You're not in a ticket." +msgstr "Δεν έχετε εισιτήριο." + +#: tickettool\tickettool.py:691 +msgid "This ticket isn't {status}ed." +msgstr "Αυτό το εισιτήριο δεν είναι {status}ed." + +#: tickettool\tickettool.py:700 +msgid "This ticket is {status}." +msgstr "Αυτό το εισιτήριο είναι {status}." + +#: tickettool\tickettool.py:709 +msgid "You're not allowed to lock this ticket." +msgstr "Δεν επιτρέπεται να κλειδώσετε αυτό το εισιτήριο." + +#: tickettool\tickettool.py:752 +msgid "You're not allowed to view this ticket." +msgstr "Δεν επιτρέπεται να δείτε αυτό το εισιτήριο." + +#: tickettool\tickettool.py:786 +msgid "Please provide a profile." +msgstr "Παρακαλείστε να παράσχετε ένα προφίλ." + +#: tickettool\tickettool.py:789 +msgid "No profile has been created on this server." +msgstr "Δεν έχει δημιουργηθεί προφίλ σε αυτόν τον διακομιστή." + +#: tickettool\tickettool.py:797 +msgid "The ticket system is not enabled on this server. Please ask an administrator of this server to use the `{ctx.prefix}settickettool` subcommands to configure it." +msgstr "Το σύστημα εισιτηρίων δεν είναι ενεργοποιημένο σε αυτόν τον διακομιστή. Ζητήστε από έναν διαχειριστή αυτού του διακομιστή να χρησιμοποιήσει τις υποεντολές `{ctx.prefix}settickettool` για να το ρυθμίσετε." + +#: tickettool\tickettool.py:803 +msgid "The category `open` or the category `close` have not been configured. Please ask an administrator of this server to use the `{ctx.prefix}settickettool` subcommands to configure it." +msgstr "Η κατηγορία `open` ή η κατηγορία `close` δεν έχει ρυθμιστεί. Ζητήστε από έναν διαχειριστή αυτού του διακομιστή να χρησιμοποιήσει τις υποεντολές `{ctx.prefix}settickettool` για να τις ρυθμίσει." + +#: tickettool\tickettool.py:810 +msgid "Sorry. You have already reached the limit of {limit} open tickets." +msgstr "Συγγνώμη. Έχετε ήδη φτάσει στο όριο των {limit} ανοικτών εισιτηρίων." + +#: tickettool\tickettool.py:821 +msgid "The bot does not have `manage_channels` permission on the `open` and `close` categories to allow the ticket system to function properly. Please notify an administrator of this server." +msgstr "Το bot δεν έχει το δικαίωμα `manage_channels` στις κατηγορίες `open` και `close` για να επιτρέψει τη σωστή λειτουργία του συστήματος εισιτηρίων. Παρακαλούμε ενημερώστε έναν διαχειριστή αυτού του διακομιστή." + +#: tickettool\tickettool.py:830 +msgid "The bot does not have `manage_channel` permission in the forum channel to allow the ticket system to function properly. Please notify an administrator of this server." +msgstr "Το ρομπότ δεν έχει το δικαίωμα `manage_channel` στο κανάλι του φόρουμ για να επιτρέψει τη σωστή λειτουργία του συστήματος εισιτηρίων. Παρακαλούμε ενημερώστε έναν διαχειριστή αυτού του διακομιστή." + +#: tickettool\tickettool.py:875 +msgid "Please provide the required informations by clicking on the button below." +msgstr "Παρακαλούμε συμπληρώστε τις απαιτούμενες πληροφορίες κάνοντας κλικ στο παρακάτω κουμπί." + +#: tickettool\tickettool.py:926 +#, docstring +msgid "Create a Ticket.\n\n" +" If only one profile has been created on this server, you don't need to specify its name.\n" +" " +msgstr "Δημιουργήστε ένα εισιτήριο.\n\n" +" Εάν έχει δημιουργηθεί μόνο ένα προφίλ σε αυτόν τον διακομιστή, δεν χρειάζεται να καθορίσετε το όνομά του.\n" +" " + +#: tickettool\tickettool.py:942 +#, docstring +msgid "Create a Ticket for a member.\n\n" +" If only one profile has been created on this server, you don't need to specify its name.\n" +" " +msgstr "Δημιουργήστε ένα Εισιτήριο για ένα μέλος.\n\n" +" Εάν έχει δημιουργηθεί μόνο ένα προφίλ σε αυτόν τον διακομιστή, δεν χρειάζεται να καθορίσετε το όνομά του.\n" +" " + +#: tickettool\tickettool.py:947 +msgid "You cannot create a ticket for a bot." +msgstr "Δεν μπορείτε να δημιουργήσετε ένα εισιτήριο για ένα bot." + +#: tickettool\tickettool.py:950 +msgid "You cannot create a ticket for a member with a higher or equal role." +msgstr "Δεν μπορείτε να δημιουργήσετε ένα εισιτήριο για ένα μέλος με υψηλότερο ή ίσο ρόλο." + +#: tickettool\tickettool.py:970 +#, docstring +msgid "Export all the messages of an existing Ticket in html format.\n" +" Please note: all attachments and user avatars are saved with the Discord link in this file.\n" +" " +msgstr "Εξαγωγή όλων των μηνυμάτων ενός υπάρχοντος εισιτηρίου σε μορφή html.\n" +" Σημείωση: όλα τα συνημμένα και τα avatars των χρηστών αποθηκεύονται με το σύνδεσμο Discord σε αυτό το αρχείο.\n" +" " + +#: tickettool\tickettool.py:987 +msgid "Here is the html file of the transcript of all the messages in this ticket.\n" +"Please note: all attachments and user avatars are saved with the Discord link in this file." +msgstr "Εδώ είναι το αρχείο html με την απομαγνητοφώνηση όλων των μηνυμάτων σε αυτό το εισιτήριο.\n" +"Παρακαλώ σημειώστε: όλα τα συνημμένα και τα avatars των χρηστών αποθηκεύονται με το σύνδεσμο Discord σε αυτό το αρχείο." + +#: tickettool\tickettool.py:1019 +#, docstring +msgid "Open an existing Ticket." +msgstr "Ανοίξτε ένα υπάρχον Εισιτήριο." + +#: tickettool\tickettool.py:1024 +msgid "The ticket system is not enabled on this server." +msgstr "Το σύστημα εισιτηρίων δεν είναι ενεργοποιημένο σε αυτόν τον διακομιστή." + +#: tickettool\tickettool.py:1050 +#, docstring +msgid "Close an existing Ticket." +msgstr "Κλείστε ένα υπάρχον Εισιτήριο." + +#: tickettool\tickettool.py:1061 +msgid "Do you really want to close the ticket {ticket.id}?" +msgstr "Θέλετε πραγματικά να κλείσετε το εισιτήριο {ticket.id};" + +#: tickettool\tickettool.py:1097 +#, docstring +msgid "Lock an existing Ticket." +msgstr "Κλειδώστε ένα υπάρχον Εισιτήριο." + +#: tickettool\tickettool.py:1104 +msgid "Do you really want to lock the ticket {ticket.id}?" +msgstr "Θέλετε πραγματικά να κλειδώσετε το εισιτήριο {ticket.id};" + +#: tickettool\tickettool.py:1139 +#, docstring +msgid "Unlock an existing locked Ticket." +msgstr "Ξεκλειδώστε ένα υπάρχον κλειδωμένο Εισιτήριο." + +#: tickettool\tickettool.py:1167 +#, docstring +msgid "Rename an existing Ticket." +msgstr "Μετονομασία ενός υπάρχοντος εισιτηρίου." + +#: tickettool\tickettool.py:1193 +#, docstring +msgid "Delete an existing Ticket.\n\n" +" If a logs channel is defined, an html file containing all the messages of this ticket will be generated.\n" +" (Attachments are not supported, as they are saved with their Discord link)\n" +" " +msgstr "Διαγράψτε ένα υπάρχον Εισιτήριο.\n\n" +" Εάν έχει οριστεί ένα κανάλι καταγραφής, θα δημιουργηθεί ένα αρχείο html που θα περιέχει όλα τα μηνύματα αυτού του εισιτηρίου.\n" +" (Τα συνημμένα αρχεία δεν υποστηρίζονται, καθώς αποθηκεύονται με τον σύνδεσμο τους στο Discord)\n" +" " + +#: tickettool\tickettool.py:1202 +msgid "Do you really want to delete all the messages of the ticket {ticket.id}?" +msgstr "Θέλετε πραγματικά να διαγράψετε όλα τα μηνύματα του εισιτηρίου {ticket.id};" + +#: tickettool\tickettool.py:1206 +msgid "If a logs channel is defined, an html file containing all the messages of this ticket will be generated. (Attachments are not supported, as they are saved with their Discord link.)" +msgstr "Εάν έχει οριστεί ένα κανάλι καταγραφής, θα δημιουργηθεί ένα αρχείο html που θα περιέχει όλα τα μηνύματα αυτού του εισιτηρίου. (Τα συνημμένα αρχεία δεν υποστηρίζονται, καθώς αποθηκεύονται με τον σύνδεσμο τους στο Discord.)" + +#: tickettool\tickettool.py:1242 +#, docstring +msgid "Claim an existing Ticket." +msgstr "Διεκδικήστε ένα υπάρχον εισιτήριο." + +#: tickettool\tickettool.py:1266 +#, docstring +msgid "Unclaim an existing Ticket." +msgstr "Ακυρώστε ένα υπάρχον Εισιτήριο." + +#: tickettool\tickettool.py:1292 +#, docstring +msgid "Change the owner of an existing Ticket." +msgstr "Αλλαγή του ιδιοκτήτη ενός υπάρχοντος Εισιτηρίου." + +#: tickettool\tickettool.py:1318 +#, docstring +msgid "Add a member to an existing Ticket." +msgstr "Προσθέστε ένα μέλος σε ένα υπάρχον Εισιτήριο." + +#: tickettool\tickettool.py:1343 +#, docstring +msgid "Remove a member to an existing Ticket." +msgstr "Αφαίρεση ενός μέλους από ένα υπάρχον Ticket." + +#: tickettool\tickettool.py:1357 +#, docstring +msgid "List the existing Tickets for a profile. You can provide a status and/or a ticket owner." +msgstr "Λίστα με τα υπάρχοντα εισιτήρια για ένα προφίλ. Μπορείτε να δώσετε μια κατάσταση και/ή έναν ιδιοκτήτη εισιτηρίου." + +#: tickettool\tickettool.py:1378 +msgid "No tickets to show." +msgstr "Δεν υπάρχουν εισιτήρια για επίδειξη." + +#: tickettool\tickettool.py:1419 +msgid "The profile for which this button was configured no longer exists." +msgstr "Το προφίλ για το οποίο έχει ρυθμιστεί αυτό το κουμπί δεν υπάρχει πλέον." + +#: tickettool\tickettool.py:1482 tickettool\tickettool.py:1541 +#: tickettool\tickettool.py:1545 tickettool\tickettool.py:1563 +#: tickettool\tickettool.py:1567 tickettool\tickettool.py:1587 +#: tickettool\tickettool.py:1591 tickettool\tickettool.py:1661 +#: tickettool\tickettool.py:1665 +msgid "You are not allowed to execute this command." +msgstr "Δεν επιτρέπεται η εκτέλεση αυτής της εντολής." + +#: tickettool\tickettool.py:1486 tickettool\tickettool.py:1491 +#: tickettool\tickettool.py:1495 +msgid "You have chosen to create a ticket." +msgstr "Έχετε επιλέξει να δημιουργήσετε ένα εισιτήριο." + +#: tickettool\tickettool.py:1517 +msgid "You have chosen to close this ticket. If this is not done, you do not have the necessary permissions to execute this command." +msgstr "Επιλέξατε να κλείσετε αυτό το εισιτήριο. Εάν αυτό δεν γίνει, δεν έχετε τα απαραίτητα δικαιώματα για την εκτέλεση αυτής της εντολής." + +#: tickettool\tickettool.py:1549 +msgid "You have chosen to re-open this ticket." +msgstr "Επιλέξατε να ανοίξετε ξανά αυτό το εισιτήριο." + +#: tickettool\tickettool.py:1571 +msgid "You have chosen to claim this ticket. If this is not done, you do not have the necessary permissions to execute this command." +msgstr "Επιλέξατε να διεκδικήσετε αυτό το εισιτήριο. Εάν αυτό δεν έχει γίνει, δεν έχετε τα απαραίτητα δικαιώματα για την εκτέλεση αυτής της εντολής." + +#: tickettool\tickettool.py:1611 +msgid "This message is not in TicketTool config." +msgstr "Αυτό το μήνυμα δεν υπάρχει στη διαμόρφωση του TicketTool." + +#: tickettool\tickettool.py:1620 +msgid "The profile for which this dropdown was configured no longer exists." +msgstr "Το προφίλ για το οποίο έχει ρυθμιστεί αυτό το αναπτυσσόμενο μενού δεν υπάρχει πλέον." + +#: tickettool\tickettool.py:1687 tickettool\tickettool.py:1694 +msgid "You have chosen to create a ticket with the reason `{reason}`." +msgstr "Έχετε επιλέξει να δημιουργήσετε ένα εισιτήριο με την αιτιολογία `{reason}`." + +#: tickettool\tickettool.py:1840 +msgid "No open tickets by this user in this server." +msgstr "Δεν υπάρχουν ανοιχτά εισιτήρια από αυτόν τον χρήστη σε αυτόν τον διακομιστή." + +#: tickettool\utils.py:143 +msgid "Emoji Label must be An emoji followed by a label, and optionnaly by a description and a value (for rename ticket channel), separated by either `;`, `,`, `|`, or `-`." +msgstr "Emoji Label πρέπει να είναι Ένα emoji ακολουθούμενο από μια ετικέτα, και προαιρετικά από μια περιγραφή και μια τιμή (για μετονομασία καναλιού εισιτηρίου), διαχωρισμένα είτε με `;`, `,`, `|`, ή `-`." + +#: tickettool\utils.py:160 +msgid "Error parsing YAML. Please make sure the format is valid (a YAML validator may help)" +msgstr "Σφάλμα ανάλυσης YAML. Παρακαλούμε βεβαιωθείτε ότι η μορφή είναι έγκυρη (μπορεί να βοηθήσει ένας επικυρωτής YAML)" + +#: tickettool\utils.py:174 +msgid "You can only have 5 text inputs." +msgstr "Μπορείτε να έχετε μόνο 5 εισόδους κειμένου." + +#: tickettool\utils.py:180 +msgid "The argument `/{count}/{arg}` is required in the YAML." +msgstr "Το όρισμα `/{count}/{arg}` απαιτείται στο YAML." + +#: tickettool\utils.py:187 +msgid "The argument `/{count}/{arg}` is invalid in the YAML. Check the spelling." +msgstr "Το όρισμα `/{count}/{arg}` είναι άκυρο στην YAML. Ελέγξτε την ορθογραφία." + +#: tickettool\utils.py:193 +msgid "The argument `/modal/{count}/label` must be less than 45 characters long." +msgstr "Το όρισμα `/modal/{count}/label` πρέπει να έχει μήκος μικρότερο από 45 χαρακτήρες." + +#: tickettool\utils.py:203 tickettool\utils.py:209 +msgid "The argument `/{count}/style` must be a number between 1 and 2." +msgstr "Το όρισμα `/{count}/style` πρέπει να είναι ένας αριθμός μεταξύ 1 και 2." + +#: tickettool\utils.py:232 +msgid "The argument `/{count}/required` must be a boolean (True or False)." +msgstr "Το όρισμα `/{count}/required` πρέπει να είναι boolean (True ή False)." + +#: tickettool\utils.py:242 +msgid "The argument `/modal/{count}/default` must be less than 4000 characters long." +msgstr "Το όρισμα `/modal/{count}/default` πρέπει να έχει μήκος μικρότερο από 4000 χαρακτήρες." + +#: tickettool\utils.py:250 +msgid "The argument `/modal/{count}/placeholder` must be less than 100 characters long." +msgstr "Το όρισμα `/modal/{count}/placeholder` πρέπει να έχει μήκος μικρότερο από 100 χαρακτήρες." + +#: tickettool\utils.py:258 +msgid "The argument `/modal/{count}/min_length` must be between 0 and 4000." +msgstr "Το όρισμα `/modal/{count}/min_length` πρέπει να είναι μεταξύ 0 και 4000." + +#: tickettool\utils.py:266 +msgid "The argument `/modal/{count}/max_length` must be between 0 and 4000." +msgstr "Το όρισμα `/modal/{count}/max_length` πρέπει να είναι μεταξύ 0 και 4000." + diff --git a/tickettool/locales/es-ES.po b/tickettool/locales/es-ES.po new file mode 100644 index 0000000..3c4b39f --- /dev/null +++ b/tickettool/locales/es-ES.po @@ -0,0 +1,584 @@ +msgid "" +msgstr "" +"Project-Id-Version: aaa3a-cogs\n" +"POT-Creation-Date: 2024-07-20 22:15+0200\n" +"PO-Revision-Date: 2024-07-21 15:13\n" +"Last-Translator: \n" +"Language-Team: Spanish\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: redgettext 3.4.2\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Crowdin-Project: aaa3a-cogs\n" +"X-Crowdin-Project-ID: 531090\n" +"X-Crowdin-Language: es-ES\n" +"X-Crowdin-File: /[AAA3A-AAA3A.AAA3A-cogs] main/tickettool/locales/messages.pot\n" +"X-Crowdin-File-ID: 102\n" +"Language: es_ES\n" + +#: tickettool\settings.py:15 tickettool\settings.py:18 +#: tickettool\tickettool.py:759 tickettool\tickettool.py:762 +msgid "This profile does not exist." +msgstr "Este perfil no existe." + +#: tickettool\settings.py:27 +msgid "I have to be the author of the message. You can use EmbedUtils by AAA3A to send one." +msgstr "Tengo que ser el autor del mensaje. Puede utilizar EmbedUtils de AAA3A para enviar uno." + +#: tickettool\settings.py:54 +#, docstring +msgid "Send a message with a button to open a ticket or dropdown with possible reasons.\n\n" +" Examples:\n" +" - `[p]settickettool message #general \"🐛|Report a bug|If you find a bug, report it here.|bug\" \"⚠️|Report a user|If you find a malicious user, report it here.|user\"`\n" +" - `[p]settickettool 1234567890-0987654321`\n" +" " +msgstr "Envíe un mensaje con un botón para abrir un ticket o un desplegable con los posibles motivos.\n\n" +" Ejemplos:\n" +" - `[p]settickettool message #general \"🐛|Reporta un bug|Si encuentras un bug, repórtalo aquí.|bug\" \"⚠️|Reporta un usuario|Si encuentras un usuario malicioso, repórtalo aquí.|user\"`\n" +" - `[p]settickettool 1234567890-0987654321`\n" +" " + +#: tickettool\settings.py:70 +msgid "I don't have sufficient permissions in this channel to view it and to send messages into." +msgstr "No tengo permisos suficientes en este canal para verlo y enviar mensajes a él." + +#: tickettool\settings.py:97 tickettool\tickettool.py:339 +msgid "Create ticket" +msgstr "Crear billete" + +#: tickettool\settings.py:116 +msgid "A different value must be provided for each dropdown option." +msgstr "Debe proporcionarse un valor diferente para cada opción desplegable." + +#: tickettool\settings.py:124 +msgid "An emoji you selected seems invalid. Check that it is an emoji. If you have Nitro, you may have used a custom emoji from another server." +msgstr "Un emoji que has seleccionado no parece válido. Comprueba que es un emoji. Si tienes Nitro, puede que hayas utilizado un emoji personalizado de otro servidor." + +#: tickettool\ticket.py:245 +msgid "Creating the ticket {ticket.id}." +msgstr "Creación del ticket {ticket.id}." + +#: tickettool\ticket.py:266 +msgid "The dynamic channel name does not contain correct variable names and must be re-configured with `[p]settickettool dynamicchannelname`." +msgstr "El nombre del canal dinámico no contiene nombres de variables correctos y debe ser reconfigurado con `[p]settickettool dynamicchannelname`." + +#: tickettool\ticket.py:275 tickettool\ticket.py:528 tickettool\ticket.py:890 +#: tickettool\ticket.py:969 tickettool\tickettool.py:352 +msgid "Close" +msgstr "Cerrar" + +#: tickettool\ticket.py:282 tickettool\ticket.py:535 tickettool\ticket.py:615 +#: tickettool\ticket.py:897 tickettool\ticket.py:976 +#: tickettool\tickettool.py:366 +msgid "Claim" +msgstr "Reclamación" + +#: tickettool\ticket.py:289 tickettool\ticket.py:542 tickettool\ticket.py:622 +#: tickettool\ticket.py:904 tickettool\ticket.py:983 +#: tickettool\tickettool.py:373 +msgid "Delete" +msgstr "Borrar" + +#: tickettool\ticket.py:303 tickettool\ticket.py:429 +msgid "Ticket Created" +msgstr "Billete creado" + +#: tickettool\ticket.py:304 +msgid "Thank you for creating a ticket on this server!" +msgstr "Gracias por crear un ticket en este servidor!" + +#: tickettool\ticket.py:315 +msgid "🎟️ Ticket ID: {ticket.id}\n" +"🕵️ Ticket created by: @{ticket.created_by.display_name} ({ticket.created_by.id})\n" +"☢️ Ticket reason: {short_reason}\n" +msgstr "🎟️ Ticket ID: {ticket.id}\n" +"🕵️ Ticket creado por: @{ticket.created_by.display_name} ({ticket.created_by.id})\n" +"☢️ Motivo del ticket: {short_reason}\n" + +#: tickettool\ticket.py:395 +msgid "⚠ At least one user (the ticket owner or a team member) could not be added to the ticket thread. Maybe the user doesn't have access to the parent forum/text channel. If the server uses private threads in a text channel, the bot does not have the `manage_messages` permission in this channel." +msgstr "⚠ No se ha podido añadir al menos un usuario (el propietario del ticket o un miembro del equipo) al hilo del ticket. Tal vez el usuario no tiene acceso al foro/canal de texto padre. Si el servidor utiliza hilos privados en un canal de texto, el bot no tiene el permiso `manage_messages` en este canal." + +#: tickettool\ticket.py:430 +msgid "The ticket was created by {ticket.created_by}." +msgstr "El billete fue creado por {ticket.created_by}." + +#: tickettool\ticket.py:436 +msgid "Report on the creation of the ticket {ticket.id}." +msgstr "Informe sobre la creación del billete {ticket.id}." + +#: tickettool\ticket.py:476 +msgid "Opening the ticket {ticket.id}." +msgstr "Abrir el ticket {ticket.id}." + +#: tickettool\ticket.py:505 tickettool\ticket.py:513 +msgid "Ticket Opened" +msgstr "Billete abierto" + +#: tickettool\ticket.py:514 +msgid "The ticket was opened by {ticket.opened_by}." +msgstr "El billete fue abierto por {ticket.opened_by}." + +#: tickettool\ticket.py:520 tickettool\ticket.py:600 +msgid "Report on the close of the ticket {ticket.id}." +msgstr "Informe sobre el cierre de la taquilla {ticket.id}." + +#: tickettool\ticket.py:608 tickettool\tickettool.py:359 +msgid "Re-open" +msgstr "Vuelva a abrir" + +#: tickettool\ticket.py:675 tickettool\ticket.py:712 +#: tickettool\tickettool.py:1100 tickettool\tickettool.py:1142 +msgid "Cannot execute action on a text channel." +msgstr "No se puede ejecutar la acción en un canal de texto." + +#: tickettool\ticket.py:701 +msgid "Report on the lock of the ticket {ticket.id}." +msgstr "Informe sobre el cierre de la taquilla {ticket.id}." + +#: tickettool\ticket.py:738 +msgid "Report on the unlock of the ticket {ticket.id}." +msgstr "Informe sobre el desbloqueo del billete {ticket.id}." + +#: tickettool\ticket.py:755 +msgid "Renaming the ticket {ticket.id}. (`{ticket.channel.name}` to `{new_name}`)" +msgstr "Cambio de nombre del ticket {ticket.id}. (`{ticket.channel.name}` a `{new_name}`)" + +#: tickettool\ticket.py:765 +msgid "Ticket Renamed." +msgstr "Billete renombrado." + +#: tickettool\ticket.py:783 +msgid "Ticket Deleted" +msgstr "Billete eliminado" + +#: tickettool\ticket.py:784 +msgid "The ticket was deleted by {ticket.deleted_by}." +msgstr "El billete ha sido borrado por {ticket.deleted_by}." + +#: tickettool\ticket.py:807 +msgid "Report on the deletion of the ticket {ticket.id}." +msgstr "Informe sobre la supresión del billete {ticket.id}." + +#: tickettool\ticket.py:824 +msgid "Deleting the ticket {ticket.id}." +msgstr "Borrar el ticket {ticket.id}." + +#: tickettool\ticket.py:845 +msgid "A ticket cannot be claimed if it is closed." +msgstr "No se puede reclamar un ticket si está cerrado." + +#: tickettool\ticket.py:849 +msgid "A bot cannot claim a ticket." +msgstr "Un bot no puede reclamar un billete." + +#: tickettool\ticket.py:863 +msgid "Claiming the ticket {ticket.id}." +msgstr "Reclamación del billete {ticket.id}." + +#: tickettool\ticket.py:918 +msgid "Ticket claimed." +msgstr "Billete reclamado." + +#: tickettool\ticket.py:932 +msgid "A ticket cannot be unclaimed if it is closed." +msgstr "Un ticket no puede ser reclamado si está cerrado." + +#: tickettool\ticket.py:948 +msgid "Unclaiming the ticket {ticket.id}." +msgstr "Anulación del billete {ticket.id}." + +#: tickettool\ticket.py:997 +msgid "Ticket unclaimed." +msgstr "Billete no reclamado." + +#: tickettool\ticket.py:1011 +msgid "Cannot execute action in a thread channel." +msgstr "No se puede ejecutar la acción en un canal de hilo." + +#: tickettool\ticket.py:1018 +msgid "Changing owner of the ticket {ticket.id}." +msgstr "Cambio de propietario del billete {ticket.id}." + +#: tickettool\ticket.py:1022 +msgid "You cannot transfer ownership of a ticket to a bot." +msgstr "No se puede transferir la propiedad de un billete a un bot." + +#: tickettool\ticket.py:1051 +msgid "Owner Modified." +msgstr "Propietario modificado." + +#: tickettool\ticket.py:1070 +msgid "Adding a member to the ticket {ticket.id}." +msgstr "Añadir un miembro al ticket {ticket.id}." + +#: tickettool\ticket.py:1077 tickettool\ticket.py:1114 +msgid "You cannot add a bot to a ticket. ({member})" +msgstr "No se puede añadir un bot a un ticket. ({member})" + +#: tickettool\ticket.py:1081 tickettool\ticket.py:1118 +msgid "This member is already the owner of this ticket. ({member})" +msgstr "Este miembro ya es el propietario de esta entrada. ({member})" + +#: tickettool\ticket.py:1087 tickettool\ticket.py:1124 +msgid "This member is an administrator for the tickets system. They will always have access to the ticket anyway. ({member})" +msgstr "Este miembro es un administrador del sistema de tickets. De todos modos, siempre tendrá acceso al ticket. ({member})" + +#: tickettool\ticket.py:1093 tickettool\ticket.py:1130 +msgid "This member already has access to this ticket. ({member})" +msgstr "Este miembro ya tiene acceso a esta entrada. ({member})" + +#: tickettool\ticket.py:1144 +msgid "⚠ At least one user (the ticket owner or a team member) could not be added to the ticket thread. Maybe the user the user doesn't have access to the parent forum/text channel. If the server uses private threads in a text channel, the bot does not have the `manage_messages` permission in this channel." +msgstr "⚠ No se ha podido añadir al menos un usuario (el propietario del ticket o un miembro del equipo) al hilo del ticket. Puede que el usuario el usuario no tenga acceso al foro/canal de texto padre. Si el servidor utiliza hilos privados en un canal de texto, el bot no tiene el permiso `manage_messages` en este canal." + +#: tickettool\ticket.py:1168 +msgid "Removing a member to the ticket {ticket.id}." +msgstr "Eliminación de un miembro del ticket {ticket.id}." + +#: tickettool\ticket.py:1174 tickettool\ticket.py:1204 +msgid "You cannot remove a bot to a ticket ({member})." +msgstr "No se puede eliminar un bot a un ticket ({member})." + +#: tickettool\ticket.py:1180 tickettool\ticket.py:1210 +msgid "You cannot remove the owner of this ticket. ({member})" +msgstr "No se puede eliminar al propietario de esta entrada. ({member})" + +#: tickettool\ticket.py:1186 tickettool\ticket.py:1216 +msgid "This member is an administrator for the tickets system. They will always have access to the ticket. ({member})" +msgstr "Este miembro es un administrador del sistema de tickets. Siempre tendrá acceso al ticket. ({member})" + +#: tickettool\ticket.py:1192 tickettool\ticket.py:1222 +msgid "This member is not in the list of those authorised to access the ticket. ({member})" +msgstr "Este miembro no está en la lista de los autorizados a acceder a la entrada. ({member})" + +#: tickettool\tickettool.py:32 +#, docstring +msgid "A cog to manage a tickets system!" +msgstr "Un engranaje para gestionar un sistema de billetes!" + +#: tickettool\tickettool.py:74 +msgid "To get help on this server or to make an order for example, you can create a ticket.\n" +"Just use the command `{prefix}ticket create` or click on the button below.\n" +"You can then use the `{prefix}ticket` subcommands to manage your ticket." +msgstr "Para obtener ayuda en este servidor o hacer un pedido, por ejemplo, puede crear un ticket.\n" +"Sólo tiene que utilizar el comando `{prefix}ticket create` o hacer clic en el botón de abajo.\n" +"A continuación, puede utilizar los subcomandos `{prefix}ticket` para gestionar su ticket." + +#: tickettool\tickettool.py:403 +msgid "Choose the reason for open a ticket." +msgstr "Elija el motivo para abrir un ticket." + +#: tickettool\tickettool.py:521 +msgid "Action taken for the ticket system." +msgstr "Medidas adoptadas para el sistema de tickets." + +#: tickettool\tickettool.py:555 +msgid "Ticket ID:" +msgstr "Ticket ID:" + +#: tickettool\tickettool.py:558 +msgid "Owned by:" +msgstr "Propiedad de:" + +#: tickettool\tickettool.py:566 +msgid "Channel:" +msgstr "Canal:" + +#: tickettool\tickettool.py:573 +msgid "Closed by:" +msgstr "Cerrado por:" + +#: tickettool\tickettool.py:581 +msgid "Deleted by:" +msgstr "Borrado por:" + +#: tickettool\tickettool.py:589 +msgid "Closed at:" +msgstr "Cerrado en:" + +#: tickettool\tickettool.py:596 tickettool\tickettool.py:622 +msgid "Reason:" +msgstr "Razón:" + +#: tickettool\tickettool.py:607 +msgid "Ticket [{ticket.profile}] {ticket.id} - Action taken" +msgstr "Ticket [{ticket.profile}] {ticket.id} - Acción tomada" + +#: tickettool\tickettool.py:687 +msgid "You're not in a ticket." +msgstr "No tienes billete." + +#: tickettool\tickettool.py:691 +msgid "This ticket isn't {status}ed." +msgstr "Este billete no es {status}ed." + +#: tickettool\tickettool.py:700 +msgid "This ticket is {status}." +msgstr "Este billete es {status}." + +#: tickettool\tickettool.py:709 +msgid "You're not allowed to lock this ticket." +msgstr "No puede bloquear este billete." + +#: tickettool\tickettool.py:752 +msgid "You're not allowed to view this ticket." +msgstr "No tiene permiso para ver esta entrada." + +#: tickettool\tickettool.py:786 +msgid "Please provide a profile." +msgstr "Por favor, facilite un perfil." + +#: tickettool\tickettool.py:789 +msgid "No profile has been created on this server." +msgstr "No se ha creado ningún perfil en este servidor." + +#: tickettool\tickettool.py:797 +msgid "The ticket system is not enabled on this server. Please ask an administrator of this server to use the `{ctx.prefix}settickettool` subcommands to configure it." +msgstr "El sistema de tickets no está habilitado en este servidor. Pida a un administrador de este servidor que utilice los subcomandos `{ctx.prefix}settickettool` para configurarlo." + +#: tickettool\tickettool.py:803 +msgid "The category `open` or the category `close` have not been configured. Please ask an administrator of this server to use the `{ctx.prefix}settickettool` subcommands to configure it." +msgstr "La categoría `open` o la categoría `close` no han sido configuradas. Por favor, pida a un administrador de este servidor que utilice los subcomandos `{ctx.prefix}settickettool` para configurarlo." + +#: tickettool\tickettool.py:810 +msgid "Sorry. You have already reached the limit of {limit} open tickets." +msgstr "Lo sentimos. Ya ha alcanzado el límite de {limit} entradas abiertas." + +#: tickettool\tickettool.py:821 +msgid "The bot does not have `manage_channels` permission on the `open` and `close` categories to allow the ticket system to function properly. Please notify an administrator of this server." +msgstr "El bot no tiene permiso de `manage_channels` en las categorías `open` y `close` para que el sistema de tickets funcione correctamente. Por favor, notifíquelo a un administrador de este servidor." + +#: tickettool\tickettool.py:830 +msgid "The bot does not have `manage_channel` permission in the forum channel to allow the ticket system to function properly. Please notify an administrator of this server." +msgstr "El bot no tiene permiso `manage_channel` en el canal del foro para que el sistema de tickets funcione correctamente. Por favor, notifíquelo a un administrador de este servidor." + +#: tickettool\tickettool.py:875 +msgid "Please provide the required informations by clicking on the button below." +msgstr "Por favor, proporcione la información requerida haciendo clic en el botón de abajo." + +#: tickettool\tickettool.py:926 +#, docstring +msgid "Create a Ticket.\n\n" +" If only one profile has been created on this server, you don't need to specify its name.\n" +" " +msgstr "Crear una entrada.\n\n" +" Si sólo se ha creado un perfil en este servidor, no es necesario especificar su nombre.\n" +" " + +#: tickettool\tickettool.py:942 +#, docstring +msgid "Create a Ticket for a member.\n\n" +" If only one profile has been created on this server, you don't need to specify its name.\n" +" " +msgstr "Crear un Ticket para un miembro.\n\n" +" Si sólo se ha creado un perfil en este servidor, no es necesario especificar su nombre.\n" +" " + +#: tickettool\tickettool.py:947 +msgid "You cannot create a ticket for a bot." +msgstr "No se puede crear un ticket para un bot." + +#: tickettool\tickettool.py:950 +msgid "You cannot create a ticket for a member with a higher or equal role." +msgstr "No puede crear un ticket para un miembro con un rol superior o igual." + +#: tickettool\tickettool.py:970 +#, docstring +msgid "Export all the messages of an existing Ticket in html format.\n" +" Please note: all attachments and user avatars are saved with the Discord link in this file.\n" +" " +msgstr "Exporta todos los mensajes de un Ticket existente en formato html.\n" +" Nota: todos los archivos adjuntos y avatares de usuario se guardan con el enlace de Discord en este archivo.\n" +" " + +#: tickettool\tickettool.py:987 +msgid "Here is the html file of the transcript of all the messages in this ticket.\n" +"Please note: all attachments and user avatars are saved with the Discord link in this file." +msgstr "Aquí está el archivo html de la transcripción de todos los mensajes de este ticket.\n" +"Nota: todos los archivos adjuntos y avatares de usuario se guardan con el enlace de Discord en este archivo." + +#: tickettool\tickettool.py:1019 +#, docstring +msgid "Open an existing Ticket." +msgstr "Abra un Ticket existente." + +#: tickettool\tickettool.py:1024 +msgid "The ticket system is not enabled on this server." +msgstr "El sistema de tickets no está habilitado en este servidor." + +#: tickettool\tickettool.py:1050 +#, docstring +msgid "Close an existing Ticket." +msgstr "Cerrar un Ticket existente." + +#: tickettool\tickettool.py:1061 +msgid "Do you really want to close the ticket {ticket.id}?" +msgstr "¿Realmente quiere cerrar la entrada {ticket.id}?" + +#: tickettool\tickettool.py:1097 +#, docstring +msgid "Lock an existing Ticket." +msgstr "Bloquear un Ticket existente." + +#: tickettool\tickettool.py:1104 +msgid "Do you really want to lock the ticket {ticket.id}?" +msgstr "¿Realmente quieres bloquear la entrada {ticket.id}?" + +#: tickettool\tickettool.py:1139 +#, docstring +msgid "Unlock an existing locked Ticket." +msgstr "Desbloquear un Ticket bloqueado existente." + +#: tickettool\tickettool.py:1167 +#, docstring +msgid "Rename an existing Ticket." +msgstr "Cambiar el nombre de un Ticket existente." + +#: tickettool\tickettool.py:1193 +#, docstring +msgid "Delete an existing Ticket.\n\n" +" If a logs channel is defined, an html file containing all the messages of this ticket will be generated.\n" +" (Attachments are not supported, as they are saved with their Discord link)\n" +" " +msgstr "Eliminar un Ticket existente.\n\n" +" Si se define un canal de logs, se generará un archivo html con todos los mensajes de este ticket.\n" +" (No se admiten archivos adjuntos, ya que se guardan con su enlace de Discord)\n" +" " + +#: tickettool\tickettool.py:1202 +msgid "Do you really want to delete all the messages of the ticket {ticket.id}?" +msgstr "¿Realmente quieres borrar todos los mensajes del ticket {ticket.id}?" + +#: tickettool\tickettool.py:1206 +msgid "If a logs channel is defined, an html file containing all the messages of this ticket will be generated. (Attachments are not supported, as they are saved with their Discord link.)" +msgstr "Si se define un canal de logs, se generará un archivo html con todos los mensajes de este ticket. (No se admiten archivos adjuntos, ya que se guardan con su enlace de Discord.)" + +#: tickettool\tickettool.py:1242 +#, docstring +msgid "Claim an existing Ticket." +msgstr "Reclamar un billete existente." + +#: tickettool\tickettool.py:1266 +#, docstring +msgid "Unclaim an existing Ticket." +msgstr "Anular la reclamación de un billete existente." + +#: tickettool\tickettool.py:1292 +#, docstring +msgid "Change the owner of an existing Ticket." +msgstr "Cambiar el propietario de un Ticket existente." + +#: tickettool\tickettool.py:1318 +#, docstring +msgid "Add a member to an existing Ticket." +msgstr "Añadir un miembro a un Ticket existente." + +#: tickettool\tickettool.py:1343 +#, docstring +msgid "Remove a member to an existing Ticket." +msgstr "Eliminar un miembro de un Ticket existente." + +#: tickettool\tickettool.py:1357 +#, docstring +msgid "List the existing Tickets for a profile. You can provide a status and/or a ticket owner." +msgstr "Lista los Tickets existentes para un perfil. Puede proporcionar un estado y/o un propietario de ticket." + +#: tickettool\tickettool.py:1378 +msgid "No tickets to show." +msgstr "No hay entradas para el espectáculo." + +#: tickettool\tickettool.py:1419 +msgid "The profile for which this button was configured no longer exists." +msgstr "El perfil para el que se configuró este botón ya no existe." + +#: tickettool\tickettool.py:1482 tickettool\tickettool.py:1541 +#: tickettool\tickettool.py:1545 tickettool\tickettool.py:1563 +#: tickettool\tickettool.py:1567 tickettool\tickettool.py:1587 +#: tickettool\tickettool.py:1591 tickettool\tickettool.py:1661 +#: tickettool\tickettool.py:1665 +msgid "You are not allowed to execute this command." +msgstr "No está permitido ejecutar este comando." + +#: tickettool\tickettool.py:1486 tickettool\tickettool.py:1491 +#: tickettool\tickettool.py:1495 +msgid "You have chosen to create a ticket." +msgstr "Ha elegido crear un ticket." + +#: tickettool\tickettool.py:1517 +msgid "You have chosen to close this ticket. If this is not done, you do not have the necessary permissions to execute this command." +msgstr "Ha elegido cerrar este ticket. Si no lo hace, no dispone de los permisos necesarios para ejecutar este comando." + +#: tickettool\tickettool.py:1549 +msgid "You have chosen to re-open this ticket." +msgstr "Ha optado por reabrir este ticket." + +#: tickettool\tickettool.py:1571 +msgid "You have chosen to claim this ticket. If this is not done, you do not have the necessary permissions to execute this command." +msgstr "Ha elegido reclamar este billete. Si no lo ha hecho, no dispone de los permisos necesarios para ejecutar este comando." + +#: tickettool\tickettool.py:1611 +msgid "This message is not in TicketTool config." +msgstr "Este mensaje no está en la configuración de TicketTool." + +#: tickettool\tickettool.py:1620 +msgid "The profile for which this dropdown was configured no longer exists." +msgstr "El perfil para el que se configuró este desplegable ya no existe." + +#: tickettool\tickettool.py:1687 tickettool\tickettool.py:1694 +msgid "You have chosen to create a ticket with the reason `{reason}`." +msgstr "Ha elegido crear un ticket con el motivo `{reason}`." + +#: tickettool\tickettool.py:1840 +msgid "No open tickets by this user in this server." +msgstr "No hay tickets abiertos por este usuario en este servidor." + +#: tickettool\utils.py:143 +msgid "Emoji Label must be An emoji followed by a label, and optionnaly by a description and a value (for rename ticket channel), separated by either `;`, `,`, `|`, or `-`." +msgstr "Etiqueta Emoji debe ser Un emoji seguido de una etiqueta, y opcionalmente de una descripción y un valor (para renombrar el canal del ticket), separados por `;`, `,`, `|`, o `-`." + +#: tickettool\utils.py:160 +msgid "Error parsing YAML. Please make sure the format is valid (a YAML validator may help)" +msgstr "Error al analizar YAML. Por favor, asegúrese de que el formato es válido (un validador de YAML puede ayudar)" + +#: tickettool\utils.py:174 +msgid "You can only have 5 text inputs." +msgstr "Sólo puede tener 5 entradas de texto." + +#: tickettool\utils.py:180 +msgid "The argument `/{count}/{arg}` is required in the YAML." +msgstr "El argumento `/{count}/{arg}` es necesario en el YAML." + +#: tickettool\utils.py:187 +msgid "The argument `/{count}/{arg}` is invalid in the YAML. Check the spelling." +msgstr "El argumento `/{count}/{arg}` no es válido en el YAML. Compruebe la ortografía." + +#: tickettool\utils.py:193 +msgid "The argument `/modal/{count}/label` must be less than 45 characters long." +msgstr "El argumento `/modal/{count}/label` debe tener menos de 45 caracteres." + +#: tickettool\utils.py:203 tickettool\utils.py:209 +msgid "The argument `/{count}/style` must be a number between 1 and 2." +msgstr "El argumento `/{count}/style` debe ser un número entre 1 y 2." + +#: tickettool\utils.py:232 +msgid "The argument `/{count}/required` must be a boolean (True or False)." +msgstr "El argumento `/{count}/required` debe ser un booleano (True o False)." + +#: tickettool\utils.py:242 +msgid "The argument `/modal/{count}/default` must be less than 4000 characters long." +msgstr "El argumento `/modal/{count}/default` debe tener menos de 4000 caracteres." + +#: tickettool\utils.py:250 +msgid "The argument `/modal/{count}/placeholder` must be less than 100 characters long." +msgstr "El argumento `/modal/{count}/placeholder` debe tener menos de 100 caracteres." + +#: tickettool\utils.py:258 +msgid "The argument `/modal/{count}/min_length` must be between 0 and 4000." +msgstr "El argumento `/modal/{count}/min_length` debe estar entre 0 y 4000." + +#: tickettool\utils.py:266 +msgid "The argument `/modal/{count}/max_length` must be between 0 and 4000." +msgstr "El argumento `/modal/{count}/longitud_max` debe estar entre 0 y 4000." + diff --git a/tickettool/locales/fi-FI.po b/tickettool/locales/fi-FI.po new file mode 100644 index 0000000..528b3cf --- /dev/null +++ b/tickettool/locales/fi-FI.po @@ -0,0 +1,584 @@ +msgid "" +msgstr "" +"Project-Id-Version: aaa3a-cogs\n" +"POT-Creation-Date: 2024-07-20 22:15+0200\n" +"PO-Revision-Date: 2024-07-21 15:13\n" +"Last-Translator: \n" +"Language-Team: Finnish\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: redgettext 3.4.2\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Crowdin-Project: aaa3a-cogs\n" +"X-Crowdin-Project-ID: 531090\n" +"X-Crowdin-Language: fi\n" +"X-Crowdin-File: /[AAA3A-AAA3A.AAA3A-cogs] main/tickettool/locales/messages.pot\n" +"X-Crowdin-File-ID: 102\n" +"Language: fi_FI\n" + +#: tickettool\settings.py:15 tickettool\settings.py:18 +#: tickettool\tickettool.py:759 tickettool\tickettool.py:762 +msgid "This profile does not exist." +msgstr "Tätä profiilia ei ole olemassa." + +#: tickettool\settings.py:27 +msgid "I have to be the author of the message. You can use EmbedUtils by AAA3A to send one." +msgstr "Minun on oltava viestin kirjoittaja. Voit käyttää AAA3A:n EmbedUtils-ohjelmaa sellaisen lähettämiseen." + +#: tickettool\settings.py:54 +#, docstring +msgid "Send a message with a button to open a ticket or dropdown with possible reasons.\n\n" +" Examples:\n" +" - `[p]settickettool message #general \"🐛|Report a bug|If you find a bug, report it here.|bug\" \"⚠️|Report a user|If you find a malicious user, report it here.|user\"`\n" +" - `[p]settickettool 1234567890-0987654321`\n" +" " +msgstr "Lähetä viesti, jossa on painike tiketin avaamiseksi tai pudotusvalikko, jossa on mahdolliset syyt.\n\n" +" Esimerkkejä:\n" +" - `[p]settickettool message #general \"🐛|Report a bug|If you find a bug, report it here.|bug\" \"⚠️|Report a user|If you find a malicious user, report it here.|user\"`\n" +" - `[p]settickettool 1234567890-0987654321`\n" +" " + +#: tickettool\settings.py:70 +msgid "I don't have sufficient permissions in this channel to view it and to send messages into." +msgstr "Minulla ei ole riittäviä oikeuksia tähän kanavaan, jotta voisin tarkastella sitä ja lähettää sinne viestejä." + +#: tickettool\settings.py:97 tickettool\tickettool.py:339 +msgid "Create ticket" +msgstr "Luo lippu" + +#: tickettool\settings.py:116 +msgid "A different value must be provided for each dropdown option." +msgstr "Jokaiselle pudotusvalinnalle on annettava eri arvo." + +#: tickettool\settings.py:124 +msgid "An emoji you selected seems invalid. Check that it is an emoji. If you have Nitro, you may have used a custom emoji from another server." +msgstr "Valitsemasi emoji vaikuttaa virheelliseltä. Tarkista, että se on emoji. Jos sinulla on Nitro, olet saattanut käyttää muokatun emojin toisesta palvelimesta." + +#: tickettool\ticket.py:245 +msgid "Creating the ticket {ticket.id}." +msgstr "Lipun luominen {ticket.id}." + +#: tickettool\ticket.py:266 +msgid "The dynamic channel name does not contain correct variable names and must be re-configured with `[p]settickettool dynamicchannelname`." +msgstr "Dynaaminen kanavan nimi ei sisällä oikeita muuttujien nimiä, ja se on määritettävä uudelleen komennolla `[p]settickettool dynamicchannelname`." + +#: tickettool\ticket.py:275 tickettool\ticket.py:528 tickettool\ticket.py:890 +#: tickettool\ticket.py:969 tickettool\tickettool.py:352 +msgid "Close" +msgstr "Sulje" + +#: tickettool\ticket.py:282 tickettool\ticket.py:535 tickettool\ticket.py:615 +#: tickettool\ticket.py:897 tickettool\ticket.py:976 +#: tickettool\tickettool.py:366 +msgid "Claim" +msgstr "Vaatimus" + +#: tickettool\ticket.py:289 tickettool\ticket.py:542 tickettool\ticket.py:622 +#: tickettool\ticket.py:904 tickettool\ticket.py:983 +#: tickettool\tickettool.py:373 +msgid "Delete" +msgstr "Poista" + +#: tickettool\ticket.py:303 tickettool\ticket.py:429 +msgid "Ticket Created" +msgstr "Lippu luotu" + +#: tickettool\ticket.py:304 +msgid "Thank you for creating a ticket on this server!" +msgstr "Kiitos, että olet luonut tiketin tälle palvelimelle!" + +#: tickettool\ticket.py:315 +msgid "🎟️ Ticket ID: {ticket.id}\n" +"🕵️ Ticket created by: @{ticket.created_by.display_name} ({ticket.created_by.id})\n" +"☢️ Ticket reason: {short_reason}\n" +msgstr "🎟️ Lipun tunnus: {ticket.id}\n" +"Lippu on luonut: 🕵️ Ticket created by:{ticket.created_by.display_name}{ticket.created_by.id}\n" +"☢️ Lipun syy: {short_reason}\n" + +#: tickettool\ticket.py:395 +msgid "⚠ At least one user (the ticket owner or a team member) could not be added to the ticket thread. Maybe the user doesn't have access to the parent forum/text channel. If the server uses private threads in a text channel, the bot does not have the `manage_messages` permission in this channel." +msgstr "⚠ Ainakin yhtä käyttäjää (tiketin omistajaa tai tiimin jäsentä) ei voitu lisätä tikettisäikeeseen. Ehkä käyttäjällä ei ole pääsyä vanhempaan foorumiin/tekstikanavaan. Jos palvelin käyttää yksityisiä viestiketjuja tekstikanavassa, botilla ei ole `manage_messages`-oikeutta tässä kanavassa." + +#: tickettool\ticket.py:430 +msgid "The ticket was created by {ticket.created_by}." +msgstr "Lipun on luonut {ticket.created_by}." + +#: tickettool\ticket.py:436 +msgid "Report on the creation of the ticket {ticket.id}." +msgstr "Raportti lipun luomisesta {ticket.id}." + +#: tickettool\ticket.py:476 +msgid "Opening the ticket {ticket.id}." +msgstr "Lipun avaaminen {ticket.id}." + +#: tickettool\ticket.py:505 tickettool\ticket.py:513 +msgid "Ticket Opened" +msgstr "Lippu avattu" + +#: tickettool\ticket.py:514 +msgid "The ticket was opened by {ticket.opened_by}." +msgstr "Lipun avasi {ticket.opened_by}." + +#: tickettool\ticket.py:520 tickettool\ticket.py:600 +msgid "Report on the close of the ticket {ticket.id}." +msgstr "Raportti lipunmyynnin päättymisestä {ticket.id}." + +#: tickettool\ticket.py:608 tickettool\tickettool.py:359 +msgid "Re-open" +msgstr "Avaa uudelleen" + +#: tickettool\ticket.py:675 tickettool\ticket.py:712 +#: tickettool\tickettool.py:1100 tickettool\tickettool.py:1142 +msgid "Cannot execute action on a text channel." +msgstr "Toimintaa ei voida suorittaa tekstikanavalla." + +#: tickettool\ticket.py:701 +msgid "Report on the lock of the ticket {ticket.id}." +msgstr "Raportti lipun lukituksesta {ticket.id}." + +#: tickettool\ticket.py:738 +msgid "Report on the unlock of the ticket {ticket.id}." +msgstr "Raportti lipun lukituksen avaamisesta {ticket.id}." + +#: tickettool\ticket.py:755 +msgid "Renaming the ticket {ticket.id}. (`{ticket.channel.name}` to `{new_name}`)" +msgstr "Lipun {ticket.id}uudelleen nimeäminen (`{ticket.channel.name}` muotoon `{new_name}`)." + +#: tickettool\ticket.py:765 +msgid "Ticket Renamed." +msgstr "Lippu nimettiin uudelleen." + +#: tickettool\ticket.py:783 +msgid "Ticket Deleted" +msgstr "Lippu poistettu" + +#: tickettool\ticket.py:784 +msgid "The ticket was deleted by {ticket.deleted_by}." +msgstr "{ticket.deleted_by}poisti lipun." + +#: tickettool\ticket.py:807 +msgid "Report on the deletion of the ticket {ticket.id}." +msgstr "Raportti lipun poistamisesta {ticket.id}." + +#: tickettool\ticket.py:824 +msgid "Deleting the ticket {ticket.id}." +msgstr "Lipun poistaminen {ticket.id}." + +#: tickettool\ticket.py:845 +msgid "A ticket cannot be claimed if it is closed." +msgstr "Jos lippu on suljettu, sitä ei voi lunastaa." + +#: tickettool\ticket.py:849 +msgid "A bot cannot claim a ticket." +msgstr "Botti ei voi lunastaa lippua." + +#: tickettool\ticket.py:863 +msgid "Claiming the ticket {ticket.id}." +msgstr "Lipun lunastaminen {ticket.id}." + +#: tickettool\ticket.py:918 +msgid "Ticket claimed." +msgstr "Lippu lunastettu." + +#: tickettool\ticket.py:932 +msgid "A ticket cannot be unclaimed if it is closed." +msgstr "Lippua ei voi jättää lunastamatta, jos se on suljettu." + +#: tickettool\ticket.py:948 +msgid "Unclaiming the ticket {ticket.id}." +msgstr "Lipun peruuttaminen {ticket.id}." + +#: tickettool\ticket.py:997 +msgid "Ticket unclaimed." +msgstr "Lippu lunastamatta." + +#: tickettool\ticket.py:1011 +msgid "Cannot execute action in a thread channel." +msgstr "Toimintaa ei voida suorittaa säikeen kanavassa." + +#: tickettool\ticket.py:1018 +msgid "Changing owner of the ticket {ticket.id}." +msgstr "Lipun omistajan vaihtaminen {ticket.id}." + +#: tickettool\ticket.py:1022 +msgid "You cannot transfer ownership of a ticket to a bot." +msgstr "Et voi siirtää lipun omistusoikeutta botille." + +#: tickettool\ticket.py:1051 +msgid "Owner Modified." +msgstr "Omistaja Muutettu." + +#: tickettool\ticket.py:1070 +msgid "Adding a member to the ticket {ticket.id}." +msgstr "Jäsenen lisääminen lippuun {ticket.id}." + +#: tickettool\ticket.py:1077 tickettool\ticket.py:1114 +msgid "You cannot add a bot to a ticket. ({member})" +msgstr "Et voi lisätä botteja tikettiin. ({member})" + +#: tickettool\ticket.py:1081 tickettool\ticket.py:1118 +msgid "This member is already the owner of this ticket. ({member})" +msgstr "Tämä jäsen on jo tämän lipun omistaja. ({member})" + +#: tickettool\ticket.py:1087 tickettool\ticket.py:1124 +msgid "This member is an administrator for the tickets system. They will always have access to the ticket anyway. ({member})" +msgstr "Tämä jäsen on lippujärjestelmän ylläpitäjä. Hänellä on joka tapauksessa aina pääsy lippuun. ({member})" + +#: tickettool\ticket.py:1093 tickettool\ticket.py:1130 +msgid "This member already has access to this ticket. ({member})" +msgstr "Tällä jäsenellä on jo pääsy tähän lippuun. ({member})" + +#: tickettool\ticket.py:1144 +msgid "⚠ At least one user (the ticket owner or a team member) could not be added to the ticket thread. Maybe the user the user doesn't have access to the parent forum/text channel. If the server uses private threads in a text channel, the bot does not have the `manage_messages` permission in this channel." +msgstr "⚠ Ainakin yhtä käyttäjää (tiketin omistajaa tai tiimin jäsentä) ei voitu lisätä tikettisäikeeseen. Ehkä käyttäjällä käyttäjällä ei ole pääsyä vanhempaan foorumiin/tekstikanavaan. Jos palvelin käyttää yksityisiä viestiketjuja tekstikanavassa, botilla ei ole `manage_messages`-oikeutta tässä kanavassa." + +#: tickettool\ticket.py:1168 +msgid "Removing a member to the ticket {ticket.id}." +msgstr "Jäsenen poistaminen lipusta {ticket.id}." + +#: tickettool\ticket.py:1174 tickettool\ticket.py:1204 +msgid "You cannot remove a bot to a ticket ({member})." +msgstr "Et voi poistaa botin tikettiin ({member})." + +#: tickettool\ticket.py:1180 tickettool\ticket.py:1210 +msgid "You cannot remove the owner of this ticket. ({member})" +msgstr "Et voi poistaa tämän lipun omistajaa. ({member})" + +#: tickettool\ticket.py:1186 tickettool\ticket.py:1216 +msgid "This member is an administrator for the tickets system. They will always have access to the ticket. ({member})" +msgstr "Tämä jäsen on lippujärjestelmän ylläpitäjä. Hänellä on aina pääsy tikettiin. ({member})" + +#: tickettool\ticket.py:1192 tickettool\ticket.py:1222 +msgid "This member is not in the list of those authorised to access the ticket. ({member})" +msgstr "Tämä jäsen ei ole niiden henkilöiden luettelossa, joilla on oikeus käyttää lippua. ({member})" + +#: tickettool\tickettool.py:32 +#, docstring +msgid "A cog to manage a tickets system!" +msgstr "Hammasratas lippujärjestelmän hallinnoimiseksi!" + +#: tickettool\tickettool.py:74 +msgid "To get help on this server or to make an order for example, you can create a ticket.\n" +"Just use the command `{prefix}ticket create` or click on the button below.\n" +"You can then use the `{prefix}ticket` subcommands to manage your ticket." +msgstr "Jos haluat saada apua palvelimesta tai tehdä esimerkiksi tilauksen, voit luoda tiketin.\n" +"Käytä komentoa `{prefix}ticket create` tai klikkaa alla olevaa painiketta.\n" +"Sen jälkeen voit käyttää `{prefix}ticket`-alikomentoja lippusi hallintaan." + +#: tickettool\tickettool.py:403 +msgid "Choose the reason for open a ticket." +msgstr "Valitse syy lipun avaamiseen." + +#: tickettool\tickettool.py:521 +msgid "Action taken for the ticket system." +msgstr "Toteutetut toimet lippujärjestelmää varten." + +#: tickettool\tickettool.py:555 +msgid "Ticket ID:" +msgstr "Lipun tunnus:" + +#: tickettool\tickettool.py:558 +msgid "Owned by:" +msgstr "Omistaa:" + +#: tickettool\tickettool.py:566 +msgid "Channel:" +msgstr "Kanava:" + +#: tickettool\tickettool.py:573 +msgid "Closed by:" +msgstr "Suljettu:" + +#: tickettool\tickettool.py:581 +msgid "Deleted by:" +msgstr "Poistettu:" + +#: tickettool\tickettool.py:589 +msgid "Closed at:" +msgstr "Suljettu:" + +#: tickettool\tickettool.py:596 tickettool\tickettool.py:622 +msgid "Reason:" +msgstr "Syy:" + +#: tickettool\tickettool.py:607 +msgid "Ticket [{ticket.profile}] {ticket.id} - Action taken" +msgstr "Lippu [{ticket.profile}] {ticket.id} - Toimiiko komissio?" + +#: tickettool\tickettool.py:687 +msgid "You're not in a ticket." +msgstr "Sinulla ei ole lippua." + +#: tickettool\tickettool.py:691 +msgid "This ticket isn't {status}ed." +msgstr "Tämä lippu ei ole {status}ed." + +#: tickettool\tickettool.py:700 +msgid "This ticket is {status}." +msgstr "Tämä lippu on {status}." + +#: tickettool\tickettool.py:709 +msgid "You're not allowed to lock this ticket." +msgstr "Et saa lukita tätä lippua." + +#: tickettool\tickettool.py:752 +msgid "You're not allowed to view this ticket." +msgstr "Et saa katsoa tätä lippua." + +#: tickettool\tickettool.py:786 +msgid "Please provide a profile." +msgstr "Anna profiili." + +#: tickettool\tickettool.py:789 +msgid "No profile has been created on this server." +msgstr "Tällä palvelimella ei ole luotu profiilia." + +#: tickettool\tickettool.py:797 +msgid "The ticket system is not enabled on this server. Please ask an administrator of this server to use the `{ctx.prefix}settickettool` subcommands to configure it." +msgstr "Lippujärjestelmä ei ole käytössä tällä palvelimella. Pyydä tämän palvelimen ylläpitäjää käyttämään `{ctx.prefix}settickettool`-alikomentoja sen määrittämiseksi." + +#: tickettool\tickettool.py:803 +msgid "The category `open` or the category `close` have not been configured. Please ask an administrator of this server to use the `{ctx.prefix}settickettool` subcommands to configure it." +msgstr "Luokkaa `open` tai luokkaa `close` ei ole määritetty. Pyydä tämän palvelimen ylläpitäjää käyttämään `{ctx.prefix}settickettool`-alikomentoja niiden määrittämiseksi." + +#: tickettool\tickettool.py:810 +msgid "Sorry. You have already reached the limit of {limit} open tickets." +msgstr "Olen pahoillani. Olet jo saavuttanut {limit} avoimien lippujen rajan." + +#: tickettool\tickettool.py:821 +msgid "The bot does not have `manage_channels` permission on the `open` and `close` categories to allow the ticket system to function properly. Please notify an administrator of this server." +msgstr "Botilla ei ole `manage_channels`-oikeutta kategorioihin `open` ja `close`, jotta lippujärjestelmä toimisi oikein. Ilmoita asiasta tämän palvelimen ylläpitäjälle." + +#: tickettool\tickettool.py:830 +msgid "The bot does not have `manage_channel` permission in the forum channel to allow the ticket system to function properly. Please notify an administrator of this server." +msgstr "Botilla ei ole `manage_channel`-oikeutta foorumikanavalla, jotta tikettijärjestelmä toimisi oikein. Ilmoita asiasta tämän palvelimen ylläpitäjälle." + +#: tickettool\tickettool.py:875 +msgid "Please provide the required informations by clicking on the button below." +msgstr "Anna tarvittavat tiedot klikkaamalla alla olevaa painiketta." + +#: tickettool\tickettool.py:926 +#, docstring +msgid "Create a Ticket.\n\n" +" If only one profile has been created on this server, you don't need to specify its name.\n" +" " +msgstr "Luo lippu.\n\n" +" Jos palvelimelle on luotu vain yksi profiili, sen nimeä ei tarvitse määrittää.\n" +" " + +#: tickettool\tickettool.py:942 +#, docstring +msgid "Create a Ticket for a member.\n\n" +" If only one profile has been created on this server, you don't need to specify its name.\n" +" " +msgstr "Luo jäsenelle lippu.\n\n" +" Jos palvelimelle on luotu vain yksi profiili, sen nimeä ei tarvitse määrittää.\n" +" " + +#: tickettool\tickettool.py:947 +msgid "You cannot create a ticket for a bot." +msgstr "Et voi luoda tikettiä botille." + +#: tickettool\tickettool.py:950 +msgid "You cannot create a ticket for a member with a higher or equal role." +msgstr "Et voi luoda tikettiä jäsenelle, jolla on korkeampi tai vastaava rooli." + +#: tickettool\tickettool.py:970 +#, docstring +msgid "Export all the messages of an existing Ticket in html format.\n" +" Please note: all attachments and user avatars are saved with the Discord link in this file.\n" +" " +msgstr "Vie kaikki olemassa olevan lipun viestit html-muodossa.\n" +" Huomaa: kaikki liitetiedostot ja käyttäjän avatarit tallennetaan tässä tiedostossa olevan Discord-linkin mukana.\n" +" " + +#: tickettool\tickettool.py:987 +msgid "Here is the html file of the transcript of all the messages in this ticket.\n" +"Please note: all attachments and user avatars are saved with the Discord link in this file." +msgstr "Tässä on html-tiedosto, jossa on kaikkien tämän tiketin viestien jäljennös.\n" +"Huomaa: kaikki liitetiedostot ja käyttäjän avatarit tallennetaan tässä tiedostossa olevan Discord-linkin avulla." + +#: tickettool\tickettool.py:1019 +#, docstring +msgid "Open an existing Ticket." +msgstr "Avaa olemassa oleva lippu." + +#: tickettool\tickettool.py:1024 +msgid "The ticket system is not enabled on this server." +msgstr "Lippujärjestelmä ei ole käytössä tällä palvelimella." + +#: tickettool\tickettool.py:1050 +#, docstring +msgid "Close an existing Ticket." +msgstr "Sulje olemassa oleva lippu." + +#: tickettool\tickettool.py:1061 +msgid "Do you really want to close the ticket {ticket.id}?" +msgstr "Haluatko todella sulkea lipun {ticket.id}?" + +#: tickettool\tickettool.py:1097 +#, docstring +msgid "Lock an existing Ticket." +msgstr "Lukitse olemassa oleva lippu." + +#: tickettool\tickettool.py:1104 +msgid "Do you really want to lock the ticket {ticket.id}?" +msgstr "Haluatko todella lukita lipun {ticket.id}?" + +#: tickettool\tickettool.py:1139 +#, docstring +msgid "Unlock an existing locked Ticket." +msgstr "Avaa olemassa olevan lukitun lipun lukitus." + +#: tickettool\tickettool.py:1167 +#, docstring +msgid "Rename an existing Ticket." +msgstr "Nimeä olemassa oleva lippu uudelleen." + +#: tickettool\tickettool.py:1193 +#, docstring +msgid "Delete an existing Ticket.\n\n" +" If a logs channel is defined, an html file containing all the messages of this ticket will be generated.\n" +" (Attachments are not supported, as they are saved with their Discord link)\n" +" " +msgstr "Poista olemassa oleva lippu.\n\n" +" Jos lokikanava on määritetty, luodaan html-tiedosto, joka sisältää kaikki tämän tiketin viestit.\n" +" (Liitetiedostoja ei tueta, koska ne tallennetaan Discord-linkin kanssa)\n" +" " + +#: tickettool\tickettool.py:1202 +msgid "Do you really want to delete all the messages of the ticket {ticket.id}?" +msgstr "Haluatko todella poistaa kaikki lipun {ticket.id}viestit?" + +#: tickettool\tickettool.py:1206 +msgid "If a logs channel is defined, an html file containing all the messages of this ticket will be generated. (Attachments are not supported, as they are saved with their Discord link.)" +msgstr "Jos lokikanava on määritelty, luodaan html-tiedosto, joka sisältää kaikki tämän lipun viestit. (Liitetiedostoja ei tueta, koska ne tallennetaan Discord-linkin kanssa.)" + +#: tickettool\tickettool.py:1242 +#, docstring +msgid "Claim an existing Ticket." +msgstr "Lunasta olemassa oleva lippu." + +#: tickettool\tickettool.py:1266 +#, docstring +msgid "Unclaim an existing Ticket." +msgstr "Olemassa olevan lipun lunastuksen peruuttaminen." + +#: tickettool\tickettool.py:1292 +#, docstring +msgid "Change the owner of an existing Ticket." +msgstr "Olemassa olevan lipun omistajan vaihtaminen." + +#: tickettool\tickettool.py:1318 +#, docstring +msgid "Add a member to an existing Ticket." +msgstr "Lisää jäsen olemassa olevaan lippuun." + +#: tickettool\tickettool.py:1343 +#, docstring +msgid "Remove a member to an existing Ticket." +msgstr "Poistaa jäsenen olemassa olevasta lipusta." + +#: tickettool\tickettool.py:1357 +#, docstring +msgid "List the existing Tickets for a profile. You can provide a status and/or a ticket owner." +msgstr "Luettelo profiilin olemassa olevista lipuista. Voit antaa tiketin tilan ja/tai omistajan." + +#: tickettool\tickettool.py:1378 +msgid "No tickets to show." +msgstr "Ei lippuja näytettäväksi." + +#: tickettool\tickettool.py:1419 +msgid "The profile for which this button was configured no longer exists." +msgstr "Profiilia, jolle tämä painike määritettiin, ei enää ole." + +#: tickettool\tickettool.py:1482 tickettool\tickettool.py:1541 +#: tickettool\tickettool.py:1545 tickettool\tickettool.py:1563 +#: tickettool\tickettool.py:1567 tickettool\tickettool.py:1587 +#: tickettool\tickettool.py:1591 tickettool\tickettool.py:1661 +#: tickettool\tickettool.py:1665 +msgid "You are not allowed to execute this command." +msgstr "Et saa suorittaa tätä komentoa." + +#: tickettool\tickettool.py:1486 tickettool\tickettool.py:1491 +#: tickettool\tickettool.py:1495 +msgid "You have chosen to create a ticket." +msgstr "Olet päättänyt luoda lipun." + +#: tickettool\tickettool.py:1517 +msgid "You have chosen to close this ticket. If this is not done, you do not have the necessary permissions to execute this command." +msgstr "Olet päättänyt sulkea tämän tiketin. Jos näin ei tehdä, sinulla ei ole tarvittavia oikeuksia tämän komennon suorittamiseen." + +#: tickettool\tickettool.py:1549 +msgid "You have chosen to re-open this ticket." +msgstr "Olet päättänyt avata tämän lipun uudelleen." + +#: tickettool\tickettool.py:1571 +msgid "You have chosen to claim this ticket. If this is not done, you do not have the necessary permissions to execute this command." +msgstr "Olet päättänyt lunastaa tämän lipun. Jos näin ei ole tehty, sinulla ei ole tarvittavia oikeuksia tämän komennon suorittamiseen." + +#: tickettool\tickettool.py:1611 +msgid "This message is not in TicketTool config." +msgstr "Tämä viesti ei ole TicketToolin konfiguraatiossa." + +#: tickettool\tickettool.py:1620 +msgid "The profile for which this dropdown was configured no longer exists." +msgstr "Profiilia, jolle tämä pudotusvalikko määritettiin, ei enää ole olemassa." + +#: tickettool\tickettool.py:1687 tickettool\tickettool.py:1694 +msgid "You have chosen to create a ticket with the reason `{reason}`." +msgstr "Olet päättänyt luoda tiketin, jonka syy on `{reason}`." + +#: tickettool\tickettool.py:1840 +msgid "No open tickets by this user in this server." +msgstr "Tällä käyttäjällä ei ole avoimia lippuja tällä palvelimella." + +#: tickettool\utils.py:143 +msgid "Emoji Label must be An emoji followed by a label, and optionnaly by a description and a value (for rename ticket channel), separated by either `;`, `,`, `|`, or `-`." +msgstr "Emoji-tunnisteen on oltava Emoji, jota seuraa tunniste ja mahdollisesti kuvaus ja arvo (jos haluat nimetä lippukanavan uudelleen), erotettuna joko `;`, `,`, `|` tai `-`." + +#: tickettool\utils.py:160 +msgid "Error parsing YAML. Please make sure the format is valid (a YAML validator may help)" +msgstr "Virhe YAML: n jäsentämisessä. Varmista, että formaatti on kelvollinen (YAML-validointiohjelma voi auttaa)" + +#: tickettool\utils.py:174 +msgid "You can only have 5 text inputs." +msgstr "Tekstinsyöttöjä voi olla vain 5 kappaletta." + +#: tickettool\utils.py:180 +msgid "The argument `/{count}/{arg}` is required in the YAML." +msgstr "YAML:ssä vaaditaan argumentti `/{count}/{arg}`." + +#: tickettool\utils.py:187 +msgid "The argument `/{count}/{arg}` is invalid in the YAML. Check the spelling." +msgstr "Argumentti `/{count}/{arg}` on virheellinen YAML:ssä. Tarkista oikeinkirjoitus." + +#: tickettool\utils.py:193 +msgid "The argument `/modal/{count}/label` must be less than 45 characters long." +msgstr "Argumentin `/modal/{count}/label` on oltava alle 45 merkkiä pitkä." + +#: tickettool\utils.py:203 tickettool\utils.py:209 +msgid "The argument `/{count}/style` must be a number between 1 and 2." +msgstr "Argumentin `/{count}/style` on oltava numero välillä 1 ja 2." + +#: tickettool\utils.py:232 +msgid "The argument `/{count}/required` must be a boolean (True or False)." +msgstr "Argumentin `/{count}/required` on oltava boolean (True tai False)." + +#: tickettool\utils.py:242 +msgid "The argument `/modal/{count}/default` must be less than 4000 characters long." +msgstr "Argumentin `/modal/{count}/default` on oltava alle 4000 merkkiä pitkä." + +#: tickettool\utils.py:250 +msgid "The argument `/modal/{count}/placeholder` must be less than 100 characters long." +msgstr "Argumentin `/modal/{count}/placeholder` on oltava alle 100 merkkiä pitkä." + +#: tickettool\utils.py:258 +msgid "The argument `/modal/{count}/min_length` must be between 0 and 4000." +msgstr "Argumentin `/modal/{count}/min_length` on oltava välillä 0-4000." + +#: tickettool\utils.py:266 +msgid "The argument `/modal/{count}/max_length` must be between 0 and 4000." +msgstr "Argumentin `/modal/{count}/max_length` on oltava välillä 0-4000." + diff --git a/tickettool/locales/fr-FR.po b/tickettool/locales/fr-FR.po new file mode 100644 index 0000000..7722983 --- /dev/null +++ b/tickettool/locales/fr-FR.po @@ -0,0 +1,584 @@ +msgid "" +msgstr "" +"Project-Id-Version: aaa3a-cogs\n" +"POT-Creation-Date: 2024-07-20 22:15+0200\n" +"PO-Revision-Date: 2024-07-21 15:13\n" +"Last-Translator: \n" +"Language-Team: French\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: redgettext 3.4.2\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"X-Crowdin-Project: aaa3a-cogs\n" +"X-Crowdin-Project-ID: 531090\n" +"X-Crowdin-Language: fr\n" +"X-Crowdin-File: /[AAA3A-AAA3A.AAA3A-cogs] main/tickettool/locales/messages.pot\n" +"X-Crowdin-File-ID: 102\n" +"Language: fr_FR\n" + +#: tickettool\settings.py:15 tickettool\settings.py:18 +#: tickettool\tickettool.py:759 tickettool\tickettool.py:762 +msgid "This profile does not exist." +msgstr "Ce profil n'existe pas." + +#: tickettool\settings.py:27 +msgid "I have to be the author of the message. You can use EmbedUtils by AAA3A to send one." +msgstr "Je dois être l'auteur du message. Vous pouvez utiliser EmbedUtils by AAA3A pour en envoyer un." + +#: tickettool\settings.py:54 +#, docstring +msgid "Send a message with a button to open a ticket or dropdown with possible reasons.\n\n" +" Examples:\n" +" - `[p]settickettool message #general \"🐛|Report a bug|If you find a bug, report it here.|bug\" \"⚠️|Report a user|If you find a malicious user, report it here.|user\"`\n" +" - `[p]settickettool 1234567890-0987654321`\n" +" " +msgstr "Envoyer un message avec un bouton pour ouvrir un ticket ou une liste déroulante avec les raisons possibles.\n\n" +" Exemples :\n" +" - `[p]settickettool message #general \"🐛|Report a bug|If you find a bug, report it here.|bug\" \"⚠️|Report a user|If you find a malicious user, report it here.|user\"`\n" +" - `[p]settickettool 1234567890-0987654321`\n" +" " + +#: tickettool\settings.py:70 +msgid "I don't have sufficient permissions in this channel to view it and to send messages into." +msgstr "Je n'ai pas les permissions suffisantes dans ce canal pour le voir et y envoyer des messages." + +#: tickettool\settings.py:97 tickettool\tickettool.py:339 +msgid "Create ticket" +msgstr "Créer un ticket" + +#: tickettool\settings.py:116 +msgid "A different value must be provided for each dropdown option." +msgstr "Une valeur différente doit être fournie pour chaque option de la liste déroulante." + +#: tickettool\settings.py:124 +msgid "An emoji you selected seems invalid. Check that it is an emoji. If you have Nitro, you may have used a custom emoji from another server." +msgstr "L'emoji que vous avez sélectionné ne semble pas valide. Vérifiez qu'il s'agit bien d'un emoji. Si vous avez Nitro, vous avez peut-être utilisé un emoji personnalisé provenant d'un autre serveur." + +#: tickettool\ticket.py:245 +msgid "Creating the ticket {ticket.id}." +msgstr "Création du ticket {ticket.id}." + +#: tickettool\ticket.py:266 +msgid "The dynamic channel name does not contain correct variable names and must be re-configured with `[p]settickettool dynamicchannelname`." +msgstr "Le nom du canal dynamique ne contient pas les noms de variables corrects et doit être reconfiguré avec `[p]settickettool dynamicchannelname`." + +#: tickettool\ticket.py:275 tickettool\ticket.py:528 tickettool\ticket.py:890 +#: tickettool\ticket.py:969 tickettool\tickettool.py:352 +msgid "Close" +msgstr "Fermer" + +#: tickettool\ticket.py:282 tickettool\ticket.py:535 tickettool\ticket.py:615 +#: tickettool\ticket.py:897 tickettool\ticket.py:976 +#: tickettool\tickettool.py:366 +msgid "Claim" +msgstr "Réclamation" + +#: tickettool\ticket.py:289 tickettool\ticket.py:542 tickettool\ticket.py:622 +#: tickettool\ticket.py:904 tickettool\ticket.py:983 +#: tickettool\tickettool.py:373 +msgid "Delete" +msgstr "Supprimer" + +#: tickettool\ticket.py:303 tickettool\ticket.py:429 +msgid "Ticket Created" +msgstr "Ticket créé" + +#: tickettool\ticket.py:304 +msgid "Thank you for creating a ticket on this server!" +msgstr "Merci de créer un ticket sur ce serveur !" + +#: tickettool\ticket.py:315 +msgid "🎟️ Ticket ID: {ticket.id}\n" +"🕵️ Ticket created by: @{ticket.created_by.display_name} ({ticket.created_by.id})\n" +"☢️ Ticket reason: {short_reason}\n" +msgstr "🎟️ Ticket ID : {ticket.id}\n" +"🕵️ Ticket créé par : @{ticket.created_by.display_name} ({ticket.created_by.id})\n" +"☢️ Raison du ticket : {short_reason}\n" + +#: tickettool\ticket.py:395 +msgid "⚠ At least one user (the ticket owner or a team member) could not be added to the ticket thread. Maybe the user doesn't have access to the parent forum/text channel. If the server uses private threads in a text channel, the bot does not have the `manage_messages` permission in this channel." +msgstr "⚠ Au moins un utilisateur (le propriétaire du ticket ou un membre de l'équipe) n'a pas pu être ajouté au fil de discussion du ticket. Peut-être que l'utilisateur n'a pas accès au forum/canal de texte parent. Si le serveur utilise des fils de discussion privés dans un canal texte, le bot n'a pas la permission `manage_messages` dans ce canal." + +#: tickettool\ticket.py:430 +msgid "The ticket was created by {ticket.created_by}." +msgstr "Le ticket a été créé par {ticket.created_by}." + +#: tickettool\ticket.py:436 +msgid "Report on the creation of the ticket {ticket.id}." +msgstr "Rapport sur la création du billet {ticket.id}." + +#: tickettool\ticket.py:476 +msgid "Opening the ticket {ticket.id}." +msgstr "Ouverture du ticket {ticket.id}." + +#: tickettool\ticket.py:505 tickettool\ticket.py:513 +msgid "Ticket Opened" +msgstr "Ticket ouvert" + +#: tickettool\ticket.py:514 +msgid "The ticket was opened by {ticket.opened_by}." +msgstr "Le ticket a été ouvert par {ticket.opened_by}." + +#: tickettool\ticket.py:520 tickettool\ticket.py:600 +msgid "Report on the close of the ticket {ticket.id}." +msgstr "Rapport sur la clôture de la vente de billets {ticket.id}." + +#: tickettool\ticket.py:608 tickettool\tickettool.py:359 +msgid "Re-open" +msgstr "Réouverture" + +#: tickettool\ticket.py:675 tickettool\ticket.py:712 +#: tickettool\tickettool.py:1100 tickettool\tickettool.py:1142 +msgid "Cannot execute action on a text channel." +msgstr "Impossible d'exécuter une action sur un canal de texte." + +#: tickettool\ticket.py:701 +msgid "Report on the lock of the ticket {ticket.id}." +msgstr "Rapport sur la serrure de la billetterie {ticket.id}." + +#: tickettool\ticket.py:738 +msgid "Report on the unlock of the ticket {ticket.id}." +msgstr "Rapport sur le déblocage du ticket {ticket.id}." + +#: tickettool\ticket.py:755 +msgid "Renaming the ticket {ticket.id}. (`{ticket.channel.name}` to `{new_name}`)" +msgstr "Renommer le ticket {ticket.id}. (`{ticket.channel.name}` en `{new_name}`)" + +#: tickettool\ticket.py:765 +msgid "Ticket Renamed." +msgstr "Ticket Renommé." + +#: tickettool\ticket.py:783 +msgid "Ticket Deleted" +msgstr "Ticket supprimé" + +#: tickettool\ticket.py:784 +msgid "The ticket was deleted by {ticket.deleted_by}." +msgstr "Le ticket a été supprimé par {ticket.deleted_by}." + +#: tickettool\ticket.py:807 +msgid "Report on the deletion of the ticket {ticket.id}." +msgstr "Rapport sur la suppression du ticket {ticket.id}." + +#: tickettool\ticket.py:824 +msgid "Deleting the ticket {ticket.id}." +msgstr "Suppression du ticket {ticket.id}." + +#: tickettool\ticket.py:845 +msgid "A ticket cannot be claimed if it is closed." +msgstr "Un ticket ne peut être réclamé s'il est clôturé." + +#: tickettool\ticket.py:849 +msgid "A bot cannot claim a ticket." +msgstr "Un robot ne peut pas réclamer un billet." + +#: tickettool\ticket.py:863 +msgid "Claiming the ticket {ticket.id}." +msgstr "Réclamer le billet {ticket.id}." + +#: tickettool\ticket.py:918 +msgid "Ticket claimed." +msgstr "Billet réclamé." + +#: tickettool\ticket.py:932 +msgid "A ticket cannot be unclaimed if it is closed." +msgstr "Un billet ne peut pas être réclamé s'il est clôturé." + +#: tickettool\ticket.py:948 +msgid "Unclaiming the ticket {ticket.id}." +msgstr "Récupération du billet {ticket.id}." + +#: tickettool\ticket.py:997 +msgid "Ticket unclaimed." +msgstr "Ticket non réclamé." + +#: tickettool\ticket.py:1011 +msgid "Cannot execute action in a thread channel." +msgstr "Impossible d'exécuter une action dans un canal de discussion." + +#: tickettool\ticket.py:1018 +msgid "Changing owner of the ticket {ticket.id}." +msgstr "Changement de propriétaire du billet {ticket.id}." + +#: tickettool\ticket.py:1022 +msgid "You cannot transfer ownership of a ticket to a bot." +msgstr "Vous ne pouvez pas transférer la propriété d'un billet à un robot." + +#: tickettool\ticket.py:1051 +msgid "Owner Modified." +msgstr "Propriétaire modifié." + +#: tickettool\ticket.py:1070 +msgid "Adding a member to the ticket {ticket.id}." +msgstr "Ajouter un membre au ticket {ticket.id}." + +#: tickettool\ticket.py:1077 tickettool\ticket.py:1114 +msgid "You cannot add a bot to a ticket. ({member})" +msgstr "Vous ne pouvez pas ajouter un bot à un ticket. ({member})" + +#: tickettool\ticket.py:1081 tickettool\ticket.py:1118 +msgid "This member is already the owner of this ticket. ({member})" +msgstr "Ce membre est déjà le propriétaire de ce ticket. ({member})" + +#: tickettool\ticket.py:1087 tickettool\ticket.py:1124 +msgid "This member is an administrator for the tickets system. They will always have access to the ticket anyway. ({member})" +msgstr "Ce membre est un administrateur du système de tickets. Il aura toujours accès au ticket de toute façon. ({member})" + +#: tickettool\ticket.py:1093 tickettool\ticket.py:1130 +msgid "This member already has access to this ticket. ({member})" +msgstr "Ce membre a déjà accès à ce ticket. ({member})" + +#: tickettool\ticket.py:1144 +msgid "⚠ At least one user (the ticket owner or a team member) could not be added to the ticket thread. Maybe the user the user doesn't have access to the parent forum/text channel. If the server uses private threads in a text channel, the bot does not have the `manage_messages` permission in this channel." +msgstr "⚠ Au moins un utilisateur (le propriétaire du ticket ou un membre de l'équipe) n'a pas pu être ajouté au fil de discussion du ticket. Peut-être que l'utilisateur n'a pas accès au forum/canal de texte parent. Si le serveur utilise des discussions privées dans un canal texte, le bot n'a pas la permission `manage_messages` dans ce canal." + +#: tickettool\ticket.py:1168 +msgid "Removing a member to the ticket {ticket.id}." +msgstr "Supprimer un membre du ticket {ticket.id}." + +#: tickettool\ticket.py:1174 tickettool\ticket.py:1204 +msgid "You cannot remove a bot to a ticket ({member})." +msgstr "Vous ne pouvez pas supprimer un bot d'un ticket ({member})." + +#: tickettool\ticket.py:1180 tickettool\ticket.py:1210 +msgid "You cannot remove the owner of this ticket. ({member})" +msgstr "Vous ne pouvez pas supprimer le propriétaire de ce ticket. ({member})" + +#: tickettool\ticket.py:1186 tickettool\ticket.py:1216 +msgid "This member is an administrator for the tickets system. They will always have access to the ticket. ({member})" +msgstr "Ce membre est un administrateur du système de tickets. Il aura toujours accès au ticket. ({member})" + +#: tickettool\ticket.py:1192 tickettool\ticket.py:1222 +msgid "This member is not in the list of those authorised to access the ticket. ({member})" +msgstr "Ce membre ne figure pas dans la liste des personnes autorisées à accéder au ticket. ({member})" + +#: tickettool\tickettool.py:32 +#, docstring +msgid "A cog to manage a tickets system!" +msgstr "Un rouage pour gérer un système de tickets !" + +#: tickettool\tickettool.py:74 +msgid "To get help on this server or to make an order for example, you can create a ticket.\n" +"Just use the command `{prefix}ticket create` or click on the button below.\n" +"You can then use the `{prefix}ticket` subcommands to manage your ticket." +msgstr "Pour obtenir de l'aide sur ce serveur ou pour passer une commande par exemple, vous pouvez créer un ticket.\n" +"Il suffit d'utiliser la commande `{prefix}ticket create` ou de cliquer sur le bouton ci-dessous.\n" +"Vous pouvez ensuite utiliser les sous-commandes `{prefix}ticket` pour gérer votre ticket." + +#: tickettool\tickettool.py:403 +msgid "Choose the reason for open a ticket." +msgstr "Choisissez la raison de l'ouverture d'un ticket." + +#: tickettool\tickettool.py:521 +msgid "Action taken for the ticket system." +msgstr "Mesures prises pour le système de tickets." + +#: tickettool\tickettool.py:555 +msgid "Ticket ID:" +msgstr "ID du billet :" + +#: tickettool\tickettool.py:558 +msgid "Owned by:" +msgstr "Propriété de :" + +#: tickettool\tickettool.py:566 +msgid "Channel:" +msgstr "Canal :" + +#: tickettool\tickettool.py:573 +msgid "Closed by:" +msgstr "Fermé par :" + +#: tickettool\tickettool.py:581 +msgid "Deleted by:" +msgstr "Supprimé par :" + +#: tickettool\tickettool.py:589 +msgid "Closed at:" +msgstr "Fermé à :" + +#: tickettool\tickettool.py:596 tickettool\tickettool.py:622 +msgid "Reason:" +msgstr "Raison :" + +#: tickettool\tickettool.py:607 +msgid "Ticket [{ticket.profile}] {ticket.id} - Action taken" +msgstr "Ticket [{ticket.profile}] {ticket.id} - Action entreprise" + +#: tickettool\tickettool.py:687 +msgid "You're not in a ticket." +msgstr "Vous n'avez pas de billet." + +#: tickettool\tickettool.py:691 +msgid "This ticket isn't {status}ed." +msgstr "Ce billet n'est pas {status}." + +#: tickettool\tickettool.py:700 +msgid "This ticket is {status}." +msgstr "Ce billet est {status}." + +#: tickettool\tickettool.py:709 +msgid "You're not allowed to lock this ticket." +msgstr "Vous n'êtes pas autorisé à verrouiller ce ticket." + +#: tickettool\tickettool.py:752 +msgid "You're not allowed to view this ticket." +msgstr "Vous n'êtes pas autorisé à consulter ce billet." + +#: tickettool\tickettool.py:786 +msgid "Please provide a profile." +msgstr "Veuillez fournir un profil." + +#: tickettool\tickettool.py:789 +msgid "No profile has been created on this server." +msgstr "Aucun profil n'a été créé sur ce serveur." + +#: tickettool\tickettool.py:797 +msgid "The ticket system is not enabled on this server. Please ask an administrator of this server to use the `{ctx.prefix}settickettool` subcommands to configure it." +msgstr "Le système de tickets n'est pas activé sur ce serveur. Veuillez demander à un administrateur de ce serveur d'utiliser les sous-commandes `{ctx.prefix}settickettool` pour le configurer." + +#: tickettool\tickettool.py:803 +msgid "The category `open` or the category `close` have not been configured. Please ask an administrator of this server to use the `{ctx.prefix}settickettool` subcommands to configure it." +msgstr "La catégorie `open` ou la catégorie `close` n'ont pas été configurées. Veuillez demander à un administrateur de ce serveur d'utiliser les sous-commandes `{ctx.prefix}settickettool` pour les configurer." + +#: tickettool\tickettool.py:810 +msgid "Sorry. You have already reached the limit of {limit} open tickets." +msgstr "Désolé. Vous avez déjà atteint la limite de {limit} tickets ouverts." + +#: tickettool\tickettool.py:821 +msgid "The bot does not have `manage_channels` permission on the `open` and `close` categories to allow the ticket system to function properly. Please notify an administrator of this server." +msgstr "Le bot n'a pas la permission `manage_channels` sur les catégories `open` et `close` pour permettre au système de tickets de fonctionner correctement. Veuillez informer un administrateur de ce serveur." + +#: tickettool\tickettool.py:830 +msgid "The bot does not have `manage_channel` permission in the forum channel to allow the ticket system to function properly. Please notify an administrator of this server." +msgstr "Le bot n'a pas la permission `manage_channel` dans le canal du forum pour permettre au système de tickets de fonctionner correctement. Veuillez en informer un administrateur de ce serveur." + +#: tickettool\tickettool.py:875 +msgid "Please provide the required informations by clicking on the button below." +msgstr "Veuillez fournir les informations requises en cliquant sur le bouton ci-dessous." + +#: tickettool\tickettool.py:926 +#, docstring +msgid "Create a Ticket.\n\n" +" If only one profile has been created on this server, you don't need to specify its name.\n" +" " +msgstr "Créer un ticket.\n\n" +" Si un seul profil a été créé sur ce serveur, vous n'avez pas besoin de spécifier son nom.\n" +" " + +#: tickettool\tickettool.py:942 +#, docstring +msgid "Create a Ticket for a member.\n\n" +" If only one profile has been created on this server, you don't need to specify its name.\n" +" " +msgstr "Créer un ticket pour un membre.\n\n" +" Si un seul profil a été créé sur ce serveur, vous n'avez pas besoin de spécifier son nom.\n" +" " + +#: tickettool\tickettool.py:947 +msgid "You cannot create a ticket for a bot." +msgstr "Vous ne pouvez pas créer un ticket pour un bot." + +#: tickettool\tickettool.py:950 +msgid "You cannot create a ticket for a member with a higher or equal role." +msgstr "Vous ne pouvez pas créer un ticket pour un membre ayant un rôle supérieur ou égal." + +#: tickettool\tickettool.py:970 +#, docstring +msgid "Export all the messages of an existing Ticket in html format.\n" +" Please note: all attachments and user avatars are saved with the Discord link in this file.\n" +" " +msgstr "Exporter tous les messages d'un ticket existant au format html.\n" +" Remarque : toutes les pièces jointes et les avatars des utilisateurs sont sauvegardés avec le lien Discord dans ce fichier.\n" +" " + +#: tickettool\tickettool.py:987 +msgid "Here is the html file of the transcript of all the messages in this ticket.\n" +"Please note: all attachments and user avatars are saved with the Discord link in this file." +msgstr "Voici le fichier html de la transcription de tous les messages de ce ticket.\n" +"Veuillez noter que toutes les pièces jointes et les avatars des utilisateurs sont sauvegardés avec le lien Discord dans ce fichier." + +#: tickettool\tickettool.py:1019 +#, docstring +msgid "Open an existing Ticket." +msgstr "Ouvrir un ticket existant." + +#: tickettool\tickettool.py:1024 +msgid "The ticket system is not enabled on this server." +msgstr "Le système de tickets n'est pas activé sur ce serveur." + +#: tickettool\tickettool.py:1050 +#, docstring +msgid "Close an existing Ticket." +msgstr "Fermer un ticket existant." + +#: tickettool\tickettool.py:1061 +msgid "Do you really want to close the ticket {ticket.id}?" +msgstr "Voulez-vous vraiment fermer le ticket {ticket.id}?" + +#: tickettool\tickettool.py:1097 +#, docstring +msgid "Lock an existing Ticket." +msgstr "Verrouiller un ticket existant." + +#: tickettool\tickettool.py:1104 +msgid "Do you really want to lock the ticket {ticket.id}?" +msgstr "Voulez-vous vraiment verrouiller le ticket {ticket.id}?" + +#: tickettool\tickettool.py:1139 +#, docstring +msgid "Unlock an existing locked Ticket." +msgstr "Déverrouiller un ticket verrouillé existant." + +#: tickettool\tickettool.py:1167 +#, docstring +msgid "Rename an existing Ticket." +msgstr "Renommer un ticket existant." + +#: tickettool\tickettool.py:1193 +#, docstring +msgid "Delete an existing Ticket.\n\n" +" If a logs channel is defined, an html file containing all the messages of this ticket will be generated.\n" +" (Attachments are not supported, as they are saved with their Discord link)\n" +" " +msgstr "Supprimer un ticket existant.\n\n" +" Si un canal de logs est défini, un fichier html contenant tous les messages de ce ticket sera généré.\n" +" (Les pièces jointes ne sont pas supportées, car elles sont sauvegardées avec leur lien Discord)\n" +" " + +#: tickettool\tickettool.py:1202 +msgid "Do you really want to delete all the messages of the ticket {ticket.id}?" +msgstr "Voulez-vous vraiment supprimer tous les messages du ticket {ticket.id}?" + +#: tickettool\tickettool.py:1206 +msgid "If a logs channel is defined, an html file containing all the messages of this ticket will be generated. (Attachments are not supported, as they are saved with their Discord link.)" +msgstr "Si un canal de logs est défini, un fichier html contenant tous les messages de ce ticket sera généré. (Les pièces jointes ne sont pas prises en charge, car elles sont sauvegardées avec leur lien Discord)." + +#: tickettool\tickettool.py:1242 +#, docstring +msgid "Claim an existing Ticket." +msgstr "Réclamer un billet existant." + +#: tickettool\tickettool.py:1266 +#, docstring +msgid "Unclaim an existing Ticket." +msgstr "Annuler la réclamation d'un billet existant." + +#: tickettool\tickettool.py:1292 +#, docstring +msgid "Change the owner of an existing Ticket." +msgstr "Modifier le propriétaire d'un ticket existant." + +#: tickettool\tickettool.py:1318 +#, docstring +msgid "Add a member to an existing Ticket." +msgstr "Ajouter un membre à un ticket existant." + +#: tickettool\tickettool.py:1343 +#, docstring +msgid "Remove a member to an existing Ticket." +msgstr "Supprimer un membre d'un ticket existant." + +#: tickettool\tickettool.py:1357 +#, docstring +msgid "List the existing Tickets for a profile. You can provide a status and/or a ticket owner." +msgstr "Liste les tickets existants pour un profil. Vous pouvez indiquer un statut et/ou un propriétaire de ticket." + +#: tickettool\tickettool.py:1378 +msgid "No tickets to show." +msgstr "Il n'y a pas de billets à montrer." + +#: tickettool\tickettool.py:1419 +msgid "The profile for which this button was configured no longer exists." +msgstr "Le profil pour lequel ce bouton a été configuré n'existe plus." + +#: tickettool\tickettool.py:1482 tickettool\tickettool.py:1541 +#: tickettool\tickettool.py:1545 tickettool\tickettool.py:1563 +#: tickettool\tickettool.py:1567 tickettool\tickettool.py:1587 +#: tickettool\tickettool.py:1591 tickettool\tickettool.py:1661 +#: tickettool\tickettool.py:1665 +msgid "You are not allowed to execute this command." +msgstr "Vous n'êtes pas autorisé à exécuter cette commande." + +#: tickettool\tickettool.py:1486 tickettool\tickettool.py:1491 +#: tickettool\tickettool.py:1495 +msgid "You have chosen to create a ticket." +msgstr "Vous avez choisi de créer un ticket." + +#: tickettool\tickettool.py:1517 +msgid "You have chosen to close this ticket. If this is not done, you do not have the necessary permissions to execute this command." +msgstr "Vous avez choisi de fermer ce ticket. Si ce n'est pas le cas, c'est que vous n'avez pas les permissions nécessaires pour exécuter cette commande." + +#: tickettool\tickettool.py:1549 +msgid "You have chosen to re-open this ticket." +msgstr "Vous avez choisi de rouvrir ce ticket." + +#: tickettool\tickettool.py:1571 +msgid "You have chosen to claim this ticket. If this is not done, you do not have the necessary permissions to execute this command." +msgstr "Vous avez choisi de réclamer ce billet. Si ce n'est pas le cas, vous n'avez pas les autorisations nécessaires pour exécuter cette commande." + +#: tickettool\tickettool.py:1611 +msgid "This message is not in TicketTool config." +msgstr "Ce message ne figure pas dans la configuration de TicketTool." + +#: tickettool\tickettool.py:1620 +msgid "The profile for which this dropdown was configured no longer exists." +msgstr "Le profil pour lequel cette liste déroulante a été configurée n'existe plus." + +#: tickettool\tickettool.py:1687 tickettool\tickettool.py:1694 +msgid "You have chosen to create a ticket with the reason `{reason}`." +msgstr "Vous avez choisi de créer un ticket avec le motif `{reason}`." + +#: tickettool\tickettool.py:1840 +msgid "No open tickets by this user in this server." +msgstr "Aucun ticket ouvert par cet utilisateur dans ce serveur." + +#: tickettool\utils.py:143 +msgid "Emoji Label must be An emoji followed by a label, and optionnaly by a description and a value (for rename ticket channel), separated by either `;`, `,`, `|`, or `-`." +msgstr "Emoji Label doit être Un emoji suivi d'un label, et optionnellement d'une description et d'une valeur (pour renommer un canal de ticket), séparés par `;`, `,`, `|`, ou `-`." + +#: tickettool\utils.py:160 +msgid "Error parsing YAML. Please make sure the format is valid (a YAML validator may help)" +msgstr "Erreur lors de l'analyse du YAML. Veuillez vous assurer que le format est valide (un validateur YAML peut aider)" + +#: tickettool\utils.py:174 +msgid "You can only have 5 text inputs." +msgstr "Vous ne pouvez avoir que 5 entrées de texte." + +#: tickettool\utils.py:180 +msgid "The argument `/{count}/{arg}` is required in the YAML." +msgstr "L'argument `/{count}/{arg}` est requis dans le YAML." + +#: tickettool\utils.py:187 +msgid "The argument `/{count}/{arg}` is invalid in the YAML. Check the spelling." +msgstr "L'argument `/{count}/{arg}` n'est pas valide dans le YAML. Vérifiez l'orthographe." + +#: tickettool\utils.py:193 +msgid "The argument `/modal/{count}/label` must be less than 45 characters long." +msgstr "L'argument `/modal/{count}/label` doit être inférieur à 45 caractères." + +#: tickettool\utils.py:203 tickettool\utils.py:209 +msgid "The argument `/{count}/style` must be a number between 1 and 2." +msgstr "L'argument `/{count}/style` doit être un nombre entre 1 et 2." + +#: tickettool\utils.py:232 +msgid "The argument `/{count}/required` must be a boolean (True or False)." +msgstr "L'argument `/{count}/required` doit être un booléen (True ou False)." + +#: tickettool\utils.py:242 +msgid "The argument `/modal/{count}/default` must be less than 4000 characters long." +msgstr "L'argument `/modal/{count}/default` doit être inférieur à 4000 caractères." + +#: tickettool\utils.py:250 +msgid "The argument `/modal/{count}/placeholder` must be less than 100 characters long." +msgstr "L'argument `/modal/{count}/placeholder` doit être inférieur à 100 caractères." + +#: tickettool\utils.py:258 +msgid "The argument `/modal/{count}/min_length` must be between 0 and 4000." +msgstr "L'argument `/modal/{count}/min_length` doit être compris entre 0 et 4000." + +#: tickettool\utils.py:266 +msgid "The argument `/modal/{count}/max_length` must be between 0 and 4000." +msgstr "L'argument `/modal/{count}/max_length` doit être compris entre 0 et 4000." + diff --git a/tickettool/locales/it-IT.po b/tickettool/locales/it-IT.po new file mode 100644 index 0000000..8f828c7 --- /dev/null +++ b/tickettool/locales/it-IT.po @@ -0,0 +1,586 @@ +msgid "" +msgstr "" +"Project-Id-Version: aaa3a-cogs\n" +"POT-Creation-Date: 2024-07-20 22:15+0200\n" +"PO-Revision-Date: 2024-07-21 15:12\n" +"Last-Translator: \n" +"Language-Team: Italian\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: redgettext 3.4.2\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Crowdin-Project: aaa3a-cogs\n" +"X-Crowdin-Project-ID: 531090\n" +"X-Crowdin-Language: it\n" +"X-Crowdin-File: /[AAA3A-AAA3A.AAA3A-cogs] main/tickettool/locales/messages.pot\n" +"X-Crowdin-File-ID: 102\n" +"Language: it_IT\n" + +#: tickettool\settings.py:15 tickettool\settings.py:18 +#: tickettool\tickettool.py:759 tickettool\tickettool.py:762 +msgid "This profile does not exist." +msgstr "Questo profilo non esiste." + +#: tickettool\settings.py:27 +msgid "I have to be the author of the message. You can use EmbedUtils by AAA3A to send one." +msgstr "Devo essere l'autore del messaggio. È possibile utilizzare EmbedUtils di AAA3A per inviarne uno." + +#: tickettool\settings.py:54 +#, docstring +msgid "Send a message with a button to open a ticket or dropdown with possible reasons.\n\n" +" Examples:\n" +" - `[p]settickettool message #general \"🐛|Report a bug|If you find a bug, report it here.|bug\" \"⚠️|Report a user|If you find a malicious user, report it here.|user\"`\n" +" - `[p]settickettool 1234567890-0987654321`\n" +" " +msgstr "Inviare un messaggio con un pulsante per aprire un ticket o un menu a tendina con i possibili motivi.\n\n" +" Esempi:\n" +" - `[p]settickettool message #general \"🐛|Report a bug|Se trovi un bug, segnalalo qui.|bug\" \"⚠️|Report a user|Se trovi un utente malintenzionato, segnalalo qui.|user\"`\n" +" - `[p]settickettool 1234567890-0987654321`\n" +" " + +#: tickettool\settings.py:70 +msgid "I don't have sufficient permissions in this channel to view it and to send messages into." +msgstr "Non ho i permessi sufficienti in questo canale per vederlo e per inviarvi messaggi." + +#: tickettool\settings.py:97 tickettool\tickettool.py:339 +msgid "Create ticket" +msgstr "Creare un biglietto" + +#: tickettool\settings.py:116 +msgid "A different value must be provided for each dropdown option." +msgstr "È necessario fornire un valore diverso per ogni opzione a discesa." + +#: tickettool\settings.py:124 +msgid "An emoji you selected seems invalid. Check that it is an emoji. If you have Nitro, you may have used a custom emoji from another server." +msgstr "Un'emoji selezionata non sembra valida. Verificare che si tratti di un emoji. Se si dispone di Nitro, è possibile che sia stata utilizzata un'emoji personalizzata da un altro server." + +#: tickettool\ticket.py:245 +msgid "Creating the ticket {ticket.id}." +msgstr "Creazione del ticket {ticket.id}." + +#: tickettool\ticket.py:266 +msgid "The dynamic channel name does not contain correct variable names and must be re-configured with `[p]settickettool dynamicchannelname`." +msgstr "Il nome del canale dinamico non contiene i nomi corretti delle variabili e deve essere riconfigurato con `[p]settickettool dynamicchannelname`." + +#: tickettool\ticket.py:275 tickettool\ticket.py:528 tickettool\ticket.py:890 +#: tickettool\ticket.py:969 tickettool\tickettool.py:352 +msgid "Close" +msgstr "Chiudere" + +#: tickettool\ticket.py:282 tickettool\ticket.py:535 tickettool\ticket.py:615 +#: tickettool\ticket.py:897 tickettool\ticket.py:976 +#: tickettool\tickettool.py:366 +msgid "Claim" +msgstr "Rivendicazione" + +#: tickettool\ticket.py:289 tickettool\ticket.py:542 tickettool\ticket.py:622 +#: tickettool\ticket.py:904 tickettool\ticket.py:983 +#: tickettool\tickettool.py:373 +msgid "Delete" +msgstr "Cancellare" + +#: tickettool\ticket.py:303 tickettool\ticket.py:429 +msgid "Ticket Created" +msgstr "Biglietto creato" + +#: tickettool\ticket.py:304 +msgid "Thank you for creating a ticket on this server!" +msgstr "Grazie per aver creato un ticket su questo server!" + +#: tickettool\ticket.py:315 +msgid "🎟️ Ticket ID: {ticket.id}\n" +"🕵️ Ticket created by: @{ticket.created_by.display_name} ({ticket.created_by.id})\n" +"☢️ Ticket reason: {short_reason}\n" +msgstr "🎟️ ID biglietto: {ticket.id}\n" +"🕵️ Biglietto creato da: @{ticket.created_by.display_name} ({ticket.created_by.id})\n" +"☢️ Motivo del biglietto: {short_reason}\n" + +#: tickettool\ticket.py:395 +msgid "⚠ At least one user (the ticket owner or a team member) could not be added to the ticket thread. Maybe the user doesn't have access to the parent forum/text channel. If the server uses private threads in a text channel, the bot does not have the `manage_messages` permission in this channel." +msgstr "⚠ Non è stato possibile aggiungere almeno un utente (il proprietario del ticket o un membro del team) alla discussione sul ticket. Forse l'utente non ha accesso al forum/canale di testo principale. Se il server utilizza discussioni private in un canale di testo, il bot non ha il permesso `gestione_messaggi` in questo canale." + +#: tickettool\ticket.py:430 +msgid "The ticket was created by {ticket.created_by}." +msgstr "Il biglietto è stato creato da {ticket.created_by}." + +#: tickettool\ticket.py:436 +msgid "Report on the creation of the ticket {ticket.id}." +msgstr "Relazione sulla creazione del ticket {ticket.id}." + +#: tickettool\ticket.py:476 +msgid "Opening the ticket {ticket.id}." +msgstr "Apertura del ticket {ticket.id}." + +#: tickettool\ticket.py:505 tickettool\ticket.py:513 +msgid "Ticket Opened" +msgstr "Biglietto aperto" + +#: tickettool\ticket.py:514 +msgid "The ticket was opened by {ticket.opened_by}." +msgstr "Il biglietto è stato aperto da {ticket.opened_by}." + +#: tickettool\ticket.py:520 tickettool\ticket.py:600 +msgid "Report on the close of the ticket {ticket.id}." +msgstr "Relazione sulla chiusura dei biglietti {ticket.id}." + +#: tickettool\ticket.py:608 tickettool\tickettool.py:359 +msgid "Re-open" +msgstr "Riaprire" + +#: tickettool\ticket.py:675 tickettool\ticket.py:712 +#: tickettool\tickettool.py:1100 tickettool\tickettool.py:1142 +msgid "Cannot execute action on a text channel." +msgstr "Impossibile eseguire un'azione su un canale di testo." + +#: tickettool\ticket.py:701 +msgid "Report on the lock of the ticket {ticket.id}." +msgstr "Relazione sulla chiusura del biglietto {ticket.id}." + +#: tickettool\ticket.py:738 +msgid "Report on the unlock of the ticket {ticket.id}." +msgstr "Relazione sullo sblocco del biglietto {ticket.id}." + +#: tickettool\ticket.py:755 +msgid "Renaming the ticket {ticket.id}. (`{ticket.channel.name}` to `{new_name}`)" +msgstr "Rinominare il biglietto {ticket.id}. (da `{ticket.channel.name}` a `{new_name}`)" + +#: tickettool\ticket.py:765 +msgid "Ticket Renamed." +msgstr "Biglietto rinominato." + +#: tickettool\ticket.py:783 +msgid "Ticket Deleted" +msgstr "Biglietto eliminato" + +#: tickettool\ticket.py:784 +msgid "The ticket was deleted by {ticket.deleted_by}." +msgstr "Il biglietto è stato cancellato da {ticket.deleted_by}." + +#: tickettool\ticket.py:807 +msgid "Report on the deletion of the ticket {ticket.id}." +msgstr "Relazione sulla cancellazione del biglietto {ticket.id}." + +#: tickettool\ticket.py:824 +msgid "Deleting the ticket {ticket.id}." +msgstr "Eliminazione del ticket {ticket.id}." + +#: tickettool\ticket.py:845 +msgid "A ticket cannot be claimed if it is closed." +msgstr "Un ticket non può essere reclamato se è chiuso." + +#: tickettool\ticket.py:849 +msgid "A bot cannot claim a ticket." +msgstr "Un bot non può richiedere un biglietto." + +#: tickettool\ticket.py:863 +msgid "Claiming the ticket {ticket.id}." +msgstr "Rivendicazione del biglietto {ticket.id}." + +#: tickettool\ticket.py:918 +msgid "Ticket claimed." +msgstr "Biglietto rivendicato." + +#: tickettool\ticket.py:932 +msgid "A ticket cannot be unclaimed if it is closed." +msgstr "Un biglietto non può essere reclamato se è stato chiuso." + +#: tickettool\ticket.py:948 +msgid "Unclaiming the ticket {ticket.id}." +msgstr "Disconoscimento del biglietto {ticket.id}." + +#: tickettool\ticket.py:997 +msgid "Ticket unclaimed." +msgstr "Biglietto non ritirato." + +#: tickettool\ticket.py:1011 +msgid "Cannot execute action in a thread channel." +msgstr "Impossibile eseguire l'azione in un canale di thread." + +#: tickettool\ticket.py:1018 +msgid "Changing owner of the ticket {ticket.id}." +msgstr "Cambio del proprietario del biglietto {ticket.id}." + +#: tickettool\ticket.py:1022 +msgid "You cannot transfer ownership of a ticket to a bot." +msgstr "Non è possibile trasferire la proprietà di un biglietto a un bot." + +#: tickettool\ticket.py:1051 +msgid "Owner Modified." +msgstr "Proprietario modificato." + +#: tickettool\ticket.py:1070 +msgid "Adding a member to the ticket {ticket.id}." +msgstr "Aggiunta di un membro al ticket {ticket.id}." + +#: tickettool\ticket.py:1077 tickettool\ticket.py:1114 +msgid "You cannot add a bot to a ticket. ({member})" +msgstr "Non è possibile aggiungere un bot a un ticket. ({member})" + +#: tickettool\ticket.py:1081 tickettool\ticket.py:1118 +msgid "This member is already the owner of this ticket. ({member})" +msgstr "Questo utente è già proprietario di questo biglietto. ({member})" + +#: tickettool\ticket.py:1087 tickettool\ticket.py:1124 +msgid "This member is an administrator for the tickets system. They will always have access to the ticket anyway. ({member})" +msgstr "Questo membro è un amministratore del sistema dei biglietti. Avrà sempre accesso al biglietto in ogni caso. ({member})" + +#: tickettool\ticket.py:1093 tickettool\ticket.py:1130 +msgid "This member already has access to this ticket. ({member})" +msgstr "Questo membro ha già accesso a questo biglietto. ({member})" + +#: tickettool\ticket.py:1144 +msgid "⚠ At least one user (the ticket owner or a team member) could not be added to the ticket thread. Maybe the user the user doesn't have access to the parent forum/text channel. If the server uses private threads in a text channel, the bot does not have the `manage_messages` permission in this channel." +msgstr "⚠ Non è stato possibile aggiungere almeno un utente (il proprietario del ticket o un membro del team) alla discussione sul ticket. Forse l'utente non ha accesso al forum/canale di testo principale. Se il server utilizza discussioni private in un canale di testo, il bot non ha il permesso `manage_messages` in questo canale." + +#: tickettool\ticket.py:1168 +msgid "Removing a member to the ticket {ticket.id}." +msgstr "Rimozione di un membro del ticket {ticket.id}." + +#: tickettool\ticket.py:1174 tickettool\ticket.py:1204 +msgid "You cannot remove a bot to a ticket ({member})." +msgstr "Non è possibile rimuovere un bot da un ticket ({member})." + +#: tickettool\ticket.py:1180 tickettool\ticket.py:1210 +msgid "You cannot remove the owner of this ticket. ({member})" +msgstr "Non è possibile rimuovere il proprietario di questo biglietto. ({member})" + +#: tickettool\ticket.py:1186 tickettool\ticket.py:1216 +msgid "This member is an administrator for the tickets system. They will always have access to the ticket. ({member})" +msgstr "Questo membro è un amministratore del sistema dei ticket. Avrà sempre accesso al biglietto. ({member})" + +#: tickettool\ticket.py:1192 tickettool\ticket.py:1222 +msgid "This member is not in the list of those authorised to access the ticket. ({member})" +msgstr "Questo membro non è nell'elenco delle persone autorizzate ad accedere al biglietto. ({member})" + +#: tickettool\tickettool.py:32 +#, docstring +msgid "A cog to manage a tickets system!" +msgstr "Un ingranaggio per gestire un sistema di biglietti!" + +#: tickettool\tickettool.py:74 +msgid "To get help on this server or to make an order for example, you can create a ticket.\n" +"Just use the command `{prefix}ticket create` or click on the button below.\n" +"You can then use the `{prefix}ticket` subcommands to manage your ticket." +msgstr "Per ottenere assistenza su questo server o per effettuare un ordine, ad esempio, è possibile creare un ticket.\n" +"È sufficiente utilizzare il comando `{prefix}ticket create` o fare clic sul pulsante sottostante.\n" +"È poi possibile utilizzare i sottocomandi `{prefix}ticket` per gestire il biglietto." + +#: tickettool\tickettool.py:403 +msgid "Choose the reason for open a ticket." +msgstr "Scegliere il motivo per cui aprire un ticket." + +#: tickettool\tickettool.py:521 +msgid "Action taken for the ticket system." +msgstr "Azione intrapresa per il sistema di ticket." + +#: tickettool\tickettool.py:555 +msgid "Ticket ID:" +msgstr "ID biglietto:" + +#: tickettool\tickettool.py:558 +msgid "Owned by:" +msgstr "Di proprietà di:" + +#: tickettool\tickettool.py:566 +msgid "Channel:" +msgstr "Canale:" + +#: tickettool\tickettool.py:573 +msgid "Closed by:" +msgstr "Chiuso da:" + +#: tickettool\tickettool.py:581 +msgid "Deleted by:" +msgstr "Cancellato da:" + +#: tickettool\tickettool.py:589 +msgid "Closed at:" +msgstr "Chiuso a:" + +#: tickettool\tickettool.py:596 tickettool\tickettool.py:622 +msgid "Reason:" +msgstr "Motivo:" + +#: tickettool\tickettool.py:607 +msgid "Ticket [{ticket.profile}] {ticket.id} - Action taken" +msgstr "Ticket [{ticket.profile}] {ticket.id} - Azione intrapresa" + +#: tickettool\tickettool.py:687 +msgid "You're not in a ticket." +msgstr "Non siete in possesso di un biglietto." + +#: tickettool\tickettool.py:691 +msgid "This ticket isn't {status}ed." +msgstr "Questo biglietto non è {status}." + +#: tickettool\tickettool.py:700 +msgid "This ticket is {status}." +msgstr "Questo biglietto è {status}." + +#: tickettool\tickettool.py:709 +msgid "You're not allowed to lock this ticket." +msgstr "Non è possibile bloccare questo biglietto." + +#: tickettool\tickettool.py:752 +msgid "You're not allowed to view this ticket." +msgstr "Non sei autorizzato a visualizzare questo biglietto." + +#: tickettool\tickettool.py:786 +msgid "Please provide a profile." +msgstr "Si prega di fornire un profilo." + +#: tickettool\tickettool.py:789 +msgid "No profile has been created on this server." +msgstr "Non è stato creato alcun profilo su questo server." + +#: tickettool\tickettool.py:797 +msgid "The ticket system is not enabled on this server. Please ask an administrator of this server to use the `{ctx.prefix}settickettool` subcommands to configure it." +msgstr "Il sistema di ticket non è abilitato su questo server. Chiedere a un amministratore di questo server di usare i sottocomandi `{ctx.prefix}settickettool` per configurarlo." + +#: tickettool\tickettool.py:803 +msgid "The category `open` or the category `close` have not been configured. Please ask an administrator of this server to use the `{ctx.prefix}settickettool` subcommands to configure it." +msgstr "La categoria `open` o la categoria `close` non sono state configurate. Chiedere a un amministratore di questo server di usare i sottocomandi `{ctx.prefix}settickettool` per configurarle." + +#: tickettool\tickettool.py:810 +msgid "Sorry. You have already reached the limit of {limit} open tickets." +msgstr "Spiacente. Hai già raggiunto il limite di {limit} biglietti aperti." + +#: tickettool\tickettool.py:821 +msgid "The bot does not have `manage_channels` permission on the `open` and `close` categories to allow the ticket system to function properly. Please notify an administrator of this server." +msgstr "Il bot non dispone dei permessi `manage_channels` sulle categorie `open` e `close` per consentire il corretto funzionamento del sistema di ticket. Si prega di informare un amministratore di questo server." + +#: tickettool\tickettool.py:830 +msgid "The bot does not have `manage_channel` permission in the forum channel to allow the ticket system to function properly. Please notify an administrator of this server." +msgstr "Il bot non ha i permessi `manage_channel` nel canale del forum per permettere al sistema di ticket di funzionare correttamente. Si prega di informare un amministratore di questo server." + +#: tickettool\tickettool.py:875 +msgid "Please provide the required informations by clicking on the button below." +msgstr "Si prega di fornire le informazioni richieste cliccando sul pulsante sottostante." + +#: tickettool\tickettool.py:926 +#, docstring +msgid "Create a Ticket.\n\n" +" If only one profile has been created on this server, you don't need to specify its name.\n" +" " +msgstr "Creare un biglietto.\n\n" +" Se sul server è stato creato un solo profilo, non è necessario specificarne il nome.\n" +" " + +#: tickettool\tickettool.py:942 +#, docstring +msgid "Create a Ticket for a member.\n\n" +" If only one profile has been created on this server, you don't need to specify its name.\n" +" " +msgstr "Crea un biglietto per un membro.\n\n" +" Se sul server è stato creato un solo profilo, non è necessario specificarne il nome.\n" +" " + +#: tickettool\tickettool.py:947 +msgid "You cannot create a ticket for a bot." +msgstr "Non è possibile creare un ticket per un bot." + +#: tickettool\tickettool.py:950 +msgid "You cannot create a ticket for a member with a higher or equal role." +msgstr "Non è possibile creare un ticket per un membro con un ruolo superiore o uguale." + +#: tickettool\tickettool.py:970 +#, docstring +msgid "Export all the messages of an existing Ticket in html format.\n" +" Please note: all attachments and user avatars are saved with the Discord link in this file.\n" +" " +msgstr "Esporta tutti i messaggi di un biglietto esistente in formato html.\n" +" Nota bene: tutti gli allegati e gli avatar degli utenti vengono salvati con il collegamento a Discord in questo file.\n" +" " + +#: tickettool\tickettool.py:987 +msgid "Here is the html file of the transcript of all the messages in this ticket.\n" +"Please note: all attachments and user avatars are saved with the Discord link in this file." +msgstr "Ecco il file html della trascrizione di tutti i messaggi di questo ticket.\n" +"Nota bene: tutti gli allegati e gli avatar degli utenti sono salvati con il link a Discord in questo file." + +#: tickettool\tickettool.py:1019 +#, docstring +msgid "Open an existing Ticket." +msgstr "Aprire un biglietto esistente." + +#: tickettool\tickettool.py:1024 +msgid "The ticket system is not enabled on this server." +msgstr "Il sistema di ticket non è abilitato su questo server." + +#: tickettool\tickettool.py:1050 +#, docstring +msgid "Close an existing Ticket." +msgstr "Chiudere un biglietto esistente." + +#: tickettool\tickettool.py:1061 +msgid "Do you really want to close the ticket {ticket.id}?" +msgstr "Volete davvero chiudere il biglietto {ticket.id}?" + +#: tickettool\tickettool.py:1097 +#, docstring +msgid "Lock an existing Ticket." +msgstr "Bloccare un biglietto esistente." + +#: tickettool\tickettool.py:1104 +msgid "Do you really want to lock the ticket {ticket.id}?" +msgstr "Vuoi davvero bloccare il biglietto {ticket.id}?" + +#: tickettool\tickettool.py:1139 +#, docstring +msgid "Unlock an existing locked Ticket." +msgstr "Sbloccare un biglietto bloccato esistente." + +#: tickettool\tickettool.py:1167 +#, docstring +msgid "Rename an existing Ticket." +msgstr "Rinominare un biglietto esistente." + +#: tickettool\tickettool.py:1193 +#, docstring +msgid "Delete an existing Ticket.\n\n" +" If a logs channel is defined, an html file containing all the messages of this ticket will be generated.\n" +" (Attachments are not supported, as they are saved with their Discord link)\n" +" " +msgstr "Elimina un biglietto esistente.\n\n" +" Se è stato definito un canale di log, verrà generato un file html contenente tutti i messaggi di questo ticket.\n" +" (Gli allegati non sono supportati, in quanto vengono salvati con il loro link a Discord)\n" +" " + +#: tickettool\tickettool.py:1202 +msgid "Do you really want to delete all the messages of the ticket {ticket.id}?" +msgstr "Vuoi davvero cancellare tutti i messaggi del ticket {ticket.id}?" + +#: tickettool\tickettool.py:1206 +msgid "If a logs channel is defined, an html file containing all the messages of this ticket will be generated. (Attachments are not supported, as they are saved with their Discord link.)" +msgstr "L'ultima versione di Medicat USB è la 21.12!\n" +"||||\n" +"Al momento non c'è un'ETA per una release aggiornata a causa di restrizioni temporali." + +#: tickettool\tickettool.py:1242 +#, docstring +msgid "Claim an existing Ticket." +msgstr "Rivendicare un biglietto esistente." + +#: tickettool\tickettool.py:1266 +#, docstring +msgid "Unclaim an existing Ticket." +msgstr "Disconoscimento di un biglietto esistente." + +#: tickettool\tickettool.py:1292 +#, docstring +msgid "Change the owner of an existing Ticket." +msgstr "Cambiare il proprietario di un biglietto esistente." + +#: tickettool\tickettool.py:1318 +#, docstring +msgid "Add a member to an existing Ticket." +msgstr "Aggiungere un membro a un biglietto esistente." + +#: tickettool\tickettool.py:1343 +#, docstring +msgid "Remove a member to an existing Ticket." +msgstr "Rimuove un membro da un Ticket esistente." + +#: tickettool\tickettool.py:1357 +#, docstring +msgid "List the existing Tickets for a profile. You can provide a status and/or a ticket owner." +msgstr "Elenca i ticket esistenti per un profilo. È possibile indicare lo stato e/o il proprietario del ticket." + +#: tickettool\tickettool.py:1378 +msgid "No tickets to show." +msgstr "Nessun biglietto per lo spettacolo." + +#: tickettool\tickettool.py:1419 +msgid "The profile for which this button was configured no longer exists." +msgstr "Il profilo per il quale è stato configurato questo pulsante non esiste più." + +#: tickettool\tickettool.py:1482 tickettool\tickettool.py:1541 +#: tickettool\tickettool.py:1545 tickettool\tickettool.py:1563 +#: tickettool\tickettool.py:1567 tickettool\tickettool.py:1587 +#: tickettool\tickettool.py:1591 tickettool\tickettool.py:1661 +#: tickettool\tickettool.py:1665 +msgid "You are not allowed to execute this command." +msgstr "Non è possibile eseguire questo comando." + +#: tickettool\tickettool.py:1486 tickettool\tickettool.py:1491 +#: tickettool\tickettool.py:1495 +msgid "You have chosen to create a ticket." +msgstr "Avete scelto di creare un biglietto." + +#: tickettool\tickettool.py:1517 +msgid "You have chosen to close this ticket. If this is not done, you do not have the necessary permissions to execute this command." +msgstr "Avete scelto di chiudere questo ticket. Se non lo si fa, non si dispone dei permessi necessari per eseguire questo comando." + +#: tickettool\tickettool.py:1549 +msgid "You have chosen to re-open this ticket." +msgstr "Avete scelto di riaprire questo ticket." + +#: tickettool\tickettool.py:1571 +msgid "You have chosen to claim this ticket. If this is not done, you do not have the necessary permissions to execute this command." +msgstr "Avete scelto di rivendicare questo biglietto. In caso contrario, non si dispone dei permessi necessari per eseguire questo comando." + +#: tickettool\tickettool.py:1611 +msgid "This message is not in TicketTool config." +msgstr "Questo messaggio non è presente nella configurazione di TicketTool." + +#: tickettool\tickettool.py:1620 +msgid "The profile for which this dropdown was configured no longer exists." +msgstr "Il profilo per il quale è stata configurata questa tendina non esiste più." + +#: tickettool\tickettool.py:1687 tickettool\tickettool.py:1694 +msgid "You have chosen to create a ticket with the reason `{reason}`." +msgstr "Si è scelto di creare un ticket con il motivo `{reason}`." + +#: tickettool\tickettool.py:1840 +msgid "No open tickets by this user in this server." +msgstr "Nessun ticket aperto da questo utente in questo server." + +#: tickettool\utils.py:143 +msgid "Emoji Label must be An emoji followed by a label, and optionnaly by a description and a value (for rename ticket channel), separated by either `;`, `,`, `|`, or `-`." +msgstr "L'etichetta dell'emoji deve essere un emoji seguito da un'etichetta e, facoltativamente, da una descrizione e da un valore (per rinominare un canale di ticket), separati da `;`, `,`, `|` o `-`." + +#: tickettool\utils.py:160 +msgid "Error parsing YAML. Please make sure the format is valid (a YAML validator may help)" +msgstr "Errore nell'analisi di YAML. Assicurarsi che il formato sia valido (un validatore YAML può essere utile)." + +#: tickettool\utils.py:174 +msgid "You can only have 5 text inputs." +msgstr "Si possono avere solo 5 input di testo." + +#: tickettool\utils.py:180 +msgid "The argument `/{count}/{arg}` is required in the YAML." +msgstr "L'argomento `/{count}/{arg}` è richiesto nello YAML." + +#: tickettool\utils.py:187 +msgid "The argument `/{count}/{arg}` is invalid in the YAML. Check the spelling." +msgstr "L'argomento `/{count}/{arg}` non è valido nello YAML. Controllare l'ortografia." + +#: tickettool\utils.py:193 +msgid "The argument `/modal/{count}/label` must be less than 45 characters long." +msgstr "L'argomento `/modal/{count}/label` deve essere lungo meno di 45 caratteri." + +#: tickettool\utils.py:203 tickettool\utils.py:209 +msgid "The argument `/{count}/style` must be a number between 1 and 2." +msgstr "L'argomento `/{count}/style' deve essere un numero compreso tra 1 e 2." + +#: tickettool\utils.py:232 +msgid "The argument `/{count}/required` must be a boolean (True or False)." +msgstr "L'argomento `/{count}/required` deve essere un booleano (True o False)." + +#: tickettool\utils.py:242 +msgid "The argument `/modal/{count}/default` must be less than 4000 characters long." +msgstr "L'argomento `/modal/{count}/default` deve essere lungo meno di 4000 caratteri." + +#: tickettool\utils.py:250 +msgid "The argument `/modal/{count}/placeholder` must be less than 100 characters long." +msgstr "L'argomento `/modal/{count}/placeholder` deve essere lungo meno di 100 caratteri." + +#: tickettool\utils.py:258 +msgid "The argument `/modal/{count}/min_length` must be between 0 and 4000." +msgstr "L'argomento `/modal/{count}/min_length` deve essere compreso tra 0 e 4000." + +#: tickettool\utils.py:266 +msgid "The argument `/modal/{count}/max_length` must be between 0 and 4000." +msgstr "L'argomento `/modal/{count}/max_length` deve essere compreso tra 0 e 4000." + diff --git a/tickettool/locales/ja-JP.po b/tickettool/locales/ja-JP.po new file mode 100644 index 0000000..6d67fea --- /dev/null +++ b/tickettool/locales/ja-JP.po @@ -0,0 +1,584 @@ +msgid "" +msgstr "" +"Project-Id-Version: aaa3a-cogs\n" +"POT-Creation-Date: 2024-07-20 22:15+0200\n" +"PO-Revision-Date: 2024-07-21 15:13\n" +"Last-Translator: \n" +"Language-Team: Japanese\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: redgettext 3.4.2\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Crowdin-Project: aaa3a-cogs\n" +"X-Crowdin-Project-ID: 531090\n" +"X-Crowdin-Language: ja\n" +"X-Crowdin-File: /[AAA3A-AAA3A.AAA3A-cogs] main/tickettool/locales/messages.pot\n" +"X-Crowdin-File-ID: 102\n" +"Language: ja_JP\n" + +#: tickettool\settings.py:15 tickettool\settings.py:18 +#: tickettool\tickettool.py:759 tickettool\tickettool.py:762 +msgid "This profile does not exist." +msgstr "このプロファイルは存在しません。" + +#: tickettool\settings.py:27 +msgid "I have to be the author of the message. You can use EmbedUtils by AAA3A to send one." +msgstr "メッセージの作者でなければならない。AAA3AのEmbedUtilsを使って送信できます。" + +#: tickettool\settings.py:54 +#, docstring +msgid "Send a message with a button to open a ticket or dropdown with possible reasons.\n\n" +" Examples:\n" +" - `[p]settickettool message #general \"🐛|Report a bug|If you find a bug, report it here.|bug\" \"⚠️|Report a user|If you find a malicious user, report it here.|user\"`\n" +" - `[p]settickettool 1234567890-0987654321`\n" +" " +msgstr "チケットを開くためのボタンまたは可能な理由のドロップダウンメッセージを送信します。\n\n" +" 例\n" +" - `[p]settickettool message #general \"ᐛ|バグ報告|バグを見つけたらここに報告してください.|bug\" \"⚠️|ユーザー報告|悪意のあるユーザーを見つけたらここに報告してください.|user\"`\n" +" - `[p]settickettool 1234567890-0987654321`\n" +" " + +#: tickettool\settings.py:70 +msgid "I don't have sufficient permissions in this channel to view it and to send messages into." +msgstr "このチャンネルを見たり、メッセージを送ったりするのに十分な権限がありません。" + +#: tickettool\settings.py:97 tickettool\tickettool.py:339 +msgid "Create ticket" +msgstr "チケット作成" + +#: tickettool\settings.py:116 +msgid "A different value must be provided for each dropdown option." +msgstr "各ドロップダウンオプションには、異なる値を指定する必要があります。" + +#: tickettool\settings.py:124 +msgid "An emoji you selected seems invalid. Check that it is an emoji. If you have Nitro, you may have used a custom emoji from another server." +msgstr "選択した絵文字が無効のようです。絵文字であることを確認してください。Nitroをご利用の場合、他のサーバーのカスタム絵文字を使用した可能性があります。" + +#: tickettool\ticket.py:245 +msgid "Creating the ticket {ticket.id}." +msgstr "チケットの作成 {ticket.id}." + +#: tickettool\ticket.py:266 +msgid "The dynamic channel name does not contain correct variable names and must be re-configured with `[p]settickettool dynamicchannelname`." +msgstr "[p]settickettool dynamicchannelname`で再設定する必要があります。" + +#: tickettool\ticket.py:275 tickettool\ticket.py:528 tickettool\ticket.py:890 +#: tickettool\ticket.py:969 tickettool\tickettool.py:352 +msgid "Close" +msgstr "閉じる" + +#: tickettool\ticket.py:282 tickettool\ticket.py:535 tickettool\ticket.py:615 +#: tickettool\ticket.py:897 tickettool\ticket.py:976 +#: tickettool\tickettool.py:366 +msgid "Claim" +msgstr "請求項" + +#: tickettool\ticket.py:289 tickettool\ticket.py:542 tickettool\ticket.py:622 +#: tickettool\ticket.py:904 tickettool\ticket.py:983 +#: tickettool\tickettool.py:373 +msgid "Delete" +msgstr "削除" + +#: tickettool\ticket.py:303 tickettool\ticket.py:429 +msgid "Ticket Created" +msgstr "チケット作成" + +#: tickettool\ticket.py:304 +msgid "Thank you for creating a ticket on this server!" +msgstr "このサーバーでチケットを作成していただき、ありがとうございます!" + +#: tickettool\ticket.py:315 +msgid "🎟️ Ticket ID: {ticket.id}\n" +"🕵️ Ticket created by: @{ticket.created_by.display_name} ({ticket.created_by.id})\n" +"☢️ Ticket reason: {short_reason}\n" +msgstr "🎟️ チケットID: {ticket.id}\n" +"🕵️ チケット作成者{ticket.created_by.display_name} ({ticket.created_by.id})\n" +"☢️ チケット理由: {short_reason}\n" + +#: tickettool\ticket.py:395 +msgid "⚠ At least one user (the ticket owner or a team member) could not be added to the ticket thread. Maybe the user doesn't have access to the parent forum/text channel. If the server uses private threads in a text channel, the bot does not have the `manage_messages` permission in this channel." +msgstr "⚠ チケットスレッドに少なくとも一人のユーザー(チケット所有者またはチームメンバー)を追加できませんでした。そのユーザが親フォーラム/テキストチャンネルにアクセスできないのかもしれません。サーバーがテキストチャンネルでプライベートスレッドを使用している場合、ボットはこのチャンネルで `manage_messages` 権限を持っていません。" + +#: tickettool\ticket.py:430 +msgid "The ticket was created by {ticket.created_by}." +msgstr "チケットは {ticket.created_by}で作成しました。" + +#: tickettool\ticket.py:436 +msgid "Report on the creation of the ticket {ticket.id}." +msgstr "チケット作成レポート {ticket.id}." + +#: tickettool\ticket.py:476 +msgid "Opening the ticket {ticket.id}." +msgstr "チケットの開封 {ticket.id}." + +#: tickettool\ticket.py:505 tickettool\ticket.py:513 +msgid "Ticket Opened" +msgstr "チケット開封" + +#: tickettool\ticket.py:514 +msgid "The ticket was opened by {ticket.opened_by}." +msgstr "チケットは {ticket.opened_by}から開封されました。" + +#: tickettool\ticket.py:520 tickettool\ticket.py:600 +msgid "Report on the close of the ticket {ticket.id}." +msgstr "チケット終了のご報告 {ticket.id}." + +#: tickettool\ticket.py:608 tickettool\tickettool.py:359 +msgid "Re-open" +msgstr "再オープン" + +#: tickettool\ticket.py:675 tickettool\ticket.py:712 +#: tickettool\tickettool.py:1100 tickettool\tickettool.py:1142 +msgid "Cannot execute action on a text channel." +msgstr "テキストチャンネルでアクションを実行できない。" + +#: tickettool\ticket.py:701 +msgid "Report on the lock of the ticket {ticket.id}." +msgstr "チケットのロックに関する報告 {ticket.id}." + +#: tickettool\ticket.py:738 +msgid "Report on the unlock of the ticket {ticket.id}." +msgstr "チケットのロック解除に関するご報告 {ticket.id}." + +#: tickettool\ticket.py:755 +msgid "Renaming the ticket {ticket.id}. (`{ticket.channel.name}` to `{new_name}`)" +msgstr "チケットの名前を変更する {ticket.id}. (`{ticket.channel.name}` から `{new_name}`)" + +#: tickettool\ticket.py:765 +msgid "Ticket Renamed." +msgstr "チケットの名称を変更しました。" + +#: tickettool\ticket.py:783 +msgid "Ticket Deleted" +msgstr "チケット削除" + +#: tickettool\ticket.py:784 +msgid "The ticket was deleted by {ticket.deleted_by}." +msgstr "チケットは {ticket.deleted_by}によって削除されました。" + +#: tickettool\ticket.py:807 +msgid "Report on the deletion of the ticket {ticket.id}." +msgstr "チケット削除のご報告 {ticket.id}." + +#: tickettool\ticket.py:824 +msgid "Deleting the ticket {ticket.id}." +msgstr "チケットの削除 {ticket.id}." + +#: tickettool\ticket.py:845 +msgid "A ticket cannot be claimed if it is closed." +msgstr "チケットが終了している場合は、請求できません。" + +#: tickettool\ticket.py:849 +msgid "A bot cannot claim a ticket." +msgstr "ボットはチケットを請求することはできません。" + +#: tickettool\ticket.py:863 +msgid "Claiming the ticket {ticket.id}." +msgstr "チケットの請求について {ticket.id}." + +#: tickettool\ticket.py:918 +msgid "Ticket claimed." +msgstr "チケットが請求されました。" + +#: tickettool\ticket.py:932 +msgid "A ticket cannot be unclaimed if it is closed." +msgstr "チケットが終了した場合、未請求にすることはできません。" + +#: tickettool\ticket.py:948 +msgid "Unclaiming the ticket {ticket.id}." +msgstr "チケットのアンカリング {ticket.id}." + +#: tickettool\ticket.py:997 +msgid "Ticket unclaimed." +msgstr "チケット未所持。" + +#: tickettool\ticket.py:1011 +msgid "Cannot execute action in a thread channel." +msgstr "スレッドチャネルでアクションを実行できない。" + +#: tickettool\ticket.py:1018 +msgid "Changing owner of the ticket {ticket.id}." +msgstr "チケットの所有者を変更する {ticket.id}." + +#: tickettool\ticket.py:1022 +msgid "You cannot transfer ownership of a ticket to a bot." +msgstr "チケットの所有権をボットに譲渡することはできません。" + +#: tickettool\ticket.py:1051 +msgid "Owner Modified." +msgstr "オーナーモディファイドです。" + +#: tickettool\ticket.py:1070 +msgid "Adding a member to the ticket {ticket.id}." +msgstr "チケットにメンバーを追加する {ticket.id}." + +#: tickettool\ticket.py:1077 tickettool\ticket.py:1114 +msgid "You cannot add a bot to a ticket. ({member})" +msgstr "チケットにボットを追加することはできません。({member})" + +#: tickettool\ticket.py:1081 tickettool\ticket.py:1118 +msgid "This member is already the owner of this ticket. ({member})" +msgstr "このメンバーはすでにこのチケットの所有者です。({member})" + +#: tickettool\ticket.py:1087 tickettool\ticket.py:1124 +msgid "This member is an administrator for the tickets system. They will always have access to the ticket anyway. ({member})" +msgstr "このメンバーはチケットシステムの管理者です。彼らは常にチケットにアクセスすることができます。({member})" + +#: tickettool\ticket.py:1093 tickettool\ticket.py:1130 +msgid "This member already has access to this ticket. ({member})" +msgstr "このメンバーはすでにこのチケットにアクセスしています。({member})" + +#: tickettool\ticket.py:1144 +msgid "⚠ At least one user (the ticket owner or a team member) could not be added to the ticket thread. Maybe the user the user doesn't have access to the parent forum/text channel. If the server uses private threads in a text channel, the bot does not have the `manage_messages` permission in this channel." +msgstr "⚠ チケットスレッドに少なくとも一人のユーザー(チケット所有者またはチームメンバー)を追加できませんでした。そのユーザが親フォーラム/テキストチャンネルにアクセスできないのかもしれません。サーバーがテキストチャンネルでプライベートスレッドを使用している場合、ボットはこのチャンネルで `manage_messages` 権限を持っていません。" + +#: tickettool\ticket.py:1168 +msgid "Removing a member to the ticket {ticket.id}." +msgstr "チケットのメンバーを削除する {ticket.id}." + +#: tickettool\ticket.py:1174 tickettool\ticket.py:1204 +msgid "You cannot remove a bot to a ticket ({member})." +msgstr "チケット({member})にボットを削除することはできません。" + +#: tickettool\ticket.py:1180 tickettool\ticket.py:1210 +msgid "You cannot remove the owner of this ticket. ({member})" +msgstr "このチケットの所有者を削除することはできません。({member})" + +#: tickettool\ticket.py:1186 tickettool\ticket.py:1216 +msgid "This member is an administrator for the tickets system. They will always have access to the ticket. ({member})" +msgstr "このメンバーはチケットシステムの管理者です。常にチケットにアクセスすることができます。({member})" + +#: tickettool\ticket.py:1192 tickettool\ticket.py:1222 +msgid "This member is not in the list of those authorised to access the ticket. ({member})" +msgstr "このメンバーは、チケットにアクセスする権限を持つ人のリストに含まれていません。({member})" + +#: tickettool\tickettool.py:32 +#, docstring +msgid "A cog to manage a tickets system!" +msgstr "チケットシステムを管理する歯車です!" + +#: tickettool\tickettool.py:74 +msgid "To get help on this server or to make an order for example, you can create a ticket.\n" +"Just use the command `{prefix}ticket create` or click on the button below.\n" +"You can then use the `{prefix}ticket` subcommands to manage your ticket." +msgstr "このサーバーでヘルプを得たり、注文をしたりするには、チケットを作成することができます。\n" +"{prefix}ticket create`というコマンドを使うか、下のボタンをクリックするだけです。\n" +"その後、`{prefix}ticket`サブコマンドを使用して、チケットを管理することができます。" + +#: tickettool\tickettool.py:403 +msgid "Choose the reason for open a ticket." +msgstr "チケットを開設する理由を選択します。" + +#: tickettool\tickettool.py:521 +msgid "Action taken for the ticket system." +msgstr "チケットシステムのアクションを行いました。" + +#: tickettool\tickettool.py:555 +msgid "Ticket ID:" +msgstr "チケットIDです:" + +#: tickettool\tickettool.py:558 +msgid "Owned by:" +msgstr "所有されています:" + +#: tickettool\tickettool.py:566 +msgid "Channel:" +msgstr "チャンネルです:" + +#: tickettool\tickettool.py:573 +msgid "Closed by:" +msgstr "によって閉じられた:" + +#: tickettool\tickettool.py:581 +msgid "Deleted by:" +msgstr "によって削除された:" + +#: tickettool\tickettool.py:589 +msgid "Closed at:" +msgstr "で閉じた:" + +#: tickettool\tickettool.py:596 tickettool\tickettool.py:622 +msgid "Reason:" +msgstr "理由" + +#: tickettool\tickettool.py:607 +msgid "Ticket [{ticket.profile}] {ticket.id} - Action taken" +msgstr "チケット [{ticket.profile}] {ticket.id} - アクションを実行しました。" + +#: tickettool\tickettool.py:687 +msgid "You're not in a ticket." +msgstr "あなたはチケットを持っていない。" + +#: tickettool\tickettool.py:691 +msgid "This ticket isn't {status}ed." +msgstr "このチケットは {status}。" + +#: tickettool\tickettool.py:700 +msgid "This ticket is {status}." +msgstr "このチケットは {status}。" + +#: tickettool\tickettool.py:709 +msgid "You're not allowed to lock this ticket." +msgstr "このチケットはロックできません。" + +#: tickettool\tickettool.py:752 +msgid "You're not allowed to view this ticket." +msgstr "このチケットは閲覧できません。" + +#: tickettool\tickettool.py:786 +msgid "Please provide a profile." +msgstr "プロフィールをご記入ください。" + +#: tickettool\tickettool.py:789 +msgid "No profile has been created on this server." +msgstr "このサーバーにはプロファイルが作成されていません。" + +#: tickettool\tickettool.py:797 +msgid "The ticket system is not enabled on this server. Please ask an administrator of this server to use the `{ctx.prefix}settickettool` subcommands to configure it." +msgstr "このサーバーではチケットシステムが有効になっていません。このサーバの管理者に `{ctx.prefix}settickettool` サブコマンドを使って設定するよう依頼してください。" + +#: tickettool\tickettool.py:803 +msgid "The category `open` or the category `close` have not been configured. Please ask an administrator of this server to use the `{ctx.prefix}settickettool` subcommands to configure it." +msgstr "カテゴリ `open` またはカテゴリ `close` が設定されていません。{ctx.prefix}settickettool` サブコマンドを使って設定してください。" + +#: tickettool\tickettool.py:810 +msgid "Sorry. You have already reached the limit of {limit} open tickets." +msgstr "申し訳ありません。すでに {limit} のオープンチケットの上限に達しています。" + +#: tickettool\tickettool.py:821 +msgid "The bot does not have `manage_channels` permission on the `open` and `close` categories to allow the ticket system to function properly. Please notify an administrator of this server." +msgstr "チケットシステムを正しく機能させるために、ボットは `open` と `close` カテゴリに `manage_channels` 権限を持っていません。このサーバーの管理者にお知らせください。" + +#: tickettool\tickettool.py:830 +msgid "The bot does not have `manage_channel` permission in the forum channel to allow the ticket system to function properly. Please notify an administrator of this server." +msgstr "ボットには、チケットシステムを正しく機能させるための、フォーラムチャンネルの `manage_channel` 権限がありません。このサーバーの管理者にお知らせください。" + +#: tickettool\tickettool.py:875 +msgid "Please provide the required informations by clicking on the button below." +msgstr "以下のボタンをクリックして、必要事項をご記入ください。" + +#: tickettool\tickettool.py:926 +#, docstring +msgid "Create a Ticket.\n\n" +" If only one profile has been created on this server, you don't need to specify its name.\n" +" " +msgstr "チケットを作成します。\n\n" +" このサーバーにプロファイルが1つしか作成されていない場合は、その名前を指定する必要はありません。\n" +" " + +#: tickettool\tickettool.py:942 +#, docstring +msgid "Create a Ticket for a member.\n\n" +" If only one profile has been created on this server, you don't need to specify its name.\n" +" " +msgstr "メンバーのチケットを作成します。\n\n" +" このサーバーにプロファイルが1つしか作成されていない場合は、その名前を指定する必要はありません。\n" +" " + +#: tickettool\tickettool.py:947 +msgid "You cannot create a ticket for a bot." +msgstr "ボットのチケットは作成できません。" + +#: tickettool\tickettool.py:950 +msgid "You cannot create a ticket for a member with a higher or equal role." +msgstr "上位または同等のロールを持つメンバーのチケットを作成することはできません。" + +#: tickettool\tickettool.py:970 +#, docstring +msgid "Export all the messages of an existing Ticket in html format.\n" +" Please note: all attachments and user avatars are saved with the Discord link in this file.\n" +" " +msgstr "既存のチケットのすべてのメッセージをhtml形式でエクスポートします。\n" +" 注意:すべての添付ファイルとユーザーアバターは、このファイルのDiscordリンクと一緒に保存されます。\n" +" " + +#: tickettool\tickettool.py:987 +msgid "Here is the html file of the transcript of all the messages in this ticket.\n" +"Please note: all attachments and user avatars are saved with the Discord link in this file." +msgstr "このチケットのすべてのメッセージのトランスクリプトのhtmlファイルです。\n" +"注意:すべての添付ファイルとユーザーアバターは、このファイル内のDiscordリンクで保存されます。" + +#: tickettool\tickettool.py:1019 +#, docstring +msgid "Open an existing Ticket." +msgstr "既存のチケットを開く。" + +#: tickettool\tickettool.py:1024 +msgid "The ticket system is not enabled on this server." +msgstr "このサーバーでは、チケットシステムは有効ではありません。" + +#: tickettool\tickettool.py:1050 +#, docstring +msgid "Close an existing Ticket." +msgstr "既存のチケットを閉じる" + +#: tickettool\tickettool.py:1061 +msgid "Do you really want to close the ticket {ticket.id}?" +msgstr "本当にチケット {ticket.id}を閉めたいのですか?" + +#: tickettool\tickettool.py:1097 +#, docstring +msgid "Lock an existing Ticket." +msgstr "既存のチケットをロックします。" + +#: tickettool\tickettool.py:1104 +msgid "Do you really want to lock the ticket {ticket.id}?" +msgstr "チケットのロックは本当に必要なのか {ticket.id}?" + +#: tickettool\tickettool.py:1139 +#, docstring +msgid "Unlock an existing locked Ticket." +msgstr "ロックされたチケットのロックを解除します。" + +#: tickettool\tickettool.py:1167 +#, docstring +msgid "Rename an existing Ticket." +msgstr "既存のチケットの名前を変更します。" + +#: tickettool\tickettool.py:1193 +#, docstring +msgid "Delete an existing Ticket.\n\n" +" If a logs channel is defined, an html file containing all the messages of this ticket will be generated.\n" +" (Attachments are not supported, as they are saved with their Discord link)\n" +" " +msgstr "既存のチケットを削除します。\n\n" +" ログチャンネルが定義されている場合、このチケットのすべてのメッセージを含む html ファイルが生成されます。\n" +" (添付ファイルは Discord リンクと一緒に保存されるため、サポートされていません)\n" +" " + +#: tickettool\tickettool.py:1202 +msgid "Do you really want to delete all the messages of the ticket {ticket.id}?" +msgstr "本当にチケットのメッセージをすべて削除したいのですか {ticket.id}?" + +#: tickettool\tickettool.py:1206 +msgid "If a logs channel is defined, an html file containing all the messages of this ticket will be generated. (Attachments are not supported, as they are saved with their Discord link.)" +msgstr "ログチャンネルが定義されている場合、このチケットのすべてのメッセージを含む html ファイルが生成されます。(添付ファイルは Discord リンクと一緒に保存されるため、サポートされません)。" + +#: tickettool\tickettool.py:1242 +#, docstring +msgid "Claim an existing Ticket." +msgstr "既存のチケットを申請する。" + +#: tickettool\tickettool.py:1266 +#, docstring +msgid "Unclaim an existing Ticket." +msgstr "既存のチケットの権利を放棄します。" + +#: tickettool\tickettool.py:1292 +#, docstring +msgid "Change the owner of an existing Ticket." +msgstr "既存のチケットの所有者を変更します。" + +#: tickettool\tickettool.py:1318 +#, docstring +msgid "Add a member to an existing Ticket." +msgstr "既存のチケットにメンバーを追加します。" + +#: tickettool\tickettool.py:1343 +#, docstring +msgid "Remove a member to an existing Ticket." +msgstr "既存のチケットのメンバーを削除します。" + +#: tickettool\tickettool.py:1357 +#, docstring +msgid "List the existing Tickets for a profile. You can provide a status and/or a ticket owner." +msgstr "プロファイルの既存のチケットを一覧表示します。ステータスおよび/またはチケットの所有者を指定できます。" + +#: tickettool\tickettool.py:1378 +msgid "No tickets to show." +msgstr "上映チケットはありません。" + +#: tickettool\tickettool.py:1419 +msgid "The profile for which this button was configured no longer exists." +msgstr "このボタンが設定されていたプロファイルは、もう存在しません。" + +#: tickettool\tickettool.py:1482 tickettool\tickettool.py:1541 +#: tickettool\tickettool.py:1545 tickettool\tickettool.py:1563 +#: tickettool\tickettool.py:1567 tickettool\tickettool.py:1587 +#: tickettool\tickettool.py:1591 tickettool\tickettool.py:1661 +#: tickettool\tickettool.py:1665 +msgid "You are not allowed to execute this command." +msgstr "このコマンドの実行は許可されていません。" + +#: tickettool\tickettool.py:1486 tickettool\tickettool.py:1491 +#: tickettool\tickettool.py:1495 +msgid "You have chosen to create a ticket." +msgstr "チケットの作成を選択されました。" + +#: tickettool\tickettool.py:1517 +msgid "You have chosen to close this ticket. If this is not done, you do not have the necessary permissions to execute this command." +msgstr "あなたは、このチケットを閉じることを選択しました。このままでは、このコマンドを実行するのに必要な権限がないことになります。" + +#: tickettool\tickettool.py:1549 +msgid "You have chosen to re-open this ticket." +msgstr "このチケットを再オープンすることを選択しました。" + +#: tickettool\tickettool.py:1571 +msgid "You have chosen to claim this ticket. If this is not done, you do not have the necessary permissions to execute this command." +msgstr "あなたは、このチケットを請求することを選択しました。このままでは、このコマンドを実行するために必要な権限がありません。" + +#: tickettool\tickettool.py:1611 +msgid "This message is not in TicketTool config." +msgstr "このメッセージは、TicketToolの設定にはありません。" + +#: tickettool\tickettool.py:1620 +msgid "The profile for which this dropdown was configured no longer exists." +msgstr "このドロップダウンが設定されたプロファイルは、もはや存在しません。" + +#: tickettool\tickettool.py:1687 tickettool\tickettool.py:1694 +msgid "You have chosen to create a ticket with the reason `{reason}`." +msgstr "あなたは、理由 `{reason}` でチケットを作成することを選択しました。" + +#: tickettool\tickettool.py:1840 +msgid "No open tickets by this user in this server." +msgstr "このサーバには、このユーザによるオープンチケットはありません。" + +#: tickettool\utils.py:143 +msgid "Emoji Label must be An emoji followed by a label, and optionnaly by a description and a value (for rename ticket channel), separated by either `;`, `,`, `|`, or `-`." +msgstr "絵文字ラベルは、絵文字の後にラベル、そしてオプションで説明と値(チケットチャネルの名前を変更する場合)を `;`, `,`, `|`, `-` のいずれかで区切ったものでなければなりません。" + +#: tickettool\utils.py:160 +msgid "Error parsing YAML. Please make sure the format is valid (a YAML validator may help)" +msgstr "YAMLのパースでエラーが発生しました。フォーマットが有効であることを確認してください(YAMLバリデーターが役立つかもしれません)。" + +#: tickettool\utils.py:174 +msgid "You can only have 5 text inputs." +msgstr "テキスト入力は5つまで。" + +#: tickettool\utils.py:180 +msgid "The argument `/{count}/{arg}` is required in the YAML." +msgstr "引数 `/{count}/{arg}` はYAMLでは必須である。" + +#: tickettool\utils.py:187 +msgid "The argument `/{count}/{arg}` is invalid in the YAML. Check the spelling." +msgstr "YAML の引数 `/{count}/{arg}` が無効です。スペルを確認してください。" + +#: tickettool\utils.py:193 +msgid "The argument `/modal/{count}/label` must be less than 45 characters long." +msgstr "引数 `/modal/{count}/label` は45文字以下でなければならない。" + +#: tickettool\utils.py:203 tickettool\utils.py:209 +msgid "The argument `/{count}/style` must be a number between 1 and 2." +msgstr "引数 `/{count}/style` には1から2までの数字を指定する。" + +#: tickettool\utils.py:232 +msgid "The argument `/{count}/required` must be a boolean (True or False)." +msgstr "引数 `/{count}/required` はブーリアン(True または False)でなければならない。" + +#: tickettool\utils.py:242 +msgid "The argument `/modal/{count}/default` must be less than 4000 characters long." +msgstr "引数 `/modal/{count}/default` は4000文字以下でなければならない。" + +#: tickettool\utils.py:250 +msgid "The argument `/modal/{count}/placeholder` must be less than 100 characters long." +msgstr "引数 `/modal/{count}/placeholder` は100文字以下でなければならない。" + +#: tickettool\utils.py:258 +msgid "The argument `/modal/{count}/min_length` must be between 0 and 4000." +msgstr "引数 `/modal/{count}/min_length` は0から4000の間でなければならない。" + +#: tickettool\utils.py:266 +msgid "The argument `/modal/{count}/max_length` must be between 0 and 4000." +msgstr "引数 `/modal/{count}/max_length` は0から4000の間でなければならない。" + diff --git a/tickettool/locales/messages.pot b/tickettool/locales/messages.pot new file mode 100644 index 0000000..7e031e9 --- /dev/null +++ b/tickettool/locales/messages.pot @@ -0,0 +1,637 @@ +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2024-12-29 10:43+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: redgettext 3.4.2\n" + +#: tickettool\settings.py:15 tickettool\settings.py:18 +#: tickettool\tickettool.py:765 tickettool\tickettool.py:768 +msgid "This profile does not exist." +msgstr "" + +#: tickettool\settings.py:27 +msgid "" +"I have to be the author of the message. You can use EmbedUtils by AAA3A to " +"send one." +msgstr "" + +#: tickettool\settings.py:54 +#, docstring +msgid "" +"Send a message with a button to open a ticket or dropdown with possible reasons.\n" +"\n" +" Examples:\n" +" - `[p]settickettool message #general \"🐛|Report a bug|If you find a bug, report it here.|bug\" \"⚠️|Report a user|If you find a malicious user, report it here.|user\"`\n" +" - `[p]settickettool 1234567890-0987654321`\n" +" " +msgstr "" + +#: tickettool\settings.py:70 +msgid "" +"I don't have sufficient permissions in this channel to view it and to send " +"messages into." +msgstr "" + +#: tickettool\settings.py:97 +msgid "Create Ticket" +msgstr "" + +#: tickettool\settings.py:116 +msgid "A different value must be provided for each dropdown option." +msgstr "" + +#: tickettool\settings.py:124 +msgid "" +"An emoji you selected seems invalid. Check that it is an emoji. If you have " +"Nitro, you may have used a custom emoji from another server." +msgstr "" + +#: tickettool\ticket.py:245 +msgid "Creating the ticket {ticket.id}." +msgstr "" + +#: tickettool\ticket.py:266 +msgid "" +"The dynamic channel name does not contain correct variable names and must be" +" re-configured with `[p]settickettool dynamicchannelname`." +msgstr "" + +#: tickettool\ticket.py:275 tickettool\ticket.py:530 tickettool\ticket.py:892 +#: tickettool\ticket.py:971 tickettool\tickettool.py:352 +msgid "Close" +msgstr "" + +#: tickettool\ticket.py:282 tickettool\ticket.py:537 tickettool\ticket.py:617 +#: tickettool\ticket.py:899 tickettool\ticket.py:978 +#: tickettool\tickettool.py:366 +msgid "Claim" +msgstr "" + +#: tickettool\ticket.py:289 tickettool\ticket.py:544 tickettool\ticket.py:624 +#: tickettool\ticket.py:906 tickettool\ticket.py:985 +#: tickettool\tickettool.py:373 +msgid "Delete" +msgstr "" + +#: tickettool\ticket.py:303 tickettool\ticket.py:431 +msgid "Ticket Created" +msgstr "" + +#: tickettool\ticket.py:304 +msgid "Thank you for creating a ticket on this server!" +msgstr "" + +#: tickettool\ticket.py:315 +msgid "" +"🎟️ Ticket ID: {ticket.id}\n" +"🕵️ Ticket created by: @{ticket.created_by.display_name} ({ticket.created_by.id})\n" +"☢️ Ticket reason: {short_reason}\n" +msgstr "" + +#: tickettool\ticket.py:397 +msgid "" +"⚠ At least one user (the ticket owner or a team member) could not be added " +"to the ticket thread. Maybe the user doesn't have access to the parent " +"forum/text channel. If the server uses private threads in a text channel, " +"the bot does not have the `manage_messages` permission in this channel." +msgstr "" + +#: tickettool\ticket.py:432 +msgid "The ticket was created by {ticket.created_by}." +msgstr "" + +#: tickettool\ticket.py:438 +msgid "Report on the creation of the ticket {ticket.id}." +msgstr "" + +#: tickettool\ticket.py:478 +msgid "Opening the ticket {ticket.id}." +msgstr "" + +#: tickettool\ticket.py:507 tickettool\ticket.py:515 +msgid "Ticket Opened" +msgstr "" + +#: tickettool\ticket.py:516 +msgid "The ticket was opened by {ticket.opened_by}." +msgstr "" + +#: tickettool\ticket.py:522 tickettool\ticket.py:602 +msgid "Report on the close of the ticket {ticket.id}." +msgstr "" + +#: tickettool\ticket.py:610 tickettool\tickettool.py:359 +msgid "Re-open" +msgstr "" + +#: tickettool\ticket.py:677 tickettool\ticket.py:714 +#: tickettool\tickettool.py:1110 tickettool\tickettool.py:1152 +msgid "Cannot execute action on a text channel." +msgstr "" + +#: tickettool\ticket.py:703 +msgid "Report on the lock of the ticket {ticket.id}." +msgstr "" + +#: tickettool\ticket.py:740 +msgid "Report on the unlock of the ticket {ticket.id}." +msgstr "" + +#: tickettool\ticket.py:757 +msgid "" +"Renaming the ticket {ticket.id}. (`{ticket.channel.name}` to `{new_name}`)" +msgstr "" + +#: tickettool\ticket.py:767 +msgid "Ticket Renamed." +msgstr "" + +#: tickettool\ticket.py:785 +msgid "Ticket Deleted" +msgstr "" + +#: tickettool\ticket.py:786 +msgid "The ticket was deleted by {ticket.deleted_by}." +msgstr "" + +#: tickettool\ticket.py:809 +msgid "Report on the deletion of the ticket {ticket.id}." +msgstr "" + +#: tickettool\ticket.py:826 +msgid "Deleting the ticket {ticket.id}." +msgstr "" + +#: tickettool\ticket.py:847 +msgid "A ticket cannot be claimed if it is closed." +msgstr "" + +#: tickettool\ticket.py:851 +msgid "A bot cannot claim a ticket." +msgstr "" + +#: tickettool\ticket.py:865 +msgid "Claiming the ticket {ticket.id}." +msgstr "" + +#: tickettool\ticket.py:920 +msgid "Ticket claimed." +msgstr "" + +#: tickettool\ticket.py:934 +msgid "A ticket cannot be unclaimed if it is closed." +msgstr "" + +#: tickettool\ticket.py:950 +msgid "Unclaiming the ticket {ticket.id}." +msgstr "" + +#: tickettool\ticket.py:999 +msgid "Ticket unclaimed." +msgstr "" + +#: tickettool\ticket.py:1013 +msgid "Cannot execute action in a thread channel." +msgstr "" + +#: tickettool\ticket.py:1020 +msgid "Changing owner of the ticket {ticket.id}." +msgstr "" + +#: tickettool\ticket.py:1024 +msgid "You cannot transfer ownership of a ticket to a bot." +msgstr "" + +#: tickettool\ticket.py:1053 +msgid "Owner Modified." +msgstr "" + +#: tickettool\ticket.py:1072 +msgid "Adding a member to the ticket {ticket.id}." +msgstr "" + +#: tickettool\ticket.py:1079 tickettool\ticket.py:1116 +msgid "You cannot add a bot to a ticket. ({member})" +msgstr "" + +#: tickettool\ticket.py:1083 tickettool\ticket.py:1120 +msgid "This member is already the owner of this ticket. ({member})" +msgstr "" + +#: tickettool\ticket.py:1089 tickettool\ticket.py:1126 +msgid "" +"This member is an administrator for the tickets system. They will always " +"have access to the ticket anyway. ({member})" +msgstr "" + +#: tickettool\ticket.py:1095 tickettool\ticket.py:1132 +msgid "This member already has access to this ticket. ({member})" +msgstr "" + +#: tickettool\ticket.py:1146 +msgid "" +"⚠ At least one user (the ticket owner or a team member) could not be added " +"to the ticket thread. Maybe the user the user doesn't have access to the " +"parent forum/text channel. If the server uses private threads in a text " +"channel, the bot does not have the `manage_messages` permission in this " +"channel." +msgstr "" + +#: tickettool\ticket.py:1170 +msgid "Removing a member to the ticket {ticket.id}." +msgstr "" + +#: tickettool\ticket.py:1176 tickettool\ticket.py:1206 +msgid "You cannot remove a bot to a ticket ({member})." +msgstr "" + +#: tickettool\ticket.py:1182 tickettool\ticket.py:1212 +msgid "You cannot remove the owner of this ticket. ({member})" +msgstr "" + +#: tickettool\ticket.py:1188 tickettool\ticket.py:1218 +msgid "" +"This member is an administrator for the tickets system. They will always " +"have access to the ticket. ({member})" +msgstr "" + +#: tickettool\ticket.py:1194 tickettool\ticket.py:1224 +msgid "" +"This member is not in the list of those authorised to access the ticket. " +"({member})" +msgstr "" + +#: tickettool\tickettool.py:32 +#, docstring +msgid "A cog to manage a Tickets system!" +msgstr "" + +#: tickettool\tickettool.py:74 +msgid "" +"To get help on this server or to make an order for example, you can create a ticket.\n" +"Just use the command `{prefix}ticket create` or click on the button below.\n" +"You can then use the `{prefix}ticket` subcommands to manage your ticket." +msgstr "" + +#: tickettool\tickettool.py:339 +msgid "Create ticket" +msgstr "" + +#: tickettool\tickettool.py:403 +msgid "Choose the reason for open a ticket." +msgstr "" + +#: tickettool\tickettool.py:521 +msgid "Action taken for the ticket system." +msgstr "" + +#: tickettool\tickettool.py:555 +msgid "Ticket ID:" +msgstr "" + +#: tickettool\tickettool.py:558 +msgid "Owned by:" +msgstr "" + +#: tickettool\tickettool.py:568 +msgid "Channel:" +msgstr "" + +#: tickettool\tickettool.py:575 +msgid "Closed by:" +msgstr "" + +#: tickettool\tickettool.py:585 +msgid "Deleted by:" +msgstr "" + +#: tickettool\tickettool.py:595 +msgid "Closed at:" +msgstr "" + +#: tickettool\tickettool.py:602 tickettool\tickettool.py:628 +msgid "Reason:" +msgstr "" + +#: tickettool\tickettool.py:613 +msgid "Ticket [{ticket.profile}] {ticket.id} - Action taken" +msgstr "" + +#: tickettool\tickettool.py:693 +msgid "You're not in a ticket." +msgstr "" + +#: tickettool\tickettool.py:697 +msgid "This ticket isn't {status}ed." +msgstr "" + +#: tickettool\tickettool.py:706 +msgid "This ticket is {status}." +msgstr "" + +#: tickettool\tickettool.py:715 +msgid "You're not allowed to lock this ticket." +msgstr "" + +#: tickettool\tickettool.py:758 +msgid "You're not allowed to view this ticket." +msgstr "" + +#: tickettool\tickettool.py:792 +msgid "Please provide a profile." +msgstr "" + +#: tickettool\tickettool.py:795 +msgid "No profile has been created on this server." +msgstr "" + +#: tickettool\tickettool.py:803 +msgid "" +"The ticket system is not enabled on this server. Please ask an administrator" +" of this server to use the `{ctx.prefix}settickettool` subcommands to " +"configure it." +msgstr "" + +#: tickettool\tickettool.py:809 +msgid "" +"The category `open` or the category `close` have not been configured. Please" +" ask an administrator of this server to use the `{ctx.prefix}settickettool` " +"subcommands to configure it." +msgstr "" + +#: tickettool\tickettool.py:816 +msgid "Sorry. You have already reached the limit of {limit} open tickets." +msgstr "" + +#: tickettool\tickettool.py:827 +msgid "" +"The bot does not have `manage_channels` permission on the `open` and `close`" +" categories to allow the ticket system to function properly. Please notify " +"an administrator of this server." +msgstr "" + +#: tickettool\tickettool.py:836 +msgid "" +"The bot does not have `manage_channel` permission in the forum channel to " +"allow the ticket system to function properly. Please notify an administrator" +" of this server." +msgstr "" + +#: tickettool\tickettool.py:862 +msgid "You are not allowed to use this interaction." +msgstr "" + +#: tickettool\tickettool.py:881 +msgid "" +"Please provide the required informations by clicking on the button below." +msgstr "" + +#: tickettool\tickettool.py:936 +#, docstring +msgid "" +"Create a Ticket.\n" +"\n" +" If only one profile has been created on this server, you don't need to specify its name.\n" +" " +msgstr "" + +#: tickettool\tickettool.py:952 +#, docstring +msgid "" +"Create a Ticket for a member.\n" +"\n" +" If only one profile has been created on this server, you don't need to specify its name.\n" +" " +msgstr "" + +#: tickettool\tickettool.py:957 +msgid "You cannot create a ticket for a bot." +msgstr "" + +#: tickettool\tickettool.py:960 +msgid "You cannot create a ticket for a member with a higher or equal role." +msgstr "" + +#: tickettool\tickettool.py:980 +#, docstring +msgid "" +"Export all the messages of an existing Ticket in html format.\n" +" Please note: all attachments and user avatars are saved with the Discord link in this file.\n" +" " +msgstr "" + +#: tickettool\tickettool.py:997 +msgid "" +"Here is the html file of the transcript of all the messages in this ticket.\n" +"Please note: all attachments and user avatars are saved with the Discord link in this file." +msgstr "" + +#: tickettool\tickettool.py:1029 +#, docstring +msgid "Open an existing Ticket." +msgstr "" + +#: tickettool\tickettool.py:1034 +msgid "The ticket system is not enabled on this server." +msgstr "" + +#: tickettool\tickettool.py:1060 +#, docstring +msgid "Close an existing Ticket." +msgstr "" + +#: tickettool\tickettool.py:1071 +msgid "Do you really want to close the ticket {ticket.id}?" +msgstr "" + +#: tickettool\tickettool.py:1107 +#, docstring +msgid "Lock an existing Ticket." +msgstr "" + +#: tickettool\tickettool.py:1114 +msgid "Do you really want to lock the ticket {ticket.id}?" +msgstr "" + +#: tickettool\tickettool.py:1149 +#, docstring +msgid "Unlock an existing locked Ticket." +msgstr "" + +#: tickettool\tickettool.py:1177 +#, docstring +msgid "Rename an existing Ticket." +msgstr "" + +#: tickettool\tickettool.py:1203 +#, docstring +msgid "" +"Delete an existing Ticket.\n" +"\n" +" If a logs channel is defined, an html file containing all the messages of this ticket will be generated.\n" +" (Attachments are not supported, as they are saved with their Discord link)\n" +" " +msgstr "" + +#: tickettool\tickettool.py:1212 +msgid "" +"Do you really want to delete all the messages of the ticket {ticket.id}?" +msgstr "" + +#: tickettool\tickettool.py:1216 +msgid "" +"If a logs channel is defined, an html file containing all the messages of " +"this ticket will be generated. (Attachments are not supported, as they are " +"saved with their Discord link.)" +msgstr "" + +#: tickettool\tickettool.py:1252 +#, docstring +msgid "Claim an existing Ticket." +msgstr "" + +#: tickettool\tickettool.py:1276 +#, docstring +msgid "Unclaim an existing Ticket." +msgstr "" + +#: tickettool\tickettool.py:1302 +#, docstring +msgid "Change the owner of an existing Ticket." +msgstr "" + +#: tickettool\tickettool.py:1328 +#, docstring +msgid "Add a member to an existing Ticket." +msgstr "" + +#: tickettool\tickettool.py:1353 +#, docstring +msgid "Remove a member to an existing Ticket." +msgstr "" + +#: tickettool\tickettool.py:1367 +#, docstring +msgid "" +"List the existing Tickets for a profile. You can provide a status and/or a " +"ticket owner." +msgstr "" + +#: tickettool\tickettool.py:1388 +msgid "No tickets to show." +msgstr "" + +#: tickettool\tickettool.py:1429 +msgid "The profile for which this button was configured no longer exists." +msgstr "" + +#: tickettool\tickettool.py:1492 tickettool\tickettool.py:1551 +#: tickettool\tickettool.py:1555 tickettool\tickettool.py:1573 +#: tickettool\tickettool.py:1577 tickettool\tickettool.py:1597 +#: tickettool\tickettool.py:1601 tickettool\tickettool.py:1671 +#: tickettool\tickettool.py:1675 +msgid "You are not allowed to execute this command." +msgstr "" + +#: tickettool\tickettool.py:1496 tickettool\tickettool.py:1501 +#: tickettool\tickettool.py:1505 +msgid "You have chosen to create a ticket." +msgstr "" + +#: tickettool\tickettool.py:1527 +msgid "" +"You have chosen to close this ticket. If this is not done, you do not have " +"the necessary permissions to execute this command." +msgstr "" + +#: tickettool\tickettool.py:1559 +msgid "You have chosen to re-open this ticket." +msgstr "" + +#: tickettool\tickettool.py:1581 +msgid "" +"You have chosen to claim this ticket. If this is not done, you do not have " +"the necessary permissions to execute this command." +msgstr "" + +#: tickettool\tickettool.py:1621 +msgid "This message is not in TicketTool config." +msgstr "" + +#: tickettool\tickettool.py:1630 +msgid "The profile for which this dropdown was configured no longer exists." +msgstr "" + +#: tickettool\tickettool.py:1697 tickettool\tickettool.py:1704 +msgid "You have chosen to create a ticket with the reason `{reason}`." +msgstr "" + +#: tickettool\tickettool.py:1850 +msgid "No open tickets by this user in this server." +msgstr "" + +#: tickettool\utils.py:143 +msgid "" +"Emoji Label must be An emoji followed by a label, and optionnaly by a " +"description and a value (for rename ticket channel), separated by either " +"`;`, `,`, `|`, or `-`." +msgstr "" + +#: tickettool\utils.py:160 +msgid "" +"Error parsing YAML. Please make sure the format is valid (a YAML validator " +"may help)" +msgstr "" + +#: tickettool\utils.py:174 +msgid "You can only have 5 text inputs." +msgstr "" + +#: tickettool\utils.py:180 +msgid "The argument `/{count}/{arg}` is required in the YAML." +msgstr "" + +#: tickettool\utils.py:187 +msgid "" +"The argument `/{count}/{arg}` is invalid in the YAML. Check the spelling." +msgstr "" + +#: tickettool\utils.py:193 +msgid "" +"The argument `/modal/{count}/label` must be less than 45 characters long." +msgstr "" + +#: tickettool\utils.py:203 tickettool\utils.py:209 +msgid "The argument `/{count}/style` must be a number between 1 and 2." +msgstr "" + +#: tickettool\utils.py:232 +msgid "The argument `/{count}/required` must be a boolean (True or False)." +msgstr "" + +#: tickettool\utils.py:242 +msgid "" +"The argument `/modal/{count}/default` must be less than 4000 characters " +"long." +msgstr "" + +#: tickettool\utils.py:250 +msgid "" +"The argument `/modal/{count}/placeholder` must be less than 100 characters " +"long." +msgstr "" + +#: tickettool\utils.py:258 +msgid "The argument `/modal/{count}/min_length` must be between 0 and 4000." +msgstr "" + +#: tickettool\utils.py:266 +msgid "The argument `/modal/{count}/max_length` must be between 0 and 4000." +msgstr "" diff --git a/tickettool/locales/nl-NL.po b/tickettool/locales/nl-NL.po new file mode 100644 index 0000000..0942abb --- /dev/null +++ b/tickettool/locales/nl-NL.po @@ -0,0 +1,586 @@ +msgid "" +msgstr "" +"Project-Id-Version: aaa3a-cogs\n" +"POT-Creation-Date: 2024-07-20 22:15+0200\n" +"PO-Revision-Date: 2024-07-21 15:13\n" +"Last-Translator: \n" +"Language-Team: Dutch\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: redgettext 3.4.2\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Crowdin-Project: aaa3a-cogs\n" +"X-Crowdin-Project-ID: 531090\n" +"X-Crowdin-Language: nl\n" +"X-Crowdin-File: /[AAA3A-AAA3A.AAA3A-cogs] main/tickettool/locales/messages.pot\n" +"X-Crowdin-File-ID: 102\n" +"Language: nl_NL\n" + +#: tickettool\settings.py:15 tickettool\settings.py:18 +#: tickettool\tickettool.py:759 tickettool\tickettool.py:762 +msgid "This profile does not exist." +msgstr "Dit profiel bestaat niet." + +#: tickettool\settings.py:27 +msgid "I have to be the author of the message. You can use EmbedUtils by AAA3A to send one." +msgstr "Ik moet de auteur van het bericht zijn. Je kunt EmbedUtils van AAA3A gebruiken om er een te versturen." + +#: tickettool\settings.py:54 +#, docstring +msgid "Send a message with a button to open a ticket or dropdown with possible reasons.\n\n" +" Examples:\n" +" - `[p]settickettool message #general \"🐛|Report a bug|If you find a bug, report it here.|bug\" \"⚠️|Report a user|If you find a malicious user, report it here.|user\"`\n" +" - `[p]settickettool 1234567890-0987654321`\n" +" " +msgstr "Stuur een bericht met een knop om een ticket te openen of een dropdown met mogelijke redenen.\n\n" +" Voorbeelden:\n" +" - `[p]settickettool message #general \"🐛|Report a bug|Als je een bug vindt, rapporteer het dan hier.|bug\" \"⚠️|Report a user|Als je een kwaadwillende gebruiker vindt, rapporteer het dan hier.|user\"`\n" +" - `[p]settickettool 1234567890-0987654321`\n" +" " + +#: tickettool\settings.py:70 +msgid "I don't have sufficient permissions in this channel to view it and to send messages into." +msgstr "Ik heb niet voldoende rechten in dit kanaal om het te bekijken en er berichten in te versturen." + +#: tickettool\settings.py:97 tickettool\tickettool.py:339 +msgid "Create ticket" +msgstr "Ticket aanmaken" + +#: tickettool\settings.py:116 +msgid "A different value must be provided for each dropdown option." +msgstr "Voor elke vervolgkeuzemogelijkheid moet een andere waarde worden opgegeven." + +#: tickettool\settings.py:124 +msgid "An emoji you selected seems invalid. Check that it is an emoji. If you have Nitro, you may have used a custom emoji from another server." +msgstr "Een emoji die je hebt geselecteerd lijkt ongeldig. Controleer of het een emoji is. Als je Nitro hebt, kan het zijn dat je een aangepaste emoji van een andere server hebt gebruikt." + +#: tickettool\ticket.py:245 +msgid "Creating the ticket {ticket.id}." +msgstr "Het ticket aanmaken {ticket.id}." + +#: tickettool\ticket.py:266 +msgid "The dynamic channel name does not contain correct variable names and must be re-configured with `[p]settickettool dynamicchannelname`." +msgstr "De dynamische kanaalnaam bevat niet de juiste variabelenamen en moet opnieuw geconfigureerd worden met `[p]settickettool dynamicchannelname`." + +#: tickettool\ticket.py:275 tickettool\ticket.py:528 tickettool\ticket.py:890 +#: tickettool\ticket.py:969 tickettool\tickettool.py:352 +msgid "Close" +msgstr "Sluit" + +#: tickettool\ticket.py:282 tickettool\ticket.py:535 tickettool\ticket.py:615 +#: tickettool\ticket.py:897 tickettool\ticket.py:976 +#: tickettool\tickettool.py:366 +msgid "Claim" +msgstr "Claim" + +#: tickettool\ticket.py:289 tickettool\ticket.py:542 tickettool\ticket.py:622 +#: tickettool\ticket.py:904 tickettool\ticket.py:983 +#: tickettool\tickettool.py:373 +msgid "Delete" +msgstr "Verwijder" + +#: tickettool\ticket.py:303 tickettool\ticket.py:429 +msgid "Ticket Created" +msgstr "Ticket aangemaakt" + +#: tickettool\ticket.py:304 +msgid "Thank you for creating a ticket on this server!" +msgstr "Bedankt voor het aanmaken van een ticket op deze server!" + +#: tickettool\ticket.py:315 +msgid "🎟️ Ticket ID: {ticket.id}\n" +"🕵️ Ticket created by: @{ticket.created_by.display_name} ({ticket.created_by.id})\n" +"☢️ Ticket reason: {short_reason}\n" +msgstr "🎟️ Ticket ID: {ticket.id}\n" +"🕵️ Ticket aangemaakt door: @{ticket.created_by.display_name} ({ticket.created_by.id})\n" +"☢️ Reden ticket: {short_reason}\n" + +#: tickettool\ticket.py:395 +msgid "⚠ At least one user (the ticket owner or a team member) could not be added to the ticket thread. Maybe the user doesn't have access to the parent forum/text channel. If the server uses private threads in a text channel, the bot does not have the `manage_messages` permission in this channel." +msgstr "Minstens één gebruiker (de eigenaar van het ticket of een teamlid) kon niet worden toegevoegd aan de ticketthread. Misschien heeft de gebruiker geen toegang tot het bovenliggende forum/tekstkanaal. Als de server privéthreads gebruikt in een tekstkanaal, heeft de bot niet de `manage_messages` rechten in dit kanaal." + +#: tickettool\ticket.py:430 +msgid "The ticket was created by {ticket.created_by}." +msgstr "Het ticket is gemaakt door {ticket.created_by}." + +#: tickettool\ticket.py:436 +msgid "Report on the creation of the ticket {ticket.id}." +msgstr "Verslag over het aanmaken van het ticket {ticket.id}." + +#: tickettool\ticket.py:476 +msgid "Opening the ticket {ticket.id}." +msgstr "Het ticket openen {ticket.id}." + +#: tickettool\ticket.py:505 tickettool\ticket.py:513 +msgid "Ticket Opened" +msgstr "Ticket geopend" + +#: tickettool\ticket.py:514 +msgid "The ticket was opened by {ticket.opened_by}." +msgstr "Het ticket werd geopend door {ticket.opened_by}." + +#: tickettool\ticket.py:520 tickettool\ticket.py:600 +msgid "Report on the close of the ticket {ticket.id}." +msgstr "Verslag over de sluiting van het ticket {ticket.id}." + +#: tickettool\ticket.py:608 tickettool\tickettool.py:359 +msgid "Re-open" +msgstr "Heropen" + +#: tickettool\ticket.py:675 tickettool\ticket.py:712 +#: tickettool\tickettool.py:1100 tickettool\tickettool.py:1142 +msgid "Cannot execute action on a text channel." +msgstr "Kan geen actie uitvoeren op een tekstkanaal." + +#: tickettool\ticket.py:701 +msgid "Report on the lock of the ticket {ticket.id}." +msgstr "Verslag over het slot van het ticket {ticket.id}." + +#: tickettool\ticket.py:738 +msgid "Report on the unlock of the ticket {ticket.id}." +msgstr "Verslag over de ontgrendeling van het ticket {ticket.id}." + +#: tickettool\ticket.py:755 +msgid "Renaming the ticket {ticket.id}. (`{ticket.channel.name}` to `{new_name}`)" +msgstr "Het ticket {ticket.id}hernoemen (`{ticket.channel.name}` naar `{new_name}`)" + +#: tickettool\ticket.py:765 +msgid "Ticket Renamed." +msgstr "Ticket hernoemd." + +#: tickettool\ticket.py:783 +msgid "Ticket Deleted" +msgstr "Ticket verwijderd" + +#: tickettool\ticket.py:784 +msgid "The ticket was deleted by {ticket.deleted_by}." +msgstr "Het ticket is verwijderd door {ticket.deleted_by}." + +#: tickettool\ticket.py:807 +msgid "Report on the deletion of the ticket {ticket.id}." +msgstr "Verslag over de schrapping van het ticket {ticket.id}." + +#: tickettool\ticket.py:824 +msgid "Deleting the ticket {ticket.id}." +msgstr "Het ticket verwijderen {ticket.id}." + +#: tickettool\ticket.py:845 +msgid "A ticket cannot be claimed if it is closed." +msgstr "Een ticket kan niet worden opgeëist als het gesloten is." + +#: tickettool\ticket.py:849 +msgid "A bot cannot claim a ticket." +msgstr "Een bot kan geen ticket claimen." + +#: tickettool\ticket.py:863 +msgid "Claiming the ticket {ticket.id}." +msgstr "Het ticket claimen {ticket.id}." + +#: tickettool\ticket.py:918 +msgid "Ticket claimed." +msgstr "Ticket opgeëist." + +#: tickettool\ticket.py:932 +msgid "A ticket cannot be unclaimed if it is closed." +msgstr "Een ticket kan niet worden opgeëist als het is gesloten." + +#: tickettool\ticket.py:948 +msgid "Unclaiming the ticket {ticket.id}." +msgstr "Het ticket niet opeisen {ticket.id}." + +#: tickettool\ticket.py:997 +msgid "Ticket unclaimed." +msgstr "Ticket niet opgeëist." + +#: tickettool\ticket.py:1011 +msgid "Cannot execute action in a thread channel." +msgstr "Kan actie in een draadkanaal niet uitvoeren." + +#: tickettool\ticket.py:1018 +msgid "Changing owner of the ticket {ticket.id}." +msgstr "Veranderen van eigenaar van het ticket {ticket.id}." + +#: tickettool\ticket.py:1022 +msgid "You cannot transfer ownership of a ticket to a bot." +msgstr "Je kunt het eigendom van een ticket niet overdragen aan een bot." + +#: tickettool\ticket.py:1051 +msgid "Owner Modified." +msgstr "Eigenaar gewijzigd." + +#: tickettool\ticket.py:1070 +msgid "Adding a member to the ticket {ticket.id}." +msgstr "Een lid toevoegen aan het ticket {ticket.id}." + +#: tickettool\ticket.py:1077 tickettool\ticket.py:1114 +msgid "You cannot add a bot to a ticket. ({member})" +msgstr "Je kunt geen bot toevoegen aan een ticket. ({member})" + +#: tickettool\ticket.py:1081 tickettool\ticket.py:1118 +msgid "This member is already the owner of this ticket. ({member})" +msgstr "Dit lid is al eigenaar van dit ticket. ({member})" + +#: tickettool\ticket.py:1087 tickettool\ticket.py:1124 +msgid "This member is an administrator for the tickets system. They will always have access to the ticket anyway. ({member})" +msgstr "Dit lid is een beheerder voor het ticketsysteem. Ze hebben sowieso altijd toegang tot het ticket. ({member})" + +#: tickettool\ticket.py:1093 tickettool\ticket.py:1130 +msgid "This member already has access to this ticket. ({member})" +msgstr "Dit lid heeft al toegang tot dit ticket. ({member})" + +#: tickettool\ticket.py:1144 +msgid "⚠ At least one user (the ticket owner or a team member) could not be added to the ticket thread. Maybe the user the user doesn't have access to the parent forum/text channel. If the server uses private threads in a text channel, the bot does not have the `manage_messages` permission in this channel." +msgstr "Minstens één gebruiker (de eigenaar van het ticket of een teamlid) kon niet worden toegevoegd aan de ticketthread. Misschien heeft de gebruiker geen toegang tot het bovenliggende forum/tekstkanaal. Als de server privéthreads gebruikt in een tekstkanaal, heeft de bot niet de `manage_messages` rechten in dit kanaal." + +#: tickettool\ticket.py:1168 +msgid "Removing a member to the ticket {ticket.id}." +msgstr "Een lid verwijderen uit het ticket {ticket.id}." + +#: tickettool\ticket.py:1174 tickettool\ticket.py:1204 +msgid "You cannot remove a bot to a ticket ({member})." +msgstr "Je kunt een bot niet verwijderen uit een ticket ({member})." + +#: tickettool\ticket.py:1180 tickettool\ticket.py:1210 +msgid "You cannot remove the owner of this ticket. ({member})" +msgstr "Je kunt de eigenaar van dit ticket niet verwijderen. ({member})" + +#: tickettool\ticket.py:1186 tickettool\ticket.py:1216 +msgid "This member is an administrator for the tickets system. They will always have access to the ticket. ({member})" +msgstr "Dit lid is een beheerder voor het ticketsysteem. Ze hebben altijd toegang tot het ticket. ({member})" + +#: tickettool\ticket.py:1192 tickettool\ticket.py:1222 +msgid "This member is not in the list of those authorised to access the ticket. ({member})" +msgstr "Dit lid staat niet in de lijst met personen die toegang hebben tot het ticket. ({member})" + +#: tickettool\tickettool.py:32 +#, docstring +msgid "A cog to manage a tickets system!" +msgstr "Een radertje om een ticketsysteem te beheren!" + +#: tickettool\tickettool.py:74 +msgid "To get help on this server or to make an order for example, you can create a ticket.\n" +"Just use the command `{prefix}ticket create` or click on the button below.\n" +"You can then use the `{prefix}ticket` subcommands to manage your ticket." +msgstr "Om hulp te krijgen op deze server of om bijvoorbeeld een bestelling te doen, kun je een ticket aanmaken.\n" +"Gebruik de opdracht `{prefix}ticket create` of klik op de knop hieronder.\n" +"Je kunt dan de subopdrachten `{prefix}ticket` gebruiken om je ticket te beheren." + +#: tickettool\tickettool.py:403 +msgid "Choose the reason for open a ticket." +msgstr "Kies de reden voor het openen van een ticket." + +#: tickettool\tickettool.py:521 +msgid "Action taken for the ticket system." +msgstr "Actie ondernomen voor het ticketsysteem." + +#: tickettool\tickettool.py:555 +msgid "Ticket ID:" +msgstr "Ticket ID:" + +#: tickettool\tickettool.py:558 +msgid "Owned by:" +msgstr "Eigendom van:" + +#: tickettool\tickettool.py:566 +msgid "Channel:" +msgstr "Kanaal:" + +#: tickettool\tickettool.py:573 +msgid "Closed by:" +msgstr "Gesloten door:" + +#: tickettool\tickettool.py:581 +msgid "Deleted by:" +msgstr "Verwijderd door:" + +#: tickettool\tickettool.py:589 +msgid "Closed at:" +msgstr "Gesloten op:" + +#: tickettool\tickettool.py:596 tickettool\tickettool.py:622 +msgid "Reason:" +msgstr "Reden:" + +#: tickettool\tickettool.py:607 +msgid "Ticket [{ticket.profile}] {ticket.id} - Action taken" +msgstr "Ticket [{ticket.profile}] {ticket.id} - Actie ondernomen" + +#: tickettool\tickettool.py:687 +msgid "You're not in a ticket." +msgstr "Je zit niet in een ticket." + +#: tickettool\tickettool.py:691 +msgid "This ticket isn't {status}ed." +msgstr "Dit ticket is niet {status}ed." + +#: tickettool\tickettool.py:700 +msgid "This ticket is {status}." +msgstr "Dit ticket is {status}." + +#: tickettool\tickettool.py:709 +msgid "You're not allowed to lock this ticket." +msgstr "Je mag dit ticket niet vergrendelen." + +#: tickettool\tickettool.py:752 +msgid "You're not allowed to view this ticket." +msgstr "Je mag dit ticket niet bekijken." + +#: tickettool\tickettool.py:786 +msgid "Please provide a profile." +msgstr "Geef een profiel." + +#: tickettool\tickettool.py:789 +msgid "No profile has been created on this server." +msgstr "Er is geen profiel aangemaakt op deze server." + +#: tickettool\tickettool.py:797 +msgid "The ticket system is not enabled on this server. Please ask an administrator of this server to use the `{ctx.prefix}settickettool` subcommands to configure it." +msgstr "Het ticketsysteem is niet ingeschakeld op deze server. Vraag een beheerder van deze server om de `{ctx.prefix}settickettool` subcommando's te gebruiken om het te configureren." + +#: tickettool\tickettool.py:803 +msgid "The category `open` or the category `close` have not been configured. Please ask an administrator of this server to use the `{ctx.prefix}settickettool` subcommands to configure it." +msgstr "De categorie `open` of de categorie `sluiten` zijn niet geconfigureerd. Vraag een beheerder van deze server om de `{ctx.prefix}settickettool` subcommando's te gebruiken om deze te configureren." + +#: tickettool\tickettool.py:810 +msgid "Sorry. You have already reached the limit of {limit} open tickets." +msgstr "Sorry. Je hebt de limiet van {limit} open tickets al bereikt." + +#: tickettool\tickettool.py:821 +msgid "The bot does not have `manage_channels` permission on the `open` and `close` categories to allow the ticket system to function properly. Please notify an administrator of this server." +msgstr "De bot heeft geen `manage_channels` rechten op de `open` en `close` categorieën om het ticket systeem goed te laten functioneren. Breng een beheerder van deze server op de hoogte." + +#: tickettool\tickettool.py:830 +msgid "The bot does not have `manage_channel` permission in the forum channel to allow the ticket system to function properly. Please notify an administrator of this server." +msgstr "De bot heeft geen `manage_channel` rechten in het forumkanaal om het ticketsysteem goed te laten functioneren. Breng een beheerder van deze server op de hoogte." + +#: tickettool\tickettool.py:875 +msgid "Please provide the required informations by clicking on the button below." +msgstr "Vul de vereiste informatie in door op de onderstaande knop te klikken." + +#: tickettool\tickettool.py:926 +#, docstring +msgid "Create a Ticket.\n\n" +" If only one profile has been created on this server, you don't need to specify its name.\n" +" " +msgstr "Ticket aanmaken.\n\n" +" Als er slechts één profiel is aangemaakt op deze server, hoef je de naam ervan niet op te geven.\n" +" " + +#: tickettool\tickettool.py:942 +#, docstring +msgid "Create a Ticket for a member.\n\n" +" If only one profile has been created on this server, you don't need to specify its name.\n" +" " +msgstr "Maak een ticket aan voor een lid.\n\n" +" Als er slechts één profiel is aangemaakt op deze server, hoef je de naam niet op te geven.\n" +" " + +#: tickettool\tickettool.py:947 +msgid "You cannot create a ticket for a bot." +msgstr "Je kunt geen ticket aanmaken voor een bot." + +#: tickettool\tickettool.py:950 +msgid "You cannot create a ticket for a member with a higher or equal role." +msgstr "Je kunt geen ticket aanmaken voor een lid met een hogere of gelijke rol." + +#: tickettool\tickettool.py:970 +#, docstring +msgid "Export all the messages of an existing Ticket in html format.\n" +" Please note: all attachments and user avatars are saved with the Discord link in this file.\n" +" " +msgstr "Exporteer alle berichten van een bestaand Ticket in html-formaat.\n" +" Let op: alle bijlagen en gebruikersavatars worden opgeslagen met de Discord link in dit bestand.\n" +" " + +#: tickettool\tickettool.py:987 +msgid "Here is the html file of the transcript of all the messages in this ticket.\n" +"Please note: all attachments and user avatars are saved with the Discord link in this file." +msgstr "Hier is het html-bestand met het transcript van alle berichten in dit ticket.\n" +"Let op: alle bijlagen en gebruikersavatars worden opgeslagen met de Discord-link in dit bestand." + +#: tickettool\tickettool.py:1019 +#, docstring +msgid "Open an existing Ticket." +msgstr "Open een bestaand ticket." + +#: tickettool\tickettool.py:1024 +msgid "The ticket system is not enabled on this server." +msgstr "Het ticketsysteem is niet ingeschakeld op deze server." + +#: tickettool\tickettool.py:1050 +#, docstring +msgid "Close an existing Ticket." +msgstr "Een bestaand ticket sluiten." + +#: tickettool\tickettool.py:1061 +msgid "Do you really want to close the ticket {ticket.id}?" +msgstr "Wil je echt het ticket {ticket.id}sluiten?" + +#: tickettool\tickettool.py:1097 +#, docstring +msgid "Lock an existing Ticket." +msgstr "Een bestaand ticket vergrendelen." + +#: tickettool\tickettool.py:1104 +msgid "Do you really want to lock the ticket {ticket.id}?" +msgstr "Wil je echt het ticket {ticket.id}vergrendelen?" + +#: tickettool\tickettool.py:1139 +#, docstring +msgid "Unlock an existing locked Ticket." +msgstr "Een bestaand vergrendeld ticket ontgrendelen." + +#: tickettool\tickettool.py:1167 +#, docstring +msgid "Rename an existing Ticket." +msgstr "Een bestaand ticket hernoemen." + +#: tickettool\tickettool.py:1193 +#, docstring +msgid "Delete an existing Ticket.\n\n" +" If a logs channel is defined, an html file containing all the messages of this ticket will be generated.\n" +" (Attachments are not supported, as they are saved with their Discord link)\n" +" " +msgstr "Een bestaand ticket verwijderen.\n\n" +" Als er een logboekkanaal is gedefinieerd, wordt er een html-bestand gegenereerd met alle berichten van dit ticket.\n" +" (Bijlagen worden niet ondersteund, omdat ze worden opgeslagen met hun Discord-link)\n" +" " + +#: tickettool\tickettool.py:1202 +msgid "Do you really want to delete all the messages of the ticket {ticket.id}?" +msgstr "Wil je echt alle berichten van het ticket {ticket.id}verwijderen?" + +#: tickettool\tickettool.py:1206 +msgid "If a logs channel is defined, an html file containing all the messages of this ticket will be generated. (Attachments are not supported, as they are saved with their Discord link.)" +msgstr "De nieuwste versie van Medicat USB is 21.12!\n" +"||||\n" +"Er is momenteel geen ETA voor een bijgewerkte versie vanwege tijdsbeperkingen." + +#: tickettool\tickettool.py:1242 +#, docstring +msgid "Claim an existing Ticket." +msgstr "Claim een bestaand ticket." + +#: tickettool\tickettool.py:1266 +#, docstring +msgid "Unclaim an existing Ticket." +msgstr "Een bestaand ticket opheffen." + +#: tickettool\tickettool.py:1292 +#, docstring +msgid "Change the owner of an existing Ticket." +msgstr "De eigenaar van een bestaand ticket wijzigen." + +#: tickettool\tickettool.py:1318 +#, docstring +msgid "Add a member to an existing Ticket." +msgstr "Een lid toevoegen aan een bestaand ticket." + +#: tickettool\tickettool.py:1343 +#, docstring +msgid "Remove a member to an existing Ticket." +msgstr "Verwijder een lid van een bestaand ticket." + +#: tickettool\tickettool.py:1357 +#, docstring +msgid "List the existing Tickets for a profile. You can provide a status and/or a ticket owner." +msgstr "Geef een overzicht van de bestaande tickets voor een profiel. Je kunt een status en/of een ticketeigenaar opgeven." + +#: tickettool\tickettool.py:1378 +msgid "No tickets to show." +msgstr "Geen kaartjes om te laten zien." + +#: tickettool\tickettool.py:1419 +msgid "The profile for which this button was configured no longer exists." +msgstr "Het profiel waarvoor deze knop is geconfigureerd, bestaat niet meer." + +#: tickettool\tickettool.py:1482 tickettool\tickettool.py:1541 +#: tickettool\tickettool.py:1545 tickettool\tickettool.py:1563 +#: tickettool\tickettool.py:1567 tickettool\tickettool.py:1587 +#: tickettool\tickettool.py:1591 tickettool\tickettool.py:1661 +#: tickettool\tickettool.py:1665 +msgid "You are not allowed to execute this command." +msgstr "Je mag dit commando niet uitvoeren." + +#: tickettool\tickettool.py:1486 tickettool\tickettool.py:1491 +#: tickettool\tickettool.py:1495 +msgid "You have chosen to create a ticket." +msgstr "Je hebt ervoor gekozen een ticket aan te maken." + +#: tickettool\tickettool.py:1517 +msgid "You have chosen to close this ticket. If this is not done, you do not have the necessary permissions to execute this command." +msgstr "Je hebt ervoor gekozen om dit ticket te sluiten. Als je dit niet doet, heb je niet de benodigde rechten om deze opdracht uit te voeren." + +#: tickettool\tickettool.py:1549 +msgid "You have chosen to re-open this ticket." +msgstr "Je hebt ervoor gekozen om dit ticket opnieuw te openen." + +#: tickettool\tickettool.py:1571 +msgid "You have chosen to claim this ticket. If this is not done, you do not have the necessary permissions to execute this command." +msgstr "Je hebt ervoor gekozen om dit ticket te claimen. Als dit niet is gebeurd, heb je niet de benodigde rechten om deze opdracht uit te voeren." + +#: tickettool\tickettool.py:1611 +msgid "This message is not in TicketTool config." +msgstr "Dit bericht staat niet in TicketTool config." + +#: tickettool\tickettool.py:1620 +msgid "The profile for which this dropdown was configured no longer exists." +msgstr "Het profiel waarvoor deze vervolgkeuzelijst is geconfigureerd, bestaat niet meer." + +#: tickettool\tickettool.py:1687 tickettool\tickettool.py:1694 +msgid "You have chosen to create a ticket with the reason `{reason}`." +msgstr "Je hebt ervoor gekozen een ticket aan te maken met als reden `{reason}`." + +#: tickettool\tickettool.py:1840 +msgid "No open tickets by this user in this server." +msgstr "Geen open tickets van deze gebruiker in deze server." + +#: tickettool\utils.py:143 +msgid "Emoji Label must be An emoji followed by a label, and optionnaly by a description and a value (for rename ticket channel), separated by either `;`, `,`, `|`, or `-`." +msgstr "Emoji Label moet een emoji zijn gevolgd door een label, en optioneel door een beschrijving en een waarde (voor rename ticket channel), gescheiden door `;`, `,`, `|`, of `-`." + +#: tickettool\utils.py:160 +msgid "Error parsing YAML. Please make sure the format is valid (a YAML validator may help)" +msgstr "Fout bij het parsen van YAML. Controleer of het formaat geldig is (een YAML-validator kan helpen)" + +#: tickettool\utils.py:174 +msgid "You can only have 5 text inputs." +msgstr "Je kunt maar 5 tekstingangen hebben." + +#: tickettool\utils.py:180 +msgid "The argument `/{count}/{arg}` is required in the YAML." +msgstr "Het argument `/{count}/{arg}` is vereist in de YAML." + +#: tickettool\utils.py:187 +msgid "The argument `/{count}/{arg}` is invalid in the YAML. Check the spelling." +msgstr "Het argument `/{count}/{arg}` is ongeldig in de YAML. Controleer de spelling." + +#: tickettool\utils.py:193 +msgid "The argument `/modal/{count}/label` must be less than 45 characters long." +msgstr "Het argument `/modal/{count}/label` moet minder dan 45 tekens lang zijn." + +#: tickettool\utils.py:203 tickettool\utils.py:209 +msgid "The argument `/{count}/style` must be a number between 1 and 2." +msgstr "Het argument `/{count}/style` moet een getal tussen 1 en 2 zijn." + +#: tickettool\utils.py:232 +msgid "The argument `/{count}/required` must be a boolean (True or False)." +msgstr "Het argument `/{count}/required` moet een boolean zijn (True of False)." + +#: tickettool\utils.py:242 +msgid "The argument `/modal/{count}/default` must be less than 4000 characters long." +msgstr "Het argument `/modal/{count}/default` moet minder dan 4000 tekens lang zijn." + +#: tickettool\utils.py:250 +msgid "The argument `/modal/{count}/placeholder` must be less than 100 characters long." +msgstr "Het argument `/modal/{count}/placeholder` moet minder dan 100 tekens lang zijn." + +#: tickettool\utils.py:258 +msgid "The argument `/modal/{count}/min_length` must be between 0 and 4000." +msgstr "Het argument `/modal/{count}/min_length` moet tussen 0 en 4000 liggen." + +#: tickettool\utils.py:266 +msgid "The argument `/modal/{count}/max_length` must be between 0 and 4000." +msgstr "Het argument `/modal/{count}/max_length` moet tussen 0 en 4000 liggen." + diff --git a/tickettool/locales/pl-PL.po b/tickettool/locales/pl-PL.po new file mode 100644 index 0000000..be7d218 --- /dev/null +++ b/tickettool/locales/pl-PL.po @@ -0,0 +1,584 @@ +msgid "" +msgstr "" +"Project-Id-Version: aaa3a-cogs\n" +"POT-Creation-Date: 2024-07-20 22:15+0200\n" +"PO-Revision-Date: 2024-07-21 15:13\n" +"Last-Translator: \n" +"Language-Team: Polish\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: redgettext 3.4.2\n" +"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n" +"X-Crowdin-Project: aaa3a-cogs\n" +"X-Crowdin-Project-ID: 531090\n" +"X-Crowdin-Language: pl\n" +"X-Crowdin-File: /[AAA3A-AAA3A.AAA3A-cogs] main/tickettool/locales/messages.pot\n" +"X-Crowdin-File-ID: 102\n" +"Language: pl_PL\n" + +#: tickettool\settings.py:15 tickettool\settings.py:18 +#: tickettool\tickettool.py:759 tickettool\tickettool.py:762 +msgid "This profile does not exist." +msgstr "Ten profil nie istnieje." + +#: tickettool\settings.py:27 +msgid "I have to be the author of the message. You can use EmbedUtils by AAA3A to send one." +msgstr "Muszę być autorem wiadomości. Możesz użyć EmbedUtils by AAA3A, aby wysłać taką wiadomość." + +#: tickettool\settings.py:54 +#, docstring +msgid "Send a message with a button to open a ticket or dropdown with possible reasons.\n\n" +" Examples:\n" +" - `[p]settickettool message #general \"🐛|Report a bug|If you find a bug, report it here.|bug\" \"⚠️|Report a user|If you find a malicious user, report it here.|user\"`\n" +" - `[p]settickettool 1234567890-0987654321`\n" +" " +msgstr "Wyślij wiadomość z przyciskiem do otwarcia zgłoszenia lub rozwijanym menu z możliwymi przyczynami.\n\n" +" Przykłady:\n" +" - `[p]settickettool message #general \"🐛|Report a bug|If you find a bug, report it here.|bug\" \"⚠️|Report a user|If you find a malicious user, report it here.|user\"`\n" +" - `[p]settickettool 1234567890-0987654321`\n" +" " + +#: tickettool\settings.py:70 +msgid "I don't have sufficient permissions in this channel to view it and to send messages into." +msgstr "Nie mam wystarczających uprawnień na tym kanale, aby go przeglądać i wysyłać na niego wiadomości." + +#: tickettool\settings.py:97 tickettool\tickettool.py:339 +msgid "Create ticket" +msgstr "Utwórz bilet" + +#: tickettool\settings.py:116 +msgid "A different value must be provided for each dropdown option." +msgstr "Dla każdej rozwijanej opcji należy podać inną wartość." + +#: tickettool\settings.py:124 +msgid "An emoji you selected seems invalid. Check that it is an emoji. If you have Nitro, you may have used a custom emoji from another server." +msgstr "Wybrany emoji wydaje się być nieprawidłowy. Sprawdź, czy jest to emoji. Jeśli masz Nitro, mogłeś użyć niestandardowego emoji z innego serwera." + +#: tickettool\ticket.py:245 +msgid "Creating the ticket {ticket.id}." +msgstr "Tworzenie biletu {ticket.id}." + +#: tickettool\ticket.py:266 +msgid "The dynamic channel name does not contain correct variable names and must be re-configured with `[p]settickettool dynamicchannelname`." +msgstr "Nazwa kanału dynamicznego nie zawiera poprawnych nazw zmiennych i musi zostać ponownie skonfigurowana za pomocą `[p]settickettool dynamicchannelname`." + +#: tickettool\ticket.py:275 tickettool\ticket.py:528 tickettool\ticket.py:890 +#: tickettool\ticket.py:969 tickettool\tickettool.py:352 +msgid "Close" +msgstr "Zamknij" + +#: tickettool\ticket.py:282 tickettool\ticket.py:535 tickettool\ticket.py:615 +#: tickettool\ticket.py:897 tickettool\ticket.py:976 +#: tickettool\tickettool.py:366 +msgid "Claim" +msgstr "Pozew" + +#: tickettool\ticket.py:289 tickettool\ticket.py:542 tickettool\ticket.py:622 +#: tickettool\ticket.py:904 tickettool\ticket.py:983 +#: tickettool\tickettool.py:373 +msgid "Delete" +msgstr "Usuń" + +#: tickettool\ticket.py:303 tickettool\ticket.py:429 +msgid "Ticket Created" +msgstr "Utworzony bilet" + +#: tickettool\ticket.py:304 +msgid "Thank you for creating a ticket on this server!" +msgstr "Dziękujemy za stworzenie biletu na tym serwerze!" + +#: tickettool\ticket.py:315 +msgid "🎟️ Ticket ID: {ticket.id}\n" +"🕵️ Ticket created by: @{ticket.created_by.display_name} ({ticket.created_by.id})\n" +"☢️ Ticket reason: {short_reason}\n" +msgstr "🎟️ Ticket ID: {ticket.id}\n" +"🕵️ Ticket created by: @{ticket.created_by.display_name} ({ticket.created_by.id})\n" +"☢️ Powód zgłoszenia: {short_reason}\n" + +#: tickettool\ticket.py:395 +msgid "⚠ At least one user (the ticket owner or a team member) could not be added to the ticket thread. Maybe the user doesn't have access to the parent forum/text channel. If the server uses private threads in a text channel, the bot does not have the `manage_messages` permission in this channel." +msgstr "⚠ Co najmniej jeden użytkownik (właściciel zgłoszenia lub członek zespołu) nie mógł zostać dodany do wątku zgłoszenia. Być może użytkownik nie ma dostępu do nadrzędnego forum/kanału tekstowego. Jeśli serwer używa prywatnych wątków w kanale tekstowym, bot nie ma uprawnienia `manage_messages` w tym kanale." + +#: tickettool\ticket.py:430 +msgid "The ticket was created by {ticket.created_by}." +msgstr "Bilet został stworzony przez {ticket.created_by}." + +#: tickettool\ticket.py:436 +msgid "Report on the creation of the ticket {ticket.id}." +msgstr "Raport z tworzenia biletu {ticket.id}." + +#: tickettool\ticket.py:476 +msgid "Opening the ticket {ticket.id}." +msgstr "Otwarcie biletu {ticket.id}." + +#: tickettool\ticket.py:505 tickettool\ticket.py:513 +msgid "Ticket Opened" +msgstr "Bilet otwarty" + +#: tickettool\ticket.py:514 +msgid "The ticket was opened by {ticket.opened_by}." +msgstr "Bilet został otwarty przez {ticket.opened_by}." + +#: tickettool\ticket.py:520 tickettool\ticket.py:600 +msgid "Report on the close of the ticket {ticket.id}." +msgstr "Raport z zamknięcia biletu {ticket.id}." + +#: tickettool\ticket.py:608 tickettool\tickettool.py:359 +msgid "Re-open" +msgstr "Ponowne otwarcie strony" + +#: tickettool\ticket.py:675 tickettool\ticket.py:712 +#: tickettool\tickettool.py:1100 tickettool\tickettool.py:1142 +msgid "Cannot execute action on a text channel." +msgstr "Nie można wykonać akcji na kanale tekstowym." + +#: tickettool\ticket.py:701 +msgid "Report on the lock of the ticket {ticket.id}." +msgstr "Raport z zamknięcia biletu {ticket.id}." + +#: tickettool\ticket.py:738 +msgid "Report on the unlock of the ticket {ticket.id}." +msgstr "Raport z odblokowania biletu {ticket.id}." + +#: tickettool\ticket.py:755 +msgid "Renaming the ticket {ticket.id}. (`{ticket.channel.name}` to `{new_name}`)" +msgstr "Zmiana nazwy biletu {ticket.id}. (`{ticket.channel.name}` na `{new_name}`)" + +#: tickettool\ticket.py:765 +msgid "Ticket Renamed." +msgstr "Ticket Renamed." + +#: tickettool\ticket.py:783 +msgid "Ticket Deleted" +msgstr "Bilet usunięty" + +#: tickettool\ticket.py:784 +msgid "The ticket was deleted by {ticket.deleted_by}." +msgstr "Bilet został usunięty przez {ticket.deleted_by}." + +#: tickettool\ticket.py:807 +msgid "Report on the deletion of the ticket {ticket.id}." +msgstr "Raport w sprawie skasowania biletu {ticket.id}." + +#: tickettool\ticket.py:824 +msgid "Deleting the ticket {ticket.id}." +msgstr "Skasowanie biletu {ticket.id}." + +#: tickettool\ticket.py:845 +msgid "A ticket cannot be claimed if it is closed." +msgstr "Nie można reklamować biletu, jeśli jest on zamknięty." + +#: tickettool\ticket.py:849 +msgid "A bot cannot claim a ticket." +msgstr "Bot nie może ubiegać się o bilet." + +#: tickettool\ticket.py:863 +msgid "Claiming the ticket {ticket.id}." +msgstr "Reklamacja biletu {ticket.id}." + +#: tickettool\ticket.py:918 +msgid "Ticket claimed." +msgstr "Bilet został odebrany." + +#: tickettool\ticket.py:932 +msgid "A ticket cannot be unclaimed if it is closed." +msgstr "Bilet nie może być nieodebrany, jeśli został zamknięty." + +#: tickettool\ticket.py:948 +msgid "Unclaiming the ticket {ticket.id}." +msgstr "Odblokowanie biletu {ticket.id}." + +#: tickettool\ticket.py:997 +msgid "Ticket unclaimed." +msgstr "Bilet nieodebrany." + +#: tickettool\ticket.py:1011 +msgid "Cannot execute action in a thread channel." +msgstr "Nie można wykonać akcji w kanale wątku." + +#: tickettool\ticket.py:1018 +msgid "Changing owner of the ticket {ticket.id}." +msgstr "Zmiana właściciela biletu {ticket.id}." + +#: tickettool\ticket.py:1022 +msgid "You cannot transfer ownership of a ticket to a bot." +msgstr "Nie można przenieść własności biletu na bota." + +#: tickettool\ticket.py:1051 +msgid "Owner Modified." +msgstr "Właściciel zmodyfikowany." + +#: tickettool\ticket.py:1070 +msgid "Adding a member to the ticket {ticket.id}." +msgstr "Dodawanie członka do biletu {ticket.id}." + +#: tickettool\ticket.py:1077 tickettool\ticket.py:1114 +msgid "You cannot add a bot to a ticket. ({member})" +msgstr "Nie można dodać bota do biletu. ({member})" + +#: tickettool\ticket.py:1081 tickettool\ticket.py:1118 +msgid "This member is already the owner of this ticket. ({member})" +msgstr "Ten członek jest już właścicielem tego biletu. ({member})" + +#: tickettool\ticket.py:1087 tickettool\ticket.py:1124 +msgid "This member is an administrator for the tickets system. They will always have access to the ticket anyway. ({member})" +msgstr "Ten użytkownik jest administratorem systemu zgłoszeń. I tak zawsze będzie miał dostęp do biletu. ({member})" + +#: tickettool\ticket.py:1093 tickettool\ticket.py:1130 +msgid "This member already has access to this ticket. ({member})" +msgstr "Ten użytkownik ma już dostęp do tego biletu. ({member})" + +#: tickettool\ticket.py:1144 +msgid "⚠ At least one user (the ticket owner or a team member) could not be added to the ticket thread. Maybe the user the user doesn't have access to the parent forum/text channel. If the server uses private threads in a text channel, the bot does not have the `manage_messages` permission in this channel." +msgstr "⚠ Co najmniej jeden użytkownik (właściciel zgłoszenia lub członek zespołu) nie mógł zostać dodany do wątku zgłoszenia. Być może użytkownik nie ma dostępu do nadrzędnego forum/kanału tekstowego. Jeśli serwer używa prywatnych wątków w kanale tekstowym, bot nie ma uprawnienia `manage_messages` w tym kanale." + +#: tickettool\ticket.py:1168 +msgid "Removing a member to the ticket {ticket.id}." +msgstr "Usuwanie członka do biletu {ticket.id}." + +#: tickettool\ticket.py:1174 tickettool\ticket.py:1204 +msgid "You cannot remove a bot to a ticket ({member})." +msgstr "Nie można usunąć bota do biletu ({member})." + +#: tickettool\ticket.py:1180 tickettool\ticket.py:1210 +msgid "You cannot remove the owner of this ticket. ({member})" +msgstr "Nie można usunąć właściciela tego biletu. ({member})" + +#: tickettool\ticket.py:1186 tickettool\ticket.py:1216 +msgid "This member is an administrator for the tickets system. They will always have access to the ticket. ({member})" +msgstr "Ten użytkownik jest administratorem systemu zgłoszeń. Zawsze będzie miał dostęp do zgłoszenia. ({member})" + +#: tickettool\ticket.py:1192 tickettool\ticket.py:1222 +msgid "This member is not in the list of those authorised to access the ticket. ({member})" +msgstr "Ten członek nie znajduje się na liście osób upoważnionych do dostępu do biletu. ({member})" + +#: tickettool\tickettool.py:32 +#, docstring +msgid "A cog to manage a tickets system!" +msgstr "Trybik do zarządzania systemem biletów!" + +#: tickettool\tickettool.py:74 +msgid "To get help on this server or to make an order for example, you can create a ticket.\n" +"Just use the command `{prefix}ticket create` or click on the button below.\n" +"You can then use the `{prefix}ticket` subcommands to manage your ticket." +msgstr "Aby uzyskać pomoc na tym serwerze lub np. złożyć zamówienie, możesz stworzyć bilet.\n" +"Wystarczy użyć komendy `{prefix}ticket create` lub kliknąć na przycisk poniżej.\n" +"Następnie możesz użyć podkomend `{prefix}ticket`, aby zarządzać swoim biletem." + +#: tickettool\tickettool.py:403 +msgid "Choose the reason for open a ticket." +msgstr "Wybierz powód, dla którego chcesz otworzyć bilet." + +#: tickettool\tickettool.py:521 +msgid "Action taken for the ticket system." +msgstr "Działania podjęte dla systemu biletowego." + +#: tickettool\tickettool.py:555 +msgid "Ticket ID:" +msgstr "ID biletu:" + +#: tickettool\tickettool.py:558 +msgid "Owned by:" +msgstr "Posiadane przez:" + +#: tickettool\tickettool.py:566 +msgid "Channel:" +msgstr "Kanał:" + +#: tickettool\tickettool.py:573 +msgid "Closed by:" +msgstr "Zamknięte przez:" + +#: tickettool\tickettool.py:581 +msgid "Deleted by:" +msgstr "Usunięty przez:" + +#: tickettool\tickettool.py:589 +msgid "Closed at:" +msgstr "Zamknięte w:" + +#: tickettool\tickettool.py:596 tickettool\tickettool.py:622 +msgid "Reason:" +msgstr "Uzasadnienie:" + +#: tickettool\tickettool.py:607 +msgid "Ticket [{ticket.profile}] {ticket.id} - Action taken" +msgstr "Ticket [{ticket.profile}] {ticket.id} - Podjęto działania" + +#: tickettool\tickettool.py:687 +msgid "You're not in a ticket." +msgstr "Nie masz biletu." + +#: tickettool\tickettool.py:691 +msgid "This ticket isn't {status}ed." +msgstr "Ten bilet nie jest dostępny pod adresem {status}ed." + +#: tickettool\tickettool.py:700 +msgid "This ticket is {status}." +msgstr "Ten bilet jest dostępny pod adresem {status}." + +#: tickettool\tickettool.py:709 +msgid "You're not allowed to lock this ticket." +msgstr "Nie możesz zablokować tego zgłoszenia." + +#: tickettool\tickettool.py:752 +msgid "You're not allowed to view this ticket." +msgstr "Nie możesz wyświetlić tego zgłoszenia." + +#: tickettool\tickettool.py:786 +msgid "Please provide a profile." +msgstr "Prosimy o podanie profilu." + +#: tickettool\tickettool.py:789 +msgid "No profile has been created on this server." +msgstr "Na tym serwerze nie utworzono żadnego profilu." + +#: tickettool\tickettool.py:797 +msgid "The ticket system is not enabled on this server. Please ask an administrator of this server to use the `{ctx.prefix}settickettool` subcommands to configure it." +msgstr "System zgłoszeń nie jest włączony na tym serwerze. Poproś administratora tego serwera o użycie podkomendy `{ctx.prefix}settickettool` w celu jego skonfigurowania." + +#: tickettool\tickettool.py:803 +msgid "The category `open` or the category `close` have not been configured. Please ask an administrator of this server to use the `{ctx.prefix}settickettool` subcommands to configure it." +msgstr "Kategoria `open` lub `close` nie została skonfigurowana. Poproś administratora tego serwera o użycie podkomend `{ctx.prefix}settickettool` w celu ich skonfigurowania." + +#: tickettool\tickettool.py:810 +msgid "Sorry. You have already reached the limit of {limit} open tickets." +msgstr "Przepraszamy. Osiągnąłeś już limit {limit} otwartych biletów." + +#: tickettool\tickettool.py:821 +msgid "The bot does not have `manage_channels` permission on the `open` and `close` categories to allow the ticket system to function properly. Please notify an administrator of this server." +msgstr "Bot nie posiada uprawnień `manage_channels` na kategoriach `open` i `close` umożliwiających poprawne działanie systemu biletowego. Prosimy o powiadomienie administratora tego serwera." + +#: tickettool\tickettool.py:830 +msgid "The bot does not have `manage_channel` permission in the forum channel to allow the ticket system to function properly. Please notify an administrator of this server." +msgstr "Bot nie posiada uprawnień `manage_channel` w kanale forum, aby umożliwić prawidłowe działanie systemu biletowego. Prosimy o powiadomienie administratora tego serwera." + +#: tickettool\tickettool.py:875 +msgid "Please provide the required informations by clicking on the button below." +msgstr "Prosimy o podanie wymaganych informacji, klikając poniższy przycisk." + +#: tickettool\tickettool.py:926 +#, docstring +msgid "Create a Ticket.\n\n" +" If only one profile has been created on this server, you don't need to specify its name.\n" +" " +msgstr "Utwórz bilet.\n\n" +" Jeśli na tym serwerze utworzono tylko jeden profil, nie trzeba określać jego nazwy.\n" +" " + +#: tickettool\tickettool.py:942 +#, docstring +msgid "Create a Ticket for a member.\n\n" +" If only one profile has been created on this server, you don't need to specify its name.\n" +" " +msgstr "Utwórz bilet dla członka.\n\n" +" Jeśli na tym serwerze utworzono tylko jeden profil, nie trzeba podawać jego nazwy.\n" +" " + +#: tickettool\tickettool.py:947 +msgid "You cannot create a ticket for a bot." +msgstr "Nie można utworzyć zgłoszenia dla bota." + +#: tickettool\tickettool.py:950 +msgid "You cannot create a ticket for a member with a higher or equal role." +msgstr "Nie można utworzyć zgłoszenia dla członka z wyższą lub równą rolą." + +#: tickettool\tickettool.py:970 +#, docstring +msgid "Export all the messages of an existing Ticket in html format.\n" +" Please note: all attachments and user avatars are saved with the Discord link in this file.\n" +" " +msgstr "Eksport wszystkich wiadomości istniejącego Ticketu w formacie html.\n" +" Uwaga: wszystkie załączniki i awatary użytkowników są zapisywane z linkiem Discord w tym pliku.\n" +" " + +#: tickettool\tickettool.py:987 +msgid "Here is the html file of the transcript of all the messages in this ticket.\n" +"Please note: all attachments and user avatars are saved with the Discord link in this file." +msgstr "Oto plik html transkrypcji wszystkich wiadomości w tym bilecie.\n" +"Uwaga: wszystkie załączniki i awatary użytkowników są zapisane z linkiem Discord w tym pliku." + +#: tickettool\tickettool.py:1019 +#, docstring +msgid "Open an existing Ticket." +msgstr "Otwórz istniejący bilet." + +#: tickettool\tickettool.py:1024 +msgid "The ticket system is not enabled on this server." +msgstr "System biletowy nie jest włączony na tym serwerze." + +#: tickettool\tickettool.py:1050 +#, docstring +msgid "Close an existing Ticket." +msgstr "Zamknij istniejący bilet." + +#: tickettool\tickettool.py:1061 +msgid "Do you really want to close the ticket {ticket.id}?" +msgstr "Czy naprawdę chcesz zamknąć bilet {ticket.id}?" + +#: tickettool\tickettool.py:1097 +#, docstring +msgid "Lock an existing Ticket." +msgstr "Zablokuj istniejący bilet." + +#: tickettool\tickettool.py:1104 +msgid "Do you really want to lock the ticket {ticket.id}?" +msgstr "Czy naprawdę chcesz zablokować bilet {ticket.id}?" + +#: tickettool\tickettool.py:1139 +#, docstring +msgid "Unlock an existing locked Ticket." +msgstr "Odblokowanie istniejącego zablokowanego biletu." + +#: tickettool\tickettool.py:1167 +#, docstring +msgid "Rename an existing Ticket." +msgstr "Zmiana nazwy istniejącego biletu." + +#: tickettool\tickettool.py:1193 +#, docstring +msgid "Delete an existing Ticket.\n\n" +" If a logs channel is defined, an html file containing all the messages of this ticket will be generated.\n" +" (Attachments are not supported, as they are saved with their Discord link)\n" +" " +msgstr "Usuń istniejący bilet.\n\n" +" Jeśli zdefiniowano kanał dziennika, zostanie wygenerowany plik html zawierający wszystkie wiadomości tego zgłoszenia.\n" +" (Załączniki nie są obsługiwane, ponieważ są zapisywane z linkiem do Discorda)\n" +" " + +#: tickettool\tickettool.py:1202 +msgid "Do you really want to delete all the messages of the ticket {ticket.id}?" +msgstr "Czy naprawdę chcesz usunąć wszystkie wiadomości z biletu {ticket.id}?" + +#: tickettool\tickettool.py:1206 +msgid "If a logs channel is defined, an html file containing all the messages of this ticket will be generated. (Attachments are not supported, as they are saved with their Discord link.)" +msgstr "Jeśli zdefiniowano kanał dzienników, wygenerowany zostanie plik html zawierający wszystkie wiadomości tego zgłoszenia. (Załączniki nie są obsługiwane, ponieważ są zapisywane wraz z linkiem do Discorda.)" + +#: tickettool\tickettool.py:1242 +#, docstring +msgid "Claim an existing Ticket." +msgstr "Odbierz istniejący bilet." + +#: tickettool\tickettool.py:1266 +#, docstring +msgid "Unclaim an existing Ticket." +msgstr "Odblokuj istniejący bilet." + +#: tickettool\tickettool.py:1292 +#, docstring +msgid "Change the owner of an existing Ticket." +msgstr "Zmiana właściciela istniejącego biletu." + +#: tickettool\tickettool.py:1318 +#, docstring +msgid "Add a member to an existing Ticket." +msgstr "Dodawanie członka do istniejącego biletu." + +#: tickettool\tickettool.py:1343 +#, docstring +msgid "Remove a member to an existing Ticket." +msgstr "Usunięcie członka z istniejącego biletu." + +#: tickettool\tickettool.py:1357 +#, docstring +msgid "List the existing Tickets for a profile. You can provide a status and/or a ticket owner." +msgstr "Lista istniejących biletów dla profilu. Możesz podać status i/lub właściciela zgłoszenia." + +#: tickettool\tickettool.py:1378 +msgid "No tickets to show." +msgstr "Brak biletów na pokaz." + +#: tickettool\tickettool.py:1419 +msgid "The profile for which this button was configured no longer exists." +msgstr "Profil, dla którego skonfigurowano ten przycisk, już nie istnieje." + +#: tickettool\tickettool.py:1482 tickettool\tickettool.py:1541 +#: tickettool\tickettool.py:1545 tickettool\tickettool.py:1563 +#: tickettool\tickettool.py:1567 tickettool\tickettool.py:1587 +#: tickettool\tickettool.py:1591 tickettool\tickettool.py:1661 +#: tickettool\tickettool.py:1665 +msgid "You are not allowed to execute this command." +msgstr "Nie wolno wykonywać tego polecenia." + +#: tickettool\tickettool.py:1486 tickettool\tickettool.py:1491 +#: tickettool\tickettool.py:1495 +msgid "You have chosen to create a ticket." +msgstr "Zdecydowałeś się na utworzenie biletu." + +#: tickettool\tickettool.py:1517 +msgid "You have chosen to close this ticket. If this is not done, you do not have the necessary permissions to execute this command." +msgstr "Zdecydowałeś się na zamknięcie tego zgłoszenia. Jeśli nie zostanie to zrobione, nie masz niezbędnych uprawnień do wykonania tego polecenia." + +#: tickettool\tickettool.py:1549 +msgid "You have chosen to re-open this ticket." +msgstr "Zdecydowałeś się ponownie otworzyć to zgłoszenie." + +#: tickettool\tickettool.py:1571 +msgid "You have chosen to claim this ticket. If this is not done, you do not have the necessary permissions to execute this command." +msgstr "Zdecydowałeś się odebrać ten bilet. Jeśli nie zostało to zrobione, nie masz uprawnień niezbędnych do wykonania tego polecenia." + +#: tickettool\tickettool.py:1611 +msgid "This message is not in TicketTool config." +msgstr "Tej wiadomości nie ma w konfiguracji TicketTool." + +#: tickettool\tickettool.py:1620 +msgid "The profile for which this dropdown was configured no longer exists." +msgstr "Profil, dla którego skonfigurowano to menu rozwijane, już nie istnieje." + +#: tickettool\tickettool.py:1687 tickettool\tickettool.py:1694 +msgid "You have chosen to create a ticket with the reason `{reason}`." +msgstr "Wybrałeś utworzenie biletu z powodem `{reason}`." + +#: tickettool\tickettool.py:1840 +msgid "No open tickets by this user in this server." +msgstr "Brak otwartych zgłoszeń tego użytkownika na tym serwerze." + +#: tickettool\utils.py:143 +msgid "Emoji Label must be An emoji followed by a label, and optionnaly by a description and a value (for rename ticket channel), separated by either `;`, `,`, `|`, or `-`." +msgstr "Etykieta emoji musi być emoji, po którym następuje etykieta, a opcjonalnie opis i wartość (w przypadku zmiany nazwy kanału biletowego), oddzielone `;`, `,`, `|` lub `-`." + +#: tickettool\utils.py:160 +msgid "Error parsing YAML. Please make sure the format is valid (a YAML validator may help)" +msgstr "Błąd parsowania YAML. Proszę upewnić się, że format jest poprawny (walidator YAML może pomóc)" + +#: tickettool\utils.py:174 +msgid "You can only have 5 text inputs." +msgstr "Możesz mieć tylko 5 wejść tekstowych." + +#: tickettool\utils.py:180 +msgid "The argument `/{count}/{arg}` is required in the YAML." +msgstr "Argument `/{count}/{arg}` jest wymagany w YAML." + +#: tickettool\utils.py:187 +msgid "The argument `/{count}/{arg}` is invalid in the YAML. Check the spelling." +msgstr "Argument `/{count}/{arg}` jest nieprawidłowy w YAML. Sprawdź pisownię." + +#: tickettool\utils.py:193 +msgid "The argument `/modal/{count}/label` must be less than 45 characters long." +msgstr "Argument `/modal/{count}/label` musi mieć mniej niż 45 znaków." + +#: tickettool\utils.py:203 tickettool\utils.py:209 +msgid "The argument `/{count}/style` must be a number between 1 and 2." +msgstr "Argument `/{count}/style` musi być liczbą pomiędzy 1 a 2." + +#: tickettool\utils.py:232 +msgid "The argument `/{count}/required` must be a boolean (True or False)." +msgstr "Argument `/{count}/required` musi być wartością logiczną (True lub False)." + +#: tickettool\utils.py:242 +msgid "The argument `/modal/{count}/default` must be less than 4000 characters long." +msgstr "Argument `/modal/{count}/default` musi mieć mniej niż 4000 znaków." + +#: tickettool\utils.py:250 +msgid "The argument `/modal/{count}/placeholder` must be less than 100 characters long." +msgstr "Argument `/modal/{count}/placeholder` musi mieć mniej niż 100 znaków." + +#: tickettool\utils.py:258 +msgid "The argument `/modal/{count}/min_length` must be between 0 and 4000." +msgstr "Argument `/modal/{count}/min_length` musi zawierać się w przedziale od 0 do 4000." + +#: tickettool\utils.py:266 +msgid "The argument `/modal/{count}/max_length` must be between 0 and 4000." +msgstr "Argument `/modal/{count}/max_length` musi zawierać się w przedziale od 0 do 4000." + diff --git a/tickettool/locales/pt-BR.po b/tickettool/locales/pt-BR.po new file mode 100644 index 0000000..4359609 --- /dev/null +++ b/tickettool/locales/pt-BR.po @@ -0,0 +1,584 @@ +msgid "" +msgstr "" +"Project-Id-Version: aaa3a-cogs\n" +"POT-Creation-Date: 2024-07-20 22:15+0200\n" +"PO-Revision-Date: 2024-07-21 15:13\n" +"Last-Translator: \n" +"Language-Team: Portuguese, Brazilian\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: redgettext 3.4.2\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Crowdin-Project: aaa3a-cogs\n" +"X-Crowdin-Project-ID: 531090\n" +"X-Crowdin-Language: pt-BR\n" +"X-Crowdin-File: /[AAA3A-AAA3A.AAA3A-cogs] main/tickettool/locales/messages.pot\n" +"X-Crowdin-File-ID: 102\n" +"Language: pt_BR\n" + +#: tickettool\settings.py:15 tickettool\settings.py:18 +#: tickettool\tickettool.py:759 tickettool\tickettool.py:762 +msgid "This profile does not exist." +msgstr "Este perfil não existe." + +#: tickettool\settings.py:27 +msgid "I have to be the author of the message. You can use EmbedUtils by AAA3A to send one." +msgstr "Eu preciso ser o autor da mensagem. Você pode usar o EmbedUtils by AAA3A para enviar uma." + +#: tickettool\settings.py:54 +#, docstring +msgid "Send a message with a button to open a ticket or dropdown with possible reasons.\n\n" +" Examples:\n" +" - `[p]settickettool message #general \"🐛|Report a bug|If you find a bug, report it here.|bug\" \"⚠️|Report a user|If you find a malicious user, report it here.|user\"`\n" +" - `[p]settickettool 1234567890-0987654321`\n" +" " +msgstr "Envie uma mensagem com um botão para abrir um ticket ou um menu suspenso com possíveis motivos.\n\n" +" Exemplos:\n" +" - `[p]settickettool message #general \"🐛|Report a bug|If you find a bug, report it here.|bug\" \"⚠️|Report a user|If you find a malicious user, report it here.|user\"`\n" +" - `[p]settickettool 1234567890-0987654321`\n" +" " + +#: tickettool\settings.py:70 +msgid "I don't have sufficient permissions in this channel to view it and to send messages into." +msgstr "Não tenho permissões suficientes neste canal para o visualizar e para enviar mensagens." + +#: tickettool\settings.py:97 tickettool\tickettool.py:339 +msgid "Create ticket" +msgstr "Criar bilhete" + +#: tickettool\settings.py:116 +msgid "A different value must be provided for each dropdown option." +msgstr "Deve ser fornecido um valor diferente para cada opção do menu pendente." + +#: tickettool\settings.py:124 +msgid "An emoji you selected seems invalid. Check that it is an emoji. If you have Nitro, you may have used a custom emoji from another server." +msgstr "Um emoji que seleccionou parece inválido. Verifique se se trata de um emoji. Se tiver Nitro, poderá ter utilizado um emoji personalizado de outro servidor." + +#: tickettool\ticket.py:245 +msgid "Creating the ticket {ticket.id}." +msgstr "Criação do bilhete {ticket.id}." + +#: tickettool\ticket.py:266 +msgid "The dynamic channel name does not contain correct variable names and must be re-configured with `[p]settickettool dynamicchannelname`." +msgstr "O nome do canal dinâmico não contém os nomes correctos das variáveis e deve ser reconfigurado com `[p]settickettool dynamicchannelname`." + +#: tickettool\ticket.py:275 tickettool\ticket.py:528 tickettool\ticket.py:890 +#: tickettool\ticket.py:969 tickettool\tickettool.py:352 +msgid "Close" +msgstr "Fechar" + +#: tickettool\ticket.py:282 tickettool\ticket.py:535 tickettool\ticket.py:615 +#: tickettool\ticket.py:897 tickettool\ticket.py:976 +#: tickettool\tickettool.py:366 +msgid "Claim" +msgstr "Reivindicação" + +#: tickettool\ticket.py:289 tickettool\ticket.py:542 tickettool\ticket.py:622 +#: tickettool\ticket.py:904 tickettool\ticket.py:983 +#: tickettool\tickettool.py:373 +msgid "Delete" +msgstr "Eliminar" + +#: tickettool\ticket.py:303 tickettool\ticket.py:429 +msgid "Ticket Created" +msgstr "Bilhete Criado" + +#: tickettool\ticket.py:304 +msgid "Thank you for creating a ticket on this server!" +msgstr "Obrigado por criar um bilhete neste servidor!" + +#: tickettool\ticket.py:315 +msgid "🎟️ Ticket ID: {ticket.id}\n" +"🕵️ Ticket created by: @{ticket.created_by.display_name} ({ticket.created_by.id})\n" +"☢️ Ticket reason: {short_reason}\n" +msgstr "🎟️ ID do bilhete: {ticket.id}\n" +"🕵️ Ticket criado por: @{ticket.created_by.display_name} ({ticket.created_by.id})\n" +"☢️ Motivo do bilhete: {short_reason}\n" + +#: tickettool\ticket.py:395 +msgid "⚠ At least one user (the ticket owner or a team member) could not be added to the ticket thread. Maybe the user doesn't have access to the parent forum/text channel. If the server uses private threads in a text channel, the bot does not have the `manage_messages` permission in this channel." +msgstr "Pelo menos um usuário (o proprietário do tíquete ou um membro da equipe) não pôde ser adicionado ao tópico do tíquete. Talvez o usuário não tenha acesso ao fórum/canal de texto principal. Se o servidor usa tópicos privados em um canal de texto, o bot não tem a permissão `manage_messages` nesse canal." + +#: tickettool\ticket.py:430 +msgid "The ticket was created by {ticket.created_by}." +msgstr "O bilhete foi criado por {ticket.created_by}." + +#: tickettool\ticket.py:436 +msgid "Report on the creation of the ticket {ticket.id}." +msgstr "Relatório sobre a criação do bilhete {ticket.id}." + +#: tickettool\ticket.py:476 +msgid "Opening the ticket {ticket.id}." +msgstr "Abertura do bilhete {ticket.id}." + +#: tickettool\ticket.py:505 tickettool\ticket.py:513 +msgid "Ticket Opened" +msgstr "Bilhete aberto" + +#: tickettool\ticket.py:514 +msgid "The ticket was opened by {ticket.opened_by}." +msgstr "O bilhete foi aberto por {ticket.opened_by}." + +#: tickettool\ticket.py:520 tickettool\ticket.py:600 +msgid "Report on the close of the ticket {ticket.id}." +msgstr "Relatório sobre o encerramento do bilhete {ticket.id}." + +#: tickettool\ticket.py:608 tickettool\tickettool.py:359 +msgid "Re-open" +msgstr "Reabrir" + +#: tickettool\ticket.py:675 tickettool\ticket.py:712 +#: tickettool\tickettool.py:1100 tickettool\tickettool.py:1142 +msgid "Cannot execute action on a text channel." +msgstr "Não é possível executar acções num canal de texto." + +#: tickettool\ticket.py:701 +msgid "Report on the lock of the ticket {ticket.id}." +msgstr "Relatório sobre a fechadura do bilhete {ticket.id}." + +#: tickettool\ticket.py:738 +msgid "Report on the unlock of the ticket {ticket.id}." +msgstr "Relatório sobre o desbloqueio do bilhete {ticket.id}." + +#: tickettool\ticket.py:755 +msgid "Renaming the ticket {ticket.id}. (`{ticket.channel.name}` to `{new_name}`)" +msgstr "Renomear o bilhete {ticket.id}. (`{ticket.channel.name}` para `{new_name}`)" + +#: tickettool\ticket.py:765 +msgid "Ticket Renamed." +msgstr "Bilhete cujo nome foi alterado." + +#: tickettool\ticket.py:783 +msgid "Ticket Deleted" +msgstr "Bilhete Eliminado" + +#: tickettool\ticket.py:784 +msgid "The ticket was deleted by {ticket.deleted_by}." +msgstr "O bilhete foi eliminado por {ticket.deleted_by}." + +#: tickettool\ticket.py:807 +msgid "Report on the deletion of the ticket {ticket.id}." +msgstr "Relatório sobre a eliminação do bilhete {ticket.id}." + +#: tickettool\ticket.py:824 +msgid "Deleting the ticket {ticket.id}." +msgstr "Eliminação do bilhete {ticket.id}." + +#: tickettool\ticket.py:845 +msgid "A ticket cannot be claimed if it is closed." +msgstr "Um bilhete não pode ser reclamado se estiver fechado." + +#: tickettool\ticket.py:849 +msgid "A bot cannot claim a ticket." +msgstr "Um robô não pode reclamar um bilhete." + +#: tickettool\ticket.py:863 +msgid "Claiming the ticket {ticket.id}." +msgstr "Reivindicação do bilhete {ticket.id}." + +#: tickettool\ticket.py:918 +msgid "Ticket claimed." +msgstr "Pedido de bilhetes." + +#: tickettool\ticket.py:932 +msgid "A ticket cannot be unclaimed if it is closed." +msgstr "Um bilhete não pode ser retirado se estiver fechado." + +#: tickettool\ticket.py:948 +msgid "Unclaiming the ticket {ticket.id}." +msgstr "Desclassificação do bilhete {ticket.id}." + +#: tickettool\ticket.py:997 +msgid "Ticket unclaimed." +msgstr "Bilhete não reclamado." + +#: tickettool\ticket.py:1011 +msgid "Cannot execute action in a thread channel." +msgstr "Não é possível executar uma ação num canal de discussão." + +#: tickettool\ticket.py:1018 +msgid "Changing owner of the ticket {ticket.id}." +msgstr "Mudança de proprietário do bilhete {ticket.id}." + +#: tickettool\ticket.py:1022 +msgid "You cannot transfer ownership of a ticket to a bot." +msgstr "Não se pode transferir a propriedade de um bilhete para um bot." + +#: tickettool\ticket.py:1051 +msgid "Owner Modified." +msgstr "Proprietário Modificado." + +#: tickettool\ticket.py:1070 +msgid "Adding a member to the ticket {ticket.id}." +msgstr "Acrescentar um membro ao bilhete {ticket.id}." + +#: tickettool\ticket.py:1077 tickettool\ticket.py:1114 +msgid "You cannot add a bot to a ticket. ({member})" +msgstr "Não se pode acrescentar um bot a um bilhete. ({member})" + +#: tickettool\ticket.py:1081 tickettool\ticket.py:1118 +msgid "This member is already the owner of this ticket. ({member})" +msgstr "Este membro já é o proprietário deste bilhete. ({member})" + +#: tickettool\ticket.py:1087 tickettool\ticket.py:1124 +msgid "This member is an administrator for the tickets system. They will always have access to the ticket anyway. ({member})" +msgstr "Esse membro é um administrador do sistema de tíquetes. De qualquer forma, ele sempre terá acesso ao tíquete. ({member})" + +#: tickettool\ticket.py:1093 tickettool\ticket.py:1130 +msgid "This member already has access to this ticket. ({member})" +msgstr "Este membro já tem acesso a este bilhete. ({member})" + +#: tickettool\ticket.py:1144 +msgid "⚠ At least one user (the ticket owner or a team member) could not be added to the ticket thread. Maybe the user the user doesn't have access to the parent forum/text channel. If the server uses private threads in a text channel, the bot does not have the `manage_messages` permission in this channel." +msgstr "Pelo menos um utilizador (o proprietário do pedido ou um membro da equipa) não pôde ser adicionado ao tópico do pedido. Talvez o utilizador não tenha acesso ao fórum/canal de texto principal. Se o servidor usa tópicos privados em um canal de texto, o bot não tem a permissão `manage_messages` neste canal." + +#: tickettool\ticket.py:1168 +msgid "Removing a member to the ticket {ticket.id}." +msgstr "Retirar um membro para o bilhete {ticket.id}." + +#: tickettool\ticket.py:1174 tickettool\ticket.py:1204 +msgid "You cannot remove a bot to a ticket ({member})." +msgstr "Não se pode remover um bot para um bilhete ({member})." + +#: tickettool\ticket.py:1180 tickettool\ticket.py:1210 +msgid "You cannot remove the owner of this ticket. ({member})" +msgstr "Não é possível remover o proprietário deste bilhete. ({member})" + +#: tickettool\ticket.py:1186 tickettool\ticket.py:1216 +msgid "This member is an administrator for the tickets system. They will always have access to the ticket. ({member})" +msgstr "Esse membro é um administrador do sistema de tíquetes. Ele sempre terá acesso ao tíquete. ({member})" + +#: tickettool\ticket.py:1192 tickettool\ticket.py:1222 +msgid "This member is not in the list of those authorised to access the ticket. ({member})" +msgstr "Este membro não consta da lista de pessoas autorizadas a aceder ao bilhete. ({member})" + +#: tickettool\tickettool.py:32 +#, docstring +msgid "A cog to manage a tickets system!" +msgstr "Uma engrenagem para gerir um sistema de bilhetes!" + +#: tickettool\tickettool.py:74 +msgid "To get help on this server or to make an order for example, you can create a ticket.\n" +"Just use the command `{prefix}ticket create` or click on the button below.\n" +"You can then use the `{prefix}ticket` subcommands to manage your ticket." +msgstr "Para obter ajuda neste servidor ou para fazer uma encomenda, por exemplo, pode criar um bilhete.\n" +"Basta utilizar o comando `{prefix}ticket create` ou clicar no botão abaixo.\n" +"Pode então utilizar os subcomandos `{prefix}ticket` para gerir o seu bilhete." + +#: tickettool\tickettool.py:403 +msgid "Choose the reason for open a ticket." +msgstr "Escolha a razão para abrir um bilhete." + +#: tickettool\tickettool.py:521 +msgid "Action taken for the ticket system." +msgstr "Medidas tomadas para o sistema de bilhetes." + +#: tickettool\tickettool.py:555 +msgid "Ticket ID:" +msgstr "Identificação do bilhete:" + +#: tickettool\tickettool.py:558 +msgid "Owned by:" +msgstr "Propriedade de:" + +#: tickettool\tickettool.py:566 +msgid "Channel:" +msgstr "Canal:" + +#: tickettool\tickettool.py:573 +msgid "Closed by:" +msgstr "Fechado por:" + +#: tickettool\tickettool.py:581 +msgid "Deleted by:" +msgstr "Eliminado por:" + +#: tickettool\tickettool.py:589 +msgid "Closed at:" +msgstr "Fechado em:" + +#: tickettool\tickettool.py:596 tickettool\tickettool.py:622 +msgid "Reason:" +msgstr "Motivo:" + +#: tickettool\tickettool.py:607 +msgid "Ticket [{ticket.profile}] {ticket.id} - Action taken" +msgstr "Bilhete [{ticket.profile}] {ticket.id} - Acção tomada" + +#: tickettool\tickettool.py:687 +msgid "You're not in a ticket." +msgstr "Não está num bilhete." + +#: tickettool\tickettool.py:691 +msgid "This ticket isn't {status}ed." +msgstr "Este bilhete não é {status}ed." + +#: tickettool\tickettool.py:700 +msgid "This ticket is {status}." +msgstr "Este bilhete é {status}." + +#: tickettool\tickettool.py:709 +msgid "You're not allowed to lock this ticket." +msgstr "Não é permitido bloquear este bilhete." + +#: tickettool\tickettool.py:752 +msgid "You're not allowed to view this ticket." +msgstr "Não tem permissão para visualizar este bilhete." + +#: tickettool\tickettool.py:786 +msgid "Please provide a profile." +msgstr "Forneça um perfil." + +#: tickettool\tickettool.py:789 +msgid "No profile has been created on this server." +msgstr "Nenhum perfil foi criado nesse servidor." + +#: tickettool\tickettool.py:797 +msgid "The ticket system is not enabled on this server. Please ask an administrator of this server to use the `{ctx.prefix}settickettool` subcommands to configure it." +msgstr "O sistema de bilhetes não está ativado neste servidor. Por favor, peça a um administrador deste servidor para usar os subcomandos `{ctx.prefix}settickettool` para configurá-lo." + +#: tickettool\tickettool.py:803 +msgid "The category `open` or the category `close` have not been configured. Please ask an administrator of this server to use the `{ctx.prefix}settickettool` subcommands to configure it." +msgstr "A categoria `open` ou a categoria `close` não foram configuradas. Por favor, peça a um administrador deste servidor que utilize os subcomandos `{ctx.prefix}settickettool` para as configurar." + +#: tickettool\tickettool.py:810 +msgid "Sorry. You have already reached the limit of {limit} open tickets." +msgstr "Desculpe. Já atingiu o limite de {limit} bilhetes abertos." + +#: tickettool\tickettool.py:821 +msgid "The bot does not have `manage_channels` permission on the `open` and `close` categories to allow the ticket system to function properly. Please notify an administrator of this server." +msgstr "O bot não tem permissão de \"gerir_canais\" nas categorias \"abrir\" e \"fechar\" para permitir que o sistema de bilhetes funcione correctamente. Por favor, notifique um administrador deste servidor." + +#: tickettool\tickettool.py:830 +msgid "The bot does not have `manage_channel` permission in the forum channel to allow the ticket system to function properly. Please notify an administrator of this server." +msgstr "O bot não tem `gestão_canal` permissão no canal do fórum para permitir que o sistema de bilhetes funcione correctamente. Por favor, notifique um administrador deste servidor." + +#: tickettool\tickettool.py:875 +msgid "Please provide the required informations by clicking on the button below." +msgstr "Forneça as informações necessárias clicando no botão abaixo." + +#: tickettool\tickettool.py:926 +#, docstring +msgid "Create a Ticket.\n\n" +" If only one profile has been created on this server, you don't need to specify its name.\n" +" " +msgstr "Criar um tíquete.\n\n" +" Se apenas um perfil tiver sido criado nesse servidor, você não precisará especificar o nome dele.\n" +" " + +#: tickettool\tickettool.py:942 +#, docstring +msgid "Create a Ticket for a member.\n\n" +" If only one profile has been created on this server, you don't need to specify its name.\n" +" " +msgstr "Criar um tíquete para um membro.\n\n" +" Se apenas um perfil tiver sido criado nesse servidor, você não precisará especificar o nome dele.\n" +" " + +#: tickettool\tickettool.py:947 +msgid "You cannot create a ticket for a bot." +msgstr "Não é possível criar um tíquete para um bot." + +#: tickettool\tickettool.py:950 +msgid "You cannot create a ticket for a member with a higher or equal role." +msgstr "Não é possível criar um tíquete para um membro com uma função superior ou igual." + +#: tickettool\tickettool.py:970 +#, docstring +msgid "Export all the messages of an existing Ticket in html format.\n" +" Please note: all attachments and user avatars are saved with the Discord link in this file.\n" +" " +msgstr "Exportar todas as mensagens de um tíquete existente em formato html.\n" +" Observação: todos os anexos e avatares de usuários são salvos com o link do Discord nesse arquivo.\n" +" " + +#: tickettool\tickettool.py:987 +msgid "Here is the html file of the transcript of all the messages in this ticket.\n" +"Please note: all attachments and user avatars are saved with the Discord link in this file." +msgstr "Aqui está o ficheiro html da transcrição de todas as mensagens contidas neste bilhete.\n" +"Atenção: todos os anexos e avatares de utilizadores são guardados com a ligação Discord neste ficheiro." + +#: tickettool\tickettool.py:1019 +#, docstring +msgid "Open an existing Ticket." +msgstr "Abrir um tíquete existente." + +#: tickettool\tickettool.py:1024 +msgid "The ticket system is not enabled on this server." +msgstr "O sistema de bilhetes não está activado neste servidor." + +#: tickettool\tickettool.py:1050 +#, docstring +msgid "Close an existing Ticket." +msgstr "Fechar um tíquete existente." + +#: tickettool\tickettool.py:1061 +msgid "Do you really want to close the ticket {ticket.id}?" +msgstr "Quer mesmo fechar o bilhete {ticket.id}?" + +#: tickettool\tickettool.py:1097 +#, docstring +msgid "Lock an existing Ticket." +msgstr "Bloquear um tíquete existente." + +#: tickettool\tickettool.py:1104 +msgid "Do you really want to lock the ticket {ticket.id}?" +msgstr "Quer realmente trancar o bilhete {ticket.id}?" + +#: tickettool\tickettool.py:1139 +#, docstring +msgid "Unlock an existing locked Ticket." +msgstr "Desbloquear um tíquete bloqueado existente." + +#: tickettool\tickettool.py:1167 +#, docstring +msgid "Rename an existing Ticket." +msgstr "Renomear um tíquete existente." + +#: tickettool\tickettool.py:1193 +#, docstring +msgid "Delete an existing Ticket.\n\n" +" If a logs channel is defined, an html file containing all the messages of this ticket will be generated.\n" +" (Attachments are not supported, as they are saved with their Discord link)\n" +" " +msgstr "Excluir um tíquete existente.\n\n" +" Se for definido um canal de logs, será gerado um arquivo html com todas as mensagens desse tíquete.\n" +" (Não há suporte para anexos, pois eles são salvos com o respectivo link do Discord)\n" +" " + +#: tickettool\tickettool.py:1202 +msgid "Do you really want to delete all the messages of the ticket {ticket.id}?" +msgstr "Quer mesmo apagar todas as mensagens do bilhete {ticket.id}?" + +#: tickettool\tickettool.py:1206 +msgid "If a logs channel is defined, an html file containing all the messages of this ticket will be generated. (Attachments are not supported, as they are saved with their Discord link.)" +msgstr "Se for definido um canal de registros, será gerado um arquivo html com todas as mensagens desse tíquete. (Não há suporte para anexos, pois eles são salvos com seu link do Discord.)" + +#: tickettool\tickettool.py:1242 +#, docstring +msgid "Claim an existing Ticket." +msgstr "Reivindicar um tíquete existente." + +#: tickettool\tickettool.py:1266 +#, docstring +msgid "Unclaim an existing Ticket." +msgstr "Cancelar a reivindicação de um tíquete existente." + +#: tickettool\tickettool.py:1292 +#, docstring +msgid "Change the owner of an existing Ticket." +msgstr "Alterar o proprietário de um tíquete existente." + +#: tickettool\tickettool.py:1318 +#, docstring +msgid "Add a member to an existing Ticket." +msgstr "Adicionar um membro a um tíquete existente." + +#: tickettool\tickettool.py:1343 +#, docstring +msgid "Remove a member to an existing Ticket." +msgstr "Remover um membro de um tíquete existente." + +#: tickettool\tickettool.py:1357 +#, docstring +msgid "List the existing Tickets for a profile. You can provide a status and/or a ticket owner." +msgstr "Lista os tíquetes existentes para um perfil. Você pode fornecer um status e/ou um proprietário do tíquete." + +#: tickettool\tickettool.py:1378 +msgid "No tickets to show." +msgstr "Não há bilhetes para o espectáculo." + +#: tickettool\tickettool.py:1419 +msgid "The profile for which this button was configured no longer exists." +msgstr "O perfil para o qual este botão foi configurado já não existe." + +#: tickettool\tickettool.py:1482 tickettool\tickettool.py:1541 +#: tickettool\tickettool.py:1545 tickettool\tickettool.py:1563 +#: tickettool\tickettool.py:1567 tickettool\tickettool.py:1587 +#: tickettool\tickettool.py:1591 tickettool\tickettool.py:1661 +#: tickettool\tickettool.py:1665 +msgid "You are not allowed to execute this command." +msgstr "Não está autorizado a executar este comando." + +#: tickettool\tickettool.py:1486 tickettool\tickettool.py:1491 +#: tickettool\tickettool.py:1495 +msgid "You have chosen to create a ticket." +msgstr "Optou por criar um bilhete." + +#: tickettool\tickettool.py:1517 +msgid "You have chosen to close this ticket. If this is not done, you do not have the necessary permissions to execute this command." +msgstr "Optou por fechar este bilhete. Se isto não for feito, não tem as permissões necessárias para executar este comando." + +#: tickettool\tickettool.py:1549 +msgid "You have chosen to re-open this ticket." +msgstr "Optou por reabrir este bilhete." + +#: tickettool\tickettool.py:1571 +msgid "You have chosen to claim this ticket. If this is not done, you do not have the necessary permissions to execute this command." +msgstr "Optou por reclamar este bilhete. Se isto não for feito, não tem as permissões necessárias para executar este comando." + +#: tickettool\tickettool.py:1611 +msgid "This message is not in TicketTool config." +msgstr "Esta mensagem não se encontra na configuração do TicketTool." + +#: tickettool\tickettool.py:1620 +msgid "The profile for which this dropdown was configured no longer exists." +msgstr "O perfil para o qual este menu suspenso foi configurado já não existe." + +#: tickettool\tickettool.py:1687 tickettool\tickettool.py:1694 +msgid "You have chosen to create a ticket with the reason `{reason}`." +msgstr "Optou por criar um bilhete com o motivo `{reason}`." + +#: tickettool\tickettool.py:1840 +msgid "No open tickets by this user in this server." +msgstr "Não existem bilhetes abertos por este utilizador neste servidor." + +#: tickettool\utils.py:143 +msgid "Emoji Label must be An emoji followed by a label, and optionnaly by a description and a value (for rename ticket channel), separated by either `;`, `,`, `|`, or `-`." +msgstr "A etiqueta do emoji deve ser um emoji seguido de uma etiqueta e, opcionalmente, de uma descrição e de um valor (para renomear o canal do bilhete), separados por `;`, `,`, `|` ou `-`." + +#: tickettool\utils.py:160 +msgid "Error parsing YAML. Please make sure the format is valid (a YAML validator may help)" +msgstr "Análise de erros de YAML. Por favor, certifique-se de que o formato é válido (um validador YAML pode ajudar)" + +#: tickettool\utils.py:174 +msgid "You can only have 5 text inputs." +msgstr "Você só pode ter 5 entradas de texto." + +#: tickettool\utils.py:180 +msgid "The argument `/{count}/{arg}` is required in the YAML." +msgstr "O argumento `/{count}/{arg}` é obrigatório no YAML." + +#: tickettool\utils.py:187 +msgid "The argument `/{count}/{arg}` is invalid in the YAML. Check the spelling." +msgstr "O argumento `/{count}/{arg}` é inválido no YAML. Verifique a ortografia." + +#: tickettool\utils.py:193 +msgid "The argument `/modal/{count}/label` must be less than 45 characters long." +msgstr "O argumento `/modal/{count}/label` deve ter menos de 45 caracteres." + +#: tickettool\utils.py:203 tickettool\utils.py:209 +msgid "The argument `/{count}/style` must be a number between 1 and 2." +msgstr "O argumento `/{count}/style` deve ser um número entre 1 e 2." + +#: tickettool\utils.py:232 +msgid "The argument `/{count}/required` must be a boolean (True or False)." +msgstr "O argumento `/{count}/required` deve ser um booleano (True ou False)." + +#: tickettool\utils.py:242 +msgid "The argument `/modal/{count}/default` must be less than 4000 characters long." +msgstr "O argumento `/modal/{count}/default` deve ter menos de 4.000 caracteres." + +#: tickettool\utils.py:250 +msgid "The argument `/modal/{count}/placeholder` must be less than 100 characters long." +msgstr "O argumento `/modal/{count}/placeholder` deve ter menos de 100 caracteres." + +#: tickettool\utils.py:258 +msgid "The argument `/modal/{count}/min_length` must be between 0 and 4000." +msgstr "O argumento `/modal/{count}/min_length` deve estar entre 0 e 4000." + +#: tickettool\utils.py:266 +msgid "The argument `/modal/{count}/max_length` must be between 0 and 4000." +msgstr "O argumento `/modal/{count}/max_length` deve estar entre 0 e 4000." + diff --git a/tickettool/locales/pt-PT.po b/tickettool/locales/pt-PT.po new file mode 100644 index 0000000..13c2724 --- /dev/null +++ b/tickettool/locales/pt-PT.po @@ -0,0 +1,584 @@ +msgid "" +msgstr "" +"Project-Id-Version: aaa3a-cogs\n" +"POT-Creation-Date: 2024-07-20 22:15+0200\n" +"PO-Revision-Date: 2024-07-21 15:13\n" +"Last-Translator: \n" +"Language-Team: Portuguese\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: redgettext 3.4.2\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Crowdin-Project: aaa3a-cogs\n" +"X-Crowdin-Project-ID: 531090\n" +"X-Crowdin-Language: pt-PT\n" +"X-Crowdin-File: /[AAA3A-AAA3A.AAA3A-cogs] main/tickettool/locales/messages.pot\n" +"X-Crowdin-File-ID: 102\n" +"Language: pt_PT\n" + +#: tickettool\settings.py:15 tickettool\settings.py:18 +#: tickettool\tickettool.py:759 tickettool\tickettool.py:762 +msgid "This profile does not exist." +msgstr "Este perfil não existe." + +#: tickettool\settings.py:27 +msgid "I have to be the author of the message. You can use EmbedUtils by AAA3A to send one." +msgstr "Tenho de ser o autor da mensagem. Pode utilizar EmbedUtils by AAA3A para enviar uma mensagem." + +#: tickettool\settings.py:54 +#, docstring +msgid "Send a message with a button to open a ticket or dropdown with possible reasons.\n\n" +" Examples:\n" +" - `[p]settickettool message #general \"🐛|Report a bug|If you find a bug, report it here.|bug\" \"⚠️|Report a user|If you find a malicious user, report it here.|user\"`\n" +" - `[p]settickettool 1234567890-0987654321`\n" +" " +msgstr "Enviar uma mensagem com um botão para abrir um ticket ou um menu suspenso com possíveis motivos.\n\n" +" Exemplos:\n" +" - `[p]settickettool message #general \"🐛|Report a bug|If you find a bug, report it here.|bug\" \"⚠️|Report a user|If you find a malicious user, report it here.|user\"`\n" +" - `[p]settickettool 1234567890-0987654321`\n" +" " + +#: tickettool\settings.py:70 +msgid "I don't have sufficient permissions in this channel to view it and to send messages into." +msgstr "Não tenho permissões suficientes neste canal para o visualizar e para enviar mensagens." + +#: tickettool\settings.py:97 tickettool\tickettool.py:339 +msgid "Create ticket" +msgstr "Criar bilhete" + +#: tickettool\settings.py:116 +msgid "A different value must be provided for each dropdown option." +msgstr "Deve ser fornecido um valor diferente para cada opção do menu pendente." + +#: tickettool\settings.py:124 +msgid "An emoji you selected seems invalid. Check that it is an emoji. If you have Nitro, you may have used a custom emoji from another server." +msgstr "Um emoji que seleccionou parece inválido. Verifique se se trata de um emoji. Se tiver Nitro, poderá ter usado um emoji personalizado de outro servidor." + +#: tickettool\ticket.py:245 +msgid "Creating the ticket {ticket.id}." +msgstr "Criação do bilhete {ticket.id}." + +#: tickettool\ticket.py:266 +msgid "The dynamic channel name does not contain correct variable names and must be re-configured with `[p]settickettool dynamicchannelname`." +msgstr "O nome do canal dinâmico não contém os nomes correctos das variáveis e deve ser reconfigurado com `[p]settickettool dynamicchannelname`." + +#: tickettool\ticket.py:275 tickettool\ticket.py:528 tickettool\ticket.py:890 +#: tickettool\ticket.py:969 tickettool\tickettool.py:352 +msgid "Close" +msgstr "Fechar" + +#: tickettool\ticket.py:282 tickettool\ticket.py:535 tickettool\ticket.py:615 +#: tickettool\ticket.py:897 tickettool\ticket.py:976 +#: tickettool\tickettool.py:366 +msgid "Claim" +msgstr "Reivindicação" + +#: tickettool\ticket.py:289 tickettool\ticket.py:542 tickettool\ticket.py:622 +#: tickettool\ticket.py:904 tickettool\ticket.py:983 +#: tickettool\tickettool.py:373 +msgid "Delete" +msgstr "Eliminar" + +#: tickettool\ticket.py:303 tickettool\ticket.py:429 +msgid "Ticket Created" +msgstr "Bilhete Criado" + +#: tickettool\ticket.py:304 +msgid "Thank you for creating a ticket on this server!" +msgstr "Obrigado por criar um bilhete neste servidor!" + +#: tickettool\ticket.py:315 +msgid "🎟️ Ticket ID: {ticket.id}\n" +"🕵️ Ticket created by: @{ticket.created_by.display_name} ({ticket.created_by.id})\n" +"☢️ Ticket reason: {short_reason}\n" +msgstr "🎟️ ID do bilhete: {ticket.id}\n" +"🕵️ Ticket criado por: @{ticket.created_by.display_name} ({ticket.created_by.id})\n" +"☢️ Motivo do bilhete: {short_reason}\n" + +#: tickettool\ticket.py:395 +msgid "⚠ At least one user (the ticket owner or a team member) could not be added to the ticket thread. Maybe the user doesn't have access to the parent forum/text channel. If the server uses private threads in a text channel, the bot does not have the `manage_messages` permission in this channel." +msgstr "Pelo menos um utilizador (o proprietário do pedido ou um membro da equipa) não pôde ser adicionado ao tópico do pedido. Talvez o utilizador não tenha acesso ao fórum/canal de texto principal. Se o servidor usa tópicos privados em um canal de texto, o bot não tem a permissão `manage_messages` neste canal." + +#: tickettool\ticket.py:430 +msgid "The ticket was created by {ticket.created_by}." +msgstr "O bilhete foi criado por {ticket.created_by}." + +#: tickettool\ticket.py:436 +msgid "Report on the creation of the ticket {ticket.id}." +msgstr "Relatório sobre a criação do bilhete {ticket.id}." + +#: tickettool\ticket.py:476 +msgid "Opening the ticket {ticket.id}." +msgstr "Abertura do bilhete {ticket.id}." + +#: tickettool\ticket.py:505 tickettool\ticket.py:513 +msgid "Ticket Opened" +msgstr "Bilhete aberto" + +#: tickettool\ticket.py:514 +msgid "The ticket was opened by {ticket.opened_by}." +msgstr "O bilhete foi aberto por {ticket.opened_by}." + +#: tickettool\ticket.py:520 tickettool\ticket.py:600 +msgid "Report on the close of the ticket {ticket.id}." +msgstr "Relatório sobre o encerramento do bilhete {ticket.id}." + +#: tickettool\ticket.py:608 tickettool\tickettool.py:359 +msgid "Re-open" +msgstr "Reabrir" + +#: tickettool\ticket.py:675 tickettool\ticket.py:712 +#: tickettool\tickettool.py:1100 tickettool\tickettool.py:1142 +msgid "Cannot execute action on a text channel." +msgstr "Não é possível executar acções num canal de texto." + +#: tickettool\ticket.py:701 +msgid "Report on the lock of the ticket {ticket.id}." +msgstr "Relatório sobre a fechadura do bilhete {ticket.id}." + +#: tickettool\ticket.py:738 +msgid "Report on the unlock of the ticket {ticket.id}." +msgstr "Relatório sobre o desbloqueio do bilhete {ticket.id}." + +#: tickettool\ticket.py:755 +msgid "Renaming the ticket {ticket.id}. (`{ticket.channel.name}` to `{new_name}`)" +msgstr "Renomear o bilhete {ticket.id}. (`{ticket.channel.name}` para `{new_name}`)" + +#: tickettool\ticket.py:765 +msgid "Ticket Renamed." +msgstr "Bilhete cujo nome foi alterado." + +#: tickettool\ticket.py:783 +msgid "Ticket Deleted" +msgstr "Bilhete Eliminado" + +#: tickettool\ticket.py:784 +msgid "The ticket was deleted by {ticket.deleted_by}." +msgstr "O bilhete foi eliminado por {ticket.deleted_by}." + +#: tickettool\ticket.py:807 +msgid "Report on the deletion of the ticket {ticket.id}." +msgstr "Relatório sobre a eliminação do bilhete {ticket.id}." + +#: tickettool\ticket.py:824 +msgid "Deleting the ticket {ticket.id}." +msgstr "Eliminação do bilhete {ticket.id}." + +#: tickettool\ticket.py:845 +msgid "A ticket cannot be claimed if it is closed." +msgstr "Um bilhete não pode ser reclamado se estiver fechado." + +#: tickettool\ticket.py:849 +msgid "A bot cannot claim a ticket." +msgstr "Um robô não pode reclamar um bilhete." + +#: tickettool\ticket.py:863 +msgid "Claiming the ticket {ticket.id}." +msgstr "Reivindicação do bilhete {ticket.id}." + +#: tickettool\ticket.py:918 +msgid "Ticket claimed." +msgstr "Pedido de bilhetes." + +#: tickettool\ticket.py:932 +msgid "A ticket cannot be unclaimed if it is closed." +msgstr "Um bilhete não pode ser retirado se estiver fechado." + +#: tickettool\ticket.py:948 +msgid "Unclaiming the ticket {ticket.id}." +msgstr "Desclassificação do bilhete {ticket.id}." + +#: tickettool\ticket.py:997 +msgid "Ticket unclaimed." +msgstr "Bilhete não reclamado." + +#: tickettool\ticket.py:1011 +msgid "Cannot execute action in a thread channel." +msgstr "Não é possível executar uma ação num canal de discussão." + +#: tickettool\ticket.py:1018 +msgid "Changing owner of the ticket {ticket.id}." +msgstr "Mudança de proprietário do bilhete {ticket.id}." + +#: tickettool\ticket.py:1022 +msgid "You cannot transfer ownership of a ticket to a bot." +msgstr "Não se pode transferir a propriedade de um bilhete para um bot." + +#: tickettool\ticket.py:1051 +msgid "Owner Modified." +msgstr "Proprietário Modificado." + +#: tickettool\ticket.py:1070 +msgid "Adding a member to the ticket {ticket.id}." +msgstr "Acrescentar um membro ao bilhete {ticket.id}." + +#: tickettool\ticket.py:1077 tickettool\ticket.py:1114 +msgid "You cannot add a bot to a ticket. ({member})" +msgstr "Não se pode acrescentar um bot a um bilhete. ({member})" + +#: tickettool\ticket.py:1081 tickettool\ticket.py:1118 +msgid "This member is already the owner of this ticket. ({member})" +msgstr "Este membro já é o proprietário deste bilhete. ({member})" + +#: tickettool\ticket.py:1087 tickettool\ticket.py:1124 +msgid "This member is an administrator for the tickets system. They will always have access to the ticket anyway. ({member})" +msgstr "Este membro é um administrador do sistema de bilhetes. De qualquer forma, ele terá sempre acesso ao bilhete. ({member})" + +#: tickettool\ticket.py:1093 tickettool\ticket.py:1130 +msgid "This member already has access to this ticket. ({member})" +msgstr "Este membro já tem acesso a este bilhete. ({member})" + +#: tickettool\ticket.py:1144 +msgid "⚠ At least one user (the ticket owner or a team member) could not be added to the ticket thread. Maybe the user the user doesn't have access to the parent forum/text channel. If the server uses private threads in a text channel, the bot does not have the `manage_messages` permission in this channel." +msgstr "Pelo menos um utilizador (o proprietário do pedido ou um membro da equipa) não pôde ser adicionado ao tópico do pedido. Talvez o utilizador não tenha acesso ao fórum/canal de texto principal. Se o servidor usa tópicos privados em um canal de texto, o bot não tem a permissão `manage_messages` neste canal." + +#: tickettool\ticket.py:1168 +msgid "Removing a member to the ticket {ticket.id}." +msgstr "Retirar um membro para o bilhete {ticket.id}." + +#: tickettool\ticket.py:1174 tickettool\ticket.py:1204 +msgid "You cannot remove a bot to a ticket ({member})." +msgstr "Não se pode remover um bot para um bilhete ({member})." + +#: tickettool\ticket.py:1180 tickettool\ticket.py:1210 +msgid "You cannot remove the owner of this ticket. ({member})" +msgstr "Não é possível remover o proprietário deste bilhete. ({member})" + +#: tickettool\ticket.py:1186 tickettool\ticket.py:1216 +msgid "This member is an administrator for the tickets system. They will always have access to the ticket. ({member})" +msgstr "Este membro é um administrador do sistema de bilhetes. Ele terá sempre acesso ao bilhete. ({member})" + +#: tickettool\ticket.py:1192 tickettool\ticket.py:1222 +msgid "This member is not in the list of those authorised to access the ticket. ({member})" +msgstr "Este membro não consta da lista de pessoas autorizadas a aceder ao bilhete. ({member})" + +#: tickettool\tickettool.py:32 +#, docstring +msgid "A cog to manage a tickets system!" +msgstr "Uma engrenagem para gerir um sistema de bilhetes!" + +#: tickettool\tickettool.py:74 +msgid "To get help on this server or to make an order for example, you can create a ticket.\n" +"Just use the command `{prefix}ticket create` or click on the button below.\n" +"You can then use the `{prefix}ticket` subcommands to manage your ticket." +msgstr "Para obter ajuda neste servidor ou para fazer uma encomenda, por exemplo, pode criar um bilhete.\n" +"Basta utilizar o comando `{prefix}ticket create` ou clicar no botão abaixo.\n" +"Pode então utilizar os subcomandos `{prefix}ticket` para gerir o seu bilhete." + +#: tickettool\tickettool.py:403 +msgid "Choose the reason for open a ticket." +msgstr "Escolha a razão para abrir um bilhete." + +#: tickettool\tickettool.py:521 +msgid "Action taken for the ticket system." +msgstr "Medidas tomadas para o sistema de bilhetes." + +#: tickettool\tickettool.py:555 +msgid "Ticket ID:" +msgstr "Identificação do bilhete:" + +#: tickettool\tickettool.py:558 +msgid "Owned by:" +msgstr "Propriedade de:" + +#: tickettool\tickettool.py:566 +msgid "Channel:" +msgstr "Canal:" + +#: tickettool\tickettool.py:573 +msgid "Closed by:" +msgstr "Fechado por:" + +#: tickettool\tickettool.py:581 +msgid "Deleted by:" +msgstr "Eliminado por:" + +#: tickettool\tickettool.py:589 +msgid "Closed at:" +msgstr "Fechado em:" + +#: tickettool\tickettool.py:596 tickettool\tickettool.py:622 +msgid "Reason:" +msgstr "Motivo:" + +#: tickettool\tickettool.py:607 +msgid "Ticket [{ticket.profile}] {ticket.id} - Action taken" +msgstr "Bilhete [{ticket.profile}] {ticket.id} - Acção tomada" + +#: tickettool\tickettool.py:687 +msgid "You're not in a ticket." +msgstr "Não está num bilhete." + +#: tickettool\tickettool.py:691 +msgid "This ticket isn't {status}ed." +msgstr "Este bilhete não é {status}ed." + +#: tickettool\tickettool.py:700 +msgid "This ticket is {status}." +msgstr "Este bilhete é {status}." + +#: tickettool\tickettool.py:709 +msgid "You're not allowed to lock this ticket." +msgstr "Não é permitido bloquear este bilhete." + +#: tickettool\tickettool.py:752 +msgid "You're not allowed to view this ticket." +msgstr "Não tem permissão para visualizar este bilhete." + +#: tickettool\tickettool.py:786 +msgid "Please provide a profile." +msgstr "Fornecer um perfil." + +#: tickettool\tickettool.py:789 +msgid "No profile has been created on this server." +msgstr "Não foi criado nenhum perfil neste servidor." + +#: tickettool\tickettool.py:797 +msgid "The ticket system is not enabled on this server. Please ask an administrator of this server to use the `{ctx.prefix}settickettool` subcommands to configure it." +msgstr "O sistema de bilhetes não está ativado neste servidor. Por favor, peça a um administrador deste servidor para usar os subcomandos `{ctx.prefix}settickettool` para configurá-lo." + +#: tickettool\tickettool.py:803 +msgid "The category `open` or the category `close` have not been configured. Please ask an administrator of this server to use the `{ctx.prefix}settickettool` subcommands to configure it." +msgstr "A categoria `open` ou a categoria `close` não foram configuradas. Por favor, peça a um administrador deste servidor que utilize os subcomandos `{ctx.prefix}settickettool` para as configurar." + +#: tickettool\tickettool.py:810 +msgid "Sorry. You have already reached the limit of {limit} open tickets." +msgstr "Desculpe. Já atingiu o limite de {limit} bilhetes abertos." + +#: tickettool\tickettool.py:821 +msgid "The bot does not have `manage_channels` permission on the `open` and `close` categories to allow the ticket system to function properly. Please notify an administrator of this server." +msgstr "O bot não tem permissão de \"gerir_canais\" nas categorias \"abrir\" e \"fechar\" para permitir que o sistema de bilhetes funcione correctamente. Por favor, notifique um administrador deste servidor." + +#: tickettool\tickettool.py:830 +msgid "The bot does not have `manage_channel` permission in the forum channel to allow the ticket system to function properly. Please notify an administrator of this server." +msgstr "O bot não tem `gestão_canal` permissão no canal do fórum para permitir que o sistema de bilhetes funcione correctamente. Por favor, notifique um administrador deste servidor." + +#: tickettool\tickettool.py:875 +msgid "Please provide the required informations by clicking on the button below." +msgstr "Para fornecer as informações necessárias, clique no botão abaixo." + +#: tickettool\tickettool.py:926 +#, docstring +msgid "Create a Ticket.\n\n" +" If only one profile has been created on this server, you don't need to specify its name.\n" +" " +msgstr "Criar um ticket.\n\n" +" Se apenas um perfil tiver sido criado neste servidor, não é necessário especificar o seu nome.\n" +" " + +#: tickettool\tickettool.py:942 +#, docstring +msgid "Create a Ticket for a member.\n\n" +" If only one profile has been created on this server, you don't need to specify its name.\n" +" " +msgstr "Criar um bilhete para um membro.\n\n" +" Se apenas um perfil tiver sido criado neste servidor, não é necessário especificar o seu nome.\n" +" " + +#: tickettool\tickettool.py:947 +msgid "You cannot create a ticket for a bot." +msgstr "Não é possível criar um bilhete para um bot." + +#: tickettool\tickettool.py:950 +msgid "You cannot create a ticket for a member with a higher or equal role." +msgstr "Não é possível criar um bilhete para um membro com uma função superior ou igual." + +#: tickettool\tickettool.py:970 +#, docstring +msgid "Export all the messages of an existing Ticket in html format.\n" +" Please note: all attachments and user avatars are saved with the Discord link in this file.\n" +" " +msgstr "Exportar todas as mensagens de um bilhete existente em formato html.\n" +" Atenção: todos os anexos e avatares de utilizador são guardados com a ligação Discord neste ficheiro.\n" +" " + +#: tickettool\tickettool.py:987 +msgid "Here is the html file of the transcript of all the messages in this ticket.\n" +"Please note: all attachments and user avatars are saved with the Discord link in this file." +msgstr "Aqui está o ficheiro html da transcrição de todas as mensagens contidas neste bilhete.\n" +"Atenção: todos os anexos e avatares de utilizadores são guardados com a ligação Discord neste ficheiro." + +#: tickettool\tickettool.py:1019 +#, docstring +msgid "Open an existing Ticket." +msgstr "Abrir um bilhete existente." + +#: tickettool\tickettool.py:1024 +msgid "The ticket system is not enabled on this server." +msgstr "O sistema de bilhetes não está activado neste servidor." + +#: tickettool\tickettool.py:1050 +#, docstring +msgid "Close an existing Ticket." +msgstr "Fechar um bilhete existente." + +#: tickettool\tickettool.py:1061 +msgid "Do you really want to close the ticket {ticket.id}?" +msgstr "Quer mesmo fechar o bilhete {ticket.id}?" + +#: tickettool\tickettool.py:1097 +#, docstring +msgid "Lock an existing Ticket." +msgstr "Bloquear um bilhete existente." + +#: tickettool\tickettool.py:1104 +msgid "Do you really want to lock the ticket {ticket.id}?" +msgstr "Quer mesmo bloquear o bilhete {ticket.id}?" + +#: tickettool\tickettool.py:1139 +#, docstring +msgid "Unlock an existing locked Ticket." +msgstr "Desbloquear um bilhete bloqueado existente." + +#: tickettool\tickettool.py:1167 +#, docstring +msgid "Rename an existing Ticket." +msgstr "Renomear um bilhete existente." + +#: tickettool\tickettool.py:1193 +#, docstring +msgid "Delete an existing Ticket.\n\n" +" If a logs channel is defined, an html file containing all the messages of this ticket will be generated.\n" +" (Attachments are not supported, as they are saved with their Discord link)\n" +" " +msgstr "Eliminar um bilhete existente.\n\n" +" Se for definido um canal de registos, será gerado um ficheiro html com todas as mensagens deste bilhete.\n" +" (Os anexos não são suportados, uma vez que são guardados com a respectiva ligação Discord)\n" +" " + +#: tickettool\tickettool.py:1202 +msgid "Do you really want to delete all the messages of the ticket {ticket.id}?" +msgstr "Quer mesmo apagar todas as mensagens do bilhete {ticket.id}?" + +#: tickettool\tickettool.py:1206 +msgid "If a logs channel is defined, an html file containing all the messages of this ticket will be generated. (Attachments are not supported, as they are saved with their Discord link.)" +msgstr "Se for definido um canal de registos, será gerado um ficheiro html com todas as mensagens deste bilhete. (Os anexos não são suportados, uma vez que são guardados com a sua ligação Discord.)" + +#: tickettool\tickettool.py:1242 +#, docstring +msgid "Claim an existing Ticket." +msgstr "Reivindicar um bilhete existente." + +#: tickettool\tickettool.py:1266 +#, docstring +msgid "Unclaim an existing Ticket." +msgstr "Cancelar a reclamação de um bilhete existente." + +#: tickettool\tickettool.py:1292 +#, docstring +msgid "Change the owner of an existing Ticket." +msgstr "Alterar o proprietário de um bilhete existente." + +#: tickettool\tickettool.py:1318 +#, docstring +msgid "Add a member to an existing Ticket." +msgstr "Adicionar um membro a um bilhete existente." + +#: tickettool\tickettool.py:1343 +#, docstring +msgid "Remove a member to an existing Ticket." +msgstr "Remover um membro de um bilhete existente." + +#: tickettool\tickettool.py:1357 +#, docstring +msgid "List the existing Tickets for a profile. You can provide a status and/or a ticket owner." +msgstr "Lista os bilhetes existentes para um perfil. Pode indicar um estado e/ou um proprietário do bilhete." + +#: tickettool\tickettool.py:1378 +msgid "No tickets to show." +msgstr "Não há bilhetes para o espectáculo." + +#: tickettool\tickettool.py:1419 +msgid "The profile for which this button was configured no longer exists." +msgstr "O perfil para o qual este botão foi configurado já não existe." + +#: tickettool\tickettool.py:1482 tickettool\tickettool.py:1541 +#: tickettool\tickettool.py:1545 tickettool\tickettool.py:1563 +#: tickettool\tickettool.py:1567 tickettool\tickettool.py:1587 +#: tickettool\tickettool.py:1591 tickettool\tickettool.py:1661 +#: tickettool\tickettool.py:1665 +msgid "You are not allowed to execute this command." +msgstr "Não está autorizado a executar este comando." + +#: tickettool\tickettool.py:1486 tickettool\tickettool.py:1491 +#: tickettool\tickettool.py:1495 +msgid "You have chosen to create a ticket." +msgstr "Optou por criar um bilhete." + +#: tickettool\tickettool.py:1517 +msgid "You have chosen to close this ticket. If this is not done, you do not have the necessary permissions to execute this command." +msgstr "Optou por fechar este bilhete. Se isto não for feito, não tem as permissões necessárias para executar este comando." + +#: tickettool\tickettool.py:1549 +msgid "You have chosen to re-open this ticket." +msgstr "Optou por reabrir este bilhete." + +#: tickettool\tickettool.py:1571 +msgid "You have chosen to claim this ticket. If this is not done, you do not have the necessary permissions to execute this command." +msgstr "Optou por reclamar este bilhete. Se isto não for feito, não tem as permissões necessárias para executar este comando." + +#: tickettool\tickettool.py:1611 +msgid "This message is not in TicketTool config." +msgstr "Esta mensagem não se encontra na configuração do TicketTool." + +#: tickettool\tickettool.py:1620 +msgid "The profile for which this dropdown was configured no longer exists." +msgstr "O perfil para o qual este menu suspenso foi configurado já não existe." + +#: tickettool\tickettool.py:1687 tickettool\tickettool.py:1694 +msgid "You have chosen to create a ticket with the reason `{reason}`." +msgstr "Optou por criar um bilhete com o motivo `{reason}`." + +#: tickettool\tickettool.py:1840 +msgid "No open tickets by this user in this server." +msgstr "Não existem bilhetes abertos por este utilizador neste servidor." + +#: tickettool\utils.py:143 +msgid "Emoji Label must be An emoji followed by a label, and optionnaly by a description and a value (for rename ticket channel), separated by either `;`, `,`, `|`, or `-`." +msgstr "A etiqueta do emoji deve ser um emoji seguido de uma etiqueta e, opcionalmente, de uma descrição e de um valor (para renomear o canal do bilhete), separados por `;`, `,`, `|` ou `-`." + +#: tickettool\utils.py:160 +msgid "Error parsing YAML. Please make sure the format is valid (a YAML validator may help)" +msgstr "Análise de erros de YAML. Por favor, certifique-se de que o formato é válido (um validador YAML pode ajudar)" + +#: tickettool\utils.py:174 +msgid "You can only have 5 text inputs." +msgstr "Só pode ter 5 entradas de texto." + +#: tickettool\utils.py:180 +msgid "The argument `/{count}/{arg}` is required in the YAML." +msgstr "O argumento `/{count}/{arg}` é necessário no YAML." + +#: tickettool\utils.py:187 +msgid "The argument `/{count}/{arg}` is invalid in the YAML. Check the spelling." +msgstr "O argumento `/{count}/{arg}` é inválido no YAML. Verifique a ortografia." + +#: tickettool\utils.py:193 +msgid "The argument `/modal/{count}/label` must be less than 45 characters long." +msgstr "O argumento `/modal/{count}/label` deve ter menos de 45 caracteres." + +#: tickettool\utils.py:203 tickettool\utils.py:209 +msgid "The argument `/{count}/style` must be a number between 1 and 2." +msgstr "O argumento `/{count}/style` deve ser um número entre 1 e 2." + +#: tickettool\utils.py:232 +msgid "The argument `/{count}/required` must be a boolean (True or False)." +msgstr "O argumento `/{count}/required` deve ser um booleano (Verdadeiro ou Falso)." + +#: tickettool\utils.py:242 +msgid "The argument `/modal/{count}/default` must be less than 4000 characters long." +msgstr "O argumento `/modal/{count}/default` deve ter menos de 4000 caracteres." + +#: tickettool\utils.py:250 +msgid "The argument `/modal/{count}/placeholder` must be less than 100 characters long." +msgstr "O argumento `/modal/{count}/placeholder` deve ter menos de 100 caracteres." + +#: tickettool\utils.py:258 +msgid "The argument `/modal/{count}/min_length` must be between 0 and 4000." +msgstr "O argumento `/modal/{count}/min_length` deve estar entre 0 e 4000." + +#: tickettool\utils.py:266 +msgid "The argument `/modal/{count}/max_length` must be between 0 and 4000." +msgstr "O argumento `/modal/{count}/max_length` deve estar entre 0 e 4000." + diff --git a/tickettool/locales/ro-RO.po b/tickettool/locales/ro-RO.po new file mode 100644 index 0000000..9426a89 --- /dev/null +++ b/tickettool/locales/ro-RO.po @@ -0,0 +1,584 @@ +msgid "" +msgstr "" +"Project-Id-Version: aaa3a-cogs\n" +"POT-Creation-Date: 2024-07-20 22:15+0200\n" +"PO-Revision-Date: 2024-07-21 15:13\n" +"Last-Translator: \n" +"Language-Team: Romanian\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: redgettext 3.4.2\n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100>0 && n%100<20)) ? 1 : 2);\n" +"X-Crowdin-Project: aaa3a-cogs\n" +"X-Crowdin-Project-ID: 531090\n" +"X-Crowdin-Language: ro\n" +"X-Crowdin-File: /[AAA3A-AAA3A.AAA3A-cogs] main/tickettool/locales/messages.pot\n" +"X-Crowdin-File-ID: 102\n" +"Language: ro_RO\n" + +#: tickettool\settings.py:15 tickettool\settings.py:18 +#: tickettool\tickettool.py:759 tickettool\tickettool.py:762 +msgid "This profile does not exist." +msgstr "Acest profil nu există." + +#: tickettool\settings.py:27 +msgid "I have to be the author of the message. You can use EmbedUtils by AAA3A to send one." +msgstr "Eu trebuie să fiu autorul mesajului. Puteți folosi EmbedUtils de AAA3A pentru a trimite unul." + +#: tickettool\settings.py:54 +#, docstring +msgid "Send a message with a button to open a ticket or dropdown with possible reasons.\n\n" +" Examples:\n" +" - `[p]settickettool message #general \"🐛|Report a bug|If you find a bug, report it here.|bug\" \"⚠️|Report a user|If you find a malicious user, report it here.|user\"`\n" +" - `[p]settickettool 1234567890-0987654321`\n" +" " +msgstr "Trimiteți un mesaj cu un buton pentru a deschide un bilet sau o listă derulantă cu posibile motive.\n\n" +" Exemple:\n" +" - `[p]settickettool message #general \"🐛|Report a bug|Dacă găsiți un bug, raportați-l aici.|bug\" \"⚠️|Report a user|Dacă găsiți un utilizator rău intenționat, raportați-l aici.|user\"`\n" +" - `[p]settickettool 1234567890-0987654321`\n" +" " + +#: tickettool\settings.py:70 +msgid "I don't have sufficient permissions in this channel to view it and to send messages into." +msgstr "Nu am suficiente permisiuni în acest canal pentru a-l vizualiza și pentru a trimite mesaje." + +#: tickettool\settings.py:97 tickettool\tickettool.py:339 +msgid "Create ticket" +msgstr "Creați un bilet" + +#: tickettool\settings.py:116 +msgid "A different value must be provided for each dropdown option." +msgstr "Trebuie să se furnizeze o valoare diferită pentru fiecare opțiune derulantă." + +#: tickettool\settings.py:124 +msgid "An emoji you selected seems invalid. Check that it is an emoji. If you have Nitro, you may have used a custom emoji from another server." +msgstr "Un emoji pe care l-ați selectat pare invalid. Verificați dacă este un emoji. Dacă aveți Nitro, este posibil să fi utilizat un emoji personalizat de pe un alt server." + +#: tickettool\ticket.py:245 +msgid "Creating the ticket {ticket.id}." +msgstr "Crearea biletului {ticket.id}." + +#: tickettool\ticket.py:266 +msgid "The dynamic channel name does not contain correct variable names and must be re-configured with `[p]settickettool dynamicchannelname`." +msgstr "Numele canalului dinamic nu conține nume de variabile corecte și trebuie reconfigurat cu `[p]settickettool dynamicchannelname`." + +#: tickettool\ticket.py:275 tickettool\ticket.py:528 tickettool\ticket.py:890 +#: tickettool\ticket.py:969 tickettool\tickettool.py:352 +msgid "Close" +msgstr "Închideți" + +#: tickettool\ticket.py:282 tickettool\ticket.py:535 tickettool\ticket.py:615 +#: tickettool\ticket.py:897 tickettool\ticket.py:976 +#: tickettool\tickettool.py:366 +msgid "Claim" +msgstr "Revendicare" + +#: tickettool\ticket.py:289 tickettool\ticket.py:542 tickettool\ticket.py:622 +#: tickettool\ticket.py:904 tickettool\ticket.py:983 +#: tickettool\tickettool.py:373 +msgid "Delete" +msgstr "Ștergeți" + +#: tickettool\ticket.py:303 tickettool\ticket.py:429 +msgid "Ticket Created" +msgstr "Bilet creat" + +#: tickettool\ticket.py:304 +msgid "Thank you for creating a ticket on this server!" +msgstr "Vă mulțumim că ați creat un bilet pe acest server!" + +#: tickettool\ticket.py:315 +msgid "🎟️ Ticket ID: {ticket.id}\n" +"🕵️ Ticket created by: @{ticket.created_by.display_name} ({ticket.created_by.id})\n" +"☢️ Ticket reason: {short_reason}\n" +msgstr "🎟️ ID-ul biletului: {ticket.id}\n" +"🕵️ Bilet creat de: @{ticket.created_by.display_name} ({ticket.created_by.id})\n" +"☢️ Motivul biletului: {short_reason}\n" + +#: tickettool\ticket.py:395 +msgid "⚠ At least one user (the ticket owner or a team member) could not be added to the ticket thread. Maybe the user doesn't have access to the parent forum/text channel. If the server uses private threads in a text channel, the bot does not have the `manage_messages` permission in this channel." +msgstr "⚠ Cel puțin un utilizator (proprietarul biletului sau un membru al echipei) nu a putut fi adăugat la firul biletului. Poate că utilizatorul nu are acces la forumul/canalul de text părinte. Dacă serverul utilizează discuții private într-un canal de text, robotul nu are permisiunea `manage_messages` în acest canal." + +#: tickettool\ticket.py:430 +msgid "The ticket was created by {ticket.created_by}." +msgstr "Biletul a fost creat de {ticket.created_by}." + +#: tickettool\ticket.py:436 +msgid "Report on the creation of the ticket {ticket.id}." +msgstr "Raport privind crearea biletului {ticket.id}." + +#: tickettool\ticket.py:476 +msgid "Opening the ticket {ticket.id}." +msgstr "Deschiderea biletului {ticket.id}." + +#: tickettool\ticket.py:505 tickettool\ticket.py:513 +msgid "Ticket Opened" +msgstr "Bilet deschis" + +#: tickettool\ticket.py:514 +msgid "The ticket was opened by {ticket.opened_by}." +msgstr "Biletul a fost deschis de {ticket.opened_by}." + +#: tickettool\ticket.py:520 tickettool\ticket.py:600 +msgid "Report on the close of the ticket {ticket.id}." +msgstr "Raport privind închiderea biletului {ticket.id}." + +#: tickettool\ticket.py:608 tickettool\tickettool.py:359 +msgid "Re-open" +msgstr "Redeschideți" + +#: tickettool\ticket.py:675 tickettool\ticket.py:712 +#: tickettool\tickettool.py:1100 tickettool\tickettool.py:1142 +msgid "Cannot execute action on a text channel." +msgstr "Nu se poate executa o acțiune pe un canal de text." + +#: tickettool\ticket.py:701 +msgid "Report on the lock of the ticket {ticket.id}." +msgstr "Raport privind încuietoarea biletului {ticket.id}." + +#: tickettool\ticket.py:738 +msgid "Report on the unlock of the ticket {ticket.id}." +msgstr "Raport privind deblocarea biletului {ticket.id}." + +#: tickettool\ticket.py:755 +msgid "Renaming the ticket {ticket.id}. (`{ticket.channel.name}` to `{new_name}`)" +msgstr "Redenumirea biletului {ticket.id}. (`{ticket.channel.name}` în{new_name}`)" + +#: tickettool\ticket.py:765 +msgid "Ticket Renamed." +msgstr "Bilet redenumit." + +#: tickettool\ticket.py:783 +msgid "Ticket Deleted" +msgstr "Bilet șters" + +#: tickettool\ticket.py:784 +msgid "The ticket was deleted by {ticket.deleted_by}." +msgstr "Biletul a fost șters de {ticket.deleted_by}." + +#: tickettool\ticket.py:807 +msgid "Report on the deletion of the ticket {ticket.id}." +msgstr "Raport referitor la ștergerea biletului {ticket.id}." + +#: tickettool\ticket.py:824 +msgid "Deleting the ticket {ticket.id}." +msgstr "Ștergerea biletului {ticket.id}." + +#: tickettool\ticket.py:845 +msgid "A ticket cannot be claimed if it is closed." +msgstr "Un bilet nu poate fi revendicat dacă este închis." + +#: tickettool\ticket.py:849 +msgid "A bot cannot claim a ticket." +msgstr "Un robot nu poate revendica un bilet." + +#: tickettool\ticket.py:863 +msgid "Claiming the ticket {ticket.id}." +msgstr "Revendicarea biletului {ticket.id}." + +#: tickettool\ticket.py:918 +msgid "Ticket claimed." +msgstr "Bilet revendicat." + +#: tickettool\ticket.py:932 +msgid "A ticket cannot be unclaimed if it is closed." +msgstr "Un bilet nu poate fi nerevendicat dacă este închis." + +#: tickettool\ticket.py:948 +msgid "Unclaiming the ticket {ticket.id}." +msgstr "Anularea biletului {ticket.id}." + +#: tickettool\ticket.py:997 +msgid "Ticket unclaimed." +msgstr "Bilet nerevendicat." + +#: tickettool\ticket.py:1011 +msgid "Cannot execute action in a thread channel." +msgstr "Nu se poate executa o acțiune într-un canal de tip thread." + +#: tickettool\ticket.py:1018 +msgid "Changing owner of the ticket {ticket.id}." +msgstr "Schimbarea proprietarului biletului {ticket.id}." + +#: tickettool\ticket.py:1022 +msgid "You cannot transfer ownership of a ticket to a bot." +msgstr "Nu puteți transfera proprietatea unui bilet către un robot." + +#: tickettool\ticket.py:1051 +msgid "Owner Modified." +msgstr "Proprietar modificat." + +#: tickettool\ticket.py:1070 +msgid "Adding a member to the ticket {ticket.id}." +msgstr "Adăugarea unui membru la bilet {ticket.id}." + +#: tickettool\ticket.py:1077 tickettool\ticket.py:1114 +msgid "You cannot add a bot to a ticket. ({member})" +msgstr "Nu puteți adăuga un robot la un bilet. ({member})" + +#: tickettool\ticket.py:1081 tickettool\ticket.py:1118 +msgid "This member is already the owner of this ticket. ({member})" +msgstr "Acest membru este deja proprietarul acestui bilet. ({member})" + +#: tickettool\ticket.py:1087 tickettool\ticket.py:1124 +msgid "This member is an administrator for the tickets system. They will always have access to the ticket anyway. ({member})" +msgstr "Acest membru este un administrator pentru sistemul de bilete. Oricum, acesta va avea întotdeauna acces la bilet. ({member})" + +#: tickettool\ticket.py:1093 tickettool\ticket.py:1130 +msgid "This member already has access to this ticket. ({member})" +msgstr "Acest membru are deja acces la acest bilet. ({member})" + +#: tickettool\ticket.py:1144 +msgid "⚠ At least one user (the ticket owner or a team member) could not be added to the ticket thread. Maybe the user the user doesn't have access to the parent forum/text channel. If the server uses private threads in a text channel, the bot does not have the `manage_messages` permission in this channel." +msgstr "⚠ Cel puțin un utilizator (proprietarul biletului sau un membru al echipei) nu a putut fi adăugat la firul biletului. Poate că utilizatorul utilizatorul nu are acces la forumul părinte/canalul de text. Dacă serverul utilizează discuții private într-un canal de text, robotul nu are permisiunea `manage_messages` în acest canal." + +#: tickettool\ticket.py:1168 +msgid "Removing a member to the ticket {ticket.id}." +msgstr "Înlăturarea unui membru de pe biletul {ticket.id}." + +#: tickettool\ticket.py:1174 tickettool\ticket.py:1204 +msgid "You cannot remove a bot to a ticket ({member})." +msgstr "Nu puteți elimina un bot de pe un bilet ({member})." + +#: tickettool\ticket.py:1180 tickettool\ticket.py:1210 +msgid "You cannot remove the owner of this ticket. ({member})" +msgstr "Nu puteți elimina proprietarul acestui bilet. ({member})" + +#: tickettool\ticket.py:1186 tickettool\ticket.py:1216 +msgid "This member is an administrator for the tickets system. They will always have access to the ticket. ({member})" +msgstr "Acest membru este un administrator pentru sistemul de bilete. Acesta va avea întotdeauna acces la bilet. ({member})" + +#: tickettool\ticket.py:1192 tickettool\ticket.py:1222 +msgid "This member is not in the list of those authorised to access the ticket. ({member})" +msgstr "Acest membru nu se află pe lista celor autorizați să acceseze biletul. ({member})" + +#: tickettool\tickettool.py:32 +#, docstring +msgid "A cog to manage a tickets system!" +msgstr "O rotiță pentru a gestiona un sistem de bilete!" + +#: tickettool\tickettool.py:74 +msgid "To get help on this server or to make an order for example, you can create a ticket.\n" +"Just use the command `{prefix}ticket create` or click on the button below.\n" +"You can then use the `{prefix}ticket` subcommands to manage your ticket." +msgstr "Pentru a obține ajutor pe acest server sau pentru a face o comandă, de exemplu, puteți crea un bilet.\n" +"Trebuie doar să utilizați comanda `{prefix}ticket create` sau să faceți clic pe butonul de mai jos.\n" +"Puteți folosi apoi subcomanda `{prefix}ticket` pentru a vă gestiona biletul." + +#: tickettool\tickettool.py:403 +msgid "Choose the reason for open a ticket." +msgstr "Alegeți motivul pentru care deschideți un bilet." + +#: tickettool\tickettool.py:521 +msgid "Action taken for the ticket system." +msgstr "Acțiuni întreprinse pentru sistemul de bilete." + +#: tickettool\tickettool.py:555 +msgid "Ticket ID:" +msgstr "ID-ul biletului:" + +#: tickettool\tickettool.py:558 +msgid "Owned by:" +msgstr "Deținută de:" + +#: tickettool\tickettool.py:566 +msgid "Channel:" +msgstr "Canal:" + +#: tickettool\tickettool.py:573 +msgid "Closed by:" +msgstr "Închis de:" + +#: tickettool\tickettool.py:581 +msgid "Deleted by:" +msgstr "Șters de:" + +#: tickettool\tickettool.py:589 +msgid "Closed at:" +msgstr "Închis la:" + +#: tickettool\tickettool.py:596 tickettool\tickettool.py:622 +msgid "Reason:" +msgstr "Motivul:" + +#: tickettool\tickettool.py:607 +msgid "Ticket [{ticket.profile}] {ticket.id} - Action taken" +msgstr "Bilet [{ticket.profile}] {ticket.id} - Acțiune întreprinsă" + +#: tickettool\tickettool.py:687 +msgid "You're not in a ticket." +msgstr "Nu sunteți în bilet." + +#: tickettool\tickettool.py:691 +msgid "This ticket isn't {status}ed." +msgstr "Acest bilet nu este {status}ed." + +#: tickettool\tickettool.py:700 +msgid "This ticket is {status}." +msgstr "Acest bilet este {status}." + +#: tickettool\tickettool.py:709 +msgid "You're not allowed to lock this ticket." +msgstr "Nu aveți voie să blocați acest bilet." + +#: tickettool\tickettool.py:752 +msgid "You're not allowed to view this ticket." +msgstr "Nu aveți voie să vedeți acest bilet." + +#: tickettool\tickettool.py:786 +msgid "Please provide a profile." +msgstr "Vă rugăm să furnizați un profil." + +#: tickettool\tickettool.py:789 +msgid "No profile has been created on this server." +msgstr "Nu a fost creat niciun profil pe acest server." + +#: tickettool\tickettool.py:797 +msgid "The ticket system is not enabled on this server. Please ask an administrator of this server to use the `{ctx.prefix}settickettool` subcommands to configure it." +msgstr "Sistemul de bilete nu este activat pe acest server. Vă rugăm să cereți unui administrator al acestui server să folosească subcomanda `{ctx.prefix}settickettool` pentru a-l configura." + +#: tickettool\tickettool.py:803 +msgid "The category `open` or the category `close` have not been configured. Please ask an administrator of this server to use the `{ctx.prefix}settickettool` subcommands to configure it." +msgstr "Categoria `open` sau categoria `close` nu au fost configurate. Vă rugăm să solicitați unui administrator al acestui server să utilizeze subcomanda `{ctx.prefix}settickettool` pentru a le configura." + +#: tickettool\tickettool.py:810 +msgid "Sorry. You have already reached the limit of {limit} open tickets." +msgstr "Îmi pare rău. Ați ajuns deja la limita de {limit} bilete deschise." + +#: tickettool\tickettool.py:821 +msgid "The bot does not have `manage_channels` permission on the `open` and `close` categories to allow the ticket system to function properly. Please notify an administrator of this server." +msgstr "Robotul nu are permisiunea `manage_channels` pe categoriile `open` și `close` pentru a permite sistemului de bilete să funcționeze corect. Vă rugăm să anunțați un administrator al acestui server." + +#: tickettool\tickettool.py:830 +msgid "The bot does not have `manage_channel` permission in the forum channel to allow the ticket system to function properly. Please notify an administrator of this server." +msgstr "Robotul nu are permisiunea `manage_channel` în canalul forumului pentru a permite sistemului de bilete să funcționeze corect. Vă rugăm să anunțați un administrator al acestui server." + +#: tickettool\tickettool.py:875 +msgid "Please provide the required informations by clicking on the button below." +msgstr "Vă rugăm să furnizați informațiile solicitate făcând clic pe butonul de mai jos." + +#: tickettool\tickettool.py:926 +#, docstring +msgid "Create a Ticket.\n\n" +" If only one profile has been created on this server, you don't need to specify its name.\n" +" " +msgstr "Creați un bilet.\n\n" +" Dacă pe acest server a fost creat un singur profil, nu este necesar să specificați numele acestuia.\n" +" " + +#: tickettool\tickettool.py:942 +#, docstring +msgid "Create a Ticket for a member.\n\n" +" If only one profile has been created on this server, you don't need to specify its name.\n" +" " +msgstr "Creați un bilet pentru un membru.\n\n" +" Dacă a fost creat un singur profil pe acest server, nu este necesar să specificați numele acestuia.\n" +" " + +#: tickettool\tickettool.py:947 +msgid "You cannot create a ticket for a bot." +msgstr "Nu puteți crea un tichet pentru un bot." + +#: tickettool\tickettool.py:950 +msgid "You cannot create a ticket for a member with a higher or equal role." +msgstr "Nu puteți crea un tichet pentru un membru cu un rol superior sau egal." + +#: tickettool\tickettool.py:970 +#, docstring +msgid "Export all the messages of an existing Ticket in html format.\n" +" Please note: all attachments and user avatars are saved with the Discord link in this file.\n" +" " +msgstr "Exportă toate mesajele unui bilet existent în format html.\n" +" Vă rugăm să rețineți: toate atașamentele și avatarele utilizatorilor sunt salvate cu linkul Discord din acest fișier.\n" +" " + +#: tickettool\tickettool.py:987 +msgid "Here is the html file of the transcript of all the messages in this ticket.\n" +"Please note: all attachments and user avatars are saved with the Discord link in this file." +msgstr "Aici este fișierul html al transcrierii tuturor mesajelor din acest bilet.\n" +"Vă rugăm să rețineți: toate atașamentele și avatarele utilizatorilor sunt salvate cu linkul Discord din acest fișier." + +#: tickettool\tickettool.py:1019 +#, docstring +msgid "Open an existing Ticket." +msgstr "Deschideți un bilet existent." + +#: tickettool\tickettool.py:1024 +msgid "The ticket system is not enabled on this server." +msgstr "Sistemul de bilete nu este activat pe acest server." + +#: tickettool\tickettool.py:1050 +#, docstring +msgid "Close an existing Ticket." +msgstr "Închideți un bilet existent." + +#: tickettool\tickettool.py:1061 +msgid "Do you really want to close the ticket {ticket.id}?" +msgstr "Chiar doriți să închideți biletul {ticket.id}?" + +#: tickettool\tickettool.py:1097 +#, docstring +msgid "Lock an existing Ticket." +msgstr "Blocați un bilet existent." + +#: tickettool\tickettool.py:1104 +msgid "Do you really want to lock the ticket {ticket.id}?" +msgstr "Chiar vrei să blochezi biletul {ticket.id}?" + +#: tickettool\tickettool.py:1139 +#, docstring +msgid "Unlock an existing locked Ticket." +msgstr "Deblocați un bilet blocat existent." + +#: tickettool\tickettool.py:1167 +#, docstring +msgid "Rename an existing Ticket." +msgstr "Redenumiți un bilet existent." + +#: tickettool\tickettool.py:1193 +#, docstring +msgid "Delete an existing Ticket.\n\n" +" If a logs channel is defined, an html file containing all the messages of this ticket will be generated.\n" +" (Attachments are not supported, as they are saved with their Discord link)\n" +" " +msgstr "Ștergeți un bilet existent.\n\n" +" Dacă este definit un canal de jurnale, va fi generat un fișier html care conține toate mesajele acestui bilet.\n" +" (Nu se acceptă atașamente, deoarece acestea sunt salvate cu link-ul lor Discord)\n" +" " + +#: tickettool\tickettool.py:1202 +msgid "Do you really want to delete all the messages of the ticket {ticket.id}?" +msgstr "Chiar vreți să ștergeți toate mesajele de pe biletul {ticket.id}?" + +#: tickettool\tickettool.py:1206 +msgid "If a logs channel is defined, an html file containing all the messages of this ticket will be generated. (Attachments are not supported, as they are saved with their Discord link.)" +msgstr "Dacă este definit un canal de jurnale, va fi generat un fișier html care conține toate mesajele acestui bilet. (Nu se acceptă atașamente, deoarece acestea sunt salvate cu link-ul lor Discord.)" + +#: tickettool\tickettool.py:1242 +#, docstring +msgid "Claim an existing Ticket." +msgstr "Revendicați un bilet existent." + +#: tickettool\tickettool.py:1266 +#, docstring +msgid "Unclaim an existing Ticket." +msgstr "Anularea unui bilet existent." + +#: tickettool\tickettool.py:1292 +#, docstring +msgid "Change the owner of an existing Ticket." +msgstr "Modificați proprietarul unui bilet existent." + +#: tickettool\tickettool.py:1318 +#, docstring +msgid "Add a member to an existing Ticket." +msgstr "Adăugați un membru la un bilet existent." + +#: tickettool\tickettool.py:1343 +#, docstring +msgid "Remove a member to an existing Ticket." +msgstr "Îndepărtați un membru de la un bilet existent." + +#: tickettool\tickettool.py:1357 +#, docstring +msgid "List the existing Tickets for a profile. You can provide a status and/or a ticket owner." +msgstr "Listează biletele existente pentru un profil. Puteți furniza un statut și/sau un proprietar al biletului." + +#: tickettool\tickettool.py:1378 +msgid "No tickets to show." +msgstr "Nu există bilete la spectacol." + +#: tickettool\tickettool.py:1419 +msgid "The profile for which this button was configured no longer exists." +msgstr "Profilul pentru care a fost configurat acest buton nu mai există." + +#: tickettool\tickettool.py:1482 tickettool\tickettool.py:1541 +#: tickettool\tickettool.py:1545 tickettool\tickettool.py:1563 +#: tickettool\tickettool.py:1567 tickettool\tickettool.py:1587 +#: tickettool\tickettool.py:1591 tickettool\tickettool.py:1661 +#: tickettool\tickettool.py:1665 +msgid "You are not allowed to execute this command." +msgstr "Nu aveți voie să executați această comandă." + +#: tickettool\tickettool.py:1486 tickettool\tickettool.py:1491 +#: tickettool\tickettool.py:1495 +msgid "You have chosen to create a ticket." +msgstr "Ați ales să creați un bilet." + +#: tickettool\tickettool.py:1517 +msgid "You have chosen to close this ticket. If this is not done, you do not have the necessary permissions to execute this command." +msgstr "Ați ales să închideți acest bilet. În caz contrar, nu aveți permisiunile necesare pentru a executa această comandă." + +#: tickettool\tickettool.py:1549 +msgid "You have chosen to re-open this ticket." +msgstr "Ați ales să redeschideți acest bilet." + +#: tickettool\tickettool.py:1571 +msgid "You have chosen to claim this ticket. If this is not done, you do not have the necessary permissions to execute this command." +msgstr "Ați ales să revendicați acest bilet. Dacă nu ați făcut acest lucru, înseamnă că nu aveți permisiunile necesare pentru a executa această comandă." + +#: tickettool\tickettool.py:1611 +msgid "This message is not in TicketTool config." +msgstr "Acest mesaj nu se află în configurația TicketTool." + +#: tickettool\tickettool.py:1620 +msgid "The profile for which this dropdown was configured no longer exists." +msgstr "Profilul pentru care a fost configurată această listă derulantă nu mai există." + +#: tickettool\tickettool.py:1687 tickettool\tickettool.py:1694 +msgid "You have chosen to create a ticket with the reason `{reason}`." +msgstr "Ați ales să creați un bilet cu motivul `{reason}`." + +#: tickettool\tickettool.py:1840 +msgid "No open tickets by this user in this server." +msgstr "Nu există niciun bilet deschis de acest utilizator pe acest server." + +#: tickettool\utils.py:143 +msgid "Emoji Label must be An emoji followed by a label, and optionnaly by a description and a value (for rename ticket channel), separated by either `;`, `,`, `|`, or `-`." +msgstr "Emoji Label trebuie să fie Un emoji urmat de o etichetă și, opțional, de o descriere și o valoare (pentru redenumirea canalului de bilete), separate fie prin `;`, `,`, `|`, fie `-`." + +#: tickettool\utils.py:160 +msgid "Error parsing YAML. Please make sure the format is valid (a YAML validator may help)" +msgstr "Eroare la analizarea YAML. Vă rugăm să vă asigurați că formatul este valid (un validator YAML poate fi de ajutor)" + +#: tickettool\utils.py:174 +msgid "You can only have 5 text inputs." +msgstr "Puteți avea doar 5 intrări de text." + +#: tickettool\utils.py:180 +msgid "The argument `/{count}/{arg}` is required in the YAML." +msgstr "Argumentul `/{count}/{arg}` este necesar în YAML." + +#: tickettool\utils.py:187 +msgid "The argument `/{count}/{arg}` is invalid in the YAML. Check the spelling." +msgstr "Argumentul `/{count}/{arg}` nu este valid în YAML. Verificați ortografia." + +#: tickettool\utils.py:193 +msgid "The argument `/modal/{count}/label` must be less than 45 characters long." +msgstr "Argumentul `/modal/{count}/label` trebuie să aibă o lungime mai mică de 45 de caractere." + +#: tickettool\utils.py:203 tickettool\utils.py:209 +msgid "The argument `/{count}/style` must be a number between 1 and 2." +msgstr "Argumentul `/{count}/style` trebuie să fie un număr între 1 și 2." + +#: tickettool\utils.py:232 +msgid "The argument `/{count}/required` must be a boolean (True or False)." +msgstr "Argumentul `/{count}/required` trebuie să fie un boolean (True sau False)." + +#: tickettool\utils.py:242 +msgid "The argument `/modal/{count}/default` must be less than 4000 characters long." +msgstr "Argumentul `/modal/{count}/default` trebuie să aibă o lungime mai mică de 4000 de caractere." + +#: tickettool\utils.py:250 +msgid "The argument `/modal/{count}/placeholder` must be less than 100 characters long." +msgstr "Argumentul `/modal/{count}/placeholder` trebuie să aibă o lungime mai mică de 100 de caractere." + +#: tickettool\utils.py:258 +msgid "The argument `/modal/{count}/min_length` must be between 0 and 4000." +msgstr "Argumentul `/modal/{count}/min_length` trebuie să fie cuprins între 0 și 4000." + +#: tickettool\utils.py:266 +msgid "The argument `/modal/{count}/max_length` must be between 0 and 4000." +msgstr "Argumentul `/modal/{count}/max_length` trebuie să fie cuprins între 0 și 4000." + diff --git a/tickettool/locales/ru-RU.po b/tickettool/locales/ru-RU.po new file mode 100644 index 0000000..a17c867 --- /dev/null +++ b/tickettool/locales/ru-RU.po @@ -0,0 +1,584 @@ +msgid "" +msgstr "" +"Project-Id-Version: aaa3a-cogs\n" +"POT-Creation-Date: 2024-07-20 22:15+0200\n" +"PO-Revision-Date: 2024-07-21 15:13\n" +"Last-Translator: \n" +"Language-Team: Russian\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: redgettext 3.4.2\n" +"Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n" +"X-Crowdin-Project: aaa3a-cogs\n" +"X-Crowdin-Project-ID: 531090\n" +"X-Crowdin-Language: ru\n" +"X-Crowdin-File: /[AAA3A-AAA3A.AAA3A-cogs] main/tickettool/locales/messages.pot\n" +"X-Crowdin-File-ID: 102\n" +"Language: ru_RU\n" + +#: tickettool\settings.py:15 tickettool\settings.py:18 +#: tickettool\tickettool.py:759 tickettool\tickettool.py:762 +msgid "This profile does not exist." +msgstr "Этот профиль не существует." + +#: tickettool\settings.py:27 +msgid "I have to be the author of the message. You can use EmbedUtils by AAA3A to send one." +msgstr "Я должен быть автором сообщения. Вы можете использовать EmbedUtils by AAA3A для отправки одного сообщения." + +#: tickettool\settings.py:54 +#, docstring +msgid "Send a message with a button to open a ticket or dropdown with possible reasons.\n\n" +" Examples:\n" +" - `[p]settickettool message #general \"🐛|Report a bug|If you find a bug, report it here.|bug\" \"⚠️|Report a user|If you find a malicious user, report it here.|user\"`\n" +" - `[p]settickettool 1234567890-0987654321`\n" +" " +msgstr "Отправьте сообщение с кнопкой для открытия тикета или выпадающим списком возможных причин.\n\n" +" Примеры:\n" +" - `[p]settickettool message #general \"🐛|Report a bug|If you find a bug, report it here.|bug\" \"⚠️|Report a user|If you find a malicious user, report it here.|user\"`\n" +" - `[p]settickettool 1234567890-0987654321`\n" +" " + +#: tickettool\settings.py:70 +msgid "I don't have sufficient permissions in this channel to view it and to send messages into." +msgstr "У меня нет достаточных прав в этом канале, чтобы просматривать его и отправлять в него сообщения." + +#: tickettool\settings.py:97 tickettool\tickettool.py:339 +msgid "Create ticket" +msgstr "Создать билет" + +#: tickettool\settings.py:116 +msgid "A different value must be provided for each dropdown option." +msgstr "Для каждого выпадающего параметра должно быть указано свое значение." + +#: tickettool\settings.py:124 +msgid "An emoji you selected seems invalid. Check that it is an emoji. If you have Nitro, you may have used a custom emoji from another server." +msgstr "Выбранный вами эмодзи кажется недопустимым. Проверьте, является ли это эмодзи. Если у вас есть Nitro, возможно, вы использовали пользовательский emoji с другого сервера." + +#: tickettool\ticket.py:245 +msgid "Creating the ticket {ticket.id}." +msgstr "Создание билета {ticket.id}." + +#: tickettool\ticket.py:266 +msgid "The dynamic channel name does not contain correct variable names and must be re-configured with `[p]settickettool dynamicchannelname`." +msgstr "Имя динамического канала не содержит корректных имен переменных и должно быть переконфигурировано с помощью команды `[p]settickettool dynamicchannelname`." + +#: tickettool\ticket.py:275 tickettool\ticket.py:528 tickettool\ticket.py:890 +#: tickettool\ticket.py:969 tickettool\tickettool.py:352 +msgid "Close" +msgstr "Закрыть" + +#: tickettool\ticket.py:282 tickettool\ticket.py:535 tickettool\ticket.py:615 +#: tickettool\ticket.py:897 tickettool\ticket.py:976 +#: tickettool\tickettool.py:366 +msgid "Claim" +msgstr "Претензия" + +#: tickettool\ticket.py:289 tickettool\ticket.py:542 tickettool\ticket.py:622 +#: tickettool\ticket.py:904 tickettool\ticket.py:983 +#: tickettool\tickettool.py:373 +msgid "Delete" +msgstr "Удалить" + +#: tickettool\ticket.py:303 tickettool\ticket.py:429 +msgid "Ticket Created" +msgstr "Билет создан" + +#: tickettool\ticket.py:304 +msgid "Thank you for creating a ticket on this server!" +msgstr "Благодарим вас за создание тикета на этом сервере!" + +#: tickettool\ticket.py:315 +msgid "🎟️ Ticket ID: {ticket.id}\n" +"🕵️ Ticket created by: @{ticket.created_by.display_name} ({ticket.created_by.id})\n" +"☢️ Ticket reason: {short_reason}\n" +msgstr "🎟️ ID билета: {ticket.id}\n" +"🕵️ Ticket created by: @{ticket.created_by.display_name} ({ticket.created_by.id})\n" +"☢️ Причина тикета: {short_reason}\n" + +#: tickettool\ticket.py:395 +msgid "⚠ At least one user (the ticket owner or a team member) could not be added to the ticket thread. Maybe the user doesn't have access to the parent forum/text channel. If the server uses private threads in a text channel, the bot does not have the `manage_messages` permission in this channel." +msgstr "⚠ По крайней мере один пользователь (владелец билета или член команды) не может быть добавлен в тему билета. Возможно, у пользователя нет доступа к родительскому форуму/текстовому каналу. Если сервер использует личные темы в текстовом канале, у бота нет права `управлять_сообщениями` в этом канале." + +#: tickettool\ticket.py:430 +msgid "The ticket was created by {ticket.created_by}." +msgstr "Билет был создан на сайте {ticket.created_by}." + +#: tickettool\ticket.py:436 +msgid "Report on the creation of the ticket {ticket.id}." +msgstr "Отчет о создании билета {ticket.id}." + +#: tickettool\ticket.py:476 +msgid "Opening the ticket {ticket.id}." +msgstr "Открытие билета {ticket.id}." + +#: tickettool\ticket.py:505 tickettool\ticket.py:513 +msgid "Ticket Opened" +msgstr "Билет открыт" + +#: tickettool\ticket.py:514 +msgid "The ticket was opened by {ticket.opened_by}." +msgstr "Билет был открыт на сайте {ticket.opened_by}." + +#: tickettool\ticket.py:520 tickettool\ticket.py:600 +msgid "Report on the close of the ticket {ticket.id}." +msgstr "Отчет о закрытии билетов {ticket.id}." + +#: tickettool\ticket.py:608 tickettool\tickettool.py:359 +msgid "Re-open" +msgstr "Вновь открыть" + +#: tickettool\ticket.py:675 tickettool\ticket.py:712 +#: tickettool\tickettool.py:1100 tickettool\tickettool.py:1142 +msgid "Cannot execute action on a text channel." +msgstr "Невозможно выполнить действие на текстовом канале." + +#: tickettool\ticket.py:701 +msgid "Report on the lock of the ticket {ticket.id}." +msgstr "Отчет по замку билета {ticket.id}." + +#: tickettool\ticket.py:738 +msgid "Report on the unlock of the ticket {ticket.id}." +msgstr "Отчет о разблокировке билета {ticket.id}." + +#: tickettool\ticket.py:755 +msgid "Renaming the ticket {ticket.id}. (`{ticket.channel.name}` to `{new_name}`)" +msgstr "Переименование билета {ticket.id}. (`{ticket.channel.name}` в `{new_name}`)" + +#: tickettool\ticket.py:765 +msgid "Ticket Renamed." +msgstr "Билет переименован." + +#: tickettool\ticket.py:783 +msgid "Ticket Deleted" +msgstr "Билет удален" + +#: tickettool\ticket.py:784 +msgid "The ticket was deleted by {ticket.deleted_by}." +msgstr "Билет был удален {ticket.deleted_by}." + +#: tickettool\ticket.py:807 +msgid "Report on the deletion of the ticket {ticket.id}." +msgstr "Отчет об удалении билета {ticket.id}." + +#: tickettool\ticket.py:824 +msgid "Deleting the ticket {ticket.id}." +msgstr "Удаление билета {ticket.id}." + +#: tickettool\ticket.py:845 +msgid "A ticket cannot be claimed if it is closed." +msgstr "Билет не может быть востребован, если он закрыт." + +#: tickettool\ticket.py:849 +msgid "A bot cannot claim a ticket." +msgstr "Бот не может претендовать на билет." + +#: tickettool\ticket.py:863 +msgid "Claiming the ticket {ticket.id}." +msgstr "Утверждение билета {ticket.id}." + +#: tickettool\ticket.py:918 +msgid "Ticket claimed." +msgstr "Билет заявлен." + +#: tickettool\ticket.py:932 +msgid "A ticket cannot be unclaimed if it is closed." +msgstr "Билет не может быть невостребованным, если он закрыт." + +#: tickettool\ticket.py:948 +msgid "Unclaiming the ticket {ticket.id}." +msgstr "Невостребованность билета {ticket.id}." + +#: tickettool\ticket.py:997 +msgid "Ticket unclaimed." +msgstr "Билет невостребован." + +#: tickettool\ticket.py:1011 +msgid "Cannot execute action in a thread channel." +msgstr "Невозможно выполнить действие в потоковом канале." + +#: tickettool\ticket.py:1018 +msgid "Changing owner of the ticket {ticket.id}." +msgstr "Смена владельца билета {ticket.id}." + +#: tickettool\ticket.py:1022 +msgid "You cannot transfer ownership of a ticket to a bot." +msgstr "Вы не можете передать право собственности на билет боту." + +#: tickettool\ticket.py:1051 +msgid "Owner Modified." +msgstr "Владелец изменен." + +#: tickettool\ticket.py:1070 +msgid "Adding a member to the ticket {ticket.id}." +msgstr "Добавление участника в билет {ticket.id}." + +#: tickettool\ticket.py:1077 tickettool\ticket.py:1114 +msgid "You cannot add a bot to a ticket. ({member})" +msgstr "Вы не можете добавить бота в билет. ({member})" + +#: tickettool\ticket.py:1081 tickettool\ticket.py:1118 +msgid "This member is already the owner of this ticket. ({member})" +msgstr "Этот пользователь уже является владельцем этого билета. ({member})" + +#: tickettool\ticket.py:1087 tickettool\ticket.py:1124 +msgid "This member is an administrator for the tickets system. They will always have access to the ticket anyway. ({member})" +msgstr "Этот пользователь является администратором системы билетов. Они всегда будут иметь доступ к билетам в любом случае. ({member})" + +#: tickettool\ticket.py:1093 tickettool\ticket.py:1130 +msgid "This member already has access to this ticket. ({member})" +msgstr "Этот пользователь уже имеет доступ к этому билету. ({member})" + +#: tickettool\ticket.py:1144 +msgid "⚠ At least one user (the ticket owner or a team member) could not be added to the ticket thread. Maybe the user the user doesn't have access to the parent forum/text channel. If the server uses private threads in a text channel, the bot does not have the `manage_messages` permission in this channel." +msgstr "⚠ По крайней мере один пользователь (владелец тикета или член команды) не может быть добавлен в тему тикета. Возможно, у пользователя нет доступа к родительскому форуму/текстовому каналу. Если сервер использует приватные темы в текстовом канале, то бот не имеет права `manage_messages` в этом канале." + +#: tickettool\ticket.py:1168 +msgid "Removing a member to the ticket {ticket.id}." +msgstr "Удаление пользователя из билета {ticket.id}." + +#: tickettool\ticket.py:1174 tickettool\ticket.py:1204 +msgid "You cannot remove a bot to a ticket ({member})." +msgstr "Вы не можете удалить бота из тикета ({member})." + +#: tickettool\ticket.py:1180 tickettool\ticket.py:1210 +msgid "You cannot remove the owner of this ticket. ({member})" +msgstr "Вы не можете удалить владельца этого билета. ({member})" + +#: tickettool\ticket.py:1186 tickettool\ticket.py:1216 +msgid "This member is an administrator for the tickets system. They will always have access to the ticket. ({member})" +msgstr "Этот пользователь является администратором системы билетов. Он всегда будет иметь доступ к билету. ({member})" + +#: tickettool\ticket.py:1192 tickettool\ticket.py:1222 +msgid "This member is not in the list of those authorised to access the ticket. ({member})" +msgstr "Этого участника нет в списке лиц, имеющих право доступа к билету. ({member})" + +#: tickettool\tickettool.py:32 +#, docstring +msgid "A cog to manage a tickets system!" +msgstr "Шестеренка для управления системой билетов!" + +#: tickettool\tickettool.py:74 +msgid "To get help on this server or to make an order for example, you can create a ticket.\n" +"Just use the command `{prefix}ticket create` or click on the button below.\n" +"You can then use the `{prefix}ticket` subcommands to manage your ticket." +msgstr "Чтобы получить помощь на этом сервере или, например, сделать заказ, вы можете создать тикет.\n" +"Просто используйте команду `{prefix}ticket create` или нажмите на кнопку ниже.\n" +"Затем вы можете использовать подкоманды `{prefix}ticket` для управления вашим билетом." + +#: tickettool\tickettool.py:403 +msgid "Choose the reason for open a ticket." +msgstr "Выберите причину открытия билета." + +#: tickettool\tickettool.py:521 +msgid "Action taken for the ticket system." +msgstr "Действия, предпринятые для билетной системы." + +#: tickettool\tickettool.py:555 +msgid "Ticket ID:" +msgstr "ID билета:" + +#: tickettool\tickettool.py:558 +msgid "Owned by:" +msgstr "Владелец:" + +#: tickettool\tickettool.py:566 +msgid "Channel:" +msgstr "Канал:" + +#: tickettool\tickettool.py:573 +msgid "Closed by:" +msgstr "Закрыто:" + +#: tickettool\tickettool.py:581 +msgid "Deleted by:" +msgstr "Удалено:" + +#: tickettool\tickettool.py:589 +msgid "Closed at:" +msgstr "Закрыто в:" + +#: tickettool\tickettool.py:596 tickettool\tickettool.py:622 +msgid "Reason:" +msgstr "Причина:" + +#: tickettool\tickettool.py:607 +msgid "Ticket [{ticket.profile}] {ticket.id} - Action taken" +msgstr "Билет [{ticket.profile}] {ticket.id} - Принято решение" + +#: tickettool\tickettool.py:687 +msgid "You're not in a ticket." +msgstr "У вас нет билета." + +#: tickettool\tickettool.py:691 +msgid "This ticket isn't {status}ed." +msgstr "Этот билет не является {status}ed." + +#: tickettool\tickettool.py:700 +msgid "This ticket is {status}." +msgstr "Этот билет - {status}." + +#: tickettool\tickettool.py:709 +msgid "You're not allowed to lock this ticket." +msgstr "Вы не можете заблокировать этот билет." + +#: tickettool\tickettool.py:752 +msgid "You're not allowed to view this ticket." +msgstr "Вам не разрешено просматривать этот билет." + +#: tickettool\tickettool.py:786 +msgid "Please provide a profile." +msgstr "Пожалуйста, укажите профиль." + +#: tickettool\tickettool.py:789 +msgid "No profile has been created on this server." +msgstr "На этом сервере не было создано ни одного профиля." + +#: tickettool\tickettool.py:797 +msgid "The ticket system is not enabled on this server. Please ask an administrator of this server to use the `{ctx.prefix}settickettool` subcommands to configure it." +msgstr "Тикет-система не включена на этом сервере. Пожалуйста, попросите администратора этого сервера использовать подкоманды `{ctx.prefix}settickettool` для ее настройки." + +#: tickettool\tickettool.py:803 +msgid "The category `open` or the category `close` have not been configured. Please ask an administrator of this server to use the `{ctx.prefix}settickettool` subcommands to configure it." +msgstr "Категория `открыть` или категория `закрыть` не были настроены. Попросите администратора этого сервера использовать для настройки подкоманды `{ctx.prefix}settickettool`." + +#: tickettool\tickettool.py:810 +msgid "Sorry. You have already reached the limit of {limit} open tickets." +msgstr "Извините. Вы уже достигли лимита {limit} открытых билетов." + +#: tickettool\tickettool.py:821 +msgid "The bot does not have `manage_channels` permission on the `open` and `close` categories to allow the ticket system to function properly. Please notify an administrator of this server." +msgstr "Бот не имеет разрешения `manage_channels` на категории `open` и `close` для правильной работы билетной системы. Пожалуйста, сообщите администратору этого сервера." + +#: tickettool\tickettool.py:830 +msgid "The bot does not have `manage_channel` permission in the forum channel to allow the ticket system to function properly. Please notify an administrator of this server." +msgstr "У бота нет прав `manage_channel` в канале форума, чтобы система тикетов работала правильно. Пожалуйста, сообщите об этом администратору сервера." + +#: tickettool\tickettool.py:875 +msgid "Please provide the required informations by clicking on the button below." +msgstr "Пожалуйста, введите необходимые данные, нажав на кнопку ниже." + +#: tickettool\tickettool.py:926 +#, docstring +msgid "Create a Ticket.\n\n" +" If only one profile has been created on this server, you don't need to specify its name.\n" +" " +msgstr "Создать билет.\n\n" +" Если на этом сервере был создан только один профиль, указывать его имя не нужно.\n" +" " + +#: tickettool\tickettool.py:942 +#, docstring +msgid "Create a Ticket for a member.\n\n" +" If only one profile has been created on this server, you don't need to specify its name.\n" +" " +msgstr "Создайте билет для пользователя.\n\n" +" Если на этом сервере был создан только один профиль, указывать его имя не нужно.\n" +" " + +#: tickettool\tickettool.py:947 +msgid "You cannot create a ticket for a bot." +msgstr "Вы не можете создать билет для бота." + +#: tickettool\tickettool.py:950 +msgid "You cannot create a ticket for a member with a higher or equal role." +msgstr "Вы не можете создать билет для участника с более высокой или равной ролью." + +#: tickettool\tickettool.py:970 +#, docstring +msgid "Export all the messages of an existing Ticket in html format.\n" +" Please note: all attachments and user avatars are saved with the Discord link in this file.\n" +" " +msgstr "Экспорт всех сообщений существующего Тикета в формате html.\n" +" Обратите внимание: все вложения и аватары пользователей сохраняются вместе со ссылкой на Discord в этом файле.\n" +" " + +#: tickettool\tickettool.py:987 +msgid "Here is the html file of the transcript of all the messages in this ticket.\n" +"Please note: all attachments and user avatars are saved with the Discord link in this file." +msgstr "Здесь находится html-файл с расшифровкой всех сообщений в этом тикете.\n" +"Обратите внимание: все вложения и аватары пользователей сохраняются вместе со ссылкой на Discord в этом файле." + +#: tickettool\tickettool.py:1019 +#, docstring +msgid "Open an existing Ticket." +msgstr "Откройте существующий тикет." + +#: tickettool\tickettool.py:1024 +msgid "The ticket system is not enabled on this server." +msgstr "Билетная система не включена на этом сервере." + +#: tickettool\tickettool.py:1050 +#, docstring +msgid "Close an existing Ticket." +msgstr "Закрыть существующий билет." + +#: tickettool\tickettool.py:1061 +msgid "Do you really want to close the ticket {ticket.id}?" +msgstr "Вы действительно хотите закрыть билет {ticket.id}?" + +#: tickettool\tickettool.py:1097 +#, docstring +msgid "Lock an existing Ticket." +msgstr "Заблокировать существующий билет." + +#: tickettool\tickettool.py:1104 +msgid "Do you really want to lock the ticket {ticket.id}?" +msgstr "Вы действительно хотите заблокировать билет {ticket.id}?" + +#: tickettool\tickettool.py:1139 +#, docstring +msgid "Unlock an existing locked Ticket." +msgstr "Разблокируйте существующий заблокированный билет." + +#: tickettool\tickettool.py:1167 +#, docstring +msgid "Rename an existing Ticket." +msgstr "Переименование существующего билета." + +#: tickettool\tickettool.py:1193 +#, docstring +msgid "Delete an existing Ticket.\n\n" +" If a logs channel is defined, an html file containing all the messages of this ticket will be generated.\n" +" (Attachments are not supported, as they are saved with their Discord link)\n" +" " +msgstr "Удаление существующего тикета.\n\n" +" Если определен канал журналов, будет создан html-файл, содержащий все сообщения этого тикета.\n" +" (Вложения не поддерживаются, так как они сохраняются вместе со своей ссылкой в Discord)\n" +" " + +#: tickettool\tickettool.py:1202 +msgid "Do you really want to delete all the messages of the ticket {ticket.id}?" +msgstr "Вы действительно хотите удалить все сообщения билета {ticket.id}?" + +#: tickettool\tickettool.py:1206 +msgid "If a logs channel is defined, an html file containing all the messages of this ticket will be generated. (Attachments are not supported, as they are saved with their Discord link.)" +msgstr "Если определен канал логов, будет создан html-файл, содержащий все сообщения этого тикета. (Вложения не поддерживаются, так как они сохраняются вместе со ссылкой на Discord.)" + +#: tickettool\tickettool.py:1242 +#, docstring +msgid "Claim an existing Ticket." +msgstr "Утвердить существующий билет." + +#: tickettool\tickettool.py:1266 +#, docstring +msgid "Unclaim an existing Ticket." +msgstr "Отменить существующий билет." + +#: tickettool\tickettool.py:1292 +#, docstring +msgid "Change the owner of an existing Ticket." +msgstr "Изменение владельца существующего билета." + +#: tickettool\tickettool.py:1318 +#, docstring +msgid "Add a member to an existing Ticket." +msgstr "Добавьте участника к существующему билету." + +#: tickettool\tickettool.py:1343 +#, docstring +msgid "Remove a member to an existing Ticket." +msgstr "Удаление участника из существующего билета." + +#: tickettool\tickettool.py:1357 +#, docstring +msgid "List the existing Tickets for a profile. You can provide a status and/or a ticket owner." +msgstr "Список существующих билетов для профиля. Вы можете указать статус и/или владельца тикета." + +#: tickettool\tickettool.py:1378 +msgid "No tickets to show." +msgstr "Билетов на представление нет." + +#: tickettool\tickettool.py:1419 +msgid "The profile for which this button was configured no longer exists." +msgstr "Профиль, для которого была настроена эта кнопка, больше не существует." + +#: tickettool\tickettool.py:1482 tickettool\tickettool.py:1541 +#: tickettool\tickettool.py:1545 tickettool\tickettool.py:1563 +#: tickettool\tickettool.py:1567 tickettool\tickettool.py:1587 +#: tickettool\tickettool.py:1591 tickettool\tickettool.py:1661 +#: tickettool\tickettool.py:1665 +msgid "You are not allowed to execute this command." +msgstr "Вам не разрешено выполнять эту команду." + +#: tickettool\tickettool.py:1486 tickettool\tickettool.py:1491 +#: tickettool\tickettool.py:1495 +msgid "You have chosen to create a ticket." +msgstr "Вы решили создать билет." + +#: tickettool\tickettool.py:1517 +msgid "You have chosen to close this ticket. If this is not done, you do not have the necessary permissions to execute this command." +msgstr "Вы решили закрыть этот билет. Если это не сделано, у вас нет необходимых разрешений для выполнения этой команды." + +#: tickettool\tickettool.py:1549 +msgid "You have chosen to re-open this ticket." +msgstr "Вы решили повторно открыть этот билет." + +#: tickettool\tickettool.py:1571 +msgid "You have chosen to claim this ticket. If this is not done, you do not have the necessary permissions to execute this command." +msgstr "Вы решили заявить об этом билете. Если это не сделано, у вас нет необходимых разрешений для выполнения этой команды." + +#: tickettool\tickettool.py:1611 +msgid "This message is not in TicketTool config." +msgstr "Это сообщение отсутствует в конфигурации TicketTool." + +#: tickettool\tickettool.py:1620 +msgid "The profile for which this dropdown was configured no longer exists." +msgstr "Профиль, для которого был настроен этот выпадающий список, больше не существует." + +#: tickettool\tickettool.py:1687 tickettool\tickettool.py:1694 +msgid "You have chosen to create a ticket with the reason `{reason}`." +msgstr "Вы решили создать билет с причиной `{reason}`." + +#: tickettool\tickettool.py:1840 +msgid "No open tickets by this user in this server." +msgstr "На данном сервере нет открытых билетов этого пользователя." + +#: tickettool\utils.py:143 +msgid "Emoji Label must be An emoji followed by a label, and optionnaly by a description and a value (for rename ticket channel), separated by either `;`, `,`, `|`, or `-`." +msgstr "Emoji Label должен представлять собой эмодзи, за которым следует метка, а также, возможно, описание и значение (для переименования канала), разделенные либо `;`, `,`, `|`, либо `-`." + +#: tickettool\utils.py:160 +msgid "Error parsing YAML. Please make sure the format is valid (a YAML validator may help)" +msgstr "Ошибка при разборе YAML. Убедитесь, что формат корректен (может помочь валидатор YAML)." + +#: tickettool\utils.py:174 +msgid "You can only have 5 text inputs." +msgstr "У вас может быть только 5 текстовых входов." + +#: tickettool\utils.py:180 +msgid "The argument `/{count}/{arg}` is required in the YAML." +msgstr "Аргумент `/{count}/{arg}` является обязательным в YAML." + +#: tickettool\utils.py:187 +msgid "The argument `/{count}/{arg}` is invalid in the YAML. Check the spelling." +msgstr "Аргумент `/{count}/{arg}` недопустим в YAML. Проверьте написание." + +#: tickettool\utils.py:193 +msgid "The argument `/modal/{count}/label` must be less than 45 characters long." +msgstr "Аргумент `/modal/{count}/label` должен содержать менее 45 символов." + +#: tickettool\utils.py:203 tickettool\utils.py:209 +msgid "The argument `/{count}/style` must be a number between 1 and 2." +msgstr "Аргумент `/{count}/style` должен быть числом между 1 и 2." + +#: tickettool\utils.py:232 +msgid "The argument `/{count}/required` must be a boolean (True or False)." +msgstr "Аргумент `/{count}/required` должен быть булевым (True или False)." + +#: tickettool\utils.py:242 +msgid "The argument `/modal/{count}/default` must be less than 4000 characters long." +msgstr "Аргумент `/modal/{count}/default` должен содержать менее 4000 символов." + +#: tickettool\utils.py:250 +msgid "The argument `/modal/{count}/placeholder` must be less than 100 characters long." +msgstr "Аргумент `/modal/{count}/placeholder` должен содержать менее 100 символов." + +#: tickettool\utils.py:258 +msgid "The argument `/modal/{count}/min_length` must be between 0 and 4000." +msgstr "Аргумент `/modal/{count}/min_length` должен находиться в диапазоне от 0 до 4000." + +#: tickettool\utils.py:266 +msgid "The argument `/modal/{count}/max_length` must be between 0 and 4000." +msgstr "Аргумент `/modal/{count}/max_length` должен находиться в диапазоне от 0 до 4000." + diff --git a/tickettool/locales/tr-TR.po b/tickettool/locales/tr-TR.po new file mode 100644 index 0000000..b2ea8c3 --- /dev/null +++ b/tickettool/locales/tr-TR.po @@ -0,0 +1,584 @@ +msgid "" +msgstr "" +"Project-Id-Version: aaa3a-cogs\n" +"POT-Creation-Date: 2024-07-20 22:15+0200\n" +"PO-Revision-Date: 2024-07-21 13:27\n" +"Last-Translator: \n" +"Language-Team: Turkish\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: redgettext 3.4.2\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Crowdin-Project: aaa3a-cogs\n" +"X-Crowdin-Project-ID: 531090\n" +"X-Crowdin-Language: tr\n" +"X-Crowdin-File: /[AAA3A-AAA3A.AAA3A-cogs] main/tickettool/locales/messages.pot\n" +"X-Crowdin-File-ID: 102\n" +"Language: tr_TR\n" + +#: tickettool\settings.py:15 tickettool\settings.py:18 +#: tickettool\tickettool.py:759 tickettool\tickettool.py:762 +msgid "This profile does not exist." +msgstr "Bu profil mevcut değil." + +#: tickettool\settings.py:27 +msgid "I have to be the author of the message. You can use EmbedUtils by AAA3A to send one." +msgstr "Mesajın yazarı ben olmalıyım. Bir tane göndermek için AAA3A tarafından sağlanan EmbedUtils'i kullanabilirsiniz." + +#: tickettool\settings.py:54 +#, docstring +msgid "Send a message with a button to open a ticket or dropdown with possible reasons.\n\n" +" Examples:\n" +" - `[p]settickettool message #general \"🐛|Report a bug|If you find a bug, report it here.|bug\" \"⚠️|Report a user|If you find a malicious user, report it here.|user\"`\n" +" - `[p]settickettool 1234567890-0987654321`\n" +" " +msgstr "Bir bilet açmak için bir buton veya olası nedenlerle bir açılır menü içeren bir mesaj gönderin.\n\n" +" Örnekler:\n" +" - `[p]settickettool message #general \"🐛|Bir hatayı bildir|Bir hata bulursanız, burada bildirin.|bug\" \"⚠️|Bir kullanıcıyı bildir|Kötü niyetli bir kullanıcı bulursanız, burada bildirin.|user\"`\n" +" - `[p]settickettool 1234567890-0987654321`\n" +" " + +#: tickettool\settings.py:70 +msgid "I don't have sufficient permissions in this channel to view it and to send messages into." +msgstr "Bu kanalda mesajları görüntülemek ve göndermek için yeterli iznim yok." + +#: tickettool\settings.py:97 tickettool\tickettool.py:339 +msgid "Create ticket" +msgstr "Bilet oluştur" + +#: tickettool\settings.py:116 +msgid "A different value must be provided for each dropdown option." +msgstr "Her açılır menü seçeneği için farklı bir değer sağlanmalıdır." + +#: tickettool\settings.py:124 +msgid "An emoji you selected seems invalid. Check that it is an emoji. If you have Nitro, you may have used a custom emoji from another server." +msgstr "Seçtiğin emojilerden biri geçersiz görünüyor. Bir emoji olduğundan emin olun. Eğer Nitron varsa başka bir sunucudan özel bir emoji kullanmış olabilirsiniz." + +#: tickettool\ticket.py:245 +msgid "Creating the ticket {ticket.id}." +msgstr "Bilet {ticket.id} oluşturuluyor." + +#: tickettool\ticket.py:266 +msgid "The dynamic channel name does not contain correct variable names and must be re-configured with `[p]settickettool dynamicchannelname`." +msgstr "Dinamik kanal adı doğru değişken adları içermiyor ve `[p]settickettool dynamicchannelname` ile yeniden yapılandırılmalıdır." + +#: tickettool\ticket.py:275 tickettool\ticket.py:528 tickettool\ticket.py:890 +#: tickettool\ticket.py:969 tickettool\tickettool.py:352 +msgid "Close" +msgstr "Kapat" + +#: tickettool\ticket.py:282 tickettool\ticket.py:535 tickettool\ticket.py:615 +#: tickettool\ticket.py:897 tickettool\ticket.py:976 +#: tickettool\tickettool.py:366 +msgid "Claim" +msgstr "Sahiplen" + +#: tickettool\ticket.py:289 tickettool\ticket.py:542 tickettool\ticket.py:622 +#: tickettool\ticket.py:904 tickettool\ticket.py:983 +#: tickettool\tickettool.py:373 +msgid "Delete" +msgstr "Sil" + +#: tickettool\ticket.py:303 tickettool\ticket.py:429 +msgid "Ticket Created" +msgstr "Bilet Oluşturuldu" + +#: tickettool\ticket.py:304 +msgid "Thank you for creating a ticket on this server!" +msgstr "Bu sunucuda bir bilet oluşturduğunuz için teşekkürler!" + +#: tickettool\ticket.py:315 +msgid "🎟️ Ticket ID: {ticket.id}\n" +"🕵️ Ticket created by: @{ticket.created_by.display_name} ({ticket.created_by.id})\n" +"☢️ Ticket reason: {short_reason}\n" +msgstr "🎟️ Bilet ID: {ticket.id}\n" +"🕵️ Bileti oluşturan: @{ticket.created_by.display_name} ({ticket.created_by.id})\n" +"☢️ Bilet nedeni: {short_reason}\n" + +#: tickettool\ticket.py:395 +msgid "⚠ At least one user (the ticket owner or a team member) could not be added to the ticket thread. Maybe the user doesn't have access to the parent forum/text channel. If the server uses private threads in a text channel, the bot does not have the `manage_messages` permission in this channel." +msgstr "⚠ En az bir kullanıcı (bilet sahibi veya bir ekip üyesi) bilet konusuna eklenemedi. Belki de kullanıcı ana forum/mesaj kanalına erişim hakkına sahip değil. Sunucu, bir mesaj kanalında özel konuları kullanıyorsa, bot bu kanalda `manage_messages` iznine sahip değildir." + +#: tickettool\ticket.py:430 +msgid "The ticket was created by {ticket.created_by}." +msgstr "Bilet {ticket.created_by} tarafından oluşturuldu." + +#: tickettool\ticket.py:436 +msgid "Report on the creation of the ticket {ticket.id}." +msgstr "Bilet {ticket.id} oluşturulmasına ilişkin rapor." + +#: tickettool\ticket.py:476 +msgid "Opening the ticket {ticket.id}." +msgstr "Bilet {ticket.id} açılıyor." + +#: tickettool\ticket.py:505 tickettool\ticket.py:513 +msgid "Ticket Opened" +msgstr "Bilet Açıldı" + +#: tickettool\ticket.py:514 +msgid "The ticket was opened by {ticket.opened_by}." +msgstr "Bilet {ticket.opened_by} tarafından açıldı." + +#: tickettool\ticket.py:520 tickettool\ticket.py:600 +msgid "Report on the close of the ticket {ticket.id}." +msgstr "Bilet {ticket.id} kapanmasına ilişkin rapor." + +#: tickettool\ticket.py:608 tickettool\tickettool.py:359 +msgid "Re-open" +msgstr "Yeniden aç" + +#: tickettool\ticket.py:675 tickettool\ticket.py:712 +#: tickettool\tickettool.py:1100 tickettool\tickettool.py:1142 +msgid "Cannot execute action on a text channel." +msgstr "Bir metin kanalında işlem gerçekleştirilemiyor." + +#: tickettool\ticket.py:701 +msgid "Report on the lock of the ticket {ticket.id}." +msgstr "Bilet {ticket.id} kilitlenmesine ilişkin rapor." + +#: tickettool\ticket.py:738 +msgid "Report on the unlock of the ticket {ticket.id}." +msgstr "Bilet {ticket.id} kilidinin açılmasına ilişkin rapor." + +#: tickettool\ticket.py:755 +msgid "Renaming the ticket {ticket.id}. (`{ticket.channel.name}` to `{new_name}`)" +msgstr "Bilet {ticket.id} yeniden adlandırılıyor. (`{ticket.channel.name}` 'dan `{new_name}` 'ye)" + +#: tickettool\ticket.py:765 +msgid "Ticket Renamed." +msgstr "Bilet Yeniden Adlandırıldı." + +#: tickettool\ticket.py:783 +msgid "Ticket Deleted" +msgstr "Bilet Silindi" + +#: tickettool\ticket.py:784 +msgid "The ticket was deleted by {ticket.deleted_by}." +msgstr "Bilet {ticket.deleted_by} tarafından silindi." + +#: tickettool\ticket.py:807 +msgid "Report on the deletion of the ticket {ticket.id}." +msgstr "Bilet {ticket.id} silinmesine ilişkin rapor." + +#: tickettool\ticket.py:824 +msgid "Deleting the ticket {ticket.id}." +msgstr "Bilet {ticket.id} siliniyor." + +#: tickettool\ticket.py:845 +msgid "A ticket cannot be claimed if it is closed." +msgstr "Bir bilet kapalıysa sahiplenilemez." + +#: tickettool\ticket.py:849 +msgid "A bot cannot claim a ticket." +msgstr "Bir bot bileti sahiplenemez." + +#: tickettool\ticket.py:863 +msgid "Claiming the ticket {ticket.id}." +msgstr "Bilet {ticket.id} sahipleniliyor." + +#: tickettool\ticket.py:918 +msgid "Ticket claimed." +msgstr "Bilet sahiplenildi." + +#: tickettool\ticket.py:932 +msgid "A ticket cannot be unclaimed if it is closed." +msgstr "Bir bilet kapalıysa sahiplenme geri alınamaz." + +#: tickettool\ticket.py:948 +msgid "Unclaiming the ticket {ticket.id}." +msgstr "Bilet {ticket.id} sahiplenmesi geri alınıyor." + +#: tickettool\ticket.py:997 +msgid "Ticket unclaimed." +msgstr "Bilet sahiplenmesi geri alındı." + +#: tickettool\ticket.py:1011 +msgid "Cannot execute action in a thread channel." +msgstr "Bir konu kanalında işlem gerçekleştirilemiyor." + +#: tickettool\ticket.py:1018 +msgid "Changing owner of the ticket {ticket.id}." +msgstr "Bilet {ticket.id} sahipliği değiştiriliyor." + +#: tickettool\ticket.py:1022 +msgid "You cannot transfer ownership of a ticket to a bot." +msgstr "Bir bot'a bilet sahipliği devredemezsiniz." + +#: tickettool\ticket.py:1051 +msgid "Owner Modified." +msgstr "Sahip Değiştirildi." + +#: tickettool\ticket.py:1070 +msgid "Adding a member to the ticket {ticket.id}." +msgstr "Bilet {ticket.id} 'e bir üye ekleniyor." + +#: tickettool\ticket.py:1077 tickettool\ticket.py:1114 +msgid "You cannot add a bot to a ticket. ({member})" +msgstr "Bir bot'u bilete ekleyemezsiniz. ({member})" + +#: tickettool\ticket.py:1081 tickettool\ticket.py:1118 +msgid "This member is already the owner of this ticket. ({member})" +msgstr "Bu üye zaten bu biletin sahibi. ({member})" + +#: tickettool\ticket.py:1087 tickettool\ticket.py:1124 +msgid "This member is an administrator for the tickets system. They will always have access to the ticket anyway. ({member})" +msgstr "Bu üye bilet sistemi için bir yöneticidir. Her ne olursa olsun bilet erişimine her zaman sahip olacaklar. ({member})" + +#: tickettool\ticket.py:1093 tickettool\ticket.py:1130 +msgid "This member already has access to this ticket. ({member})" +msgstr "Bu üye zaten bu bilete erişim hakkına sahip. ({member})" + +#: tickettool\ticket.py:1144 +msgid "⚠ At least one user (the ticket owner or a team member) could not be added to the ticket thread. Maybe the user the user doesn't have access to the parent forum/text channel. If the server uses private threads in a text channel, the bot does not have the `manage_messages` permission in this channel." +msgstr "⚠ En az bir kullanıcı (bilet sahibi veya bir ekip üyesi) bilet konusuna eklenemedi. Belki de kullanıcı ana forum/metin kanalına erişim hakkına sahip değil. Sunucu, bir metin kanalında özel konuları kullanıyorsa, bot bu kanalda `manage_messages` iznine sahip değildir." + +#: tickettool\ticket.py:1168 +msgid "Removing a member to the ticket {ticket.id}." +msgstr "Bilet {ticket.id} 'den bir üye çıkarılıyor." + +#: tickettool\ticket.py:1174 tickettool\ticket.py:1204 +msgid "You cannot remove a bot to a ticket ({member})." +msgstr "Bir bot'u biletten çıkaramazsınız ({member})." + +#: tickettool\ticket.py:1180 tickettool\ticket.py:1210 +msgid "You cannot remove the owner of this ticket. ({member})" +msgstr "Bu biletin sahibini çıkaramazsınız. ({member})" + +#: tickettool\ticket.py:1186 tickettool\ticket.py:1216 +msgid "This member is an administrator for the tickets system. They will always have access to the ticket. ({member})" +msgstr "Bu üye bilet sistemi için bir yöneticidir. Her zaman bilete erişim hakkına sahip olacak. ({member})" + +#: tickettool\ticket.py:1192 tickettool\ticket.py:1222 +msgid "This member is not in the list of those authorised to access the ticket. ({member})" +msgstr "Bu üye, bilete erişim izni olanlar listesinde değil. ({member})" + +#: tickettool\tickettool.py:32 +#, docstring +msgid "A cog to manage a tickets system!" +msgstr "Bir bilet sistemi yönetmek için bir cog!" + +#: tickettool\tickettool.py:74 +msgid "To get help on this server or to make an order for example, you can create a ticket.\n" +"Just use the command `{prefix}ticket create` or click on the button below.\n" +"You can then use the `{prefix}ticket` subcommands to manage your ticket." +msgstr "Bu sunucuda yardım almak veya örneğin bir sipariş vermek için bir bilet oluşturabilirsiniz.\n" +"Sadece `{prefix}ticket create` komutunu kullanın veya aşağıdaki düğmeye tıklayın.\n" +"Ardından biletinizi yönetmek için `{prefix}ticket` alt komutlarını kullanabilirsiniz." + +#: tickettool\tickettool.py:403 +msgid "Choose the reason for open a ticket." +msgstr "Bir bilet açma nedenini seçin." + +#: tickettool\tickettool.py:521 +msgid "Action taken for the ticket system." +msgstr "Bilet sistemi için alınan eylem." + +#: tickettool\tickettool.py:555 +msgid "Ticket ID:" +msgstr "Bilet ID:" + +#: tickettool\tickettool.py:558 +msgid "Owned by:" +msgstr "Sahibi:" + +#: tickettool\tickettool.py:566 +msgid "Channel:" +msgstr "Kanal:" + +#: tickettool\tickettool.py:573 +msgid "Closed by:" +msgstr "Kapatan:" + +#: tickettool\tickettool.py:581 +msgid "Deleted by:" +msgstr "Silen:" + +#: tickettool\tickettool.py:589 +msgid "Closed at:" +msgstr "Kapatıldığı zaman:" + +#: tickettool\tickettool.py:596 tickettool\tickettool.py:622 +msgid "Reason:" +msgstr "Neden:" + +#: tickettool\tickettool.py:607 +msgid "Ticket [{ticket.profile}] {ticket.id} - Action taken" +msgstr "Bilet [{ticket.profile}] {ticket.id} - Alınan eylem" + +#: tickettool\tickettool.py:687 +msgid "You're not in a ticket." +msgstr "Bir bilette değilsiniz." + +#: tickettool\tickettool.py:691 +msgid "This ticket isn't {status}ed." +msgstr "Bu bilet {status}ed değil." + +#: tickettool\tickettool.py:700 +msgid "This ticket is {status}." +msgstr "Bu bilet {status}." + +#: tickettool\tickettool.py:709 +msgid "You're not allowed to lock this ticket." +msgstr "Bu bileti kilitlemeye yetkiniz yok." + +#: tickettool\tickettool.py:752 +msgid "You're not allowed to view this ticket." +msgstr "Bu bileti görüntülemeye yetkiniz yok." + +#: tickettool\tickettool.py:786 +msgid "Please provide a profile." +msgstr "Lütfen bir profil belirtin." + +#: tickettool\tickettool.py:789 +msgid "No profile has been created on this server." +msgstr "Bu sunucuda profil oluşturulmamış." + +#: tickettool\tickettool.py:797 +msgid "The ticket system is not enabled on this server. Please ask an administrator of this server to use the `{ctx.prefix}settickettool` subcommands to configure it." +msgstr "Bilet sistemi bu sunucuda etkin değil. Lütfen bu sunucunun bir yöneticisinden `{ctx.prefix}settickettool` alt komutlarını kullanarak yapılandırmasını isteyin." + +#: tickettool\tickettool.py:803 +msgid "The category `open` or the category `close` have not been configured. Please ask an administrator of this server to use the `{ctx.prefix}settickettool` subcommands to configure it." +msgstr "`open` kategorisi veya `close` kategorisi yapılandırılmamış. Lütfen bu sunucunun bir yöneticisinden `{ctx.prefix}settickettool` alt komutlarını kullanarak yapılandırmasını isteyin." + +#: tickettool\tickettool.py:810 +msgid "Sorry. You have already reached the limit of {limit} open tickets." +msgstr "Üzgünüm. Zaten {limit} açık bilet sınırına ulaştınız." + +#: tickettool\tickettool.py:821 +msgid "The bot does not have `manage_channels` permission on the `open` and `close` categories to allow the ticket system to function properly. Please notify an administrator of this server." +msgstr "Bot, bilet sisteminin düzgün çalışabilmesi için `open` ve `close` kategorilerinde `manage_channels` iznine sahip değil. Lütfen bu sunucunun bir yöneticisine bildirin." + +#: tickettool\tickettool.py:830 +msgid "The bot does not have `manage_channel` permission in the forum channel to allow the ticket system to function properly. Please notify an administrator of this server." +msgstr "Bot, bilet sisteminin düzgün çalışabilmesi için forum kanalında `manage_channel` iznine sahip değil. Lütfen bu sunucunun bir yöneticisine bildirin." + +#: tickettool\tickettool.py:875 +msgid "Please provide the required informations by clicking on the button below." +msgstr "Lütfen aşağıdaki düğmeye tıklayarak gerekli bilgileri sağlayın." + +#: tickettool\tickettool.py:926 +#, docstring +msgid "Create a Ticket.\n\n" +" If only one profile has been created on this server, you don't need to specify its name.\n" +" " +msgstr "Bir Bilet oluşturun.\n\n" +" Bu sunucuda yalnızca bir profil oluşturulmuşsa, adını belirtmenize gerek yoktur.\n" +" " + +#: tickettool\tickettool.py:942 +#, docstring +msgid "Create a Ticket for a member.\n\n" +" If only one profile has been created on this server, you don't need to specify its name.\n" +" " +msgstr "Bir üye için bir Bilet oluşturun.\n\n" +" Bu sunucuda yalnızca bir profil oluşturulmuşsa, adını belirtmenize gerek yoktur.\n" +" " + +#: tickettool\tickettool.py:947 +msgid "You cannot create a ticket for a bot." +msgstr "Bir bot için bilet oluşturamazsınız." + +#: tickettool\tickettool.py:950 +msgid "You cannot create a ticket for a member with a higher or equal role." +msgstr "Daha yüksek veya eşit role sahip bir üye için bilet oluşturamazsınız." + +#: tickettool\tickettool.py:970 +#, docstring +msgid "Export all the messages of an existing Ticket in html format.\n" +" Please note: all attachments and user avatars are saved with the Discord link in this file.\n" +" " +msgstr "Mevcut bir Biletin tüm mesajlarını html formatında dışa aktarın.\n" +" Lütfen unutmayın: tüm ekler ve kullanıcı avatarları bu dosyada Discord bağlantısıyla kaydedilir.\n" +" " + +#: tickettool\tickettool.py:987 +msgid "Here is the html file of the transcript of all the messages in this ticket.\n" +"Please note: all attachments and user avatars are saved with the Discord link in this file." +msgstr "Bu bilete ait tüm mesajların transkriptinin html dosyası burada.\n" +"Lütfen unutmayın: tüm ekler ve kullanıcı avatarları bu dosyada Discord bağlantısıyla kaydedilir." + +#: tickettool\tickettool.py:1019 +#, docstring +msgid "Open an existing Ticket." +msgstr "Mevcut bir Bileti açın." + +#: tickettool\tickettool.py:1024 +msgid "The ticket system is not enabled on this server." +msgstr "Bilet sistemi bu sunucuda etkin değil." + +#: tickettool\tickettool.py:1050 +#, docstring +msgid "Close an existing Ticket." +msgstr "Mevcut bir Bileti kapatın." + +#: tickettool\tickettool.py:1061 +msgid "Do you really want to close the ticket {ticket.id}?" +msgstr "Bileti {ticket.id} gerçekten kapatmak istiyor musunuz?" + +#: tickettool\tickettool.py:1097 +#, docstring +msgid "Lock an existing Ticket." +msgstr "Mevcut bir Bileti kilitleyin." + +#: tickettool\tickettool.py:1104 +msgid "Do you really want to lock the ticket {ticket.id}?" +msgstr "Bileti {ticket.id} gerçekten kilitlemek istiyor musunuz?" + +#: tickettool\tickettool.py:1139 +#, docstring +msgid "Unlock an existing locked Ticket." +msgstr "Mevcut kilitli bir Bileti kilidini açın." + +#: tickettool\tickettool.py:1167 +#, docstring +msgid "Rename an existing Ticket." +msgstr "Mevcut bir Bileti yeniden adlandırın." + +#: tickettool\tickettool.py:1193 +#, docstring +msgid "Delete an existing Ticket.\n\n" +" If a logs channel is defined, an html file containing all the messages of this ticket will be generated.\n" +" (Attachments are not supported, as they are saved with their Discord link)\n" +" " +msgstr "Mevcut bir Bileti silin.\n\n" +" Bir kayıt kanalı tanımlanmışsa, bu biletin tüm mesajlarını içeren bir html dosyası oluşturulacaktır.\n" +" (Ekler desteklenmez, çünkü Discord bağlantısıyla kaydedilirler)\n" +" " + +#: tickettool\tickettool.py:1202 +msgid "Do you really want to delete all the messages of the ticket {ticket.id}?" +msgstr "Bilet {ticket.id} 'nin tüm mesajlarını gerçekten silmek istiyor musunuz?" + +#: tickettool\tickettool.py:1206 +msgid "If a logs channel is defined, an html file containing all the messages of this ticket will be generated. (Attachments are not supported, as they are saved with their Discord link.)" +msgstr "Bir kayıt kanalı tanımlanmışsa, bu biletin tüm mesajlarını içeren bir html dosyası oluşturulacaktır. (Ekler desteklenmez, çünkü Discord bağlantısıyla kaydedilirler.)" + +#: tickettool\tickettool.py:1242 +#, docstring +msgid "Claim an existing Ticket." +msgstr "Mevcut bir Bileti sahiplenin." + +#: tickettool\tickettool.py:1266 +#, docstring +msgid "Unclaim an existing Ticket." +msgstr "Mevcut bir Bileti sahiplenmekten vazgeçin." + +#: tickettool\tickettool.py:1292 +#, docstring +msgid "Change the owner of an existing Ticket." +msgstr "Mevcut bir Biletin sahibini değiştirin." + +#: tickettool\tickettool.py:1318 +#, docstring +msgid "Add a member to an existing Ticket." +msgstr "Mevcut bir Bilete bir üye ekleyin." + +#: tickettool\tickettool.py:1343 +#, docstring +msgid "Remove a member to an existing Ticket." +msgstr "Mevcut bir Biletten bir üye çıkarın." + +#: tickettool\tickettool.py:1357 +#, docstring +msgid "List the existing Tickets for a profile. You can provide a status and/or a ticket owner." +msgstr "Bir profil için mevcut Biletleri listeleyin. Bir durum ve/veya bir bilet sahibi belirtebilirsiniz." + +#: tickettool\tickettool.py:1378 +msgid "No tickets to show." +msgstr "Gösterilecek bilet yok." + +#: tickettool\tickettool.py:1419 +msgid "The profile for which this button was configured no longer exists." +msgstr "Bu düğmenin yapılandırıldığı profil artık mevcut değil." + +#: tickettool\tickettool.py:1482 tickettool\tickettool.py:1541 +#: tickettool\tickettool.py:1545 tickettool\tickettool.py:1563 +#: tickettool\tickettool.py:1567 tickettool\tickettool.py:1587 +#: tickettool\tickettool.py:1591 tickettool\tickettool.py:1661 +#: tickettool\tickettool.py:1665 +msgid "You are not allowed to execute this command." +msgstr "Bu komutu yürütme yetkiniz yok." + +#: tickettool\tickettool.py:1486 tickettool\tickettool.py:1491 +#: tickettool\tickettool.py:1495 +msgid "You have chosen to create a ticket." +msgstr "Bir bilet oluşturmayı seçtiniz." + +#: tickettool\tickettool.py:1517 +msgid "You have chosen to close this ticket. If this is not done, you do not have the necessary permissions to execute this command." +msgstr "Bu bileti kapatmayı seçtiniz. Bu yapılmazsa, bu komutu yürütmek için gerekli izinlere sahip değilsiniz." + +#: tickettool\tickettool.py:1549 +msgid "You have chosen to re-open this ticket." +msgstr "Bu bileti yeniden açmayı seçtiniz." + +#: tickettool\tickettool.py:1571 +msgid "You have chosen to claim this ticket. If this is not done, you do not have the necessary permissions to execute this command." +msgstr "Bu bileti sahiplenmeyi seçtiniz. Bu yapılmazsa, bu komutu yürütmek için gerekli izinlere sahip değilsiniz." + +#: tickettool\tickettool.py:1611 +msgid "This message is not in TicketTool config." +msgstr "Bu mesaj TicketTool yapılandırmasında değil." + +#: tickettool\tickettool.py:1620 +msgid "The profile for which this dropdown was configured no longer exists." +msgstr "Bu açılır menünün yapılandırıldığı profil artık mevcut değil." + +#: tickettool\tickettool.py:1687 tickettool\tickettool.py:1694 +msgid "You have chosen to create a ticket with the reason `{reason}`." +msgstr "{reason}` nedeni ile bir bilet oluşturmayı seçtiniz." + +#: tickettool\tickettool.py:1840 +msgid "No open tickets by this user in this server." +msgstr "Bu sunucuda bu kullanıcı tarafından açık bilet yok." + +#: tickettool\utils.py:143 +msgid "Emoji Label must be An emoji followed by a label, and optionnaly by a description and a value (for rename ticket channel), separated by either `;`, `,`, `|`, or `-`." +msgstr "Emoji Etiketi bir emoji ve ardından bir etiket ve isteğe bağlı olarak bir açıklama ve bir değer (bilet kanalını yeniden adlandırmak için) içermelidir, bunlar `;`, `,`, `|` veya `-` ile ayrılmalıdır." + +#: tickettool\utils.py:160 +msgid "Error parsing YAML. Please make sure the format is valid (a YAML validator may help)" +msgstr "YAML ayrıştırma hatası. Lütfen formatın geçerli olduğundan emin olun (bir YAML doğrulayıcı yardımcı olabilir)" + +#: tickettool\utils.py:174 +msgid "You can only have 5 text inputs." +msgstr "Yalnızca 5 metin girişi yapabilirsiniz." + +#: tickettool\utils.py:180 +msgid "The argument `/{count}/{arg}` is required in the YAML." +msgstr "YAML'de `/{count}/{arg}` argümanı gereklidir." + +#: tickettool\utils.py:187 +msgid "The argument `/{count}/{arg}` is invalid in the YAML. Check the spelling." +msgstr "YAML'de `/{count}/{arg}` argümanı geçersiz. Yazımı kontrol edin." + +#: tickettool\utils.py:193 +msgid "The argument `/modal/{count}/label` must be less than 45 characters long." +msgstr "`/modal/{count}/label` argümanı 45 karakterden kısa olmalıdır." + +#: tickettool\utils.py:203 tickettool\utils.py:209 +msgid "The argument `/{count}/style` must be a number between 1 and 2." +msgstr "`/{count}/style` argümanı 1 ile 2 arasında bir sayı olmalıdır." + +#: tickettool\utils.py:232 +msgid "The argument `/{count}/required` must be a boolean (True or False)." +msgstr "`/{count}/required` argümanı bir boolean (Doğru veya Yanlış) olmalıdır." + +#: tickettool\utils.py:242 +msgid "The argument `/modal/{count}/default` must be less than 4000 characters long." +msgstr "`/modal/{count}/default` argümanı 4000 karakterden kısa olmalıdır." + +#: tickettool\utils.py:250 +msgid "The argument `/modal/{count}/placeholder` must be less than 100 characters long." +msgstr "`/modal/{count}/placeholder` argümanı 100 karakterden kısa olmalıdır." + +#: tickettool\utils.py:258 +msgid "The argument `/modal/{count}/min_length` must be between 0 and 4000." +msgstr "`/modal/{count}/min_length` argümanı 0 ile 4000 arasında olmalıdır." + +#: tickettool\utils.py:266 +msgid "The argument `/modal/{count}/max_length` must be between 0 and 4000." +msgstr "`/modal/{count}/max_length` argümanı 0 ile 4000 arasında olmalıdır." + diff --git a/tickettool/locales/uk-UA.po b/tickettool/locales/uk-UA.po new file mode 100644 index 0000000..9ca4c14 --- /dev/null +++ b/tickettool/locales/uk-UA.po @@ -0,0 +1,584 @@ +msgid "" +msgstr "" +"Project-Id-Version: aaa3a-cogs\n" +"POT-Creation-Date: 2024-07-20 22:15+0200\n" +"PO-Revision-Date: 2024-07-21 15:13\n" +"Last-Translator: \n" +"Language-Team: Ukrainian\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: redgettext 3.4.2\n" +"Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n" +"X-Crowdin-Project: aaa3a-cogs\n" +"X-Crowdin-Project-ID: 531090\n" +"X-Crowdin-Language: uk\n" +"X-Crowdin-File: /[AAA3A-AAA3A.AAA3A-cogs] main/tickettool/locales/messages.pot\n" +"X-Crowdin-File-ID: 102\n" +"Language: uk_UA\n" + +#: tickettool\settings.py:15 tickettool\settings.py:18 +#: tickettool\tickettool.py:759 tickettool\tickettool.py:762 +msgid "This profile does not exist." +msgstr "Такого профілю не існує." + +#: tickettool\settings.py:27 +msgid "I have to be the author of the message. You can use EmbedUtils by AAA3A to send one." +msgstr "Я маю бути автором повідомлення. Ви можете скористатися EmbedUtils від AAA3A, щоб надіслати його." + +#: tickettool\settings.py:54 +#, docstring +msgid "Send a message with a button to open a ticket or dropdown with possible reasons.\n\n" +" Examples:\n" +" - `[p]settickettool message #general \"🐛|Report a bug|If you find a bug, report it here.|bug\" \"⚠️|Report a user|If you find a malicious user, report it here.|user\"`\n" +" - `[p]settickettool 1234567890-0987654321`\n" +" " +msgstr "Надішліть повідомлення з кнопкою для відкриття тікета або випадаючим списком з можливими причинами.\n\n" +" Приклади:\n" +" - `[p]settickettool message #general \"🐛|Повідомити про помилку|Якщо ви знайшли помилку, повідомте про неї тут.|bug\" \"⚠️|Повідомити про користувача|Якщо ви знайшли зловмисного користувача, повідомте про нього тут.|user\"`\n" +" - `[p]settickettool 1234567890-0987654321`\n" +" " + +#: tickettool\settings.py:70 +msgid "I don't have sufficient permissions in this channel to view it and to send messages into." +msgstr "Я не маю достатніх прав у цьому каналі, щоб переглядати його та надсилати повідомлення." + +#: tickettool\settings.py:97 tickettool\tickettool.py:339 +msgid "Create ticket" +msgstr "Створити квиток" + +#: tickettool\settings.py:116 +msgid "A different value must be provided for each dropdown option." +msgstr "Для кожної опції, що випадає, має бути вказано окреме значення." + +#: tickettool\settings.py:124 +msgid "An emoji you selected seems invalid. Check that it is an emoji. If you have Nitro, you may have used a custom emoji from another server." +msgstr "Вибраний вами смайлик здається недійсним. Перевірте, чи це смайлик. Якщо у вас Nitro, можливо, ви використовували кастомний смайлик з іншого сервера." + +#: tickettool\ticket.py:245 +msgid "Creating the ticket {ticket.id}." +msgstr "Створення квитка {ticket.id}." + +#: tickettool\ticket.py:266 +msgid "The dynamic channel name does not contain correct variable names and must be re-configured with `[p]settickettool dynamicchannelname`." +msgstr "Динамічна назва каналу не містить коректних імен змінних і має бути переналаштована за допомогою `[p]settickettool dynamicchannelname`." + +#: tickettool\ticket.py:275 tickettool\ticket.py:528 tickettool\ticket.py:890 +#: tickettool\ticket.py:969 tickettool\tickettool.py:352 +msgid "Close" +msgstr "Закрити" + +#: tickettool\ticket.py:282 tickettool\ticket.py:535 tickettool\ticket.py:615 +#: tickettool\ticket.py:897 tickettool\ticket.py:976 +#: tickettool\tickettool.py:366 +msgid "Claim" +msgstr "Претензія" + +#: tickettool\ticket.py:289 tickettool\ticket.py:542 tickettool\ticket.py:622 +#: tickettool\ticket.py:904 tickettool\ticket.py:983 +#: tickettool\tickettool.py:373 +msgid "Delete" +msgstr "Видалити" + +#: tickettool\ticket.py:303 tickettool\ticket.py:429 +msgid "Ticket Created" +msgstr "Квиток створено" + +#: tickettool\ticket.py:304 +msgid "Thank you for creating a ticket on this server!" +msgstr "Дякуємо за створення тікета на цьому сервері!" + +#: tickettool\ticket.py:315 +msgid "🎟️ Ticket ID: {ticket.id}\n" +"🕵️ Ticket created by: @{ticket.created_by.display_name} ({ticket.created_by.id})\n" +"☢️ Ticket reason: {short_reason}\n" +msgstr "🎟️ ID квитка: {ticket.id}\n" +"🕵️ Тікет створений: @{ticket.created_by.display_name} ({ticket.created_by.id})\n" +"☢️ Причина квитка: {short_reason}\n" + +#: tickettool\ticket.py:395 +msgid "⚠ At least one user (the ticket owner or a team member) could not be added to the ticket thread. Maybe the user doesn't have access to the parent forum/text channel. If the server uses private threads in a text channel, the bot does not have the `manage_messages` permission in this channel." +msgstr "⚠ Принаймні одного користувача (власника тікета або члена команди) не вдалося додати до теми тікета. Можливо, користувач не має доступу до батьківського форуму/текстового каналу. Якщо сервер використовує приватні теми в текстовому каналі, бот не має права `manage_messages` в цьому каналі." + +#: tickettool\ticket.py:430 +msgid "The ticket was created by {ticket.created_by}." +msgstr "Квиток був створений {ticket.created_by}." + +#: tickettool\ticket.py:436 +msgid "Report on the creation of the ticket {ticket.id}." +msgstr "Звіт про створення квитка {ticket.id}." + +#: tickettool\ticket.py:476 +msgid "Opening the ticket {ticket.id}." +msgstr "Відкриваємо квиток {ticket.id}." + +#: tickettool\ticket.py:505 tickettool\ticket.py:513 +msgid "Ticket Opened" +msgstr "Квиток відкрито" + +#: tickettool\ticket.py:514 +msgid "The ticket was opened by {ticket.opened_by}." +msgstr "Квиток відкривався за посиланням {ticket.opened_by}." + +#: tickettool\ticket.py:520 tickettool\ticket.py:600 +msgid "Report on the close of the ticket {ticket.id}." +msgstr "Звіт про закриття квитка {ticket.id}." + +#: tickettool\ticket.py:608 tickettool\tickettool.py:359 +msgid "Re-open" +msgstr "Відкрийте знову" + +#: tickettool\ticket.py:675 tickettool\ticket.py:712 +#: tickettool\tickettool.py:1100 tickettool\tickettool.py:1142 +msgid "Cannot execute action on a text channel." +msgstr "Неможливо виконати дію над текстовим каналом." + +#: tickettool\ticket.py:701 +msgid "Report on the lock of the ticket {ticket.id}." +msgstr "Повідомити про блокування квитка {ticket.id}." + +#: tickettool\ticket.py:738 +msgid "Report on the unlock of the ticket {ticket.id}." +msgstr "Звіт про розблокування квитка {ticket.id}." + +#: tickettool\ticket.py:755 +msgid "Renaming the ticket {ticket.id}. (`{ticket.channel.name}` to `{new_name}`)" +msgstr "Перейменування квитка {ticket.id}. (`{ticket.channel.name}` на `{new_name}`)" + +#: tickettool\ticket.py:765 +msgid "Ticket Renamed." +msgstr "Квиток перейменовано." + +#: tickettool\ticket.py:783 +msgid "Ticket Deleted" +msgstr "Квиток видалено" + +#: tickettool\ticket.py:784 +msgid "The ticket was deleted by {ticket.deleted_by}." +msgstr "Квиток було видалено за адресою {ticket.deleted_by}." + +#: tickettool\ticket.py:807 +msgid "Report on the deletion of the ticket {ticket.id}." +msgstr "Звіт про видалення квитка {ticket.id}." + +#: tickettool\ticket.py:824 +msgid "Deleting the ticket {ticket.id}." +msgstr "Видалення квитка {ticket.id}." + +#: tickettool\ticket.py:845 +msgid "A ticket cannot be claimed if it is closed." +msgstr "Квиток не може бути повернутий, якщо він закритий." + +#: tickettool\ticket.py:849 +msgid "A bot cannot claim a ticket." +msgstr "Бот не може претендувати на квиток." + +#: tickettool\ticket.py:863 +msgid "Claiming the ticket {ticket.id}." +msgstr "Отримання квитка {ticket.id}." + +#: tickettool\ticket.py:918 +msgid "Ticket claimed." +msgstr "Квиток пред'явлено." + +#: tickettool\ticket.py:932 +msgid "A ticket cannot be unclaimed if it is closed." +msgstr "Квиток не може бути витребуваний, якщо він закритий." + +#: tickettool\ticket.py:948 +msgid "Unclaiming the ticket {ticket.id}." +msgstr "Відмова від квитка {ticket.id}." + +#: tickettool\ticket.py:997 +msgid "Ticket unclaimed." +msgstr "Квиток не затребуваний." + +#: tickettool\ticket.py:1011 +msgid "Cannot execute action in a thread channel." +msgstr "Неможливо виконати дію в каналі потоку." + +#: tickettool\ticket.py:1018 +msgid "Changing owner of the ticket {ticket.id}." +msgstr "Зміна власника квитка {ticket.id}." + +#: tickettool\ticket.py:1022 +msgid "You cannot transfer ownership of a ticket to a bot." +msgstr "Ви не можете передати право власності на квиток боту." + +#: tickettool\ticket.py:1051 +msgid "Owner Modified." +msgstr "Власником змінено." + +#: tickettool\ticket.py:1070 +msgid "Adding a member to the ticket {ticket.id}." +msgstr "Додавання учасника до квитка {ticket.id}." + +#: tickettool\ticket.py:1077 tickettool\ticket.py:1114 +msgid "You cannot add a bot to a ticket. ({member})" +msgstr "Ви не можете додати бота до квитка. ({member})" + +#: tickettool\ticket.py:1081 tickettool\ticket.py:1118 +msgid "This member is already the owner of this ticket. ({member})" +msgstr "Цей учасник вже є власником цього квитка. ({member})" + +#: tickettool\ticket.py:1087 tickettool\ticket.py:1124 +msgid "This member is an administrator for the tickets system. They will always have access to the ticket anyway. ({member})" +msgstr "Цей учасник є адміністратором системи квитків. Він завжди матиме доступ до квитків у будь-якому випадку. ({member})" + +#: tickettool\ticket.py:1093 tickettool\ticket.py:1130 +msgid "This member already has access to this ticket. ({member})" +msgstr "Цей учасник вже має доступ до цього квитка. ({member})" + +#: tickettool\ticket.py:1144 +msgid "⚠ At least one user (the ticket owner or a team member) could not be added to the ticket thread. Maybe the user the user doesn't have access to the parent forum/text channel. If the server uses private threads in a text channel, the bot does not have the `manage_messages` permission in this channel." +msgstr "⚠ Принаймні одного користувача (власника тікета або члена команди) не вдалося додати до теми тікета. Можливо, користувач не має доступу до батьківського форуму/текстового каналу. Якщо сервер використовує приватні теми в текстовому каналі, бот не має права `manage_messages` в цьому каналі." + +#: tickettool\ticket.py:1168 +msgid "Removing a member to the ticket {ticket.id}." +msgstr "Видалення учасника на квиток {ticket.id}." + +#: tickettool\ticket.py:1174 tickettool\ticket.py:1204 +msgid "You cannot remove a bot to a ticket ({member})." +msgstr "Ви не можете видалити бота до тікета ({member})." + +#: tickettool\ticket.py:1180 tickettool\ticket.py:1210 +msgid "You cannot remove the owner of this ticket. ({member})" +msgstr "Ви не можете видалити власника цього квитка. ({member})" + +#: tickettool\ticket.py:1186 tickettool\ticket.py:1216 +msgid "This member is an administrator for the tickets system. They will always have access to the ticket. ({member})" +msgstr "Цей учасник є адміністратором системи квитків. Він завжди матиме доступ до квитків. ({member})" + +#: tickettool\ticket.py:1192 tickettool\ticket.py:1222 +msgid "This member is not in the list of those authorised to access the ticket. ({member})" +msgstr "Цього користувача немає у списку тих, хто має право доступу до квитка. ({member})" + +#: tickettool\tickettool.py:32 +#, docstring +msgid "A cog to manage a tickets system!" +msgstr "Гвинтик для управління системою квитків!" + +#: tickettool\tickettool.py:74 +msgid "To get help on this server or to make an order for example, you can create a ticket.\n" +"Just use the command `{prefix}ticket create` or click on the button below.\n" +"You can then use the `{prefix}ticket` subcommands to manage your ticket." +msgstr "Щоб отримати допомогу на цьому сервері або, наприклад, зробити замовлення, ви можете створити тікет.\n" +"Просто скористайтеся командою `{prefix}ticket create` або натисніть на кнопку нижче.\n" +"Після цього ви можете використовувати підкоманди `{prefix}ticket` для керування вашим тікетом." + +#: tickettool\tickettool.py:403 +msgid "Choose the reason for open a ticket." +msgstr "Виберіть причину для відкриття квитка." + +#: tickettool\tickettool.py:521 +msgid "Action taken for the ticket system." +msgstr "Вжиті заходи щодо системи продажу квитків." + +#: tickettool\tickettool.py:555 +msgid "Ticket ID:" +msgstr "Квиток посвідчує особу:" + +#: tickettool\tickettool.py:558 +msgid "Owned by:" +msgstr "Належить:" + +#: tickettool\tickettool.py:566 +msgid "Channel:" +msgstr "Канал:" + +#: tickettool\tickettool.py:573 +msgid "Closed by:" +msgstr "Закрито:" + +#: tickettool\tickettool.py:581 +msgid "Deleted by:" +msgstr "Видалено:" + +#: tickettool\tickettool.py:589 +msgid "Closed at:" +msgstr "Закрито о 23:00:" + +#: tickettool\tickettool.py:596 tickettool\tickettool.py:622 +msgid "Reason:" +msgstr "Причина:" + +#: tickettool\tickettool.py:607 +msgid "Ticket [{ticket.profile}] {ticket.id} - Action taken" +msgstr "Квиток [{ticket.profile}] {ticket.id} - Вжиті заходи" + +#: tickettool\tickettool.py:687 +msgid "You're not in a ticket." +msgstr "У тебе немає квитка." + +#: tickettool\tickettool.py:691 +msgid "This ticket isn't {status}ed." +msgstr "Цей квиток не є {status}ed." + +#: tickettool\tickettool.py:700 +msgid "This ticket is {status}." +msgstr "Цей квиток - {status}." + +#: tickettool\tickettool.py:709 +msgid "You're not allowed to lock this ticket." +msgstr "Ви не можете заблокувати цей квиток." + +#: tickettool\tickettool.py:752 +msgid "You're not allowed to view this ticket." +msgstr "Ви не маєте права переглядати цей квиток." + +#: tickettool\tickettool.py:786 +msgid "Please provide a profile." +msgstr "Будь ласка, заповніть анкету." + +#: tickettool\tickettool.py:789 +msgid "No profile has been created on this server." +msgstr "На цьому сервері не створено жодного профілю." + +#: tickettool\tickettool.py:797 +msgid "The ticket system is not enabled on this server. Please ask an administrator of this server to use the `{ctx.prefix}settickettool` subcommands to configure it." +msgstr "На цьому сервері не ввімкнено тікет-систему. Будь ласка, зверніться до адміністратора цього сервера за допомогою підкоманд `{ctx.prefix}settickettool` для її налаштування." + +#: tickettool\tickettool.py:803 +msgid "The category `open` or the category `close` have not been configured. Please ask an administrator of this server to use the `{ctx.prefix}settickettool` subcommands to configure it." +msgstr "Категорія `open` або категорія `close` не були налаштовані. Будь ласка, зверніться до адміністратора цього сервера за допомогою підкоманд `{ctx.prefix}settickettool` для їх налаштування." + +#: tickettool\tickettool.py:810 +msgid "Sorry. You have already reached the limit of {limit} open tickets." +msgstr "Вибачте. Ви вже досягли ліміту відкритих квитків {limit}." + +#: tickettool\tickettool.py:821 +msgid "The bot does not have `manage_channels` permission on the `open` and `close` categories to allow the ticket system to function properly. Please notify an administrator of this server." +msgstr "Бот не має права `manage_channels` для категорій `open` і `close`, щоб дозволити системі тікетів працювати належним чином. Будь ласка, повідомте про це адміністратора цього сервера." + +#: tickettool\tickettool.py:830 +msgid "The bot does not have `manage_channel` permission in the forum channel to allow the ticket system to function properly. Please notify an administrator of this server." +msgstr "Бот не має права `manage_channel` в каналі форуму, щоб дозволити системі тікетів працювати належним чином. Будь ласка, повідомте про це адміністратора цього сервера." + +#: tickettool\tickettool.py:875 +msgid "Please provide the required informations by clicking on the button below." +msgstr "Будь ласка, надайте необхідну інформацію, натиснувши на кнопку нижче." + +#: tickettool\tickettool.py:926 +#, docstring +msgid "Create a Ticket.\n\n" +" If only one profile has been created on this server, you don't need to specify its name.\n" +" " +msgstr "Створіть тікет.\n\n" +" Якщо на цьому сервері створено лише один профіль, вам не потрібно вказувати його ім'я.\n" +" " + +#: tickettool\tickettool.py:942 +#, docstring +msgid "Create a Ticket for a member.\n\n" +" If only one profile has been created on this server, you don't need to specify its name.\n" +" " +msgstr "Створіть Тікет для учасника.\n\n" +" Якщо на цьому сервері створено лише один профіль, вам не потрібно вказувати його ім'я.\n" +" " + +#: tickettool\tickettool.py:947 +msgid "You cannot create a ticket for a bot." +msgstr "Ви не можете створити тікет для бота." + +#: tickettool\tickettool.py:950 +msgid "You cannot create a ticket for a member with a higher or equal role." +msgstr "Ви не можете створити тікет для учасника з вищою або рівною роллю." + +#: tickettool\tickettool.py:970 +#, docstring +msgid "Export all the messages of an existing Ticket in html format.\n" +" Please note: all attachments and user avatars are saved with the Discord link in this file.\n" +" " +msgstr "Експортуйте всі повідомлення існуючого тікета в html-форматі.\n" +" Зверніть увагу: всі вкладення та аватарки користувачів зберігаються з посиланням Discord у цьому файлі.\n" +" " + +#: tickettool\tickettool.py:987 +msgid "Here is the html file of the transcript of all the messages in this ticket.\n" +"Please note: all attachments and user avatars are saved with the Discord link in this file." +msgstr "Ось html-файл стенограми всіх повідомлень у цьому тікеті.\n" +"Зверніть увагу: всі вкладення і аватарки користувачів зберігаються з посиланням Discord у цьому файлі." + +#: tickettool\tickettool.py:1019 +#, docstring +msgid "Open an existing Ticket." +msgstr "Відкрийте існуючий Квиток." + +#: tickettool\tickettool.py:1024 +msgid "The ticket system is not enabled on this server." +msgstr "Тікет-система на цьому сервері не ввімкнена." + +#: tickettool\tickettool.py:1050 +#, docstring +msgid "Close an existing Ticket." +msgstr "Закрийте існуючий Квиток." + +#: tickettool\tickettool.py:1061 +msgid "Do you really want to close the ticket {ticket.id}?" +msgstr "Ви дійсно хочете закрити квиток {ticket.id}?" + +#: tickettool\tickettool.py:1097 +#, docstring +msgid "Lock an existing Ticket." +msgstr "Заблокувати існуючий Квиток." + +#: tickettool\tickettool.py:1104 +msgid "Do you really want to lock the ticket {ticket.id}?" +msgstr "Ви дійсно хочете заблокувати квиток {ticket.id}?" + +#: tickettool\tickettool.py:1139 +#, docstring +msgid "Unlock an existing locked Ticket." +msgstr "Розблокувати існуючий заблокований Квиток." + +#: tickettool\tickettool.py:1167 +#, docstring +msgid "Rename an existing Ticket." +msgstr "Перейменувати існуючий Квиток." + +#: tickettool\tickettool.py:1193 +#, docstring +msgid "Delete an existing Ticket.\n\n" +" If a logs channel is defined, an html file containing all the messages of this ticket will be generated.\n" +" (Attachments are not supported, as they are saved with their Discord link)\n" +" " +msgstr "Видалити існуючий тікет.\n\n" +" Якщо визначено канал логування, буде згенеровано html-файл, що містить усі повідомлення цього тікета.\n" +" (Вкладення не підтримуються, оскільки вони зберігаються з посиланням на Discord)\n" +" " + +#: tickettool\tickettool.py:1202 +msgid "Do you really want to delete all the messages of the ticket {ticket.id}?" +msgstr "Ви дійсно хочете видалити всі повідомлення тікета {ticket.id}?" + +#: tickettool\tickettool.py:1206 +msgid "If a logs channel is defined, an html file containing all the messages of this ticket will be generated. (Attachments are not supported, as they are saved with their Discord link.)" +msgstr "Якщо визначено канал журналювання, буде згенеровано html-файл, що містить усі повідомлення цього тікета. (Вкладення не підтримуються, оскільки вони зберігаються з посиланням на Discord.)" + +#: tickettool\tickettool.py:1242 +#, docstring +msgid "Claim an existing Ticket." +msgstr "Оформіть наявний Квиток." + +#: tickettool\tickettool.py:1266 +#, docstring +msgid "Unclaim an existing Ticket." +msgstr "Відмовитися від наявного квитка." + +#: tickettool\tickettool.py:1292 +#, docstring +msgid "Change the owner of an existing Ticket." +msgstr "Змінити власника існуючого квитка." + +#: tickettool\tickettool.py:1318 +#, docstring +msgid "Add a member to an existing Ticket." +msgstr "Додайте учасника до існуючого квитка." + +#: tickettool\tickettool.py:1343 +#, docstring +msgid "Remove a member to an existing Ticket." +msgstr "Видалити учасника з існуючого квитка." + +#: tickettool\tickettool.py:1357 +#, docstring +msgid "List the existing Tickets for a profile. You can provide a status and/or a ticket owner." +msgstr "Перелічіть існуючі квитки для профілю. Ви можете вказати статус та/або власника квитка." + +#: tickettool\tickettool.py:1378 +msgid "No tickets to show." +msgstr "Квитків немає." + +#: tickettool\tickettool.py:1419 +msgid "The profile for which this button was configured no longer exists." +msgstr "Профіль, для якого була налаштована ця кнопка, більше не існує." + +#: tickettool\tickettool.py:1482 tickettool\tickettool.py:1541 +#: tickettool\tickettool.py:1545 tickettool\tickettool.py:1563 +#: tickettool\tickettool.py:1567 tickettool\tickettool.py:1587 +#: tickettool\tickettool.py:1591 tickettool\tickettool.py:1661 +#: tickettool\tickettool.py:1665 +msgid "You are not allowed to execute this command." +msgstr "Ви не маєте права виконувати цю команду." + +#: tickettool\tickettool.py:1486 tickettool\tickettool.py:1491 +#: tickettool\tickettool.py:1495 +msgid "You have chosen to create a ticket." +msgstr "Ви вирішили створити квиток." + +#: tickettool\tickettool.py:1517 +msgid "You have chosen to close this ticket. If this is not done, you do not have the necessary permissions to execute this command." +msgstr "Ви вирішили закрити цей квиток. Якщо цього не зроблено, ви не маєте необхідних прав для виконання цієї команди." + +#: tickettool\tickettool.py:1549 +msgid "You have chosen to re-open this ticket." +msgstr "Ви вирішили повторно відкрити цей квиток." + +#: tickettool\tickettool.py:1571 +msgid "You have chosen to claim this ticket. If this is not done, you do not have the necessary permissions to execute this command." +msgstr "Ви вирішили отримати цей квиток. Якщо цього не зроблено, ви не маєте необхідних прав для виконання цієї команди." + +#: tickettool\tickettool.py:1611 +msgid "This message is not in TicketTool config." +msgstr "Це повідомлення відсутнє у конфігурації TicketTool." + +#: tickettool\tickettool.py:1620 +msgid "The profile for which this dropdown was configured no longer exists." +msgstr "Профіль, для якого було налаштовано цей випадаючий список, більше не існує." + +#: tickettool\tickettool.py:1687 tickettool\tickettool.py:1694 +msgid "You have chosen to create a ticket with the reason `{reason}`." +msgstr "Ви вибрали створення тікета з причиною `{reason}`." + +#: tickettool\tickettool.py:1840 +msgid "No open tickets by this user in this server." +msgstr "Немає відкритих тікетів цього користувача на цьому сервері." + +#: tickettool\utils.py:143 +msgid "Emoji Label must be An emoji followed by a label, and optionnaly by a description and a value (for rename ticket channel), separated by either `;`, `,`, `|`, or `-`." +msgstr "Етикетка емодзі повинна бути емодзі, за яким слідує етикетка, а також опис і значення (для каналу перейменування тікета), розділені символами `;`, `,`, `|` або `-`." + +#: tickettool\utils.py:160 +msgid "Error parsing YAML. Please make sure the format is valid (a YAML validator may help)" +msgstr "Помилка розбору YAML. Будь ласка, переконайтеся, що формат є коректним (може допомогти валідатор YAML)" + +#: tickettool\utils.py:174 +msgid "You can only have 5 text inputs." +msgstr "Ви можете мати лише 5 текстових вхідних даних." + +#: tickettool\utils.py:180 +msgid "The argument `/{count}/{arg}` is required in the YAML." +msgstr "Аргумент `/{count}/{arg}` є обов'язковим у YAML." + +#: tickettool\utils.py:187 +msgid "The argument `/{count}/{arg}` is invalid in the YAML. Check the spelling." +msgstr "Аргумент `/{count}/{arg}` є недійсним в YAML. Перевірте написання." + +#: tickettool\utils.py:193 +msgid "The argument `/modal/{count}/label` must be less than 45 characters long." +msgstr "Аргумент `/modal/{count}/label` повинен мати довжину менше 45 символів." + +#: tickettool\utils.py:203 tickettool\utils.py:209 +msgid "The argument `/{count}/style` must be a number between 1 and 2." +msgstr "Аргумент `/{count}/style` має бути числом від 1 до 2." + +#: tickettool\utils.py:232 +msgid "The argument `/{count}/required` must be a boolean (True or False)." +msgstr "Аргумент `/{count}/required` має бути логічним (True або False)." + +#: tickettool\utils.py:242 +msgid "The argument `/modal/{count}/default` must be less than 4000 characters long." +msgstr "Аргумент `/modal/{count}/default` повинен мати довжину менше 4000 символів." + +#: tickettool\utils.py:250 +msgid "The argument `/modal/{count}/placeholder` must be less than 100 characters long." +msgstr "Аргумент `/modal/{count}/placeholder` повинен мати довжину менше 100 символів." + +#: tickettool\utils.py:258 +msgid "The argument `/modal/{count}/min_length` must be between 0 and 4000." +msgstr "Аргумент `/modal/{count}/min_length` має бути в діапазоні від 0 до 4000." + +#: tickettool\utils.py:266 +msgid "The argument `/modal/{count}/max_length` must be between 0 and 4000." +msgstr "Аргумент `/modal/{count}/max_length` має бути в межах від 0 до 4000." + diff --git a/tickettool/settings.py b/tickettool/settings.py new file mode 100644 index 0000000..9e80497 --- /dev/null +++ b/tickettool/settings.py @@ -0,0 +1,204 @@ +from AAA3A_utils import Cog # isort:skip +from redbot.core import commands # isort:skip +from redbot.core.i18n import Translator, cog_i18n # isort:skip +import discord # isort:skip +import typing # isort:skip + +from .utils import Emoji, EmojiLabelDescriptionValueConverter + +_: Translator = Translator("TicketTool", __file__) + + +class ProfileConverter(commands.Converter): + async def convert(self, ctx: commands.Context, argument: str): + if len(argument) > 20: + raise commands.BadArgument(_("This profile does not exist.")) + profiles = await ctx.bot.get_cog("TicketTool").config.guild(ctx.guild).profiles() + if argument.lower() not in profiles: + raise commands.BadArgument(_("This profile does not exist.")) + return argument.lower() + + +class MyMessageConverter(commands.MessageConverter): + async def convert(self, ctx: commands.Context, argument: str) -> discord.Message: + message = await super().convert(ctx, argument=argument) + if message.author != ctx.me: + raise commands.UserFeedbackCheckFailure( + _( + "I have to be the author of the message. You can use EmbedUtils by AAA3A to send one." + ) + ) + return message + + +@cog_i18n(_) +class settings(Cog): + @commands.guild_only() + @commands.admin_or_permissions(administrator=True) + @commands.hybrid_group(name="settickettool", aliases=["tickettoolset"]) + async def configuration(self, ctx: commands.Context) -> None: + """Configure TicketTool for your server.""" + pass + + @configuration.command(name="message") + async def message( + self, + ctx: commands.Context, + profile: ProfileConverter, + channel: typing.Optional[discord.TextChannel], + message: typing.Optional[MyMessageConverter], + reason_options: commands.Greedy[EmojiLabelDescriptionValueConverter], + emoji: typing.Optional[Emoji] = "🎟️", + label: commands.Range[str, 1, 80] = None, + ) -> None: + """Send a message with a button to open a ticket or dropdown with possible reasons. + + Examples: + - `[p]settickettool message #general "🐛|Report a bug|If you find a bug, report it here.|bug" "⚠️|Report a user|If you find a malicious user, report it here.|user"` + - `[p]settickettool 1234567890-0987654321` + """ + if channel is None: + channel = message.channel if message is not None else ctx.channel + channel_permissions = channel.permissions_for(ctx.me) + if ( + not channel_permissions.view_channel + or not channel_permissions.read_messages + or not channel_permissions.read_message_history + or not channel_permissions.send_messages + ): + raise commands.UserFeedbackCheckFailure( + _( + "I don't have sufficient permissions in this channel to view it and to send messages into." + ) + ) + if reason_options == []: + reason_options = None + config = await self.get_config(ctx.guild, profile) + actual_color = config["color"] + actual_thumbnail = config["thumbnail"] + embed: discord.Embed = discord.Embed() + embed.title = config["embed_button"]["title"] + embed.description = config["embed_button"]["description"].replace( + "{prefix}", f"{ctx.prefix}" + ) + embed.set_image(url=config["embed_button"]["image"]) + embed.set_thumbnail(url=actual_thumbnail) + embed.color = actual_color + embed.set_footer( + text=ctx.guild.name, + icon_url=ctx.guild.icon, + ) + if reason_options is None: + buttons_config = await self.config.guild(ctx.guild).buttons.all() + view = self.get_buttons( + buttons=[ + { + "style": discord.ButtonStyle(2), + "label": label or _("Create Ticket"), + "emoji": f"{getattr(emoji, 'id', emoji)}", + "custom_id": "create_ticket_button", + "disabled": False, + } + ], + ) + if message is None: + message = await channel.send(embed=embed, view=view) + else: + await message.edit(view=view) + self.views[message] = view + buttons_config[f"{message.channel.id}-{message.id}"] = {"profile": profile} + await self.config.guild(ctx.guild).buttons.set(buttons_config) + else: + if len({value for __, __, __, value in reason_options}) != len( + [value for __, __, __, value in reason_options] + ): + raise commands.UserFeedbackCheckFailure( + _("A different value must be provided for each dropdown option.") + ) + if ctx.interaction is None and ctx.bot_permissions.add_reactions: + try: + for emoji, label, description, value in reason_options[:19]: + await ctx.message.add_reaction(emoji) + except discord.HTTPException: + await ctx.send( + _( + "An emoji you selected seems invalid. Check that it is an emoji. If you have Nitro, you may have used a custom emoji from another server." + ) + ) + return + dropdowns_config = await self.config.guild(ctx.guild).dropdowns.all() + all_options = [ + { + "label": label, + "value": value.strip(), + "description": description, + "emoji": f"{getattr(emoji, 'id', emoji)}", + "default": False, + } + for emoji, label, description, value in reason_options + ] + view = self.get_dropdown( + placeholder=config["embed_button"]["placeholder_dropdown"], + options=all_options, + ) + if message is None: + message = await channel.send(embed=embed, view=view) + else: + message = await message.edit(view=view) + self.views[message] = view + dropdowns_config[f"{message.channel.id}-{message.id}"] = [ + { + "profile": profile, + "emoji": f"{getattr(emoji, 'id', emoji)}", + "label": label, + "description": description, + "value": value.strip(), + } + for emoji, label, description, value in reason_options + ] + await self.config.guild(ctx.guild).dropdowns.set(dropdowns_config) + + async def check_permissions_in_channel( + self, permissions: typing.List[str], channel: discord.TextChannel + ) -> typing.List[str]: + """Function to checks if the permissions are available in a guild. + This will return a list of the missing permissions. + """ + return [ + permission + for permission in permissions + if not getattr(channel.permissions_for(channel.guild.me), permission) + ] + + # @configuration.command(aliases=["buttonembed"]) + # async def embedbutton( + # self, + # ctx: commands.Context, + # profile: ProfileConverter, + # where: typing.Literal["title", "description", "image", "placeholderdropdown"], + # *, + # text: typing.Optional[str] = None, + # ): + # """Set the settings for the button embed.""" + # if text is None: + # if where == "title": + # await self.config.guild(ctx.guild).profiles.clear_raw(profile, "embed_button", "title") + # elif where == "description": + # await self.config.guild(ctx.guild).profiles.clear_raw(profile, "embed_button", "description") + # elif where == "image": + # await self.config.guild(ctx.guild).profiles.clear_raw(profile, "embed_button", "image") + # elif where == "placeholderdropdown": + # await self.config.guild( + # ctx.guild + # ).profiles.clear_raw(profile, "embed_button", "placeholder_dropdown") + + # return + + # if where == "title": + # await self.config.guild(ctx.guild).profiles.set_raw(profile, "embed_button", "title", value=text) + # elif where == "description": + # await self.config.guild(ctx.guild).profiles.set_raw(profile, "embed_button", "description", value=text) + # elif where == "image": + # await self.config.guild(ctx.guild).profiles.set_raw(profile, "embed_button", "image", value=text) + # elif where == "placeholderdropdown": + # await self.config.guild(ctx.guild).profiles.set_raw(profile, "embed_button", "placeholder_dropdown", value=text) diff --git a/tickettool/ticket.py b/tickettool/ticket.py new file mode 100644 index 0000000..d7e1732 --- /dev/null +++ b/tickettool/ticket.py @@ -0,0 +1,1232 @@ +from redbot.core import commands # isort:skip +from redbot.core.i18n import Translator # isort:skip +from redbot.core.bot import Red # isort:skip +import discord # isort:skip +import typing # isort:skip + +import datetime +import io + +import chat_exporter + +from .utils import utils + +_: Translator = Translator("TicketTool", __file__) + + +class Ticket: + """Representation of a Ticket.""" + + def __init__( + self, + bot, + cog, + profile, + id, + owner, + guild, + channel, + claim, + created_by, + opened_by, + closed_by, + deleted_by, + renamed_by, + locked_by, + unlocked_by, + members, + created_at, + opened_at, + closed_at, + deleted_at, + renamed_at, + locked_at, + unlocked_at, + status, + reason, + logs_messages, + save_data, + first_message, + ): + self.bot: Red = bot + self.cog: commands.Cog = cog + + self.profile: str = profile + self.id: int = id + + self.owner: discord.Member = owner + self.guild: discord.Guild = guild + self.channel: typing.Union[discord.TextChannel, discord.Thread] = channel + self.claim: discord.Member = claim + + self.created_by: discord.Member = created_by + self.opened_by: discord.Member = opened_by + self.closed_by: discord.Member = closed_by + self.deleted_by: discord.Member = deleted_by + self.renamed_by: discord.Member = renamed_by + self.locked_by: discord.Member = locked_by + self.unlocked_by: discord.Member = unlocked_by + + self.members: typing.List[discord.Member] = members + + self.created_at: datetime.datetime = created_at + self.opened_at: datetime.datetime = opened_at + self.closed_at: datetime.datetime = closed_at + self.deleted_at: datetime.datetime = deleted_at + self.renamed_at: datetime.datetime = renamed_at + self.locked_at: datetime.datetime = locked_at + self.unlocked_at: datetime.datetime = unlocked_at + + self.status: str = status + self.reason: str = reason + + self.first_message: discord.Message = first_message + self.logs_messages: bool = logs_messages + self.save_data: bool = save_data + + @staticmethod + def instance( + ctx: commands.Context, + profile: str, + reason: str = "No reason provided.", + ) -> typing.Any: + ticket: Ticket = Ticket( + bot=ctx.bot, + cog=ctx.cog, + profile=profile, + id=None, + owner=ctx.author, + guild=ctx.guild, + channel=None, + claim=None, + created_by=ctx.author, + opened_by=ctx.author, + closed_by=None, + deleted_by=None, + renamed_by=None, + locked_by=None, + unlocked_by=None, + members=[], + created_at=datetime.datetime.now(), + opened_at=None, + closed_at=None, + deleted_at=None, + renamed_at=None, + locked_at=None, + unlocked_at=None, + status="open", + reason=reason, + first_message=None, + logs_messages=True, + save_data=True, + ) + return ticket + + @staticmethod + def from_json(json: dict, bot: Red, cog: commands.Cog) -> typing.Any: + ticket: Ticket = Ticket( + bot=bot, + cog=cog, + profile=json["profile"], + id=json["id"], + owner=json["owner"], + guild=json["guild"], + channel=json["channel"], + claim=json.get("claim"), + created_by=json["created_by"], + opened_by=json.get("opened_by"), + closed_by=json.get("closed_by"), + deleted_by=json.get("deleted_by"), + renamed_by=json.get("renamed_by"), + locked_by=json.get("locked_by"), + unlocked_by=json.get("unlocked_by"), + members=json.get("members"), + created_at=json["created_at"], + opened_at=json.get("opened_at"), + closed_at=json.get("closed_at"), + deleted_at=json.get("deleted_at"), + renamed_at=json.get("renamed_at"), + locked_at=json.get("locked_at"), + unlocked_at=json.get("unlocked_at"), + status=json["status"], + reason=json["reason"], + first_message=json["first_message"], + logs_messages=json.get("logs_messages", True), + save_data=json.get("save_data", True), + ) + return ticket + + async def save(self, clean: bool = True) -> typing.Dict[str, typing.Any]: + if not self.save_data: + return + cog = self.cog + guild = self.guild + channel = self.channel + if self.owner is not None: + self.owner = int(getattr(self.owner, "id", self.owner)) + if self.guild is not None: + self.guild = int(self.guild.id) + if self.channel is not None: + self.channel = int(self.channel.id) + if self.claim is not None: + self.claim = self.claim.id + if self.created_by is not None: + self.created_by = int(getattr(self.created_by, "id", self.created_by)) + if self.opened_by is not None: + self.opened_by = int(getattr(self.opened_by, "id", self.opened_by)) + if self.closed_by is not None: + self.closed_by = int(getattr(self.closed_by, "id", self.closed_by)) + if self.deleted_by is not None: + self.deleted_by = int(getattr(self.deleted_by, "id", self.deleted_by)) + if self.renamed_by is not None: + self.renamed_by = int(getattr(self.renamed_by, "id", self.renamed_by)) + if self.locked_by is not None: + self.locked_by = int(getattr(self.locked_by, "id", self.locked_by)) + if self.unlocked_by is not None: + self.unlocked_by = int(getattr(self.unlocked_by, "id", self.unlocked_by)) + members = self.members + self.members = [int(m.id) for m in members] + if self.created_at is not None: + self.created_at = float(datetime.datetime.timestamp(self.created_at)) + if self.opened_at is not None: + self.opened_at = float(datetime.datetime.timestamp(self.opened_at)) + if self.closed_at is not None: + self.closed_at = float(datetime.datetime.timestamp(self.closed_at)) + if self.deleted_at is not None: + self.deleted_at = float(datetime.datetime.timestamp(self.deleted_at)) + if self.renamed_at is not None: + self.renamed_at = float(datetime.datetime.timestamp(self.renamed_at)) + if self.locked_at is not None: + self.locked_at = float(datetime.datetime.timestamp(self.locked_at)) + if self.unlocked_at is not None: + self.unlocked_at = float(datetime.datetime.timestamp(self.unlocked_at)) + if self.first_message is not None: + self.first_message = int(self.first_message.id) + json = self.__dict__ + for key in ("bot", "cog"): + del json[key] + if clean: + for key in ( + "claim", + "opened_by", + "closed_by", + "deleted_by", + "renamed_by", + "locked_by", + "unlocked_by", + "opened_at", + "closed_at", + "deleted_at", + "renamed_at", + "locked_at", + "unlocked_at", + ): + if json[key] is None: + del json[key] + if json["members"] == []: + del json["members"] + for key in ("logs_messages", "save_data"): + if json[key]: + del json[key] + data = await cog.config.guild(guild).tickets.all() + data[str(channel.id)] = json + await cog.config.guild(guild).tickets.set(data) + return json + + async def create(self) -> typing.Any: + config = await self.cog.get_config(self.guild, self.profile) + logschannel = config["logschannel"] + ping_roles = config["ping_roles"] + self.id = config["last_nb"] + 1 + _reason = await self.cog.get_audit_reason( + guild=self.guild, + profile=self.profile, + author=self.created_by, + reason=_("Creating the ticket {ticket.id}.").format(ticket=self), + ) + try: + to_replace = { + "ticket_id": str(self.id), + "owner_display_name": self.owner.display_name, + "owner_name": self.owner.name, + "owner_id": str(self.owner.id), + "guild_name": self.guild.name, + "guild_id": self.guild.id, + "bot_display_name": self.guild.me.display_name, + "bot_name": self.bot.user.name, + "bot_id": str(self.bot.user.id), + "shortdate": self.created_at.strftime("%m-%d"), + "longdate": self.created_at.strftime("%m-%d-%Y"), + "time": self.created_at.strftime("%I-%M-%p"), + "emoji": config["emoji_open"], + } + name = config["dynamic_channel_name"].format(**to_replace).replace(" ", "-") + except (KeyError, AttributeError): + raise commands.UserFeedbackCheckFailure( + _( + "The dynamic channel name does not contain correct variable names and must be re-configured with `[p]settickettool dynamicchannelname`." + ) + ) + + view = self.cog.get_buttons( + buttons=[ + { + "style": discord.ButtonStyle(2), + "label": _("Close"), + "emoji": "🔒", + "custom_id": "close_ticket_button", + "disabled": False, + }, + { + "style": discord.ButtonStyle(2), + "label": _("Claim"), + "emoji": "🙋‍♂️", + "custom_id": "claim_ticket_button", + "disabled": False, + }, + { + "style": discord.ButtonStyle(2), + "label": _("Delete"), + "emoji": "⛔", + "custom_id": "delete_ticket_button", + "disabled": False, + }, + ], + ) + optionnal_ping = ( + f" ||{' '.join(role.mention for role in ping_roles)}||"[:1500] if ping_roles else "" + ) + embed = await self.cog.get_embed_important( + self, + False, + author=self.created_by, + title=_("Ticket Created"), + description=_("Thank you for creating a ticket on this server!"), + reason=self.reason, + ) + if config["ticket_role"] is not None and self.owner: + try: + await self.owner.add_roles(config["ticket_role"], reason=_reason) + except discord.HTTPException: + pass + try: + if config["forum_channel"] is None: + overwrites = await utils().get_overwrites(self) + topic = _( + "🎟️ Ticket ID: {ticket.id}\n" + # "🔥 Channel ID: {ticket.channel.id}\n" + "🕵️ Ticket created by: @{ticket.created_by.display_name} ({ticket.created_by.id})\n" + "☢️ Ticket reason: {short_reason}\n" + # "👥 Ticket claimed by: Nobody." + ).format( + ticket=self, + short_reason=( + f"{self.reason[:700]}...".replace("\n", " ") + if len(self.reason) > 700 + else self.reason.replace("\n", " ") + ), + ) + self.channel: discord.TextChannel = await self.guild.create_text_channel( + name, + overwrites=overwrites, + category=config["category_open"], + topic=topic, + reason=_reason, + ) + await self.channel.edit(topic=topic) + self.first_message = await self.channel.send( + f"{self.created_by.mention}{optionnal_ping}", + embed=embed, + view=view, + allowed_mentions=discord.AllowedMentions(users=True, roles=True), + ) + self.cog.views[self.first_message] = view + else: + if isinstance(config["forum_channel"], discord.ForumChannel): + forum_channel: discord.ForumChannel = config["forum_channel"] + result: discord.channel.ThreadWithMessage = await forum_channel.create_thread( + name=name, + content=f"{self.created_by.mention}{optionnal_ping}", + embed=embed, + view=view, + allowed_mentions=discord.AllowedMentions(users=True, roles=True), + auto_archive_duration=10080, + reason=_reason, + ) + self.channel: discord.Thread = result.thread + self.first_message: discord.Message = result.message + else: # isinstance(config["forum_channel"], discord.TextChannel) + forum_channel: discord.TextChannel = config["forum_channel"] + self.channel: discord.Thread = await forum_channel.create_thread( + name=name, + message=None, # Private thread. + type=discord.ChannelType.private_thread, + invitable=False, + auto_archive_duration=10080, + reason=_reason, + ) + self.first_message = await self.channel.send( + f"{self.created_by.mention}{optionnal_ping}", + embed=embed, + view=view, + allowed_mentions=discord.AllowedMentions(users=True, roles=True), + ) + self.cog.views[self.first_message] = view + members = [self.owner] + if self.claim is not None: + members.append(self.claim) + if config["admin_roles"]: + for role in config["admin_roles"]: + members.extend(role.members) + if config["support_roles"]: + for role in config["support_roles"]: + members.extend(role.members) + if config["view_roles"]: + for role in config["view_roles"]: + members.extend(role.members) + adding_error = False + for member in members: + try: + await self.channel.add_user(member) + except ( + discord.HTTPException + ): # The bot haven't the permission `manage_messages` in the parent text channel. + adding_error = True + if adding_error: + await self.channel.send( + _( + "⚠ At least one user (the ticket owner or a team member) could not be added to the ticket thread. Maybe the user doesn't have access to the parent forum/text channel. If the server uses private threads in a text channel, the bot does not have the `manage_messages` permission in this channel." + ) + ) + if config["create_modlog"]: + await self.cog.create_modlog(self, "ticket_created", _reason) + if config["custom_message"] is not None: + try: + embed: discord.Embed = discord.Embed() + embed.title = "Custom Message" + to_replace = { + "ticket_id": str(self.id), + "owner_display_name": self.owner.display_name, + "owner_name": self.owner.name, + "owner_id": str(self.owner.id), + "guild_name": self.guild.name, + "guild_id": self.guild.id, + "bot_display_name": self.guild.me.display_name, + "bot_name": self.bot.user.name, + "bot_id": str(self.bot.user.id), + "shortdate": self.created_at.strftime("%m-%d"), + "longdate": self.created_at.strftime("%m-%d-%Y"), + "time": self.created_at.strftime("%I-%M-%p"), + "emoji": config["emoji_open"], + } + embed.description = config["custom_message"].format(**to_replace) + await self.channel.send(embed=embed) + except (KeyError, AttributeError, discord.HTTPException): + pass + if logschannel is not None: + embed = await self.cog.get_embed_important( + self, + True, + author=self.created_by, + title=_("Ticket Created"), + description=_("The ticket was created by {ticket.created_by}.").format( + ticket=self + ), + reason=self.reason, + ) + await logschannel.send( + _("Report on the creation of the ticket {ticket.id}.").format(ticket=self), + embed=embed, + ) + except discord.HTTPException: + if config["ticket_role"] is not None and self.owner: + try: + await self.owner.remove_roles(config["ticket_role"], reason=_reason) + except discord.HTTPException: + pass + raise + await self.cog.config.guild(self.guild).profiles.set_raw( + self.profile, "last_nb", value=self.id + ) + await self.save() + return self + + async def export(self) -> typing.Optional[discord.File]: + if self.channel: + transcript = await chat_exporter.export( + channel=self.channel, + limit=None, + tz_info="UTC", + guild=self.guild, + bot=self.bot, + ) + if transcript is not None: + return discord.File( + io.BytesIO(transcript.encode()), + filename=f"transcript-ticket-{self.profile}-{self.id}.html", + ) + return None + + async def open( + self, author: typing.Optional[discord.Member] = None, reason: typing.Optional[str] = None + ) -> typing.Any: + config = await self.cog.get_config(self.guild, self.profile) + _reason = await self.cog.get_audit_reason( + guild=self.guild, + profile=self.profile, + author=author, + reason=_("Opening the ticket {ticket.id}.").format(ticket=self), + ) + logschannel = config["logschannel"] + emoji_open = config["emoji_open"] + emoji_close = config["emoji_close"] + self.status = "open" + self.opened_by = author + self.opened_at = datetime.datetime.now() + self.closed_by = None + self.closed_at = None + new_name = f"{self.channel.name}" + new_name = new_name.replace(f"{emoji_close}-", "", 1) + new_name = f"{emoji_open}-{new_name}" + if isinstance(self.channel, discord.TextChannel): + members = [self.owner] + self.members + overwrites = self.channel.overwrites + for member in members: + if member in overwrites: + overwrites[member].send_messages = True + await self.channel.edit( + name=new_name, + category=config["category_open"], + overwrites=overwrites, + reason=_reason, + ) + else: + await self.channel.edit(name=new_name, archived=False, reason=_reason) + if self.logs_messages: + embed = await self.cog.get_embed_action( + self, author=self.opened_by, action=_("Ticket Opened"), reason=reason + ) + await self.channel.send(embed=embed) + if logschannel is not None: + embed = await self.cog.get_embed_important( + self, + True, + author=self.opened_by, + title=_("Ticket Opened"), + description=_("The ticket was opened by {ticket.opened_by}.").format( + ticket=self + ), + reason=reason, + ) + await logschannel.send( + _("Report on the close of the ticket {ticket.id}.").format(ticket=self), + embed=embed, + ) + if self.first_message is not None: + view = self.cog.get_buttons( + buttons=[ + { + "style": discord.ButtonStyle(2), + "label": _("Close"), + "emoji": "🔒", + "custom_id": "close_ticket_button", + "disabled": False, + }, + { + "style": discord.ButtonStyle(2), + "label": _("Claim"), + "emoji": "🙋‍♂️", + "custom_id": "claim_ticket_button", + "disabled": False, + }, + { + "style": discord.ButtonStyle(2), + "label": _("Delete"), + "emoji": "⛔", + "custom_id": "delete_ticket_button", + "disabled": False, + }, + ], + ) + try: + self.first_message = await self.channel.fetch_message(int(self.first_message.id)) + await self.first_message.edit(view=view) + except discord.HTTPException: + pass + if ( + config["ticket_role"] is not None + and self.owner is not None + and isinstance(self.owner, discord.Member) + ): + try: + await self.owner.add_roles(config["ticket_role"], reason=_reason) + except discord.HTTPException: + pass + await self.save() + return self + + async def close( + self, author: typing.Optional[discord.Member] = None, reason: typing.Optional[str] = None + ) -> typing.Any: + config = await self.cog.get_config(self.guild, self.profile) + _reason = await self.cog.get_audit_reason( + guild=self.guild, + profile=self.profile, + author=author, + reason=f"Closing the ticket {self.id}.", + ) + logschannel = config["logschannel"] + emoji_open = config["emoji_open"] + emoji_close = config["emoji_close"] + self.status = "close" + self.closed_by = author + self.closed_at = datetime.datetime.now() + new_name = f"{self.channel.name}" + new_name = new_name.replace(f"{emoji_open}-", "", 1) + new_name = f"{emoji_close}-{new_name}" + if self.logs_messages: + embed = await self.cog.get_embed_action( + self, author=self.closed_by, action="Ticket Closed", reason=reason + ) + await self.channel.send(embed=embed) + if logschannel is not None: + embed = await self.cog.get_embed_important( + self, + True, + author=self.closed_by, + title="Ticket Closed", + description=f"The ticket was closed by {self.closed_by}.", + reason=reason, + ) + await logschannel.send( + _("Report on the close of the ticket {ticket.id}.").format(ticket=self), + embed=embed, + ) + if self.first_message is not None: + view = self.cog.get_buttons( + buttons=[ + { + "style": discord.ButtonStyle(2), + "label": _("Re-open"), + "emoji": "🔓", + "custom_id": "open_ticket_button", + "disabled": False, + }, + { + "style": discord.ButtonStyle(2), + "label": _("Claim"), + "emoji": "🙋‍♂️", + "custom_id": "claim_ticket_button", + "disabled": True, + }, + { + "style": discord.ButtonStyle(2), + "label": _("Delete"), + "emoji": "⛔", + "custom_id": "delete_ticket_button", + "disabled": False, + }, + ], + ) + try: + self.first_message = await self.channel.fetch_message(int(self.first_message.id)) + await self.first_message.edit(view=view) + except discord.HTTPException: + pass + if isinstance(self.channel, discord.TextChannel): + allowed_members = [] + if self.claim is not None: + allowed_members.append(self.claim) + if config["admin_roles"]: + for role in config["admin_roles"]: + allowed_members.extend(role.members) + if config["support_roles"]: + for role in config["support_roles"]: + allowed_members.extend(role.members) + members = filter( + lambda member: member not in allowed_members, [self.owner] + self.members + ) + overwrites = self.channel.overwrites + for member in members: + if member in overwrites: + overwrites[member].send_messages = False + await self.channel.edit( + name=new_name, + category=config["category_close"], + overwrites=overwrites, + reason=_reason, + ) + else: + await self.channel.edit(name=new_name, archived=True, locked=True, reason=_reason) + if ( + config["ticket_role"] is not None + and self.owner is not None + and isinstance(self.owner, discord.Member) + ): + try: + await self.owner.remove_roles(config["ticket_role"], reason=_reason) + except discord.HTTPException: + pass + await self.save() + return self + + async def lock( + self, author: typing.Optional[discord.Member] = None, reason: typing.Optional[str] = None + ) -> typing.Any: + if isinstance(self.channel, discord.TextChannel): + raise commands.UserFeedbackCheckFailure(_("Cannot execute action on a text channel.")) + config = await self.cog.get_config(self.guild, self.profile) + _reason = await self.cog.get_audit_reason( + guild=self.guild, + profile=self.profile, + author=author, + reason=f"Locking the ticket {self.id}.", + ) + logschannel = config["logschannel"] + self.locked_by = author + self.locked_at = datetime.datetime.now() + if self.logs_messages: + embed = await self.cog.get_embed_action( + self, author=self.locked_by, action="Ticket Locked", reason=reason + ) + await self.channel.send(embed=embed) + if logschannel is not None: + embed = await self.cog.get_embed_important( + self, + True, + author=self.locked_by, + title="Ticket Locked", + description=f"The ticket was locked by {self.closed_by}.", + reason=reason, + ) + await logschannel.send( + _("Report on the lock of the ticket {ticket.id}."), + embed=embed, + ) + await self.channel.edit(locked=True, reason=_reason) + await self.save() + return self + + async def unlock( + self, author: typing.Optional[discord.Member] = None, reason: typing.Optional[str] = None + ) -> typing.Any: + if isinstance(self.channel, discord.TextChannel): + raise commands.UserFeedbackCheckFailure(_("Cannot execute action on a text channel.")) + config = await self.cog.get_config(self.guild, self.profile) + _reason = await self.cog.get_audit_reason( + guild=self.guild, + profile=self.profile, + author=author, + reason=f"Unlocking the ticket {self.id}.", + ) + logschannel = config["logschannel"] + self.unlocked_by = author + self.unlocked_at = datetime.datetime.now() + if self.logs_messages: + embed = await self.cog.get_embed_action( + self, author=self.unlocked_by, action="Ticket Unlocked" + ) + await self.channel.send(embed=embed) + if logschannel is not None: + embed = await self.cog.get_embed_important( + self, + True, + author=self.unlocked_by, + title="Ticket Unlocked", + description=f"The ticket was unlocked by {self.closed_by}.", + reason=reason, + ) + await logschannel.send( + _("Report on the unlock of the ticket {ticket.id}."), + embed=embed, + ) + await self.channel.edit(locked=False, reason=_reason) + await self.save() + return self + + async def rename( + self, + new_name: str, + author: typing.Optional[discord.Member] = None, + reason: typing.Optional[str] = None, + ) -> typing.Any: + _reason = await self.cog.get_audit_reason( + guild=self.guild, + profile=self.profile, + author=author, + reason=_( + "Renaming the ticket {ticket.id}. (`{ticket.channel.name}` to `{new_name}`)" + ).format(ticket=self, new_name=new_name), + ) + await self.channel.edit(name=new_name, reason=_reason) + if author is not None: + self.renamed_by = author + self.renamed_at = datetime.datetime.now() + if self.logs_messages: + embed = await self.cog.get_embed_action( + self, author=self.renamed_by, action=_("Ticket Renamed."), reason=reason + ) + await self.channel.send(embed=embed) + await self.save() + return self + + async def delete( + self, author: typing.Optional[discord.Member] = None, reason: typing.Optional[str] = None + ) -> typing.Any: + config = await self.cog.get_config(self.guild, self.profile) + logschannel = config["logschannel"] + self.deleted_by = author + self.deleted_at = datetime.datetime.now() + if self.logs_messages and logschannel is not None: + embed = await self.cog.get_embed_important( + self, + True, + author=self.deleted_by, + title=_("Ticket Deleted"), + description=_("The ticket was deleted by {ticket.deleted_by}.").format( + ticket=self + ), + reason=reason, + ) + try: + transcript = await chat_exporter.export( + channel=self.channel, + limit=None, + tz_info="UTC", + guild=self.guild, + bot=self.bot, + ) + except AttributeError: + transcript = None + if transcript is not None: + file = discord.File( + io.BytesIO(transcript.encode()), + filename=f"transcript-ticket-{self.id}.html", + ) + else: + file = None + message = await logschannel.send( + _("Report on the deletion of the ticket {ticket.id}.").format(ticket=self), + embed=embed, + file=file, + ) + embed = discord.Embed( + title="Transcript Link", + description=( + f"[Click here to view the transcript.](https://mahto.id/chat-exporter?url={message.attachments[0].url})" + ), + color=discord.Color.red(), + ) + await logschannel.send(embed=embed) + if isinstance(self.channel, discord.TextChannel): + _reason = await self.cog.get_audit_reason( + guild=self.guild, + profile=self.profile, + author=author, + reason=_("Deleting the ticket {ticket.id}.").format(ticket=self), + ) + await self.channel.delete(reason=_reason) + else: + await self.channel.delete() + data = await self.cog.config.guild(self.guild).tickets.all() + try: + del data[str(self.channel.id)] + except KeyError: + pass + await self.cog.config.guild(self.guild).tickets.set(data) + return self + + async def claim_ticket( + self, + member: discord.Member, + author: typing.Optional[discord.Member] = None, + reason: typing.Optional[str] = None, + ) -> typing.Any: + if self.status != "open": + raise commands.UserFeedbackCheckFailure( + _("A ticket cannot be claimed if it is closed.") + ) + config = await self.cog.get_config(self.guild, self.profile) + if member.bot: + raise commands.UserFeedbackCheckFailure(_("A bot cannot claim a ticket.")) + self.claim = member + # topic = _( + # "🎟️ Ticket ID: {ticket.id}\n" + # "🔥 Channel ID: {ticket.channel.id}\n" + # "🕵️ Ticket created by: @{ticket.created_by.display_name} ({ticket.created_by.id})\n" + # "☢️ Ticket reason: {short_reason}\n" + # "👥 Ticket claimed by: @{ticket.claim.display_name} (@{ticket.claim.id})." + # ).format(ticket=self, short_reason=f"{self.reason[:700]}...".replace("\n", " ") if len(self.reason) > 700 else self.reason.replace("\n", " ")) + if isinstance(self.channel, discord.TextChannel): + _reason = await self.cog.get_audit_reason( + guild=self.guild, + profile=self.profile, + author=author, + reason=_("Claiming the ticket {ticket.id}.").format(ticket=self), + ) + overwrites = self.channel.overwrites + overwrites[member] = discord.PermissionOverwrite( + view_channel=True, + read_messages=True, + read_message_history=True, + send_messages=True, + attach_files=True, + use_application_commands=True, + ) + if config["support_roles"]: + for role in config["support_roles"]: + overwrites[role] = discord.PermissionOverwrite( + view_channel=True, + read_messages=True, + send_messages=False, + read_message_history=True, + attach_files=False, + use_application_commands=False, + ) + await self.channel.edit(overwrites=overwrites, reason=_reason) # topic=topic, + if self.first_message is not None: + view = self.cog.get_buttons( + buttons=[ + { + "style": discord.ButtonStyle(2), + "label": _("Close"), + "emoji": "🔒", + "custom_id": "close_ticket_button", + "disabled": False, + }, + { + "style": discord.ButtonStyle(2), + "label": _("Claim"), + "emoji": "🙋‍♂️", + "custom_id": "claim_ticket_button", + "disabled": True, + }, + { + "style": discord.ButtonStyle(2), + "label": _("Delete"), + "emoji": "⛔", + "custom_id": "delete_ticket_button", + "disabled": False, + }, + ], + ) + try: + self.first_message = await self.channel.fetch_message(int(self.first_message.id)) + await self.first_message.edit(view=view) + except discord.HTTPException: + pass + if self.logs_messages: + embed = await self.cog.get_embed_action( + self, author=author, action=_("Ticket claimed."), reason=reason + ) + await self.channel.send(embed=embed) + await self.save() + return self + + async def unclaim_ticket( + self, + member: discord.Member, + author: typing.Optional[discord.Member] = None, + reason: typing.Optional[str] = None, + ) -> typing.Any: + if self.status != "open": + raise commands.UserFeedbackCheckFailure( + _("A ticket cannot be unclaimed if it is closed.") + ) + config = await self.cog.get_config(self.guild, self.profile) + self.claim = None + # topic = _( + # "🎟️ Ticket ID: {ticket.id}\n" + # "🔥 Channel ID: {ticket.channel.id}\n" + # "🕵️ Ticket created by: @{ticket.created_by.display_name} ({ticket.created_by.id})\n" + # "☢️ Ticket reason: {short_reason}\n" + # "👥 Ticket claimed by: Nobody." + # ).format(ticket=self, short_reason=f"{self.reason[:700]}...".replace("\n", " ") if len(self.reason) > 700 else self.reason.replace("\n", " ")) + if isinstance(self.channel, discord.TextChannel): + _reason = await self.cog.get_audit_reason( + guild=self.guild, + profile=self.profile, + author=author, + reason=_("Unclaiming the ticket {ticket.id}.").format(ticket=self), + ) + if config["support_roles"]: + overwrites = self.channel.overwrites + for role in config["support_roles"]: + overwrites[role] = discord.PermissionOverwrite( + view_channel=True, + read_messages=True, + read_message_history=True, + send_messages=True, + attach_files=True, + use_application_commands=True, + ) + await self.channel.edit(overwrites=overwrites, reason=_reason) + await self.channel.set_permissions(member, overwrite=None, reason=_reason) + # await self.channel.edit(topic=topic) + if self.first_message is not None: + view = self.cog.get_buttons( + buttons=[ + { + "style": discord.ButtonStyle(2), + "label": _("Close"), + "emoji": "🔒", + "custom_id": "close_ticket_button", + "disabled": False, + }, + { + "style": discord.ButtonStyle(2), + "label": _("Claim"), + "emoji": "🙋‍♂️", + "custom_id": "claim_ticket_button", + "disabled": True, + }, + { + "style": discord.ButtonStyle(2), + "label": _("Delete"), + "emoji": "⛔", + "custom_id": "delete_ticket_button", + "disabled": False, + }, + ], + ) + try: + self.first_message = await self.channel.fetch_message(int(self.first_message.id)) + await self.first_message.edit(view=view) + except discord.HTTPException: + pass + if self.logs_messages: + embed = await self.cog.get_embed_action( + self, author=author, action=_("Ticket unclaimed."), reason=reason + ) + await self.channel.send(embed=embed) + await self.save() + return self + + async def change_owner( + self, + member: discord.Member, + author: typing.Optional[discord.Member] = None, + reason: typing.Optional[str] = None, + ) -> typing.Any: + if not isinstance(self.channel, discord.TextChannel): + raise commands.UserFeedbackCheckFailure( + _("Cannot execute action in a thread channel.") + ) + config = await self.cog.get_config(self.guild, self.profile) + _reason = await self.cog.get_audit_reason( + guild=self.guild, + profile=self.profile, + author=author, + reason=_("Changing owner of the ticket {ticket.id}.").format(ticket=self), + ) + if member.bot: + raise commands.UserFeedbackCheckFailure( + _("You cannot transfer ownership of a ticket to a bot.") + ) + if not isinstance(self.owner, int): + if config["ticket_role"] is not None: + try: + self.owner.remove_roles(config["ticket_role"], reason=_reason) + except discord.HTTPException: + pass + self.remove_member(self.owner, author=None) + self.add_member(self.owner, author=None) + self.owner = member + self.remove_member(self.owner, author=None) + overwrites = self.channel.overwrites + overwrites[member] = discord.PermissionOverwrite( + view_channel=True, + read_messages=True, + read_message_history=True, + send_messages=True, + attach_files=True, + use_application_commands=True, + ) + await self.channel.edit(overwrites=overwrites, reason=_reason) + if config["ticket_role"] is not None: + try: + self.owner.add_roles(config["ticket_role"], reason=_reason) + except discord.HTTPException: + pass + if self.logs_messages: + embed = await self.cog.get_embed_action( + self, author=author, action=_("Owner Modified."), reason=reason + ) + await self.channel.send(embed=embed) + await self.save() + return self + + async def add_member( + self, members: typing.List[discord.Member], author: typing.Optional[discord.Member] = None + ) -> typing.Any: + config = await self.cog.get_config(self.guild, self.profile) + admin_roles_members = [] + if config["admin_roles"]: + for role in config["admin_roles"]: + admin_roles_members.extend(role.members) + if isinstance(self.channel, discord.TextChannel): + _reason = await self.cog.get_audit_reason( + guild=self.guild, + profile=self.profile, + author=author, + reason=_("Adding a member to the ticket {ticket.id}.").format(ticket=self), + ) + overwrites = self.channel.overwrites + for member in members: + if author is not None: + if member.bot: + raise commands.UserFeedbackCheckFailure( + _("You cannot add a bot to a ticket. ({member})").format(member=member) + ) + if not isinstance(self.owner, int) and member == self.owner: + raise commands.UserFeedbackCheckFailure( + _( + "This member is already the owner of this ticket. ({member})" + ).format(member=member) + ) + if member in admin_roles_members: + raise commands.UserFeedbackCheckFailure( + _( + "This member is an administrator for the tickets system. They will always have access to the ticket anyway. ({member})" + ).format(member=member) + ) + if member in self.members: + raise commands.UserFeedbackCheckFailure( + _("This member already has access to this ticket. ({member})").format( + member=member + ) + ) + if member not in self.members: + self.members.append(member) + overwrites[member] = discord.PermissionOverwrite( + view_channel=True, + read_messages=True, + read_message_history=True, + send_messages=True, + attach_files=True, + use_application_commands=True, + ) + await self.channel.edit(overwrites=overwrites, reason=_reason) + else: + adding_error = False + for member in members: + if author is not None: + if member.bot: + raise commands.UserFeedbackCheckFailure( + _("You cannot add a bot to a ticket. ({member})").format(member=member) + ) + if not isinstance(self.owner, int) and member == self.owner: + raise commands.UserFeedbackCheckFailure( + _( + "This member is already the owner of this ticket. ({member})" + ).format(member=member) + ) + if member in admin_roles_members: + raise commands.UserFeedbackCheckFailure( + _( + "This member is an administrator for the tickets system. They will always have access to the ticket anyway. ({member})" + ).format(member=member) + ) + if member in self.members: + raise commands.UserFeedbackCheckFailure( + _("This member already has access to this ticket. ({member})").format( + member=member + ) + ) + try: + await self.channel.add_user(member) + except ( + discord.HTTPException + ): # The bot haven't the permission `manage_messages` in the parent text channel. + adding_error = True + if member not in self.members: + self.members.append(member) + if adding_error: + await self.channel.send( + _( + "⚠ At least one user (the ticket owner or a team member) could not be added to the ticket thread. Maybe the user the user doesn't have access to the parent forum/text channel. If the server uses private threads in a text channel, the bot does not have the `manage_messages` permission in this channel." + ) + ) + await self.save() + return self + + async def remove_member( + self, members: typing.List[discord.Member], author: typing.Optional[discord.Member] = None + ) -> typing.Any: + config = await self.cog.get_config(self.guild, self.profile) + admin_roles_members = [] + if config["admin_roles"]: + for role in config["admin_roles"]: + admin_roles_members.extend(role.members) + support_roles_members = [] + if config["support_roles"]: + for role in config["support_roles"]: + support_roles_members.extend(role.members) + if isinstance(self.channel, discord.TextChannel): + _reason = await self.cog.get_audit_reason( + guild=self.guild, + profile=self.profile, + author=author, + reason=_("Removing a member to the ticket {ticket.id}.").format(ticket=self), + ) + for member in members: + if author is not None: + if member.bot: + raise commands.UserFeedbackCheckFailure( + _("You cannot remove a bot to a ticket ({member}).").format( + member=member + ) + ) + if not isinstance(self.owner, int) and member == self.owner: + raise commands.UserFeedbackCheckFailure( + _("You cannot remove the owner of this ticket. ({member})").format( + member=member + ) + ) + if member in admin_roles_members: + raise commands.UserFeedbackCheckFailure( + _( + "This member is an administrator for the tickets system. They will always have access to the ticket. ({member})" + ).format(member=member) + ) + if member not in self.members and member not in support_roles_members: + raise commands.UserFeedbackCheckFailure( + _( + "This member is not in the list of those authorised to access the ticket. ({member})" + ).format(member=member) + ) + await self.channel.set_permissions(member, overwrite=None, reason=_reason) + if member in self.members: + self.members.remove(member) + else: + for member in members: + if author is not None: + if member.bot: + raise commands.UserFeedbackCheckFailure( + _("You cannot remove a bot to a ticket ({member}).").format( + member=member + ) + ) + if not isinstance(self.owner, int) and member == self.owner: + raise commands.UserFeedbackCheckFailure( + _("You cannot remove the owner of this ticket. ({member})").format( + member=member + ) + ) + if member in admin_roles_members: + raise commands.UserFeedbackCheckFailure( + _( + "This member is an administrator for the tickets system. They will always have access to the ticket. ({member})" + ).format(member=member) + ) + if member not in self.members and member not in support_roles_members: + raise commands.UserFeedbackCheckFailure( + _( + "This member is not in the list of those authorised to access the ticket. ({member})" + ).format(member=member) + ) + await self.channel.remove_user(member) + if member in self.members: + self.members.remove(member) + await self.save() + return self diff --git a/tickettool/tickettool.py b/tickettool/tickettool.py new file mode 100644 index 0000000..c482cd3 --- /dev/null +++ b/tickettool/tickettool.py @@ -0,0 +1,1862 @@ +from AAA3A_utils import Cog, CogsUtils, Menu, Settings # isort:skip +from redbot.core import commands, Config # isort:skip +from redbot.core.bot import Red # isort:skip +from redbot.core.i18n import Translator, cog_i18n # isort:skip +import discord # isort:skip +import typing # isort:skip + +import asyncio +import datetime +import io +from copy import deepcopy +from functools import partial + +import chat_exporter +from redbot.core import modlog +from redbot.core.utils.chat_formatting import pagify + +from .dashboard_integration import DashboardIntegration +from .settings import settings +from .ticket import Ticket +from .utils import CustomModalConverter + +# Credits: +# General repo credits. +# Thanks to Yami for the technique in the init file of some cogs to load the interaction client only if it is not already loaded! Before this fix, when a user clicked a button, the actions would be run about 10 times, causing a huge spam and loop in the channel. + +_: Translator = Translator("TicketTool", __file__) + + +@cog_i18n(_) +class TicketTool(settings, DashboardIntegration, Cog): + """A cog to manage a Tickets system!""" + + def __init__(self, bot: Red) -> None: + super().__init__(bot=bot) + + self.config: Config = Config.get_conf( + self, + identifier=205192943327321000143939875896557571750, # 937480369417 + force_registration=True, + ) + self.CONFIG_SCHEMA: int = 4 + self.config.register_global(CONFIG_SCHEMA=None) + self.config.register_guild( + profiles={}, + default_profile_settings={ + "enable": False, + "logschannel": None, + "forum_channel": None, + "category_open": None, + "category_close": None, + "admin_roles": [], + "support_roles": [], + "view_roles": [], + "ping_roles": [], + "ticket_role": None, + "nb_max": 5, + "create_modlog": False, + "close_on_leave": False, + "create_on_react": False, + "user_can_close": True, + "delete_on_close": False, + "color": 0x01D758, + "thumbnail": "http://www.quidd.it/wp-content/uploads/2017/10/Ticket-add-icon.png", + "audit_logs": False, + "close_confirmation": False, + "emoji_open": "❓", + "emoji_close": "🔒", + "dynamic_channel_name": "{emoji}-ticket-{ticket_id}", + "last_nb": 0000, + "custom_message": None, + "embed_button": { + "title": "Create Ticket", + "description": _( + "To get help on this server or to make an order for example, you can create a ticket.\n" + "Just use the command `{prefix}ticket create` or click on the button below.\n" + "You can then use the `{prefix}ticket` subcommands to manage your ticket." + ), + "image": None, + "placeholder_dropdown": "Choose a reason to open a ticket.", + "rename_channel_dropdown": False, + }, + "custom_modal": None, + }, + tickets={}, + buttons={}, + dropdowns={}, + ) + + _settings: typing.Dict[ + str, typing.Dict[str, typing.Union[typing.List[str], typing.Any, str]] + ] = { + "enable": {"converter": bool, "description": "Enable the system."}, + "logschannel": { + "converter": typing.Union[ + discord.TextChannel, discord.VoiceChannel, discord.Thread + ], + "description": "Set the channel where the logs will be sent/saved.", + }, + "forum_channel": { + "converter": typing.Union[discord.ForumChannel, discord.TextChannel], + "description": "Set the forum channel where the opened tickets will be, or a text channel to use private threads. If it's set, `category_open` and `category_close` will be ignored (except for existing tickets).", + }, + "category_open": { + "converter": discord.CategoryChannel, + "description": "Set the category where the opened tickets will be.", + }, + "category_close": { + "converter": discord.CategoryChannel, + "description": "Set the category where the closed tickets will be.", + }, + "admin_roles": { + "converter": commands.Greedy[discord.Role], + "description": "Users with this role will have full permissions for tickets, but will not be able to set up the cog.", + }, + "support_roles": { + "converter": commands.Greedy[discord.Role], + "description": "Users with this role will be able to participate and claim the ticket.", + }, + "view_roles": { + "converter": commands.Greedy[discord.Role], + "description": "Users with this role will only be able to read messages from the ticket, but not send them.", + }, + "ping_roles": { + "converter": commands.Greedy[discord.Role], + "description": "This role will be pinged automatically when the ticket is created, but does not give any additional permissions.", + }, + "ticket_role": { + "converter": discord.Role, + "description": "This role will be added automatically to open tickets owners.", + }, + "dynamic_channel_name": { + "converter": str, + "description": "Set the template that will be used to name the channel when creating a ticket.\n\n`{ticket_id}` - Ticket number\n`{owner_display_name}` - user's nick or name\n`{owner_name}` - user's name\n`{owner_id}` - user's id\n`{guild_name}` - guild's name\n`{guild_id}` - guild's id\n`{bot_display_name}` - bot's nick or name\n`{bot_name}` - bot's name\n`{bot_id}` - bot's id\n`{shortdate}` - mm-dd\n`{longdate}` - mm-dd-yyyy\n`{time}` - hh-mm AM/PM according to bot host system time\n`{emoji}` - The open/closed emoji.", + }, + "nb_max": { + "converter": commands.Range[int, 1, None], + "description": "Sets the maximum number of open tickets a user can have on the system at any one time (for a profile only).", + }, + "custom_message": { + "converter": str, + "description": "This message will be sent in the ticket channel when the ticket is opened.\n\n`{ticket_id}` - Ticket number\n`{owner_display_name}` - user's nick or name\n`{owner_name}` - user's name\n`{owner_id}` - user's id\n`{guild_name}` - guild's name\n`{guild_id}` - guild's id\n`{bot_display_name}` - bot's nick or name\n`{bot_name}` - bot's name\n`{bot_id}` - bot's id\n`{shortdate}` - mm-dd\n`{longdate}` - mm-dd-yyyy\n`{time}` - hh-mm AM/PM according to bot host system time\n`{emoji}` - The open/closed emoji.", + "style": discord.ButtonStyle(2), + }, + "user_can_close": { + "converter": bool, + "description": "Can the author of the ticket, if he/she does not have a role set up for the system, close the ticket himself?", + }, + "close_confirmation": { + "converter": bool, + "description": "Should the bot ask for confirmation before closing the ticket (deletion will necessarily have a confirmation)?", + }, + "custom_modal": { + "converter": CustomModalConverter, + "description": "Ask a maximum of 5 questions to the user who opens a ticket, with a Discord Modal.\n\n**Example:**\n```\n[p]settickettool customodal \n- label: What is the problem?\n style: 2 # short = 1, paragraph = 2\n required: True\n default: None\n placeholder: None\n min_length: None\n max_length: None\n```", + }, + "close_on_leave": { + "converter": bool, + "description": "If a user leaves the server, will all their open tickets be closed?\n\nIf the user then returns to the server, even if their ticket is still open, the bot will not automatically add them to the ticket.", + "no_slash": True, + }, + "delete_on_close": { + "converter": bool, + "description": "Does closing the ticket directly delete it (with confirmation)?", + "no_slash": True, + }, + "modlog": { + "path": ["create_modlog"], + "converter": bool, + "description": "Does the bot create an action in the bot modlog when a ticket is created?", + "no_slash": True, + }, + "audit_logs": { + "converter": bool, + "description": "On all requests to the Discord api regarding the ticket (channel modification), does the bot send the name and id of the user who requested the action as the reason?", + "no_slash": True, + }, + "create_on_react": { + "converter": bool, + "description": "Create a ticket when the reaction 🎟️ is set on any message on the server.", + "no_slash": True, + }, + "rename_channel_dropdown": { + "path": ["embed_button", "rename_channel_dropdown"], + "converter": bool, + "description": "With Dropdowns feature, rename the ticket channel with chosen reason.", + "no_slash": True, + }, + } + self.settings: Settings = Settings( + bot=self.bot, + cog=self, + config=self.config, + group=self.config.GUILD, + settings=_settings, + global_path=["profiles"], + use_profiles_system=True, + can_edit=True, + commands_group=self.configuration, + ) + + async def cog_load(self) -> None: + await super().cog_load() + await self.edit_config_schema() + await self.settings.add_commands() + try: + await modlog.register_casetype( + "ticket_created", default_setting=True, image="🎟️", case_str="New Ticket" + ) + except RuntimeError: # The case is already registered. + pass + asyncio.create_task(self.load_buttons()) + + async def red_delete_data_for_user(self, *args, **kwargs) -> None: + """Nothing to delete. Don't delete operational tickets.""" + return + + # async def red_get_data_for_user(self, *args, **kwargs) -> typing.Dict[str, typing.Any]: + # """Nothing to get.""" + # return {} + + async def edit_config_schema(self): + CONFIG_SCHEMA = await self.config.CONFIG_SCHEMA() + if CONFIG_SCHEMA is None: + CONFIG_SCHEMA = 1 + await self.config.CONFIG_SCHEMA(CONFIG_SCHEMA) + if CONFIG_SCHEMA == self.CONFIG_SCHEMA: + return + if CONFIG_SCHEMA == 1: + guild_group = self.config._get_base_group(self.config.GUILD) + async with guild_group.all() as guilds_data: + _guilds_data = deepcopy(guilds_data) + for guild in _guilds_data: + if "settings" not in _guilds_data[guild]: + continue + if "main" in _guilds_data[guild].get("panels", []): + continue + if "panels" not in guilds_data[guild]: + guilds_data[guild]["panels"] = {} + guilds_data[guild]["panels"]["main"] = self.config._defaults[ + self.config.GUILD + ]["default_profile_settings"] + for key, value in _guilds_data[guild]["settings"].items(): + guilds_data[guild]["panels"]["main"][key] = value + del guilds_data[guild]["settings"] + CONFIG_SCHEMA = 2 + await self.config.CONFIG_SCHEMA.set(CONFIG_SCHEMA) + if CONFIG_SCHEMA == 2: + guild_group = self.config._get_base_group(self.config.GUILD) + async with guild_group.all() as guilds_data: + _guilds_data = deepcopy(guilds_data) + for guild in _guilds_data: + if "profiles" in guilds_data[guild]: + continue + if "panels" in guilds_data[guild]: + guilds_data[guild]["profiles"] = guilds_data[guild]["panels"] + del guilds_data[guild]["panels"] + if "tickets" in guilds_data[guild]: + for channel_id in guilds_data[guild]["tickets"]: + if "panel" not in guilds_data[guild]["tickets"][channel_id]: + continue + guilds_data[guild]["tickets"][channel_id]["profile"] = guilds_data[ + guild + ]["tickets"][channel_id]["panel"] + del guilds_data[guild]["tickets"][channel_id]["panel"] + if "buttons" in guilds_data[guild]: + for message_id in guilds_data[guild]["buttons"]: + if "panel" not in guilds_data[guild]["buttons"][message_id]: + continue + guilds_data[guild]["buttons"][message_id]["profile"] = guilds_data[ + guild + ]["buttons"][message_id]["panel"] + del guilds_data[guild]["buttons"][message_id]["panel"] + if "dropdowns" in guilds_data[guild]: + for message_id in guilds_data[guild]["dropdowns"]: + if "panel" not in guilds_data[guild]["dropdowns"][message_id]: + continue + guilds_data[guild]["dropdowns"][message_id]["profile"] = guilds_data[ + guild + ]["dropdowns"][message_id]["panel"] + del guilds_data[guild]["dropdowns"][message_id]["panel"] + CONFIG_SCHEMA = 3 + await self.config.CONFIG_SCHEMA.set(CONFIG_SCHEMA) + if CONFIG_SCHEMA == 3: + guild_group = self.config._get_base_group(self.config.GUILD) + async with guild_group.all() as guilds_data: + _guilds_data = deepcopy(guilds_data) + for guild in _guilds_data: + if "profiles" in guilds_data[guild]: + for profile in guilds_data[guild]["profiles"]: + if ( + guilds_data[guild]["profiles"][profile].get("admin_role") + is not None + ): + guilds_data[guild]["profiles"][profile]["admin_roles"] = [ + guilds_data[guild]["profiles"][profile]["admin_role"] + ] + del guilds_data[guild]["profiles"][profile]["admin_role"] + if ( + guilds_data[guild]["profiles"][profile].get("support_role") + is not None + ): + guilds_data[guild]["profiles"][profile]["support_roles"] = [ + guilds_data[guild]["profiles"][profile]["support_role"] + ] + del guilds_data[guild]["profiles"][profile]["support_role"] + if ( + guilds_data[guild]["profiles"][profile].get("view_role") + is not None + ): + guilds_data[guild]["profiles"][profile]["view_roles"] = [ + guilds_data[guild]["profiles"][profile]["view_role"] + ] + del guilds_data[guild]["profiles"][profile]["view_role"] + if ( + guilds_data[guild]["profiles"][profile].get("ping_role") + is not None + ): + guilds_data[guild]["profiles"][profile]["ping_roles"] = [ + guilds_data[guild]["profiles"][profile]["ping_role"] + ] + del guilds_data[guild]["profiles"][profile]["ping_role"] + CONFIG_SCHEMA = 4 + await self.config.CONFIG_SCHEMA.set(CONFIG_SCHEMA) + if CONFIG_SCHEMA < self.CONFIG_SCHEMA: + CONFIG_SCHEMA = self.CONFIG_SCHEMA + await self.config.CONFIG_SCHEMA.set(CONFIG_SCHEMA) + self.logger.info( + f"The Config schema has been successfully modified to {self.CONFIG_SCHEMA} for the {self.qualified_name} cog." + ) + + async def load_buttons(self) -> None: + await self.bot.wait_until_red_ready() + try: + view = self.get_buttons( + buttons=[ + { + "style": discord.ButtonStyle(2), + "label": _("Create ticket"), + "emoji": "🎟️", + "custom_id": "create_ticket_button", + "disabled": False, + } + ], + ) + self.bot.add_view(view) + self.views["New Ticket View"] = view + view = self.get_buttons( + buttons=[ + { + "style": discord.ButtonStyle(2), + "label": _("Close"), + "emoji": "🔒", + "custom_id": "close_ticket_button", + "disabled": False, + }, + { + "style": discord.ButtonStyle(2), + "label": _("Re-open"), + "emoji": "🔓", + "custom_id": "open_ticket_button", + "disabled": False, + }, + { + "style": discord.ButtonStyle(2), + "label": _("Claim"), + "emoji": "🙋‍♂️", + "custom_id": "claim_ticket_button", + "disabled": False, + }, + { + "style": discord.ButtonStyle(2), + "label": _("Delete"), + "emoji": "⛔", + "custom_id": "delete_ticket_button", + "disabled": False, + }, + ], + ) + self.bot.add_view(view) + self.views["Existing Ticket View"] = view + except Exception as e: + self.logger.error("The Buttons View could not be added correctly.", exc_info=e) + all_guilds = await self.config.all_guilds() + for guild in all_guilds: + for message in all_guilds[guild]["dropdowns"]: + channel = self.bot.get_channel(int((str(message).split("-"))[0])) + if channel is None: + continue + message_id = int((str(message).split("-"))[1]) + try: + options = [ + { + "label": reason_option["label"], + "value": reason_option.get("value", reason_option["label"]).strip(), + "description": reason_option.get("description", None), + "emoji": reason_option["emoji"], # reason_option.get("emoji") + "default": False, + } + for reason_option in all_guilds[guild]["dropdowns"][message] + ] + view = self.get_dropdown( + placeholder=_("Choose the reason for open a ticket."), + options=options, + ) + self.bot.add_view(view, message_id=message_id) + self.views[discord.PartialMessage(channel=channel, id=message_id)] = view + except Exception as e: + self.logger.error( + f"The Dropdown View could not be added correctly for the `{guild}-{message}` message.", + exc_info=e, + ) + + async def get_config(self, guild: discord.Guild, profile: str) -> typing.Dict[str, typing.Any]: + config = await self.config.guild(guild).profiles.get_raw(profile) + for key, value in self.config._defaults[Config.GUILD]["default_profile_settings"].items(): + if key not in config: + config[key] = value + if config["logschannel"] is not None: + config["logschannel"] = guild.get_channel_or_thread(config["logschannel"]) + if config["forum_channel"] is not None: + config["forum_channel"] = guild.get_channel(config["forum_channel"]) + if config["category_open"] is not None: + config["category_open"] = guild.get_channel(config["category_open"]) + if config["category_close"] is not None: + config["category_close"] = guild.get_channel(config["category_close"]) + if config["admin_roles"]: + config["admin_roles"] = [ + role + for role_id in config["admin_roles"] + if (role := guild.get_role(role_id)) is not None + ] + if config["support_roles"]: + config["support_roles"] = [ + role + for role_id in config["support_roles"] + if (role := guild.get_role(role_id)) is not None + ] + if config["view_roles"]: + config["view_roles"] = [ + role + for role_id in config["view_roles"] + if (role := guild.get_role(role_id)) is not None + ] + if config["ping_roles"]: + config["ping_roles"] = [ + role + for role_id in config["ping_roles"] + if (role := guild.get_role(role_id)) is not None + ] + if config["ticket_role"] is not None: + config["ticket_role"] = guild.get_role(config["ticket_role"]) + for key, value in self.config._defaults[self.config.GUILD][ + "default_profile_settings" + ].items(): + if key not in config: + config[key] = value + if len(config["embed_button"]) == 0: + config["embed_button"] = self.config._defaults[self.config.GUILD][ + "default_profile_settings" + ]["embed_button"] + else: + for key, value in self.config._defaults[self.config.GUILD]["default_profile_settings"][ + "embed_button" + ].items(): + if key not in config: + config[key] = value + return config + + async def get_ticket(self, channel: discord.TextChannel) -> Ticket: + tickets = await self.config.guild(channel.guild).tickets.all() + if str(channel.id) in tickets: + json = tickets[str(channel.id)] + else: + return None + if "profile" not in json: + json["profile"] = "main" + ticket: Ticket = Ticket.from_json(json, self.bot, self) + ticket.bot = self.bot + ticket.cog = self + ticket.guild = ticket.bot.get_guild(ticket.guild) or ticket.guild + ticket.owner = ticket.guild.get_member(ticket.owner) or ticket.owner + ticket.channel = channel + ticket.claim = ticket.guild.get_member(ticket.claim) or ticket.claim + ticket.created_by = ticket.guild.get_member(ticket.created_by) or ticket.created_by + ticket.opened_by = ticket.guild.get_member(ticket.opened_by) or ticket.opened_by + ticket.closed_by = ticket.guild.get_member(ticket.closed_by) or ticket.closed_by + ticket.deleted_by = ticket.guild.get_member(ticket.deleted_by) or ticket.deleted_by + ticket.renamed_by = ticket.guild.get_member(ticket.renamed_by) or ticket.renamed_by + ticket.locked_by = ticket.guild.get_member(ticket.locked_by) or ticket.locked_by + ticket.unlocked_by = ticket.guild.get_member(ticket.unlocked_by) or ticket.unlocked_by + members = ticket.members or [] + ticket.members = [] + ticket.members.extend(channel.guild.get_member(m) for m in members) + if ticket.created_at is not None: + ticket.created_at = datetime.datetime.fromtimestamp(ticket.created_at) + if ticket.opened_at is not None: + ticket.opened_at = datetime.datetime.fromtimestamp(ticket.opened_at) + if ticket.closed_at is not None: + ticket.closed_at = datetime.datetime.fromtimestamp(ticket.closed_at) + if ticket.deleted_at is not None: + ticket.deleted_at = datetime.datetime.fromtimestamp(ticket.deleted_at) + if ticket.renamed_at is not None: + ticket.renamed_at = datetime.datetime.fromtimestamp(ticket.renamed_at) + if ticket.locked_at is not None: + ticket.locked_at = datetime.datetime.fromtimestamp(ticket.locked_at) + if ticket.unlocked_at is not None: + ticket.unlocked_at = datetime.datetime.fromtimestamp(ticket.unlocked_at) + if ticket.first_message is not None: + ticket.first_message = ticket.channel.get_partial_message(ticket.first_message) + return ticket + + async def get_audit_reason( + self, + guild: discord.Guild, + profile: str, + author: typing.Optional[discord.Member] = None, + reason: typing.Optional[str] = None, + ) -> str: + if reason is None: + reason = _("Action taken for the ticket system.") + config = await self.get_config(guild, profile) + if author is None or not config["audit_logs"]: + return f"{reason}" + else: + return f"{author.name} ({author.id}) - {reason}" + + async def get_embed_important( + self, + ticket, + more: bool, + author: discord.Member, + title: str, + description: str, + reason: typing.Optional[str] = None, + ) -> discord.Embed: + config = await self.get_config(ticket.guild, ticket.profile) + actual_color = config["color"] + actual_thumbnail = config["thumbnail"] + embed: discord.Embed = discord.Embed() + embed.title = f"{title}" + embed.description = f"{description}" + embed.set_thumbnail(url=actual_thumbnail) + embed.color = actual_color + embed.timestamp = datetime.datetime.now(tz=datetime.timezone.utc) + embed.set_author( + name=author, + url=author.display_avatar, + icon_url=author.display_avatar, + ) + embed.set_footer( + text=ticket.guild.name, + icon_url=ticket.guild.icon, + ) + embed.add_field(inline=True, name=_("Ticket ID:"), value=f"[{ticket.profile}] {ticket.id}") + embed.add_field( + inline=True, + name=_("Owned by:"), + value=( + f"<@{ticket.owner}> ({ticket.owner})" + if isinstance(ticket.owner, int) + else f"{ticket.owner.mention} ({ticket.owner.id})" + ), + ) + if ticket.channel is not None: + embed.add_field( + inline=True, + name=_("Channel:"), + value=f"{ticket.channel.mention} - {ticket.channel.name} ({ticket.channel.id})", + ) + if more: + if ticket.closed_by is not None: + embed.add_field( + inline=False, + name=_("Closed by:"), + value=( + f"<@{ticket.closed_by}> ({ticket.closed_by})" + if isinstance(ticket.closed_by, int) + else f"{ticket.closed_by.mention} ({ticket.closed_by.id})" + ), + ) + if ticket.deleted_by is not None: + embed.add_field( + inline=True, + name=_("Deleted by:"), + value=( + f"<@{ticket.deleted_by}> ({ticket.deleted_by})" + if isinstance(ticket.deleted_by, int) + else f"{ticket.deleted_by.mention} ({ticket.deleted_by.id})" + ), + ) + if ticket.closed_at is not None: + embed.add_field( + inline=False, + name=_("Closed at:"), + value=f"{ticket.closed_at}", + ) + if reason is not None: + reason_pages = list(pagify(reason, page_length=1020)) + embed.add_field( + inline=False, + name=_("Reason:"), + value=f"{reason_pages[0]}\n..." if len(reason_pages) > 1 else reason, + ) + return embed + + async def get_embed_action( + self, ticket, author: discord.Member, action: str, reason: typing.Optional[str] = None + ) -> discord.Embed: + config = await self.get_config(ticket.guild, ticket.profile) + actual_color = config["color"] + embed: discord.Embed = discord.Embed() + embed.title = _("Ticket [{ticket.profile}] {ticket.id} - Action taken").format( + ticket=ticket + ) + embed.description = f"{action}" + embed.color = actual_color + embed.timestamp = datetime.datetime.now(tz=datetime.timezone.utc) + embed.set_author( + name=author, + url=author.display_avatar, + icon_url=author.display_avatar, + ) + embed.set_footer( + text=ticket.guild.name, + icon_url=ticket.guild.icon, + ) + embed.add_field(inline=False, name=_("Reason:"), value=f"{reason}") + return embed + + async def check_limit(self, member: discord.Member, profile: str) -> bool: + config = await self.get_config(member.guild, profile) + tickets = await self.config.guild(member.guild).tickets.all() + to_remove = [] + count = 1 + for id in tickets: + if config["forum_channel"] is not None: + channel = config["forum_channel"].get_thread(int(id)) + else: + channel = member.guild.get_channel(int(id)) + if channel is not None: + ticket: Ticket = await self.get_ticket(channel) + if ticket.profile != profile: + continue + if ticket.created_by == member and ticket.status == "open": + count += 1 + else: + to_remove.append(id) + if to_remove: + tickets = await self.config.guild(member.guild).tickets.all() + for id in to_remove: + del tickets[str(id)] + await self.config.guild(member.guild).tickets.set(tickets) + return count <= config["nb_max"] + + async def create_modlog( + self, ticket, action: str, reason: str + ) -> typing.Optional[modlog.Case]: + config = await self.get_config(ticket.guild, ticket.profile) + if config["create_modlog"]: + return await modlog.create_case( + ticket.bot, + ticket.guild, + ticket.created_at, + action_type=action, + user=ticket.created_by, + moderator=None, + reason=reason, + ) + return + + def decorator( + ticket_check: typing.Optional[bool] = False, + status: typing.Optional[str] = None, + ticket_owner: typing.Optional[bool] = False, + admin_roles: typing.Optional[bool] = False, + support_roles: typing.Optional[bool] = False, + view_roles: typing.Optional[bool] = False, + ticket_role: typing.Optional[bool] = False, + guild_owner: typing.Optional[bool] = False, + claim: typing.Optional[bool] = None, + claim_staff: typing.Optional[bool] = False, + members: typing.Optional[bool] = False, + locked: typing.Optional[bool] = None, + ) -> None: + async def pred(ctx: commands.Context) -> bool: + if not ticket_check: + return True + + cog = ctx.bot.get_cog("TicketTool") + ticket: Ticket = await cog.get_ticket(ctx.channel) + if ticket is None: + raise commands.CheckFailure(_("You're not in a ticket.")) + config = await cog.get_config(ticket.guild, ticket.profile) + if status is not None and ticket.status != status: + raise commands.CheckFailure( + _("This ticket isn't {status}ed.").format(status=status) + ) + if claim is not None: + if ticket.claim is not None: + check = True + elif ticket.claim is None: + check = False + if check != claim: + raise commands.CheckFailure( + _("This ticket is {status}.").format( + status="claimed" if check else "unclaimed" + ) + ) + if ( + locked is not None + and not isinstance(ticket.channel, discord.TextChannel) + and ticket.channel.locked != locked + ): + raise commands.CheckFailure(_("You're not allowed to lock this ticket.")) + if ctx.author.id in ctx.bot.owner_ids: + return True + if ( + ticket_owner + and not isinstance(ticket.owner, int) + and ctx.author == ticket.owner + and (ctx.command.name != "close" or config["user_can_close"]) + ): + return True + if ( + admin_roles + and config["admin_roles"] + and any(role in ctx.author.roles for role in config["admin_roles"]) + ): + return True + if ( + ( + support_roles + or (ctx.command == cog.command_delete and config["delete_on_close"]) + ) + and config["support_roles"] + and any(role in ctx.author.roles for role in config["support_roles"]) + ): + return True + if ( + view_roles + and config["view_roles"] + and any(role in ctx.author.roles for role in config["view_roles"]) + ): + return True + if ( + ticket_role + and config["ticket_role"] is not None + and ctx.author in config["ticket_role"].members + ): + return True + if guild_owner and ctx.author == ctx.guild.owner: + return True + if claim_staff and ctx.author == ticket.claim: + return True + if members and ctx.author in ticket.members: + return True + raise commands.CheckFailure(_("You're not allowed to view this ticket.")) + + return commands.check(pred) + + class ProfileConverter(commands.Converter): + async def convert(self, ctx: commands.Context, argument: str) -> str: + if len(argument) > 10: + raise commands.BadArgument(_("This profile does not exist.")) + profiles = await ctx.bot.get_cog("TicketTool").config.guild(ctx.guild).profiles() + if argument.lower() not in profiles: + raise commands.BadArgument(_("This profile does not exist.")) + return argument.lower() + + @commands.guild_only() + @commands.hybrid_group(name="ticket") + async def ticket(self, ctx: commands.Context) -> None: + """Commands for using the Tickets system. + + Many commands to manage tickets appear when you run help in a ticket channel. + """ + + async def create_ticket( + self, + ctx: commands.Context, + profile: typing.Optional[str], + reason: str = "No reason provided.", + member: typing.Optional[discord.Member] = None, + ): + if profile is None: + profiles = await self.config.guild(ctx.guild).profiles() + if profiles: + if len(profiles) == 1: + profile = list(profiles)[0] + else: + raise commands.UserFeedbackCheckFailure(_("Please provide a profile.")) + else: + raise commands.UserFeedbackCheckFailure( + _("No profile has been created on this server.") + ) + config = await self.get_config(ctx.guild, profile) + forum_channel: typing.Union[discord.ForumChannel, discord.Thread] = config["forum_channel"] + category_open: discord.CategoryChannel = config["category_open"] + category_close: discord.CategoryChannel = config["category_close"] + if not config["enable"]: + raise commands.UserFeedbackCheckFailure( + _( + "The ticket system is not enabled on this server. Please ask an administrator of this server to use the `{ctx.prefix}settickettool` subcommands to configure it." + ).format(ctx=ctx) + ) + if forum_channel is None and (category_open is None or category_close is None): + raise commands.UserFeedbackCheckFailure( + _( + "The category `open` or the category `close` have not been configured. Please ask an administrator of this server to use the `{ctx.prefix}settickettool` subcommands to configure it." + ).format(ctx=ctx) + ) + if not await self.check_limit(member or ctx.author, profile): + limit = config["nb_max"] + raise commands.UserFeedbackCheckFailure( + _("Sorry. You have already reached the limit of {limit} open tickets.").format( + limit=limit + ), + "delete_after", # An extra arg checked in `commands.Cog.cog_command_error`. + ) + if forum_channel is None: + if ( + not category_open.permissions_for(ctx.me).manage_channels + or not category_close.permissions_for(ctx.me).manage_channels + ): + raise commands.UserFeedbackCheckFailure( + _( + "The bot does not have `manage_channels` permission on the `open` and `close` categories to allow the ticket system to function properly. Please notify an administrator of this server." + ) + ) + elif ( + not forum_channel.permissions_for(ctx.me).create_private_threads + or not forum_channel.permissions_for(ctx.me).create_public_threads + ): + raise commands.UserFeedbackCheckFailure( + _( + "The bot does not have `manage_channel` permission in the forum channel to allow the ticket system to function properly. Please notify an administrator of this server." + ) + ) + if config["custom_modal"] is not None: + if getattr(ctx, "_tickettool_modal_answers", None) is None: + modal = discord.ui.Modal( + title="Create Ticket", custom_id="create_ticket_custom_modal" + ) + modal.on_submit = lambda interaction: interaction.response.defer(ephemeral=True) + inputs = [] + for _input in config["custom_modal"]: + _input["style"] = discord.TextStyle(_input["style"]) + text_input = discord.ui.TextInput(**_input) + text_input.max_length = ( + 1024 if text_input.max_length is None else min(text_input.max_length, 1024) + ) + inputs.append(text_input) + modal.add_item(text_input) + view: discord.ui.View = discord.ui.View() + + async def interaction_check(interaction: discord.Interaction): + if interaction.user.id not in [ctx.author.id] + ( + [member.id] if member is not None else [] + ) + list(ctx.bot.owner_ids): + await interaction.response.send_message( + _("You are not allowed to use this interaction."), ephemeral=True + ) + return False + return True + + view.interaction_check = interaction_check + button: discord.ui.Button = discord.ui.Button( + label="Create Ticket", emoji="🎟️", style=discord.ButtonStyle.secondary + ) + + async def send_modal(_interaction: discord.Interaction) -> None: + nonlocal interaction + interaction = _interaction + await _interaction.response.send_modal(modal) + view.stop() + + button.callback = send_modal + view.add_item(button) + message = await ctx.send( + _("Please provide the required informations by clicking on the button below."), + view=view, + ) + timeout = await view.wait() + await CogsUtils.delete_message(message) + if timeout: + return # timeout + if await modal.wait(): + return # timeout + modal_answers: typing.Dict[str, str] = { + _input.label: _input.value.strip() or "Not provided." for _input in inputs + } + else: + interaction = None + modal_answers: typing.Dict[str, str] = ctx._tickettool_modal_answers + ticket: Ticket = Ticket.instance(ctx, profile=profile, reason=reason) + ticket.owner = member or ctx.author + await ticket.create() + if config["custom_modal"] is not None: + embed: discord.Embed = discord.Embed() + embed.title = "Custom Modal" + embed.set_author( + name=( + ctx.author.display_name + if interaction is None + else interaction.user.display_name + ), + icon_url=( + ctx.author.display_avatar + if interaction is None + else interaction.user.display_avatar + ), + ) + embed.color = await ctx.embed_color() + for label, value in modal_answers.items(): + embed.add_field( + name=label, + value=value if len(value) <= 1024 else f"{value[:1021]}...", + inline=False, + ) + if config["forum_channel"] is not None: + channel = config["forum_channel"].get_thread(int(ticket.channel)) + else: + channel = ctx.guild.get_channel(int(ticket.channel)) + await channel.send(embed=embed) + ctx.ticket: Ticket = ticket + + @ticket.command(name="create", aliases=["+"]) + async def command_create( + self, + ctx: commands.Context, + profile: typing.Optional[ProfileConverter] = None, + *, + reason: str = "No reason provided.", + ) -> None: + """Create a Ticket. + + If only one profile has been created on this server, you don't need to specify its name. + """ + await self.create_ticket(ctx, profile, reason) + + @commands.mod_or_permissions(manage_channels=True) + @ticket.command(name="createfor") + async def command_createfor( + self, + ctx: commands.Context, + profile: typing.Optional[ProfileConverter], + member: discord.Member, + *, + reason: str = "No reason provided.", + ): + """Create a Ticket for a member. + + If only one profile has been created on this server, you don't need to specify its name. + """ + if member.bot: + raise commands.UserFeedbackCheckFailure(_("You cannot create a ticket for a bot.")) + elif member.top_role >= ctx.author.top_role: + raise commands.UserFeedbackCheckFailure( + _("You cannot create a ticket for a member with a higher or equal role.") + ) + await self.create_ticket(ctx, profile, reason, member=member) + + @decorator( + ticket_check=True, + status=None, + ticket_owner=True, + admin_roles=True, + support_roles=False, + view_roles=False, + ticket_role=False, + guild_owner=True, + claim=None, + claim_staff=True, + members=False, + locked=None, + ) + @ticket.command(name="export") + async def command_export(self, ctx: commands.Context) -> None: + """Export all the messages of an existing Ticket in html format. + Please note: all attachments and user avatars are saved with the Discord link in this file. + """ + ticket: Ticket = await self.get_ticket(ctx.channel) + transcript = await chat_exporter.export( + channel=ticket.channel, + limit=None, + tz_info="UTC", + guild=ticket.guild, + bot=ticket.bot, + ) + if transcript is not None: + file = discord.File( + io.BytesIO(transcript.encode()), + filename=f"transcript-ticket-{ticket.profile}-{ticket.id}.html", + ) + message = await ctx.send( + _( + "Here is the html file of the transcript of all the messages in this ticket.\nPlease note: all attachments and user avatars are saved with the Discord link in this file." + ), + file=file, + ) + embed = discord.Embed( + title="Transcript Link", + description=( + f"[Click here to view the transcript.](https://mahto.id/chat-exporter?url={message.attachments[0].url})" + ), + color=await ctx.embed_color(), + ) + await message.edit(embed=embed) + + @decorator( + ticket_check=True, + status="close", + ticket_owner=True, + admin_roles=True, + support_roles=True, + view_roles=False, + ticket_role=False, + guild_owner=True, + claim=None, + claim_staff=True, + members=False, + locked=None, + ) + @ticket.command(name="open", aliases=["reopen"]) + async def command_open( + self, ctx: commands.Context, *, reason: typing.Optional[str] = "No reason provided." + ) -> None: + """Open an existing Ticket.""" + ticket: Ticket = await self.get_ticket(ctx.channel) + config = await ctx.bot.get_cog("TicketTool").get_config(ticket.guild, ticket.profile) + if not config["enable"]: + raise commands.UserFeedbackCheckFailure( + _("The ticket system is not enabled on this server.") + ) + await ticket.open(ctx.author, reason=reason) + + @decorator( + ticket_check=True, + status="open", + ticket_owner=True, + admin_roles=True, + support_roles=True, + view_roles=False, + ticket_role=False, + guild_owner=True, + claim=None, + claim_staff=True, + members=False, + locked=None, + ) + @ticket.command(name="close") + async def command_close( + self, + ctx: commands.Context, + confirmation: typing.Optional[bool] = None, + *, + reason: typing.Optional[str] = _("No reason provided."), + ) -> None: + """Close an existing Ticket.""" + ticket: Ticket = await self.get_ticket(ctx.channel) + config = await self.get_config(ticket.guild, ticket.profile) + if config["delete_on_close"]: + await self.command_delete(ctx, confirmation=confirmation, reason=reason) + return + if confirmation is None: + config = await self.get_config(ticket.guild, ticket.profile) + confirmation = not config["close_confirmation"] + if not confirmation and not ctx.assume_yes: + embed: discord.Embed = discord.Embed() + embed.title = _("Do you really want to close the ticket {ticket.id}?").format( + ticket=ticket + ) + embed.color = config["color"] + embed.set_author( + name=ctx.author.name, + url=ctx.author.display_avatar, + icon_url=ctx.author.display_avatar, + ) + response = await CogsUtils.ConfirmationAsk(ctx, embed=embed) + if not response: + return + await ticket.close(ctx.author, reason=reason) + + @decorator( + ticket_check=True, + status=None, + ticket_owner=False, + admin_roles=True, + support_roles=False, + view_roles=False, + ticket_role=False, + guild_owner=True, + claim=None, + claim_staff=True, + members=False, + locked=False, + ) + @ticket.command(name="lock") + async def command_lock( + self, + ctx: commands.Context, + confirmation: typing.Optional[bool] = None, + *, + reason: typing.Optional[str] = _("No reason provided."), + ) -> None: + """Lock an existing Ticket.""" + ticket: Ticket = await self.get_ticket(ctx.channel) + if isinstance(ticket.channel, discord.TextChannel): + raise commands.UserFeedbackCheckFailure(_("Cannot execute action on a text channel.")) + config = await self.get_config(ticket.guild, ticket.profile) + if not confirmation and not ctx.assume_yes: + embed: discord.Embed = discord.Embed() + embed.title = _("Do you really want to lock the ticket {ticket.id}?").format( + ticket=ticket + ) + embed.color = config["color"] + embed.set_author( + name=ctx.author.name, + url=ctx.author.display_avatar, + icon_url=ctx.author.display_avatar, + ) + response = await CogsUtils.ConfirmationAsk(ctx, embed=embed) + if not response: + return + await ticket.lock(ctx.author, reason=reason) + + @decorator( + ticket_check=True, + status=None, + ticket_owner=False, + admin_roles=True, + support_roles=False, + view_roles=False, + ticket_role=False, + guild_owner=True, + claim=None, + claim_staff=True, + members=False, + locked=True, + ) + @ticket.command(name="unlock") + async def command_unlock( + self, + ctx: commands.Context, + *, + reason: typing.Optional[str] = _("No reason provided."), + ) -> None: + """Unlock an existing locked Ticket.""" + ticket: Ticket = await self.get_ticket(ctx.channel) + if isinstance(ticket.channel, discord.TextChannel): + raise commands.UserFeedbackCheckFailure(_("Cannot execute action on a text channel.")) + await ticket.unlock(ctx.author, reason=reason) + + @decorator( + ticket_check=True, + status=None, + ticket_owner=True, + admin_roles=True, + support_roles=True, + view_roles=False, + ticket_role=False, + guild_owner=True, + claim=None, + claim_staff=True, + members=False, + locked=None, + ) + @ticket.command(name="rename") + async def command_rename( + self, + ctx: commands.Context, + new_name: str, + *, + reason: typing.Optional[str] = _("No reason provided."), + ) -> None: + """Rename an existing Ticket.""" + ticket: Ticket = await self.get_ticket(ctx.channel) + await ticket.rename(new_name, ctx.author, reason=reason) + + @decorator( + ticket_check=True, + status=None, + ticket_owner=False, + admin_roles=True, + support_roles=False, + view_roles=False, + ticket_role=False, + guild_owner=True, + claim=None, + claim_staff=True, + members=False, + locked=None, + ) + @ticket.command(name="delete") + async def command_delete( + self, + ctx: commands.Context, + confirmation: typing.Optional[bool] = False, + *, + reason: typing.Optional[str] = _("No reason provided."), + ) -> None: + """Delete an existing Ticket. + + If a logs channel is defined, an html file containing all the messages of this ticket will be generated. + (Attachments are not supported, as they are saved with their Discord link) + """ + ticket: Ticket = await self.get_ticket(ctx.channel) + config = await self.get_config(ticket.guild, ticket.profile) + if not confirmation and not ctx.assume_yes: + embed: discord.Embed = discord.Embed() + embed.title = _( + "Do you really want to delete all the messages of the ticket {ticket.id}?" + ).format(ticket=ticket) + if config["logschannel"] is not None: + embed.description = _( + "If a logs channel is defined, an html file containing all the messages of this ticket will be generated. (Attachments are not supported, as they are saved with their Discord link.)" + ) + embed.color = config["color"] + embed.set_author( + name=ctx.author.name, + url=ctx.author.display_avatar, + icon_url=ctx.author.display_avatar, + ) + response = await CogsUtils.ConfirmationAsk(ctx, embed=embed) + if not response: + return + await ticket.delete(ctx.author, reason=reason) + + @decorator( + ticket_check=True, + status="open", + ticket_owner=False, + admin_roles=True, + support_roles=True, + view_roles=False, + ticket_role=False, + guild_owner=True, + claim=False, + claim_staff=False, + members=False, + locked=None, + ) + @ticket.command(name="claim") + async def command_claim( + self, + ctx: commands.Context, + member: typing.Optional[discord.Member] = None, + *, + reason: typing.Optional[str] = _("No reason provided."), + ) -> None: + """Claim an existing Ticket.""" + ticket: Ticket = await self.get_ticket(ctx.channel) + if member is None: + member = ctx.author + await ticket.claim_ticket(member, ctx.author, reason=reason) + + @decorator( + ticket_check=True, + status=None, + ticket_owner=False, + admin_roles=True, + support_roles=True, + view_roles=False, + ticket_role=False, + guild_owner=True, + claim=True, + claim_staff=True, + members=False, + locked=None, + ) + @ticket.command(name="unclaim") + async def command_unclaim( + self, ctx: commands.Context, *, reason: typing.Optional[str] = _("No reason provided.") + ) -> None: + """Unclaim an existing Ticket.""" + ticket: Ticket = await self.get_ticket(ctx.channel) + await ticket.unclaim_ticket(ticket.claim, ctx.author, reason=reason) + + @decorator( + ticket_check=True, + status="open", + ticket_owner=True, + admin_roles=True, + support_roles=False, + view_roles=False, + ticket_role=False, + guild_owner=True, + claim=None, + claim_staff=False, + members=False, + locked=None, + ) + @ticket.command(name="owner") + async def command_owner( + self, + ctx: commands.Context, + new_owner: discord.Member, + *, + reason: typing.Optional[str] = _("No reason provided."), + ) -> None: + """Change the owner of an existing Ticket.""" + ticket: Ticket = await self.get_ticket(ctx.channel) + if new_owner is None: + new_owner = ctx.author + await ticket.change_owner(new_owner, ctx.author, reason=reason) + + @decorator( + ticket_check=True, + status="open", + ticket_owner=True, + admin_roles=True, + support_roles=False, + view_roles=False, + ticket_role=False, + guild_owner=True, + claim=None, + claim_staff=True, + members=False, + locked=None, + ) + @ticket.command(name="addmember", aliases=["add"]) + async def command_addmember( + self, + ctx: commands.Context, + members: commands.Greedy[discord.Member], + ) -> None: + """Add a member to an existing Ticket.""" + ticket: Ticket = await self.get_ticket(ctx.channel) + members = list(members) + await ticket.add_member(members, ctx.author) + + @decorator( + ticket_check=True, + status=None, + ticket_owner=True, + admin_roles=True, + support_roles=False, + view_roles=False, + ticket_role=False, + guild_owner=True, + claim=None, + claim_staff=True, + members=False, + locked=None, + ) + @ticket.command(name="removemember", aliases=["remove"]) + async def command_removemember( + self, + ctx: commands.Context, + members: commands.Greedy[discord.Member], + ) -> None: + """Remove a member to an existing Ticket.""" + ticket: Ticket = await self.get_ticket(ctx.channel) + members = list(members) + await ticket.remove_member(members, ctx.author) + + @commands.admin_or_permissions(administrator=True) + @ticket.command(name="list") + async def command_list( + self, + ctx: commands.Context, + profile: ProfileConverter, + status: typing.Optional[typing.Literal["open", "close", "all"]], + owner: typing.Optional[discord.Member], + ) -> None: + """List the existing Tickets for a profile. You can provide a status and/or a ticket owner.""" + if status is None: + status = "open" + tickets = await self.config.guild(ctx.guild).tickets.all() + tickets_to_show = [] + for channel_id in tickets: + config = await self.get_config(ctx.guild, profile=profile) + if config["forum_channel"] is not None: + channel = config["forum_channel"].get_thread(int(channel_id)) + else: + channel = ctx.guild.get_channel(int(channel_id)) + if channel is None: + continue + ticket: Ticket = await self.get_ticket(channel) + if ( + ticket.profile == profile + and (owner is None or ticket.owner == owner) + and (status == "all" or ticket.status == status) + ): + tickets_to_show.append(ticket) + if not tickets_to_show: + raise commands.UserFeedbackCheckFailure(_("No tickets to show.")) + BREAK_LINE = "\n" + description = "\n".join( + [ + f"• **#{ticket.id}** - {ticket.status} - {ticket.channel.mention} - {ticket.reason.split(BREAK_LINE)[0][:30]}" + for ticket in sorted(tickets_to_show, key=lambda x: x.id) + ] + ) + pages = list(pagify(description, page_length=6000)) + embeds = [] + for page in pages: + embed: discord.Embed = discord.Embed( + title=f"Tickets in this guild - Profile {profile}" + ) + embed.description = page + embeds.append(embed) + await Menu(pages=embeds).start(ctx) + + async def on_button_interaction(self, interaction: discord.Interaction) -> None: + permissions = interaction.channel.permissions_for(interaction.user) + if not permissions.read_messages and not permissions.send_messages: + return + permissions = interaction.channel.permissions_for(interaction.guild.me) + if not permissions.read_messages and not permissions.read_message_history: + return + if not interaction.response.is_done() and interaction.data["custom_id"] not in ( + "create_ticket_button", + "close_ticket_button", + ): + await interaction.response.defer(ephemeral=True) + if interaction.data["custom_id"] == "create_ticket_button": + buttons = await self.config.guild(interaction.guild).buttons.all() + if f"{interaction.message.channel.id}-{interaction.message.id}" in buttons: + profile = buttons[f"{interaction.message.channel.id}-{interaction.message.id}"][ + "profile" + ] + else: + profile = "main" + profiles = await self.config.guild(interaction.guild).profiles() + if profile not in profiles: + await interaction.response.send_message( + _("The profile for which this button was configured no longer exists."), + ephemeral=True, + ) + return + config = await self.get_config(guild=interaction.guild, profile=profile) + if config["custom_modal"] is None: + modal = discord.ui.Modal(title="Create Ticket", custom_id="create_ticket_modal") + modal.on_submit = lambda interaction: interaction.response.defer(ephemeral=True) + # profile_input = discord.ui.TextInput( + # label="Profile", + # style=discord.TextStyle.short, + # default=profile, + # max_length=10, + # required=True, + # ) + # modal.add_item(profile_input) + reason_input = discord.ui.TextInput( + label="Why are you creating this ticket?", + style=discord.TextStyle.long, + max_length=1000, + required=False, + placeholder="No reason provided.", + ) + modal.add_item(reason_input) + await interaction.response.send_modal(modal) + if await modal.wait(): + return # timeout + # profile = profile_input.value + reason = reason_input.value or "" + kwargs = {} + else: + reason = "" + modal = discord.ui.Modal( + title="Create Ticket", custom_id="create_ticket_custom_modal" + ) + modal.on_submit = lambda interaction: interaction.response.defer(ephemeral=True) + inputs = [] + for _input in config["custom_modal"]: + _input["style"] = discord.TextStyle(_input["style"]) + text_input = discord.ui.TextInput(**_input) + text_input.max_length = ( + 1024 if text_input.max_length is None else min(text_input.max_length, 1024) + ) + inputs.append(text_input) + modal.add_item(text_input) + await interaction.response.send_modal(modal) + if await modal.wait(): + return # timeout + kwargs = { + "_tickettool_modal_answers": { + _input.label: _input.value.strip() or "Not provided." for _input in inputs + } + } + ctx = await CogsUtils.invoke_command( + bot=interaction.client, + author=interaction.user, + channel=interaction.channel, + command=f"ticket create {profile}" + (f" {reason}" if reason != "" else ""), + **kwargs, + ) + if not await discord.utils.async_all([check(ctx) for check in ctx.command.checks]): + try: + await interaction.response.send_message( + _("You are not allowed to execute this command."), ephemeral=True + ) + except discord.InteractionResponded: + await interaction.followup.send( + _("You have chosen to create a ticket."), ephemeral=True + ) + else: + try: + await interaction.response.send_message( + _("You have chosen to create a ticket."), ephemeral=True + ) + except discord.InteractionResponded: + await interaction.followup.send( + _("You have chosen to create a ticket."), ephemeral=True + ) + elif interaction.data["custom_id"] == "close_ticket_button": + modal = discord.ui.Modal( + title="Close Ticket", timeout=180, custom_id="close_ticket_modal" + ) + modal.on_submit = lambda interaction: interaction.response.defer(ephemeral=True) + reason_input = discord.ui.TextInput( + label="Why are you closing this ticket?", + style=discord.TextStyle.long, + max_length=1000, + required=False, + placeholder="No reason provided.", + ) + modal.add_item(reason_input) + await interaction.response.send_modal(modal) + timeout = await modal.wait() + if timeout: + return + reason = reason_input.value or "" + try: + await interaction.followup.send( + _( + "You have chosen to close this ticket. If this is not done, you do not have the necessary permissions to execute this command." + ), + ephemeral=True, + ) + except discord.HTTPException: + pass + ctx = await CogsUtils.invoke_command( + bot=interaction.client, + author=interaction.user, + channel=interaction.channel, + command=("ticket close" + (f" {reason}" if reason != "" else "")), + ) + elif interaction.data["custom_id"] == "open_ticket_button": + ctx = await CogsUtils.invoke_command( + bot=interaction.client, + author=interaction.user, + channel=interaction.channel, + command="ticket open", + invoke=False, + ) + try: + if not await discord.utils.async_all([check(ctx) for check in ctx.command.checks]): + await interaction.followup.send( + _("You are not allowed to execute this command."), ephemeral=True + ) + except commands.CheckFailure: + await interaction.followup.send( + _("You are not allowed to execute this command."), ephemeral=True + ) + await interaction.client.invoke(ctx) + await interaction.followup.send( + _("You have chosen to re-open this ticket."), + ephemeral=True, + ) + elif interaction.data["custom_id"] == "claim_ticket_button": + ctx = await CogsUtils.invoke_command( + bot=interaction.client, + author=interaction.user, + channel=interaction.channel, + command="ticket claim", + invoke=False, + ) + try: + if not await discord.utils.async_all([check(ctx) for check in ctx.command.checks]): + await interaction.followup.send( + _("You are not allowed to execute this command."), ephemeral=True + ) + except commands.CheckFailure: + await interaction.followup.send( + _("You are not allowed to execute this command."), ephemeral=True + ) + await interaction.client.invoke(ctx) + await interaction.followup.send( + _( + "You have chosen to claim this ticket. If this is not done, you do not have the necessary permissions to execute this command." + ), + ephemeral=True, + ) + elif interaction.data["custom_id"] == "delete_ticket_button": + ctx = await CogsUtils.invoke_command( + bot=interaction.client, + author=interaction.user, + channel=interaction.channel, + command="ticket delete", + invoke=False, + ) + try: + if not await discord.utils.async_all([check(ctx) for check in ctx.command.checks]): + await interaction.followup.send( + _("You are not allowed to execute this command."), ephemeral=True + ) + except commands.CheckFailure: + await interaction.followup.send( + _("You are not allowed to execute this command."), ephemeral=True + ) + await interaction.client.invoke(ctx) + + async def on_dropdown_interaction( + self, interaction: discord.Interaction, select_menu: discord.ui.Select + ) -> None: + options = select_menu.values + if len(options) == 0: + return + permissions = interaction.channel.permissions_for(interaction.user) + if not permissions.read_messages and not permissions.send_messages: + await interaction.response.defer() + return + permissions = interaction.channel.permissions_for(interaction.guild.me) + if not permissions.read_messages and not permissions.read_message_history: + return + dropdowns = await self.config.guild(interaction.guild).dropdowns() + if f"{interaction.message.channel.id}-{interaction.message.id}" not in dropdowns: + await interaction.response.send_message( + _("This message is not in TicketTool config."), ephemeral=True + ) + return + profile = dropdowns[f"{interaction.message.channel.id}-{interaction.message.id}"][0].get( + "profile", "main" + ) + profiles = await self.config.guild(interaction.guild).profiles() + if profile not in profiles: + await interaction.response.send_message( + _("The profile for which this dropdown was configured no longer exists."), + ephemeral=True, + ) + return + option = [option for option in select_menu.options if option.value == options[0]][0] + reason = f"{option.emoji} - {option.label}" + config = await self.get_config(guild=interaction.guild, profile=profile) + if config["custom_modal"] is not None: + modal = discord.ui.Modal(title="Create Ticket", custom_id="create_ticket_custom_modal") + modal.on_submit = lambda interaction: interaction.response.defer(ephemeral=True) + inputs = [] + for _input in config["custom_modal"]: + _input["style"] = discord.TextStyle(_input["style"]) + text_input = discord.ui.TextInput(**_input) + text_input.max_length = ( + 1024 if text_input.max_length is None else min(text_input.max_length, 1024) + ) + inputs.append(text_input) + modal.add_item(text_input) + await interaction.response.send_modal(modal) + if await modal.wait(): + return # timeout + kwargs = { + "_tickettool_modal_answers": { + _input.label: _input.value.strip() or "Not provided." for _input in inputs + } + } + else: + kwargs = {} + ctx = await CogsUtils.invoke_command( + bot=interaction.client, + author=interaction.user, + channel=interaction.channel, + command=f"ticket create {profile} {reason}", + **kwargs, + ) + if not await discord.utils.async_all( + [check(ctx) for check in ctx.command.checks] + ) or not hasattr(ctx, "ticket"): + try: + await interaction.response.send_message( + _("You are not allowed to execute this command."), ephemeral=True + ) + except discord.InteractionResponded: + await interaction.followup.send( + _("You are not allowed to execute this command."), ephemeral=True + ) + return + config = await self.get_config(interaction.guild, profile) + if config["embed_button"]["rename_channel_dropdown"]: + try: + ticket: Ticket = await self.get_ticket( + config["forum_channel"].get_thread(ctx.ticket.channel) + if config["forum_channel"] is not None + else ctx.guild.get_channel(ctx.ticket.channel) + ) + if ticket is not None: + await ticket.rename( + new_name=f"{option.emoji}-{option.value}_{interaction.user.id}".replace( + " ", "-" + ), + author=None, + ) + except discord.HTTPException: + pass + try: + await interaction.response.send_message( + _("You have chosen to create a ticket with the reason `{reason}`.").format( + reason=reason + ), + ephemeral=True, + ) + except discord.InteractionResponded: + await interaction.followup.send( + _("You have chosen to create a ticket with the reason `{reason}`.").format( + reason=reason + ), + ephemeral=True, + ) + + @commands.Cog.listener() + async def on_raw_reaction_add(self, payload: discord.RawReactionActionEvent) -> None: + if not payload.guild_id: + return + guild = self.bot.get_guild(payload.guild_id) + channel = guild.get_channel(payload.channel_id) + member = guild.get_member(payload.user_id) + if member == guild.me or member.bot: + return + if await self.bot.cog_disabled_in_guild( + cog=self, guild=guild + ) or not await self.bot.allowed_by_whitelist_blacklist(who=member): + return + profile = "main" + profiles = await self.config.guild(guild).profiles() + if profile not in profiles: + return + config = await self.get_config(guild, profile) + if config["enable"] and config["create_on_react"] and str(payload.emoji) == "🎟️": + permissions = channel.permissions_for(member) + if not permissions.read_messages and not permissions.send_messages: + return + permissions = channel.permissions_for(guild.me) + if not permissions.read_messages and not permissions.read_message_history: + return + await CogsUtils.invoke_command( + bot=self.bot, + author=member, + channel=channel, + command="ticket create", + ) + return + + @commands.Cog.listener() + async def on_message_delete(self, message: discord.Message) -> None: + if message.guild is None: + return + config = await self.config.guild(message.guild).dropdowns.all() + if f"{message.channel.id}-{message.id}" not in config: + return + del config[f"{message.channel.id}-{message.id}"] + await self.config.guild(message.guild).dropdowns.set(config) + + @commands.Cog.listener() + async def on_guild_channel_delete(self, old_channel: discord.abc.GuildChannel) -> None: + tickets = await self.config.guild(old_channel.guild).tickets.all() + if str(old_channel.id) not in tickets: + return + try: + del tickets[str(old_channel.id)] + except KeyError: + pass + await self.config.guild(old_channel.guild).tickets.set(tickets) + return + + @commands.Cog.listener() + async def on_member_remove(self, member: discord.Member) -> None: + tickets = await self.config.guild(member.guild).tickets.all() + for channel_id in tickets: + config = await self.get_config(member.guild, profile=tickets[channel_id]["profile"]) + if config["forum_channel"] is not None: + channel = config["forum_channel"].get_thread(int(channel_id)) + else: + channel = member.guild.get_channel(int(channel_id)) + if channel is None: + continue + ticket: Ticket = await self.get_ticket(channel) + if config["close_on_leave"] and ( + getattr(ticket.owner, "id", ticket.owner) == member.id and ticket.status == "open" + ): + await ticket.close(ticket.guild.me) + return + + def get_buttons(self, buttons: typing.List[dict]) -> discord.ui.View: + view = discord.ui.View(timeout=None) + for button in buttons: + if "emoji" in button: + try: + int(button["emoji"]) + except ValueError: + pass + else: + button["emoji"] = str(self.bot.get_emoji(int(button["emoji"]))) + button = discord.ui.Button(**button) + button.callback = self.on_button_interaction + view.add_item(button) + return view + + def get_dropdown(self, placeholder: str, options: typing.List[dict]) -> discord.ui.View: + view = discord.ui.View(timeout=None) + select_menu = discord.ui.Select( + placeholder=placeholder, custom_id="create_ticket_dropdown", min_values=0, max_values=1 + ) + for option in options: + if "emoji" in option: + try: + int(option["emoji"]) + except ValueError: + pass + else: + option["emoji"] = str(self.bot.get_emoji(int(option["emoji"]))) + option = discord.SelectOption(**option) + select_menu.append_option(option) + select_menu.callback = partial(self.on_dropdown_interaction, select_menu=select_menu) + view.add_item(select_menu) + return view + + @commands.Cog.listener() + async def on_assistant_cog_add( + self, assistant_cog: typing.Optional[commands.Cog] = None + ) -> None: # Vert's Assistant integration/third party. + if assistant_cog is None: + return self.get_open_tickets_list_in_server_for_assistant + schema = { + "name": "get_open_tickets_list_in_server_for_assistant", + "description": "Get open tickets for the user in this server, and their reason.", + "parameters": {"type": "object", "properties": {}, "required": []}, + } + await assistant_cog.register_function(cog_name=self.qualified_name, schema=schema) + + async def get_open_tickets_list_in_server_for_assistant( + self, user: discord.Member, *args, **kwargs + ): + if not isinstance(user, discord.Member): + return "The command isn't executed in a server." + tickets = await self.config.guild(user.guild).tickets.all() + tickets_to_show = [] + for channel_id in tickets: + config = await self.get_config(user.guild, profile=tickets[channel_id]["profile"]) + if config["forum_channel"] is not None: + channel = config["forum_channel"].get_thread(int(channel_id)) + else: + channel = user.guild.get_channel(int(channel_id)) + if channel is None: + continue + ticket: Ticket = await self.get_ticket(channel) + if (ticket.owner is not None and ticket.owner == user) and ticket.status == "open": + tickets_to_show.append(ticket) + if not tickets_to_show: + raise commands.UserFeedbackCheckFailure( + _("No open tickets by this user in this server.") + ) + BREAK_LINE = "\n" + open_tickets = "\n" + "\n".join( + [ + f"• #{ticket.id} - {ticket.channel.mention} - {ticket.reason.split(BREAK_LINE)[0][:50]}" + for ticket in sorted(tickets_to_show, key=lambda x: x.id) + ] + ) + data = { + "Open Tickets": open_tickets, + } + return [f"{key}: {value}\n" for key, value in data.items() if value is not None] diff --git a/tickettool/utils.py b/tickettool/utils.py new file mode 100644 index 0000000..5eea4a6 --- /dev/null +++ b/tickettool/utils.py @@ -0,0 +1,270 @@ +import discord # isort:skip +import typing # isort:skip +from redbot.core import commands # isort:skip +from redbot.core.i18n import Translator # isort:skip + +import re + +import yaml + +try: + from emoji import EMOJI_DATA # emoji>=2.0.0 +except ImportError: + from emoji import UNICODE_EMOJI_ENGLISH as EMOJI_DATA # emoji<2.0.0 + + +_: Translator = Translator("TicketTool", __file__) + + +class utils: + async def get_overwrites(self, ticket): + config = await ticket.bot.get_cog("TicketTool").get_config(ticket.guild, ticket.profile) + overwrites = { + ticket.owner: discord.PermissionOverwrite( + view_channel=True, + read_messages=True, + read_message_history=True, + send_messages=True, + attach_files=True, + use_application_commands=True, + ), + ticket.guild.me: discord.PermissionOverwrite( + view_channel=True, + read_messages=True, + read_message_history=True, + send_messages=True, + attach_files=True, + manage_messages=True, + manage_channels=True, + ), + ticket.guild.default_role: discord.PermissionOverwrite( + view_channel=False, + ), + } + if ticket.claim is not None: + overwrites[ticket.claim] = discord.PermissionOverwrite( + view_channel=True, + read_messages=True, + read_message_history=True, + send_messages=True, + attach_files=True, + use_application_commands=True, + ) + if config["admin_roles"]: + for role in config["admin_roles"]: + overwrites[role] = discord.PermissionOverwrite( + view_channel=True, + read_messages=True, + read_message_history=True, + send_messages=True, + attach_files=True, + manage_messages=True, + use_application_commands=True, + ) + if config["support_roles"]: + for role in config["support_roles"]: + overwrites[role] = discord.PermissionOverwrite( + view_channel=True, + read_messages=True, + read_message_history=True, + send_messages=True, + attach_files=True, + use_application_commands=True, + ) + if config["view_roles"] is not None: + for role in config["view_roles"]: + overwrites[role] = discord.PermissionOverwrite( + view_channel=True, + read_messages=True, + read_message_history=True, + add_reactions=False, + use_application_commands=False, + ) + return overwrites + + +class Emoji(commands.EmojiConverter): + async def convert( + self, ctx: commands.Context, argument: str + ) -> typing.Union[str, discord.Emoji]: + # argument = argument.strip("\N{VARIATION SELECTOR-16}") + if argument in EMOJI_DATA: + return argument + if argument in { + "🇦", + "🇧", + "🇨", + "🇩", + "🇪", + "🇫", + "🇬", + "🇭", + "🇮", + "🇯", + "🇰", + "🇱", + "🇲", + "🇳", + "🇴", + "🇵", + "🇶", + "🇷", + "🇸", + "🇹", + "🇺", + "🇻", + "🇼", + "🇽", + "🇾", + "🇿", + }: + return argument + return await super().convert(ctx, argument=argument) + + +class EmojiLabelDescriptionValueConverter(commands.Converter): + async def convert( + self, ctx: commands.Context, argument: str + ) -> typing.Tuple[str, typing.Union[discord.PartialEmoji, str]]: + arg_split = re.split(r"[;|\-]", argument) + try: + try: + emoji, label, description, value = arg_split + except ValueError: + try: + emoji, label, description = arg_split + value = label + except ValueError: + emoji, label = arg_split + description = None + value = label + except ValueError: + raise commands.BadArgument( + _( + "Emoji Label must be An emoji followed by a label, and optionnaly by a description and a value (for rename ticket channel), separated by either `;`, `,`, `|`, or `-`." + ) + ) + emoji = await Emoji().convert(ctx, emoji) + label = str(label) + return emoji, label, description, value + + +class CustomModalConverter(commands.Converter): + async def convert( + self, ctx: commands.Context, argument: str + ) -> typing.Dict[str, typing.Union[str, bool, typing.Dict, typing.List]]: + try: + argument_dict = yaml.safe_load(argument) + except yaml.YAMLError: + raise commands.BadArgument( + _( + "Error parsing YAML. Please make sure the format is valid (a YAML validator may help)" + ) + ) + required_arguments = ["label"] + optional_arguments = [ + "style", + "required", + "default", + "placeholder", + "min_length", + "max_length", + ] + if len(argument_dict) > 5: + raise commands.BadArgument(_("You can only have 5 text inputs.")) + for count, input in enumerate(argument_dict, start=1): + count += 1 + for arg in required_arguments: + if arg not in input: + raise commands.BadArgument( + _("The argument `/{count}/{arg}` is required in the YAML.").format( + count=count, arg=arg + ) + ) + for arg in input: + if arg not in required_arguments + optional_arguments: + raise commands.BadArgument( + _( + "The argument `/{count}/{arg}` is invalid in the YAML. Check the spelling." + ).format(count=count, arg=arg) + ) + if len(input["label"]) > 45: + raise commands.BadArgument( + _( + "The argument `/modal/{count}/label` must be less than 45 characters long." + ).format(count=count, arg=arg) + ) + if "style" in input: + input["style"] = str(input["style"]) + try: + style = int(input["style"]) + except ValueError: + raise commands.BadArgument( + _( + "The argument `/{count}/style` must be a number between 1 and 2." + ).format(count=count) + ) + if not 1 <= style <= 2: + raise commands.BadArgument( + _( + "The argument `/{count}/style` must be a number between 1 and 2." + ).format(count=count) + ) + input["style"] = style + else: + input["style"] = 2 + if "required" in input: + + def convert_to_bool(argument: str) -> bool: + lowered = argument.lower() + if lowered in {"yes", "y", "true", "t", "1", "enable", "on"}: + return True + elif lowered in {"no", "n", "false", "f", "0", "disable", "off"}: + return False + else: + raise commands.BadBoolArgument(lowered) + + input["required"] = str(input["required"]) + try: + input["required"] = convert_to_bool(input["required"]) + except commands.BadBoolArgument: + raise commands.BadArgument( + _( + "The argument `/{count}/required` must be a boolean (True or False)." + ).format(count=count) + ) + else: + input["required"] = True + if "default" not in input or input["default"] == "None": + input["default"] = "" + if len(input["default"]) > 4000: + raise commands.BadArgument( + _( + "The argument `/modal/{count}/default` must be less than 4000 characters long." + ).format(count=count, arg=arg) + ) + if "placeholder" not in input or input["placeholder"] == "None": + input["placeholder"] = "" + if len(input["placeholder"]) > 100: + raise commands.BadArgument( + _( + "The argument `/modal/{count}/placeholder` must be less than 100 characters long." + ).format(count=count, arg=arg) + ) + if "min_length" not in input or input["min_length"] == "None": + input["min_length"] = None + elif not 0 <= input["min_length"] <= 4000: + raise commands.BadArgument( + _( + "The argument `/modal/{count}/min_length` must be between 0 and 4000." + ).format(count=count, arg=arg) + ) + if "max_length" not in input or input["max_length"] == "None": + input["max_length"] = None + elif not 1 <= input["max_length"] <= 4000: + raise commands.BadArgument( + _( + "The argument `/modal/{count}/max_length` must be between 0 and 4000." + ).format(count=count, arg=arg) + ) + return argument_dict diff --git a/tickettool/utils_version.json b/tickettool/utils_version.json new file mode 100644 index 0000000..bfab002 --- /dev/null +++ b/tickettool/utils_version.json @@ -0,0 +1 @@ +{"needed_utils_version": 7.0} \ No newline at end of file diff --git a/viewpermissions/README.rst b/viewpermissions/README.rst new file mode 100644 index 0000000..8a91d1e --- /dev/null +++ b/viewpermissions/README.rst @@ -0,0 +1,64 @@ +.. _viewpermissions: +=============== +ViewPermissions +=============== + +This is the cog guide for the ``ViewPermissions`` cog. This guide contains the collection of commands which you can use in the cog. +Through this guide, ``[p]`` will always represent your prefix. Replace ``[p]`` with your own prefix when you use these commands in Discord. + +.. note:: + + Ensure that you are up to date by running ``[p]cog update viewpermissions``. + If there is something missing, or something that needs improving in this documentation, feel free to create an issue `here `_. + This documentation is generated everytime this cog receives an update. + +--------------- +About this cog: +--------------- + +A cog to display permissions for roles and members, at guild level or in a specified channel! + +--------- +Commands: +--------- + +Here are all the commands included in this cog (1): + +* ``[p]viewpermissions [advanced=False] [channel] [permissions] [mentionables]`` + Display permissions for roles and members, at guild level or in a specified channel. + +------------ +Installation +------------ + +If you haven't added my repo before, lets add it first. We'll call it "AAA3A-cogs" here. + +.. code-block:: ini + + [p]repo add AAA3A-cogs https://github.com/AAA3A-AAA3A/AAA3A-cogs + +Now, we can install ViewPermissions. + +.. code-block:: ini + + [p]cog install AAA3A-cogs viewpermissions + +Once it's installed, it is not loaded by default. Load it by running the following command: + +.. code-block:: ini + + [p]load viewpermissions + +---------------- +Further Support: +---------------- + +Check out my docs `here `_. +Mention me in the #support_other-cogs in the `cog support server `_ if you need any help. +Additionally, feel free to open an issue or pull request to this repo. + +-------- +Credits: +-------- + +Thanks to Kreusada for the Python code to automatically generate this documentation! \ No newline at end of file diff --git a/viewpermissions/__init__.py b/viewpermissions/__init__.py new file mode 100644 index 0000000..176fa77 --- /dev/null +++ b/viewpermissions/__init__.py @@ -0,0 +1,46 @@ +from redbot.core import errors # isort:skip +import importlib +import sys + +try: + import AAA3A_utils +except ModuleNotFoundError: + raise errors.CogLoadError( + "The needed utils to run the cog were not found. Please execute the command `[p]pipinstall git+https://github.com/AAA3A-AAA3A/AAA3A_utils.git`. A restart of the bot isn't necessary." + ) +modules = sorted( + [module for module in sys.modules if module.split(".")[0] == "AAA3A_utils"], reverse=True +) +for module in modules: + try: + importlib.reload(sys.modules[module]) + except ModuleNotFoundError: + pass +del AAA3A_utils +# import AAA3A_utils +# import json +# import os +# __version__ = AAA3A_utils.__version__ +# with open(os.path.join(os.path.dirname(__file__), "utils_version.json"), mode="r") as f: +# data = json.load(f) +# needed_utils_version = data["needed_utils_version"] +# if __version__ > needed_utils_version: +# raise errors.CogLoadError( +# "The needed utils to run the cog has a higher version than the one supported by this version of the cog. Please update the cogs of the `AAA3A-cogs` repo." +# ) +# elif __version__ < needed_utils_version: +# raise errors.CogLoadError( +# "The needed utils to run the cog has a lower version than the one supported by this version of the cog. Please execute the command `[p]pipinstall --upgrade git+https://github.com/AAA3A-AAA3A/AAA3A_utils.git`. A restart of the bot isn't necessary." +# ) + +from redbot.core.bot import Red # isort:skip +from redbot.core.utils import get_end_user_data_statement + +from .viewpermissions import ViewPermissions + +__red_end_user_data_statement__ = get_end_user_data_statement(file=__file__) + + +async def setup(bot: Red) -> None: + cog = ViewPermissions(bot) + await bot.add_cog(cog) diff --git a/viewpermissions/info.json b/viewpermissions/info.json new file mode 100644 index 0000000..6e67a29 --- /dev/null +++ b/viewpermissions/info.json @@ -0,0 +1,16 @@ +{ + "author": ["AAA3A"], + "name": "ViewPermissions", + "install_msg": "Thank you for installing this cog!\nDo `[p]help CogName` to get the list of commands and their description. If you enjoy my work, please consider donating on [Buy Me a Coffee]() or [Ko-Fi]()!", + "short": "A cog to display permissions for roles and members, at guild level or in a specified channel!", + "description": "A cog to display permissions for roles and members, at guild level or in a specified channel!", + "tags": [ + "permissions", + "discord", + "advanced", + "dev" + ], + "requirements": ["git+https://github.com/AAA3A-AAA3A/AAA3A_utils.git"], + "min_bot_version": "3.5.0", + "end_user_data_statement": "This cog does not persistently store data or metadata about users." +} \ No newline at end of file diff --git a/viewpermissions/locales/de-DE.po b/viewpermissions/locales/de-DE.po new file mode 100644 index 0000000..4502e91 --- /dev/null +++ b/viewpermissions/locales/de-DE.po @@ -0,0 +1,64 @@ +msgid "" +msgstr "" +"Project-Id-Version: aaa3a-cogs\n" +"POT-Creation-Date: 2024-07-20 22:15+0200\n" +"PO-Revision-Date: 2024-07-20 20:25\n" +"Last-Translator: \n" +"Language-Team: German\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: redgettext 3.4.2\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Crowdin-Project: aaa3a-cogs\n" +"X-Crowdin-Project-ID: 531090\n" +"X-Crowdin-Language: de\n" +"X-Crowdin-File: /[AAA3A-AAA3A.AAA3A-cogs] main/viewpermissions/locales/messages.pot\n" +"X-Crowdin-File-ID: 322\n" +"Language: de_DE\n" + +#: viewpermissions\viewpermissions.py:25 +msgid "`{argument}` isn't a valid permission name" +msgstr "{argument}\" ist kein gültiger Erlaubnisname" + +#: viewpermissions\viewpermissions.py:32 +#, docstring +msgid "A cog to display permissions for roles and members, at guild level or in a specified channel!" +msgstr "Ein Zahnrad zur Anzeige von Berechtigungen für Rollen und Mitglieder, auf Gildenebene oder in einem bestimmten Channel!" + +#: viewpermissions\viewpermissions.py:197 +msgid "Advanced " +msgstr "Fortgeschrittene " + +#: viewpermissions\viewpermissions.py:197 +#: viewpermissions\viewpermissions.py:251 +msgid "View Permissions" +msgstr "Berechtigungen anzeigen" + +#: viewpermissions\viewpermissions.py:204 +#: viewpermissions\viewpermissions.py:256 +msgid "\n" +"**Role(s):** {roles}" +msgstr "\n" +"**Rolle(n):** {roles}" + +#: viewpermissions\viewpermissions.py:208 +#: viewpermissions\viewpermissions.py:260 +msgid "\n" +"**Member(s):** {members}" +msgstr "\n" +"**Mitglied(er):** {members}" + +#: viewpermissions\viewpermissions.py:214 +msgid "\n" +"**Channel:** {channel}" +msgstr "\n" +"**Kanal:** {channel}" + +#: viewpermissions\viewpermissions.py:218 +#: viewpermissions\viewpermissions.py:266 +msgid "\n" +"**Permission(s) checked:** {permissions}" +msgstr "\n" +"**Überprüfte Erlaubnis(en):** {permissions}" + diff --git a/viewpermissions/locales/el-GR.po b/viewpermissions/locales/el-GR.po new file mode 100644 index 0000000..b78f265 --- /dev/null +++ b/viewpermissions/locales/el-GR.po @@ -0,0 +1,64 @@ +msgid "" +msgstr "" +"Project-Id-Version: aaa3a-cogs\n" +"POT-Creation-Date: 2024-07-20 22:15+0200\n" +"PO-Revision-Date: 2024-07-20 20:25\n" +"Last-Translator: \n" +"Language-Team: Greek\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: redgettext 3.4.2\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Crowdin-Project: aaa3a-cogs\n" +"X-Crowdin-Project-ID: 531090\n" +"X-Crowdin-Language: el\n" +"X-Crowdin-File: /[AAA3A-AAA3A.AAA3A-cogs] main/viewpermissions/locales/messages.pot\n" +"X-Crowdin-File-ID: 322\n" +"Language: el_GR\n" + +#: viewpermissions\viewpermissions.py:25 +msgid "`{argument}` isn't a valid permission name" +msgstr "`{argument}` δεν είναι έγκυρο όνομα δικαιώματος" + +#: viewpermissions\viewpermissions.py:32 +#, docstring +msgid "A cog to display permissions for roles and members, at guild level or in a specified channel!" +msgstr "Ένα γρανάζι για την εμφάνιση δικαιωμάτων για ρόλους και μέλη, σε επίπεδο συντεχνίας ή σε ένα συγκεκριμένο κανάλι!" + +#: viewpermissions\viewpermissions.py:197 +msgid "Advanced " +msgstr "Προχωρημένο " + +#: viewpermissions\viewpermissions.py:197 +#: viewpermissions\viewpermissions.py:251 +msgid "View Permissions" +msgstr "Προβολή δικαιωμάτων" + +#: viewpermissions\viewpermissions.py:204 +#: viewpermissions\viewpermissions.py:256 +msgid "\n" +"**Role(s):** {roles}" +msgstr "\n" +"**Ρόλος(-οι):** {roles}" + +#: viewpermissions\viewpermissions.py:208 +#: viewpermissions\viewpermissions.py:260 +msgid "\n" +"**Member(s):** {members}" +msgstr "\n" +"**Μέλη:** {members}" + +#: viewpermissions\viewpermissions.py:214 +msgid "\n" +"**Channel:** {channel}" +msgstr "\n" +"**Κανάλι:** {channel}" + +#: viewpermissions\viewpermissions.py:218 +#: viewpermissions\viewpermissions.py:266 +msgid "\n" +"**Permission(s) checked:** {permissions}" +msgstr "\n" +"**Ελεγχθείσες άδειες:** {permissions}" + diff --git a/viewpermissions/locales/es-ES.po b/viewpermissions/locales/es-ES.po new file mode 100644 index 0000000..2da5f0f --- /dev/null +++ b/viewpermissions/locales/es-ES.po @@ -0,0 +1,64 @@ +msgid "" +msgstr "" +"Project-Id-Version: aaa3a-cogs\n" +"POT-Creation-Date: 2024-07-20 22:15+0200\n" +"PO-Revision-Date: 2024-07-20 20:25\n" +"Last-Translator: \n" +"Language-Team: Spanish\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: redgettext 3.4.2\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Crowdin-Project: aaa3a-cogs\n" +"X-Crowdin-Project-ID: 531090\n" +"X-Crowdin-Language: es-ES\n" +"X-Crowdin-File: /[AAA3A-AAA3A.AAA3A-cogs] main/viewpermissions/locales/messages.pot\n" +"X-Crowdin-File-ID: 322\n" +"Language: es_ES\n" + +#: viewpermissions\viewpermissions.py:25 +msgid "`{argument}` isn't a valid permission name" +msgstr "`{argument}` no es un nombre de permiso válido" + +#: viewpermissions\viewpermissions.py:32 +#, docstring +msgid "A cog to display permissions for roles and members, at guild level or in a specified channel!" +msgstr "Un engranaje para mostrar los permisos de roles y miembros, a nivel de gremio o en un canal específico." + +#: viewpermissions\viewpermissions.py:197 +msgid "Advanced " +msgstr "Avanzado " + +#: viewpermissions\viewpermissions.py:197 +#: viewpermissions\viewpermissions.py:251 +msgid "View Permissions" +msgstr "Ver permisos" + +#: viewpermissions\viewpermissions.py:204 +#: viewpermissions\viewpermissions.py:256 +msgid "\n" +"**Role(s):** {roles}" +msgstr "\n" +"**Función(es):** {roles}" + +#: viewpermissions\viewpermissions.py:208 +#: viewpermissions\viewpermissions.py:260 +msgid "\n" +"**Member(s):** {members}" +msgstr "\n" +"**Miembro(s):** {members}" + +#: viewpermissions\viewpermissions.py:214 +msgid "\n" +"**Channel:** {channel}" +msgstr "\n" +"**Canal:** {channel}" + +#: viewpermissions\viewpermissions.py:218 +#: viewpermissions\viewpermissions.py:266 +msgid "\n" +"**Permission(s) checked:** {permissions}" +msgstr "\n" +"**Permiso(s) comprobado(s):** {permissions}" + diff --git a/viewpermissions/locales/fi-FI.po b/viewpermissions/locales/fi-FI.po new file mode 100644 index 0000000..b793526 --- /dev/null +++ b/viewpermissions/locales/fi-FI.po @@ -0,0 +1,64 @@ +msgid "" +msgstr "" +"Project-Id-Version: aaa3a-cogs\n" +"POT-Creation-Date: 2024-07-20 22:15+0200\n" +"PO-Revision-Date: 2024-07-20 20:25\n" +"Last-Translator: \n" +"Language-Team: Finnish\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: redgettext 3.4.2\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Crowdin-Project: aaa3a-cogs\n" +"X-Crowdin-Project-ID: 531090\n" +"X-Crowdin-Language: fi\n" +"X-Crowdin-File: /[AAA3A-AAA3A.AAA3A-cogs] main/viewpermissions/locales/messages.pot\n" +"X-Crowdin-File-ID: 322\n" +"Language: fi_FI\n" + +#: viewpermissions\viewpermissions.py:25 +msgid "`{argument}` isn't a valid permission name" +msgstr "`{argument}` ei ole kelvollinen käyttöoikeuden nimi." + +#: viewpermissions\viewpermissions.py:32 +#, docstring +msgid "A cog to display permissions for roles and members, at guild level or in a specified channel!" +msgstr "Näyttää rooleihin ja jäseniin liittyvät oikeudet kiltatasolla tai tietyllä kanavalla!" + +#: viewpermissions\viewpermissions.py:197 +msgid "Advanced " +msgstr "Edistynyt " + +#: viewpermissions\viewpermissions.py:197 +#: viewpermissions\viewpermissions.py:251 +msgid "View Permissions" +msgstr "Näytä käyttöoikeudet" + +#: viewpermissions\viewpermissions.py:204 +#: viewpermissions\viewpermissions.py:256 +msgid "\n" +"**Role(s):** {roles}" +msgstr "\n" +"**Rooli(t):** {roles}" + +#: viewpermissions\viewpermissions.py:208 +#: viewpermissions\viewpermissions.py:260 +msgid "\n" +"**Member(s):** {members}" +msgstr "\n" +"**Jäsen(t):** {members}" + +#: viewpermissions\viewpermissions.py:214 +msgid "\n" +"**Channel:** {channel}" +msgstr "\n" +"**Kanava:** {channel}" + +#: viewpermissions\viewpermissions.py:218 +#: viewpermissions\viewpermissions.py:266 +msgid "\n" +"**Permission(s) checked:** {permissions}" +msgstr "\n" +"**Tarkastetut luvat:** {permissions}" + diff --git a/viewpermissions/locales/fr-FR.po b/viewpermissions/locales/fr-FR.po new file mode 100644 index 0000000..4d287c3 --- /dev/null +++ b/viewpermissions/locales/fr-FR.po @@ -0,0 +1,64 @@ +msgid "" +msgstr "" +"Project-Id-Version: aaa3a-cogs\n" +"POT-Creation-Date: 2024-07-20 22:15+0200\n" +"PO-Revision-Date: 2024-07-20 20:25\n" +"Last-Translator: \n" +"Language-Team: French\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: redgettext 3.4.2\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"X-Crowdin-Project: aaa3a-cogs\n" +"X-Crowdin-Project-ID: 531090\n" +"X-Crowdin-Language: fr\n" +"X-Crowdin-File: /[AAA3A-AAA3A.AAA3A-cogs] main/viewpermissions/locales/messages.pot\n" +"X-Crowdin-File-ID: 322\n" +"Language: fr_FR\n" + +#: viewpermissions\viewpermissions.py:25 +msgid "`{argument}` isn't a valid permission name" +msgstr "`{argument}` n'est pas un nom de permission valide" + +#: viewpermissions\viewpermissions.py:32 +#, docstring +msgid "A cog to display permissions for roles and members, at guild level or in a specified channel!" +msgstr "Un bouton pour afficher les permissions pour les rôles et les membres, au niveau de la guilde ou dans un canal spécifique !" + +#: viewpermissions\viewpermissions.py:197 +msgid "Advanced " +msgstr "Avancé " + +#: viewpermissions\viewpermissions.py:197 +#: viewpermissions\viewpermissions.py:251 +msgid "View Permissions" +msgstr "Voir les autorisations" + +#: viewpermissions\viewpermissions.py:204 +#: viewpermissions\viewpermissions.py:256 +msgid "\n" +"**Role(s):** {roles}" +msgstr "\n" +"**Rôle(s):** {roles}" + +#: viewpermissions\viewpermissions.py:208 +#: viewpermissions\viewpermissions.py:260 +msgid "\n" +"**Member(s):** {members}" +msgstr "\n" +"**Membre(s):** {members}" + +#: viewpermissions\viewpermissions.py:214 +msgid "\n" +"**Channel:** {channel}" +msgstr "\n" +"**Canal:** {channel}" + +#: viewpermissions\viewpermissions.py:218 +#: viewpermissions\viewpermissions.py:266 +msgid "\n" +"**Permission(s) checked:** {permissions}" +msgstr "\n" +"**Autorisation(s) vérifiée(s):** {permissions}" + diff --git a/viewpermissions/locales/it-IT.po b/viewpermissions/locales/it-IT.po new file mode 100644 index 0000000..4642c3c --- /dev/null +++ b/viewpermissions/locales/it-IT.po @@ -0,0 +1,64 @@ +msgid "" +msgstr "" +"Project-Id-Version: aaa3a-cogs\n" +"POT-Creation-Date: 2024-07-20 22:15+0200\n" +"PO-Revision-Date: 2024-07-20 20:25\n" +"Last-Translator: \n" +"Language-Team: Italian\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: redgettext 3.4.2\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Crowdin-Project: aaa3a-cogs\n" +"X-Crowdin-Project-ID: 531090\n" +"X-Crowdin-Language: it\n" +"X-Crowdin-File: /[AAA3A-AAA3A.AAA3A-cogs] main/viewpermissions/locales/messages.pot\n" +"X-Crowdin-File-ID: 322\n" +"Language: it_IT\n" + +#: viewpermissions\viewpermissions.py:25 +msgid "`{argument}` isn't a valid permission name" +msgstr "`{argument}` non è un nome di permesso valido" + +#: viewpermissions\viewpermissions.py:32 +#, docstring +msgid "A cog to display permissions for roles and members, at guild level or in a specified channel!" +msgstr "Una rotella per visualizzare i permessi per i ruoli e i membri, a livello di gilda o in un canale specifico!" + +#: viewpermissions\viewpermissions.py:197 +msgid "Advanced " +msgstr "Avanzato " + +#: viewpermissions\viewpermissions.py:197 +#: viewpermissions\viewpermissions.py:251 +msgid "View Permissions" +msgstr "Visualizza autorizzazioni" + +#: viewpermissions\viewpermissions.py:204 +#: viewpermissions\viewpermissions.py:256 +msgid "\n" +"**Role(s):** {roles}" +msgstr "\n" +"**Ruolo(i):** {roles}" + +#: viewpermissions\viewpermissions.py:208 +#: viewpermissions\viewpermissions.py:260 +msgid "\n" +"**Member(s):** {members}" +msgstr "\n" +"**Membro/i:** {members}" + +#: viewpermissions\viewpermissions.py:214 +msgid "\n" +"**Channel:** {channel}" +msgstr "\n" +"**Canale:** {channel}" + +#: viewpermissions\viewpermissions.py:218 +#: viewpermissions\viewpermissions.py:266 +msgid "\n" +"**Permission(s) checked:** {permissions}" +msgstr "\n" +"**Autorizzazioni controllate:** {permissions}" + diff --git a/viewpermissions/locales/ja-JP.po b/viewpermissions/locales/ja-JP.po new file mode 100644 index 0000000..84b582a --- /dev/null +++ b/viewpermissions/locales/ja-JP.po @@ -0,0 +1,64 @@ +msgid "" +msgstr "" +"Project-Id-Version: aaa3a-cogs\n" +"POT-Creation-Date: 2024-07-20 22:15+0200\n" +"PO-Revision-Date: 2024-07-20 20:25\n" +"Last-Translator: \n" +"Language-Team: Japanese\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: redgettext 3.4.2\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Crowdin-Project: aaa3a-cogs\n" +"X-Crowdin-Project-ID: 531090\n" +"X-Crowdin-Language: ja\n" +"X-Crowdin-File: /[AAA3A-AAA3A.AAA3A-cogs] main/viewpermissions/locales/messages.pot\n" +"X-Crowdin-File-ID: 322\n" +"Language: ja_JP\n" + +#: viewpermissions\viewpermissions.py:25 +msgid "`{argument}` isn't a valid permission name" +msgstr "{argument}` は有効なパーミッション名ではない" + +#: viewpermissions\viewpermissions.py:32 +#, docstring +msgid "A cog to display permissions for roles and members, at guild level or in a specified channel!" +msgstr "ギルドレベルまたは指定されたチャンネルで、ロールとメンバーのパーミッションを表示するための歯車です!" + +#: viewpermissions\viewpermissions.py:197 +msgid "Advanced " +msgstr "上級 " + +#: viewpermissions\viewpermissions.py:197 +#: viewpermissions\viewpermissions.py:251 +msgid "View Permissions" +msgstr "アクセス許可の表示" + +#: viewpermissions\viewpermissions.py:204 +#: viewpermissions\viewpermissions.py:256 +msgid "\n" +"**Role(s):** {roles}" +msgstr "\n" +"**役割:** {roles}" + +#: viewpermissions\viewpermissions.py:208 +#: viewpermissions\viewpermissions.py:260 +msgid "\n" +"**Member(s):** {members}" +msgstr "\n" +"**メンバー:** {members}" + +#: viewpermissions\viewpermissions.py:214 +msgid "\n" +"**Channel:** {channel}" +msgstr "\n" +"**チャンネル:** {channel}" + +#: viewpermissions\viewpermissions.py:218 +#: viewpermissions\viewpermissions.py:266 +msgid "\n" +"**Permission(s) checked:** {permissions}" +msgstr "\n" +"** チェックされたパーミッション:** {permissions}" + diff --git a/viewpermissions/locales/messages.pot b/viewpermissions/locales/messages.pot new file mode 100644 index 0000000..e6668bd --- /dev/null +++ b/viewpermissions/locales/messages.pot @@ -0,0 +1,63 @@ +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2024-12-29 10:44+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: redgettext 3.4.2\n" + +#: viewpermissions\view.py:73 +msgid "You are not allowed to use this interaction." +msgstr "" + +#: viewpermissions\viewpermissions.py:25 +msgid "`{argument}` isn't a valid permission name" +msgstr "" + +#: viewpermissions\viewpermissions.py:32 +#, docstring +msgid "" +"A cog to display permissions for roles and members, at guild level or in a " +"specified channel!" +msgstr "" + +#: viewpermissions\viewpermissions.py:197 +msgid "Advanced " +msgstr "" + +#: viewpermissions\viewpermissions.py:197 +#: viewpermissions\viewpermissions.py:251 +msgid "View Permissions" +msgstr "" + +#: viewpermissions\viewpermissions.py:204 +#: viewpermissions\viewpermissions.py:256 +msgid "" +"\n" +"**Role(s):** {roles}" +msgstr "" + +#: viewpermissions\viewpermissions.py:208 +#: viewpermissions\viewpermissions.py:260 +msgid "" +"\n" +"**Member(s):** {members}" +msgstr "" + +#: viewpermissions\viewpermissions.py:214 +msgid "" +"\n" +"**Channel:** {channel}" +msgstr "" + +#: viewpermissions\viewpermissions.py:218 +#: viewpermissions\viewpermissions.py:266 +msgid "" +"\n" +"**Permission(s) checked:** {permissions}" +msgstr "" diff --git a/viewpermissions/locales/nl-NL.po b/viewpermissions/locales/nl-NL.po new file mode 100644 index 0000000..773a1b8 --- /dev/null +++ b/viewpermissions/locales/nl-NL.po @@ -0,0 +1,64 @@ +msgid "" +msgstr "" +"Project-Id-Version: aaa3a-cogs\n" +"POT-Creation-Date: 2024-07-20 22:15+0200\n" +"PO-Revision-Date: 2024-07-20 20:26\n" +"Last-Translator: \n" +"Language-Team: Dutch\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: redgettext 3.4.2\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Crowdin-Project: aaa3a-cogs\n" +"X-Crowdin-Project-ID: 531090\n" +"X-Crowdin-Language: nl\n" +"X-Crowdin-File: /[AAA3A-AAA3A.AAA3A-cogs] main/viewpermissions/locales/messages.pot\n" +"X-Crowdin-File-ID: 322\n" +"Language: nl_NL\n" + +#: viewpermissions\viewpermissions.py:25 +msgid "`{argument}` isn't a valid permission name" +msgstr "`{argument}` is geen geldige permissie naam" + +#: viewpermissions\viewpermissions.py:32 +#, docstring +msgid "A cog to display permissions for roles and members, at guild level or in a specified channel!" +msgstr "Een tandwiel om permissies weer te geven voor rollen en leden, op gildeniveau of in een bepaald kanaal!" + +#: viewpermissions\viewpermissions.py:197 +msgid "Advanced " +msgstr "Geavanceerd " + +#: viewpermissions\viewpermissions.py:197 +#: viewpermissions\viewpermissions.py:251 +msgid "View Permissions" +msgstr "Machtigingen bekijken" + +#: viewpermissions\viewpermissions.py:204 +#: viewpermissions\viewpermissions.py:256 +msgid "\n" +"**Role(s):** {roles}" +msgstr "\n" +"*Rol(len):** {roles}" + +#: viewpermissions\viewpermissions.py:208 +#: viewpermissions\viewpermissions.py:260 +msgid "\n" +"**Member(s):** {members}" +msgstr "\n" +"**Lid(leden):** {members}" + +#: viewpermissions\viewpermissions.py:214 +msgid "\n" +"**Channel:** {channel}" +msgstr "\n" +"**Kanaal:** {channel}" + +#: viewpermissions\viewpermissions.py:218 +#: viewpermissions\viewpermissions.py:266 +msgid "\n" +"**Permission(s) checked:** {permissions}" +msgstr "\n" +"**Gecontroleerde toestemming(en):** {permissions}" + diff --git a/viewpermissions/locales/pl-PL.po b/viewpermissions/locales/pl-PL.po new file mode 100644 index 0000000..472362d --- /dev/null +++ b/viewpermissions/locales/pl-PL.po @@ -0,0 +1,64 @@ +msgid "" +msgstr "" +"Project-Id-Version: aaa3a-cogs\n" +"POT-Creation-Date: 2024-07-20 22:15+0200\n" +"PO-Revision-Date: 2024-07-20 20:26\n" +"Last-Translator: \n" +"Language-Team: Polish\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: redgettext 3.4.2\n" +"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n" +"X-Crowdin-Project: aaa3a-cogs\n" +"X-Crowdin-Project-ID: 531090\n" +"X-Crowdin-Language: pl\n" +"X-Crowdin-File: /[AAA3A-AAA3A.AAA3A-cogs] main/viewpermissions/locales/messages.pot\n" +"X-Crowdin-File-ID: 322\n" +"Language: pl_PL\n" + +#: viewpermissions\viewpermissions.py:25 +msgid "`{argument}` isn't a valid permission name" +msgstr "`{argument}` nie jest poprawną nazwą uprawnienia" + +#: viewpermissions\viewpermissions.py:32 +#, docstring +msgid "A cog to display permissions for roles and members, at guild level or in a specified channel!" +msgstr "Tryb do wyświetlania uprawnień dla ról i członków, na poziomie gildii lub na określonym kanale!" + +#: viewpermissions\viewpermissions.py:197 +msgid "Advanced " +msgstr "Zaawansowany " + +#: viewpermissions\viewpermissions.py:197 +#: viewpermissions\viewpermissions.py:251 +msgid "View Permissions" +msgstr "Wyświetlanie uprawnień" + +#: viewpermissions\viewpermissions.py:204 +#: viewpermissions\viewpermissions.py:256 +msgid "\n" +"**Role(s):** {roles}" +msgstr "\n" +"**Rola(e):** {roles}" + +#: viewpermissions\viewpermissions.py:208 +#: viewpermissions\viewpermissions.py:260 +msgid "\n" +"**Member(s):** {members}" +msgstr "\n" +"**Członek/członkowie:** {members}" + +#: viewpermissions\viewpermissions.py:214 +msgid "\n" +"**Channel:** {channel}" +msgstr "\n" +"**Kanał:** {channel}" + +#: viewpermissions\viewpermissions.py:218 +#: viewpermissions\viewpermissions.py:266 +msgid "\n" +"**Permission(s) checked:** {permissions}" +msgstr "\n" +"**Sprawdzone uprawnienia:** {permissions}" + diff --git a/viewpermissions/locales/pt-BR.po b/viewpermissions/locales/pt-BR.po new file mode 100644 index 0000000..280c78f --- /dev/null +++ b/viewpermissions/locales/pt-BR.po @@ -0,0 +1,64 @@ +msgid "" +msgstr "" +"Project-Id-Version: aaa3a-cogs\n" +"POT-Creation-Date: 2024-07-20 22:15+0200\n" +"PO-Revision-Date: 2024-07-20 20:26\n" +"Last-Translator: \n" +"Language-Team: Portuguese, Brazilian\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: redgettext 3.4.2\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Crowdin-Project: aaa3a-cogs\n" +"X-Crowdin-Project-ID: 531090\n" +"X-Crowdin-Language: pt-BR\n" +"X-Crowdin-File: /[AAA3A-AAA3A.AAA3A-cogs] main/viewpermissions/locales/messages.pot\n" +"X-Crowdin-File-ID: 322\n" +"Language: pt_BR\n" + +#: viewpermissions\viewpermissions.py:25 +msgid "`{argument}` isn't a valid permission name" +msgstr "`{argument}` não é um nome de permissão válido" + +#: viewpermissions\viewpermissions.py:32 +#, docstring +msgid "A cog to display permissions for roles and members, at guild level or in a specified channel!" +msgstr "Uma engrenagem para exibir permissões para funções e membros, no nível da guilda ou em um canal específico!" + +#: viewpermissions\viewpermissions.py:197 +msgid "Advanced " +msgstr "Avançado " + +#: viewpermissions\viewpermissions.py:197 +#: viewpermissions\viewpermissions.py:251 +msgid "View Permissions" +msgstr "Exibir permissões" + +#: viewpermissions\viewpermissions.py:204 +#: viewpermissions\viewpermissions.py:256 +msgid "\n" +"**Role(s):** {roles}" +msgstr "\n" +"**Função(ões):** {roles}" + +#: viewpermissions\viewpermissions.py:208 +#: viewpermissions\viewpermissions.py:260 +msgid "\n" +"**Member(s):** {members}" +msgstr "\n" +"**Membro(s):** {members}" + +#: viewpermissions\viewpermissions.py:214 +msgid "\n" +"**Channel:** {channel}" +msgstr "\n" +"**Canal:** {channel}" + +#: viewpermissions\viewpermissions.py:218 +#: viewpermissions\viewpermissions.py:266 +msgid "\n" +"**Permission(s) checked:** {permissions}" +msgstr "\n" +"**Permissão(ões) verificada(s):** {permissions}" + diff --git a/viewpermissions/locales/pt-PT.po b/viewpermissions/locales/pt-PT.po new file mode 100644 index 0000000..99a9e3c --- /dev/null +++ b/viewpermissions/locales/pt-PT.po @@ -0,0 +1,64 @@ +msgid "" +msgstr "" +"Project-Id-Version: aaa3a-cogs\n" +"POT-Creation-Date: 2024-07-20 22:15+0200\n" +"PO-Revision-Date: 2024-07-20 20:26\n" +"Last-Translator: \n" +"Language-Team: Portuguese\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: redgettext 3.4.2\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Crowdin-Project: aaa3a-cogs\n" +"X-Crowdin-Project-ID: 531090\n" +"X-Crowdin-Language: pt-PT\n" +"X-Crowdin-File: /[AAA3A-AAA3A.AAA3A-cogs] main/viewpermissions/locales/messages.pot\n" +"X-Crowdin-File-ID: 322\n" +"Language: pt_PT\n" + +#: viewpermissions\viewpermissions.py:25 +msgid "`{argument}` isn't a valid permission name" +msgstr "`{argument}` não é um nome de permissão válido" + +#: viewpermissions\viewpermissions.py:32 +#, docstring +msgid "A cog to display permissions for roles and members, at guild level or in a specified channel!" +msgstr "Uma engrenagem para mostrar as permissões para papéis e membros, a nível da guilda ou num canal específico!" + +#: viewpermissions\viewpermissions.py:197 +msgid "Advanced " +msgstr "Avançado " + +#: viewpermissions\viewpermissions.py:197 +#: viewpermissions\viewpermissions.py:251 +msgid "View Permissions" +msgstr "Ver permissões" + +#: viewpermissions\viewpermissions.py:204 +#: viewpermissions\viewpermissions.py:256 +msgid "\n" +"**Role(s):** {roles}" +msgstr "\n" +"**Função(ões):** {roles}" + +#: viewpermissions\viewpermissions.py:208 +#: viewpermissions\viewpermissions.py:260 +msgid "\n" +"**Member(s):** {members}" +msgstr "\n" +"**Membro(s):** {members}" + +#: viewpermissions\viewpermissions.py:214 +msgid "\n" +"**Channel:** {channel}" +msgstr "\n" +"**Canal:** {channel}" + +#: viewpermissions\viewpermissions.py:218 +#: viewpermissions\viewpermissions.py:266 +msgid "\n" +"**Permission(s) checked:** {permissions}" +msgstr "\n" +"**Permissão(ões) verificada(s):** {permissions}" + diff --git a/viewpermissions/locales/ro-RO.po b/viewpermissions/locales/ro-RO.po new file mode 100644 index 0000000..0c0d0c2 --- /dev/null +++ b/viewpermissions/locales/ro-RO.po @@ -0,0 +1,64 @@ +msgid "" +msgstr "" +"Project-Id-Version: aaa3a-cogs\n" +"POT-Creation-Date: 2024-07-20 22:15+0200\n" +"PO-Revision-Date: 2024-07-20 20:25\n" +"Last-Translator: \n" +"Language-Team: Romanian\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: redgettext 3.4.2\n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100>0 && n%100<20)) ? 1 : 2);\n" +"X-Crowdin-Project: aaa3a-cogs\n" +"X-Crowdin-Project-ID: 531090\n" +"X-Crowdin-Language: ro\n" +"X-Crowdin-File: /[AAA3A-AAA3A.AAA3A-cogs] main/viewpermissions/locales/messages.pot\n" +"X-Crowdin-File-ID: 322\n" +"Language: ro_RO\n" + +#: viewpermissions\viewpermissions.py:25 +msgid "`{argument}` isn't a valid permission name" +msgstr "`{argument}` nu este un nume de permisiune valid" + +#: viewpermissions\viewpermissions.py:32 +#, docstring +msgid "A cog to display permissions for roles and members, at guild level or in a specified channel!" +msgstr "O rotiță pentru a afișa permisiunile pentru roluri și membri, la nivel de breaslă sau pe un canal specificat!" + +#: viewpermissions\viewpermissions.py:197 +msgid "Advanced " +msgstr "Avansat " + +#: viewpermissions\viewpermissions.py:197 +#: viewpermissions\viewpermissions.py:251 +msgid "View Permissions" +msgstr "Vizualizare permisiuni" + +#: viewpermissions\viewpermissions.py:204 +#: viewpermissions\viewpermissions.py:256 +msgid "\n" +"**Role(s):** {roles}" +msgstr "\n" +"**Rolul (rolurile):** {roles}" + +#: viewpermissions\viewpermissions.py:208 +#: viewpermissions\viewpermissions.py:260 +msgid "\n" +"**Member(s):** {members}" +msgstr "\n" +"**Membru(i):** {members}" + +#: viewpermissions\viewpermissions.py:214 +msgid "\n" +"**Channel:** {channel}" +msgstr "\n" +"**Canal:** {channel}" + +#: viewpermissions\viewpermissions.py:218 +#: viewpermissions\viewpermissions.py:266 +msgid "\n" +"**Permission(s) checked:** {permissions}" +msgstr "\n" +"**Permisiune(e) verificată(e):** {permissions}" + diff --git a/viewpermissions/locales/ru-RU.po b/viewpermissions/locales/ru-RU.po new file mode 100644 index 0000000..f68c812 --- /dev/null +++ b/viewpermissions/locales/ru-RU.po @@ -0,0 +1,64 @@ +msgid "" +msgstr "" +"Project-Id-Version: aaa3a-cogs\n" +"POT-Creation-Date: 2024-07-20 22:15+0200\n" +"PO-Revision-Date: 2024-07-20 20:26\n" +"Last-Translator: \n" +"Language-Team: Russian\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: redgettext 3.4.2\n" +"Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n" +"X-Crowdin-Project: aaa3a-cogs\n" +"X-Crowdin-Project-ID: 531090\n" +"X-Crowdin-Language: ru\n" +"X-Crowdin-File: /[AAA3A-AAA3A.AAA3A-cogs] main/viewpermissions/locales/messages.pot\n" +"X-Crowdin-File-ID: 322\n" +"Language: ru_RU\n" + +#: viewpermissions\viewpermissions.py:25 +msgid "`{argument}` isn't a valid permission name" +msgstr "`{argument}` не является действительным именем разрешения" + +#: viewpermissions\viewpermissions.py:32 +#, docstring +msgid "A cog to display permissions for roles and members, at guild level or in a specified channel!" +msgstr "Ког для отображения разрешений для ролей и членов, на уровне гильдии или в указанном канале!" + +#: viewpermissions\viewpermissions.py:197 +msgid "Advanced " +msgstr "Расширенный " + +#: viewpermissions\viewpermissions.py:197 +#: viewpermissions\viewpermissions.py:251 +msgid "View Permissions" +msgstr "Просмотр разрешений" + +#: viewpermissions\viewpermissions.py:204 +#: viewpermissions\viewpermissions.py:256 +msgid "\n" +"**Role(s):** {roles}" +msgstr "\n" +"**Роль(и):** {roles}" + +#: viewpermissions\viewpermissions.py:208 +#: viewpermissions\viewpermissions.py:260 +msgid "\n" +"**Member(s):** {members}" +msgstr "\n" +"**Член(ы):** {members}" + +#: viewpermissions\viewpermissions.py:214 +msgid "\n" +"**Channel:** {channel}" +msgstr "\n" +"**Канал:** {channel}" + +#: viewpermissions\viewpermissions.py:218 +#: viewpermissions\viewpermissions.py:266 +msgid "\n" +"**Permission(s) checked:** {permissions}" +msgstr "\n" +"**Проверено разрешение(я):** {permissions}" + diff --git a/viewpermissions/locales/tr-TR.po b/viewpermissions/locales/tr-TR.po new file mode 100644 index 0000000..6725737 --- /dev/null +++ b/viewpermissions/locales/tr-TR.po @@ -0,0 +1,64 @@ +msgid "" +msgstr "" +"Project-Id-Version: aaa3a-cogs\n" +"POT-Creation-Date: 2024-07-20 22:15+0200\n" +"PO-Revision-Date: 2024-07-21 13:27\n" +"Last-Translator: \n" +"Language-Team: Turkish\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: redgettext 3.4.2\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Crowdin-Project: aaa3a-cogs\n" +"X-Crowdin-Project-ID: 531090\n" +"X-Crowdin-Language: tr\n" +"X-Crowdin-File: /[AAA3A-AAA3A.AAA3A-cogs] main/viewpermissions/locales/messages.pot\n" +"X-Crowdin-File-ID: 322\n" +"Language: tr_TR\n" + +#: viewpermissions\viewpermissions.py:25 +msgid "`{argument}` isn't a valid permission name" +msgstr "`{argument}` geçerli bir izin adı değil" + +#: viewpermissions\viewpermissions.py:32 +#, docstring +msgid "A cog to display permissions for roles and members, at guild level or in a specified channel!" +msgstr "Roller ve üyeler için, sunucu seviyesinde veya belirtilen bir kanalda izinleri görüntülemek için bir cog!" + +#: viewpermissions\viewpermissions.py:197 +msgid "Advanced " +msgstr "Gelişmiş " + +#: viewpermissions\viewpermissions.py:197 +#: viewpermissions\viewpermissions.py:251 +msgid "View Permissions" +msgstr "İzinleri Görüntüle" + +#: viewpermissions\viewpermissions.py:204 +#: viewpermissions\viewpermissions.py:256 +msgid "\n" +"**Role(s):** {roles}" +msgstr "\n" +"**Rol(ler):** {roles}" + +#: viewpermissions\viewpermissions.py:208 +#: viewpermissions\viewpermissions.py:260 +msgid "\n" +"**Member(s):** {members}" +msgstr "\n" +"**Üye(ler):** {members}" + +#: viewpermissions\viewpermissions.py:214 +msgid "\n" +"**Channel:** {channel}" +msgstr "\n" +"**Kanal:** {channel}" + +#: viewpermissions\viewpermissions.py:218 +#: viewpermissions\viewpermissions.py:266 +msgid "\n" +"**Permission(s) checked:** {permissions}" +msgstr "\n" +"**Kontrol edilen izin(ler):** {permissions}" + diff --git a/viewpermissions/locales/uk-UA.po b/viewpermissions/locales/uk-UA.po new file mode 100644 index 0000000..77d2750 --- /dev/null +++ b/viewpermissions/locales/uk-UA.po @@ -0,0 +1,64 @@ +msgid "" +msgstr "" +"Project-Id-Version: aaa3a-cogs\n" +"POT-Creation-Date: 2024-07-20 22:15+0200\n" +"PO-Revision-Date: 2024-07-20 20:26\n" +"Last-Translator: \n" +"Language-Team: Ukrainian\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: redgettext 3.4.2\n" +"Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n" +"X-Crowdin-Project: aaa3a-cogs\n" +"X-Crowdin-Project-ID: 531090\n" +"X-Crowdin-Language: uk\n" +"X-Crowdin-File: /[AAA3A-AAA3A.AAA3A-cogs] main/viewpermissions/locales/messages.pot\n" +"X-Crowdin-File-ID: 322\n" +"Language: uk_UA\n" + +#: viewpermissions\viewpermissions.py:25 +msgid "`{argument}` isn't a valid permission name" +msgstr "`{argument}` є недійсним ім'ям дозволу" + +#: viewpermissions\viewpermissions.py:32 +#, docstring +msgid "A cog to display permissions for roles and members, at guild level or in a specified channel!" +msgstr "Гвинтик для відображення дозволів для ролей та учасників на рівні гільдії або у вказаному каналі!" + +#: viewpermissions\viewpermissions.py:197 +msgid "Advanced " +msgstr "Розширений " + +#: viewpermissions\viewpermissions.py:197 +#: viewpermissions\viewpermissions.py:251 +msgid "View Permissions" +msgstr "Дозволи на перегляд" + +#: viewpermissions\viewpermissions.py:204 +#: viewpermissions\viewpermissions.py:256 +msgid "\n" +"**Role(s):** {roles}" +msgstr "\n" +"**Ролі:** {roles}" + +#: viewpermissions\viewpermissions.py:208 +#: viewpermissions\viewpermissions.py:260 +msgid "\n" +"**Member(s):** {members}" +msgstr "\n" +"**Член(и):** {members}" + +#: viewpermissions\viewpermissions.py:214 +msgid "\n" +"**Channel:** {channel}" +msgstr "\n" +"**Канал:** {channel}" + +#: viewpermissions\viewpermissions.py:218 +#: viewpermissions\viewpermissions.py:266 +msgid "\n" +"**Permission(s) checked:** {permissions}" +msgstr "\n" +"**Дозвіл(и) перевірено:** {permissions}" + diff --git a/viewpermissions/types.py b/viewpermissions/types.py new file mode 100644 index 0000000..25b2f2b --- /dev/null +++ b/viewpermissions/types.py @@ -0,0 +1,100 @@ +import discord # isort:skip +import typing # isort:skip + +from dataclasses import dataclass + +from redbot.core.utils.chat_formatting import pagify + + +class SearchResults: + def __init__( + self, query: str, url: str, results: typing.Dict[str, str] + ) -> None: # set[str, str, bool] + self.query: str = query + self.url: str = url + self.results: typing.Dict[str, str] = results + + def __list__(self) -> typing.Set: + return self.results + + def to_embeds( + self, embed_color: discord.Color = discord.Color.green() + ) -> typing.List[discord.Embed]: + description = "\n".join( + f"**•** [**`{name}`**]({url})" for name, url in self.results.items() + ) + embeds = [] + pages = list(pagify(description, page_length=4000, delims="\n")) # delims="\n• " + embed: discord.Embed = discord.Embed( + title=f'Results for the query "{self.query}"', url=self.url, color=embed_color + ) + embed.set_footer(text="Fetched from Food52.") + for page in pages: + e = embed.copy() + e.description = page + embeds.append(e) + return embeds + + +@dataclass(frozen=True) +class Recipe: + url: str + name: str + category: str + cuisine: str + author: typing.Dict[str, str] + description: str + _yield: str + preparation_time: str + cook_time: str + rating: typing.Optional[typing.Dict[str, typing.Union[float, int]]] + images_urls: typing.List[str] + ingredients: typing.List[str] + instructions: typing.Dict[str, typing.List[str]] + + def to_json(self) -> typing.Dict[str, typing.Any]: + return { + v: getattr(self, v) + for v in dir(self) + if not v.startswith("_") and v != "to_json" and v != "to_embed" + } + + def to_embeds( + self, embed_color: discord.Color = discord.Color.green() + ) -> typing.List[discord.Embed]: + embed: discord.Embed = discord.Embed(title=self.name, url=self.url, color=embed_color) + embed.set_author( + name=self.author["name"], + url=self.author["url"], + icon_url="https://forum.mtasa.com/uploads/monthly_2016_10/Anonyme.png.4060431ce866962fa496657f752d5613.png", + ) + embed.description = ( + f"{self.description[:1250]}\n..." if len(self.description) > 1250 else self.description + ) + embed.add_field(name="Yield:", value=self._yield, inline=True) + if self.rating: + embed.add_field( + name="Note:", + value=f"{self.rating['value']}/5 with {self.rating['count']} votes", + inline=True, + ) + ingredients = "\n".join([f"**•** {ingredient}" for ingredient in self.ingredients]) + embed.add_field( + name="Ingredients:", + value=f"{ingredients[:1020]}\n..." if len(ingredients) > 1024 else ingredients, + inline=False, + ) + if self.preparation_time: + embed.add_field(name="Preparation Time:", value=self.preparation_time, inline=True) + if self.cook_time: + embed.add_field(name="Cook Time:", value=self.cook_time, inline=True) + if len(self.images_urls) == 0: + embeds = [embed] + else: + embed.set_thumbnail(url=self.images_urls[0]) + embeds = [] + for image_url in self.images_urls: + e = embed.copy() + e.set_image(url=image_url) + embeds.append(e) + return embeds diff --git a/viewpermissions/utils_version.json b/viewpermissions/utils_version.json new file mode 100644 index 0000000..bfab002 --- /dev/null +++ b/viewpermissions/utils_version.json @@ -0,0 +1 @@ +{"needed_utils_version": 7.0} \ No newline at end of file diff --git a/viewpermissions/view.py b/viewpermissions/view.py new file mode 100644 index 0000000..9e61d9e --- /dev/null +++ b/viewpermissions/view.py @@ -0,0 +1,228 @@ +from AAA3A_utils import CogsUtils # isort:skip +from redbot.core import commands # isort:skip +from redbot.core.i18n import Translator # isort:skip +import discord # isort:skip +import typing # isort:skip + +import asyncio + +_: Translator = Translator("ViewPermissions", __file__) + + +class PermissionsView(discord.ui.View): + def __init__( + self, + cog: commands.Cog, + guild: discord.Guild, + roles: typing.List[discord.Role] = None, + members: typing.List[discord.Member] = None, + channel: typing.Optional[discord.abc.GuildChannel] = None, + permissions: typing.List[str] = None, + advanced: bool = False, + ) -> None: + roles = [] if roles is None else roles.copy() + if members is None: + members = [] + if permissions is None: + permissions = [] + super().__init__(timeout=180) + self.cog: commands.Cog = cog + self.ctx: commands.Context = None + + self.guild: discord.Guild = guild + self.roles: typing.Optional[typing.List[discord.Role]] = roles + self.members: typing.Optional[typing.List[discord.Member]] = members + for member in self.members: + self.roles.extend(member.roles) + self.roles = sorted(set(self.roles)) + self.channel: typing.Optional[discord.abc.GuildChannel] = channel + self.permissions: typing.List[str] = permissions + self.advanced: bool = advanced + + self._message: discord.Message = None + self._ready: asyncio.Event = asyncio.Event() + self._current: int = 0 + self._pages: typing.List[discord.Embed] = [] + + async def start(self, ctx: commands.Context) -> discord.Message: + self.ctx: commands.Context = ctx + self._pages: typing.List[discord.Embed] = await self.cog.get_embeds( + guild=self.guild, + roles=self.roles, + members=self.members, + channel=self.channel, + permissions=self.permissions, + advanced=self.advanced, + embed_color=await self.ctx.embed_color(), + ) + # if self.permissions and self.channel is None: + # self.remove_item(self.channel_select) + # self.remove_item(self._server_permissions_button) + # self.remove_item(self._current_channel_permissions_button) + self._current: int = 0 + self._message: discord.Message = await self.ctx.send( + embed=self._pages[self._current], view=self + ) + self.cog.views[self._message] = self + await self._ready.wait() + return self._message + + async def interaction_check(self, interaction: discord.Interaction) -> bool: + if interaction.user.id not in [self.ctx.author.id] + list(self.ctx.bot.owner_ids): + await interaction.response.send_message( + _("You are not allowed to use this interaction."), ephemeral=True + ) + return False + return True + + async def on_timeout(self) -> None: + for child in self.children: + child: discord.ui.Item + if hasattr(child, "disabled") and not ( + isinstance(child, discord.ui.Button) and child.style == discord.ButtonStyle.url + ): + child.disabled = True + try: + await self._message.edit(view=self) + except discord.HTTPException: + pass + self._ready.set() + + @discord.ui.select( + cls=discord.ui.MentionableSelect, + placeholder="Select mentionables.", + min_values=0, + max_values=None, + ) + async def mentionables_select( + self, interaction: discord.Interaction, select: discord.ui.MentionableSelect + ): + await interaction.response.defer() + self.roles: typing.List[discord.Role] = [ + mentionable for mentionable in select.values if isinstance(mentionable, discord.Role) + ] + self.members: typing.List[discord.Member] = [ + mentionable for mentionable in select.values if isinstance(mentionable, discord.Member) + ] + for member in self.members: + self.roles.extend(member.roles) + self.roles = sorted(set(self.roles)) + self._pages: typing.List[discord.Embed] = await self.cog.get_embeds( + guild=self.guild, + roles=self.roles, + members=self.members, + channel=self.channel, + permissions=self.permissions, + advanced=self.advanced, + embed_color=await self.ctx.embed_color(), + ) + self._current: int = 0 + self._message: discord.Message = await self._message.edit(embed=self._pages[self._current]) + + @discord.ui.select( + cls=discord.ui.ChannelSelect, placeholder="Select channel.", min_values=0, max_values=1 + ) + async def channel_select( + self, interaction: discord.Interaction, select: discord.ui.ChannelSelect + ): + await interaction.response.defer() + self.channel = await select.values[0].fetch() if select.values else None + self._pages: typing.List[discord.Embed] = await self.cog.get_embeds( + guild=self.guild, + channel=self.channel, + roles=self.roles, + members=self.members, + permissions=self.permissions, + advanced=self.advanced, + embed_color=await self.ctx.embed_color(), + ) + self._current: int = 0 + self._message: discord.Message = await self._message.edit(embed=self._pages[self._current]) + + @discord.ui.button(emoji="◀️", custom_id="back_button", row=2) + async def _back_button(self, interaction: discord.Interaction, button: discord.ui.Button): + await interaction.response.defer() + if self._current == 0: + self._current = len(self._pages) - 1 + else: + self._current -= 1 + self._message: discord.Message = await self._message.edit(embed=self._pages[self._current]) + + @discord.ui.button(style=discord.ButtonStyle.danger, emoji="✖️", custom_id="close_page", row=2) + async def close_page( + self, interaction: discord.Interaction, button: discord.ui.Button + ) -> None: + try: + await interaction.response.defer() + except discord.errors.NotFound: + pass + self.stop() + await CogsUtils.delete_message(self._message) + self._ready.set() + + @discord.ui.button(emoji="▶️", custom_id="next_button", row=2) + async def _next_button(self, interaction: discord.Interaction, button: discord.ui.Button): + await interaction.response.defer() + if self._current < len(self._pages) - 1: + self._current += 1 + else: + self._current = 0 + self._message: discord.Message = await self._message.edit(embed=self._pages[self._current]) + + @discord.ui.button(emoji="🔄", custom_id="reload_button", row=2) + async def _reload_button(self, interaction: discord.Interaction, button: discord.ui.Button): + await interaction.response.defer() + self._pages: typing.List[discord.Embed] = await self.cog.get_embeds( + guild=self.guild, + roles=self.roles, + members=self.members, + channel=self.channel, + permissions=self.permissions, + advanced=self.advanced, + embed_color=await self.ctx.embed_color(), + ) + self._current: int = 0 + self._message: discord.Message = await self._message.edit(embed=self._pages[self._current]) + + @discord.ui.button( + label="Server Permissions", emoji="🌍", custom_id="server_permissions_button", row=3 + ) + async def _server_permissions_button( + self, interaction: discord.Interaction, button: discord.ui.Button + ): + await interaction.response.defer() + self.channel: typing.Optional[discord.abc.GuildChannel] = None + self._pages: typing.List[discord.Embed] = await self.cog.get_embeds( + guild=self.guild, + roles=self.roles, + members=self.members, + channel=self.channel, + permissions=self.permissions, + advanced=self.advanced, + embed_color=await self.ctx.embed_color(), + ) + self._current: int = 0 + self._message: discord.Message = await self._message.edit(embed=self._pages[self._current]) + + @discord.ui.button( + label="Current Channel Permissions", + emoji="📪", + custom_id="current_channel_permissions", + row=3, + ) + async def _current_channel_permissions_button( + self, interaction: discord.Interaction, button: discord.ui.Button + ): + await interaction.response.defer() + self.channel: typing.Optional[discord.abc.GuildChannel] = self.ctx.channel + self._pages: typing.List[discord.Embed] = await self.cog.get_embeds( + guild=self.guild, + roles=self.roles, + members=self.members, + channel=self.channel, + permissions=self.permissions, + advanced=self.advanced, + embed_color=await self.ctx.embed_color(), + ) + self._current: int = 0 + self._message: discord.Message = await self._message.edit(embed=self._pages[self._current]) diff --git a/viewpermissions/viewpermissions.py b/viewpermissions/viewpermissions.py new file mode 100644 index 0000000..acfb003 --- /dev/null +++ b/viewpermissions/viewpermissions.py @@ -0,0 +1,362 @@ +from AAA3A_utils import Cog # isort:skip +from redbot.core import commands # isort:skip +from redbot.core.bot import Red # isort:skip +from redbot.core.i18n import Translator, cog_i18n # isort:skip +import discord # isort:skip +import typing # isort:skip + +import datetime + +from redbot.core.utils.chat_formatting import humanize_list, pagify + +from .view import PermissionsView + +# Credits: +# General repo credits. + +_: Translator = Translator("ViewPermissions", __file__) + + +class PermissionConverter(commands.Converter): + async def convert(self, ctx: commands.Context, argument: str) -> str: + argument = argument.strip().lower() + if argument not in discord.Permissions.VALID_FLAGS: + raise commands.BadArgument( + _("`{argument}` isn't a valid permission name").format(argument=argument) + ) + return argument + + +@cog_i18n(_) +class ViewPermissions(Cog): + """A cog to display permissions for roles and members, at guild level or in a specified channel!""" + + async def get_permissions( + self, + guild: discord.Guild, + roles: typing.List[discord.Role] = None, + members: typing.List[discord.Member] = None, + channel: typing.Optional[discord.abc.GuildChannel] = None, + permissions: typing.List[str] = None, + ) -> typing.Dict[ + str, + typing.Dict[typing.Literal["qualified_name", "value", "source"], typing.Union[str, bool]], + ]: + roles = [] if roles is None else roles.copy() + if members is None: + members = [] + for member in members: + roles.extend(member.roles) + roles = sorted(set(roles)) + if permissions is None: + permissions = [] + + sources = {} + + # Thanks dpy for that (https://github.com/Rapptz/discord.py/blob/master/discord/abc.py#L666-L798)! + if any( + member == guild.owner for member in members + ): # Guild owner get all permissions -- no questions asked. Otherwise...: + base = discord.Permissions.all() + for permission_name in dict(discord.Permissions.all()): + sources[permission_name] = "Guild owner." + else: + base = discord.Permissions( + guild.default_role.permissions.value + ) # The @everyone role gets the first application. + + # Apply guild roles that the member has. + for role in roles: + base.value |= role._permissions + for permission_name, value in dict(discord.Permissions(role._permissions)).items(): + if value: + sources[permission_name] = f"{role.mention} ({role.id})" + # Guild-wide Administrator -> True for everything. + # Bypass all channel-specific overrides. + if base.administrator: + base = discord.Permissions.all() + for permission_name in dict(discord.Permissions.all()): + sources[permission_name] = "Guild administrator." + elif channel is not None: + # Apply @everyone allow/deny first since it's special. + try: + maybe_everyone = channel._overwrites[0] + if maybe_everyone.id == guild.id: + base.handle_overwrite(allow=maybe_everyone.allow, deny=maybe_everyone.deny) + for permission_name, value in dict( + discord.Permissions(maybe_everyone.allow) + ).items(): + if value: + sources[permission_name] = "Everyone channel overwrite." + remaining_overwrites = channel._overwrites[1:] + else: + remaining_overwrites = channel._overwrites + except IndexError: + remaining_overwrites = channel._overwrites + denies = 0 + allows = 0 + # Apply channel specific role permission overwrites. + roles_ids = [role.id for role in roles] + for overwrite in remaining_overwrites: + if overwrite.is_role() and overwrite.id in roles_ids: + denies |= overwrite.deny + allows |= overwrite.allow + for permission_name, value in dict( + discord.Permissions(overwrite.allow) + ).items(): + if value: + role = discord.utils.get(roles, id=overwrite.id) + sources[ + permission_name + ] = f"Role {role.mention} channel overwrite." + base.handle_overwrite(allow=allows, deny=denies) + # Apply member specific permission overwrites. + members_ids = [member.id for member in members] + for overwrite in remaining_overwrites: + if overwrite.is_member() and overwrite.id in members_ids: + base.handle_overwrite(allow=overwrite.allow, deny=overwrite.deny) + for permission_name, value in dict( + discord.Permissions(overwrite.allow) + ).items(): + if value: + sources[permission_name] = "Member channel overwrite." + break + + if any(member.is_timed_out() for member in members): + # Timeout leads to every permission except VIEW_CHANNEL and READ_MESSAGE_HISTORY being explicitly denied. + # N.B.: This *must* come last, because it's a conclusive mask. + base.value &= discord.Permissions._timeout_mask() + + # Apply implicit channel permissions. + channel._apply_implicit_permissions(base) + if isinstance(channel, (discord.TextChannel, discord.ForumChannel)): + base.value &= ( + ~discord.Permissions.voice().value + ) # Text channels do not have voice related permissions. + elif isinstance(channel, discord.VoiceChannel): + # Voice channels cannot be edited by people who can't connect to them. + # It also implicitly denies all other voice perms. + if not base.connect: + denied = discord.Permissions.voice() + denied.update(manage_channels=True, manage_roles=True) + base.value &= ~denied.value + + permissions_values = [ + discord.Permissions.VALID_FLAGS[permission_name] for permission_name in permissions + ] + permissions_dict = { + permission_name: { + "qualified_name": ( + ( + [ + p + for p in discord.Permissions.VALID_FLAGS + if discord.Permissions.VALID_FLAGS[p] + == discord.Permissions.VALID_FLAGS[permission_name] + ][-1] + .replace("_", " ") + .title() + ) + if permission_name != "manage_roles" + else permission_name.replace("_", " ").title() + ), + "value": value, + "source": sources.get(permission_name) if value else None, + } + for permission_name, value in dict(base).items() + if not permissions_values + or discord.Permissions.VALID_FLAGS[permission_name] in permissions_values + } + return base, permissions_dict + + async def get_embeds( + self, + guild: discord.Guild, + roles: typing.List[discord.Role] = None, + members: typing.List[discord.Member] = None, + channel: typing.Optional[discord.abc.GuildChannel] = None, + permissions: typing.List[str] = None, + advanced: bool = False, + embed_color: discord.Color = discord.Color.green(), + ) -> typing.List[discord.Embed]: + roles = [] if roles is None else roles.copy() + if members is None: + members = [] + for member in members: + roles.extend(member.roles) + roles = sorted(set(roles)) + if permissions is None: + permissions = [] + + embeds: typing.List[discord.Embed] = [] + if not permissions or channel is not None: + __, permissions_dict = await self.get_permissions( + guild=guild, roles=roles, members=members, channel=channel, permissions=permissions + ) + embed: discord.Embed = discord.Embed( + title=(_("Advanced ") if advanced else "") + _("View Permissions"), + color=embed_color, + ) + embed.set_author(name=guild.name, icon_url=guild.icon) + embed.timestamp = datetime.datetime.now(tz=datetime.timezone.utc) + description = "" + if roles: + description += _("\n**Role(s):** {roles}").format( + roles=humanize_list([f"{role.mention} ({role.id})" for role in roles]) + ) + if members: + description += _("\n**Member(s):** {members}").format( + members=humanize_list( + [f"{member.mention} ({member.id})" for member in members] + ) + ) + if channel: + description += _("\n**Channel:** {channel}").format( + channel=f"{channel.mention} ({channel.id})" + ) + if permissions: + description += _("\n**Permission(s) checked:** {permissions}").format( + permissions=humanize_list( + [f"`{permission_name}`" for permission_name in permissions] + ) + ) + embed.description = ( + description if len(description) <= 4000 else f"{description[:3997]}..." + ) + if not advanced: + e = embed.copy() + permissions_strings = "\n".join( + f"{'✅' if args['value'] else '❌'} {args['qualified_name']}" + for __, args in permissions_dict.items() + ) + for page in pagify(permissions_strings, page_length=1024 // 3): + e.add_field(name="\u200c", value=page, inline=True) + embeds.append(e) + else: + max_len = ( + max(len(args["qualified_name"]) for args in permissions_dict.values()) + 2 + ) + permissions_strings = "\n".join( + f"`{' ' * (max_len - len(args['qualified_name']) - 2)}{args['qualified_name']}` {'✅' if args['value'] else '❌'}{f' {source}' if (source := args['source']) is not None else ''}" + for __, args in permissions_dict.items() + ) + embeds: typing.List[discord.Embed] = [] + pages = list(pagify(permissions_strings, page_length=1024)) + for i, page in enumerate(pages, start=1): + e = embed.copy() + e.add_field(name="\u200c", value=page, inline=True) + e.set_footer(text=f"Page {i}/{len(pages)}") + embeds.append(e) + else: + embed: discord.Embed = discord.Embed(title=_("View Permissions"), color=embed_color) + embed.set_author(name=guild.name, icon_url=guild.icon) + embed.timestamp = datetime.datetime.now(tz=datetime.timezone.utc) + description = "" + if roles: + description += _("\n**Role(s):** {roles}").format( + roles=humanize_list([f"{role.mention} ({role.id})" for role in roles]) + ) + if members: + description += _("\n**Member(s):** {members}").format( + members=humanize_list( + [f"{member.mention} ({member.id})" for member in members] + ) + ) + if permissions: + description += _("\n**Permission(s) checked:** {permissions}").format( + permissions=humanize_list( + [f"`{permission_name}`" for permission_name in permissions] + ) + ) + embed.description = ( + description if len(description) <= 4000 else f"{description[:3997]}..." + ) + _description = [] + channels = sorted( + [channel for channel in guild.text_channels if channel.category is None], + key=lambda channel: channel.position, + ) + channels.extend( + sorted( + [channel for channel in guild.voice_channels if channel.category is None], + key=lambda channel: channel.position, + ) + ) + for category in guild.categories: + if not category.channels: + continue + channels.append(category) + channels.extend( + sorted( + category.channels, + key=lambda channel: ( + 1 if channel.type == discord.ChannelType.voice else 0, + channel.position, + ), + ) + ) + for channel in channels: + if isinstance(channel, discord.CategoryChannel): + _description.append(f"\n**{channel.name.upper()}:**") + continue + __, permissions_dict = await self.get_permissions( + guild=guild, + roles=roles, + members=members, + channel=channel, + permissions=permissions, + ) + _description.append( + f"• {'✅' if all(value['value'] for value in permissions_dict.values()) else '❌'} {channel.mention} ({channel.id})" + ) + description = "\n".join(_description) + embeds: typing.List[discord.Embed] = [] + pages = list(pagify(description, page_length=1024)) + for i, page in enumerate(pages, start=1): + e = embed.copy() + e.add_field(name="\u200c", value=page, inline=True) + e.set_footer(text=f"Page {i}/{len(pages)}") + embeds.append(e) + + return embeds + + @commands.guild_only() + @commands.bot_has_permissions(embed_links=True) + @commands.hybrid_command(aliases=["viewperms", "permsview"]) + async def viewpermissions( + self, + ctx: commands.Context, + advanced: typing.Optional[bool] = False, + channel: typing.Optional[discord.abc.GuildChannel] = None, + permissions: commands.Greedy[PermissionConverter] = None, + mentionables: commands.Greedy[typing.Union[discord.Role, discord.Member]] = None, + ) -> None: # commands.CurrentChannel + """Display permissions for roles and members, at guild level or in a specified channel. + + - You can specify several roles and members, and their permissions will be added together. + - If you don't provide a channel, only permissions at the guild level will be displayed. + - If you provide permission(s) and a channel, only these permissions will be displayed for this channel. + - If you provide permission(s) and no channel, all guild channels will be displayed, with a tick if all the specified permissions are true in the channel. + - If you provide permission(s) and no mentionables, the everyone role is used. + """ + if permissions is None: + permissions = [] + if mentionables is None: + mentionables = [] + roles = [ + mentionable for mentionable in mentionables if isinstance(mentionable, discord.Role) + ] + members = [ + mentionable for mentionable in mentionables if isinstance(mentionable, discord.Member) + ] + for member in members: + roles.extend(member.roles) + await PermissionsView( + cog=self, + guild=ctx.guild, + roles=sorted(set(roles)), + members=members, + channel=getattr(channel, "parent", channel), + permissions=permissions, + advanced=advanced, + ).start(ctx)