diff --git a/CaptureSight/include/ui/MainApplication.hpp b/CaptureSight/include/ui/MainApplication.hpp index 4c4f1351..4483ea48 100644 --- a/CaptureSight/include/ui/MainApplication.hpp +++ b/CaptureSight/include/ui/MainApplication.hpp @@ -9,6 +9,7 @@ #include #include #include +#include #include #include #include @@ -32,6 +33,7 @@ class MainApplication : public pu::ui::Application { std::vector> m_dens; bool m_isShowingExtraDetail = false; PokemonSummaryLayout::Ref m_pokemonSummaryLayout; + PokemonTypeLayout::Ref m_pokemonTypeLayout; MainMenuLayout::Ref m_mainMenuLayout; PokemonListLayout::Ref m_pokemonListLayout; RaidSearchResultLayout::Ref m_raidSearchResultLayout; @@ -48,7 +50,9 @@ class MainApplication : public pu::ui::Application { void OnInputRaidSearchResultLayout(u64 Down, u64 Up, u64 Held, pu::ui::Touch Pos); void OnInputDenList(u64 seed); void OnInputPokemonListLayout(u64 Down, u64 Up, u64 Held, pu::ui::Touch Pos); + void OnInputDenMenuLayout(u64 Down, u64 Up, u64 Held, pu::ui::Touch Pos); void OnInputRaidSearchSettingsLayout(u64 Down, u64 Up, u64 Held, pu::ui::Touch Pos); + void ShowPKMTypeMatchUps(std::shared_ptr pkm); void SelectPokemonSlot(u32 slot); void IncreaseSlot(u32 slotIncrease); void DecreaseSlot(u32 slotDecrease); diff --git a/CaptureSight/include/ui/views/DenMenuLayout.hpp b/CaptureSight/include/ui/views/DenMenuLayout.hpp index 9b5b47a9..9316d023 100644 --- a/CaptureSight/include/ui/views/DenMenuLayout.hpp +++ b/CaptureSight/include/ui/views/DenMenuLayout.hpp @@ -12,6 +12,7 @@ class DenMenuLayout : public pu::ui::Layout { void UpdateValues(std::vector> dens); void SetOnInputMenuItem(std::function onInput); void ClickMenuItem(u64 seed); + s32 GetSelectedIndex(); private: pu::ui::elm::Menu::Ref m_menu; diff --git a/CaptureSight/include/ui/views/PokemonListLayout.hpp b/CaptureSight/include/ui/views/PokemonListLayout.hpp index 475c0d93..7d0f79fc 100644 --- a/CaptureSight/include/ui/views/PokemonListLayout.hpp +++ b/CaptureSight/include/ui/views/PokemonListLayout.hpp @@ -12,10 +12,12 @@ class PokemonListLayout : public pu::ui::Layout { void UpdateValues(std::vector> pk8s, std::function GetTitle); void SetOnInputMenuItem(std::function onInput); void SetSelectedIndex(u32 index); + s32 GetSelectedIndex(); private: pu::ui::elm::Menu::Ref m_menu; std::function m_onMenuItemInput; + pu::ui::elm::TextBlock::Ref m_instructionTextBlock; pu::ui::elm::MenuItem::Ref CreateMenuItem(std::shared_ptr pk8, u32 slot, std::string title); void ClickMenuItem(u32 slot); }; \ No newline at end of file diff --git a/CaptureSight/include/ui/views/PokemonTypeLayout.hpp b/CaptureSight/include/ui/views/PokemonTypeLayout.hpp new file mode 100644 index 00000000..b9e4b631 --- /dev/null +++ b/CaptureSight/include/ui/views/PokemonTypeLayout.hpp @@ -0,0 +1,17 @@ +#pragma once + +#include +#include +#include + +class PokemonTypeLayout : public pu::ui::Layout { + public: + PU_SMART_CTOR(PokemonTypeLayout) + void SetTypeMatchUps(std::vector defensiveMatchUps, + std::vector offensiveMatchUps); + + private: + void AddMatchUpBlock(std::vector matchUps, std::string header, std::string firstMatchUpName, + std::string secondMatchUpName, u32 baseX); + void AddMatchUpText(std::vector matchUps, std::string matchUpName, u32 x, u32 y); +}; \ No newline at end of file diff --git a/CaptureSight/source/ui/MainApplication.cpp b/CaptureSight/source/ui/MainApplication.cpp index 1a805402..5460f35f 100644 --- a/CaptureSight/source/ui/MainApplication.cpp +++ b/CaptureSight/source/ui/MainApplication.cpp @@ -55,6 +55,8 @@ void MainApplication::OnLoad() { m_pokemonSummaryLayout->SetOnInput(std::bind(&MainApplication::OnInputPokemonSummaryLayout, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4)); + SETUP_LAYOUT(PokemonTypeLayout, m_pokemonTypeLayout); + SETUP_LAYOUT(MainMenuLayout, m_mainMenuLayout); m_mainMenuLayout->SetOnInputMenuItem(std::bind(&MainApplication::SetViewMode, this, std::placeholders::_1)); m_mainMenuLayout->Add(m_versionTextBlock); @@ -71,6 +73,9 @@ void MainApplication::OnLoad() { SETUP_LAYOUT(DenMenuLayout, m_denMenuLayout); m_denMenuLayout->SetOnInputMenuItem(std::bind(&MainApplication::OnInputDenList, this, std::placeholders::_1)); + m_denMenuLayout->UpdateValues(m_dens); + m_denMenuLayout->SetOnInput(std::bind(&MainApplication::OnInputDenMenuLayout, this, std::placeholders::_1, + std::placeholders::_2, std::placeholders::_3, std::placeholders::_4)); SETUP_LAYOUT(RaidSearchSettingsLayout, m_raidSearchSettingsLayout); m_raidSearchSettingsLayout->SetOnInput(std::bind(&MainApplication::OnInputRaidSearchSettingsLayout, this, std::placeholders::_1, @@ -113,9 +118,28 @@ void MainApplication::OnInputPokemonListLayout(u64 Down, u64 Up, u64 Held, pu::u this->DecreaseSlot(30); } else if (Down & KEY_R) { this->IncreaseSlot(30); + } else if (Down & KEY_Y) { + auto slot = m_pokemonListLayout->GetSelectedIndex(); + auto pkm = m_pkms[slot]; + this->ShowPKMTypeMatchUps(pkm); } } +void MainApplication::OnInputDenMenuLayout(u64 Down, u64 Up, u64 Held, pu::ui::Touch Pos) { + if (Down & KEY_Y) { + auto slot = m_denMenuLayout->GetSelectedIndex(); + auto pkm = m_dens[slot]->GetPKM(); + this->ShowPKMTypeMatchUps(pkm); + } +} + +void MainApplication::ShowPKMTypeMatchUps(std::shared_ptr pkm) { + auto weaknesses = pkm->GetTypeMatchUps(true); + auto strengths = pkm->GetTypeMatchUps(false); + m_pokemonTypeLayout->SetTypeMatchUps(weaknesses, strengths); + this->NavigateTo(m_pokemonTypeLayout); +} + void MainApplication::SelectPokemonSlot(u32 slot) { this->SetSlot(slot); this->NavigateTo(m_pokemonSummaryLayout); diff --git a/CaptureSight/source/ui/views/DenMenuLayout.cpp b/CaptureSight/source/ui/views/DenMenuLayout.cpp index 18750ef6..9e60d4b3 100644 --- a/CaptureSight/source/ui/views/DenMenuLayout.cpp +++ b/CaptureSight/source/ui/views/DenMenuLayout.cpp @@ -12,9 +12,9 @@ extern Settings gsets; extern std::shared_ptr i18n; DenMenuLayout::DenMenuLayout() : Layout::Layout() { - m_headerTextBlock = pu::ui::elm::TextBlock::New(50, 50, "", 25); + m_headerTextBlock + = pu::ui::elm::TextBlock::New(50, 50, i18n->Translate("View upcoming advances (A), View type matches (Y)"), 25); m_headerTextBlock->SetColor(gsets.GetTheme().text.light); - m_menu = pu::ui::elm::Menu::New(0, 120, SCREEN_MAX_WIDTH, gsets.GetTheme().active.dark, 150, 4); this->Add(m_menu); @@ -24,8 +24,7 @@ DenMenuLayout::DenMenuLayout() : Layout::Layout() { void DenMenuLayout::UpdateValues(std::vector> dens) { m_menu->ClearItems(); - for (auto denIterator = dens.begin(); denIterator != end(dens); ++denIterator) { - auto den = *(denIterator); + for (auto den : dens) { auto pkm = den->GetPKM(); auto formattedIVs = csight::utils::joinNums(pkm->GetIVs(), "/"); auto stars = std::to_string(den->GetDisplayStars()); @@ -41,10 +40,6 @@ void DenMenuLayout::UpdateValues(std::vector> } m_menu->SetSelectedIndex(0); - - auto headerText = i18n->Translate("View upcoming advances (A)"); - - m_headerTextBlock->SetText(headerText); } void DenMenuLayout::ClickMenuItem(u64 seed) { @@ -54,3 +49,7 @@ void DenMenuLayout::ClickMenuItem(u64 seed) { void DenMenuLayout::SetOnInputMenuItem(std::function onInput) { m_onMenuItemInput = onInput; } + +s32 DenMenuLayout::GetSelectedIndex() { + return m_menu->GetSelectedIndex(); +} \ No newline at end of file diff --git a/CaptureSight/source/ui/views/PokemonListLayout.cpp b/CaptureSight/source/ui/views/PokemonListLayout.cpp index 8de14609..060c513b 100644 --- a/CaptureSight/source/ui/views/PokemonListLayout.cpp +++ b/CaptureSight/source/ui/views/PokemonListLayout.cpp @@ -14,22 +14,24 @@ extern std::shared_ptr i18n; PokemonListLayout::PokemonListLayout() : Layout::Layout() { m_menu = pu::ui::elm::Menu::New(0, 120, SCREEN_MAX_WIDTH, gsets.GetTheme().active.dark, 150, 4); + m_instructionTextBlock = pu::ui::elm::TextBlock::New(50, 50, "View details (A), View type matches (Y)", 25); + m_instructionTextBlock->SetColor(gsets.GetTheme().text.light); this->Add(m_menu); + this->Add(m_instructionTextBlock); } void PokemonListLayout::UpdateValues(std::vector> pk8s, std::function GetTitle) { m_menu->ClearItems(); - for (auto pk8 = pk8s.begin(); pk8 != end(pk8s); ++pk8) { - auto pkm = *(pk8); - auto formattedIVs = csight::utils::joinNums(pkm->GetIVs(), "/"); - u32 slot = std::distance(pk8s.begin(), pk8); - std::string species = i18n->Translate("species", pkm->GetSpeciesString()); - std::string shinyTranslationKey = pkm->GetIsShiny() ? "Shiny" : "Not Shiny"; - std::string title = pkm->GetIsValid() - ? species + " - " + formattedIVs + " - " + i18n->Translate(shinyTranslationKey) + " - " + GetTitle(slot) - : i18n->Translate("Empty") + " - " + GetTitle(slot); - auto menuItem = this->CreateMenuItem(pkm, slot, title); + for (u32 i = 0; i < pk8s.size(); i++) { + auto pk8 = pk8s[i]; + auto formattedIVs = csight::utils::joinNums(pk8->GetIVs(), "/"); + std::string species = i18n->Translate("species", pk8->GetSpeciesString()); + std::string shinyTranslationKey = pk8->GetIsShiny() ? "Shiny" : "Not Shiny"; + std::string title = pk8->GetIsValid() + ? species + " - " + formattedIVs + " - " + i18n->Translate(shinyTranslationKey) + " - " + GetTitle(i) + : i18n->Translate("Empty") + " - " + GetTitle(i); + auto menuItem = this->CreateMenuItem(pk8, i, title); m_menu->AddItem(menuItem); } @@ -57,4 +59,8 @@ void PokemonListLayout::SetOnInputMenuItem(std::function onInput) { void PokemonListLayout::SetSelectedIndex(u32 index) { m_menu->SetSelectedIndex(index); +} + +s32 PokemonListLayout::GetSelectedIndex() { + return m_menu->GetSelectedIndex(); } \ No newline at end of file diff --git a/CaptureSight/source/ui/views/PokemonTypeLayout.cpp b/CaptureSight/source/ui/views/PokemonTypeLayout.cpp new file mode 100644 index 00000000..fe0812f0 --- /dev/null +++ b/CaptureSight/source/ui/views/PokemonTypeLayout.cpp @@ -0,0 +1,62 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +extern MainApplication::Ref mainApp; +extern Settings gsets; +extern std::shared_ptr i18n; + +void PokemonTypeLayout::SetTypeMatchUps(std::vector defensiveMatchUps, + std::vector offensiveMatchUps) { + this->Clear(); + this->AddMatchUpBlock(defensiveMatchUps, "Defense", "Weakness", "Resistance", 50); + this->AddMatchUpBlock(offensiveMatchUps, "Offense", "Strength", "Resistance", 650); +} + +void PokemonTypeLayout::AddMatchUpBlock(std::vector matchUps, std::string header, + std::string firstMatchUpName, std::string secondMatchUpName, u32 baseX) { + u32 baseY = 50; + u32 headerY = baseY + 25; + u32 matchUpY = headerY + 40; + u32 matchUpX = baseX + 25; + auto theme = gsets.GetTheme(); + auto secondMatchUpStart + = std::find_if(matchUps.begin(), matchUps.end(), [](auto typeMatchUp) { return typeMatchUp.multiplier < 1; }); + std::vector firstMatchUp(matchUps.begin(), secondMatchUpStart); + std::vector secondMatchUp(secondMatchUpStart, matchUps.end()); + auto background = RoundedRectangle::New(baseX, baseY, 550, 600, theme.background.light, 5); + auto headerTextBlock = pu::ui::elm::TextBlock::New(matchUpX, headerY, header, 35); + headerTextBlock->SetColor(theme.text.light); + + this->Add(background); + this->Add(headerTextBlock); + this->AddMatchUpText(firstMatchUp, firstMatchUpName, matchUpX, matchUpY); + this->AddMatchUpText(secondMatchUp, secondMatchUpName, matchUpX + 250, matchUpY); +} + +void PokemonTypeLayout::AddMatchUpText(std::vector matchUps, std::string matchUpName, u32 x, + u32 y) { + auto matchUpNameY = y + 25; + auto matchUpYOffset = matchUpNameY + 60; + auto theme = gsets.GetTheme(); + auto matchUpNameTextBlock = pu::ui::elm::TextBlock::New(x, matchUpNameY, matchUpName, 26); + matchUpNameTextBlock->SetColor(theme.text.light); + + this->Add(matchUpNameTextBlock); + + for (u32 i = 0; i < matchUps.size(); i++) { + auto matchUp = matchUps[i]; + auto typeName = csight::utils::getTypeName(matchUp.type); + auto matchUpText = typeName + " " + csight::utils::convertFloatWithPrecision(matchUp.multiplier, 2); + u32 matchUpY = matchUpYOffset + (i * 40); + auto matchUpTextBlock = pu::ui::elm::TextBlock::New(x, matchUpY, matchUpText, 20); + matchUpTextBlock->SetColor(theme.text.light); + this->Add(matchUpTextBlock); + } +} \ No newline at end of file diff --git a/libcsight/include/csight/PK8.hpp b/libcsight/include/csight/PK8.hpp index 53ace042..ca0d1059 100644 --- a/libcsight/include/csight/PK8.hpp +++ b/libcsight/include/csight/PK8.hpp @@ -1,12 +1,14 @@ #pragma once +#include +#include #include #include #include #include namespace csight { - class PK8 { + class PK8 : public PKM { public: PK8(u8 *data); ~PK8(); @@ -24,10 +26,9 @@ namespace csight { u8 GetEV(u8 stat); std::vector GetEVs(); bool GetIsShiny(); - u8 GetAbility(); + ability::Ability GetAbility(); std::string GetAbilityString(); u32 GetTSV(); - u32 GetPSV(); u32 GetPID(); u16 GetSID(); u16 GetTID(); @@ -48,8 +49,9 @@ namespace csight { u8 GetHTFriendship(); u8 GetOTFriendship(); u8 GetCurrentFriendship(); - ulong GetRaidSeed(); - std::future GetRaidSeedAsync(); + u64 GetRaidSeed(); + std::future GetRaidSeedAsync(); + u8 GetForm(); private: u8 *m_data = new u8[0x148]; diff --git a/libcsight/include/csight/PKM.hpp b/libcsight/include/csight/PKM.hpp new file mode 100644 index 00000000..18f60371 --- /dev/null +++ b/libcsight/include/csight/PKM.hpp @@ -0,0 +1,46 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include + +namespace csight { + class PKM { + public: + virtual u16 GetSpecies() = 0; + virtual std::string GetSpeciesString() = 0; + virtual std::vector GetIVs() = 0; + virtual bool GetIsShiny() = 0; + virtual ability::Ability GetAbility() = 0; + virtual std::string GetAbilityString() = 0; + virtual u32 GetPID() = 0; + virtual u64 GetRaidSeed() = 0; + virtual u8 GetForm() = 0; + u32 GetPSV() { + u32 pid = this->GetPID(); + return ((pid >> 16 ^ (pid & 0xFFFF)) >> 4); + } + std::pair GetTypes() { + auto form = this->GetForm(); + auto species = this->GetSpecies(); + auto resultIterator = std::find_if(type::PokemonTypeList.begin(), type::PokemonTypeList.end(), + [species, form](auto type) { return type.species == species && type.form == form; }); + auto result = resultIterator[0]; + + return std::make_pair(result.type1, result.type2); + } + std::vector GetTypeMatchUps(bool shouldGetWeakness) { + auto types = this->GetTypes(); + auto calculateTypeMatchUps = shouldGetWeakness ? utils::calculateWeakness : utils::calculateStrengths; + auto typeMatchUps = calculateTypeMatchUps(types.first, types.second); + std::sort(typeMatchUps.begin(), typeMatchUps.end(), + [](auto type1, auto type2) { return type1.multiplier > type2.multiplier; }); + + return typeMatchUps; + } + }; +} // namespace csight \ No newline at end of file diff --git a/libcsight/include/csight/RaidPokemon.hpp b/libcsight/include/csight/RaidPokemon.hpp index 71668fcd..39a9d4b0 100644 --- a/libcsight/include/csight/RaidPokemon.hpp +++ b/libcsight/include/csight/RaidPokemon.hpp @@ -1,12 +1,13 @@ #pragma once #include +#include #include #include #include namespace csight::raid { - class RaidPokemon { + class RaidPokemon : public PKM { public: RaidPokemon(u64 seed, u32 flawlessIvs, u16 species, ability::raid::AbilityRaidSetting abilitySetting); u32 GetEC(); @@ -18,8 +19,11 @@ namespace csight::raid { std::vector GetIVs(); ability::Ability GetAbility(); std::string GetAbilityString(); + u64 GetRaidSeed(); + u8 GetForm(); private: + u64 m_seed; u32 m_EC; u32 m_PID; u16 m_species; diff --git a/libcsight/include/csight/Utils.hpp b/libcsight/include/csight/Utils.hpp index 368faf11..dca40a9e 100644 --- a/libcsight/include/csight/Utils.hpp +++ b/libcsight/include/csight/Utils.hpp @@ -1,6 +1,7 @@ #pragma once #include +#include #include #include #include @@ -47,4 +48,12 @@ namespace csight::utils { csight::raid::RaidEncounterTable findRaidEncounterTable(std::vector encounterTables, u32 denId, bool isRare); + + std::string getTypeName(type::PokemonType type); + + std::vector calculateWeakness(type::PokemonType type1, type::PokemonType type2); + + std::vector calculateStrengths(type::PokemonType type1, type::PokemonType type2); + + std::string convertFloatWithPrecision(float num, u32 precision); } // namespace csight::utils \ No newline at end of file diff --git a/libcsight/include/csight/lookups/Types.hpp b/libcsight/include/csight/lookups/Types.hpp new file mode 100644 index 00000000..5c5826a8 --- /dev/null +++ b/libcsight/include/csight/lookups/Types.hpp @@ -0,0 +1,46 @@ +#pragma once + +#include +#include +#include +#include + +namespace csight::type { + enum PokemonType { + None, + Normal, + Fighting, + Flying, + Poison, + Ground, + Rock, + Bug, + Ghost, + Steel, + Fire, + Water, + Grass, + Electric, + Psychic, + Ice, + Dragon, + Dark, + Fairy, + }; + + struct TypeMultiplier { + PokemonType type; + float multiplier; + }; + + struct PokemonTypeSet { + u16 species; + u8 form; + PokemonType type1; + PokemonType type2; + }; + + extern std::vector TypeNames; + + extern std::vector PokemonTypeList; +} \ No newline at end of file diff --git a/libcsight/source/csight/PK8.cpp b/libcsight/source/csight/PK8.cpp index 87b7bd78..c9540199 100644 --- a/libcsight/source/csight/PK8.cpp +++ b/libcsight/source/csight/PK8.cpp @@ -1,16 +1,17 @@ #include #include #include +#include #include #include #include #include #include +#include #include namespace csight { - - PK8::PK8(u8 *data) { + PK8::PK8(u8 *data) : PKM::PKM() { std::copy(data, data + m_storedSize, m_data); if (this->CheckEncrypted()) { @@ -127,11 +128,6 @@ namespace csight { u32 PK8::GetPID() { return *(u32 *)(m_data + 0x1c); } - u32 PK8::GetPSV() { - u32 pid = this->GetPID(); - return ((pid >> 16 ^ (pid & 0xFFFF)) >> 4); - } - u32 PK8::GetTSV() { return ((this->GetTID() ^ this->GetSID()) >> 4); } bool PK8::GetIsShiny() { return this->GetPSV() == this->GetTSV(); } @@ -164,7 +160,7 @@ namespace csight { bool PK8::GetIsEgg() { return this->GetIsValid() && ((this->GetIV32() >> 30) & 1) == 1; } - u8 PK8::GetAbility() { return *(u8 *)(m_data + 0x14); } + ability::Ability PK8::GetAbility() { return (ability::Ability) * (u8 *)(m_data + 0x14); } std::string PK8::GetAbilityString() { return utils::getIndex(Abilities, this->GetAbility()); } @@ -200,9 +196,12 @@ namespace csight { u8 PK8::GetCurrentFriendship() { return this->GetCurrentHandler() == 0 ? this->GetOTFriendship() : this->GetHTFriendship(); } - ulong PK8::GetRaidSeed() { return raid::CalculateRaidSeed(this->GetEncryptionConstant(), this->GetPID(), this->GetIVs()); } + u64 PK8::GetRaidSeed() { return raid::CalculateRaidSeed(this->GetEncryptionConstant(), this->GetPID(), this->GetIVs()); } - std::future PK8::GetRaidSeedAsync() { + std::future PK8::GetRaidSeedAsync() { return raid::CalculateRaidSeedAsync(this->GetEncryptionConstant(), this->GetPID(), this->GetIVs()); } + + // Currently stubbed + u8 PK8::GetForm() { return 0; } } // namespace csight \ No newline at end of file diff --git a/libcsight/source/csight/RaidPokemon.cpp b/libcsight/source/csight/RaidPokemon.cpp index 0a4db623..e3439190 100644 --- a/libcsight/source/csight/RaidPokemon.cpp +++ b/libcsight/source/csight/RaidPokemon.cpp @@ -1,4 +1,5 @@ #include +#include #include #include #include @@ -9,9 +10,11 @@ #define EMPTY_IV 255 namespace csight::raid { - RaidPokemon::RaidPokemon(u64 seed, u32 flawlessIvs, u16 species, ability::raid::AbilityRaidSetting abilitySetting) { + RaidPokemon::RaidPokemon(u64 seed, u32 flawlessIvs, u16 species, ability::raid::AbilityRaidSetting abilitySetting) : + PKM::PKM() { + m_seed = seed; m_species = species; - auto rng = rng::xoroshiro(seed); + auto rng = rng::xoroshiro(m_seed); m_EC = rng.next(0xFFFFFFFF); u32 SIDTID = rng.next(0xFFFFFFFF); m_PID = rng.next(0xFFFFFFFF); @@ -71,4 +74,8 @@ namespace csight::raid { ability::Ability RaidPokemon::GetAbility() { return m_ability; }; std::string RaidPokemon::GetAbilityString() { return ability::GetAbilityString(m_ability); } + + u64 RaidPokemon::GetRaidSeed() { return m_seed; } + + u8 RaidPokemon::GetForm() { return 0; } } // namespace csight::raid \ No newline at end of file diff --git a/libcsight/source/csight/Utils.cpp b/libcsight/source/csight/Utils.cpp index c7e3daba..322282b2 100644 --- a/libcsight/source/csight/Utils.cpp +++ b/libcsight/source/csight/Utils.cpp @@ -3,9 +3,36 @@ #include #include #include +#include +#include #include #include +// clang-format off +std::vector> weaknessChart = { + // Defense +/* Offsense */ { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 2, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 2, 1, 1, 0.5, 0.5, 1, 1, 1, 1, 1, 1, 2, 1, 1, 0.5, 2 }, + { 1, 1, 0.5, 1, 1, 0, 2, 0.5, 1, 1, 1, 1, 0.5, 2, 1, 2, 1, 1, 1 }, + { 1, 1, 0.5, 1, 0.5, 2, 1, 0.5, 1, 1, 1, 1, 0.5, 1, 2, 1, 1, 1, 0.5 }, + { 1, 1, 1, 1, 0.5, 1, 0.5, 1, 1, 1, 1, 2, 2, 0, 1, 2, 1, 1, 1 }, + { 1, 0.5, 2, 0.5, 0.5, 2, 1, 1, 1, 2, 0.5, 2, 2, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 0.5, 2, 1, 0.5, 2, 1, 1, 1, 2, 1, 0.5, 1, 1, 1, 1, 1, 1 }, + { 1, 0, 0, 1, 0.5, 1, 1, 0.5, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1 }, + { 1, 0.5, 2, 0.5, 0, 2, 0.5, 0.5, 1, 0.5, 2, 1, 0.5, 1, 0.5, 0.5, 0.5, 1, 0.5 }, + { 1, 1, 1, 1, 1, 2, 2, 0.5, 1, 0.5, 0.5, 2, 0.5, 1, 1, 0.5, 1, 1, 0.5 }, + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.5, 0.5, 0.5, 2, 2, 1, 0.5, 1, 1, 1 }, + { 1, 1, 1, 2, 2, 0.5, 1, 2, 1, 1, 2, 0.5, 0.5, 0.5, 1, 2, 1, 1, 1 }, + { 1, 1, 1, 0.5, 1, 2, 1, 1, 1, 0.5, 1, 1, 1, 0.5, 1, 1, 1, 1, 1 }, + { 1, 1, 0.5, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 0.5, 1, 1, 2, 1 }, + { 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 2, 1, 1, 1, 1, 0.5, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.5, 0.5, 0.5, 0.5, 1, 2, 2, 1, 2 }, + { 1, 1, 2, 1, 1, 1, 1, 0.5, 0.5, 1, 1, 1, 1, 1, 0, 1, 1, 0.5, 2 }, + { 1, 1, 0.5, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 0, 0.5, 1 }, +}; +// clang-format on + namespace csight::utils { // Thanks to https://github.com/WerWolv/EdiZon/blob/44a30ce9ad2571f46c3e420faec44d573a27ebbc/source/helpers/util.c#L31-L42 bool checkIfServiceIsRunning(const char *serviceName) { @@ -56,4 +83,48 @@ namespace csight::utils { return nest; } + + std::string getTypeName(type::PokemonType type) { return getIndex(type::TypeNames, type); } + + std::vector calculateWeakness(type::PokemonType type1, type::PokemonType type2) { + auto type1Weaknesses = weaknessChart[type1]; + auto type2Weaknesses = weaknessChart[type2]; + std::vector result = {}; + + for (u8 i = 0; i < type1Weaknesses.size(); i++) { + auto type1Multiplier = type1Weaknesses[i]; + auto type2Multiplier = type2Weaknesses[i]; + auto multiplier = type1Multiplier * type2Multiplier; + + if (multiplier != 1) { + result.push_back({ (type::PokemonType)i, multiplier }); + } + } + + return result; + }; + + std::vector calculateStrengths(type::PokemonType type1, type::PokemonType type2) { + std::vector result = {}; + + for (u8 i = 0; i < weaknessChart.size(); i++) { + auto attackType = weaknessChart[i]; + auto type1Multiplier = attackType[type1]; + auto type2Multiplier = attackType[type2]; + auto multiplier = type1Multiplier * type2Multiplier; + + if (multiplier != 1) { + result.push_back({ (type::PokemonType)i, multiplier }); + } + } + + return result; + }; + + std::string convertFloatWithPrecision(float num, u32 precision) { + std::stringstream result; + result << std::fixed << std::setprecision(precision) << num; + + return result.str(); + } } // namespace csight::utils \ No newline at end of file diff --git a/libcsight/source/csight/lookups/Types.cpp b/libcsight/source/csight/lookups/Types.cpp new file mode 100644 index 00000000..b386d868 --- /dev/null +++ b/libcsight/source/csight/lookups/Types.cpp @@ -0,0 +1,966 @@ +#include +#include +#include +#include + +namespace csight::type { + std::vector TypeNames + = { "None", "Normal", "Fighting", "Flying", "Poison", "Ground", "Rock", "Bug", "Ghost", "Steel", + "Fire", "Water", "Grass", "Electric", "Psychic", "Ice", "Dragon", "Dark", "Fairy" }; + + std::vector PokemonTypeList = { { species : 0, form : 0, type1 : None, type2 : None }, + { species : 1, form : 0, type1 : Grass, type2 : Poison }, + { species : 2, form : 0, type1 : Grass, type2 : Poison }, + { species : 3, form : 0, type1 : Grass, type2 : Poison }, + { species : 4, form : 0, type1 : Fire, type2 : None }, + { species : 5, form : 0, type1 : Fire, type2 : None }, + { species : 6, form : 0, type1 : Fire, type2 : Flying }, + { species : 7, form : 0, type1 : Water, type2 : None }, + { species : 8, form : 0, type1 : Water, type2 : None }, + { species : 9, form : 0, type1 : Water, type2 : None }, + { species : 10, form : 0, type1 : Bug, type2 : None }, + { species : 11, form : 0, type1 : Bug, type2 : None }, + { species : 12, form : 0, type1 : Bug, type2 : Flying }, + { species : 13, form : 0, type1 : Bug, type2 : Poison }, + { species : 14, form : 0, type1 : Bug, type2 : Poison }, + { species : 15, form : 0, type1 : Bug, type2 : Poison }, + { species : 16, form : 0, type1 : Normal, type2 : Flying }, + { species : 17, form : 0, type1 : Normal, type2 : Flying }, + { species : 18, form : 0, type1 : Normal, type2 : Flying }, + { species : 19, form : 0, type1 : Normal, type2 : None }, + { species : 19, form : 1, type1 : Dark, type2 : Normal }, + { species : 20, form : 0, type1 : Normal, type2 : None }, + { species : 20, form : 1, type1 : Dark, type2 : Normal }, + { species : 21, form : 0, type1 : Normal, type2 : Flying }, + { species : 22, form : 0, type1 : Normal, type2 : Flying }, + { species : 23, form : 0, type1 : Poison, type2 : None }, + { species : 24, form : 0, type1 : Poison, type2 : None }, + { species : 25, form : 0, type1 : Electric, type2 : None }, + { species : 26, form : 0, type1 : Electric, type2 : None }, + { species : 26, form : 1, type1 : Electric, type2 : Psychic }, + { species : 27, form : 0, type1 : Ground, type2 : None }, + { species : 27, form : 1, type1 : Ice, type2 : Steel }, + { species : 28, form : 0, type1 : Ground, type2 : None }, + { species : 28, form : 1, type1 : Ice, type2 : Steel }, + { species : 29, form : 0, type1 : Poison, type2 : None }, + { species : 30, form : 0, type1 : Poison, type2 : None }, + { species : 31, form : 0, type1 : Poison, type2 : Ground }, + { species : 32, form : 0, type1 : Poison, type2 : None }, + { species : 33, form : 0, type1 : Poison, type2 : None }, + { species : 34, form : 0, type1 : Poison, type2 : Ground }, + { species : 35, form : 0, type1 : Fairy, type2 : None }, + { species : 36, form : 0, type1 : Fairy, type2 : None }, + { species : 37, form : 0, type1 : Fire, type2 : None }, + { species : 37, form : 1, type1 : Ice, type2 : None }, + { species : 38, form : 0, type1 : Fire, type2 : None }, + { species : 38, form : 1, type1 : Ice, type2 : Fairy }, + { species : 39, form : 0, type1 : Normal, type2 : Fairy }, + { species : 40, form : 0, type1 : Normal, type2 : Fairy }, + { species : 41, form : 0, type1 : Poison, type2 : Flying }, + { species : 42, form : 0, type1 : Poison, type2 : Flying }, + { species : 43, form : 0, type1 : Grass, type2 : Poison }, + { species : 44, form : 0, type1 : Grass, type2 : Poison }, + { species : 45, form : 0, type1 : Grass, type2 : Poison }, + { species : 46, form : 0, type1 : Bug, type2 : Grass }, + { species : 47, form : 0, type1 : Bug, type2 : Grass }, + { species : 48, form : 0, type1 : Bug, type2 : Poison }, + { species : 49, form : 0, type1 : Bug, type2 : Poison }, + { species : 50, form : 0, type1 : Ground, type2 : None }, + { species : 50, form : 1, type1 : Ground, type2 : Steel }, + { species : 51, form : 0, type1 : Ground, type2 : None }, + { species : 51, form : 1, type1 : Ground, type2 : Steel }, + { species : 52, form : 0, type1 : Normal, type2 : None }, + { species : 52, form : 1, type1 : Dark, type2 : None }, + { species : 52, form : 2, type1 : Steel, type2 : None }, + { species : 53, form : 0, type1 : Normal, type2 : None }, + { species : 53, form : 1, type1 : Dark, type2 : None }, + { species : 54, form : 0, type1 : Water, type2 : None }, + { species : 55, form : 0, type1 : Water, type2 : None }, + { species : 56, form : 0, type1 : Fighting, type2 : None }, + { species : 57, form : 0, type1 : Fighting, type2 : None }, + { species : 58, form : 0, type1 : Fire, type2 : None }, + { species : 59, form : 0, type1 : Fire, type2 : None }, + { species : 60, form : 0, type1 : Water, type2 : None }, + { species : 61, form : 0, type1 : Water, type2 : None }, + { species : 62, form : 0, type1 : Water, type2 : Fighting }, + { species : 63, form : 0, type1 : Psychic, type2 : None }, + { species : 64, form : 0, type1 : Psychic, type2 : None }, + { species : 65, form : 0, type1 : Psychic, type2 : None }, + { species : 66, form : 0, type1 : Fighting, type2 : None }, + { species : 67, form : 0, type1 : Fighting, type2 : None }, + { species : 68, form : 0, type1 : Fighting, type2 : None }, + { species : 69, form : 0, type1 : Grass, type2 : Poison }, + { species : 70, form : 0, type1 : Grass, type2 : Poison }, + { species : 71, form : 0, type1 : Grass, type2 : Poison }, + { species : 72, form : 0, type1 : Water, type2 : Poison }, + { species : 73, form : 0, type1 : Water, type2 : Poison }, + { species : 74, form : 0, type1 : Rock, type2 : Ground }, + { species : 74, form : 1, type1 : Rock, type2 : Electric }, + { species : 75, form : 0, type1 : Rock, type2 : Ground }, + { species : 75, form : 1, type1 : Rock, type2 : Electric }, + { species : 76, form : 0, type1 : Rock, type2 : Ground }, + { species : 76, form : 1, type1 : Rock, type2 : Electric }, + { species : 77, form : 0, type1 : Fire, type2 : None }, + { species : 77, form : 1, type1 : Psychic, type2 : None }, + { species : 78, form : 0, type1 : Fire, type2 : None }, + { species : 78, form : 1, type1 : Psychic, type2 : Fairy }, + { species : 79, form : 0, type1 : Water, type2 : Psychic }, + { species : 79, form : 1, type1 : Psychic, type2 : None }, + { species : 80, form : 0, type1 : Water, type2 : Psychic }, + { species : 81, form : 0, type1 : Electric, type2 : Steel }, + { species : 82, form : 0, type1 : Electric, type2 : Steel }, + { species : 83, form : 0, type1 : Normal, type2 : Flying }, + { species : 83, form : 1, type1 : Fighting, type2 : None }, + { species : 84, form : 0, type1 : Normal, type2 : Flying }, + { species : 85, form : 0, type1 : Normal, type2 : Flying }, + { species : 86, form : 0, type1 : Water, type2 : None }, + { species : 87, form : 0, type1 : Water, type2 : Ice }, + { species : 88, form : 0, type1 : Poison, type2 : None }, + { species : 88, form : 1, type1 : Poison, type2 : Dark }, + { species : 89, form : 0, type1 : Poison, type2 : None }, + { species : 89, form : 1, type1 : Poison, type2 : Dark }, + { species : 90, form : 0, type1 : Water, type2 : None }, + { species : 91, form : 0, type1 : Water, type2 : Ice }, + { species : 92, form : 0, type1 : Ghost, type2 : Poison }, + { species : 93, form : 0, type1 : Ghost, type2 : Poison }, + { species : 94, form : 0, type1 : Ghost, type2 : Poison }, + { species : 95, form : 0, type1 : Rock, type2 : Ground }, + { species : 96, form : 0, type1 : Psychic, type2 : None }, + { species : 97, form : 0, type1 : Psychic, type2 : None }, + { species : 98, form : 0, type1 : Water, type2 : None }, + { species : 99, form : 0, type1 : Water, type2 : None }, + { species : 100, form : 0, type1 : Electric, type2 : None }, + { species : 101, form : 0, type1 : Electric, type2 : None }, + { species : 102, form : 0, type1 : Grass, type2 : Psychic }, + { species : 103, form : 0, type1 : Grass, type2 : Psychic }, + { species : 103, form : 1, type1 : Grass, type2 : Dragon }, + { species : 104, form : 0, type1 : Ground, type2 : None }, + { species : 105, form : 0, type1 : Ground, type2 : None }, + { species : 105, form : 1, type1 : Fire, type2 : Ghost }, + { species : 106, form : 0, type1 : Fighting, type2 : None }, + { species : 107, form : 0, type1 : Fighting, type2 : None }, + { species : 108, form : 0, type1 : Normal, type2 : None }, + { species : 109, form : 0, type1 : Poison, type2 : None }, + { species : 110, form : 0, type1 : Poison, type2 : None }, + { species : 110, form : 1, type1 : Poison, type2 : Fairy }, + { species : 111, form : 0, type1 : Ground, type2 : Rock }, + { species : 112, form : 0, type1 : Ground, type2 : Rock }, + { species : 113, form : 0, type1 : Normal, type2 : None }, + { species : 114, form : 0, type1 : Grass, type2 : None }, + { species : 115, form : 0, type1 : Normal, type2 : None }, + { species : 116, form : 0, type1 : Water, type2 : None }, + { species : 117, form : 0, type1 : Water, type2 : None }, + { species : 118, form : 0, type1 : Water, type2 : None }, + { species : 119, form : 0, type1 : Water, type2 : None }, + { species : 120, form : 0, type1 : Water, type2 : None }, + { species : 121, form : 0, type1 : Water, type2 : Psychic }, + { species : 122, form : 0, type1 : Psychic, type2 : Fairy }, + { species : 122, form : 1, type1 : Ice, type2 : Psychic }, + { species : 123, form : 0, type1 : Bug, type2 : Flying }, + { species : 124, form : 0, type1 : Ice, type2 : Psychic }, + { species : 125, form : 0, type1 : Electric, type2 : None }, + { species : 126, form : 0, type1 : Fire, type2 : None }, + { species : 127, form : 0, type1 : Bug, type2 : None }, + { species : 128, form : 0, type1 : Normal, type2 : None }, + { species : 129, form : 0, type1 : Water, type2 : None }, + { species : 130, form : 0, type1 : Water, type2 : Flying }, + { species : 131, form : 0, type1 : Water, type2 : Ice }, + { species : 132, form : 0, type1 : Normal, type2 : None }, + { species : 133, form : 0, type1 : Normal, type2 : None }, + { species : 134, form : 0, type1 : Water, type2 : None }, + { species : 135, form : 0, type1 : Electric, type2 : None }, + { species : 136, form : 0, type1 : Fire, type2 : None }, + { species : 137, form : 0, type1 : Normal, type2 : None }, + { species : 138, form : 0, type1 : Rock, type2 : Water }, + { species : 139, form : 0, type1 : Rock, type2 : Water }, + { species : 140, form : 0, type1 : Rock, type2 : Water }, + { species : 141, form : 0, type1 : Rock, type2 : Water }, + { species : 142, form : 0, type1 : Rock, type2 : Flying }, + { species : 143, form : 0, type1 : Normal, type2 : None }, + { species : 144, form : 0, type1 : Ice, type2 : Flying }, + { species : 145, form : 0, type1 : Electric, type2 : Flying }, + { species : 146, form : 0, type1 : Fire, type2 : Flying }, + { species : 147, form : 0, type1 : Dragon, type2 : None }, + { species : 148, form : 0, type1 : Dragon, type2 : None }, + { species : 149, form : 0, type1 : Dragon, type2 : Flying }, + { species : 150, form : 0, type1 : Psychic, type2 : None }, + { species : 151, form : 0, type1 : Psychic, type2 : None }, + { species : 152, form : 0, type1 : Grass, type2 : None }, + { species : 153, form : 0, type1 : Grass, type2 : None }, + { species : 154, form : 0, type1 : Grass, type2 : None }, + { species : 155, form : 0, type1 : Fire, type2 : None }, + { species : 156, form : 0, type1 : Fire, type2 : None }, + { species : 157, form : 0, type1 : Fire, type2 : None }, + { species : 158, form : 0, type1 : Water, type2 : None }, + { species : 159, form : 0, type1 : Water, type2 : None }, + { species : 160, form : 0, type1 : Water, type2 : None }, + { species : 161, form : 0, type1 : Normal, type2 : None }, + { species : 162, form : 0, type1 : Normal, type2 : None }, + { species : 163, form : 0, type1 : Normal, type2 : Flying }, + { species : 164, form : 0, type1 : Normal, type2 : Flying }, + { species : 165, form : 0, type1 : Bug, type2 : Flying }, + { species : 166, form : 0, type1 : Bug, type2 : Flying }, + { species : 167, form : 0, type1 : Bug, type2 : Poison }, + { species : 168, form : 0, type1 : Bug, type2 : Poison }, + { species : 169, form : 0, type1 : Poison, type2 : Flying }, + { species : 170, form : 0, type1 : Water, type2 : Electric }, + { species : 171, form : 0, type1 : Water, type2 : Electric }, + { species : 172, form : 0, type1 : Electric, type2 : None }, + { species : 173, form : 0, type1 : Fairy, type2 : None }, + { species : 174, form : 0, type1 : Normal, type2 : Fairy }, + { species : 175, form : 0, type1 : Fairy, type2 : None }, + { species : 176, form : 0, type1 : Fairy, type2 : Flying }, + { species : 177, form : 0, type1 : Psychic, type2 : Flying }, + { species : 178, form : 0, type1 : Psychic, type2 : Flying }, + { species : 179, form : 0, type1 : Electric, type2 : None }, + { species : 180, form : 0, type1 : Electric, type2 : None }, + { species : 181, form : 0, type1 : Electric, type2 : None }, + { species : 182, form : 0, type1 : Grass, type2 : None }, + { species : 183, form : 0, type1 : Water, type2 : Fairy }, + { species : 184, form : 0, type1 : Water, type2 : Fairy }, + { species : 185, form : 0, type1 : Rock, type2 : None }, + { species : 186, form : 0, type1 : Water, type2 : None }, + { species : 187, form : 0, type1 : Grass, type2 : Flying }, + { species : 188, form : 0, type1 : Grass, type2 : Flying }, + { species : 189, form : 0, type1 : Grass, type2 : Flying }, + { species : 190, form : 0, type1 : Normal, type2 : None }, + { species : 191, form : 0, type1 : Grass, type2 : None }, + { species : 192, form : 0, type1 : Grass, type2 : None }, + { species : 193, form : 0, type1 : Bug, type2 : Flying }, + { species : 194, form : 0, type1 : Water, type2 : Ground }, + { species : 195, form : 0, type1 : Water, type2 : Ground }, + { species : 196, form : 0, type1 : Psychic, type2 : None }, + { species : 197, form : 0, type1 : Dark, type2 : None }, + { species : 198, form : 0, type1 : Dark, type2 : Flying }, + { species : 199, form : 0, type1 : Water, type2 : Psychic }, + { species : 200, form : 0, type1 : Ghost, type2 : None }, + { species : 201, form : 0, type1 : Psychic, type2 : None }, + { species : 202, form : 0, type1 : Psychic, type2 : None }, + { species : 203, form : 0, type1 : Normal, type2 : Psychic }, + { species : 204, form : 0, type1 : Bug, type2 : None }, + { species : 205, form : 0, type1 : Bug, type2 : Steel }, + { species : 206, form : 0, type1 : Normal, type2 : None }, + { species : 207, form : 0, type1 : Ground, type2 : Flying }, + { species : 208, form : 0, type1 : Steel, type2 : Ground }, + { species : 209, form : 0, type1 : Fairy, type2 : None }, + { species : 210, form : 0, type1 : Fairy, type2 : None }, + { species : 211, form : 0, type1 : Water, type2 : Poison }, + { species : 212, form : 0, type1 : Bug, type2 : Steel }, + { species : 213, form : 0, type1 : Bug, type2 : Rock }, + { species : 214, form : 0, type1 : Bug, type2 : Fighting }, + { species : 215, form : 0, type1 : Dark, type2 : Ice }, + { species : 216, form : 0, type1 : Normal, type2 : None }, + { species : 217, form : 0, type1 : Normal, type2 : None }, + { species : 218, form : 0, type1 : Fire, type2 : None }, + { species : 219, form : 0, type1 : Fire, type2 : Rock }, + { species : 220, form : 0, type1 : Ice, type2 : Ground }, + { species : 221, form : 0, type1 : Ice, type2 : Ground }, + { species : 222, form : 0, type1 : Water, type2 : Rock }, + { species : 222, form : 1, type1 : Ghost, type2 : None }, + { species : 223, form : 0, type1 : Water, type2 : None }, + { species : 224, form : 0, type1 : Water, type2 : None }, + { species : 225, form : 0, type1 : Ice, type2 : Flying }, + { species : 226, form : 0, type1 : Water, type2 : Flying }, + { species : 227, form : 0, type1 : Steel, type2 : Flying }, + { species : 228, form : 0, type1 : Dark, type2 : Fire }, + { species : 229, form : 0, type1 : Dark, type2 : Fire }, + { species : 230, form : 0, type1 : Water, type2 : Dragon }, + { species : 231, form : 0, type1 : Ground, type2 : None }, + { species : 232, form : 0, type1 : Ground, type2 : None }, + { species : 233, form : 0, type1 : Normal, type2 : None }, + { species : 234, form : 0, type1 : Normal, type2 : None }, + { species : 235, form : 0, type1 : Normal, type2 : None }, + { species : 236, form : 0, type1 : Fighting, type2 : None }, + { species : 237, form : 0, type1 : Fighting, type2 : None }, + { species : 238, form : 0, type1 : Ice, type2 : Psychic }, + { species : 239, form : 0, type1 : Electric, type2 : None }, + { species : 240, form : 0, type1 : Fire, type2 : None }, + { species : 241, form : 0, type1 : Normal, type2 : None }, + { species : 242, form : 0, type1 : Normal, type2 : None }, + { species : 243, form : 0, type1 : Electric, type2 : None }, + { species : 244, form : 0, type1 : Fire, type2 : None }, + { species : 245, form : 0, type1 : Water, type2 : None }, + { species : 246, form : 0, type1 : Rock, type2 : Ground }, + { species : 247, form : 0, type1 : Rock, type2 : Ground }, + { species : 248, form : 0, type1 : Rock, type2 : Dark }, + { species : 249, form : 0, type1 : Psychic, type2 : Flying }, + { species : 250, form : 0, type1 : Fire, type2 : Flying }, + { species : 251, form : 0, type1 : Psychic, type2 : Grass }, + { species : 252, form : 0, type1 : Grass, type2 : None }, + { species : 253, form : 0, type1 : Grass, type2 : None }, + { species : 254, form : 0, type1 : Grass, type2 : None }, + { species : 255, form : 0, type1 : Fire, type2 : None }, + { species : 256, form : 0, type1 : Fire, type2 : Fighting }, + { species : 257, form : 0, type1 : Fire, type2 : Fighting }, + { species : 258, form : 0, type1 : Water, type2 : None }, + { species : 259, form : 0, type1 : Water, type2 : Ground }, + { species : 260, form : 0, type1 : Water, type2 : Ground }, + { species : 261, form : 0, type1 : Dark, type2 : None }, + { species : 262, form : 0, type1 : Dark, type2 : None }, + { species : 263, form : 0, type1 : Normal, type2 : None }, + { species : 263, form : 1, type1 : Dark, type2 : Normal }, + { species : 264, form : 0, type1 : Normal, type2 : None }, + { species : 264, form : 1, type1 : Dark, type2 : Normal }, + { species : 265, form : 0, type1 : Bug, type2 : None }, + { species : 266, form : 0, type1 : Bug, type2 : None }, + { species : 267, form : 0, type1 : Bug, type2 : Flying }, + { species : 268, form : 0, type1 : Bug, type2 : None }, + { species : 269, form : 0, type1 : Bug, type2 : Poison }, + { species : 270, form : 0, type1 : Water, type2 : Grass }, + { species : 271, form : 0, type1 : Water, type2 : Grass }, + { species : 272, form : 0, type1 : Water, type2 : Grass }, + { species : 273, form : 0, type1 : Grass, type2 : None }, + { species : 274, form : 0, type1 : Grass, type2 : Dark }, + { species : 275, form : 0, type1 : Grass, type2 : Dark }, + { species : 276, form : 0, type1 : Normal, type2 : Flying }, + { species : 277, form : 0, type1 : Normal, type2 : Flying }, + { species : 278, form : 0, type1 : Water, type2 : Flying }, + { species : 279, form : 0, type1 : Water, type2 : Flying }, + { species : 280, form : 0, type1 : Psychic, type2 : Fairy }, + { species : 281, form : 0, type1 : Psychic, type2 : Fairy }, + { species : 282, form : 0, type1 : Psychic, type2 : Fairy }, + { species : 283, form : 0, type1 : Bug, type2 : Water }, + { species : 284, form : 0, type1 : Bug, type2 : Flying }, + { species : 285, form : 0, type1 : Grass, type2 : None }, + { species : 286, form : 0, type1 : Grass, type2 : Fighting }, + { species : 287, form : 0, type1 : Normal, type2 : None }, + { species : 288, form : 0, type1 : Normal, type2 : None }, + { species : 289, form : 0, type1 : Normal, type2 : None }, + { species : 290, form : 0, type1 : Bug, type2 : Ground }, + { species : 291, form : 0, type1 : Bug, type2 : Flying }, + { species : 292, form : 0, type1 : Bug, type2 : Ghost }, + { species : 293, form : 0, type1 : Normal, type2 : None }, + { species : 294, form : 0, type1 : Normal, type2 : None }, + { species : 295, form : 0, type1 : Normal, type2 : None }, + { species : 296, form : 0, type1 : Fighting, type2 : None }, + { species : 297, form : 0, type1 : Fighting, type2 : None }, + { species : 298, form : 0, type1 : Normal, type2 : Fairy }, + { species : 299, form : 0, type1 : Rock, type2 : None }, + { species : 300, form : 0, type1 : Normal, type2 : None }, + { species : 301, form : 0, type1 : Normal, type2 : None }, + { species : 302, form : 0, type1 : Dark, type2 : Ghost }, + { species : 303, form : 0, type1 : Steel, type2 : Fairy }, + { species : 304, form : 0, type1 : Steel, type2 : Rock }, + { species : 305, form : 0, type1 : Steel, type2 : Rock }, + { species : 306, form : 0, type1 : Steel, type2 : Rock }, + { species : 307, form : 0, type1 : Fighting, type2 : Psychic }, + { species : 308, form : 0, type1 : Fighting, type2 : Psychic }, + { species : 309, form : 0, type1 : Electric, type2 : None }, + { species : 310, form : 0, type1 : Electric, type2 : None }, + { species : 311, form : 0, type1 : Electric, type2 : None }, + { species : 312, form : 0, type1 : Electric, type2 : None }, + { species : 313, form : 0, type1 : Bug, type2 : None }, + { species : 314, form : 0, type1 : Bug, type2 : None }, + { species : 315, form : 0, type1 : Grass, type2 : Poison }, + { species : 316, form : 0, type1 : Poison, type2 : None }, + { species : 317, form : 0, type1 : Poison, type2 : None }, + { species : 318, form : 0, type1 : Water, type2 : Dark }, + { species : 319, form : 0, type1 : Water, type2 : Dark }, + { species : 320, form : 0, type1 : Water, type2 : None }, + { species : 321, form : 0, type1 : Water, type2 : None }, + { species : 322, form : 0, type1 : Fire, type2 : Ground }, + { species : 323, form : 0, type1 : Fire, type2 : Ground }, + { species : 324, form : 0, type1 : Fire, type2 : None }, + { species : 325, form : 0, type1 : Psychic, type2 : None }, + { species : 326, form : 0, type1 : Psychic, type2 : None }, + { species : 327, form : 0, type1 : Normal, type2 : None }, + { species : 328, form : 0, type1 : Ground, type2 : None }, + { species : 329, form : 0, type1 : Ground, type2 : Dragon }, + { species : 330, form : 0, type1 : Ground, type2 : Dragon }, + { species : 331, form : 0, type1 : Grass, type2 : None }, + { species : 332, form : 0, type1 : Grass, type2 : Dark }, + { species : 333, form : 0, type1 : Normal, type2 : Flying }, + { species : 334, form : 0, type1 : Dragon, type2 : Flying }, + { species : 335, form : 0, type1 : Normal, type2 : None }, + { species : 336, form : 0, type1 : Poison, type2 : None }, + { species : 337, form : 0, type1 : Rock, type2 : Psychic }, + { species : 338, form : 0, type1 : Rock, type2 : Psychic }, + { species : 339, form : 0, type1 : Water, type2 : Ground }, + { species : 340, form : 0, type1 : Water, type2 : Ground }, + { species : 341, form : 0, type1 : Water, type2 : None }, + { species : 342, form : 0, type1 : Water, type2 : Dark }, + { species : 343, form : 0, type1 : Ground, type2 : Psychic }, + { species : 344, form : 0, type1 : Ground, type2 : Psychic }, + { species : 345, form : 0, type1 : Rock, type2 : Grass }, + { species : 346, form : 0, type1 : Rock, type2 : Grass }, + { species : 347, form : 0, type1 : Rock, type2 : Bug }, + { species : 348, form : 0, type1 : Rock, type2 : Bug }, + { species : 349, form : 0, type1 : Water, type2 : None }, + { species : 350, form : 0, type1 : Water, type2 : None }, + { species : 351, form : 0, type1 : Normal, type2 : None }, + { species : 351, form : 1, type1 : Fire, type2 : None }, + { species : 351, form : 2, type1 : Water, type2 : None }, + { species : 351, form : 3, type1 : Ice, type2 : None }, + { species : 352, form : 0, type1 : Normal, type2 : None }, + { species : 353, form : 0, type1 : Ghost, type2 : None }, + { species : 354, form : 0, type1 : Ghost, type2 : None }, + { species : 355, form : 0, type1 : Ghost, type2 : None }, + { species : 356, form : 0, type1 : Ghost, type2 : None }, + { species : 357, form : 0, type1 : Grass, type2 : Flying }, + { species : 358, form : 0, type1 : Psychic, type2 : None }, + { species : 359, form : 0, type1 : Dark, type2 : None }, + { species : 360, form : 0, type1 : Psychic, type2 : None }, + { species : 361, form : 0, type1 : Ice, type2 : None }, + { species : 362, form : 0, type1 : Ice, type2 : None }, + { species : 363, form : 0, type1 : Ice, type2 : Water }, + { species : 364, form : 0, type1 : Ice, type2 : Water }, + { species : 365, form : 0, type1 : Ice, type2 : Water }, + { species : 366, form : 0, type1 : Water, type2 : None }, + { species : 367, form : 0, type1 : Water, type2 : None }, + { species : 368, form : 0, type1 : Water, type2 : None }, + { species : 369, form : 0, type1 : Water, type2 : Rock }, + { species : 370, form : 0, type1 : Water, type2 : None }, + { species : 371, form : 0, type1 : Dragon, type2 : None }, + { species : 372, form : 0, type1 : Dragon, type2 : None }, + { species : 373, form : 0, type1 : Dragon, type2 : Flying }, + { species : 374, form : 0, type1 : Steel, type2 : Psychic }, + { species : 375, form : 0, type1 : Steel, type2 : Psychic }, + { species : 376, form : 0, type1 : Steel, type2 : Psychic }, + { species : 377, form : 0, type1 : Rock, type2 : None }, + { species : 378, form : 0, type1 : Ice, type2 : None }, + { species : 379, form : 0, type1 : Steel, type2 : None }, + { species : 380, form : 0, type1 : Dragon, type2 : Psychic }, + { species : 381, form : 0, type1 : Dragon, type2 : Psychic }, + { species : 382, form : 0, type1 : Water, type2 : None }, + { species : 383, form : 0, type1 : Ground, type2 : None }, + { species : 384, form : 0, type1 : Dragon, type2 : Flying }, + { species : 385, form : 0, type1 : Steel, type2 : Psychic }, + { species : 386, form : 0, type1 : Psychic, type2 : None }, + { species : 386, form : 1, type1 : Psychic, type2 : None }, + { species : 386, form : 2, type1 : Psychic, type2 : None }, + { species : 386, form : 3, type1 : Psychic, type2 : None }, + { species : 387, form : 0, type1 : Grass, type2 : None }, + { species : 388, form : 0, type1 : Grass, type2 : None }, + { species : 389, form : 0, type1 : Grass, type2 : Ground }, + { species : 390, form : 0, type1 : Fire, type2 : None }, + { species : 391, form : 0, type1 : Fire, type2 : Fighting }, + { species : 392, form : 0, type1 : Fire, type2 : Fighting }, + { species : 393, form : 0, type1 : Water, type2 : None }, + { species : 394, form : 0, type1 : Water, type2 : None }, + { species : 395, form : 0, type1 : Water, type2 : Steel }, + { species : 396, form : 0, type1 : Normal, type2 : Flying }, + { species : 397, form : 0, type1 : Normal, type2 : Flying }, + { species : 398, form : 0, type1 : Normal, type2 : Flying }, + { species : 399, form : 0, type1 : Normal, type2 : None }, + { species : 400, form : 0, type1 : Normal, type2 : Water }, + { species : 401, form : 0, type1 : Bug, type2 : None }, + { species : 402, form : 0, type1 : Bug, type2 : None }, + { species : 403, form : 0, type1 : Electric, type2 : None }, + { species : 404, form : 0, type1 : Electric, type2 : None }, + { species : 405, form : 0, type1 : Electric, type2 : None }, + { species : 406, form : 0, type1 : Grass, type2 : Poison }, + { species : 407, form : 0, type1 : Grass, type2 : Poison }, + { species : 408, form : 0, type1 : Rock, type2 : None }, + { species : 409, form : 0, type1 : Rock, type2 : None }, + { species : 410, form : 0, type1 : Rock, type2 : Steel }, + { species : 411, form : 0, type1 : Rock, type2 : Steel }, + { species : 412, form : 0, type1 : Bug, type2 : None }, + { species : 412, form : 1, type1 : Bug, type2 : None }, + { species : 412, form : 2, type1 : Bug, type2 : None }, + { species : 413, form : 0, type1 : Bug, type2 : Grass }, + { species : 413, form : 1, type1 : Bug, type2 : Ground }, + { species : 413, form : 2, type1 : Bug, type2 : Steel }, + { species : 414, form : 0, type1 : Bug, type2 : Flying }, + { species : 415, form : 0, type1 : Bug, type2 : Flying }, + { species : 416, form : 0, type1 : Bug, type2 : Flying }, + { species : 417, form : 0, type1 : Electric, type2 : None }, + { species : 418, form : 0, type1 : Water, type2 : None }, + { species : 419, form : 0, type1 : Water, type2 : None }, + { species : 420, form : 0, type1 : Grass, type2 : None }, + { species : 421, form : 0, type1 : Grass, type2 : None }, + { species : 422, form : 0, type1 : Water, type2 : None }, + { species : 422, form : 1, type1 : Water, type2 : None }, + { species : 423, form : 0, type1 : Water, type2 : Ground }, + { species : 423, form : 1, type1 : Water, type2 : Ground }, + { species : 424, form : 0, type1 : Normal, type2 : None }, + { species : 425, form : 0, type1 : Ghost, type2 : Flying }, + { species : 426, form : 0, type1 : Ghost, type2 : Flying }, + { species : 427, form : 0, type1 : Normal, type2 : None }, + { species : 428, form : 0, type1 : Normal, type2 : None }, + { species : 429, form : 0, type1 : Ghost, type2 : None }, + { species : 430, form : 0, type1 : Dark, type2 : Flying }, + { species : 431, form : 0, type1 : Normal, type2 : None }, + { species : 432, form : 0, type1 : Normal, type2 : None }, + { species : 433, form : 0, type1 : Psychic, type2 : None }, + { species : 434, form : 0, type1 : Poison, type2 : Dark }, + { species : 435, form : 0, type1 : Poison, type2 : Dark }, + { species : 436, form : 0, type1 : Steel, type2 : Psychic }, + { species : 437, form : 0, type1 : Steel, type2 : Psychic }, + { species : 438, form : 0, type1 : Rock, type2 : None }, + { species : 439, form : 0, type1 : Psychic, type2 : Fairy }, + { species : 440, form : 0, type1 : Normal, type2 : None }, + { species : 441, form : 0, type1 : Normal, type2 : Flying }, + { species : 442, form : 0, type1 : Ghost, type2 : Dark }, + { species : 443, form : 0, type1 : Dragon, type2 : Ground }, + { species : 444, form : 0, type1 : Dragon, type2 : Ground }, + { species : 445, form : 0, type1 : Dragon, type2 : Ground }, + { species : 446, form : 0, type1 : Normal, type2 : None }, + { species : 447, form : 0, type1 : Fighting, type2 : None }, + { species : 448, form : 0, type1 : Fighting, type2 : Steel }, + { species : 449, form : 0, type1 : Ground, type2 : None }, + { species : 450, form : 0, type1 : Ground, type2 : None }, + { species : 451, form : 0, type1 : Poison, type2 : Bug }, + { species : 452, form : 0, type1 : Poison, type2 : Dark }, + { species : 453, form : 0, type1 : Poison, type2 : Fighting }, + { species : 454, form : 0, type1 : Poison, type2 : Fighting }, + { species : 455, form : 0, type1 : Grass, type2 : None }, + { species : 456, form : 0, type1 : Water, type2 : None }, + { species : 457, form : 0, type1 : Water, type2 : None }, + { species : 458, form : 0, type1 : Water, type2 : Flying }, + { species : 459, form : 0, type1 : Grass, type2 : Ice }, + { species : 460, form : 0, type1 : Grass, type2 : Ice }, + { species : 461, form : 0, type1 : Dark, type2 : Ice }, + { species : 462, form : 0, type1 : Electric, type2 : Steel }, + { species : 463, form : 0, type1 : Normal, type2 : None }, + { species : 464, form : 0, type1 : Ground, type2 : Rock }, + { species : 465, form : 0, type1 : Grass, type2 : None }, + { species : 466, form : 0, type1 : Electric, type2 : None }, + { species : 467, form : 0, type1 : Fire, type2 : None }, + { species : 468, form : 0, type1 : Fairy, type2 : Flying }, + { species : 469, form : 0, type1 : Bug, type2 : Flying }, + { species : 470, form : 0, type1 : Grass, type2 : None }, + { species : 471, form : 0, type1 : Ice, type2 : None }, + { species : 472, form : 0, type1 : Ground, type2 : Flying }, + { species : 473, form : 0, type1 : Ice, type2 : Ground }, + { species : 474, form : 0, type1 : Normal, type2 : None }, + { species : 475, form : 0, type1 : Psychic, type2 : Fighting }, + { species : 476, form : 0, type1 : Rock, type2 : Steel }, + { species : 477, form : 0, type1 : Ghost, type2 : None }, + { species : 478, form : 0, type1 : Ice, type2 : Ghost }, + { species : 479, form : 0, type1 : Electric, type2 : Ghost }, + { species : 479, form : 1, type1 : Electric, type2 : Fire }, + { species : 479, form : 2, type1 : Electric, type2 : Water }, + { species : 479, form : 3, type1 : Electric, type2 : Ice }, + { species : 479, form : 4, type1 : Electric, type2 : Flying }, + { species : 479, form : 5, type1 : Electric, type2 : Grass }, + { species : 480, form : 0, type1 : Psychic, type2 : None }, + { species : 481, form : 0, type1 : Psychic, type2 : None }, + { species : 482, form : 0, type1 : Psychic, type2 : None }, + { species : 483, form : 0, type1 : Steel, type2 : Dragon }, + { species : 484, form : 0, type1 : Water, type2 : Dragon }, + { species : 485, form : 0, type1 : Fire, type2 : Steel }, + { species : 486, form : 0, type1 : Normal, type2 : None }, + { species : 487, form : 0, type1 : Ghost, type2 : Dragon }, + { species : 487, form : 1, type1 : Ghost, type2 : Dragon }, + { species : 488, form : 0, type1 : Psychic, type2 : None }, + { species : 489, form : 0, type1 : Water, type2 : None }, + { species : 490, form : 0, type1 : Water, type2 : None }, + { species : 491, form : 0, type1 : Dark, type2 : None }, + { species : 492, form : 0, type1 : Grass, type2 : None }, + { species : 492, form : 1, type1 : Grass, type2 : Flying }, + { species : 493, form : 0, type1 : Normal, type2 : None }, + { species : 494, form : 0, type1 : Psychic, type2 : Fire }, + { species : 495, form : 0, type1 : Grass, type2 : None }, + { species : 496, form : 0, type1 : Grass, type2 : None }, + { species : 497, form : 0, type1 : Grass, type2 : None }, + { species : 498, form : 0, type1 : Fire, type2 : None }, + { species : 499, form : 0, type1 : Fire, type2 : Fighting }, + { species : 500, form : 0, type1 : Fire, type2 : Fighting }, + { species : 501, form : 0, type1 : Water, type2 : None }, + { species : 502, form : 0, type1 : Water, type2 : None }, + { species : 503, form : 0, type1 : Water, type2 : None }, + { species : 504, form : 0, type1 : Normal, type2 : None }, + { species : 505, form : 0, type1 : Normal, type2 : None }, + { species : 506, form : 0, type1 : Normal, type2 : None }, + { species : 507, form : 0, type1 : Normal, type2 : None }, + { species : 508, form : 0, type1 : Normal, type2 : None }, + { species : 509, form : 0, type1 : Dark, type2 : None }, + { species : 510, form : 0, type1 : Dark, type2 : None }, + { species : 511, form : 0, type1 : Grass, type2 : None }, + { species : 512, form : 0, type1 : Grass, type2 : None }, + { species : 513, form : 0, type1 : Fire, type2 : None }, + { species : 514, form : 0, type1 : Fire, type2 : None }, + { species : 515, form : 0, type1 : Water, type2 : None }, + { species : 516, form : 0, type1 : Water, type2 : None }, + { species : 517, form : 0, type1 : Psychic, type2 : None }, + { species : 518, form : 0, type1 : Psychic, type2 : None }, + { species : 519, form : 0, type1 : Normal, type2 : Flying }, + { species : 520, form : 0, type1 : Normal, type2 : Flying }, + { species : 521, form : 0, type1 : Normal, type2 : Flying }, + { species : 521, form : 1, type1 : Normal, type2 : Flying }, + { species : 522, form : 0, type1 : Electric, type2 : None }, + { species : 523, form : 0, type1 : Electric, type2 : None }, + { species : 524, form : 0, type1 : Rock, type2 : None }, + { species : 525, form : 0, type1 : Rock, type2 : None }, + { species : 526, form : 0, type1 : Rock, type2 : None }, + { species : 527, form : 0, type1 : Psychic, type2 : Flying }, + { species : 528, form : 0, type1 : Psychic, type2 : Flying }, + { species : 529, form : 0, type1 : Ground, type2 : None }, + { species : 530, form : 0, type1 : Ground, type2 : Steel }, + { species : 531, form : 0, type1 : Normal, type2 : None }, + { species : 532, form : 0, type1 : Fighting, type2 : None }, + { species : 533, form : 0, type1 : Fighting, type2 : None }, + { species : 534, form : 0, type1 : Fighting, type2 : None }, + { species : 535, form : 0, type1 : Water, type2 : None }, + { species : 536, form : 0, type1 : Water, type2 : Ground }, + { species : 537, form : 0, type1 : Water, type2 : Ground }, + { species : 538, form : 0, type1 : Fighting, type2 : None }, + { species : 539, form : 0, type1 : Fighting, type2 : None }, + { species : 540, form : 0, type1 : Bug, type2 : Grass }, + { species : 541, form : 0, type1 : Bug, type2 : Grass }, + { species : 542, form : 0, type1 : Bug, type2 : Grass }, + { species : 543, form : 0, type1 : Bug, type2 : Poison }, + { species : 544, form : 0, type1 : Bug, type2 : Poison }, + { species : 545, form : 0, type1 : Bug, type2 : Poison }, + { species : 546, form : 0, type1 : Grass, type2 : Fairy }, + { species : 547, form : 0, type1 : Grass, type2 : Fairy }, + { species : 548, form : 0, type1 : Grass, type2 : None }, + { species : 549, form : 0, type1 : Grass, type2 : None }, + { species : 550, form : 0, type1 : Water, type2 : None }, + { species : 550, form : 1, type1 : Water, type2 : None }, + { species : 551, form : 0, type1 : Ground, type2 : Dark }, + { species : 552, form : 0, type1 : Ground, type2 : Dark }, + { species : 553, form : 0, type1 : Ground, type2 : Dark }, + { species : 554, form : 0, type1 : Fire, type2 : None }, + { species : 554, form : 1, type1 : Ice, type2 : None }, + { species : 555, form : 0, type1 : Fire, type2 : None }, + { species : 555, form : 1, type1 : Fire, type2 : Psychic }, + { species : 555, form : 2, type1 : Ice, type2 : None }, + { species : 555, form : 3, type1 : Ice, type2 : Fire }, + { species : 556, form : 0, type1 : Grass, type2 : None }, + { species : 557, form : 0, type1 : Bug, type2 : Rock }, + { species : 558, form : 0, type1 : Bug, type2 : Rock }, + { species : 559, form : 0, type1 : Dark, type2 : Fighting }, + { species : 560, form : 0, type1 : Dark, type2 : Fighting }, + { species : 561, form : 0, type1 : Psychic, type2 : Flying }, + { species : 562, form : 0, type1 : Ghost, type2 : None }, + { species : 562, form : 1, type1 : Ground, type2 : Ghost }, + { species : 563, form : 0, type1 : Ghost, type2 : None }, + { species : 564, form : 0, type1 : Water, type2 : Rock }, + { species : 565, form : 0, type1 : Water, type2 : Rock }, + { species : 566, form : 0, type1 : Rock, type2 : Flying }, + { species : 567, form : 0, type1 : Rock, type2 : Flying }, + { species : 568, form : 0, type1 : Poison, type2 : None }, + { species : 569, form : 0, type1 : Poison, type2 : None }, + { species : 570, form : 0, type1 : Dark, type2 : None }, + { species : 571, form : 0, type1 : Dark, type2 : None }, + { species : 572, form : 0, type1 : Normal, type2 : None }, + { species : 573, form : 0, type1 : Normal, type2 : None }, + { species : 574, form : 0, type1 : Psychic, type2 : None }, + { species : 575, form : 0, type1 : Psychic, type2 : None }, + { species : 576, form : 0, type1 : Psychic, type2 : None }, + { species : 577, form : 0, type1 : Psychic, type2 : None }, + { species : 578, form : 0, type1 : Psychic, type2 : None }, + { species : 579, form : 0, type1 : Psychic, type2 : None }, + { species : 580, form : 0, type1 : Water, type2 : Flying }, + { species : 581, form : 0, type1 : Water, type2 : Flying }, + { species : 582, form : 0, type1 : Ice, type2 : None }, + { species : 583, form : 0, type1 : Ice, type2 : None }, + { species : 584, form : 0, type1 : Ice, type2 : None }, + { species : 585, form : 0, type1 : Normal, type2 : Grass }, + { species : 586, form : 0, type1 : Normal, type2 : Grass }, + { species : 587, form : 0, type1 : Electric, type2 : Flying }, + { species : 588, form : 0, type1 : Bug, type2 : None }, + { species : 589, form : 0, type1 : Bug, type2 : Steel }, + { species : 590, form : 0, type1 : Grass, type2 : Poison }, + { species : 591, form : 0, type1 : Grass, type2 : Poison }, + { species : 592, form : 0, type1 : Water, type2 : Ghost }, + { species : 592, form : 1, type1 : Water, type2 : Ghost }, + { species : 593, form : 0, type1 : Water, type2 : Ghost }, + { species : 593, form : 1, type1 : Water, type2 : Ghost }, + { species : 594, form : 0, type1 : Water, type2 : None }, + { species : 595, form : 0, type1 : Bug, type2 : Electric }, + { species : 596, form : 0, type1 : Bug, type2 : Electric }, + { species : 597, form : 0, type1 : Grass, type2 : Steel }, + { species : 598, form : 0, type1 : Grass, type2 : Steel }, + { species : 599, form : 0, type1 : Steel, type2 : None }, + { species : 600, form : 0, type1 : Steel, type2 : None }, + { species : 601, form : 0, type1 : Steel, type2 : None }, + { species : 602, form : 0, type1 : Electric, type2 : None }, + { species : 603, form : 0, type1 : Electric, type2 : None }, + { species : 604, form : 0, type1 : Electric, type2 : None }, + { species : 605, form : 0, type1 : Psychic, type2 : None }, + { species : 606, form : 0, type1 : Psychic, type2 : None }, + { species : 607, form : 0, type1 : Ghost, type2 : Fire }, + { species : 608, form : 0, type1 : Ghost, type2 : Fire }, + { species : 609, form : 0, type1 : Ghost, type2 : Fire }, + { species : 610, form : 0, type1 : Dragon, type2 : None }, + { species : 611, form : 0, type1 : Dragon, type2 : None }, + { species : 612, form : 0, type1 : Dragon, type2 : None }, + { species : 613, form : 0, type1 : Ice, type2 : None }, + { species : 614, form : 0, type1 : Ice, type2 : None }, + { species : 615, form : 0, type1 : Ice, type2 : None }, + { species : 616, form : 0, type1 : Bug, type2 : None }, + { species : 617, form : 0, type1 : Bug, type2 : None }, + { species : 618, form : 0, type1 : Ground, type2 : Electric }, + { species : 618, form : 1, type1 : Ground, type2 : Steel }, + { species : 619, form : 0, type1 : Fighting, type2 : None }, + { species : 620, form : 0, type1 : Fighting, type2 : None }, + { species : 621, form : 0, type1 : Dragon, type2 : None }, + { species : 622, form : 0, type1 : Ground, type2 : Ghost }, + { species : 623, form : 0, type1 : Ground, type2 : Ghost }, + { species : 624, form : 0, type1 : Dark, type2 : Steel }, + { species : 625, form : 0, type1 : Dark, type2 : Steel }, + { species : 626, form : 0, type1 : Normal, type2 : None }, + { species : 627, form : 0, type1 : Normal, type2 : Flying }, + { species : 628, form : 0, type1 : Normal, type2 : Flying }, + { species : 629, form : 0, type1 : Dark, type2 : Flying }, + { species : 630, form : 0, type1 : Dark, type2 : Flying }, + { species : 631, form : 0, type1 : Fire, type2 : None }, + { species : 632, form : 0, type1 : Bug, type2 : Steel }, + { species : 633, form : 0, type1 : Dark, type2 : Dragon }, + { species : 634, form : 0, type1 : Dark, type2 : Dragon }, + { species : 635, form : 0, type1 : Dark, type2 : Dragon }, + { species : 636, form : 0, type1 : Bug, type2 : Fire }, + { species : 637, form : 0, type1 : Bug, type2 : Fire }, + { species : 638, form : 0, type1 : Steel, type2 : Fighting }, + { species : 639, form : 0, type1 : Rock, type2 : Fighting }, + { species : 640, form : 0, type1 : Grass, type2 : Fighting }, + { species : 641, form : 0, type1 : Flying, type2 : None }, + { species : 642, form : 0, type1 : Electric, type2 : Flying }, + { species : 643, form : 0, type1 : Dragon, type2 : Fire }, + { species : 644, form : 0, type1 : Dragon, type2 : Electric }, + { species : 645, form : 0, type1 : Ground, type2 : Flying }, + { species : 646, form : 0, type1 : Dragon, type2 : Ice }, + { species : 647, form : 0, type1 : Water, type2 : Fighting }, + { species : 648, form : 0, type1 : Normal, type2 : Psychic }, + { species : 648, form : 1, type1 : Normal, type2 : Fighting }, + { species : 649, form : 0, type1 : Bug, type2 : Steel }, + { species : 650, form : 0, type1 : Grass, type2 : None }, + { species : 651, form : 0, type1 : Grass, type2 : None }, + { species : 652, form : 0, type1 : Grass, type2 : Fighting }, + { species : 653, form : 0, type1 : Fire, type2 : None }, + { species : 654, form : 0, type1 : Fire, type2 : None }, + { species : 655, form : 0, type1 : Fire, type2 : Psychic }, + { species : 656, form : 0, type1 : Water, type2 : None }, + { species : 657, form : 0, type1 : Water, type2 : None }, + { species : 658, form : 0, type1 : Water, type2 : Dark }, + { species : 659, form : 0, type1 : Normal, type2 : None }, + { species : 660, form : 0, type1 : Normal, type2 : Ground }, + { species : 661, form : 0, type1 : Normal, type2 : Flying }, + { species : 662, form : 0, type1 : Fire, type2 : Flying }, + { species : 663, form : 0, type1 : Fire, type2 : Flying }, + { species : 664, form : 0, type1 : Bug, type2 : None }, + { species : 665, form : 0, type1 : Bug, type2 : None }, + { species : 666, form : 0, type1 : Bug, type2 : Flying }, + { species : 667, form : 0, type1 : Fire, type2 : Normal }, + { species : 668, form : 0, type1 : Fire, type2 : Normal }, + { species : 669, form : 0, type1 : Fairy, type2 : None }, + { species : 670, form : 0, type1 : Fairy, type2 : None }, + { species : 671, form : 0, type1 : Fairy, type2 : None }, + { species : 672, form : 0, type1 : Grass, type2 : None }, + { species : 673, form : 0, type1 : Grass, type2 : None }, + { species : 674, form : 0, type1 : Fighting, type2 : None }, + { species : 675, form : 0, type1 : Fighting, type2 : Dark }, + { species : 676, form : 0, type1 : Normal, type2 : None }, + { species : 677, form : 0, type1 : Psychic, type2 : None }, + { species : 678, form : 0, type1 : Psychic, type2 : None }, + { species : 679, form : 0, type1 : Steel, type2 : Ghost }, + { species : 680, form : 0, type1 : Steel, type2 : Ghost }, + { species : 681, form : 0, type1 : Steel, type2 : Ghost }, + { species : 682, form : 0, type1 : Fairy, type2 : None }, + { species : 683, form : 0, type1 : Fairy, type2 : None }, + { species : 684, form : 0, type1 : Fairy, type2 : None }, + { species : 685, form : 0, type1 : Fairy, type2 : None }, + { species : 686, form : 0, type1 : Dark, type2 : Psychic }, + { species : 687, form : 0, type1 : Dark, type2 : Psychic }, + { species : 688, form : 0, type1 : Rock, type2 : Water }, + { species : 689, form : 0, type1 : Rock, type2 : Water }, + { species : 690, form : 0, type1 : Poison, type2 : Water }, + { species : 691, form : 0, type1 : Poison, type2 : Dragon }, + { species : 692, form : 0, type1 : Water, type2 : None }, + { species : 693, form : 0, type1 : Water, type2 : None }, + { species : 694, form : 0, type1 : Electric, type2 : Normal }, + { species : 695, form : 0, type1 : Electric, type2 : Normal }, + { species : 696, form : 0, type1 : Rock, type2 : Dragon }, + { species : 697, form : 0, type1 : Rock, type2 : Dragon }, + { species : 698, form : 0, type1 : Rock, type2 : Ice }, + { species : 699, form : 0, type1 : Rock, type2 : Ice }, + { species : 700, form : 0, type1 : Fairy, type2 : None }, + { species : 701, form : 0, type1 : Fighting, type2 : Flying }, + { species : 702, form : 0, type1 : Electric, type2 : Fairy }, + { species : 703, form : 0, type1 : Rock, type2 : Fairy }, + { species : 704, form : 0, type1 : Dragon, type2 : None }, + { species : 705, form : 0, type1 : Dragon, type2 : None }, + { species : 706, form : 0, type1 : Dragon, type2 : None }, + { species : 707, form : 0, type1 : Steel, type2 : Fairy }, + { species : 708, form : 0, type1 : Ghost, type2 : Grass }, + { species : 709, form : 0, type1 : Ghost, type2 : Grass }, + { species : 710, form : 0, type1 : Ghost, type2 : Grass }, + { species : 711, form : 0, type1 : Ghost, type2 : Grass }, + { species : 712, form : 0, type1 : Ice, type2 : None }, + { species : 713, form : 0, type1 : Ice, type2 : None }, + { species : 714, form : 0, type1 : Flying, type2 : Dragon }, + { species : 715, form : 0, type1 : Flying, type2 : Dragon }, + { species : 716, form : 0, type1 : Fairy, type2 : None }, + { species : 717, form : 0, type1 : Dark, type2 : Flying }, + { species : 718, form : 0, type1 : Dragon, type2 : Ground }, + { species : 719, form : 0, type1 : Rock, type2 : Fairy }, + { species : 720, form : 0, type1 : Psychic, type2 : Ghost }, + { species : 720, form : 1, type1 : Psychic, type2 : Dark }, + { species : 721, form : 0, type1 : Fire, type2 : Water }, + { species : 722, form : 0, type1 : Grass, type2 : Flying }, + { species : 723, form : 0, type1 : Grass, type2 : Flying }, + { species : 724, form : 0, type1 : Grass, type2 : Ghost }, + { species : 725, form : 0, type1 : Fire, type2 : None }, + { species : 726, form : 0, type1 : Fire, type2 : None }, + { species : 727, form : 0, type1 : Fire, type2 : Dark }, + { species : 728, form : 0, type1 : Water, type2 : None }, + { species : 729, form : 0, type1 : Water, type2 : None }, + { species : 730, form : 0, type1 : Water, type2 : Fairy }, + { species : 731, form : 0, type1 : Normal, type2 : Flying }, + { species : 732, form : 0, type1 : Normal, type2 : Flying }, + { species : 733, form : 0, type1 : Normal, type2 : Flying }, + { species : 734, form : 0, type1 : Normal, type2 : None }, + { species : 735, form : 0, type1 : Normal, type2 : None }, + { species : 736, form : 0, type1 : Bug, type2 : None }, + { species : 737, form : 0, type1 : Bug, type2 : Electric }, + { species : 738, form : 0, type1 : Bug, type2 : Electric }, + { species : 739, form : 0, type1 : Fighting, type2 : None }, + { species : 740, form : 0, type1 : Fighting, type2 : Ice }, + { species : 741, form : 0, type1 : Fire, type2 : Flying }, + { species : 741, form : 1, type1 : Electric, type2 : Flying }, + { species : 741, form : 2, type1 : Psychic, type2 : Flying }, + { species : 741, form : 3, type1 : Ghost, type2 : Flying }, + { species : 742, form : 0, type1 : Bug, type2 : Fairy }, + { species : 743, form : 0, type1 : Bug, type2 : Fairy }, + { species : 744, form : 0, type1 : Rock, type2 : None }, + { species : 745, form : 0, type1 : Rock, type2 : None }, + { species : 746, form : 0, type1 : Water, type2 : None }, + { species : 747, form : 0, type1 : Poison, type2 : Water }, + { species : 748, form : 0, type1 : Poison, type2 : Water }, + { species : 749, form : 0, type1 : Ground, type2 : None }, + { species : 750, form : 0, type1 : Ground, type2 : None }, + { species : 751, form : 0, type1 : Water, type2 : Bug }, + { species : 752, form : 0, type1 : Water, type2 : Bug }, + { species : 753, form : 0, type1 : Grass, type2 : None }, + { species : 754, form : 0, type1 : Grass, type2 : None }, + { species : 755, form : 0, type1 : Grass, type2 : Fairy }, + { species : 756, form : 0, type1 : Grass, type2 : Fairy }, + { species : 757, form : 0, type1 : Poison, type2 : Fire }, + { species : 758, form : 0, type1 : Poison, type2 : Fire }, + { species : 759, form : 0, type1 : Normal, type2 : Fighting }, + { species : 760, form : 0, type1 : Normal, type2 : Fighting }, + { species : 761, form : 0, type1 : Grass, type2 : None }, + { species : 762, form : 0, type1 : Grass, type2 : None }, + { species : 763, form : 0, type1 : Grass, type2 : None }, + { species : 764, form : 0, type1 : Fairy, type2 : None }, + { species : 765, form : 0, type1 : Normal, type2 : Psychic }, + { species : 766, form : 0, type1 : Fighting, type2 : None }, + { species : 767, form : 0, type1 : Bug, type2 : Water }, + { species : 768, form : 0, type1 : Bug, type2 : Water }, + { species : 769, form : 0, type1 : Ghost, type2 : Ground }, + { species : 770, form : 0, type1 : Ghost, type2 : Ground }, + { species : 771, form : 0, type1 : Water, type2 : None }, + { species : 772, form : 0, type1 : Normal, type2 : None }, + { species : 773, form : 0, type1 : Normal, type2 : None }, + { species : 774, form : 0, type1 : Rock, type2 : Flying }, + { species : 775, form : 0, type1 : Normal, type2 : None }, + { species : 776, form : 0, type1 : Fire, type2 : Dragon }, + { species : 777, form : 0, type1 : Electric, type2 : Steel }, + { species : 778, form : 0, type1 : Ghost, type2 : Fairy }, + { species : 779, form : 0, type1 : Water, type2 : Psychic }, + { species : 780, form : 0, type1 : Normal, type2 : Dragon }, + { species : 781, form : 0, type1 : Ghost, type2 : Grass }, + { species : 782, form : 0, type1 : Dragon, type2 : None }, + { species : 783, form : 0, type1 : Dragon, type2 : Fighting }, + { species : 784, form : 0, type1 : Dragon, type2 : Fighting }, + { species : 785, form : 0, type1 : Electric, type2 : Fairy }, + { species : 786, form : 0, type1 : Psychic, type2 : Fairy }, + { species : 787, form : 0, type1 : Grass, type2 : Fairy }, + { species : 788, form : 0, type1 : Water, type2 : Fairy }, + { species : 789, form : 0, type1 : Psychic, type2 : None }, + { species : 790, form : 0, type1 : Psychic, type2 : None }, + { species : 791, form : 0, type1 : Psychic, type2 : Steel }, + { species : 792, form : 0, type1 : Psychic, type2 : Ghost }, + { species : 793, form : 0, type1 : Rock, type2 : Poison }, + { species : 794, form : 0, type1 : Bug, type2 : Fighting }, + { species : 795, form : 0, type1 : Bug, type2 : Fighting }, + { species : 796, form : 0, type1 : Electric, type2 : None }, + { species : 797, form : 0, type1 : Steel, type2 : Flying }, + { species : 798, form : 0, type1 : Grass, type2 : Steel }, + { species : 799, form : 0, type1 : Dark, type2 : Dragon }, + { species : 800, form : 0, type1 : Psychic, type2 : None }, + { species : 801, form : 0, type1 : Steel, type2 : Fairy }, + { species : 802, form : 0, type1 : Fighting, type2 : Ghost }, + { species : 803, form : 0, type1 : Poison, type2 : None }, + { species : 804, form : 0, type1 : Poison, type2 : Dragon }, + { species : 805, form : 0, type1 : Rock, type2 : Steel }, + { species : 806, form : 0, type1 : Fire, type2 : Ghost }, + { species : 807, form : 0, type1 : Electric, type2 : None }, + { species : 808, form : 0, type1 : Steel, type2 : None }, + { species : 809, form : 0, type1 : Steel, type2 : None }, + { species : 810, form : 0, type1 : Grass, type2 : None }, + { species : 811, form : 0, type1 : Grass, type2 : None }, + { species : 812, form : 0, type1 : Grass, type2 : None }, + { species : 813, form : 0, type1 : Fire, type2 : None }, + { species : 814, form : 0, type1 : Fire, type2 : None }, + { species : 815, form : 0, type1 : Fire, type2 : None }, + { species : 816, form : 0, type1 : Water, type2 : None }, + { species : 817, form : 0, type1 : Water, type2 : None }, + { species : 818, form : 0, type1 : Water, type2 : None }, + { species : 819, form : 0, type1 : Normal, type2 : None }, + { species : 820, form : 0, type1 : Normal, type2 : None }, + { species : 821, form : 0, type1 : Flying, type2 : None }, + { species : 822, form : 0, type1 : Flying, type2 : None }, + { species : 823, form : 0, type1 : Flying, type2 : Steel }, + { species : 824, form : 0, type1 : Bug, type2 : None }, + { species : 825, form : 0, type1 : Bug, type2 : Psychic }, + { species : 826, form : 0, type1 : Bug, type2 : Psychic }, + { species : 827, form : 0, type1 : Dark, type2 : None }, + { species : 828, form : 0, type1 : Dark, type2 : None }, + { species : 829, form : 0, type1 : Grass, type2 : None }, + { species : 830, form : 0, type1 : Grass, type2 : None }, + { species : 831, form : 0, type1 : Normal, type2 : None }, + { species : 832, form : 0, type1 : Normal, type2 : None }, + { species : 833, form : 0, type1 : Water, type2 : None }, + { species : 834, form : 0, type1 : Water, type2 : Rock }, + { species : 835, form : 0, type1 : Electric, type2 : None }, + { species : 836, form : 0, type1 : Electric, type2 : None }, + { species : 837, form : 0, type1 : Rock, type2 : None }, + { species : 838, form : 0, type1 : Rock, type2 : Fire }, + { species : 839, form : 0, type1 : Rock, type2 : Fire }, + { species : 840, form : 0, type1 : Grass, type2 : Dragon }, + { species : 841, form : 0, type1 : Grass, type2 : Dragon }, + { species : 842, form : 0, type1 : Grass, type2 : Dragon }, + { species : 843, form : 0, type1 : Ground, type2 : None }, + { species : 844, form : 0, type1 : Ground, type2 : None }, + { species : 845, form : 0, type1 : Flying, type2 : Water }, + { species : 846, form : 0, type1 : Water, type2 : None }, + { species : 847, form : 0, type1 : Water, type2 : None }, + { species : 848, form : 0, type1 : Electric, type2 : Poison }, + { species : 849, form : 0, type1 : Electric, type2 : Poison }, + { species : 850, form : 0, type1 : Fire, type2 : Bug }, + { species : 851, form : 0, type1 : Fire, type2 : Bug }, + { species : 852, form : 0, type1 : Fighting, type2 : None }, + { species : 853, form : 0, type1 : Fighting, type2 : None }, + { species : 854, form : 0, type1 : Ghost, type2 : None }, + { species : 855, form : 0, type1 : Ghost, type2 : None }, + { species : 856, form : 0, type1 : Psychic, type2 : None }, + { species : 857, form : 0, type1 : Psychic, type2 : None }, + { species : 858, form : 0, type1 : Psychic, type2 : Fairy }, + { species : 859, form : 0, type1 : Dark, type2 : Fairy }, + { species : 860, form : 0, type1 : Dark, type2 : Fairy }, + { species : 861, form : 0, type1 : Dark, type2 : Fairy }, + { species : 862, form : 0, type1 : Dark, type2 : Normal }, + { species : 863, form : 0, type1 : Steel, type2 : None }, + { species : 864, form : 0, type1 : Ghost, type2 : None }, + { species : 865, form : 0, type1 : Fighting, type2 : None }, + { species : 866, form : 0, type1 : Ice, type2 : Psychic }, + { species : 867, form : 0, type1 : Ground, type2 : Ghost }, + { species : 868, form : 0, type1 : Fairy, type2 : None }, + { species : 869, form : 0, type1 : Fairy, type2 : None }, + { species : 870, form : 0, type1 : Fighting, type2 : None }, + { species : 871, form : 0, type1 : Electric, type2 : None }, + { species : 872, form : 0, type1 : Ice, type2 : Bug }, + { species : 873, form : 0, type1 : Ice, type2 : Bug }, + { species : 874, form : 0, type1 : Rock, type2 : None }, + { species : 875, form : 0, type1 : Ice, type2 : None }, + { species : 876, form : 0, type1 : Psychic, type2 : Normal }, + { species : 877, form : 0, type1 : Electric, type2 : Dark }, + { species : 878, form : 0, type1 : Steel, type2 : None }, + { species : 879, form : 0, type1 : Steel, type2 : None }, + { species : 880, form : 0, type1 : Electric, type2 : Dragon }, + { species : 881, form : 0, type1 : Electric, type2 : Ice }, + { species : 882, form : 0, type1 : Water, type2 : Dragon }, + { species : 883, form : 0, type1 : Water, type2 : Ice }, + { species : 884, form : 0, type1 : Steel, type2 : Dragon }, + { species : 885, form : 0, type1 : Dragon, type2 : Ghost }, + { species : 886, form : 0, type1 : Dragon, type2 : Ghost }, + { species : 887, form : 0, type1 : Dragon, type2 : Ghost }, + { species : 888, form : 0, type1 : Fairy, type2 : None }, + { species : 888, form : 1, type1 : Fairy, type2 : Steel }, + { species : 889, form : 0, type1 : Fighting, type2 : None }, + { species : 889, form : 1, type1 : Fighting, type2 : Steel }, + { species : 890, form : 0, type1 : Poison, type2 : Dragon } }; +} \ No newline at end of file